student 4 viikkoa sitten
vanhempi
commit
4bbe6d17c0
100 muutettua tiedostoa jossa 30236 lisäystä ja 22 poistoa
  1. 2 2
      website/Areas/Millions/Views/Home/BuyTicket.cshtml
  2. 0 7
      website/Controllers/HomeController.cs
  3. 2 2
      website/Languages/Lang.fr.resx
  4. 2 2
      website/Languages/Lang.resx
  5. 23 9
      website/Properties/launchSettings.json
  6. 1062 0
      website_natcash/Areas/LotteryV2/Controllers/HomeController.cs
  7. 1492 0
      website_natcash/Areas/LotteryV2/Views/Home/BuyTicket.cshtml
  8. 131 0
      website_natcash/Areas/LotteryV2/Views/Home/FAQ.cshtml
  9. 430 0
      website_natcash/Areas/LotteryV2/Views/Home/GameHome.cshtml
  10. 313 0
      website_natcash/Areas/LotteryV2/Views/Home/History.cshtml
  11. 147 0
      website_natcash/Areas/LotteryV2/Views/Home/HowToPlay.cshtml
  12. 210 0
      website_natcash/Areas/LotteryV2/Views/Home/Index.cshtml
  13. 144 0
      website_natcash/Areas/LotteryV2/Views/Home/More.cshtml
  14. 243 0
      website_natcash/Areas/LotteryV2/Views/Home/Profile.cshtml
  15. 232 0
      website_natcash/Areas/LotteryV2/Views/Home/Results.cshtml
  16. 543 0
      website_natcash/Areas/LotteryV2/Views/Home/Rule.cshtml
  17. 590 0
      website_natcash/Areas/LotteryV2/Views/Home/TransferWinMoney.cshtml
  18. 143 0
      website_natcash/Areas/LotteryV2/Views/Home/_TermResultHistoryGrouped.cshtml
  19. 61 0
      website_natcash/Areas/LotteryV2/Views/Home/_TermResultHistoryV2.cshtml
  20. 151 0
      website_natcash/Areas/LotteryV2/Views/Home/_TermUserTicketHistory.cshtml
  21. 46 0
      website_natcash/Areas/LotteryV2/Views/Shared/_BottomNavbar.cshtml
  22. 85 0
      website_natcash/Areas/LotteryV2/Views/Shared/_Layout.cshtml
  23. 3 0
      website_natcash/Areas/LotteryV2/Views/_ViewImports.cshtml
  24. 3 0
      website_natcash/Areas/LotteryV2/Views/_ViewStart.cshtml
  25. 1462 0
      website_natcash/Areas/Millions/Controllers/HomeController.cs
  26. 1742 0
      website_natcash/Areas/Millions/Views/Home/BuyTicket.cshtml
  27. 116 0
      website_natcash/Areas/Millions/Views/Home/FAQ.cshtml
  28. 320 0
      website_natcash/Areas/Millions/Views/Home/GameHome - Copy.cshtml
  29. 336 0
      website_natcash/Areas/Millions/Views/Home/GameHome.cshtml
  30. 328 0
      website_natcash/Areas/Millions/Views/Home/History.cshtml
  31. 148 0
      website_natcash/Areas/Millions/Views/Home/HowToPlay.cshtml
  32. 181 0
      website_natcash/Areas/Millions/Views/Home/JackpotDetail.cshtml
  33. 294 0
      website_natcash/Areas/Millions/Views/Home/JackpotResults.cshtml
  34. 156 0
      website_natcash/Areas/Millions/Views/Home/More.cshtml
  35. 370 0
      website_natcash/Areas/Millions/Views/Home/PopupFreeTickit.cshtml
  36. 244 0
      website_natcash/Areas/Millions/Views/Home/Profile.cshtml
  37. 267 0
      website_natcash/Areas/Millions/Views/Home/Results.cshtml
  38. 131 0
      website_natcash/Areas/Millions/Views/Home/RewardHistory.cshtml
  39. 305 0
      website_natcash/Areas/Millions/Views/Home/Rule.cshtml
  40. 621 0
      website_natcash/Areas/Millions/Views/Home/TransferWinMoney.cshtml
  41. 116 0
      website_natcash/Areas/Millions/Views/Home/_RewardHistoryList.cshtml
  42. 150 0
      website_natcash/Areas/Millions/Views/Home/_TermResultHistoryGrouped.cshtml
  43. 62 0
      website_natcash/Areas/Millions/Views/Home/_TermResultHistoryV2.cshtml
  44. 150 0
      website_natcash/Areas/Millions/Views/Home/_TermUserTicketHistory.cshtml
  45. 46 0
      website_natcash/Areas/Millions/Views/Shared/_BottomNavbar.cshtml
  46. 78 0
      website_natcash/Areas/Millions/Views/Shared/_Layout.cshtml
  47. 4 0
      website_natcash/Areas/Millions/Views/_ViewImports.cshtml
  48. 4 0
      website_natcash/Areas/Millions/Views/_ViewStart.cshtml
  49. 150 0
      website_natcash/Common/Constants.cs
  50. 81 0
      website_natcash/Common/DailyRollingFileAppender.cs
  51. 31 0
      website_natcash/Common/Utils.cs
  52. 41 0
      website_natcash/Components/AdvertiseArea.cs
  53. 27 0
      website_natcash/Components/ChooseForm.cs
  54. 20 0
      website_natcash/Components/FooterOutside.cs
  55. 26 0
      website_natcash/Components/HeaderHome.cs
  56. 25 0
      website_natcash/Components/LotoNumber.cs
  57. 29 0
      website_natcash/Components/LotoNumberHistory.cs
  58. 24 0
      website_natcash/Components/PaymentForm.cs
  59. 24 0
      website_natcash/Components/ResultForm.cs
  60. 24 0
      website_natcash/Components/SmallHeader.cs
  61. 29 0
      website_natcash/Components/TicketForm.cs
  62. 27 0
      website_natcash/Components/TicketHistory.cs
  63. 373 0
      website_natcash/Controllers/AccountController.cs
  64. 635 0
      website_natcash/Controllers/BaseController.cs
  65. 428 0
      website_natcash/Controllers/BuyTicketController.cs
  66. 150 0
      website_natcash/Controllers/HistoryController.cs
  67. 810 0
      website_natcash/Controllers/HomeController.cs
  68. 29 0
      website_natcash/Controllers/PartialController.cs
  69. 231 0
      website_natcash/Controllers/ProfileController.cs
  70. 31 0
      website_natcash/Extensions/ConfigAction.cs
  71. 62 0
      website_natcash/Extensions/Encrytion.cs
  72. 29 0
      website_natcash/Extensions/RewriteSubdomainRule.cs
  73. 34 0
      website_natcash/Extensions/SessionExtensions.cs
  74. 6176 0
      website_natcash/Languages/Lang.Designer.cs
  75. 2152 0
      website_natcash/Languages/Lang.fr.resx
  76. 2153 0
      website_natcash/Languages/Lang.resx
  77. 446 0
      website_natcash/Languages/Question.Designer.cs
  78. 369 0
      website_natcash/Languages/Question.fr.resx
  79. 370 0
      website_natcash/Languages/Question.resx
  80. 68 0
      website_natcash/LotteryWebAppNatcash.csproj
  81. 25 0
      website_natcash/Models/AccountViewModel.cs
  82. 35 0
      website_natcash/Models/BuyTicketViewModel.cs
  83. 11 0
      website_natcash/Models/ErrorViewModel.cs
  84. 27 0
      website_natcash/Models/HistoryViewModel.cs
  85. 79 0
      website_natcash/Models/HomeViewModel.cs
  86. 18 0
      website_natcash/Models/PartialViewModel.cs
  87. 30 0
      website_natcash/Models/ProfileViewModel.cs
  88. 12 0
      website_natcash/Models/RewardHistoryViewModel.cs
  89. 42 0
      website_natcash/Program.cs
  90. 12 0
      website_natcash/Properties/launchSettings.json
  91. 5 0
      website_natcash/Rsa/Policy.txt
  92. 10 0
      website_natcash/Rsa/private-rsa-key.xml
  93. 3 0
      website_natcash/Rsa/private.pem
  94. 4 0
      website_natcash/Rsa/public-rsa-key.xml
  95. 3 0
      website_natcash/Rsa/public.pem
  96. 141 0
      website_natcash/Service/ApiClasses.cs
  97. 17 0
      website_natcash/Service/ApiConstants.cs
  98. 406 0
      website_natcash/Service/ApiFunctions.cs
  99. 427 0
      website_natcash/Service/ApiModels.cs
  100. 136 0
      website_natcash/Startup.cs

+ 2 - 2
website/Areas/Millions/Views/Home/BuyTicket.cshtml

@@ -957,7 +957,7 @@ else
             });
             const pricePerTicket = hasFreeTicketPromotion
                 ? 0
-                : @(Model.termType == Constants.PIC10_BASIC_CODE ? "10" : (Model.termType == Constants.Millions_CODE ? "20" : "50"));
+                : @(Model.termType == Constants.PIC10_BASIC_CODE ? "10" : (Model.termType == Constants.Millions_CODE ? "6" : "50"));
             $("#totalPrice").text(formatMoneyV2(filledTickets * pricePerTicket));
             $("#totalTicketCount").text(filledTickets);
         }
@@ -1066,7 +1066,7 @@ else
                     if (balls.length === maxBalls) {
                         const selectedNumbers = [];
                         balls.each(function() { selectedNumbers.push($(this).text().trim()); });
-                        const itemPrice = "@(Model.termType == Constants.PIC10_BASIC_CODE ? "10" : (Model.termType == Constants.Millions_CODE ? "20" : "50"))";
+                        const itemPrice = "@(Model.termType == Constants.PIC10_BASIC_CODE ? "10" : (Model.termType == Constants.Millions_CODE ? "6" : "50"))";
                         tickets.push({
                             code: selectedNumbers.join(','),
                             money: itemPrice

+ 0 - 7
website/Controllers/HomeController.cs

@@ -91,13 +91,6 @@ namespace LotteryWebApp.Controllers
                 // check auto login ?uuid=681471d23b83f0a463e2dd5671ea0fc5
                 // ?uuid=681471d23b83f0a463e2dd5671ea0fc5&mcuid=6c6948a89908d83aec8c05be256970a1&mcapp=mocha
 
-                if (CheckAuthToken())
-                {
-                    return Redirect(
-                        GetParameter(Constants.SUB_DOMAIN) + "/Account/ChooseApp"
-                    );
-                }
-
                 if (!CheckAuthToken())
                 {
                     //String uri = HttpContext.Request.QueryString.ToUriComponent().ToString();

+ 2 - 2
website/Languages/Lang.fr.resx

@@ -1757,7 +1757,7 @@ We’ll help you create an account in a few easy steps.</value>
     <value>Select 1 Mega Ball from 1 → 24</value>
   </data>
   <data name="millions_ticket_price" xml:space="preserve">
-    <value>Ticket price: 20 HTG per ticket</value>
+    <value>Ticket price: 6 HTG per ticket</value>
   </data>
   <data name="millions_payment_via" xml:space="preserve">
     <value>Payment via: Account balance</value>
@@ -1823,7 +1823,7 @@ We’ll help you create an account in a few easy steps.</value>
     <value>Draws take place twice a week (Tuesday and Friday) at 11:00 PM (ET). Ticket sales close at 10:30 PM (ET)</value>
   </data>
   <data name="faq_millions_a3" xml:space="preserve">
-    <value>Each ticket costs 20 HTG.</value>
+    <value>Each ticket costs 6 HTG.</value>
   </data>
   <data name="faq_millions_q1" xml:space="preserve">
     <value>How do I play Mega Millions?</value>

+ 2 - 2
website/Languages/Lang.resx

@@ -1758,7 +1758,7 @@ Apre yo fin tire 20 nimewo, sistem nan konte konbyen nimewo ki enpe oswa pe: &lt
     <value>Select 1 Mega Ball from 1 → 24</value>
   </data>
   <data name="millions_ticket_price" xml:space="preserve">
-    <value>Ticket price: 20 HTG per ticket</value>
+    <value>Ticket price: 6 HTG per ticket</value>
   </data>
   <data name="millions_payment_via" xml:space="preserve">
     <value>Payment via: Account balance</value>
@@ -1824,7 +1824,7 @@ Apre yo fin tire 20 nimewo, sistem nan konte konbyen nimewo ki enpe oswa pe: &lt
     <value>Tiraj yo fet chak jou a 8:30 p.m. Vann tike yo sispann a 8:00 p.m.</value>
   </data>
   <data name="faq_millions_a3" xml:space="preserve">
-    <value>Chans pou genyen premye pri Pick 10 la se 1 sou 8,911,711.</value>
+    <value>Chak tikè koute 6 HTG.</value>
   </data>
   <data name="faq_millions_q1" xml:space="preserve">
     <value>Kijan pouw jwe Pick 10?</value>

+ 23 - 9
website/Properties/launchSettings.json

@@ -1,12 +1,4 @@
 {
-  "iisSettings": {
-    "windowsAuthentication": false,
-    "anonymousAuthentication": true,
-    "iisExpress": {
-      "applicationUrl": "http://localhost:48614",
-      "sslPort": 44373
-    }
-  },
   "profiles": {
     "IIS Express": {
       "commandName": "IISExpress",
@@ -18,12 +10,26 @@
     },
     "LotteryWebApp": {
       "commandName": "Project",
+      "workingDirectory": "D:\\Code\\NatCom\\LotteryV2\\website",
       "launchBrowser": true,
       "environmentVariables": {
         "ASPNETCORE_ENVIRONMENT": "Development",
         "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation"
       },
-      "applicationUrl": "http://localhost:8800"
+      "applicationUrl": "http://localhost:8800",
+      "nativeDebugging": true
+    },
+    "LotteryWebApp (Debug)": {
+      "commandName": "Project",
+      "workingDirectory": "D:\\Code\\NatCom\\LotteryV2\\website",
+      "launchBrowser": true,
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development",
+        "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation",
+        "DOTNET_USE_POLLING_FILE_WATCHER": "true"
+      },
+      "applicationUrl": "http://localhost:8800",
+      "nativeDebugging": false
     },
     "Docker": {
       "commandName": "Docker",
@@ -32,5 +38,13 @@
       "publishAllPorts": true,
       "useSSL": true
     }
+  },
+  "iisSettings": {
+    "windowsAuthentication": false,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:48614",
+      "sslPort": 44373
+    }
   }
 }

+ 1062 - 0
website_natcash/Areas/LotteryV2/Controllers/HomeController.cs

@@ -0,0 +1,1062 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Globalization;
+using System.Threading;
+using System.Threading.Tasks;
+using LotteryWebApp.Common;
+using LotteryWebApp.Extensions;
+using LotteryWebApp.Languages;
+using LotteryWebApp.Models;
+using LotteryWebApp.Service;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using Newtonsoft.Json;
+using LotteryWebApp.Controllers;
+
+namespace LotteryWebApp.Areas.LotteryV2.Controllers
+{
+    [Area("LotteryV2")]
+    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
+    public class HomeController : BaseController
+    {
+        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
+
+        IConfiguration configuration;
+        private readonly IWebHostEnvironment webHostEnvironment;
+        APIFunctions api = new APIFunctions();
+
+        public HomeController(IConfiguration _configuration, IWebHostEnvironment hostEnvironment)
+        {
+            configuration = _configuration;
+            webHostEnvironment = hostEnvironment;
+        }
+
+        public String GetParameter(String key)
+        {
+            return configuration.GetSection(key).Value;
+        }
+
+        public async Task<IActionResult> Index(
+            string termType,
+            String uuid,
+            String mcuid,
+            String phonenumber,
+            String token
+        )
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+
+                CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
+                String lang = currentCulture.Name;
+
+                String msisdnAuto = null;
+
+                if (!CheckAuthToken())
+                {
+                    if (token != null)
+                    {
+                        AutoLoginRequest autoLoginRequest = new AutoLoginRequest { token = token };
+                        AutoLoginResponse autoLoginResponse = await api.AutoLoginApiAsync(configuration, autoLoginRequest);
+
+                        if (autoLoginResponse.code == Code.SUCCESS_CODE)
+                        {
+                            string msisdnReal = validateMsisdn(autoLoginResponse.data.msisdn.Substring(1));
+                            if (msisdnReal == "") return RedirectToAction("Login", "Account", new { area = "" });
+
+                            CheckAccountRequest checkAccountRequest = new CheckAccountRequest
+                            {
+                                msisdn = msisdnReal,
+                                channel = Constants.WEB_CHANNEL,
+                                language = lang == "en" ? "0" : "1"
+                            };
+                            CheckAccountResponse checkAccountResponse = api.CheckAccountApi(configuration, checkAccountRequest);
+                            if (checkAccountResponse.status == Code.SUCCESS)
+                            {
+                                string tokenGetReal = checkAccountResponse.token;
+                                HttpContext.Session.SetComplexData("msisdn", msisdnReal);
+                                CreateAuthToken();
+                                HttpContext.Session.SetComplexData("token", tokenGetReal);
+
+                                UserGetProfileRequest userGetProfileRequest = new UserGetProfileRequest { users = msisdnReal, token = tokenGetReal };
+                                Profile profileGet = api.UserLoadProfileApi(configuration, userGetProfileRequest);
+                                HttpContext.Session.SetComplexData("profile", profileGet);
+
+                                UserStatusRequest userStatusRequest = new UserStatusRequest { users = msisdnReal, token = tokenGetReal };
+                                UserStatus userStatusGet = api.GetUserStatusApi(configuration, userStatusRequest);
+                                HttpContext.Session.SetComplexData("userStatus", userStatusGet);
+                            }
+                            else
+                            {
+                                return RedirectToAction("Login", "Account", new { area = "" });
+                            }
+                        }
+                    }
+                    else if (uuid != null)
+                    {
+                        String res = await CheckAutoLogin(log, uuid);
+                        if (res != null)
+                        {
+                            dynamic json = JsonConvert.DeserializeObject(res);
+                            if (json["code"] == "200" && json["errorCode"] == "200")
+                            {
+                                msisdnAuto = json["data"]["msisdn"];
+                            }
+                        }
+
+                        String msisdnDetect = validateMsisdn(msisdnAuto.Substring(1));
+                        if (msisdnDetect != "")
+                        {
+                            RegisterRequest request = new RegisterRequest { Msisdn = msisdnDetect };
+                            RegisterResponse reset = api.UserForgotPasswordApi(configuration, request);
+                            if (reset.status == Code.SUCCESS)
+                            {
+                                HttpContext.Session.Remove("regInfos");
+                                HttpContext.Session.SetComplexData("msisdn", msisdnDetect);
+                                return RedirectToAction("Login", "Account", new { area = "", step = 2 });
+                            }
+                        }
+                        return RedirectToAction("Login", "Account", new { area = "" });
+                    }
+                    else if (phonenumber != null)
+                    {
+                        // simplified or same logic as original
+                        return RedirectToAction("Login", "Account", new { area = "" });
+                    }
+                    else
+                    {
+                        // If no token/uuid and not auth, verify existing session token
+                        var savedToken = HttpContext.Session.GetString("token");
+                        if (string.IsNullOrEmpty(savedToken))
+                        {
+                            return RedirectToAction("Login", "Account", new { area = "" });
+                        }
+                    }
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+
+                model.termType = termType != null ? termType : Constants.MEGA_LOTO;
+                model.userStatus = userStatus;
+                model.profile = profile;
+                model.listTerm = new List<Term>();
+
+                String tokenGet = HttpContext.Session.GetComplexData<String>("token");
+                String fromDate = DateTime.Now.AddDays(-2).ToString("dd/MM/yyyy");
+                String toDate = DateTime.Now.ToString("dd/MM/yyyy");
+
+                // Get Top Winner
+                GetTopWinnerRequest getTopWinnerRequest = new GetTopWinnerRequest { type = lang == "en" ? "0" : "1", token = tokenGet };
+                GetTopWininerResponse getTopWininerResponse = api.GetTopWinnerApi(configuration, getTopWinnerRequest);
+                if (getTopWininerResponse.responseCode == Code.SUCCESS)
+                {
+                    model.topWinner = getTopWininerResponse.list;
+                    HttpContext.Session.SetComplexData("topWinner", model.topWinner);
+                }
+
+                // Get Term Results
+                //ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest
+                //{
+                //    gameId = model.termType,
+                //    token = tokenGet,
+                //    type = Constants.TERM_HAS_NOT_RESULT_TYPE,
+                //    order = Constants.DECS,
+                //    fromDate = fromDate,
+                //    toDate = toDate,
+                //    rowsOnPage = Constants.ROW_ON_PAGE,
+                //    seqPage = "1",
+                //    id = Constants.ALL_DATA
+                //};
+
+                //ResultOfTermResponse result = api.GetResultOfTermApi(configuration, resultOfTermRequest);
+                //if (result.responseCode == Code.SESSION_EXPIRED)
+                //{
+                //     return RedirectToAction("Login", "Account", new { area = "" });
+                //}
+                //else if (result.responseCode == Code.SUCCESS)
+                //{
+                //    model.listTerm = result.listTerm;
+                //}
+
+                if (!string.IsNullOrEmpty(termType))
+                {
+                    HttpContext.Session.SetString("termType", termType);
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return RedirectToAction("Login", "Account", new { area = "" });
+            }
+
+            model.serverTime = DateTime.Now;
+            return View(model);
+        }
+
+        public async Task<IActionResult> GameHome(string termType)
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+
+                model.termType = termType != null ? termType : Constants.FLORIDA_BOLET_CODE;
+                model.userStatus = userStatus;
+                model.profile = profile;
+                model.listTerm = new List<Term>();
+
+                if (!string.IsNullOrEmpty(termType))
+                {
+                    HttpContext.Session.SetString("termType", termType);
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            model.serverTime = DateTime.Now; return View(model);
+        }
+
+        public async Task<IActionResult> FAQ()
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                model.userStatus = userStatus;
+                model.profile = profile;
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            model.serverTime = DateTime.Now; return View(model);
+        }
+
+        public IActionResult More()
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                model.userStatus = userStatus;
+                model.profile = profile;
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            model.serverTime = DateTime.Now; return View(model);
+        }
+
+        public IActionResult Profile()
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                model.userStatus = userStatus;
+                model.profile = profile;
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            model.serverTime = DateTime.Now; return View(model);
+        }
+
+        [HttpPost]
+        public IActionResult UserUpdateProfile(string fullName, string birthday)
+        {
+            try
+            {
+                string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                string token = HttpContext.Session.GetComplexData<string>("token");
+
+                if (string.IsNullOrEmpty(msisdn) || string.IsNullOrEmpty(token))
+                {
+                    return Json(new { status = Code.ERROR, message = "Session expired" });
+                }
+
+                string birthdayFormat = birthday;
+                if (!string.IsNullOrEmpty(birthday) && birthday.Contains("-"))
+                {
+                    try
+                    {
+                        birthdayFormat = DateTime.ParseExact(birthday, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy");
+                    }
+                    catch { }
+                }
+
+                UserUpdateProfileRequest request = new UserUpdateProfileRequest
+                {
+                    users = msisdn,
+                    token = token,
+                    fullName = fullName,
+                    birthday = birthdayFormat
+                };
+
+                UserUpdateProfileResponse response = api.UserUpdateProfileApi(configuration, request);
+
+                if (response.status == Code.SUCCESS)
+                {
+                    // Update session profile
+                    Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                    if (profile != null)
+                    {
+                        profile.fullName = fullName;
+                        profile.birthday = birthdayFormat;
+                        HttpContext.Session.SetComplexData("profile", profile);
+                    }
+                }
+
+                return Json(response);
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return Json(new { status = Code.ERROR, message = ex.Message });
+            }
+        }
+
+        public IActionResult Rule()
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                model.userStatus = userStatus;
+                model.profile = profile;
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            model.serverTime = DateTime.Now; return View(model);
+        }
+
+        public IActionResult HowToPlay()
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                model.userStatus = userStatus;
+                model.profile = profile;
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            model.serverTime = DateTime.Now; return View(model);
+        }
+
+        public IActionResult Results(string termType, string fromDate, string toDate)
+        {
+            TermResultHistoryModel model = new TermResultHistoryModel();
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+
+                model.termType = termType != null ? termType : (HttpContext.Session.GetString("termType") ?? Constants.PIC10_BASIC_CODE);
+
+                // Set default dates if not provided (same as root implementation)
+                string fromFormatted = fromDate != null ? fromDate : DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd");
+                string toFormatted = toDate != null ? toDate : DateTime.Now.ToString("yyyy-MM-dd");
+
+                model.fromDate = fromFormatted;
+                model.toDate = toFormatted;
+
+                // Load initial results
+                ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest
+                {
+                    gameId = model.termType,
+                    token = token,
+                    type = Constants.TERM_HAS_RESULT_TYPE,
+                    order = Constants.DECS,
+                    fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
+                    toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
+                    rowsOnPage = Constants.ROW_ON_PAGE,
+                    seqPage = "1",
+                    id = Constants.ALL_DATA
+                };
+
+                ResultOfTermResponse result = api.GetResultOfTermApi(configuration, resultOfTermRequest);
+                if (result.responseCode == Code.SUCCESS)
+                {
+                    model.listTerm = result.listTerm ?? new List<Term>();
+                }
+                else
+                {
+                    model.listTerm = new List<Term>();
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                model.listTerm = new List<Term>();
+            }
+            model.serverTime = DateTime.Now; return View(model);
+        }
+
+        public IActionResult TermResultHistory(string termType, string fromDate, string toDate)
+        {
+            TermResultHistoryModel model = new TermResultHistoryModel();
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token)) return Json(new { status = "error", message = "Session expired" });
+
+                string fromFormatted = fromDate != null ? fromDate : DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd");
+                string toFormatted = toDate != null ? toDate : DateTime.Now.ToString("yyyy-MM-dd");
+
+                model.termType = termType;
+                model.fromDate = fromFormatted;
+                model.toDate = toFormatted;
+
+                ResultOfTermRequest request = new ResultOfTermRequest
+                {
+                    gameId = termType,
+                    token = token,
+                    type = Constants.TERM_HAS_RESULT_TYPE,
+                    order = Constants.DECS,
+                    fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
+                    toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
+                    rowsOnPage = Constants.ROW_ON_PAGE,
+                    seqPage = "1",
+                    id = Constants.ALL_DATA
+                };
+
+                ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
+                if (result.responseCode == Code.SUCCESS)
+                {
+                    model.listTerm = result.listTerm ?? new List<Term>();
+                }
+                else
+                {
+                    model.listTerm = new List<Term>();
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                model.listTerm = new List<Term>();
+            }
+            return PartialView("_TermResultHistoryV2", model);
+        }
+
+        public IActionResult TermResultHistoryGrouped(string fromDate, string toDate)
+        {
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token)) return Json(new { status = "error", message = "Session expired" });
+
+                string fromFormatted = fromDate != null ? fromDate : DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd");
+                string toFormatted = toDate != null ? toDate : DateTime.Now.ToString("yyyy-MM-dd");
+
+                string[] gameIds = { Constants.PIC10_BASIC_CODE, Constants.PIC10_BIGSMALL_CODE, Constants.PIC10_ODDEVEN_CODE };
+                var allTerms = new List<Term>();
+
+                foreach (var gid in gameIds)
+                {
+                    ResultOfTermRequest request = new ResultOfTermRequest
+                    {
+                        gameId = gid,
+                        token = token,
+                        type = Constants.TERM_HAS_RESULT_TYPE,
+                        order = Constants.DECS,
+                        fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
+                        toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
+                        rowsOnPage = "50",
+                        seqPage = "1",
+                        id = Constants.ALL_DATA
+                    };
+
+                    ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
+                    if (result.responseCode == Code.SUCCESS && result.listTerm != null)
+                    {
+                        allTerms.AddRange(result.listTerm);
+                    }
+                }
+
+                // Group by date part of date_random
+                var grouped = allTerms.GroupBy(x => {
+                    DateTime dt;
+                    if (DateTime.TryParse(x.date_random, out dt))
+                        return dt.Date;
+                    return DateTime.MinValue;
+                })
+                .Where(g => g.Key != DateTime.MinValue)
+                .OrderByDescending(g => g.Key)
+                .ToList();
+
+                return PartialView("_TermResultHistoryGrouped", grouped);
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return PartialView("_TermResultHistoryGrouped", new List<IGrouping<DateTime, Term>>());
+            }
+        }
+
+        public IActionResult History(string termType, string status, string seqPage)
+        {
+            UserTicketHistoryModel model = new UserTicketHistoryModel();
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+
+                model.termType = termType ?? Constants.PIC10_BASIC_CODE;
+                model.status = status ?? Constants.ALL_DATA; // -1 for all, or 0, 1, 2
+                model.seqPage = seqPage ?? "1";
+
+                UserTicketRequest request = new UserTicketRequest
+                {
+                    gameId = model.termType,
+                    msisdn = msisdn,
+                    token = token,
+                    type = model.status,
+                    order = Constants.DECS,
+                    rowsOnPage = Constants.ROW_ON_PAGE,
+                    seqPage = model.seqPage
+                };
+
+                UserTicketResponse result = api.GetUserTicketApi(configuration, request);
+                if (result.responseCode == Code.SUCCESS)
+                {
+                    model.listTicket = result.listTicket ?? new List<Ticket>();
+                    model.totalPage = result.totalPage;
+                }
+                else
+                {
+                    model.listTicket = new List<Ticket>();
+                    model.totalPage = "0";
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                model.listTicket = new List<Ticket>();
+            }
+            model.serverTime = DateTime.Now;
+            return View(model);
+        }
+
+        public IActionResult TermUserTicketHistory(string termType, string status, string seqPage)
+        {
+            UserTicketHistoryModel model = new UserTicketHistoryModel();
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token)) return Json(new { status = "error", message = "Session expired" });
+
+                string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+
+                model.termType = termType;
+                model.status = status;
+                model.seqPage = seqPage ?? "1";
+
+                UserTicketRequest request = new UserTicketRequest
+                {
+                    gameId = termType,
+                    msisdn = msisdn,
+                    token = token,
+                    type = status,
+                    order = Constants.DECS,
+                    rowsOnPage = Constants.ROW_ON_PAGE,
+                    seqPage = model.seqPage
+                };
+
+                UserTicketResponse result = api.GetUserTicketApi(configuration, request);
+                if (result.responseCode == Code.SUCCESS)
+                {
+                    model.listTicket = result.listTicket ?? new List<Ticket>();
+                    model.totalPage = result.totalPage;
+                }
+                else
+                {
+                    model.listTicket = new List<Ticket>();
+                    model.totalPage = "0";
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                model.listTicket = new List<Ticket>();
+            }
+            return PartialView("_TermUserTicketHistory", model);
+        }
+
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public IActionResult TermResult(string termType)
+        {
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
+
+                string lang = CultureInfo.CurrentCulture.Name;
+                string langValue = (lang.StartsWith("en") || lang.StartsWith("fr")) ? "0" : "1";
+
+                ResultOfTermRequest request = new ResultOfTermRequest
+                {
+                    gameId = termType,
+                    language = langValue,
+                    token = token,
+                    type = Constants.TERM_HAS_NOT_RESULT_TYPE,
+                    order = Constants.DECS,
+                    rowsOnPage = "5",
+                    seqPage = "1",
+                    id = Constants.ALL_DATA
+                };
+
+                ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
+                return Json(result);
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
+            }
+        }
+
+        [HttpPost]
+        public IActionResult ConfirmTicketData([FromBody] ConfirmTicketDataRequest request)
+        {
+            try
+            {
+                log.Info($"[ConfirmTicketData] START - Request: {JsonConvert.SerializeObject(request)}");
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                if (string.IsNullOrEmpty(token))
+                {
+                    log.Info("[ConfirmTicketData] Session expired");
+                    return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
+                }
+
+                request.token = token;
+                request.msisdn = msisdn;
+                request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
+                request.requestId = Guid.NewGuid().ToString();
+
+                ConfirmTicketDataResponse response = api.BuyTicketV2Api(configuration, request);
+                log.Info($"[ConfirmTicketData] Call BuyTicketV2Api Response: {JsonConvert.SerializeObject(response)}");
+
+                return Json(response);
+            }
+            catch (Exception ex)
+            {
+                log.Error("[ConfirmTicketData] EXCEPTION: ", ex);
+                return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
+            }
+        }
+
+        [HttpPost]
+        public IActionResult ConfirmOTP([FromBody] ConfirmOTPRequest request)
+        {
+            try
+            {
+                log.Info($"[ConfirmOTP] START - Request: {JsonConvert.SerializeObject(request)}");
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                if (string.IsNullOrEmpty(token))
+                {
+                    log.Info("[ConfirmOTP] Session expired");
+                    return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
+                }
+
+                request.token = token;
+                request.msisdn = msisdn;
+
+                ConfirmOTPResponse response = api.ConfirmOTPApi(configuration, request);
+                log.Info($"[ConfirmOTP] Call ConfirmOTPApi Response: {JsonConvert.SerializeObject(response)}");
+                return Json(response);
+            }
+            catch (Exception ex)
+            {
+                log.Error("[ConfirmOTP] EXCEPTION: ", ex);
+                return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
+            }
+        }
+
+        [HttpPost]
+        public IActionResult SendOTP()
+        {
+            try
+            {
+                log.Info("[SendOTP] START");
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                if (string.IsNullOrEmpty(token))
+                {
+                    log.Info("[SendOTP] Session expired");
+                    return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
+                }
+
+                SendOTPRequest request = new SendOTPRequest
+                {
+                    msisdn = msisdn,
+                    token = token,
+                    language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
+                    channel = configuration.GetSection("channel").Value
+                };
+                log.Info($"[SendOTP] Call SendOTPApi Request: {JsonConvert.SerializeObject(request)}");
+
+                SendOTPResponse response = api.SendOTPApi(configuration, request);
+                log.Info($"[SendOTP] Call SendOTPApi Response: {JsonConvert.SerializeObject(response)}");
+                return Json(response);
+            }
+            catch (Exception ex)
+            {
+                log.Error("[SendOTP] EXCEPTION: ", ex);
+                return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
+            }
+        }
+
+        [HttpPost]
+        public IActionResult ConfirmBuyingTicketV2([FromBody] ConfirmBuyingTicketRequest request)
+        {
+            try
+            {
+                log.Info($"[ConfirmBuyingTicketV2] START - Request: {JsonConvert.SerializeObject(request)}");
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                if (string.IsNullOrEmpty(token))
+                {
+                    log.Info("[ConfirmBuyingTicketV2] Session expired");
+                    return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
+                }
+
+                var isWalletPayment = request.channelPayment == Constants.NATCASH_WALLET_TICKET;
+
+                // The main-account flow keeps the existing OTP verification.
+                if (!isWalletPayment)
+                {
+                    ConfirmOTPRequest otpRequest = new ConfirmOTPRequest
+                    {
+                        otp = request.paymentCode,
+                        msisdn = msisdn,
+                        token = token,
+                        language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
+                        channel = configuration.GetSection("channel").Value
+                    };
+                    ConfirmOTPResponse otpResponse = api.ConfirmOTPApi(configuration, otpRequest);
+                    if (otpResponse.responseCode != Code.SUCCESS)
+                    {
+                        return Json(new { responseCode = otpResponse.responseCode, responseMessage = otpResponse.responseMessage });
+                    }
+                }
+
+                // Step 2: Proceed to Confirm buying
+                request.token = token;
+                request.msisdn = msisdn;
+                request.requestId = Guid.NewGuid().ToString();
+                request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
+                request.channel = configuration.GetSection("channel").Value;
+
+                log.Info($"[ConfirmBuyingTicketV2] Call ConfirmBuyingTicketApi Request: {JsonConvert.SerializeObject(request)}");
+
+                ConfirmBuyingTicketResponse response = isWalletPayment
+                    ? api.ConfirmBuyingTicketV2Api(configuration, request, Constants.WALLET_PAYMENT_CHANNEL, request.walletPin)
+                    : api.ConfirmBuyingTicketApi(configuration, request);
+                log.Info($"[ConfirmBuyingTicketV2] Call ConfirmBuyingTicketApi Response: {JsonConvert.SerializeObject(response)}");
+
+                if (response.responseCode == Code.SUCCESS)
+                {
+                    log.Info($"[ConfirmBuyingTicketV2] Payment Success. Updating user status for {msisdn}");
+                    UpdateUserStatus(msisdn, token);
+                }
+
+                log.Info($"[ConfirmBuyingTicketV2] END - Result: {JsonConvert.SerializeObject(response)}");
+                return Json(response);
+            }
+            catch (Exception ex)
+            {
+                log.Error("[ConfirmBuyingTicketV2] EXCEPTION: ", ex);
+                return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
+            }
+        }
+
+        [HttpPost]
+        public IActionResult ConfirmBuyingTicket([FromBody] ConfirmBuyingTicketRequest request)
+        {
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
+
+                request.token = token;
+                request.msisdn = msisdn;
+                request.requestId = Guid.NewGuid().ToString();
+                request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
+                request.channel = configuration.GetSection("channel").Value;
+
+                ConfirmBuyingTicketResponse response = api.ConfirmBuyingTicketApi(configuration, request);
+                if (response.responseCode == Code.SUCCESS)
+                {
+                    UpdateUserStatus(msisdn, token);
+                }
+                return Json(new
+                {
+                    responseCode = response.responseCode,
+                    responseMessage = response.responseMessage,
+                    transId = response.transId,
+                    orderId = response.orderId,
+                    userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus")
+                });
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
+            }
+        }
+
+        public IActionResult BuyTicket(string termType)
+        {
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+                model.termType = termType ?? Constants.PIC10_BASIC_CODE;
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                model.userStatus = userStatus;
+                model.profile = profile;
+
+                // Get active term
+                ResultOfTermRequest request = new ResultOfTermRequest
+                {
+                    gameId = model.termType,
+                    token = token,
+                    type = Constants.TERM_HAS_NOT_RESULT_TYPE,
+                    order = Constants.DECS,
+                    rowsOnPage = "1",
+                    seqPage = "1",
+                    id = Constants.ALL_DATA
+                };
+
+                ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
+                if (result.responseCode == Code.SUCCESS && result.listTerm != null && result.listTerm.Count > 0)
+                {
+                    model.listTerm = result.listTerm;
+                }
+                else
+                {
+                    model.listTerm = new List<Term>();
+                }
+
+                if (model.termType == Constants.PIC10_BIGSMALL_CODE || model.termType == Constants.PIC10_ODDEVEN_CODE)
+                {
+                    ResultOfTermRequest pastRequest = new ResultOfTermRequest
+                    {
+                        gameId = model.termType,
+                        token = token,
+                        type = Constants.TERM_HAS_RESULT_TYPE,
+                        order = Constants.DECS,
+                        fromDate = DateTime.Now.AddDays(-10).ToString("dd/MM/yyyy"),
+                        toDate = DateTime.Now.ToString("dd/MM/yyyy"),
+                        rowsOnPage = "5",
+                        seqPage = "1",
+                        id = Constants.ALL_DATA
+                    };
+
+                    ResultOfTermResponse pastResult = api.GetResultOfTermApi(configuration, pastRequest);
+                    if (pastResult.responseCode == Code.SUCCESS && pastResult.listTerm != null)
+                    {
+                        var pastTerms = pastResult.listTerm.Take(5).ToList();
+                        pastTerms.Reverse(); // Display chronological order
+                        ViewBag.PastTerms = pastTerms;
+                    }
+                    else
+                    {
+                        ViewBag.PastTerms = new List<Term>();
+                    }
+                }
+
+                model.serverTime = DateTime.Now; return View(model);
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return RedirectToAction("GameHome", new { termType = termType });
+            }
+        }
+
+        public IActionResult TransferWinMoney()
+        {
+            if (!CheckAuthToken())
+            {
+                return RedirectToAction("Login", "Account", new { area = "" });
+            }
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            model.profile = HttpContext.Session.GetComplexData<Profile>("profile");
+            model.userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+            model.serverTime = DateTime.Now; return View(model);
+        }
+
+        [HttpPost]
+        public IActionResult ConfirmTransfer(string otp, string phone, string amount, string channelPayment)
+        {
+            try
+            {
+                log.Info($"[ConfirmTransfer] START - otp: {otp}, phone: {phone}, amount: {amount}, channelPayment: {channelPayment}");
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                if (string.IsNullOrEmpty(token)) return Json(new { status = Code.SESSION_EXPIRED, message = "Session expired" });
+
+                // Step 1: Verify OTP
+                ConfirmOTPRequest otpRequest = new ConfirmOTPRequest
+                {
+                    otp = otp,
+                    msisdn = msisdn,
+                    token = token,
+                    language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
+                    channel = configuration.GetSection("channel").Value
+                };
+                log.Info($"[ConfirmTransfer] Call ConfirmOTPApi Request: {JsonConvert.SerializeObject(otpRequest)}");
+                ConfirmOTPResponse otpResponse = api.ConfirmOTPApi(configuration, otpRequest);
+                log.Info($"[ConfirmTransfer] Call ConfirmOTPApi Response: {JsonConvert.SerializeObject(otpResponse)}");
+
+                if (otpResponse.responseCode != Code.SUCCESS)
+                {
+                    return Json(new { status = otpResponse.responseCode, message = otpResponse.responseMessage });
+                }
+
+                // Step 2: If OTP success, call Transfer Money Api
+                TransferMoneyRequest xferRequest = new TransferMoneyRequest
+                {
+                    msisdn = msisdn,
+                    msisdnReceive = phone,
+                    money = amount,
+                    otp = otp,
+                    token = token,
+                    channelPayment = channelPayment ?? Constants.BASIC_WALLET_TRANSFER,
+                    language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
+                    channel = configuration.GetSection("channel").Value
+                };
+
+                log.Info($"[ConfirmTransfer] Call TransferMoneyApi Request: {JsonConvert.SerializeObject(xferRequest)}");
+                TransferMoneyResponse xferResponse = api.TransferMoneyApi(configuration, xferRequest);
+                log.Info($"[ConfirmTransfer] Call TransferMoneyApi Response: {JsonConvert.SerializeObject(xferResponse)}");
+
+                if (xferResponse.responseCode == Code.SUCCESS)
+                {
+                    UpdateUserStatus(msisdn, token);
+                }
+
+                return Json(new
+                {
+                    status = xferResponse.responseCode,
+                    message = xferResponse.responseMessage,
+                    paymentCode = xferResponse.paymentCode,
+                    responseCode = xferResponse.responseCode,
+                    userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus")
+                });
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return Json(new { status = Code.ERROR, message = ex.Message });
+            }
+        }
+
+        private void UpdateUserStatus(string msisdn, string token)
+        {
+            try
+            {
+                log.Info($"[UpdateUserStatus] START - msisdn: {msisdn}");
+                UserStatusRequest userStatusRequest = new UserStatusRequest { users = msisdn, token = token };
+                log.Info($"[UpdateUserStatus] Call GetUserStatusApi Request: {JsonConvert.SerializeObject(userStatusRequest)}");
+
+                UserStatus userStatusGet = api.GetUserStatusApi(configuration, userStatusRequest);
+                log.Info($"[UpdateUserStatus] Call GetUserStatusApi Response: {JsonConvert.SerializeObject(userStatusGet)}");
+
+                if (userStatusGet != null)
+                {
+                    HttpContext.Session.SetComplexData("userStatus", userStatusGet);
+                }
+                log.Info("[UpdateUserStatus] END");
+            }
+            catch (Exception ex)
+            {
+                log.Error("[UpdateUserStatus] EXCEPTION: ", ex);
+            }
+        }
+
+        public IActionResult Logout()
+        {
+            ClearCache();
+            return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+        }
+    }
+}

+ 1492 - 0
website_natcash/Areas/LotteryV2/Views/Home/BuyTicket.cshtml

@@ -0,0 +1,1492 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = "LotteryV2 - Buy Ticket";
+    Layout = "~/Areas/LotteryV2/Views/Shared/_Layout.cshtml";
+    var currentTerm = Model.listTerm?.FirstOrDefault();
+}
+@using LotteryWebApp.Languages;
+@using LotteryWebApp.Common;
+
+<link rel="stylesheet" href="/LotteryV2/css/buy-ticket.css" />
+
+<link rel="stylesheet" href="/LotteryV2/css/buy-ticket.css" />
+
+@if (Model.termType == Constants.PIC10_BIGSMALL_CODE || Model.termType == Constants.PIC10_ODDEVEN_CODE)
+{
+    var isBigSmall = Model.termType == Constants.PIC10_BIGSMALL_CODE;
+    var themeColor = isBigSmall ? "#0A9800" : "#AA3DC8";
+    var gameTitle = isBigSmall ? Lang.v2_big_small : Lang.v2_odd_even;
+    var prizeAmount = isBigSmall ? "100.000" : "200.000";
+    
+    <!-- ==================== CARD SELECTION GAME UI (BIG/SMALL or ODD/EVEN) ==================== -->
+    <div class="main-container animate__animated animate__fadeIn bg-[#F5F5F5] h-screen flex flex-col font-bricolage overflow-hidden max-w-[414px] mx-auto relative">
+        <!-- Header -->
+        <div class="w-full py-3 px-4 text-white flex items-center justify-between sticky top-0 z-[60]" style="background: @themeColor;">
+            <button onclick="location.href='@Url.Action("GameHome", "Home")'" class="w-10 h-10 flex items-center justify-center -ml-2 rounded-full active:bg-white/20 transition-all">
+                <i class="fa-solid fa-arrow-left text-[20px]"></i>
+            </button>
+            <span class="font-[800] text-[18px] absolute left-1/2 -translate-x-1/2 whitespace-nowrap">
+                @gameTitle
+            </span>
+            <div class="w-8"></div>
+        </div>
+
+        <!-- Sticky Term Info sub-header -->
+        <div class="p-4 py-2.5 bg-white flex items-center justify-between shadow-sm sticky top-[52px] z-50">
+            <div class="flex items-center gap-2 border border-[#E5E7EB] rounded-lg px-3 py-1.5 bg-gray-50">
+                <i class="fa-regular fa-calendar text-[[@themeColor]] text-sm" style="color: @themeColor"></i>
+                <span class="text-[12px] font-bold text-gray-700">@DateTime.Now.ToString("dddd, MMM dd, yyyy", System.Globalization.CultureInfo.InvariantCulture)</span>
+            </div>
+            <div class="flex items-center gap-1 ml-4 flex-1 justify-end">
+                <span class="text-[12px] font-bold text-gray-400">@Lang.v2_round</span>
+                <span class="text-[18px] font-black text-brown-main">#@(currentTerm?.id ?? "123")</span>
+            </div>
+        </div>
+
+        <!-- Scrollable Content Area -->
+        <div class="flex-1 overflow-y-auto bg-white pb-40" id="bsContent">
+            <!-- Results for the last 5 days -->
+            <div class="px-5 pt-4 pb-2">
+                <h3 class="text-[17px] font-bold text-black text-center mb-3">Results for the last 5 days</h3>
+                <div id="last5Results" class="flex justify-between gap-1.5 px-1">
+                    @{
+                        var pastTerms = ViewBag.PastTerms as List<LotteryWebApp.Service.Term> ?? new List<LotteryWebApp.Service.Term>();
+                        foreach (var term in pastTerms) {
+                            var rawResult = (term.result ?? "").Trim().ToUpper();
+                            var dateStr = "--";
+                            DateTime dt;
+                            if (DateTime.TryParse(term.date_random, out dt)) {
+                                dateStr = dt.ToString("MMM dd", System.Globalization.CultureInfo.InvariantCulture);
+                            }
+                            
+                            var resKey = rawResult;
+                            var resTitle = rawResult;
+                            if (isBigSmall) {
+                                if (rawResult == "S") { resKey = "Small"; resTitle = Lang.Small; }
+                                else if (rawResult == "B") { resKey = "Big"; resTitle = Lang.Big; }
+                            } else {
+                                if (rawResult == "O") { resKey = "Odd"; resTitle = Lang.Odd; }
+                                else if (rawResult == "E") { resKey = "Even"; resTitle = Lang.Even; }
+                            }
+                            
+                            var resColor = "";
+                            var bgStyle = "background: linear-gradient(136deg, #FFFAE6 0%, #FFE588 100%);";
+                            var textStyle = "-webkit-text-stroke: 0.5px #000;";
+
+                            if (resKey == "NA" || string.IsNullOrEmpty(rawResult)) {
+                                bgStyle = "background: #EAEAEA;";
+                                resTitle = "";
+                                textStyle = "";
+                            } else {
+                                if (isBigSmall) {
+                                    resColor = resKey == "Big" ? "#A2FF00" : "#FF4157";
+                                } else {
+                                    resColor = resKey == "Odd" ? "#FFC700" : "#B33BD0";
+                                }
+                                textStyle += $" color: {resColor};";
+                            }
+                            
+                            <div class="flex flex-col items-center justify-center min-h-[64px] flex-1 rounded-lg py-1.5 border border-gray-200" style="@bgStyle">
+                                <span class="text-[11px] font-bold text-black whitespace-nowrap opacity-70">@dateStr</span>
+                                <span class="text-[22px] font-black leading-tight" style="@textStyle">@resTitle</span>
+                            </div>
+                        }
+                        
+                        for(int r = pastTerms.Count; r < 5; r++) {
+                            <div class="flex flex-col items-center justify-center min-h-[64px] flex-1 rounded-lg py-1.5 border border-gray-200" style="background: #EAEAEA; opacity: 0.7;">
+                                <span class="text-[11px] font-bold text-black whitespace-nowrap opacity-70">--</span>
+                                <span class="text-[22px] font-black leading-tight" style="color: transparent;"></span>
+                            </div>
+                        }
+                    }
+                </div>
+            </div>
+
+            <!-- Selection Cards -->
+            <!-- Selection Cards -->
+            <div class="px-5 pt-4 flex gap-3 h-[245px]">
+                <!-- Card 1 (Big or Odd) -->
+                <div id="cardBig" onclick="selectBigSmall('big')" class="bigsmall-card flex-1 rounded-2xl relative cursor-pointer transition-all duration-300 active:scale-[0.97] border-2 border-transparent overflow-hidden flex flex-col" style="background: linear-gradient(180deg, #FFF7DB 0%, #FFEEB3 100%);">
+                    <img src="/LotteryV2/img/bigsmall/light_effect_1.png" class="absolute top-0 left-0 w-full opacity-60 pointer-events-none" alt="" />
+                    <img src="/LotteryV2/img/bigsmall/light_effect_2.png" class="absolute bottom-12 left-0 w-full opacity-60 pointer-events-none" alt="" />
+                    <div class="flex flex-col items-center pt-4 pb-3 px-3 relative z-10 h-full justify-between">
+                        <div class="flex flex-col items-center w-full">
+                            <div class="h-[34px] flex items-center justify-center">
+                                <div class="text-[40px] font-[800] leading-none" style="-webkit-text-stroke: 1px #000; text-shadow: 1px 2px 2px rgba(0,0,0,0.15); color: @(isBigSmall ? "#A2FF00" : "#FFC700");">@(isBigSmall ? "Big" : "Odd")</div>
+                            </div>
+                            <div class="text-[11px] font-medium text-gray-500 mt-1 h-[28px] text-center leading-tight">
+                                @(isBigSmall ? "13 number from" : "Odd numbers") <br/> <b>@(isBigSmall ? "41-80" : "1, 3, 5, 7, 9")</b>
+                            </div>
+                        </div>
+                        <div class="flex items-center justify-center -space-x-2 my-2">
+                            @if (isBigSmall) {
+                                <img src="/LotteryV2/img/bigsmall/ball_42_dark.png" class="w-12 h-12 relative z-[1]" alt="42" />
+                                <img src="/LotteryV2/img/bigsmall/ball_88_big.png" class="w-16 h-16 relative z-[2]" alt="88" />
+                                <img src="/LotteryV2/img/bigsmall/ball_54_dark.png" class="w-12 h-12 relative z-[1]" alt="54" />
+                            } else {
+                                <img src="/LotteryV2/img/oddeven/ball_3.png" class="w-12 h-12 relative z-[1]" alt="3" />
+                                <img src="/LotteryV2/img/oddeven/ball_1.png" class="w-16 h-16 relative z-[2]" alt="1" />
+                                <img src="/LotteryV2/img/oddeven/ball_19.png" class="w-12 h-12 relative z-[1]" alt="19" />
+                            }
+                        </div>
+                        <button class="bigsmall-btn w-full py-2.5 rounded-xl font-black text-[15px] transition-all shadow-md" style="background: @themeColor; color: white;">@Lang.v2_select</button>
+                    </div>
+                </div>
+
+                <!-- Card 2 (Small or Even) -->
+                <div id="cardSmall" onclick="selectBigSmall('small')" class="bigsmall-card flex-1 rounded-2xl relative cursor-pointer transition-all duration-300 active:scale-[0.97] border-2 border-transparent overflow-hidden flex flex-col" style="background: linear-gradient(180deg, #FFF7DB 0%, #FFEEB3 100%);">
+                    <img src="/LotteryV2/img/bigsmall/light_effect_1.png" class="absolute top-0 left-0 w-full opacity-60 pointer-events-none" alt="" />
+                    <img src="/LotteryV2/img/bigsmall/light_effect_2.png" class="absolute bottom-12 left-0 w-full opacity-60 pointer-events-none" alt="" />
+                    <div class="flex flex-col items-center pt-4 pb-3 px-3 relative z-10 h-full justify-between">
+                        <div class="flex flex-col items-center w-full">
+                            <div class="h-[34px] flex items-center justify-center">
+                                <div class="text-[40px] font-[800] leading-none italic" style="-webkit-text-stroke: 1px #000; text-shadow: 1px 2px 2px rgba(0,0,0,0.15); color: @(isBigSmall ? "#FF4157" : "#B33BD0");">@(isBigSmall ? "Small" : "Even")</div>
+                            </div>
+                            <div class="text-[11px] font-medium text-gray-500 mt-1 h-[28px] text-center leading-tight">
+                                @(isBigSmall ? "13 number from" : "Even numbers") <br/> <b>@(isBigSmall ? "01-40" : "0, 2, 4, 6, 8")</b>
+                            </div>
+                        </div>
+                        <div class="flex items-center justify-center -space-x-2 my-2">
+                            @if (isBigSmall) {
+                                <img src="/LotteryV2/img/bigsmall/ball_5_blue.png" class="w-12 h-12 relative z-[1]" alt="5" />
+                                <img src="/LotteryV2/img/bigsmall/ball_1_big.png" class="w-16 h-16 relative z-[2]" alt="1" />
+                                <img src="/LotteryV2/img/bigsmall/ball_8_pink.png" class="w-12 h-12 relative z-[1]" alt="8" />
+                            } else {
+                                <img src="/LotteryV2/img/oddeven/ball_66.png" class="w-12 h-12 relative z-[1]" alt="66" />
+                                <img src="/LotteryV2/img/oddeven/ball_68.png" class="w-16 h-16 relative z-[2]" alt="68" />
+                                <img src="/LotteryV2/img/oddeven/ball_88.png" class="w-12 h-12 relative z-[1]" alt="88" />
+                            }
+                        </div>
+                        <button class="bigsmall-btn w-full py-2.5 rounded-xl font-black text-[15px] transition-all shadow-md"
+								style="background: @themeColor; color: white;">@Lang.v2_select</button>
+                    </div>
+                </div>
+            </div>
+
+            <!-- You Choose + Prize Section -->
+            <div class="px-5 pt-6 flex flex-col items-center gap-4">
+                <div class="flex flex-col items-center">
+                    <span class="text-[15px] font-medium text-black">@Lang.v2_you_choose</span>
+                    <span id="choiceDisplay" class="text-[42px] font-[800] leading-tight" style="-webkit-text-stroke: 1px #000;">—</span>
+                </div>
+                <div class="flex flex-col items-center">
+                    <span class="text-[18px] font-medium text-black">@Lang.v2_prize_if_win</span>
+                    <div class="flex items-baseline gap-1">
+                        <span class="text-[28px] font-black text-black">@prizeAmount</span>
+                        <span class="text-[14px] font-black text-[#E56B23]">HTG</span>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- Bottom Action Bar -->
+        <div class="p-4 bg-white border-t border-gray-200 z-[70] shadow-[0px_-4px_10px_rgba(0,0,0,0.03)] absolute bottom-0 w-full left-0">
+            <div class="flex items-center justify-between">
+                <div class="flex flex-col">
+                    <div class="flex items-center gap-1.5 mb-0.5">
+                        <span class="text-[11px] text-black font-black uppercase">@Lang.total_ticket:</span>
+                        <span id="bsTotalTicketCount" class="text-[12px] font-black text-black">0</span>
+                    </div>
+                    <span class="text-[11px] text-black font-black uppercase">@Lang.v2_estimated_ticket_price</span>
+                    <div class="flex items-baseline gap-1">
+                        <span id="bsTotalPrice" class="text-[28px] font-black text-black">0</span>
+                        <span class="text-[13px] font-black" style="color: @themeColor">HTG</span>
+                    </div>
+                </div>
+                <button id="bsPaymentBtn" onclick="bsShowPayment()" class="text-white text-[20px] font-black px-10 py-3.5 rounded-xl shadow-lg active:scale-95 transition-all" style="background: @themeColor;">
+                    @Lang.v2_payment
+                </button>
+            </div>
+        </div>
+    </div>
+}
+else
+{
+<!-- ==================== Basic Pick 10 / Odd-Even GAME UI ==================== -->
+<div class="main-container animate__animated animate__fadeIn bg-[#F5F5F5] h-screen flex flex-col font-bricolage overflow-hidden max-w-[414px] mx-auto relative">
+    <!-- Header -->
+    <div class="w-full bg-[#EE0033] py-3 px-4 text-white flex items-center justify-between sticky top-0 z-[60]">
+        <button onclick="location.href='@Url.Action("GameHome", "Home")'" class="w-10 h-10 flex items-center justify-center -ml-2 rounded-full active:bg-white/20 transition-all">
+            <i class="fa-solid fa-arrow-left text-[20px]"></i>
+        </button>
+        <span class="font-[800] text-[18px] absolute left-1/2 -translate-x-1/2 whitespace-nowrap">
+            @if (Model.termType == Constants.PIC10_BASIC_CODE) { <text>Basic Pick 10</text> }
+            else { @Lang.v2_odd_even }
+        </span>
+        <div class="w-8"></div>
+    </div>
+
+    <!-- Sticky Term Info sub-header -->
+    <div class="p-4 py-2.5 bg-white flex items-center justify-between shadow-sm sticky top-[52px] z-50">
+        <div class="flex items-center gap-2 border border-[#E5E7EB] rounded-lg px-3 py-1.5 bg-gray-50">
+            <i class="fa-regular fa-calendar text-[#EE0033] text-sm"></i>
+            <span class="text-[12px] font-bold text-gray-700">@DateTime.Now.ToString("dddd, MMM dd, yyyy", System.Globalization.CultureInfo.InvariantCulture)</span>
+        </div>
+        <div class="flex items-center gap-1 ml-4 flex-1 justify-end">
+            <span class="text-[12px] font-bold text-gray-400">@Lang.v2_round</span>
+            <span class="text-[18px] font-black text-brown-main">#@(currentTerm?.id ?? "12459")</span>
+        </div>
+    </div>
+
+    <!-- Ticket Scrollable List Area -->
+    <div id="ticketContainer" class="p-4 flex flex-col gap-6 flex-1 overflow-y-auto bg-[#F5F5F5] pb-[50vh]">
+        @for (int i = 1; i <= 2; i++)
+        {
+            <div class="ticket-card relative group active:bg-gray-50 transition-colors cursor-pointer animate__animated animate__fadeIn">
+                <button onclick="removeEntry(this)" class="absolute -right-2 top-2 w-7 h-7 bg-[#EE0033] text-white rounded-full flex items-center justify-center text-[11px] shadow-sm z-[10] hover:bg-red-600 transition-all border-2 border-white">
+                    <i class="fa-solid fa-xmark"></i>
+                </button>
+                <div class="absolute left-2 top-4 w-9 h-9 rounded-full border-[3px] border-white flex items-center justify-center text-white font-black text-sm shadow-md ticket-index">@i</div>
+                <div class="flex flex-col gap-1 pl-8">
+                    <span class="text-[16px] font-extrabold text-[#333]">@Lang.v2_select_10_lucky_numbers</span>
+                    <div class="flex items-start gap-4">
+                        <div class="grid grid-cols-5 gap-y-1 gap-x-2 flex-1">
+                            @for (int j = 0; j < (Model.termType == Constants.PIC10_BASIC_CODE ? 10 : 15); j++)
+                            {
+                                <div class="ball-circle ball-empty"></div>
+                            }
+                        </div>
+                        <div class="w-20 action-area flex flex-col gap-2">
+                             <button onclick="randomizeTicket(this)" class="rand-btn bg-[#0A9800] text-white flex items-center justify-center gap-2 w-20 py-2 rounded-xl font-extrabold text-[11px] shadow-sm active:scale-95 transition-all">
+                                <i class="fa-solid fa-arrows-rotate text-[10px]"></i> @Lang.Random
+                             </button>
+                             <div class="edit-delete-group hidden flex flex-col gap-2">
+                                 <button onclick="editFullTicket(this)" class="bg-[#2B83F2] text-white flex items-center justify-center gap-2 w-20 py-1.5 rounded-lg font-bold text-[12px] shadow-sm active:scale-95 transition-all">
+                                    <i class="fa-solid fa-pen text-[10px]"></i> @Lang.v2_edit
+                                 </button>
+                                 <button onclick="clearTicket(this)" class="bg-[#EE0033] text-white flex items-center justify-center gap-2 w-20 py-1.5 rounded-lg font-bold text-[12px] shadow-sm active:scale-95 transition-all">
+                                    <i class="fa-solid fa-trash-can text-[10px]"></i> @Lang.v2_delete
+                                 </button>
+                             </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        }
+
+        <div class="w-full pt-2" id="addButtonWrapper">
+            <button onclick="addNewTicket()" class="w-fit min-w-[220px] mx-auto bg-green-main text-white font-black text-md py-2.5 px-6 rounded-xl shadow-md border-b-[4px] border-[#129A30] active:translate-y-[1px] active:border-b-[1px] transition-all flex items-center justify-center gap-2">
+                @Lang.v2_add_more_ticket
+            </button>
+        </div>
+        <div class="h-4"></div>
+    </div>
+
+    <!-- Bottom Action Bar -->
+    <div class="p-4 bg-white border-t border-gray-200 z-[70] shadow-[0px_-4px_10px_rgba(0,0,0,0.03)]">
+        <div class="flex items-center justify-between">
+            <div class="flex flex-col">
+                <div class="flex items-center gap-1.5 mb-0.5">
+                    <span class="text-[11px] text-black font-black uppercase">@Lang.total_ticket:</span>
+                    <span id="totalTicketCount" class="text-[12px] font-black text-black">0</span>
+                </div>
+                <span class="text-[11px] text-black font-black uppercase">@Lang.v2_estimated_ticket_price</span>
+                <div class="flex items-baseline gap-1">
+                    <span id="totalPrice" class="text-[28px] font-black text-black">0</span>
+                    <span class="text-[13px] font-black text-[#EE0033]">HTG</span>
+                </div>
+            </div>
+            <button onclick="preparePayment()" class="bg-[#EE0033] text-white text-[20px] font-black px-10 py-3.5 rounded-xl shadow-[0px_6px_15px_rgba(238,0,51,0.25)] active:scale-95 transition-all">
+                @Lang.v2_payment
+            </button>
+        </div>
+    </div>
+</div>
+}
+
+<!-- Payment channel selection -->
+<div id="paymentChannelModal" class="hidden fixed inset-0 z-[140] bg-black/70 backdrop-blur-[3px] items-center justify-center p-4 font-bricolage">
+    <div class="relative w-full max-w-[370px] overflow-hidden rounded-[32px] bg-[#F8F9FC] shadow-[0_28px_70px_rgba(0,0,0,0.35)] animate__animated animate__zoomIn animate__faster">
+        <div class="relative overflow-hidden bg-gradient-to-br from-[#EE0033] to-[#B80028] px-6 pb-7 pt-6 text-white">
+            <div class="absolute -right-8 -top-10 h-32 w-32 rounded-full bg-white/10"></div>
+            <div class="absolute -bottom-12 -left-8 h-28 w-28 rounded-full bg-black/10"></div>
+            <button type="button" onclick="hidePaymentChannelModal()" class="absolute right-4 top-4 z-10 flex h-9 w-9 items-center justify-center rounded-full bg-white/15 text-white transition hover:bg-white/25 active:scale-90" aria-label="Close">
+                <i class="fa-solid fa-xmark"></i>
+            </button>
+            <div class="relative z-[1] flex items-center gap-4">
+                <div class="flex h-14 w-14 shrink-0 items-center justify-center rounded-2xl bg-white text-[25px] text-[#EE0033] shadow-lg"><i class="fa-solid fa-wallet"></i></div>
+                <div><h2 class="text-[21px] font-black leading-tight">@Lang.payment_method_title</h2><p class="mt-1 text-[13px] font-semibold text-white/80">@Lang.payment_method_subtitle</p></div>
+            </div>
+        </div>
+        <div class="space-y-3 p-5">
+            <button type="button" onclick="selectPaymentChannel('@Constants.BASIC_WALLET_TICKET')" class="group flex w-full items-center gap-4 rounded-[20px] border-2 border-transparent bg-white p-4 text-left shadow-[0_5px_18px_rgba(31,41,55,0.07)] transition hover:-translate-y-0.5 hover:border-[#EE0033] active:scale-[0.98]">
+                <span class="flex h-12 w-12 shrink-0 items-center justify-center rounded-2xl bg-[#FFE8ED] text-[21px] text-[#EE0033]"><i class="fa-solid fa-mobile-screen-button"></i></span>
+                <span class="min-w-0 flex-1"><span class="block text-[16px] font-black text-[#171A24]">@Lang.payment_main_account</span><span class="mt-0.5 block text-[12px] font-semibold text-gray-500">@Lang.payment_main_account_desc</span></span>
+                <span class="flex h-8 w-8 items-center justify-center rounded-full bg-gray-100 text-gray-400 transition group-hover:bg-[#EE0033] group-hover:text-white"><i class="fa-solid fa-chevron-right text-[12px]"></i></span>
+            </button>
+            <button type="button" onclick="selectPaymentChannel('@Constants.NATCASH_WALLET_TICKET')" class="group flex w-full items-center gap-4 rounded-[20px] border-2 border-transparent bg-white p-4 text-left shadow-[0_5px_18px_rgba(31,41,55,0.07)] transition hover:-translate-y-0.5 hover:border-[#0A9800] active:scale-[0.98]">
+                <span class="flex h-12 w-12 shrink-0 items-center justify-center rounded-2xl bg-[#E7F8E6] text-[21px] text-[#0A9800]"><i class="fa-solid fa-wallet"></i></span>
+                <span class="min-w-0 flex-1"><span class="flex items-center gap-2 text-[16px] font-black text-[#171A24]">@Lang.payment_wallet <span class="rounded-full bg-[#E7F8E6] px-2 py-0.5 text-[9px] font-black text-[#0A9800]">PIN</span></span><span class="mt-0.5 block text-[12px] font-semibold text-gray-500">@Lang.payment_wallet_desc</span></span>
+                <span class="flex h-8 w-8 items-center justify-center rounded-full bg-gray-100 text-gray-400 transition group-hover:bg-[#0A9800] group-hover:text-white"><i class="fa-solid fa-chevron-right text-[12px]"></i></span>
+            </button>
+            <p class="pt-1 text-center text-[11px] font-semibold text-gray-400"><i class="fa-solid fa-shield-halved mr-1 text-[#0A9800]"></i>@Lang.payment_security_message</p>
+        </div>
+    </div>
+</div>
+
+<!-- Order Summary Screen (from Figma) -->
+<div id="orderSummaryModal" class="hidden fixed inset-0 z-[150] bg-black/60 flex items-center justify-center p-0 font-bricolage backdrop-blur-[2px]">
+    <div class="w-full h-full bg-white flex flex-col animate__animated animate__fadeInRight animate__faster shadow-2xl relative lg:max-w-[414px]">
+        <!-- Header đồng bộ tuyệt đối -->
+        <div class="w-full bg-[#EE0033] py-3 px-4 text-white flex items-center justify-between sticky top-0 z-[60]">
+            <button onclick="hideOrderSummary()" class="w-10 h-10 flex items-center justify-center -ml-2 rounded-full active:bg-white/20 transition-all">
+                <i class="fa-solid fa-arrow-left text-[20px]"></i>
+            </button>
+            <span class="font-[800] text-[18px] absolute left-1/2 -translate-x-1/2 whitespace-nowrap">
+                @if (Model.termType == Constants.PIC10_BASIC_CODE) { <text>Basic Pick 10</text> }
+                else if (Model.termType == Constants.PIC10_BIGSMALL_CODE) { @Lang.v2_big_small }
+                else { @Lang.v2_odd_even }
+            </span>
+            <div class="w-8"></div>
+        </div>
+
+        <!-- Content Area: Split into scrollable list and static summary -->
+        <div class="flex-1 flex flex-col min-h-0 bg-gray-50">
+            <!-- Scrollable Ticket List -->
+            <div class="flex-1 overflow-y-auto p-5 pb-2">
+                <div class="flex justify-between items-center px-1 mb-3">
+                     <span class="text-[14px] font-bold text-gray-800">Selected Tickets</span>
+                     <span class="text-[14px] font-bold text-gray-800">@Lang.price</span>
+                </div>
+
+                <!-- Ticket List -->
+                <div id="summaryTicketList" class="flex flex-col gap-4">
+                     <!-- Populated dynamically via JS -->
+                </div>
+            </div>
+
+            <!-- Static Summary Info (Dates & Totals) -->
+            <div class="shrink-0 bg-white p-5 space-y-4 border-t border-gray-100 shadow-[0px_-10px_20px_rgba(0,0,0,0.03)]">
+                 <!-- Dates Section -->
+                 <div class="grid grid-cols-2 gap-4">
+                      <div class="space-y-1">
+                          <span class="text-[11px] font-black text-[#EE0033] block text-center uppercase tracking-tight">@Lang.date_purchase</span>
+                          <div class="bg-white border border-gray-100 rounded-xl py-2.5 px-2 text-center font-black text-[11px] text-gray-700 shadow-sm">
+                              @DateTime.Now.ToString("dddd MMM dd, yyyy", System.Globalization.CultureInfo.InvariantCulture)
+                          </div>
+                      </div>
+                      <div class="space-y-1">
+                          <span class="text-[11px] font-black text-[#EE0033] block text-center uppercase tracking-tight">@Lang.draw_date</span>
+                          <div class="bg-white border border-gray-100 rounded-xl py-2.5 px-2 text-center font-black text-[11px] text-gray-700 shadow-sm" id="summaryResultDate">
+                              @{
+                                  DateTime drawDate;
+                                  bool isValidDate = DateTime.TryParse(currentTerm?.date_end, out drawDate);
+                                  if (isValidDate) {
+                                     @drawDate.ToString("dddd MMM dd, yyyy", System.Globalization.CultureInfo.InvariantCulture)
+                                  } else {
+                                     @:N/A
+                                  }
+                              }
+                          </div>
+                      </div>
+                 </div>
+
+                 <!-- Totals Section -->
+                 <div class="space-y-1 px-1">
+                      <div class="flex justify-between items-center">
+                          <span class="text-[14px] font-bold text-black">@Lang.total_ticket</span>
+                          <span id="summaryTotalCount" class="text-[16px] font-black text-black">0</span>
+                      </div>
+                      <div class="flex justify-between items-center">
+                          <span class="text-[14px] font-bold text-black">@Lang.total_money</span>
+                          <div class="flex items-baseline gap-1">
+                              <span id="summaryTotalAmount" class="text-[32px] font-black text-black">0</span>
+                              <span class="text-[16px] font-black text-[#EE0033]">HTG</span>
+                          </div>
+                      </div>
+                 </div>
+            </div>
+        </div>
+
+        <div class="shrink-0 p-4 bg-white border-t border-gray-100 grid grid-cols-2 gap-4 pb-8 shadow-[0px_-4px_20px_rgba(0,0,0,0.05)]">
+            <button onclick="hideOrderSummary()" class="bg-[#FFB000] text-white py-2.5 rounded-2xl font-black text-[18px] shadow-lg shadow-orange-200 active:scale-95 transition-all uppercase tracking-wide">
+                @Lang.reorder
+            </button>
+            <button id="finalPaymentBtn" onclick="confirmCheckout(this)" class="bg-[#EE0033] text-white py-2.5 rounded-2xl font-black text-[18px] shadow-lg shadow-red-200 active:scale-95 transition-all uppercase tracking-wide">
+                @Lang.v2_payment
+            </button>
+        </div>
+    </div>
+</div>
+
+    <!-- OTP Verification Modal (V2 Design Overhaul - Matching Figma) -->
+    <div id="otpModal" class="fixed inset-0 bg-black/80 backdrop-blur-sm z-[200] hidden items-center justify-center p-4">
+        
+        <!-- Outer container to hold the modal + external overflowing elements (like stars/glitter) -->
+        <div class="relative w-full max-w-[360px] mt-6 animate__animated animate__zoomIn animate__faster">
+            
+            <!-- Glitter effect (external to the white box) -->
+            <div class="absolute -top-[100px] -left-[10px] w-[380px] h-[160px] mix-blend-screen pointer-events-none z-0 overflow-visible opacity-90" style="background: url('/LotteryV2/img/modal/otp_glitter.png') no-repeat center center; background-size: contain;"></div>
+
+            <!-- The White Box -->
+            <div class="bg-white rounded-[32px] w-full relative z-10 shadow-[0px_0px_30px_rgba(255,255,255,0.15)] pb-5 border border-yellow-500/20">
+                
+                <!-- Floating Coins from Figma -->
+                <div class="absolute -top-[40px] -right-[10px] z-[80] w-[120px] pointer-events-none drop-shadow-2xl">
+                    <img src="/LotteryV2/img/modal/otp_coins.png" class="w-full object-contain" />
+                </div>
+
+                <!-- Red Header Section -->
+                <div class="relative w-full pt-4 pb-4 bg-[#EE0033] rounded-t-[32px] flex flex-col items-center justify-center z-20" style="border-bottom-left-radius: 50% 20px; border-bottom-right-radius: 50% 20px;">
+                    <h2 class="text-white text-[17px] sm:text-[20px] font-[900] uppercase tracking-wide relative z-10 font-bricolage drop-shadow-md text-center px-4 leading-tight w-[80%] mr-auto">@Lang.v2_confirm_purchase</h2>
+                </div>
+                
+                <!-- Modal Body Content -->
+                <div class="relative px-6 pt-3 flex flex-col items-center gap-3 z-10">
+                    
+                    <!-- Shield Icon: mix-blend-mode multiply to remove the white square background -->
+                    <div class="relative w-full flex justify-center mb-0 mt-1">
+                        <img src="/LotteryV2/img/modal/otp_shield.png" alt="Success" class="w-[90px] object-contain">
+                    </div>
+        
+                    <!-- Info Rows (Aligned exactly like screenshot) -->
+                    <div class="w-full flex flex-col gap-2 items-center mt-0">
+                        <!-- Ticket Info -->
+                        <div class="grid grid-cols-[90px_auto] items-center gap-3 w-full justify-center">
+                            <span class="text-[15px] font-bold text-[#555] text-right font-bricolage">@Lang.v2_ticket</span>
+                            <div id="otpTicketTypeContainer" class="flex justify-start">
+                                <img id="otpTicketTypeImg" src="/LotteryV2/img/even_text.png" class="h-6 object-contain drop-shadow-sm" />
+                            </div>
+                        </div>
+
+                        <!-- Amount Info -->
+                        <div class="grid grid-cols-[90px_auto] items-center gap-3 w-full justify-center">
+                            <span class="text-[15px] font-bold text-[#555] text-right font-bricolage">@Lang.v2_amount</span>
+                            <div class="flex items-baseline gap-1.5 justify-start">
+                                <span id="otpTotalAmount" class="text-[22px] font-[900] text-black leading-none tracking-tight">1.000</span>
+                                <span class="text-[15px] font-[900] text-[#F37021] font-bricolage">HTG</span>
+                            </div>
+                        </div>
+                    </div>
+        
+                    <p id="paymentCodeInstruction" class="text-[14px] font-bold text-[#555] text-center px-4 leading-snug mt-0 font-bricolage">@Lang.v2_otp_instruction</p>
+        
+                    <!-- 6-Slots OTP Grid (Large Gray Blocks) -->
+                    <div class="flex items-center justify-center gap-2 w-full mt-1 px-2" id="otpInputs">
+                        @for (int i = 1; i <= 6; i++)
+                        {
+                            <input type="tel" maxlength="1" id="otp@(i)" 
+                                   oninput="moveToNext(this, '@(i < 6 ? "otp" + (i + 1) : "")')" 
+                                   class="w-[42px] h-[48px] bg-[#757575] rounded-[10px] text-white text-[26px] font-bold text-center appearance-none focus:bg-[#555] focus:scale-[1.03] focus:ring-2 focus:ring-[#EE0033]/50 transition-all outline-none shadow-inner otp-slot"
+                                   placeholder="-">
+                        }
+                    </div>
+                    <div id="walletPinContainer" class="hidden w-full mt-1 px-2">
+                        <div class="relative">
+                            <i class="fa-solid fa-lock absolute left-4 top-1/2 -translate-y-1/2 text-[#0A9800]"></i>
+                            <input id="walletPinInput" type="password" inputmode="numeric" autocomplete="off"
+                                   oninput="this.value = this.value.replace(/[^0-9]/g, ''); updateWalletPinState()"
+                                   class="h-[52px] w-full rounded-[14px] border-2 border-gray-200 bg-gray-50 pl-11 pr-12 text-center text-[22px] font-black tracking-[0.3em] text-gray-800 outline-none transition focus:border-[#0A9800] focus:bg-white focus:ring-4 focus:ring-green-100"
+                                   placeholder="••••">
+                            <button type="button" onclick="toggleWalletPinVisibility()" class="absolute right-4 top-1/2 -translate-y-1/2 text-gray-400 active:scale-90" aria-label="Show PIN">
+                                <i id="walletPinEye" class="fa-solid fa-eye"></i>
+                            </button>
+                        </div>
+                    </div>
+        
+                    <!-- OTP Error Message -->
+                    <p id="otpError" class="text-[#EE0033] font-bold text-[14px] text-center mb-1 hidden animate__animated animate__shakeX"></p>
+
+                    <!-- Timer & Resend -->
+                    <div class="flex flex-col items-center gap-1 mt-0">
+                        <span id="otpTimer" class="text-[15px] font-black text-[#EE0033] font-bricolage">60s</span>
+                        <button id="resendOtpBtn" onclick="sendOtpRequest()" class="hidden text-[14px] font-black text-[#0A9800] underline decoration-solid underline-offset-[3px] transition-all hover:text-[#087a00] disabled:opacity-40 disabled:no-underline font-bricolage">@Lang.v2_request_new_otp</button>
+                    </div>
+        
+                    <!-- Action Buttons: Cancel / Confirm -->
+                    <div class="grid grid-cols-2 gap-3 w-full mt-2">
+                        <button onclick="hideOtpModal()" class="bg-[#FF0000] text-white py-[12px] rounded-[16px] font-[900] text-[17px] shadow-[0_8px_15px_rgba(255,0,0,0.2)] active:scale-95 transition-all tracking-wide">@Lang.v2_cancel</button>
+                        <button id="otpConfirmBtn" disabled onclick="finalizePurchase(this)" class="bg-[#0A9800] text-white py-[12px] rounded-[16px] font-[900] text-[17px] shadow-[0_8px_15px_rgba(10,152,0,0.2)] active:scale-95 transition-all tracking-wide disabled:opacity-50 disabled:grayscale disabled:cursor-not-allowed">@Lang.v2_confirm</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+@section Scripts {
+    <script>
+
+        const maxBalls = @(Model.termType == Constants.PIC10_BASIC_CODE ? 10 : (Model.termType == Constants.PIC10_BIGSMALL_CODE ? 13 : 15));
+
+        function reindexTickets() {
+            $(".ticket-card").each(function(index) {
+                $(this).find(".ticket-index").text(index + 1);
+            });
+        }
+
+        function removeEntry(btn) {
+            var card = $(btn).closest('.ticket-card');
+            card.addClass('animate__animated animate__fadeOutRight animate__faster');
+            setTimeout(function() {
+                card.remove();
+                reindexTickets();
+                updateTotalPrice();
+            }, 300);
+        }
+
+        function randomizeTicket(btn) {
+            var icon = $(btn).find('i');
+            icon.addClass('fa-spin');
+            
+            var card = $(btn).closest('.ticket-card');
+            var balls = card.find('.ball-circle');
+            
+            // Generate unique random numbers 1-80
+            var numbers = [];
+            while(numbers.length < maxBalls){
+                var r = Math.floor(Math.random() * 80) + 1;
+                if(numbers.indexOf(r) === -1) numbers.push(r);
+            }
+            numbers.sort((a, b) => a - b);
+            
+            // Update balls with staggered animation
+            balls.each(function(index) {
+                var ball = $(this);
+                setTimeout(function() {
+                    var formattedNum = numbers[index].toString().padStart(2, '0');
+                    ball.removeClass('ball-empty').addClass('ball-filled').text(formattedNum);
+                    ball.addClass('animate__animated animate__flipInY');
+                    
+                    if(index === maxBalls - 1) {
+                        setTimeout(() => {
+                            icon.removeClass('fa-spin');
+                            // Replace button with Edit/Delete group
+                            $(btn).hide();
+                            card.find('.edit-delete-group').removeClass('hidden').addClass('animate__animated animate__fadeInRight animate__faster');
+                            updateTotalPrice();
+                        }, 300);
+                    }
+                }, index * 40);
+            });
+        }
+
+        function clearTicket(btn) {
+            var card = $(btn).closest('.ticket-card');
+            var balls = card.find('.ball-circle');
+            
+            balls.removeClass('ball-filled animate__animated animate__flipInY shadow-inner').addClass('ball-empty').text('');
+            
+            // Hide Edit/Delete group and show Rand button
+            card.find('.edit-delete-group').addClass('hidden');
+            card.find('.rand-btn').show().addClass('animate__animated animate__fadeInLeft animate__faster');
+            
+            updateTotalPrice();
+        }
+
+        // Open Number Picker Modal
+        var activeBall = null;
+        var activeTicketCard = null;
+        var selectedNumbers = []; // For Edit mode, this will be an array of fixed size with nulls
+        var isMultiMode = false;
+
+        function editFullTicket(btn) {
+            isMultiMode = true;
+            activeTicketCard = $(btn).closest('.ticket-card');
+            activeBall = null;
+            
+            // Initialize fixed slots for slot-based editing
+            selectedNumbers = new Array(maxBalls).fill(null);
+            let existing = [];
+            activeTicketCard.find('.ball-filled').each(function() {
+                var num = $(this).text().trim();
+                if(num) existing.push(num);
+            });
+            
+            // Initial fill from left to right
+            existing.forEach((num, idx) => {
+                if(idx < maxBalls) selectedNumbers[idx] = num;
+            });
+
+            openNumberPicker(true);
+        }
+
+        function openNumberPicker(isMulti) {
+            var modal = $("#numberPickerModal");
+            var grid = $("#numberGrid");
+            var title = $("#modalTitle");
+            var countArea = $(".selection-count-area");
+            var confirmBtn = $("#confirmBtn");
+            
+            grid.empty();
+            if (isMulti) {
+                title.text("Edit Ticket");
+                countArea.removeClass('hidden');
+                confirmBtn.removeClass('hidden').text("@Lang.confirm");
+            } else {
+                title.text("Pick Number");
+                countArea.addClass('hidden');
+                confirmBtn.removeClass('hidden').text("@Lang.confirm");
+                // Single mode logic is handled by setting selectedNumbers previously or here
+            }
+            
+            updateSelectionCount(); 
+            liveUpdateTicket();
+
+            // Focus card
+            if (activeTicketCard && activeTicketCard.length) {
+                var container = $("#ticketContainer");
+                var scrollPos = activeTicketCard.offset().top - container.offset().top + container.scrollTop();
+                container.stop().animate({ scrollTop: scrollPos - 15 }, 500);
+            }
+
+            // Populate Grid
+            for (var i = 1; i <= 80; i++) {
+                var formatted = i.toString().padStart(2, '0');
+                var isSelected = selectedNumbers.includes(formatted);
+                
+                var btnClass = isSelected 
+                    ? 'bg-[#EE0033] text-white shadow-md scale-105 active-num' 
+                    : 'bg-white text-gray-700 hover:bg-gray-100 border border-gray-100';
+                
+                grid.append(`<button type="button" class="num-btn w-8 h-8 rounded-full font-black text-[11px] transition-all focus:outline-none flex items-center justify-center ${btnClass}">${formatted}</button>`);
+            }
+
+            // Cleanup old listeners and add new one to the grid (event delegation)
+            grid.off('click', '.num-btn').on('click', '.num-btn', function(e) {
+                e.preventDefault();
+                var $btn = $(this);
+                var picked = $btn.text().trim();
+                
+                if (isMultiMode) {
+                    if (selectedNumbers.includes(picked)) {
+                        // Remove
+                        let idx = selectedNumbers.indexOf(picked);
+                        if (idx !== -1) selectedNumbers[idx] = null;
+                        $btn.removeClass('bg-[#EE0033] text-white shadow-md scale-105 active-num').addClass('bg-white text-gray-700 border border-gray-100');
+                    } else {
+                        // Add
+                        let firstEmpty = selectedNumbers.indexOf(null);
+                        if (firstEmpty !== -1) {
+                            selectedNumbers[firstEmpty] = picked;
+                            $btn.addClass('bg-[#EE0033] text-white shadow-md scale-105 active-num').removeClass('bg-white text-gray-700 border border-gray-100');
+                        }
+                    }
+                    liveUpdateTicket();
+                } else {
+                    // Single Select mode
+                    var exists = false;
+                    if (activeTicketCard) {
+                        activeTicketCard.find('.ball-filled').each(function() {
+                            if (activeBall && this !== activeBall[0] && $(this).text().trim() === picked) {
+                                exists = true;
+                            }
+                        });
+                    }
+                    if (exists) {
+                        if (typeof showNotification === "function") {
+                            showNotification("Number already selected", "warning");
+                        }
+                        return;
+                    }
+                    grid.find('.num-btn').removeClass('bg-[#EE0033] text-white shadow-md scale-105 active-num').addClass('bg-white text-gray-700 border border-gray-100');
+                    selectedNumbers = [picked];
+                    $btn.addClass('bg-[#EE0033] text-white shadow-md scale-105 active-num').removeClass('bg-white text-gray-700 border border-gray-100');
+                }
+                updateSelectionCount();
+            });
+
+            modal.removeClass('hidden').addClass('flex');
+            modal.find('.modal-content').removeClass('animate__zoomOut').addClass('animate__zoomIn');
+        }
+
+        function updateSelectionCount() {
+            var count = selectedNumbers.filter(n => n !== null && n !== "").length;
+            $("#selectionCount").text(count);
+            $("#maxSelectionCount").text(maxBalls);
+            var isValid = isMultiMode ? (count === maxBalls) : (count === 1);
+            if (isValid) {
+                $("#confirmBtn").prop('disabled', false).removeClass('opacity-50 cursor-not-allowed').addClass('cursor-pointer');
+            } else {
+                $("#confirmBtn").prop('disabled', true).addClass('opacity-50 cursor-not-allowed').removeClass('cursor-pointer');
+            }
+        }
+
+        function liveUpdateTicket() {
+            if (!activeTicketCard) return;
+            var balls = activeTicketCard.find('.ball-circle');
+            
+            if (isMultiMode) {
+                // Update Ticket Card balls
+                for(var i=0; i < maxBalls; i++){
+                    var val = selectedNumbers[i];
+                    if (i < balls.length) {
+                        var tBall = $(balls[i]);
+                        if (val) {
+                            tBall.removeClass('ball-empty').addClass('ball-filled').text(val);
+                        } else {
+                            tBall.removeClass('ball-filled').addClass('ball-empty').text('');
+                        }
+                    }
+                }
+                
+                // Toggle Rand/Edit button visibility
+                if (selectedNumbers.filter(n => n !== null && n !== "").length > 0) {
+                     activeTicketCard.find('.rand-btn').hide();
+                     activeTicketCard.find('.edit-delete-group').removeClass('hidden').show();
+                } else {
+                     activeTicketCard.find('.rand-btn').show();
+                     activeTicketCard.find('.edit-delete-group').addClass('hidden');
+                }
+                
+                updateTotalPrice();
+            }
+        }
+
+        // All immediate jQuery event bindings must wait for DOM + jQuery to be ready
+        document.addEventListener("DOMContentLoaded", function() {
+            // Click on a ball (filled or empty) to pick numbers
+            $(document).on('click', '.ball-filled, .ball-empty', function() {
+                isMultiMode = false;
+                activeBall = $(this);
+                activeTicketCard = activeBall.closest('.ticket-card');
+                
+                var val = activeBall.text().trim();
+                selectedNumbers = val ? [val] : [];
+                
+                openNumberPicker(false);
+            });
+
+            updateTotalPrice();
+
+            // Confirm button handler
+            $(document).off('click', '#confirmBtn').on('click', '#confirmBtn', function(e) {
+                e.preventDefault();
+                // Check non-null count
+                var count = selectedNumbers.filter(n => n !== null && n !== "").length;
+                if (count === 0) return;
+
+                if (isMultiMode && activeTicketCard && activeTicketCard.length > 0) {
+                    // Collect and sort for final storage/display (lottery numbers are usually sorted)
+                    var finalSorted = selectedNumbers.filter(n => n !== null && n !== "").sort((a, b) => parseInt(a) - parseInt(b));
+                    
+                    var balls = activeTicketCard.find('.ball-circle');
+                    balls.removeClass('ball-filled').addClass('ball-empty').text('');
+
+                    finalSorted.forEach((num, index) => {
+                        if (index < balls.length) {
+                            $(balls[index]).removeClass('ball-empty').addClass('ball-filled').text(num);
+                            $(balls[index]).addClass('animate__animated animate__pulse');
+                            setTimeout(() => $(balls[index]).removeClass('animate__animated animate__pulse'), 500);
+                        }
+                    });
+
+                    activeTicketCard.find('.rand-btn').hide();
+                    activeTicketCard.find('.edit-delete-group').removeClass('hidden').show();
+                    
+                    updateTotalPrice();
+                } else if (!isMultiMode && activeBall && activeBall.length > 0) {
+                    // Single mode: Update only the active ball
+                    activeBall.text(selectedNumbers[0]).removeClass('ball-empty').addClass('ball-filled');
+                    activeBall.addClass('animate__animated animate__pulse');
+                    setTimeout(() => activeBall.removeClass('animate__animated animate__pulse'), 500);
+                    
+                    var card = activeBall.closest('.ticket-card');
+                    var filledBalls = card.find('.ball-filled').length;
+                    if (filledBalls > 0) {
+                        card.find('.rand-btn').hide();
+                        card.find('.edit-delete-group').removeClass('hidden').show();
+                    } else {
+                        card.find('.rand-btn').show();
+                        card.find('.edit-delete-group').addClass('hidden');
+                    }
+                    
+                    updateTotalPrice();
+                }
+
+                closeNumberPicker();
+            });
+        });
+
+        function closeNumberPicker() {
+            var modal = $("#numberPickerModal");
+            modal.find('.modal-content').removeClass('animate__zoomIn').addClass('animate__zoomOut');
+            setTimeout(() => {
+                modal.removeClass('flex').addClass('hidden');
+                // Reset state
+                activeBall = null;
+                activeTicketCard = null;
+            }, 200);
+        }
+
+        function updateTotalPrice() {
+            var filledTickets = 0;
+            $(".ticket-card").each(function() {
+                if ($(this).find(".ball-filled").length === maxBalls) {
+                    filledTickets++;
+                }
+            });
+            const pricePerTicket = @(Model.termType == Constants.PIC10_BASIC_CODE ? "10" : "50");
+            $("#totalPrice").text(formatMoneyV2(filledTickets * pricePerTicket));
+            $("#totalTicketCount").text(filledTickets);
+        }
+
+        function addNewTicket() {
+            var container = $("#ticketContainer");
+            var wrapper = $("#addButtonWrapper");
+            var currentIndex = $(".ticket-card").length + 1;
+            
+            var ballsHtml = '';
+            for (var i = 0; i < maxBalls; i++) {
+                ballsHtml += '<div class="ball-circle ball-empty"></div>';
+            }
+
+            var ticketHtml = `
+                <div class="ticket-card relative group active:bg-gray-50 transition-colors cursor-pointer animate__animated animate__fadeInUp animate__faster">
+                    <button onclick="removeEntry(this)" class="absolute -right-2 top-1 w-7 h-7 bg-[#EE0033] text-white rounded-full flex items-center justify-center text-[11px] shadow-sm z-[10] hover:bg-red-600 transition-all border-2 border-white">
+                        <i class="fa-solid fa-xmark"></i>
+                    </button>
+                    <div class="absolute left-2 top-4 w-9 h-9 rounded-full border-[3px] border-white flex items-center justify-center text-white font-black text-sm shadow-md ticket-index">${currentIndex}</div>
+                    <div class="flex flex-col gap-1 pl-8">
+                        <span class="text-[16px] font-extrabold text-[#333]">@Lang.v2_select_10_lucky_numbers</span>
+                        <div class="flex items-start gap-4">
+                            <div class="grid grid-cols-5 gap-y-1 gap-x-2 flex-1">
+                                ${ballsHtml}
+                            </div>
+                            <div class="w-20 action-area flex flex-col gap-2">
+                                 <button onclick="randomizeTicket(this)" class="rand-btn bg-[#0A9800] text-white flex items-center justify-center gap-2 w-20 py-2 rounded-xl font-extrabold text-[11px] shadow-sm active:scale-95 transition-all">
+                                     <i class="fa-solid fa-arrows-rotate text-[10px]"></i> @Lang.Random
+                                 </button>
+                                 <div class="edit-delete-group hidden flex flex-col gap-2">
+                                     <button onclick="editFullTicket(this)" class="bg-[#2B83F2] text-white flex items-center justify-center gap-2 w-20 py-1.5 rounded-lg font-bold text-[12px] shadow-sm active:scale-95 transition-all">
+                                         <i class="fa-solid fa-pen text-[10px]"></i> @Lang.v2_edit
+                                     </button>
+                                     <button onclick="clearTicket(this)" class="bg-[#EE0033] text-white flex items-center justify-center gap-2 w-20 py-1.5 rounded-lg font-bold text-[12px] shadow-sm active:scale-95 transition-all">
+                                         <i class="fa-solid fa-trash-can text-[10px]"></i> @Lang.v2_delete
+                                     </button>
+                                 </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            `;
+            
+            $(ticketHtml).insertBefore(wrapper);
+            container.animate({ scrollTop: container.prop("scrollHeight") }, 300);
+        }
+
+        // --- Order Summary Modal Logic ---
+        // --- Payment Preparation & Order Summary Logic ---
+        let pendingTickets = [];
+        let currentChannelPayment = '@Constants.BASIC_WALLET_TICKET';
+
+        function preparePayment(event) {
+            const isBSMode = @(Model.termType == Constants.PIC10_BIGSMALL_CODE || Model.termType == Constants.PIC10_ODDEVEN_CODE ? "true" : "false");
+            const tickets = [];
+
+            if (isBSMode) {
+                if (!bsChoice) {
+                    showNotification("Please select a choice first.", "warning");
+                    return;
+                }
+                
+                let bsCode = "";
+                if ('@Model.termType' === '@Constants.PIC10_BIGSMALL_CODE') {
+                    bsCode = (bsChoice === 'big') ? "B" : "S";
+                } else {
+                    bsCode = (bsChoice === 'big') ? "O" : "E"; // Odd = O, Even = E
+                }
+
+                tickets.push({
+                    code: bsCode,
+                    money: "50"
+                });
+            } else {
+                $(".ticket-card").each(function() {
+                    const balls = $(this).find(".ball-filled");
+                    if (balls.length === maxBalls) {
+                        const selectedNumbers = [];
+                        balls.each(function() { selectedNumbers.push($(this).text().trim()); });
+                        const itemPrice = "@(Model.termType == Constants.PIC10_BASIC_CODE ? "10" : "50")";
+                        tickets.push({
+                            code: selectedNumbers.join(','),
+                            money: itemPrice
+                        });
+                    }
+                });
+
+                if (tickets.length === 0) {
+                    showNotification("@Lang.v2_ticket_not_valid", "warning");
+                    return;
+                }
+            }
+
+            pendingTickets = tickets;
+            $("#paymentChannelModal").removeClass("hidden").addClass("flex");
+        }
+
+        function hidePaymentChannelModal() {
+            $("#paymentChannelModal").removeClass("flex").addClass("hidden");
+        }
+
+        function selectPaymentChannel(channelPayment) {
+            currentChannelPayment = channelPayment;
+            hidePaymentChannelModal();
+
+            const requestData = {
+                gameId: "@Model.termType",
+                ticket: pendingTickets,
+                channelPayment: channelPayment
+            };
+
+            $.ajax({
+                url: subDomain + '@Url.Action("ConfirmTicketData", "Home")',
+                type: 'POST',
+                contentType: 'application/json',
+                data: JSON.stringify(requestData),
+                success: function(data) {
+
+                    if (data.responseCode === "0" || data.responseCode === "0000") {
+                        showOrderSummary(data, pendingTickets);
+                    } else {
+                        showNotification(data.responseMessage || "Confirmation failed", data.responseCode);
+                    }
+                },
+                error: function(err) {
+
+                    showNotification("Network error occurred.", "warning");
+                }
+            });
+        }
+
+        let currentTransId = null;
+
+        function showOrderSummary(apiData, localTickets) {
+            currentTransId = apiData.transId;
+            const summaryModal = $("#orderSummaryModal");
+            const summaryList = $("#summaryTicketList");
+            summaryList.empty();
+
+            const displayTickets = (apiData && apiData.ticket) ? apiData.ticket : (localTickets || []);
+            if (!displayTickets || !Array.isArray(displayTickets)) {
+                console.warn("No tickets found to display in summary.");
+                return;
+            }
+
+            displayTickets.forEach((t, index) => {
+                const numbers = t.code.split(',');
+                let contentHtml = '';
+                
+                if (numbers.length > 1) {
+                    let numbersBalls = '';
+                    numbers.forEach(n => {
+                        numbersBalls += `<div class="w-7 h-7 rounded-full flex items-center justify-center text-white text-[11px] font-black shadow-[0_4px_10px_rgba(186,15,33,0.3)]" style="background: linear-gradient(135deg, #FF3D63 0%, #E3132D 60%, #BA0F21 100%); border: 1px solid rgba(255, 255, 255, 0.3); text-shadow: 0px 1px 2px rgba(0,0,0,0.1); transition: transform 0.2s;">${n.trim()}</div>`;
+                    });
+                    contentHtml = `<div class="grid grid-cols-5 gap-y-2 relative z-10 px-2 justify-items-center">${numbersBalls}</div>`;
+                } else {
+                    const isBS = @(Model.termType == Constants.PIC10_BIGSMALL_CODE ? "true" : "false");
+                    const isFirstChoice = (numbers[0] === 'B' || numbers[0] === 'O');
+                    const label = isFirstChoice ? (isBS ? "Big" : "Odd") : (isBS ? "Small" : "Even");
+                    const color = isFirstChoice ? (isBS ? "#A2FF00" : "#FFC700") : (isBS ? "#FF4157" : "#B33BD0");
+                    contentHtml = `<div class="w-full flex justify-center"><span class="text-[28px] font-black italic uppercase" style="-webkit-text-stroke: 1px #000; color: ${color};">${label}</span></div>`;
+                }
+
+                const itemHtml = `
+                    <div class="flex items-center gap-3">
+                        <div class="flex-1 rounded-2xl p-3 relative overflow-hidden flex flex-col gap-2 min-h-[80px] justify-center shadow-sm" 
+                             style="background: white; border: 1.5px solid #EE0033;">
+                            ${contentHtml}
+                        </div>
+                        <div class="w-24 shrink-0 bg-white border border-gray-200 rounded-2xl p-2.5 flex items-center justify-center shadow-sm">
+                            <div class="flex items-baseline gap-0.5">
+                                <span class="text-[20px] font-black text-black">${formatMoneyV2(t.money)}</span>
+                                <span class="text-[12px] font-black text-[#EE0033]">HTG</span>
+                            </div>
+                        </div>
+                    </div>
+                `;
+                summaryList.append(itemHtml);
+            });
+
+            $("#summaryTotalCount").text(displayTickets.length);
+            const totalMoney = apiData.totalMoneyPayment || apiData.totalMoney || "0";
+            $("#summaryTotalAmount").text(formatMoneyV2(totalMoney));
+
+            summaryModal.removeClass("hidden").addClass("flex");
+        }
+
+        function hideOrderSummary() {
+            $("#orderSummaryModal").removeClass("flex").addClass("hidden");
+        }
+
+        function confirmCheckout(btn) {
+            if (currentChannelPayment === '@Constants.NATCASH_WALLET_TICKET') {
+                showOtpModal(true);
+                return;
+            }
+
+            const originalText = $(btn).html();
+            $(btn).prop('disabled', true).html('<i class="fa-solid fa-spinner fa-spin mr-2"></i>Processing...');
+
+            // Trigger SendOTP API
+            $.ajax({
+                url: subDomain + '@Url.Action("SendOTP", "Home")',
+                type: 'POST',
+                success: function(data) {
+                    $(btn).prop('disabled', false).html(originalText);
+                    
+                    if (data.responseCode === "0") {
+                        showOtpModal(false);
+                    } else {
+                        showNotification(data.responseMessage || "Failed to send OTP", data.responseCode);
+                    }
+                },
+                error: function() {
+                    $(btn).prop('disabled', false).html(originalText);
+                    showNotification("Network error occurred.", "warning");
+                }
+            });
+        }
+
+        let otpInterval;
+        function showOtpModal(isWalletPin) {
+            hideOrderSummary();
+            $("#otpModal").removeClass("hidden").addClass("flex");
+            $("#otpInputs input").val("");
+            $("#walletPinInput").val("").attr("type", "password");
+            $("#walletPinEye").attr("class", "fa-solid fa-eye");
+            $("#otpConfirmBtn").prop('disabled', true);
+            $("#otpError").addClass("hidden").text("");
+            
+            // Map game type to readable name & image
+            let gameTypeStr = "@Model.termType";
+            let displayName = "Basic Pick 10";
+            let imgSrc = "";
+            
+            if (gameTypeStr === "@Constants.PIC10_BIGSMALL_CODE") {
+                // Get the specific choice from summary
+                let firstTicketText = $("#summaryTicketList").find("span.font-black").first().text().trim();
+                if (firstTicketText) {
+                    displayName = firstTicketText.charAt(0).toUpperCase() + firstTicketText.slice(1).toLowerCase(); // Normalize to "Big" or "Small"
+                } else {
+                    displayName = "Big / Small";
+                }
+            } else if (gameTypeStr === "@Constants.PIC10_ODDEVEN_CODE") {
+                let firstTicketText = $("#summaryTicketList").find("span.font-black").first().text().trim();
+                if (firstTicketText) {
+                    displayName = firstTicketText.charAt(0).toUpperCase() + firstTicketText.slice(1).toLowerCase(); // Normalize to "Odd" or "Even"
+                } else {
+                    displayName = "Odd / Even";
+                }
+            }
+            
+            // Determine color based on game type
+            let typeColorClass = "text-purple-700"; // default
+            if (gameTypeStr === "@Constants.PIC10_BASIC_CODE") typeColorClass = "text-[#EE0033]";
+            else if (gameTypeStr === "@Constants.PIC10_BIGSMALL_CODE") typeColorClass = "text-[#0A9800]";
+            else if (gameTypeStr === "@Constants.PIC10_ODDEVEN_CODE") typeColorClass = "text-[#9333ea]";
+
+            // Hide image for now and use the beautiful text style as requested
+            $("#otpTicketTypeImg").hide();
+            $("#otpTicketTypeContainer").find("span").remove();
+            $("#otpTicketTypeContainer").append(`<span class='text-[17px] font-[900] ${typeColorClass} italic'>${displayName}</span>`);
+            
+            $("#otpTotalAmount").text($("#summaryTotalAmount").text());
+            if (isWalletPin) {
+                $("#paymentCodeInstruction").text('@Html.Raw(Lang.payment_wallet_pin_instruction.Replace("'", "\\'"))');
+                $("#otpInputs").addClass("hidden");
+                $("#walletPinContainer").removeClass("hidden");
+                $("#otpTimer, #resendOtpBtn").addClass("hidden");
+                clearInterval(otpInterval);
+                $("#walletPinInput").focus();
+            } else {
+                $("#paymentCodeInstruction").text('@Html.Raw(Lang.v2_otp_instruction.Replace("'", "\\'"))');
+                $("#walletPinContainer").addClass("hidden");
+                $("#otpInputs").removeClass("hidden");
+                startOtpTimer(60);
+                $("#otp1").focus();
+            }
+        }
+
+        function updateWalletPinState() {
+            $("#otpConfirmBtn").prop('disabled', $("#walletPinInput").val().length === 0);
+            $("#otpError").addClass("hidden").text("");
+        }
+
+        function toggleWalletPinVisibility() {
+            const input = $("#walletPinInput");
+            const showPin = input.attr("type") === "password";
+            input.attr("type", showPin ? "text" : "password");
+            $("#walletPinEye").attr("class", showPin ? "fa-solid fa-eye-slash" : "fa-solid fa-eye");
+            input.focus();
+        }
+
+        // Add backspace support for OTP inputs
+        $("#otpInputs input").on("keyup", function() {
+            let otp = "";
+            $("#otpInputs input").each(function() { otp += $(this).val(); });
+            $("#otpConfirmBtn").prop('disabled', otp.length < 6);
+        });
+
+        $("#otpInputs input").on("keydown", function(e) {
+            if (e.key === "Backspace" && this.value.length === 0) {
+                $(this).prev('input').focus();
+            }
+        });
+
+        function hideOtpModal() {
+            $("#otpModal").removeClass("flex").addClass("hidden");
+            clearInterval(otpInterval);
+        }
+
+        function startOtpTimer(seconds) {
+            let timeLeft = seconds;
+            $("#resendOtpBtn").addClass("hidden");
+            $("#otpTimer").removeClass("hidden").text(timeLeft + "s");
+            clearInterval(otpInterval);
+            
+            otpInterval = setInterval(() => {
+                timeLeft--;
+                $("#otpTimer").text(timeLeft + "s");
+                if (timeLeft <= 0) {
+                    clearInterval(otpInterval);
+                    $("#otpTimer").addClass("hidden");
+                    $("#resendOtpBtn").removeClass("hidden");
+                }
+            }, 1000);
+        }
+
+        function moveToNext(el, nextId) {
+            if (el.value.length >= 1) {
+                if (nextId) document.getElementById(nextId).focus();
+            }
+            
+            let otp = "";
+            $("#otpInputs input").each(function() { otp += $(this).val(); });
+            $("#otpConfirmBtn").prop('disabled', otp.length < 6);
+
+            // Clear error when typing
+            $("#otpError").addClass("hidden").text("");
+        }
+
+        function sendOtpRequest() {
+            // Re-trigger SendOTP
+            $.ajax({
+                url: subDomain + '@Url.Action("SendOTP", "Home")',
+                type: 'POST',
+                success: function(data) {
+                    if (data.responseCode === "0") {
+                        startOtpTimer(60);
+                        showNotification("OTP has been resent.", "success");
+                    } else {
+                        showNotification(data.responseMessage || "Failed to resend OTP", data.responseCode);
+                    }
+                }
+            });
+        }
+
+        function showReceiptSuccess(transId, amount, phone, totalTickets, drawDate) {
+            // Setup data dynamically
+            $("#receiptAmount").text(formatMoneyV2(amount) + " HTG");
+            if(phone) $("#receiptPhone").text(phone);
+            if(totalTickets) $("#receiptTotalTickets").text(totalTickets);
+            if(drawDate) $("#receiptDrawDate").text(drawDate);
+            
+            let gameTypeStr = "@Model.termType";
+            let displayName = "Basic Pick 10";
+            if (gameTypeStr === "@Constants.PIC10_BIGSMALL_CODE") displayName = "@Lang.v2_big_small";
+            else if (gameTypeStr === "@Constants.PIC10_ODDEVEN_CODE") displayName = "@Lang.v2_odd_even";
+            
+            $("#receiptGameType").text("@Lang.buy " + displayName);
+            $("#receiptTicketCode").text("#" + transId);
+            
+            let choiceText = "-";
+            if (gameTypeStr === "@Constants.PIC10_BIGSMALL_CODE" || gameTypeStr === "@Constants.PIC10_ODDEVEN_CODE") {
+                choiceText = $("#summaryTicketList .flex.items-center span.font-black").first().text().trim();
+            } else {
+                choiceText = "PICK 10";
+            }
+            $("#receiptChoice").text(choiceText);
+            
+            // Format current date "dd/MM/yyyy - HH:mm:ss"
+            let now = new Date();
+            let ds = now.getDate().toString().padStart(2, '0') + '/' + (now.getMonth() + 1).toString().padStart(2, '0') + '/' + now.getFullYear() + ' - ' + now.getHours().toString().padStart(2, '0') + ':' + now.getMinutes().toString().padStart(2, '0') + ':' + now.getSeconds().toString().padStart(2, '0');
+            $("#receiptTime").text(ds);
+
+            hideOtpModal();
+            $("#receiptSuccessModal").removeClass("hidden").addClass("flex");
+        }
+
+        function finalizePurchase(btn) {
+            const isWalletPayment = currentChannelPayment === '@Constants.NATCASH_WALLET_TICKET';
+            let otpCode = isWalletPayment ? $("#walletPinInput").val().trim() : "";
+            if (!isWalletPayment) {
+                $("#otpInputs input").each(function() { otpCode += $(this).val(); });
+            }
+            
+            if ((isWalletPayment && otpCode.length === 0) || (!isWalletPayment && otpCode.length < 6)) {
+                showNotification(isWalletPayment ? '@Html.Raw(Lang.payment_wallet_pin_instruction.Replace("'", "\\'"))' : "Please enter full 6-digit OTP", "warning");
+                return;
+            }
+
+            const originalText = $(btn).html();
+            $(btn).prop('disabled', true).html('<i class="fa-solid fa-spinner fa-spin mr-2"></i> ...');
+
+            const finalData = {
+                transIdByTicket: currentTransId,
+                paymentCode: currentChannelPayment === '@Constants.NATCASH_WALLET_TICKET' ? null : otpCode,
+                walletPin: currentChannelPayment === '@Constants.NATCASH_WALLET_TICKET' ? otpCode : null,
+                channelPayment: currentChannelPayment
+            };
+
+            // Call the unified backend action that verifies OTP and then buys the ticket
+            $.ajax({
+                url: subDomain + '@Url.Action("ConfirmBuyingTicketV2", "Home")',
+                type: 'POST',
+                contentType: 'application/json',
+                data: JSON.stringify(finalData),
+                success: function(res) {
+                    $(btn).prop('disabled', false).html(originalText);
+                    
+                    if (res.responseCode === "0" || res.responseCode === "0000") {
+                        // Success: Show receipt Modal
+                        showReceiptSuccess(res.orderId || currentTransId, $("#summaryTotalAmount").text(), "@(Model.userStatus?.msisdn ?? "-")", $("#summaryTotalCount").text(), "@(currentTerm?.date_random ?? "-")");
+                    } else {
+                        if (res.responseCode === "-2" || (res.responseMessage && res.responseMessage.includes("System is upgrading"))) {
+                             hideOtpModal();
+                             showNotification(res.responseMessage || "System is upgrading", res.responseCode);
+                        } else {
+                             $("#otpError").text(res.responseMessage || "Invalid OTP").removeClass("hidden");
+                             if (isWalletPayment) {
+                                 $("#walletPinInput").val("").focus();
+                             } else {
+                                 $("#otpInputs input").val("");
+                                 $("#otp1").focus();
+                             }
+                        }
+                    }
+                },
+                error: function() {
+                    $(btn).prop('disabled', false).html(originalText);
+                    showNotification("Network error occurred during payment completion.", "warning");
+                }
+            });
+        }
+
+        var systemUpgrading = false;
+        function showNotification(message, code) {
+            const msgEl = $("#notificationMessage");
+            const iconEl = $("#notificationModal img");
+            const btnEl = $("#notificationModal button");
+            
+            msgEl.text(message);
+            
+            if (code === "-2" || (message && message.includes("System is upgrading"))) {
+                systemUpgrading = true;
+                btnEl.text("@Lang.login");
+            } else {
+                systemUpgrading = false;
+                btnEl.text("OK");
+            }
+
+            // Toggle icon based on type (warning or success)
+            const warningIcon = '/LotteryV2/img/modal/warning_icon.png';
+            const successIcon = '/LotteryV2/img/modal/success_icon_v2.png';
+            const fallbackWarning = 'https://cdn-icons-png.flaticon.com/512/564/564619.png';
+            const fallbackSuccess = 'https://cdn-icons-png.flaticon.com/512/190/190411.png';
+
+            if (code === "-2" || code === "warning" || code === "error") {
+                iconEl.attr('src', warningIcon);
+                iconEl.attr('onerror', `this.src='${fallbackWarning}'`);
+            } else {
+                iconEl.attr('src', successIcon);
+                iconEl.attr('onerror', `this.src='${fallbackSuccess}'`);
+            }
+
+            $("#notificationModal").removeClass("hidden").addClass("flex");
+        }
+
+        function closeNotificationModal() {
+            $("#notificationModal").addClass("hidden").removeClass("flex");
+            if (systemUpgrading) {
+                window.location.href = subDomain + "/Account/Login";
+            }
+        }
+
+        // ==================== CARD SELECTION GAME LOGIC (BIG/SMALL / ODD/EVEN) ====================
+        var bsChoice = null; // 'big' or 'small' (reused as 'odd' or 'even')
+        const isBigSmall = @(Model.termType == Constants.PIC10_BIGSMALL_CODE ? "true" : "false");
+        const themeColor = isBigSmall ? "#0A9800" : "#AA3DC8";
+        const labelBig = isBigSmall ? "Big" : "Odd";
+        const labelSmall = isBigSmall ? "Small" : "Even";
+        const colorBig = isBigSmall ? "#A2FF00" : "#FFC700";
+        const colorSmall = isBigSmall ? "#FF4157" : "#B33BD0";
+
+        // Loclized text from resources
+        const langSelect = "@Lang.v2_select";
+        const langSelected = "@Lang.v2_selected";
+
+        function selectBigSmall(choice) {
+            bsChoice = choice;
+            var cardBig = document.getElementById('cardBig');
+            var cardSmall = document.getElementById('cardSmall');
+            var choiceDisplay = document.getElementById('choiceDisplay');
+
+            if (!cardBig || !cardSmall) return;
+
+            if (choice === 'big') {
+                // Highlight Big/Odd card with theme glow
+                cardBig.style.border = '2px solid ' + themeColor;
+                cardBig.style.boxShadow = '0px 0px 12px 0px ' + (isBigSmall ? 'rgba(162, 255, 0, 1)' : 'rgba(179, 59, 208, 0.6)');
+                cardBig.querySelector('.bigsmall-btn').textContent = langSelected;
+                cardBig.querySelector('.bigsmall-btn').style.background = '#333';
+
+                // Reset Small/Even card
+                cardSmall.style.border = '2px solid transparent';
+                cardSmall.style.boxShadow = 'none';
+                cardSmall.querySelector('.bigsmall-btn').textContent = langSelect;
+                cardSmall.querySelector('.bigsmall-btn').style.background = themeColor;
+
+                // Update display
+                if (choiceDisplay) {
+                    choiceDisplay.textContent = labelBig;
+                    choiceDisplay.style.color = colorBig;
+                    choiceDisplay.style.webkitTextStroke = '1px #000';
+                }
+            } else {
+                // Highlight Small/Even card with theme glow
+                cardSmall.style.border = '2px solid ' + themeColor;
+                cardSmall.style.boxShadow = '0px 0px 12px 0px ' + (isBigSmall ? 'rgba(162, 255, 0, 1)' : 'rgba(179, 59, 208, 0.6)');
+                cardSmall.querySelector('.bigsmall-btn').textContent = langSelected;
+                cardSmall.querySelector('.bigsmall-btn').style.background = '#333';
+
+                // Reset Big/Odd card
+                cardBig.style.border = '2px solid transparent';
+                cardBig.style.boxShadow = 'none';
+                cardBig.querySelector('.bigsmall-btn').textContent = langSelect;
+                cardBig.querySelector('.bigsmall-btn').style.background = themeColor;
+
+                // Update display
+                if (choiceDisplay) {
+                    choiceDisplay.textContent = labelSmall;
+                    choiceDisplay.style.color = colorSmall;
+                    choiceDisplay.style.webkitTextStroke = '1px #000';
+                }
+            }
+            $("#bsTotalTicketCount").text(1);
+            $("#bsTotalPrice").text(formatMoneyV2(50));
+        }
+
+        function bsShowPayment(e) {
+            preparePayment(e);
+        }
+    </script>
+
+    <!-- Number Picker Modal (Refined Bottom Sheet) -->
+    <div id="numberPickerModal" class="fixed inset-0 bg-black/10 z-[200] hidden items-end justify-center p-0 transition-all">
+        <div class="modal-content bg-white w-full md:max-w-[414px] mx-auto shadow-2xl animate__animated animate__slideInUp animate__faster rounded-t-[20px] overflow-hidden">
+            <div class="px-4 py-3 bg-[#EE0033] text-white flex justify-between items-center relative">
+                <div class="flex flex-col">
+                    <h3 class="font-black text-[15px] uppercase tracking-wide" id="modalTitle">@Lang.Pick_Number</h3>
+                    <div class="selection-count-area">
+                        <span class="text-[10px] font-bold text-white/80 uppercase">Selected: <span id="selectionCount" class="text-white">0</span>/<span id="maxSelectionCount">10</span></span>
+                    </div>
+                </div>
+                <button onclick="closeNumberPicker()" class="w-9 h-9 flex items-center justify-center rounded-full bg-white/10 hover:bg-white/20 transition-all">
+                    <i class="fa-solid fa-xmark text-lg"></i>
+                </button>
+            </div>
+            
+            <style>
+                #numberGrid::-webkit-scrollbar { width: 3px; }
+                #numberGrid::-webkit-scrollbar-track { background: transparent; }
+                #numberGrid::-webkit-scrollbar-thumb { background: #FFD700; border-radius: 10px; }
+                #numberGrid { scrollbar-width: thin; scrollbar-color: #FFD700 transparent; }
+            </style>
+            <div class="p-1 px-2 grid grid-cols-10 gap-1.5 h-[160px] overflow-y-auto bg-gray-50 border-b" id="numberGrid">
+                 <!-- 1-80 populated via JS -->
+            </div>
+            <div class="p-3 bg-white border-t flex gap-3">
+                 <button onclick="closeNumberPicker()" class="flex-1 py-1 bg-gray-100 text-gray-600 rounded-lg font-black text-[12px] active:bg-gray-200 transition-all uppercase">
+                     @Lang.v2_back
+                 </button>
+                 <button id="confirmBtn" class="hidden flex-[2] py-2 bg-[#EE0033] text-white rounded-lg font-black text-[13px] active:bg-[#CC002D] transition-all uppercase shadow-md">
+                     @Lang.confirm
+                 </button>
+            </div>
+        </div>
+    </div>
+    <div id="notificationModal" class="fixed inset-0 z-[300] bg-black/60 flex items-center justify-center hidden px-4 font-bricolage backdrop-blur-sm">
+        <div class="w-full max-w-[360px] bg-white rounded-[32px] overflow-hidden flex flex-col items-center px-6 pt-5 pb-6 animate__animated animate__zoomIn animate__faster shadow-2xl relative border border-white/50">
+            <!-- Alert Icon -->
+            <div class="w-full flex justify-center mb-2 mt-0">
+                <img src="/LotteryV2/img/modal/success_icon_v2.png" class="w-full max-w-[240px] h-auto object-contain" alt="Notificaton icon" onerror="this.src='https://cdn-icons-png.flaticon.com/512/190/190411.png'" />
+            </div>
+
+            <!-- Message Area -->
+            <div class="px-2 text-center mb-5">
+                <p id="notificationMessage" class="text-black font-[800] text-[17px] leading-snug">
+                    <!-- Message content -->
+                </p>
+            </div>
+
+            <!-- Action Button -->
+            <div class="w-full">
+                <button onclick="closeNotificationModal()" class="w-full bg-[#EE0033] text-white font-[900] text-[18px] py-[13px] rounded-[18px] shadow-[0_8px_20px_rgba(238,0,51,0.25)] active:scale-95 transition-all uppercase tracking-wide">
+                    OK
+                </button> 
+            </div>
+        </div>
+    </div>
+
+    <!-- Beautiful Success Receipt Modal (Matches Figma 161:3722) -->
+    <div id="receiptSuccessModal" class="fixed inset-0 z-[300] bg-black/80 hidden items-center justify-center px-4 font-bricolage backdrop-blur-md">
+        <div class="w-full max-w-[360px] bg-[#F9F9F9] rounded-[32px] overflow-hidden flex flex-col items-center px-6 pt-4 pb-5 shadow-2xl relative animate__animated animate__zoomIn animate__faster border border-white/50">
+            <!-- Confetti/Celebration background effect (Subtle removed) -->
+            
+            <h2 class="text-[#534A4A] font-[800] text-[19px] tracking-tight relative z-10 w-full text-center mt-1">@Lang.v2_payment_successfully</h2>
+            
+            <!-- Ticket / Success Graphic -->
+            <div class="relative w-full flex justify-center mt-2 mb-0 z-10 px-4">
+                <img src="/LotteryV2/img/modal/success_icon_v2.png" alt="Success" class="w-full h-auto object-contain">
+            </div>
+
+            <h3 class="text-[#0A9800] font-[900] text-[20px] uppercase tracking-wide relative z-10">@Lang.success</h3>
+
+            <div class="w-full h-px border-t-[2px] border-dashed border-gray-300 my-3 relative z-10"></div>
+            
+            <div class="w-full flex justify-between items-center mb-2 relative z-10 px-1">
+                <span class="text-[#534A4A] font-bold text-[14px]">@Lang.phone_number</span>
+                <span class="font-black text-[14px] text-gray-800" id="receiptPhone">-</span>
+            </div>
+            <div class="w-full flex justify-between items-center mb-2 relative z-10 px-1">
+                <span class="text-[#534A4A] font-bold text-[14px]">@Lang.v2_your_choice</span>
+                <span class="text-[#EE0033] font-[900] text-[15px] uppercase" id="receiptChoice">-</span>
+            </div>
+            
+            <div class="w-full flex justify-between items-center mb-2 relative z-10 px-1">
+                <span class="text-[#534A4A] font-bold text-[14px]">@Lang.ticket_code</span>
+                <span class="font-black text-[13px] text-gray-800" id="receiptTicketCode">#</span>
+            </div>
+            <div class="w-full flex justify-between items-center mb-2 relative z-10 px-1">
+                <span class="text-[#534A4A] font-bold text-[14px]">@Lang.total_ticket</span>
+                <span class="font-black text-[14px] text-gray-800" id="receiptTotalTickets">-</span>
+            </div>
+            <div class="w-full flex justify-between items-center mb-2 relative z-10 px-1">
+                <span class="text-[#534A4A] font-bold text-[14px]">@Lang.v2_draw_date</span>
+                <span class="font-black text-[14px] text-gray-800" id="receiptDrawDate">-</span>
+            </div>
+            <div class="w-full flex justify-between items-center mb-1 relative z-10 px-1">
+                <span class="text-[#534A4A] font-bold text-[14px]">@Lang.total_payment</span>
+                <span class="text-[#EE0033] font-[900] text-[15px]" id="receiptAmount">0 HTG</span>
+            </div>
+
+            <div class="w-full h-px border-t-[2px] border-dashed border-gray-300 my-3 relative z-10"></div>
+            
+            <div class="w-full flex justify-between items-center mb-2 relative z-10 px-1">
+                <span class="text-[#534A4A] font-bold text-[14px]">@Lang.time</span>
+                <span class="font-bold text-[13px] text-gray-600" id="receiptTime">00:00:00</span>
+            </div>
+            
+            <div class="w-full flex justify-start items-center relative z-10 px-1 mt-1">
+                <span class="text-[#534A4A] font-bold text-[13px] italic text-gray-500" id="receiptGameType">@Lang.v2_buy_ticket_label</span>
+            </div>
+            
+            <div class="text-[#534A4A] font-[900] text-[18px] relative z-10 text-center mt-3">@Lang.thank_you <span class="text-[#EE0033]">♥️</span></div>
+            
+            <!-- Action Button -->
+            <button onclick="location.href='@Url.Action("GameHome", "Home", new { termType = Model.termType })'" class="w-full bg-[#EE0033] text-white font-[900] text-[18px] py-[13px] rounded-[18px] shadow-[0_8px_20px_rgba(238,0,51,0.25)] active:scale-95 transition-all mt-4 relative z-10 uppercase tracking-wide">
+                @Lang.back_to_homepage
+            </button> 
+        </div>
+    </div>
+}

+ 131 - 0
website_natcash/Areas/LotteryV2/Views/Home/FAQ.cshtml

@@ -0,0 +1,131 @@
+@{
+    ViewData["Title"] = "LotteryV2 - FAQs";
+    ViewData["ActiveTab"] = "FAQ";
+    Layout = "~/Areas/LotteryV2/Views/Shared/_Layout.cshtml";
+}
+@using LotteryWebApp.Languages;
+
+<script src="https://cdn.tailwindcss.com"></script>
+<link rel="stylesheet" href="/LotteryV2/css/faq.css">
+
+<div class="main-container animate__animated animate__fadeIn bg-[#F5F5F5] min-h-screen relative flex flex-col pb-24 shadow-xl overflow-x-hidden">
+
+    <!-- Header Block (Red) - Fixed -->
+    <div class="fixed top-0 left-0 md:left-1/2 md:-translate-x-1/2 w-full md:max-w-[414px] bg-[#EE0033] h-[52px] flex items-center justify-between px-4 z-[100] shadow-sm">
+        <!-- Back Button -->
+        <button onclick="window.history.back()" class="w-10 h-10 flex items-center justify-center -ml-2 rounded-full active:bg-white/20 transition-colors z-10 text-white cursor-pointer">
+            <i class="fa-solid fa-arrow-left text-[20px]"></i>
+        </button>
+        <!-- Title -->
+        <div class="absolute inset-0 flex items-center justify-center pointer-events-none">
+            <span class="text-white text-[24px] font-bold tracking-wide drop-shadow-sm">@Lang.faq</span>
+        </div>
+    </div>
+
+    <!-- Header Spacer (~52px) -->
+    <div class="h-[52px]"></div>
+
+
+
+    <!-- Banner Graphic directly integrated with Grey background -->
+    <div class="w-full relative flex justify-center mt-3 mb-1">
+         <img src="/LotteryV2/img/faq_banner_full.png" alt="FAQ Graphic" class="w-full max-h-48 object-contain z-10 px-4 pointer-events-none">
+    </div>
+
+    <!-- Messages / FAQ Chat Style List -->
+    <div class="flex-1 w-full px-5 pt-8 pb-20 space-y-5" id="faq-list">
+        
+        <!-- Standard Row Bot Bubble (Question) -->
+        <div class="flex justify-start">
+             <div class="rounded-xl rounded-tl-sm px-5 py-3 shadow-sm w-[90%] bg-[#EE0033] text-white">
+                 <span class="text-sm font-bold leading-snug block">@Lang.faq_q1</span>
+             </div>
+        </div>
+
+        <!-- Standard Row User Bubble (Answer) -->
+        <div class="flex justify-end mt-2">
+             <div class="rounded-xl rounded-tr-sm px-5 py-4 shadow-md w-[90%] bg-white text-[#212121] border border-gray-100">
+                 <span class="text-[13px] font-medium leading-relaxed block">@Lang.faq_a1</span>
+             </div>
+        </div>
+
+        <!-- Standard Row Bot Bubble (Question) -->
+        <div class="flex justify-start mt-8">
+             <div class="rounded-xl rounded-tl-sm px-5 py-3 shadow-sm w-[90%] bg-[#EE0033] text-white">
+                 <span class="text-sm font-bold leading-snug block">@Lang.faq_q2</span>
+             </div>
+        </div>
+
+        <!-- Standard Row User Bubble (Answer Long Text) -->
+        <div class="flex justify-end mt-2">
+             <div class="rounded-xl rounded-tr-sm px-5 py-4 shadow-md w-[90%] bg-white text-[#212121] border border-gray-100">
+                 <span class="text-[13px] font-medium leading-relaxed block mb-3">@Lang.faq_a2</span>
+                 <span class="text-sm font-bold text-[#EE0033] block mb-1">@Lang.faq_q3</span>
+                 <span class="text-[13px] font-medium leading-relaxed block">@Lang.faq_a3</span>
+             </div>
+        </div>
+
+        <!-- Q4: BASIC PICK 10 Prizes -->
+        <div class="flex justify-start pt-4">
+             <div class="rounded-xl rounded-tl-sm px-5 py-3 shadow-sm w-[90%] bg-[#EE0033] text-white">
+                 <span class="text-sm font-bold leading-snug block">@Lang.faq_v2_q4</span>
+             </div>
+        </div>
+        <div class="flex justify-end mt-2">
+             <div class="rounded-xl rounded-tr-sm px-5 py-4 shadow-md w-[90%] bg-white text-[#212121] border border-gray-100">
+                 <span class="text-[13px] font-medium leading-relaxed block">@Html.Raw(Lang.faq_v2_a4)</span>
+             </div>
+        </div>
+
+        <!-- Q5: Big/Small Gameplay -->
+        <div class="flex justify-start pt-4">
+             <div class="rounded-xl rounded-tl-sm px-5 py-3 shadow-sm w-[90%] bg-[#EE0033] text-white">
+                 <span class="text-sm font-bold leading-snug block">@Lang.faq_v2_q5</span>
+             </div>
+        </div>
+        <div class="flex justify-end mt-2">
+             <div class="rounded-xl rounded-tr-sm px-5 py-4 shadow-md w-[90%] bg-white text-[#212121] border border-gray-100">
+                 <span class="text-[13px] font-medium leading-relaxed block">@Lang.faq_v2_a5</span>
+             </div>
+        </div>
+
+        <!-- Q6: Big/Small Winning -->
+        <div class="flex justify-start pt-4">
+             <div class="rounded-xl rounded-tl-sm px-5 py-3 shadow-sm w-[90%] bg-[#EE0033] text-white">
+                 <span class="text-sm font-bold leading-snug block">@Lang.faq_v2_q6</span>
+             </div>
+        </div>
+        <div class="flex justify-end mt-2">
+             <div class="rounded-xl rounded-tr-sm px-5 py-4 shadow-md w-[90%] bg-white text-[#212121] border border-gray-100">
+                 <span class="text-[13px] font-medium leading-relaxed block">@Html.Raw(Lang.faq_v2_a6)</span>
+             </div>
+        </div>
+
+        <!-- Q7: Odd/Even Gameplay -->
+        <div class="flex justify-start pt-4">
+             <div class="rounded-xl rounded-tl-sm px-5 py-3 shadow-sm w-[90%] bg-[#EE0033] text-white">
+                 <span class="text-sm font-bold leading-snug block">@Lang.faq_v2_q7</span>
+             </div>
+        </div>
+        <div class="flex justify-end mt-2">
+             <div class="rounded-xl rounded-tr-sm px-5 py-4 shadow-md w-[90%] bg-white text-[#212121] border border-gray-100">
+                 <span class="text-[13px] font-medium leading-relaxed block">@Lang.faq_v2_a7</span>
+             </div>
+        </div>
+
+        <!-- Q8: Odd/Even Winning -->
+        <div class="flex justify-start pt-4">
+             <div class="rounded-xl rounded-tl-sm px-5 py-3 shadow-sm w-[90%] bg-[#EE0033] text-white">
+                 <span class="text-sm font-bold leading-snug block">@Lang.faq_v2_q8</span>
+             </div>
+        </div>
+        <div class="flex justify-end mt-2">
+             <div class="rounded-xl rounded-tr-sm px-5 py-4 shadow-md w-[90%] bg-white text-[#212121] border border-gray-100">
+                 <span class="text-[13px] font-medium leading-relaxed block">@Html.Raw(Lang.faq_v2_a8)</span>
+             </div>
+        </div>
+
+    </div>
+    <!-- Bottom Navbar shared component -->
+    <partial name="_BottomNavbar" />
+</div>

+ 430 - 0
website_natcash/Areas/LotteryV2/Views/Home/GameHome.cshtml

@@ -0,0 +1,430 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = "LotteryV2 - Game Home";
+    Layout = "~/Areas/LotteryV2/Views/Shared/_Layout.cshtml";
+}
+@using LotteryWebApp.Languages;
+@using LotteryWebApp.Controllers;
+@using LotteryWebApp.Common;
+
+
+@functions {
+    public string FormatMoney(string amount)
+    {
+        if (string.IsNullOrEmpty(amount)) return "0";
+        var clean = new string(amount.Where(c => char.IsDigit(c)).ToArray());
+        if (long.TryParse(clean, out long val))
+        {
+            return val.ToString("#,##0", new System.Globalization.CultureInfo("vi-VN")).Replace(",", ".");
+        }
+        return amount;
+    }
+}
+
+<div class="main-container animate__animated animate__fadeIn bg-[#F5F5F5] min-h-screen">
+    <!-- Top Account Profile Bar / Backgound Red header -->
+    <div class="w-full bg-[#EE0033] p-4 text-white rounded-b-0xl shadow-md">
+        <!-- Row 1: Profile Info -->
+        <div class="flex items-center gap-4">
+            <a href="/LotteryV2/Home/Index" class="shrink-0 w-10 h-10 bg-white/20 backdrop-blur-md rounded-full flex items-center justify-center text-white border border-white/20 hover:bg-white/30 transition-all shadow-lg active:scale-90">
+                <i class="fas fa-chevron-left text-lg"></i>
+            </a>
+            <div class="flex items-center gap-4">
+                <div class="w-16 h-16 rounded-full border-2 border-white/60 overflow-hidden bg-[#FFE] shadow-sm">
+                    <img src="https://api.dicebear.com/7.x/avataaars/svg?seed=Ngan" alt="Avatar" class="w-full h-full object-cover">
+                </div>
+                <div>
+                    <div class="font-bold text-sm tracking-wide opacity-90">@(Model?.profile?.users ?? "User")</div>
+                    <div class="flex items-center gap-1 mt-0.5">
+                        <span class="text-3xl font-black text-[#FBF3A7]" style="text-shadow: 0 1px 2px rgba(0,0,0,0.2)">@FormatMoney(Model?.userStatus?.bet_coin)</span>
+                        <span class="text-xs font-bold text-[#FBF3A7] uppercase mt-1">@Lang.v2_htg</span>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- Row 2: Pill Actions Full Width Split -->
+        <div class="grid grid-cols-2 gap-3 mt-4">
+            <a onclick="checkTerm('@Constants.PIC10_BASIC_CODE')" class="btn-pulse border border-white/50 rounded-xl py-2 px-3 flex items-center justify-center gap-1 text-xr font-extrabold bg-white/10 hover:bg-white/20 transition-all text-white no-underline">
+                <span class="text-yellow-300 text-xl">⚡</span> @Lang.quick_pick
+            </a>
+            <a href="/LotteryV2/Home/Results" class="btn-pulse border border-white/50 rounded-xl py-2 px-3 flex items-center justify-center gap-1 text-xr font-extrabold bg-white/10 hover:bg-white/20 transition-all text-white no-underline">
+                <span class="text-yellow-300 text-xl">🎫</span> @Lang.results
+            </a>
+        </div>
+
+        <!-- Row 3: Withdraw Button Full Width -->
+        <div class="w-full mt-3">
+            <button onclick="location.href='@Url.Action("TransferWinMoney", "Home")'" class="btn-pulse w-full text-black font-black py-3 rounded-2xl text-[18px] flex items-center justify-center gap-2 shadow-lg transition-all" style="background: linear-gradient(118deg, #19EF4B 0%, #C0FF4B 100%);">
+                <span>@Lang.tranfer_win_money</span>
+                <img src="/LotteryV2/img/gold_wallet.png" alt="Wallet" class="w-6 h-6 object-contain">
+            </button>
+        </div>
+    </div>
+
+    <!-- Countdown Timer Bar with Scalloped bottom divider background -->
+    <div class="relative w-full overflow-hidden" style="background-image: url('/LotteryV2/img/wavy_border.svg'); background-size: 102% 100%; background-position: center; background-repeat: no-repeat; height: 114px;">
+        <!-- Top border red line -->
+        <div class="absolute top-0 left-0 w-full h-[1.5px] bg-[#EE0033]"></div>
+
+        <div class="flex items-center justify-between px-4 pt-7 relative z-10">
+            <!-- Left: Draw Date -->
+            <div class="flex items-center gap-1 flex-1 min-w-0">
+                <div class="w-8 h-8 flex-shrink-0">
+                    <img src="/LotteryV2/img/calendar_icon_3d.png" alt="Calendar" class="w-full h-full object-contain" onerror="this.src='/LotteryV2/img/icon_calendar.svg'">
+                </div>
+                <div class="flex flex-col min-w-0">
+                    <span class="text-[11px] text-[#A1A1A1] font-bold leading-none mb-1">Next Pick 10 draw</span>
+                    <span class="text-[12px] font-[900] text-black tracking-tight leading-none" id="draw-date">Friday, Mar 20, 2026</span>
+                </div>
+            </div>
+
+            <!-- Middle: Dashed Divider -->
+            <div class="h-10 w-px border-l border-dashed border-gray-300 mx-2"></div>
+
+            <!-- Right: Timer -->
+            <div class="flex gap-4 shrink-0">
+                <div class="flex flex-col items-center min-w-[42px]">
+                    <span class="text-[10px] text-[#A1A1A1] font-bold uppercase tracking-tighter mb-1">@Lang.hours</span>
+                    <span class="text-[28px] font-black text-black leading-none font-bricolage" id="countdown-hours">00</span>
+                </div>
+                <div class="flex flex-col items-center min-w-[42px]">
+                    <span class="text-[10px] text-[#A1A1A1] font-bold uppercase tracking-tighter mb-1">@Lang.Minutes</span>
+                    <span class="text-[28px] font-black text-black leading-none font-bricolage" id="countdown-minutes">00</span>
+                </div>
+                <div class="flex flex-col items-center min-w-[42px]">
+                    <span class="text-[10px] text-[#A1A1A1] font-bold uppercase tracking-tighter mb-1">@Lang.Secs</span>
+                    <span class="text-[28px] font-black text-black leading-none font-bricolage" id="countdown-seconds">00</span>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <!-- Anti-forgery token for AJAX -->
+    @Html.AntiForgeryToken()
+
+    <!-- Card list items with accurate illustrations -->
+    <div class="px-3 flex flex-col gap-2 pb-40 relative z-10 mt-[14px]">
+
+        <!-- Game item 1: Basic Pick 10 -->
+        <div class="relative w-full h-[120px] rounded-2xl overflow-hidden shadow-xl font-bricolage transition-all duration-300 active:scale-[0.98] cursor-pointer card-red" onclick="checkTerm('@Constants.PIC10_BASIC_CODE')">
+            <!-- 1. Premium Gradient Border -->
+            <div class="absolute inset-0 rounded-2xl border-[1.5px] border-white/40 pointer-events-none z-20"></div>
+
+            <!-- 2. Decorative Highlights -->
+            <img src="/LotteryV2/img/decorations/ellipse_1183.png" class="absolute -left-[80px] -top-[130px] w-[220px] h-[220px] pointer-events-none z-10 mix-blend-screen scale-y-[-1]" alt="highlight">
+            <img src="/LotteryV2/img/decorations/ellipse_1181.png" class="absolute -right-[60px] -top-[20px] w-[200px] h-[200px] pointer-events-none z-10 mix-blend-screen" alt="highlight">
+
+            <div class="absolute inset-0 grid grid-cols-10 items-center px-3 z-20 gap-0">
+                <!-- Left: Basic Pick + Ball (3 columns) -->
+                <div class="col-span-3 flex items-center h-full -ml-2 relative">
+                    <!-- Text Layout -->
+                    <div class="flex flex-col items-center leading-[0.85] relative z-10 font-UTM_Futura_Extra">
+                        <span class="text-white font-[900] text-[16px] drop-shadow-md">@Lang.Basic</span>
+                        <span class="font-[900] text-[30px] drop-shadow-lg leading-[0.9]" style="background: linear-gradient(180deg, #FFFFFF 20%, #FFF307 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent;">@Lang.Pick</span>
+
+                        <!-- Floating Bubbles (Matching Image) -->
+                        <div class="absolute top-[-4px] right-[-4px] w-2.5 h-2.5 bg-white rounded-full shadow-sm"></div>
+                        <div class="absolute top-[18px] right-[-6px] w-2 h-2 bg-yellow-400 rounded-full shadow-sm"></div>
+                        <div class="absolute bottom-[-6px] left-[10px] w-1.5 h-1.5 bg-white rounded-full opacity-80"></div>
+                    </div>
+
+                    <!-- Single Ball 10 (Yellow) -->
+                    <div class="relative w-[36px] h-[36px] flex-shrink-0 -ml-18 aspect-square z-20">
+                        <div class="w-full h-full bg-[#FFDE59] rounded-full border-[2.5px] border-white flex items-center justify-center shadow-lg">
+                            <span class="text-black font-[900] text-[18px] leading-none mb-0.5">10</span>
+                        </div>
+                        <!-- Extra decorative dot overlapping ball -->
+                        <div class="absolute top-1 -left-1 w-2 h-2 bg-white rounded-full shadow-sm"></div>
+                    </div>
+                </div>
+
+                <!-- Center: Jackpot info (4 columns) -->
+                <div class="col-span-4 flex flex-col items-center justify-center text-center">
+                    <div class="text-[14px] font-bold text-white mb-0.5 whitespace-nowrap opacity-90">@Lang.jackpot_prize</div>
+                    <div class="flex items-start gap-0.5">
+                        <span class="text-[22px] font-black text-[#FBF3A7] leading-none" style="text-shadow: 0 4px 8px rgba(0,0,0,0.3)">1.000.000</span>
+                        <span class="text-[9px] font-bold text-white uppercase opacity-90 mt-1">@Lang.v2_htg</span>
+                    </div>
+                    <div class="text-[12px] text-white/90 font-medium whitespace-nowrap mt-1">@Lang.next_round <span class="font-black text-yellow-300 ml-1 countdown-timer">00:00:00</span></div>
+                </div>
+
+                <!-- Right: Action Section (3 columns) -->
+                <div class="col-span-3 flex flex-col items-center justify-end h-full pb-3.5 relative">
+                    <img src="/LotteryV2/img/gold_chest.png" alt="Chest" class="absolute bottom-[38px] w-18 h-20 object-contain filter drop-shadow-lg z-10">
+                    <button class="text-black font-black px-3 w-full py-1.5 rounded-[12px] text-[13px] shadow-xl border border-white/50 hover:brightness-110 active:scale-95 transition-all relative z-0" style="background: linear-gradient(180deg, #FFF385 0%, #EFAD19 100%);">@Lang.rule_play_now</button>
+                </div>
+            </div>
+        </div>
+
+        <!-- Game item 2: Big/Small -->
+        <div class="relative w-full h-[120px] rounded-2xl overflow-hidden shadow-xl font-bricolage transition-all duration-300 active:scale-[0.98] cursor-pointer card-shadow text-white border border-white/10" style="background-color: rgb(38 163 30);" onclick="checkTerm('@Constants.PIC10_BIGSMALL_CODE')">
+            <!-- 1. Premium Gradient Border -->
+            <div class="absolute inset-0 rounded-2xl border-[1.5px] border-white/40 pointer-events-none z-20"></div>
+
+            <!-- 2. Decorative Highlights -->
+            <img src="/LotteryV2/img/decorations/ellipse_1183.png" class="absolute -left-[80px] -top-[130px] w-[220px] h-[220px] pointer-events-none z-10 mix-blend-screen scale-y-[-1]" alt="highlight">
+            <img src="/LotteryV2/img/decorations/ellipse_1181.png" class="absolute -right-[60px] -top-[20px] w-[200px] h-[200px] pointer-events-none z-10 mix-blend-screen" alt="highlight">
+
+            <div class="absolute inset-0 grid grid-cols-10 items-center px-3 z-20 gap-0">
+                <!-- Left: Big/Small + Ball (3 columns) -->
+                <div class="col-span-3 flex items-center h-full -ml-2 relative">
+                    <!-- Text Layout -->
+                    <div class="flex flex-col items-center leading-[0.85] relative z-10 font-UTM_Futura_Extra">
+                        <span class="text-white font-[900] text-[16px] drop-shadow-md">@Lang.Small</span>
+                        <span class="font-[900] text-[30px] drop-shadow-lg leading-[0.9]" style="background: linear-gradient(180deg, #FFFFFF 20%, #89FF77 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent;">@Lang.Big</span>
+
+                        <!-- Decorative dots (Bubbles) -->
+                        <div class="absolute -top-1 -right-1 w-2.5 h-2.5 bg-white/40 rounded-full blur-[1px]"></div>
+                        <div class="absolute top-1/2 -right-5 w-2 h-2 bg-white rounded-full shadow-sm opacity-90"></div>
+                        <div class="absolute -bottom-2 left-6 w-1.5 h-1.5 bg-yellow-200 rounded-full opacity-80"></div>
+                        <div class="absolute top-2 -left-2 w-1.5 h-1.5 bg-white/60 rounded-full"></div>
+                    </div>
+
+                    <!-- Single Ball 88 -->
+                    <div class="relative w-[48px] h-[48px] flex-shrink-0 -ml-18 mt-1 aspect-square z-20">
+                        <img src="/LotteryV2/img/ball_88.png" alt="88" class="w-full h-full object-contain filter drop-shadow-[0_4px_10px_rgba(0,0,0,0.5)]">
+                        <!-- Extra small decorative white dot near ball -->
+                        <div class="absolute -top-1 -right-1 w-2.5 h-2.5 bg-white rounded-full shadow-sm"></div>
+                        <div class="absolute -bottom-1 left-0 w-1.5 h-1.5 bg-white/50 rounded-full"></div>
+                    </div>
+                </div>
+
+                <!-- Center: Jackpot info (4 columns) -->
+                <div class="col-span-4 flex flex-col items-center justify-center text-center">
+                    <div class="text-[14px] font-bold text-white mb-0.5 whitespace-nowrap opacity-90">@Lang.jackpot_prize</div>
+                    <div class="flex items-start gap-0.5">
+                        <span class="text-[26px] font-black text-[#FBF3A7] leading-none" style="text-shadow: 0 4px 8px rgba(0,0,0,0.3)">100.000</span>
+                        <span class="text-[9px] font-bold text-white uppercase opacity-90 mt-1">@Lang.v2_htg</span>
+                    </div>
+                    <div class="text-[12px] text-white/90 font-medium whitespace-nowrap mt-1">@Lang.next_round <span class="font-black text-yellow-300 ml-1 countdown-timer">00:00:00</span></div>
+                </div>
+
+                <!-- Right: Action Section (3 columns) -->
+                <div class="col-span-3 flex flex-col items-center justify-end h-full pb-3.5 relative">
+                    <img src="/LotteryV2/img/gold_bag.png" alt="Bag" class="absolute bottom-[38px] w-18 h-20 object-contain filter drop-shadow-lg z-10">
+                    <button class="text-black font-black px-3 w-full py-1.5 rounded-[12px] text-[13px] shadow-xl border border-white/50 hover:brightness-110 active:scale-95 transition-all relative z-0" style="background: linear-gradient(180deg, #FFF385 0%, #EFAD19 100%);">@Lang.rule_play_now</button>
+                </div>
+            </div>
+        </div>
+
+        <!-- Game item 3: @Lang.odd_even -->
+        <div class="relative w-full h-[120px] rounded-2xl overflow-hidden shadow-xl font-bricolage transition-all duration-300 active:scale-[0.98] cursor-pointer card-shadow text-white border border-white/10" style="background-color: rgb(213 45 233);" onclick="checkTerm('@Constants.PIC10_ODDEVEN_CODE')">
+            <!-- 1. Premium Gradient Border -->
+            <div class="absolute inset-0 rounded-2xl border-[1.5px] border-white/40 pointer-events-none z-20"></div>
+
+            <!-- 2. Decorative Highlights -->
+            <img src="/LotteryV2/img/decorations/ellipse_1183.png" class="absolute -left-[80px] -top-[130px] w-[220px] h-[220px] pointer-events-none z-10 mix-blend-screen scale-y-[-1]" alt="highlight">
+            <img src="/LotteryV2/img/decorations/ellipse_1181.png" class="absolute -right-[60px] -top-[20px] w-[200px] h-[200px] pointer-events-none z-10 mix-blend-screen" alt="highlight">
+
+            <div class="absolute inset-0 grid grid-cols-10 items-center px-3 z-20 gap-0">
+                <!-- Left: Odd/Even + Balls (3 columns) -->
+                <div class="col-span-3 flex items-center h-full -ml-2 relative">
+                    <!-- Text Layout -->
+                    <div class="flex flex-col items-center leading-[0.85] relative z-10 font-UTM_Futura_Extra">
+                        <span class="text-white font-[900] text-[16px] drop-shadow-md">@Lang.Odd</span>
+                        <span class="font-[900] text-[30px] drop-shadow-lg leading-[0.9]" style="background: linear-gradient(180deg, #FFFFFF 20%, #F29CFF 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent;">@Lang.Even</span>
+
+                        <!-- Decorative dots (Bubbles) -->
+                        <div class="absolute -top-2 -right-2 w-3 h-3 bg-white/30 rounded-full blur-[1px]"></div>
+                        <div class="absolute top-1/2 -right-5 w-2 h-2 bg-yellow-300 rounded-full shadow-sm"></div>
+                        <div class="absolute -top-1 -left-1 w-1.5 h-1.5 bg-white/50 rounded-full"></div>
+                        <div class="absolute -bottom-2 right-2 w-1.5 h-1.5 bg-white rounded-full opacity-80"></div>
+                    </div>
+
+                    <!-- Balls Overlapping -->
+                    <div class="relative w-[60px] h-[60px] flex-shrink-0 -ml-6 -mt-2 aspect-square z-20">
+                        <!-- Ball 3 (Yellow) -->
+                        <div class="absolute left-0 top-0 w-8 h-8 rounded-full shadow-lg z-0">
+                            <img src="/LotteryV2/img/ball_3.png" alt="3" class="w-full h-full object-contain">
+                        </div>
+                        <!-- Ball 20 (Pink/Magenta) -->
+                        <div class="absolute left-4 top-3 w-9 h-9 rounded-full shadow-xl z-10">
+                            <img src="/LotteryV2/img/ball_20.png" alt="20" class="w-full h-full object-contain border-2 border-white/20 rounded-full">
+                        </div>
+                        <!-- Small highlight dot near ball -->
+                        <div class="absolute -top-1 right-2 w-1.5 h-1.5 bg-white rounded-full shadow-sm opacity-90"></div>
+                    </div>
+                </div>
+
+                <!-- Center: Jackpot info (4 columns) -->
+                <div class="col-span-4 flex flex-col items-center justify-center text-center">
+                    <div class="text-[14px] font-bold text-white mb-0.5 whitespace-nowrap opacity-90">@Lang.jackpot_prize</div>
+                    <div class="flex items-start gap-0.5">
+                        <span class="text-[26px] font-black text-[#FBF3A7] leading-none" style="text-shadow: 0 4px 8px rgba(0,0,0,0.3)">200.000</span>
+                        <span class="text-[9px] font-bold text-white uppercase opacity-90 mt-1">@Lang.v2_htg</span>
+                    </div>
+                    <div class="text-[12px] text-white/90 font-medium whitespace-nowrap mt-1">@Lang.next_round <span class="font-black text-yellow-300 ml-1 countdown-timer">00:00:00</span></div>
+                </div>
+
+                <!-- Right: Action Section (3 columns) -->
+                <div class="col-span-3 flex flex-col items-center justify-end h-full pb-3.5 relative">
+                    <img src="/LotteryV2/img/gold_wallet.png" alt="Wallet" class="absolute bottom-[38px] w-18 h-20 object-contain filter drop-shadow-lg z-10">
+                    <button class="text-black font-black px-3 w-full py-1.5 rounded-[12px] text-[13px] shadow-xl border border-white/50 hover:brightness-110 active:scale-95 transition-all relative z-0" style="background: linear-gradient(180deg, #FFF385 0%, #EFAD19 100%);">@Lang.rule_play_now</button>
+                </div>
+            </div>
+        </div>
+
+    </div>
+
+    <!-- Banner Info Section centered red text bar -->
+    <div class="fixed bottom-[82px] left-1/2 -translate-x-1/2 w-full min-[600px]:max-w-[414px] bg-[#EE0033] text-white py-2 text-center text-[13px] font-bold tracking-wide z-40 flex flex-col items-center justify-center overflow-hidden h-auto shadow-md">
+        <div class="flex flex-col items-center w-full animate-slide-up">
+            <!-- Row 1 -->
+            <div class="opacity-90">@Lang.have_chance_to_get</div>
+            <!-- Row 2 -->
+            <div class="text-[20px] font-black text-[#FBF3A7] mt-0.5">
+                @Lang.jackpot_today_htg
+            </div>
+        </div>
+    </div>
+
+    <!-- Custom Notification Modal (Branded design from Profile) -->
+    <div id="notificationModal" class="fixed inset-0 z-[100] flex items-center justify-center hidden px-6 font-bricolage" style="background: linear-gradient(135deg, rgba(26, 26, 46, 0.9) 0%, rgba(22, 33, 62, 0.9) 100%);">
+        <div class="w-full max-w-[343px] min-h-[480px] bg-white rounded-[24px] overflow-hidden flex flex-col items-center p-8 animate__animated animate__zoomIn animate__faster shadow-2xl">
+            <!-- Alert Icon -->
+            <div class="w-full flex justify-center mb-8 mt-6">
+                <img src="/LotteryV2/img/modal/fail_icon.png" class="w-[180px] h-auto object-contain" alt="Notificaton icon" />
+            </div>
+
+            <!-- Message Area -->
+            <div class="px-2 text-center mb-10 flex-1 flex items-center justify-center">
+                <p id="notificationMessage" class="text-black font-[800] text-[22px] leading-snug">
+                    <!-- Message content -->
+                </p>
+            </div>
+
+            <!-- Action Button -->
+            <div class="w-full">
+                <button onclick="closeNotificationModal()" class="w-full bg-[#EE0033] text-white font-[800] text-[20px] py-[12px] rounded-[14px] shadow-lg active:scale-95 transition-all">
+                    @Lang.try_again
+                </button>
+            </div>
+        </div>
+    </div>
+
+    <!-- Bottom Navbar shared component -->
+    <partial name="_BottomNavbar" />
+</div>
+
+@section Scripts {
+    <script>
+        var systemUpgrading = false;
+        function showNotification(message, code) {
+            $("#notificationMessage").text(message);
+            const $btn = $("#notificationModal button");
+            if (code === "-2" || (message && message.includes("System is upgrading"))) {
+                systemUpgrading = true;
+                $btn.text("@Lang.login");
+            } else {
+                systemUpgrading = false;
+                $btn.text("@Lang.try_again");
+            }
+            $("#notificationModal").removeClass("hidden").addClass("flex");
+        }
+
+        function closeNotificationModal() {
+            $("#notificationModal").addClass("hidden").removeClass("flex");
+            if (systemUpgrading) {
+                window.location.href = subDomain + "/Account/Login";
+            }
+        }
+
+        let isCheckingTerm = false;
+
+        function checkTerm(termType) {
+            if (isCheckingTerm) return;
+            isCheckingTerm = true;
+
+            // Get anti-forgery token from the page
+            var token = $('input[name="__RequestVerificationToken"]').val();
+
+            // Show loading or disable buttons if needed
+            $.ajax({
+                url: subDomain + '/LotteryV2/Home/TermResult',
+                type: 'POST',
+                data: {
+                    __RequestVerificationToken: token,
+                    termType: termType
+                },
+                success: function (res) {
+                    if (res.responseCode === "0") {
+                        if (res.listTerm && res.listTerm.length > 0) {
+                            var status = res.listTerm[0].status;
+                            if (status === "0" || status === "1") {
+                                location.href = subDomain + '/LotteryV2/Home/BuyTicket?termType=' + termType;
+                                return;
+                            } else if (status === "2") {
+                                showNotification("@Lang.v2_game_locked");
+                            } else if (status === "3") {
+                                showNotification("@Lang.v2_updating_results");
+                            } else {
+                                showNotification("@Lang.v2_game_locked");
+                            }
+                        } else {
+                            showNotification("@Lang.no_results_found");
+                        }
+                    } else if (res.responseCode === "401") {
+                        window.location.href = subDomain + "/Account/Login";
+                        return;
+                    } else {
+                        showNotification(res.responseMessage || "@Lang.error_happened", res.responseCode);
+                    }
+                    isCheckingTerm = false;
+                },
+                error: function (err) {
+                    showNotification("@Lang.error_happened");
+                    isCheckingTerm = false;
+                }
+            });
+        }
+
+        function startCountdown() {
+            const targetHour = 20; // 20:00 (8 PM) Haiti time
+            const timeZone = 'America/Port-au-Prince';
+            const timers = document.querySelectorAll('.countdown-timer');
+
+            // Server time string has no offset => must be interpreted in Haiti timezone
+            const serverTimeStr = '@Model.serverTime.ToString("yyyy-MM-ddTHH:mm:ss")';
+            const startBrowser = moment();
+            const baseServer = moment.tz(serverTimeStr, 'YYYY-MM-DDTHH:mm:ss', timeZone);
+
+            function updateTime() {
+                const elapsedMs = moment().diff(startBrowser);
+                const now = baseServer.clone().add(elapsedMs, 'milliseconds'); // Haiti time
+
+                let target = now.clone().hour(targetHour).minute(0).second(0).millisecond(0);
+                if (now.isSameOrAfter(target)) target.add(1, 'day');
+
+                // Draw date display (e.g. Friday, Mar 20, 2026) in Haiti time
+                const dateText = target.clone().locale('en').format('dddd, MMM D, YYYY');
+                const drawDateEl = document.getElementById('draw-date');
+                if (drawDateEl) drawDateEl.innerText = dateText;
+
+                const dur = moment.duration(target.diff(now));
+                const hours = Math.max(0, Math.floor(dur.asHours()));
+                const minutes = Math.max(0, dur.minutes());
+                const seconds = Math.max(0, dur.seconds());
+
+                const hhEl = document.getElementById('countdown-hours');
+                const mmEl = document.getElementById('countdown-minutes');
+                const ssEl = document.getElementById('countdown-seconds');
+
+                if (hhEl) hhEl.innerText = hours.toString().padStart(2, '0');
+                if (mmEl) mmEl.innerText = minutes.toString().padStart(2, '0');
+                if (ssEl) ssEl.innerText = seconds.toString().padStart(2, '0');
+
+                // Update all card timers
+                const timeStr = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
+                timers.forEach(t => t.innerText = timeStr);
+            }
+
+            updateTime();
+            setInterval(updateTime, 1000);
+        }
+
+        document.addEventListener('DOMContentLoaded', startCountdown);
+    </script>
+}
+
+

+ 313 - 0
website_natcash/Areas/LotteryV2/Views/Home/History.cshtml

@@ -0,0 +1,313 @@
+@model LotteryWebApp.Models.UserTicketHistoryModel
+@using LotteryWebApp.Languages
+@using LotteryWebApp.Common
+@{
+    ViewData["Title"] = "LotteryV2 - History";
+    Layout = "~/Areas/LotteryV2/Views/Shared/_Layout.cshtml";
+    ViewData["ActiveTab"] = "History";
+}
+
+@section Styles {
+    <script src="https://cdn.tailwindcss.com"></script>
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+    <link rel="stylesheet" href="/LotteryV2/css/site.css" />
+    <link rel="stylesheet" href="/LotteryV2/css/results.css" />
+    <link rel="stylesheet" href="/LotteryV2/css/history.css" />
+}
+
+<div class="main-container results-container animate__animated animate__fadeIn pb-40 relative">
+    <!-- Header Group: Static at Top -->
+    <div class="w-full z-[100] bg-[#F3F4F6] pb-2 shadow-md">
+        <!-- Header -->
+        <div class="results-top-header">
+            <a href="/LotteryV2/Home/GameHome" class="back-btn">
+                <i class="fas fa-arrow-left"></i>
+            </a>
+            <h1 class="font-bricolage">@Lang.history</h1>
+        </div>
+
+        <!-- Game Tabs -->
+        <div class="history-game-tabs !mt-0 pt-3 scale-95 origin-top">
+            <div class="game-tab @(Model.termType == Constants.PIC10_BASIC_CODE ? "active" : "")" 
+                 onclick="changeGame('@Constants.PIC10_BASIC_CODE', this)">@Lang.v2_classic_pick_10</div>
+            <div class="game-tab @(Model.termType == Constants.PIC10_BIGSMALL_CODE ? "active" : "")" 
+                 onclick="changeGame('@Constants.PIC10_BIGSMALL_CODE', this)">@Lang.v2_big_small</div>
+            <div class="game-tab @(Model.termType == Constants.PIC10_ODDEVEN_CODE ? "active" : "")" 
+                 onclick="changeGame('@Constants.PIC10_ODDEVEN_CODE', this)">@Lang.v2_odd_even</div>
+        </div>
+
+        <!-- Status Filters -->
+        <div class="status-filters !mt-1">
+            <div class="status-filter @(Model.status == Constants.ALL_DATA ? "active" : "")" 
+                 onclick="changeStatus('@Constants.ALL_DATA', this)">@Lang.v2_all</div>
+            <div class="status-filter @(Model.status == Constants.NOT_DRAW_CODE ? "active" : "")" 
+                 onclick="changeStatus('@Constants.NOT_DRAW_CODE', this)">@Lang.v2_waiting</div>
+            <div class="status-filter @(Model.status == Constants.WIN_CODE ? "active" : "")" 
+                 onclick="changeStatus('@Constants.WIN_CODE', this)">@Lang.v2_win</div>
+            <div class="status-filter @(Model.status == Constants.DRAWN_CODE ? "active" : "")" 
+                 onclick="changeStatus('@Constants.DRAWN_CODE', this)">@Lang.v2_not_win</div>
+        </div>
+    </div>
+
+    <!-- Ticket List Container -->
+    <div id="history-list-container" class="history-items-list px-4 mt-2">
+        <partial name="_TermUserTicketHistory" model="Model" />
+    </div>
+
+    <!-- Shared Bottom Navbar -->
+    <partial name="_BottomNavbar" />
+
+    <!-- Custom Notification Modal -->
+    <div id="notificationModal" class="fixed inset-0 z-[300] flex items-center justify-center hidden px-6 font-bricolage" style="background: linear-gradient(135deg, rgba(26, 26, 46, 0.9) 0%, rgba(22, 33, 62, 0.9) 100%);">
+        <div class="w-full max-w-[343px] min-h-[420px] bg-white rounded-[24px] overflow-hidden flex flex-col items-center p-8 animate__animated animate__zoomIn animate__faster shadow-2xl border border-white/50">
+            <div class="w-full flex justify-center mb-8 mt-4">
+                <img src="/LotteryV2/img/modal/fail_icon.png" class="w-[160px] h-auto object-contain" alt="Notificaton icon" />
+            </div>
+            <div class="px-2 text-center mb-10 flex-1 flex items-center justify-center">
+                <p id="notificationMessage" class="text-black font-[800] text-[20px] leading-snug"></p>
+            </div>
+            <div class="w-full">
+                <button onclick="closeNotificationModal()" class="w-full bg-[#EE0033] text-white font-[800] text-[18px] py-[12px] rounded-[16px] shadow-lg active:scale-95 transition-all">
+                    @Lang.login
+                </button> 
+            </div>
+        </div>
+    </div>
+</div>
+
+@section Scripts {
+    <script>
+
+        let currentTermType = '@Model.termType';
+        let currentStatus = '@Model.status';
+        let currentSeqPage = parseInt('@Model.seqPage');
+        let totalPages = parseInt('@Model.totalPage' || '1');
+
+        function changeGame(type, el) {
+            if (currentTermType === type) return;
+            currentTermType = type;
+            currentSeqPage = 1;
+            
+            document.querySelectorAll('.game-tab').forEach(t => t.classList.remove('active'));
+            el.classList.add('active');
+            
+            loadHistory();
+        }
+
+        function changeStatus(status, el) {
+            if (currentStatus === status) return;
+            currentStatus = status;
+            currentSeqPage = 1;
+
+            document.querySelectorAll('.status-filter').forEach(t => t.classList.remove('active'));
+            el.classList.add('active');
+
+            loadHistory();
+        }
+
+        function changePage(page) {
+            if (page < 1 || page > totalPages) return;
+            currentSeqPage = page;
+            loadHistory();
+        }
+
+        var systemUpgrading = false;
+        function showNotification(message, code) {
+            $("#notificationMessage").text(message);
+            const $btn = $("#notificationModal button");
+            if (code === "-2" || (message && message.includes("System is upgrading"))) {
+                systemUpgrading = true;
+                $btn.text("@Lang.login");
+            } else {
+                systemUpgrading = false;
+                $btn.text("OK");
+            }
+            $("#notificationModal").removeClass("hidden").addClass("flex");
+        }
+
+        function closeNotificationModal() {
+            $("#notificationModal").addClass("hidden").removeClass("flex");
+            if (systemUpgrading) {
+                window.location.href = subDomain + "/Account/Login";
+            }
+        }
+
+        function loadHistory() {
+            const container = document.getElementById("history-list-container");
+            container.style.opacity = "0.5";
+
+            fetch(subDomain + `/LotteryV2/Home/TermUserTicketHistory?termType=${currentTermType}&status=${currentStatus}&seqPage=${currentSeqPage}`)
+                .then(response => {
+                    if (!response.ok) throw new Error('Network response was not ok');
+                    return response.text();
+                })
+                .then(html => {
+                    try {
+                        const json = JSON.parse(html);
+                        if (json.responseCode === "-2" || (json.responseMessage && json.responseMessage.includes("System is upgrading"))) {
+                            showNotification(json.responseMessage || "System is upgrading", "-2");
+                            return;
+                        }
+                    } catch (e) {
+                        // Not JSON, likely HTML partial
+                    }
+                    container.innerHTML = html;
+                    container.style.opacity = "1";
+                    updatePaginationUI();
+                })
+                .catch(error => {
+                    console.error("Error loading history:", error);
+                    container.style.opacity = "1";
+                    if (error.message && (error.message.includes("System is upgrading") || error.message.includes("-2"))) {
+                        showNotification(error.message, "-2");
+                    }
+                });
+        }
+
+        function updatePaginationUI() {
+            const pageDisplay = document.getElementById("pageDisplay");
+            const prevBtn = document.getElementById("prevPage");
+            const nextBtn = document.getElementById("nextPage");
+            
+            if (pageDisplay) {
+                pageDisplay.innerText = `${currentSeqPage} / ${totalPages}`;
+            }
+            if (prevBtn) prevBtn.disabled = currentSeqPage <= 1;
+            if (nextBtn) nextBtn.disabled = currentSeqPage >= totalPages;
+        }
+
+        function showTicketDetail(billCode, money, moneyWin, date, channel, payMethod, ticketCode, gameId, drawTime, ticketId) {
+            document.getElementById('detailBillCode').innerText = '#' + (billCode || '-');
+            document.getElementById('detailTicketCode').innerText = '#' + (ticketId || '-');
+            document.getElementById('detailMoney').innerText = formatMoneyV2(money || '0') + ' HTG';
+            document.getElementById('detailMoneyWin').innerText = formatMoneyV2(moneyWin || '0') + ' HTG';
+            document.getElementById('detailDate').innerText = date || '-';
+            document.getElementById('detailDrawTime').innerText = drawTime || '-';
+            document.getElementById('detailChannel').innerText = channel || 'App';
+            
+            // Logic for Game Name and Color
+            let gameName = "@Lang.v2_classic_pick_10";
+            let gameColor = "#EE0033"; // Red
+            
+            if (gameId === "31") {
+                gameName = "@Lang.v2_big_small";
+                gameColor = "#00A3FF"; // Blue
+            } else if (gameId === "32") {
+                gameName = "@Lang.v2_odd_even";
+                gameColor = "#9333EA"; // Purple
+            }
+            
+            const gameEl = document.getElementById('detailGameName');
+            gameEl.innerText = gameName;
+            gameEl.style.color = gameColor;
+
+            let payMethodText = "Main Account";
+            if(payMethod == "1") payMethodText = "Wallet";
+            else if(payMethod == "0") payMethodText = "Main Account";
+
+            document.getElementById('detailPaymentMethod').innerText = payMethodText;
+
+            // Render Numbers
+            const container = document.getElementById('detailBallsContainer');
+            container.innerHTML = '';
+            if (ticketCode) {
+                const balls = ticketCode.split(/[;,]/).filter(x => x.trim() !== '');
+                balls.forEach(val => {
+                    let ballVal = val.trim();
+                    let displayVal = ballVal;
+                    let isLabel = false;
+                    switch(ballVal.toUpperCase()) {
+                        case 'B': displayVal = 'Big'; isLabel = true; break;
+                        case 'S': displayVal = 'Small'; isLabel = true; break;
+                        case 'O': displayVal = 'Odd'; isLabel = true; break;
+                        case 'E': displayVal = 'Even'; isLabel = true; break;
+                    }
+
+                    const div = document.createElement('div');
+                    if (isLabel) {
+                        div.className = "bg-[#EE0033] text-white px-4 py-1 rounded-full font-black text-[12px] shadow-sm uppercase tracking-wider";
+                    } else {
+                        div.className = "w-8 h-8 rounded-full flex items-center justify-center text-white text-[12px] font-black shadow-md";
+                        div.style.background = "linear-gradient(135deg, #FF3D63 0%, #E3132D 60%, #BA0F21 100%)";
+                        div.style.border = "1px solid rgba(255, 255, 255, 0.3)";
+                    }
+                    div.innerText = displayVal;
+                    container.appendChild(div);
+                });
+            }
+            
+            const modal = document.getElementById('ticketDetailModal');
+            modal.classList.remove('hidden');
+            modal.classList.add('flex');
+        }
+
+        function closeDetailModal() {
+            const modal = document.getElementById('ticketDetailModal');
+            modal.classList.add('hidden');
+            modal.classList.remove('flex');
+        }
+    </script>
+}
+
+<!-- Ticket Detail Modal -->
+<div id="ticketDetailModal" class="fixed inset-0 z-[200] bg-black/60 hidden items-center justify-center p-4 font-bricolage backdrop-blur-sm">
+    <div class="w-full max-w-[380px] bg-white rounded-[28px] overflow-hidden flex flex-col items-center px-6 py-8 shadow-2xl relative animate__animated animate__zoomIn animate__faster">
+        <button onclick="closeDetailModal()" class="absolute top-4 right-4 text-gray-400 hover:text-gray-600 transition-colors">
+            <i class="fas fa-times text-xl"></i>
+        </button>
+        
+        <div class="w-20 h-20 bg-gray-50 rounded-full flex items-center justify-center mb-4">
+            <i class="fas fa-receipt text-3xl text-[#EE0033]"></i>
+        </div>
+        
+        <h2 class="text-[20px] font-black text-gray-800 mb-2 uppercase tracking-tight">@Lang.v2_ticket_detail</h2>
+        
+        <!-- Ticket Numbers Display -->
+        <div id="detailBallsContainer" class="flex flex-wrap justify-center gap-2 mb-6 mt-2 max-w-full">
+            <!-- Dynamic balls here -->
+        </div>
+
+        <div class="w-full space-y-4">
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.v2_game</span>
+                <span id="detailGameName" class="font-black">Pick 10</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.v2_bill_code</span>
+                <span id="detailBillCode" class="font-black text-gray-800">#</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.v2_ticket_code</span>
+                <span id="detailTicketCode" class="font-black text-gray-800">#</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.v2_money_ticket</span>
+                <span id="detailMoney" class="font-black text-gray-800">0 HTG</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.v2_money_win</span>
+                <span id="detailMoneyWin" class="font-black text-[#0A9800]">0 HTG</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.v2_purchase_date</span>
+                <span id="detailDate" class="font-black text-gray-800">-</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.v2_draw_date</span>
+                <span id="detailDrawTime" class="font-black text-gray-800">-</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.v2_channel</span>
+                <span id="detailChannel" class="font-black text-gray-800">-</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.v2_payment_method</span>
+                <span id="detailPaymentMethod" class="font-black text-gray-800">-</span>
+            </div>
+        </div>
+        
+        <button onclick="closeDetailModal()" class="w-full bg-[#EE0033] text-white font-black text-[16px] py-3.5 rounded-2xl shadow-lg mt-8 active:scale-95 transition-all uppercase tracking-widest">
+            @Lang.v2_close
+        </button>
+    </div>
+</div>

+ 147 - 0
website_natcash/Areas/LotteryV2/Views/Home/HowToPlay.cshtml

@@ -0,0 +1,147 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = "LotteryV2 - How to play";
+    ViewData["ActiveTab"] = "More";
+    Layout = "~/Areas/LotteryV2/Views/Shared/_Layout.cshtml";
+}
+@using LotteryWebApp.Languages;
+
+<script src="https://cdn.tailwindcss.com"></script>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+<link rel="stylesheet" href="/LotteryV2/css/site.css" />
+
+<!-- Add custom font Bricolage Grotesque to match Figma styling -->
+<link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:wght@400;700;800;900&display=swap" rel="stylesheet">
+<link rel="stylesheet" href="/LotteryV2/css/howtoplay.css" />
+
+<div class="main-container animate__animated animate__fadeIn min-h-screen relative flex flex-col pb-24 font-bricolage overflow-x-hidden" style="background-color: #EAEAEA !important;">
+    
+    <!-- Header (Red Background) -->
+    <div class="w-full bg-[#EE0033] h-[52px] flex items-center justify-between px-4 sticky top-0 z-50">
+        <!-- Back Button -->
+        <button onclick="window.history.back()" class="w-10 h-10 flex items-center justify-center -ml-2 rounded-full active:bg-white/20 transition-colors z-10 text-white">
+            <i class="fa-solid fa-arrow-left text-[20px]"></i>
+        </button>
+        <!-- Title -->
+        <div class="absolute inset-0 flex items-center justify-center pointer-events-none">
+            <span class="font-bold text-[24px] text-white tracking-wide drop-shadow-sm">@Lang.how_to_play</span>
+        </div>
+    </div>
+
+    <!-- Content / Cards -->
+    <div class="w-full flex flex-col px-5 py-4 gap-6">
+
+        <!-- Card 1: Basic Pick 10 -->
+        <div class="w-full flex flex-col gap-1.5 cursor-pointer hover:opacity-95 transition-opacity" onclick="window.location.href='/LotteryV2/Home/GameHome'">
+            <h2 class="text-[13px] font-bold text-[#534A4A] tracking-normal px-1">@Lang.how_to_play_pick10</h2>
+            <div class="w-full h-[90px] rounded-[16px] relative overflow-hidden card-red border border-white/20 shadow-[0_4px_10px_rgba(238,0,51,0.25)]">
+                <!-- Background Glow -->
+                <div class="absolute -left-6 -top-6 w-20 h-20 bg-white/20 rounded-full blur-2xl"></div>
+                <div class="absolute -bottom-10 -right-10 w-24 h-24 bg-black/20 rounded-full blur-2xl"></div>
+                
+                <div class="w-full h-full flex items-center justify-between pl-3 pr-2 relative z-10">
+                    <!-- Left: Basic Pick 10 Logo -->
+                    <div class="flex flex-col items-center justify-center pt-2">
+                        <span class="text-[14px] font-black italic text-white drop-shadow-md leading-[1.1] text-center" style="font-family: 'Montserrat', sans-serif;">Basic<br>Pick</span>
+                        <img src="/LotteryV2/img/ball_10.png" class="w-7 h-7 object-contain drop-shadow-md -mt-2 -mr-8 border-2 border-[#E11D48] rounded-full bg-[#E11D48]">
+                    </div>
+
+                    <!-- Center: Numbers -->
+                    <div class="flex flex-col items-center mt-0.5 ml-4">
+                        <span class="text-[10px] font-[800] text-white tracking-widest drop-shadow">@Lang.jackpot_prize</span>
+                        <div class="flex items-start gap-1 mt-0.5">
+                            <span class="text-[28px] font-[900] text-white leading-none tracking-tight drop-shadow-md">100.000</span>
+                            <span class="text-[7px] font-[800] text-white bg-transparent border border-white/60 rounded px-[2px] mt-1 shadow-sm leading-tight">HTG</span>
+                        </div>
+                        <div class="text-[9px] text-white/90 mt-0.5">@Lang.next_round <span class="font-[900] text-white ml-0.5 drop-shadow">05:00</span></div>
+                    </div>
+
+                    <!-- Right: Graphic & Button -->
+                    <div class="flex flex-col items-end justify-between h-full py-2 w-[70px]">
+                        <img src="/LotteryV2/img/play_chest.png" class="h-[46px] w-[56px] object-contain drop-shadow-lg scale-125 origin-top-right mr-1 mt-1">
+                        <div class="w-full yellow-button text-center rounded-[8px] py-[3px] text-[10px] font-[900] px-2 z-20 active:scale-95 transition-transform mt-auto">@Lang.play</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- Card 2: Millionair -->
+        <div class="w-full flex flex-col gap-1.5 cursor-pointer hover:opacity-95 transition-opacity" onclick="window.location.href='/LotteryV2/Home/GameHome'">
+            <h2 class="text-[13px] font-bold text-[#534A4A] tracking-normal px-1">@Lang.how_to_play_millionair</h2>
+            <div class="w-full h-[90px] rounded-[16px] relative overflow-hidden card-blue border border-white/20 shadow-[0_4px_10px_rgba(26,146,244,0.25)]">
+                <!-- Background Glow -->
+                <div class="absolute -left-6 -top-6 w-20 h-20 bg-white/20 rounded-full blur-2xl"></div>
+                <div class="absolute -bottom-10 -right-10 w-24 h-24 bg-black/20 rounded-full blur-2xl"></div>
+                
+                <div class="w-full h-full flex items-center justify-between pl-1 pr-2 relative z-10">
+                    <!-- Left: Millionair Graphic -->
+                    <div class="flex flex-col items-center justify-end relative w-[80px] h-full z-10">
+                        <img src="/LotteryV2/img/ball_86.png" class="absolute left-[-12px] top-[12px] w-[38px] h-[38px] object-contain drop-shadow-md z-0 transform -rotate-[15deg]">
+                        <img src="/LotteryV2/img/ball_88.png" class="absolute left-[52px] top-[26px] w-[32px] h-[32px] object-contain drop-shadow-md z-0 transform rotate-[15deg]">
+                        <img src="/LotteryV2/img/m1.png" class="absolute left-[10px] bottom-[-5px] h-[95px] w-auto object-contain drop-shadow-md z-10">
+                        <span class="text-[12px] font-black italic text-white drop-shadow-[0_2px_4px_rgba(0,0,0,0.8)] absolute bottom-[8px] left-[12px] tracking-wide z-20" style="font-family: 'Montserrat', sans-serif;">Millionair</span>
+                    </div>
+
+                    <!-- Center: Numbers -->
+                    <div class="flex flex-col items-center mt-0.5 -ml-1">
+                        <span class="text-[10px] font-[800] text-white tracking-widest drop-shadow">@Lang.jackpot_prize</span>
+                        <div class="flex items-start gap-1 mt-0.5">
+                            <span class="text-[28px] font-[900] text-[#FFDE59] leading-none tracking-tight drop-shadow-md">500.000</span>
+                            <span class="text-[7px] font-[800] text-white bg-transparent border border-white/60 rounded px-[2px] mt-1 shadow-sm leading-tight">HTG</span>
+                        </div>
+                        <div class="text-[9px] text-white/90 mt-0.5">@Lang.next_round <span class="font-[900] text-white ml-0.5 drop-shadow">05:00</span></div>
+                    </div>
+
+                    <!-- Right: Graphic & Button -->
+                    <div class="flex flex-col items-end justify-between h-full py-2 w-[70px]">
+                        <img src="/LotteryV2/img/play_millionair.png" class="h-[43px] w-[58px] object-contain drop-shadow-[0_5px_8px_rgba(0,0,0,0.3)] scale-110 origin-right mr-1 mt-2">
+                        <div class="w-full yellow-button text-center rounded-[8px] py-[3px] text-[10px] font-[900] px-2 z-20 active:scale-95 transition-transform mt-auto">@Lang.play</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- Card 3: Mega Bet -->
+        <div class="w-full flex flex-col gap-1.5 cursor-pointer hover:opacity-95 transition-opacity" onclick="window.location.href='/LotteryV2/Home/GameHome'">
+            <h2 class="text-[13px] font-bold text-[#534A4A] tracking-normal px-1">@Lang.how_to_play_megabet</h2>
+            <div class="w-full h-[90px] rounded-[16px] relative overflow-hidden card-orange border border-white/20 shadow-[0_4px_10px_rgba(248,110,34,0.25)]">
+                <!-- Background Glow -->
+                <div class="absolute -left-6 -top-6 w-20 h-20 bg-white/20 rounded-full blur-2xl"></div>
+                <div class="absolute -bottom-10 -right-10 w-24 h-24 bg-black/20 rounded-full blur-2xl"></div>
+                
+                <div class="w-full h-full flex items-center justify-between pl-3 pr-2 relative z-10">
+                    <!-- Left: Mega Bet Graphic -->
+                    <div class="flex items-center relative w-[80px] h-full">
+                        <div class="flex flex-col text-white drop-shadow-md text-left z-20" style="font-family: 'Montserrat', sans-serif;">
+                            <span class="text-[10px] font-[900] italic leading-[0.9]">@Lang.MEGA</span>
+                            <span class="text-[15px] font-[900] italic text-[#FFDE59] leading-[0.9]">@Lang.Bet</span>
+                        </div>
+                        <img src="/LotteryV2/img/ball_88.png" class="w-[22px] h-[22px] object-contain drop-shadow-md absolute left-[38px] top-[24px] z-10">
+                        <img src="/LotteryV2/img/ball_99.png" class="w-[28px] h-[28px] object-contain drop-shadow-lg absolute left-[52px] top-[30px] z-30">
+                    </div>
+
+                    <!-- Center: Numbers -->
+                    <div class="flex flex-col items-center mt-0.5 ml-2">
+                        <span class="text-[10px] font-[800] text-white tracking-widest drop-shadow">@Lang.jackpot_prize</span>
+                        <div class="flex items-start gap-1 mt-0.5">
+                            <span class="text-[28px] font-[900] text-white leading-none tracking-tight drop-shadow-md">800.000</span>
+                            <span class="text-[7px] font-[800] text-white bg-transparent border border-white/60 rounded px-[2px] mt-1 shadow-sm leading-tight">HTG</span>
+                        </div>
+                        <div class="text-[9px] text-white/90 mt-0.5">@Lang.next_round <span class="font-[900] text-white ml-0.5 drop-shadow">05:00</span></div>
+                    </div>
+
+                    <!-- Right: Graphic & Button -->
+                    <div class="flex flex-col items-end justify-between h-full py-2 w-[70px]">
+                        <img src="/LotteryV2/img/play_megabet.png" class="h-[43px] w-[65px] object-contain drop-shadow-[0_8px_10px_rgba(0,0,0,0.5)] scale-110 origin-right mr-1 mt-2">
+                        <div class="w-full yellow-button text-center rounded-[8px] py-[3px] text-[10px] font-[900] px-2 z-20 active:scale-95 transition-transform mt-auto">@Lang.play</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+    </div>
+
+</div>
+
+<!-- Bottom Navbar shared component -->
+<partial name="_BottomNavbar" />

+ 210 - 0
website_natcash/Areas/LotteryV2/Views/Home/Index.cshtml

@@ -0,0 +1,210 @@
+@{
+    ViewData["Title"] = "LotteryV2 - Trang Chủ";
+}
+@using LotteryWebApp.Languages;
+@using LotteryWebApp.Controllers;
+@using LotteryWebApp.Common;
+
+<!-- Tailwind CSS isolated loaded specifically for this Page -->
+<script src="https://cdn.tailwindcss.com"></script>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+<link rel="stylesheet" href="/LotteryV2/css/site.css" />
+
+<div class="main-container animate__animated animate__fadeIn">
+    <div class="relative w-full flex flex-col items-center pt-3">
+        <a href="@Url.Action("ChooseApp", "Account", new { area = "" })" class="absolute left-4 top-4 z-20 w-10 h-10 bg-white/20 backdrop-blur-md rounded-full flex items-center justify-center text-white border border-white/20 hover:bg-white/30 transition-all shadow-lg active:scale-90">
+            <i class="fas fa-chevron-left text-lg"></i>
+        </a>
+
+        <!-- Logo -->
+        <div class="w-56 z-10 filter drop-shadow-md">
+            <img src="/LotteryV2/img/logo.png" alt="Logo" class="w-full h-auto object-contain">
+        </div>
+
+        <!-- Banner Illustration sits absolute layered or under -->
+        <div class="w-full -mt-12">
+            <img src="/LotteryV2/img/top_banner.png" alt="Top Banner" class="w-full h-auto object-cover">
+        </div>
+    </div>
+
+    <!-- Game List Section -->
+    <div class="px-3 -mt-24 relative z-30">
+        <div class="flex flex-col gap-3">
+            <!-- Game Card 1: Basic Pick 10 -->
+            <div class="relative w-full h-[120px] rounded-2xl overflow-hidden shadow-2xl transform active:scale-[0.98] transition-all duration-300 cursor-pointer animate__animated animate__slideInUp card-red" onclick="changeGame()">
+                <!-- 1. Premium Gradient Border -->
+                <div class="absolute inset-0 rounded-2xl border-[1.5px] border-white/40 pointer-events-none z-20"></div>
+
+                <!-- 2. Decorative Highlights -->
+                <img src="/LotteryV2/img/decorations/ellipse_1183.png" class="absolute -left-[80px] -top-[130px] w-[220px] h-[220px] pointer-events-none z-10 mix-blend-screen opacity-90 scale-y-[-1]" alt="highlight">
+                <img src="/LotteryV2/img/decorations/ellipse_1181.png" class="absolute -right-[60px] -top-[20px] w-[200px] h-[200px] pointer-events-none z-10 mix-blend-screen opacity-90" alt="highlight">
+
+                <div class="absolute inset-0 grid grid-cols-12 items-center px-3 z-20 gap-0">
+                    <!-- Left: Basic Pick + Ball (4 columns) -->
+                    <div class="col-span-4 flex items-center gap-1 pl-1">
+                        <div class="flex flex-col leading-none">
+                            <!-- <span class="text-white font-black italic text-[14px]">@Lang.Basic</span> -->
+                            <span class="text-yellow-400 font-black italic text-[22px] -mt-1 shadow-sm">@Lang.Pick</span>
+                        </div>
+                        <div class="w-8 h-8 bg-gradient-to-br from-yellow-300 to-yellow-500 rounded-full border-[2px] border-white flex items-center justify-center shadow-xl transform rotate-12 flex-shrink-0">
+                            <span class="text-red-700 font-black text-xl">10</span>
+                        </div>
+                    </div>
+
+                    <!-- Center: Jackpot info (4 columns) -->
+                    <div class="col-span-4 flex flex-col items-center justify-center text-center px-1">
+                        <div class="text-[10px] font-bold text-white mb-0.5 whitespace-nowrap opacity-90 leading-none uppercase">@Lang.jackpot_prize</div>
+                        <div class="flex items-start gap-0.5">
+                            <span class="text-[22px] font-black text-[#FBF3A7] leading-none" style="text-shadow: 0 4px 8px rgba(0,0,0,0.3)">1.000.000</span>
+                            <span class="text-[8px] font-bold text-white uppercase opacity-90 mt-1">HTG</span>
+                        </div>
+                        <div class="text-[10px] text-white/90 font-medium whitespace-nowrap mt-1">@Lang.next : <span class="font-black text-yellow-300 countdown-timer" data-target-hour="20">00:00:00</span></div>
+                    </div>
+
+                    <!-- Right: Action Section (4 columns) -->
+                    <div class="col-span-4 flex flex-col items-center justify-end h-full pb-4 relative cursor-pointer group">
+                        <img src="/LotteryV2/img/gold.png" alt="Chest" class="absolute bottom-[40px] w-16 h-18 object-contain filter drop-shadow-lg z-10 group-active:scale-95 transition-transform">
+                        <button class="bg-gradient-to-b from-yellow-300 to-white text-black font-black px-2 w-full max-w-[110px] py-1.5 rounded-[12px] text-[13px] shadow-xl border border-white/50 group-hover:brightness-110 group-active:scale-95 transition-all relative z-0" id="MEGA_LOTO_ID" value="@Constants.MEGA_LOTO_Pick10">@Lang.rule_play_now</button>
+                    </div>
+                </div>
+            </div>
+
+            <!-- Card 2 and 3 commented out by user previously -->
+            <!-- Game Card 2: Millions -->
+            <div class="card-blue relative w-full h-[120px] rounded-2xl overflow-hidden shadow-2xl transform active:scale-[0.98] transition-all duration-300 cursor-pointer animate__animated animate__slideInUp animate__delay-1s"
+                 onclick="goMillionsGameHome('@Constants.Millions_CODE')">
+                <!-- 1. Premium Gradient Border -->
+                <div class="absolute inset-0 rounded-2xl border-[1.5px] border-white/30 pointer-events-none z-20"></div>
+
+                <!-- 2. Decorative Highlights -->
+                <div class="absolute -left-[70px] -top-[108px] w-[193px] h-[193px] bg-gradient-to-br from-white/30 to-transparent rounded-full blur-3xl pointer-events-none"></div>
+
+                <div class="absolute inset-0 grid grid-cols-12 items-center px-3 z-20 gap-0 text-white">
+                    <!-- Left: Millionair text content (4 columns) -->
+                    <div class="col-span-4 flex items-center h-full relative pl-1 z-10">
+                        <img src="/LotteryV2/img/m1.png" alt="Icon" class="absolute left-[-2px] bottom-[-8px] h-[105px] object-contain z-10">
+                        
+                        <!-- 2 quả bóng trang trí -->
+                        <img src="/LotteryV2/img/ball_86.png" class="absolute left-[-12px] top-[15px] w-[32px] h-[32px] object-contain z-0 drop-shadow-md transform -rotate-[15deg]">
+                        <img src="/LotteryV2/img/ball_88.png" class="absolute left-[63px] top-[40px] w-[26px] h-[26px] object-contain z-0 drop-shadow-md transform rotate-[10deg]">
+                        
+                        <!-- Chấm bi trang trí -->
+                        <div class="absolute left-[38px] top-[18px] w-1.5 h-1.5 bg-[#fff04c] rounded-full z-20"></div>
+                        <div class="absolute left-[18px] bottom-[15px] w-[9px] h-[9px] bg-white rounded-full z-20"></div>
+                        <div class="absolute left-[45px] bottom-[22px] w-[6px] h-[6px] bg-white rounded-full z-20"></div>
+                        
+                        <div class="absolute left-[8px] bottom-[22px] z-30 text-[18px] font-black italic tracking-widest text-[#d5fbff] leading-none" style="text-shadow: -1.5px -1.5px 0 #00459c, 1.5px -1.5px 0 #00459c, -1.5px 1.5px 0 #00459c, 1.5px 1.5px 0 #00459c, 0px 3px 0px #002251, 0 4px 5px rgba(0,0,0,0.4);">
+                            @Lang.millionair
+                        </div>
+                    </div>
+
+                    <!-- Center: Jackpot info (4 columns) -->
+                    <div class="col-span-4 flex flex-col items-center justify-center text-center px-1">
+                        <div class="text-[10px] uppercase font-bold text-gray-200 mb-0.5 whitespace-nowrap opacity-90 leading-none">@Lang.jackpot_prize</div>
+                        <div class="flex items-start gap-0.5">
+                            <span class="text-[23px] font-black text-[#FBF3A7] leading-none" style="text-shadow: 0 4px 8px rgba(0,0,0,0.3)">30.000.000</span>
+                            <span class="text-[8px] font-bold text-white uppercase opacity-90 mt-1">HTG</span>
+                        </div>
+                        <div class="text-[10px] text-white/90 font-medium whitespace-nowrap mt-1">@Lang.next : <span class="font-black text-yellow-300 countdown-timer" data-target-hour="23">00:00:00</span></div>
+                    </div>
+
+                    <!-- Right: Action Section (4 columns) -->
+                    <div class="col-span-4 flex flex-col items-center justify-end h-full pb-3 relative px-1 group z-20">
+                        <!-- Ghép 2 ảnh: Dola xếp sau, Icon vàng xếp trước và căn giữa tuyệt đối theo nút -->
+                        <div class="absolute bottom-[30px] left-1/2 transform -translate-x-1/2 w-[70px] h-[72px] pointer-events-none group-active:scale-95 transition-transform z-10">
+                            <img src="/LotteryV2/img/millionair_guy.png" alt="Dola" class="absolute top-0 right-[-6px] w-[56px] h-[56px] object-contain filter drop-shadow-md z-0">
+                            <img src="/LotteryV2/img/play_millionair.png" alt="Money" class="absolute bottom-1 left-[-6px] w-[62px] h-[62px] object-contain filter drop-shadow-lg z-10">
+                        </div>
+                        
+                        <button class="bg-gradient-to-b from-[#ffef7c] via-[#fed444] to-[#fdb514] text-black font-black px-2 w-full max-w-[90px] py-[6px] rounded-full text-[14px] shadow-[0_4px_10px_rgba(0,0,0,0.25)] border-[1.5px] border-white/60 group-hover:brightness-110 group-active:scale-95 transition-all relative z-0 flex items-center justify-center"
+                                onclick="event.stopPropagation(); goMillionsGameHome('@Constants.Millions_CODE')">
+                            @Lang.rule_play_now
+                        </button>
+                    </div>
+                </div>
+            </div>
+
+            <!-- Game Card 3: Mega Bet - Blurred/Faded State -->
+            <div class="card-orange relative w-full h-[120px] rounded-2xl overflow-hidden shadow-md opacity-25 grayscale blur-[1px] pointer-events-none animate__animated animate__slideInUp animate__delay-2s">
+                <!-- 1. Premium Gradient Border -->
+                <div class="absolute inset-0 rounded-2xl border-[1.5px] border-white/20 pointer-events-none z-20"></div>
+
+                <!-- 2. Decorative Highlights -->
+                <div class="absolute -left-[70px] -top-[108px] w-[193px] h-[193px] bg-gradient-to-br from-white/30 to-transparent rounded-full blur-3xl pointer-events-none"></div>
+
+                <div class="absolute inset-0 grid grid-cols-12 items-center px-3 z-20 gap-0 text-white">
+                    <!-- Left: Mega Bet text content (4 columns) -->
+                    <div class="col-span-4 flex flex-col items-start justify-center pl-2">
+                        <div class="relative">
+                            <div class="text-[14px] font-black italic tracking-wider text-white">@Lang.MEGA</div>
+                            <div class="text-[15px] font-black italic tracking-wider text-red-200 -mt-1">@Lang.Bet</div>
+                            <div class="absolute left-10 top-1 flex shadow-lg">
+                                <span class="w-6 h-6 rounded-full bg-white text-gray-800 text-[11px] font-bold flex items-center justify-center border border-gray-300 -mr-1">88</span>
+                                <span class="w-6 h-6 rounded-full bg-red-500 text-white text-[11px] font-bold flex items-center justify-center border border-white">99</span>
+                            </div>
+                        </div>
+                    </div>
+
+                    <!-- Center: Jackpot info (4 columns) -->
+                    <div class="col-span-4 flex flex-col items-center justify-center text-center px-1">
+                        <div class="text-[10px] uppercase font-bold text-gray-200 mb-0.5 whitespace-nowrap opacity-90 leading-none">@Lang.jackpot_prize</div>
+                        <div class="flex items-start gap-0.5">
+                            <span class="text-[23px] font-black text-[#FBF3A7] leading-none" style="text-shadow: 0 4px 8px rgba(0,0,0,0.3)">800.000</span>
+                            <span class="text-[8px] font-bold text-white uppercase opacity-90 mt-1">HTG</span>
+                        </div>
+                        <div class="text-[10px] text-white/90 font-medium whitespace-nowrap mt-1">@Lang.next : <span class="font-black text-yellow-300 countdown-timer" data-target-hour="20">00:00:00</span></div>
+                    </div>
+
+                    <!-- Right: Action Section (4 columns) -->
+                    <div class="col-span-4 flex flex-col items-center justify-end h-full pb-4 relative px-1">
+                        <img src="/LotteryV2/img/illustration3.png" alt="Car" class="absolute bottom-[40px] w-16 h-18 object-contain filter drop-shadow-lg z-10 orientation-flip">
+                        <button class="bg-gradient-to-b from-yellow-300 to-white text-black font-black px-2 w-full max-w-[110px] py-1.5 rounded-[12px] text-[13px] shadow-xl border border-white/50 group-hover:brightness-110 group-active:scale-95 transition-all relative z-0">@Lang.rule_play_now</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+</div>
+<script>
+    function changeGame() {
+        var termType = $("#MEGA_LOTO_ID").val();
+        location.href = subDomain + '@Url.Action("GameHome", "Home", new { area = "LotteryV2" })?termType=' + termType;
+    }
+
+    function goMillionsGameHome(termType) {
+        location.href = subDomain + '@Url.Action("GameHome", "Home", new { area = "Millions" })?termType=' + termType;
+    }
+
+    function startCountdown() {
+        const timeZone = 'America/Port-au-Prince';
+        const timers = document.querySelectorAll('.countdown-timer');
+
+        // Server time string has no offset => must be interpreted in Haiti timezone
+        const serverTimeStr = '@Model.serverTime.ToString("yyyy-MM-ddTHH:mm:ss")';
+        const startBrowser = moment();
+        const baseServer = moment.tz(serverTimeStr, 'YYYY-MM-DDTHH:mm:ss', timeZone);
+
+        function update() {
+            const elapsedMs = moment().diff(startBrowser);
+            const now = baseServer.clone().add(elapsedMs, 'milliseconds'); // Haiti time
+
+            timers.forEach(t => {
+                const targetHour = parseInt(t.dataset.targetHour || '20', 10);
+                let target = now.clone().hour(targetHour).minute(0).second(0).millisecond(0);
+                if (now.isSameOrAfter(target)) target.add(1, 'day');
+
+                const dur = moment.duration(target.diff(now));
+                const h = Math.max(0, Math.floor(dur.asHours()));
+                const m = Math.max(0, dur.minutes());
+                const s = Math.max(0, dur.seconds());
+
+                t.innerText = `${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;
+            });
+        }
+
+        update();
+        setInterval(update, 1000);
+    }
+    document.addEventListener('DOMContentLoaded', startCountdown);
+</script>

+ 144 - 0
website_natcash/Areas/LotteryV2/Views/Home/More.cshtml

@@ -0,0 +1,144 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = "LotteryV2 - More";
+    ViewData["ActiveTab"] = "More";
+    Layout = "~/Areas/LotteryV2/Views/Shared/_Layout.cshtml";
+}
+@using LotteryWebApp.Languages;
+
+<script src="https://cdn.tailwindcss.com"></script>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+<link rel="stylesheet" href="/LotteryV2/css/site.css" />
+<link rel="stylesheet" href="/LotteryV2/css/more.css" />
+
+@functions {
+    public string FormatMoney(string amount) {
+        if (string.IsNullOrEmpty(amount)) return "0";
+        var clean = new string(amount.Where(c => char.IsDigit(c)).ToArray());
+        if (long.TryParse(clean, out long val)) {
+            return val.ToString("#,##0", new System.Globalization.CultureInfo("vi-VN")).Replace(",", ".");
+        }
+        return amount;
+    }
+}
+
+<div class="main-container animate__animated animate__fadeIn min-h-screen relative flex flex-col pb-24 overflow-x-hidden" style="background-color: #EAEAEA !important;">
+    
+    <!-- User Profile Header (Center Aligned, Red Background) -->
+    <div class="w-full bg-[#EE0033] flex flex-col items-center justify-center pt-8 pb-6 px-6 relative z-10 border-none m-0">
+        <!-- Avatar Ring -->
+        <div class="w-[88px] h-[88px] bg-[#EAEAEA] rounded-full flex items-center justify-center border-4 border-[#FFF9CB] shadow-lg mb-3 overflow-hidden">
+            <img src="/LotteryV2/img/avatar.png" class="w-full h-full object-cover" onerror="this.outerHTML='<i class=\'fa-solid fa-user text-gray-500 text-4xl\'></i>'" />
+        </div>
+        <!-- Info -->
+        <span class="font-bold text-lg text-white tracking-wide">@(Model?.profile?.fullName ?? "User")</span>
+        <span class="text-sm text-white font-medium tracking-wide mb-2">@(Model?.profile?.users ?? "0000000000")</span>
+
+        <!-- Coin Display (Matching GameHome aesthetic) -->
+        <div class="flex items-center gap-1.5 mt-1 bg-black/10 px-4 py-1 rounded-full border border-white/10 backdrop-blur-sm">
+            <img src="/LotteryV2/img/gold_coin.png" class="w-5 h-5 object-contain" onerror="this.style.display='none'" />
+            <span class="text-[22px] font-black text-[#FBF3A7]" style="text-shadow: 0 1px 2px rgba(0,0,0,0.2)">@FormatMoney(Model?.userStatus?.bet_coin)</span>
+            <span class="text-[10px] font-bold text-[#FBF3A7] uppercase mt-1.5">@Lang.v2_htg</span>
+        </div>
+    </div>
+
+    <!-- Menu List (White Full Container) -->
+    <div class="w-full bg-white flex flex-col px-6 pt-2 pb-6 relative z-10 m-0 border-none">
+        
+        <!-- Item: Winning Account
+        <div class="flex items-center justify-between py-[18px] border-b-2 border-dashed border-gray-100 cursor-pointer transition-colors active:bg-gray-50">
+            <div class="flex items-center gap-4">
+                <img src="/LotteryV2/img/gold_coin.png" class="w-6 h-6 object-contain" onerror="this.outerHTML='<i class=\'fa-solid fa-sack-dollar text-[#4A4A4A] text-[20px] w-6 text-center\'></i>'" />
+                <span class="text-[#212121] font-bold text-[13px]">@Lang.winning_account</span>
+            </div>
+            <span class="font-extrabold text-[15px] text-[#212121]">@(Model?.userStatus?.cash_coin ?? "0") HTG</span>
+        </div> -->
+
+        <!-- Item: Profile -->
+        <div class="flex items-center justify-between py-[18px] border-b-2 border-dashed border-gray-100 cursor-pointer transition-colors active:bg-gray-50" onclick="window.location.href='/LotteryV2/Home/Profile'">
+            <div class="flex items-center gap-4">
+                <i class="fa-regular fa-user text-[#4A4A4A] text-[20px] w-6 text-center"></i>
+                <span class="text-[#212121] font-bold text-[13px]">@Lang.profile</span>
+            </div>
+            <i class="fa-solid fa-chevron-right text-gray-400 text-sm opacity-80"></i>
+        </div>
+
+        <!-- Item: How to play Pick 10 
+        <div class="flex items-center justify-between py-[18px] border-b-2 border-dashed border-gray-100 cursor-pointer transition-colors active:bg-gray-50" onclick="window.location.href='/LotteryV2/Home/HowToPlay'">
+            <div class="flex items-center gap-4">
+                <i class="fa-regular fa-circle-question text-[#4A4A4A] text-[20px] w-6 text-center"></i>
+                <span class="text-[#212121] font-bold text-[13px]">@Lang.how_to_play_pick10</span>
+            </div>
+            <i class="fa-solid fa-chevron-right text-gray-400 text-sm opacity-80"></i>
+        </div>
+        -->
+
+        <!-- Item: Change Lang 
+        <div class="flex items-center justify-between py-[18px] border-b-2 border-dashed border-gray-100 cursor-pointer transition-colors active:bg-gray-50" onclick="toggleLanguage()">
+            <div class="flex items-center gap-4">
+                <i class="fa-solid fa-language text-[#1689FC] text-[22px] w-6 text-center shadow-blue-500 drop-shadow-sm"></i>
+                <span class="text-[#212121] font-bold text-[13px]">@Lang.change_language</span>
+            </div>
+            <i class="fa-solid fa-chevron-right text-gray-400 text-sm opacity-80"></i>
+        </div>
+        -->
+
+
+
+        <!-- Item: Contact Us -->
+        <div class="flex items-center justify-between py-[18px] cursor-pointer transition-colors active:bg-gray-50">
+            <div class="flex items-center gap-4">
+                <i class="fa-solid fa-phone-volume text-[#4A4A4A] text-[18px] w-6 text-center" style="transform: rotate(-15deg);"></i>
+                <span class="text-[#212121] font-bold text-[13px]">@Lang.contact_us</span>
+            </div>
+            <div class="flex items-center gap-3">
+                <span class="font-extrabold text-[15px] text-[#EE0033]">191</span>
+                <i class="fa-solid fa-chevron-right text-gray-400 text-sm opacity-80"></i>
+            </div>
+        </div>
+
+        <!-- Log out Button -->
+        <div class="mt-6 w-full px-1">
+            <a href="@Url.Action("Logout", "Home", new { area = "LotteryV2" })" class="w-full flex items-center justify-center bg-[#f00b39] text-white font-bold text-[18px] py-[14px] rounded-[10px] shadow-[0_5px_15px_rgba(238,0,51,0.2)] hover:bg-red-700 transition-colors cursor-pointer no-underline active:scale-95 duration-150">
+                @Lang.logout
+            </a>
+        </div>
+
+        <!-- Item: Change Language Flags -->
+        <div class="mt-8 flex items-center justify-center w-full px-1">
+            <div class="flex items-center gap-2 bg-gray-100 p-1.5 rounded-xl w-full">
+                @{
+                    var currentLang = System.Threading.Thread.CurrentThread.CurrentCulture.Name;
+                }
+                <a href="javascript:void(0)" onclick="setLanguage('fr')" class="flex flex-1 justify-center items-center gap-2 px-3 py-2 rounded-lg transition-all @(currentLang == "fr" ? "bg-white shadow-sm border border-gray-200" : "opacity-60 hover:opacity-100")">
+                    <img src="/img/en_flag.png" alt="English" class="w-7 h-auto drop-shadow-sm" />
+                    <span class="text-[13px] font-bold text-gray-700">English</span>
+                </a>
+                <a href="javascript:void(0)" onclick="setLanguage('en')" class="flex flex-1 justify-center items-center gap-2 px-3 py-2 rounded-lg transition-all @(currentLang != "fr" ? "bg-white shadow-sm border border-gray-200" : "opacity-60 hover:opacity-100")">
+                    <img src="/img/Flag_of_Haiti.png" alt="Natcom" class="w-7 h-auto drop-shadow-sm" />
+                    <span class="text-[13px] font-bold text-gray-700">Natcom</span>
+                </a>
+            </div>
+        </div>
+    </div>
+    
+    <!-- Real scalloped edge using CSS mask trick below the white box -->
+    <div class="w-full relative z-10 scalloped-bottom"></div>
+
+</div>
+
+<!-- Bottom Navbar shared component -->
+<partial name="_BottomNavbar" />
+
+<script>
+
+    function setLanguage(newLang) {
+        fetch(subDomain + '/Home/SetCulture?lang=' + newLang)
+            .then(response => {
+                location.reload();
+            })
+            .catch(error => {
+                location.reload();
+            });
+    }
+</script>

+ 243 - 0
website_natcash/Areas/LotteryV2/Views/Home/Profile.cshtml

@@ -0,0 +1,243 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = "LotteryV2 - Profile";
+    ViewData["ActiveTab"] = "More";
+    Layout = "~/Areas/LotteryV2/Views/Shared/_Layout.cshtml";
+}
+@using LotteryWebApp.Languages;
+
+<script src="https://cdn.tailwindcss.com"></script>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+<link rel="stylesheet" href="/LotteryV2/css/site.css" />
+
+<!-- Add custom font Bricolage Grotesque to match Figma styling -->
+<link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:wght@400;700;800&display=swap" rel="stylesheet">
+<!-- Flatpickr for premium calendar -->
+<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
+<script src="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.js"></script>
+<link rel="stylesheet" href="/LotteryV2/css/results.css" />
+<style>
+    .font-bricolage { font-family: 'Bricolage Grotesque', sans-serif; }
+</style>
+
+<div class="main-container animate__animated animate__fadeIn min-h-screen relative flex flex-col pb-24 font-bricolage" style="background-color: #EAEAEA !important;">
+    
+    <!-- Header (Red Background) - Fixed -->
+    <div class="fixed top-0 left-1/2 -translate-x-1/2 w-full max-w-[414px] bg-[#EE0033] h-[52px] flex items-center justify-between px-4 z-[100] shadow-sm">
+        <!-- Back Button -->
+        <button onclick="window.location.href='/LotteryV2/Home/More'" class="w-10 h-10 flex items-center justify-center -ml-2 rounded-full active:bg-white/20 transition-colors z-10 text-white">
+            <i class="fa-solid fa-arrow-left text-[24px]"></i>
+        </button>
+        <!-- Title -->
+        <div class="absolute inset-0 flex items-center justify-center pointer-events-none">
+            <span class="font-bold text-[32px] text-white tracking-wide">@Lang.profile</span>
+        </div>
+    </div>
+
+    <!-- Header Spacer (~52px) -->
+    <div class="h-[52px]"></div>
+
+    <!-- Content Form -->
+    <div class="w-full flex flex-col items-center px-5 py-6 gap-3 flex-1 overflow-x-hidden">
+        
+        <!-- Phone Number Field (Disabled State) -->
+        <div class="w-full flex flex-col gap-2">
+            <label class="font-bold text-[#534A4A] text-[14px]">@Lang.phone_number</label>
+            <div class="w-full bg-[#C9C9C9] rounded-[8px] h-[50px] px-3 flex items-center shadow-inner">
+                <span class="font-[800] text-[20px] text-black w-full tracking-wide">@(Model?.profile?.users ?? "509XXXXXXXX")</span>
+            </div>
+        </div>
+
+        <!-- Name Field -->
+        <div class="w-full flex flex-col gap-2 mt-2">
+            <label class="font-bold text-[#534A4A] text-[14px]">@Lang.name</label>
+            <div class="w-full bg-transparent border border-[#8F8F8F] rounded-[8px] h-[50px] px-3 flex items-center">
+                <input type="text" id="txtFullName" class="w-full bg-transparent font-[800] text-[20px] text-black outline-none tracking-wide" value="@(Model?.profile?.fullName ?? "User")" />
+            </div>
+        </div>
+
+        <div class="w-full flex flex-col gap-2 mt-2">
+            <label class="font-bold text-[#534A4A] text-[14px]">@Lang.dateOfBirth</label>
+            @{
+                string birthdayVal = Model?.profile?.birthday ?? "2000-01-01";
+                if (birthdayVal.Contains("/")) {
+                    try {
+                        var parts = birthdayVal.Split('/');
+                        if (parts.Length == 3) { birthdayVal = $"{parts[2]}-{parts[1]}-{parts[0]}"; }
+                    } catch { birthdayVal = "2000-01-01"; }
+                }
+            }
+            <div class="w-full bg-transparent rounded-[8px] flex items-center justify-between relative cursor-pointer" onclick="document.getElementById('txtBirthday')._flatpickr.open()">
+                <input type="text" id="txtBirthday" class="w-full bg-transparent font-[800] text-[20px] text-black outline-none tracking-wide flex-1" 
+                       value="@birthdayVal" readonly />
+                <i class="fa-regular fa-calendar text-[#534A4A] text-[20px] pointer-events-none absolute right-3"></i>
+            </div>
+        </div>
+
+
+        <!-- Update Button -->
+        <div class="w-full flex justify-center mt-8">
+            <button id="btnUpdateProfile" onclick="updateProfile(this)" class="w-[300px] max-w-full bg-[#EE0033] text-white font-[800] text-[20px] py-[10px] rounded-[12px] shadow-[0px_3px_8px_rgba(0,0,0,0.25)] hover:bg-red-700 active:scale-95 transition-all">
+                @Lang.update
+            </button>
+        </div>
+
+    </div>
+
+</div>
+
+<!-- Success Modal Overlay -->
+<div id="successModal" class="fixed inset-0 z-[100] flex items-center justify-center hidden px-6 translate-y-0" style="background: linear-gradient(135deg, #1A1A2E 0%, #16213E 100%);">
+    <div class="w-full max-w-[343px] min-h-[520px] bg-white rounded-[20px] overflow-hidden flex flex-col items-center p-8 animate__animated animate__zoomIn animate__faster">
+        <div class="w-full flex flex-col items-center mb-5 mt-4">
+            <div class="relative w-full max-w-[343px] flex items-center justify-center">
+                <img src="/LotteryV2/img/modal/success_header.png" class="w-[280px] h-auto object-contain" />
+            </div>
+        </div>
+        <div class="px-5 text-center mb-10 mt-5">
+            <p class="text-black font-[700] text-[20px] font-bricolage leading-tight">
+                @Lang.update_successful
+            </p>
+        </div>
+        <div class="w-full mt-auto">
+            <button onclick="closeModalAndReload('/LotteryV2/Home/More')" class="w-full bg-[#EE0033] text-white font-[800] text-[20px] py-[10px] rounded-[12px] shadow-[0px_3px_8px_rgba(0,0,0,0.25)] hover:bg-red-700 active:scale-95 transition-all font-bricolage">
+                @Lang.back_to_homepage
+            </button>
+        </div>
+    </div>
+</div>
+
+<!-- Failure Modal Overlay -->
+<div id="failureModal" class="fixed inset-0 z-[100] flex items-center justify-center hidden px-6 translate-y-0" style="background: linear-gradient(135deg, #1A1A2E 0%, #16213E 100%);">
+    <div class="w-full max-w-[343px] min-h-[520px] bg-white rounded-[20px] overflow-hidden flex flex-col items-center p-8 animate__animated animate__zoomIn animate__faster">
+        <div class="w-full flex flex-col items-center mb-8 mt-10">
+            <div class="relative w-full max-w-[343px] flex items-center justify-center">
+                <img src="/LotteryV2/img/modal/fail_icon.png" class="w-[200px] h-auto object-contain" />
+            </div>
+        </div>
+        <div class="px-5 text-center mb-10 mt-5">
+            <p id="failErrorMessage" class="text-black font-[700] text-[20px] font-bricolage leading-tight">
+                @Lang.update_profile_error
+            </p>
+        </div>
+        <div class="w-full mt-auto">
+            <button onclick="closeFailureModal()" class="w-full bg-[#EE0033] text-white font-[800] text-[20px] py-[10px] rounded-[12px] shadow-[0px_3px_8_rgba(0,0,0,0.25)] hover:bg-red-700 active:scale-95 transition-all font-bricolage">
+                @Lang.try_again
+            </button>
+        </div>
+    </div>
+</div>
+
+<partial name="_BottomNavbar" />
+
+<script>
+
+    function initBrandedFlatpickr(selector, yearStart, yearEnd) {
+        flatpickr(selector, {
+            dateFormat: "Y-m-d",
+            altInput: true,
+            altFormat: "d/m/Y",
+            altInputClass: "w-full bg-transparent font-[800] text-[20px] text-black outline-none tracking-wide cursor-pointer",
+            disableMobile: true,
+            monthSelectorType: "dropdown",
+            onReady: function (selectedDates, dateStr, instance) {
+                const yearInput = instance.calendarContainer.querySelector(".numInput.cur-year");
+                if (yearInput) {
+                    const yearSelect = document.createElement("select");
+                    yearSelect.className = "flatpickr-monthDropdown-months cur-year-select";
+                    yearSelect.style.cssText = "appearance:none; font-weight:800; border:none; background:transparent; color:white; cursor:pointer; margin-left:4px; outline:none; font-family:inherit; font-size:inherit;";
+
+                    for (let y = yearEnd; y >= yearStart; y--) {
+                        const opt = document.createElement("option");
+                        opt.value = y;
+                        opt.text = y;
+                        opt.style.color = "#333";
+                        if (y === instance.currentYear) opt.selected = true;
+                        yearSelect.appendChild(opt);
+                    }
+
+                    yearSelect.addEventListener("change", function () {
+                        instance.changeYear(parseInt(this.value));
+                    });
+
+                    yearInput.style.display = "none";
+                    yearInput.parentNode.appendChild(yearSelect);
+                    
+                    instance.set("onChange", function(d, s, i) {
+                        yearSelect.value = i.currentYear;
+                    });
+                }
+            }
+        });
+    }
+
+    document.addEventListener('DOMContentLoaded', function() {
+        initBrandedFlatpickr("#txtBirthday", 1940, 2026);
+    });
+
+    function updateProfile(btn) {
+        var fullName = $("#txtFullName").val();
+        var birthday = $("#txtBirthday").val(); 
+
+        if (fullName == "") {
+            showFailureModal("@Lang.enter_name");
+            return;
+        }
+
+        // Prevent double-click
+        var $btn = $(btn);
+        var originalText = $btn.html();
+        $btn.prop('disabled', true).html('<i class="fa-solid fa-spinner fa-spin mr-2"></i> ...');
+
+        $.ajax({
+            url: subDomain + "/LotteryV2/Home/UserUpdateProfile",
+            type: "POST",
+            data: {
+                fullName: fullName,
+                birthday: birthday
+            },
+            success: function (response) {
+                $btn.prop('disabled', false).html(originalText);
+                if (response.status == "0") {
+                    showSuccessModal();
+                } else {
+                    showFailureModal(response.message || "Update failed", response.status);
+                }
+            },
+            error: function (error) {
+                $btn.prop('disabled', false).html(originalText);
+                showFailureModal("An error occurred during network request");
+            }
+        });
+    }
+
+    function showSuccessModal() {
+        $("#successModal").removeClass("hidden").addClass("flex");
+    }
+
+    var systemUpgrading = false;
+    function showFailureModal(message, code) {
+        $("#failErrorMessage").text(message);
+        const $btn = $("#failureModal button");
+        if (code === "-2" || (message && message.includes("System is upgrading"))) {
+            systemUpgrading = true;
+            $btn.text("@Lang.login");
+        } else {
+            systemUpgrading = false;
+            $btn.text("@Lang.try_again");
+        }
+        $("#failureModal").removeClass("hidden").addClass("flex");
+    }
+
+    function closeModalAndReload(url) {
+        $("#successModal").addClass("hidden").removeClass("flex");
+        window.location.href = url;
+    }
+
+    function closeFailureModal() {
+        $("#failureModal").addClass("hidden").removeClass("flex");
+        if (systemUpgrading) {
+            window.location.href = subDomain + "/Account/Login";
+        }
+    }
+</script>

+ 232 - 0
website_natcash/Areas/LotteryV2/Views/Home/Results.cshtml

@@ -0,0 +1,232 @@
+@model LotteryWebApp.Models.TermResultHistoryModel
+@{
+    ViewData["Title"] = "LotteryV2 - Results History";
+    Layout = "~/Areas/LotteryV2/Views/Shared/_Layout.cshtml";
+    ViewData["ActiveTab"] = "Results";
+
+    // Default to last 3 days if not specified
+    if (string.IsNullOrEmpty(Model.fromDate)) {
+        Model.fromDate = DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd");
+    }
+    if (string.IsNullOrEmpty(Model.toDate)) {
+        Model.toDate = DateTime.Now.ToString("yyyy-MM-dd");
+    }
+}
+@using LotteryWebApp.Languages;
+@using LotteryWebApp.Common;
+
+
+@section Styles {
+    <script src="https://cdn.tailwindcss.com"></script>
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+    <!-- Flatpickr for premium calendar -->
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
+    <script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
+    <link rel="stylesheet" href="/LotteryV2/css/site.css" />
+    <link rel="stylesheet" href="/LotteryV2/css/results.css" />
+}
+
+<div class="main-container results-container animate__animated animate__fadeIn pb-40 relative mx-auto max-w-[414px] shadow-2xl min-h-screen bg-white">
+    <!-- Header Group: Sticky at Top -->
+    <div class="sticky top-0 w-full z-[100] bg-[#F3F4F6] pb-2 shadow-md">
+        <!-- Header: Matches Figma (Right Image) -->
+        <div class="results-top-header">
+            <a href="javascript:history.back()" class="back-btn">
+                <i class="fas fa-arrow-left"></i>
+            </a>
+            <h1 class="font-bricolage">@Lang.results</h1>
+        </div>
+
+        <!-- Selection Bar: Side-by-side dates and search -->
+        <div class="selection-bar bg-white/50 backdrop-blur-sm px-4 pt-2 pb-2">
+            <div class="flex gap-3">
+                <div class="date-pick-input flex-1 cursor-pointer relative bg-white border border-gray-200 rounded-lg p-2 flex items-center gap-2">
+                    <img src="/LotteryV2/img/icon_calendar.svg" class="w-5 h-5" />
+                    <input type="text" id="fromDate" value="@Model.fromDate" class="bg-transparent border-none outline-none font-bold text-[13px] w-full ml-1 cursor-pointer" readonly />
+                    <i class="fas fa-caret-down text-gray-400"></i>
+                </div>
+                <div class="date-pick-input flex-1 cursor-pointer relative bg-white border border-gray-200 rounded-lg p-2 flex items-center gap-2">
+                    <img src="/LotteryV2/img/icon_calendar.svg" class="w-5 h-5" />
+                    <input type="text" id="toDate" value="@Model.toDate" class="bg-transparent border-none outline-none font-bold text-[13px] w-full ml-1 cursor-pointer" readonly />
+                    <i class="fas fa-caret-down text-gray-400"></i>
+                </div>
+                <button id="btnSearch" class="btn-search-red !w-12 !h-12 flex items-center justify-center bg-[#EE0033] text-white rounded-xl shadow-md" onclick="triggerSearch()">
+                    <i class="fas fa-search"></i>
+                </button>
+            </div>
+        </div>
+
+        <!-- Red Separator Line -->
+        <div class="px-4 mt-1">
+            <div class="h-[2px] bg-gradient-to-r from-transparent via-[#EE0033] to-transparent rounded-full opacity-40"></div>
+        </div>
+    </div>
+
+    <!-- Result List Container -->
+    <div id="results-list-container" class="results-items-list px-4 min-h-[300px]">
+        <!-- Content will be loaded via JS for all 3 games -->
+        <div class="flex flex-col items-center justify-center py-20 text-gray-400">
+             <i class="fas fa-circle-notch fa-spin text-3xl mb-2"></i>
+             <span>Loading results...</span>
+        </div>
+    </div>
+
+    <!-- Bottom Promo Bar (Matches Bottom message with yellow text) -->
+    <div class="fixed bottom-[82px] left-1/2 -translate-x-1/2 w-full min-[600px]:max-w-[414px] bg-[#EE0033] text-white py-2 text-center text-[12px] font-bold tracking-wide z-40 flex flex-col items-center justify-center overflow-hidden h-auto shadow-md">
+         <div class="flex flex-col items-center w-full animate-slide-up">
+              <div class="opacity-90">@Lang.have_chance_to_get</div>
+              <div class="text-[18px] font-black text-[#FBF3A7] mt-0.5">@Lang.jackpot_today_htg</div>
+         </div>
+    </div>
+
+    <!-- Shared Bottom Navbar -->
+    <div class="fixed bottom-0 left-0 w-full z-50">
+         <div class="mx-auto max-w-[414px]">
+             <partial name="_BottomNavbar" />
+         </div>
+    </div>
+
+    <!-- Custom Notification Modal -->
+    <div id="notificationModal" class="fixed inset-0 z-[300] flex items-center justify-center hidden px-6 font-bricolage" style="background: linear-gradient(135deg, rgba(26, 26, 46, 0.9) 0%, rgba(22, 33, 62, 0.9) 100%);">
+        <div class="w-full max-w-[343px] min-h-[420px] bg-white rounded-[24px] overflow-hidden flex flex-col items-center p-8 animate__animated animate__zoomIn animate__faster shadow-2xl border border-white/50">
+            <div class="w-full flex justify-center mb-8 mt-4">
+                <img src="/LotteryV2/img/modal/fail_icon.png" class="w-[160px] h-auto object-contain" alt="Notificaton icon" />
+            </div>
+            <div class="px-2 text-center mb-10 flex-1 flex items-center justify-center">
+                <p id="notificationMessage" class="text-black font-[800] text-[20px] leading-snug"></p>
+            </div>
+            <div class="w-full">
+                <button onclick="closeNotificationModal()" class="w-full bg-[#EE0033] text-white font-[800] text-[18px] py-[12px] rounded-[16px] shadow-lg active:scale-95 transition-all">
+                    @Lang.login
+                </button> 
+            </div>
+        </div>
+    </div>
+</div>
+
+@section Scripts {
+    <script>
+        const gameConfigs = [
+            { code: '@Constants.PIC10_BASIC_CODE', name: '@Lang.rule_classic_pick_10', color: '#EE0033' },
+            { code: '@Constants.PIC10_BIGSMALL_CODE', name: '@Lang.bigsmall', color: '#26A31E' },
+            { code: '@Constants.PIC10_ODDEVEN_CODE', name: '@Lang.oddeven', color: '#B529E9' }
+        ];
+
+        function initBrandedFlatpickr(selector, yearStart, yearEnd) {
+            const inputEl = document.querySelector(selector);
+            const wrapper = inputEl.closest('.date-pick-input');
+            
+            flatpickr(selector, {
+                dateFormat: "Y-m-d",
+                altInput: true,
+                altFormat: "M d, Y",
+                altInputClass: "bg-transparent border-none outline-none font-bold text-[13px] w-full ml-1 cursor-pointer",
+                disableMobile: true,
+                monthSelectorType: "dropdown",
+                appendTo: wrapper,
+                onReady: function (selectedDates, dateStr, instance) {
+                    instance.calendarContainer.style.zIndex = "9999";
+                    const yearInput = instance.calendarContainer.querySelector(".numInput.cur-year");
+                    if (yearInput) {
+                        const yearSelect = document.createElement("select");
+                        yearSelect.className = "flatpickr-monthDropdown-months cur-year-select";
+                        yearSelect.style.cssText = "appearance:none; font-weight:800; border:none; background:transparent; color:white; cursor:pointer; margin-left:4px; outline:none; font-family:inherit; font-size:inherit;";
+                        for (let y = yearEnd; y >= yearStart; y--) {
+                            const opt = document.createElement("option");
+                            opt.value = y;
+                            opt.text = y;
+                            opt.style.color = "#333";
+                            if (y === instance.currentYear) opt.selected = true;
+                            yearSelect.appendChild(opt);
+                        }
+                        yearSelect.addEventListener("change", function () {
+                            instance.changeYear(parseInt(this.value));
+                        });
+                        yearInput.style.display = "none";
+                        yearInput.parentNode.appendChild(yearSelect);
+                    }
+                }
+            });
+        }
+
+        document.addEventListener('DOMContentLoaded', function() {
+            initBrandedFlatpickr("#fromDate", 2020, 2030);
+            initBrandedFlatpickr("#toDate", 2020, 2030);
+            triggerSearch(); // Initial load for all games
+        });
+
+        var systemUpgrading = false;
+        function showNotification(message, code) {
+            $("#notificationMessage").text(message);
+            const $btn = $("#notificationModal button");
+            if (code === "-2" || (message && message.includes("System is upgrading"))) {
+                systemUpgrading = true;
+                $btn.text("@Lang.login");
+            } else {
+                systemUpgrading = false;
+                $btn.text("OK");
+            }
+            $("#notificationModal").removeClass("hidden").addClass("flex");
+        }
+
+        function closeNotificationModal() {
+            $("#notificationModal").addClass("hidden").removeClass("flex");
+            if (systemUpgrading) {
+                window.location.href = subDomain + "/Account/Login";
+            }
+        }
+
+        async function triggerSearch() {
+            const fromDate = document.getElementById("fromDate").value;
+            const toDate = document.getElementById("toDate").value;
+            const btn = document.getElementById("btnSearch");
+            const container = document.getElementById("results-list-container");
+
+            btn.disabled = true;
+            btn.innerHTML = '<i class="fas fa-spinner fa-spin"></i>';
+            container.style.opacity = "0.7";
+
+            try {
+                // Call the new grouped endpoint
+                const response = await fetch(`${subDomain}/LotteryV2/Home/TermResultHistoryGrouped?fromDate=${fromDate}&toDate=${toDate}`);
+                if (!response.ok) throw new Error('Network response was not ok');
+                
+                const html = await response.text();
+                
+                try {
+                    const json = JSON.parse(html);
+                    if (json.responseCode === "-2" || (json.responseMessage && json.responseMessage.includes("System is upgrading"))) {
+                        showNotification(json.responseMessage || "System is upgrading", "-2");
+                        return;
+                    }
+                } catch (e) {
+                    // Not JSON, likely HTML partial
+                }
+
+                if (html.trim() === "") {
+                    container.innerHTML = `
+                        <div class="w-full py-20 flex flex-col items-center justify-center text-gray-400 opacity-60">
+                            <i class="fas fa-search text-5xl mb-4"></i>
+                            <p class="font-bold">@Lang.no_results_found</p>
+                        </div>
+                    `;
+                } else {
+                    container.innerHTML = html;
+                }
+            } catch (error) {
+                console.error("Error loading grouped results:", error);
+                
+                // Check if the error response is JSON and has code -2
+                if (error.message && (error.message.includes("System is upgrading") || error.message.includes("-2"))) {
+                    showNotification(error.message, "-2");
+                } else {
+                    container.innerHTML = `<div class="text-center py-10 text-red-500 font-bold">Error loading results. Please try again.</div>`;
+                }
+            }
+
+            container.style.opacity = "1";
+            btn.disabled = false;
+            btn.innerHTML = '<i class="fas fa-search"></i>';
+        }
+    </script>
+}

+ 543 - 0
website_natcash/Areas/LotteryV2/Views/Home/Rule.cshtml

@@ -0,0 +1,543 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = "LotteryV2 - @Lang.rule_title";
+    ViewData["ActiveTab"] = "Rule";
+    Layout = "~/Areas/LotteryV2/Views/Shared/_Layout.cshtml";
+}
+@using LotteryWebApp.Languages;
+
+<script src="https://cdn.tailwindcss.com"></script>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+<link rel="stylesheet" href="/LotteryV2/css/site.css" />
+<link rel="stylesheet" href="/LotteryV2/css/rule.css" />
+
+<!-- Add custom font Bricolage Grotesque to match Figma styling -->
+<link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:wght@400;700;800;900&display=swap" rel="stylesheet">
+
+<div class="main-container animate__animated animate__fadeIn h-screen relative flex flex-col font-bricolage overflow-hidden" style="background-color: #F5F5F5 !important;">
+    
+    <!-- Fixed Header & Tabs Group -->
+    <div class="fixed top-0 left-0 md:left-1/2 md:-translate-x-1/2 w-full md:max-w-[414px] z-[100] bg-white shadow-md">
+        <!-- Header Block (Red) -->
+        <div class="w-full bg-[#EE0033] h-[52px] flex items-center justify-between px-4 relative">
+            <!-- Back Button -->
+            <button onclick="window.history.back()" class="w-10 h-10 flex items-center justify-center -ml-2 rounded-full active:bg-white/20 transition-colors z-10 text-white cursor-pointer">
+                <i class="fa-solid fa-arrow-left text-[20px]"></i>
+            </button>
+            <!-- Title -->
+            <div class="absolute inset-0 flex items-center justify-center pointer-events-none">
+                <span class="text-white text-[24px] font-bold tracking-wide drop-shadow-sm">@Lang.rule_title</span>
+            </div>
+        </div>
+
+        <!-- Tabs Block Container -->
+        <div class="w-full bg-white flex items-center justify-between px-2 pt-3 pb-1 relative shadow-sm transition-all border-b border-gray-100">
+            <!-- Tab 1 -->
+            <div class="flex flex-col items-center gap-1 cursor-pointer flex-1 group" onclick="switchFAQTab('basic')">
+                <span id="tab-basic-label" class="text-[14px] font-bold text-[#534A4A] transition-colors whitespace-nowrap">@Lang.rule_classic_pick_10</span>
+                <div id="tab-basic-bar" class="w-full h-[3px] bg-[#EE0033] mt-1 drop-shadow-sm transition-all rounded-t-sm"></div>
+            </div>
+
+            <!-- Tab 2 -->
+            <div class="flex flex-col items-center gap-1 cursor-pointer flex-1 group relative" onclick="switchFAQTab('smallbig')">
+                <div class="flex flex-col items-center leading-tight">
+                    <span id="tab-smallbig-label" class="text-[14px] font-bold text-[#909090] transition-colors whitespace-nowrap">@Lang.rule_big_small</span>
+                    <span id="tab-smallbig-desc" class="text-[12px] text-[#909090] font-normal whitespace-nowrap transition-colors">@Lang.rule_13_numbers_game</span>
+                </div>
+                <div id="tab-smallbig-bar" class="w-full h-0.5 bg-transparent mt-1 transition-all"></div>
+            </div>
+
+            <!-- Tab 3 -->
+            <div class="flex flex-col items-center gap-1 cursor-pointer flex-1 group" onclick="switchFAQTab('oddeven')">
+                <div class="flex flex-col items-center leading-tight">
+                    <span id="tab-oddeven-label" class="text-[14px] font-bold text-[#909090] transition-colors whitespace-nowrap">@Lang.rule_odd_even</span>
+                    <span id="tab-oddeven-desc" class="text-[12px] text-[#909090] font-normal whitespace-nowrap transition-colors">@Lang.rule_15_numbers_game</span>
+                </div>
+                <!-- Indicator Bar -->
+                <div id="tab-oddeven-bar" class="w-full h-0.5 bg-transparent mt-1 transition-all"></div>
+            </div>
+        </div>
+    </div>
+
+    <!-- Main Scrollable Area -->
+    <div class="flex-grow overflow-y-auto mt-[96px] pb-32 custom-scrollbar px-4" id="rule-scroll-container">
+        <div class="max-w-[380px] mx-auto"> <!-- Wrapper to shrink content width -->
+
+            <!-- Active Tab Content -->
+            <div id="tab-content-basic" class="w-full animate__animated animate__fadeIn">
+                
+                <div class="rule-header-red">@Lang.rule_general_info</div>
+                
+                <div class="rule-table-grid pb-2">
+                    <div class="font-[800]">@Lang.rule_item</div>
+                    <div class="font-[800]">@Lang.rule_regulation_draw</div>
+                    
+                    <div>@Lang.rule_time</div>
+                    <div>@Lang.rule_20_30_daily</div>
+                    
+                    <div>@Lang.rule_ticket_closure</div>
+                    <div>@Lang.rule_20_00_daily</div>
+                    
+                    <div>@Lang.rule_total_numbers</div>
+                    <div>@Lang.rule_01_80</div>
+        
+                    <div>@Lang.rule_numbers_drawn</div>
+                    <div>@Lang.rule_20_per_draw</div>
+        
+                    <div>@Lang.rule_purchase_channels</div>
+                    <div>@Lang.rule_ussd_web_app</div>
+        
+                    <div>@Lang.rule_result_channel</div>
+                    <div>@Lang.rule_web_app</div>
+        
+                    <div>@Lang.rule_duplicate_allowed</div>
+                    <div>@Lang.rule_yes</div>
+        
+                    <div>@Lang.rule_identical_allowed</div>
+                    <div>@Lang.rule_yes</div>
+                </div>
+        
+                <div class="rule-header-red">@Lang.rule_game_1_title</div>
+        
+                <!-- Card Mockup inside Rule -->
+                <div class="play-card bg-[#E11D48] relative mx-3 mt-4 mb-4 h-[90px] rounded-2xl overflow-hidden border border-white/20 shadow-lg cursor-pointer transition-all active:scale-[0.98]" onclick="window.location.href='/LotteryV2/Home/GameHome'">
+                    <!-- 1. Design-accurate Staggered Ellipses -->
+                    <img src="/LotteryV2/img/decorations/ellipse_1183.png" class="absolute -left-[60px] -top-[100px] w-[180px] h-[180px] pointer-events-none z-10 mix-blend-screen opacity-90 scale-y-[-1]" alt="highlight">
+                    <img src="/LotteryV2/img/decorations/ellipse_1181.png" class="absolute -right-[50px] -top-[20px] w-[160px] h-[160px] pointer-events-none z-10 mix-blend-screen opacity-90" alt="highlight">
+
+                    <div class="w-full h-full flex items-center justify-between pl-3 pr-2 relative z-10">
+                        <div class="flex flex-col items-center justify-center pt-2">
+                            <span class="text-[14px] font-black italic text-white drop-shadow-md leading-[1.1] text-center" style="font-family: 'Montserrat', sans-serif;">@Html.Raw(Lang.rule_basic_pick)</span>
+                            <img src="/LotteryV2/img/ball_10.png" class="w-7 h-7 object-contain drop-shadow-md -mt-2 -mr-8 border-2 border-[#E11D48] rounded-full bg-[#E11D48]">
+                        </div>
+        
+                        <div class="flex flex-col items-center mt-0.5 ml-4">
+                            <span class="text-[10px] font-[800] text-white tracking-widest uppercase drop-shadow">@Lang.rule_jackpot_prize</span>
+                            <div class="flex items-start gap-1 mt-0.5">
+                                <span class="text-[28px] font-[900] text-white leading-none tracking-tight drop-shadow-md">100.000</span>
+                                <span class="text-[7px] font-[800] text-white bg-transparent border border-white/60 rounded px-[2px] mt-1 shadow-sm leading-tight">HTG</span>
+                            </div>
+                            <div class="text-[9px] text-white/90 mt-0.5">@Lang.rule_next_round <span class="font-[900] text-white ml-0.5 drop-shadow">05:00</span></div>
+                        </div>
+        
+                        <div class="flex flex-col items-center justify-center h-full py-2 w-[80px] gap-1">
+                            <img src="/LotteryV2/img/play_chest.png" class="h-[46px] w-auto object-contain drop-shadow-lg">
+                            <div class="w-full yellow-button text-center rounded-[10px] py-[4px] text-[10px] font-[900] px-2 z-20 active:scale-95 transition-transform text-[#212121] border-2 border-white shadow-lg" style="background: linear-gradient(180deg, #FFE95B 0%, #ECA600 100%);">@Lang.rule_play_now</div>
+                        </div>
+                    </div>
+                </div>
+        
+                <!-- @Lang.rule_how_to_play Section -->
+                <div class="rule-section-title">
+                    <span class="icon">&#9670;</span> @Lang.rule_how_to_play
+                </div>
+                
+                <div class="rule-table-grid desc-grid pb-4">
+                    <div class="font-[800]">@Lang.rule_item</div>
+                    <div class="font-[800]">@Lang.rule_description</div>
+                    
+                    <div>@Lang.rule_ticket_price</div>
+                    <div>@Lang.rule_10_htg</div>
+                    
+                    <div>@Lang.rule_selection_method</div>
+                    <div>@Html.Raw(Lang.rule_choose_10)</div>
+                    
+                    <div>@Lang.rule_winning_rule</div>
+                    <div>@Html.Raw(Lang.rule_10_taken_from)</div>
+                    
+                    <div>Drawn numbers as the<br>official</div>
+                    <div></div>
+        
+                    <div>@Lang.rule_objective</div>
+                    <div>@Lang.rule_match_as_many</div>
+                </div>
+        
+                <!-- @Lang.rule_jackpot_rule Section -->
+                <div class="rule-section-title mt-2">
+                    <span class="icon">&#9670;</span> @Lang.rule_jackpot_rule
+                </div>
+        
+                <div class="flex justify-center mt-4 mb-4">
+                     <img src="/LotteryV2/img/play_chest.png" class="h-[120px] object-contain drop-shadow-xl" alt="Chest" />
+                </div>
+        
+                <div class="text-[11px] font-semibold text-[#212121] px-3 mb-3">@Html.Raw(Lang.rule_match_all_10)</div>
+                
+                <div class="px-3 flex flex-wrap gap-2 mb-4 justify-start">
+                    <div class="ball-green">1</div>
+                    <div class="ball-green">4</div>
+                    <div class="ball-green">5</div>
+                    <div class="ball-green">12</div>
+                    <div class="ball-green">24</div>
+                    <div class="ball-green">28</div>
+                    <div class="ball-green">30</div>
+                    <div class="ball-green">37</div>
+                    <div class="ball-green">46</div>
+                    <div class="ball-green">49</div>
+                </div>
+        
+                <div class="rule-table-grid pb-2">
+                    <div class="font-[800]">@Lang.rule_condition</div>
+                    <div class="font-[800]">@Lang.rule_prize_pool</div>
+                    
+                    <div>@Html.Raw(Lang.rule_if_le_10)</div>
+                    <div>@Html.Raw(Lang.rule_each_receives)</div>
+                    
+                    <div class="mt-2">@Html.Raw(Lang.rule_if_gt_10)</div>
+                    <div class="mt-2">@Html.Raw(Lang.rule_shared_equally)</div>
+                </div>
+        
+                <!-- @Lang.rule_standard_prize -->
+                <div class="rule-section-title mt-4">
+                    <span class="icon">&#9670;</span> @Lang.rule_standard_prize
+                </div>
+        
+                <div class="rule-table-grid pb-2">
+                    <div class="font-[800]">@Lang.rule_numbers_matches</div>
+                    <div class="font-[800]">@Lang.rule_prize_pool_htg</div>
+                    
+                    <div>9</div>
+                    <div>@Html.Raw(Lang.rule_prize_12k)</div>
+                    
+                    <div>8</div>
+                    <div>@Html.Raw(Lang.rule_prize_600)</div>
+                    
+                    <div>7</div>
+                    <div>@Html.Raw(Lang.rule_prize_160)</div>
+                    
+                    <div>6</div>
+                    <div>@Html.Raw(Lang.rule_prize_20)</div>
+                    
+                    <div>5</div>
+                    <div>@Html.Raw(Lang.rule_prize_5)</div>
+                </div>
+        
+            </div>
+        
+            <!-- Active Tab Content: Big / Small -->
+            <div id="tab-content-smallbig" class="w-full animate__animated animate__fadeIn hidden">
+                <div class="rule-header-red" style="background-color: #0BA01A;">@Html.Raw(Lang.rule_bs_winning_rule)</div>
+        
+                <div class="rule-section-title mt-2">
+                    <span class="icon">&#9670;</span> @Lang.rule_how_to_win
+                </div>
+                <ul class="bullet-list mb-4">
+                    <li>@Lang.rule_buy_big_small</li>
+                    <li>@Lang.rule_system_check_20</li>
+                </ul>
+        
+                <!-- Big/Small Play Card Mockup -->
+                <div class="play-card bg-[#0A9800] relative mx-3 mt-4 mb-4 h-[90px] rounded-2xl overflow-hidden border border-white/20 shadow-lg cursor-pointer transition-all active:scale-[0.98]" onclick="window.location.href='/LotteryV2/Home/GameHome'">
+                    <!-- 1. Design-accurate Staggered Ellipses -->
+                    <img src="/LotteryV2/img/decorations/ellipse_1183.png" class="absolute -left-[60px] -top-[100px] w-[180px] h-[180px] pointer-events-none z-10 mix-blend-screen opacity-80 scale-y-[-1]" alt="highlight">
+                    <img src="/LotteryV2/img/decorations/ellipse_1181.png" class="absolute -right-[50px] -top-[20px] w-[160px] h-[160px] pointer-events-none z-10 mix-blend-screen opacity-80" alt="highlight">
+
+                    <div class="w-full h-full flex items-center justify-between pl-3 pr-2 relative z-10">
+                        <div class="flex flex-col items-center justify-center">
+                            <img src="/LotteryV2/img/small_big_logo.png" class="h-12 object-contain drop-shadow-md -mt-1" alt="Small Big Logo">
+                        </div>
+        
+                        <div class="flex flex-col items-center mt-0.5 ml-2">
+                            <span class="text-[10px] font-bold text-white tracking-widest uppercase drop-shadow">@Lang.rule_bs_prize</span>
+                            <div class="flex items-start gap-1 mt-0.5">
+                                <span class="text-[28px] font-[900] text-white leading-none tracking-tight drop-shadow-md">100</span>
+                                <span class="text-[7px] font-[800] text-white bg-transparent border border-white/60 rounded px-[2px] mt-1 shadow-sm leading-tight">HTG</span>
+                            </div>
+                            <div class="text-[9px] text-white/90 mt-0.5">@Lang.rule_next_round <span class="font-[900] text-white ml-0.5 drop-shadow">05:00</span></div>
+                        </div>
+        
+                        <div class="flex flex-col items-center justify-center h-full py-2 w-[80px] gap-1">
+                            <img src="/LotteryV2/img/money_bag_small.png" class="h-[46px] w-auto object-contain drop-shadow-lg">
+                            <div class="w-full yellow-button text-center rounded-[10px] py-[4px] text-[10px] font-[900] px-2 z-20 active:scale-95 transition-transform text-[#212121] border-2 border-white shadow-lg" style="background: linear-gradient(180deg, #FFE95B 0%, #ECA600 100%);">@Lang.rule_play_now</div>
+                        </div>
+                    </div>
+                </div>
+        
+                <div class="rule-section-title mt-4">
+                    <span class="icon">&#9670;</span> @Lang.rule_if_purchased_big
+                </div>
+        
+                <div class="flex px-3 gap-3 mb-4 items-center">
+                    <div class="w-[45%] bg-[#FCFDE1] rounded-2xl p-3 flex flex-col items-center shadow-sm border border-[#E0E2C8]">
+                        <img src="/LotteryV2/img/big_text.png" class="h-8 object-contain mb-1" alt="Big">
+                        <div class="text-[8px] text-[#212121] font-bold mb-2">@Html.Raw(Lang.rule_13_from_41_80)</div>
+                        <div class="flex items-center justify-center -space-x-1 mb-2">
+                            <div class="w-7 h-7 rounded-full bg-gradient-to-br from-[#4facfe] to-[#00f2fe] flex items-center justify-center text-[11px] font-[900] text-[#1e3c72] shadow-sm z-10 border border-white/50">42</div>
+                            <div class="w-9 h-9 rounded-full bg-[radial-gradient(circle_at_30%_30%,#a8ff78,#78ffd6)] flex items-center justify-center text-[15px] font-[900] text-[#1e3c72] shadow-md z-20 border-2 border-white/80 -mt-1">88</div>
+                            <div class="w-7 h-7 rounded-full bg-gradient-to-br from-[#00c6ff] to-[#0072ff] flex items-center justify-center text-[11px] font-[900] text-[#1e3c72] shadow-sm z-10 border border-white/50">54</div>
+                        </div>
+                        <button class="w-full bg-[#0BA01A] text-white py-[6px] rounded-[8px] text-[12px] font-bold shadow-md active:scale-95 transition-transform">@Lang.rule_selected</button>
+                    </div>
+                    <div class="w-[55%] pl-1">
+                        <ul class="bullet-list mb-3 pr-0">
+                            <li class="mb-1 leading-snug">@Html.Raw(Lang.rule_if_13_41_80)</li>
+                        </ul>
+                        <div class="font-[800] text-[#212121] flex items-center gap-1 text-[13px] ml-2">
+                            <span class="text-blue-500 text-[18px]">&#10145;</span> &#127942; @Lang.rule_you_win
+                        </div>
+                    </div>
+                </div>
+        
+                <div class="rule-section-title">
+                    <span class="icon">&#9670;</span> @Lang.rule_if_purchased_small
+                </div>
+        
+                <div class="flex px-3 gap-3 mb-4 items-center">
+                    <div class="w-[45%] bg-[#FDF4E1] rounded-2xl p-3 flex flex-col items-center shadow-sm border border-[#E8DFC9]">
+                        <img src="/LotteryV2/img/small_text.png" class="h-6 object-contain mb-2 mt-1" alt="Small">
+                        <div class="text-[8px] text-[#212121] font-bold mb-2">@Html.Raw(Lang.rule_13_from_01_40)</div>
+                        <div class="flex items-center justify-center -space-x-1 mb-2">
+                            <div class="w-7 h-7 rounded-full bg-[radial-gradient(circle_at_30%_30%,#f6d365,#fda085)] flex items-center justify-center text-[11px] font-[900] text-[#713101] shadow-sm z-10 border border-white/50">5</div>
+                            <div class="w-9 h-9 rounded-full bg-[radial-gradient(circle_at_30%_30%,#fdfbfb,#ebedee)] flex items-center justify-center text-[15px] font-[900] text-[#1e3c72] shadow-md z-20 border-2 border-[#ECA600]/40 -mt-1">1</div>
+                            <div class="w-7 h-7 rounded-full bg-gradient-to-br from-[#8e9eab] to-[#eef2f3] flex items-center justify-center text-[11px] font-[900] text-[#1e3c72] shadow-sm z-10 border border-white/50">8</div>
+                        </div>
+                        <button class="w-full bg-[#0BA01A] text-white py-[6px] rounded-[8px] text-[12px] font-bold shadow-md active:scale-95 transition-transform">@Lang.rule_select</button>
+                    </div>
+                    <div class="w-[55%] pl-1">
+                        <ul class="bullet-list mb-3 pr-0">
+                            <li class="mb-1 leading-snug">@Html.Raw(Lang.rule_if_13_01_40)</li>
+                        </ul>
+                        <div class="font-[800] text-[#212121] flex items-center gap-1 text-[13px] ml-2">
+                            <span class="text-blue-500 text-[18px]">&#10145;</span> &#127942; @Lang.rule_you_win
+                        </div>
+                    </div>
+                </div>
+        
+                <div class="rule-section-title">
+                    <span class="icon">&#9670;</span> @Lang.rule_example
+                </div>
+                <div class="px-3 text-[11px] text-[#212121] leading-relaxed mb-2">
+                    @Lang.rule_if_20_drawn_contain
+                </div>
+                <ul class="bullet-list mb-4">
+                    <li>@Html.Raw(Lang.rule_13_or_more_41_80)</li>
+                    <li>@Html.Raw(Lang.rule_13_or_more_01_40)</li>
+                </ul>
+        
+                <div class="rule-header-red" style="background-color: #0BA01A;">@Lang.rule_prize_pool_title</div>
+                
+                <div class="flex flex-col items-center justify-center mt-2 mb-4">
+                    <img src="/LotteryV2/img/money_bag_large.png" class="h-[140px] object-contain drop-shadow-xl z-20" alt="Prize">
+                    <div class="text-[34px] font-[900] text-[#FFE95B] drop-shadow-md z-30 -mt-6" style="-webkit-text-stroke: 1px #ECA600; text-shadow: 2px 2px 0px rgba(0,0,0,0.2);">100 HTG</div>
+                </div>
+        
+                <ul class="bullet-list mb-6">
+                    <li>@Lang.rule_win_receive_2x</li>
+                    <li>@Html.Raw(Lang.rule_example_bet_50)</li>
+                </ul>
+        
+            </div>
+        
+            <!-- Active Tab Content: Odd / Even -->
+            <div id="tab-content-oddeven" class="w-full animate__animated animate__fadeIn hidden">
+                <div class="rule-header-red" style="background-color: #A236C8;">@Html.Raw(Lang.rule_oe_winning_rule)</div>
+        
+                <div class="rule-section-title mt-2">
+                    <span class="icon">&#9670;</span> @Lang.rule_how_result_determined
+                </div>
+                <ul class="bullet-list mb-4">
+                    <li>@Lang.rule_system_draws_20_01_80</li>
+                    <li>@Lang.v2_rule_drawn_count_desc
+                        <ul class="list-disc pl-5 mt-1 text-[#212121]">
+                            <li>@Lang.rule_odd_numbers</li>
+                            <li>@Lang.rule_even_numbers</li>
+                        </ul>
+                    </li>
+                </ul>
+        
+                <!-- Odd/Even Play Card Mockup -->
+                <div class="play-card bg-[#A236C8] relative mx-3 mt-4 mb-4 h-[90px] rounded-2xl overflow-hidden border border-white/20 shadow-lg cursor-pointer transition-all active:scale-[0.98]" onclick="window.location.href='/LotteryV2/Home/GameHome'">
+                    <!-- 1. Design-accurate Staggered Ellipses -->
+                    <img src="/LotteryV2/img/decorations/ellipse_1183.png" class="absolute -left-[60px] -top-[100px] w-[180px] h-[180px] pointer-events-none z-10 mix-blend-screen opacity-80 scale-y-[-1]" alt="highlight">
+                    <img src="/LotteryV2/img/decorations/ellipse_1181.png" class="absolute -right-[50px] -top-[20px] w-[160px] h-[160px] pointer-events-none z-10 mix-blend-screen opacity-80" alt="highlight">
+
+                    <div class="w-full h-full flex items-center justify-between pl-3 pr-2 relative z-10">
+                        <div class="flex flex-col items-center justify-center">
+                            <img src="/LotteryV2/img/odd_even_logo.png" class="h-14 object-contain drop-shadow-md -mt-1 ml-1" alt="Odd Even Logo">
+                        </div>
+        
+                        <div class="flex flex-col items-center mt-0.5 ml-2">
+                            <span class="text-[10px] font-bold text-white tracking-widest uppercase drop-shadow">@Lang.rule_oe_prize</span>
+                            <div class="flex items-start gap-1 mt-0.5">
+                                <span class="text-[28px] font-[900] text-white leading-none tracking-tight drop-shadow-md">200</span>
+                                <span class="text-[7px] font-[800] text-white bg-transparent border border-white/60 rounded px-[2px] mt-1 shadow-sm leading-tight">HTG</span>
+                            </div>
+                            <div class="text-[9px] text-white/90 mt-0.5">@Lang.rule_next_round <span class="font-[900] text-white ml-0.5 drop-shadow">05:00</span></div>
+                        </div>
+        
+                        <div class="flex flex-col items-center justify-center h-full py-2 w-[80px] gap-1">
+                            <img src="/LotteryV2/img/wallet_small.png" class="h-[46px] w-auto object-contain drop-shadow-lg">
+                            <div class="w-full yellow-button text-center rounded-[10px] py-[4px] text-[10px] font-[900] px-2 z-20 active:scale-95 transition-transform text-[#212121] border-2 border-white shadow-lg" style="background: linear-gradient(180deg, #FFE95B 0%, #ECA600 100%);">@Lang.rule_play_now</div>
+                        </div>
+                    </div>
+                </div>
+        
+                <div class="rule-section-title mt-4">
+                    <span class="icon">&#9670;</span> @Lang.rule_winning_condition
+                </div>
+                <ul class="bullet-list mb-4">
+                    <li class="mb-2">@Html.Raw(Lang.rule_if_15_odd_result_odd)</li>
+                    <li>@Html.Raw(Lang.rule_if_15_even_result_even)</li>
+                </ul>
+        
+                <div class="rule-header-red" style="background-color: #A236C8;">@Lang.rule_how_ticket_wins</div>
+        
+                <div class="rule-section-title mt-3">
+                    <span class="icon">&#9670;</span> @Lang.rule_if_purchased_odd
+                </div>
+        
+                <div class="flex px-3 gap-3 mb-4 items-center">
+                    <div class="w-[45%] bg-[#FEFCE8] rounded-2xl p-3 flex flex-col items-center shadow-sm border-2 border-[#A236C8]/40">
+                        <img src="/LotteryV2/img/odd_text.png" class="h-8 object-contain mb-1" alt="Odd">
+                        <div class="text-[8px] text-[#212121] mb-2">@Html.Raw(Lang.rule_odd_numbers_13579)</div>
+                        <div class="flex items-center justify-center -space-x-1 mb-2 mt-1">
+                            <div class="w-7 h-7 rounded-full bg-gradient-to-br from-[#ff6a00] to-[#ee0979] flex items-center justify-center text-[11px] font-[900] text-[#4a0000] shadow-sm z-10 border border-white/50">3</div>
+                            <div class="w-9 h-9 rounded-full bg-[radial-gradient(circle_at_30%_30%,#fdfbfb,#ebedee)] flex items-center justify-center text-[15px] font-[900] text-[#1e3c72] shadow-md z-20 border-2 border-[#ECA600]/40 -mt-1">1</div>
+                            <div class="w-7 h-7 rounded-full bg-gradient-to-br from-[#00c6ff] to-[#0072ff] flex items-center justify-center text-[11px] font-[900] text-[#1e3c72] shadow-sm z-10 border border-white/50">19</div>
+                        </div>
+                        <button class="w-full bg-[#A236C8] text-white py-[6px] rounded-[8px] text-[12px] font-bold shadow-md active:scale-95 transition-transform mt-1">@Lang.rule_select</button>
+                    </div>
+                    <div class="w-[55%] pl-1">
+                        <ul class="bullet-list mb-3 pr-0">
+                            <li class="mb-1 leading-snug">@Html.Raw(Lang.rule_if_20_contain_15_odd)</li>
+                        </ul>
+                        <div class="font-[800] text-[#212121] flex items-center gap-1 text-[13px] ml-2 mt-1">
+                            <span class="text-blue-500 text-[18px]">&#10145;</span> &#127942; @Lang.rule_you_win
+                        </div>
+                    </div>
+                </div>
+        
+                <div class="rule-section-title">
+                    <span class="icon">&#9670;</span> @Lang.rule_if_purchased_even
+                </div>
+        
+                <div class="flex px-3 gap-3 mb-4 items-center">
+                    <div class="w-[45%] bg-[#FEFCE8] rounded-2xl p-3 flex flex-col items-center shadow-sm border border-[#E8DFC9]">
+                        <img src="/LotteryV2/img/even_text.png" class="h-6 object-contain mb-2 mt-1" alt="Even">
+                        <div class="text-[8px] text-[#212121] mb-2">@Html.Raw(Lang.rule_even_numbers_02468)</div>
+                        <div class="flex items-center justify-center -space-x-1 mb-2 mt-1">
+                            <div class="w-7 h-7 rounded-full bg-gradient-to-br from-[#ff0844] to-[#ffb199] flex items-center justify-center text-[11px] font-[900] text-[#4a0000] shadow-sm z-10 border border-white/50">66</div>
+                            <div class="w-9 h-9 rounded-full bg-[radial-gradient(circle_at_30%_30%,#e1bee7,#8e24aa)] flex items-center justify-center text-[15px] font-[900] text-[#ffffff] shadow-md z-20 border-2 border-white/80 -mt-1" style="text-shadow: 1px 1px 2px rgba(0,0,0,0.5);">68</div>
+                            <div class="w-7 h-7 rounded-full bg-gradient-to-br from-[#d4fc79] to-[#96e6a1] flex items-center justify-center text-[11px] font-[900] text-[#1e3c72] shadow-sm z-10 border border-white/50">88</div>
+                        </div>
+                        <button class="w-full bg-[#A236C8] text-white py-[6px] rounded-[8px] text-[12px] font-bold shadow-md active:scale-95 transition-transform mt-1">@Lang.rule_selected</button>
+                    </div>
+                    <div class="w-[55%] pl-1">
+                        <ul class="bullet-list mb-3 pr-0">
+                            <li class="mb-1 leading-snug">@Html.Raw(Lang.rule_if_20_contain_15_even)</li>
+                        </ul>
+                        <div class="font-[800] text-[#212121] flex items-center gap-1 text-[13px] ml-2 mt-1">
+                            <span class="text-blue-500 text-[18px]">&#10145;</span> &#127942; @Lang.rule_you_win
+                        </div>
+                    </div>
+                </div>
+        
+                <div class="rule-section-title">
+                    <span class="icon">&#9670;</span> @Lang.rule_example
+                </div>
+                <div class="px-3 text-[11px] text-[#212121] leading-relaxed mb-4">
+                    @Lang.rule_if_20_drawn_contain<br>
+                    <ul class="list-disc pl-5 mt-1 mb-2">
+                        <li>@Lang.rule_example_16_odd</li>
+                        <li>@Lang.rule_example_4_even</li>
+                    </ul>
+                    <div class="font-[800] text-[#ECA600] flex gap-1 mb-1"><span class="text-[14px]">👉</span> <span class="text-[#212121]">@Html.Raw(Lang.rule_result_is_odd)</span></div>
+                    <div class="font-[800] text-[#ECA600] flex gap-1 mb-4"><span class="text-[14px]">👉</span> <span class="text-[#212121]">@Lang.rule_all_odd_win</span></div>
+        
+                    @Lang.rule_if_20_drawn_contain<br>
+                    <ul class="list-disc pl-5 mt-1 mb-2">
+                        <li>@Lang.rule_example_15_even</li>
+                        <li>@Lang.rule_example_5_odd</li>
+                    </ul>
+                    <div class="font-[800] text-[#ECA600] flex gap-1 mb-1"><span class="text-[14px]">👉</span> <span class="text-[#212121]">@Html.Raw(Lang.rule_result_is_even)</span></div>
+                    <div class="font-[800] text-[#ECA600] flex gap-1"><span class="text-[14px]">👉</span> <span class="text-[#212121]">@Lang.rule_all_even_win</span></div>
+                </div>
+        
+                <div class="rule-header-red" style="background-color: #A236C8;">@Lang.rule_prize_pool_title</div>
+                
+                <div class="flex flex-col items-center justify-center mt-2 mb-4">
+                    <img src="/LotteryV2/img/wallet_large.png" class="h-[120px] object-contain drop-shadow-xl z-20" alt="Prize">
+                    <div class="text-[34px] font-[900] text-[#FFE95B] drop-shadow-md z-30 -mt-2" style="-webkit-text-stroke: 1px #ECA600; text-shadow: 2px 2px 0px rgba(0,0,0,0.2);">200 HTG</div>
+                </div>
+        
+                <ul class="bullet-list mb-6">
+                    <li>@Lang.rule_win_receive_4x</li>
+                    <li>@Html.Raw(Lang.rule_example_bet_50_4x)</li>
+                </ul>
+        
+                <!-- <div class="rule-section-title mt-4">
+                    <span class="icon">&#9670;</span> @Lang.rule_important_notes
+                </div>
+                <ul class="bullet-list pb-8">
+                    <li>@Lang.rule_only_one_option</li>
+                    <li>@Lang.rule_valid_one_draw</li>
+                    <li>@Lang.rule_system_count_final</li>
+                    <li>Ticket sales close at 20:00 daily.</li>
+                    <li>@Lang.rule_if_making_payment</li>
+                    <li>@Lang.rule_payment_shortly</li>
+                    <li>@Lang.rule_payment_later</li>
+                    <li>@Lang.rule_system_time</li>
+                </ul> -->
+            </div>
+        </div> <!-- End max-width wrapper -->
+    </div> <!-- End Scroll Container -->
+</div>
+
+<script>
+
+    function switchFAQTab(tabId) {
+        // Simple mock tab visual switcher for now matching the exact styling requested
+        ['basic', 'smallbig', 'oddeven'].forEach(t => {
+            document.getElementById(`tab-${t}-label`).classList.remove('text-[#534A4A]');
+            document.getElementById(`tab-${t}-label`).classList.add('text-[#909090]');
+            
+            let bar = document.getElementById(`tab-${t}-bar`);
+            if(bar) {
+                bar.classList.remove('bg-[#EE0033]', 'drop-shadow-sm', 'h-[3px]', 'rounded-t-sm');
+                bar.classList.add('bg-transparent', 'h-0.5');
+            }
+            
+            let desc = document.getElementById(`tab-${t}-desc`);
+            if(desc) {
+                desc.classList.remove('text-[#534A4A]');
+                desc.classList.add('text-[#909090]');
+            }
+            
+            // Hide content
+            let content = document.getElementById(`tab-content-${t.replace('_','')}`);
+            if(content) {
+                content.classList.add('hidden');
+            }
+        });
+
+        // activate target
+        document.getElementById(`tab-${tabId}-label`).classList.remove('text-[#909090]');
+        document.getElementById(`tab-${tabId}-label`).classList.add('text-[#534A4A]');
+        
+        let targetBar = document.getElementById(`tab-${tabId}-bar`);
+        if(targetBar) {
+            targetBar.classList.remove('bg-transparent', 'h-0.5');
+            targetBar.classList.add('bg-[#EE0033]', 'drop-shadow-sm', 'h-[3px]', 'rounded-t-sm');
+        }
+        
+        let currentDesc = document.getElementById(`tab-${tabId}-desc`);
+        if(currentDesc) {
+            currentDesc.classList.remove('text-[#909090]');
+            currentDesc.classList.add('text-[#534A4A]');
+        }
+        
+        // Show content (the id for content is tab-content-basic, tab-content-smallbig, tab-content-oddeven)
+        let activeContentId = `tab-content-${tabId.replace('_','')}`;
+        let currentContent = document.getElementById(activeContentId);
+        if(currentContent) {
+            currentContent.classList.remove('hidden');
+        }
+        
+        // Reset scroll position when switching tabs
+        let scrollCont = document.getElementById('rule-scroll-container');
+        if(scrollCont) scrollCont.scrollTop = 0;
+    }
+</script>
+
+<!-- Bottom Navbar shared component -->
+<partial name="_BottomNavbar" />

+ 590 - 0
website_natcash/Areas/LotteryV2/Views/Home/TransferWinMoney.cshtml

@@ -0,0 +1,590 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = Lang.v2_transfer;
+    Layout = "~/Areas/LotteryV2/Views/Shared/_Layout.cshtml";
+}
+@using LotteryWebApp.Languages;
+@functions {
+    public string FormatMoney(string amount) {
+        if (string.IsNullOrEmpty(amount)) return "0";
+        var clean = new string(amount.Where(c => char.IsDigit(c)).ToArray());
+        if (long.TryParse(clean, out long val)) {
+            return val.ToString("#,##0", new System.Globalization.CultureInfo("vi-VN")).Replace(",", ".");
+        }
+        return amount;
+    }
+}
+<style>
+    @@keyframes float {
+        0%, 100% { transform: translateY(0); }
+        50% { transform: translateY(-8px); }
+    }
+    .animate-float {
+        animation: float 4s ease-in-out infinite;
+    }
+    .btn-premium {
+        border: 2px solid #ffffff !important;
+        box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15), inset 0 0 0 1px rgba(255, 255, 255, 0.1);
+        transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+    }
+    .btn-premium:active {
+        transform: scale(0.95);
+        box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
+    }
+    .btn-premium-red {
+        background: linear-gradient(135deg, #EE0033 0%, #cc002c 100%);
+    }
+</style>
+
+<div class="main-container animate__animated animate__fadeIn bg-[#EAEAEA] min-h-screen font-bricolage overflow-x-hidden">
+    <!-- Standardized Header (Matches Profile/Rules) -->
+    <div class="sticky top-0 w-full bg-[#EE0033] h-[52px] flex items-center justify-between px-4 z-[100] shadow-sm">
+        <!-- Back Button -->
+        <button onclick="history.back()" class="w-10 h-10 flex items-center justify-center -ml-2 rounded-full active:bg-white/20 transition-colors z-10 text-white">
+            <i class="fa-solid fa-arrow-left text-[20px]"></i>
+        </button>
+        <!-- Title centered -->
+        <div class="absolute inset-0 flex items-center justify-center pointer-events-none">
+            <span class="font-bold text-[24px] text-white tracking-wide uppercase">@Lang.v2_transfer</span>
+        </div>
+    </div>
+
+    <div class="pt-[20px] px-4 pb-24 max-w-[414px] mx-auto">
+        <!-- Account Card Section (Matching Figma: Frame 69) -->
+        <div class="relative w-full bg-[#EE0033] rounded-[12px] overflow-hidden shadow-xl mb-6 pl-8 pr-5 py-2 flex flex-col justify-between" style="border: 4px solid transparent; border-image: linear-gradient(175deg, rgba(255,255,255,0.2) 0%, rgba(255,199,0,0.4) 100%) 1; border-radius: 12px; aspect-ratio: 383/92;">
+            <!-- Decorative Elements (positions from Figma: card 383×92) -->
+            <div class="absolute inset-0 pointer-events-none overflow-hidden rounded-[12px]">
+                <!-- Golden Ribbon: Figma x:232.58 y:19.11 w:202.23 h:113.29 → right:0, top:20.8%, w:52.8% -->
+                <img src="/LotteryV2/img/transfer_card_bg_v2.png" alt="" class="absolute z-0" style="right: -10%; top: 20%; width: 53%; height: auto;" />
+                
+                <!-- Coin 2 (top-right): Figma x:336 y:11 w:27 h:26 → right:5.2%, top:12% -->
+                <img src="/LotteryV2/img/transfer/coin_2.png" alt="" class="absolute z-10 animate-float" style="right: 5%; top: 12%; width: 7%;" />
+                <!-- Coin 1 (mid-right): Figma x:309 y:51 w:28 h:25 → right:12%, top:55% -->
+                <img src="/LotteryV2/img/transfer/coin_1.png" alt="" class="absolute z-10 animate-float" style="right: 12%; top: 55%; width: 7.4%; animation-delay: 0.5s;" />
+                <!-- Coin 3 (small, left of ribbon): Figma x:272 y:27 w:18 h:12 → right:24.3%, top:29% -->
+                <img src="/LotteryV2/img/transfer/coin_3.png" alt="" class="absolute z-10 animate-pulse" style="right: 24%; top: 29%; width: 4.7%;" />
+                
+                <!-- Lights: Figma w:800 h:43, full-bleed glow overlays -->
+                <img src="/LotteryV2/img/transfer/light_1.png" alt="" class="absolute z-[1]" style="top: -23%; left: -55%; width: 210%; opacity: 0.7;" />
+                <img src="/LotteryV2/img/transfer/light_2.png" alt="" class="absolute z-[1]" style="bottom: -23%; left: -55%; width: 210%; opacity: 0.7;" />
+            </div>
+
+            <!-- Account Label -->
+            <p class="relative z-10 text-white font-bold text-[16px] tracking-normal" style="font-family: 'Bricolage Grotesque', sans-serif;">@Lang.v2_account_name</p>
+            
+            <!-- Balance Row -->
+            <div class="relative z-10 flex items-end gap-2">
+                <span id="currentBetCoin" class="font-[800] text-[40px] leading-[1.2]" style="background: linear-gradient(179deg, rgba(255,255,255,1) 0%, rgba(240,201,63,1) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; font-family: 'Bricolage Grotesque', sans-serif;">@FormatMoney(Model?.userStatus?.bet_coin)</span>
+                <span class="text-white font-[800] text-[20px] uppercase pb-[6px]" style="font-family: 'Bricolage Grotesque', sans-serif;">htg</span>
+            </div>
+        </div>
+
+        <!-- Selection Area (Horizontal Cards) -->
+        <div class="mb-6">
+            <h2 class="text-[#534A4A] font-[900] text-[18px] mb-3 pl-1">@Lang.v2_choose_account</h2>
+            <div class="flex gap-3">
+            <!-- Basic Account Option -->
+            <div id="selectBasic" onclick="selectChannel(1)" class="channel-card flex-1 bg-white h-[76px] rounded-[18px] border-2 border-[#EE0033] shadow-md flex items-center px-3 gap-2 cursor-pointer relative">
+                <!-- Selected Icon -->
+                <div class="check-icon absolute -top-2 -right-1 bg-white rounded-full">
+                    <i class="fa-solid fa-circle-check text-[#00AF1B] text-[20px]"></i>
+                </div>
+                <span class="text-[#EE0033] font-[900] text-[15px] leading-tight flex-1">@Lang.Basic<br />@Lang.Account</span>
+                <img src="/LotteryV2/img/transfer_basic_icon.png" alt="Basic" class="w-12 h-10 object-contain" />
+            </div>
+            <!-- Natcash Card -->
+            <div id="selectNatcash" onclick="selectChannel(2)" class="channel-card flex-1 bg-white h-[76px] rounded-[18px] border border-gray-100 shadow-sm flex items-center px-3 gap-2 cursor-pointer relative overflow-visible">
+                <!-- Selected Icon (Hidden by default) -->
+                <div class="check-icon absolute -top-2 -right-1 bg-white rounded-full hidden">
+                    <i class="fa-solid fa-circle-check text-[#00AF1B] text-[20px]"></i>
+                </div>
+                <div class="flex-1 overflow-hidden h-full flex items-center">
+                    <img src="/LotteryV2/img/transfer_other_card.png" alt="Natcash" class="w-full h-full object-contain" />
+                </div>
+            </div>
+        </div>
+        </div>
+
+        <!-- Form Fields Area -->
+        <div class="flex flex-col gap-2">
+            <!-- Sender Phone -->
+            <div class="flex flex-col gap-2">
+                <label class="text-[#534A4A] font-[900] text-[16px] px-1 capitalize">@Lang.v2_sender_phone</label>
+                <div class="relative w-full group">
+                    <input type="text" readonly value="@(Model?.userStatus?.msisdn ?? "0")" class="w-full bg-gray-100 border border-gray-300 text-[#534A4A] text-[17px] font-[800] rounded-[18px] py-[15px] px-5 outline-none transition-all cursor-not-allowed" />
+                    <div class="absolute right-4 top-1/2 -translate-y-1/2 text-gray-400">
+                        <i class="fa-solid fa-lock text-[20px] opacity-40"></i>
+                    </div>
+                </div>
+            </div>
+
+            <!-- Receiver Phone (Mandatory same as sender) -->
+            <div class="flex flex-col gap-2">
+                <label class="text-[#534A4A] font-[900] text-[16px] px-1 capitalize">@Lang.v2_receiver_phone</label>
+                <div class="relative w-full">
+                    <input id="receiverPhone" type="tel" readonly value="@(Model?.userStatus?.msisdn ?? "0")" class="w-full bg-gray-100 border border-gray-300 text-[#534A4A] text-[17px] font-[800] rounded-[18px] py-[15px] px-5 outline-none transition-all cursor-not-allowed" />
+                    <div class="absolute right-4 top-1/2 -translate-y-1/2 text-gray-400">
+                        <i class="fa-solid fa-lock text-[20px] opacity-40"></i>
+                    </div>
+                </div>
+            </div>
+
+            <!-- Amount -->
+            <div class="flex flex-col gap-2">
+                <label class="text-[#534A4A] font-[900] text-[16px] px-1 capitalize">@Lang.v2_amount_htg</label>
+                <div class="relative w-full">
+                    <input id="transferAmount" type="number" value="5000" placeholder="5,000" class="w-full bg-white border border-gray-300 focus:border-[#EE0033] focus:ring-2 focus:ring-[#EE0033]/10 text-[#EE0033] text-[17px] font-[800] rounded-[18px] py-[15px] px-5 outline-none transition-all placeholder:text-gray-300" />
+                    <span class="absolute right-5 top-1/2 -translate-y-1/2 text-gray-400 font-black">HTG</span>
+                </div>
+                <!-- Shortcut Buttons -->
+                <div class="flex gap-2 mt-1">
+                    <button onclick="setAmount(10, this)" class="amt-btn flex-1 py-1.5 border border-gray-300 rounded-lg text-[14px] font-black transition-all bg-white text-[#534A4A] flex items-center justify-center gap-1 shadow-sm">
+                        10
+                        <i class="fa-solid fa-circle-check text-[#00AF1B] text-[14px] hidden"></i>
+                    </button>
+                    <button onclick="setAmount(1000, this)" class="amt-btn flex-1 py-1.5 border border-gray-300 rounded-lg text-[14px] font-black transition-all bg-white text-[#534A4A] flex items-center justify-center gap-1 shadow-sm">
+                        1.000
+                        <i class="fa-solid fa-circle-check text-[#00AF1B] text-[14px] hidden"></i>
+                    </button>
+                    <button id="defaultAmt" onclick="setAmount(5000, this)" class="amt-btn flex-1 py-1.5 border-2 border-white bg-[#EE0033] rounded-lg text-[14px] font-black text-white transition-all flex items-center justify-center gap-1 shadow-md">
+                        5.000
+                        <i class="fa-solid fa-circle-check text-white text-[14px]"></i>
+                    </button>
+                </div>
+
+                <!-- Fee Section (Newly placed on a new line) -->
+                <div class="mt-6 flex flex-col gap-1 px-1">
+                    <span class="text-gray-500 font-bold text-[14px]">@Lang.v2_fee</span>
+                    <span class="text-black font-black text-[28px] leading-none mt-1">@Lang.v2_free</span>
+                </div>
+            </div>
+        </div>
+
+        <!-- Main Action Button -->
+        <div class="mt-6">
+            <button id="btnContinue" class="btn-premium btn-premium-red w-full text-white font-[900] text-[18px] py-[18px] rounded-[22px] active:scale-95 transition-all uppercase tracking-wide">
+                @Lang.v2_continue
+            </button>
+        </div>
+    </div>
+
+    <!-- Success Modal Overlay -->
+    <div id="successModal" class="fixed inset-0 z-[110] flex items-center justify-center hidden px-6" style="background: rgba(0,0,0,0.7);">
+        <div class="w-full max-w-[370px] bg-white rounded-[32px] overflow-hidden flex flex-col items-center animate__animated animate__zoomIn animate__faster shadow-2xl relative">
+            <!-- Content Container -->
+            <div class="relative z-10 w-full flex flex-col items-center pt-10 pb-8 px-6">
+                
+                <!-- Success Icon Group -->
+                <div class="relative w-full flex justify-center mb-0 mt-2 z-10 px-4">
+                    <img src="/LotteryV2/img/modal/otp_success.png" alt="Success" class="w-full max-w-[200px] h-auto object-contain">
+                </div>
+
+                <h2 class="text-[#0A9800] font-[800] text-[32px] mb-1 tracking-tight">@Lang.success</h2>
+                <p class="text-[#000000] font-[700] text-[20px] text-center px-4 mb-6 leading-tight">
+                    @Lang.v2_payment_successfully
+                </p>
+
+                <div class="w-full border-t border-dashed border-gray-200 pt-5 flex flex-col gap-3 mb-5">
+                    <!-- Info Rows -->
+                    <div class="flex justify-between items-center text-[15px]">
+                        <span class="text-[#534A4A] font-bold">@Lang.amount_transfered</span>
+                        <span id="successAmount" class="text-black font-black text-right">5.000 HTG</span>
+                    </div>
+                    <div class="flex justify-between items-center text-[15px]">
+                        <span class="text-[#534A4A] font-bold">@Lang.sender</span>
+                        <span id="successSender" class="text-black font-black text-right">50940236545</span>
+                    </div>
+                    <div class="flex justify-between items-center text-[15px]">
+                        <span class="text-[#534A4A] font-bold">@Lang.receiver</span>
+                        <span id="successReceiver" class="text-black font-black text-right">50940236545</span>
+                    </div>
+                    <div class="flex justify-between items-center text-[15px]">
+                        <span class="text-[#534A4A] font-bold">@Lang.fee</span>
+                        <span class="text-black font-black text-right">0 HTG</span>
+                    </div>
+                </div>
+
+                <div class="w-full border-t border-dashed border-gray-200 pt-4 flex justify-between items-center mb-8">
+                    <span class="text-[#534A4A] font-bold text-[15px]">@Lang.time</span>
+                    <span id="successTime" class="text-[#534A4A] font-medium text-[14px] text-right">08/01/2022 - 10:00:20</span>
+                </div>
+
+                <button onclick="window.location.href='/LotteryV2/Home/GameHome'" class="btn-premium btn-premium-red w-full text-white font-[800] text-[20px] py-[14px] rounded-[18px] active:scale-95 transition-all">
+                    @Lang.back_to_homepage
+                </button>
+            </div>
+        </div>
+    </div>
+
+    <!-- Failure Modal Overlay -->
+    <div id="failureModal" class="fixed inset-0 z-[110] flex items-center justify-center hidden px-6" style="background: rgba(0,0,0,0.5);">
+        <div class="w-full max-w-[343px] min-h-[420px] bg-white rounded-[20px] overflow-hidden flex flex-col items-center p-8 animate__animated animate__zoomIn animate__faster shadow-2xl">
+            <div class="w-full flex flex-col items-center mb-6 mt-4">
+                <div class="relative w-full flex items-center justify-center">
+                    <img src="/LotteryV2/img/modal/fail_icon.png" class="w-[160px] h-auto object-contain" />
+                </div>
+            </div>
+            <div class="px-2 text-center mb-12 mt-2">
+                <p id="failErrorMessage" class="text-black font-[700] text-[20px] leading-tight">
+                    @Lang.v2_enter_valid_amount
+                </p>
+            </div>
+            <div class="w-full mt-auto">
+                <button onclick="closeFailureModal()" class="btn-premium btn-premium-red w-full text-white font-[800] text-[20px] py-[10px] rounded-[14px] active:scale-95 transition-all">
+                    @Lang.try_again
+                </button>
+            </div>
+        </div>
+    </div>
+
+
+    <!-- OTP Modal Overlay -->
+    <div id="otpModal" class="fixed inset-0 z-[120] flex items-center justify-center hidden px-6" style="background: rgba(0,0,0,0.7);">
+        <!-- Glitter/Sparkles Overlay -->
+        <img src="/LotteryV2/img/modal/otp_glitter.png" class="absolute pointer-events-none opacity-60 w-full max-w-[500px]" />
+
+        <div class="w-full max-w-[360px] bg-white rounded-[32px] overflow-visible flex flex-col items-center animate__animated animate__zoomIn animate__faster relative border-4 border-[#FFCD1D]/10" style="box-shadow: 0 0 25px rgba(229, 107, 35, 0.6);">
+            
+            <!-- Gold Coins on Top -->
+            <img src="/LotteryV2/img/modal/otp_coins.png" class="absolute -top-12 -right-2 w-32 z-30 pointer-events-none drop-shadow-lg" />
+
+            <!-- Red Header -->
+            <div class="w-full bg-[#EE0033] pt-5 pb-4 px-6 rounded-t-[32px] flex justify-center border-b-4 border-white/20">
+                <h3 class="text-white font-[900] text-[22px] tracking-tight text-center">@Lang.v2_confirm_transaction</h3>
+            </div>
+
+            <div class="relative z-10 w-full flex flex-col items-center p-6 py-6 pb-8">
+                
+                <!-- Shield Icon -->
+                <div class="flex flex-col items-center gap-1 mb-2">
+                    <img src="/LotteryV2/img/modal/otp_shield.png" class="w-[90px] h-auto object-contain drop-shadow-md" />
+                    <span class="text-[#534A4A] font-bold text-[14px]">@Lang.v2_convert</span>
+                </div>
+
+                <!-- Conversion Display Area -->
+                <div class="flex items-center justify-center gap-2 mb-4">
+                    <span id="displayAmountCoins" class="text-[#EE0033] font-[900] text-[24px]">100</span>
+                    <span class="text-black font-[900] text-[24px]">@Lang.v2_coins</span>
+                    <i class="fa-solid fa-arrow-right text-gray-800 text-[20px] mx-1"></i>
+                    <span id="displayAmountHTG" class="text-[#EE0033] font-[900] text-[24px]">100</span>
+                    <span class="text-black font-[900] text-[24px]">@Lang.v2_htg</span>
+                </div>
+
+                <p class="text-[#534A4A] font-bold text-[14px] text-center px-4 mb-6 leading-tight">@Lang.v2_enter_otp_proceed</p>
+                
+                <!-- OTP Inputs Area -->
+                <div class="flex gap-2 mb-4" id="otpInputs">
+                    <input type="tel" maxlength="1" pattern="[0-9]" inputmode="numeric" oninput="handleOtpInput(this)" onkeydown="handleOtpKeydown(event, this)" placeholder="-"
+                           class="otp-digit w-[42px] h-[48px] bg-[#757575] text-white rounded-[10px] text-center text-[26px] font-[900] outline-none transition-all placeholder:text-white/60 shadow-inner" />
+                    <input type="tel" maxlength="1" pattern="[0-9]" inputmode="numeric" oninput="handleOtpInput(this)" onkeydown="handleOtpKeydown(event, this)" placeholder="-"
+                           class="otp-digit w-[42px] h-[48px] bg-[#757575] text-white rounded-[10px] text-center text-[26px] font-[900] outline-none transition-all placeholder:text-white/60 shadow-inner" />
+                    <input type="tel" maxlength="1" pattern="[0-9]" inputmode="numeric" oninput="handleOtpInput(this)" onkeydown="handleOtpKeydown(event, this)" placeholder="-"
+                           class="otp-digit w-[42px] h-[48px] bg-[#757575] text-white rounded-[10px] text-center text-[26px] font-[900] outline-none transition-all placeholder:text-white/60 shadow-inner" />
+                    <input type="tel" maxlength="1" pattern="[0-9]" inputmode="numeric" oninput="handleOtpInput(this)" onkeydown="handleOtpKeydown(event, this)" placeholder="-"
+                           class="otp-digit w-[42px] h-[48px] bg-[#757575] text-white rounded-[10px] text-center text-[26px] font-[900] outline-none transition-all placeholder:text-white/60 shadow-inner" />
+                    <input type="tel" maxlength="1" pattern="[0-9]" inputmode="numeric" oninput="handleOtpInput(this)" onkeydown="handleOtpKeydown(event, this)" placeholder="-"
+                           class="otp-digit w-[42px] h-[48px] bg-[#757575] text-white rounded-[10px] text-center text-[26px] font-[900] outline-none transition-all placeholder:text-white/60 shadow-inner" />
+                    <input type="tel" maxlength="1" pattern="[0-9]" inputmode="numeric" oninput="handleOtpInput(this)" onkeydown="handleOtpKeydown(event, this)" placeholder="-"
+                           class="otp-digit w-[42px] h-[48px] bg-[#757575] text-white rounded-[10px] text-center text-[26px] font-[900] outline-none transition-all placeholder:text-white/60 shadow-inner" />
+                </div>
+                
+                <!-- OTP Error Message -->
+                <p id="otpError" class="text-[#EE0033] font-bold text-[14px] text-center mb-4 hidden animate__animated animate__shakeX"></p>
+
+                <!-- Timer & Resend Display -->
+                <div class="flex flex-col items-center justify-center mb-6 gap-2">
+                    <span id="otpTimer" class="text-[#EE0033] font-[900] text-[18px]">60s</span>
+                    <button id="resendOtpBtn" onclick="sendOtpRequest()" class="hidden text-[15px] font-black text-[#0A9800] underline decoration-solid underline-offset-[4px] hover:text-[#087a00] transition-all font-bricolage">@Lang.v2_request_new_otp</button>
+                </div>
+                
+                <!-- Action Buttons -->
+                <div class="w-full flex gap-4">
+                    <button onclick="closeOtpModal()" class="btn-premium flex-1 bg-[#757575] text-white font-[900] py-2.5 rounded-[16px] active:scale-95 transition-all text-[13px]">@Lang.cancel</button>
+                    <button id="btnConfirmTransfer" disabled class="btn-premium flex-1 bg-[#0A9800] text-white font-[900] py-2.5 rounded-[16px] active:scale-95 transition-all text-[13px] disabled:opacity-50 disabled:grayscale disabled:cursor-not-allowed">@Lang.confirm</button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <!-- Bottom Navbar shared component -->
+    <partial name="_BottomNavbar" />
+</div>
+
+
+@section Scripts {
+    <script>
+        function setAmount(val, el) {
+            $("#transferAmount").val(val);
+            
+            // Update active state visuals
+            $(".amt-btn").removeClass("border-2 border-white bg-[#EE0033] text-white shadow-md").addClass("border-gray-300 bg-white text-[#534A4A] shadow-sm");
+            $(".amt-btn i").addClass("hidden").removeClass("text-white").addClass("text-[#00AF1B]"); // reset icons
+            
+            $(el).removeClass("border-gray-300 bg-white text-[#534A4A] shadow-sm").addClass("border-2 border-white bg-[#EE0033] text-white shadow-md");
+            $(el).find("i").removeClass("hidden").removeClass("text-[#00AF1B]").addClass("text-white"); // show current check icon in white
+        }
+
+        // Logic removed as fields are read-only
+
+        let timerInterval;
+        let isProcessing = false;
+        let selectedChannel = 1; // 1 = Basic, 2 = Natcash
+
+        function selectChannel(id) {
+            selectedChannel = id;
+            
+            // Reset both
+            $(".channel-card").removeClass("border-2 border-[#EE0033] shadow-md").addClass("border border-gray-100 shadow-sm");
+            $(".channel-card .check-icon").addClass("hidden");
+            
+            // Activate selected
+            if (id === 1) {
+                $("#selectBasic").removeClass("border-gray-100 shadow-sm").addClass("border-2 border-[#EE0033] shadow-md");
+                $("#selectBasic .check-icon").removeClass("hidden");
+            } else {
+                $("#selectNatcash").removeClass("border-gray-100 shadow-sm").addClass("border-2 border-[#EE0033] shadow-md");
+                $("#selectNatcash .check-icon").removeClass("hidden");
+            }
+        }
+
+        $("#btnContinue").on("click", function() {
+            if (isProcessing) return; // Prevent double-click
+            const rawAmount = $("#transferAmount").val();
+            const amount = parseFloat(unformatMoneyV2(rawAmount)) || 0;
+            const phone = $("#receiverPhone").val();
+            const winMoney = parseFloat(unformatMoneyV2("@(Model?.userStatus?.bet_coin ?? "0")")) || 0;
+            
+            if(amount <= 0) {
+                showFailureModal("@Html.Raw(Lang.v2_enter_valid_amount)");
+                return;
+            }
+
+            if(amount > winMoney) {
+                showFailureModal("@Html.Raw(Lang.v2_insufficient_balance)");
+                return;
+            }
+
+            // Lock button + show loading
+            isProcessing = true;
+            const $btn = $(this);
+            const originalText = $btn.html();
+            $btn.prop('disabled', true).html('<i class="fa-solid fa-spinner fa-spin mr-2"></i> ...');
+
+            // Call sendotp API
+            $.ajax({
+                url: subDomain + "/LotteryV2/Home/SendOTP",
+                type: "POST",
+                data: { phone: phone, amount: unformatMoneyV2(rawAmount), channelPayment: selectedChannel },
+                success: function(res) {
+                    $btn.prop('disabled', false).html(originalText);
+                    isProcessing = false;
+                    if(res.responseCode == "0" || res.responseCode == 0) {
+                        openOtpModal();
+                    } else {
+                        showFailureModal(res.message || "Failed to send OTP", res.responseCode);
+                    }
+                },
+                error: function() {
+                    $btn.prop('disabled', false).html(originalText);
+                    isProcessing = false;
+                    showFailureModal("Network error while sending OTP");
+                }
+            });
+        });
+
+        function openOtpModal() {
+            // Clear previous OTP values
+            $(".otp-digit").val("");
+            $("#btnConfirmTransfer").prop('disabled', true);
+            
+            // Set display amounts
+            const amt = $("#transferAmount").val();
+            const formattedAmt = formatMoneyV2(amt);
+            $("#displayAmountCoins").text(formattedAmt);
+            $("#displayAmountHTG").text(formattedAmt);
+
+            $("#otpModal").removeClass("hidden").addClass("flex");
+            resetTimer();
+            $(".otp-digit").first().focus();
+        }
+
+        function closeOtpModal() {
+            $("#otpModal").addClass("hidden").removeClass("flex");
+            clearInterval(timerInterval);
+        }
+
+        // OTP input: enforce single digit, auto-advance
+        function handleOtpInput(el) {
+            // Allow only single digit
+            el.value = el.value.replace(/[^0-9]/g, '').slice(0, 1);
+            
+            if (el.value.length === 1) {
+                const next = $(el).next('.otp-digit');
+                if (next.length) {
+                    next.focus();
+                }
+            }
+
+            // Check if all 6 digits filled
+            var filled = 0;
+            $(".otp-digit").each(function() { if ($(this).val().length >= 1) filled++; });
+            $("#btnConfirmTransfer").prop('disabled', filled < 6);
+
+            // Clear error when typing and reset color to red
+            $("#otpError").addClass("hidden").text("").removeClass("text-[#0A9800]").addClass("text-[#EE0033] animate__shakeX");
+        }
+
+        // OTP backspace: move to previous input
+        function handleOtpKeydown(e, el) {
+            if (e.key === 'Backspace') {
+                if (el.value.length === 0) {
+                    const prev = $(el).prev('.otp-digit');
+                    if (prev.length) {
+                        prev.focus();
+                    }
+                }
+            }
+        }
+
+        function resetTimer() {
+            let seconds = 60;
+            clearInterval(timerInterval);
+            $("#otpTimer").removeClass("hidden").text("60s");
+            $("#resendOtpBtn").addClass("hidden");
+            // Keep confirm disabled until OTP is filled — don't re-enable here
+            
+            timerInterval = setInterval(() => {
+                seconds--;
+                $("#otpTimer").text(seconds + "s");
+                if (seconds <= 0) {
+                    clearInterval(timerInterval);
+                    $("#otpTimer").addClass("hidden");
+                    $("#resendOtpBtn").removeClass("hidden");
+                    // Disable confirm when timer expired
+                    $("#btnConfirmTransfer").prop('disabled', true).addClass('opacity-50');
+                }
+            }, 1000);
+        }
+
+        function sendOtpRequest() {
+            const $btn = $("#resendOtpBtn");
+            const originalText = $btn.text();
+            $btn.prop('disabled', true).text("...");
+
+            $.ajax({
+                url: subDomain + "/LotteryV2/Home/SendOTP",
+                type: 'POST',
+                success: function(data) {
+                    $btn.prop('disabled', false).text(originalText);
+                    if (data.responseCode === "0" || data.responseCode === 0) {
+                        resetTimer();
+                        $("#otpError").removeClass("text-[#EE0033] animate__shakeX").addClass("text-[#0A9800]").text("@Lang.v2_otp_sent_successfully").removeClass("hidden");
+                        $(".otp-digit").val("").first().focus();
+                    } else {
+                        if (data.responseCode === "-2" || (data.responseMessage && data.responseMessage.includes("System is upgrading"))) {
+                             closeOtpModal();
+                             showFailureModal(data.responseMessage || "System is upgrading", data.responseCode);
+                        } else {
+                             $("#otpError").removeClass("text-[#0A9800]").addClass("text-[#EE0033] animate__shakeX").text(data.responseMessage || "Failed to resend OTP").removeClass("hidden");
+                        }
+                    }
+                },
+                error: function() {
+                    $btn.prop('disabled', false).text(originalText);
+                    $("#otpError").text("Network error occurred.").removeClass("hidden");
+                }
+            });
+        }
+
+        $("#btnConfirmTransfer").on("click", function() {
+            if (isProcessing) return; // Prevent double-click
+
+            let otp = "";
+            $(".otp-digit").each(function() { otp += $(this).val(); });
+            
+            if(otp.length < 6) {
+                showFailureModal("Please enter 6-digit OTP");
+                return;
+            }
+
+            // Lock button + show loading
+            isProcessing = true;
+            const $btn = $(this);
+            const originalText = $btn.html();
+            $btn.prop('disabled', true).html('<i class="fa-solid fa-spinner fa-spin mr-2"></i> ...');
+            
+            // Call the unified backend action that verifies OTP and then transfers
+            $.ajax({
+                url: subDomain + "/LotteryV2/Home/ConfirmTransfer",
+                type: "POST",
+                data: {
+                    otp: otp,
+                    phone: $("#receiverPhone").val(),
+                    amount: unformatMoneyV2($("#transferAmount").val()),
+                    channelPayment: selectedChannel
+                },
+                success: function(res) {
+                    $btn.prop('disabled', false).html(originalText);
+                    isProcessing = false;
+
+                    if(res.responseCode == "0" || res.responseCode == 0) {
+                        closeOtpModal();
+                        
+                        // Update balance in UI immediately
+                        if(res.userStatus && res.userStatus.bet_coin) {
+                           $("#currentBetCoin").text(formatMoneyV2(res.userStatus.bet_coin));
+                        }
+
+                        // Populate Success Modal Fields
+                        const transferAmt = $("#transferAmount").val();
+                        $("#successAmount").text(formatMoneyV2(transferAmt) + " HTG");
+                        $("#successSender").text("@(Model?.userStatus?.msisdn ?? "0")");
+                        $("#successReceiver").text($("#receiverPhone").val());
+                        
+                        const now = new Date();
+                        const pad = (n) => n.toString().padStart(2, '0');
+                        const formattedTime = `${pad(now.getDate())}/${pad(now.getMonth() + 1)}/${now.getFullYear()} - ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;
+                        $("#successTime").text(formattedTime);
+
+                        $("#successModal").removeClass("hidden").addClass("flex");
+                    } else {
+                        if (res.responseCode === "-2" || (res.message && res.message.includes("System is upgrading"))) {
+                             closeOtpModal();
+                             showFailureModal(res.message || "System is upgrading", res.responseCode);
+                        } else {
+                             $("#otpError").text(res.message || "Invalid OTP").removeClass("hidden");
+                             $(".otp-digit").val("");
+                             $(".otp-digit").first().focus();
+                        }
+                    }
+                },
+                error: function() {
+                    $btn.prop('disabled', false).html(originalText);
+                    isProcessing = false;
+                    showFailureModal("Network error while confirming transfer");
+                }
+            });
+        });
+
+        var systemUpgrading = false;
+        function showFailureModal(message, code) {
+            $("#failErrorMessage").html(message);
+            const $btn = $("#failureModal button");
+            if (code === "-2" || (message && message.includes("System is upgrading"))) {
+                systemUpgrading = true;
+                $btn.text("@Lang.login");
+            } else {
+                systemUpgrading = false;
+                $btn.text("@Lang.try_again");
+            }
+            $("#failureModal").removeClass("hidden").addClass("flex");
+        }
+
+        function closeFailureModal() {
+            $("#failureModal").addClass("hidden").removeClass("flex");
+            if (systemUpgrading) {
+                window.location.href = subDomain + "/Account/Login";
+            }
+        }
+    </script>
+}

+ 143 - 0
website_natcash/Areas/LotteryV2/Views/Home/_TermResultHistoryGrouped.cshtml

@@ -0,0 +1,143 @@
+@using LotteryWebApp.Service
+@using LotteryWebApp.Languages
+@using System.Linq
+@model List<IGrouping<DateTime, Term>>
+
+@if (Model != null && Model.Count > 0)
+{
+    foreach (var group in Model)
+    {
+        var drawDate = group.Key;
+        var filteredGames = group.Where(x => !string.Equals(x.result, "NA", StringComparison.OrdinalIgnoreCase)).ToList();
+        
+        if (filteredGames.Count == 0) continue;
+        
+        <div class="result-card-premium animate__animated animate__fadeInUp mb-6 overflow-hidden bg-white rounded-2xl shadow-sm border border-gray-100">
+            <!-- Simplified Header -->
+            <div class="bg-gray-50/50 px-4 py-2.5 border-b border-gray-100 flex items-center justify-between">
+                <div class="flex items-center gap-2">
+                    <i class="fas fa-trophy text-[#EE0033] text-[12px]"></i>
+                    <span class="text-[11px] font-black text-gray-500 uppercase tracking-widest">@Lang.results</span>
+                </div>
+                <div class="flex items-center gap-1.5">
+                    <div class="w-1.5 h-1.5 rounded-full bg-green-500 animate-pulse"></div>
+                    <span class="text-[9px] font-bold text-gray-400 uppercase">Live Update</span>
+                </div>
+            </div>
+
+            <!-- Games Container -->
+            <div class="px-3 pt-2 pb-3 space-y-0.5">
+                <!-- Date/Time Info Row -->
+                <div class="flex items-center gap-3 mb-1.5 bg-gray-50/50 p-2 rounded-2xl border border-gray-100/80 shadow-xs">
+                    <div class="w-11 h-11 flex flex-col items-center justify-center bg-white rounded-xl shadow-xs border border-gray-100 shrink-0">
+                        <span class="text-[9px] font-bold text-gray-400 uppercase leading-none">@drawDate.ToString("MMM")</span>
+                        <span class="text-[18px] font-black text-[#EE0033] leading-none">@drawDate.ToString("dd")</span>
+                    </div>
+                    <div class="flex flex-col">
+                        <span class="text-[14px] font-black text-gray-800 leading-tight">@drawDate.ToString("dddd, MMM dd yyyy", System.Globalization.CultureInfo.InvariantCulture)</span>
+                        <div class="flex items-center gap-1.5 mt-0.5">
+                            <i class="far fa-calendar-alt text-[11px] text-[#EE0033]"></i>
+                            <span class="text-[11px] font-bold text-gray-400 uppercase tracking-tighter">@Lang.draw_date</span>
+                        </div>
+                    </div>
+                </div>
+
+                @{
+                    var games = filteredGames.OrderBy(x => x.gameId).ToList();
+                    for (int i = 0; i < games.Count; i++)
+                    {
+                        var item = games[i];
+                        var isBasic = item.gameId == "30";
+                        var isBigSmall = item.gameId == "31";
+                        var isOddEven = item.gameId == "32";
+                        
+                        var gameName = isBasic ? Lang.v2_classic_pick_10 : 
+                                       isBigSmall ? Lang.v2_big_small : 
+                                       isOddEven ? Lang.v2_odd_even : "Game";
+                        
+                        // Fallback labels if resource is missing
+                        if (string.IsNullOrEmpty(gameName)) {
+                            gameName = isBasic ? "Basic" : isBigSmall ? "Big/Small" : isOddEven ? "Odd/Even" : "Game";
+                        }
+                        
+                        var gameColor = isBasic ? "#EE0033" : isBigSmall ? "#26A31E" : isOddEven ? "#B529E9" : "#EE0033";
+                        var gameBg = isBasic ? "bg-[#EE0033]/5" : isBigSmall ? "bg-[#26A31E]/5" : isOddEven ? "bg-[#B529E9]/5" : "bg-gray-50";
+
+                        <div class="game-result-row px-1">
+                            <div class="flex items-center justify-between mb-0 px-1">
+                                <div class="flex items-center gap-2">
+                                    <div class="w-1.5 h-4 rounded-full" style="background-color: @gameColor"></div>
+                                    <span class="text-[14px] font-black uppercase tracking-widest" style="color: @gameColor">@gameName</span>
+                                </div>
+                                <div class="flex flex-col items-end">
+                                    <span class="text-[13px] font-bold text-gray-400 opacity-60">#@item.id</span>
+                                    @{
+                                        DateTime drawTime;
+                                        var timeStr = DateTime.TryParse(item.date_random, out drawTime) ? drawTime.ToString("HH:mm") : "--:--";
+                                    }
+                                    <span class="text-[11px] font-black text-[#EE0033]/60 uppercase tracking-tighter">@timeStr</span>
+                                </div>
+                            </div>
+
+                            <div class="flex items-center justify-center gap-2.5 flex-wrap">
+                                @if (!string.IsNullOrEmpty(item.result))
+                                {
+                                    var balls = item.result.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
+                                    foreach (var ball in balls)
+                                    {
+                                        var cleanBall = ball.Trim();
+                                        if (isBasic)
+                                        {
+                                            <div class="w-8 h-8 flex items-center justify-center rounded-full text-white text-[15px] font-black shadow-md transform hover:scale-110 transition-transform" 
+                                                 style="background: linear-gradient(135deg, #FF3D63 0%, #E3132D 60%, #BA0F21 100%);">
+                                                @cleanBall
+                                            </div>
+                                        }
+                                        else
+                                        {
+                                            var ballText = cleanBall.ToUpper();
+                                            if (isBigSmall) {
+                                                if (ballText == "S") ballText = Lang.Small;
+                                                else if (ballText == "B") ballText = Lang.Big;
+                                            } else if (isOddEven) {
+                                                if (ballText == "O") ballText = Lang.Odd;
+                                                else if (ballText == "E") ballText = Lang.Even;
+                                            }
+
+                                            <div class="px-4 py-1.5 rounded-xl bg-white border border-gray-100 shadow-sm text-[13px] font-black transform hover:bg-gray-50 transition-colors uppercase tracking-tight" style="color: @gameColor">
+                                                @ballText
+                                            </div>
+                                        }
+                                    }
+                                }
+                                else
+                                {
+                                    <div class="py-2 px-4 rounded-lg border border-dashed" style="background-color: @(gameColor + "10"); border-color: @(gameColor + "30");">
+                                        <span class="italic text-[11px] font-bold" style="color: @gameColor">@Lang.waiting_for_result</span>
+                                    </div>
+                                }
+                            </div>
+                        </div>
+
+                        if (i < games.Count - 1)
+                        {
+                            <!-- Red Separator Line -->
+                            <div class="py-0">
+                                <div class="h-[1px] bg-gradient-to-r from-transparent via-[#EE0033]/20 to-transparent"></div>
+                            </div>
+                        }
+                    }
+                }
+            </div>
+        </div>
+    }
+}
+else
+{
+    <div class="w-full py-20 flex flex-col items-center justify-center text-gray-400 opacity-60">
+        <div class="w-20 h-20 bg-gray-50 rounded-full flex items-center justify-center mb-4">
+            <i class="fas fa-search text-3xl"></i>
+        </div>
+        <p class="font-black text-[14px] uppercase tracking-widest">@Lang.no_results_found</p>
+    </div>
+}

+ 61 - 0
website_natcash/Areas/LotteryV2/Views/Home/_TermResultHistoryV2.cshtml

@@ -0,0 +1,61 @@
+@model LotteryWebApp.Models.TermResultHistoryModel
+@using LotteryWebApp.Languages
+@if (Model != null && Model.listTerm != null && Model.listTerm.Count > 0)
+{
+    foreach (var item in Model.listTerm)
+    {
+        if (string.Equals(item.result, "NA", StringComparison.OrdinalIgnoreCase)) continue;
+        
+        var gameColor = item.gameId == "30" ? "#EE0033" : item.gameId == "31" ? "#26A31E" : item.gameId == "32" ? "#B529E9" : "#EE0033";
+        var gameGradient = item.gameId == "30" ? "linear-gradient(135deg, #FF3D63 0%, #E3132D 60%, #BA0F21 100%)" : 
+                           item.gameId == "31" ? "linear-gradient(135deg, #4ADE80 0%, #26A31E 100%)" : 
+                           item.gameId == "32" ? "linear-gradient(135deg, #C084FC 0%, #B529E9 100%)" : 
+                           "linear-gradient(135deg, #FF3D63 0%, #BA0F21 100%)";
+        
+        <!-- Result Item Card -->
+        <div class="result-item-red animate__animated animate__fadeInUp relative overflow-hidden" style="border-color: @gameColor">
+            <!-- Game Label Badge -->
+            <div class="absolute top-2 right-4 px-2 py-0.5 rounded-full text-[9px] font-black text-white uppercase tracking-tighter z-10 shadow-sm" style="background-color: @gameColor">
+                 @(item.gameId == "30" ? "Basic" : item.gameId == "31" ? "Big/Small" : item.gameId == "32" ? "Odd/Even" : "Mega")
+            </div>
+
+            <div class="item-date-text font-bricolage">
+                @{
+                    DateTime drawDate;
+                    if (DateTime.TryParse(item.date_random, out drawDate)) {
+                        <div class="day">@drawDate.ToString("dddd,", System.Globalization.CultureInfo.InvariantCulture)</div>
+                        <div class="date">@drawDate.ToString("MMM dd, yyyy", System.Globalization.CultureInfo.InvariantCulture)</div>
+                    } else {
+                        <div class="day">Draw Date:</div>
+                        <div class="date">@item.date_random</div>
+                    }
+                }
+            </div>
+            <div class="balls-container">
+                @if (!string.IsNullOrEmpty(item.result))
+                {
+                    var balls = item.result.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
+                    foreach (var ball in balls)
+                    {
+                        var cleanBall = ball.Trim();
+                        if (!string.IsNullOrEmpty(cleanBall))
+                        {
+                            <div class="yellow-ball" style="background: @gameGradient">@cleanBall</div>
+                        }
+                    }
+                }
+                else
+                {
+                    <span class="text-gray-400 italic text-[12px]">@Lang.waiting_for_result</span>
+                }
+            </div>
+        </div>
+    }
+}
+else
+{
+    <div class="w-full py-20 flex flex-col items-center justify-center text-gray-400 opacity-60">
+        <i class="fas fa-search text-5xl mb-4"></i>
+        <p class="font-bold">@Lang.no_results_found</p>
+    </div>
+}

+ 151 - 0
website_natcash/Areas/LotteryV2/Views/Home/_TermUserTicketHistory.cshtml

@@ -0,0 +1,151 @@
+@model LotteryWebApp.Models.UserTicketHistoryModel
+@using LotteryWebApp.Languages
+@using LotteryWebApp.Common
+
+@functions {
+    public string FormatMoney(string amount) {
+        if (string.IsNullOrEmpty(amount)) return "0";
+        var clean = new string(amount.Where(c => char.IsDigit(c)).ToArray());
+        if (long.TryParse(clean, out long val)) {
+            return val.ToString("#,##0", new System.Globalization.CultureInfo("vi-VN")).Replace(",", ".");
+        }
+        return amount;
+    }
+}
+
+@if (Model != null && Model.listTicket != null && Model.listTicket.Count > 0)
+{
+    foreach (var item in Model.listTicket)
+    {
+        <div class="ticket-card animate__animated animate__fadeInUp">
+            <div class="ticket-card-top">
+                <div class="ticket-header">
+                    <span class="ticket-id">#@item.seq</span>
+                </div>
+
+                <div class="ticket-numbers flex flex-wrap gap-2">
+                    @if (!string.IsNullOrEmpty(item.code))
+                    {
+                        var delimiters = new[] { ';', ',' };
+                        var balls = item.code.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
+                        
+                        // Prepare winning numbers for comparison
+                        var winningBalls = new HashSet<string>();
+                        if (!string.IsNullOrEmpty(item.termResult))
+                        {
+                            var winningSplit = item.termResult.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
+                            foreach (var wb in winningSplit) winningBalls.Add(wb.Trim());
+                        }
+
+                        foreach (var ball in balls)
+                        {
+                            var ballValue = ball.Trim();
+                            if (!string.IsNullOrEmpty(ballValue))
+                            {
+                                string ballClass = "";
+                                if (item.status == Constants.NOT_DRAW_CODE) {
+                                    ballClass = "ball-waiting";
+                                } else if (winningBalls.Contains(ballValue)) {
+                                    ballClass = "ball-win";
+                                } else {
+                                    ballClass = "ball-lose";
+                                }
+
+                                // Map single-letter codes to full labels
+                                var displayValue = ballValue;
+                                var isLabel = false;
+                                switch (ballValue.ToUpper())
+                                {
+                                    case "B": displayValue = "Big"; isLabel = true; break;
+                                    case "S": displayValue = "Small"; isLabel = true; break;
+                                    case "O": displayValue = "Odd"; isLabel = true; break;
+                                    case "E": displayValue = "Even"; isLabel = true; break;
+                                }
+
+                                if (isLabel)
+                                {
+                                    <div class="ticket-ball @ballClass" style="width: auto; min-width: 50px; padding: 2px 10px; border-radius: 16px; font-size: 13px;">@displayValue</div>
+                                }
+                                else
+                                {
+                                    <div class="ticket-ball @ballClass">@displayValue</div>
+                                }
+                            }
+                        }
+                    }
+                </div>
+            </div>
+
+            <div class="ticket-perforation"></div>
+
+            <div class="ticket-card-bottom">
+                <div class="ticket-info-grid">
+                    <div class="info-row">
+                        <span class="info-label">@Lang.v2_date_and_time</span>
+                        <span class="info-value">@item.createDate</span>
+                    </div>
+                    <div class="info-row">
+                        <span class="info-label">@Lang.v2_amount_played</span>
+                        <span class="info-value">@FormatMoney(item.money) HTG</span>
+                    </div>
+                    @if (item.status == Constants.WIN_CODE) {
+                        <div class="info-row">
+                            <span class="info-label">@Lang.v2_amount_won</span>
+                            <span class="info-value win-amount">@FormatMoney(item.moneyWin) HTG</span>
+                        </div>
+                    }
+                </div>
+
+                <!-- Ticket Action: Detail Button -->
+                <div class="mt-3 pt-3 border-t border-gray-100 flex justify-between items-center">
+                    <div class="flex items-center gap-1.5 text-gray-400">
+                        <i class="fa-solid fa-circle-info text-[12px]"></i>
+                        <span class="text-[10px] font-bold uppercase tracking-tight">@Lang.v2_tap_to_see_detail</span>
+                    </div>
+                    <button onclick="showTicketDetail('@item.billCode', '@item.money', '@item.moneyWin', '@item.createDate', '@item.channel', '@item.channelPayment', '@item.code', '@item.gameId', '@item.termRandomDate', '@item.id')" 
+                            class="bg-[#00A3FF] text-white px-5 py-1.5 rounded-lg font-black text-[12px] shadow-[0_4px_10px_rgba(0,163,255,0.3)] active:scale-95 transition-all border-[1.5px] border-white uppercase tracking-wide">
+                        @Lang.v2_detail
+                    </button>
+                </div>
+            </div>
+        </div>
+    }
+
+    @if (Model.totalPage != null && int.Parse(Model.totalPage) > 1)
+    {
+        var seq = int.Parse(Model.seqPage);
+        var total = int.Parse(Model.totalPage);
+        <div class="flex justify-center items-center gap-4 py-8 pb-32">
+            <button onclick="changePage(currentSeqPage - 1)" 
+                    class="p-2 px-6 bg-white rounded-xl shadow-sm font-bold text-gray-500 active:scale-95 transition-transform disabled:opacity-30 disabled:pointer-events-none" 
+                    id="prevPage" @(seq <= 1 ? "disabled" : "")>
+                <i class="fas fa-chevron-left mr-1"></i> Prev
+            </button>
+            
+            <div class="flex flex-col items-center">
+                <span class="text-[10px] text-gray-400 font-bold uppercase tracking-widest">Page</span>
+                <span class="font-black text-[#EE0033] text-lg" id="pageDisplay">@Model.seqPage / @Model.totalPage</span>
+            </div>
+
+            <button onclick="changePage(currentSeqPage + 1)" 
+                    class="p-2 px-6 bg-white rounded-xl shadow-sm font-bold text-gray-500 active:scale-95 transition-transform disabled:opacity-30 disabled:pointer-events-none" 
+                    id="nextPage" @(seq >= total ? "disabled" : "")>
+                Next <i class="fas fa-chevron-right ml-1"></i>
+            </button>
+        </div>
+        <script>
+            totalPages = parseInt('@Model.totalPage');
+        </script>
+    }
+    else
+    {
+        <div class="w-full pb-32"></div>
+    }
+}
+else
+{
+    <div class="w-full py-24 flex flex-col items-center justify-center text-gray-400 opacity-60">
+        <i class="fas fa-receipt text-5xl mb-4"></i>
+        <p class="font-bold">@Lang.no_results_found</p>
+    </div>
+}

+ 46 - 0
website_natcash/Areas/LotteryV2/Views/Shared/_BottomNavbar.cshtml

@@ -0,0 +1,46 @@
+@using LotteryWebApp.Languages
+@{
+    var activePage = ViewData["ActiveTab"] as string ?? "Home";
+}
+<!-- Bottom Navbar pinned statically white background row -->
+<div class="fixed bottom-0 left-1/2 -translate-x-1/2 w-full min-[600px]:max-w-[414px] bg-white border-t border-gray-100 p-3 flex justify-around items-center z-50 shadow-[0_-2px_10px_rgba(0,0,0,0.05)] h-[82px]">
+    <a href="/LotteryV2/Home/GameHome" class="flex flex-col items-center @(activePage == "Home" ? "text-[var(--primary)]" : "text-gray-400 hover:text-[var(--primary)]") cursor-pointer relative transition-colors no-underline">
+        @if(activePage == "Home") {
+            <div class="absolute -top-[14px] left-1/2 -translate-x-1/2 w-10 h-[2.5px] bg-[#EE0033] rounded-sm"></div>
+        }
+        <img src="/LotteryV2/img/icon_home.svg" alt="Home" class="w-8 h-8">
+        <span class="text-[12px] mt-1 @(activePage == "Home" ? "font-extrabold" : "font-bold")" style="@(activePage == "Home" ? "color: #EE0033;" : "")">@Lang.home</span>
+    </a>
+    
+    <a href="/LotteryV2/Home/Rule" class="flex flex-col items-center @(activePage == "Rule" ? "text-[var(--primary)]" : "text-gray-400 hover:text-[var(--primary)]") cursor-pointer relative transition-colors no-underline">
+        @if(activePage == "Rule") {
+            <div class="absolute -top-[14px] left-1/2 -translate-x-1/2 w-10 h-[2.5px] bg-[#EE0033] rounded-sm"></div>
+        }
+        <img src="/LotteryV2/img/icon_rule.svg" alt="Rule" class="w-8 h-8">
+        <span class="text-[12px] mt-1 @(activePage == "Rule" ? "font-extrabold" : "font-bold")" style="@(activePage == "Rule" ? "color: #EE0033;" : "")">@Lang.rules</span>
+    </a>
+
+    <a href="/LotteryV2/Home/History" class="flex flex-col items-center @(activePage == "History" ? "text-[var(--primary)]" : "text-gray-400 hover:text-[var(--primary)]") cursor-pointer relative transition-colors no-underline">
+        @if(activePage == "History") {
+            <div class="absolute -top-[14px] left-1/2 -translate-x-1/2 w-10 h-[2.5px] bg-[#EE0033] rounded-sm"></div>
+        }
+        <img src="/LotteryV2/img/icon_history.svg" alt="History" class="w-8 h-8">
+        <span class="text-[12px] mt-1 @(activePage == "History" ? "font-extrabold" : "font-bold")" style="@(activePage == "History" ? "color: #EE0033;" : "")">@Lang.history</span>
+    </a>
+
+    <a href="/LotteryV2/Home/FAQ" class="flex flex-col items-center @(activePage == "FAQ" ? "text-[var(--primary)]" : "text-gray-400 hover:text-[var(--primary)]") cursor-pointer relative transition-colors no-underline group">
+        @if(activePage == "FAQ") {
+            <div class="absolute -top-[14px] left-1/2 -translate-x-1/2 w-10 h-[2.5px] bg-[#EE0033] rounded-sm"></div>
+        }
+        <img src="/LotteryV2/img/icon_faq.svg" alt="FAQ" class="w-8 h-8">
+        <span class="text-[12px] mt-1 @(activePage == "FAQ" ? "font-extrabold drop-shadow-sm" : "font-bold")" style="@(activePage == "FAQ" ? "color: #EE0033;" : "")">@Lang.faq</span>
+    </a>
+
+    <a href="/LotteryV2/Home/More" class="flex flex-col items-center @(activePage == "More" ? "text-[var(--primary)]" : "text-gray-400 hover:text-[var(--primary)]") cursor-pointer relative transition-colors no-underline group">
+        @if(activePage == "More") {
+            <div class="absolute -top-[14px] left-1/2 -translate-x-1/2 w-10 h-[2.5px] bg-[#EE0033] rounded-sm"></div>
+        }
+        <img src="/LotteryV2/img/icon_more.svg" alt="More" class="w-8 h-8">
+        <span class="text-[12px] mt-1 @(activePage == "More" ? "font-extrabold drop-shadow-sm" : "font-bold")" style="@(activePage == "More" ? "color: #EE0033;" : "")">@Lang.more</span>
+    </a>
+</div>

+ 85 - 0
website_natcash/Areas/LotteryV2/Views/Shared/_Layout.cshtml

@@ -0,0 +1,85 @@
+@inject Microsoft.Extensions.Configuration.IConfiguration configuration
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width" />
+    <title>@ViewData["Title"] - LotteryV2</title>
+
+    <!-- Original website bootstrap if needed, or link separate -->
+    <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css" />
+
+    <!-- Isolated CSS just for LotteryV2 -->
+    <link rel="stylesheet" href="/LotteryV2/css/site.css" />
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css" />
+    <script src="https://cdn.tailwindcss.com"></script>
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+    <link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:wght@400;700;800&display=swap" rel="stylesheet">
+    <style>
+        .font-bricolage {
+            font-family: 'Bricolage Grotesque', sans-serif;
+        }
+
+        .font-UTM_Futura_Extra {
+            font-family: 'UTM Futura Extra', sans-serif;
+        }
+    </style>
+
+    @RenderSection("Styles", required: false)
+</head>
+<body class="lottery-v2-bg">
+    @Html.AntiForgeryToken()
+    <input type="hidden" id="subDomain" value="@(configuration["subDomain"] ?? "")" />
+    <script>
+        var subDomain = document.getElementById("subDomain").value || "";
+    </script>
+    <div id="loading-overlay" class="hidden">
+        <div class="loading-spinner"></div>
+    </div>
+
+    @RenderBody()
+
+    <!-- Original jquery or similar -->
+    <script src="/lib/jquery/jquery.min.js"></script>
+    <script src="/lib/bootstrap/js/bootstrap.bundle.min.js"></script>
+
+    <!-- Moment (timezone-safe countdown) -->
+    <script src="/js/vendors/moment-with-locales.min.js"></script>
+    <script src="/js/vendors/moment-timezone-with-data.min.js"></script>
+
+    <!-- Isolated JS just for LotteryV2 -->
+    <script src="/LotteryV2/js/site.js"></script>
+
+    <script>
+        // Global Loading Helpers
+        function showLoading() {
+            $('#loading-overlay').removeClass('hidden').addClass('flex');
+        }
+        function hideLoading() {
+            $('#loading-overlay').removeClass('flex').addClass('hidden');
+        }
+
+        // Auto-show for all AJAX calls
+        $(document).ajaxStart(function() {
+            showLoading();
+        }).ajaxStop(function() {
+            hideLoading();
+        });
+
+        function formatMoneyV2(amount) {
+            if (amount === undefined || amount === null || amount === "") return "0";
+            let str = amount.toString().replace(/[^0-9]/g, '');
+            if (str === "") return "0";
+            return str.replace(/\B(?=(\d{3})+(?!\d))/g, ".");
+        }
+
+        function unformatMoneyV2(amount) {
+            if (amount === undefined || amount === null || amount === "") return "0";
+            return amount.toString().replace(/[^0-9]/g, '');
+        }
+    </script>
+
+
+    @RenderSection("Scripts", required: false)
+</body>
+</html>

+ 3 - 0
website_natcash/Areas/LotteryV2/Views/_ViewImports.cshtml

@@ -0,0 +1,3 @@
+@using LotteryWebApp
+@using LotteryWebApp.Models
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

+ 3 - 0
website_natcash/Areas/LotteryV2/Views/_ViewStart.cshtml

@@ -0,0 +1,3 @@
+@{
+    Layout = "~/Areas/LotteryV2/Views/Shared/_Layout.cshtml";
+}

+ 1462 - 0
website_natcash/Areas/Millions/Controllers/HomeController.cs

@@ -0,0 +1,1462 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Globalization;
+using System.Threading;
+using System.Threading.Tasks;
+using LotteryWebApp.Common;
+using LotteryWebApp.Extensions;
+using LotteryWebApp.Languages;
+using LotteryWebApp.Models;
+using LotteryWebApp.Service;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using Newtonsoft.Json;
+using LotteryWebApp.Controllers;
+
+namespace LotteryWebApp.Areas.Millions.Controllers
+{
+    [Area("Millions")]
+    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
+    public class HomeController : BaseController
+    {
+        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
+        private const string FreeTicketAutoCheckSessionKey = "Millions.FreeTicket.AutoChecked";
+        private const string FreeTicketPromotionCodeSessionKey = "Millions.FreeTicket.PromotionCode";
+        private const string FreeTicketTransactionSessionKey = "Millions.FreeTicket.TransactionId";
+        private const string PendingTicketTransactionSessionKey = "Millions.PendingTicket.TransactionId";
+        private const string OtpVerifiedTransactionSessionKey = "Millions.OTP.VerifiedTransactionId";
+
+        IConfiguration configuration;
+        private readonly IWebHostEnvironment webHostEnvironment;
+        APIFunctions api = new APIFunctions();
+
+        public HomeController(IConfiguration _configuration, IWebHostEnvironment hostEnvironment)
+        {
+            configuration = _configuration;
+            webHostEnvironment = hostEnvironment;
+        }
+
+        public String GetParameter(String key)
+        {
+            return configuration.GetSection(key).Value;
+        }
+
+        public async Task<IActionResult> Index(
+            string termType,
+            String uuid,
+            String mcuid,
+            String phonenumber,
+            String token
+        )
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+
+                CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
+                String lang = currentCulture.Name;
+
+                String msisdnAuto = null;
+
+                if (!CheckAuthToken())
+                {
+                    if (token != null)
+                    {
+                        AutoLoginRequest autoLoginRequest = new AutoLoginRequest { token = token };
+                        AutoLoginResponse autoLoginResponse = await api.AutoLoginApiAsync(configuration, autoLoginRequest);
+
+                        if (autoLoginResponse.code == Code.SUCCESS_CODE)
+                        {
+                            string msisdnReal = validateMsisdn(autoLoginResponse.data.msisdn.Substring(1));
+                            if (msisdnReal == "") return RedirectToAction("Login", "Account", new { area = "" });
+
+                            CheckAccountRequest checkAccountRequest = new CheckAccountRequest
+                            {
+                                msisdn = msisdnReal,
+                                channel = Constants.WEB_CHANNEL,
+                                language = lang == "en" ? "0" : "1"
+                            };
+                            CheckAccountResponse checkAccountResponse = api.CheckAccountApi(configuration, checkAccountRequest);
+                            if (checkAccountResponse.status == Code.SUCCESS)
+                            {
+                                string tokenGetReal = checkAccountResponse.token;
+                                HttpContext.Session.SetComplexData("msisdn", msisdnReal);
+                                CreateAuthToken();
+                                HttpContext.Session.SetComplexData("token", tokenGetReal);
+
+                                UserGetProfileRequest userGetProfileRequest = new UserGetProfileRequest { users = msisdnReal, token = tokenGetReal };
+                                Profile profileGet = api.UserLoadProfileApi(configuration, userGetProfileRequest);
+                                HttpContext.Session.SetComplexData("profile", profileGet);
+
+                                UserStatusRequest userStatusRequest = new UserStatusRequest { users = msisdnReal, token = tokenGetReal };
+                                UserStatus userStatusGet = api.GetUserStatusApi(configuration, userStatusRequest);
+                                HttpContext.Session.SetComplexData("userStatus", userStatusGet);
+                            }
+                            else
+                            {
+                                return RedirectToAction("Login", "Account", new { area = "" });
+                            }
+                        }
+                    }
+                    else if (uuid != null)
+                    {
+                        String res = await CheckAutoLogin(log, uuid);
+                        if (res != null)
+                        {
+                            dynamic json = JsonConvert.DeserializeObject(res);
+                            if (json["code"] == "200" && json["errorCode"] == "200")
+                            {
+                                msisdnAuto = json["data"]["msisdn"];
+                            }
+                        }
+
+                        String msisdnDetect = validateMsisdn(msisdnAuto.Substring(1));
+                        if (msisdnDetect != "")
+                        {
+                            RegisterRequest request = new RegisterRequest { Msisdn = msisdnDetect };
+                            RegisterResponse reset = api.UserForgotPasswordApi(configuration, request);
+                            if (reset.status == Code.SUCCESS)
+                            {
+                                HttpContext.Session.Remove("regInfos");
+                                HttpContext.Session.SetComplexData("msisdn", msisdnDetect);
+                                return RedirectToAction("Login", "Account", new { area = "", step = 2 });
+                            }
+                        }
+                        return RedirectToAction("Login", "Account", new { area = "" });
+                    }
+                    else if (phonenumber != null)
+                    {
+                        // simplified or same logic as original
+                        return RedirectToAction("Login", "Account", new { area = "" });
+                    }
+                    else
+                    {
+                        // If no token/uuid and not auth, verify existing session token
+                        var savedToken = HttpContext.Session.GetString("token");
+                        if (string.IsNullOrEmpty(savedToken))
+                        {
+                            return RedirectToAction("Login", "Account", new { area = "" });
+                        }
+                    }
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+
+                model.termType = termType != null ? termType : Constants.Millions_CODE;
+                model.userStatus = userStatus;
+                model.profile = profile;
+                model.listTerm = new List<Term>();
+
+                String tokenGet = HttpContext.Session.GetComplexData<String>("token");
+                String fromDate = DateTime.Now.AddDays(-2).ToString("dd/MM/yyyy");
+                String toDate = DateTime.Now.ToString("dd/MM/yyyy");
+
+                // Get Top Winner
+                GetTopWinnerRequest getTopWinnerRequest = new GetTopWinnerRequest { type = lang == "en" ? "0" : "1", token = tokenGet };
+                GetTopWininerResponse getTopWininerResponse = api.GetTopWinnerApi(configuration, getTopWinnerRequest);
+                if (getTopWininerResponse.responseCode == Code.SUCCESS)
+                {
+                    model.topWinner = getTopWininerResponse.list;
+                    HttpContext.Session.SetComplexData("topWinner", model.topWinner);
+                }
+
+                // Get Term Results
+                //ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest
+                //{
+                //    gameId = model.termType,
+                //    token = tokenGet,
+                //    type = Constants.TERM_HAS_NOT_RESULT_TYPE,
+                //    order = Constants.DECS,
+                //    fromDate = fromDate,
+                //    toDate = toDate,
+                //    rowsOnPage = Constants.ROW_ON_PAGE,
+                //    seqPage = "1",
+                //    id = Constants.ALL_DATA
+                //};
+
+                //ResultOfTermResponse result = api.GetResultOfTermApi(configuration, resultOfTermRequest);
+                //if (result.responseCode == Code.SESSION_EXPIRED)
+                //{
+                //     return RedirectToAction("Login", "Account", new { area = "" });
+                //}
+                //else if (result.responseCode == Code.SUCCESS)
+                //{
+                //    model.listTerm = result.listTerm;
+                //}
+
+                if (!string.IsNullOrEmpty(termType))
+                {
+                     HttpContext.Session.SetString("termType", termType);
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return RedirectToAction("Login", "Account", new { area = "" });
+            }
+
+            return View(model);
+        }
+
+        public async Task<IActionResult> GameHome(string termType)
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+               var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+
+                model.termType = termType != null ? termType : Constants.Millions_CODE;
+                model.userStatus = userStatus;
+                model.profile = profile;
+                model.listTerm = new List<Term>();
+
+                if (!string.IsNullOrEmpty(termType))
+                {
+                     HttpContext.Session.SetString("termType", termType);
+                }
+
+                // Get Term Results for Jackpot
+                string cachedBolet = HttpContext.Session.GetString("bolet");
+                if (!string.IsNullOrEmpty(cachedBolet))
+                {
+                    model.bolet = cachedBolet;
+                    model.lastResult = HttpContext.Session.GetString("lastResult");
+                    model.lastResultDate = HttpContext.Session.GetString("lastResultDate");
+                    model.nextRoundDate = HttpContext.Session.GetString("nextRoundDate");
+                }
+                else
+                {
+                    String fromDate = DateTime.Now.AddDays(-7).ToString("dd/MM/yyyy");
+                    String toDate = DateTime.Now.ToString("dd/MM/yyyy");
+                    string lang = CultureInfo.CurrentCulture.Name;
+                    string langValue = (lang.StartsWith("en") || lang.StartsWith("fr")) ? "0" : "1";
+
+                    // Get Last Result
+                    ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest
+                    {
+                        gameId = model.termType,
+                        language = langValue,
+                        token = token,
+                        type = Constants.TERM_HAS_RESULT_TYPE,
+                        order = Constants.DECS,
+                        fromDate = fromDate,
+                        toDate = toDate,
+                        rowsOnPage = Constants.ROW_ON_PAGE,
+                        seqPage = "1",
+                        id = Constants.ALL_DATA
+                    };
+
+                    ResultOfTermResponse result = api.GetResultOfTermApi(configuration, resultOfTermRequest);
+                    if (result.responseCode == Code.SUCCESS && result.listTerm != null && result.listTerm.Count > 0)
+                    {
+                        model.bolet = result.listTerm[0].bolet;
+                        model.lastResult = result.listTerm[0].result;
+                        model.lastResultDate = result.listTerm[0].date_random;
+                        model.nextRoundDate = result.listTerm[0].date_end;
+                        HttpContext.Session.SetString("nextRoundDate", model.nextRoundDate ?? "");
+                        HttpContext.Session.SetString("bolet", model.bolet ?? "");
+                        HttpContext.Session.SetString("lastResult", model.lastResult ?? "");
+                        HttpContext.Session.SetString("lastResultDate", model.lastResultDate ?? "");
+                    }
+
+                    //// Get Next Round
+                    //ResultOfTermRequest nextRoundRequest = new ResultOfTermRequest
+                    //{
+                    //    gameId = model.termType,
+                    //    language = langValue,
+                    //    token = token,
+                    //    type = Constants.TERM_HAS_NOT_RESULT_TYPE,
+                    //    order = Constants.ASC,
+                    //    fromDate = DateTime.Now.ToString("dd/MM/yyyy"),
+                    //    toDate = DateTime.Now.AddDays(7).ToString("dd/MM/yyyy"),
+                    //    rowsOnPage = "1",
+                    //    seqPage = "1",
+                    //    id = Constants.ALL_DATA
+                    //};
+                    //ResultOfTermResponse nextResult = api.GetResultOfTermApi(configuration, nextRoundRequest);
+                    //if (nextResult.responseCode == Code.SUCCESS && nextResult.listTerm != null && nextResult.listTerm.Count > 0)
+                    //{
+                    //    model.nextRoundDate = nextResult.listTerm[0].date_random;
+                    //    HttpContext.Session.SetString("nextRoundDate", model.nextRoundDate ?? "");
+                    //}
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return View(model);
+        }
+
+        public async Task<IActionResult> FAQ()
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+               var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                model.userStatus = userStatus;
+                model.profile = profile;
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return View(model);
+        }
+
+        public IActionResult More()
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+               var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                model.userStatus = userStatus;
+                model.profile = profile;
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return View(model);
+        }
+
+        public IActionResult Profile()
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+               var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                model.userStatus = userStatus;
+                model.profile = profile;
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return View(model);
+        }
+
+        [HttpPost]
+        public IActionResult UserUpdateProfile(string fullName, string birthday)
+        {
+            try
+            {
+                string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                string token = HttpContext.Session.GetComplexData<string>("token");
+
+                if (string.IsNullOrEmpty(msisdn) || string.IsNullOrEmpty(token))
+                {
+                    return Json(new { status = Code.ERROR, message = "Session expired" });
+                }
+
+                string birthdayFormat = birthday;
+                if (!string.IsNullOrEmpty(birthday) && birthday.Contains("-"))
+                {
+                    try {
+                        birthdayFormat = DateTime.ParseExact(birthday, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy");
+                    } catch { }
+                }
+
+                UserUpdateProfileRequest request = new UserUpdateProfileRequest
+                {
+                    users = msisdn,
+                    token = token,
+                    fullName = fullName,
+                    birthday = birthdayFormat
+                };
+
+                UserUpdateProfileResponse response = api.UserUpdateProfileApi(configuration, request);
+                
+                if (response.status == Code.SUCCESS)
+                {
+                    // Update session profile
+                    Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                    if (profile != null)
+                    {
+                        profile.fullName = fullName;
+                        profile.birthday = birthdayFormat;
+                        HttpContext.Session.SetComplexData("profile", profile);
+                    }
+                }
+
+                return Json(response);
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return Json(new { status = Code.ERROR, message = ex.Message });
+            }
+        }
+
+        public IActionResult Rule()
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+               var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                model.userStatus = userStatus;
+                model.profile = profile;
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return View(model);
+        }
+
+        public IActionResult JackpotResults(string termType, string fromFormatted, string toFormatted)
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                model.userStatus = userStatus;
+                model.profile = profile;
+                model.bolet = HttpContext.Session.GetString("bolet");
+                model.lastResult = HttpContext.Session.GetString("lastResult");
+                model.lastResultDate = HttpContext.Session.GetString("lastResultDate");
+                model.nextRoundDate = HttpContext.Session.GetString("nextRoundDate");
+                model.termType = !string.IsNullOrEmpty(termType)
+                    ? termType
+                    : (HttpContext.Session.GetString("termType") ?? Constants.Millions_CODE);
+
+                string lang = CultureInfo.CurrentCulture.Name;
+                string langValue = (lang.StartsWith("en") || lang.StartsWith("fr")) ? "0" : "1";
+
+                // Default: last 7 days if filter not provided
+                if (string.IsNullOrEmpty(fromFormatted))
+                {
+                    fromFormatted = DateTime.Now.AddDays(-365).ToString("yyyy-MM-dd");
+                }
+                if (string.IsNullOrEmpty(toFormatted))
+                {
+                    toFormatted = DateTime.Now.ToString("yyyy-MM-dd");
+                }
+
+                ViewBag.FromFormatted = fromFormatted;
+                ViewBag.ToFormatted = toFormatted;
+
+                RpSearchDetailTicketRequest request = new RpSearchDetailTicketRequest
+                {
+                    requestId = DateTime.Now.Ticks.ToString(),
+                    msisdn = "-1",
+                    gameId = model.termType,
+                    fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
+                    toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
+                    prize = "JACKPOT",
+                    language = langValue,
+                    token = token
+                };
+
+                RpSearchDetailTicketResponse result = api.RpSearchDetailTicketApi(configuration, request);
+                log.Debug("RpSearchDetailTicket response: " + JsonConvert.SerializeObject(result));
+
+                model.listTerm = new List<Term>();
+                var winnersByDraw = new Dictionary<string, List<JackpotWinnerItem>>();
+
+                if (result != null && result.responseCode == Code.SUCCESS && result.list != null)
+                {
+                    // Group winners by randomId -> one draw card per group
+                    var grouped = result.list
+                        .GroupBy(w => w.randomId)
+                        .OrderByDescending(g => ParseDrawDate(g.First().randomDate));
+
+                    foreach (var group in grouped)
+                    {
+                        var first = group.First();
+                        DateTime drawDt = ParseDrawDate(first.randomDate);
+
+                        long totalPrize = 0;
+                        foreach (var w in group)
+                        {
+                            long m;
+                            if (long.TryParse(w.moneyWin, out m)) totalPrize += m;
+                        }
+
+                        Term term = new Term
+                        {
+                            id = first.randomId,
+                            seq = first.randomId,
+                            date_random = drawDt != DateTime.MinValue ? drawDt.ToString("dd/MM/yyyy HH:mm:ss") : first.randomDate,
+                            date_start = first.startDate,
+                            date_end = first.endDate,
+                            result = first.result,
+                            money_winner = totalPrize.ToString(),
+                            bolet = totalPrize.ToString(),
+                            split = group.Count().ToString(),
+                            gameId = model.termType
+                        };
+                        model.listTerm.Add(term);
+
+                        winnersByDraw[first.randomId] = group.ToList();
+                    }
+                }
+
+                // Cache winners by draw id so JackpotDetail can render them
+                HttpContext.Session.SetComplexData("jackpotWinners", winnersByDraw);
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                model.listTerm = new List<Term>();
+            }
+            return View(model);
+        }
+
+        private static DateTime ParseDrawDate(string raw)
+        {
+            if (string.IsNullOrEmpty(raw)) return DateTime.MinValue;
+            string[] formats = {
+                "M/d/yyyy h:mm:ss tt",
+                "MM/dd/yyyy h:mm:ss tt",
+                "M/d/yyyy hh:mm:ss tt",
+                "dd/MM/yyyy HH:mm:ss",
+                "yyyy-MM-dd HH:mm:ss"
+            };
+            DateTime dt;
+            if (DateTime.TryParseExact(raw, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
+            {
+                return dt;
+            }
+            if (DateTime.TryParse(raw, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
+            {
+                return dt;
+            }
+            return DateTime.MinValue;
+        }
+
+        public IActionResult JackpotDetail(string id, string termType)
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                model.userStatus = userStatus;
+                model.profile = profile;
+                model.bolet = HttpContext.Session.GetString("bolet");
+                model.lastResult = HttpContext.Session.GetString("lastResult");
+                model.lastResultDate = HttpContext.Session.GetString("lastResultDate");
+                model.termType = !string.IsNullOrEmpty(termType)
+                    ? termType
+                    : (HttpContext.Session.GetString("termType") ?? Constants.Millions_CODE);
+                ViewBag.DrawId = id;
+
+                var cache = HttpContext.Session.GetComplexData<Dictionary<string, List<JackpotWinnerItem>>>("jackpotWinners");
+                List<JackpotWinnerItem> winners = null;
+                if (cache != null && !string.IsNullOrEmpty(id) && cache.ContainsKey(id))
+                {
+                    winners = cache[id];
+                }
+                ViewBag.Winners = winners ?? new List<JackpotWinnerItem>();
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                ViewBag.Winners = new List<JackpotWinnerItem>();
+            }
+            return View(model);
+        }
+
+        public IActionResult HowToPlay()
+        {
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+               var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                model.userStatus = userStatus;
+                model.profile = profile;
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return View(model);
+        }
+
+        public IActionResult Results(string termType, string fromDate, string toDate)
+        {
+            TermResultHistoryModel model = new TermResultHistoryModel();
+            try
+            {
+               var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                
+                model.termType = termType != null ? termType : (HttpContext.Session.GetString("termType") ?? Constants.Millions_CODE);
+                
+                // Set default dates if not provided (same as root implementation)
+                string fromFormatted = fromDate != null ? fromDate : DateTime.Now.AddDays(-7).ToString("yyyy-MM-dd");
+                string toFormatted = toDate != null ? toDate : DateTime.Now.ToString("yyyy-MM-dd");
+
+                model.fromDate = fromFormatted;
+                model.toDate = toFormatted;
+
+                // Load initial results
+                ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest
+                {
+                    gameId = model.termType,
+                    token = token,
+                    type = Constants.TERM_HAS_RESULT_TYPE,
+                    order = Constants.DECS,
+                    fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
+                    toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
+                    rowsOnPage = Constants.ROW_ON_PAGE,
+                    seqPage = "1",
+                    id = Constants.ALL_DATA
+                };
+
+                ResultOfTermResponse result = api.GetResultOfTermApi(configuration, resultOfTermRequest);
+                if (result.responseCode == Code.SUCCESS)
+                {
+                    model.listTerm = result.listTerm ?? new List<Term>();
+                }
+                else
+                {
+                    model.listTerm = new List<Term>();
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                model.listTerm = new List<Term>();
+            }
+            return View(model);
+        }
+
+        public IActionResult TermResultHistory(string termType, string fromDate, string toDate)
+        {
+            TermResultHistoryModel model = new TermResultHistoryModel();
+            try
+            {
+               var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token)) return Json(new { status = "error", message = "Session expired" });
+
+                string fromFormatted = fromDate != null ? fromDate : DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd");
+                string toFormatted = toDate != null ? toDate : DateTime.Now.ToString("yyyy-MM-dd");
+
+                model.termType = termType;
+                model.fromDate = fromFormatted;
+                model.toDate = toFormatted;
+
+                ResultOfTermRequest request = new ResultOfTermRequest
+                {
+                    gameId = termType,
+                    token = token,
+                    type = Constants.TERM_HAS_RESULT_TYPE,
+                    order = Constants.DECS,
+                    fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
+                    toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
+                    rowsOnPage = Constants.ROW_ON_PAGE,
+                    seqPage = "1",
+                    id = Constants.ALL_DATA
+                };
+
+                ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
+                if (result.responseCode == Code.SUCCESS)
+                {
+                    model.listTerm = result.listTerm ?? new List<Term>();
+                }
+                else
+                {
+                    model.listTerm = new List<Term>();
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                model.listTerm = new List<Term>();
+            }
+            return PartialView("_TermResultHistoryV2", model);
+        }
+
+        public IActionResult TermResultHistoryGrouped(string fromDate, string toDate)
+        {
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token)) return Json(new { status = "error", message = "Session expired" });
+
+                string fromFormatted = fromDate != null ? fromDate : DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd");
+                string toFormatted = toDate != null ? toDate : DateTime.Now.ToString("yyyy-MM-dd");
+
+                string[] gameIds = { Constants.Millions_CODE };
+                var allTerms = new List<Term>();
+
+                foreach (var gid in gameIds)
+                {
+                    ResultOfTermRequest request = new ResultOfTermRequest
+                    {
+                        gameId = gid,
+                        token = token,
+                        type = Constants.TERM_HAS_RESULT_TYPE,
+                        order = Constants.DECS,
+                        fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
+                        toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
+                        rowsOnPage = "50", 
+                        seqPage = "1",
+                        id = Constants.ALL_DATA
+                    };
+
+                    ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
+                    if (result.responseCode == Code.SUCCESS && result.listTerm != null)
+                    {
+                        allTerms.AddRange(result.listTerm);
+                    }
+                }
+
+                // Group by date part of date_random
+                var grouped = allTerms.GroupBy(x => {
+                    DateTime dt;
+                    if (DateTime.TryParse(x.date_random, out dt))
+                        return dt.Date;
+                    return DateTime.MinValue;
+                })
+                .Where(g => g.Key != DateTime.MinValue)
+                .OrderByDescending(g => g.Key)
+                .ToList();
+
+                return PartialView("_TermResultHistoryGrouped", grouped);
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return PartialView("_TermResultHistoryGrouped", new List<IGrouping<DateTime, Term>>());
+            }
+        }
+
+        public IActionResult History(string termType, string status, string seqPage)
+        {
+            UserTicketHistoryModel model = new UserTicketHistoryModel();
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+
+                string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                
+                model.termType = termType ?? Constants.Millions_CODE;
+                model.status = status ?? Constants.ALL_DATA; // -1 for all, or 0, 1, 2
+                model.seqPage = seqPage ?? "1";
+
+                UserTicketRequest request = new UserTicketRequest
+                {
+                    gameId = model.termType,
+                    msisdn = msisdn,
+                    token = token,
+                    type = model.status,
+                    order = Constants.DECS,
+                    rowsOnPage = Constants.ROW_ON_PAGE,
+                    seqPage = model.seqPage
+                };
+
+                UserTicketResponse result = api.GetUserTicketApi(configuration, request);
+                if (result.responseCode == Code.SUCCESS)
+                {
+                    model.listTicket = result.listTicket ?? new List<Ticket>();
+                    model.totalPage = result.totalPage;
+                }
+                else
+                {
+                    model.listTicket = new List<Ticket>();
+                    model.totalPage = "0";
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                model.listTicket = new List<Ticket>();
+            }
+            return View(model);
+        }
+
+        public IActionResult TermUserTicketHistory(string termType, string status, string seqPage)
+        {
+            UserTicketHistoryModel model = new UserTicketHistoryModel();
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token)) return Json(new { status = "error", message = "Session expired" });
+
+                string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+
+                model.termType = termType;
+                model.status = status;
+                model.seqPage = seqPage ?? "1";
+
+                UserTicketRequest request = new UserTicketRequest
+                {
+                    gameId = termType,
+                    msisdn = msisdn,
+                    token = token,
+                    type = status,
+                    order = Constants.DECS,
+                    rowsOnPage = Constants.ROW_ON_PAGE,
+                    seqPage = model.seqPage
+                };
+
+                UserTicketResponse result = api.GetUserTicketApi(configuration, request);
+                if (result.responseCode == Code.SUCCESS)
+                {
+                    model.listTicket = result.listTicket ?? new List<Ticket>();
+                    model.totalPage = result.totalPage;
+                }
+                else
+                {
+                    model.listTicket = new List<Ticket>();
+                    model.totalPage = "0";
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                model.listTicket = new List<Ticket>();
+            }
+            return PartialView("_TermUserTicketHistory", model);
+        }
+
+        public IActionResult RewardHistory(string seqPage)
+        {
+            RewardHistoryModel model = BuildRewardHistory(seqPage, fallbackRedirectOnExpired: true, out IActionResult redirect);
+            if (redirect != null) return redirect;
+            return View(model);
+        }
+
+        public IActionResult RewardHistoryPartial(string seqPage)
+        {
+            var token = HttpContext.Session.GetComplexData<string>("token");
+            if (string.IsNullOrEmpty(token))
+                return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
+
+            RewardHistoryModel model = BuildRewardHistory(seqPage, fallbackRedirectOnExpired: false, out _);
+            return PartialView("_RewardHistoryList", model);
+        }
+
+        private RewardHistoryModel BuildRewardHistory(string seqPage, bool fallbackRedirectOnExpired, out IActionResult redirect)
+        {
+            redirect = null;
+            RewardHistoryModel model = new RewardHistoryModel
+            {
+                seqPage = string.IsNullOrEmpty(seqPage) ? "1" : seqPage
+            };
+
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                if (string.IsNullOrEmpty(token))
+                {
+                    if (fallbackRedirectOnExpired)
+                        redirect = RedirectToAction("Login", "Account", new { area = "" });
+                    return model;
+                }
+
+                string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+
+                TransactionInfoRequest request = new TransactionInfoRequest
+                {
+                    msisdn = msisdn,
+                    token = token,
+                    order = Constants.DECS,
+                    rowsOnPage = Constants.ROW_ON_PAGE,
+                    seqPage = model.seqPage
+                };
+
+                TransactionInfoResponse result = api.GetTransactionInfoApi(configuration, request);
+                if (result != null && result.responseCode == Code.SUCCESS)
+                {
+                    model.list = result.list ?? new List<Transaction>();
+                    model.totalPage = result.totalPage ?? "0";
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            
+            return model;
+        }
+
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public IActionResult GetFreeTicket(string type)
+        {
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                log.Info($"[Millions.GetFreeTicket] START - msisdn={msisdn}");
+
+                if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(msisdn))
+                {
+                    log.Info($"[Millions.GetFreeTicket] Session expired - msisdn={msisdn}");
+                    return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
+                }
+
+                if (type == "1")
+                {
+                    if (HttpContext.Session.GetString(FreeTicketAutoCheckSessionKey) == "1")
+                    {
+                        log.Info($"[Millions.GetFreeTicket] Auto-check skipped for current session - msisdn={msisdn}");
+                        return Json(new { responseCode = "", responseMessage = "Auto-check already completed", skipped = true });
+                    }
+
+                    // Set before the downstream call to prevent concurrent Home requests
+                    // from triggering multiple automatic checks in the same login session.
+                    HttpContext.Session.SetString(FreeTicketAutoCheckSessionKey, "1");
+                }
+
+                string lang = CultureInfo.CurrentCulture.Name;
+                string langValue = (lang.StartsWith("en") || lang.StartsWith("fr")) ? "0" : "1";
+                GetFreeTicketRequest request = new GetFreeTicketRequest
+                {
+                    requestId = Guid.NewGuid().ToString(),
+                    gameId = Constants.Millions_CODE,
+                    type = type,
+                    msisdn = msisdn,
+                    language = langValue,
+                    token = token
+                };
+
+                GetFreeTicketResponse response = api.GetFreeTicketApi(configuration, request);
+                HttpContext.Session.Remove(FreeTicketPromotionCodeSessionKey);
+                if (!string.IsNullOrWhiteSpace(response?.code))
+                {
+                    HttpContext.Session.SetString(FreeTicketPromotionCodeSessionKey, response.code.Trim());
+                }
+                log.Info($"[Millions.GetFreeTicket] Response - code={response?.responseCode}, msg={response?.responseMessage}, voucher={response?.code}");
+                return Json(response);
+            }
+            catch (Exception ex)
+            {
+                log.Error("[Millions.GetFreeTicket] EXCEPTION", ex);
+                return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
+            }
+        }
+
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public IActionResult TermResult(string termType)
+        {
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                log.Info($"[Millions.TermResult] START - termType={termType}, msisdn={msisdn}");
+                if (string.IsNullOrEmpty(token))
+                {
+                    log.Info($"[Millions.TermResult] Session expired - termType={termType}, msisdn={msisdn}");
+                    return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
+                }
+
+                string lang = CultureInfo.CurrentCulture.Name;
+                string langValue = (lang.StartsWith("en") || lang.StartsWith("fr")) ? "0" : "1";
+
+                ResultOfTermRequest request = new ResultOfTermRequest
+                {
+                    gameId = termType,
+                    language = langValue,
+                    token = token,
+                    type = Constants.TERM_HAS_NOT_RESULT_TYPE,
+                    order = Constants.DECS,
+                    rowsOnPage = "5",
+                    seqPage = "1",
+                    id = Constants.ALL_DATA
+                };
+
+                ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
+                log.Info($"[Millions.TermResult] Response - termType={termType}, code={result?.responseCode}, msg={result?.responseMessage}, termCount={result?.listTerm?.Count ?? 0}");
+                return Json(result);
+            }
+            catch (Exception ex)
+            {
+                log.Error($"[Millions.TermResult] EXCEPTION - termType={termType}", ex);
+                return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
+            }
+        }
+
+        [HttpPost]
+        public IActionResult ConfirmTicketData([FromBody] ConfirmTicketDataRequest request)
+        {
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
+
+                request.token = token;
+                request.msisdn = msisdn;
+                request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
+                request.requestId = Guid.NewGuid().ToString();
+
+                var sessionPromotionCode = HttpContext.Session.GetString(FreeTicketPromotionCodeSessionKey);
+                var isValidPromotionCode = !string.IsNullOrWhiteSpace(request.promotionCode)
+                    && string.Equals(request.promotionCode, sessionPromotionCode, StringComparison.Ordinal);
+                if (isValidPromotionCode)
+                {
+                    request.gameId = Constants.Millions_CODE;
+                    request.channelPayment = Constants.BASIC_WALLET_TICKET;
+                }
+                else
+                {
+                    request.promotionCode = null;
+                }
+
+                // DEBUG: Log request data
+                var ticketDebug = request.ticket != null ? string.Join("; ", request.ticket.Select(t => $"code={t.code}, money={t.money}")) : "NULL";
+                log.Info($"[BuyTicketV2.Prepare] gameId={request.gameId}, msisdn={request.msisdn}, tickets=[{ticketDebug}]");
+
+                ConfirmTicketDataResponse response = api.BuyTicketV2Api(configuration, request);
+
+                if (response.responseCode == Code.SUCCESS && !string.IsNullOrWhiteSpace(response.transId))
+                {
+                    HttpContext.Session.SetString(PendingTicketTransactionSessionKey, response.transId);
+                    HttpContext.Session.Remove(OtpVerifiedTransactionSessionKey);
+                }
+
+                if (isValidPromotionCode && response.responseCode == Code.SUCCESS && !string.IsNullOrWhiteSpace(response.transId))
+                {
+                    HttpContext.Session.SetString(FreeTicketTransactionSessionKey, response.transId);
+                }
+                
+                // DEBUG: Log response
+                log.Info($"[BuyTicketV2.Prepare] Response: code={response.responseCode}, msg={response.responseMessage}, transId={response.transId}");
+                
+                return Json(response);
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
+            }
+        }
+
+        [HttpPost]
+        public IActionResult ConfirmOTP([FromBody] ConfirmOTPRequest request)
+        {
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
+
+                request.token = token;
+                request.msisdn = msisdn;
+
+                var transactionId = request.transIdByTicket;
+                var pendingTransactionId = HttpContext.Session.GetString(PendingTicketTransactionSessionKey);
+                if (string.IsNullOrWhiteSpace(transactionId)
+                    || !string.Equals(transactionId, pendingTransactionId, StringComparison.Ordinal))
+                {
+                    return Json(new { responseCode = "4", responseMessage = GetLangFromCode("4") });
+                }
+
+                // This value is only used by the website to bind OTP verification
+                // to the prepared transaction; it must not be sent to the OTP API.
+                request.transIdByTicket = null;
+
+                ConfirmOTPResponse response = api.ConfirmOTPApi(configuration, request);
+                if (response.responseCode == Code.SUCCESS)
+                {
+                    HttpContext.Session.SetString(OtpVerifiedTransactionSessionKey, transactionId);
+                }
+                return Json(response);
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
+            }
+        }
+
+        [HttpPost]
+        public IActionResult SendOTP()
+        {
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
+
+                SendOTPRequest request = new SendOTPRequest
+                {
+                    msisdn = msisdn,
+                    token = token,
+                    language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
+                    channel = configuration.GetSection("channel").Value
+                };
+
+                SendOTPResponse response = api.SendOTPApi(configuration, request);
+                if (response.responseCode == Code.SUCCESS)
+                {
+                    HttpContext.Session.Remove(OtpVerifiedTransactionSessionKey);
+                }
+                return Json(response);
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
+            }
+        }
+
+        [HttpPost]
+        public IActionResult ConfirmBuyingTicketV2([FromBody] ConfirmBuyingTicketRequest request)
+        {
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
+
+                var isWalletPayment = request.channelPayment == Constants.NATCASH_WALLET_TICKET;
+                var freeTicketTransactionId = HttpContext.Session.GetString(FreeTicketTransactionSessionKey);
+                var isFreeTicketTransaction = !string.IsNullOrWhiteSpace(request.transIdByTicket)
+                    && string.Equals(request.transIdByTicket, freeTicketTransactionId, StringComparison.Ordinal);
+
+                // Main-account and promotion purchases must have completed the
+                // separate ConfirmOTP request for this exact prepared transaction.
+                if (!isWalletPayment)
+                {
+                    var otpVerifiedTransactionId = HttpContext.Session.GetString(OtpVerifiedTransactionSessionKey);
+                    if (string.IsNullOrWhiteSpace(request.transIdByTicket)
+                        || !string.Equals(request.transIdByTicket, otpVerifiedTransactionId, StringComparison.Ordinal))
+                    {
+                        return Json(new { responseCode = "31", responseMessage = GetLangFromCode("31") });
+                    }
+
+                    HttpContext.Session.Remove(OtpVerifiedTransactionSessionKey);
+                }
+
+                // Step 2: Proceed to Confirm buying
+                request.token = token;
+                request.msisdn = msisdn;
+                request.requestId = Guid.NewGuid().ToString();
+                request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
+                request.channel = configuration.GetSection("channel").Value;
+
+                request.gameId = Constants.Millions_CODE;
+
+                ConfirmBuyingTicketResponse response;
+                if (isWalletPayment)
+                {
+                    response = api.ConfirmBuyingTicketV2Api(
+                        configuration,
+                        request,
+                        Constants.WALLET_PAYMENT_CHANNEL,
+                        request.walletPin);
+                }
+                else if (isFreeTicketTransaction)
+                {
+                    // Promotion transactions are created by BuyTicketV2 and must
+                    // be completed by the matching V2 confirmation endpoint.
+                    response = api.ConfirmBuyingTicketV2Api(configuration, request);
+                }
+                else
+                {
+                    response = api.ConfirmBuyingTicketApi(configuration, request);
+                }
+                if (response.responseCode == Code.SUCCESS)
+                {
+                    if (isFreeTicketTransaction)
+                    {
+                        HttpContext.Session.Remove(FreeTicketPromotionCodeSessionKey);
+                        HttpContext.Session.Remove(FreeTicketTransactionSessionKey);
+                    }
+                    UpdateUserStatus(msisdn, token);
+                }
+                return Json(response);
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
+            }
+        }
+
+        [HttpPost]
+        public IActionResult ConfirmBuyingTicket([FromBody] ConfirmBuyingTicketRequest request)
+        {
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
+
+                request.token = token;
+                request.msisdn = msisdn;
+                request.requestId = Guid.NewGuid().ToString();
+                request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
+                request.channel = configuration.GetSection("channel").Value;
+
+                ConfirmBuyingTicketResponse response = api.ConfirmBuyingTicketApi(configuration, request);
+                if (response.responseCode == Code.SUCCESS)
+                {
+                    UpdateUserStatus(msisdn, token);
+                }
+                return Json(new { 
+                    responseCode = response.responseCode, 
+                    responseMessage = response.responseMessage,
+                    transId = response.transId,
+                    orderId = response.orderId,
+                    userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus")
+                });
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
+            }
+        }
+
+        public IActionResult BuyTicket(string termType)
+        {
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                log.Info($"[Millions.BuyTicket] START - termType={termType}, msisdn={msisdn}");
+                if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
+                {
+                    log.Info($"[Millions.BuyTicket] Redirect login - missing token, termType={termType}, msisdn={msisdn}");
+                    return RedirectToAction("Login", "Account", new { area = "" });
+                }
+                
+                HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+                model.termType = termType ?? Constants.Millions_CODE;
+                log.Info($"[Millions.BuyTicket] Check active term - gameId={model.termType}, msisdn={msisdn}");
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                model.userStatus = userStatus;
+                model.profile = profile;
+                
+                // Get active term
+                ResultOfTermRequest request = new ResultOfTermRequest
+                {
+                    gameId = model.termType,
+                    token = token,
+                    type = Constants.TERM_HAS_NOT_RESULT_TYPE,
+                    order = Constants.DECS,
+                    rowsOnPage = "1",
+                    seqPage = "1",
+                    id = Constants.ALL_DATA
+                };
+
+                ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
+                log.Info($"[Millions.BuyTicket] Active term response - gameId={model.termType}, code={result?.responseCode}, msg={result?.responseMessage}, termCount={result?.listTerm?.Count ?? 0}");
+                if (result.responseCode == Code.SUCCESS && result.listTerm != null && result.listTerm.Count > 0)
+                {
+                    model.listTerm = result.listTerm;
+                }
+                else
+                {
+                    model.listTerm = new List<Term>();
+                }
+
+                if (model.termType == Constants.PIC10_BIGSMALL_CODE || model.termType == Constants.PIC10_ODDEVEN_CODE)
+                {
+                    log.Info($"[Millions.BuyTicket] Check past terms - gameId={model.termType}, msisdn={msisdn}");
+                    ResultOfTermRequest pastRequest = new ResultOfTermRequest
+                    {
+                        gameId = model.termType,
+                        token = token,
+                        type = Constants.TERM_HAS_RESULT_TYPE,
+                        order = Constants.DECS,
+                        fromDate = DateTime.Now.AddDays(-10).ToString("dd/MM/yyyy"), 
+                        toDate = DateTime.Now.ToString("dd/MM/yyyy"),
+                        rowsOnPage = "5",
+                        seqPage = "1",
+                        id = Constants.ALL_DATA
+                    };
+
+                    ResultOfTermResponse pastResult = api.GetResultOfTermApi(configuration, pastRequest);
+                    log.Info($"[Millions.BuyTicket] Past term response - gameId={model.termType}, code={pastResult?.responseCode}, msg={pastResult?.responseMessage}, termCount={pastResult?.listTerm?.Count ?? 0}");
+                    if (pastResult.responseCode == Code.SUCCESS && pastResult.listTerm != null)
+                    {
+                        var pastTerms = pastResult.listTerm.Take(5).ToList();
+                        pastTerms.Reverse(); // Display chronological order
+                        ViewBag.PastTerms = pastTerms;
+                    }
+                    else
+                    {
+                        ViewBag.PastTerms = new List<Term>();
+                    }
+                }
+
+                log.Info($"[Millions.BuyTicket] END - gameId={model.termType}, activeTermCount={model.listTerm?.Count ?? 0}, msisdn={msisdn}");
+                return View(model);
+            }
+            catch (Exception ex)
+            {
+                log.Error($"[Millions.BuyTicket] EXCEPTION - termType={termType}", ex);
+                return RedirectToAction("GameHome", new { termType = termType });
+            }
+        }
+
+        public IActionResult TransferWinMoney()
+        {
+            if (!CheckAuthToken())
+            {
+                return RedirectToAction("Login", "Account", new { area = "" });
+            }
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            model.profile = HttpContext.Session.GetComplexData<Profile>("profile");
+            model.userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+            return View(model);
+        }
+
+        [HttpPost]
+        public IActionResult ConfirmTransfer(string otp, string phone, string amount, int channelPayment = 1)
+        {
+            try
+            {
+                var token = HttpContext.Session.GetComplexData<string>("token");
+                var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
+                if (string.IsNullOrEmpty(token)) return Json(new { status = Code.SESSION_EXPIRED, message = "Session expired" });
+                var transferChannel = channelPayment == 2
+                    ? Constants.NATCASH_WALLET_TRANSFER
+                    : Constants.BASIC_WALLET_TRANSFER;
+
+                // Step 1: Verify OTP
+                ConfirmOTPRequest otpRequest = new ConfirmOTPRequest
+                {
+                    otp = otp,
+                    msisdn = msisdn,
+                    token = token,
+                    language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
+                    channel = configuration.GetSection("channel").Value
+                };
+                ConfirmOTPResponse otpResponse = api.ConfirmOTPApi(configuration, otpRequest);
+
+                if (otpResponse.responseCode != Code.SUCCESS)
+                {
+                    return Json(new { status = otpResponse.responseCode, message = otpResponse.responseMessage });
+                }
+
+                // Step 2: If OTP success, call Transfer Money Api
+                TransferMoneyRequest xferRequest = new TransferMoneyRequest
+                {
+                    msisdn = msisdn,
+                    msisdnReceive = phone,
+                    money = amount,
+                    otp = otp,
+                    token = token,
+                    channelPayment = transferChannel,
+                    language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
+                    channel = configuration.GetSection("channel").Value
+                };
+
+                TransferMoneyResponse xferResponse = api.TransferMoneyApi(configuration, xferRequest);
+
+                if (xferResponse.responseCode == Code.SUCCESS)
+                {
+                    UpdateUserStatus(msisdn, token);
+                }
+
+                return Json(new { 
+                    status = xferResponse.responseCode, 
+                    message = xferResponse.responseMessage,
+                    paymentCode = xferResponse.paymentCode,
+                    responseCode = xferResponse.responseCode,
+                    userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus")
+                });
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return Json(new { status = Code.ERROR, message = ex.Message });
+            }
+        }
+
+        private void UpdateUserStatus(string msisdn, string token)
+        {
+            try
+            {
+                UserStatusRequest userStatusRequest = new UserStatusRequest { users = msisdn, token = token };
+                UserStatus userStatusGet = api.GetUserStatusApi(configuration, userStatusRequest);
+                if (userStatusGet != null)
+                {
+                    HttpContext.Session.SetComplexData("userStatus", userStatusGet);
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error("UpdateUserStatus Error: " + ex.Message);
+            }
+        }
+
+        public IActionResult Logout()
+        {
+            ClearCache();
+            return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+        }
+    }
+}
+

+ 1742 - 0
website_natcash/Areas/Millions/Views/Home/BuyTicket.cshtml

@@ -0,0 +1,1742 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = "Millions - Buy Ticket";
+    Layout = "~/Areas/Millions/Views/Shared/_Layout.cshtml";
+    var currentTerm = Model.listTerm?.FirstOrDefault();
+}
+@using LotteryWebApp.Languages;
+@using LotteryWebApp.Common;
+@using Microsoft.AspNetCore.Http;
+@{
+    var isFreeTicketMode = Context.Request.Query["freeTicketMode"] == "1"
+        && Model.termType == Constants.Millions_CODE;
+    var freeTicketPromotionCode = isFreeTicketMode
+        ? Context.Session.GetString("Millions.FreeTicket.PromotionCode")
+        : null;
+    var hasFreeTicketPromotion = isFreeTicketMode
+        && !string.IsNullOrWhiteSpace(freeTicketPromotionCode);
+}
+
+@section Styles {
+    <link rel="stylesheet" href="/Millions/css/buy-ticket.css" asp-append-version="true" />
+    <style>
+        /* BuyTicket has its own bottom bar; avoid global navbar padding gap */
+        body.millions-bg { padding-bottom: 0 !important; }
+        body.millions-bg .main-container { padding-bottom: 0 !important; }
+    </style>
+}
+
+@if (Model.termType == Constants.PIC10_BIGSMALL_CODE || Model.termType == Constants.PIC10_ODDEVEN_CODE)
+{
+    var isBigSmall = Model.termType == Constants.PIC10_BIGSMALL_CODE;
+    var themeColor = isBigSmall ? "#0A9800" : "#AA3DC8";
+    var gameTitle = isBigSmall ? Lang.millions_big_small : Lang.millions_odd_even;
+    var prizeAmount = isBigSmall ? "100.000" : "200.000";
+    
+    <!-- ==================== CARD SELECTION GAME UI (BIG/SMALL or ODD/EVEN) ==================== -->
+    <div class="millions-buy-ticket-page main-container animate__animated animate__fadeIn overflow-hidden">
+        <!-- Header -->
+        <div class="header">
+            <button onclick="location.href='@Url.Action("GameHome", "Home")'" class="back-btn" type="button">
+                <i class="fa-solid fa-arrow-left"></i>
+            </button>
+            <div class="header-title">@gameTitle</div>
+        </div>
+
+        <div class="content-card">
+        <!-- Sticky Term Info sub-header -->
+        <div class="ticket-subheader">
+            <div class="flex items-center justify-between">
+            <div class="flex items-center gap-2 border border-[#E5E7EB] rounded-lg px-3 py-1.5 bg-gray-50">
+                <i class="fa-regular fa-calendar text-[[@themeColor]] text-sm" style="color: @themeColor"></i>
+                <span class="text-[12px] font-bold text-gray-700">@DateTime.Now.ToString("dddd, MMM dd, yyyy", new System.Globalization.CultureInfo("en-US"))</span>
+            </div>
+            <div class="flex items-center gap-1 ml-4 flex-1 justify-end">
+                <span class="text-[12px] font-bold text-gray-400">@Lang.millions_round</span>
+                <span class="text-[18px] font-black text-brown-main">#@(currentTerm?.id ?? "123")</span>
+            </div>
+            </div>
+        </div>
+
+        <!-- Scrollable Content Area -->
+        <div class="ticket-scroll-area bg-white pb-40" id="bsContent">
+            <!-- Results for the last 5 days -->
+            <div class="px-5 pt-4 pb-2">
+                <h3 class="text-[17px] font-bold text-black text-center mb-3">Results for the last 5 days</h3>
+                <div id="last5Results" class="flex justify-between gap-1.5 px-1">
+                    @{
+                        var pastTerms = ViewBag.PastTerms as List<LotteryWebApp.Service.Term> ?? new List<LotteryWebApp.Service.Term>();
+                        foreach (var term in pastTerms) {
+                            var rawResult = (term.result ?? "").Trim().ToUpper();
+                            var dateStr = "--";
+                            DateTime dt;
+                            if (DateTime.TryParse(term.date_random, out dt)) {
+                                dateStr = dt.ToString("MMM dd", new System.Globalization.CultureInfo("en-US"));
+                            }
+                            
+                            var resKey = rawResult;
+                            var resTitle = rawResult;
+                            if (isBigSmall) {
+                                if (rawResult == "S") { resKey = "Small"; resTitle = Lang.Small; }
+                                else if (rawResult == "B") { resKey = "Big"; resTitle = Lang.Big; }
+                            } else {
+                                if (rawResult == "O") { resKey = "Odd"; resTitle = Lang.Odd; }
+                                else if (rawResult == "E") { resKey = "Even"; resTitle = Lang.Even; }
+                            }
+                            
+                            var resColor = "";
+                            var bgStyle = "background: linear-gradient(136deg, #FFFAE6 0%, #FFE588 100%);";
+                            var textStyle = "-webkit-text-stroke: 0.5px #000;";
+
+                            if (resKey == "NA" || string.IsNullOrEmpty(rawResult)) {
+                                bgStyle = "background: #EAEAEA;";
+                                resTitle = "";
+                                textStyle = "";
+                            } else {
+                                if (isBigSmall) {
+                                    resColor = resKey == "Big" ? "#A2FF00" : "#FF4157";
+                                } else {
+                                    resColor = resKey == "Odd" ? "#FFC700" : "#B33BD0";
+                                }
+                                textStyle += $" color: {resColor};";
+                            }
+                            
+                            <div class="flex flex-col items-center justify-center min-h-[64px] flex-1 rounded-lg py-1.5 border border-gray-200" style="@bgStyle">
+                                <span class="text-[11px] font-bold text-black whitespace-nowrap opacity-70">@dateStr</span>
+                                <span class="text-[22px] font-black leading-tight" style="@textStyle">@resTitle</span>
+                            </div>
+                        }
+                        
+                        for(int r = pastTerms.Count; r < 5; r++) {
+                            <div class="flex flex-col items-center justify-center min-h-[64px] flex-1 rounded-lg py-1.5 border border-gray-200" style="background: #EAEAEA; opacity: 0.7;">
+                                <span class="text-[11px] font-bold text-black whitespace-nowrap opacity-70">--</span>
+                                <span class="text-[22px] font-black leading-tight" style="color: transparent;"></span>
+                            </div>
+                        }
+                    }
+                </div>
+            </div>
+
+            <!-- Selection Cards -->
+            <!-- Selection Cards -->
+            <div class="px-5 pt-4 flex gap-3 h-[245px]">
+                <!-- Card 1 (Big or Odd) -->
+                <div id="cardBig" onclick="selectBigSmall('big')" class="bigsmall-card flex-1 rounded-2xl relative cursor-pointer transition-all duration-300 active:scale-[0.97] border-2 border-transparent overflow-hidden flex flex-col" style="background: linear-gradient(180deg, #FFF7DB 0%, #FFEEB3 100%);">
+                    <img src="/Millions/img/bigsmall/light_effect_1.png" class="absolute top-0 left-0 w-full opacity-60 pointer-events-none" alt="" />
+                    <img src="/Millions/img/bigsmall/light_effect_2.png" class="absolute bottom-12 left-0 w-full opacity-60 pointer-events-none" alt="" />
+                    <div class="flex flex-col items-center pt-4 pb-3 px-3 relative z-10 h-full justify-between">
+                        <div class="flex flex-col items-center w-full">
+                            <div class="h-[34px] flex items-center justify-center">
+                                <div class="text-[40px] font-[800] leading-none" style="-webkit-text-stroke: 1px #000; text-shadow: 1px 2px 2px rgba(0,0,0,0.15); color: @(isBigSmall ? "#A2FF00" : "#FFC700");">@(isBigSmall ? "Big" : "Odd")</div>
+                            </div>
+                            <div class="text-[11px] font-medium text-gray-500 mt-1 h-[28px] text-center leading-tight">
+                                @(isBigSmall ? "13 number from" : "Odd numbers") <br/> <b>@(isBigSmall ? "41-80" : "1, 3, 5, 7, 9")</b>
+                            </div>
+                        </div>
+                        <div class="flex items-center justify-center -space-x-2 my-2">
+                            @if (isBigSmall) {
+                                <img src="/Millions/img/bigsmall/ball_42_dark.png" class="w-12 h-12 relative z-[1]" alt="42" />
+                                <img src="/Millions/img/bigsmall/ball_88_big.png" class="w-16 h-16 relative z-[2]" alt="88" />
+                                <img src="/Millions/img/bigsmall/ball_54_dark.png" class="w-12 h-12 relative z-[1]" alt="54" />
+                            } else {
+                                <img src="/Millions/img/oddeven/ball_3.png" class="w-12 h-12 relative z-[1]" alt="3" />
+                                <img src="/Millions/img/oddeven/ball_1.png" class="w-16 h-16 relative z-[2]" alt="1" />
+                                <img src="/Millions/img/oddeven/ball_19.png" class="w-12 h-12 relative z-[1]" alt="19" />
+                            }
+                        </div>
+                        <button class="bigsmall-btn w-full py-2.5 rounded-xl font-black text-[15px] transition-all shadow-md" style="background: @themeColor; color: white;">@Lang.millions_select</button>
+                    </div>
+                </div>
+
+                <!-- Card 2 (Small or Even) -->
+                <div id="cardSmall" onclick="selectBigSmall('small')" class="bigsmall-card flex-1 rounded-2xl relative cursor-pointer transition-all duration-300 active:scale-[0.97] border-2 border-transparent overflow-hidden flex flex-col" style="background: linear-gradient(180deg, #FFF7DB 0%, #FFEEB3 100%);">
+                    <img src="/Millions/img/bigsmall/light_effect_1.png" class="absolute top-0 left-0 w-full opacity-60 pointer-events-none" alt="" />
+                    <img src="/Millions/img/bigsmall/light_effect_2.png" class="absolute bottom-12 left-0 w-full opacity-60 pointer-events-none" alt="" />
+                    <div class="flex flex-col items-center pt-4 pb-3 px-3 relative z-10 h-full justify-between">
+                        <div class="flex flex-col items-center w-full">
+                            <div class="h-[34px] flex items-center justify-center">
+                                <div class="text-[40px] font-[800] leading-none italic" style="-webkit-text-stroke: 1px #000; text-shadow: 1px 2px 2px rgba(0,0,0,0.15); color: @(isBigSmall ? "#FF4157" : "#B33BD0");">@(isBigSmall ? "Small" : "Even")</div>
+                            </div>
+                            <div class="text-[11px] font-medium text-gray-500 mt-1 h-[28px] text-center leading-tight">
+                                @(isBigSmall ? "13 number from" : "Even numbers") <br/> <b>@(isBigSmall ? "01-40" : "0, 2, 4, 6, 8")</b>
+                            </div>
+                        </div>
+                        <div class="flex items-center justify-center -space-x-2 my-2">
+                            @if (isBigSmall) {
+                                <img src="/Millions/img/bigsmall/ball_5_blue.png" class="w-12 h-12 relative z-[1]" alt="5" />
+                                <img src="/Millions/img/bigsmall/ball_1_big.png" class="w-16 h-16 relative z-[2]" alt="1" />
+                                <img src="/Millions/img/bigsmall/ball_8_pink.png" class="w-12 h-12 relative z-[1]" alt="8" />
+                            } else {
+                                <img src="/Millions/img/oddeven/ball_66.png" class="w-12 h-12 relative z-[1]" alt="66" />
+                                <img src="/Millions/img/oddeven/ball_68.png" class="w-16 h-16 relative z-[2]" alt="68" />
+                                <img src="/Millions/img/oddeven/ball_88.png" class="w-12 h-12 relative z-[1]" alt="88" />
+                            }
+                        </div>
+                        <button class="bigsmall-btn w-full py-2.5 rounded-xl font-black text-[15px] transition-all shadow-md"
+								style="background: @themeColor; color: white;">@Lang.millions_select</button>
+                    </div>
+                </div>
+            </div>
+
+            <!-- You Choose + Prize Section -->
+            <div class="px-5 pt-6 flex flex-col items-center gap-4">
+                <div class="flex flex-col items-center">
+                    <span class="text-[15px] font-medium text-black">@Lang.millions_you_choose</span>
+                    <span id="choiceDisplay" class="text-[42px] font-[800] leading-tight" style="-webkit-text-stroke: 1px #000;">—</span>
+                </div>
+                <div class="flex flex-col items-center">
+                    <span class="text-[18px] font-medium text-black">@Lang.millions_prize_if_win</span>
+                    <div class="flex items-baseline gap-1">
+                        <span class="text-[28px] font-black text-black">@prizeAmount</span>
+                        <span class="text-[14px] font-black text-[#E56B23]">HTG</span>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- Bottom Action Bar -->
+        <div class="p-4 bg-white border-t border-gray-200 z-[70] shadow-[0px_-4px_10px_rgba(0,0,0,0.03)] absolute bottom-0 w-full left-0">
+            <div class="flex items-center justify-between">
+                <div class="flex flex-col">
+                    <div class="flex items-center gap-1.5 mb-0.5">
+                        <span class="text-[11px] text-black font-black uppercase">@Lang.total_ticket:</span>
+                        <span id="bsTotalTicketCount" class="text-[12px] font-black text-black">0</span>
+                    </div>
+                    <span class="text-[11px] text-black font-black uppercase">@Lang.millions_estimated_ticket_price</span>
+                    <div class="flex items-baseline gap-1">
+                        <span id="bsTotalPrice" class="text-[28px] font-black text-black">0</span>
+                        <span class="text-[13px] font-black" style="color: @themeColor">HTG</span>
+                    </div>
+                </div>
+                <button type="button" id="bsPaymentBtn" onpointerdown="armPaymentClick(event)" onkeydown="armPaymentKey(event)" onclick="bsShowPayment(event)" class="text-white text-[20px] font-black px-10 py-3.5 rounded-xl shadow-lg active:scale-95 transition-all" style="background: @themeColor;">
+                    @Lang.millions_payment
+                </button>
+            </div>
+        </div>
+        </div>
+    </div>
+}
+else
+{
+<!-- ==================== Basic Pick 10 / Odd-Even GAME UI ==================== -->
+<div class="millions-buy-ticket-page main-container animate__animated animate__fadeIn overflow-hidden">
+    <!-- Header -->
+    <div class="header">
+        <button onclick="location.href='@Url.Action("GameHome", "Home")'" class="back-btn" type="button">
+            <i class="fa-solid fa-arrow-left"></i>
+        </button>
+        <div class="header-title">
+            @if (Model.termType == Constants.PIC10_BASIC_CODE) { <text>Basic Pick 10</text> }
+            else if (Model.termType == Constants.Millions_CODE) { <text>Millions</text> }
+            else { @Lang.millions_odd_even }
+        </div>
+    </div>
+
+    <div class="content-card">
+    <!-- Sticky Term Info sub-header -->
+    <div class="ticket-subheader">
+        <div class="flex items-center justify-between">
+        <div class="flex items-center gap-2 border border-[#E5E7EB] rounded-lg px-3 py-1.5 bg-gray-50">
+            <i class="fa-regular fa-calendar text-[#0062FF] text-sm"></i>
+            <span class="text-[12px] font-bold text-gray-700">@DateTime.Now.ToString("dddd, MMM dd, yyyy", new System.Globalization.CultureInfo("en-US"))</span>
+        </div>
+        <div class="flex items-center gap-1 ml-4 flex-1 justify-end">
+            <span class="text-[12px] font-bold text-gray-400">@Lang.millions_round</span>
+            <span class="text-[18px] font-black text-brown-main">#@(currentTerm?.id ?? "12459")</span>
+        </div>
+        </div>
+    </div>
+
+    <!-- Ticket Scrollable List Area -->
+    <div id="ticketContainer" class="ticket-scroll-area p-4 flex flex-col gap-6 bg-[#F5F5F5] pb-6">
+        @for (int i = 1; i <= (isFreeTicketMode ? 1 : 2); i++)
+        {
+            <div class="ticket-card relative group active:bg-gray-50 transition-colors cursor-pointer animate__animated animate__fadeIn">
+                @if (!isFreeTicketMode)
+                {
+                    <button onclick="removeEntry(this)" class="absolute -right-2 top-2 w-7 h-7 bg-[#FF0000] text-white rounded-full flex items-center justify-center text-[11px] shadow-sm z-[10] hover:bg-red-700 transition-all border-2 border-red-600">
+                        <i class="fa-solid fa-xmark"></i>
+                    </button>
+                }
+                <div class="absolute left-2 top-4 w-9 h-9 rounded-full border-[3px] border-white flex items-center justify-center text-white font-black text-sm shadow-md ticket-index">@i</div>
+                <div class="flex flex-col gap-1 pl-8">
+                    <span class="text-[16px] font-extrabold text-[#333]">@Lang.millions_select_10_lucky_numbers</span>
+                    <div class="flex items-center gap-4">
+                        <div class="grid grid-cols-6 gap-y-2 gap-x-1 flex-1">
+                            @for (int j = 0; j < (Model.termType == Constants.PIC10_BASIC_CODE ? 10 : (Model.termType == Constants.Millions_CODE ? 6 : 15)); j++)
+                            {
+                                var isMbBall = Model.termType == Constants.Millions_CODE && j == 5;
+                                <div class="relative w-fit">
+                                    <div class="ball-circle ball-empty@(isMbBall ? " ball-mb-circle" : "")"></div>
+                                    @if (isMbBall)
+                                    {
+                                        <div class="absolute -bottom-[6px] -right-[4px] bg-[#FFD700] text-black text-[8.5px] font-black px-[2.5px] py-[1.5px] rounded-[3px] shadow-sm leading-none z-10 border border-[#EAA800]">MB</div>
+                                    }
+                                </div>
+                            }
+                        </div>
+                        <div class="w-[90px] action-area flex flex-col gap-2">
+                             <button onclick="randomizeTicket(this)" class="rand-btn w-full bg-[#2B83F2] text-white flex items-center justify-center gap-1.5 py-1.5 rounded-xl font-extrabold text-[11px] shadow-sm active:scale-95 transition-all">
+                                <i class="fa-solid fa-arrows-rotate text-[10px]"></i> @Lang.Random
+                             </button>
+                             <div class="edit-delete-group hidden flex flex-col gap-2">
+                                 <button onclick="editFullTicket(this)" class="w-full bg-[#16A34A] text-white flex items-center justify-center gap-1.5 py-1.5 rounded-xl font-black text-[12px] shadow-sm active:scale-95 transition-all">
+                                    <img src="/Millions/img/icons/icon_edit.png" onerror="this.style.display='none'" class="w-[16px] h-[16px] object-contain"> @Lang.millions_edit
+                                 </button>
+                                 <button onclick="clearTicket(this)" class="w-full bg-[#A855F7] text-white flex items-center justify-center gap-1.5 py-1.5 rounded-xl font-black text-[12px] shadow-sm active:scale-95 transition-all">
+                                    <img src="/Millions/img/icons/icon_delete.png" onerror="this.style.display='none'" class="w-[16px] h-[16px] object-contain"> @Lang.millions_delete
+                                 </button>
+                             </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        }
+
+        @if (!isFreeTicketMode)
+        {
+            <div class="w-full pt-2" id="addButtonWrapper">
+                <button onclick="addNewTicket()" class="w-fit min-w-[220px] mx-auto bg-[#2B83F2] text-white font-black text-md py-2.5 px-6 rounded-xl shadow-md border-b-[4px] border-[#1F66D6] active:translate-y-[1px] active:border-b-[1px] transition-all flex items-center justify-center gap-2">
+                    @Lang.millions_add_more_ticket
+                </button>
+            </div>
+        }
+        <div class="h-4"></div>
+    </div>
+
+    <!-- Bottom Action Bar -->
+    <div class="ticket-bottom-bar p-4 bg-white border-t border-gray-200 z-[70] shadow-[0px_-4px_10px_rgba(0,0,0,0.03)]">
+        <div class="flex items-center justify-between">
+            <div class="flex flex-col">
+                <div class="flex items-center gap-1.5 mb-0.5">
+                    <span class="text-[11px] text-black font-black uppercase">@Lang.total_ticket:</span>
+                    <span id="totalTicketCount" class="text-[12px] font-black text-black">0</span>
+                </div>
+                <span class="text-[11px] text-black font-black uppercase">@Lang.millions_estimated_ticket_price</span>
+                <div class="flex items-baseline gap-1">
+                    <span id="totalPrice" class="text-[28px] font-black text-black">0</span>
+                    <span class="text-[13px] font-black text-[#0062FF]">HTG</span>
+                </div>
+            </div>
+            <button type="button" onpointerdown="armPaymentClick(event)" onkeydown="armPaymentKey(event)" onclick="preparePayment(event)" class="bg-[#0062FF] text-white text-[20px] font-black px-10 py-3.5 rounded-xl shadow-[0px_6px_15px_rgba(238,0,51,0.25)] active:scale-95 transition-all">
+                @Lang.millions_payment
+            </button>
+        </div>
+    </div>
+</div>
+</div>
+}
+
+<!-- Payment channel selection -->
+<div id="paymentChannelModal" class="hidden fixed inset-0 z-[140] bg-black/70 backdrop-blur-[3px] items-center justify-center p-4 font-bricolage">
+    <div class="relative w-full max-w-[370px] overflow-hidden rounded-[32px] bg-[#F8F9FC] shadow-[0_28px_70px_rgba(0,0,0,0.35)] animate__animated animate__zoomIn animate__faster">
+        <div class="relative overflow-hidden bg-gradient-to-br from-[#0062FF] to-[#003FA8] px-6 pb-7 pt-6 text-white">
+            <div class="absolute -right-8 -top-10 h-32 w-32 rounded-full bg-white/10"></div><div class="absolute -bottom-12 -left-8 h-28 w-28 rounded-full bg-black/10"></div>
+            <button type="button" onclick="hidePaymentChannelModal()" class="absolute right-4 top-4 z-10 flex h-9 w-9 items-center justify-center rounded-full bg-white/15 text-white transition hover:bg-white/25 active:scale-90" aria-label="Close"><i class="fa-solid fa-xmark"></i></button>
+            <div class="relative z-[1] flex items-center gap-4"><div class="flex h-14 w-14 shrink-0 items-center justify-center rounded-2xl bg-white text-[25px] text-[#0062FF] shadow-lg"><i class="fa-solid fa-wallet"></i></div><div><h2 class="text-[21px] font-black leading-tight">@Lang.payment_method_title</h2><p class="mt-1 text-[13px] font-semibold text-white/80">@Lang.payment_method_subtitle</p></div></div>
+        </div>
+        <div class="space-y-3 p-5">
+            <button type="button" onclick="selectPaymentChannel('@Constants.BASIC_WALLET_TICKET')" class="group flex w-full items-center gap-4 rounded-[20px] border-2 border-transparent bg-white p-4 text-left shadow-[0_5px_18px_rgba(31,41,55,0.07)] transition hover:-translate-y-0.5 hover:border-[#0062FF] active:scale-[0.98]">
+                <span class="flex h-12 w-12 shrink-0 items-center justify-center rounded-2xl bg-[#E7F0FF] text-[21px] text-[#0062FF]"><i class="fa-solid fa-mobile-screen-button"></i></span><span class="min-w-0 flex-1"><span class="block text-[16px] font-black text-[#171A24]">@Lang.payment_main_account</span><span class="mt-0.5 block text-[12px] font-semibold text-gray-500">@Lang.payment_main_account_desc</span></span><span class="flex h-8 w-8 items-center justify-center rounded-full bg-gray-100 text-gray-400 transition group-hover:bg-[#0062FF] group-hover:text-white"><i class="fa-solid fa-chevron-right text-[12px]"></i></span>
+            </button>
+            <button type="button" onclick="selectPaymentChannel('@Constants.NATCASH_WALLET_TICKET')" class="group flex w-full items-center gap-4 rounded-[20px] border-2 border-transparent bg-white p-4 text-left shadow-[0_5px_18px_rgba(31,41,55,0.07)] transition hover:-translate-y-0.5 hover:border-[#0A9800] active:scale-[0.98]">
+                <span class="flex h-12 w-12 shrink-0 items-center justify-center rounded-2xl bg-[#E7F8E6] text-[21px] text-[#0A9800]"><i class="fa-solid fa-wallet"></i></span><span class="min-w-0 flex-1"><span class="flex items-center gap-2 text-[16px] font-black text-[#171A24]">@Lang.payment_wallet <span class="rounded-full bg-[#E7F8E6] px-2 py-0.5 text-[9px] font-black text-[#0A9800]">PIN</span></span><span class="mt-0.5 block text-[12px] font-semibold text-gray-500">@Lang.payment_wallet_desc</span></span><span class="flex h-8 w-8 items-center justify-center rounded-full bg-gray-100 text-gray-400 transition group-hover:bg-[#0A9800] group-hover:text-white"><i class="fa-solid fa-chevron-right text-[12px]"></i></span>
+            </button>
+            <p class="pt-1 text-center text-[11px] font-semibold text-gray-400"><i class="fa-solid fa-shield-halved mr-1 text-[#0A9800]"></i>@Lang.payment_security_message</p>
+        </div>
+    </div>
+</div>
+
+<!-- Order Summary Screen (from Figma) -->
+<div id="orderSummaryModal" class="hidden fixed inset-0 z-[150] bg-black/60 flex items-center justify-center p-0 font-bricolage backdrop-blur-[2px]">
+        <div class="w-full h-full bg-white flex flex-col animate__animated animate__fadeInRight animate__faster shadow-2xl relative lg:max-w-[414px]">
+        <!-- Header đồng bộ tuyệt đối -->
+        <div class="buy-ticket-modal-header sticky top-0 z-[60]">
+            <button onclick="hideOrderSummary()" class="back-btn" type="button">
+                <i class="fa-solid fa-arrow-left"></i>
+            </button>
+            <div class="header-title">
+                @if (Model.termType == Constants.PIC10_BASIC_CODE) { <text>Basic Pick 10</text> }
+                else if (Model.termType == Constants.Millions_CODE) { <text>Millions</text> }
+                else if (Model.termType == Constants.PIC10_BIGSMALL_CODE) { @Lang.millions_big_small }
+                else { @Lang.millions_odd_even }
+            </div>
+        </div>
+
+        <!-- Content Area: Split into scrollable list and static summary -->
+        <div class="flex-1 flex flex-col min-h-0 bg-gray-50">
+            <!-- Scrollable Ticket List -->
+            <div class="flex-1 overflow-y-auto p-5 pb-2">
+                <div class="flex justify-between items-center px-1 mb-3">
+                     <span class="text-[14px] font-bold text-gray-800">Selected Tickets</span>
+                     <span class="text-[14px] font-bold text-gray-800">@Lang.price</span>
+                </div>
+
+                <!-- Ticket List -->
+                <div id="summaryTicketList" class="flex flex-col gap-4">
+                     <!-- Populated dynamically via JS -->
+                </div>
+            </div>
+
+            <!-- Static Summary Info (Dates & Totals) -->
+            <div class="shrink-0 bg-white p-5 space-y-4 border-t border-gray-100 shadow-[0px_-10px_20px_rgba(0,0,0,0.03)]">
+                 <!-- Dates Section -->
+                 <div class="grid grid-cols-2 gap-4">
+                      <div class="space-y-1">
+                          <span class="text-[11px] font-black text-[#0062FF] block text-center uppercase tracking-tight">@Lang.date_purchase</span>
+                          <div class="bg-white border border-gray-100 rounded-xl py-2.5 px-2 text-center font-black text-[11px] text-gray-700 shadow-sm">
+                              @DateTime.Now.ToString("dddd MMM dd, yyyy", new System.Globalization.CultureInfo("en-US"))
+                          </div>
+                      </div>
+                      <div class="space-y-1">
+                          <span class="text-[11px] font-black text-[#0062FF] block text-center uppercase tracking-tight">@Lang.draw_date</span>
+                          <div class="bg-white border border-gray-100 rounded-xl py-2.5 px-2 text-center font-black text-[11px] text-gray-700 shadow-sm" id="summaryResultDate">
+                              @{
+                                  DateTime drawDate;
+                                  bool isValidDate = DateTime.TryParse(currentTerm?.date_end, out drawDate);
+                                  if (isValidDate) {
+                                     @drawDate.ToString("dddd MMM dd, yyyy", new System.Globalization.CultureInfo("en-US"))
+                                  } else {
+                                     @:N/A
+                                  }
+                              }
+                          </div>
+                      </div>
+                 </div>
+
+                 <!-- Totals Section -->
+                 <div class="space-y-1 px-1">
+                      <div class="flex justify-between items-center">
+                          <span class="text-[14px] font-bold text-black">@Lang.total_ticket</span>
+                          <span id="summaryTotalCount" class="text-[16px] font-black text-black">0</span>
+                      </div>
+                      <div class="flex justify-between items-center">
+                          <span class="text-[14px] font-bold text-black">@Lang.total_money</span>
+                          <div class="flex items-baseline gap-1">
+                              <span id="summaryTotalAmount" class="text-[32px] font-black text-black">0</span>
+                              <span class="text-[16px] font-black text-[#0062FF]">HTG</span>
+                          </div>
+                      </div>
+                 </div>
+            </div>
+        </div>
+
+        <div class="shrink-0 p-4 bg-white border-t border-gray-100 grid grid-cols-2 gap-4 pb-8 shadow-[0px_-4px_20px_rgba(0,0,0,0.05)]">
+            <button onclick="hideOrderSummary()" class="bg-[#FFB000] text-white py-2.5 rounded-2xl font-black text-[18px] shadow-lg shadow-orange-200 active:scale-95 transition-all uppercase tracking-wide">
+                @Lang.reorder
+            </button>
+            <button id="finalPaymentBtn" onclick="confirmCheckout(this)" class="bg-[#0062FF] text-white py-2.5 rounded-2xl font-black text-[18px] shadow-lg shadow-red-200 active:scale-95 transition-all uppercase tracking-wide">
+                @Lang.millions_payment
+            </button>
+        </div>
+    </div>
+</div>
+
+    <!-- OTP Verification Modal (V2 Design Overhaul - Matching Figma) -->
+    <div id="otpModal" class="fixed inset-0 bg-black/80 backdrop-blur-sm z-[200] hidden items-center justify-center p-4">
+        
+        <!-- Outer container to hold the modal + external overflowing elements (like stars/glitter) -->
+        <div class="relative w-full max-w-[360px] mt-6 animate__animated animate__zoomIn animate__faster">
+            
+            <!-- Glitter effect (external to the white box) -->
+            <div class="absolute -top-[100px] -left-[10px] w-[380px] h-[160px] mix-blend-screen pointer-events-none z-0 overflow-visible opacity-90" style="background: url('/Millions/img/modal/otp_glitter.png') no-repeat center center; background-size: contain;"></div>
+
+            <!-- The White Box -->
+            <div class="bg-white rounded-[32px] w-full relative z-10 shadow-[0px_0px_30px_rgba(255,255,255,0.15)] pb-5 border border-yellow-500/20">
+                
+                <!-- Floating Coins from Figma -->
+                <div class="absolute -top-[40px] -right-[10px] z-[80] w-[120px] pointer-events-none drop-shadow-2xl">
+                    <img src="/Millions/img/modal/otp_coins.png" class="w-full object-contain" />
+                </div>
+
+                <!-- Red Header Section -->
+                <div class="relative w-full pt-4 pb-4 bg-[#0062FF] rounded-t-[32px] flex flex-col items-center justify-center z-20" style="border-bottom-left-radius: 50% 20px; border-bottom-right-radius: 50% 20px;">
+                    <h2 class="text-white text-[17px] sm:text-[20px] font-[900] uppercase tracking-wide relative z-10 font-bricolage drop-shadow-md text-center px-4 leading-tight w-[80%] mr-auto">@Lang.millions_confirm_purchase</h2>
+                </div>
+                
+                <!-- Modal Body Content -->
+                <div class="relative px-6 pt-3 flex flex-col items-center gap-3 z-10">
+                    
+                    <!-- Shield Icon: mix-blend-mode multiply to remove the white square background -->
+                    <div class="relative w-full flex justify-center mb-0 mt-1">
+                        <img src="/Millions/img/modal/otp_shield.png" alt="Success" class="w-[90px] object-contain">
+                    </div>
+        
+                    <!-- Info Rows (Aligned exactly like screenshot) -->
+                    <div class="w-full flex flex-col gap-2 items-center mt-0">
+                        <!-- Ticket Info -->
+                        <div class="grid grid-cols-[90px_auto] items-center gap-3 w-full justify-center">
+                            <span class="text-[15px] font-bold text-[#555] text-right font-bricolage">@Lang.millions_ticket</span>
+                            <div id="otpTicketTypeContainer" class="flex justify-start">
+                                <img id="otpTicketTypeImg" src="/Millions/img/even_text.png" class="h-6 object-contain drop-shadow-sm" />
+                            </div>
+                        </div>
+
+                        <!-- Amount Info -->
+                        <div class="grid grid-cols-[90px_auto] items-center gap-3 w-full justify-center">
+                            <span class="text-[15px] font-bold text-[#555] text-right font-bricolage">@Lang.millions_amount</span>
+                            <div class="flex items-baseline gap-1.5 justify-start">
+                                <span id="otpTotalAmount" class="text-[22px] font-[900] text-black leading-none tracking-tight">1.000</span>
+                                <span class="text-[15px] font-[900] text-[#F37021] font-bricolage">HTG</span>
+                            </div>
+                        </div>
+                    </div>
+        
+                    <p id="paymentCodeInstruction" class="text-[14px] font-bold text-[#555] text-center px-4 leading-snug mt-0 font-bricolage">@Lang.millions_otp_instruction</p>
+        
+                    <!-- 6-Slots OTP Grid (Large Gray Blocks) -->
+                    <div class="flex items-center justify-center gap-2 w-full mt-1 px-2" id="otpInputs">
+                        @for (int i = 1; i <= 6; i++)
+                        {
+                            <input type="tel" maxlength="1" id="otp@(i)" 
+                                   oninput="moveToNext(this, '@(i < 6 ? "otp" + (i + 1) : "")')" 
+                                   class="w-[42px] h-[48px] bg-[#757575] rounded-[10px] text-white text-[26px] font-bold text-center appearance-none focus:bg-[#555] focus:scale-[1.03] focus:ring-2 focus:ring-[#0062FF]/50 transition-all outline-none shadow-inner otp-slot"
+                                   placeholder="-">
+                        }
+                    </div>
+                    <div id="walletPinContainer" class="hidden w-full mt-1 px-2">
+                        <div class="relative">
+                            <i class="fa-solid fa-lock absolute left-4 top-1/2 -translate-y-1/2 text-[#0A9800]"></i>
+                            <input id="walletPinInput" type="password" inputmode="numeric" autocomplete="off"
+                                   oninput="this.value = this.value.replace(/[^0-9]/g, ''); updateWalletPinState()"
+                                   class="h-[52px] w-full rounded-[14px] border-2 border-gray-200 bg-gray-50 pl-11 pr-12 text-center text-[22px] font-black tracking-[0.3em] text-gray-800 outline-none transition focus:border-[#0A9800] focus:bg-white focus:ring-4 focus:ring-green-100"
+                                   placeholder="••••">
+                            <button type="button" onclick="toggleWalletPinVisibility()" class="absolute right-4 top-1/2 -translate-y-1/2 text-gray-400 active:scale-90" aria-label="Show PIN"><i id="walletPinEye" class="fa-solid fa-eye"></i></button>
+                        </div>
+                    </div>
+        
+                    <!-- OTP Error Message -->
+                    <p id="otpError" class="text-[#0062FF] font-bold text-[14px] text-center mb-1 hidden animate__animated animate__shakeX"></p>
+
+                    <!-- Timer & Resend -->
+                    <div class="flex flex-col items-center gap-1 mt-0">
+                        <span id="otpTimer" class="text-[15px] font-black text-[#0062FF] font-bricolage">60s</span>
+                        <button id="resendOtpBtn" onclick="sendOtpRequest()" class="hidden text-[14px] font-black text-[#0A9800] underline decoration-solid underline-offset-[3px] transition-all hover:text-[#087a00] disabled:opacity-40 disabled:no-underline font-bricolage">@Lang.millions_request_new_otp</button>
+                    </div>
+        
+                    <!-- Action Buttons: Cancel / Confirm -->
+                    <div class="grid grid-cols-2 gap-3 w-full mt-2">
+                        <button onclick="hideOtpModal()" class="bg-[#FF0000] text-white py-[12px] rounded-[16px] font-[900] text-[17px] shadow-[0_8px_15px_rgba(255,0,0,0.2)] active:scale-95 transition-all tracking-wide">@Lang.millions_cancel</button>
+                        <button id="otpConfirmBtn" disabled onclick="finalizePurchase(this)" class="bg-[#0A9800] text-white py-[12px] rounded-[16px] font-[900] text-[17px] shadow-[0_8px_15px_rgba(10,152,0,0.2)] active:scale-95 transition-all tracking-wide disabled:opacity-50 disabled:grayscale disabled:cursor-not-allowed">@Lang.millions_confirm</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+@section Scripts {
+    <script>
+
+        const maxBalls = @(Model.termType == Constants.PIC10_BASIC_CODE ? 10 : (Model.termType == Constants.Millions_CODE ? 6 : (Model.termType == Constants.PIC10_BIGSMALL_CODE ? 13 : 15)));
+        const isFreeTicketMode = @(isFreeTicketMode ? "true" : "false");
+        const hasFreeTicketPromotion = @(hasFreeTicketPromotion ? "true" : "false");
+        const freeTicketPromotionCode = @Html.Raw(System.Text.Json.JsonSerializer.Serialize(freeTicketPromotionCode));
+
+        function reindexTickets() {
+            $(".ticket-card").each(function(index) {
+                $(this).find(".ticket-index").text(index + 1);
+            });
+        }
+
+        function removeEntry(btn) {
+            var card = $(btn).closest('.ticket-card');
+            card.addClass('animate__animated animate__fadeOutRight animate__faster');
+            setTimeout(function() {
+                card.remove();
+                reindexTickets();
+                updateTotalPrice();
+            }, 300);
+        }
+
+        function randomizeTicket(btn) {
+            var icon = $(btn).find('i');
+            icon.addClass('fa-spin');
+            
+            var card = $(btn).closest('.ticket-card');
+            var balls = card.find('.ball-circle');
+            
+            // Generate unique random numbers
+            var numbers = [];
+            if ("@Model.termType" === "@Constants.Millions_CODE") {
+                // First 5 standard balls (1-70)
+                while(numbers.length < 5){
+                    var r = Math.floor(Math.random() * 70) + 1;
+                    if(numbers.indexOf(r) === -1) numbers.push(r);
+                }
+                numbers.sort((a, b) => a - b);
+                
+                // 6th Mega Ball (1-24)
+                var mb = Math.floor(Math.random() * 24) + 1;
+                numbers.push(mb);
+            } else {
+                while(numbers.length < maxBalls){
+                    var r = Math.floor(Math.random() * 80) + 1;
+                    if(numbers.indexOf(r) === -1) numbers.push(r);
+                }
+                numbers.sort((a, b) => a - b);
+            }
+            
+            // Update balls with staggered animation
+            balls.each(function(index) {
+                var ball = $(this);
+                setTimeout(function() {
+                    var formattedNum = numbers[index].toString().padStart(2, '0');
+                    ball.removeClass('ball-empty').addClass('ball-filled').text(formattedNum);
+                    ball.addClass('animate__animated animate__flipInY');
+                    
+                    if(index === maxBalls - 1) {
+                        setTimeout(() => {
+                            icon.removeClass('fa-spin');
+                            // Replace button with Edit/Delete group
+                            $(btn).hide();
+                            card.find('.edit-delete-group').removeClass('hidden').addClass('animate__animated animate__fadeInRight animate__faster');
+                            updateTotalPrice();
+                        }, 300);
+                    }
+                }, index * 40);
+            });
+        }
+
+        function clearTicket(btn) {
+            var card = $(btn).closest('.ticket-card');
+            var balls = card.find('.ball-circle');
+            
+            balls.removeClass('ball-filled animate__animated animate__flipInY shadow-inner').addClass('ball-empty').text('');
+            
+            // Hide Edit/Delete group and show Rand button
+            card.find('.edit-delete-group').addClass('hidden');
+            card.find('.rand-btn').show().addClass('animate__animated animate__fadeInLeft animate__faster');
+            
+            updateTotalPrice();
+        }
+
+        // Open Number Picker Modal
+        var activeBall = null;
+        var activeTicketCard = null;
+        var selectedNumbers = []; // For Edit mode, this will be an array of fixed size with nulls
+        var isMultiMode = false;
+
+        function editFullTicket(btn) {
+            isMultiMode = true;
+            activeTicketCard = $(btn).closest('.ticket-card');
+            activeBall = null;
+            
+            // Initialize fixed slots for slot-based editing
+            selectedNumbers = new Array(maxBalls).fill(null);
+            let existing = [];
+            activeTicketCard.find('.ball-filled').each(function() {
+                var num = $(this).text().trim();
+                if(num) existing.push(num);
+            });
+            
+            // Initial fill from left to right
+            existing.forEach((num, idx) => {
+                if(idx < maxBalls) selectedNumbers[idx] = num;
+            });
+
+            openNumberPicker(true);
+        }
+
+        function openNumberPicker(isMulti) {
+            var modal = $("#numberPickerModal");
+            var grid = $("#numberGrid");
+            var title = $("#modalTitle");
+            var countArea = $(".selection-count-area");
+            var confirmBtn = $("#confirmBtn");
+            
+            grid.empty();
+            if (isMulti) {
+                title.text("Edit Ticket");
+                countArea.removeClass('hidden');
+                confirmBtn.removeClass('hidden').text("@Lang.confirm");
+            } else {
+                title.text("Pick Number");
+                countArea.addClass('hidden');
+                confirmBtn.removeClass('hidden').text("@Lang.confirm");
+            }
+            
+            updateSelectionCount(); 
+            liveUpdateTicket();
+
+            // Focus card: append a tall spacer so even the last ticket can scroll up
+            // above the number-picker sheet (a flex column container does not honor
+            // padding-bottom as scrollable space), then bring the card to the top.
+            if (activeTicketCard && activeTicketCard.length) {
+                var container = $("#ticketContainer");
+                $("#editScrollSpacer").remove();
+                container.append('<div id="editScrollSpacer" aria-hidden="true" style="height:100vh;flex-shrink:0;"></div>');
+                var scrollPos = activeTicketCard.offset().top - container.offset().top + container.scrollTop();
+                container.stop().animate({ scrollTop: scrollPos - 15 }, 500);
+            }
+
+            var isMillions = "@Model.termType" === "@Constants.Millions_CODE";
+            
+            if (isMillions) {
+                // Millions Split UI: 1-70 (cols-7) | Divider | 1-24 (cols-3)
+                var splitHtml = `
+                    <div class="flex gap-3 h-full">
+                         <!-- Left: Standard (1-70) -->
+                         <div class="flex-1 flex flex-col h-full min-w-0">
+                              <span class="text-[10px] font-black text-blue-600 mb-1 uppercase tracking-wider shrink-0">Standard (1-70)</span>
+                              <div class="flex-1 overflow-y-auto grid grid-cols-7 gap-1 pr-1 pb-2" id="standardGrid" style="scrollbar-width: thin; scrollbar-color: #0062FF transparent;"></div>
+                         </div>
+                         <!-- Divider -->
+                         <div class="w-[1px] bg-gray-300 self-stretch my-1 shrink-0"></div>
+                         <!-- Right: Mega Ball (1-24) -->
+                         <div class="w-[105px] flex flex-col h-full shrink-0">
+                              <span class="text-[10px] font-black text-red-600 mb-1 uppercase tracking-wider shrink-0 text-center">Mega (1-24)</span>
+                              <div class="flex-1 overflow-y-auto grid grid-cols-3 gap-1 pl-1 pb-2" id="megaGrid" style="scrollbar-width: thin; scrollbar-color: #E3132D transparent;"></div>
+                         </div>
+                    </div>
+                `;
+                grid.append(splitHtml);
+                
+                var standardContainer = $("#standardGrid");
+                var megaContainer = $("#megaGrid");
+                
+                // Populate Standard (1-70)
+                for (var i = 1; i <= 70; i++) {
+                    var formatted = i.toString().padStart(2, '0');
+                    var isSelected = selectedNumbers.slice(0, 5).includes(formatted);
+                    var btnClass = isSelected 
+                        ? 'bg-[#0062FF] text-white shadow-sm' 
+                        : 'bg-white text-gray-700 hover:bg-gray-100 border border-gray-100';
+                    
+                    standardContainer.append(`<button type="button" class="std-num-btn w-[26px] h-[26px] rounded-full font-black text-[9.5px] transition-all flex items-center justify-center ${btnClass}">${formatted}</button>`);
+                }
+                
+                // Populate Mega (1-24)
+                for (var i = 1; i <= 24; i++) {
+                    var formatted = i.toString().padStart(2, '0');
+                    var isSelected = selectedNumbers[5] === formatted;
+                    var btnClass = isSelected 
+                        ? 'bg-[#E3132D] text-white shadow-sm' 
+                        : 'bg-white text-gray-700 hover:bg-gray-100 border border-gray-100';
+                    
+                    megaContainer.append(`<button type="button" class="mega-num-btn w-[26px] h-[26px] rounded-full font-black text-[9.5px] transition-all flex items-center justify-center ${btnClass}">${formatted}</button>`);
+                }
+                
+                // Standard Grid Click Handler
+                standardContainer.on('click', '.std-num-btn', function(e) {
+                    e.preventDefault();
+                    var $btn = $(this);
+                    var picked = $btn.text().trim();
+                    
+                    if (isMultiMode) {
+                        var stdSelected = selectedNumbers.slice(0, 5);
+                        if (stdSelected.includes(picked)) {
+                            // Deselect
+                            let idx = selectedNumbers.indexOf(picked);
+                            if (idx !== -1 && idx < 5) selectedNumbers[idx] = null;
+                            $btn.removeClass('bg-[#0062FF] text-white shadow-sm').addClass('bg-white text-gray-700 border border-gray-100');
+                        } else {
+                            // Select standard ball (first empty slot in 0-4)
+                            let emptyIdx = -1;
+                            for (var k = 0; k < 5; k++) {
+                                if (selectedNumbers[k] === null) {
+                                    emptyIdx = k;
+                                    break;
+                                }
+                            }
+                            if (emptyIdx !== -1) {
+                                selectedNumbers[emptyIdx] = picked;
+                                $btn.addClass('bg-[#0062FF] text-white shadow-sm').removeClass('bg-white text-gray-700 border border-gray-100');
+                            }
+                        }
+                        liveUpdateTicket();
+                    }
+                    updateSelectionCount();
+                });
+                
+                // Mega Grid Click Handler
+                megaContainer.on('click', '.mega-num-btn', function(e) {
+                    e.preventDefault();
+                    var $btn = $(this);
+                    var picked = $btn.text().trim();
+                    
+                    if (isMultiMode) {
+                        if (selectedNumbers[5] === picked) {
+                            // Deselect Mega Ball
+                            selectedNumbers[5] = null;
+                            $btn.removeClass('bg-[#E3132D] text-white shadow-sm').addClass('bg-white text-gray-700 border border-gray-100');
+                        } else {
+                            // Overwrite Mega Ball
+                            selectedNumbers[5] = picked;
+                            megaContainer.find('.mega-num-btn').removeClass('bg-[#E3132D] text-white shadow-sm').addClass('bg-white text-gray-700 border border-gray-100');
+                            $btn.addClass('bg-[#E3132D] text-white shadow-sm').removeClass('bg-white text-gray-700 border border-gray-100');
+                        }
+                        liveUpdateTicket();
+                    }
+                    updateSelectionCount();
+                });
+                
+            } else {
+                // Default Pick 10 UI: 1-80 Grid
+                var normalHtml = `<div class="grid grid-cols-10 gap-1.5 w-full pb-2 h-full overflow-y-auto" id="normalGrid"></div>`;
+                grid.append(normalHtml);
+                var normalContainer = $("#normalGrid");
+                
+                for (var i = 1; i <= 80; i++) {
+                    var formatted = i.toString().padStart(2, '0');
+                    var isSelected = selectedNumbers.includes(formatted);
+                    
+                    var btnClass = isSelected 
+                        ? 'bg-[#0062FF] text-white shadow-md scale-105 active-num' 
+                        : 'bg-white text-gray-700 hover:bg-gray-100 border border-gray-100';
+                    
+                    normalContainer.append(`<button type="button" class="num-btn w-8 h-8 rounded-full font-black text-[11px] transition-all focus:outline-none flex items-center justify-center ${btnClass}">${formatted}</button>`);
+                }
+                
+                normalContainer.on('click', '.num-btn', function(e) {
+                    e.preventDefault();
+                    var $btn = $(this);
+                    var picked = $btn.text().trim();
+                    
+                    if (isMultiMode) {
+                        if (selectedNumbers.includes(picked)) {
+                            let idx = selectedNumbers.indexOf(picked);
+                            if (idx !== -1) selectedNumbers[idx] = null;
+                            $btn.removeClass('bg-[#0062FF] text-white shadow-md scale-105 active-num').addClass('bg-white text-gray-700 border border-gray-100');
+                        } else {
+                            let firstEmpty = selectedNumbers.indexOf(null);
+                            if (firstEmpty !== -1) {
+                                selectedNumbers[firstEmpty] = picked;
+                                $btn.addClass('bg-[#0062FF] text-white shadow-md scale-105 active-num').removeClass('bg-white text-gray-700 border border-gray-100');
+                            }
+                        }
+                        liveUpdateTicket();
+                    }
+                    updateSelectionCount();
+                });
+            }
+
+            modal.removeClass('hidden').addClass('flex');
+            modal.find('.modal-content').removeClass('animate__zoomOut').addClass('animate__zoomIn');
+        }
+
+        function updateSelectionCount() {
+            var count = selectedNumbers.filter(n => n !== null && n !== "").length;
+            $("#selectionCount").text(count);
+            $("#maxSelectionCount").text(maxBalls);
+            var isValid = isMultiMode ? (count === maxBalls) : (count === 1);
+            if (isValid) {
+                $("#confirmBtn").prop('disabled', false).removeClass('opacity-50 cursor-not-allowed').addClass('cursor-pointer');
+            } else {
+                $("#confirmBtn").prop('disabled', true).addClass('opacity-50 cursor-not-allowed').removeClass('cursor-pointer');
+            }
+        }
+
+        function liveUpdateTicket() {
+            if (!activeTicketCard) return;
+            var balls = activeTicketCard.find('.ball-circle');
+            
+            if (isMultiMode) {
+                // Update Ticket Card balls
+                for(var i=0; i < maxBalls; i++){
+                    var val = selectedNumbers[i];
+                    if (i < balls.length) {
+                        var tBall = $(balls[i]);
+                        if (val) {
+                            tBall.removeClass('ball-empty').addClass('ball-filled').text(val);
+                        } else {
+                            tBall.removeClass('ball-filled').addClass('ball-empty').text('');
+                        }
+                    }
+                }
+                
+                // Toggle Rand/Edit button visibility
+                if (selectedNumbers.filter(n => n !== null && n !== "").length > 0) {
+                     activeTicketCard.find('.rand-btn').hide();
+                     activeTicketCard.find('.edit-delete-group').removeClass('hidden').show();
+                } else {
+                     activeTicketCard.find('.rand-btn').show();
+                     activeTicketCard.find('.edit-delete-group').addClass('hidden');
+                }
+                
+                updateTotalPrice();
+            }
+        }
+
+        // All immediate jQuery event bindings must wait for DOM + jQuery to be ready
+        document.addEventListener("DOMContentLoaded", function() {
+            // Click on a ball (filled or empty) to edit the full ticket
+            $(document).on('click', '.ball-filled, .ball-empty', function() {
+                editFullTicket(this);
+            });
+
+            updateTotalPrice();
+
+            // Confirm button handler
+            $(document).off('click', '#confirmBtn').on('click', '#confirmBtn', function(e) {
+                e.preventDefault();
+                // Check non-null count
+                var count = selectedNumbers.filter(n => n !== null && n !== "").length;
+                if (count === 0) return;
+
+                if (isMultiMode && activeTicketCard && activeTicketCard.length > 0) {
+                    // Double check validation for Mega Ball before confirming
+                    if ("@Model.termType" === "@Constants.Millions_CODE") {
+                        var mbVal = selectedNumbers[5];
+                        if (mbVal) {
+                            var mbValInt = parseInt(mbVal);
+                            if (mbValInt < 1 || mbValInt > 24) {
+                                showNotification("🎱 @Lang.millions_megaball_invalid_title\n@Lang.millions_megaball_invalid_desc", "warning");
+                                return;
+                            }
+                        }
+                    }
+
+                    // Keep exact selected order, do not sort!
+                    var finalSorted = [];
+                    if ("@Model.termType" === "@Constants.Millions_CODE") {
+                        var first5 = selectedNumbers.slice(0, 5).filter(n => n !== null && n !== "");
+                        var mb = selectedNumbers[5];
+                        finalSorted = first5;
+                        if (mb) finalSorted.push(mb);
+                    } else {
+                        finalSorted = selectedNumbers.filter(n => n !== null && n !== "");
+                    }
+                    
+                    var balls = activeTicketCard.find('.ball-circle');
+                    balls.removeClass('ball-filled').addClass('ball-empty').text('');
+
+                    finalSorted.forEach((num, index) => {
+                        if (index < balls.length) {
+                            $(balls[index]).removeClass('ball-empty').addClass('ball-filled').text(num);
+                            $(balls[index]).addClass('animate__animated animate__pulse');
+                            setTimeout(() => $(balls[index]).removeClass('animate__animated animate__pulse'), 500);
+                        }
+                    });
+
+                    activeTicketCard.find('.rand-btn').hide();
+                    activeTicketCard.find('.edit-delete-group').removeClass('hidden').show();
+                    
+                    updateTotalPrice();
+                } else if (!isMultiMode && activeBall && activeBall.length > 0) {
+                    // Single mode: Update only the active ball
+                    activeBall.text(selectedNumbers[0]).removeClass('ball-empty').addClass('ball-filled');
+                    activeBall.addClass('animate__animated animate__pulse');
+                    setTimeout(() => activeBall.removeClass('animate__animated animate__pulse'), 500);
+                    
+                    var card = activeBall.closest('.ticket-card');
+                    var filledBalls = card.find('.ball-filled').length;
+                    if (filledBalls > 0) {
+                        card.find('.rand-btn').hide();
+                        card.find('.edit-delete-group').removeClass('hidden').show();
+                    } else {
+                        card.find('.rand-btn').show();
+                        card.find('.edit-delete-group').addClass('hidden');
+                    }
+                    
+                    updateTotalPrice();
+                }
+
+                closeNumberPicker();
+            });
+        });
+
+        function closeNumberPicker() {
+            var modal = $("#numberPickerModal");
+            modal.find('.modal-content').removeClass('animate__zoomIn').addClass('animate__zoomOut');
+            setTimeout(() => {
+                modal.removeClass('flex').addClass('hidden');
+                // Remove the temporary scroll spacer
+                $("#editScrollSpacer").remove();
+                // Reset state
+                activeBall = null;
+                activeTicketCard = null;
+            }, 200);
+        }
+
+        function updateTotalPrice() {
+            var filledTickets = 0;
+            $(".ticket-card").each(function() {
+                if ($(this).find(".ball-filled").length === maxBalls) {
+                    filledTickets++;
+                }
+            });
+            const pricePerTicket = hasFreeTicketPromotion
+                ? 0
+                : @(Model.termType == Constants.PIC10_BASIC_CODE ? "10" : (Model.termType == Constants.Millions_CODE ? "6" : "50"));
+            $("#totalPrice").text(formatMoneyV2(filledTickets * pricePerTicket));
+            $("#totalTicketCount").text(filledTickets);
+        }
+
+        function addNewTicket() {
+            if (isFreeTicketMode) return;
+
+            var container = $("#ticketContainer");
+            var wrapper = $("#addButtonWrapper");
+            var currentIndex = $(".ticket-card").length + 1;
+            
+            var ballsHtml = '';
+            var isMillions = @(Model.termType == Constants.Millions_CODE ? "true" : "false");
+            for (var i = 0; i < maxBalls; i++) {
+                var isMbBall = isMillions && i === 5;
+                var mbIndicator = isMbBall ? '<div class="absolute -bottom-[6px] -right-[4px] bg-[#FFD700] text-black text-[8.5px] font-black px-[2.5px] py-[1.5px] rounded-[3px] shadow-sm leading-none z-10 border border-[#EAA800]">MB</div>' : '';
+                ballsHtml += '<div class="relative w-fit"><div class="ball-circle ball-empty' + (isMbBall ? ' ball-mb-circle' : '') + '"></div>' + mbIndicator + '</div>';
+            }
+
+            var ticketHtml = `
+                <div class="ticket-card relative group active:bg-gray-50 transition-colors cursor-pointer animate__animated animate__fadeInUp animate__faster">
+                    <button onclick="removeEntry(this)" class="absolute -right-2 top-1 w-7 h-7 bg-[#FF0000] text-white rounded-full flex items-center justify-center text-[11px] shadow-sm z-[10] hover:bg-red-700 transition-all border-2 border-red-600">
+                        <i class="fa-solid fa-xmark"></i>
+                    </button>
+                    <div class="absolute left-2 top-4 w-9 h-9 rounded-full border-[3px] border-white flex items-center justify-center text-white font-black text-sm shadow-md ticket-index">${currentIndex}</div>
+                    <div class="flex flex-col gap-1 pl-8">
+                        <span class="text-[16px] font-extrabold text-[#333]">@Lang.millions_select_10_lucky_numbers</span>
+                        <div class="flex items-center gap-4">
+                            <div class="grid grid-cols-6 gap-y-2 gap-x-1 flex-1">
+                                ${ballsHtml}
+                            </div>
+                            <div class="w-[90px] action-area flex flex-col gap-2">
+                                 <button onclick="randomizeTicket(this)" class="rand-btn w-full bg-[#2B83F2] text-white flex items-center justify-center gap-1.5 py-1.5 rounded-xl font-extrabold text-[11px] shadow-sm active:scale-95 transition-all">
+                                     <i class="fa-solid fa-arrows-rotate text-[10px]"></i> @Lang.Random
+                                 </button>
+                                 <div class="edit-delete-group hidden flex flex-col gap-2">
+                                     <button onclick="editFullTicket(this)" class="w-full bg-[#16A34A] text-white flex items-center justify-center gap-1.5 py-1.5 rounded-xl font-black text-[12px] shadow-sm active:scale-95 transition-all">
+                                         <img src="/Millions/img/icons/icon_edit.png" onerror="this.style.display='none'" class="w-[16px] h-[16px] object-contain"> @Lang.millions_edit
+                                     </button>
+                                     <button onclick="clearTicket(this)" class="w-full bg-[#A855F7] text-white flex items-center justify-center gap-1.5 py-1.5 rounded-xl font-black text-[12px] shadow-sm active:scale-95 transition-all">
+                                         <img src="/Millions/img/icons/icon_delete.png" onerror="this.style.display='none'" class="w-[16px] h-[16px] object-contain"> @Lang.millions_delete
+                                     </button>
+                                 </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            `;
+            
+            $(ticketHtml).insertBefore(wrapper);
+            container.animate({ scrollTop: container.prop("scrollHeight") }, 300);
+        }
+
+        // --- Order Summary Modal Logic ---
+        // --- Payment Preparation & Order Summary Logic ---
+        let pendingTickets = [];
+        let currentChannelPayment = '@Constants.BASIC_WALLET_TICKET';
+        let isPreparingCheckout = false;
+        let isSendingOtp = false;
+        let isFinalizingPurchase = false;
+        let paymentClickArmedAt = 0;
+
+        function armPaymentClick(event) {
+            if (event && event.isTrusted === true) paymentClickArmedAt = Date.now();
+        }
+
+        function armPaymentKey(event) {
+            if (event && event.isTrusted === true && (event.key === "Enter" || event.key === " ")) {
+                paymentClickArmedAt = Date.now();
+            }
+        }
+
+        function preparePayment(event) {
+            // Never prepare or confirm a ticket during page initialization.
+            // A trusted pointer/key action on this button must immediately precede the click.
+            const hasFreshPaymentIntent = paymentClickArmedAt > 0
+                && Date.now() - paymentClickArmedAt <= 1500;
+            paymentClickArmedAt = 0;
+            if (!event || event.type !== "click" || event.isTrusted !== true || !hasFreshPaymentIntent) return;
+
+            const isBSMode = @(Model.termType == Constants.PIC10_BIGSMALL_CODE || Model.termType == Constants.PIC10_ODDEVEN_CODE ? "true" : "false");
+            const tickets = [];
+
+            if (isBSMode) {
+                if (!bsChoice) {
+                    showNotification("Please select a choice first.", "warning");
+                    return;
+                }
+                
+                let bsCode = "";
+                if ('@Model.termType' === '@Constants.PIC10_BIGSMALL_CODE') {
+                    bsCode = (bsChoice === 'big') ? "B" : "S";
+                } else {
+                    bsCode = (bsChoice === 'big') ? "O" : "E"; // Odd = O, Even = E
+                }
+
+                tickets.push({
+                    code: bsCode,
+                    money: "50"
+                });
+            } else {
+                $(".ticket-card").each(function() {
+                    if (isFreeTicketMode && tickets.length >= 1) return false;
+
+                    const balls = $(this).find(".ball-filled");
+                    if (balls.length === maxBalls) {
+                        const selectedNumbers = [];
+                        balls.each(function() { selectedNumbers.push($(this).text().trim()); });
+                        const itemPrice = "@(Model.termType == Constants.PIC10_BASIC_CODE ? "10" : (Model.termType == Constants.Millions_CODE ? "6" : "50"))";
+                        tickets.push({
+                            code: selectedNumbers.join(','),
+                            money: itemPrice
+                        });
+                    }
+                });
+
+                if (tickets.length === 0) {
+                    showNotification("@Lang.millions_ticket_not_valid", "warning");
+                    return;
+                }
+            }
+
+            pendingTickets = tickets;
+            if (hasFreeTicketPromotion) {
+                selectPaymentChannel('@Constants.BASIC_WALLET_TICKET');
+                return;
+            }
+            $("#paymentChannelModal").removeClass("hidden").addClass("flex");
+        }
+
+        function hidePaymentChannelModal() {
+            $("#paymentChannelModal").removeClass("flex").addClass("hidden");
+        }
+
+        function selectPaymentChannel(channelPayment) {
+            if (isPreparingCheckout) return;
+            isPreparingCheckout = true;
+
+            currentChannelPayment = channelPayment;
+            hidePaymentChannelModal();
+
+            const requestData = {
+                gameId: isFreeTicketMode ? "@Constants.Millions_CODE" : "@Model.termType",
+                ticket: pendingTickets,
+                channelPayment: channelPayment,
+                promotionCode: isFreeTicketMode ? freeTicketPromotionCode : null
+            };
+
+            $.ajax({
+                url: subDomain + '@Url.Action("ConfirmTicketData", "Home")',
+                type: 'POST',
+                contentType: 'application/json',
+                data: JSON.stringify(requestData),
+                success: function(data) {
+
+                    if (data.responseCode === "0" || data.responseCode === "0000") {
+                        showOrderSummary(data, pendingTickets);
+                    } else {
+                        showNotification(data.responseMessage || "Confirmation failed", data.responseCode);
+                    }
+                },
+                error: function(err) {
+
+                    showNotification("Network error occurred.", "warning");
+                },
+                complete: function() {
+                    isPreparingCheckout = false;
+                }
+            });
+        }
+
+        let currentTransId = null;
+
+        function showOrderSummary(apiData, localTickets) {
+            currentTransId = apiData.transId;
+            const summaryModal = $("#orderSummaryModal");
+            const summaryList = $("#summaryTicketList");
+            summaryList.empty();
+
+            const displayTickets = (apiData && apiData.ticket) ? apiData.ticket : (localTickets || []);
+            if (!displayTickets || !Array.isArray(displayTickets)) {
+                console.warn("No tickets found to display in summary.");
+                return;
+            }
+
+            displayTickets.forEach((t, index) => {
+                const numbers = t.code.split(',');
+                let contentHtml = '';
+                
+                if (numbers.length > 1) {
+                    const isMillionsGame = "@Model.termType" === "@Constants.Millions_CODE";
+                    let numbersBalls = '';
+                    numbers.forEach((n, ni) => {
+                        var isMbBall = isMillionsGame && ni === numbers.length - 1;
+                        var ballBg = isMbBall
+                            ? 'background: radial-gradient(circle at 50% 50%, #0062ff 0%, #0062ff 60%, #0149f0 75%, #0231e0 85%, #0218d1 92%, #0300c2 100%); box-shadow: inset 0 0 6px 2px rgba(0,24,209,0.5), 0 4px 10px rgba(2,24,209,0.3);'
+                            : 'background: linear-gradient(135deg, #FF3D63 0%, #E3132D 60%, #BA0F21 100%); box-shadow: 0 4px 10px rgba(186,15,33,0.3);';
+                        numbersBalls += `<div class="w-7 h-7 rounded-full flex items-center justify-center text-white text-[11px] font-black" style="${ballBg} border: 1px solid rgba(255, 255, 255, 0.3); text-shadow: 0px 1px 2px rgba(0,0,0,0.1); transition: transform 0.2s;">${n.trim()}</div>`;
+                    });
+                    var summaryGridCols = isMillionsGame ? 'grid-cols-6' : 'grid-cols-5';
+                    contentHtml = `<div class="grid ${summaryGridCols} gap-y-2 gap-x-1 relative z-10 px-1 justify-items-center">${numbersBalls}</div>`;
+                } else {
+                    const isBS = @(Model.termType == Constants.PIC10_BIGSMALL_CODE ? "true" : "false");
+                    const isFirstChoice = (numbers[0] === 'B' || numbers[0] === 'O');
+                    const label = isFirstChoice ? (isBS ? "Big" : "Odd") : (isBS ? "Small" : "Even");
+                    const color = isFirstChoice ? (isBS ? "#A2FF00" : "#FFC700") : (isBS ? "#FF4157" : "#B33BD0");
+                    contentHtml = `<div class="w-full flex justify-center"><span class="text-[28px] font-black italic uppercase" style="-webkit-text-stroke: 1px #000; color: ${color};">${label}</span></div>`;
+                }
+
+                const itemHtml = `
+                    <div class="flex items-center gap-3">
+                        <div class="flex-1 rounded-2xl p-3 relative overflow-hidden flex flex-col gap-2 min-h-[80px] justify-center shadow-sm" 
+                             style="background: white; border: 1.5px solid #0062FF;">
+                            ${contentHtml}
+                        </div>
+                        <div class="w-24 shrink-0 bg-white border border-gray-200 rounded-2xl p-2.5 flex items-center justify-center shadow-sm">
+                            <div class="flex items-baseline gap-0.5">
+                                <span class="text-[20px] font-black text-black">${formatMoneyV2(hasFreeTicketPromotion ? 0 : t.money)}</span>
+                                <span class="text-[12px] font-black text-[#0062FF]">HTG</span>
+                            </div>
+                        </div>
+                    </div>
+                `;
+                summaryList.append(itemHtml);
+            });
+
+            $("#summaryTotalCount").text(displayTickets.length);
+            const totalMoney = hasFreeTicketPromotion
+                ? "0"
+                : (apiData.totalMoneyPayment || apiData.totalMoney || "0");
+            $("#summaryTotalAmount").text(formatMoneyV2(totalMoney));
+
+            summaryModal.removeClass("hidden").addClass("flex");
+        }
+
+        function hideOrderSummary() {
+            $("#orderSummaryModal").removeClass("flex").addClass("hidden");
+        }
+
+        function confirmCheckout(btn) {
+            if (isSendingOtp) return;
+
+            if (currentChannelPayment === '@Constants.NATCASH_WALLET_TICKET') {
+                showOtpModal(true);
+                return;
+            }
+
+            isSendingOtp = true;
+            const originalText = $(btn).html();
+            $(btn).prop('disabled', true).html('<i class="fa-solid fa-spinner fa-spin mr-2"></i>Processing...');
+
+            // Trigger SendOTP API
+            $.ajax({
+                url: subDomain + '@Url.Action("SendOTP", "Home")',
+                type: 'POST',
+                success: function(data) {
+                    $(btn).prop('disabled', false).html(originalText);
+                    
+                    if (data.responseCode === "0") {
+                        showOtpModal(false);
+                    } else {
+                        showNotification(data.responseMessage || "Failed to send OTP", data.responseCode);
+                    }
+                },
+                error: function() {
+                    $(btn).prop('disabled', false).html(originalText);
+                    showNotification("Network error occurred.", "warning");
+                },
+                complete: function() {
+                    isSendingOtp = false;
+                }
+            });
+        }
+
+        let otpInterval;
+        function showOtpModal(isWalletPin) {
+            hideOrderSummary();
+            $("#otpModal").removeClass("hidden").addClass("flex");
+            $("#otpInputs input").val("");
+            $("#walletPinInput").val("").attr("type", "password");
+            $("#walletPinEye").attr("class", "fa-solid fa-eye");
+            $("#otpConfirmBtn").prop('disabled', true);
+            $("#otpError").addClass("hidden").text("");
+            
+            // Map game type to readable name & image
+            let gameTypeStr = "@Model.termType";
+            let displayName = gameTypeStr === "@Constants.Millions_CODE" ? "@Lang.millions" : "Basic Pick 10";
+            let imgSrc = "";
+            
+            if (gameTypeStr === "@Constants.PIC10_BIGSMALL_CODE") {
+                // Get the specific choice from summary
+                let firstTicketText = $("#summaryTicketList").find("span.font-black").first().text().trim();
+                if (firstTicketText) {
+                    displayName = firstTicketText.charAt(0).toUpperCase() + firstTicketText.slice(1).toLowerCase(); // Normalize to "Big" or "Small"
+                } else {
+                    displayName = "Big / Small";
+                }
+            } else if (gameTypeStr === "@Constants.PIC10_ODDEVEN_CODE") {
+                let firstTicketText = $("#summaryTicketList").find("span.font-black").first().text().trim();
+                if (firstTicketText) {
+                    displayName = firstTicketText.charAt(0).toUpperCase() + firstTicketText.slice(1).toLowerCase(); // Normalize to "Odd" or "Even"
+                } else {
+                    displayName = "Odd / Even";
+                }
+            }
+            
+            // Determine color based on game type
+            let typeColorClass = "text-purple-700"; // default
+            if (gameTypeStr === "@Constants.PIC10_BASIC_CODE") typeColorClass = "text-[#0062FF]";
+            else if (gameTypeStr === "@Constants.Millions_CODE") typeColorClass = "text-[#0062FF]";
+            else if (gameTypeStr === "@Constants.PIC10_BIGSMALL_CODE") typeColorClass = "text-[#0A9800]";
+            else if (gameTypeStr === "@Constants.PIC10_ODDEVEN_CODE") typeColorClass = "text-[#9333ea]";
+
+            // Hide image for now and use the beautiful text style as requested
+            $("#otpTicketTypeImg").hide();
+            $("#otpTicketTypeContainer").find("span").remove();
+            $("#otpTicketTypeContainer").append(`<span class='text-[17px] font-[900] ${typeColorClass} italic'>${displayName}</span>`);
+            
+            $("#otpTotalAmount").text($("#summaryTotalAmount").text());
+            if (isWalletPin) {
+                $("#paymentCodeInstruction").text('@Html.Raw(Lang.payment_wallet_pin_instruction.Replace("'", "\\'"))');
+                $("#otpInputs").addClass("hidden");
+                $("#walletPinContainer").removeClass("hidden");
+                $("#otpTimer, #resendOtpBtn").addClass("hidden");
+                clearInterval(otpInterval);
+                $("#walletPinInput").focus();
+            } else {
+                $("#paymentCodeInstruction").text('@Html.Raw(Lang.millions_otp_instruction.Replace("'", "\\'"))');
+                $("#walletPinContainer").addClass("hidden");
+                $("#otpInputs").removeClass("hidden");
+                startOtpTimer(60);
+                $("#otp1").focus();
+            }
+        }
+
+        function updateWalletPinState() {
+            $("#otpConfirmBtn").prop('disabled', $("#walletPinInput").val().length === 0);
+            $("#otpError").addClass("hidden").text("");
+        }
+
+        function toggleWalletPinVisibility() {
+            const input = $("#walletPinInput");
+            const showPin = input.attr("type") === "password";
+            input.attr("type", showPin ? "text" : "password");
+            $("#walletPinEye").attr("class", showPin ? "fa-solid fa-eye-slash" : "fa-solid fa-eye");
+            input.focus();
+        }
+
+        // Add backspace support for OTP inputs
+        $("#otpInputs input").on("keyup", function() {
+            let otp = "";
+            $("#otpInputs input").each(function() { otp += $(this).val(); });
+            $("#otpConfirmBtn").prop('disabled', otp.length < 6);
+        });
+
+        $("#otpInputs input").on("keydown", function(e) {
+            if (e.key === "Backspace" && this.value.length === 0) {
+                $(this).prev('input').focus();
+            }
+        });
+
+        function hideOtpModal() {
+            $("#otpModal").removeClass("flex").addClass("hidden");
+            clearInterval(otpInterval);
+        }
+
+        function startOtpTimer(seconds) {
+            let timeLeft = seconds;
+            $("#resendOtpBtn").addClass("hidden");
+            $("#otpTimer").removeClass("hidden").text(timeLeft + "s");
+            clearInterval(otpInterval);
+            
+            otpInterval = setInterval(() => {
+                timeLeft--;
+                $("#otpTimer").text(timeLeft + "s");
+                if (timeLeft <= 0) {
+                    clearInterval(otpInterval);
+                    $("#otpTimer").addClass("hidden");
+                    $("#resendOtpBtn").removeClass("hidden");
+                }
+            }, 1000);
+        }
+
+        function moveToNext(el, nextId) {
+            if (el.value.length >= 1) {
+                if (nextId) document.getElementById(nextId).focus();
+            }
+            
+            let otp = "";
+            $("#otpInputs input").each(function() { otp += $(this).val(); });
+            $("#otpConfirmBtn").prop('disabled', otp.length < 6);
+
+            // Clear error when typing
+            $("#otpError").addClass("hidden").text("");
+        }
+
+        function sendOtpRequest() {
+            // Re-trigger SendOTP
+            $.ajax({
+                url: subDomain + '@Url.Action("SendOTP", "Home")',
+                type: 'POST',
+                success: function(data) {
+                    if (data.responseCode === "0") {
+                        startOtpTimer(60);
+                        showNotification("OTP has been resent.", "success");
+                    } else {
+                        showNotification(data.responseMessage || "Failed to resend OTP", data.responseCode);
+                    }
+                }
+            });
+        }
+
+        function showReceiptSuccess(transId, amount, phone, totalTickets, drawDate) {
+            // Setup data dynamically
+            $("#receiptAmount").text(formatMoneyV2(amount) + " HTG");
+            if(phone) $("#receiptPhone").text(phone);
+            if(totalTickets) $("#receiptTotalTickets").text(totalTickets);
+            if(drawDate) $("#receiptDrawDate").text(drawDate);
+            
+            let gameTypeStr = "@Model.termType";
+            let displayName = "Basic Pick 10";
+            if (gameTypeStr === "@Constants.PIC10_BIGSMALL_CODE") displayName = "@Lang.millions_big_small";
+            else if (gameTypeStr === "@Constants.PIC10_ODDEVEN_CODE") displayName = "@Lang.millions_odd_even";
+            else if (gameTypeStr === "@Constants.Millions_CODE") displayName = "Millions";
+            
+            $("#receiptGameType").text("@Lang.buy " + displayName);
+            $("#receiptTicketCode").text("#" + transId);
+            
+            let choiceText = "-";
+            if (gameTypeStr === "@Constants.PIC10_BIGSMALL_CODE" || gameTypeStr === "@Constants.PIC10_ODDEVEN_CODE") {
+                choiceText = $("#summaryTicketList .flex.items-center span.font-black").first().text().trim();
+            } else {
+                choiceText = gameTypeStr === "@Constants.Millions_CODE" ? "Millions" : "PICK 10";
+            }
+            $("#receiptChoice").text(choiceText);
+            
+            // Format current date "dd/MM/yyyy - HH:mm:ss"
+            let now = new Date();
+            let ds = now.getDate().toString().padStart(2, '0') + '/' + (now.getMonth() + 1).toString().padStart(2, '0') + '/' + now.getFullYear() + ' - ' + now.getHours().toString().padStart(2, '0') + ':' + now.getMinutes().toString().padStart(2, '0') + ':' + now.getSeconds().toString().padStart(2, '0');
+            $("#receiptTime").text(ds);
+
+            hideOtpModal();
+            $("#receiptSuccessModal").removeClass("hidden").addClass("flex");
+        }
+
+        function finalizePurchase(btn) {
+            if (isFinalizingPurchase) return;
+
+            const isWalletPayment = currentChannelPayment === '@Constants.NATCASH_WALLET_TICKET';
+            let otpCode = isWalletPayment ? $("#walletPinInput").val().trim() : "";
+            if (!isWalletPayment) {
+                $("#otpInputs input").each(function() { otpCode += $(this).val(); });
+            }
+            
+            if ((isWalletPayment && otpCode.length === 0) || (!isWalletPayment && otpCode.length < 6)) {
+                showNotification(isWalletPayment ? '@Html.Raw(Lang.payment_wallet_pin_instruction.Replace("'", "\\'"))' : "Please enter full 6-digit OTP", "warning");
+                return;
+            }
+
+            isFinalizingPurchase = true;
+            const originalText = $(btn).html();
+            $(btn).prop('disabled', true).html('<i class="fa-solid fa-spinner fa-spin mr-2"></i> ...');
+
+            if (isWalletPayment) {
+                submitFinalPurchase(btn, originalText, true, otpCode);
+                return;
+            }
+
+            // Confirm the OTP first. The final purchase API is called only after
+            // this request succeeds for the current prepared transaction.
+            $.ajax({
+                url: subDomain + '@Url.Action("ConfirmOTP", "Home")',
+                type: 'POST',
+                contentType: 'application/json',
+                data: JSON.stringify({
+                    otp: otpCode,
+                    transIdByTicket: currentTransId
+                }),
+                success: function(otpResult) {
+                    if (otpResult.responseCode === "0" || otpResult.responseCode === "0000") {
+                        submitFinalPurchase(btn, originalText, false, null);
+                        return;
+                    }
+
+                    $(btn).prop('disabled', false).html(originalText);
+                    isFinalizingPurchase = false;
+                    $("#otpError").text(otpResult.responseMessage || "Invalid OTP").removeClass("hidden");
+                    $("#otpInputs input").val("");
+                    $("#otp1").focus();
+                },
+                error: function() {
+                    $(btn).prop('disabled', false).html(originalText);
+                    isFinalizingPurchase = false;
+                    showNotification("Network error occurred during OTP verification.", "warning");
+                }
+            });
+        }
+
+        function submitFinalPurchase(btn, originalText, isWalletPayment, walletPin) {
+            const finalData = {
+                transIdByTicket: currentTransId,
+                gameId: isFreeTicketMode ? "@Constants.Millions_CODE" : "@Model.termType",
+                paymentCode: null,
+                walletPin: isWalletPayment ? walletPin : null,
+                channelPayment: currentChannelPayment
+            };
+
+            // This final API is unreachable until ConfirmOTP succeeds (or a wallet PIN is supplied).
+            $.ajax({
+                url: subDomain + '@Url.Action("ConfirmBuyingTicketV2", "Home")',
+                type: 'POST',
+                contentType: 'application/json',
+                data: JSON.stringify(finalData),
+                success: function(res) {
+                    $(btn).prop('disabled', false).html(originalText);
+                    
+                    if (res.responseCode === "0" || res.responseCode === "0000") {
+                        // Success: Show receipt Modal
+                        showReceiptSuccess(res.orderId || currentTransId, $("#summaryTotalAmount").text(), "@(Model.userStatus?.msisdn ?? "-")", $("#summaryTotalCount").text(), "@(currentTerm?.date_random ?? "-")");
+                    } else {
+                        if (res.responseCode === "-2" || (res.responseMessage && res.responseMessage.includes("System is upgrading"))) {
+                             hideOtpModal();
+                             showNotification(res.responseMessage || "System is upgrading", res.responseCode);
+                        } else {
+                             $("#otpError").text(res.responseMessage || "Invalid OTP").removeClass("hidden");
+                             if (isWalletPayment) {
+                                 $("#walletPinInput").val("").focus();
+                             } else {
+                                 $("#otpInputs input").val("");
+                                 $("#otp1").focus();
+                             }
+                        }
+                    }
+                },
+                error: function() {
+                    $(btn).prop('disabled', false).html(originalText);
+                    showNotification("Network error occurred during payment completion.", "warning");
+                },
+                complete: function() {
+                    isFinalizingPurchase = false;
+                }
+            });
+        }
+
+        var systemUpgrading = false;
+        function showNotification(message, code) {
+            const msgEl = $("#notificationMessage");
+            const iconEl = $("#notificationModal img");
+            const btnEl = $("#notificationModal button");
+            
+            if (message && message.includes("\n")) {
+                msgEl.html(message.replace(/\n/g, '<br/>'));
+            } else {
+                msgEl.text(message);
+            }
+            
+            if (code === "-2" || (message && message.includes("System is upgrading"))) {
+                systemUpgrading = true;
+                btnEl.text("@Lang.login");
+            } else {
+                systemUpgrading = false;
+                btnEl.text("OK");
+            }
+
+            // Toggle icon based on type (warning or success)
+            const warningIcon = '/Millions/img/modal/warning_icon.png';
+            const successIcon = '/Millions/img/modal/success_icon_v2.png';
+            const fallbackWarning = 'https://cdn-icons-png.flaticon.com/512/564/564619.png';
+            const fallbackSuccess = 'https://cdn-icons-png.flaticon.com/512/190/190411.png';
+
+            if (code === "-2" || code === "warning" || code === "error") {
+                iconEl.attr('src', warningIcon);
+                iconEl.attr('onerror', `this.src='${fallbackWarning}'`);
+            } else {
+                iconEl.attr('src', successIcon);
+                iconEl.attr('onerror', `this.src='${fallbackSuccess}'`);
+            }
+
+            $("#notificationModal").removeClass("hidden").addClass("flex");
+        }
+
+        function closeNotificationModal() {
+            $("#notificationModal").addClass("hidden").removeClass("flex");
+            if (systemUpgrading) {
+                window.location.href = subDomain + "/Account/Login";
+            }
+        }
+
+        // ==================== CARD SELECTION GAME LOGIC (BIG/SMALL / ODD/EVEN) ====================
+        var bsChoice = null; // 'big' or 'small' (reused as 'odd' or 'even')
+        const isBigSmall = @(Model.termType == Constants.PIC10_BIGSMALL_CODE ? "true" : "false");
+        const themeColor = isBigSmall ? "#0A9800" : "#AA3DC8";
+        const labelBig = isBigSmall ? "Big" : "Odd";
+        const labelSmall = isBigSmall ? "Small" : "Even";
+        const colorBig = isBigSmall ? "#A2FF00" : "#FFC700";
+        const colorSmall = isBigSmall ? "#FF4157" : "#B33BD0";
+
+        // Loclized text from resources
+        const langSelect = "@Lang.millions_select";
+        const langSelected = "@Lang.millions_selected";
+
+        function selectBigSmall(choice) {
+            bsChoice = choice;
+            var cardBig = document.getElementById('cardBig');
+            var cardSmall = document.getElementById('cardSmall');
+            var choiceDisplay = document.getElementById('choiceDisplay');
+
+            if (!cardBig || !cardSmall) return;
+
+            if (choice === 'big') {
+                // Highlight Big/Odd card with theme glow
+                cardBig.style.border = '2px solid ' + themeColor;
+                cardBig.style.boxShadow = '0px 0px 12px 0px ' + (isBigSmall ? 'rgba(162, 255, 0, 1)' : 'rgba(179, 59, 208, 0.6)');
+                cardBig.querySelector('.bigsmall-btn').textContent = langSelected;
+                cardBig.querySelector('.bigsmall-btn').style.background = '#333';
+
+                // Reset Small/Even card
+                cardSmall.style.border = '2px solid transparent';
+                cardSmall.style.boxShadow = 'none';
+                cardSmall.querySelector('.bigsmall-btn').textContent = langSelect;
+                cardSmall.querySelector('.bigsmall-btn').style.background = themeColor;
+
+                // Update display
+                if (choiceDisplay) {
+                    choiceDisplay.textContent = labelBig;
+                    choiceDisplay.style.color = colorBig;
+                    choiceDisplay.style.webkitTextStroke = '1px #000';
+                }
+            } else {
+                // Highlight Small/Even card with theme glow
+                cardSmall.style.border = '2px solid ' + themeColor;
+                cardSmall.style.boxShadow = '0px 0px 12px 0px ' + (isBigSmall ? 'rgba(162, 255, 0, 1)' : 'rgba(179, 59, 208, 0.6)');
+                cardSmall.querySelector('.bigsmall-btn').textContent = langSelected;
+                cardSmall.querySelector('.bigsmall-btn').style.background = '#333';
+
+                // Reset Big/Odd card
+                cardBig.style.border = '2px solid transparent';
+                cardBig.style.boxShadow = 'none';
+                cardBig.querySelector('.bigsmall-btn').textContent = langSelect;
+                cardBig.querySelector('.bigsmall-btn').style.background = themeColor;
+
+                // Update display
+                if (choiceDisplay) {
+                    choiceDisplay.textContent = labelSmall;
+                    choiceDisplay.style.color = colorSmall;
+                    choiceDisplay.style.webkitTextStroke = '1px #000';
+                }
+            }
+            $("#bsTotalTicketCount").text(1);
+            $("#bsTotalPrice").text(formatMoneyV2(50));
+        }
+
+        function bsShowPayment(e) {
+            preparePayment(e);
+        }
+    </script>
+
+    <!-- Number Picker Modal (Refined Bottom Sheet) -->
+    <div id="numberPickerModal" class="fixed inset-0 bg-black/10 z-[200] hidden items-end justify-center p-0 transition-all">
+        <div class="modal-content bg-white w-full md:max-w-[414px] mx-auto shadow-2xl animate__animated animate__slideInUp animate__faster rounded-t-[20px] overflow-hidden">
+            <div class="px-4 py-1.5 bg-[#0062FF] text-white flex justify-between items-center relative">
+                <div class="flex flex-col">
+                    <h3 class="font-black text-[15px] uppercase tracking-wide" id="modalTitle">@Lang.Pick_Number</h3>
+                    <div class="selection-count-area">
+                        <span class="text-[10px] font-bold text-white/80 uppercase">Selected: <span id="selectionCount" class="text-white">0</span>/<span id="maxSelectionCount">10</span></span>
+                    </div>
+                </div>
+                <button onclick="closeNumberPicker()" class="w-8 h-8 flex items-center justify-center rounded-full bg-white/10 hover:bg-white/20 transition-all">
+                    <i class="fa-solid fa-xmark text-lg"></i>
+                </button>
+            </div>
+            
+            <style>
+                #numberGrid::-webkit-scrollbar { width: 3px; }
+                #numberGrid::-webkit-scrollbar-track { background: transparent; }
+                #numberGrid::-webkit-scrollbar-thumb { background: #FFD700; border-radius: 10px; }
+                #numberGrid { scrollbar-width: thin; scrollbar-color: #FFD700 transparent; }
+            </style>
+            <div class="p-2 h-[220px] overflow-hidden bg-gray-50 border-b" id="numberGrid">
+                 <!-- Populated via JS -->
+            </div>
+            <div class="p-3 bg-white border-t flex gap-3">
+                 <button onclick="closeNumberPicker()" class="flex-1 py-1 bg-gray-100 text-gray-600 rounded-lg font-black text-[12px] active:bg-gray-200 transition-all uppercase">
+                     @Lang.millions_back
+                 </button>
+                 <button id="confirmBtn" class="hidden flex-[2] py-2 bg-[#0062FF] text-white rounded-lg font-black text-[13px] active:bg-[#CC002D] transition-all uppercase shadow-md">
+                     @Lang.confirm
+                 </button>
+            </div>
+        </div>
+    </div>
+    <div id="notificationModal" class="fixed inset-0 z-[300] bg-black/60 flex items-center justify-center hidden px-4 font-bricolage backdrop-blur-sm">
+        <div class="w-full max-w-[360px] bg-white rounded-[32px] overflow-hidden flex flex-col items-center px-6 pt-5 pb-6 animate__animated animate__zoomIn animate__faster shadow-2xl relative border border-white/50">
+            <!-- Alert Icon -->
+            <div class="w-full flex justify-center mb-2 mt-0">
+                <img src="/Millions/img/modal/success_icon_v2.png" class="w-full max-w-[240px] h-auto object-contain" alt="Notificaton icon" onerror="this.src='https://cdn-icons-png.flaticon.com/512/190/190411.png'" />
+            </div>
+
+            <!-- Message Area -->
+            <div class="px-2 text-center mb-5">
+                <p id="notificationMessage" class="text-black font-[800] text-[17px] leading-snug">
+                    <!-- Message content -->
+                </p>
+            </div>
+
+            <!-- Action Button -->
+            <div class="w-full">
+                <button onclick="closeNotificationModal()" class="w-full bg-[#0062FF] text-white font-[900] text-[18px] py-[13px] rounded-[18px] shadow-[0_8px_20px_rgba(238,0,51,0.25)] active:scale-95 transition-all uppercase tracking-wide">
+                    OK
+                </button> 
+            </div>
+        </div>
+    </div>
+
+    <!-- Beautiful Success Receipt Modal (Matches Figma 161:3722) -->
+    <div id="receiptSuccessModal" class="fixed inset-0 z-[300] bg-black/80 hidden items-center justify-center px-4 font-bricolage backdrop-blur-md">
+        <div class="w-full max-w-[360px] bg-[#F9F9F9] rounded-[32px] overflow-hidden flex flex-col items-center px-6 pt-4 pb-5 shadow-2xl relative animate__animated animate__zoomIn animate__faster border border-white/50">
+            <!-- Confetti/Celebration background effect (Subtle removed) -->
+            
+            <h2 class="text-[#534A4A] font-[800] text-[19px] tracking-tight relative z-10 w-full text-center mt-1">@Lang.millions_payment_successfully</h2>
+            
+            <!-- Ticket / Success Graphic -->
+            <div class="relative w-full flex justify-center mt-2 mb-0 z-10 px-4">
+                <img src="/Millions/img/modal/success_icon_v2.png" alt="Success" class="w-full h-auto object-contain">
+            </div>
+
+            <h3 class="text-[#0A9800] font-[900] text-[20px] uppercase tracking-wide relative z-10">@Lang.success</h3>
+
+            <div class="w-full h-px border-t-[2px] border-dashed border-gray-300 my-3 relative z-10"></div>
+            
+            <div class="w-full flex justify-between items-center mb-2 relative z-10 px-1">
+                <span class="text-[#534A4A] font-bold text-[14px]">@Lang.phone_number</span>
+                <span class="font-black text-[14px] text-gray-800" id="receiptPhone">-</span>
+            </div>
+            <div class="w-full flex justify-between items-center mb-2 relative z-10 px-1">
+                <span class="text-[#534A4A] font-bold text-[14px]">@Lang.millions_your_choice</span>
+                <span class="text-[#0062FF] font-[900] text-[15px] uppercase" id="receiptChoice">-</span>
+            </div>
+            
+            <div class="w-full flex justify-between items-center mb-2 relative z-10 px-1">
+                <span class="text-[#534A4A] font-bold text-[14px]">@Lang.ticket_code</span>
+                <span class="font-black text-[13px] text-gray-800" id="receiptTicketCode">#</span>
+            </div>
+            <div class="w-full flex justify-between items-center mb-2 relative z-10 px-1">
+                <span class="text-[#534A4A] font-bold text-[14px]">@Lang.total_ticket</span>
+                <span class="font-black text-[14px] text-gray-800" id="receiptTotalTickets">-</span>
+            </div>
+            <div class="w-full flex justify-between items-center mb-2 relative z-10 px-1">
+                <span class="text-[#534A4A] font-bold text-[14px]">@Lang.millions_draw_date</span>
+                <span class="font-black text-[14px] text-gray-800" id="receiptDrawDate">-</span>
+            </div>
+            <div class="w-full flex justify-between items-center mb-1 relative z-10 px-1">
+                <span class="text-[#534A4A] font-bold text-[14px]">@Lang.total_payment</span>
+                <span class="text-[#0062FF] font-[900] text-[15px]" id="receiptAmount">0 HTG</span>
+            </div>
+
+            <div class="w-full h-px border-t-[2px] border-dashed border-gray-300 my-3 relative z-10"></div>
+            
+            <div class="w-full flex justify-between items-center mb-2 relative z-10 px-1">
+                <span class="text-[#534A4A] font-bold text-[14px]">@Lang.time</span>
+                <span class="font-bold text-[13px] text-gray-600" id="receiptTime">00:00:00</span>
+            </div>
+            
+            <div class="w-full flex justify-start items-center relative z-10 px-1 mt-1">
+                <span class="text-[#534A4A] font-bold text-[13px] italic text-gray-500" id="receiptGameType">@Lang.millions_buy_ticket_label</span>
+            </div>
+            
+            <div class="text-[#534A4A] font-[900] text-[18px] relative z-10 text-center mt-3">@Lang.thank_you <span class="text-[#0062FF]">♥️</span></div>
+            
+            <div class="w-full flex gap-2.5 mt-4 relative z-10">
+                <button type="button" onclick="window.location.href = subDomain + '@Url.Action("BuyTicket", "Home", new { termType = Model.termType })';" class="flex-1 min-w-0 border-2 border-[#0062FF] bg-white text-[#0062FF] font-[900] text-[15px] py-3 rounded-[18px] active:scale-95 transition-all uppercase tracking-wide shadow-sm">
+                    @Lang.millions_continue
+                </button>
+                <button type="button" onclick="window.location.href = subDomain + '@Url.Action("GameHome", "Home", new { termType = Model.termType })';" class="flex-1 min-w-0 bg-[#0062FF] text-white font-[900] text-[15px] py-3 rounded-[18px] shadow-[0_8px_20px_rgba(0,98,255,0.25)] active:scale-95 transition-all uppercase tracking-wide">
+                    @Lang.close
+                </button>
+            </div>
+        </div>
+    </div>
+}
+
+

+ 116 - 0
website_natcash/Areas/Millions/Views/Home/FAQ.cshtml

@@ -0,0 +1,116 @@
+@{
+    ViewData["Title"] = "Millions - FAQs";
+    ViewData["ActiveTab"] = "FAQ";
+    Layout = "~/Areas/Millions/Views/Shared/_Layout.cshtml";
+}
+@using LotteryWebApp.Languages;
+
+<script src="https://cdn.tailwindcss.com"></script>
+<link rel="stylesheet" href="/Millions/css/faq.css">
+
+<div class="millions-faq-page">
+    <!-- Header -->
+    <div class="header">
+        <a href="javascript:history.back()" class="back-btn">
+            <i class="fa-solid fa-arrow-left"></i>
+        </a>
+        <div class="header-title">@Lang.faq</div>
+    </div>
+
+    <!-- Main Content Card -->
+    <div class="content-card custom-scrollbar">
+        <!-- Banner Graphic directly integrated with Grey background -->
+        <div class="w-full relative flex justify-center mt-3 mb-1">
+             <img src="/Millions/img/faq_banner_full.png" alt="FAQ Graphic" class="w-full max-h-48 object-contain z-10 px-4 pointer-events-none">
+        </div>
+
+        <!-- Messages / FAQ Chat Style List -->
+        <div class="flex-1 w-full px-5 pt-8 pb-20 space-y-5" id="faq-list">
+            
+            <!-- Standard Row Bot Bubble (Question) -->
+            <div class="flex justify-start">
+                 <div class="rounded-xl rounded-tl-sm px-5 py-3 shadow-sm w-[90%] bg-[#0062FF] text-white">
+                    <span class="text-sm font-bold leading-snug block">@Lang.faq_millions_q1</span>
+                 </div>
+            </div>
+
+            <!-- Standard Row User Bubble (Answer) -->
+            <div class="flex justify-end mt-2">
+                 <div class="rounded-xl rounded-tr-sm px-5 py-4 shadow-md w-[90%] bg-white text-[#212121] border border-gray-100">
+                    <span class="text-[13px] font-medium leading-relaxed block">@Lang.faq_millions_a1</span>
+                 </div>
+            </div>
+
+            <!-- Standard Row Bot Bubble (Question) -->
+            <div class="flex justify-start mt-8">
+                 <div class="rounded-xl rounded-tl-sm px-5 py-3 shadow-sm w-[90%] bg-[#0062FF] text-white">
+                    <span class="text-sm font-bold leading-snug block">@Lang.faq_millions_q2</span>
+                 </div>
+            </div>
+
+            <!-- Standard Row User Bubble (Answer Long Text) -->
+            <div class="flex justify-end mt-2">
+                 <div class="rounded-xl rounded-tr-sm px-5 py-4 shadow-md w-[90%] bg-white text-[#212121] border border-gray-100">
+                    <span class="text-[13px] font-medium leading-relaxed block mb-3">@Lang.faq_millions_a2</span>
+                    <span class="text-sm font-bold text-[#0062FF] block mb-1">@Lang.faq_millions_q3</span>
+                 </div>
+            </div>
+
+            <!-- Q4:-->
+            <div class="flex justify-start pt-4">
+                 <div class="rounded-xl rounded-tl-sm px-5 py-3 shadow-sm w-[90%] bg-[#0062FF] text-white">
+                     <span class="text-sm font-bold leading-snug block">@Lang.faq_millions_q4</span>
+                 </div>
+            </div>
+            <div class="flex justify-end mt-2">
+                 <div class="rounded-xl rounded-tr-sm px-5 py-4 shadow-md w-[90%] bg-white text-[#212121] border border-gray-100">
+                     <span class="text-[13px] font-medium leading-relaxed block">@Html.Raw(Lang.faq_millions_a4)</span>
+                 </div>
+            </div>
+
+            <!-- Q5:-->
+            <div class="flex justify-start pt-4">
+                <div class="rounded-xl rounded-tl-sm px-5 py-3 shadow-sm w-[90%] bg-[#0062FF] text-white">
+                    <span class="text-sm font-bold leading-snug block">@Lang.faq_millions_q5</span>
+                </div>
+            </div>
+            <div class="flex justify-end mt-2">
+                <div class="rounded-xl rounded-tr-sm px-5 py-4 shadow-md w-[90%] bg-white text-[#212121] border border-gray-100">
+                    <span class="text-[13px] font-medium leading-relaxed block">@Html.Raw(Lang.faq_millions_a5)</span>
+                </div>
+            </div>
+
+                        <!-- Q6:-->
+            <div class="flex justify-start pt-4">
+                 <div class="rounded-xl rounded-tl-sm px-5 py-3 shadow-sm w-[90%] bg-[#0062FF] text-white">
+                     <span class="text-sm font-bold leading-snug block">@Lang.faq_millions_q6</span>
+                 </div>
+            </div>
+            <div class="flex justify-end mt-2">
+                 <div class="rounded-xl rounded-tr-sm px-5 py-4 shadow-md w-[90%] bg-white text-[#212121] border border-gray-100">
+                     <span class="text-[13px] font-medium leading-relaxed block">@Html.Raw(Lang.faq_millions_a6)</span>
+                 </div>
+            </div>
+
+
+            <!-- Q7:-->
+            <div class="flex justify-start pt-4">
+                <div class="rounded-xl rounded-tl-sm px-5 py-3 shadow-sm w-[90%] bg-[#0062FF] text-white">
+                    <span class="text-sm font-bold leading-snug block">@Lang.faq_millions_q7</span>
+                </div>
+            </div>
+            <div class="flex justify-end mt-2">
+                <div class="rounded-xl rounded-tr-sm px-5 py-4 shadow-md w-[90%] bg-white text-[#212121] border border-gray-100">
+                    <span class="text-[13px] font-medium leading-relaxed block">@Html.Raw(Lang.faq_millions_a7)</span>
+                </div>
+            </div>
+
+            <!-- Entries for other games removed as per request -->
+
+        </div>
+    </div>
+    <!-- Bottom Navbar shared component -->
+    <partial name="_BottomNavbar" />
+</div>
+
+

+ 320 - 0
website_natcash/Areas/Millions/Views/Home/GameHome - Copy.cshtml

@@ -0,0 +1,320 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = "Millions - Game Home";
+    Layout = "~/Areas/Millions/Views/Shared/_Layout.cshtml";
+}
+@using LotteryWebApp.Languages;
+@using LotteryWebApp.Controllers;
+@using LotteryWebApp.Common;
+
+
+@functions {
+    public string FormatMoney(string amount) {
+        if (string.IsNullOrEmpty(amount)) return "0";
+        var clean = new string(amount.Where(c => char.IsDigit(c)).ToArray());
+        if (long.TryParse(clean, out long val)) {
+            return val.ToString("#,##0", new System.Globalization.CultureInfo("vi-VN")).Replace(",", ".");
+        }
+        return amount;
+    }
+}
+
+<div class="main-container animate__animated animate__fadeIn bg-[#F5F5F5] min-h-screen">
+    <!-- Top Account Profile Bar / Backgound Red header -->
+    <div class="w-full bg-[#0062FF] p-4 text-white rounded-b-0xl shadow-md">
+        <!-- Row 1: Profile Info -->
+        <div class="flex items-center gap-4">
+            <a href="/LotteryV2/Home/Index" class="shrink-0 w-10 h-10 bg-white/20 backdrop-blur-md rounded-full flex items-center justify-center text-white border border-white/20 hover:bg-white/30 transition-all shadow-lg active:scale-90">
+                <i class="fas fa-chevron-left text-lg"></i>
+            </a>
+            <div class="flex items-center gap-4">
+                <div class="w-16 h-16 rounded-full border-2 border-white/60 overflow-hidden bg-[#FFE] shadow-sm">
+                    <img src="https://api.dicebear.com/7.x/avataaars/svg?seed=Ngan" alt="Avatar" class="w-full h-full object-cover">
+                </div>
+                <div>
+                    <div class="font-bold text-sm tracking-wide opacity-90">@(Model?.profile?.users ?? "User")</div>
+                    <div class="flex items-center gap-1 mt-0.5">
+                        <span class="text-3xl font-black text-[#FBF3A7]" style="text-shadow: 0 1px 2px rgba(0,0,0,0.2)">@FormatMoney(Model?.userStatus?.bet_coin)</span>
+                        <span class="text-xs font-bold text-[#FBF3A7] uppercase mt-1">@Lang.millions_htg</span>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- Row 2: Pill Actions Full Width Split -->
+        <div class="grid grid-cols-2 gap-3 mt-4">
+             <a onclick="checkTerm('@Constants.PIC10_BASIC_CODE')" class="btn-pulse border border-white/50 rounded-xl py-2 px-3 flex items-center justify-center gap-1 text-xr font-extrabold bg-white/10 hover:bg-white/20 transition-all text-white no-underline">
+                 <span class="text-yellow-300 text-xl">⚡</span> @Lang.quick_pick
+             </a>
+             <a href="/Millions/Home/Results" class="btn-pulse border border-white/50 rounded-xl py-2 px-3 flex items-center justify-center gap-1 text-xr font-extrabold bg-white/10 hover:bg-white/20 transition-all text-white no-underline">
+                <span class="text-yellow-300 text-xl">🎫</span> @Lang.results
+             </a>
+        </div>
+
+        <!-- Row 3: Withdraw Button Full Width -->
+        <div class="w-full mt-3">
+             <button onclick="location.href='@Url.Action("TransferWinMoney", "Home")'" class="btn-pulse w-full text-black font-black py-3 rounded-2xl text-[18px] flex items-center justify-center gap-2 shadow-lg transition-all" style="background: linear-gradient(118deg, #19EF4B 0%, #C0FF4B 100%);">
+                 <span>@Lang.tranfer_win_money</span>
+                 <img src="/Millions/img/gold_wallet.png" alt="Wallet" class="w-6 h-6 object-contain">
+             </button>
+        </div>
+    </div>
+
+    <!-- Countdown Timer Bar with Scalloped bottom divider background -->
+    <div class="relative w-full overflow-hidden" style="background-image: url('/Millions/img/wavy_border.svg'); background-size: 102% 100%; background-position: center; background-repeat: no-repeat; height: 114px;">
+        <!-- Top border red line -->
+        <div class="absolute top-0 left-0 w-full h-[1.5px] bg-[#0062FF]"></div>
+        
+        <div class="flex items-center justify-between px-4 pt-7 relative z-10">
+             <!-- Left: Draw Date -->
+             <div class="flex items-center gap-1 flex-1 min-w-0">
+                 <div class="w-8 h-8 flex-shrink-0">
+                     <img src="/Millions/img/calendar_icon_3d.png" alt="Calendar" class="w-full h-full object-contain" onerror="this.src='/Millions/img/icon_calendar.svg'">
+                 </div>
+                 <div class="flex flex-col min-w-0">
+                     <span class="text-[11px] text-[#A1A1A1] font-bold leading-none mb-1">Next Pick 10 draw</span>
+                     <span class="text-[12px] font-[900] text-black tracking-tight leading-none" id="draw-date">Friday, Mar 20, 2026</span>
+                 </div>
+             </div>
+
+             <!-- Middle: Dashed Divider -->
+             <div class="h-10 w-px border-l border-dashed border-gray-300 mx-2"></div>
+             
+             <!-- Right: Timer -->
+             <div class="flex gap-4 shrink-0">
+                 <div class="flex flex-col items-center min-w-[42px]">
+                     <span class="text-[10px] text-[#A1A1A1] font-bold uppercase tracking-tighter mb-1">@Lang.hours</span>
+                     <span class="text-[28px] font-black text-black leading-none font-bricolage" id="countdown-hours">00</span>
+                 </div>
+                 <div class="flex flex-col items-center min-w-[42px]">
+                    <span class="text-[10px] text-[#A1A1A1] font-bold uppercase tracking-tighter mb-1">@Lang.Minutes</span>
+                     <span class="text-[28px] font-black text-black leading-none font-bricolage" id="countdown-minutes">00</span>
+                 </div>
+                 <div class="flex flex-col items-center min-w-[42px]">
+                    <span class="text-[10px] text-[#A1A1A1] font-bold uppercase tracking-tighter mb-1">@Lang.Secs</span>
+                     <span class="text-[28px] font-black text-black leading-none font-bricolage" id="countdown-seconds">00</span>
+                 </div>
+             </div>
+        </div>
+    </div>
+
+    <!-- Anti-forgery token for AJAX -->
+    @Html.AntiForgeryToken()
+
+    <!-- Card list items with accurate illustrations -->
+    <div class="px-3 flex flex-col gap-2 pb-40 relative z-10 mt-[14px]">
+        
+        <!-- Game item: Millions -->
+        <div class="relative w-full h-[120px] rounded-2xl overflow-hidden shadow-xl font-bricolage transition-all duration-300 active:scale-[0.98] cursor-pointer card-red" onclick="checkTerm('@Constants.Millions_CODE')">
+            <!-- 1. Premium Gradient Border -->
+            <div class="absolute inset-0 rounded-2xl border-[1.5px] border-white/40 pointer-events-none z-20"></div>
+            
+            <!-- 2. Decorative Highlights -->
+            <img src="/Millions/img/decorations/ellipse_1183.png" class="absolute -left-[80px] -top-[130px] w-[220px] h-[220px] pointer-events-none z-10 mix-blend-screen scale-y-[-1]" alt="highlight">
+            <img src="/Millions/img/decorations/ellipse_1181.png" class="absolute -right-[60px] -top-[20px] w-[200px] h-[200px] pointer-events-none z-10 mix-blend-screen" alt="highlight">
+
+            <div class="absolute inset-0 grid grid-cols-10 items-center px-3 z-20 gap-0">
+                <!-- Left: Millions + Ball (3 columns) -->
+                <div class="col-span-3 flex items-center h-full -ml-2 relative">
+                    <!-- Text Layout -->
+                    <div class="flex flex-col items-center leading-[0.85] relative z-10 font-UTM_Futura_Extra">
+                        <span class="text-white font-[900] text-[16px] drop-shadow-md">Millions</span>
+                        <span class="font-[900] text-[30px] drop-shadow-lg leading-[0.9]" style="background: linear-gradient(180deg, #FFFFFF 20%, #FFF307 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent;">6 số</span>
+                        
+                        <!-- Floating Bubbles -->
+                        <div class="absolute top-[-4px] right-[-4px] w-2.5 h-2.5 bg-white rounded-full shadow-sm"></div>
+                        <div class="absolute top-[18px] right-[-6px] w-2 h-2 bg-yellow-400 rounded-full shadow-sm"></div>
+                    </div>
+
+                    <!-- Single Ball (Yellow) -->
+                    <div class="relative w-[36px] h-[36px] flex-shrink-0 -ml-18 aspect-square z-20">
+                        <div class="w-full h-full bg-[#FFDE59] rounded-full border-[2.5px] border-white flex items-center justify-center shadow-lg">
+                            <span class="text-black font-[900] text-[18px] leading-none mb-0.5">6</span>
+                        </div>
+                    </div>
+                </div>
+
+                <!-- Center: Jackpot info (4 columns) -->
+                <div class="col-span-4 flex flex-col items-center justify-center text-center">
+                    <div class="text-[14px] font-bold text-white mb-0.5 whitespace-nowrap opacity-90">@Lang.jackpot_prize</div>
+                    <div class="flex items-start gap-0.5">
+                        <span class="text-[22px] font-black text-[#FBF3A7] leading-none" style="text-shadow: 0 4px 8px rgba(0,0,0,0.3)">30.000.000</span>
+                        <span class="text-[9px] font-bold text-white uppercase opacity-90 mt-1">@Lang.millions_htg</span>
+                    </div>
+                    <div class="text-[12px] text-white/90 font-medium whitespace-nowrap mt-1">@Lang.next_round <span class="font-black text-yellow-300 ml-1 countdown-timer">00:00:00</span></div>
+                </div>
+
+                <!-- Right: Action Section (3 columns) -->
+                <div class="col-span-3 flex flex-col items-center justify-end h-full pb-3.5 relative">
+                    <img src="/Millions/img/gold_chest.png" alt="Chest" class="absolute bottom-[38px] w-18 h-20 object-contain filter drop-shadow-lg z-10">
+                    <button class="text-black font-black px-3 w-full py-1.5 rounded-[12px] text-[13px] shadow-xl border border-white/50 hover:brightness-110 active:scale-95 transition-all relative z-0" style="background: linear-gradient(180deg, #FFF385 0%, #EFAD19 100%);">@Lang.rule_play_now</button>
+                </div>
+            </div>
+        </div>
+
+
+    </div>
+
+    <!-- Banner Info Section centered red text bar -->
+    <div class="fixed bottom-[82px] left-1/2 -translate-x-1/2 w-full min-[600px]:max-w-[414px] bg-[#0062FF] text-white py-2 text-center text-[13px] font-bold tracking-wide z-40 flex flex-col items-center justify-center overflow-hidden h-auto shadow-md">
+         <div class="flex flex-col items-center w-full animate-slide-up">
+             <!-- Row 1 -->
+             <div class="opacity-90">@Lang.have_chance_to_get</div>
+             <!-- Row 2 -->
+             <div class="text-[20px] font-black text-[#FBF3A7] mt-0.5">
+                @Lang.millions_jackpot_today_htg
+             </div>
+         </div>
+    </div>
+
+    <!-- Custom Notification Modal (Branded design from Profile) -->
+    <div id="notificationModal" class="fixed inset-0 z-[100] flex items-center justify-center hidden px-6 font-bricolage" style="background: linear-gradient(135deg, rgba(26, 26, 46, 0.9) 0%, rgba(22, 33, 62, 0.9) 100%);">
+        <div class="w-full max-w-[343px] min-h-[480px] bg-white rounded-[24px] overflow-hidden flex flex-col items-center p-8 animate__animated animate__zoomIn animate__faster shadow-2xl">
+            <!-- Alert Icon -->
+            <div class="w-full flex justify-center mb-8 mt-6">
+                <img src="/Millions/img/modal/fail_icon.png" class="w-[180px] h-auto object-contain" alt="Notificaton icon" />
+            </div>
+
+            <!-- Message Area -->
+            <div class="px-2 text-center mb-10 flex-1 flex items-center justify-center">
+                <p id="notificationMessage" class="text-black font-[800] text-[22px] leading-snug">
+                    <!-- Message content -->
+                </p>
+            </div>
+
+            <!-- Action Button -->
+            <div class="w-full">
+                <button onclick="closeNotificationModal()" class="w-full bg-[#0062FF] text-white font-[800] text-[20px] py-[12px] rounded-[14px] shadow-lg active:scale-95 transition-all">
+                    @Lang.try_again
+                </button> 
+            </div>
+        </div>
+    </div>
+
+    <!-- Bottom Navbar shared component -->
+    <partial name="_BottomNavbar" />
+</div>
+
+@section Scripts {
+    <script>
+        var systemUpgrading = false;
+        function showNotification(message, code) {
+            $("#notificationMessage").text(message);
+            const $btn = $("#notificationModal button");
+            if (code === "-2" || (message && message.includes("System is upgrading"))) {
+                systemUpgrading = true;
+                $btn.text("@Lang.login");
+            } else {
+                systemUpgrading = false;
+                $btn.text("@Lang.try_again");
+            }
+            $("#notificationModal").removeClass("hidden").addClass("flex");
+        }
+
+        function closeNotificationModal() {
+            $("#notificationModal").addClass("hidden").removeClass("flex");
+            if (systemUpgrading) {
+                window.location.href = subDomain + "/Account/Login";
+            }
+        }
+
+        let isCheckingTerm = false;
+
+        function checkTerm(termType) {
+            if (isCheckingTerm) return;
+            isCheckingTerm = true;
+
+            // Get anti-forgery token from the page
+            var token = $('input[name="__RequestVerificationToken"]').val();
+            
+            // Show loading or disable buttons if needed
+            $.ajax({
+                url: subDomain + '/Millions/Home/TermResult',
+                type: 'POST',
+                data: {
+                    __RequestVerificationToken: token,
+                    termType: termType
+                },
+                success: function (res) {
+                    if (res.responseCode === "0") {
+                        if (res.listTerm && res.listTerm.length > 0) {
+                            var status = res.listTerm[0].status;
+                            if (status === "0" || status === "1") {
+                                location.href = subDomain + '/Millions/Home/BuyTicket?termType=' + termType;
+                                return;
+                            } else if (status === "2") {
+                                showNotification("@Lang.millions_game_locked");
+                            } else if (status === "3") {
+                                showNotification("@Lang.millions_updating_results");
+                            } else {
+                                showNotification("@Lang.millions_game_locked");
+                            }
+                        } else {
+                            showNotification("@Lang.no_results_found");
+                        }
+                    } else if (res.responseCode === "401") {
+                        window.location.href = subDomain + "/Account/Login";
+                        return;
+                    } else {
+                        showNotification(res.responseMessage || "@Lang.error_happened", res.responseCode);
+                    }
+                    isCheckingTerm = false;
+                },
+                error: function (err) {
+                    showNotification("@Lang.error_happened");
+                    isCheckingTerm = false;
+                }
+            });
+        }
+
+        function startCountdown() {
+            const targetHour = 20; // 20:00 (8h tối)
+            const now = new Date();
+            let target = new Date();
+            target.setHours(targetHour, 0, 0, 0);
+
+            if (now >= target) {
+                target.setDate(target.getDate() + 1);
+            }
+
+            // Định dạng ngày hiển thị (VD: Friday, Mar 20, 2026)
+            const options = { weekday: 'long', month: 'short', day: 'numeric', year: 'numeric' };
+            const dateText = target.toLocaleDateString('en-US', options);
+            document.getElementById('draw-date').innerText = dateText;
+
+            function updateTime() {
+                const current = new Date();
+                const diff = target - current;
+
+                if (diff <= 0) {
+                    target.setDate(target.getDate() + 1);
+                    const updatedDateText = target.toLocaleDateString('en-US', options);
+                    document.getElementById('draw-date').innerText = updatedDateText;
+                    updateTime();
+                    return;
+                }
+
+                const hours = Math.floor((diff / (1000 * 60 * 60)));
+                const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
+                const seconds = Math.floor((diff % (1000 * 60)) / 1000);
+
+                document.getElementById('countdown-hours').innerText = hours.toString().padStart(2, '0');
+                document.getElementById('countdown-minutes').innerText = minutes.toString().padStart(2, '0');
+                document.getElementById('countdown-seconds').innerText = seconds.toString().padStart(2, '0');
+
+                // Update all card timers
+                const timeStr = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
+                document.querySelectorAll('.countdown-timer').forEach(t => t.innerText = timeStr);
+            }
+
+            updateTime();
+            setInterval(updateTime, 1000);
+        }
+
+        document.addEventListener('DOMContentLoaded', startCountdown);
+    </script>
+}
+
+
+
+

+ 336 - 0
website_natcash/Areas/Millions/Views/Home/GameHome.cshtml

@@ -0,0 +1,336 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = "Millions - Game Home";
+    Layout = "~/Areas/Millions/Views/Shared/_Layout.cshtml";
+}
+@using LotteryWebApp.Languages;
+@using LotteryWebApp.Controllers;
+@using LotteryWebApp.Common;
+
+
+
+@section Styles {
+    <link rel="preconnect" href="https://fonts.googleapis.com">
+    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+    <link href="https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700;800&family=Bricolage+Grotesque:opsz,wght@12..96,400;12..96,500;12..96,600;12..96,700;12..96,800&display=swap" rel="stylesheet">
+    <link rel="stylesheet" href="/Millions/css/all.min.css"/>
+    <link rel="stylesheet" href="/Millions/css/game-home.css"/>
+}
+
+<div class="main-content h-dvh w-full max-w-[430px] mx-auto bg-[#f5f7fb] relative overflow-hidden font-bricolage" style="background-color:#f5f7fb;">
+
+    <!-- Scrollable content area -->
+    @{
+        var hasResult = !string.IsNullOrEmpty(Model.lastResult);
+        var resultBalls = hasResult ? Model.lastResult.Split(',') : null;
+        if (hasResult && resultBalls.Length < 6) {
+            var temp = new string[6];
+            for (int i = 0; i < 6; i++) temp[i] = i < resultBalls.Length ? resultBalls[i] : "0";
+            resultBalls = temp;
+        }
+    }
+    <div class="absolute inset-x-0 top-0 bottom-[64px] overflow-y-auto flex flex-col" style="background-color:#f5f7fb; overscroll-behavior:contain;">
+
+        <!-- Top section with header + cards -->
+        <div class="relative">
+
+            <!-- Header gradient background -->
+            <div class="header-bg relative h-[160px] rounded-b-[40px] overflow-hidden">
+                <!-- Top bar -->
+                <div class="flex items-center justify-between px-3 pt-3 relative z-10">
+                    <button onclick='location.href=subDomain + "@Url.Action("Index", "Home", new { area = "LotteryV2" })";' class="w-6 h-6 flex items-center justify-center">
+                        <img src="/Millions/assets/icons/arrow-left.svg" alt="Back" class="w-6 h-6"/>
+                    </button>
+                    @{
+                        var currentLang = System.Threading.Thread.CurrentThread.CurrentCulture.Name;
+                        var isEnglish = currentLang == "fr";
+                    }
+                    <div class="relative">
+                        <button type="button" id="langSwitchBtn" class="flex items-center gap-2 bg-white/15 rounded-full px-3 py-1 text-white text-sm">
+                            <img src="@(isEnglish ? "/img/en_flag.png" : "/img/Flag_of_Haiti.png")" alt="" class="lang-flag-icon"/>
+                            <span>@(isEnglish ? "English" : "Natcom")</span>
+                            <img src="/Millions/assets/icons/chevron-down.svg" alt="" class="w-2 h-2"/>
+                        </button>
+                        <div id="langSwitchMenu" class="hidden absolute right-0 mt-2 bg-white rounded-xl shadow-lg overflow-hidden z-50 min-w-[140px] py-1">
+                            <button type="button" onclick="setLanguage('fr')" class="w-full flex items-center gap-2 px-3 py-2 text-sm text-gray-800 hover:bg-gray-100 @(isEnglish ? "font-bold" : "")">
+                                <img src="/img/en_flag.png" alt="" class="lang-flag-icon"/>
+                                <span>English</span>
+                            </button>
+                            <button type="button" onclick="setLanguage('en')" class="w-full flex items-center gap-2 px-3 py-2 text-sm text-gray-800 hover:bg-gray-100 @(!isEnglish ? "font-bold" : "")">
+                                <img src="/img/Flag_of_Haiti.png" alt="" class="lang-flag-icon"/>
+                                <span>Natcom</span>
+                            </button>
+                        </div>
+                    </div>
+                </div>
+
+                <!-- User profile -->
+                <div class="flex items-center gap-2 px-3 min-[380px]:gap-4 min-[380px]:px-4 -mt-2">
+                    <div class="w-16 h-16 min-[380px]:w-[84px] min-[380px]:h-[84px] rounded-full overflow-hidden bg-white/20 border-[3px] border-white shrink-0">
+                        <img src="/Millions/assets/images/avatar.png" alt="Avatar" class="w-full h-full object-cover"/>
+                    </div>
+                    <div class="flex-1 min-w-0">
+                        <p class="text-white text-base font-semibold leading-tight">@(Model?.profile?.users ?? "User")</p>
+                        <div class="mt-1.5 min-[380px]:mt-2 flex items-center justify-between gap-1.5 min-[380px]:gap-2 rounded-full border border-white/35 bg-white/10 px-2 py-1.5 min-[380px]:px-3 min-[380px]:py-2">
+                            <div class="flex items-center gap-0.5 min-[380px]:gap-1 min-w-0">
+                                <span class="text-xl min-[340px]:text-2xl min-[380px]:text-3xl font-condensed text-gold-gradient leading-none whitespace-nowrap">@Utils.FormatMoney(Model?.userStatus?.bet_coin)</span>
+                                <img src="/Millions/assets/icons/coin.png" alt="" class="w-5 h-5 shrink-0"/>
+                                <span class="text-white text-sm shrink-0">@Lang.millions_htg</span>
+                            </div>
+                            <button type="button" onclick="transferWinMoney()" class="redeem-pulse shrink-0 rounded-full px-3 py-2 min-h-[40px] w-[4.9rem] font-extrabold text-[#0a1f44] text-[9px] leading-[1.12] text-center active:scale-[0.98] transition-transform" style="background: linear-gradient(90deg, #ffcf0f 0%, #fff1b8 100%); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);">
+                                @Lang.millions_redeem_rewards
+                            </button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <!-- Floating info card -->
+            <div class="absolute left-5 right-5 -bottom-[52px] bg-white rounded-2xl shadow-md flex items-center h-20 px-4">
+                <div class="flex items-center gap-2 flex-1">
+                    <img src="/Millions/assets/icons/calendar.png" alt="" class="w-6 h-6"/>
+                    <div>
+                        <p class="text-xs text-[#797979]">@Lang.millions_next_round</p>
+                        <p class="text-xs font-bold text-black" id="draw-date">@Utils.FormatResultDate(Model.nextRoundDate)</p>
+                    </div>
+                </div>
+                <div class="w-px h-12 bg-gray-200"></div>
+                <div class="flex items-center gap-2 flex-1 pl-4">
+                    <img src="/Millions/assets/icons/money-bag.png" alt="" class="w-6 h-[34px] object-contain"/>
+                    <div>
+                        <p class="text-xs text-[#797979]">@Lang.millions_jackpot_prize_to</p>
+                        <p class="leading-none ">
+                            <span class="text-base font-extrabold text-[#002bff]">30.000.000</span><span class="text-[10.32px] font-extrabold text-black align-top">@Lang.millions_htg</span>
+                        </p>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- Result section -->
+        @if (hasResult)
+        {
+            <div class="px-4 mt-10">
+                <div class="result-box rounded-[32px] py-3 flex flex-col gap-2">
+                    <div class="flex items-center justify-between px-4">
+                        <div class="flex items-center gap-2 text-xs">
+                            <span class="text-[#797979]">@Lang.results</span>
+                            <span class="font-bold text-black">@Utils.FormatResultDate(Model.lastResultDate)</span>
+                        </div>
+                        <a href="/Millions/Home/Results" class="flex items-center gap-1 text-[10px] font-bold text-black border border-[#c2c2c2] rounded-lg px-2 py-1">
+                            @Lang.millions_view_all_results
+                            <img src="/Millions/assets/icons/chevron-right.svg" alt="" class="w-[5px] h-2" />
+                        </a>
+                    </div>
+
+                    <!-- Result balls -->
+                    <div class="flex items-center justify-between gap-1 px-4">
+                        @for (int i = 0; i < 5; i++)
+                        {
+                            <div class="ball ball-blue">@resultBalls[i]</div>
+                        }
+                        <div class="relative">
+                            <img src="/Millions/assets/icons/crown.png" alt="" class="absolute -top-4 -right-1 w-7 h-auto pointer-events-none rotate-[15deg] z-0" />
+                            <div class="ball ball-mb relative z-10">
+                                <span>@resultBalls[5]</span>
+                                <span class="absolute -bottom-1 -right-2 bg-[#ee0033] text-white text-[8px] font-bold px-1.5 py-0.5 rounded z-20">MB</span>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        }
+        else
+        {
+            <div class="mt-14"></div>
+        }
+
+        <!-- Mega Jackpot banner -->
+        <div class="px-2 mt-6">
+            <a href="@Url.Action("JackpotResults", "Home", new { area = "Millions", termType = Model.termType })" class="mega-banner relative rounded-[20px] overflow-hidden px-4 py-3 flex flex-col">
+                <span class="mega-glow" style="left:-79px; top:-101px;"></span>
+                <span class="mega-glow" style="right:-78px; top:9px;"></span>
+                <span class="mega-glow" style="right:-107px; top:20px;"></span>
+                <p class="mega-title relative inline-block text-white text-[22px] font-futura leading-none">
+                    <img src="/Millions/assets/icons/crown.png" alt="" class="absolute -top-[5px] left-[26px] w-[12px] h-auto rotate-[10deg] pointer-events-none"/>
+                    @Lang.millions_mega_jackpot
+                </p>
+                <p class="text-white text-xs mt-2">@Lang.millions_estimate_jackpot_prize</p>
+                <p class="leading-none mt-1" style="margin-bottom:18px;">
+                    <span class="mega-jackpot-spiral inline-flex items-start">
+                        <span class="mega-amount text-[40px] font-condensed text-gold-gradient tracking-tight leading-none">@Utils.FormatMoney(Model.bolet ?? "30000000")</span>
+                        <span class="text-gold-gradient text-sm font-bold uppercase ml-2 mt-0.5">@Lang.v2_htg</span>
+                    </span>
+                </p>
+                <p class="text-white text-[10px] mt-1 ">@Lang.millions_be_the_next_millionaire</p>
+                <div class="relative z-10 mt-1 flex items-end justify-between gap-2">
+                    <p class="text-white text-[10px] leading-snug flex-1 pr-1 max-w-[68%]">@Lang.millions_jackpot_disclaimer</p>
+                    <span class="shrink-0 inline-flex items-center gap-1 bg-white/20 hover:bg-white/30 rounded-full px-2 py-0.5 text-white text-[10px] font-semibold">
+                        @Lang.millions_view
+                        <img src="/Millions/assets/icons/chevron-right.svg" alt="" class="w-[5px] h-2 invert"/>
+                    </span>
+                </div>
+
+                <!-- Decorative elements -->
+                <img src="/Millions/assets/images/crown-balls.png" alt="" class="absolute right-2 top-1/2 -translate-y-1/2 w-44 h-auto pointer-events-none"/>
+            </a>
+        </div>
+
+        <!-- Play now button + decorative balls -->
+        <div id="playNowSection" class="relative shrink-0 mt-4 z-10">
+            <img src="/Millions/assets/images/play-decor.png" alt="" class="block w-full h-auto pointer-events-none"/>
+
+            <a onclick="checkTerm('@Constants.Millions_CODE')" class="play-now-outer rounded-full animate-pulse-play" style="position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); width:155px; height:155px; padding:11px; cursor:pointer;">
+                <div class="play-now-ring rounded-full" style="width:100%;height:100%;padding:4px;">
+                    <div class="play-now-btn rounded-full flex flex-col items-center justify-center text-white text-[32px] font-black border-[1.8px] border-white animate-pulse-play" style="width:100%;height:100%;line-height:24px;">
+                        <span class="uppercase">@Lang.millions_play</span>
+                        <span class="uppercase">@Lang.millions_now</span>
+                    </div>
+                </div>
+            </a>
+        </div>
+
+    </div>
+
+    @{
+        ViewData["ActiveTab"] = "Home";
+    }
+
+    <div id="notificationModal" class="fixed inset-0 z-[100] flex items-center justify-center hidden px-6 font-bricolage" style="background: linear-gradient(135deg, rgba(26, 26, 46, 0.9) 0%, rgba(22, 33, 62, 0.9) 100%);">
+        <div class="w-full max-w-[343px] min-h-[480px] bg-white rounded-[24px] overflow-hidden flex flex-col items-center p-8 animate__animated animate__zoomIn animate__faster shadow-2xl">
+            <div class="w-full flex justify-center mb-8 mt-6">
+                <img src="/Millions/img/modal/fail_icon.png" class="w-[180px] h-auto object-contain" alt="Notification icon" />
+            </div>
+
+            <div class="px-2 text-center mb-10 flex-1 flex items-center justify-center">
+                <p id="notificationMessage" class="text-black font-[800] text-[22px] leading-snug"></p>
+            </div>
+
+            <div class="w-full">
+                <button onclick="closeNotificationModal()" class="w-full bg-[#0062FF] text-white font-[800] text-[20px] py-[12px] rounded-[14px] shadow-lg active:scale-95 transition-all">
+                    @Lang.try_again
+                </button>
+            </div>
+        </div>
+    </div>
+
+    @await Html.PartialAsync("~/Areas/Millions/Views/Shared/_BottomNavbar.cshtml")
+
+</div>
+
+@await Html.PartialAsync("~/Areas/Millions/Views/Home/PopupFreeTickit.cshtml")
+
+@section Scripts {
+    <script src="/Millions/js/all.min.js"></script>
+    <script>
+        var systemUpgrading = false;
+        let isCheckingTerm = false;
+
+        function showNotification(message, code) {
+            $("#notificationMessage").text(message);
+            const $btn = $("#notificationModal button");
+            if (code === "-2" || (message && message.includes("System is upgrading"))) {
+                systemUpgrading = true;
+                $btn.text("@Lang.login");
+            } else {
+                systemUpgrading = false;
+                $btn.text("@Lang.try_again");
+            }
+            $("#notificationModal").removeClass("hidden").addClass("flex");
+        }
+
+        function closeNotificationModal() {
+            $("#notificationModal").addClass("hidden").removeClass("flex");
+            if (systemUpgrading) {
+                window.location.href = subDomain + "/Account/Login";
+            }
+        }
+
+        function checkTerm(termType) {
+            if (isCheckingTerm) return;
+            isCheckingTerm = true;
+
+            var token = $('input[name="__RequestVerificationToken"]').val();
+            
+            $.ajax({
+                url: subDomain + '/Millions/Home/TermResult',
+                type: 'POST',
+                data: {
+                    __RequestVerificationToken: token,
+                    termType: termType
+                },
+                success: function (res) {
+                    if (res.responseCode === "0") {
+                        if (res.listTerm && res.listTerm.length > 0) {
+                            var status = res.listTerm[0].status;
+                            if (status === "0" || status === "1") {
+                                location.href = subDomain + '/Millions/Home/BuyTicket?termType=' + termType;
+                                return;
+                            } else if (status === "2") {
+                                showNotification("@Lang.millions_game_locked");
+                            } else if (status === "3") {
+                                showNotification("@Lang.millions_updating_results");
+                            } else {
+                                showNotification("@Lang.millions_game_locked");
+                            }
+                        } else {
+                            showNotification("@Lang.no_results_found");
+                        }
+                    } else if (res.responseCode === "401") {
+                        window.location.href = subDomain + "/Account/Login";
+                        return;
+                    } else {
+                        showNotification(res.responseMessage || "@Lang.error_happened", res.responseCode);
+                    }
+                    isCheckingTerm = false;
+                },
+                error: function (err) {
+                    showNotification("@Lang.error_happened");
+                    isCheckingTerm = false;
+                }
+            });
+        }
+
+        function startCountdown() {
+            const targetHour = 23;
+            const now = new Date();
+            let target = new Date();
+            target.setHours(targetHour, 0, 0, 0);
+
+            if (now >= target) {
+                target.setDate(target.getDate() + 1);
+            }
+
+            const options = { weekday: 'long', month: 'short', day: 'numeric', year: 'numeric' };
+            const dateText = target.toLocaleDateString('en-US', options);
+            const drawDateEl = document.getElementById('draw-date');
+            if(drawDateEl) drawDateEl.innerText = dateText;
+        }
+
+            // Withdraw money function
+            function transferWinMoney() {
+                location.href = subDomain + '@Url.Action("TransferWinMoney", "Home", new { area = "Millions" })';
+            }
+
+        document.addEventListener('DOMContentLoaded', startCountdown);
+
+        function setLanguage(newLang) {
+            fetch(subDomain + '/Home/SetCulture?lang=' + newLang)
+                .then(function () { location.reload(); })
+                .catch(function () { location.reload(); });
+        }
+
+        document.addEventListener('DOMContentLoaded', function () {
+            var btn = document.getElementById('langSwitchBtn');
+            var menu = document.getElementById('langSwitchMenu');
+            if (!btn || !menu) return;
+            btn.addEventListener('click', function (e) {
+                e.stopPropagation();
+                menu.classList.toggle('hidden');
+            });
+            document.addEventListener('click', function () {
+                menu.classList.add('hidden');
+            });
+        });
+    </script>
+}

+ 328 - 0
website_natcash/Areas/Millions/Views/Home/History.cshtml

@@ -0,0 +1,328 @@
+@model LotteryWebApp.Models.UserTicketHistoryModel
+@using LotteryWebApp.Languages
+@using LotteryWebApp.Common
+@{
+    ViewData["Title"] = "Millions - History";
+    Layout = "~/Areas/Millions/Views/Shared/_Layout.cshtml";
+    ViewData["ActiveTab"] = "History";
+}
+
+@section Styles {
+    <script src="https://cdn.tailwindcss.com"></script>
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+    <link rel="stylesheet" href="/Millions/css/site.css" />
+    <link rel="stylesheet" href="/Millions/css/results.css" />
+    <link rel="stylesheet" href="/Millions/css/history.css" />
+}
+
+<div class="main-container results-container animate__animated animate__fadeIn pb-40 relative">
+    <!-- Header Group: Static at Top -->
+    <div class="fixed top-0 left-0 md:left-1/2 md:-translate-x-1/2 w-full md:max-w-[430px] z-[100] bg-[#0062FF]">
+        <!-- Header -->
+        <div class="results-top-header">
+            <a href="/Millions/Home/GameHome" class="back-btn">
+                <i class="fa-solid fa-arrow-left"></i>
+            </a>
+            <h1 class="font-bricolage">@Lang.history</h1>
+        </div>
+
+        <!-- Status Filters inside a white card-like container -->
+        <div class="history-tabs-container bg-white rounded-t-[30px] px-4 pt-4 pb-1">
+            <div class="status-filters">
+                <div class="status-filter @(Model.status == Constants.ALL_DATA ? "active" : "")" 
+                     onclick="changeStatus('@Constants.ALL_DATA', this)">@Lang.millions_all</div>
+                <div class="status-filter @(Model.status == Constants.NOT_DRAW_CODE ? "active" : "")" 
+                     onclick="changeStatus('@Constants.NOT_DRAW_CODE', this)">@Lang.millions_waiting</div>
+                <div class="status-filter @(Model.status == Constants.WIN_CODE ? "active" : "")" 
+                     onclick="changeStatus('@Constants.WIN_CODE', this)">@Lang.millions_win</div>
+                <div class="status-filter @(Model.status == Constants.DRAWN_CODE ? "active" : "")" 
+                     onclick="changeStatus('@Constants.DRAWN_CODE', this)">@Lang.millions_not_win</div>
+            </div>
+        </div>
+    </div>
+
+    <!-- Ticket List Container (spaced below fixed header) -->
+    <div id="history-list-container"
+         class="history-items-list bg-white rounded-t-[30px] px-4 pt-4 mt-[130px] pb-[120px] min-h-[calc(100vh-130px)] shadow-sm">
+        <partial name="_TermUserTicketHistory" model="Model" />
+    </div>
+
+    <!-- Shared Bottom Navbar -->
+    <partial name="_BottomNavbar" />
+
+    <!-- Custom Notification Modal -->
+    <div id="notificationModal" class="fixed inset-0 z-[300] flex items-center justify-center hidden px-6 font-bricolage" style="background: linear-gradient(135deg, rgba(26, 26, 46, 0.9) 0%, rgba(22, 33, 62, 0.9) 100%);">
+        <div class="w-full max-w-[343px] min-h-[420px] bg-white rounded-[24px] overflow-hidden flex flex-col items-center p-8 animate__animated animate__zoomIn animate__faster shadow-2xl border border-white/50">
+            <div class="w-full flex justify-center mb-8 mt-4">
+                <img src="/Millions/img/modal/fail_icon.png" class="w-[160px] h-auto object-contain" alt="Notificaton icon" />
+            </div>
+            <div class="px-2 text-center mb-10 flex-1 flex items-center justify-center">
+                <p id="notificationMessage" class="text-black font-[800] text-[20px] leading-snug"></p>
+            </div>
+            <div class="w-full">
+                <button onclick="closeNotificationModal()" class="w-full bg-[#0062FF] text-white font-[800] text-[18px] py-[12px] rounded-[16px] shadow-lg active:scale-95 transition-all">
+                    @Lang.login
+                </button> 
+            </div>
+        </div>
+    </div>
+</div>
+
+@section Scripts {
+    <script>
+
+        let currentTermType = '@Model.termType';
+        let currentStatus = '@Model.status';
+        let currentSeqPage = parseInt('@Model.seqPage');
+        let totalPages = parseInt('@Model.totalPage' || '1');
+
+        function changeGame(type, el) {
+            if (currentTermType === type) return;
+            currentTermType = type;
+            currentSeqPage = 1;
+            
+            document.querySelectorAll('.game-tab').forEach(t => t.classList.remove('active'));
+            el.classList.add('active');
+            
+            loadHistory();
+        }
+
+        function changeStatus(status, el) {
+            if (currentStatus === status) return;
+            currentStatus = status;
+            currentSeqPage = 1;
+
+            document.querySelectorAll('.status-filter').forEach(t => t.classList.remove('active'));
+            el.classList.add('active');
+
+            loadHistory();
+        }
+
+        function changePage(page) {
+            if (page < 1 || page > totalPages) return;
+            currentSeqPage = page;
+            loadHistory();
+        }
+
+        var systemUpgrading = false;
+        function showNotification(message, code) {
+            $("#notificationMessage").text(message);
+            const $btn = $("#notificationModal button");
+            if (code === "-2" || (message && message.includes("System is upgrading"))) {
+                systemUpgrading = true;
+                $btn.text("@Lang.login");
+            } else {
+                systemUpgrading = false;
+                $btn.text("OK");
+            }
+            $("#notificationModal").removeClass("hidden").addClass("flex");
+        }
+
+        function closeNotificationModal() {
+            $("#notificationModal").addClass("hidden").removeClass("flex");
+            if (systemUpgrading) {
+                window.location.href = subDomain + "/Account/Login";
+            }
+        }
+
+        function loadHistory() {
+            const container = document.getElementById("history-list-container");
+            container.style.opacity = "0.5";
+
+            fetch(subDomain + `/Millions/Home/TermUserTicketHistory?termType=${currentTermType}&status=${currentStatus}&seqPage=${currentSeqPage}`)
+                .then(response => {
+                    if (!response.ok) throw new Error('Network response was not ok');
+                    return response.text();
+                })
+                .then(html => {
+                    try {
+                        const json = JSON.parse(html);
+                        if (json.responseCode === "-2" || (json.responseMessage && json.responseMessage.includes("System is upgrading"))) {
+                            showNotification(json.responseMessage || "System is upgrading", "-2");
+                            return;
+                        }
+                    } catch (e) {
+                        // Not JSON, likely HTML partial
+                    }
+                    container.innerHTML = html;
+                    container.style.opacity = "1";
+                    updatePaginationUI();
+                })
+                .catch(error => {
+                    console.error("Error loading history:", error);
+                    container.style.opacity = "1";
+                    if (error.message && (error.message.includes("System is upgrading") || error.message.includes("-2"))) {
+                        showNotification(error.message, "-2");
+                    }
+                });
+        }
+
+        function updatePaginationUI() {
+            const pageDisplay = document.getElementById("pageDisplay");
+            const prevBtn = document.getElementById("prevPage");
+            const nextBtn = document.getElementById("nextPage");
+            
+            if (pageDisplay) {
+                pageDisplay.innerText = `${currentSeqPage} / ${totalPages}`;
+            }
+            if (prevBtn) prevBtn.disabled = currentSeqPage <= 1;
+            if (nextBtn) nextBtn.disabled = currentSeqPage >= totalPages;
+        }
+
+        function showTicketDetail(billCode, money, moneyWin, date, channel, payMethod, paymentMessage, ticketCode, gameId, drawTime, ticketId) {
+            document.getElementById('detailBillCode').innerText = '#' + (billCode || '-');
+            document.getElementById('detailTicketCode').innerText = '#' + (ticketId || '-');
+            document.getElementById('detailMoney').innerText = formatMoneyV2(money || '0') + ' HTG';
+            document.getElementById('detailMoneyWin').innerText = formatMoneyV2(moneyWin || '0') + ' HTG';
+            document.getElementById('detailDate').innerText = date || '-';
+            document.getElementById('detailDrawTime').innerText = drawTime || '-';
+            document.getElementById('detailChannel').innerText = channel || 'App';
+            
+            // Logic for Game Name and Color
+            const normalizedGameId = String(gameId || '').trim();
+            let gameName = @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.millions));
+            let gameColor = "#0062FF";
+            
+            if (normalizedGameId === "30") {
+                gameName = @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.millions_classic_pick_10));
+            } else if (normalizedGameId === "31") {
+                gameName = "@Lang.millions_big_small";
+                gameColor = "#00A3FF";
+            } else if (normalizedGameId === "32") {
+                gameName = "@Lang.millions_odd_even";
+                gameColor = "#9333EA";
+            } else if (normalizedGameId === "33") {
+                gameName = @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.millions));
+            }
+            
+            const gameEl = document.getElementById('detailGameName');
+            gameEl.innerText = gameName;
+            gameEl.style.color = gameColor;
+
+            const normalizedPayMethod = String(payMethod || '').trim().toUpperCase();
+            const normalizedPaymentMessage = String(paymentMessage || '').trim().toUpperCase();
+            const isWalletPayment = normalizedPaymentMessage.includes('WALLET')
+                || normalizedPaymentMessage.includes('NATCASH')
+                || normalizedPayMethod === '1'
+                || normalizedPayMethod === 'WALLET';
+            const payMethodText = isWalletPayment
+                ? @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.payment_wallet))
+                : @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.payment_main_account));
+
+            document.getElementById('detailPaymentMethod').innerText = payMethodText;
+
+            // Render Numbers
+            const container = document.getElementById('detailBallsContainer');
+            container.innerHTML = '';
+            if (ticketCode) {
+                const balls = ticketCode.split(/[;,]/).filter(x => x.trim() !== '');
+                balls.forEach((val, index) => {
+                    let ballVal = val.trim();
+                    let displayVal = ballVal;
+                    let isLabel = false;
+                    switch(ballVal.toUpperCase()) {
+                        case 'B': displayVal = 'Big'; isLabel = true; break;
+                        case 'S': displayVal = 'Small'; isLabel = true; break;
+                        case 'O': displayVal = 'Odd'; isLabel = true; break;
+                        case 'E': displayVal = 'Even'; isLabel = true; break;
+                    }
+
+                    const div = document.createElement('div');
+                    if (isLabel) {
+                        div.className = "bg-[#0062FF] text-white px-4 py-1 rounded-full font-black text-[12px] shadow-sm uppercase tracking-wider";
+                        div.innerText = displayVal;
+                    } else {
+                        const isMbBall = index === balls.length - 1;
+                        div.className = "w-8 h-8 rounded-full flex items-center justify-center text-white text-[12px] font-black shadow-md relative" + (isMbBall ? " mr-1.5" : "");
+                        div.style.background = "linear-gradient(135deg, #FF3D63 0%, #E3132D 60%, #BA0F21 100%)";
+                        div.style.border = "1px solid rgba(255, 255, 255, 0.3)";
+                        div.innerText = displayVal;
+
+                        if (isMbBall) {
+                            const mbLabel = document.createElement('span');
+                            mbLabel.className = 'ticket-mb-label';
+                            mbLabel.innerText = 'MB';
+                            div.appendChild(mbLabel);
+                        }
+                    }
+                    container.appendChild(div);
+                });
+            }
+            
+            const modal = document.getElementById('ticketDetailModal');
+            modal.classList.remove('hidden');
+            modal.classList.add('flex');
+        }
+
+        function closeDetailModal() {
+            const modal = document.getElementById('ticketDetailModal');
+            modal.classList.add('hidden');
+            modal.classList.remove('flex');
+        }
+    </script>
+}
+
+<!-- Ticket Detail Modal -->
+<div id="ticketDetailModal" class="fixed inset-0 z-[200] bg-black/60 hidden items-center justify-center p-4 font-bricolage backdrop-blur-sm">
+    <div class="w-full max-w-[380px] bg-white rounded-[28px] overflow-hidden flex flex-col items-center px-6 py-8 shadow-2xl relative animate__animated animate__zoomIn animate__faster">
+        <button onclick="closeDetailModal()" class="absolute top-4 right-4 text-gray-400 hover:text-gray-600 transition-colors">
+            <i class="fas fa-times text-xl"></i>
+        </button>
+        
+        <div class="w-20 h-20 bg-gray-50 rounded-full flex items-center justify-center mb-4">
+            <i class="fas fa-receipt text-3xl text-[#0062FF]"></i>
+        </div>
+        
+        <h2 class="text-[20px] font-black text-gray-800 mb-2 uppercase tracking-tight">@Lang.millions_ticket_detail</h2>
+        
+        <!-- Ticket Numbers Display -->
+        <div id="detailBallsContainer" class="flex flex-wrap justify-center gap-2 mb-6 mt-2 max-w-full">
+            <!-- Dynamic balls here -->
+        </div>
+
+        <div class="w-full space-y-4">
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.millions_game</span>
+                <span id="detailGameName" class="font-black">Pick 10</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.millions_bill_code</span>
+                <span id="detailBillCode" class="font-black text-gray-800">#</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.millions_ticket_code</span>
+                <span id="detailTicketCode" class="font-black text-gray-800">#</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.millions_money_ticket</span>
+                <span id="detailMoney" class="font-black text-gray-800">0 HTG</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.millions_money_win</span>
+                <span id="detailMoneyWin" class="font-black text-[#0A9800]">0 HTG</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.millions_purchase_date</span>
+                <span id="detailDate" class="font-black text-gray-800">-</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.millions_draw_date</span>
+                <span id="detailDrawTime" class="font-black text-gray-800">-</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.millions_channel</span>
+                <span id="detailChannel" class="font-black text-gray-800">-</span>
+            </div>
+            <div class="flex justify-between items-center text-sm border-b border-gray-50 pb-2">
+                <span class="text-gray-400 font-bold uppercase text-[11px]">@Lang.millions_payment_method</span>
+                <span id="detailPaymentMethod" class="font-black text-gray-800">-</span>
+            </div>
+        </div>
+        
+        <button onclick="closeDetailModal()" class="w-full bg-[#0062FF] text-white font-black text-[16px] py-3.5 rounded-2xl shadow-lg mt-8 active:scale-95 transition-all uppercase tracking-widest">
+            @Lang.millions_close
+        </button>
+    </div>
+</div>
+
+

+ 148 - 0
website_natcash/Areas/Millions/Views/Home/HowToPlay.cshtml

@@ -0,0 +1,148 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = "Millions - How to play";
+    ViewData["ActiveTab"] = "More";
+    Layout = "~/Areas/Millions/Views/Shared/_Layout.cshtml";
+}
+@using LotteryWebApp.Languages;
+
+<script src="https://cdn.tailwindcss.com"></script>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+<link rel="stylesheet" href="/Millions/css/site.css" />
+
+<!-- Add custom font Bricolage Grotesque to match Figma styling -->
+<link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:wght@400;700;800;900&display=swap" rel="stylesheet">
+<link rel="stylesheet" href="/Millions/css/howtoplay.css" />
+
+<div class="main-container animate__animated animate__fadeIn min-h-screen relative flex flex-col pb-24 font-bricolage overflow-x-hidden" style="background-color: #EAEAEA !important;">
+    
+    <!-- Header (Red Background) -->
+    <div class="w-full bg-[#0062FF] h-[52px] flex items-center justify-between px-4 sticky top-0 z-50">
+        <!-- Back Button -->
+        <button onclick="window.history.back()" class="w-10 h-10 flex items-center justify-center -ml-2 rounded-full active:bg-white/20 transition-colors z-10 text-white">
+            <i class="fa-solid fa-arrow-left text-[20px]"></i>
+        </button>
+        <!-- Title -->
+        <div class="absolute inset-0 flex items-center justify-center pointer-events-none">
+            <span class="font-bold text-[24px] text-white tracking-wide drop-shadow-sm">@Lang.how_to_play</span>
+        </div>
+    </div>
+
+    <!-- Content / Cards -->
+    <div class="w-full flex flex-col px-5 py-4 gap-6">
+
+        <!-- Card 1: Basic Pick 10 -->
+        <div class="w-full flex flex-col gap-1.5 cursor-pointer hover:opacity-95 transition-opacity" onclick="window.location.href='/Millions/Home/GameHome'">
+            <h2 class="text-[13px] font-bold text-[#534A4A] tracking-normal px-1">@Lang.how_to_play_pick10</h2>
+            <div class="w-full h-[90px] rounded-[16px] relative overflow-hidden card-red border border-white/20 shadow-[0_4px_10px_rgba(238,0,51,0.25)]">
+                <!-- Background Glow -->
+                <div class="absolute -left-6 -top-6 w-20 h-20 bg-white/20 rounded-full blur-2xl"></div>
+                <div class="absolute -bottom-10 -right-10 w-24 h-24 bg-black/20 rounded-full blur-2xl"></div>
+                
+                <div class="w-full h-full flex items-center justify-between pl-3 pr-2 relative z-10">
+                    <!-- Left: Basic Pick 10 Logo -->
+                    <div class="flex flex-col items-center justify-center pt-2">
+                        <span class="text-[14px] font-black italic text-white drop-shadow-md leading-[1.1] text-center" style="font-family: 'Montserrat', sans-serif;">Basic<br>Pick</span>
+                        <img src="/Millions/img/ball_10.png" class="w-7 h-7 object-contain drop-shadow-md -mt-2 -mr-8 border-2 border-[#E11D48] rounded-full bg-[#E11D48]">
+                    </div>
+
+                    <!-- Center: Numbers -->
+                    <div class="flex flex-col items-center mt-0.5 ml-4">
+                        <span class="text-[10px] font-[800] text-white tracking-widest drop-shadow">@Lang.jackpot_prize</span>
+                        <div class="flex items-start gap-1 mt-0.5">
+                            <span class="text-[28px] font-[900] text-white leading-none tracking-tight drop-shadow-md">100.000</span>
+                            <span class="text-[7px] font-[800] text-white bg-transparent border border-white/60 rounded px-[2px] mt-1 shadow-sm leading-tight">HTG</span>
+                        </div>
+                        <div class="text-[9px] text-white/90 mt-0.5">@Lang.next_round <span class="font-[900] text-white ml-0.5 drop-shadow">05:00</span></div>
+                    </div>
+
+                    <!-- Right: Graphic & Button -->
+                    <div class="flex flex-col items-end justify-between h-full py-2 w-[70px]">
+                        <img src="/Millions/img/play_chest.png" class="h-[46px] w-[56px] object-contain drop-shadow-lg scale-125 origin-top-right mr-1 mt-1">
+                        <div class="w-full yellow-button text-center rounded-[8px] py-[3px] text-[10px] font-[900] px-2 z-20 active:scale-95 transition-transform mt-auto">@Lang.play</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- Card 2: Millionair -->
+        <div class="w-full flex flex-col gap-1.5 cursor-pointer hover:opacity-95 transition-opacity" onclick="window.location.href='/Millions/Home/GameHome'">
+            <h2 class="text-[13px] font-bold text-[#534A4A] tracking-normal px-1">@Lang.how_to_play_millionair</h2>
+            <div class="w-full h-[90px] rounded-[16px] relative overflow-hidden card-blue border border-white/20 shadow-[0_4px_10px_rgba(26,146,244,0.25)]">
+                <!-- Background Glow -->
+                <div class="absolute -left-6 -top-6 w-20 h-20 bg-white/20 rounded-full blur-2xl"></div>
+                <div class="absolute -bottom-10 -right-10 w-24 h-24 bg-black/20 rounded-full blur-2xl"></div>
+                
+                <div class="w-full h-full flex items-center justify-between pl-1 pr-2 relative z-10">
+                    <!-- Left: Millionair Graphic -->
+                    <div class="flex flex-col items-center justify-end relative w-[80px] h-full z-10">
+                        <img src="/Millions/img/ball_86.png" class="absolute left-[-12px] top-[12px] w-[38px] h-[38px] object-contain drop-shadow-md z-0 transform -rotate-[15deg]">
+                        <img src="/Millions/img/ball_88.png" class="absolute left-[52px] top-[26px] w-[32px] h-[32px] object-contain drop-shadow-md z-0 transform rotate-[15deg]">
+                        <img src="/Millions/img/m1.png" class="absolute left-[10px] bottom-[-5px] h-[95px] w-auto object-contain drop-shadow-md z-10">
+                        <span class="text-[12px] font-black italic text-white drop-shadow-[0_2px_4px_rgba(0,0,0,0.8)] absolute bottom-[8px] left-[12px] tracking-wide z-20" style="font-family: 'Montserrat', sans-serif;">Millionair</span>
+                    </div>
+
+                    <!-- Center: Numbers -->
+                    <div class="flex flex-col items-center mt-0.5 -ml-1">
+                        <span class="text-[10px] font-[800] text-white tracking-widest drop-shadow">@Lang.jackpot_prize</span>
+                        <div class="flex items-start gap-1 mt-0.5">
+                            <span class="text-[28px] font-[900] text-[#FFDE59] leading-none tracking-tight drop-shadow-md">500.000</span>
+                            <span class="text-[7px] font-[800] text-white bg-transparent border border-white/60 rounded px-[2px] mt-1 shadow-sm leading-tight">HTG</span>
+                        </div>
+                        <div class="text-[9px] text-white/90 mt-0.5">@Lang.next_round <span class="font-[900] text-white ml-0.5 drop-shadow">05:00</span></div>
+                    </div>
+
+                    <!-- Right: Graphic & Button -->
+                    <div class="flex flex-col items-end justify-between h-full py-2 w-[70px]">
+                        <img src="/Millions/img/play_millionair.png" class="h-[43px] w-[58px] object-contain drop-shadow-[0_5px_8px_rgba(0,0,0,0.3)] scale-110 origin-right mr-1 mt-2">
+                        <div class="w-full yellow-button text-center rounded-[8px] py-[3px] text-[10px] font-[900] px-2 z-20 active:scale-95 transition-transform mt-auto">@Lang.play</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- Card 3: Mega Bet -->
+        <div class="w-full flex flex-col gap-1.5 cursor-pointer hover:opacity-95 transition-opacity" onclick="window.location.href='/Millions/Home/GameHome'">
+            <h2 class="text-[13px] font-bold text-[#534A4A] tracking-normal px-1">@Lang.how_to_play_megabet</h2>
+            <div class="w-full h-[90px] rounded-[16px] relative overflow-hidden card-orange border border-white/20 shadow-[0_4px_10px_rgba(248,110,34,0.25)]">
+                <!-- Background Glow -->
+                <div class="absolute -left-6 -top-6 w-20 h-20 bg-white/20 rounded-full blur-2xl"></div>
+                <div class="absolute -bottom-10 -right-10 w-24 h-24 bg-black/20 rounded-full blur-2xl"></div>
+                
+                <div class="w-full h-full flex items-center justify-between pl-3 pr-2 relative z-10">
+                    <!-- Left: Mega Bet Graphic -->
+                    <div class="flex items-center relative w-[80px] h-full">
+                        <div class="flex flex-col text-white drop-shadow-md text-left z-20" style="font-family: 'Montserrat', sans-serif;">
+                            <span class="text-[10px] font-[900] italic leading-[0.9]">@Lang.MEGA</span>
+                            <span class="text-[15px] font-[900] italic text-[#FFDE59] leading-[0.9]">@Lang.Bet</span>
+                        </div>
+                        <img src="/Millions/img/ball_88.png" class="w-[22px] h-[22px] object-contain drop-shadow-md absolute left-[38px] top-[24px] z-10">
+                        <img src="/Millions/img/ball_99.png" class="w-[28px] h-[28px] object-contain drop-shadow-lg absolute left-[52px] top-[30px] z-30">
+                    </div>
+
+                    <!-- Center: Numbers -->
+                    <div class="flex flex-col items-center mt-0.5 ml-2">
+                        <span class="text-[10px] font-[800] text-white tracking-widest drop-shadow">@Lang.jackpot_prize</span>
+                        <div class="flex items-start gap-1 mt-0.5">
+                            <span class="text-[28px] font-[900] text-white leading-none tracking-tight drop-shadow-md">800.000</span>
+                            <span class="text-[7px] font-[800] text-white bg-transparent border border-white/60 rounded px-[2px] mt-1 shadow-sm leading-tight">HTG</span>
+                        </div>
+                        <div class="text-[9px] text-white/90 mt-0.5">@Lang.next_round <span class="font-[900] text-white ml-0.5 drop-shadow">05:00</span></div>
+                    </div>
+
+                    <!-- Right: Graphic & Button -->
+                    <div class="flex flex-col items-end justify-between h-full py-2 w-[70px]">
+                        <img src="/Millions/img/play_megabet.png" class="h-[43px] w-[65px] object-contain drop-shadow-[0_8px_10px_rgba(0,0,0,0.5)] scale-110 origin-right mr-1 mt-2">
+                        <div class="w-full yellow-button text-center rounded-[8px] py-[3px] text-[10px] font-[900] px-2 z-20 active:scale-95 transition-transform mt-auto">@Lang.play</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+    </div>
+
+</div>
+
+<!-- Bottom Navbar shared component -->
+<partial name="_BottomNavbar" />
+

+ 181 - 0
website_natcash/Areas/Millions/Views/Home/JackpotDetail.cshtml

@@ -0,0 +1,181 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@using System
+@using System.Globalization
+@using System.Collections.Generic
+@using LotteryWebApp.Common
+@using LotteryWebApp.Languages
+@using LotteryWebApp.Service
+@{
+    ViewData["Title"] = "Millions - Jackpot Detail";
+    Layout = "~/Areas/Millions/Views/Shared/_Layout.cshtml";
+    var drawId = (ViewBag.DrawId as string) ?? "";
+    var winners = ViewBag.Winners as List<JackpotWinnerItem> ?? new List<JackpotWinnerItem>();
+    var firstWinner = winners.Count > 0 ? winners[0] : null;
+
+    var mainBalls = new string[5];
+    var mbBall = "0";
+    var resultStr = firstWinner != null ? firstWinner.result : "";
+    var balls = !string.IsNullOrEmpty(resultStr) ? resultStr.Split(',') : new string[0];
+    for (int i = 0; i < 5; i++)
+    {
+        mainBalls[i] = i < balls.Length ? balls[i].Trim() : "0";
+    }
+    if (balls.Length >= 6) mbBall = balls[5].Trim();
+
+    string drawDateFmt = "";
+    string drawDateLong = "";
+    string drawTime = "";
+    DateTime drawDt;
+    string rawDate = firstWinner != null ? firstWinner.randomDate : "";
+    string[] tryFormats = { "M/d/yyyy h:mm:ss tt", "MM/dd/yyyy h:mm:ss tt", "dd/MM/yyyy HH:mm:ss", "yyyy-MM-dd HH:mm:ss" };
+    if (!string.IsNullOrEmpty(rawDate)
+        && (DateTime.TryParseExact(rawDate, tryFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out drawDt)
+            || DateTime.TryParse(rawDate, CultureInfo.InvariantCulture, DateTimeStyles.None, out drawDt)))
+    {
+        drawDateFmt = drawDt.ToString("MMM dd, yyyy", new CultureInfo("en-US"));
+        drawDateLong = drawDt.ToString("dddd, MMM dd, yyyy", new CultureInfo("en-US"));
+        drawTime = drawDt.ToString("HH:mm");
+    }
+
+    long jackpotPrizeTotal = 0;
+    foreach (var w in winners)
+    {
+        long m;
+        if (long.TryParse(w.moneyWin, out m)) jackpotPrizeTotal += m;
+    }
+    var jackpotPrize = jackpotPrizeTotal.ToString();
+    var winnersCount = winners.Count;
+}
+
+@section Styles {
+    <link rel="preconnect" href="https://fonts.googleapis.com">
+    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+    <link href="https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700;800&family=Bricolage+Grotesque:opsz,wght@12..96,400;12..96,500;12..96,600;12..96,700;12..96,800&display=swap" rel="stylesheet">
+    <link rel="stylesheet" href="/Millions/css/all.min.css"/>
+    <link rel="stylesheet" href="/Millions/css/jackpot.css"/>
+}
+
+<div class="main-content h-dvh w-full max-w-[430px] mx-auto bg-[#f5f7fb] relative overflow-hidden font-bricolage">
+
+    <!-- Header gradient -->
+    <div class="header-bg absolute inset-x-0 top-0 h-[160px] flex flex-col items-center pt-4 px-3 z-0">
+        <div class="w-full flex items-center justify-between">
+            <button onclick="location.href=subDomain + '@Url.Action("JackpotResults", "Home", new { area = "Millions", termType = Model.termType })';" class="js-back w-6 h-6 flex items-center justify-center">
+                <img src="/Millions/assets/icons/arrow-left.svg" alt="Back" class="w-6 h-6"/>
+            </button>
+            <p class="text-white text-base font-bold">@Lang.millions_jackpot_results_title</p>
+            <span class="w-6 h-6"></span>
+        </div>
+        <p class="text-white/80 text-xs -mt-1">@Lang.millions_draw_no_short<span class="font-bold">@drawId</span></p>
+    </div>
+
+    <!-- White rounded body (overlaps header, scrollable) -->
+    <div class="absolute inset-x-0 top-[56px] bottom-0 bg-white rounded-t-[40px] flex flex-col gap-2 px-3 pt-4 pb-[96px] overflow-y-auto hide-scrollbar z-10" style="box-shadow: 0 -4px 10px rgba(0, 0, 0, 0.1);">
+
+        <!-- Top: Draw info + MB ball + Jackpot prize -->
+        <div class="flex items-start justify-between shrink-0">
+            <div class="flex flex-col gap-1 items-start">
+                <span class="bg-[#0062ff] text-white text-base font-bold rounded-xl px-2 py-1">@Lang.millions_draw_no_short@drawId</span>
+                <div class="flex items-center gap-1">
+                    <img src="/Millions/assets/icons/calendar.png" alt="" class="w-5 h-5"/>
+                    <span class="text-xs text-black">@drawDateLong</span>
+                </div>
+                <div class="flex items-center gap-1">
+                    <svg class="w-5 h-5" viewBox="0 0 24 24" fill="none" stroke="#0062ff" stroke-width="2"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2" stroke-linecap="round"/></svg>
+                    <span class="text-xs text-black">@drawTime</span>
+                </div>
+            </div>
+
+            <div class="flex items-center gap-2 relative">
+                <div class="relative">
+                    <img src="/Millions/assets/icons/crown.png" alt="" class="absolute -top-3 -right-1 w-5 h-auto rotate-[15deg] z-0 pointer-events-none"/>
+                    <div class="ball ball-mb relative z-10" style="width:52px;height:52px;font-size:22px;">@mbBall</div>
+                    <span class="absolute -bottom-1 -right-1 bg-[#ee0033] text-white text-[10px] font-bold px-1 py-0.5 rounded z-20">MB</span>
+                </div>
+                <div class="flex flex-col">
+                    <span class="text-xs font-bold text-black">@Lang.millions_jackpot_prize</span>
+                    <p class="leading-none mt-1">
+                        <span class="text-[28px] font-condensed font-bold text-[#002bff] tracking-tight">@Utils.FormatMoney(jackpotPrize)</span><span class="text-xs font-bold text-black ml-1 align-top">@Lang.v2_htg</span>
+                    </p>
+                    <span class="text-[8px] font-bold text-[#8e8e93] mt-1">@Lang.millions_mega_jackpot</span>
+                </div>
+            </div>
+        </div>
+
+        <!-- Winning Numbers box -->
+        <div class="result-box rounded-[32px] py-3 flex flex-col gap-2 shrink-0">
+            <p class="text-xs font-bold text-black text-center">@Lang.millions_winning_numbers</p>
+            <div class="flex items-center justify-center gap-3 px-4">
+                @for (int i = 0; i < 5; i++)
+                {
+                    <div class="ball ball-blue">@mainBalls[i]</div>
+                }
+                <div class="relative">
+                    <img src="/Millions/assets/icons/crown.png" alt="" class="absolute -top-4 -right-1 w-7 h-auto rotate-[15deg] z-0 pointer-events-none"/>
+                    <div class="ball ball-mb relative z-10">@mbBall</div>
+                    <span class="absolute -bottom-1 -right-2 bg-[#ee0033] text-white text-[8px] font-bold px-1.5 py-0.5 rounded z-20">MB</span>
+                </div>
+            </div>
+        </div>
+
+        <!-- Winning Subscribes -->
+        <div class="result-box rounded-xl py-3 flex flex-col gap-2 shrink-0">
+            <div class="flex flex-col px-3 gap-1">
+                <p class="text-xs font-bold text-black">@Lang.millions_winning_subscribes (@winnersCount)</p>
+                <p class="text-xs text-black">@string.Format(Lang.millions_subscribers_won_jackpot, winnersCount)</p>
+            </div>
+            <div class="grid grid-cols-2 gap-2 px-3">
+                @{ int idx = 0; }
+                @foreach (var w in winners)
+                {
+                    idx++;
+                    var phone = w.msisdn ?? "";
+                    string masked = phone;
+                    if (phone.Length >= 7)
+                    {
+                        masked = "+" + phone.Substring(0, 3) + " " + phone.Substring(3, 2) + "****" + phone.Substring(phone.Length - 2);
+                    }
+                    <div class="flex items-center gap-2 border border-[#ccc] rounded-lg px-2 py-1.5"><span class="bg-[#0062ff] text-white text-xs font-bold rounded-lg w-4 h-4 flex items-center justify-center">@idx</span><span class="text-xs font-bold text-black">@masked</span></div>
+                }
+                @if (winnersCount == 0)
+                {
+                    <p class="text-xs text-[#8e8e93] col-span-2 text-center py-2">@Lang.millions_no_winners</p>
+                }
+            </div>
+        </div>
+
+        <!-- Draw information -->
+        <div class="result-box rounded-xl py-3 flex flex-col gap-2 px-3">
+            <p class="text-xs font-bold text-black">@Lang.millions_draw_information</p>
+            <div class="grid grid-cols-2 gap-x-1 gap-y-1 text-xs">
+                <p class="text-[#8e8e93]">@Lang.millions_game_type</p>
+                <p class="font-bold text-black">@Lang.millions_mega_jackpot</p>
+                <p class="text-[#8e8e93]">@Lang.millions_total_winners</p>
+                <p class="font-bold text-black">@winnersCount</p>
+                <p class="text-[#8e8e93]">@Lang.millions_draw_date_time</p>
+                <p class="font-bold text-black">@drawDateFmt - @drawTime</p>
+            </div>
+        </div>
+
+        <!-- Note -->
+        <div class="bg-[#ecf3fd] rounded-xl px-3 py-2 flex flex-col gap-1 shrink-0">
+            <div class="flex items-center gap-1">
+                <span class="bg-[#0062ff] text-white text-sm font-bold rounded-xl w-[17px] h-5 flex items-center justify-center leading-none">i</span>
+                <p class="text-[10px] font-bold text-[#0062ff]">@Lang.millions_note</p>
+            </div>
+            <div class="text-xs text-[#8e8e93] leading-tight">
+                <p>@Lang.millions_note_results_public</p>
+                <p>@Lang.millions_note_thank_you</p>
+            </div>
+        </div>
+
+        <!-- Back button -->
+        <a href="@Url.Action("JackpotResults", "Home", new { area = "Millions", termType = Model.termType })" class="bg-[#0062ff] text-white text-sm font-bold text-center rounded-xl px-3 py-3 mt-2 mb-1 shrink-0">@Lang.millions_back_to_results_list</a>
+
+    </div>
+
+</div>
+
+@section Scripts {
+    <script src="/Millions/js/all.min.js"></script>
+}

+ 294 - 0
website_natcash/Areas/Millions/Views/Home/JackpotResults.cshtml

@@ -0,0 +1,294 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = "Millions - Kết quả Jackpot";
+    Layout = "~/Areas/Millions/Views/Shared/_Layout.cshtml";
+}
+@using System
+@using System.Globalization
+@using LotteryWebApp.Languages;
+@using LotteryWebApp.Controllers;
+@using LotteryWebApp.Common;
+
+@section Styles {
+    <link rel="preconnect" href="https://fonts.googleapis.com">
+    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+    <link href="https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700;800&family=Bricolage+Grotesque:opsz,wght@12..96,400;12..96,500;12..96,600;12..96,700;12..96,800&display=swap" rel="stylesheet">
+    <link rel="stylesheet" href="/Millions/css/all.min.css"/>
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr@4.6.13/dist/flatpickr.min.css"/>
+    <link rel="stylesheet" href="/Millions/css/jackpot.css"/>
+    <style>
+        /* Mega Jackpot amount — spiral grow & shrink */
+        .mega-jackpot-spiral {
+            display: inline-block;
+            transform-origin: center center;
+            animation: megaJackpotSpiral 1.8s ease-in-out infinite;
+            will-change: transform;
+        }
+        @@keyframes megaJackpotSpiral {
+            0% {
+                transform: scale(0.25) rotate(0deg);
+            }
+            30% {
+                transform: scale(1.15) rotate(360deg);
+            }
+            65% {
+                transform: scale(1.15) rotate(360deg);
+            }
+            100% {
+                transform: scale(0.25) rotate(720deg);
+            }
+        }
+    </style>
+}
+
+<div class="main-content h-dvh w-full max-w-[430px] mx-auto bg-[#0062ff] relative overflow-hidden font-bricolage">
+
+    <!-- Header gradient -->
+    <div class="header-bg absolute inset-x-0 top-0 h-[160px] flex items-start justify-between px-3 pt-4 z-0">
+        <button onclick="location.href=subDomain + '@Url.Action("GameHome", "Home", new { area = "Millions" })';" class="js-back w-6 h-6 flex items-center justify-center">
+            <img src="/Millions/assets/icons/arrow-left.svg" alt="Back" class="w-6 h-6"/>
+        </button>
+        <p class="text-white text-base font-bold">@Lang.millions_jackpot_results_title</p>
+        <span class="w-6 h-6"></span>
+    </div>
+
+    <!-- White rounded body (overlaps header, scrollable) -->
+    <div class="absolute inset-x-0 top-[56px] bottom-0 bg-white rounded-t-[40px] flex flex-col gap-3 px-3 pt-4 pb-[96px] overflow-y-auto hide-scrollbar z-10" style="box-shadow: 0 -4px 10px rgba(0, 0, 0, 0.1);">
+
+        <!-- Date filter + search -->
+        @{
+            var fromFormatted = ViewBag.FromFormatted as string;
+            var toFormatted = ViewBag.ToFormatted as string;
+            var fromDisplay = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy");
+            var toDisplay = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy");
+        }
+        <form id="jackpotFilterForm" method="get" action="@Url.Action("JackpotResults", "Home", new { area = "Millions" })" class="flex items-center justify-between gap-3 shrink-0">
+            <input type="hidden" name="termType" value="@Model.termType"/>
+            <div class="relative flex-1">
+                <button type="button" id="dateRangeToggle" class="date-range-toggle">
+                    <img src="/Millions/assets/icons/calendar.png" alt="" class="w-5 h-5"/>
+                    <span id="dateRangeLabel" class="text-xs font-bold text-black whitespace-nowrap">@fromDisplay - @toDisplay</span>
+                    <img src="/Millions/assets/icons/chevron-down-2.svg" alt="" class="w-3 h-3 ml-auto"/>
+                </button>
+                <input type="hidden" id="fromInput" name="fromFormatted" value="@fromFormatted"/>
+                <input type="hidden" id="toInput" name="toFormatted" value="@toFormatted"/>
+                <div id="dateRangePanel" class="date-range-panel">
+                    <input type="text" id="jackpotDateRange" class="date-range-picker-input" readonly/>
+                </div>
+            </div>
+            <button type="submit" class="bg-[#0062ff] rounded-lg w-8 h-8 flex items-center justify-center shrink-0">
+                <img src="/Millions/assets/icons/search.svg" alt="" class="w-4 h-4"/>
+            </button>
+        </form>
+
+        <script src="https://cdn.jsdelivr.net/npm/flatpickr@4.6.13/dist/flatpickr.min.js"></script>
+        <script>
+            (function() {
+                var toggle = document.getElementById('dateRangeToggle');
+                var panel = document.getElementById('dateRangePanel');
+                var fromInput = document.getElementById('fromInput');
+                var toInput = document.getElementById('toInput');
+                var pickerInput = document.getElementById('jackpotDateRange');
+                var label = document.getElementById('dateRangeLabel');
+                var picker = null;
+                if (!toggle || !panel) return;
+
+                function openPanel() {
+                    panel.classList.add('open');
+                    toggle.classList.add('open');
+                    if (picker) {
+                        picker.redraw();
+                    }
+                }
+                function closePanel() {
+                    panel.classList.remove('open');
+                    toggle.classList.remove('open');
+                }
+
+                function formatDateForDisplay(date) {
+                    return flatpickr.formatDate(date, "d/m/Y");
+                }
+
+                function formatDateForRequest(date) {
+                    return flatpickr.formatDate(date, "Y-m-d");
+                }
+
+                function getDateFromRequestValue(value) {
+                    return flatpickr.parseDate(value, "Y-m-d");
+                }
+
+                function setRangeText(fromDate, toDate) {
+                    if (label) {
+                        label.textContent = formatDateForDisplay(fromDate) + " - " + formatDateForDisplay(toDate);
+                    }
+                }
+
+                function syncRangeFields(selectedDates) {
+                    if (!selectedDates || selectedDates.length === 0) return;
+
+                    var fromDate = selectedDates[0];
+                    var toDate = selectedDates.length > 1 ? selectedDates[1] : selectedDates[0];
+
+                    fromInput.value = formatDateForRequest(fromDate);
+                    toInput.value = formatDateForRequest(toDate);
+                    setRangeText(fromDate, toDate);
+                }
+
+                toggle.addEventListener('click', function(e) {
+                    e.stopPropagation();
+                    if (panel.classList.contains('open')) {
+                        closePanel();
+                    } else {
+                        openPanel();
+                    }
+                });
+
+                panel.addEventListener('click', function(e) { e.stopPropagation(); });
+
+                document.addEventListener('click', function(e) {
+                    if (!panel.contains(e.target) && !toggle.contains(e.target)) {
+                        closePanel();
+                    }
+                });
+
+                if (window.flatpickr) {
+                    var fromDate = getDateFromRequestValue(fromInput.value);
+                    var toDate = getDateFromRequestValue(toInput.value);
+                    setRangeText(fromDate, toDate);
+
+                    picker = flatpickr(pickerInput, {
+                        mode: "range",
+                        dateFormat: "Y-m-d",
+                        defaultDate: [fromDate, toDate],
+                        disableMobile: true,
+                        inline: true,
+                        appendTo: panel,
+                        monthSelectorType: "dropdown",
+                        onChange: function(selectedDates) {
+                            syncRangeFields(selectedDates);
+                            if (selectedDates.length === 2) {
+                                closePanel();
+                            }
+                        },
+                        onClose: function(selectedDates, dateStr, instance) {
+                            syncRangeFields(selectedDates);
+                            if (selectedDates.length === 1) {
+                                instance.setDate([selectedDates[0], selectedDates[0]], false);
+                                setRangeText(selectedDates[0], selectedDates[0]);
+                            }
+                        }
+                    });
+                }
+            })();
+        </script>
+
+        <!-- Mega Jackpot banner -->
+        <div class="mega-banner relative rounded-[12px] overflow-hidden px-4 py-3 border-2 border-white/70 flex flex-col shrink-0">
+            <span class="mega-glow" style="left:-79px; top:-101px;"></span>
+            <span class="mega-glow" style="right:-78px; top:9px;"></span>
+            <span class="mega-glow" style="right:-107px; top:20px;"></span>
+            <p class="mega-title relative inline-block text-white text-[22px] font-futura leading-none">
+                <img src="/Millions/assets/icons/crown.png" alt="" class="absolute -top-[5px] left-[26px] w-[12px] h-auto rotate-[10deg] pointer-events-none"/>
+                @Lang.millions_mega_jackpot
+            </p>
+            <p class="text-white text-xs mt-2">@Lang.millions_estimate_jackpot_prize</p>
+            <p class="leading-none mt-1 flex items-start" style="margin-bottom:18px;">
+                <span class="mega-amount mega-jackpot-spiral text-[40px] font-condensed text-gold-gradient tracking-tight leading-none">@Utils.FormatMoney(Model.bolet ?? "30000000")</span>
+                <span class="mega-jackpot-spiral text-gold-gradient text-sm font-bold uppercase ml-1">@Lang.v2_htg</span>
+            </p>
+            <p class="text-white text-[10px] mt-1">@Lang.millions_be_the_next_millionaire</p>
+            <img src="/Millions/assets/images/crown-balls.png" alt="" class="absolute right-2 top-1/2 -translate-y-1/2 w-44 h-auto pointer-events-none"/>
+        </div>
+
+        <!-- List heading -->
+        <div class="px-2 shrink-0">
+            <div class="flex items-center justify-between font-bold">
+                <p class="text-sm text-black">@Lang.millions_list_jackpot_results</p>
+                <p class="text-xs text-[#0062ff]">@string.Format(Lang.millions_total_draws, Model.listTerm?.Count ?? 0)</p>
+            </div>
+
+            <!-- Results list -->
+            <div class="flex flex-col gap-2 pb-2">
+
+                @if (Model.listTerm != null && Model.listTerm.Count > 0)
+                {
+                    foreach (var term in Model.listTerm)
+                    {
+                        var balls = !string.IsNullOrEmpty(term.result) ? term.result.Split(',') : new string[0];
+                        var mainBalls = new string[5];
+                        var mbBall = "0";
+                        for (int i = 0; i < 5; i++)
+                        {
+                            mainBalls[i] = i < balls.Length ? balls[i].Trim() : "0";
+                        }
+                        if (balls.Length >= 6)
+                        {
+                            mbBall = balls[5].Trim();
+                        }
+
+                        string dayOfWeek = "";
+                        string datePart = "";
+                        string timePart = "";
+                        DateTime drawDt;
+                        if (!string.IsNullOrEmpty(term.date_random) &&
+                            DateTime.TryParseExact(term.date_random, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out drawDt))
+                        {
+                            dayOfWeek = drawDt.ToString("dddd", new CultureInfo("en-US"));
+                            dayOfWeek = char.ToUpper(dayOfWeek[0]) + dayOfWeek.Substring(1);
+                            datePart = drawDt.ToString("dd/MM/yyyy");
+                            timePart = drawDt.ToString("HH:mm");
+                        }
+
+                        <a href="@Url.Action("JackpotDetail", "Home", new { area = "Millions", id = term.id, termType = Model.termType })" class="result-card bg-white rounded-xl flex items-center justify-between px-3 py-2 gap-2">
+                            <div class="flex flex-col gap-0.5 items-start shrink-0">
+                                <span class="bg-[#0062ff] text-white text-[10px] font-bold rounded px-1 py-0.5">@Lang.millions_draw_no_short@term.seq</span>
+                                <span class="text-xs text-[#8e8e93]">@dayOfWeek</span>
+                                <span class="text-[8px] font-bold text-[#8e8e93]">@datePart</span>
+                                <span class="text-[8px] font-bold text-[#8e8e93]">@timePart</span>
+                            </div>
+                            <div class="grid grid-cols-3 gap-1">
+                                @for (int i = 0; i < 5; i++)
+                                {
+                                    <div class="ball ball-blue ball-mini">@mainBalls[i]</div>
+                                }
+                                <div class="relative">
+                                    <img src="/Millions/assets/icons/crown.png" alt="" class="absolute -top-2.5 -right-1 w-4 h-auto rotate-[15deg] pointer-events-none z-0"/>
+                                    <div class="ball ball-mb ball-mini relative z-10">@mbBall</div>
+                                    <span class="absolute -bottom-1 -right-1 bg-[#ee0033] text-white text-[6px] font-bold px-1 rounded z-20">MB</span>
+                                </div>
+                            </div>
+                            <div class="flex flex-col gap-0.5 items-start shrink-0">
+                                <span class="text-xs font-bold text-black">@Lang.millions_jackpot</span>
+                                <p class="leading-none">
+                                    <span class="text-base font-extrabold text-[#002bff]">@Utils.FormatMoney(term.bolet ?? term.money_winner ?? "0")</span><span class="text-[10.32px] font-extrabold text-black align-top">@Lang.v2_htg</span>
+                                </p>
+                                @if (!string.IsNullOrEmpty(term.split))
+                                {
+                                    <span class="text-[8px] text-black">@string.Format(Lang.millions_subscribers_won, term.split)</span>
+                                }
+                            </div>
+                            <img src="/Millions/assets/icons/chevron-right.svg" alt="" class="w-2 h-3 shrink-0"/>
+                        </a>
+                    }
+                }
+
+            </div>
+
+            <!-- Note -->
+            <div class="flex items-center gap-2 bg-[#e6f0ff] rounded-lg px-3 py-2 mb-2 shrink-0">
+                <svg class="w-4 h-4 shrink-0" viewBox="0 0 24 24" fill="#0062ff"><path d="M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Zm0 5a1.25 1.25 0 1 1 0 2.5A1.25 1.25 0 0 1 12 7Zm1 10h-2v-6h2v6Z"/></svg>
+                <p class="text-[10px] font-bold text-[#0062ff]">@Lang.millions_note_results_updated</p>
+            </div>
+        </div>
+    </div>
+
+    @{
+        ViewData["ActiveTab"] = "Home";
+    }
+    @await Html.PartialAsync("~/Areas/Millions/Views/Shared/_BottomNavbar.cshtml")
+
+</div>
+
+@section Scripts {
+    <script src="/Millions/js/all.min.js"></script>
+}

+ 156 - 0
website_natcash/Areas/Millions/Views/Home/More.cshtml

@@ -0,0 +1,156 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = "Millions - More";
+    ViewData["ActiveTab"] = "More";
+    Layout = "~/Areas/Millions/Views/Shared/_Layout.cshtml";
+}
+@using LotteryWebApp.Languages;
+
+<script src="https://cdn.tailwindcss.com"></script>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+<link rel="stylesheet" href="/Millions/css/site.css" />
+<link rel="stylesheet" href="/Millions/css/more.css" />
+
+@functions {
+    public string FormatMoney(string amount) {
+        if (string.IsNullOrEmpty(amount)) return "0";
+        var clean = new string(amount.Where(c => char.IsDigit(c)).ToArray());
+        if (long.TryParse(clean, out long val)) {
+            return val.ToString("#,##0", new System.Globalization.CultureInfo("vi-VN")).Replace(",", ".");
+        }
+        return amount;
+    }
+}
+
+<div class="main-container animate__animated animate__fadeIn min-h-screen relative flex flex-col pb-24 overflow-x-hidden" style="background-color: #EAEAEA !important;">
+    
+    <!-- User Profile Header (Center Aligned, Red Background) -->
+    <div class="w-full bg-[#0062FF] flex flex-col items-center justify-center pt-8 pb-6 px-6 relative z-10 border-none m-0">
+        <!-- Avatar Ring -->
+        <div class="w-[88px] h-[88px] bg-[#EAEAEA] rounded-full flex items-center justify-center border-4 border-[#FFF9CB] shadow-lg mb-3 overflow-hidden">
+            <img src="/Millions/img/avatar.png" class="w-full h-full object-cover" onerror="this.outerHTML='<i class=\'fa-solid fa-user text-gray-500 text-4xl\'></i>'" />
+        </div>
+        <!-- Info -->
+        <span class="font-bold text-lg text-white tracking-wide">@(Model?.profile?.fullName ?? "User")</span>
+        <span class="text-sm text-white font-medium tracking-wide mb-2">@(Model?.profile?.users ?? "0000000000")</span>
+
+        <!-- Coin Display (Matching GameHome aesthetic) -->
+        <div class="flex items-center gap-1.5 mt-1 bg-black/10 px-4 py-1 rounded-full border border-white/10 backdrop-blur-sm">
+            <img src="/Millions/img/gold_coin.png" class="w-5 h-5 object-contain" onerror="this.style.display='none'" />
+            <span class="text-[22px] font-black text-[#FBF3A7]" style="text-shadow: 0 1px 2px rgba(0,0,0,0.2)">@FormatMoney(Model?.userStatus?.bet_coin)</span>
+            <span class="text-[10px] font-bold text-[#FBF3A7] uppercase mt-1.5">@Lang.millions_htg</span>
+        </div>
+    </div>
+
+    <!-- Menu List (White Full Container) -->
+    <div class="w-full bg-white flex flex-col px-6 pt-2 pb-6 relative z-10 m-0 border-none">
+        
+        <!-- Item: Winning Account
+        <div class="flex items-center justify-between py-[18px] border-b-2 border-dashed border-gray-100 cursor-pointer transition-colors active:bg-gray-50">
+            <div class="flex items-center gap-4">
+                <img src="/Millions/img/gold_coin.png" class="w-6 h-6 object-contain" onerror="this.outerHTML='<i class=\'fa-solid fa-sack-dollar text-[#4A4A4A] text-[20px] w-6 text-center\'></i>'" />
+                <span class="text-[#212121] font-bold text-[13px]">@Lang.winning_account</span>
+            </div>
+            <span class="font-extrabold text-[15px] text-[#212121]">@(Model?.userStatus?.cash_coin ?? "0") HTG</span>
+        </div> -->
+
+        <!-- Item: Profile -->
+        <div class="flex items-center justify-between py-[18px] border-b-2 border-dashed border-gray-100 cursor-pointer transition-colors active:bg-gray-50" onclick="window.location.href='/Millions/Home/Profile'">
+            <div class="flex items-center gap-4">
+                <i class="fa-regular fa-user text-[#4A4A4A] text-[20px] w-6 text-center"></i>
+                <span class="text-[#212121] font-bold text-[13px]">@Lang.profile</span>
+            </div>
+            <i class="fa-solid fa-chevron-right text-gray-400 text-sm opacity-80"></i>
+        </div>
+
+        <!-- Item: Reward History -->
+        <div class="flex items-center justify-between py-[18px] border-b-2 border-dashed border-gray-100 cursor-pointer transition-colors active:bg-gray-50" onclick="window.location.href='/Millions/Home/RewardHistory'">
+            <div class="flex items-center gap-4">
+                <i class="fa-solid fa-gift text-[#4A4A4A] text-[20px] w-6 text-center"></i>
+                <span class="text-[#212121] font-bold text-[13px]">Reward History</span>
+            </div>
+            <i class="fa-solid fa-chevron-right text-gray-400 text-sm opacity-80"></i>
+        </div>
+
+        <!-- Item: How to play Pick 10 
+        <div class="flex items-center justify-between py-[18px] border-b-2 border-dashed border-gray-100 cursor-pointer transition-colors active:bg-gray-50" onclick="window.location.href='/Millions/Home/HowToPlay'">
+            <div class="flex items-center gap-4">
+                <i class="fa-regular fa-circle-question text-[#4A4A4A] text-[20px] w-6 text-center"></i>
+                <span class="text-[#212121] font-bold text-[13px]">@Lang.how_to_play_pick10</span>
+            </div>
+            <i class="fa-solid fa-chevron-right text-gray-400 text-sm opacity-80"></i>
+        </div>
+        -->
+
+        <!-- Item: Change Lang 
+        <div class="flex items-center justify-between py-[18px] border-b-2 border-dashed border-gray-100 cursor-pointer transition-colors active:bg-gray-50" onclick="toggleLanguage()">
+            <div class="flex items-center gap-4">
+                <i class="fa-solid fa-language text-[#1689FC] text-[22px] w-6 text-center shadow-blue-500 drop-shadow-sm"></i>
+                <span class="text-[#212121] font-bold text-[13px]">@Lang.change_language</span>
+            </div>
+            <i class="fa-solid fa-chevron-right text-gray-400 text-sm opacity-80"></i>
+        </div>
+        -->
+
+
+
+        <!-- Item: Contact Us -->
+        <div class="flex items-center justify-between py-[18px] cursor-pointer transition-colors active:bg-gray-50">
+            <div class="flex items-center gap-4">
+                <i class="fa-solid fa-phone-volume text-[#4A4A4A] text-[18px] w-6 text-center" style="transform: rotate(-15deg);"></i>
+                <span class="text-[#212121] font-bold text-[13px]">@Lang.contact_us</span>
+            </div>
+            <div class="flex items-center gap-3">
+                <span class="font-extrabold text-[15px] text-[#0062FF]">191</span>
+                <i class="fa-solid fa-chevron-right text-gray-400 text-sm opacity-80"></i>
+            </div>
+        </div>
+
+        <!-- Log out Button -->
+        <div class="mt-6 w-full px-1">
+            <a href="@Url.Action("Logout", "Home", new { area = "Millions" })" class="w-full flex items-center justify-center bg-[#f00b39] text-white font-bold text-[18px] py-[14px] rounded-[10px] shadow-[0_5px_15px_rgba(238,0,51,0.2)] hover:bg-red-700 transition-colors cursor-pointer no-underline active:scale-95 duration-150">
+                @Lang.logout
+            </a>
+        </div>
+
+        <!-- Item: Change Language Flags -->
+        <div class="mt-8 flex items-center justify-center w-full px-1">
+            <div class="flex items-center gap-2 bg-gray-100 p-1.5 rounded-xl w-full">
+                @{
+                    var currentLang = System.Threading.Thread.CurrentThread.CurrentCulture.Name;
+                }
+                <a href="javascript:void(0)" onclick="setLanguage('fr')" class="flex flex-1 justify-center items-center gap-2 px-3 py-2 rounded-lg transition-all @(currentLang == "fr" ? "bg-white shadow-sm border border-gray-200" : "opacity-60 hover:opacity-100")">
+                    <img src="/img/en_flag.png" alt="English" class="w-7 h-auto drop-shadow-sm" />
+                    <span class="text-[13px] font-bold text-gray-700">English</span>
+                </a>
+                <a href="javascript:void(0)" onclick="setLanguage('en')" class="flex flex-1 justify-center items-center gap-2 px-3 py-2 rounded-lg transition-all @(currentLang != "fr" ? "bg-white shadow-sm border border-gray-200" : "opacity-60 hover:opacity-100")">
+                    <img src="/img/Flag_of_Haiti.png" alt="Natcom" class="w-7 h-auto drop-shadow-sm" />
+                    <span class="text-[13px] font-bold text-gray-700">Natcom</span>
+                </a>
+            </div>
+        </div>
+    </div>
+    
+    <!-- Real scalloped edge using CSS mask trick below the white box -->
+    <div class="w-full relative z-10 scalloped-bottom"></div>
+
+    <!-- Bottom Navbar shared component -->
+    <partial name="_BottomNavbar" />
+</div>
+
+
+
+<script>
+
+    function setLanguage(newLang) {
+        fetch(subDomain + '/Home/SetCulture?lang=' + newLang)
+            .then(response => {
+                location.reload();
+            })
+            .catch(error => {
+                location.reload();
+            });
+    }
+</script>
+
+

+ 370 - 0
website_natcash/Areas/Millions/Views/Home/PopupFreeTickit.cshtml

@@ -0,0 +1,370 @@
+@using LotteryWebApp.Languages
+@using LotteryWebApp.Extensions
+@using Microsoft.AspNetCore.Http
+@using System.Globalization
+@{
+	var shouldAutoCheckFreeTicket = Context.Session.GetString("Millions.FreeTicket.AutoChecked") != "1";
+	var popupResourceCulture = CultureInfo.CurrentUICulture;
+	string PopupText(string key) => Lang.ResourceManager.GetString(key, popupResourceCulture) ?? key;
+}
+
+<link rel="stylesheet" href="~/Millions/css/popup-free-ticket.css" asp-append-version="true" />
+
+<aside class="free-ticket-popup" aria-labelledby="freeTicketTitle">
+	<a class="free-ticket-popup__card"
+	   href="#"
+	   id="freeTicketClaimButton"
+	   aria-label="Get your free ticket">
+		<img class="free-ticket-popup__image"
+			 src="~/Millions/assets/images/banner_free_transparent.png"
+			 alt="" aria-hidden="true" />
+		<strong class="free-ticket-popup__ticket-text">
+			@PopupText("millions_free")<br />@PopupText("millions_ticket")
+		</strong>
+		<strong class="free-ticket-popup__button-text" id="freeTicketTitle">
+			<span>@PopupText("free_ticket_banner_cta")</span>
+			<span class="free-ticket-popup__button-highlight">@PopupText("free_ticket_banner_highlight")</span>
+		</strong>
+	</a>
+</aside>
+
+<div class="free-ticket-result" id="freeTicketResultModal" role="dialog" aria-modal="true"
+	 aria-labelledby="freeTicketResultTitle" aria-describedby="freeTicketResultDescription" hidden>
+	<div class="free-ticket-result__backdrop" data-free-ticket-close></div>
+	<section class="free-ticket-result__panel">
+		<h2 class="free-ticket-visually-hidden" id="freeTicketResultTitle">@PopupText("free_ticket_waiting_title")</h2>
+		<p class="free-ticket-visually-hidden" id="freeTicketResultDescription">@PopupText("free_ticket_waiting_description")</p>
+		<img class="free-ticket-result__image"
+			 src="~/Millions/assets/images/free-ticket-success-no-text.png"
+			 alt="" aria-hidden="true" />
+		<strong class="free-ticket-result__copy free-ticket-result__copy--badge">@PopupText("free_ticket_success_badge")</strong>
+		<h2 class="free-ticket-result__copy free-ticket-result__copy--title">@PopupText("free_ticket_success_title")</h2>
+		<p class="free-ticket-result__copy free-ticket-result__copy--received">@PopupText("free_ticket_success_received")</p>
+		<p class="free-ticket-result__copy free-ticket-result__copy--ticket">@PopupText("free_ticket_success_ticket")</p>
+		<p class="free-ticket-result__copy free-ticket-result__copy--chance">@PopupText("free_ticket_success_chance")</p>
+		<strong class="free-ticket-result__copy free-ticket-result__copy--prize">30,000,000 HTG!</strong>
+		<span class="free-ticket-result__copy free-ticket-result__copy--use">@PopupText("free_ticket_success_use")</span>
+		<span class="free-ticket-result__copy free-ticket-result__copy--later">@PopupText("free_ticket_success_later")</span>
+		<p class="free-ticket-result__copy free-ticket-result__copy--validity">@PopupText("free_ticket_success_validity")</p>
+		<button type="button" class="free-ticket-result__action free-ticket-result__action--dismiss-icon"
+				data-free-ticket-close aria-label="@PopupText("millions_close")"></button>
+		<a class="free-ticket-result__action free-ticket-result__action--use"
+		   href="@Url.Action("BuyTicket", "Home", new { area = "Millions", freeTicketMode = "1" })"
+		   aria-label="@PopupText("free_ticket_buy_now")"></a>
+		<button type="button" class="free-ticket-result__action free-ticket-result__action--later"
+				data-free-ticket-close aria-label="@PopupText("millions_close")"></button>
+	</section>
+</div>
+
+<div class="free-ticket-error-43" id="freeTicketError43Modal" role="dialog" aria-modal="true"
+	 aria-labelledby="freeTicketError43Title" aria-describedby="freeTicketError43Description" hidden>
+	<div class="free-ticket-error-43__backdrop" data-free-ticket-error-43-close></div>
+	<section class="free-ticket-error-43__panel">
+		<h2 class="free-ticket-visually-hidden" id="freeTicketError43Title">@PopupText("free_ticket_error_43_title")</h2>
+		<p class="free-ticket-visually-hidden" id="freeTicketError43Description">
+			@PopupText("free_ticket_error_43_description")
+		</p>
+		<img class="free-ticket-error-43__image"
+			 src="~/Millions/assets/images/free-ticket-error-43-no-text.png"
+			 alt="" aria-hidden="true" />
+		<strong class="free-ticket-error-43__copy free-ticket-error-43__copy--badge">@PopupText("free_ticket_error_43_badge")</strong>
+		<h2 class="free-ticket-error-43__copy free-ticket-error-43__copy--title">@PopupText("free_ticket_error_43_title")</h2>
+		<p class="free-ticket-error-43__copy free-ticket-error-43__copy--description">@PopupText("free_ticket_error_43_description")</p>
+		<strong class="free-ticket-error-43__copy free-ticket-error-43__copy--daily-title">@PopupText("free_ticket_error_43_daily_title")</strong>
+		<p class="free-ticket-error-43__copy free-ticket-error-43__copy--daily-description">@PopupText("free_ticket_error_43_daily_description")</p>
+		<span class="free-ticket-error-43__copy free-ticket-error-43__copy--buy">@PopupText("millions_buy_ticket_label")</span>
+		<span class="free-ticket-error-43__copy free-ticket-error-43__copy--close">@PopupText("millions_close")</span>
+		<p class="free-ticket-error-43__copy free-ticket-error-43__copy--footer">@PopupText("free_ticket_error_43_footer")</p>
+		<button type="button" class="free-ticket-error-43__action free-ticket-error-43__action--dismiss-icon"
+				data-free-ticket-error-43-close aria-label="@PopupText("millions_close")"></button>
+		<a class="free-ticket-error-43__action free-ticket-error-43__action--buy"
+		   href="@Url.Action("BuyTicket", "Home", new { area = "Millions" })"
+		   aria-label="@PopupText("millions_buy_ticket_label")"></a>
+		<button type="button" class="free-ticket-error-43__action free-ticket-error-43__action--close"
+				data-free-ticket-error-43-close aria-label="@PopupText("millions_close")"></button>
+	</section>
+</div>
+
+<div class="free-ticket-error-44" id="freeTicketError44Modal" role="dialog" aria-modal="true"
+	 aria-labelledby="freeTicketError44Title" aria-describedby="freeTicketError44Description" hidden>
+	<div class="free-ticket-error-44__backdrop" data-free-ticket-error-44-close></div>
+	<section class="free-ticket-error-44__panel">
+		<h2 class="free-ticket-visually-hidden" id="freeTicketError44Title">@PopupText("free_ticket_waiting_title")</h2>
+		<p class="free-ticket-visually-hidden" id="freeTicketError44Description">
+			@PopupText("free_ticket_waiting_description")
+		</p>
+		<img class="free-ticket-error-44__image"
+			 src="~/Millions/assets/images/free-ticket-error-44-no-text.png"
+			 alt="" aria-hidden="true" />
+		<strong class="free-ticket-error-44__copy free-ticket-error-44__copy--badge">@PopupText("free_ticket_waiting_badge")</strong>
+		<h2 class="free-ticket-error-44__copy free-ticket-error-44__copy--title">@PopupText("free_ticket_waiting_title")</h2>
+		<p class="free-ticket-error-44__copy free-ticket-error-44__copy--description">@PopupText("free_ticket_waiting_description")</p>
+		<p class="free-ticket-error-44__copy free-ticket-error-44__copy--chance">@PopupText("free_ticket_success_chance")</p>
+		<strong class="free-ticket-error-44__copy free-ticket-error-44__copy--prize">30,000,000 HTG!</strong>
+		<span class="free-ticket-error-44__copy free-ticket-error-44__copy--buy">@PopupText("free_ticket_buy_now")</span>
+		<span class="free-ticket-error-44__copy free-ticket-error-44__copy--close">@PopupText("millions_close")</span>
+		<p class="free-ticket-error-44__copy free-ticket-error-44__copy--footer">@PopupText("free_ticket_waiting_validity")</p>
+		<button type="button" class="free-ticket-error-44__action free-ticket-error-44__action--dismiss-icon"
+				data-free-ticket-error-44-close aria-label="@PopupText("millions_close")"></button>
+		<a class="free-ticket-error-44__action free-ticket-error-44__action--buy"
+		   href="@Url.Action("BuyTicket", "Home", new { area = "Millions", freeTicketMode = "1" })"
+		   aria-label="@PopupText("free_ticket_buy_now")"></a>
+		<button type="button" class="free-ticket-error-44__action free-ticket-error-44__action--close"
+				data-free-ticket-error-44-close aria-label="@PopupText("millions_close")"></button>
+	</section>
+</div>
+
+<div class="free-ticket-error-45" id="freeTicketError45Modal" role="dialog" aria-modal="true"
+	 aria-label="Free Tickets Are Sold Out" hidden>
+	<div class="free-ticket-error-45__backdrop" data-free-ticket-error-45-close></div>
+	<section class="free-ticket-error-45__panel">
+		<img class="free-ticket-error-45__image"
+			 src="~/Millions/assets/images/free-ticket-error-45-no-text.png"
+			 alt="" aria-hidden="true" />
+		<strong class="free-ticket-error-45__copy free-ticket-error-45__copy--ticket-free">@PopupText("free_ticket_error_45_ticket_free")</strong>
+		<strong class="free-ticket-error-45__copy free-ticket-error-45__copy--ticket-tickets">@PopupText("free_ticket_error_45_ticket_tickets")</strong>
+		<strong class="free-ticket-error-45__copy free-ticket-error-45__copy--ticket-sold-out">@PopupText("free_ticket_error_45_ticket_sold_out")</strong>
+		<h2 class="free-ticket-error-45__copy free-ticket-error-45__copy--title">
+			@PopupText("free_ticket_error_45_title") <span>@PopupText("free_ticket_error_45_title_emphasis")</span>
+		</h2>
+		<p class="free-ticket-error-45__copy free-ticket-error-45__copy--description">@PopupText("free_ticket_error_45_description")</p>
+		<strong class="free-ticket-error-45__copy free-ticket-error-45__copy--next-title">@PopupText("free_ticket_error_45_next_title")</strong>
+		<p class="free-ticket-error-45__copy free-ticket-error-45__copy--next-primary">@PopupText("free_ticket_error_45_next_primary")</p>
+		<p class="free-ticket-error-45__copy free-ticket-error-45__copy--next-secondary">@PopupText("free_ticket_error_45_next_secondary")</p>
+		<span class="free-ticket-error-45__copy free-ticket-error-45__copy--buy">@PopupText("millions_buy_ticket_label")</span>
+		<span class="free-ticket-error-45__copy free-ticket-error-45__copy--close">@PopupText("millions_close")</span>
+		<p class="free-ticket-error-45__copy free-ticket-error-45__copy--footer">@PopupText("free_ticket_error_45_footer")</p>
+		<button type="button" class="free-ticket-error-45__action free-ticket-error-45__action--dismiss-icon"
+				data-free-ticket-error-45-close aria-label="@PopupText("millions_close")"></button>
+		<a class="free-ticket-error-45__action free-ticket-error-45__action--buy"
+		   href="@Url.Action("BuyTicket", "Home", new { area = "Millions" })"
+		   aria-label="@PopupText("millions_buy_ticket_label")"></a>
+		<button type="button" class="free-ticket-error-45__action free-ticket-error-45__action--close"
+				data-free-ticket-error-45-close aria-label="@PopupText("millions_close")"></button>
+	</section>
+</div>
+
+<script>
+	(function () {
+		var popup = document.querySelector('.free-ticket-popup');
+		var claimButton = document.getElementById('freeTicketClaimButton');
+		var resultModal = document.getElementById('freeTicketResultModal');
+		var error43Modal = document.getElementById('freeTicketError43Modal');
+		var error44Modal = document.getElementById('freeTicketError44Modal');
+		var error45Modal = document.getElementById('freeTicketError45Modal');
+		var error43ReturnFocus = null;
+		var error44ReturnFocus = null;
+		var error45ReturnFocus = null;
+		if (!popup) return;
+
+		function showFreeTicketResult(result) {
+			if (!resultModal || !result || String(result.responseCode) !== '0' || !result.code) {
+				return false;
+			}
+
+			resultModal.hidden = false;
+			document.body.classList.add('free-ticket-result-open');
+			return true;
+		}
+
+		function showFreeTicketError43() {
+			if (!error43Modal) return false;
+
+			error43ReturnFocus = document.activeElement;
+			error43Modal.hidden = false;
+			document.body.classList.add('free-ticket-result-open');
+			var closeButton = error43Modal.querySelector('[data-free-ticket-error-43-close]');
+			if (closeButton) closeButton.focus();
+			return true;
+		}
+
+		function closeFreeTicketError43() {
+			if (!error43Modal) return;
+
+			error43Modal.hidden = true;
+			document.body.classList.remove('free-ticket-result-open');
+			if (error43ReturnFocus && typeof error43ReturnFocus.focus === 'function') {
+				error43ReturnFocus.focus();
+			}
+		}
+
+		if (error43Modal) {
+			error43Modal.querySelectorAll('[data-free-ticket-error-43-close]').forEach(function (closeButton) {
+				closeButton.addEventListener('click', closeFreeTicketError43);
+			});
+
+			error43Modal.addEventListener('keydown', function (event) {
+				if (event.key === 'Escape') closeFreeTicketError43();
+			});
+		}
+
+		function showFreeTicketError44(result) {
+			if (!error44Modal) return false;
+
+			error44ReturnFocus = document.activeElement;
+			error44Modal.hidden = false;
+			document.body.classList.add('free-ticket-result-open');
+			var closeButton = error44Modal.querySelector('[data-free-ticket-error-44-close]');
+			if (closeButton) closeButton.focus();
+			return true;
+		}
+
+		function closeFreeTicketError44() {
+			if (!error44Modal) return;
+
+			error44Modal.hidden = true;
+			document.body.classList.remove('free-ticket-result-open');
+			if (error44ReturnFocus && typeof error44ReturnFocus.focus === 'function') {
+				error44ReturnFocus.focus();
+			}
+		}
+
+		if (error44Modal) {
+			error44Modal.querySelectorAll('[data-free-ticket-error-44-close]').forEach(function (closeButton) {
+				closeButton.addEventListener('click', closeFreeTicketError44);
+			});
+
+			error44Modal.addEventListener('keydown', function (event) {
+				if (event.key === 'Escape') closeFreeTicketError44();
+			});
+		}
+
+		function showFreeTicketError45() {
+			if (!error45Modal) return false;
+
+			error45ReturnFocus = document.activeElement;
+			error45Modal.hidden = false;
+			document.body.classList.add('free-ticket-result-open');
+			var closeButton = error45Modal.querySelector('[data-free-ticket-error-45-close]');
+			if (closeButton) closeButton.focus();
+			return true;
+		}
+
+		function closeFreeTicketError45() {
+			if (!error45Modal) return;
+
+			error45Modal.hidden = true;
+			document.body.classList.remove('free-ticket-result-open');
+			if (error45ReturnFocus && typeof error45ReturnFocus.focus === 'function') {
+				error45ReturnFocus.focus();
+			}
+		}
+
+		if (error45Modal) {
+			error45Modal.querySelectorAll('[data-free-ticket-error-45-close]').forEach(function (closeButton) {
+				closeButton.addEventListener('click', closeFreeTicketError45);
+			});
+
+			error45Modal.addEventListener('keydown', function (event) {
+				if (event.key === 'Escape') closeFreeTicketError45();
+			});
+		}
+
+		if (resultModal) {
+			resultModal.querySelectorAll('[data-free-ticket-close]').forEach(function (closeButton) {
+				closeButton.addEventListener('click', function () {
+					resultModal.hidden = true;
+					document.body.classList.remove('free-ticket-result-open');
+				});
+			});
+		}
+
+		if (claimButton) {
+			var freeTicketMessages = {
+				'38': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_38)),
+				'39': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_39)),
+				'40': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_40)),
+				'41': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_41)),
+				'42': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_42)),
+				'43': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_43)),
+				'44': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_44))
+			};
+
+			if (@(shouldAutoCheckFreeTicket ? "true" : "false") && document.getElementById('playNowSection')) {
+				document.addEventListener('DOMContentLoaded', function () {
+					var initialVerificationToken = document.querySelector('input[name="__RequestVerificationToken"]');
+					$.ajax({
+						url: subDomain + '@Url.Action("GetFreeTicket", "Home", new { area = "Millions" })',
+						type: 'POST',
+						data: {
+							__RequestVerificationToken: initialVerificationToken ? initialVerificationToken.value : '',
+							type: '1'
+						},
+						success: function (result) {
+							if (result && String(result.responseCode) === '0' && result.code) {
+								showFreeTicketError44(result);
+							}
+						}
+					});
+				});
+			}
+
+			claimButton.addEventListener('click', function (event) {
+				event.preventDefault();
+				if (claimButton.dataset.loading === 'true') return;
+
+				var verificationToken = document.querySelector('input[name="__RequestVerificationToken"]');
+				claimButton.dataset.loading = 'true';
+				claimButton.classList.add('free-ticket-popup__card--loading');
+
+				$.ajax({
+					url: subDomain + '@Url.Action("GetFreeTicket", "Home", new { area = "Millions" })',
+					type: 'POST',
+					data: {
+						__RequestVerificationToken: verificationToken ? verificationToken.value : ''
+					},
+					success: function (result) {
+						if (showFreeTicketResult(result)) {
+							return;
+						}
+
+						var responseCode = result && result.responseCode
+							? String(result.responseCode)
+							: '';
+						if (responseCode === '43' && showFreeTicketError43()) {
+							return;
+						}
+						if (responseCode === '44' && showFreeTicketError44(result)) {
+							return;
+						}
+						if (responseCode === '45' && showFreeTicketError45()) {
+							return;
+						}
+						var responseMessage = freeTicketMessages[responseCode]
+							|| (result && result.responseMessage)
+							|| 'Unable to get free ticket.';
+
+						window.alert(responseMessage);
+					},
+					error: function () {
+						window.alert('Unable to get free ticket.');
+					},
+					complete: function () {
+						claimButton.dataset.loading = 'false';
+						claimButton.classList.remove('free-ticket-popup__card--loading');
+					}
+				});
+			});
+		}
+
+		function alignFreeTicketIcon() {
+			var millionsFrame = document.querySelector('.main-content, .main-container');
+			if (!millionsFrame) {
+				popup.style.left = '';
+				popup.style.right = '12px';
+				return;
+			}
+
+			var frameRect = millionsFrame.getBoundingClientRect();
+			var popupWidth = popup.getBoundingClientRect().width;
+			popup.style.left = Math.max(8, frameRect.right - popupWidth - 15) + 'px';
+			popup.style.right = 'auto';
+			popup.style.top = '';
+			popup.style.bottom = '';
+		}
+
+		alignFreeTicketIcon();
+		window.addEventListener('resize', alignFreeTicketIcon, { passive: true });
+		window.addEventListener('scroll', alignFreeTicketIcon, { passive: true, capture: true });
+	})();
+</script>

+ 244 - 0
website_natcash/Areas/Millions/Views/Home/Profile.cshtml

@@ -0,0 +1,244 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = "Millions - Profile";
+    ViewData["ActiveTab"] = "More";
+    Layout = "~/Areas/Millions/Views/Shared/_Layout.cshtml";
+}
+@using LotteryWebApp.Languages;
+
+<script src="https://cdn.tailwindcss.com"></script>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+<link rel="stylesheet" href="/Millions/css/site.css" />
+
+<!-- Add custom font Bricolage Grotesque to match Figma styling -->
+<link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:wght@400;700;800&display=swap" rel="stylesheet">
+<!-- Flatpickr for premium calendar -->
+<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
+<script src="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.js"></script>
+<link rel="stylesheet" href="/Millions/css/results.css" />
+<style>
+    .font-bricolage { font-family: 'Bricolage Grotesque', sans-serif; }
+</style>
+
+<div class="main-container animate__animated animate__fadeIn min-h-screen relative flex flex-col pb-24 font-bricolage" style="background-color: #EAEAEA !important;">
+    
+    <!-- Header (Red Background) - Fixed -->
+    <div class="fixed top-0 left-1/2 -translate-x-1/2 w-full max-w-[414px] bg-[#0062FF] h-[52px] flex items-center justify-between px-4 z-[100] shadow-sm">
+        <!-- Back Button -->
+        <button onclick="window.location.href='/Millions/Home/More'" class="w-10 h-10 flex items-center justify-center -ml-2 rounded-full active:bg-white/20 transition-colors z-10 text-white">
+            <i class="fa-solid fa-arrow-left text-[24px]"></i>
+        </button>
+        <!-- Title -->
+        <div class="absolute inset-0 flex items-center justify-center pointer-events-none">
+            <span class="font-bold text-[32px] text-white tracking-wide">@Lang.profile</span>
+        </div>
+    </div>
+
+    <!-- Header Spacer (~52px) -->
+    <div class="h-[52px]"></div>
+
+    <!-- Content Form -->
+    <div class="w-full flex flex-col items-center px-5 py-6 gap-3 flex-1 overflow-x-hidden">
+        
+        <!-- Phone Number Field (Disabled State) -->
+        <div class="w-full flex flex-col gap-2">
+            <label class="font-bold text-[#534A4A] text-[14px]">@Lang.phone_number</label>
+            <div class="w-full bg-[#C9C9C9] rounded-[8px] h-[50px] px-3 flex items-center shadow-inner">
+                <span class="font-[800] text-[20px] text-black w-full tracking-wide">@(Model?.profile?.users ?? "509XXXXXXXX")</span>
+            </div>
+        </div>
+
+        <!-- Name Field -->
+        <div class="w-full flex flex-col gap-2 mt-2">
+            <label class="font-bold text-[#534A4A] text-[14px]">@Lang.name</label>
+            <div class="w-full bg-transparent border border-[#8F8F8F] rounded-[8px] h-[50px] px-3 flex items-center">
+                <input type="text" id="txtFullName" class="w-full bg-transparent font-[800] text-[20px] text-black outline-none tracking-wide" value="@(Model?.profile?.fullName ?? "User")" />
+            </div>
+        </div>
+
+        <div class="w-full flex flex-col gap-2 mt-2">
+            <label class="font-bold text-[#534A4A] text-[14px]">@Lang.dateOfBirth</label>
+            @{
+                string birthdayVal = Model?.profile?.birthday ?? "2000-01-01";
+                if (birthdayVal.Contains("/")) {
+                    try {
+                        var parts = birthdayVal.Split('/');
+                        if (parts.Length == 3) { birthdayVal = $"{parts[2]}-{parts[1]}-{parts[0]}"; }
+                    } catch { birthdayVal = "2000-01-01"; }
+                }
+            }
+            <div class="w-full bg-transparent rounded-[8px] flex items-center justify-between relative cursor-pointer" onclick="document.getElementById('txtBirthday')._flatpickr.open()">
+                <input type="text" id="txtBirthday" class="w-full bg-transparent font-[800] text-[20px] text-black outline-none tracking-wide flex-1" 
+                       value="@birthdayVal" readonly />
+                <i class="fa-regular fa-calendar text-[#534A4A] text-[20px] pointer-events-none absolute right-3"></i>
+            </div>
+        </div>
+
+
+        <!-- Update Button -->
+        <div class="w-full flex justify-center mt-8">
+            <button id="btnUpdateProfile" onclick="updateProfile(this)" class="w-[300px] max-w-full bg-[#0062FF] text-white font-[800] text-[20px] py-[10px] rounded-[12px] shadow-[0px_3px_8px_rgba(0,0,0,0.25)] hover:bg-red-700 active:scale-95 transition-all">
+                @Lang.update
+            </button>
+        </div>
+
+    </div>
+
+</div>
+
+<!-- Success Modal Overlay -->
+<div id="successModal" class="fixed inset-0 z-[100] flex items-center justify-center hidden px-6 translate-y-0" style="background: linear-gradient(135deg, #1A1A2E 0%, #16213E 100%);">
+    <div class="w-full max-w-[343px] min-h-[520px] bg-white rounded-[20px] overflow-hidden flex flex-col items-center p-8 animate__animated animate__zoomIn animate__faster">
+        <div class="w-full flex flex-col items-center mb-5 mt-4">
+            <div class="relative w-full max-w-[343px] flex items-center justify-center">
+                <img src="/Millions/img/modal/success_header.png" class="w-[280px] h-auto object-contain" />
+            </div>
+        </div>
+        <div class="px-5 text-center mb-10 mt-5">
+            <p class="text-black font-[700] text-[20px] font-bricolage leading-tight">
+                @Lang.update_successful
+            </p>
+        </div>
+        <div class="w-full mt-auto">
+            <button onclick="closeModalAndReload('/Millions/Home/More')" class="w-full bg-[#0062FF] text-white font-[800] text-[20px] py-[10px] rounded-[12px] shadow-[0px_3px_8px_rgba(0,0,0,0.25)] hover:bg-red-700 active:scale-95 transition-all font-bricolage">
+                @Lang.back_to_homepage
+            </button>
+        </div>
+    </div>
+</div>
+
+<!-- Failure Modal Overlay -->
+<div id="failureModal" class="fixed inset-0 z-[100] flex items-center justify-center hidden px-6 translate-y-0" style="background: linear-gradient(135deg, #1A1A2E 0%, #16213E 100%);">
+    <div class="w-full max-w-[343px] min-h-[520px] bg-white rounded-[20px] overflow-hidden flex flex-col items-center p-8 animate__animated animate__zoomIn animate__faster">
+        <div class="w-full flex flex-col items-center mb-8 mt-10">
+            <div class="relative w-full max-w-[343px] flex items-center justify-center">
+                <img src="/Millions/img/modal/fail_icon.png" class="w-[200px] h-auto object-contain" />
+            </div>
+        </div>
+        <div class="px-5 text-center mb-10 mt-5">
+            <p id="failErrorMessage" class="text-black font-[700] text-[20px] font-bricolage leading-tight">
+                @Lang.update_profile_error
+            </p>
+        </div>
+        <div class="w-full mt-auto">
+            <button onclick="closeFailureModal()" class="w-full bg-[#0062FF] text-white font-[800] text-[20px] py-[10px] rounded-[12px] shadow-[0px_3px_8_rgba(0,0,0,0.25)] hover:bg-red-700 active:scale-95 transition-all font-bricolage">
+                @Lang.try_again
+            </button>
+        </div>
+    </div>
+</div>
+
+<partial name="_BottomNavbar" />
+
+<script>
+
+    function initBrandedFlatpickr(selector, yearStart, yearEnd) {
+        flatpickr(selector, {
+            dateFormat: "Y-m-d",
+            altInput: true,
+            altFormat: "d/m/Y",
+            altInputClass: "w-full bg-transparent font-[800] text-[20px] text-black outline-none tracking-wide cursor-pointer",
+            disableMobile: true,
+            monthSelectorType: "dropdown",
+            onReady: function (selectedDates, dateStr, instance) {
+                const yearInput = instance.calendarContainer.querySelector(".numInput.cur-year");
+                if (yearInput) {
+                    const yearSelect = document.createElement("select");
+                    yearSelect.className = "flatpickr-monthDropdown-months cur-year-select";
+                    yearSelect.style.cssText = "appearance:none; font-weight:800; border:none; background:transparent; color:white; cursor:pointer; margin-left:4px; outline:none; font-family:inherit; font-size:inherit;";
+
+                    for (let y = yearEnd; y >= yearStart; y--) {
+                        const opt = document.createElement("option");
+                        opt.value = y;
+                        opt.text = y;
+                        opt.style.color = "#333";
+                        if (y === instance.currentYear) opt.selected = true;
+                        yearSelect.appendChild(opt);
+                    }
+
+                    yearSelect.addEventListener("change", function () {
+                        instance.changeYear(parseInt(this.value));
+                    });
+
+                    yearInput.style.display = "none";
+                    yearInput.parentNode.appendChild(yearSelect);
+                    
+                    instance.set("onChange", function(d, s, i) {
+                        yearSelect.value = i.currentYear;
+                    });
+                }
+            }
+        });
+    }
+
+    document.addEventListener('DOMContentLoaded', function() {
+        initBrandedFlatpickr("#txtBirthday", 1940, 2026);
+    });
+
+    function updateProfile(btn) {
+        var fullName = $("#txtFullName").val();
+        var birthday = $("#txtBirthday").val(); 
+
+        if (fullName == "") {
+            showFailureModal("@Lang.enter_name");
+            return;
+        }
+
+        // Prevent double-click
+        var $btn = $(btn);
+        var originalText = $btn.html();
+        $btn.prop('disabled', true).html('<i class="fa-solid fa-spinner fa-spin mr-2"></i> ...');
+
+        $.ajax({
+            url: subDomain + "/Millions/Home/UserUpdateProfile",
+            type: "POST",
+            data: {
+                fullName: fullName,
+                birthday: birthday
+            },
+            success: function (response) {
+                $btn.prop('disabled', false).html(originalText);
+                if (response.status == "0") {
+                    showSuccessModal();
+                } else {
+                    showFailureModal(response.message || "Update failed", response.status);
+                }
+            },
+            error: function (error) {
+                $btn.prop('disabled', false).html(originalText);
+                showFailureModal("An error occurred during network request");
+            }
+        });
+    }
+
+    function showSuccessModal() {
+        $("#successModal").removeClass("hidden").addClass("flex");
+    }
+
+    var systemUpgrading = false;
+    function showFailureModal(message, code) {
+        $("#failErrorMessage").text(message);
+        const $btn = $("#failureModal button");
+        if (code === "-2" || (message && message.includes("System is upgrading"))) {
+            systemUpgrading = true;
+            $btn.text("@Lang.login");
+        } else {
+            systemUpgrading = false;
+            $btn.text("@Lang.try_again");
+        }
+        $("#failureModal").removeClass("hidden").addClass("flex");
+    }
+
+    function closeModalAndReload(url) {
+        $("#successModal").addClass("hidden").removeClass("flex");
+        window.location.href = url;
+    }
+
+    function closeFailureModal() {
+        $("#failureModal").addClass("hidden").removeClass("flex");
+        if (systemUpgrading) {
+            window.location.href = subDomain + "/Account/Login";
+        }
+    }
+</script>
+

+ 267 - 0
website_natcash/Areas/Millions/Views/Home/Results.cshtml

@@ -0,0 +1,267 @@
+@model LotteryWebApp.Models.TermResultHistoryModel
+@{
+    ViewData["Title"] = "Millions - Results History";
+    Layout = "~/Areas/Millions/Views/Shared/_Layout.cshtml";
+    ViewData["ActiveTab"] = "Results";
+
+    // Default to last 3 days if not specified
+    if (string.IsNullOrEmpty(Model.fromDate)) {
+        Model.fromDate = DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd");
+    }
+    if (string.IsNullOrEmpty(Model.toDate)) {
+        Model.toDate = DateTime.Now.ToString("yyyy-MM-dd");
+    }
+}
+@using LotteryWebApp.Languages;
+@using LotteryWebApp.Common;
+
+
+@section Styles {
+    <script src="https://cdn.tailwindcss.com"></script>
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+    <!-- Flatpickr for premium calendar -->
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
+    <script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
+    <link rel="stylesheet" href="/Millions/css/site.css" />
+    <link rel="stylesheet" href="/Millions/css/results.css" />
+}
+
+<div class="main-container results-container animate__animated animate__fadeIn pb-40 relative mx-auto max-w-[414px] shadow-2xl min-h-screen bg-white">
+    <!-- Header Group: Sticky at Top -->
+    <div class="sticky top-0 w-full z-[100] bg-[#0062FF]">
+        <!-- Header: Matches Figma (Right Image) -->
+        <div class="results-top-header">
+            <a href="javascript:history.back()" class="back-btn">
+                <i class="fa-solid fa-arrow-left"></i>
+            </a>
+            <h1 class="font-bricolage">@Lang.results</h1>
+        </div>
+
+        <!-- Selection Bar: Date range and search -->
+        <div class="selection-bar bg-white rounded-t-[30px] px-4 pt-4 pb-2">
+            <div class="flex gap-3">
+                <div class="date-range-input flex-1 cursor-pointer relative bg-white border border-gray-200 rounded-lg p-2 flex items-center gap-2">
+                    <img src="/Millions/img/icon_calendar.svg" class="w-5 h-5" />
+                    <input type="text" id="dateRange" class="bg-transparent border-none outline-none font-bold text-[13px] w-full ml-1 cursor-pointer" readonly />
+                    <input type="hidden" id="fromDate" value="@Model.fromDate" />
+                    <input type="hidden" id="toDate" value="@Model.toDate" />
+                    <i class="fas fa-caret-down text-gray-400"></i>
+                </div>
+                <button id="btnSearch" class="btn-search-red !w-12 !h-12 flex items-center justify-center bg-[#0062FF] text-white rounded-xl shadow-md" onclick="triggerSearch()">
+                    <i class="fas fa-search"></i>
+                </button>
+            </div>
+        </div>
+
+        <!-- Red Separator Line -->
+        <div class="px-4 mt-1">
+            <div class="h-[2px] bg-gradient-to-r from-transparent via-[#0062FF] to-transparent rounded-full opacity-40"></div>
+        </div>
+    </div>
+
+    <!-- Result List Container -->
+    <div id="results-list-container" class="results-items-list px-4 min-h-[300px]">
+        <!-- Content will be loaded via JS for all 3 games -->
+        <div class="flex flex-col items-center justify-center py-20 text-gray-400">
+             <i class="fas fa-circle-notch fa-spin text-3xl mb-2"></i>
+             <span>Loading results...</span>
+        </div>
+    </div>
+
+    <!-- Bottom Promo Bar (Matches Bottom message with yellow text) -->
+    <div class="fixed bottom-[82px] left-1/2 -translate-x-1/2 w-full min-[600px]:max-w-[414px] bg-[#0062FF] text-white py-2 text-center text-[12px] font-bold tracking-wide z-40 flex flex-col items-center justify-center overflow-hidden h-auto shadow-md">
+         <div class="flex flex-col items-center w-full animate-slide-up">
+              <div class="opacity-90">@Lang.have_chance_to_get</div>
+            <div class="text-[18px] font-black text-[#FBF3A7] mt-0.5">@Lang.millions_jackpot_today_htg</div>
+         </div>
+    </div>
+
+    <!-- Shared Bottom Navbar -->
+    <div class="fixed bottom-0 left-0 w-full z-50">
+         <div class="mx-auto max-w-[414px]">
+             <partial name="_BottomNavbar" />
+         </div>
+    </div>
+
+    <!-- Custom Notification Modal -->
+    <div id="notificationModal" class="fixed inset-0 z-[300] flex items-center justify-center hidden px-6 font-bricolage" style="background: linear-gradient(135deg, rgba(26, 26, 46, 0.9) 0%, rgba(22, 33, 62, 0.9) 100%);">
+        <div class="w-full max-w-[343px] min-h-[420px] bg-white rounded-[24px] overflow-hidden flex flex-col items-center p-8 animate__animated animate__zoomIn animate__faster shadow-2xl border border-white/50">
+            <div class="w-full flex justify-center mb-8 mt-4">
+                <img src="/Millions/img/modal/fail_icon.png" class="w-[160px] h-auto object-contain" alt="Notificaton icon" />
+            </div>
+            <div class="px-2 text-center mb-10 flex-1 flex items-center justify-center">
+                <p id="notificationMessage" class="text-black font-[800] text-[20px] leading-snug"></p>
+            </div>
+            <div class="w-full">
+                <button onclick="closeNotificationModal()" class="w-full bg-[#0062FF] text-white font-[800] text-[18px] py-[12px] rounded-[16px] shadow-lg active:scale-95 transition-all">
+                    @Lang.login
+                </button> 
+            </div>
+        </div>
+    </div>
+</div>
+
+@section Scripts {
+    <script>
+        const gameConfigs = [
+            { code: '@Constants.Millions_CODE', name: 'Millions', color: '#0062FF' }
+        ];
+
+        function formatDateForDisplay(date) {
+            return flatpickr.formatDate(date, "d/m/Y");
+        }
+
+        function formatDateForRequest(date) {
+            return flatpickr.formatDate(date, "Y-m-d");
+        }
+
+        function getDateFromRequestValue(value) {
+            return flatpickr.parseDate(value, "Y-m-d");
+        }
+
+        function setRangeText(fromDate, toDate) {
+            document.getElementById("dateRange").value = `${formatDateForDisplay(fromDate)} - ${formatDateForDisplay(toDate)}`;
+        }
+
+        function syncRangeFields(selectedDates) {
+            if (selectedDates.length === 0) return;
+
+            const fromDate = selectedDates[0];
+            const toDate = selectedDates.length > 1 ? selectedDates[1] : selectedDates[0];
+
+            document.getElementById("fromDate").value = formatDateForRequest(fromDate);
+            document.getElementById("toDate").value = formatDateForRequest(toDate);
+            setRangeText(fromDate, toDate);
+        }
+
+        function initBrandedRangePicker(selector, yearStart, yearEnd) {
+            const inputEl = document.querySelector(selector);
+            const wrapper = inputEl.closest('.date-range-input');
+            const fromDate = getDateFromRequestValue(document.getElementById("fromDate").value);
+            const toDate = getDateFromRequestValue(document.getElementById("toDate").value);
+
+            setRangeText(fromDate, toDate);
+
+            flatpickr(selector, {
+                mode: "range",
+                dateFormat: "Y-m-d",
+                defaultDate: [fromDate, toDate],
+                disableMobile: true,
+                monthSelectorType: "dropdown",
+                appendTo: wrapper,
+                onChange: function (selectedDates) {
+                    syncRangeFields(selectedDates);
+                },
+                onClose: function (selectedDates, dateStr, instance) {
+                    syncRangeFields(selectedDates);
+                    if (selectedDates.length === 1) {
+                        instance.setDate([selectedDates[0], selectedDates[0]], false);
+                        setRangeText(selectedDates[0], selectedDates[0]);
+                    }
+                },
+                onReady: function (selectedDates, dateStr, instance) {
+                    instance.calendarContainer.style.zIndex = "9999";
+                    const yearInput = instance.calendarContainer.querySelector(".numInput.cur-year");
+                    if (yearInput) {
+                        const yearSelect = document.createElement("select");
+                        yearSelect.className = "flatpickr-monthDropdown-months cur-year-select";
+                        yearSelect.style.cssText = "appearance:none; font-weight:800; border:none; background:transparent; color:white; cursor:pointer; margin-left:4px; outline:none; font-family:inherit; font-size:inherit;";
+                        for (let y = yearEnd; y >= yearStart; y--) {
+                            const opt = document.createElement("option");
+                            opt.value = y;
+                            opt.text = y;
+                            opt.style.color = "#333";
+                            if (y === instance.currentYear) opt.selected = true;
+                            yearSelect.appendChild(opt);
+                        }
+                        yearSelect.addEventListener("change", function () {
+                            instance.changeYear(parseInt(this.value));
+                        });
+                        yearInput.style.display = "none";
+                        yearInput.parentNode.appendChild(yearSelect);
+                    }
+                }
+            });
+        }
+
+        document.addEventListener('DOMContentLoaded', function() {
+            initBrandedRangePicker("#dateRange", 2020, 2030);
+            triggerSearch(); // Initial load for all games
+        });
+
+        var systemUpgrading = false;
+        function showNotification(message, code) {
+            $("#notificationMessage").text(message);
+            const $btn = $("#notificationModal button");
+            if (code === "-2" || (message && message.includes("System is upgrading"))) {
+                systemUpgrading = true;
+                $btn.text("@Lang.login");
+            } else {
+                systemUpgrading = false;
+                $btn.text("OK");
+            }
+            $("#notificationModal").removeClass("hidden").addClass("flex");
+        }
+
+        function closeNotificationModal() {
+            $("#notificationModal").addClass("hidden").removeClass("flex");
+            if (systemUpgrading) {
+                window.location.href = subDomain + "/Account/Login";
+            }
+        }
+
+        async function triggerSearch() {
+            const fromDate = document.getElementById("fromDate").value;
+            const toDate = document.getElementById("toDate").value;
+            const btn = document.getElementById("btnSearch");
+            const container = document.getElementById("results-list-container");
+
+            btn.disabled = true;
+            btn.innerHTML = '<i class="fas fa-spinner fa-spin"></i>';
+            container.style.opacity = "0.7";
+
+            try {
+                // Call the new grouped endpoint
+                const response = await fetch(`${subDomain}/Millions/Home/TermResultHistoryGrouped?fromDate=${fromDate}&toDate=${toDate}`);
+                if (!response.ok) throw new Error('Network response was not ok');
+                
+                const html = await response.text();
+                
+                try {
+                    const json = JSON.parse(html);
+                    if (json.responseCode === "-2" || (json.responseMessage && json.responseMessage.includes("System is upgrading"))) {
+                        showNotification(json.responseMessage || "System is upgrading", "-2");
+                        return;
+                    }
+                } catch (e) {
+                    // Not JSON, likely HTML partial
+                }
+
+                if (html.trim() === "") {
+                    container.innerHTML = `
+                        <div class="w-full py-20 flex flex-col items-center justify-center text-gray-400 opacity-60">
+                            <i class="fas fa-search text-5xl mb-4"></i>
+                            <p class="font-bold">@Lang.no_results_found</p>
+                        </div>
+                    `;
+                } else {
+                    container.innerHTML = html;
+                }
+            } catch (error) {
+                console.error("Error loading grouped results:", error);
+                
+                // Check if the error response is JSON and has code -2
+                if (error.message && (error.message.includes("System is upgrading") || error.message.includes("-2"))) {
+                    showNotification(error.message, "-2");
+                } else {
+                    container.innerHTML = `<div class="text-center py-10 text-red-500 font-bold">Error loading results. Please try again.</div>`;
+                }
+            }
+
+            container.style.opacity = "1";
+            btn.disabled = false;
+            btn.innerHTML = '<i class="fas fa-search"></i>';
+        }
+    </script>
+}
+

+ 131 - 0
website_natcash/Areas/Millions/Views/Home/RewardHistory.cshtml

@@ -0,0 +1,131 @@
+@model LotteryWebApp.Models.RewardHistoryModel
+@using LotteryWebApp.Languages
+@{
+    ViewData["Title"] = "Millions - Reward History";
+    Layout = "~/Areas/Millions/Views/Shared/_Layout.cshtml";
+    ViewData["ActiveTab"] = "More";
+}
+
+@section Styles {
+    <script src="https://cdn.tailwindcss.com"></script>
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+    <link rel="stylesheet" href="/Millions/css/site.css" />
+    <link rel="stylesheet" href="/Millions/css/results.css" />
+    <link rel="stylesheet" href="/Millions/css/reward-history.css" />
+}
+
+<div class="main-container reward-history-container animate__animated animate__fadeIn pb-40 relative">
+    <!-- Fixed Header -->
+    <div class="fixed top-0 left-0 md:left-1/2 md:-translate-x-1/2 w-full md:max-w-[430px] z-[100] bg-[#0062FF]">
+        <div class="results-top-header">
+            <a href="/Millions/Home/More" class="back-btn">
+                <i class="fa-solid fa-arrow-left"></i>
+            </a>
+            <h1 class="font-bricolage">Reward History</h1>
+        </div>
+        <!-- Spacer with rounded white top (matches History layout) -->
+        <div class="bg-white rounded-t-[30px] h-[16px]"></div>
+    </div>
+
+    <!-- List container (spaced below fixed header) -->
+    <div id="reward-list-container"
+         class="reward-list-container bg-white rounded-t-[30px] px-4 pt-4 mt-[80px] pb-[120px] min-h-[calc(100vh-80px)] shadow-sm">
+        <partial name="_RewardHistoryList" model="Model" />
+    </div>
+
+    <!-- Bottom Navbar -->
+    <partial name="_BottomNavbar" />
+
+    <!-- Notification Modal -->
+    <div id="notificationModal" class="fixed inset-0 z-[300] flex items-center justify-center hidden px-6 font-bricolage" style="background: linear-gradient(135deg, rgba(26, 26, 46, 0.9) 0%, rgba(22, 33, 62, 0.9) 100%);">
+        <div class="w-full max-w-[343px] min-h-[420px] bg-white rounded-[24px] overflow-hidden flex flex-col items-center p-8 animate__animated animate__zoomIn animate__faster shadow-2xl border border-white/50">
+            <div class="w-full flex justify-center mb-8 mt-4">
+                <img src="/Millions/img/modal/fail_icon.png" class="w-[160px] h-auto object-contain" alt="Notification icon" />
+            </div>
+            <div class="px-2 text-center mb-10 flex-1 flex items-center justify-center">
+                <p id="notificationMessage" class="text-black font-[800] text-[20px] leading-snug"></p>
+            </div>
+            <div class="w-full">
+                <button onclick="closeNotificationModal()" class="w-full bg-[#0062FF] text-white font-[800] text-[18px] py-[12px] rounded-[16px] shadow-lg active:scale-95 transition-all">
+                    @Lang.login
+                </button>
+            </div>
+        </div>
+    </div>
+</div>
+
+@section Scripts {
+    <script>
+        let currentSeqPage = parseInt('@Model.seqPage' || '1');
+        let totalPages = parseInt('@Model.totalPage' || '1');
+        let systemUpgrading = false;
+
+        function changeRewardPage(page) {
+            if (page < 1 || page > totalPages) return;
+            currentSeqPage = page;
+            loadRewardHistory();
+        }
+
+        function loadRewardHistory() {
+            const container = document.getElementById("reward-list-container");
+            container.style.opacity = "0.5";
+
+            fetch(subDomain + `/Millions/Home/RewardHistoryPartial?seqPage=${currentSeqPage}`)
+                .then(response => {
+                    if (!response.ok) throw new Error('Network response was not ok');
+                    return response.text();
+                })
+                .then(html => {
+                    try {
+                        const json = JSON.parse(html);
+                        if (json.responseCode === "-2" || (json.responseMessage && json.responseMessage.includes("System is upgrading"))) {
+                            showNotification(json.responseMessage || "System is upgrading", "-2");
+                            return;
+                        }
+                    } catch (e) {
+                        // Not JSON, HTML partial
+                    }
+                    container.innerHTML = html;
+                    container.style.opacity = "1";
+                    updatePaginationUI();
+                })
+                .catch(error => {
+                    console.error("Error loading reward history:", error);
+                    container.style.opacity = "1";
+                    if (error.message && (error.message.includes("System is upgrading") || error.message.includes("-2"))) {
+                        showNotification(error.message, "-2");
+                    }
+                });
+        }
+
+        function updatePaginationUI() {
+            const pageDisplay = document.getElementById("pageDisplay");
+            const prevBtn = document.getElementById("prevPage");
+            const nextBtn = document.getElementById("nextPage");
+
+            if (pageDisplay) pageDisplay.innerText = `${currentSeqPage} / ${totalPages}`;
+            if (prevBtn) prevBtn.disabled = currentSeqPage <= 1;
+            if (nextBtn) nextBtn.disabled = currentSeqPage >= totalPages;
+        }
+
+        function showNotification(message, code) {
+            $("#notificationMessage").text(message);
+            const $btn = $("#notificationModal button");
+            if (code === "-2" || (message && message.includes("System is upgrading"))) {
+                systemUpgrading = true;
+                $btn.text("@Lang.login");
+            } else {
+                systemUpgrading = false;
+                $btn.text("OK");
+            }
+            $("#notificationModal").removeClass("hidden").addClass("flex");
+        }
+
+        function closeNotificationModal() {
+            $("#notificationModal").addClass("hidden").removeClass("flex");
+            if (systemUpgrading) {
+                window.location.href = subDomain + "/Account/Login";
+            }
+        }
+    </script>
+}

+ 305 - 0
website_natcash/Areas/Millions/Views/Home/Rule.cshtml

@@ -0,0 +1,305 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = "Millions - Rule";
+    ViewData["ActiveTab"] = "Rule";
+    Layout = "~/Areas/Millions/Views/Shared/_Layout.cshtml";
+}
+@using LotteryWebApp.Languages;
+
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+<link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:wght@400;700;800;900&display=swap" rel="stylesheet">
+
+@section Styles {
+    <link rel="stylesheet" href="/Millions/css/rule.css" />
+}
+
+<div class="millions-rule-page">
+    <!-- Header -->
+    <div class="header">
+        <a href="javascript:history.back()" class="back-btn">
+            <i class="fa-solid fa-arrow-left"></i>
+        </a>
+        <div class="header-title">@Lang.millions_rule_title</div>
+    </div>
+
+    <!-- Main Content Card -->
+    <div class="content-card custom-scrollbar">
+        <div class="content-inner">
+            <!-- Banner -->
+            <div class="banner">
+                <div class="banner-content">
+                    <span class="banner-text">@Lang.millions_mega_millions</span>
+                    <div class="banner-ball">
+                        <img src="/Millions/img/ball_88.png" alt="88">
+                        <i class="fa-solid fa-crown crown"></i>
+                    </div>
+                </div>
+            </div>
+
+            <!-- Draw Schedule -->
+            <div class="rule-section">
+                <div class="section-header">
+                    <span class="section-emoji">📅</span>
+                    <div class="section-title">@Lang.millions_draw_schedule</div>
+                </div>
+                <ul class="rule-list">
+                    <li class="rule-item">@Lang.millions_draw_frequency</li>
+                    <li class="rule-item">@Lang.millions_draw_time</li>
+                    <li class="rule-item">@Lang.millions_ticket_closing_time</li>
+                </ul>
+            </div>
+
+            <!-- How to play -->
+            <div class="rule-section">
+                <div class="section-header">
+                    <span class="section-emoji">▶️</span>
+                    <div class="section-title">@Lang.millions_how_to_play</div>
+                </div>
+                <ul class="rule-list">
+                    <li class="rule-item">@Lang.millions_ticket_includes_6</li>
+                    <li class="rule-item rule-subitem">@Lang.millions_select_5_main</li>
+                    <li class="rule-item rule-subitem">@Lang.millions_select_1_mega</li>
+                    <li class="rule-item">@Lang.millions_ticket_price</li>
+                    <li class="rule-item">@Lang.millions_payment_via</li>
+                </ul>
+            </div>
+
+            <!-- Game rules -->
+            <div class="rule-section">
+                <div class="section-header">
+                    <span class="section-emoji">🔨</span>
+                    <div class="section-title">@Lang.millions_game_rules_title</div>
+                </div>
+                <ul class="rule-list">
+                    <li class="rule-item">@Lang.millions_results_based_on</li>
+                    <li class="rule-item">@Lang.millions_one_highest_prize</li>
+                    <li class="rule-item">@Lang.millions_winnings_calculated</li>
+                </ul>
+            </div>
+
+            <!-- Prize Structure -->
+            <div class="rule-section">
+                <style>
+                    .millions-rule-page .prize-table {
+                        width: 100%;
+                        display: flex;
+                        flex-direction: column;
+                        gap: 12px;
+                    }
+                    .millions-rule-page .prize-header-labels {
+                        display: flex;
+                        justify-content: space-between;
+                        background-color: var(--primary-blue);
+                        color: white;
+                        padding: 12px 14px;
+                        border-radius: 8px;
+                        margin-bottom: 6px;
+                        box-shadow: 0 4px 8px rgba(0, 98, 255, 0.2);
+                    }
+                    .millions-rule-page .prize-label {
+                        font-weight: 800;
+                        font-size: 13px;
+                        text-transform: uppercase;
+                    }
+                    .millions-rule-page .prize-row {
+                        display: flex;
+                        justify-content: space-between;
+                        padding: 8px 14px;
+                        background-color: #fcfcfc;
+                        border-radius: 8px;
+                        border: 1px solid #f0f0f0;
+                        align-items: center;
+                    }
+                    .millions-rule-page .prize-row:nth-child(even) {
+                        background-color: #f7f9ff;
+                    }
+                    .millions-rule-page .match-header,
+                    .millions-rule-page .match-col {
+                        width: 64%;
+                        text-align: left;
+                    }
+                    .millions-rule-page .prize-header,
+                    .millions-rule-page .prize-col {
+                        width: 36%;
+                        text-align: right;
+                    }
+                    .millions-rule-page .match-col {
+                        font-size: 12.5px;
+                        color: #333;
+                        font-weight: 600;
+                        line-height: 1.3;
+                    }
+                    .millions-rule-page .prize-col {
+                        font-size: 13.5px;
+                        color: #000;
+                        font-weight: 800;
+                    }
+                    .millions-rule-page .prize-col.jackpot {
+                        color: #0062FF;
+                        text-transform: uppercase;
+                        font-weight: 900;
+                    }
+                </style>
+                <div class="section-header">
+                    <span class="section-emoji">🔔</span>
+                    <div class="section-title">@Lang.millions_prize_structure</div>
+                </div>
+                
+                <div class="prize-table">
+                    <div class="prize-header-labels">
+                        <div class="prize-label match-header">@Lang.millions_match_result_header</div>
+                        <div class="prize-label prize-header">@Lang.millions_prize_htg_header</div>
+                    </div>
+
+                    <div class="prize-rows">
+                        <div class="prize-row">
+                            <div class="match-col">@Lang.millions_match_5_plus_mega</div>
+                            <div class="prize-col jackpot">@Lang.millions_jackpot_label</div>
+                        </div>
+                        <div class="prize-row">
+                            <div class="match-col">@Lang.millions_match_5_numbers</div>
+                            <div class="prize-col">400,000</div>
+                        </div>
+                        <div class="prize-row">
+                            <div class="match-col">@Lang.millions_match_4_plus_mega</div>
+                            <div class="prize-col">40,000</div>
+                        </div>
+                        <div class="prize-row">
+                            <div class="match-col">@Lang.millions_match_4_numbers</div>
+                            <div class="prize-col">2,000</div>
+                        </div>
+                        <div class="prize-row">
+                            <div class="match-col">@Lang.millions_match_3_plus_mega</div>
+                            <div class="prize-col">800</div>
+                        </div>
+                        <div class="prize-row">
+                            <div class="match-col">@Lang.millions_match_3_numbers</div>
+                            <div class="prize-col">40</div>
+                        </div>
+                        <div class="prize-row">
+                            <div class="match-col">@Lang.millions_match_2_plus_mega</div>
+                            <div class="prize-col">40</div>
+                        </div>
+                        <div class="prize-row">
+                            <div class="match-col">@Lang.millions_match_1_plus_mega</div>
+                            <div class="prize-col">30</div>
+                        </div>
+                        <div class="prize-row">
+                            <div class="match-col">@Lang.millions_match_mega_only</div>
+                            <div class="prize-col">10</div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <!-- Mega Jackpot Rules -->
+            <div class="rule-section jackpot-rules-section" style="margin-top: 32px; border-top: 1.5px dashed #eee; padding-top: 20px;">
+                <style>
+                    .jackpot-rules-section .rule-subsection-title {
+                        font-weight: 800;
+                        color: #1A1A1A;
+                        margin-top: 16px;
+                        font-size: 14px;
+                    }
+                    .jackpot-rules-section .rule-list {
+                        margin-top: 6px;
+                    }
+                    .jackpot-rules-section .rule-item-dash {
+                        padding-left: 15px !important;
+                    }
+                    .jackpot-rules-section .rule-item-dash::before {
+                        content: '–' !important;
+                        left: 0;
+                        color: #333333;
+                        font-weight: bold;
+                    }
+                </style>
+                <div class="section-header" style="margin-bottom: 8px;">
+                    <span class="section-emoji">🎰</span>
+                    <div class="section-title">@Lang.millions_jackpot_rules_title</div>
+                </div>
+                
+                <div class="rule-subsection-title">@Lang.millions_jackpot_rule1_title</div>
+                <ul class="rule-list">
+                    <li class="rule-item rule-item-dash">@Lang.millions_jackpot_rule1_desc1</li>
+                    <li class="rule-item rule-item-dash">@Lang.millions_jackpot_rule1_desc2</li>
+                </ul>
+
+                <div class="rule-subsection-title">@Lang.millions_jackpot_rule2_title</div>
+                <ul class="rule-list">
+                    <li class="rule-item rule-item-dash">@Lang.millions_jackpot_rule2_desc1</li>
+                    <li class="rule-item rule-item-dash">@Lang.millions_jackpot_rule2_desc2</li>
+                </ul>
+
+                <div class="rule-subsection-title">@Lang.millions_jackpot_rule3_title</div>
+                <ul class="rule-list">
+                    <li class="rule-item rule-item-dash">@Lang.millions_jackpot_rule3_desc1</li>
+                    <li class="rule-item rule-item-dash">@Lang.millions_jackpot_rule3_desc2</li>
+                </ul>
+
+                <div class="rule-subsection-title">@Lang.millions_jackpot_rule4_title</div>
+                <ul class="rule-list">
+                    <li class="rule-item rule-item-dash">@Lang.millions_jackpot_rule4_desc1</li>
+                    <li class="rule-item rule-item-dash">@Lang.millions_jackpot_rule4_desc2</li>
+                </ul>
+
+                <div class="rule-subsection-title">@Lang.millions_jackpot_rule5_title</div>
+                <ul class="rule-list">
+                    <li class="rule-item rule-item-dash">@Lang.millions_jackpot_rule5_desc1</li>
+                    <li class="rule-item rule-subitem rule-item-dash" style="color: #555; font-size: 13px;">@Lang.millions_jackpot_rule5_item1</li>
+                    <li class="rule-item rule-subitem rule-item-dash" style="color: #555; font-size: 13px;">@Lang.millions_jackpot_rule5_item2</li>
+                    <li class="rule-item rule-subitem rule-item-dash" style="color: #555; font-size: 13px;">@Lang.millions_jackpot_rule5_item3</li>
+                    <li class="rule-item rule-item-dash">@Lang.millions_jackpot_rule5_desc2</li>
+                </ul>
+
+                <div class="rule-subsection-title">@Lang.millions_jackpot_rule6_title</div>
+                <ul class="rule-list">
+                    <li class="rule-item rule-item-dash">@Lang.millions_jackpot_rule6_desc1</li>
+                    <li class="rule-item rule-item-dash">@Lang.millions_jackpot_rule6_desc2</li>
+                </ul>
+
+                <div class="rule-subsection-title">@Lang.millions_jackpot_rule7_title</div>
+                <ul class="rule-list">
+                    <li class="rule-item rule-item-dash">@Lang.millions_jackpot_rule7_desc1</li>
+                    <li class="rule-item rule-item-dash">@Lang.millions_jackpot_rule7_desc2</li>
+                    <li class="rule-item rule-item-dash">@Lang.millions_jackpot_rule7_desc3</li>
+                </ul>
+            </div>
+            
+            <!-- Note Section -->
+            <div class="rule-section note-section" style="margin-top: 32px; border-top: 1.5px dashed #eee; padding-top: 20px;">
+                <style>
+                    .note-section .rule-list {
+                        margin-top: 8px;
+                    }
+                    .note-section .rule-item-no-bullet::before {
+                        content: none !important;
+                    }
+                    .note-section .rule-item-no-bullet {
+                        padding-left: 0 !important;
+                        font-weight: 700;
+                        color: #1A1A1A;
+                    }
+                </style>
+                <div class="section-header" style="margin-bottom: 8px;">
+                    <span class="section-emoji">📌</span>
+                    <div class="section-title">@Lang.millions_note_title</div>
+                </div>
+                <ul class="rule-list">
+                    <li class="rule-item rule-item-no-bullet">@Lang.millions_note_coin_rate</li>
+                    <li class="rule-item" style="margin-top: 10px;">@Lang.millions_note_rewards_credit</li>
+                    <li class="rule-item rule-subitem" style="color: #555; font-size: 13px;">@Lang.millions_note_conversion_main</li>
+                    <li class="rule-item rule-subitem" style="color: #555; font-size: 13px;">@Lang.millions_note_conversion_natcash</li>
+                </ul>
+            </div>
+        </div>
+    </div>
+
+    <!-- Bottom Navbar shared component -->
+    <partial name="_BottomNavbar" />
+</div>
+
+
+
+
+

+ 621 - 0
website_natcash/Areas/Millions/Views/Home/TransferWinMoney.cshtml

@@ -0,0 +1,621 @@
+@model LotteryWebApp.Models.HomeIndex_ViewModel
+@{
+    ViewData["Title"] = Lang.millions_transfer;
+    Layout = "~/Areas/Millions/Views/Shared/_Layout.cshtml";
+}
+@using LotteryWebApp.Languages;
+@functions {
+    public string FormatMoney(string amount) {
+        if (string.IsNullOrEmpty(amount)) return "0";
+        var clean = new string(amount.Where(c => char.IsDigit(c)).ToArray());
+        if (long.TryParse(clean, out long val)) {
+            return val.ToString("#,##0", new System.Globalization.CultureInfo("vi-VN")).Replace(",", ".");
+        }
+        return amount;
+    }
+}
+
+@section Styles {
+    <link rel="stylesheet" href="/Millions/css/transfer-win-money.css" />
+}
+
+<div class="millions-transfer-page animate__animated animate__fadeIn overflow-x-hidden">
+    <div class="header">
+        <a href="javascript:history.back()" class="back-btn" aria-label="Back">
+            <i class="fa-solid fa-arrow-left"></i>
+        </a>
+        <div class="header-title">@Lang.millions_transfer</div>
+    </div>
+
+    <div class="content-card">
+        <div class="content-inner">
+            <div class="max-w-[414px] mx-auto w-full">
+        <!-- Account Card Section (Matching Figma: Frame 69) -->
+        <div class="relative w-full bg-[#0062FF] rounded-[12px] overflow-hidden shadow-xl mb-4 pl-8 pr-5 py-2 flex flex-col justify-between" style="border: 4px solid transparent; border-image: linear-gradient(175deg, rgba(255,255,255,0.2) 0%, rgba(255,199,0,0.4) 100%) 1; border-radius: 12px; aspect-ratio: 383/92;">
+            <!-- Decorative Elements (positions from Figma: card 383×92) -->
+            <div class="absolute inset-0 pointer-events-none overflow-hidden rounded-[12px]">
+                <!-- Golden Ribbon: Figma x:232.58 y:19.11 w:202.23 h:113.29 → right:0, top:20.8%, w:52.8% -->
+                <img src="/Millions/img/transfer_card_bg_v2.png" alt="" class="absolute z-0" style="right: -10%; top: 20%; width: 53%; height: auto;" />
+                
+                <!-- Coin 2 (top-right): Figma x:336 y:11 w:27 h:26 → right:5.2%, top:12% -->
+                <img src="/Millions/img/transfer/coin_2.png" alt="" class="absolute z-10 animate-float" style="right: 5%; top: 12%; width: 7%;" />
+                <!-- Coin 1 (mid-right): Figma x:309 y:51 w:28 h:25 → right:12%, top:55% -->
+                <img src="/Millions/img/transfer/coin_1.png" alt="" class="absolute z-10 animate-float" style="right: 12%; top: 55%; width: 7.4%; animation-delay: 0.5s;" />
+                <!-- Coin 3 (small, left of ribbon): Figma x:272 y:27 w:18 h:12 → right:24.3%, top:29% -->
+                <img src="/Millions/img/transfer/coin_3.png" alt="" class="absolute z-10 animate-pulse" style="right: 24%; top: 29%; width: 4.7%;" />
+                
+                <!-- Lights: Figma w:800 h:43, full-bleed glow overlays -->
+                <img src="/Millions/img/transfer/light_1.png" alt="" class="absolute z-[1]" style="top: -23%; left: -55%; width: 210%; opacity: 0.7;" />
+                <img src="/Millions/img/transfer/light_2.png" alt="" class="absolute z-[1]" style="bottom: -23%; left: -55%; width: 210%; opacity: 0.7;" />
+            </div>
+
+            <!-- Account Label -->
+            <p class="relative z-10 text-white font-bold text-[16px] tracking-normal" style="font-family: 'Bricolage Grotesque', sans-serif;">@Lang.millions_account_name</p>
+            
+            <!-- Balance Row -->
+            <div class="relative z-10 flex items-end gap-2">
+                <span id="currentBetCoin" class="font-[800] text-[40px] leading-[1.2]" style="background: linear-gradient(179deg, rgba(255,255,255,1) 0%, rgba(240,201,63,1) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; font-family: 'Bricolage Grotesque', sans-serif;">@FormatMoney(Model?.userStatus?.bet_coin)</span>
+                <span class="text-white font-[800] text-[20px] uppercase pb-[6px]" style="font-family: 'Bricolage Grotesque', sans-serif;">htg</span>
+            </div>
+        </div>
+
+        <!-- Selection Area (Horizontal Cards) -->
+        <div class="mb-4">
+            <h2 class="text-[#534A4A] font-[900] text-[18px] mb-2 pl-1">@Lang.millions_choose_account</h2>
+            <div class="flex gap-3">
+            <!-- Basic Account Option -->
+            <div id="selectBasic" onclick="selectChannel(1)" class="channel-card flex-1 bg-white h-[68px] rounded-[18px] border-2 border-[#0062FF] shadow-md flex items-center px-3 gap-2 cursor-pointer relative">
+                <!-- Selected Icon -->
+                <div class="check-icon absolute -top-2 -right-1 bg-white rounded-full">
+                    <i class="fa-solid fa-circle-check text-[#00AF1B] text-[20px]"></i>
+                </div>
+                <span class="text-[#0062FF] font-[900] text-[15px] leading-tight flex-1">@Lang.Basic<br />@Lang.Account</span>
+                <img src="/Millions/img/transfer_basic_icon.png" alt="Basic" class="w-12 h-10 object-contain" />
+            </div>
+            <!-- Natcash Card -->
+            <div id="selectNatcash" onclick="selectChannel(2)" class="channel-card flex-1 bg-white h-[68px] rounded-[18px] border border-gray-100 shadow-sm flex items-center px-3 gap-2 cursor-pointer relative overflow-visible">
+                <!-- Selected Icon (Hidden by default) -->
+                <div class="check-icon absolute -top-2 -right-1 bg-white rounded-full hidden">
+                    <i class="fa-solid fa-circle-check text-[#00AF1B] text-[20px]"></i>
+                </div>
+                <div class="flex-1 overflow-hidden h-full flex items-center">
+                    <img src="/Millions/img/transfer_other_card.png" alt="Natcash" class="w-full h-full object-contain" />
+                </div>
+            </div>
+            </div>
+        </div>
+
+        <!-- Form Fields Area -->
+        <div class="flex flex-col gap-1.5">
+            <!-- Sender Phone -->
+            <div class="flex flex-col gap-1.5">
+                <label class="text-[#534A4A] font-[900] text-[15px] px-1 capitalize">@Lang.millions_sender_phone</label>
+                <div class="relative w-full group">
+                    <input type="text" readonly value="@(Model?.userStatus?.msisdn ?? "0")" class="w-full bg-gray-100 border border-gray-300 text-[#534A4A] text-[17px] font-[800] rounded-[18px] py-3 px-5 outline-none transition-all cursor-not-allowed" />
+                    <div class="absolute right-4 top-1/2 -translate-y-1/2 text-gray-400">
+                        <i class="fa-solid fa-lock text-[20px] opacity-40"></i>
+                    </div>
+                </div>
+            </div>
+
+            <!-- Receiver Phone (Mandatory same as sender) -->
+            <div class="flex flex-col gap-1.5">
+                <label class="text-[#534A4A] font-[900] text-[15px] px-1 capitalize">@Lang.millions_receiver_phone</label>
+                <div class="relative w-full">
+                    <input id="receiverPhone" type="tel" readonly value="@(Model?.userStatus?.msisdn ?? "0")" class="w-full bg-gray-100 border border-gray-300 text-[#534A4A] text-[17px] font-[800] rounded-[18px] py-3 px-5 outline-none transition-all cursor-not-allowed" />
+                    <div class="absolute right-4 top-1/2 -translate-y-1/2 text-gray-400">
+                        <i class="fa-solid fa-lock text-[20px] opacity-40"></i>
+                    </div>
+                </div>
+            </div>
+
+            <!-- Amount -->
+            <div class="flex flex-col gap-1.5">
+                <label class="text-[#534A4A] font-[900] text-[15px] px-1 capitalize">@Lang.millions_amount_htg</label>
+                <div class="relative w-full">
+                    <input id="transferAmount" type="number" value="5000" placeholder="5,000" class="w-full bg-white border border-gray-300 focus:border-[#0062FF] focus:ring-2 focus:ring-[#0062FF]/10 text-[#0062FF] text-[17px] font-[800] rounded-[18px] py-3 px-5 outline-none transition-all placeholder:text-gray-300" />
+                    <span class="absolute right-5 top-1/2 -translate-y-1/2 text-gray-400 font-black">HTG</span>
+                </div>
+                <!-- Shortcut Buttons -->
+                <div class="flex gap-2 mt-0.5">
+                    <button onclick="setAmount(10, this)" class="amt-btn flex-1 py-1.5 border border-gray-300 rounded-lg text-[14px] font-black transition-all bg-white text-[#534A4A] flex items-center justify-center gap-1 shadow-sm">
+                        10
+                        <i class="fa-solid fa-circle-check text-[#00AF1B] text-[14px] hidden"></i>
+                    </button>
+                    <button onclick="setAmount(1000, this)" class="amt-btn flex-1 py-1.5 border border-gray-300 rounded-lg text-[14px] font-black transition-all bg-white text-[#534A4A] flex items-center justify-center gap-1 shadow-sm">
+                        1.000
+                        <i class="fa-solid fa-circle-check text-[#00AF1B] text-[14px] hidden"></i>
+                    </button>
+                    <button id="defaultAmt" onclick="setAmount(5000, this)" class="amt-btn flex-1 py-1.5 border-2 border-white bg-[#0062FF] rounded-lg text-[14px] font-black text-white transition-all flex items-center justify-center gap-1 shadow-md">
+                        5.000
+                        <i class="fa-solid fa-circle-check text-white text-[14px]"></i>
+                    </button>
+                </div>
+
+                <!-- Fee Section (Newly placed on a new line) -->
+                <div class="mt-3 flex flex-col gap-0.5 px-1">
+                    <span class="text-gray-500 font-bold text-[13px]">@Lang.millions_fee</span>
+                    <span class="text-black font-black text-[24px] leading-none">@Lang.millions_free</span>
+                </div>
+            </div>
+        </div>
+
+        <!-- Main Action Button -->
+        <div class="mt-4">
+            <button id="btnContinue" class="btn-premium btn-premium-red w-full text-white font-[900] text-[17px] py-4 rounded-[22px] active:scale-95 transition-all uppercase tracking-wide">
+                @Lang.millions_continue
+            </button>
+        </div>
+            </div>
+        </div>
+    </div>
+
+    <!-- Success Modal Overlay -->
+    <div id="successModal" class="transfer-success-overlay fixed inset-0 z-[110] flex items-center justify-center hidden px-4">
+        <div class="transfer-success-card animate__animated animate__zoomIn animate__faster relative">
+            <div class="transfer-success-body">
+                <div class="transfer-success-hero">
+                    <div class="transfer-success-deco" aria-hidden="true">
+                        <span class="d1"></span><span class="d2"></span><span class="d3"></span><span class="d4"></span>
+                        <span class="dash dash-1"></span><span class="dash dash-2"></span><span class="dash dash-3"></span>
+                        <i class="fa-solid fa-star spark spark-1"></i>
+                        <i class="fa-solid fa-star spark spark-2"></i>
+                    </div>
+                    <div class="transfer-success-ring">
+                        <i class="fa-solid fa-check" aria-hidden="true"></i>
+                    </div>
+                </div>
+
+                <h2 class="transfer-success-title">@Lang.success</h2>
+                <p class="transfer-success-sub">@Lang.millions_payment_successfully</p>
+                <p id="successTransferNote" class="transfer-success-sub" style="color: #0A9800; font-size: 14px; margin-top: -6px; margin-bottom: 12px; font-weight: 800; text-align: center;"></p>
+
+                <div class="transfer-success-panel">
+                    <div class="transfer-success-row">
+                        <div class="transfer-success-row-icon"><i class="fa-solid fa-credit-card" aria-hidden="true"></i></div>
+                        <span class="transfer-success-row-label">@Lang.amount_transfered</span>
+                        <span id="successAmount" class="transfer-success-row-value transfer-success-row-value--accent">5.000 HTG</span>
+                    </div>
+                    <div class="transfer-success-row">
+                        <div class="transfer-success-row-icon"><i class="fa-solid fa-user" aria-hidden="true"></i></div>
+                        <span class="transfer-success-row-label">@Lang.sender</span>
+                        <span id="successSender" class="transfer-success-row-value">50940236545</span>
+                    </div>
+                    <div class="transfer-success-row">
+                        <div class="transfer-success-row-icon"><i class="fa-solid fa-user" aria-hidden="true"></i></div>
+                        <span class="transfer-success-row-label">@Lang.receiver</span>
+                        <span id="successReceiver" class="transfer-success-row-value">50940236545</span>
+                    </div>
+                    <div class="transfer-success-row">
+                        <div class="transfer-success-row-icon"><i class="fa-solid fa-tag" aria-hidden="true"></i></div>
+                        <span class="transfer-success-row-label">@Lang.fee</span>
+                        <span class="transfer-success-row-value">0 HTG</span>
+                    </div>
+                </div>
+
+                <div class="transfer-success-time">
+                    <div class="transfer-success-row-icon"><i class="fa-regular fa-clock" aria-hidden="true"></i></div>
+                    <span class="transfer-success-time-label">@Lang.time</span>
+                    <span id="successTime" class="transfer-success-time-value">08/01/2022 - 10:00:20</span>
+                </div>
+
+                <div class="transfer-success-illustration" aria-hidden="true">
+                    <svg viewBox="0 0 140 88" fill="none" xmlns="http://www.w3.org/2000/svg">
+                        <path d="M6 44h18M6 52h12" stroke="#0062FF" stroke-width="2.2" stroke-linecap="round"/>
+                        <path d="M24 36c2-8 10-10 18-8l52 12c8 2 12 8 10 16l-6 14c-2 6-8 8-16 6L32 66c-8-2-12-10-8-30z" stroke="#0062FF" stroke-width="2.2" fill="none" stroke-linejoin="round"/>
+                        <rect x="38" y="40" width="40" height="24" rx="4" transform="rotate(-10 58 52)" stroke="#0062FF" stroke-width="2" fill="#fff"/>
+                        <text x="54" y="58" transform="rotate(-10 58 52)" fill="#0062FF" font-size="17" font-weight="800" font-family="system-ui,Segoe UI,sans-serif">$</text>
+                        <circle cx="108" cy="60" r="17" fill="#0062FF"/>
+                        <path d="M102 60l5 5 11-12" stroke="#fff" stroke-width="2.8" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
+                    </svg>
+                </div>
+            </div>
+            <div class="transfer-success-actions">
+                <button type="button" class="transfer-success-btn-continue" onclick="window.location.href = (typeof subDomain !== 'undefined' ? subDomain : '') + '@Url.Action("TransferWinMoney", "Home", new { area = "Millions" })';">
+                    @Lang.millions_continue
+                </button>
+                <button type="button" class="transfer-success-btn-close" onclick="window.location.href = (typeof subDomain !== 'undefined' ? subDomain : '') + '@Url.Action("GameHome", "Home", new { area = "Millions" })';">
+                    @Lang.close
+                </button>
+            </div>
+        </div>
+    </div>
+
+    <!-- Failure Modal Overlay -->
+    <div id="failureModal" class="transfer-success-overlay fixed inset-0 z-[110] flex items-center justify-center hidden px-4">
+        <div class="transfer-fail-card animate__animated animate__zoomIn animate__faster relative w-full max-w-[370px]">
+            <div class="transfer-fail-header">
+                <div class="transfer-fail-header-deco" aria-hidden="true"></div>
+                <div class="transfer-fail-icon-wrap">
+                    <div class="transfer-fail-icon-circle">
+                        <i class="fa-solid fa-xmark" aria-hidden="true"></i>
+                    </div>
+                    <div class="transfer-fail-icon-warn">
+                        <i class="fa-solid fa-triangle-exclamation" aria-hidden="true"></i>
+                    </div>
+                </div>
+            </div>
+            <div class="transfer-fail-body">
+                <h2 class="transfer-fail-title">@Lang.fail_exclamation</h2>
+                <p id="failErrorMessage" class="transfer-fail-msg">@Lang.millions_enter_valid_amount</p>
+                <div class="transfer-fail-divider" aria-hidden="true"><span></span></div>
+                <div class="transfer-fail-illustration" aria-hidden="true">
+                    <svg viewBox="0 0 140 88" fill="none" xmlns="http://www.w3.org/2000/svg">
+                        <path d="M18 52h22M18 60h14" stroke="#0062FF" stroke-width="2" stroke-linecap="round"/>
+                        <path d="M36 42c2-7 9-9 16-7l46 10c7 2 11 7 9 14l-5 12c-2 5-7 7-14 5L40 64c-7-2-11-8-8-26z" stroke="#0062FF" stroke-width="2" fill="none" stroke-linejoin="round"/>
+                        <path d="M78 38c8-6 18-8 26-4" stroke="#0062FF" stroke-width="2" stroke-linecap="round"/>
+                        <circle cx="96" cy="28" r="14" stroke="#0062FF" stroke-width="2" fill="#fff"/>
+                        <path d="M92 28h8M96 24v8" stroke="#0062FF" stroke-width="1.8" stroke-linecap="round"/>
+                        <path d="M88 22l4-6 3 5M104 20l6-2-2 6" stroke="#0062FF" stroke-width="1.5" stroke-linecap="round" opacity="0.7"/>
+                    </svg>
+                </div>
+            </div>
+            <div id="failureModalStandardActions" class="transfer-success-actions">
+                <button type="button" class="transfer-success-btn-continue" onclick="window.location.href = (typeof subDomain !== 'undefined' ? subDomain : '') + '@Url.Action("TransferWinMoney", "Home", new { area = "Millions" })';">
+                    @Lang.millions_continue
+                </button>
+                <button type="button" class="transfer-success-btn-close" onclick="window.location.href = (typeof subDomain !== 'undefined' ? subDomain : '') + '@Url.Action("GameHome", "Home", new { area = "Millions" })';">
+                    @Lang.close
+                </button>
+            </div>
+            <div id="failureModalUpgradeActions" class="transfer-success-actions is-hidden">
+                <button type="button" class="transfer-success-btn-close" onclick="window.location.href = (typeof subDomain !== 'undefined' ? subDomain : '') + '@Url.Action("GameHome", "Home", new { area = "Millions" })';">
+                    @Lang.back_to_homepage
+                </button>
+            </div>
+        </div>
+    </div>
+
+
+    <!-- OTP Modal Overlay -->
+    <div id="otpModal" class="fixed inset-0 z-[120] flex items-center justify-center hidden px-6" style="background: rgba(0,0,0,0.7);">
+        <!-- Glitter/Sparkles Overlay -->
+        <img src="/Millions/img/modal/otp_glitter.png" class="absolute pointer-events-none opacity-60 w-full max-w-[500px]" />
+
+        <div class="w-full max-w-[360px] bg-white rounded-[32px] overflow-visible flex flex-col items-center animate__animated animate__zoomIn animate__faster relative border-4 border-[#FFCD1D]/10" style="box-shadow: 0 0 25px rgba(229, 107, 35, 0.6);">
+            
+            <!-- Gold Coins on Top -->
+            <img src="/Millions/img/modal/otp_coins.png" class="absolute -top-12 -right-2 w-32 z-30 pointer-events-none drop-shadow-lg" />
+
+            <!-- Red Header -->
+            <div class="w-full bg-[#0062FF] pt-5 pb-4 px-6 rounded-t-[32px] flex justify-center border-b-4 border-white/20">
+                <h3 class="text-white font-[900] text-[22px] tracking-tight text-center">@Lang.millions_confirm_transaction</h3>
+            </div>
+
+            <div class="relative z-10 w-full flex flex-col items-center p-6 py-6 pb-8">
+                
+                <!-- Shield Icon -->
+                <div class="flex flex-col items-center gap-1 mb-2">
+                    <img src="/Millions/img/modal/transfer_coins_exchange.png" class="w-[168px] max-w-[85vw] h-auto object-contain drop-shadow-md" alt="" />
+                    <span class="text-[#534A4A] font-bold text-[14px]">@Lang.millions_convert</span>
+                </div>
+
+                <!-- Conversion Display Area -->
+                <div class="flex items-center justify-center gap-2 mb-4">
+                    <span id="displayAmountCoins" class="text-[#0062FF] font-[900] text-[24px]">100</span>
+                    <span class="text-black font-[900] text-[24px]">@Lang.millions_coins</span>
+                    <i class="fa-solid fa-arrow-right text-gray-800 text-[20px] mx-1"></i>
+                    <span id="displayAmountHTG" class="text-[#0062FF] font-[900] text-[24px]">100</span>
+                    <span class="text-black font-[900] text-[24px]">@Lang.millions_htg</span>
+                </div>
+
+                <p class="text-[#534A4A] font-bold text-[14px] text-center px-4 mb-6 leading-tight">@Lang.millions_enter_otp_proceed</p>
+                
+                <!-- OTP Inputs Area -->
+                <div class="flex gap-2 mb-4" id="otpInputs">
+                    <input type="tel" maxlength="1" pattern="[0-9]" inputmode="numeric" oninput="handleOtpInput(this)" onkeydown="handleOtpKeydown(event, this)" placeholder="-"
+                           class="otp-digit w-[42px] h-[48px] bg-[#757575] text-white rounded-[10px] text-center text-[26px] font-[900] outline-none transition-all placeholder:text-white/60 shadow-inner" />
+                    <input type="tel" maxlength="1" pattern="[0-9]" inputmode="numeric" oninput="handleOtpInput(this)" onkeydown="handleOtpKeydown(event, this)" placeholder="-"
+                           class="otp-digit w-[42px] h-[48px] bg-[#757575] text-white rounded-[10px] text-center text-[26px] font-[900] outline-none transition-all placeholder:text-white/60 shadow-inner" />
+                    <input type="tel" maxlength="1" pattern="[0-9]" inputmode="numeric" oninput="handleOtpInput(this)" onkeydown="handleOtpKeydown(event, this)" placeholder="-"
+                           class="otp-digit w-[42px] h-[48px] bg-[#757575] text-white rounded-[10px] text-center text-[26px] font-[900] outline-none transition-all placeholder:text-white/60 shadow-inner" />
+                    <input type="tel" maxlength="1" pattern="[0-9]" inputmode="numeric" oninput="handleOtpInput(this)" onkeydown="handleOtpKeydown(event, this)" placeholder="-"
+                           class="otp-digit w-[42px] h-[48px] bg-[#757575] text-white rounded-[10px] text-center text-[26px] font-[900] outline-none transition-all placeholder:text-white/60 shadow-inner" />
+                    <input type="tel" maxlength="1" pattern="[0-9]" inputmode="numeric" oninput="handleOtpInput(this)" onkeydown="handleOtpKeydown(event, this)" placeholder="-"
+                           class="otp-digit w-[42px] h-[48px] bg-[#757575] text-white rounded-[10px] text-center text-[26px] font-[900] outline-none transition-all placeholder:text-white/60 shadow-inner" />
+                    <input type="tel" maxlength="1" pattern="[0-9]" inputmode="numeric" oninput="handleOtpInput(this)" onkeydown="handleOtpKeydown(event, this)" placeholder="-"
+                           class="otp-digit w-[42px] h-[48px] bg-[#757575] text-white rounded-[10px] text-center text-[26px] font-[900] outline-none transition-all placeholder:text-white/60 shadow-inner" />
+                </div>
+                
+                <!-- OTP Error Message -->
+                <p id="otpError" class="text-[#0062FF] font-bold text-[14px] text-center mb-4 hidden animate__animated animate__shakeX"></p>
+
+                <!-- Timer & Resend Display -->
+                <div class="flex flex-col items-center justify-center mb-6 gap-2">
+                    <span id="otpTimer" class="text-[#0062FF] font-[900] text-[18px]">60s</span>
+                    <button id="resendOtpBtn" onclick="sendOtpRequest()" class="hidden text-[15px] font-black text-[#0A9800] underline decoration-solid underline-offset-[4px] hover:text-[#087a00] transition-all font-bricolage">@Lang.millions_request_new_otp</button>
+                </div>
+                
+                <!-- Action Buttons -->
+                <div class="w-full flex gap-4">
+                    <button onclick="closeOtpModal()" class="btn-premium flex-1 bg-[#757575] text-white font-[900] py-2.5 rounded-[16px] active:scale-95 transition-all text-[13px]">@Lang.cancel</button>
+                    <button id="btnConfirmTransfer" disabled class="btn-premium flex-1 bg-[#0A9800] text-white font-[900] py-2.5 rounded-[16px] active:scale-95 transition-all text-[13px] disabled:opacity-50 disabled:grayscale disabled:cursor-not-allowed">@Lang.confirm</button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <!-- Bottom Navbar shared component -->
+    <partial name="_BottomNavbar" />
+</div>
+
+
+@section Scripts {
+    <script>
+        function setAmount(val, el) {
+            $("#transferAmount").val(val);
+            
+            // Update active state visuals
+            $(".amt-btn").removeClass("border-2 border-white bg-[#0062FF] text-white shadow-md").addClass("border-gray-300 bg-white text-[#534A4A] shadow-sm");
+            $(".amt-btn i").addClass("hidden").removeClass("text-white").addClass("text-[#00AF1B]"); // reset icons
+            
+            $(el).removeClass("border-gray-300 bg-white text-[#534A4A] shadow-sm").addClass("border-2 border-white bg-[#0062FF] text-white shadow-md");
+            $(el).find("i").removeClass("hidden").removeClass("text-[#00AF1B]").addClass("text-white"); // show current check icon in white
+        }
+
+        // Logic removed as fields are read-only
+
+        let timerInterval;
+        let isProcessing = false;
+        let selectedChannel = 1; // 1 = Basic, 2 = Natcash
+
+        function selectChannel(id) {
+            selectedChannel = id;
+            
+            // Reset both
+            $(".channel-card").removeClass("border-2 border-[#0062FF] shadow-md").addClass("border border-gray-100 shadow-sm");
+            $(".channel-card .check-icon").addClass("hidden");
+            
+            // Activate selected
+            if (id === 1) {
+                $("#selectBasic").removeClass("border-gray-100 shadow-sm").addClass("border-2 border-[#0062FF] shadow-md");
+                $("#selectBasic .check-icon").removeClass("hidden");
+            } else {
+                $("#selectNatcash").removeClass("border-gray-100 shadow-sm").addClass("border-2 border-[#0062FF] shadow-md");
+                $("#selectNatcash .check-icon").removeClass("hidden");
+            }
+        }
+
+        $("#btnContinue").on("click", function() {
+            if (isProcessing) return; // Prevent double-click
+            const rawAmount = $("#transferAmount").val();
+            const amount = parseFloat(unformatMoneyV2(rawAmount)) || 0;
+            const phone = $("#receiverPhone").val();
+            const winMoney = parseFloat(unformatMoneyV2("@(Model?.userStatus?.bet_coin ?? "0")")) || 0;
+            
+            if(amount <= 0) {
+                showFailureModal("@Html.Raw(Lang.millions_enter_valid_amount)");
+                return;
+            }
+
+            if(amount > winMoney) {
+                showFailureModal("@Html.Raw(Lang.millions_insufficient_balance)");
+                return;
+            }
+
+            // Lock button + show loading
+            isProcessing = true;
+            const $btn = $(this);
+            const originalText = $btn.html();
+            $btn.prop('disabled', true).html('<i class="fa-solid fa-spinner fa-spin mr-2"></i> ...');
+
+            // Call sendotp API
+            $.ajax({
+                url: subDomain + "/Millions/Home/SendOTP",
+                type: "POST",
+                data: { phone: phone, amount: unformatMoneyV2(rawAmount), channelPayment: selectedChannel },
+                success: function(res) {
+                    $btn.prop('disabled', false).html(originalText);
+                    isProcessing = false;
+                    if(res.responseCode == "0" || res.responseCode == 0) {
+                        openOtpModal();
+                    } else {
+                        showFailureModal(res.message || "Failed to send OTP", res.responseCode);
+                    }
+                },
+                error: function() {
+                    $btn.prop('disabled', false).html(originalText);
+                    isProcessing = false;
+                    showFailureModal("Network error while sending OTP");
+                }
+            });
+        });
+
+        function openOtpModal() {
+            // Clear previous OTP values
+            $(".otp-digit").val("");
+            $("#btnConfirmTransfer").prop('disabled', true);
+            
+            // Set display amounts
+            const amt = $("#transferAmount").val();
+            const formattedAmt = formatMoneyV2(amt);
+            $("#displayAmountCoins").text(formattedAmt);
+            $("#displayAmountHTG").text(formattedAmt);
+
+            $("#otpModal").removeClass("hidden").addClass("flex");
+            resetTimer();
+            $(".otp-digit").first().focus();
+        }
+
+        function closeOtpModal() {
+            $("#otpModal").addClass("hidden").removeClass("flex");
+            clearInterval(timerInterval);
+        }
+
+        // OTP input: enforce single digit, auto-advance
+        function handleOtpInput(el) {
+            // Allow only single digit
+            el.value = el.value.replace(/[^0-9]/g, '').slice(0, 1);
+            
+            if (el.value.length === 1) {
+                const next = $(el).next('.otp-digit');
+                if (next.length) {
+                    next.focus();
+                }
+            }
+
+            // Check if all 6 digits filled
+            var filled = 0;
+            $(".otp-digit").each(function() { if ($(this).val().length >= 1) filled++; });
+            $("#btnConfirmTransfer").prop('disabled', filled < 6);
+
+            // Clear error when typing and reset color to red
+            $("#otpError").addClass("hidden").text("").removeClass("text-[#0A9800]").addClass("text-[#0062FF] animate__shakeX");
+        }
+
+        // OTP backspace: move to previous input
+        function handleOtpKeydown(e, el) {
+            if (e.key === 'Backspace') {
+                if (el.value.length === 0) {
+                    const prev = $(el).prev('.otp-digit');
+                    if (prev.length) {
+                        prev.focus();
+                    }
+                }
+            }
+        }
+
+        function resetTimer() {
+            let seconds = 60;
+            clearInterval(timerInterval);
+            $("#otpTimer").removeClass("hidden").text("60s");
+            $("#resendOtpBtn").addClass("hidden");
+            // Keep confirm disabled until OTP is filled — don't re-enable here
+            
+            timerInterval = setInterval(() => {
+                seconds--;
+                $("#otpTimer").text(seconds + "s");
+                if (seconds <= 0) {
+                    clearInterval(timerInterval);
+                    $("#otpTimer").addClass("hidden");
+                    $("#resendOtpBtn").removeClass("hidden");
+                    // Disable confirm when timer expired
+                    $("#btnConfirmTransfer").prop('disabled', true).addClass('opacity-50');
+                }
+            }, 1000);
+        }
+
+        function sendOtpRequest() {
+            const $btn = $("#resendOtpBtn");
+            const originalText = $btn.text();
+            $btn.prop('disabled', true).text("...");
+
+            $.ajax({
+                url: subDomain + "/Millions/Home/SendOTP",
+                type: 'POST',
+                success: function(data) {
+                    $btn.prop('disabled', false).text(originalText);
+                    if (data.responseCode === "0" || data.responseCode === 0) {
+                        resetTimer();
+                        $("#otpError").removeClass("text-[#0062FF] animate__shakeX").addClass("text-[#0A9800]").text("@Lang.millions_otp_sent_successfully").removeClass("hidden");
+                        $(".otp-digit").val("").first().focus();
+                    } else {
+                        if (data.responseCode === "-2" || (data.responseMessage && data.responseMessage.includes("System is upgrading"))) {
+                             closeOtpModal();
+                             showFailureModal(data.responseMessage || "System is upgrading", data.responseCode);
+                        } else {
+                             $("#otpError").removeClass("text-[#0A9800]").addClass("text-[#0062FF] animate__shakeX").text(data.responseMessage || "Failed to resend OTP").removeClass("hidden");
+                        }
+                    }
+                },
+                error: function() {
+                    $btn.prop('disabled', false).text(originalText);
+                    $("#otpError").text("Network error occurred.").removeClass("hidden");
+                }
+            });
+        }
+
+        $("#btnConfirmTransfer").on("click", function() {
+            if (isProcessing) return; // Prevent double-click
+
+            let otp = "";
+            $(".otp-digit").each(function() { otp += $(this).val(); });
+            
+            if(otp.length < 6) {
+                showFailureModal("Please enter 6-digit OTP");
+                return;
+            }
+
+            // Lock button + show loading
+            isProcessing = true;
+            const $btn = $(this);
+            const originalText = $btn.html();
+            $btn.prop('disabled', true).html('<i class="fa-solid fa-spinner fa-spin mr-2"></i> ...');
+            
+            // Call the unified backend action that verifies OTP and then transfers
+            $.ajax({
+                url: subDomain + "/Millions/Home/ConfirmTransfer",
+                type: "POST",
+                data: {
+                    otp: otp,
+                    phone: $("#receiverPhone").val(),
+                    amount: unformatMoneyV2($("#transferAmount").val()),
+                    channelPayment: selectedChannel
+                },
+                success: function(res) {
+                    $btn.prop('disabled', false).html(originalText);
+                    isProcessing = false;
+
+                    if(res.responseCode == "0" || res.responseCode == 0) {
+                        closeOtpModal();
+                        
+                        // Update balance in UI immediately
+                        if(res.userStatus && res.userStatus.bet_coin) {
+                           $("#currentBetCoin").text(formatMoneyV2(res.userStatus.bet_coin));
+                        }
+
+                        // Populate Success Modal Fields
+                        const transferAmt = $("#transferAmount").val();
+                        $("#successAmount").text(formatMoneyV2(transferAmt) + " HTG");
+                        $("#successSender").text("@(Model?.userStatus?.msisdn ?? "0")");
+                        $("#successReceiver").text($("#receiverPhone").val());
+                        
+                        const now = new Date();
+                        const pad = (n) => n.toString().padStart(2, '0');
+                        const formattedTime = `${pad(now.getDate())}/${pad(now.getMonth() + 1)}/${now.getFullYear()} - ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;
+                        $("#successTime").text(formattedTime);
+
+                        // Set dynamic transfer note based on channel
+                        const noteWallet = "@Html.Raw(Lang.millions_reward_transferred_to_wallet)";
+                        const noteMainAccount = "@Html.Raw(Lang.millions_reward_transferred_to_main_account)";
+                        if (selectedChannel === 1) {
+                            $("#successTransferNote").html(noteMainAccount);
+                        } else {
+                            $("#successTransferNote").html(noteWallet);
+                        }
+
+                        $("#successModal").removeClass("hidden").addClass("flex");
+                    } else {
+                        if (res.responseCode === "-2" || (res.message && res.message.includes("System is upgrading"))) {
+                             closeOtpModal();
+                             showFailureModal(res.message || "System is upgrading", res.responseCode);
+                        } else {
+                             $("#otpError").text(res.message || "Invalid OTP").removeClass("hidden");
+                             $(".otp-digit").val("");
+                             $(".otp-digit").first().focus();
+                        }
+                    }
+                },
+                error: function() {
+                    $btn.prop('disabled', false).html(originalText);
+                    isProcessing = false;
+                    showFailureModal("Network error while confirming transfer");
+                }
+            });
+        });
+
+        function showFailureModal(message, code) {
+            $("#failErrorMessage").html(message);
+            if (code === "-2" || (message && message.includes("System is upgrading"))) {
+                $("#failureModalStandardActions").addClass("is-hidden");
+                $("#failureModalUpgradeActions").removeClass("is-hidden");
+            } else {
+                $("#failureModalStandardActions").removeClass("is-hidden");
+                $("#failureModalUpgradeActions").addClass("is-hidden");
+            }
+            $("#failureModal").removeClass("hidden").addClass("flex");
+        }
+    </script>
+}
+
+

+ 116 - 0
website_natcash/Areas/Millions/Views/Home/_RewardHistoryList.cshtml

@@ -0,0 +1,116 @@
+@model LotteryWebApp.Models.RewardHistoryModel
+@using LotteryWebApp.Languages
+@using LotteryWebApp.Common
+
+@functions {
+    public string FormatMoney(string amount) {
+        if (string.IsNullOrEmpty(amount)) return "0";
+        var clean = new string(amount.Where(c => char.IsDigit(c)).ToArray());
+        if (long.TryParse(clean, out long val)) {
+            return val.ToString("#,##0", new System.Globalization.CultureInfo("vi-VN")).Replace(",", ".");
+        }
+        return amount;
+    }
+
+    public string FormatTime(string raw) {
+        if (string.IsNullOrEmpty(raw)) return "-";
+        string[] formats = { "M/d/yyyy h:mm:ss tt", "MM/dd/yyyy h:mm:ss tt", "dd/MM/yyyy HH:mm:ss", "yyyy-MM-dd HH:mm:ss" };
+        if (System.DateTime.TryParseExact(raw, formats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out var dt)
+            || System.DateTime.TryParse(raw, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out dt)) {
+            return dt.ToString("dd/MM/yyyy HH:mm", new System.Globalization.CultureInfo("en-US"));
+        }
+        return raw;
+    }
+
+    public (string cls, string label) MapStatus(string status) {
+        switch (status) {
+            case "1": return ("reward-status-success", "Success");
+            case "0": return ("reward-status-processing", "Processing");
+            case "2": return ("reward-status-pending", "Pending");
+            case "3": return ("reward-status-reverted", "Reverted");
+            default:  return ("reward-status-unknown", string.IsNullOrEmpty(status) ? "-" : status);
+        }
+    }
+
+    public string MapPayment(string channelPayment) {
+        if (channelPayment == "1") return "Wallet";
+        if (channelPayment == "0") return "Main Account";
+        return "-";
+    }
+}
+
+@if (Model != null && Model.list != null && Model.list.Count > 0)
+{
+    foreach (var t in Model.list)
+    {
+        var (statusCls, statusLabel) = MapStatus(t.status);
+        <div class="reward-card animate__animated animate__fadeInUp">
+            <div class="reward-card-top">
+                <div class="reward-card-header">
+                    <span class="reward-id">#@(t.seq ?? t.id ?? "-")</span>
+                    <span class="reward-status @statusCls">@statusLabel</span>
+                </div>
+                <div class="reward-amount-wrap">
+                    <span class="reward-amount">@FormatMoney(t.money)</span>
+                    <span class="reward-currency">HTG</span>
+                </div>
+            </div>
+
+            <div class="reward-card-perforation"></div>
+
+            <div class="reward-card-bottom">
+                <div class="reward-info-grid">
+                    <div class="reward-info-row">
+                        <span class="reward-info-label">From</span>
+                        <span class="reward-info-value">@(string.IsNullOrEmpty(t.acountSend) ? "-" : t.acountSend)</span>
+                    </div>
+                    <div class="reward-info-row">
+                        <span class="reward-info-label">To</span>
+                        <span class="reward-info-value">@(string.IsNullOrEmpty(t.acountRecieve) ? "-" : t.acountRecieve)</span>
+                    </div>
+                    <div class="reward-info-row">
+                        <span class="reward-info-label">Time</span>
+                        <span class="reward-info-value">@FormatTime(t.timeRequest)</span>
+                    </div>
+                    <div class="reward-info-row">
+                        <span class="reward-info-label">Method</span>
+                        <span class="reward-info-value">@MapPayment(t.channelPayment)</span>
+                    </div>
+                </div>
+            </div>
+        </div>
+    }
+
+    @if (!string.IsNullOrEmpty(Model.totalPage) && int.TryParse(Model.totalPage, out var total) && total > 1)
+    {
+        var seq = int.TryParse(Model.seqPage, out var s) ? s : 1;
+        <div class="reward-pagination">
+            <button onclick="changeRewardPage(currentSeqPage - 1)" class="reward-page-btn" id="prevPage" @(seq <= 1 ? "disabled" : "")>
+                <i class="fas fa-chevron-left mr-1"></i> Prev
+            </button>
+
+            <div class="reward-page-indicator">
+                <span class="reward-page-label">Page</span>
+                <span class="reward-page-value" id="pageDisplay">@Model.seqPage / @Model.totalPage</span>
+            </div>
+
+            <button onclick="changeRewardPage(currentSeqPage + 1)" class="reward-page-btn" id="nextPage" @(seq >= total ? "disabled" : "")>
+                Next <i class="fas fa-chevron-right ml-1"></i>
+            </button>
+        </div>
+        <script>
+            totalPages = parseInt('@Model.totalPage');
+        </script>
+    }
+    else
+    {
+        <div class="w-full pb-32"></div>
+    }
+}
+else
+{
+    <div class="reward-empty">
+        <i class="fa-solid fa-gift"></i>
+        <p>@Lang.no_results_found</p>
+    </div>
+}

+ 150 - 0
website_natcash/Areas/Millions/Views/Home/_TermResultHistoryGrouped.cshtml

@@ -0,0 +1,150 @@
+@using LotteryWebApp.Service
+@using LotteryWebApp.Languages
+@using System.Linq
+@model List<IGrouping<DateTime, Term>>
+
+@if (Model != null && Model.Count > 0)
+{
+    foreach (var group in Model)
+    {
+        var drawDate = group.Key;
+        var filteredGames = group.Where(x => !string.Equals(x.result, "NA", StringComparison.OrdinalIgnoreCase)).ToList();
+        
+        if (filteredGames.Count == 0) continue;
+        
+        <div class="result-card-premium animate__animated animate__fadeInUp mb-6 overflow-hidden bg-white rounded-2xl shadow-sm border border-gray-100">
+            <!-- Simplified Header -->
+            <div class="bg-gray-50/50 px-4 py-2.5 border-b border-gray-100 flex items-center justify-between">
+                <div class="flex items-center gap-2">
+                    <i class="fas fa-trophy text-[#0062FF] text-[12px]"></i>
+                    <span class="text-[11px] font-black text-gray-500 uppercase tracking-widest">@Lang.results</span>
+                </div>
+                <div class="flex items-center gap-1.5">
+                    <div class="w-1.5 h-1.5 rounded-full bg-green-500 animate-pulse"></div>
+                    <span class="text-[9px] font-bold text-gray-400 uppercase">Live Update</span>
+                </div>
+            </div>
+
+            <!-- Games Container -->
+            <div class="px-3 pt-2 pb-3 space-y-0.5">
+                <!-- Date/Time Info Row -->
+                <div class="flex items-center gap-3 mb-1.5 bg-gray-50/50 p-2 rounded-2xl border border-gray-100/80 shadow-xs">
+                    <div class="w-11 h-11 flex flex-col items-center justify-center bg-white rounded-xl shadow-xs border border-gray-100 shrink-0">
+                        <span class="text-[9px] font-bold text-gray-400 uppercase leading-none">@drawDate.ToString("MMM", new System.Globalization.CultureInfo("en-US"))</span>
+                        <span class="text-[18px] font-black text-[#0062FF] leading-none">@drawDate.ToString("dd")</span>
+                    </div>
+                    <div class="flex flex-col">
+                        <span class="text-[14px] font-black text-gray-800 leading-tight">@drawDate.ToString("dddd, MMM dd yyyy", new System.Globalization.CultureInfo("en-US"))</span>
+                        <div class="flex items-center gap-1.5 mt-0.5">
+                            <i class="far fa-calendar-alt text-[11px] text-[#0062FF]"></i>
+                            <span class="text-[11px] font-bold text-gray-400 uppercase tracking-tighter">@Lang.draw_date</span>
+                        </div>
+                    </div>
+                </div>
+
+                @{
+                    var games = filteredGames.OrderBy(x => x.gameId).ToList();
+                    for (int i = 0; i < games.Count; i++)
+                    {
+                        var item = games[i];
+                        var isBasic = item.gameId == "30";
+                        var isBigSmall = item.gameId == "31";
+                        var isOddEven = item.gameId == "32";
+                        
+                        var gameName = isBasic ? Lang.millions_classic_pick_10 : 
+                                       isBigSmall ? Lang.millions_big_small : 
+                                       isOddEven ? Lang.millions_odd_even : "Game";
+                        
+                        // Fallback labels if resource is missing
+                        if (string.IsNullOrEmpty(gameName)) {
+                            gameName = isBasic ? "Basic" : isBigSmall ? "Big/Small" : isOddEven ? "Odd/Even" : "Game";
+                        }
+                        
+                        var gameColor = isBasic ? "#0062FF" : isBigSmall ? "#26A31E" : isOddEven ? "#B529E9" : "#0062FF";
+                        var gameBg = isBasic ? "bg-[#0062FF]/5" : isBigSmall ? "bg-[#26A31E]/5" : isOddEven ? "bg-[#B529E9]/5" : "bg-gray-50";
+
+                        <div class="game-result-row px-1">
+                            <div class="flex items-center justify-between mb-0 px-1">
+                                <div class="flex items-center gap-2">
+                                    <div class="w-1.5 h-4 rounded-full" style="background-color: @gameColor"></div>
+                                    <span class="text-[14px] font-black uppercase tracking-widest" style="color: @gameColor">@gameName</span>
+                                </div>
+                                <div class="flex flex-col items-end">
+                                    <span class="text-[13px] font-bold text-gray-400 opacity-60">#@item.id</span>
+                                    @{
+                                        DateTime drawTime;
+                                        var timeStr = DateTime.TryParse(item.date_random, out drawTime) ? drawTime.ToString("HH:mm") : "--:--";
+                                    }
+                                    <span class="text-[11px] font-black text-[#0062FF]/60 uppercase tracking-tighter">@timeStr</span>
+                                </div>
+                            </div>
+
+                            <div class="flex items-center justify-center gap-2.5 flex-wrap">
+                                @if (!string.IsNullOrEmpty(item.result))
+                                {
+                                    var balls = item.result.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
+                                    var isNumberResult = isBasic || (!isBigSmall && !isOddEven);
+                                    for (int bi = 0; bi < balls.Length; bi++)
+                                    {
+                                        var cleanBall = balls[bi].Trim();
+                                        if (isNumberResult)
+                                        {
+                                            var isMegaBall = bi == balls.Length - 1;
+                                            <div class="millions-result-ball @(isMegaBall ? "millions-result-ball-mb" : "")">
+                                                <span>@cleanBall</span>
+                                                @if (isMegaBall)
+                                                {
+                                                    <span class="millions-result-mb-label">MB</span>
+                                                }
+                                            </div>
+                                        }
+                                        else
+                                        {
+                                            var ballText = cleanBall.ToUpper();
+                                            if (isBigSmall) {
+                                                if (ballText == "S") ballText = Lang.Small;
+                                                else if (ballText == "B") ballText = Lang.Big;
+                                            } else if (isOddEven) {
+                                                if (ballText == "O") ballText = Lang.Odd;
+                                                else if (ballText == "E") ballText = Lang.Even;
+                                            }
+
+                                            <div class="px-4 py-1.5 rounded-xl bg-white border border-gray-100 shadow-sm text-[13px] font-black transform hover:bg-gray-50 transition-colors uppercase tracking-tight" style="color: @gameColor">
+                                                @ballText
+                                            </div>
+                                        }
+                                    }
+                                }
+                                else
+                                {
+                                    <div class="py-2 px-4 rounded-lg border border-dashed" style="background-color: @(gameColor + "10"); border-color: @(gameColor + "30");">
+                                        <span class="italic text-[11px] font-bold" style="color: @gameColor">@Lang.waiting_for_result</span>
+                                    </div>
+                                }
+                            </div>
+                        </div>
+
+                        if (i < games.Count - 1)
+                        {
+                            <!-- Red Separator Line -->
+                            <div class="py-0">
+                                <div class="h-[1px] bg-gradient-to-r from-transparent via-[#0062FF]/20 to-transparent"></div>
+                            </div>
+                        }
+                    }
+                }
+            </div>
+        </div>
+    }
+}
+else
+{
+    <div class="w-full py-20 flex flex-col items-center justify-center text-gray-400 opacity-60">
+        <div class="w-20 h-20 bg-gray-50 rounded-full flex items-center justify-center mb-4">
+            <i class="fas fa-search text-3xl"></i>
+        </div>
+        <p class="font-black text-[14px] uppercase tracking-widest">@Lang.no_results_found</p>
+    </div>
+}
+
+

+ 62 - 0
website_natcash/Areas/Millions/Views/Home/_TermResultHistoryV2.cshtml

@@ -0,0 +1,62 @@
+@model LotteryWebApp.Models.TermResultHistoryModel
+@using LotteryWebApp.Languages
+@if (Model != null && Model.listTerm != null && Model.listTerm.Count > 0)
+{
+    foreach (var item in Model.listTerm)
+    {
+        if (string.Equals(item.result, "NA", StringComparison.OrdinalIgnoreCase)) continue;
+        
+        var gameColor = item.gameId == "30" ? "#0062FF" : item.gameId == "31" ? "#26A31E" : item.gameId == "32" ? "#B529E9" : "#0062FF";
+        var gameGradient = item.gameId == "30" ? "linear-gradient(135deg, #FF3D63 0%, #E3132D 60%, #BA0F21 100%)" : 
+                           item.gameId == "31" ? "linear-gradient(135deg, #4ADE80 0%, #26A31E 100%)" : 
+                           item.gameId == "32" ? "linear-gradient(135deg, #C084FC 0%, #B529E9 100%)" : 
+                           "linear-gradient(135deg, #FF3D63 0%, #BA0F21 100%)";
+        
+        <!-- Result Item Card -->
+        <div class="result-item-red animate__animated animate__fadeInUp relative overflow-hidden" style="border-color: @gameColor">
+            <!-- Game Label Badge -->
+            <div class="absolute top-2 right-4 px-2 py-0.5 rounded-full text-[9px] font-black text-white uppercase tracking-tighter z-10 shadow-sm" style="background-color: @gameColor">
+                 @(item.gameId == "30" ? "Basic" : item.gameId == "31" ? "Big/Small" : item.gameId == "32" ? "Odd/Even" : "Mega")
+            </div>
+
+            <div class="item-date-text font-bricolage">
+                @{
+                    DateTime drawDate;
+                    if (DateTime.TryParse(item.date_random, out drawDate)) {
+                        <div class="day">@drawDate.ToString("dddd,", new System.Globalization.CultureInfo("en-US"))</div>
+                        <div class="date">@drawDate.ToString("MMM dd, yyyy", new System.Globalization.CultureInfo("en-US"))</div>
+                    } else {
+                        <div class="day">Draw Date:</div>
+                        <div class="date">@item.date_random</div>
+                    }
+                }
+            </div>
+            <div class="balls-container">
+                @if (!string.IsNullOrEmpty(item.result))
+                {
+                    var balls = item.result.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
+                    foreach (var ball in balls)
+                    {
+                        var cleanBall = ball.Trim();
+                        if (!string.IsNullOrEmpty(cleanBall))
+                        {
+                            <div class="yellow-ball" style="background: @gameGradient">@cleanBall</div>
+                        }
+                    }
+                }
+                else
+                {
+                    <span class="text-gray-400 italic text-[12px]">@Lang.waiting_for_result</span>
+                }
+            </div>
+        </div>
+    }
+}
+else
+{
+    <div class="w-full py-20 flex flex-col items-center justify-center text-gray-400 opacity-60">
+        <i class="fas fa-search text-5xl mb-4"></i>
+        <p class="font-bold">@Lang.no_results_found</p>
+    </div>
+}
+

+ 150 - 0
website_natcash/Areas/Millions/Views/Home/_TermUserTicketHistory.cshtml

@@ -0,0 +1,150 @@
+@model LotteryWebApp.Models.UserTicketHistoryModel
+@using LotteryWebApp.Languages
+@using LotteryWebApp.Common
+
+@functions {
+    public string FormatMoney(string amount) {
+        if (string.IsNullOrEmpty(amount)) return "0";
+        var clean = new string(amount.Where(c => char.IsDigit(c)).ToArray());
+        if (long.TryParse(clean, out long val)) {
+            return val.ToString("#,##0", new System.Globalization.CultureInfo("vi-VN")).Replace(",", ".");
+        }
+        return amount;
+    }
+}
+
+@if (Model != null && Model.listTicket != null && Model.listTicket.Count > 0)
+{
+    foreach (var item in Model.listTicket)
+    {
+        <div class="ticket-card animate__animated animate__fadeInUp">
+            <div class="ticket-card-top">
+                <div class="ticket-header">
+                    <span class="ticket-id">#@item.seq</span>
+                </div>
+
+                <div class="ticket-numbers flex flex-wrap gap-2">
+                    @if (!string.IsNullOrEmpty(item.code))
+                    {
+                        var delimiters = new[] { ';', ',' };
+                        var balls = item.code.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
+
+                        // Millions result = 5 main numbers + 1 Mega Ball (the last one):
+                        //  - the 5 main numbers match in any order
+                        //  - the Mega Ball must match by position (the last ticket number)
+                        var resultBalls = !string.IsNullOrEmpty(item.termResult)
+                            ? item.termResult.Split(delimiters, StringSplitOptions.RemoveEmptyEntries)
+                            : new string[0];
+                        var mainWinning = new HashSet<string>();
+                        string mbWinning = null;
+                        if (resultBalls.Length > 0)
+                        {
+                            for (int i = 0; i < resultBalls.Length - 1; i++) mainWinning.Add(resultBalls[i].Trim());
+                            mbWinning = resultBalls[resultBalls.Length - 1].Trim();
+                        }
+                        var mbIndex = balls.Length - 1;
+
+                        for (int bi = 0; bi < balls.Length; bi++)
+                        {
+                            var ballValue = balls[bi].Trim();
+                            if (!string.IsNullOrEmpty(ballValue))
+                            {
+                                string ballClass;
+                                if (item.status == Constants.NOT_DRAW_CODE) {
+                                    ballClass = "ball-waiting";
+                                } else if (bi == mbIndex) {
+                                    // Mega Ball: position-based comparison
+                                    ballClass = ballValue == mbWinning ? "ball-win" : "ball-lose";
+                                } else if (mainWinning.Contains(ballValue)) {
+                                    ballClass = "ball-win";
+                                } else {
+                                    ballClass = "ball-lose";
+                                }
+
+                                var isMbBall = bi == mbIndex;
+                                <div class="ticket-ball @ballClass @(isMbBall ? "ticket-ball-mb" : "")">
+                                    <span class="ticket-ball-value">@ballValue</span>
+                                    @if (isMbBall)
+                                    {
+                                        <span class="ticket-mb-label">MB</span>
+                                    }
+                                </div>
+                            }
+                        }
+                    }
+                </div>
+            </div>
+
+            <div class="ticket-perforation"></div>
+
+            <div class="ticket-card-bottom">
+                <div class="ticket-info-grid">
+                    <div class="info-row">
+                        <span class="info-label">@Lang.millions_date_and_time</span>
+                        <span class="info-value">@item.createDate</span>
+                    </div>
+                    <div class="info-row">
+                        <span class="info-label">@Lang.millions_amount_won</span>
+                        <span class="info-value win-amount">@FormatMoney(item.moneyWin) HTG</span>
+                    </div>
+                    <div class="info-row">
+                        <span class="info-label">@Lang.millions_amount_played</span>
+                        <span class="info-value">@FormatMoney(item.money) HTG</span>
+                    </div>
+                </div>
+
+                <!-- Ticket Action: Detail Button -->
+                <div class="mt-3 pt-3 border-t border-gray-100 flex justify-between items-center">
+                    <div class="flex items-center gap-1.5 text-gray-400">
+                        <i class="fa-solid fa-circle-info text-[12px]"></i>
+                        <span class="text-[10px] font-bold uppercase tracking-tight">@Lang.millions_tap_to_see_detail</span>
+                    </div>
+                    <button onclick="showTicketDetail('@item.billCode', '@item.money', '@item.moneyWin', '@item.createDate', '@item.channel', '@item.channelPayment', '@item.paymentMessage', '@item.code', '@item.gameId', '@item.termRandomDate', '@item.id')"
+                            class="bg-[#00A3FF] text-white px-5 py-1.5 rounded-lg font-black text-[12px] shadow-[0_4px_10px_rgba(0,163,255,0.3)] active:scale-95 transition-all border-[1.5px] border-white uppercase tracking-wide">
+                        @Lang.millions_detail
+                    </button>
+                </div>
+            </div>
+        </div>
+    }
+
+    @if (Model.totalPage != null && int.Parse(Model.totalPage) > 1)
+    {
+        var seq = int.Parse(Model.seqPage);
+        var total = int.Parse(Model.totalPage);
+        <div class="flex justify-center items-center gap-4 py-8 pb-32">
+            <button onclick="changePage(currentSeqPage - 1)" 
+                    class="p-2 px-6 bg-white rounded-xl shadow-sm font-bold text-gray-500 active:scale-95 transition-transform disabled:opacity-30 disabled:pointer-events-none" 
+                    id="prevPage" @(seq <= 1 ? "disabled" : "")>
+                <i class="fas fa-chevron-left mr-1"></i> Prev
+            </button>
+            
+            <div class="flex flex-col items-center">
+                <span class="text-[10px] text-gray-400 font-bold uppercase tracking-widest">Page</span>
+                <span class="font-black text-[#0062FF] text-lg" id="pageDisplay">@Model.seqPage / @Model.totalPage</span>
+            </div>
+
+            <button onclick="changePage(currentSeqPage + 1)" 
+                    class="p-2 px-6 bg-white rounded-xl shadow-sm font-bold text-gray-500 active:scale-95 transition-transform disabled:opacity-30 disabled:pointer-events-none" 
+                    id="nextPage" @(seq >= total ? "disabled" : "")>
+                Next <i class="fas fa-chevron-right ml-1"></i>
+            </button>
+        </div>
+        <script>
+            totalPages = parseInt('@Model.totalPage');
+        </script>
+    }
+    else
+    {
+        <div class="w-full pb-32"></div>
+    }
+}
+else
+{
+    <div class="w-full py-24 flex flex-col items-center justify-center text-gray-400 opacity-60">
+        <i class="fas fa-receipt text-5xl mb-4"></i>
+        <p class="font-bold">@Lang.no_results_found</p>
+    </div>
+}
+
+

+ 46 - 0
website_natcash/Areas/Millions/Views/Shared/_BottomNavbar.cshtml

@@ -0,0 +1,46 @@
+@using LotteryWebApp.Languages
+@{
+    var activePage = ViewData["ActiveTab"] as string ?? "Home";
+}
+
+<!-- Bottom navigation (fixed at bottom) -->
+<nav class="navigation fixed left-1/2 -translate-x-1/2 bottom-0 z-[120] px-3 py-2 rounded-2xl w-[calc(100%-1.5rem)] max-w-[430px] bg-white/95 backdrop-blur-md shadow-lg border border-white/60"
+     style="position:fixed; left:50%; transform:translateX(-50%); bottom:0; padding-bottom: calc(0.5rem + env(safe-area-inset-bottom)); width:calc(100% - 1.5rem); max-width:430px; z-index:120; background: rgba(255,255,255,0.95); backdrop-filter: blur(12px); box-shadow: 0 10px 26px rgba(0,0,0,0.12);">
+    <div class="flex items-center justify-between">
+        <a href="/Millions/Home/GameHome" class="nav-item @(activePage == "Home" ? "active" : "") flex flex-col items-center flex-1 no-underline">
+            <img src="/Millions/assets/icons/nav-home.png" alt="" class="w-7 h-7"/>
+            <span class="text-xs mt-1 @(activePage == "Home" ? "text-[#0062ff] font-semibold" : "text-gray-700")">@Lang.home</span>
+            @if(activePage == "Home") {
+                <span class="w-5 h-1 bg-[#0062ff] rounded-full mt-1"></span>
+            }
+        </a>
+        <a href="/Millions/Home/Rule" class="nav-item @(activePage == "Rule" ? "active" : "") flex flex-col items-center flex-1 no-underline">
+            <img src="/Millions/assets/icons/nav-rule.png" alt="" class="w-7 h-7"/>
+            <span class="text-xs mt-1 @(activePage == "Rule" ? "text-[#0062ff] font-semibold" : "text-gray-700")">@Lang.rules</span>
+            @if(activePage == "Rule") {
+                <span class="w-5 h-1 bg-[#0062ff] rounded-full mt-1"></span>
+            }
+        </a>
+        <a href="/Millions/Home/History" class="nav-item @(activePage == "History" ? "active" : "") flex flex-col items-center flex-1 no-underline">
+            <img src="/Millions/assets/icons/nav-history.png" alt="" class="w-7 h-7"/>
+            <span class="text-xs mt-1 @(activePage == "History" ? "text-[#0062ff] font-semibold" : "text-gray-700")">@Lang.history</span>
+            @if(activePage == "History") {
+                <span class="w-5 h-1 bg-[#0062ff] rounded-full mt-1"></span>
+            }
+        </a>
+        <a href="/Millions/Home/FAQ" class="nav-item @(activePage == "FAQ" ? "active" : "") flex flex-col items-center flex-1 no-underline">
+            <img src="/Millions/assets/icons/nav-faq.png" alt="" class="w-7 h-7"/>
+            <span class="text-xs mt-1 @(activePage == "FAQ" ? "text-[#0062ff] font-semibold" : "text-gray-700")">@Lang.faq</span>
+            @if(activePage == "FAQ") {
+                <span class="w-5 h-1 bg-[#0062ff] rounded-full mt-1"></span>
+            }
+        </a>
+        <a href="/Millions/Home/More" class="nav-item @(activePage == "More" ? "active" : "") flex flex-col items-center flex-1 no-underline">
+            <img src="/Millions/assets/icons/nav-more.png" alt="" class="w-7 h-7"/>
+            <span class="text-xs mt-1 @(activePage == "More" ? "text-[#0062ff] font-semibold" : "text-gray-700")">@Lang.more</span>
+            @if(activePage == "More") {
+                <span class="w-5 h-1 bg-[#0062ff] rounded-full mt-1"></span>
+            }
+        </a>
+    </div>
+</nav>

+ 78 - 0
website_natcash/Areas/Millions/Views/Shared/_Layout.cshtml

@@ -0,0 +1,78 @@
+@inject Microsoft.Extensions.Configuration.IConfiguration configuration
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width" />
+    <title>@ViewData["Title"] - Millions</title>
+    
+    <!-- Original website bootstrap if needed, or link separate -->
+    <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css" />
+    
+    <!-- Isolated CSS just for Millions  -->
+    <link rel="stylesheet" href="/Millions/css/site.css" />
+    <link rel="stylesheet" href="/Millions/css/all.min.css" />
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css" />
+    <script src="https://cdn.tailwindcss.com"></script>
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
+    <link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:wght@400;700;800&display=swap" rel="stylesheet">
+    <style>
+        .font-bricolage { font-family: 'Bricolage Grotesque', sans-serif; }
+        .font-UTM_Futura_Extra { font-family: 'UTM Futura Extra', sans-serif; }
+    </style>
+    
+    @RenderSection("Styles", required: false)
+</head>
+<body class="millions-bg">
+    @Html.AntiForgeryToken()
+    <input type="hidden" id="subDomain" value="@(configuration["subDomain"] ?? "")" />
+    <script>
+        var subDomain = document.getElementById("subDomain").value || "";
+    </script>
+    <div id="loading-overlay" class="hidden">
+        <div class="loading-spinner"></div>
+    </div>
+
+    @RenderBody()
+
+    <!-- Original jquery or similar -->
+    <script src="/lib/jquery/jquery.min.js"></script>
+    <script src="/lib/bootstrap/js/bootstrap.bundle.min.js"></script>
+    
+    <!-- Isolated JS just for Millions -->
+    <script src="/Millions/js/site.js"></script>
+
+    <script>
+        // Global Loading Helpers
+        function showLoading() {
+            $('#loading-overlay').removeClass('hidden').addClass('flex');
+        }
+        function hideLoading() {
+            $('#loading-overlay').removeClass('flex').addClass('hidden');
+        }
+
+        // Auto-show for all AJAX calls
+        $(document).ajaxStart(function() {
+            showLoading();
+        }).ajaxStop(function() {
+            hideLoading();
+        });
+
+        function formatMoneyV2(amount) {
+            if (amount === undefined || amount === null || amount === "") return "0";
+            let str = amount.toString().replace(/[^0-9]/g, '');
+            if (str === "") return "0";
+            return str.replace(/\B(?=(\d{3})+(?!\d))/g, ".");
+        }
+
+        function unformatMoneyV2(amount) {
+            if (amount === undefined || amount === null || amount === "") return "0";
+            return amount.toString().replace(/[^0-9]/g, '');
+        }
+    </script>
+
+
+    @RenderSection("Scripts", required: false)
+</body>
+</html>
+

+ 4 - 0
website_natcash/Areas/Millions/Views/_ViewImports.cshtml

@@ -0,0 +1,4 @@
+@using LotteryWebApp
+@using LotteryWebApp.Models
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+

+ 4 - 0
website_natcash/Areas/Millions/Views/_ViewStart.cshtml

@@ -0,0 +1,4 @@
+@{
+    Layout = "~/Areas/Millions/Views/Shared/_Layout.cshtml";
+}
+

+ 150 - 0
website_natcash/Common/Constants.cs

@@ -0,0 +1,150 @@
+using System;
+
+namespace LotteryWebApp.Common
+{
+    public class Constants
+    {
+        public const String HOME_NAVIGATOR = "1";
+        public const String BUY_TICKET_NAVIGATOR = "2";
+        public const String HISTORY_NAVIGATOR = "3";
+        public const String CASH_AGENT_NAVIGATOR = "4";
+        public const String PROFILE_NAVIGATOR = "5";
+
+        public const String PATH_CONTENT = "pathContent";
+        public const String PATH_OUTSIDE = "pathOutside";
+        public const String SERVICE_NAME = "serviceName";
+        public const String SUB_DOMAIN = "subDomain";
+        public const String SUB_DOMAIN_ = "subDomain_";
+        public const String CHANNEL = "channel";
+
+
+        public const string TRANSFER_SHOW = "1";
+        public const string TRANSFER_CONFIRM = "2";
+        public const string TRANSFER_RESULT = "3";
+
+        public const string LOGIN_ENTER_MSISDN = "1";
+        public const string LOGIN_ENTER_OTP = "2";
+
+        public const string TRANSACTION_PROCESSING_CODE = "0";
+        public const string TRANSACTION_SUCCESS_CODE = "1";
+        public const string TRANSACTION_PENDING_CODE = "2";
+        public const string TRANSACTION_REVERTED_CODE = "3";
+
+
+        public const string PAYMENT_SHOW = "1";
+        public const string PAYMENT_CHECK_OTP = "2";
+        public const string PAYMENT_RESULT = "3";
+
+        public const int CHANGE_PASSWORD_SHOW = 1;
+        public const int CHANGE_PASSWORD_RESULT = 2;
+
+        public const int PROFILE_INFO_SHOW = 1;
+        public const int PROFILE_INFO_RESULT = 2;
+
+        public const int FORGOT_PASSWORD_SHOW = 1;
+        public const int FORGOT_PASSWORD_RESULT = 2;
+        public const int FORGOT_PASSWORD_REDIRECT = 3;
+
+        // 2 first row
+        public const string NEW_YORK_NUMBERS_CODE = "41";
+        public const string NEW_YORK_WIN4_CODE = "42";
+
+        public const string FLORIDA_PICK3_CODE = "71";
+        public const string FLORIDA_PICK4_CODE = "72";
+
+        public const string GEORGIA_CASH3_CODE = "121";
+        public const string GEORGIA_CASH4_CODE = "122";
+
+        public const string TEXAS_PICK3_CODE = "151";
+        public const string TEXAS_DAILY4_CODE = "152";
+
+        public const string TENNESSEE_CASH3_CODE = "181";
+        public const string TENNESSEE_CASH4_CODE = "182";
+
+
+        public const string BOULCHANS_CODE = "3";
+        public const string NEW_YORK_BOLET_CODE = "4";
+        public const string NEW_YORK_MAYRAJ_CODE = "5";
+        public const string NEW_YORK_LOTTO3_CODE = "6";
+        public const string FLORIDA_BOLET_CODE = "7";
+        public const string FLORIDA_MAYRAJ_CODE = "8";
+        public const string FLORIDA_LOTTO3_CODE = "9";
+
+
+        
+
+        public const string GEORGIA_BOLET_CODE = "12";
+        public const string GEORGIA_MAYRAJ_CODE = "13";
+        public const string GEORGIA_LOTTO3_CODE = "14";
+        public const string TEXAS_BOLET_CODE = "15";
+        public const string TEXAS_MAYRAJ_CODE = "16";
+        public const string TEXAS_LOTTO3_CODE = "17";
+        public const string TENNESSEE_BOLET_CODE = "18";
+        public const string TENNESSEE_MAYRAJ_CODE = "19";
+        public const string TENNESSEE_LOTTO3_CODE = "20";
+
+        public const string MEGA_LOTO_Pick10 = "87";
+        public const string MEGA_LOTO_Millions = "88";
+        public const string MEGA_LOTO_Bet = "89";
+
+
+        public const string MEGA_LOTO = "87";
+        public const string PIC10_BASIC_CODE = "30";
+        public const string PIC10_BIGSMALL_CODE = "31";
+        public const string PIC10_ODDEVEN_CODE = "32";
+        public const string Millions_CODE = "33";
+
+
+        public const string TERM_HAS_RESULT_TYPE = "1";
+        public const string TERM_HAS_NOT_RESULT_TYPE = "0";
+
+        public const string DECS = "desc";
+        public const string ASC = "asc";
+
+        public const string ROW_ON_PAGE = "10";
+        public const string ALL_DATA = "-1";
+
+        public const string BASIC_WALLET_TICKET = "0";
+        public const string NATCASH_WALLET_TICKET = "1";
+        public const string WALLET_PAYMENT_CHANNEL = "WALLET";
+
+        public const string BASIC_WALLET_TRANSFER = "1";
+        public const string NATCASH_WALLET_TRANSFER = "2";
+
+        public const string MORNING_CODE = "0";
+        public const string EVENING_CODE = "1";
+        public const string MIDDAY_CODE = "2";
+        public const string NIGHT_CODE = "3";
+
+        public const string BOLET_CODE = "1";
+        public const string MAYRAJ_CODE = "2";
+        public const string LOTTO3_CODE = "10";
+
+        public const string NOT_DRAW_CODE = "0";
+        public const string WIN_CODE = "2";
+        public const string DRAWN_CODE = "1";
+
+        public const String PATH = "/img/";
+        //public const String URL_GET_MSISDN = "http://apisuperapp.natcom.com.ht/privateapi/decrypt/v1/users";
+        public const String URL_GET_MSISDN = "http://10.228.102.57:8288/privateapi/decrypt/v1/users";
+
+        public const string WEB_CHANNEL = "WEB";
+
+    }
+
+    public class Code
+    {
+        public const String SUCCESS = "0";
+        public const String FAILURE = "-1";
+        public const String ERROR = "-2";
+        public const String EXCEPTION = "-3";
+        public const String OTP_SUCCESS = "100";
+        public const String SESSION_EXPIRED = "35";
+
+        public const String WRONG_USER_PASS = "1";
+        public const String NOT_AUTHEN = "-4";
+
+        public const int SUCCESS_CODE = 200;
+
+    }
+}

+ 81 - 0
website_natcash/Common/DailyRollingFileAppender.cs

@@ -0,0 +1,81 @@
+using System;
+using System.IO;
+using System.Linq;
+using log4net.Appender;
+using log4net.Util;
+
+namespace LotteryWebApp.Common
+{
+    /// <summary>
+    /// RollingFileAppender ghi log mỗi ngày 1 file (rolling theo ngày) và chỉ giữ lại
+    /// N file log gần nhất — các file cũ hơn sẽ tự động bị xóa để tránh đầy ổ cứng.
+    /// Toàn bộ cấu hình nằm trong log4net.config, không cần task bên ngoài.
+    /// </summary>
+    public class DailyRollingFileAppender : RollingFileAppender
+    {
+        /// <summary>
+        /// Số file log tối đa được giữ lại. Cấu hình qua &lt;maxNumberOfFiles value="30" /&gt;
+        /// trong log4net.config. Mặc định 30. Đặt &lt;= 0 để tắt việc tự xóa.
+        /// </summary>
+        public int MaxNumberOfFiles { get; set; } = 30;
+
+        // Chỉ dọn log 1 lần mỗi ngày để không ảnh hưởng hiệu năng ghi log.
+        private DateTime _lastCleanupDate = DateTime.MinValue;
+        private readonly object _cleanupLock = new object();
+
+        protected override void AdjustFileBeforeAppend()
+        {
+            // Để log4net xử lý việc cuộn file theo ngày trước.
+            base.AdjustFileBeforeAppend();
+
+            if (_lastCleanupDate == DateTime.Today)
+                return;
+
+            lock (_cleanupLock)
+            {
+                if (_lastCleanupDate == DateTime.Today)
+                    return;
+                _lastCleanupDate = DateTime.Today;
+            }
+
+            CleanupOldFiles();
+        }
+
+        /// <summary>Giữ lại MaxNumberOfFiles file .log mới nhất, xóa phần còn lại.</summary>
+        private void CleanupOldFiles()
+        {
+            try
+            {
+                if (MaxNumberOfFiles <= 0)
+                    return;
+
+                string dir = Path.GetDirectoryName(File);
+                if (string.IsNullOrEmpty(dir) || !Directory.Exists(dir))
+                    return;
+
+                var oldFiles = new DirectoryInfo(dir)
+                    .GetFiles("*.log")
+                    .OrderByDescending(f => f.LastWriteTimeUtc)
+                    .Skip(MaxNumberOfFiles)
+                    .ToList();
+
+                foreach (FileInfo file in oldFiles)
+                {
+                    try
+                    {
+                        file.Delete();
+                        LogLog.Debug(GetType(), "Da xoa file log cu: " + file.Name);
+                    }
+                    catch (Exception ex)
+                    {
+                        LogLog.Warn(GetType(), "Khong xoa duoc file log: " + file.FullName, ex);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                LogLog.Error(GetType(), "Loi khi don dep file log cu", ex);
+            }
+        }
+    }
+}

+ 31 - 0
website_natcash/Common/Utils.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Globalization;
+using System.Linq;
+
+namespace LotteryWebApp.Common
+{
+    public static class Utils
+    {
+        public static string FormatMoney(string amount)
+        {
+            if (string.IsNullOrEmpty(amount)) return "0";
+            var clean = new string(amount.Where(c => char.IsDigit(c)).ToArray());
+            if (long.TryParse(clean, out long val))
+            {
+                return val.ToString("#,##0", new CultureInfo("vi-VN")).Replace(",", ".");
+            }
+            return amount;
+        }
+
+        public static string FormatResultDate(string dateStr)
+        {
+            if (string.IsNullOrEmpty(dateStr)) return "Monday, Mar 20, 2026";
+            DateTime dt;
+            if (DateTime.TryParseExact(dateStr, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
+            {
+                return dt.ToString("dddd, MMM dd, yyyy", new CultureInfo("en-US"));
+            }
+            return dateStr;
+        }
+    }
+}

+ 41 - 0
website_natcash/Components/AdvertiseArea.cs

@@ -0,0 +1,41 @@
+using LotteryWebApp.Controllers;
+using LotteryWebApp.Service;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LotteryWebApp.Components
+{
+
+    public class AdvertiseAreaModel
+    {
+        public List<Term> listTerm { get; set; }
+        public long timeLeft { get; set; }
+        public String timeExpired { get; set; }
+        public String timeNow { get; set; }
+    }
+
+    public class AdvertiseArea : ViewComponent
+    {
+        APIFunctions api = new APIFunctions();
+
+        public async Task<IViewComponentResult> InvokeAsync(List<Term> listTerm)
+        {
+            AdvertiseAreaModel model = new AdvertiseAreaModel();
+
+            model.listTerm = listTerm;
+
+            if (model.listTerm != null && model.listTerm.Count > 0)
+            {
+                model.timeLeft = BaseController.getCountTimeToTimestamp(model.listTerm[0].date_random);
+                model.timeExpired = DateTime.ParseExact(model.listTerm[0].date_random, BaseController.formats, new CultureInfo("en-US"), DateTimeStyles.None).ToString("MM/dd/yyy HH:mm:ss");
+                model.timeNow = DateTime.Now.ToString("MM/dd/yyy HH:mm:ss");
+            }
+
+            return View("AdvertiseArea", model);
+        }
+    }
+}

+ 27 - 0
website_natcash/Components/ChooseForm.cs

@@ -0,0 +1,27 @@
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LotteryWebApp.Components
+{
+
+    public class ChooseFormModel
+    {
+        public long tics { get; set; }
+        public string ticketType { get; set; }
+    }
+
+    public class ChooseForm : ViewComponent
+    {
+        public async Task<IViewComponentResult> InvokeAsync(String ticketType)
+        {
+            ChooseFormModel model = new ChooseFormModel();
+            long milliseconds = DateTime.Now.Ticks;
+            model.tics = milliseconds;
+            model.ticketType = ticketType; 
+            return View("ChooseForm", model);
+        }
+    }
+}

+ 20 - 0
website_natcash/Components/FooterOutside.cs

@@ -0,0 +1,20 @@
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+namespace LotteryWebApp.Components
+{
+    public class FooterOutsideModel
+    {
+    }
+
+    public class FooterOutside : ViewComponent
+    {
+        public async Task<IViewComponentResult> InvokeAsync(String url)
+        {
+            FooterOutsideModel model = new FooterOutsideModel();
+            return View("FooterOutside", model);
+        }
+    }
+}

+ 26 - 0
website_natcash/Components/HeaderHome.cs

@@ -0,0 +1,26 @@
+using LotteryWebApp.Service;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LotteryWebApp.Components
+{
+    public class HeaderHomeModel
+    {
+        public Profile profile;
+        public UserStatus userStatus;
+    }
+    public class HeaderHome : ViewComponent
+    {
+        public async Task<IViewComponentResult> InvokeAsync(Profile profile, UserStatus userStatus)
+        {
+            HeaderHomeModel model = new HeaderHomeModel();
+
+            model.profile = profile;
+            model.userStatus = userStatus;
+            return View("HeaderHome", model);
+        }
+    }
+}

+ 25 - 0
website_natcash/Components/LotoNumber.cs

@@ -0,0 +1,25 @@
+using LotteryWebApp.Service;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LotteryWebApp.Components
+{
+    public class LotoNumberModel
+    {
+        public Term data;
+        public string type;
+    }
+    public class LotoNumber : ViewComponent
+    {
+        public async Task<IViewComponentResult> InvokeAsync(Term data, string type)
+        {
+            LotoNumberModel model = new LotoNumberModel();
+            model.data = data;
+            model.type = type;
+            return View("LotoNumber", model);
+        }
+    }
+}

+ 29 - 0
website_natcash/Components/LotoNumberHistory.cs

@@ -0,0 +1,29 @@
+using LotteryWebApp.Service;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LotteryWebApp.Components
+{
+    public class LotoNumberHistoryModel
+    {
+        public string[] data;
+        public string type;
+        public Term term;
+
+    }
+
+    public class LotoNumberHistory : ViewComponent
+    {
+        public async Task<IViewComponentResult> InvokeAsync(string[] data, Term term, string type)
+        {
+            LotoNumberHistoryModel model = new LotoNumberHistoryModel();
+            model.data = data == null ? new string[] { } : data;
+            model.type = type;
+            model.term = term;
+            return View("LotoNumberHistory", model);
+        }
+    }
+}

+ 24 - 0
website_natcash/Components/PaymentForm.cs

@@ -0,0 +1,24 @@
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LotteryWebApp.Components
+{
+    public class PaymentFormModel
+    {
+        public String data { get; set; }
+        public string ticketType { get; set; }
+    }
+    public class PaymentForm : ViewComponent
+    {
+        public async Task<IViewComponentResult> InvokeAsync(String data, String ticketType)
+        {
+            PaymentFormModel model = new PaymentFormModel();
+            model.data = data;
+            model.ticketType = ticketType;
+            return View("PaymentForm", model);
+        }
+    }
+}

+ 24 - 0
website_natcash/Components/ResultForm.cs

@@ -0,0 +1,24 @@
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LotteryWebApp.Components
+{
+    public class ResultFormModel
+    {
+        public String url;
+        public String title;
+    }
+    public class ResultForm : ViewComponent
+    {
+        public async Task<IViewComponentResult> InvokeAsync(String url, String title)
+        {
+            ResultFormModel model = new ResultFormModel();
+            model.url = url;
+            model.title = title;
+            return View("ResultForm", model);
+        }
+    }
+}

+ 24 - 0
website_natcash/Components/SmallHeader.cs

@@ -0,0 +1,24 @@
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LotteryWebApp.Components
+{
+    public class SmallHeaderModel
+    {
+        public String url;
+        public String title;
+    }
+    public class SmallHeader : ViewComponent
+    {
+        public async Task<IViewComponentResult> InvokeAsync(String url, String title)
+        {
+            SmallHeaderModel model = new SmallHeaderModel();
+            model.url = url;
+            model.title = title;
+            return View("SmallHeader", model);
+        }
+    }
+}

+ 29 - 0
website_natcash/Components/TicketForm.cs

@@ -0,0 +1,29 @@
+using LotteryWebApp.Service;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LotteryWebApp.Components
+{
+
+    public class TicketFormModel
+    {
+        public List<Term> data { get; set; }
+        public string type { get; set; }
+
+    }
+
+    public class TicketForm : ViewComponent
+    {
+        public async Task<IViewComponentResult> InvokeAsync(List<Term> data, string type)
+        {
+            TicketFormModel model = new TicketFormModel();
+            model.data = data != null ? data : new List<Term>();
+            model.type = type;
+
+            return View("TicketForm", model);
+        }
+    }
+}

+ 27 - 0
website_natcash/Components/TicketHistory.cs

@@ -0,0 +1,27 @@
+using LotteryWebApp.Service;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LotteryWebApp.Components
+{
+
+    public class TicketHistoryModel
+    {
+        public Ticket data { get; set; }
+        public string winType { get; set; }
+    }
+
+    public class TicketHistory : ViewComponent
+    {
+        public async Task<IViewComponentResult> InvokeAsync(Ticket data, string winType)
+        {
+            TicketHistoryModel model = new TicketHistoryModel();
+            model.data = data;
+            model.winType = winType;
+            return View("TicketHistory", model);
+        }
+    }
+}

+ 373 - 0
website_natcash/Controllers/AccountController.cs

@@ -0,0 +1,373 @@
+using LotteryWebApp.Common;
+using LotteryWebApp.Models;
+using LotteryWebApp.Service;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using System;
+using LotteryWebApp.Languages;
+using LotteryWebApp.Extensions;
+using System.Globalization;
+using Microsoft.AspNetCore.Http;
+using System.IO;
+
+namespace LotteryWebApp.Controllers
+{
+    [AutoValidateAntiforgeryToken]
+    public class AccountController : BaseController
+    {
+        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
+
+        IConfiguration configuration;
+        private readonly IWebHostEnvironment webHostEnvironment;
+        APIFunctions api = new APIFunctions();
+
+        public AccountController(IConfiguration _configuration, IWebHostEnvironment hostEnvironment)
+        {
+            configuration = _configuration;
+            webHostEnvironment = hostEnvironment;
+        }
+
+        public String GetParameter(String key)
+        {
+            return configuration.GetSection(key).Value;
+        }
+
+        public IActionResult Index()
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            AccountIndex_ViewModel model = new AccountIndex_ViewModel();
+            return View("Index", model);
+        }
+
+        public IActionResult Login(String code, String step, String phonenumber, String message)
+        {
+            //return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Home/Update");
+
+            AccountLogin_ViewModel model = new AccountLogin_ViewModel();
+
+            try
+            {
+                model.code = code;
+                model.step = step != null ? step : Constants.LOGIN_ENTER_MSISDN;
+                model.message = message;
+                model.phonenumber = phonenumber;
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+
+            return View("Login", model);
+        }
+
+        public IActionResult Logout()
+        {
+            ClearCache();
+            return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+        }
+
+        [ValidateAntiForgeryToken]
+        public JsonResult CheckMsisdn_Action(String phonenumber)
+        {
+            // check Msisdn
+            String msisdn = validateMsisdn(phonenumber);
+            if (msisdn == "")
+            {
+                return Json(new
+                {
+                    code = Code.FAILURE,
+                    message = Lang.phone_invalid
+                });
+            }
+            //msisdn = "50940236545";
+            HttpContext.Session.SetComplexData("msisdn", msisdn);
+            return Json(new
+            {
+                code = Code.SUCCESS,
+            });
+        }
+
+        [ValidateAntiForgeryToken]
+        public JsonResult ForgotPassword_Action(string phonenumber)
+        {
+            try
+            {
+                // resent password to return result
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+
+                if (msisdn == null && !string.IsNullOrEmpty(phonenumber))
+                {
+                    msisdn = validateMsisdn(phonenumber);
+                }
+
+                if (msisdn == null || msisdn == "")
+                {
+                    return Json(new
+                    {
+                        code = Code.FAILURE,
+                        message = Lang.phone_invalid
+                    });
+                }
+                // bo cho test
+                RegisterRequest request = new RegisterRequest();
+                request.Msisdn = msisdn;
+                RegisterResponse reset = api.UserForgotPasswordApi(configuration, request);
+                return Json(new
+                {
+                    code = int.Parse(reset.status),
+                    message = GetLangFromCode(reset.status)
+                });
+                //return Json(new
+                //{
+                //    code = Code.SUCCESS,
+                //});
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return Json(new
+            {
+                code = Code.FAILURE,
+                message = Lang.error_happened
+            });
+        }
+
+        [ValidateAntiForgeryToken]
+        public JsonResult Login_Action(String step, String phonenumber, String password)
+        {
+            try
+            {
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                if (msisdn != null)
+                {
+                    //password = "589219";
+
+                    RegisterRequest request = new RegisterRequest();
+                    request.Msisdn = msisdn;
+                    request.pass = password;
+                    RegisterResponse login = api.UserLoginApi(configuration, request);
+                    if (login.status == Code.SUCCESS.ToString())
+                    {
+                        // create session
+                        // create new auth
+                        CreateAuthToken();
+
+                        // login success --> store session
+                        HttpContext.Session.SetComplexData("msisdn", msisdn);
+                        HttpContext.Session.SetComplexData("token", login.token);
+
+                        // load profile
+
+                        // load user status
+                        UserGetProfileRequest userGetProfileRequest = new UserGetProfileRequest
+                        {
+                            users = msisdn,
+                            token = login.token
+                        };
+                        Profile profile = api.UserLoadProfileApi(configuration, userGetProfileRequest);
+                        HttpContext.Session.SetComplexData("profile", profile);
+
+                        // load profile
+                        UserStatusRequest userStatusRequest = new UserStatusRequest
+                        {
+                            users = msisdn,
+                            token = login.token
+                        };
+                        UserStatus userStatus = api.GetUserStatusApi(configuration, userStatusRequest);
+                        HttpContext.Session.SetComplexData("userStatus", userStatus);
+                    }
+                    return Json(new
+                    {
+                        code = int.Parse(login.status),
+                        message = GetLangFromCode(login.status)
+                    });
+                }
+                else
+                {
+                    return Json(new
+                    {
+                        code = Code.FAILURE,
+                        message = Lang.error_happened
+                    });
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return Json(new
+            {
+                code = Code.FAILURE,
+                message = Lang.error_happened
+            });
+        }
+
+        public IActionResult Register(string code)
+        {
+            AccountRegister_ViewModel model = new AccountRegister_ViewModel();
+            model.code = code;
+            return View("Register", model);
+        }
+
+
+        [ValidateAntiForgeryToken]
+        public JsonResult Register_Action(string phonenumber, string fullname, string birthday)
+        {
+            try
+            {
+                // resent password to return result
+                String msisdn = validateMsisdn(phonenumber);
+                if (msisdn == "")
+                {
+                    return Json(new
+                    {
+                        code = Code.FAILURE,
+                        message = Lang.phone_invalid
+                    });
+                }
+
+                if (fullname == null)
+                {
+                    return Json(new
+                    {
+                        code = Code.FAILURE,
+                        message = Lang.fullname_not_valid
+                    });
+                }
+
+                RegisterRequest request = new RegisterRequest();
+                request.Msisdn = msisdn;
+                RegisterResponse register = api.UserRegisterApi(configuration, request);
+                if (register.status == Code.SUCCESS)
+                {
+                    // convert birthday to dd/mm/yyyy
+                    String birthdayFormat = DateTime.ParseExact(birthday, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy");
+                    Profile profile = new Profile();
+                    profile.birthday = birthdayFormat;
+                    profile.fullName = fullname;
+                    HttpContext.Session.SetComplexData("profile", profile);
+                    HttpContext.Session.SetComplexData("token", register.token);
+
+                    // create profile
+                    UserUpdateProfileRequest userUpdateProfileRequest = new UserUpdateProfileRequest();
+                    userUpdateProfileRequest.users = msisdn;
+                    userUpdateProfileRequest.fullName = fullname;
+                    userUpdateProfileRequest.birthday = birthdayFormat;
+                    userUpdateProfileRequest.token = register.token;
+
+                    UserUpdateProfileResponse updateProfile = api.UserUpdateProfileApi(configuration, userUpdateProfileRequest);
+                    if (updateProfile.status == Code.SUCCESS)
+                    {
+                        // return login screen
+
+                    }
+                }
+                return Json(new
+                {
+                    code = int.Parse(register.status),
+                    message = GetLangFromCode(register.status)
+                });
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return Json(new
+            {
+                code = Code.FAILURE,
+                message = Lang.error_happened
+            });
+        }
+
+        public IActionResult ChooseApp()
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            return View();
+        }
+
+        public IActionResult ForgotPassword(String code)
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            AccountForgotPassword_ViewModel model = new AccountForgotPassword_ViewModel();
+            model.code = code;
+            return View("ForgotPassword", model);
+        }
+
+        [ValidateAntiForgeryToken]
+        [Produces("application/json")]
+        [Consumes("multipart/form-data")]
+        public JsonResult UploadAvatar([FromForm] IFormFile user_avatar)
+        {
+            try
+            {
+                // check user
+                if (!CheckAuthToken())
+                {
+                    log.Info("Must login");
+                    return Json(new
+                    {
+                        code = Code.NOT_AUTHEN,
+                        message = Lang.must_login
+                    });
+                }
+
+                //var user_avatar = HttpContext.Request.Form.Files;
+                if (user_avatar != null)
+                {
+                    String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                    Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+
+                    IFormFile image = user_avatar;
+
+                    string uploadsFolder = Path.Combine(webHostEnvironment.WebRootPath, "img/" + profile.users);
+                    Directory.CreateDirectory(uploadsFolder);
+
+                    string uniqueFileName = Guid.NewGuid().ToString() + "_" + image.FileName;
+                    string filePath = Path.Combine(uploadsFolder, uniqueFileName);
+                    using (var fileStream = new FileStream(filePath, FileMode.Create))
+                    {
+                        image.CopyTo(fileStream);
+                    }
+
+                    profile.realPicture = uniqueFileName;
+                    profile.picture = Constants.PATH + profile.users + "/" + uniqueFileName;
+                    HttpContext.Session.SetComplexData("profile", profile);
+
+                    return Json(new
+                    {
+                        code = Code.SUCCESS,
+                    });
+                }
+                else
+                {
+                    log.Error("user avatar error");
+                    return Json(new
+                    {
+                        code = Code.ERROR,
+                        message = Lang.user_avatar_error
+                    });
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error("Exception ", ex);
+            }
+            return Json(new
+            {
+                code = Code.FAILURE,
+                message = Lang.error_happened
+            });
+        }
+    }
+}

+ 635 - 0
website_natcash/Controllers/BaseController.cs

@@ -0,0 +1,635 @@
+using System;
+using System.Globalization;
+using System.IO;
+using System.Net.Http;
+using System.Security.Cryptography;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml;
+using log4net;
+using LotteryWebApp.Common;
+using LotteryWebApp.Languages;
+using LotteryWebApp.Service;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using NcGamesWebView.Extensions;
+
+namespace LotteryWebApp.Controllers
+{
+    public class BaseController : Controller
+    {
+        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
+
+        public static string[] formats =
+        {
+            "M/d/yyyy h:mm:ss tt",
+            "M/d/yyyy h:mm tt",
+            "MM/dd/yyyy hh:mm:ss",
+            "M/d/yyyy h:mm:ss",
+            "M/d/yyyy hh:mm tt",
+            "M/d/yyyy hh tt",
+            "M/d/yyyy h:mm",
+            "M/d/yyyy h:mm",
+            "MM/dd/yyyy hh:mm",
+            "M/dd/yyyy hh:mm",
+            "MM/d/yyyy HH:mm:ss.ffffff, dd/MM/yyyy hh:mm",
+            "M/dd/yyyy h:mm:ss tt",
+            "dd/MM/yyyy HH:mm:ss"
+        };
+
+        public static string RandomString(int size, bool lowerCase)
+        {
+            StringBuilder builder = new StringBuilder();
+            Random random = new Random();
+            char ch;
+            for (int i = 0; i < size; i++)
+            {
+                ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
+                builder.Append(ch);
+            }
+            if (lowerCase)
+                return builder.ToString().ToLower();
+            return builder.ToString();
+        }
+
+        // validate phone number
+        public static String validateMsisdn(String input)
+        {
+            String CountryCode = "509";
+
+            if (input == null || input.Length == 0 || !long.TryParse(input, out long temp))
+            {
+                return "";
+            }
+            else if (
+                (
+                    input.StartsWith("32")
+                    || input.StartsWith("33")
+                    || input.StartsWith("35")
+                    || input.StartsWith("40")
+                    || input.StartsWith("41")
+                    || input.StartsWith("42")
+                    || input.StartsWith("55")
+                    || input.StartsWith("43")
+                    || input.StartsWith("44")
+                    || input.StartsWith("45")
+                    || input.StartsWith("56")
+                    || input.StartsWith("58")
+                )
+                && input.Length == 8
+            )
+            {
+                // 066200017 55797979
+                input = CountryCode + input;
+                return input.Trim();
+            }
+            else if (input.StartsWith(CountryCode) && input.Length == 11)
+            {
+                String removeCountry = input.Substring(3);
+                if (
+                    removeCountry.StartsWith("32")
+                    || removeCountry.StartsWith("33")
+                    || removeCountry.StartsWith("35")
+                    || removeCountry.StartsWith("40")
+                    || removeCountry.StartsWith("41")
+                    || removeCountry.StartsWith("55")
+                    || removeCountry.StartsWith("42")
+                    || removeCountry.StartsWith("43")
+                    || removeCountry.StartsWith("44")
+                    || removeCountry.StartsWith("45")
+                    || removeCountry.StartsWith("56")
+                    || removeCountry.StartsWith("58")
+                )
+                {
+                    removeCountry = CountryCode + removeCountry;
+                    return input.Trim();
+                }
+                else
+                {
+                    return "";
+                }
+            }
+            else
+                return "";
+        }
+
+        public string ConvertToGameID(string termType, string ticketType)
+        {
+            if (termType == Constants.BOULCHANS_CODE)
+            {
+                return Constants.BOULCHANS_CODE;
+            }
+            else if (
+                termType == Constants.NEW_YORK_BOLET_CODE
+                || termType == Constants.NEW_YORK_MAYRAJ_CODE
+                || termType == Constants.NEW_YORK_LOTTO3_CODE
+            )
+            {
+                switch (ticketType)
+                {
+                    case Constants.BOLET_CODE:
+                        return Constants.NEW_YORK_BOLET_CODE;
+                    case Constants.MAYRAJ_CODE:
+                        return Constants.NEW_YORK_MAYRAJ_CODE;
+                    default:
+                        return Constants.NEW_YORK_LOTTO3_CODE;
+                }
+            }
+            else
+            {
+                switch (ticketType)
+                {
+                    case Constants.BOLET_CODE:
+                        return Constants.FLORIDA_BOLET_CODE;
+                    case Constants.MAYRAJ_CODE:
+                        return Constants.FLORIDA_MAYRAJ_CODE;
+                    default:
+                        return Constants.FLORIDA_LOTTO3_CODE;
+                }
+            }
+        }
+
+        public string ConvertToListGameID(String gameIDCode)
+        {
+            switch (gameIDCode)
+            {
+                case Constants.NEW_YORK_BOLET_CODE:
+                    return Constants.NEW_YORK_BOLET_CODE + "," + Constants.FLORIDA_BOLET_CODE;
+                case Constants.NEW_YORK_MAYRAJ_CODE:
+                    return Constants.NEW_YORK_MAYRAJ_CODE + "," + Constants.FLORIDA_MAYRAJ_CODE;
+                case Constants.BOULCHANS_CODE:
+                    return Constants.BOULCHANS_CODE;
+                default:
+                    return Constants.NEW_YORK_LOTTO3_CODE + "," + Constants.FLORIDA_LOTTO3_CODE;
+            }
+        }
+
+        public static string ConvertToWinType(String winType)
+        {
+            switch (winType)
+            {
+                case Constants.NOT_DRAW_CODE:
+                    return Lang.not_draw;
+                case Constants.WIN_CODE:
+                    return Lang.win;
+                default:
+                    return Lang.drawn;
+            }
+        }
+
+        public static string ConvertGameIdToTerm(string gameId)
+        {
+            switch (gameId)
+            {
+                case Constants.NEW_YORK_BOLET_CODE:
+                    return Lang.new_york_lottery;
+                case Constants.NEW_YORK_MAYRAJ_CODE:
+                    return Lang.new_york_lottery;
+                case Constants.NEW_YORK_LOTTO3_CODE:
+                    return Lang.new_york_lottery;
+                case Constants.FLORIDA_BOLET_CODE:
+                    return Lang.florida_lottery;
+                case Constants.FLORIDA_MAYRAJ_CODE:
+                    return Lang.florida_lottery;
+                case Constants.FLORIDA_LOTTO3_CODE:
+                    return Lang.florida_lottery;
+                case Constants.BOULCHANS_CODE:
+                    return "BOULCHANS";
+                default:
+                    return Lang.new_york_lottery;
+            }
+        }
+
+        public static string ConvertGameIdToName(string gameId)
+        {
+            switch (gameId)
+            {
+                case Constants.NEW_YORK_BOLET_CODE:
+                    return Lang.bolet;
+                case Constants.NEW_YORK_MAYRAJ_CODE:
+                    return Lang.maryaj;
+                case Constants.NEW_YORK_LOTTO3_CODE:
+                    return Lang.lotto3;
+                case Constants.FLORIDA_BOLET_CODE:
+                    return Lang.bolet;
+                case Constants.FLORIDA_MAYRAJ_CODE:
+                    return Lang.maryaj;
+                case Constants.FLORIDA_LOTTO3_CODE:
+                    return Lang.lotto3;
+                case Constants.BOULCHANS_CODE:
+                    return "BOULCHANS";
+                default:
+                    return Lang.new_york_lottery;
+            }
+        }
+
+        public static string GetLangFromCode(string code)
+        {
+            switch (code)
+            {
+                case "1":
+                    return Lang.login_fail_wrong_pass;
+                case "0":
+                    return Lang.success;
+                case "-1":
+                    return Lang.error_happened;
+                case "-2":
+                    return Lang.system_update;
+                case "2":
+                    return Lang.term_timeout;
+                case "3":
+                    return Lang.ticket_invalid;
+                case "7":
+                    return "User was locked";
+                case "9":
+                    return Lang.reset_after_1_minute;
+                case "4":
+                    return Lang.params_invalid;
+                case "20":
+                    return Lang.wallet_not_existed;
+                case "21":
+                    return Lang.wallet_not_active;
+                case "22":
+                    return Lang.younger_to_use;
+                case "23":
+                    return Lang.account_not_existed;
+                case "24":
+                    return Lang.internet_error;
+                case "25":
+                    return Lang.pin_wrong;
+                case "26":
+                    return Lang.in_blacklist;
+                case "30":
+                    return Lang.otp_timeout;
+                case "31":
+                    return Lang.otp_invalid;
+                case "100":
+                    return Lang.no_permission;
+                case "32":
+                    return Lang.not_enough_money_to_exchange;
+                case "33":
+                    return Lang.over_each_exchange;
+                case "34":
+                    return Lang.over_exchange_per_day;
+                case "38":
+                    return Lang.promotion_code_invalid;
+                case "39":
+                    return Lang.promotion_code_used;
+                case "40":
+                    return Lang.promotion_code_inactive;
+                case "41":
+                    return Lang.buying_code_not_existed;
+                default:
+                    return code + " " + Lang.not_defined;
+            }
+        }
+
+        public static string ConvertWalletTicket(string type)
+        {
+            switch (type)
+            {
+                case Constants.BASIC_WALLET_TICKET:
+                    return Lang.basic_account;
+                default:
+                    return Lang.NatCash;
+            }
+        }
+
+        // dateTime : MM/dd/yyyy
+        public static long getCountTimeToTimestamp(string time)
+        {
+            // convert to Datetime
+            DateTime endTime = DateTime.ParseExact(
+                time,
+                formats,
+                new CultureInfo("en-US"),
+                DateTimeStyles.None
+            );
+            TimeSpan elapsedTime = endTime - DateTime.Now;
+            return (long)elapsedTime.TotalSeconds;
+        }
+
+        protected void CreateAuthToken()
+        {
+            // create session authen
+            // Create the random value we will use to secure the session.
+            string authId = GenerateAuthId();
+
+            // Store the value in both our Session and a Cookie.
+            HttpContext.Session.SetString("AuthorizationCookieId", authId);
+            string sessionValue = HttpContext.Session.GetString("AuthorizationCookieId");
+            //CookieOptions option = new CookieOptions
+            //{
+            //    Expires = DateTime.Now.AddMinutes(1)
+            //};
+            //Response.Cookies.Append("Key Name", "Value", option);
+            CookieOptions options = new CookieOptions()
+            {
+                //Path = "/",
+                //HttpOnly = true,
+                //Secure = false,
+                //SameSite = SameSiteMode.None
+                Expires = DateTime.Now.AddMinutes(60)
+            };
+            HttpContext.Response.Cookies.Append("AuthorizationCookie", authId, options);
+            string cookieValue = HttpContext.Request.Cookies["AuthorizationCookie"];
+        }
+
+        protected bool CheckAuthToken()
+        {
+            //return true;
+            string cookieValue = HttpContext.Request.Cookies["AuthorizationCookie"];
+            string sessionValue = HttpContext.Session.GetString("AuthorizationCookieId");
+
+            if (cookieValue == null || sessionValue == null || cookieValue != sessionValue)
+            {
+                // Invalidate the session and log out the current user.
+                return false;
+                //return true;
+            }
+            //if (sessionValue == null)
+            //{
+            //    // Invalidate the session and log out the current user.
+            //    return false;
+            //}
+            else
+            {
+                return true;
+            }
+        }
+
+        protected bool ClearCache()
+        {
+            HttpContext.Session.Clear();
+            foreach (var cookieKey in HttpContext.Request.Cookies.Keys)
+            {
+                HttpContext.Response.Cookies.Delete(cookieKey);
+            }
+            return true;
+        }
+
+        private string GenerateAuthId()
+        {
+            using (RandomNumberGenerator rng = new RNGCryptoServiceProvider())
+            {
+                byte[] tokenData = new byte[32];
+                rng.GetBytes(tokenData);
+                return Convert.ToBase64String(tokenData);
+            }
+        }
+
+        protected String DecryptRSA(IConfiguration _configuration, String data)
+        {
+            RSACryptoServiceProvider rsaPrivate = new RSACryptoServiceProvider();
+            rsaPrivate.FromXmlFile(
+                Path.Combine(
+                    Directory.GetCurrentDirectory(),
+                    "",
+                    _configuration["rsaPrivateKeyXml"]
+                )
+            );
+            byte[] byteEntry = Convert.FromBase64String(data);
+            byte[] byteText = rsaPrivate.Decrypt(byteEntry, false);
+
+            return Encoding.UTF8.GetString(byteText);
+        }
+
+        protected async Task<string> CheckAutoLogin(ILog log, String uuid)
+        {
+            string res = null;
+            try
+            {
+                HttpClient httpClient = new HttpClient();
+                MultipartFormDataContent form = new MultipartFormDataContent();
+
+                form.Add(new StringContent(uuid), "uuid");
+
+                HttpResponseMessage response = await httpClient.PostAsync(
+                    Constants.URL_GET_MSISDN,
+                    form
+                );
+
+                response.EnsureSuccessStatusCode();
+                httpClient.Dispose();
+                res = response.Content.ReadAsStringAsync().Result;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+                log.Debug("Exp: " + ex);
+            }
+            return res;
+        }
+
+        public static string CreatePrivateURL(
+            IConfiguration _configuration,
+            string urlString,
+            string durationUnits,
+            string durationNumber,
+            string startIntervalFromNow,
+            string pathToPolicyStmnt
+        )
+        {
+            TimeSpan timeSpanInterval = GetDuration(durationUnits, durationNumber);
+            TimeSpan timeSpanToStart = GetDurationByUnits(durationUnits, startIntervalFromNow);
+            if (null == timeSpanToStart)
+                return "Invalid duration units. Valid options: seconds, minutes, hours, or days";
+
+            string strPolicy = urlString;
+
+            // Read the policy into a byte buffer.
+            byte[] bufferPolicy = Encoding.ASCII.GetBytes(strPolicy);
+
+            // Base64 encode URL-safe policy statement.
+            //string urlSafePolicy = ToUrlSafeBase64String(bufferPolicy);
+
+            // Initialize the SHA1CryptoServiceProvider object and hash the policy data.
+            byte[] bufferPolicyHash;
+            using (SHA1CryptoServiceProvider cryptoSHA1 = new SHA1CryptoServiceProvider())
+            {
+                bufferPolicyHash = cryptoSHA1.ComputeHash(bufferPolicy);
+
+                // Initialize the RSACryptoServiceProvider object.
+                RSACryptoServiceProvider providerRSA = new RSACryptoServiceProvider();
+                XmlDocument xmlPrivateKey = new XmlDocument();
+
+                // Load the PrivateKey.xml file generated by ConvertPEMtoXML.
+                xmlPrivateKey.Load(_configuration["rsaPrivateKeyXml"]);
+
+                // Format the RSACryptoServiceProvider providerRSA and create the signature.
+                providerRSA.FromXmlString(xmlPrivateKey.InnerXml);
+                RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(
+                    providerRSA
+                );
+                RSAFormatter.SetHashAlgorithm("SHA1");
+                byte[] signedHash = RSAFormatter.CreateSignature(bufferPolicyHash);
+
+                // Convert the signed policy to URL safe base 64 encoding.
+                string strSignedPolicy = ToUrlSafeBase64String(signedHash);
+
+                return urlString + "&signature=" + strSignedPolicy;
+            }
+        }
+
+        public static string ToUrlSafeBase64String(byte[] bytes)
+        {
+            return System.Convert.ToBase64String(bytes);
+            //.Replace('+', '-')
+            //.Replace('=', '_')
+            //.Replace('/', '~');
+        }
+
+        public static string CreatePolicyStatement(
+            string policyStmnt,
+            string resourceUrl,
+            DateTime startTime,
+            DateTime endTime
+        )
+        {
+            // Create the policy statement.
+            FileStream streamPolicy = new FileStream(policyStmnt, FileMode.Open, FileAccess.Read);
+            using (StreamReader reader = new StreamReader(streamPolicy))
+            {
+                string strPolicy = reader.ReadToEnd();
+
+                TimeSpan startTimeSpanFromNow = (startTime - DateTime.Now);
+                TimeSpan endTimeSpanFromNow = (endTime - DateTime.Now);
+                TimeSpan intervalStart =
+                    (DateTime.UtcNow.Add(startTimeSpanFromNow))
+                    - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
+                TimeSpan intervalEnd =
+                    (DateTime.UtcNow.Add(endTimeSpanFromNow))
+                    - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
+
+                int startTimestamp = (int)intervalStart.TotalSeconds; // START_TIME
+                int endTimestamp = (int)intervalEnd.TotalSeconds; // END_TIME
+
+                if (startTimestamp > endTimestamp)
+                    return "Error!";
+
+                // Replace variables in the policy statement.
+                strPolicy = strPolicy.Replace("RESOURCE", resourceUrl);
+                //strPolicy = strPolicy.Replace("START_TIME", startTimestamp.ToString());
+                //strPolicy = strPolicy.Replace("END_TIME", endTimestamp.ToString());
+                //strPolicy = strPolicy.Replace("EXPIRES", endTimestamp.ToString());
+                return resourceUrl;
+            }
+        }
+
+        public static TimeSpan GetDuration(string units, string numUnits)
+        {
+            TimeSpan timeSpanInterval = new TimeSpan();
+            switch (units)
+            {
+                case "seconds":
+                    timeSpanInterval = new TimeSpan(0, 0, 0, int.Parse(numUnits));
+                    break;
+                case "minutes":
+                    timeSpanInterval = new TimeSpan(0, 0, int.Parse(numUnits), 0);
+                    break;
+                case "hours":
+                    timeSpanInterval = new TimeSpan(0, int.Parse(numUnits), 0, 0);
+                    break;
+                case "days":
+                    timeSpanInterval = new TimeSpan(int.Parse(numUnits), 0, 0, 0);
+                    break;
+                default:
+                    Console.WriteLine("Invalid time units; use seconds, minutes, hours, or days");
+                    break;
+            }
+            return timeSpanInterval;
+        }
+
+        private static TimeSpan GetDurationByUnits(
+            string durationUnits,
+            string startIntervalFromNow
+        )
+        {
+            TimeSpan timeSpanInterval = new TimeSpan();
+            switch (durationUnits)
+            {
+                case "seconds":
+                    timeSpanInterval = new TimeSpan(0, 0, int.Parse(startIntervalFromNow));
+                    break;
+                case "minutes":
+                    timeSpanInterval = new TimeSpan(0, int.Parse(startIntervalFromNow), 0);
+                    break;
+                case "hours":
+                    timeSpanInterval = new TimeSpan(int.Parse(startIntervalFromNow), 0, 0);
+                    break;
+                case "days":
+                    timeSpanInterval = new TimeSpan(int.Parse(startIntervalFromNow), 0, 0, 0);
+                    break;
+                default:
+                    timeSpanInterval = new TimeSpan(0, 0, 0, 0);
+                    break;
+            }
+            return timeSpanInterval;
+        }
+
+        public static string ConvertDrawnTimeFromTerm(string type, TermObj termObj)
+        {
+            string drawnTime = DateTime
+                .ParseExact(termObj.randomDate, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture)
+                .ToString("HH:mm");
+            string endTime = DateTime
+                .ParseExact(termObj.endDate, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture)
+                .ToString("HH:mm");
+
+            switch (type)
+            {
+                case Constants.NEW_YORK_BOLET_CODE:
+                    return drawnTime;
+                case Constants.NEW_YORK_MAYRAJ_CODE:
+                    return drawnTime;
+                case Constants.NEW_YORK_LOTTO3_CODE:
+                    return drawnTime;
+                case Constants.FLORIDA_BOLET_CODE:
+                    return drawnTime;
+                case Constants.FLORIDA_MAYRAJ_CODE:
+                    return drawnTime;
+                case Constants.FLORIDA_LOTTO3_CODE:
+                    return drawnTime;
+                case Constants.BOULCHANS_CODE:
+                    return endTime;
+                default:
+                    return Lang.new_york_lottery;
+            }
+        }
+
+        public static string ConvertDrawnTimeFromTicket(string type, Ticket ticket)
+        {
+            string drawnTime = DateTime
+                .ParseExact(
+                    ticket.termRandomDate,
+                    "dd/MM/yyyy HH:mm:ss",
+                    CultureInfo.InvariantCulture
+                )
+                .ToString("HH:mm");
+            string endTime = DateTime
+                .ParseExact(ticket.termEndDate, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture)
+                .ToString("HH:mm");
+
+            switch (type)
+            {
+                case Constants.NEW_YORK_BOLET_CODE:
+                    return drawnTime;
+                case Constants.NEW_YORK_MAYRAJ_CODE:
+                    return drawnTime;
+                case Constants.NEW_YORK_LOTTO3_CODE:
+                    return drawnTime;
+                case Constants.FLORIDA_BOLET_CODE:
+                    return drawnTime;
+                case Constants.FLORIDA_MAYRAJ_CODE:
+                    return drawnTime;
+                case Constants.FLORIDA_LOTTO3_CODE:
+                    return drawnTime;
+                case Constants.BOULCHANS_CODE:
+                    return endTime;
+                default:
+                    return Lang.new_york_lottery;
+            }
+        }
+    }
+}

+ 428 - 0
website_natcash/Controllers/BuyTicketController.cs

@@ -0,0 +1,428 @@
+using LotteryWebApp.Common;
+using LotteryWebApp.Components;
+using LotteryWebApp.Extensions;
+using LotteryWebApp.Languages;
+using LotteryWebApp.Models;
+using LotteryWebApp.Service;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+
+namespace LotteryWebApp.Controllers
+{
+    [AutoValidateAntiforgeryToken]
+    public class BuyTicketController : BaseController
+    {
+        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
+
+        IConfiguration configuration;
+        private readonly IWebHostEnvironment webHostEnvironment;
+        APIFunctions api = new APIFunctions();
+
+        public BuyTicketController(IConfiguration _configuration, IWebHostEnvironment hostEnvironment)
+        {
+            configuration = _configuration;
+            webHostEnvironment = hostEnvironment;
+        }
+
+        public String GetParameter(String key)
+        {
+            return configuration.GetSection(key).Value;
+        }
+
+        public IActionResult Index(string termType)
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+
+            HttpContext.Session.SetComplexData("navigator", Constants.BUY_TICKET_NAVIGATOR);
+
+            BuyTicket_ViewModel model = new BuyTicket_ViewModel();
+
+            model.termType = termType != null ? termType : Constants.FLORIDA_BOLET_CODE;
+            HttpContext.Session.SetComplexData("termType", model.termType);
+
+            return View(model);
+        }
+
+        [ValidateAntiForgeryToken]
+        public IActionResult LastTermResult(string termType, String seqPage)
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            LastTermResult_ViewModel model = new LastTermResult_ViewModel();
+            model.listTerm = new List<Term>();
+            try
+            {
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String token = HttpContext.Session.GetComplexData<String>("token");
+
+                string fromDate = DateTime.Now.AddDays(-2).ToString("dd/MM/yyyy");
+                string toDate = DateTime.Now.ToString("dd/MM/yyyy");
+
+                if (seqPage == "1")
+                {
+                    HttpContext.Session.DeleteComplexData("listTerms");
+                }
+                // get result
+                ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest();
+                resultOfTermRequest.gameId = termType;
+                resultOfTermRequest.token = token;
+                resultOfTermRequest.type = Constants.TERM_HAS_NOT_RESULT_TYPE;
+                resultOfTermRequest.order = Constants.DECS;
+                resultOfTermRequest.fromDate = fromDate;
+                resultOfTermRequest.toDate = toDate;
+                resultOfTermRequest.rowsOnPage = Constants.ROW_ON_PAGE;
+                resultOfTermRequest.seqPage = seqPage;
+                resultOfTermRequest.id = Constants.ALL_DATA;
+
+                ResultOfTermResponse result = api.GetResultOfTermApi(configuration, resultOfTermRequest);
+                if (result.responseCode == Code.SESSION_EXPIRED)
+                {
+                    return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+                }
+                else if (result.responseCode == Code.SUCCESS)
+                {
+                    if (result.listTerm != null)
+                        model.listTermNotDrawn = result.listTerm;
+                    model.termType = termType;
+                }
+
+                resultOfTermRequest.type = Constants.TERM_HAS_RESULT_TYPE;
+                result = api.GetResultOfTermApi(configuration, resultOfTermRequest);
+                if (result.responseCode == Code.SESSION_EXPIRED)
+                {
+                    return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+                }
+                else if (result.responseCode == Code.SUCCESS)
+                {
+                    if (result.listTerm != null)
+                    {
+                        model.listTerm = result.listTerm;
+
+                        if (termType == Constants.BOULCHANS_CODE)
+                        {
+                            List<Term> listTerms = HttpContext.Session.GetComplexData<List<Term>>("listTerms");
+                            if (listTerms != null && listTerms.Count > 0)
+                            {
+                                listTerms.AddRange(result.listTerm);
+                            }
+                            else
+                            {
+                                listTerms = result.listTerm;
+                            }
+                            HttpContext.Session.SetComplexData("listTerms", listTerms);
+                        }
+                    }
+                }
+            }
+
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return PartialView("LastTermResult", model);
+        }
+
+        public IActionResult Choose(string ticketType, string termType)
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            BuyTicketChoose_ViewModel model = new BuyTicketChoose_ViewModel();
+            if (ticketType == null)
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Home");
+            }
+
+            if (termType != null)
+            {
+                HttpContext.Session.SetComplexData("termType", termType);
+            }
+            model.ticketType = ticketType;
+            return View(model);
+        }
+
+        [ValidateAntiForgeryToken]
+        public IActionResult AddTicket_Action(string ticketType)
+        {
+            ChooseFormModel model = new ChooseFormModel();
+            model.tics = DateTime.Now.Ticks;
+            model.ticketType = ticketType;
+            return ViewComponent("ChooseForm", model);
+        }
+
+
+        [ValidateAntiForgeryToken]
+        public JsonResult ConfirmTicket_Action(string ticketType, string tickets)
+        {
+            try
+            {
+                // check tickets
+                int check = 1;
+                string[] ticketsList = tickets.Split(',');
+                for (int i = 0; i < ticketsList.Length; i++)
+                {
+                    if (ticketType == Constants.BOLET_CODE && ticketsList[i].Length != 2)
+                    {
+                        check *= 0;
+                    }
+                    if (ticketType == Constants.MAYRAJ_CODE && ticketsList[i].Length != 4)
+                    {
+                        check *= 0;
+                    }
+                    if (ticketType == Constants.LOTTO3_CODE && ticketsList[i].Length != 3)
+                    {
+                        check *= 0;
+                    }
+                    if (ticketType == Constants.BOULCHANS_CODE && ticketsList[i].Length != 2)
+                    {
+                        check *= 0;
+                    }
+                }
+                if (check == 1)
+                {
+                    HttpContext.Session.SetComplexData("ticketType", ticketType);
+                    HttpContext.Session.SetComplexData("tickets", tickets);
+                    return Json(new
+                    {
+                        code = Code.SUCCESS,
+                    });
+                }
+
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return Json(new
+            {
+                code = Code.FAILURE,
+                message = Lang.ticket_invalid
+            });
+        }
+
+        public IActionResult Payment(string step)
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+
+            BuyTicketPayment_ViewModel model = new BuyTicketPayment_ViewModel();
+            Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+
+            String tickets = HttpContext.Session.GetComplexData<String>("tickets");
+            String ticketType = HttpContext.Session.GetComplexData<String>("ticketType");
+            String termType = HttpContext.Session.GetComplexData<String>("termType");
+
+            ConfirmTicketDataResponse confirmTicketDataResponse = HttpContext.Session.GetComplexData<ConfirmTicketDataResponse>("confirmTicketDataResponse");
+
+            model.tickets = tickets;
+            model.step = step != null ? step : Constants.PAYMENT_SHOW;
+            model.ticketType = ticketType;
+            model.confirmTicketDataResponse = confirmTicketDataResponse;
+            model.profile = profile;
+            model.termType = termType;
+
+            if (step == Constants.PAYMENT_RESULT)
+            {
+                ConfirmBuyingTicketResponse confirmBuyingTicketResponse = HttpContext.Session.GetComplexData<ConfirmBuyingTicketResponse>("confirmBuyingTicketResponse");
+                model.confirmBuyingTicketResponse = confirmBuyingTicketResponse;
+            }
+
+            return View(model);
+        }
+
+        [ValidateAntiForgeryToken]
+        public JsonResult PaymentSendOTP_Action(string ticketMoney)
+        {
+            try
+            {
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String token = HttpContext.Session.GetComplexData<String>("token");
+                String termType = HttpContext.Session.GetComplexData<String>("termType");
+                String tickets = HttpContext.Session.GetComplexData<String>("tickets");
+                String ticketType = HttpContext.Session.GetComplexData<String>("ticketType");
+
+                string[] ticketMoneyReal = ticketMoney.Split(',');
+                string[] ticketNumberReal = tickets.Split(',');
+
+                if (ticketMoneyReal.Length != ticketNumberReal.Length)
+                {
+                    return Json(new
+                    {
+                        code = Code.FAILURE,
+                        message = Lang.error_happened
+                    });
+                }
+
+                int totalMoney = 0;
+                List<TicketInfo> ticketInfos = new List<TicketInfo>();
+                for (int i = 0; i < ticketMoneyReal.Length; i++)
+                {
+                    TicketInfo ticketInfo = new TicketInfo();
+                    ticketInfo.money = ticketMoneyReal[i];
+                    ticketInfo.code = ticketNumberReal[i];
+                    ticketInfos.Add(ticketInfo);
+                    totalMoney += int.Parse(ticketInfo.money);
+                }
+
+
+                ConfirmTicketDataRequest confirmTicketDataRequest = new ConfirmTicketDataRequest();
+                confirmTicketDataRequest.token = token;
+                confirmTicketDataRequest.msisdn = msisdn;
+                confirmTicketDataRequest.ticket = ticketInfos;
+                confirmTicketDataRequest.gameId = ConvertToGameID(termType, ticketType);
+                confirmTicketDataRequest.requestId = RandomString(100, true);
+
+                ConfirmTicketDataResponse confirmTicketDataResponse = api.ConfirmTicketDataApi(configuration, confirmTicketDataRequest);
+                if (confirmTicketDataResponse.responseCode == Code.SUCCESS)
+                {
+                    //string drawnTime = DateTime.ParseExact(confirmTicketDataResponse.termObj.endDate, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture).ToString("HH:mm");
+
+                    string content = Lang.confirm_payment_1 + " " + totalMoney + " " + Lang.confirm_payment_2 + " " + ConvertGameIdToName(confirmTicketDataRequest.gameId)
+                       + " " + Lang.confirm_payment_3 + " 0 " + Lang.confirm_payment_4 + " " + 
+                       ConvertDrawnTimeFromTerm(termType, confirmTicketDataResponse.termObj) + Lang.confirm_payment_5;
+                    HttpContext.Session.SetComplexData("confirmTicketDataResponse", confirmTicketDataResponse);
+
+                    String channel = GetParameter(Constants.CHANNEL);
+                    if (channel == ApiConstants.WALLET)
+                    {
+                        // ma hoa
+                        String param = "transactionId=" + confirmTicketDataResponse.transId + "&requestId=" + confirmTicketDataResponse.requestId + "&money=" + totalMoney;
+                        String url = CreatePrivateURL(configuration, param, "seconds", "0", "0", GetParameter("rsaPolicy"));
+
+                        // redirect
+                        return Json(new
+                        {
+                            code = "110",
+                            param = url,
+                        });
+                    }
+                    else
+                    {
+                        // send OTP
+                        SendOTPRequest sendOTPRequest = new SendOTPRequest();
+                        sendOTPRequest.msisdn = msisdn;
+                        sendOTPRequest.token = token;
+                        SendOTPResponse sendOTPResponse = api.SendOTPApi(configuration, sendOTPRequest);
+                        return Json(new
+                        {
+                            code = int.Parse(sendOTPResponse.responseCode),
+                            message = sendOTPResponse.responseMessage,
+                            content = content,
+                        });
+                    }
+                }
+                return Json(new
+                {
+                    code = int.Parse(confirmTicketDataResponse.responseCode),
+                    message = GetLangFromCode(confirmTicketDataResponse.responseCode),
+                });
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return Json(new
+            {
+                code = Code.FAILURE,
+                message = Lang.error_happened
+            });
+        }
+
+        [ValidateAntiForgeryToken]
+        public JsonResult PaymentConfirmOTP_Action(string otp)
+        {
+            try
+            {
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String token = HttpContext.Session.GetComplexData<String>("token");
+                ConfirmTicketDataResponse confirmTicketDataResponse = HttpContext.Session.GetComplexData<ConfirmTicketDataResponse>("confirmTicketDataResponse");
+
+                ConfirmOTPRequest confirmOTPRequest = new ConfirmOTPRequest();
+                confirmOTPRequest.otp = otp;
+                confirmOTPRequest.token = token;
+                confirmOTPRequest.msisdn = msisdn;
+
+                ConfirmOTPResponse confirmOTPResponse = api.ConfirmOTPApi(configuration, confirmOTPRequest);
+                if (confirmOTPResponse.responseCode == Code.SUCCESS)
+                {
+                    // confirm ticket
+
+                    ConfirmBuyingTicketRequest confirmBuyingTicketRequest = new ConfirmBuyingTicketRequest();
+                    confirmBuyingTicketRequest.requestId = confirmTicketDataResponse.requestId;
+                    confirmBuyingTicketRequest.transIdByTicket = confirmTicketDataResponse.transId;
+                    confirmBuyingTicketRequest.token = token;
+
+                    ConfirmBuyingTicketResponse confirmBuyingTicketResponse = api.ConfirmBuyingTicketApi(configuration, confirmBuyingTicketRequest);
+                    HttpContext.Session.SetComplexData("confirmBuyingTicketResponse", confirmBuyingTicketResponse);
+
+                    return Json(new
+                    {
+                        code = int.Parse(confirmBuyingTicketResponse.responseCode),
+                        message = confirmBuyingTicketResponse.responseMessage,
+                    });
+                }
+                return Json(new
+                {
+                    code = int.Parse(confirmOTPResponse.responseCode),
+                    message = GetLangFromCode(confirmOTPResponse.responseCode),
+                });
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return Json(new
+            {
+                code = Code.FAILURE,
+                message = Lang.error_happened
+            });
+        }
+
+        [AutoValidateAntiforgeryToken]
+        public JsonResult PaymentResentOTP_Action()
+        {
+            try
+            {
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String token = HttpContext.Session.GetComplexData<String>("token");
+
+                // send OTP
+                SendOTPRequest sendOTPRequest = new SendOTPRequest();
+                sendOTPRequest.msisdn = msisdn;
+                sendOTPRequest.token = token;
+                SendOTPResponse sendOTPResponse = api.SendOTPApi(configuration, sendOTPRequest);
+                return Json(new
+                {
+                    code = int.Parse(sendOTPResponse.responseCode),
+                    message = GetLangFromCode(sendOTPResponse.responseCode),
+                });
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return Json(new
+            {
+                code = Code.FAILURE,
+                message = Lang.error_happened
+            });
+        }
+
+        public IActionResult BackToApp()
+        {
+            return View();
+        }
+    }
+}

+ 150 - 0
website_natcash/Controllers/HistoryController.cs

@@ -0,0 +1,150 @@
+using LotteryWebApp.Common;
+using LotteryWebApp.Extensions;
+using LotteryWebApp.Models;
+using LotteryWebApp.Service;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using System;
+using System.Collections.Generic;
+
+namespace LotteryWebApp.Controllers
+{
+    [AutoValidateAntiforgeryToken]
+    public class HistoryController : BaseController
+    {
+        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
+
+        IConfiguration configuration;
+        private readonly IWebHostEnvironment webHostEnvironment;
+        APIFunctions api = new APIFunctions();
+
+        public HistoryController(IConfiguration _configuration, IWebHostEnvironment hostEnvironment)
+        {
+            configuration = _configuration;
+            webHostEnvironment = hostEnvironment;
+        }
+
+        public String GetParameter(String key)
+        {
+            return configuration.GetSection(key).Value;
+        }
+
+        public IActionResult Index(string winType, string gameId)
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            HttpContext.Session.SetComplexData("navigator", Constants.HISTORY_NAVIGATOR);
+
+            History_ViewModel model = new History_ViewModel();
+            try
+            {
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String token = HttpContext.Session.GetComplexData<String>("token");
+
+                model.gameId = gameId != null ? gameId : Constants.NEW_YORK_BOLET_CODE;
+                model.winType = winType != null ? winType : Constants.NOT_DRAW_CODE;
+
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return View(model);
+        }
+
+        [ValidateAntiForgeryToken]
+        public IActionResult UserTicket(string winType, string gameId, string seqpage)
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            HistoryUserTicket_ViewModel model = new HistoryUserTicket_ViewModel();
+            model.tickets = new List<Ticket>();
+            try
+            {
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String token = HttpContext.Session.GetComplexData<String>("token");
+
+                model.gameId = gameId != null ? gameId : Constants.NEW_YORK_BOLET_CODE;
+                model.winType = winType != null ? winType : Constants.NOT_DRAW_CODE;
+
+                HttpContext.Session.SetComplexData("gameId", model.gameId);
+
+                UserTicketRequest userTicketRequest = new UserTicketRequest();
+                userTicketRequest.msisdn = msisdn;
+                userTicketRequest.token = token;
+                userTicketRequest.gameId = ConvertToListGameID(model.gameId);
+                userTicketRequest.type = model.winType;
+                userTicketRequest.id = Constants.ALL_DATA;
+                userTicketRequest.rowsOnPage = Constants.ROW_ON_PAGE;
+                userTicketRequest.seqPage = seqpage != null ? seqpage : "1";
+                userTicketRequest.order = Constants.DECS;
+
+                UserTicketResponse userTicketResponse = api.GetUserTicketApi(configuration, userTicketRequest);
+                if (userTicketResponse.responseCode == Code.SUCCESS)
+                {
+                    if (userTicketResponse.listTicket != null)
+                    {
+                        model.tickets = userTicketResponse.listTicket;
+
+                        // append 
+                        List<Ticket> listTickets = HttpContext.Session.GetComplexData<List<Ticket>>("listTicket");
+                        if(listTickets != null && listTickets.Count > 0)
+                        {
+                            listTickets.AddRange(userTicketResponse.listTicket);
+                        }
+                        else
+                        {
+                            listTickets = userTicketResponse.listTicket;
+                        }
+                        HttpContext.Session.SetComplexData("listTicket", listTickets);
+
+                        HttpContext.Session.SetComplexData("winType", model.winType);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return PartialView("UserTicket", model);
+        }
+
+        [ValidateAntiForgeryToken]
+        public IActionResult TicketDetail(string id)
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            HistoryTicketDetail_ViewModel model = new HistoryTicketDetail_ViewModel();
+            try
+            {
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String token = HttpContext.Session.GetComplexData<String>("token");
+                String winType = HttpContext.Session.GetComplexData<String>("winType");
+                String gameId = HttpContext.Session.GetComplexData<String>("gameId");
+
+                List<Ticket> tickets = HttpContext.Session.GetComplexData<List<Ticket>>("listTicket");
+
+                Ticket ticket = tickets.Find(c => c.id == id);
+                if (ticket != null)
+                {
+                    model.ticket = ticket;
+                }
+                model.winType = winType;
+                model.msisdn = msisdn;
+                model.type = gameId;
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return PartialView("TicketDetail", model);
+        }
+    }
+}

+ 810 - 0
website_natcash/Controllers/HomeController.cs

@@ -0,0 +1,810 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Globalization;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using LotteryWebApp.Common;
+using LotteryWebApp.Extensions;
+using LotteryWebApp.Languages;
+using LotteryWebApp.Models;
+using LotteryWebApp.Service;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Localization;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Logging;
+using Newtonsoft.Json;
+
+namespace LotteryWebApp.Controllers
+{
+    [AutoValidateAntiforgeryToken]
+    public class HomeController : BaseController
+    {
+        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
+
+        IConfiguration configuration;
+        private readonly IWebHostEnvironment webHostEnvironment;
+        APIFunctions api = new APIFunctions();
+        bool flashViewEnabled = false;
+
+        public HomeController(IConfiguration _configuration, IWebHostEnvironment hostEnvironment)
+        {
+            configuration = _configuration;
+            webHostEnvironment = hostEnvironment;
+        }
+
+        public String GetParameter(String key)
+        {
+            return configuration.GetSection(key).Value;
+        }
+
+        public IActionResult FlashView()
+        {
+            return View();
+        }
+
+        public JsonResult SetCulture(string lang)
+        {
+            try
+            {
+                Response.Cookies.Append(
+                    CookieRequestCultureProvider.DefaultCookieName,
+                    CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(lang)),
+                    new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
+                );
+                HttpContext.Session.SetComplexData("culture", lang);
+            }
+            catch (Exception ex)
+            {
+                log.Error("Exp: " + ex);
+            }
+
+            return Json(new { });
+        }
+
+        public async Task<IActionResult> IndexAsync(
+            string termType,
+            String uuid,
+            String mcuid,
+            String phonenumber,
+            String token
+        )
+        {
+            //return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Home/Update");
+            //String param = "transactionId=" + "ABC" + "&requestId=" + "DEF" + "&money=" + "100";
+            //String url = CreatePrivateURL(configuration, param, "seconds", "0", "0", GetParameter("rsaPolicy"));
+
+
+            HomeIndex_ViewModel model = new HomeIndex_ViewModel();
+            try
+            {
+                HttpContext.Session.SetComplexData("navigator", Constants.HOME_NAVIGATOR);
+
+                CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
+                String lang = currentCulture.Name;
+                log.Info("lang: " + lang);
+
+                String msisdnAuto = null;
+                // check auto login ?uuid=681471d23b83f0a463e2dd5671ea0fc5
+                // ?uuid=681471d23b83f0a463e2dd5671ea0fc5&mcuid=6c6948a89908d83aec8c05be256970a1&mcapp=mocha
+
+                if (!CheckAuthToken())
+                {
+                    //String uri = HttpContext.Request.QueryString.ToUriComponent().ToString();
+                    log.Info("UUID: " + uuid);
+                    log.Info("token: " + token);
+                    //token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ1c2VySW5mb3IiLCJleHAiOjE3MTAzODE0NTksInV1aWQiOiI1MGEwYjNlNzk5ZjllZDU3YTE1ZjZjNjljODVmYTM3NSJ9.EgR-P_KzsHJ1XCdgeu25Gy_-qAHOfM9uv9RTZSvr0AA";
+
+                    if (token != null)
+                    {
+                        // nhan dien qua token
+                        AutoLoginRequest autoLoginRequest = new AutoLoginRequest();
+                        autoLoginRequest.token = token;
+                        AutoLoginResponse autoLoginResponse = await api.AutoLoginApiAsync(
+                            configuration,
+                            autoLoginRequest
+                        );
+
+                        if (autoLoginResponse.code == Code.SUCCESS_CODE)
+                        {
+                            string msisdnReal = validateMsisdn(
+                                autoLoginResponse.data.msisdn.Substring(1)
+                            );
+                            if (msisdnReal == "")
+                            {
+                                return Redirect(
+                                    GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"
+                                );
+                            }
+                            // check local system
+                            CheckAccountRequest checkAccountRequest = new CheckAccountRequest
+                            {
+                                msisdn = msisdnReal,
+                                channel = Constants.WEB_CHANNEL,
+                                language = lang == "en" ? "0" : "1"
+                            };
+                            CheckAccountResponse checkAccountResponse = api.CheckAccountApi(
+                                configuration,
+                                checkAccountRequest
+                            );
+                            if (checkAccountResponse.status == Code.SUCCESS)
+                            {
+                                string tokenGetReal = checkAccountResponse.token;
+
+                                HttpContext.Session.SetComplexData("msisdn", msisdnReal);
+                                // create session
+                                // create new auth
+                                CreateAuthToken();
+
+                                HttpContext.Session.SetComplexData("token", tokenGetReal);
+
+                                // load user status
+                                UserGetProfileRequest userGetProfileRequest =
+                                    new UserGetProfileRequest
+                                    {
+                                        users = msisdnReal,
+                                        token = tokenGetReal
+                                    };
+                                Profile profileGet = api.UserLoadProfileApi(
+                                    configuration,
+                                    userGetProfileRequest
+                                );
+                                HttpContext.Session.SetComplexData("profile", profileGet);
+
+                                // load profile
+                                UserStatusRequest userStatusRequest = new UserStatusRequest
+                                {
+                                    users = msisdnReal,
+                                    token = tokenGetReal
+                                };
+                                UserStatus userStatusGet = api.GetUserStatusApi(
+                                    configuration,
+                                    userStatusRequest
+                                );
+                                HttpContext.Session.SetComplexData("userStatus", userStatusGet);
+
+                                return Redirect(
+                                    GetParameter(Constants.SUB_DOMAIN) + "/Account/ChooseApp"
+                                );
+                            }
+                            else
+                            {
+                                return Redirect(
+                                    GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"
+                                );
+                            }
+                        }
+                    }
+                    else if (uuid != null)
+                    {
+                        // nhan dien thue bao
+                        //string uuid = HttpContext.Request.QueryString.ToUriComponent().ToString().Substring(6);
+                        //String uuid = data.Substring(data.Length - 5, data.Length);
+
+                        String res = await CheckAutoLogin(log, uuid);
+                        log.Info("uuid: " + uuid + " res: " + res);
+
+                        if (res != null)
+                        {
+                            dynamic json = JsonConvert.DeserializeObject(res);
+                            log.Info("res json: " + json);
+
+                            String code = json["code"];
+
+                            if (code == "200")
+                            {
+                                String errorCode = json["errorCode"];
+
+                                if (errorCode == "200")
+                                {
+                                    msisdnAuto = json["data"]["msisdn"];
+                                    log.Info("msisdnAuto: " + msisdnAuto);
+                                }
+                            }
+                        }
+
+                        // redirect to OTP screen
+                        String msisdnDetect = validateMsisdn(msisdnAuto.Substring(1));
+                        if (msisdnDetect != "")
+                        {
+                            // get OTP
+                            RegisterRequest request = new RegisterRequest();
+                            request.Msisdn = msisdnDetect;
+                            RegisterResponse reset = api.UserForgotPasswordApi(
+                                configuration,
+                                request
+                            );
+                            if (reset.status == Code.SUCCESS)
+                            {
+                                HttpContext.Session.Remove("regInfos");
+                                HttpContext.Session.SetComplexData("msisdn", msisdnDetect);
+
+                                // return to login
+                                return Redirect(
+                                    GetParameter(Constants.SUB_DOMAIN) + "/Account/Login?step=2"
+                                );
+                            }
+                        }
+
+                        // return to view to get phone number
+                        model.termType =
+                            termType != null ? termType : Constants.NEW_YORK_BOLET_CODE;
+
+                        //model.uuid = uuid;
+                        //model.subDomain = GetParameter(Constants.SUB_DOMAIN);
+
+                        return Redirect(
+                            GetParameter(Constants.SUB_DOMAIN)
+                                + "/Account/Login?message="
+                                + Lang.reset_after_1_minute
+                        );
+                    }
+                    else if (phonenumber != null)
+                    {
+                        String channel = GetParameter(Constants.CHANNEL);
+                        if (channel == ApiConstants.WALLET)
+                        {
+                            //giai ma
+                            String msisdnRSA = DecryptRSA(configuration, phonenumber);
+
+                            // login
+                            HttpContext.Session.SetComplexData("msisdn", msisdnRSA);
+                            // create session
+                            // create new auth
+                            CreateAuthToken();
+
+                            // login success --> store session
+                            HttpContext.Session.SetComplexData("token", ApiConstants.WALLET_TOKEN);
+
+                            // load profile
+
+                            // load user status
+                            UserGetProfileRequest userGetProfileRequest = new UserGetProfileRequest
+                            {
+                                users = msisdnRSA,
+                                token = ApiConstants.WALLET_TOKEN
+                            };
+                            Profile profileGet = api.UserLoadProfileApi(
+                                configuration,
+                                userGetProfileRequest
+                            );
+                            HttpContext.Session.SetComplexData("profile", profileGet);
+
+                            // load profile
+                            UserStatusRequest userStatusRequest = new UserStatusRequest
+                            {
+                                users = msisdnRSA,
+                                token = ApiConstants.WALLET_TOKEN
+                            };
+                            UserStatus userStatusGet = api.GetUserStatusApi(
+                                configuration,
+                                userStatusRequest
+                            );
+                            HttpContext.Session.SetComplexData("userStatus", userStatusGet);
+
+                            return Redirect(
+                                GetParameter(Constants.SUB_DOMAIN) + "/Account/ChooseApp"
+                            );
+                        }
+                        else
+                        {
+                            // after auto detect
+                            String msisdnGet = phonenumber.Substring(1);
+                            String msisdnDetect = validateMsisdn(msisdnGet);
+                            if (msisdnDetect != "")
+                            {
+                                // auto login
+                                // reload user info
+                                HttpContext.Session.Remove("regInfos");
+                                HttpContext.Session.SetComplexData("msisdn", msisdnDetect);
+
+                                // return to login
+                                return Redirect(
+                                    GetParameter(Constants.SUB_DOMAIN) + "/Account/Login?step=2"
+                                );
+                            }
+                            return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+                        }
+                    }
+                    else
+                    {
+                        return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+                    }
+                }
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>(
+                    "userStatus"
+                );
+
+                // login success --> store session
+                model.termType = termType != null ? termType : Constants.FLORIDA_BOLET_CODE;
+                model.userStatus = userStatus;
+                model.profile = profile;
+
+                // get time to nearest term
+                model.listTerm = new List<Term>();
+
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String tokenGet = HttpContext.Session.GetComplexData<String>("token");
+                String fromDate = DateTime.Now.AddDays(-2).ToString("dd/MM/yyyy");
+                String toDate = DateTime.Now.ToString("dd/MM/yyyy");
+
+                // get winner
+
+                GetTopWinnerRequest getTopWinnerRequest = new GetTopWinnerRequest();
+                getTopWinnerRequest.type = lang == "en" ? "0" : "1";
+                getTopWinnerRequest.token = tokenGet;
+                GetTopWininerResponse getTopWininerResponse = api.GetTopWinnerApi(
+                    configuration,
+                    getTopWinnerRequest
+                );
+                if (getTopWininerResponse.responseCode == Code.SUCCESS)
+                {
+                    model.topWinner = getTopWininerResponse.list;
+                    HttpContext.Session.SetComplexData("topWinner", model.topWinner);
+                }
+
+                ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest
+                {
+                    gameId = model.termType,
+                    token = tokenGet,
+                    type = Constants.TERM_HAS_NOT_RESULT_TYPE,
+                    order = Constants.DECS,
+                    fromDate = fromDate,
+                    toDate = toDate,
+                    rowsOnPage = Constants.ROW_ON_PAGE,
+                    seqPage = "1",
+                    id = Constants.ALL_DATA
+                };
+
+                ResultOfTermResponse result = api.GetResultOfTermApi(
+                    configuration,
+                    resultOfTermRequest
+                );
+                if (result.responseCode == Code.SESSION_EXPIRED)
+                {
+                    return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+                }
+                else if (result.responseCode == Code.SUCCESS)
+                {
+                    model.listTerm = result.listTerm;
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            return View(model);
+        }
+
+        [ValidateAntiForgeryToken]
+        public IActionResult TermResult(string termType)
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            TermResultModel model = new TermResultModel();
+            model.listTerm = new List<Term>();
+
+            String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+            String token = HttpContext.Session.GetComplexData<String>("token");
+
+            String fromDate = DateTime.Now.AddDays(-2).ToString("dd/MM/yyyy");
+            String toDate = DateTime.Now.ToString("dd/MM/yyyy");
+
+            // get result
+            ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest
+            {
+                gameId = termType,
+                token = token,
+                type = Constants.TERM_HAS_RESULT_TYPE,
+                order = Constants.DECS,
+                fromDate = fromDate,
+                toDate = toDate,
+                rowsOnPage = Constants.ROW_ON_PAGE,
+                seqPage = "1",
+                id = Constants.ALL_DATA
+            };
+
+            ResultOfTermResponse result = api.GetResultOfTermApi(
+                configuration,
+                resultOfTermRequest
+            );
+            if (result.responseCode == Code.SESSION_EXPIRED)
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            else if (result.responseCode == Code.SUCCESS)
+            {
+                if (result.listTerm != null)
+                    model.listTerm = result.listTerm;
+                model.termType = termType;
+            }
+
+            return PartialView("TermResult", model);
+        }
+
+        public IActionResult Transfer(string step, string walletType)
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            HomeTransfer_ViewModel model = new HomeTransfer_ViewModel();
+            try
+            {
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String token = HttpContext.Session.GetComplexData<String>("token");
+
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>(
+                    "userStatus"
+                );
+                TransferMoneyRequest transferData =
+                    HttpContext.Session.GetComplexData<TransferMoneyRequest>("transferData");
+
+                model.step = step != null ? step : Constants.TRANSFER_SHOW;
+                model.walletType =
+                    walletType != null ? walletType : Constants.BASIC_WALLET_TRANSFER;
+
+                model.profile = profile;
+                model.userStatus = userStatus;
+                model.transferData = transferData;
+
+                if (step == Constants.TRANSFER_RESULT)
+                {
+                    // get payment info
+                    String paymentCode = HttpContext.Session.GetComplexData<String>("paymentCode");
+
+                    TransactionInfoRequest transactionInfoRequest = new TransactionInfoRequest
+                    {
+                        id = paymentCode,
+                        msisdn = msisdn,
+                        token = token
+                    };
+                    TransactionInfoResponse transactionInfoResponse = api.GetTransactionInfoApi(
+                        configuration,
+                        transactionInfoRequest
+                    );
+                    if (transactionInfoResponse.responseCode == Code.SESSION_EXPIRED)
+                    {
+                        return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+                    }
+                    else if (transactionInfoResponse.responseCode == Code.SUCCESS)
+                    {
+                        TransferMoneyRequest transferMoneyRequest =
+                            HttpContext.Session.GetComplexData<TransferMoneyRequest>(
+                                "transferData"
+                            );
+                        model.walletType = transferMoneyRequest.channelPayment;
+                        if (transactionInfoResponse.list.Count > 0)
+                        {
+                            model.transaction = transactionInfoResponse.list[0];
+                        }
+                        else
+                        {
+                            return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Home/Error");
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return View(model);
+        }
+
+        [ValidateAntiForgeryToken]
+        public IActionResult TransactionConfirm_Action(
+            string walletType,
+            string receivernumber,
+            string moneyon
+        )
+        {
+            try
+            {
+                if (!CheckAuthToken())
+                {
+                    return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+                }
+                // send otp to user and show otp partial
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String token = HttpContext.Session.GetComplexData<String>("token");
+
+                //String receiver = walletType == Constants.NATCASH_WALLET_TRANSFER ? null : msisdn;
+                String receiver = msisdn;
+
+                //if (walletType == Constants.NATCASH_WALLET_TRANSFER)
+                //{
+                //    receiver = validateMsisdn(receivernumber);
+                //    if (receiver == "")
+                //    {
+                //        return Json(new
+                //        {
+                //            code = Code.FAILURE,
+                //            message = Lang.phone_invalid
+                //        });
+                //    }
+                //}
+
+                // save info to session
+                TransferMoneyRequest transferMoneyRequest = new TransferMoneyRequest();
+                transferMoneyRequest.money = moneyon;
+                transferMoneyRequest.msisdn = msisdn;
+                transferMoneyRequest.msisdnReceive = receiver;
+                transferMoneyRequest.channelPayment = walletType;
+                HttpContext.Session.SetComplexData("transferData", transferMoneyRequest);
+                return Json(new { code = Code.SUCCESS, });
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return Json(new { code = Code.FAILURE, message = Lang.error_happened });
+        }
+
+        [ValidateAntiForgeryToken]
+        public JsonResult TransactionSendOTP_Action()
+        {
+            try
+            {
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String token = HttpContext.Session.GetComplexData<String>("token");
+                TransferMoneyRequest transferData =
+                    HttpContext.Session.GetComplexData<TransferMoneyRequest>("transferData");
+
+                String content =
+                    Lang.confirm_transfer_1
+                    + " "
+                    + transferData.money
+                    + Lang.confirm_transfer_2
+                    + " "
+                    + transferData.msisdnReceive
+                    + Lang.confirm_transfer_3;
+
+                // send OTP
+                SendOTPRequest sendOTPRequest = new SendOTPRequest();
+                sendOTPRequest.msisdn = msisdn;
+                sendOTPRequest.token = token;
+                SendOTPResponse sendOTPResponse = api.SendOTPApi(configuration, sendOTPRequest);
+                return Json(
+                    new
+                    {
+                        code = int.Parse(sendOTPResponse.responseCode),
+                        message = GetLangFromCode(sendOTPResponse.responseCode),
+                        content = content,
+                    }
+                );
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return Json(new { code = Code.FAILURE, message = Lang.error_happened });
+        }
+
+        [ValidateAntiForgeryToken]
+        public JsonResult TransactionResentOTP_Action()
+        {
+            try
+            {
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String token = HttpContext.Session.GetComplexData<String>("token");
+
+                // send OTP
+                SendOTPRequest sendOTPRequest = new SendOTPRequest
+                {
+                    msisdn = msisdn,
+                    token = token
+                };
+                SendOTPResponse sendOTPResponse = api.SendOTPApi(configuration, sendOTPRequest);
+                return Json(
+                    new
+                    {
+                        code = int.Parse(sendOTPResponse.responseCode),
+                        message = GetLangFromCode(sendOTPResponse.responseCode),
+                    }
+                );
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return Json(new { code = Code.FAILURE, message = Lang.error_happened });
+        }
+
+        [ValidateAntiForgeryToken]
+        public JsonResult TransactionConfirmOTP_Action(string otp)
+        {
+            try
+            {
+                String token = HttpContext.Session.GetComplexData<String>("token");
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+
+                TransferMoneyRequest transferMoneyRequest =
+                    HttpContext.Session.GetComplexData<TransferMoneyRequest>("transferData");
+                transferMoneyRequest.otp = otp;
+                transferMoneyRequest.token = token;
+
+                TransferMoneyResponse transferMoneyResponse = api.TransferMoneyApi(
+                    configuration,
+                    transferMoneyRequest
+                );
+                if (transferMoneyResponse.responseCode == Code.SUCCESS)
+                {
+                    // save payment code
+                    //HttpContext.Session.DeleteComplexData("transferData");
+                    HttpContext.Session.SetComplexData(
+                        "paymentCode",
+                        transferMoneyResponse.paymentCode
+                    );
+
+                    // load user status
+                    UserGetProfileRequest userGetProfileRequest = new UserGetProfileRequest
+                    {
+                        users = msisdn,
+                        token = token
+                    };
+                    Profile profile = api.UserLoadProfileApi(configuration, userGetProfileRequest);
+                    HttpContext.Session.SetComplexData("profile", profile);
+
+                    // load profile
+                    UserStatusRequest userStatusRequest = new UserStatusRequest
+                    {
+                        users = msisdn,
+                        token = token
+                    };
+                    UserStatus userStatus = api.GetUserStatusApi(configuration, userStatusRequest);
+                    HttpContext.Session.SetComplexData("userStatus", userStatus);
+                }
+                return Json(
+                    new
+                    {
+                        code = int.Parse(transferMoneyResponse.responseCode),
+                        message = GetLangFromCode(transferMoneyResponse.responseCode),
+                    }
+                );
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return Json(new { code = Code.FAILURE, message = Lang.error_happened });
+        }
+
+        public IActionResult Rules(string termType)
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            HomeRules_ViewModel model = new HomeRules_ViewModel();
+            try
+            {
+                model.termType = termType != null ? termType : Constants.FLORIDA_BOLET_CODE;
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return View(model);
+        }
+
+        public IActionResult Results(string termType, string fromDate, string toDate)
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            HomeResults_ViewModel model = new HomeResults_ViewModel();
+            try
+            {
+                model.termType = termType != null ? termType : Constants.NEW_YORK_BOLET_CODE;
+                model.fromDate =
+                    fromDate != null ? fromDate : DateTime.Now.AddDays(-2).ToString("dd/MM/yyyy");
+                model.toDate = toDate != null ? toDate : DateTime.Now.ToString("dd/MM/yyyy");
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return View(model);
+        }
+
+        public IActionResult TermResultHistory(string termType, string fromDate, string toDate)
+        {
+            TermResultHistoryModel model = new TermResultHistoryModel();
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            try
+            {
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String token = HttpContext.Session.GetComplexData<String>("token");
+
+                model.fromDate =
+                    fromDate != null
+                        ? DateTime
+                            .ParseExact(fromDate, "yyyy-MM-dd", CultureInfo.InvariantCulture)
+                            .ToString("dd/MM/yyyy")
+                        : DateTime.Now.AddDays(-2).ToString("dd/MM/yyyy");
+                model.toDate =
+                    toDate != null
+                        ? DateTime
+                            .ParseExact(toDate, "yyyy-MM-dd", CultureInfo.InvariantCulture)
+                            .ToString("dd/MM/yyyy")
+                        : DateTime.Now.ToString("dd/MM/yyyy");
+
+                // get result
+                ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest();
+                resultOfTermRequest.gameId = termType;
+                resultOfTermRequest.token = token;
+                resultOfTermRequest.type = Constants.TERM_HAS_RESULT_TYPE;
+                resultOfTermRequest.order = Constants.DECS;
+                resultOfTermRequest.fromDate = model.fromDate;
+                resultOfTermRequest.toDate = model.toDate;
+                resultOfTermRequest.rowsOnPage = Constants.ROW_ON_PAGE;
+                resultOfTermRequest.seqPage = "1";
+                resultOfTermRequest.id = Constants.ALL_DATA;
+
+                ResultOfTermResponse result = api.GetResultOfTermApi(
+                    configuration,
+                    resultOfTermRequest
+                );
+                if (result.responseCode == Code.SESSION_EXPIRED)
+                {
+                    return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+                }
+                else if (result.responseCode == Code.SUCCESS)
+                {
+                    model.listTerm = result.listTerm != null ? result.listTerm : new List<Term>();
+                    model.termType = termType;
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return PartialView("TermResultHistory", model);
+        }
+
+        public IActionResult Privacy()
+        {
+            return View();
+        }
+
+        public IActionResult Update()
+        {
+            return View();
+        }
+
+        public IActionResult FAQ()
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            HomeFAQ_ViewModel model = new HomeFAQ_ViewModel();
+            return View("FAQ", model);
+        }
+
+        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
+        public IActionResult Error()
+        {
+            return View(
+                new ErrorViewModel
+                {
+                    RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier
+                }
+            );
+        }
+    }
+}

+ 29 - 0
website_natcash/Controllers/PartialController.cs

@@ -0,0 +1,29 @@
+using LotteryWebApp.Models;
+using Microsoft.AspNetCore.Mvc;
+
+namespace LotteryWebApp.Controllers
+{
+    public class PartialController : Controller
+    {
+        public IActionResult Inform(string message)
+        {
+            PartialInform_ViewModel model = new PartialInform_ViewModel();
+            model.message = message;
+            return PartialView("Inform", model);
+        }
+
+        public IActionResult OTP(string content, string confirmFunc, string resentFunc, string cancelFunc)
+        {
+            PartialTransaction_ViewModel model = new PartialTransaction_ViewModel();
+            model.content = content;
+            model.confirmFunc = confirmFunc;
+            model.resentFunc = resentFunc;
+            model.cancelFunc = cancelFunc;
+            return PartialView("OTP", model);
+        }
+        public IActionResult Language()
+        {
+            return PartialView("Language");
+        }
+    }
+}

+ 231 - 0
website_natcash/Controllers/ProfileController.cs

@@ -0,0 +1,231 @@
+using LotteryWebApp.Common;
+using LotteryWebApp.Extensions;
+using LotteryWebApp.Languages;
+using LotteryWebApp.Models;
+using LotteryWebApp.Service;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using System;
+using System.Globalization;
+
+namespace LotteryWebApp.Controllers
+{
+    [AutoValidateAntiforgeryToken]
+    public class ProfileController : BaseController
+    {
+        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
+
+        IConfiguration configuration;
+        private readonly IWebHostEnvironment webHostEnvironment;
+        APIFunctions api = new APIFunctions();
+
+        public ProfileController(IConfiguration _configuration, IWebHostEnvironment hostEnvironment)
+        {
+            configuration = _configuration;
+            webHostEnvironment = hostEnvironment;
+        }
+
+        public String GetParameter(String key)
+        {
+            return configuration.GetSection(key).Value;
+        }
+
+
+        public IActionResult Index()
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            HttpContext.Session.SetComplexData("navigator", Constants.PROFILE_NAVIGATOR);
+            ProfileViewModel model = new ProfileViewModel();
+            try
+            {
+                model.channel = GetParameter(Constants.CHANNEL);
+                // load msisdn
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String token = HttpContext.Session.GetComplexData<String>("token");
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                if (profile == null)
+                {
+                    // load profile
+                    UserGetProfileRequest request = new UserGetProfileRequest();
+                    request.users = msisdn;
+                    request.token = token;
+                    Profile profileGet = api.UserLoadProfileApi(configuration, request);
+                    if (profileGet.status == Code.SESSION_EXPIRED)
+                    {
+                        return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+                    }
+                    model.profile = profileGet;
+                    HttpContext.Session.SetComplexData("profile", profileGet);
+                }
+                else
+                {
+                    model.profile = profile;
+                }
+                UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
+                if (profile == null)
+                {
+                    // load profile
+                    UserStatusRequest userStatusRequest = new UserStatusRequest();
+                    userStatusRequest.users = msisdn;
+                    userStatusRequest.token = token;
+
+                    UserStatus userStatusResponse = api.GetUserStatusApi(configuration, userStatusRequest);
+                    if (userStatusResponse.status == Code.SESSION_EXPIRED)
+                    {
+                        return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+                    }
+                    model.userStatus = userStatusResponse;
+                    HttpContext.Session.SetComplexData("userStatus", userStatusResponse);
+                }
+                else
+                {
+                    model.userStatus = userStatus;
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return View(model);
+        }
+
+        public IActionResult ChangePassword(string code)
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            ProfileChangePassword_ViewModel model = new ProfileChangePassword_ViewModel();
+            model.code = code;
+
+            return View(model);
+        }
+
+        [ValidateAntiForgeryToken]
+        public JsonResult ChangePassword_Action(string oldpass, string newpass, string confirmpass)
+        {
+            try
+            {
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String token = HttpContext.Session.GetComplexData<String>("token");
+
+                if (newpass != null && newpass != "" && newpass == confirmpass)
+                {
+                    // update 
+                    RegisterRequest registerRequest = new RegisterRequest();
+                    registerRequest.Msisdn = msisdn;
+                    registerRequest.Users = msisdn;
+                    registerRequest.pass = oldpass;
+                    registerRequest.Passnew = newpass;
+                    registerRequest.token = token;
+
+                    RegisterResponse updateProfile = api.UserChangePasswordApi(configuration, registerRequest);
+                    return Json(new
+                    {
+                        code = int.Parse(updateProfile.status),
+                        message = GetLangFromCode(updateProfile.status),
+                    });
+                }
+                else
+                {
+                    return Json(new
+                    {
+                        code = Code.FAILURE,
+                        message = Lang.new_pass_error
+                    });
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return Json(new
+            {
+                code = Code.FAILURE,
+                message = Lang.error_happened
+            });
+        }
+
+        public IActionResult ProfileInfo(String code)
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            ProfileProfileInfo_ViewModel model = new ProfileProfileInfo_ViewModel();
+            try
+            {
+                model.code = code;
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+                model.profile = profile;
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return View(model);
+        }
+
+        [ValidateAntiForgeryToken]
+        public JsonResult ProfileInfoUpdate_Action(string fullname, string birthday)
+        {
+            try
+            {
+                String msisdn = HttpContext.Session.GetComplexData<String>("msisdn");
+                String token = HttpContext.Session.GetComplexData<String>("token");
+                Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
+
+                String birthdayFormat = DateTime.ParseExact(birthday, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy");
+
+                // update 
+                UserUpdateProfileRequest userUpdateProfileRequest = new UserUpdateProfileRequest();
+                userUpdateProfileRequest.users = msisdn;
+                userUpdateProfileRequest.fullName = fullname;
+                userUpdateProfileRequest.birthday = birthdayFormat;
+                userUpdateProfileRequest.picture = profile.realPicture;
+
+                userUpdateProfileRequest.token = token;
+
+                UserUpdateProfileResponse updateProfile = api.UserUpdateProfileApi(configuration, userUpdateProfileRequest);
+                if (updateProfile.status == Code.SUCCESS)
+                {
+                    // update profile
+                    profile.fullName = fullname;
+                    profile.birthday = birthdayFormat;
+                    HttpContext.Session.SetComplexData("profile", profile);
+
+                }
+                return Json(new
+                {
+                    code = int.Parse(updateProfile.status),
+                    message = GetLangFromCode(updateProfile.status)
+                });
+            }
+            catch (Exception ex)
+            {
+                log.Error(ex);
+            }
+            return Json(new
+            {
+                code = Code.FAILURE,
+                message = Lang.error_happened
+            });
+        }
+
+        public IActionResult HowToPlay(string termType)
+        {
+            if (!CheckAuthToken())
+            {
+                return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
+            }
+            ProfileHowToPlay_ViewModel model = new ProfileHowToPlay_ViewModel();
+            model.termType = termType != null ? termType : Constants.BOLET_CODE;
+            return View(model);
+        }
+
+    }
+}

+ 31 - 0
website_natcash/Extensions/ConfigAction.cs

@@ -0,0 +1,31 @@
+using Microsoft.AspNetCore.Mvc.Filters;
+using Microsoft.Extensions.Configuration;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LotteryWebApp.Extensions
+{
+    public class ConfigAction : IAsyncActionFilter
+    {
+        private MyConfig _options;
+        public ConfigAction(IConfiguration configuration)
+        {
+
+            _options = new MyConfig();
+            configuration.Bind(_options);
+        }
+
+        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
+        {
+            ((Microsoft.AspNetCore.Mvc.Controller)context.Controller).ViewBag.MyConfig = _options;
+            await next();
+        }
+    }
+
+    public class MyConfig
+    {
+        public string MyValue { get; set; }
+    }
+}

+ 62 - 0
website_natcash/Extensions/Encrytion.cs

@@ -0,0 +1,62 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Security.Cryptography;
+using System.Threading.Tasks;
+using System.Xml;
+
+namespace NcGamesWebView.Extensions
+{
+    public static class Encryption
+    {
+        public static void FromXmlFile(this RSA rsa, string xmlFilePath)
+        {
+            RSAParameters parameters = new RSAParameters();
+
+            XmlDocument xmlDoc = new XmlDocument();
+            xmlDoc.LoadXml(File.ReadAllText(xmlFilePath));
+
+            if (xmlDoc.DocumentElement.Name.Equals("RSAKeyValue"))
+            {
+                foreach (XmlNode node in xmlDoc.DocumentElement.ChildNodes)
+                {
+                    switch (node.Name)
+                    {
+                        case "Modulus": parameters.Modulus = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
+                        case "Exponent": parameters.Exponent = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
+                        case "P": parameters.P = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
+                        case "Q": parameters.Q = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
+                        case "DP": parameters.DP = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
+                        case "DQ": parameters.DQ = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
+                        case "InverseQ": parameters.InverseQ = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
+                        case "D": parameters.D = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
+                    }
+                }
+            }
+            else
+            {
+                throw new Exception("Invalid XML RSA key.");
+            }
+
+            rsa.ImportParameters(parameters);
+        }
+
+        public static void ToXmlFile(this RSA rsa, bool includePrivateParameters, string xmlFilePath)
+        {
+            RSAParameters parameters = rsa.ExportParameters(includePrivateParameters);
+
+            File.WriteAllText(xmlFilePath,
+                string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
+                  parameters.Modulus != null ? Convert.ToBase64String(parameters.Modulus) : null,
+                  parameters.Exponent != null ? Convert.ToBase64String(parameters.Exponent) : null,
+                  parameters.P != null ? Convert.ToBase64String(parameters.P) : null,
+                  parameters.Q != null ? Convert.ToBase64String(parameters.Q) : null,
+                  parameters.DP != null ? Convert.ToBase64String(parameters.DP) : null,
+                  parameters.DQ != null ? Convert.ToBase64String(parameters.DQ) : null,
+                  parameters.InverseQ != null ? Convert.ToBase64String(parameters.InverseQ) : null,
+                  parameters.D != null ? Convert.ToBase64String(parameters.D) : null)
+                  );
+        }
+    }
+}

+ 29 - 0
website_natcash/Extensions/RewriteSubdomainRule.cs

@@ -0,0 +1,29 @@
+using Microsoft.AspNetCore.Rewrite;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+
+namespace NcGamesWebView.Extensions
+{
+    public class RewriteSubdomainRule : IRule
+    {
+        public void ApplyRule(RewriteContext context)
+        {
+            var request = context.HttpContext.Request;
+            var host = request.Host.Host;
+            // Check if the host is subdomain.domain.com or subdomain.localhost for debugging
+            if (Regex.IsMatch(host, @"^[A-Za-z\d]+\.(?:[A-Za-z\d]+\.[A-Za-z\d]+|localhost)$"))
+            {
+                string subdomain = host.Split('.')[0];
+                //modifying the request path to let the routing catch the subdomain
+                context.HttpContext.Request.Path = "/subdomain/" + subdomain + context.HttpContext.Request.Path;
+                context.Result = RuleResult.ContinueRules;
+                return;
+            }
+            context.Result = RuleResult.ContinueRules;
+            return;
+        }
+    }
+}

+ 34 - 0
website_natcash/Extensions/SessionExtensions.cs

@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace LotteryWebApp.Extensions
+{
+    using System;
+    using Microsoft.AspNetCore.Http;
+    using Newtonsoft.Json;
+
+    public static class SessionExtensions
+    {
+        public static T GetComplexData<T>(this ISession session, string key)
+        {
+            var data = session.GetString(key);
+            if (data == null)
+            {
+                return default(T);
+            }
+            return JsonConvert.DeserializeObject<T>(data);
+        }
+
+        public static void SetComplexData(this ISession session, string key, object value)
+        {
+            session.SetString(key, JsonConvert.SerializeObject(value));
+        }
+
+        public static void DeleteComplexData(this ISession session, string key)
+        {
+            session.Remove(key);
+        }
+    }
+}

+ 6176 - 0
website_natcash/Languages/Lang.Designer.cs

@@ -0,0 +1,6176 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace LotteryWebApp.Languages {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    public class Lang {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Lang() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LotteryWebApp.Languages.Lang", typeof(Lang).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kontinye.
+        /// </summary>
+        public static string _continue {
+            get {
+                return ResourceManager.GetString("continue", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kont.
+        /// </summary>
+        public static string Account {
+            get {
+                return ResourceManager.GetString("Account", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo sa bloke. Tanpri tann 5:00 epi eseye anko..
+        /// </summary>
+        public static string account_lock {
+            get {
+                return ResourceManager.GetString("account_lock", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kont sa pa ekziste.
+        /// </summary>
+        public static string account_not_existed {
+            get {
+                return ResourceManager.GetString("account_not_existed", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ajoute plis.
+        /// </summary>
+        public static string add_more_order {
+            get {
+                return ResourceManager.GetString("add_more_order", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Le w sevi ak Bee Lotto, sa vle di ou dako ak kondisyon yo .
+        /// </summary>
+        public static string agree_policy_1 {
+            get {
+                return ResourceManager.GetString("agree_policy_1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi lang.
+        /// </summary>
+        public static string agree_policy_2 {
+            get {
+                return ResourceManager.GetString("agree_policy_2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ou gen yon kont deja?.
+        /// </summary>
+        public static string already_have_an_account {
+            get {
+                return ResourceManager.GetString("already_have_an_account", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Montan transfe a.
+        /// </summary>
+        public static string amount_transfered {
+            get {
+                return ResourceManager.GetString("amount_transfered", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ranpli.
+        /// </summary>
+        public static string auto_fill {
+            get {
+                return ResourceManager.GetString("auto_fill", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tounen nan paj dakey.
+        /// </summary>
+        public static string back_to_homepage {
+            get {
+                return ResourceManager.GetString("back_to_homepage", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Prensipal.
+        /// </summary>
+        public static string Basic {
+            get {
+                return ResourceManager.GetString("Basic", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kont de baz.
+        /// </summary>
+        public static string basic_account {
+            get {
+                return ResourceManager.GetString("basic_account", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kont Natcom Lotto .
+        /// </summary>
+        public static string bee_account {
+            get {
+                return ResourceManager.GetString("bee_account", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Natcom Loto se yon jwet Bolet, Maryaj ak Lotto3, rezilta jwet lotri Nouyok ak Florid. Chwazi nimewo ou yo epi tann yo anonse ganyan an. Ou ka voye lajan ou genyen an sou balans prensipal ou oswa Natcash. Bon chans!.
+        /// </summary>
+        public static string bee_loto_des {
+            get {
+                return ResourceManager.GetString("bee_loto_des", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Natcom Loto se yon nouvo sevis lotri VAS Natcom. Ou ka jwe ak USSD oswa WEB/APP. Ou kapab resevwa rezilta SMS GRATIS tou yon fwa ou voye ON nan 7777 epi ou kapab voye OFF nan 7777 pou mande pou ou pa resevwa rezilta SMS MT, oswan enfomasyon MT nan men Lotri a epi ON pou rekipere SMS MT ou.
+        ///Ou kapab tou eseye chans ou ak tiraj Lotri Natcom.
+        ///N ap ede w kreye yon kont byen fasil..
+        /// </summary>
+        public static string bee_loto_intro {
+            get {
+                return ResourceManager.GetString("bee_loto_intro", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Paryaj.
+        /// </summary>
+        public static string Bet {
+            get {
+                return ResourceManager.GetString("Bet", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Montan paryaj.
+        /// </summary>
+        public static string bet_amount {
+            get {
+                return ResourceManager.GetString("bet_amount", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Gwo.
+        /// </summary>
+        public static string Big {
+            get {
+                return ResourceManager.GetString("Big", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Gwo Pitti.
+        /// </summary>
+        public static string bigsmall {
+            get {
+                return ResourceManager.GetString("bigsmall", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Bill Order.
+        /// </summary>
+        public static string bill_order {
+            get {
+                return ResourceManager.GetString("bill_order", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Bolet.
+        /// </summary>
+        public static string bolet {
+            get {
+                return ResourceManager.GetString("bolet", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;span style=&quot;white-space:pre-wrap;&quot;&gt;1. Bolet is a game in Bee Lotto. Customers choose any 2 numbers from 00 - 99. The minimum ticket value is 1 HTG, the maximum is 1,000 HTG. Bolet&apos;s results are based on the NUMBER and WIN4 results of the New York lottery. &lt;br&gt;&lt;br&gt;2. Bolet includes 3 prizes:&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Lot 1: includes the numbers in the 2nd and 3rd positions of the NUMBER draw. Winning ratio: buy 1 HTG win 50 HTG&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Lot 2: includes the numbers in the 1st and 2nd positi [rest of string was truncated]&quot;;.
+        /// </summary>
+        public static string bolet_content {
+            get {
+                return ResourceManager.GetString("bolet_content", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;span style=white-space:pre-wrap;&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 20px;&quot;&gt;How to play Bolet&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;.
+        /// </summary>
+        public static string bolet_how_to_play {
+            get {
+                return ResourceManager.GetString("bolet_how_to_play", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ou achte tike natcom Loto ak sikse..
+        /// </summary>
+        public static string brought_success {
+            get {
+                return ResourceManager.GetString("brought_success", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Achte.
+        /// </summary>
+        public static string buy {
+            get {
+                return ResourceManager.GetString("buy", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Bolet .
+        /// </summary>
+        public static string buy_bolet {
+            get {
+                return ResourceManager.GetString("buy_bolet", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Loto3.
+        /// </summary>
+        public static string buy_lotto3 {
+            get {
+                return ResourceManager.GetString("buy_lotto3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Maryaj.
+        /// </summary>
+        public static string buy_maryaj {
+            get {
+                return ResourceManager.GetString("buy_maryaj", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tike.
+        /// </summary>
+        public static string buy_ticket {
+            get {
+                return ResourceManager.GetString("buy_ticket", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tike.
+        /// </summary>
+        public static string buy_ticket1 {
+            get {
+                return ResourceManager.GetString("buy_ticket1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Le.
+        /// </summary>
+        public static string buy_time {
+            get {
+                return ResourceManager.GetString("buy_time", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Achte.
+        /// </summary>
+        public static string buying {
+            get {
+                return ResourceManager.GetString("buying", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kod sa pa ekziste.
+        /// </summary>
+        public static string buying_code_not_existed {
+            get {
+                return ResourceManager.GetString("buying_code_not_existed", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Apel.
+        /// </summary>
+        public static string call {
+            get {
+                return ResourceManager.GetString("call", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Anile.
+        /// </summary>
+        public static string cancel {
+            get {
+                return ResourceManager.GetString("cancel", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Lajan Kach.
+        /// </summary>
+        public static string cash_agent {
+            get {
+                return ResourceManager.GetString("cash_agent", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chanje lang.
+        /// </summary>
+        public static string change_language {
+            get {
+                return ResourceManager.GetString("change_language", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chanje Modpas.
+        /// </summary>
+        public static string change_password {
+            get {
+                return ResourceManager.GetString("change_password", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chanel .
+        /// </summary>
+        public static string channel_buy {
+            get {
+                return ResourceManager.GetString("channel_buy", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tanpri verifye nimewo a oswa modpas la.
+        /// </summary>
+        public static string check_phone_or_password {
+            get {
+                return ResourceManager.GetString("check_phone_or_password", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi nimewo.
+        /// </summary>
+        public static string choose_your_number {
+            get {
+                return ResourceManager.GetString("choose_your_number", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Efase.
+        /// </summary>
+        public static string clean_all {
+            get {
+                return ResourceManager.GetString("clean_all", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Femen.
+        /// </summary>
+        public static string close {
+            get {
+                return ResourceManager.GetString("close", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konfime.
+        /// </summary>
+        public static string confirm {
+            get {
+                return ResourceManager.GetString("confirm", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konfime OTP.
+        /// </summary>
+        public static string confirm_otp {
+            get {
+                return ResourceManager.GetString("confirm_otp", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konfiman peyman.
+        /// </summary>
+        public static string confirm_payment_1 {
+            get {
+                return ResourceManager.GetString("confirm_payment_1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to HTG pou achte.
+        /// </summary>
+        public static string confirm_payment_2 {
+            get {
+                return ResourceManager.GetString("confirm_payment_2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Fre, Tike.
+        /// </summary>
+        public static string confirm_payment_3 {
+            get {
+                return ResourceManager.GetString("confirm_payment_3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to HTG, Le tiraj.
+        /// </summary>
+        public static string confirm_payment_4 {
+            get {
+                return ResourceManager.GetString("confirm_payment_4", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tanpri antre OTP.
+        /// </summary>
+        public static string confirm_payment_5 {
+            get {
+                return ResourceManager.GetString("confirm_payment_5", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konfime tranzaksyon .
+        /// </summary>
+        public static string confirm_transaction {
+            get {
+                return ResourceManager.GetString("confirm_transaction", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konfime transfe.
+        /// </summary>
+        public static string confirm_transfer_1 {
+            get {
+                return ResourceManager.GetString("confirm_transfer_1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to  HTG kont lotri a .
+        /// </summary>
+        public static string confirm_transfer_2 {
+            get {
+                return ResourceManager.GetString("confirm_transfer_2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Fre 0 HTG. Tanpri antre OTP:.
+        /// </summary>
+        public static string confirm_transfer_3 {
+            get {
+                return ResourceManager.GetString("confirm_transfer_3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konfime nouvo modpas .
+        /// </summary>
+        public static string confirm_your_new_password {
+            get {
+                return ResourceManager.GetString("confirm_your_new_password", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kontakte nou.
+        /// </summary>
+        public static string contact_us {
+            get {
+                return ResourceManager.GetString("contact_us", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kontni.
+        /// </summary>
+        public static string content {
+            get {
+                return ResourceManager.GetString("content", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kreye nouvo kont.
+        /// </summary>
+        public static string create_new_account {
+            get {
+                return ResourceManager.GetString("create_new_account", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kreyol.
+        /// </summary>
+        public static string creole {
+            get {
+                return ResourceManager.GetString("creole", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Dat ou achte.
+        /// </summary>
+        public static string date_purchase {
+            get {
+                return ResourceManager.GetString("date_purchase", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Dat nesans.
+        /// </summary>
+        public static string dateOfBirth {
+            get {
+                return ResourceManager.GetString("dateOfBirth", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Jou.
+        /// </summary>
+        public static string days {
+            get {
+                return ResourceManager.GetString("days", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Detay peyman.
+        /// </summary>
+        public static string detail_of_payment {
+            get {
+                return ResourceManager.GetString("detail_of_payment", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Detay.
+        /// </summary>
+        public static string details {
+            get {
+                return ResourceManager.GetString("details", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Dat tiraj.
+        /// </summary>
+        public static string draw_date {
+            get {
+                return ResourceManager.GetString("draw_date", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Le tiraj.
+        /// </summary>
+        public static string draw_time {
+            get {
+                return ResourceManager.GetString("draw_time", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tiraj.
+        /// </summary>
+        public static string drawn {
+            get {
+                return ResourceManager.GetString("drawn", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Angle.
+        /// </summary>
+        public static string english {
+            get {
+                return ResourceManager.GetString("english", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Antre montan 1 - 10,000 HTG.
+        /// </summary>
+        public static string enter_amount {
+            get {
+                return ResourceManager.GetString("enter_amount", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Antre montan ( Maksimon 5000HTG/tranzaksyon).
+        /// </summary>
+        public static string enter_amount_1_1000 {
+            get {
+                return ResourceManager.GetString("enter_amount_1_1000", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Antre montan.
+        /// </summary>
+        public static string enter_amount1 {
+            get {
+                return ResourceManager.GetString("enter_amount1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Antre Dat Nesans.
+        /// </summary>
+        public static string enter_birthday {
+            get {
+                return ResourceManager.GetString("enter_birthday", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Antre 2 chif (00 a 99).
+        /// </summary>
+        public static string enter_digit_2 {
+            get {
+                return ResourceManager.GetString("enter_digit_2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Antre 2 chif (000 a 999).
+        /// </summary>
+        public static string enter_digit_3 {
+            get {
+                return ResourceManager.GetString("enter_digit_3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Antre 2 chif (0000 a 9999).
+        /// </summary>
+        public static string enter_digit_4 {
+            get {
+                return ResourceManager.GetString("enter_digit_4", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Antre lajan.
+        /// </summary>
+        public static string enter_money {
+            get {
+                return ResourceManager.GetString("enter_money", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Antre tout non ou .
+        /// </summary>
+        public static string enter_name {
+            get {
+                return ResourceManager.GetString("enter_name", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Antre OTP .
+        /// </summary>
+        public static string enter_otp {
+            get {
+                return ResourceManager.GetString("enter_otp", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tanpri antre OTP a pou konekte.
+        /// </summary>
+        public static string enter_otp_to_login {
+            get {
+                return ResourceManager.GetString("enter_otp_to_login", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Antre 6 chif modpas la.
+        /// </summary>
+        public static string enter_password {
+            get {
+                return ResourceManager.GetString("enter_password", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Antre yon nonb.
+        /// </summary>
+        public static string enter_phone_number {
+            get {
+                return ResourceManager.GetString("enter_phone_number", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Mete yon nouvo modpas.
+        /// </summary>
+        public static string enter_your_new_password {
+            get {
+                return ResourceManager.GetString("enter_your_new_password", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Mete ansye modpas la.
+        /// </summary>
+        public static string enter_your_old_password {
+            get {
+                return ResourceManager.GetString("enter_your_old_password", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Gen yon ere. Tanpri eseye anko.
+        /// </summary>
+        public static string error_happened {
+            get {
+                return ResourceManager.GetString("error_happened", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Gen yon ere. Tanpri eseye anko.
+        /// </summary>
+        public static string error_happened1 {
+            get {
+                return ResourceManager.GetString("error_happened1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pe.
+        /// </summary>
+        public static string Even {
+            get {
+                return ResourceManager.GetString("Even", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Echek.
+        /// </summary>
+        public static string fail {
+            get {
+                return ResourceManager.GetString("fail", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Echek.
+        /// </summary>
+        public static string fail_exclamation {
+            get {
+                return ResourceManager.GetString("fail_exclamation", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to FAQ.
+        /// </summary>
+        public static string faq {
+            get {
+                return ResourceManager.GetString("faq", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi 10 nimewo ant 1 ak 80 oswa chwazi opsyon Pick Rapid la. Achte tike w epi tann tiraj la..
+        /// </summary>
+        public static string faq_a1 {
+            get {
+                return ResourceManager.GetString("faq_a1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tiraj yo fet chak jou a 8:30 p.m. Vann tike yo sispann a 8:00 p.m..
+        /// </summary>
+        public static string faq_a2 {
+            get {
+                return ResourceManager.GetString("faq_a2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chans pou genyen premye pri Pick 10 la se 1 sou 8,911,711..
+        /// </summary>
+        public static string faq_a3 {
+            get {
+                return ResourceManager.GetString("faq_a3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi 10 nimewo ant 1 ak 80 oswa chwazi opsyon Pick Rapid la. Achte tike w epi tann tiraj la..
+        /// </summary>
+        public static string faq_millions_a1 {
+            get {
+                return ResourceManager.GetString("faq_millions_a1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tiraj yo fet chak jou a 8:30 p.m. Vann tike yo sispann a 8:00 p.m..
+        /// </summary>
+        public static string faq_millions_a2 {
+            get {
+                return ResourceManager.GetString("faq_millions_a2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chans pou genyen premye pri Pick 10 la se 1 sou 8,911,711..
+        /// </summary>
+        public static string faq_millions_a3 {
+            get {
+                return ResourceManager.GetString("faq_millions_a3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Plis nimewo ou jwenn, se plis pri w ap genyen! &lt;br/&gt; Nan PICK 10, yo konpare 10 nimewo ou chwazi yo ak 10 nimewo rezilta ofisyel yo. Ou genyen le ou jwenn 6 nimewo oswa plis — e menm si ou pa jwenn yon nimewo, wap jwenn yon rekonpans !&lt;br/&gt;&lt;br/&gt; 🎯 Jwenn 10 nimewo → Genyen Jakpot la&lt;br/&gt; 🔥 Jwenn 9 nimewo → Genyen 12,000 HTG&lt;br/&gt; 💰 Jwenn 8 nimewo → Genyen 600 HTG&lt;br/&gt; ⭐ Jwenn 7 nimewo → Genyen 160 HTG&lt;br/&gt; 🎉 Jwenn 6 nimewo → Genyen 20 HTG&lt;br/&gt; 🎁 Jwenn 0 nimewo → Genyen 5 HTG&lt;br/ [rest of string was truncated]&quot;;.
+        /// </summary>
+        public static string faq_millions_a4 {
+            get {
+                return ResourceManager.GetString("faq_millions_a4", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi Gwo (41–80) oubyen Ti (01–40). Achte tike ou anvan 8e diswa epi tann tiraj la a 8e edmi diswa..
+        /// </summary>
+        public static string faq_millions_a5 {
+            get {
+                return ResourceManager.GetString("faq_millions_a5", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Apre yo fin tire 20 nimewo, sistem nan verifye konbyen nimewo ki nan chak seri: &lt;br/&gt; - Si gen 13 nimewo oswa plis ant 41 ak 80, rezilta a GWO.&lt;br/&gt; - Si gen 13 nimewo oswa plis ant 01 ak 40, rezilta a TI.&lt;br/&gt;&lt;br/&gt; Si opsyon ou chwazi a koresponn ak rezilta ofisyel la, ou genyen..
+        /// </summary>
+        public static string faq_millions_a6 {
+            get {
+                return ResourceManager.GetString("faq_millions_a6", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi Pe oubyen Enpe. Achte tike ou anvan 8e diswa epi tann tiraj la a 8e edmi diswa..
+        /// </summary>
+        public static string faq_millions_a7 {
+            get {
+                return ResourceManager.GetString("faq_millions_a7", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan pouw jwe Pick 10?.
+        /// </summary>
+        public static string faq_millions_q1 {
+            get {
+                return ResourceManager.GetString("faq_millions_q1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ki le tiraj Pick 10 yo ap fet?.
+        /// </summary>
+        public static string faq_millions_q2 {
+            get {
+                return ResourceManager.GetString("faq_millions_q2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to faq_millions_q3.
+        /// </summary>
+        public static string faq_millions_q3 {
+            get {
+                return ResourceManager.GetString("faq_millions_q3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konbyen nimewo ki Match mwen bezwen pou m genyen yon pri?.
+        /// </summary>
+        public static string faq_millions_q4 {
+            get {
+                return ResourceManager.GetString("faq_millions_q4", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan pou m jwe Gwo / Ti a?.
+        /// </summary>
+        public static string faq_millions_q5 {
+            get {
+                return ResourceManager.GetString("faq_millions_q5", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan pou m genyen nan jwet la gwo/ti ?.
+        /// </summary>
+        public static string faq_millions_q6 {
+            get {
+                return ResourceManager.GetString("faq_millions_q6", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to ❓ Kijan pou m jwe jwet Pe/Enpe a?.
+        /// </summary>
+        public static string faq_millions_q7 {
+            get {
+                return ResourceManager.GetString("faq_millions_q7", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan pouw jwe Pick 10?.
+        /// </summary>
+        public static string faq_q1 {
+            get {
+                return ResourceManager.GetString("faq_q1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ki le tiraj Pick 10 yo ap fet?.
+        /// </summary>
+        public static string faq_q2 {
+            get {
+                return ResourceManager.GetString("faq_q2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ki chans ki genyen pou genyen gwo pri a?.
+        /// </summary>
+        public static string faq_q3 {
+            get {
+                return ResourceManager.GetString("faq_q3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Plis nimewo ou jwenn, se plis pri w ap genyen! &lt;br/&gt; Nan PICK 10, yo konpare 10 nimewo ou chwazi yo ak 10 nimewo rezilta ofisyel yo. Ou genyen le ou jwenn 6 nimewo oswa plis — e menm si ou pa jwenn yon nimewo, wap jwenn yon rekonpans !&lt;br/&gt;&lt;br/&gt; 🎯 Jwenn 10 nimewo → Genyen Jakpot la&lt;br/&gt; 🔥 Jwenn 9 nimewo → Genyen 12,000 HTG&lt;br/&gt; 💰 Jwenn 8 nimewo → Genyen 600 HTG&lt;br/&gt; ⭐ Jwenn 7 nimewo → Genyen 160 HTG&lt;br/&gt; 🎉 Jwenn 6 nimewo → Genyen 20 HTG&lt;br/&gt; 🎁 Jwenn 0 nimewo → Genyen 5 HTG&lt;br/ [rest of string was truncated]&quot;;.
+        /// </summary>
+        public static string faq_v2_a4 {
+            get {
+                return ResourceManager.GetString("faq_v2_a4", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi Gwo (41–80) oubyen Ti (01–40). Achte tike ou anvan 8e diswa epi tann tiraj la a 8e edmi diswa..
+        /// </summary>
+        public static string faq_v2_a5 {
+            get {
+                return ResourceManager.GetString("faq_v2_a5", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Apre yo fin tire 20 nimewo, sistem nan verifye konbyen nimewo ki nan chak seri: &lt;br/&gt; - Si gen 13 nimewo oswa plis ant 41 ak 80, rezilta a GWO.&lt;br/&gt; - Si gen 13 nimewo oswa plis ant 01 ak 40, rezilta a TI.&lt;br/&gt;&lt;br/&gt; Si opsyon ou chwazi a koresponn ak rezilta ofisyel la, ou genyen..
+        /// </summary>
+        public static string faq_v2_a6 {
+            get {
+                return ResourceManager.GetString("faq_v2_a6", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi Pe oubyen Enpe. Achte tike ou anvan 8e diswa epi tann tiraj la a 8e edmi diswa..
+        /// </summary>
+        public static string faq_v2_a7 {
+            get {
+                return ResourceManager.GetString("faq_v2_a7", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 
+        ///Apre yo fin tire 20 nimewo, sistem nan konte konbyen nimewo ki enpe oswa pe: &lt;br/&gt; - Si 15 nimewo oswa plis enpe, rezilta a se ENPE.&lt;br/&gt; - Si 15 nimewo oswa plis pe, rezilta a se PE.&lt;br/&gt;&lt;br/&gt; Si opsyon ou chwazi a koresponn ak rezilta ofisel la, ou genyen..
+        /// </summary>
+        public static string faq_v2_a8 {
+            get {
+                return ResourceManager.GetString("faq_v2_a8", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konbyen nimewo ki Match mwen bezwen pou m genyen yon pri?.
+        /// </summary>
+        public static string faq_v2_q4 {
+            get {
+                return ResourceManager.GetString("faq_v2_q4", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan pou m jwe Gwo / Ti a?.
+        /// </summary>
+        public static string faq_v2_q5 {
+            get {
+                return ResourceManager.GetString("faq_v2_q5", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan pou m genyen nan jwet la gwo/ti ?.
+        /// </summary>
+        public static string faq_v2_q6 {
+            get {
+                return ResourceManager.GetString("faq_v2_q6", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan pou m jwe jwet Pe/Enpe a?.
+        /// </summary>
+        public static string faq_v2_q7 {
+            get {
+                return ResourceManager.GetString("faq_v2_q7", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan pou m genyen nan jwet Pe/Enpe a?.
+        /// </summary>
+        public static string faq_v2_q8 {
+            get {
+                return ResourceManager.GetString("faq_v2_q8", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Fre.
+        /// </summary>
+        public static string fee {
+            get {
+                return ResourceManager.GetString("fee", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Fre transfe.
+        /// </summary>
+        public static string fee_tranfer {
+            get {
+                return ResourceManager.GetString("fee_tranfer", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tanpri antre Modpas ou .
+        /// </summary>
+        public static string fill_password {
+            get {
+                return ResourceManager.GetString("fill_password", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tanpri antre nimewo telefon ou .
+        /// </summary>
+        public static string fill_phone {
+            get {
+                return ResourceManager.GetString("fill_phone", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tanpri antre nimewo ou .
+        /// </summary>
+        public static string fill_your_number {
+            get {
+                return ResourceManager.GetString("fill_your_number", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Lotri Florida.
+        /// </summary>
+        public static string florida_lottery {
+            get {
+                return ResourceManager.GetString("florida_lottery", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Blye modpas.
+        /// </summary>
+        public static string forgot_password {
+            get {
+                return ResourceManager.GetString("forgot_password", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Gratis.
+        /// </summary>
+        public static string free {
+            get {
+                return ResourceManager.GetString("free", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Achte kounye a.
+        /// </summary>
+        public static string free_ticket_buy_now {
+            get {
+                return ResourceManager.GetString("free_ticket_buy_now", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to PLIS CHANS PWOCHEN FWA!.
+        /// </summary>
+        public static string free_ticket_error_43_badge {
+            get {
+                return ResourceManager.GetString("free_ticket_error_43_badge", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Yo bay tikè gratis chak jou. Pa rate chans ou demen!.
+        /// </summary>
+        public static string free_ticket_error_43_daily_description {
+            get {
+                return ResourceManager.GetString("free_ticket_error_43_daily_description", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nouvo chans chak jou!.
+        /// </summary>
+        public static string free_ticket_error_43_daily_title {
+            get {
+                return ResourceManager.GetString("free_ticket_error_43_daily_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ou pa t resevwa yon tikè gratis jodi a. Retounen demen epi eseye chans ou ankò..
+        /// </summary>
+        public static string free_ticket_error_43_description {
+            get {
+                return ResourceManager.GetString("free_ticket_error_43_description", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Achte yon tikè kounye a pou chans genyen jiska 30,000,000 HTG!.
+        /// </summary>
+        public static string free_ticket_error_43_footer {
+            get {
+                return ResourceManager.GetString("free_ticket_error_43_footer", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Bòn chans pwochen fwa!.
+        /// </summary>
+        public static string free_ticket_error_43_title {
+            get {
+                return ResourceManager.GetString("free_ticket_error_43_title", resourceCulture);
+            }
+        }
+
+        public static string free_ticket_error_45_description {
+            get {
+                return ResourceManager.GetString("free_ticket_error_45_description", resourceCulture);
+            }
+        }
+
+        public static string free_ticket_error_45_footer {
+            get {
+                return ResourceManager.GetString("free_ticket_error_45_footer", resourceCulture);
+            }
+        }
+
+        public static string free_ticket_error_45_next_primary {
+            get {
+                return ResourceManager.GetString("free_ticket_error_45_next_primary", resourceCulture);
+            }
+        }
+
+        public static string free_ticket_error_45_next_secondary {
+            get {
+                return ResourceManager.GetString("free_ticket_error_45_next_secondary", resourceCulture);
+            }
+        }
+
+        public static string free_ticket_error_45_next_title {
+            get {
+                return ResourceManager.GetString("free_ticket_error_45_next_title", resourceCulture);
+            }
+        }
+
+        public static string free_ticket_error_45_ticket_free {
+            get {
+                return ResourceManager.GetString("free_ticket_error_45_ticket_free", resourceCulture);
+            }
+        }
+
+        public static string free_ticket_error_45_ticket_sold_out {
+            get {
+                return ResourceManager.GetString("free_ticket_error_45_ticket_sold_out", resourceCulture);
+            }
+        }
+
+        public static string free_ticket_error_45_ticket_tickets {
+            get {
+                return ResourceManager.GetString("free_ticket_error_45_ticket_tickets", resourceCulture);
+            }
+        }
+
+        public static string free_ticket_error_45_title {
+            get {
+                return ResourceManager.GetString("free_ticket_error_45_title", resourceCulture);
+            }
+        }
+
+        public static string free_ticket_error_45_title_emphasis {
+            get {
+                return ResourceManager.GetString("free_ticket_error_45_title_emphasis", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to TIKÈ GRATIS.
+        /// </summary>
+        public static string free_ticket_success_badge {
+            get {
+                return ResourceManager.GetString("free_ticket_success_badge", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Sèvi avè l kounye a pou chans genyen jiska.
+        /// </summary>
+        public static string free_ticket_success_chance {
+            get {
+                return ResourceManager.GetString("free_ticket_success_chance", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pita.
+        /// </summary>
+        public static string free_ticket_success_later {
+            get {
+                return ResourceManager.GetString("free_ticket_success_later", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ou resevwa.
+        /// </summary>
+        public static string free_ticket_success_received {
+            get {
+                return ResourceManager.GetString("free_ticket_success_received", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 1 Tikè Millions GRATIS..
+        /// </summary>
+        public static string free_ticket_success_ticket {
+            get {
+                return ResourceManager.GetString("free_ticket_success_ticket", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Felisitasyon!.
+        /// </summary>
+        public static string free_ticket_success_title {
+            get {
+                return ResourceManager.GetString("free_ticket_success_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Sèvi ak tikè a.
+        /// </summary>
+        public static string free_ticket_success_use {
+            get {
+                return ResourceManager.GetString("free_ticket_success_use", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tikè gratis la valab sèlman pou tiraj jodi a..
+        /// </summary>
+        public static string free_ticket_success_validity {
+            get {
+                return ResourceManager.GetString("free_ticket_success_validity", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to TIKÈ GRATIS.
+        /// </summary>
+        public static string free_ticket_waiting_badge {
+            get {
+                return ResourceManager.GetString("free_ticket_waiting_badge", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ou gen 1 tikè Millions gratis ki poko itilize. Sèvi avè l pou tiraj jodi a..
+        /// </summary>
+        public static string free_ticket_waiting_description {
+            get {
+                return ResourceManager.GetString("free_ticket_waiting_description", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tikè GRATIS ou ap tann ou!.
+        /// </summary>
+        public static string free_ticket_waiting_title {
+            get {
+                return ResourceManager.GetString("free_ticket_waiting_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tikè gratis la valab sèlman pou tiraj jodi a. Pa bliye sèvi avè l!.
+        /// </summary>
+        public static string free_ticket_waiting_validity {
+            get {
+                return ResourceManager.GetString("free_ticket_waiting_validity", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Soti nan.
+        /// </summary>
+        public static string from {
+            get {
+                return ResourceManager.GetString("from", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Transfere sou nimewo ou .
+        /// </summary>
+        public static string from_your_number {
+            get {
+                return ResourceManager.GetString("from_your_number", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Non konple a pa bon.
+        /// </summary>
+        public static string fullname_not_valid {
+            get {
+                return ResourceManager.GetString("fullname_not_valid", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kòd pwomosyon an pa valid.
+        /// </summary>
+        public static string get_free_ticket_code_38 {
+            get {
+                return ResourceManager.GetString("get_free_ticket_code_38", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kòd pwomosyon an deja itilize.
+        /// </summary>
+        public static string get_free_ticket_code_39 {
+            get {
+                return ResourceManager.GetString("get_free_ticket_code_39", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pwomosyon an pa aktif.
+        /// </summary>
+        public static string get_free_ticket_code_40 {
+            get {
+                return ResourceManager.GetString("get_free_ticket_code_40", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Demann tikè a pa egziste.
+        /// </summary>
+        public static string get_free_ticket_code_41 {
+            get {
+                return ResourceManager.GetString("get_free_ticket_code_41", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tranzaksyon ou an pa reyisi.
+        /// </summary>
+        public static string get_free_ticket_code_42 {
+            get {
+                return ResourceManager.GetString("get_free_ticket_code_42", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Bòn chans pwochen fwa.
+        /// </summary>
+        public static string get_free_ticket_code_43 {
+            get {
+                return ResourceManager.GetString("get_free_ticket_code_43", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Yo voye kòd la.
+        /// </summary>
+        public static string get_free_ticket_code_44 {
+            get {
+                return ResourceManager.GetString("get_free_ticket_code_44", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Jwenn OTP.
+        /// </summary>
+        public static string get_otp1 {
+            get {
+                return ResourceManager.GetString("get_otp1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Komanse.
+        /// </summary>
+        public static string get_started {
+            get {
+                return ResourceManager.GetString("get_started", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Gen chans pouw genyen.
+        /// </summary>
+        public static string have_chance_to_get {
+            get {
+                return ResourceManager.GetString("have_chance_to_get", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Istorik.
+        /// </summary>
+        public static string history {
+            get {
+                return ResourceManager.GetString("history", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Akey.
+        /// </summary>
+        public static string home {
+            get {
+                return ResourceManager.GetString("home", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Paj akey.
+        /// </summary>
+        public static string home_page {
+            get {
+                return ResourceManager.GetString("home_page", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Hours.
+        /// </summary>
+        public static string hours {
+            get {
+                return ResourceManager.GetString("hours", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan pouw jwe?.
+        /// </summary>
+        public static string how_to_play {
+            get {
+                return ResourceManager.GetString("how_to_play", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan pouw jwe Mega Bet?.
+        /// </summary>
+        public static string how_to_play_megabet {
+            get {
+                return ResourceManager.GetString("how_to_play_megabet", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan pouw jwe Milyone?.
+        /// </summary>
+        public static string how_to_play_millionair {
+            get {
+                return ResourceManager.GetString("how_to_play_millionair", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan pouw jwe Pick 10.
+        /// </summary>
+        public static string how_to_play_pick10 {
+            get {
+                return ResourceManager.GetString("how_to_play_pick10", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Sistem nan ap travay.
+        /// </summary>
+        public static string in_blacklist {
+            get {
+                return ResourceManager.GetString("in_blacklist", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo ou pou tiraj nan dat:.
+        /// </summary>
+        public static string in_draw_date {
+            get {
+                return ResourceManager.GetString("in_draw_date", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Koneksyon an pa bon.
+        /// </summary>
+        public static string internet_error {
+            get {
+                return ResourceManager.GetString("internet_error", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Prim Jakpot.
+        /// </summary>
+        public static string jackpot_prize {
+            get {
+                return ResourceManager.GetString("jackpot_prize", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 1.000.000 HTG jodia  !.
+        /// </summary>
+        public static string jackpot_today_htg {
+            get {
+                return ResourceManager.GetString("jackpot_today_htg", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Lang.
+        /// </summary>
+        public static string language {
+            get {
+                return ResourceManager.GetString("language", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konekte.
+        /// </summary>
+        public static string login {
+            get {
+                return ResourceManager.GetString("login", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Koneksyon echwe akoz move modpas.
+        /// </summary>
+        public static string login_fail_wrong_pass {
+            get {
+                return ResourceManager.GetString("login_fail_wrong_pass", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Dekonekte.
+        /// </summary>
+        public static string logout {
+            get {
+                return ResourceManager.GetString("logout", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to se yon jwet Bolet, Maryaj ak Lotto3, rezilta jwet lotri Nouyok ak Florid. Chwazi nimewo ou yo epi tann yo anonse ganyan an. Ou ka voye lajan ou genyen an sou balans prensipal ou oswa Natcash. Bon chans!.
+        /// </summary>
+        public static string loto_des_millions {
+            get {
+                return ResourceManager.GetString("loto_des_millions", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to se yon jwet Bolet, Maryaj ak Lotto3, rezilta jwet lotri Nouyok ak Florid. Chwazi nimewo ou yo epi tann yo anonse ganyan an. Ou ka voye lajan ou genyen an sou balans prensipal ou oswa Natcash. Bon chans!.
+        /// </summary>
+        public static string loto_des_v2 {
+            get {
+                return ResourceManager.GetString("loto_des_v2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Lotto3.
+        /// </summary>
+        public static string lotto3 {
+            get {
+                return ResourceManager.GetString("lotto3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;span style=&quot;white-space:pre-wrap;&quot;&gt;1. Bolet se yon jwet nan Bee Lotto. Kliyan yo chwazi nenpot 2 nimewo ant 00 ak 99. Vale minimom tike a se 1 HTG, maksimom nan se 1,000 HTG. Rezilta Bolet yo baze sou rezilta NIMEWO ak WIN4 nan lotri Nouyok la. &lt;br&gt;&lt;br&gt;2. Bolet gen ladan l 3 pri:&lt;br&gt;* Lo 1: gen ladan l nimewo ki nan 2yem ak 3yem pozisyon tiraj NIMEWO a. Rapo genyen: achte 1 HTG genyen 50 HTG&lt;br&gt;* Lo 2: gen ladan l nimewo ki nan 1ye ak 2yem pozisyon tiraj WIN4 la. Rapo genyen: achte 1 HTG genyen 20 HTG&lt;b [rest of string was truncated]&quot;;.
+        /// </summary>
+        public static string lotto3_content {
+            get {
+                return ResourceManager.GetString("lotto3_content", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;span style=&quot;white-space:pre-wrap;&quot;&gt;1. Bolet se yon jwet nan Bee Lotto. Kliyan yo chwazi nenpot 2 nimewo ant 00 ak 99. Vale minimom tike a se 1 HTG, maksimom nan se 1,000 HTG. Rezilta Bolet yo baze sou rezilta NIMEWO ak WIN4 nan lotri Nouyok la. &lt;br&gt;&lt;br&gt;2. Bolet gen ladan l 3 pri:&lt;br&gt;* Lo 1: gen ladan l nimewo ki nan 2yem ak 3yem pozisyon tiraj NIMEWO a. Rapo genyen: achte 1 HTG genyen 50 HTG&lt;br&gt;* Lo 2: gen ladan l nimewo ki nan 1ye ak 2yem pozisyon tiraj WIN4 la. Rapo genyen: achte 1 HTG genyen 20 HTG&lt;b [rest of string was truncated]&quot;;.
+        /// </summary>
+        public static string marya_content {
+            get {
+                return ResourceManager.GetString("marya_content", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Maryaj.
+        /// </summary>
+        public static string maryaj {
+            get {
+                return ResourceManager.GetString("maryaj", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Maksimom nimewo nan yon tike se 5. Tanpri eseye anko..
+        /// </summary>
+        public static string max_5_tickets {
+            get {
+                return ResourceManager.GetString("max_5_tickets", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Trnasfe maksimom nan se 10,000 HTG. Tanpri eseye anko..
+        /// </summary>
+        public static string max_transfer_1000HTG {
+            get {
+                return ResourceManager.GetString("max_transfer_1000HTG", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to MEGA.
+        /// </summary>
+        public static string MEGA {
+            get {
+                return ResourceManager.GetString("MEGA", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Milyone.
+        /// </summary>
+        public static string millionair {
+            get {
+                return ResourceManager.GetString("millionair", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Milyone.
+        /// </summary>
+        public static string millions {
+            get {
+                return ResourceManager.GetString("millions", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kont Bee Loto.
+        /// </summary>
+        public static string millions_account_name {
+            get {
+                return ResourceManager.GetString("millions_account_name", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ajoute tike.
+        /// </summary>
+        public static string millions_add_more_ticket {
+            get {
+                return ResourceManager.GetString("millions_add_more_ticket", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tout.
+        /// </summary>
+        public static string millions_all {
+            get {
+                return ResourceManager.GetString("millions_all", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Montan.
+        /// </summary>
+        public static string millions_amount {
+            get {
+                return ResourceManager.GetString("millions_amount", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Montan (HTG).
+        /// </summary>
+        public static string millions_amount_htg {
+            get {
+                return ResourceManager.GetString("millions_amount_htg", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Montan ou te jwe .
+        /// </summary>
+        public static string millions_amount_played {
+            get {
+                return ResourceManager.GetString("millions_amount_played", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Montan ou genyen.
+        /// </summary>
+        public static string millions_amount_won {
+            get {
+                return ResourceManager.GetString("millions_amount_won", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tounen.
+        /// </summary>
+        public static string millions_back {
+            get {
+                return ResourceManager.GetString("millions_back", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tounen nan rezilta.
+        /// </summary>
+        public static string millions_back_to_results_list {
+            get {
+                return ResourceManager.GetString("millions_back_to_results_list", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pouw pwochen milyone a .
+        /// </summary>
+        public static string millions_be_the_next_millionaire {
+            get {
+                return ResourceManager.GetString("millions_be_the_next_millionaire", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Gwo  Piti.
+        /// </summary>
+        public static string millions_big_small {
+            get {
+                return ResourceManager.GetString("millions_big_small", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kod bil.
+        /// </summary>
+        public static string millions_bill_code {
+            get {
+                return ResourceManager.GetString("millions_bill_code", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Achte Basic pick 10.
+        /// </summary>
+        public static string millions_buy_classic_pick_10 {
+            get {
+                return ResourceManager.GetString("millions_buy_classic_pick_10", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Achte tike.
+        /// </summary>
+        public static string millions_buy_ticket_label {
+            get {
+                return ResourceManager.GetString("millions_buy_ticket_label", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Anile.
+        /// </summary>
+        public static string millions_cancel {
+            get {
+                return ResourceManager.GetString("millions_cancel", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chanel.
+        /// </summary>
+        public static string millions_channel {
+            get {
+                return ResourceManager.GetString("millions_channel", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi kont.
+        /// </summary>
+        public static string millions_choose_account {
+            get {
+                return ResourceManager.GetString("millions_choose_account", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pack 10.
+        /// </summary>
+        public static string millions_classic_pick_10 {
+            get {
+                return ResourceManager.GetString("millions_classic_pick_10", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Femen.
+        /// </summary>
+        public static string millions_close {
+            get {
+                return ResourceManager.GetString("millions_close", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pyes.
+        /// </summary>
+        public static string millions_coins {
+            get {
+                return ResourceManager.GetString("millions_coins", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konfime.
+        /// </summary>
+        public static string millions_confirm {
+            get {
+                return ResourceManager.GetString("millions_confirm", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konfime.
+        /// </summary>
+        public static string millions_confirm_purchase {
+            get {
+                return ResourceManager.GetString("millions_confirm_purchase", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konfime tranzaksyon.
+        /// </summary>
+        public static string millions_confirm_transaction {
+            get {
+                return ResourceManager.GetString("millions_confirm_transaction", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kontinye.
+        /// </summary>
+        public static string millions_continue {
+            get {
+                return ResourceManager.GetString("millions_continue", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konveti.
+        /// </summary>
+        public static string millions_convert {
+            get {
+                return ResourceManager.GetString("millions_convert", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Dat ak le.
+        /// </summary>
+        public static string millions_date_and_time {
+            get {
+                return ResourceManager.GetString("millions_date_and_time", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Efase.
+        /// </summary>
+        public static string millions_delete {
+            get {
+                return ResourceManager.GetString("millions_delete", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Detay.
+        /// </summary>
+        public static string millions_detail {
+            get {
+                return ResourceManager.GetString("millions_detail", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Dat tiraj .
+        /// </summary>
+        public static string millions_draw_date {
+            get {
+                return ResourceManager.GetString("millions_draw_date", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Date &amp; Heure du tirage.
+        /// </summary>
+        public static string millions_draw_date_time {
+            get {
+                return ResourceManager.GetString("millions_draw_date_time", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Frekans tiraj: 2fwa pa semen ( Madi ak vandredi ).
+        /// </summary>
+        public static string millions_draw_frequency {
+            get {
+                return ResourceManager.GetString("millions_draw_frequency", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Enfomasyon tiraj.
+        /// </summary>
+        public static string millions_draw_information {
+            get {
+                return ResourceManager.GetString("millions_draw_information", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tirage #.
+        /// </summary>
+        public static string millions_draw_no_short {
+            get {
+                return ResourceManager.GetString("millions_draw_no_short", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ore tiraj .
+        /// </summary>
+        public static string millions_draw_schedule {
+            get {
+                return ResourceManager.GetString("millions_draw_schedule", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Le tiraj: 11: 00 pM (Eastern Time-ET).
+        /// </summary>
+        public static string millions_draw_time {
+            get {
+                return ResourceManager.GetString("millions_draw_time", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Modifye.
+        /// </summary>
+        public static string millions_edit {
+            get {
+                return ResourceManager.GetString("millions_edit", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tanpri konfime epi antre OTP a pou kontinye..
+        /// </summary>
+        public static string millions_enter_otp_proceed {
+            get {
+                return ResourceManager.GetString("millions_enter_otp_proceed", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tanpri antre yon montan ki valab..
+        /// </summary>
+        public static string millions_enter_valid_amount {
+            get {
+                return ResourceManager.GetString("millions_enter_valid_amount", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Estimate Jackpot Prize.
+        /// </summary>
+        public static string millions_estimate_jackpot_prize {
+            get {
+                return ResourceManager.GetString("millions_estimate_jackpot_prize", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Estimasyon pri tike.
+        /// </summary>
+        public static string millions_estimated_ticket_price {
+            get {
+                return ResourceManager.GetString("millions_estimated_ticket_price", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Gratis.
+        /// </summary>
+        public static string millions_fee {
+            get {
+                return ResourceManager.GetString("millions_fee", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Fre.
+        /// </summary>
+        public static string millions_free {
+            get {
+                return ResourceManager.GetString("millions_free", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Non jwet .
+        /// </summary>
+        public static string millions_game {
+            get {
+                return ResourceManager.GetString("millions_game", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Jwet sa bloke.
+        /// </summary>
+        public static string millions_game_locked {
+            get {
+                return ResourceManager.GetString("millions_game_locked", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Regleman jwet la.
+        /// </summary>
+        public static string millions_game_rules_title {
+            get {
+                return ResourceManager.GetString("millions_game_rules_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tip jwet.
+        /// </summary>
+        public static string millions_game_type {
+            get {
+                return ResourceManager.GetString("millions_game_type", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan pouw jwe .
+        /// </summary>
+        public static string millions_how_to_play {
+            get {
+                return ResourceManager.GetString("millions_how_to_play", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to HTG.
+        /// </summary>
+        public static string millions_htg {
+            get {
+                return ResourceManager.GetString("millions_htg", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Balans sa pa sifizan..
+        /// </summary>
+        public static string millions_insufficient_balance {
+            get {
+                return ResourceManager.GetString("millions_insufficient_balance", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Jackpot.
+        /// </summary>
+        public static string millions_jackpot {
+            get {
+                return ResourceManager.GetString("millions_jackpot", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ou achte tike a apre 10:30 lap konte pou pwochen tiraj la. Montan jakpot final la ap konfime apre 11:00 rezilta a ap anonse..
+        /// </summary>
+        public static string millions_jackpot_disclaimer {
+            get {
+                return ResourceManager.GetString("millions_jackpot_disclaimer", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Jackpot.
+        /// </summary>
+        public static string millions_jackpot_label {
+            get {
+                return ResourceManager.GetString("millions_jackpot_label", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pri Jakpot la.
+        /// </summary>
+        public static string millions_jackpot_prize {
+            get {
+                return ResourceManager.GetString("millions_jackpot_prize", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Genyen jiska.
+        /// </summary>
+        public static string millions_jackpot_prize_to {
+            get {
+                return ResourceManager.GetString("millions_jackpot_prize_to", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Rezilta Jakpot.
+        /// </summary>
+        public static string millions_jackpot_results_title {
+            get {
+                return ResourceManager.GetString("millions_jackpot_results_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Mega jakpot la se kliyan ki jwenn 6 boul ki match yo kap resevwa li.
+        /// </summary>
+        public static string millions_jackpot_rule1_desc1 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule1_desc1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Prim nan se Mega jakpot kap bay li.
+        /// </summary>
+        public static string millions_jackpot_rule1_desc2 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule1_desc2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 1.Pri Mega jakpot la.
+        /// </summary>
+        public static string millions_jackpot_rule1_title {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule1_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si gen 2 oswa plis tike ki genyen 6 boul ki match, Jakpot la ap separe pou chak jwenm menm kantite.
+        /// </summary>
+        public static string millions_jackpot_rule2_desc1 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule2_desc1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Yon kliyan ki gen plizye tike ka resevwa plizye prim.
+        /// </summary>
+        public static string millions_jackpot_rule2_desc2 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule2_desc2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 2. Politik pou jakpot la pataje.
+        /// </summary>
+        public static string millions_jackpot_rule2_title {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule2_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Mega jakpot la komanse nan 2,000,000 HTG.
+        /// </summary>
+        public static string millions_jackpot_rule3_desc1 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule3_desc1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pigwo montan an se 30,000,000HTG.
+        /// </summary>
+        public static string millions_jackpot_rule3_desc2 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule3_desc2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 3. Jakpot.
+        /// </summary>
+        public static string millions_jackpot_rule3_title {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule3_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Depi gen yon moun ki genyen Mega jakpot la, jakpot la ap tou reyinisyalize otomatikman a 2,000,000 HTG.
+        /// </summary>
+        public static string millions_jackpot_rule4_desc1 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule4_desc1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Jakpot la ap rekomanse otomatikman.
+        /// </summary>
+        public static string millions_jackpot_rule4_desc2 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule4_desc2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 4.Politik pou reyinisyalize jakpot la.
+        /// </summary>
+        public static string millions_jackpot_rule4_title {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule4_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Mega Jakpot la ka peye apati:.
+        /// </summary>
+        public static string millions_jackpot_rule5_desc1 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule5_desc1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Metod pewol pou jakpot la depann de montan an epi politik operasyonel pou peryod la.
+        /// </summary>
+        public static string millions_jackpot_rule5_desc2 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule5_desc2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kont prensipal.
+        /// </summary>
+        public static string millions_jackpot_rule5_item1 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule5_item1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kont Natcom.
+        /// </summary>
+        public static string millions_jackpot_rule5_item2 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule5_item2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pewol Kach .
+        /// </summary>
+        public static string millions_jackpot_rule5_item3 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule5_item3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 5. Metod pou peye pri.
+        /// </summary>
+        public static string millions_jackpot_rule5_title {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule5_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Natcom gen dwa pou verifye tout tike ki genyen yo avan pewol jakpot la fet.
+        /// </summary>
+        public static string millions_jackpot_rule6_desc1 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule6_desc1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Yo ka bay yon lèt konfimasyon ofisyèl si sa nesesè..
+        /// </summary>
+        public static string millions_jackpot_rule6_desc2 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule6_desc2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 6. Verifikasyon Pri.
+        /// </summary>
+        public static string millions_jackpot_rule6_title {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule6_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Valè Jackpot ki parèt sou sit entènèt la mete ajou an tan reyèl..
+        /// </summary>
+        public static string millions_jackpot_rule7_desc1 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule7_desc1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pandan tan y ap trete tiraj la ak konfime rezilta yo, valè Jackpot ki parèt la ka pa montre kantite final la touswit..
+        /// </summary>
+        public static string millions_jackpot_rule7_desc2 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule7_desc2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si gen nenpòt diskisyon, desizyon Natcom se desizyon final la..
+        /// </summary>
+        public static string millions_jackpot_rule7_desc3 {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule7_desc3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 7. Nòt Enpòtan.
+        /// </summary>
+        public static string millions_jackpot_rule7_title {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rule7_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Règ pou Mega Jackpot.
+        /// </summary>
+        public static string millions_jackpot_rules_title {
+            get {
+                return ResourceManager.GetString("millions_jackpot_rules_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 30.000.000 HTG jodia  !.
+        /// </summary>
+        public static string millions_jackpot_today_htg {
+            get {
+                return ResourceManager.GetString("millions_jackpot_today_htg", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Liste des résultats Jackpot.
+        /// </summary>
+        public static string millions_list_jackpot_results {
+            get {
+                return ResourceManager.GetString("millions_list_jackpot_results", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 1 + Mega Ball.
+        /// </summary>
+        public static string millions_match_1_plus_mega {
+            get {
+                return ResourceManager.GetString("millions_match_1_plus_mega", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 2 + Mega Ball.
+        /// </summary>
+        public static string millions_match_2_plus_mega {
+            get {
+                return ResourceManager.GetString("millions_match_2_plus_mega", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 3 (Premye 3 boul yo, pa gen bezwen pozisyon).
+        /// </summary>
+        public static string millions_match_3_numbers {
+            get {
+                return ResourceManager.GetString("millions_match_3_numbers", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 3 + Mega Ball.
+        /// </summary>
+        public static string millions_match_3_plus_mega {
+            get {
+                return ResourceManager.GetString("millions_match_3_plus_mega", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 4 (Premye 4 boul yo, pa gen bezwen pozisyon).
+        /// </summary>
+        public static string millions_match_4_numbers {
+            get {
+                return ResourceManager.GetString("millions_match_4_numbers", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 4 + Mega Ball.
+        /// </summary>
+        public static string millions_match_4_plus_mega {
+            get {
+                return ResourceManager.GetString("millions_match_4_plus_mega", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 5 (Premye 5 boul yo, pa gen bezwen pozisyon).
+        /// </summary>
+        public static string millions_match_5_numbers {
+            get {
+                return ResourceManager.GetString("millions_match_5_numbers", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 5+ Mega Ball.
+        /// </summary>
+        public static string millions_match_5_plus_mega {
+            get {
+                return ResourceManager.GetString("millions_match_5_plus_mega", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Mega Ball.
+        /// </summary>
+        public static string millions_match_mega_only {
+            get {
+                return ResourceManager.GetString("millions_match_mega_only", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo Koresponn.
+        /// </summary>
+        public static string millions_match_result_header {
+            get {
+                return ResourceManager.GetString("millions_match_result_header", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Mega Jackpot.
+        /// </summary>
+        public static string millions_mega_jackpot {
+            get {
+                return ResourceManager.GetString("millions_mega_jackpot", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Mega Millions.
+        /// </summary>
+        public static string millions_mega_millions {
+            get {
+                return ResourceManager.GetString("millions_mega_millions", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Mega Ball doit être entre 01 et 24.
+        /// </summary>
+        public static string millions_megaball_invalid_desc {
+            get {
+                return ResourceManager.GetString("millions_megaball_invalid_desc", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Mega Ball Invalid.
+        /// </summary>
+        public static string millions_megaball_invalid_title {
+            get {
+                return ResourceManager.GetString("millions_megaball_invalid_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Money Ticket.
+        /// </summary>
+        public static string millions_money_ticket {
+            get {
+                return ResourceManager.GetString("millions_money_ticket", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Lajan ou genyen.
+        /// </summary>
+        public static string millions_money_win {
+            get {
+                return ResourceManager.GetString("millions_money_win", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pwochen tou.
+        /// </summary>
+        public static string millions_next_round {
+            get {
+                return ResourceManager.GetString("millions_next_round", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Aucun résultat Jackpot.
+        /// </summary>
+        public static string millions_no_jackpot_results {
+            get {
+                return ResourceManager.GetString("millions_no_jackpot_results", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pas encore de gagnants.
+        /// </summary>
+        public static string millions_no_winners {
+            get {
+                return ResourceManager.GetString("millions_no_winners", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pedi.
+        /// </summary>
+        public static string millions_not_win {
+            get {
+                return ResourceManager.GetString("millions_not_win", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Note.
+        /// </summary>
+        public static string millions_note {
+            get {
+                return ResourceManager.GetString("millions_note", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to (*) 1 coin = 1 HTG.
+        /// </summary>
+        public static string millions_note_coin_rate {
+            get {
+                return ResourceManager.GetString("millions_note_coin_rate", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 1 Winning Coin = 1 HTG sur le solde principal.
+        /// </summary>
+        public static string millions_note_conversion_main {
+            get {
+                return ResourceManager.GetString("millions_note_conversion_main", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 1 Winning Coin = 1 HTG sur NatCash.
+        /// </summary>
+        public static string millions_note_conversion_natcash {
+            get {
+                return ResourceManager.GetString("millions_note_conversion_natcash", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Le résultat est annoncé publiquement et vérifié.
+        /// </summary>
+        public static string millions_note_results_public {
+            get {
+                return ResourceManager.GetString("millions_note_results_public", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Note: Les résultats sont mis à jour après chaque tirage..
+        /// </summary>
+        public static string millions_note_results_updated {
+            get {
+                return ResourceManager.GetString("millions_note_results_updated", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to • Les récompenses seront créditées sur le solde des Winning Coins. Les clients peuvent convertir les Winning Coins en leur solde principal ou solde NatCash (à l&apos;exclusion des récompenses Jackpot)..
+        /// </summary>
+        public static string millions_note_rewards_credit {
+            get {
+                return ResourceManager.GetString("millions_note_rewards_credit", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Merci pour votre confiance et votre soutien.
+        /// </summary>
+        public static string millions_note_thank_you {
+            get {
+                return ResourceManager.GetString("millions_note_thank_you", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Note:.
+        /// </summary>
+        public static string millions_note_title {
+            get {
+                return ResourceManager.GetString("millions_note_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to now.
+        /// </summary>
+        public static string millions_now {
+            get {
+                return ResourceManager.GetString("millions_now", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Enpe Pe.
+        /// </summary>
+        public static string millions_odd_even {
+            get {
+                return ResourceManager.GetString("millions_odd_even", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Only one highest prize is awarded per ticket (if multiple prize conditions are met)..
+        /// </summary>
+        public static string millions_one_highest_prize {
+            get {
+                return ResourceManager.GetString("millions_one_highest_prize", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tanpri konfime epi antre OTP a pou kontinye..
+        /// </summary>
+        public static string millions_otp_instruction {
+            get {
+                return ResourceManager.GetString("millions_otp_instruction", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to OTP ale ak sikse. Tanpri verifye mesaj ou!.
+        /// </summary>
+        public static string millions_otp_sent_successfully {
+            get {
+                return ResourceManager.GetString("millions_otp_sent_successfully", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kole.
+        /// </summary>
+        public static string millions_paste {
+            get {
+                return ResourceManager.GetString("millions_paste", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Peman.
+        /// </summary>
+        public static string millions_payment {
+            get {
+                return ResourceManager.GetString("millions_payment", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Metod peman.
+        /// </summary>
+        public static string millions_payment_method {
+            get {
+                return ResourceManager.GetString("millions_payment_method", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Lajan ’¸ an transfere ak sikse!.
+        /// </summary>
+        public static string millions_payment_successfully {
+            get {
+                return ResourceManager.GetString("millions_payment_successfully", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Payment via: Account balance.
+        /// </summary>
+        public static string millions_payment_via {
+            get {
+                return ResourceManager.GetString("millions_payment_via", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Jwe.
+        /// </summary>
+        public static string millions_play {
+            get {
+                return ResourceManager.GetString("millions_play", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pri (win coin).
+        /// </summary>
+        public static string millions_prize_htg_header {
+            get {
+                return ResourceManager.GetString("millions_prize_htg_header", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Prim ou ka genyen.
+        /// </summary>
+        public static string millions_prize_if_win {
+            get {
+                return ResourceManager.GetString("millions_prize_if_win", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Prize Structure.
+        /// </summary>
+        public static string millions_prize_structure {
+            get {
+                return ResourceManager.GetString("millions_prize_structure", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Dat ou achte a.
+        /// </summary>
+        public static string millions_purchase_date {
+            get {
+                return ResourceManager.GetString("millions_purchase_date", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to To.
+        /// </summary>
+        public static string millions_rate_header {
+            get {
+                return ResourceManager.GetString("millions_rate_header", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo destinate.
+        /// </summary>
+        public static string millions_receiver_phone {
+            get {
+                return ResourceManager.GetString("millions_receiver_phone", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Redeem Rewards.
+        /// </summary>
+        public static string millions_redeem_rewards {
+            get {
+                return ResourceManager.GetString("millions_redeem_rewards", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Demand nouvo OTP.
+        /// </summary>
+        public static string millions_request_new_otp {
+            get {
+                return ResourceManager.GetString("millions_request_new_otp", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Results are based on official lottery draw..
+        /// </summary>
+        public static string millions_results_based_on {
+            get {
+                return ResourceManager.GetString("millions_results_based_on", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 💸 Récompense transférée vers le compte principal.
+        /// </summary>
+        public static string millions_reward_transferred_to_main_account {
+            get {
+                return ResourceManager.GetString("millions_reward_transferred_to_main_account", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 💸 Récompense transférée vers le portefeuille.
+        /// </summary>
+        public static string millions_reward_transferred_to_wallet {
+            get {
+                return ResourceManager.GetString("millions_reward_transferred_to_wallet", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tou.
+        /// </summary>
+        public static string millions_round {
+            get {
+                return ResourceManager.GetString("millions_round", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pou jwet sa a, sistem nan ap konte konbyen nan 20 nimewo ki tire yo ki:.
+        /// </summary>
+        public static string millions_rule_drawn_count_desc {
+            get {
+                return ResourceManager.GetString("millions_rule_drawn_count_desc", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Rule.
+        /// </summary>
+        public static string millions_rule_title {
+            get {
+                return ResourceManager.GetString("millions_rule_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Anrejistre.
+        /// </summary>
+        public static string millions_save {
+            get {
+                return ResourceManager.GetString("millions_save", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi.
+        /// </summary>
+        public static string millions_select {
+            get {
+                return ResourceManager.GetString("millions_select", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Select 1 Mega Ball from 1 → 24.
+        /// </summary>
+        public static string millions_select_1_mega {
+            get {
+                return ResourceManager.GetString("millions_select_1_mega", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi nimewo chans.
+        /// </summary>
+        public static string millions_select_10_lucky_numbers {
+            get {
+                return ResourceManager.GetString("millions_select_10_lucky_numbers", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Select 5 main numbers from 1 → 70.
+        /// </summary>
+        public static string millions_select_5_main {
+            get {
+                return ResourceManager.GetString("millions_select_5_main", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi.
+        /// </summary>
+        public static string millions_selected {
+            get {
+                return ResourceManager.GetString("millions_selected", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi tike.
+        /// </summary>
+        public static string millions_selected_ticket {
+            get {
+                return ResourceManager.GetString("millions_selected_ticket", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo espedite.
+        /// </summary>
+        public static string millions_sender_phone {
+            get {
+                return ResourceManager.GetString("millions_sender_phone", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Standard Ball must be between 01–70.
+        /// </summary>
+        public static string millions_standardball_invalid_desc {
+            get {
+                return ResourceManager.GetString("millions_standardball_invalid_desc", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Standard Ball Invalid.
+        /// </summary>
+        public static string millions_standardball_invalid_title {
+            get {
+                return ResourceManager.GetString("millions_standardball_invalid_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to {0} subscribers won.
+        /// </summary>
+        public static string millions_subscribers_won {
+            get {
+                return ResourceManager.GetString("millions_subscribers_won", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to {0} abonnés ont gagné le jackpot.
+        /// </summary>
+        public static string millions_subscribers_won_jackpot {
+            get {
+                return ResourceManager.GetString("millions_subscribers_won_jackpot", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Touche pouw we detay .
+        /// </summary>
+        public static string millions_tap_to_see_detail {
+            get {
+                return ResourceManager.GetString("millions_tap_to_see_detail", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tike.
+        /// </summary>
+        public static string millions_ticket {
+            get {
+                return ResourceManager.GetString("millions_ticket", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ticket closing time: 10:30 PM (ET).
+        /// </summary>
+        public static string millions_ticket_closing_time {
+            get {
+                return ResourceManager.GetString("millions_ticket_closing_time", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kod tike.
+        /// </summary>
+        public static string millions_ticket_code {
+            get {
+                return ResourceManager.GetString("millions_ticket_code", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to detay tike .
+        /// </summary>
+        public static string millions_ticket_detail {
+            get {
+                return ResourceManager.GetString("millions_ticket_detail", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Each ticket includes 6 numbers:.
+        /// </summary>
+        public static string millions_ticket_includes_6 {
+            get {
+                return ResourceManager.GetString("millions_ticket_includes_6", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to tike sa pa valid.
+        /// </summary>
+        public static string millions_ticket_not_valid {
+            get {
+                return ResourceManager.GetString("millions_ticket_not_valid", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ticket price: 20 HTG per ticket.
+        /// </summary>
+        public static string millions_ticket_price {
+            get {
+                return ResourceManager.GetString("millions_ticket_price", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Total {0} tirages.
+        /// </summary>
+        public static string millions_total_draws {
+            get {
+                return ResourceManager.GetString("millions_total_draws", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Total gagnants.
+        /// </summary>
+        public static string millions_total_winners {
+            get {
+                return ResourceManager.GetString("millions_total_winners", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Transfere.
+        /// </summary>
+        public static string millions_transfer {
+            get {
+                return ResourceManager.GetString("millions_transfer", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Rezilta yo disponib.
+        /// </summary>
+        public static string millions_updating_results {
+            get {
+                return ResourceManager.GetString("millions_updating_results", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Gade.
+        /// </summary>
+        public static string millions_view {
+            get {
+                return ResourceManager.GetString("millions_view", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Voir tous les résultats.
+        /// </summary>
+        public static string millions_view_all_results {
+            get {
+                return ResourceManager.GetString("millions_view_all_results", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tann.
+        /// </summary>
+        public static string millions_waiting {
+            get {
+                return ResourceManager.GetString("millions_waiting", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Genyen.
+        /// </summary>
+        public static string millions_win {
+            get {
+                return ResourceManager.GetString("millions_win", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Numéros gagnants.
+        /// </summary>
+        public static string millions_winning_numbers {
+            get {
+                return ResourceManager.GetString("millions_winning_numbers", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Abonnés gagnants.
+        /// </summary>
+        public static string millions_winning_subscribes {
+            get {
+                return ResourceManager.GetString("millions_winning_subscribes", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Winnings are calculated based on matching numbers and Mega Ball..
+        /// </summary>
+        public static string millions_winnings_calculated {
+            get {
+                return ResourceManager.GetString("millions_winnings_calculated", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi.
+        /// </summary>
+        public static string millions_you_choose {
+            get {
+                return ResourceManager.GetString("millions_you_choose", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi.
+        /// </summary>
+        public static string millions_your_choice {
+            get {
+                return ResourceManager.GetString("millions_your_choice", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Mins.
+        /// </summary>
+        public static string mins {
+            get {
+                return ResourceManager.GetString("mins", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Minit.
+        /// </summary>
+        public static string Minutes {
+            get {
+                return ResourceManager.GetString("Minutes", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Lajan.
+        /// </summary>
+        public static string money {
+            get {
+                return ResourceManager.GetString("money", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Montan transfe (HTG).
+        /// </summary>
+        public static string money_on {
+            get {
+                return ResourceManager.GetString("money_on", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Plis.
+        /// </summary>
+        public static string more {
+            get {
+                return ResourceManager.GetString("more", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to OU pako konekte. Tanpri konekte..
+        /// </summary>
+        public static string must_login {
+            get {
+                return ResourceManager.GetString("must_login", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tike mwen.
+        /// </summary>
+        public static string my_ticket {
+            get {
+                return ResourceManager.GetString("my_ticket", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Non .
+        /// </summary>
+        public static string name {
+            get {
+                return ResourceManager.GetString("name", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Natcash.
+        /// </summary>
+        public static string NatCash {
+            get {
+                return ResourceManager.GetString("NatCash", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tanpri verifye nouvo modpas ou.
+        /// </summary>
+        public static string new_pass_error {
+            get {
+                return ResourceManager.GetString("new_pass_error", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Lotri New York .
+        /// </summary>
+        public static string new_york_lottery {
+            get {
+                return ResourceManager.GetString("new_york_lottery", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pwochen.
+        /// </summary>
+        public static string next {
+            get {
+                return ResourceManager.GetString("next", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pwochen tiraj.
+        /// </summary>
+        public static string next_draw {
+            get {
+                return ResourceManager.GetString("next_draw", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pwochen tou.
+        /// </summary>
+        public static string next_round {
+            get {
+                return ResourceManager.GetString("next_round", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Oupa gen pemisyon pou sa.
+        /// </summary>
+        public static string no_permission {
+            get {
+                return ResourceManager.GetString("no_permission", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pagen rezilta.
+        /// </summary>
+        public static string no_results_found {
+            get {
+                return ResourceManager.GetString("no_results_found", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pa defini.
+        /// </summary>
+        public static string not_defined {
+            get {
+                return ResourceManager.GetString("not_defined", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tiraj .
+        /// </summary>
+        public static string not_draw {
+            get {
+                return ResourceManager.GetString("not_draw", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Oupa gen ase lajan sou kont lotri ou pou fe tranzaksyon sa.
+        /// </summary>
+        public static string not_enough_money {
+            get {
+                return ResourceManager.GetString("not_enough_money", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Oupa gen ase lajan.
+        /// </summary>
+        public static string not_enough_money_to_exchange {
+            get {
+                return ResourceManager.GetString("not_enough_money_to_exchange", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ou pa resevwa OTP?.
+        /// </summary>
+        public static string not_get_otp {
+            get {
+                return ResourceManager.GetString("not_get_otp", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Oupa ko gen kont natcash. Tanpri verifye kew gen kont Natcash..
+        /// </summary>
+        public static string not_register_natcash {
+            get {
+                return ResourceManager.GetString("not_register_natcash", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ou pedi .
+        /// </summary>
+        public static string not_win {
+            get {
+                return ResourceManager.GetString("not_win", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Not: Sere modpas ou, piga pataje li ak moun .
+        /// </summary>
+        public static string note_password {
+            get {
+                return ResourceManager.GetString("note_password", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo.
+        /// </summary>
+        public static string number {
+            get {
+                return ResourceManager.GetString("number", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to nimewo tike.
+        /// </summary>
+        public static string Number_of_ticket {
+            get {
+                return ResourceManager.GetString("Number_of_ticket", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Enpe.
+        /// </summary>
+        public static string Odd {
+            get {
+                return ResourceManager.GetString("Odd", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Enpe Pe.
+        /// </summary>
+        public static string odd_even {
+            get {
+                return ResourceManager.GetString("odd_even", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Enpe Pe.
+        /// </summary>
+        public static string oddeven {
+            get {
+                return ResourceManager.GetString("oddeven", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to OR.
+        /// </summary>
+        public static string or {
+            get {
+                return ResourceManager.GetString("or", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi montan (HTG).
+        /// </summary>
+        public static string or_select {
+            get {
+                return ResourceManager.GetString("or_select", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Komand kod.
+        /// </summary>
+        public static string order_code {
+            get {
+                return ResourceManager.GetString("order_code", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to OTP.
+        /// </summary>
+        public static string otp {
+            get {
+                return ResourceManager.GetString("otp", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to OTP a pa bon.
+        /// </summary>
+        public static string otp_invalid {
+            get {
+                return ResourceManager.GetString("otp_invalid", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to OTP ekspire.
+        /// </summary>
+        public static string otp_timeout {
+            get {
+                return ResourceManager.GetString("otp_timeout", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Komand sa depase 5000 HTG. Tanpri verifye anko..
+        /// </summary>
+        public static string over_1000HTG_transfer {
+            get {
+                return ResourceManager.GetString("over_1000HTG_transfer", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Montan an depase limit la..
+        /// </summary>
+        public static string over_each_exchange {
+            get {
+                return ResourceManager.GetString("over_each_exchange", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Montan an depase limit pou jounen an..
+        /// </summary>
+        public static string over_exchange_per_day {
+            get {
+                return ResourceManager.GetString("over_exchange_per_day", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Envalid.
+        /// </summary>
+        public static string params_invalid {
+            get {
+                return ResourceManager.GetString("params_invalid", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 1. Antre 6 chif.
+        /// </summary>
+        public static string pass_tip_1 {
+            get {
+                return ResourceManager.GetString("pass_tip_1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 2.Modpas: 0-9, dwe gen karakte espesyal ( pa dwe gen espas).
+        /// </summary>
+        public static string pass_tip_2 {
+            get {
+                return ResourceManager.GetString("pass_tip_2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Modpas.
+        /// </summary>
+        public static string password {
+            get {
+                return ResourceManager.GetString("password", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Modpas.
+        /// </summary>
+        public static string password_tip {
+            get {
+                return ResourceManager.GetString("password_tip", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Peyman.
+        /// </summary>
+        public static string payment {
+            get {
+                return ResourceManager.GetString("payment", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kont peyman.
+        /// </summary>
+        public static string payment_account {
+            get {
+                return ResourceManager.GetString("payment_account", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kont prensipal.
+        /// </summary>
+        public static string payment_main_account {
+            get {
+                return ResourceManager.GetString("payment_main_account", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Peye avèk balans mobil ou.
+        /// </summary>
+        public static string payment_main_account_desc {
+            get {
+                return ResourceManager.GetString("payment_main_account_desc", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi yon kont pou fini acha ou.
+        /// </summary>
+        public static string payment_method_subtitle {
+            get {
+                return ResourceManager.GetString("payment_method_subtitle", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi metòd peman.
+        /// </summary>
+        public static string payment_method_title {
+            get {
+                return ResourceManager.GetString("payment_method_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Metod peyman.
+        /// </summary>
+        public static string payment_mothod {
+            get {
+                return ResourceManager.GetString("payment_mothod", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Enfòmasyon peman ou pwoteje.
+        /// </summary>
+        public static string payment_security_message {
+            get {
+                return ResourceManager.GetString("payment_security_message", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to WALLET.
+        /// </summary>
+        public static string payment_wallet {
+            get {
+                return ResourceManager.GetString("payment_wallet", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Peman sekirize avèk PIN wallet la.
+        /// </summary>
+        public static string payment_wallet_desc {
+            get {
+                return ResourceManager.GetString("payment_wallet_desc", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Antre PIN WALLET ou.
+        /// </summary>
+        public static string payment_wallet_pin_instruction {
+            get {
+                return ResourceManager.GetString("payment_wallet_pin_instruction", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo telefon nan pa bon.
+        /// </summary>
+        public static string phone_invalid {
+            get {
+                return ResourceManager.GetString("phone_invalid", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo telefon.
+        /// </summary>
+        public static string phone_number {
+            get {
+                return ResourceManager.GetString("phone_number", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pick .
+        /// </summary>
+        public static string Pick {
+            get {
+                return ResourceManager.GetString("Pick", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo_pick.
+        /// </summary>
+        public static string Pick_Number {
+            get {
+                return ResourceManager.GetString("Pick_Number", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pick 11.
+        /// </summary>
+        public static string pick10 {
+            get {
+                return ResourceManager.GetString("pick10", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to PIN sa pa bon .
+        /// </summary>
+        public static string pin_wrong {
+            get {
+                return ResourceManager.GetString("pin_wrong", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Jwe.
+        /// </summary>
+        public static string play {
+            get {
+                return ResourceManager.GetString("play", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pri.
+        /// </summary>
+        public static string price {
+            get {
+                return ResourceManager.GetString("price", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pwofil.
+        /// </summary>
+        public static string profile {
+            get {
+                return ResourceManager.GetString("profile", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kod pwomosyon sa pa aktive.
+        /// </summary>
+        public static string promotion_code_inactive {
+            get {
+                return ResourceManager.GetString("promotion_code_inactive", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kod pwomosyon sa pa bon.
+        /// </summary>
+        public static string promotion_code_invalid {
+            get {
+                return ResourceManager.GetString("promotion_code_invalid", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kod pwomosyon sa itilize deja.
+        /// </summary>
+        public static string promotion_code_used {
+            get {
+                return ResourceManager.GetString("promotion_code_used", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kesyon .
+        /// </summary>
+        public static string question {
+            get {
+                return ResourceManager.GetString("question", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pick rapid.
+        /// </summary>
+        public static string quick_pick {
+            get {
+                return ResourceManager.GetString("quick_pick", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to O aza.
+        /// </summary>
+        public static string Random {
+            get {
+                return ResourceManager.GetString("Random", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Destinate.
+        /// </summary>
+        public static string receiver {
+            get {
+                return ResourceManager.GetString("receiver", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to bay lot nimewo Natcom.
+        /// </summary>
+        public static string receiver_phone {
+            get {
+                return ResourceManager.GetString("receiver_phone", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Anrejistre.
+        /// </summary>
+        public static string register {
+            get {
+                return ResourceManager.GetString("register", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Refe komand.
+        /// </summary>
+        public static string reorder {
+            get {
+                return ResourceManager.GetString("reorder", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Voye OTP a anko.
+        /// </summary>
+        public static string resend_otp {
+            get {
+                return ResourceManager.GetString("resend_otp", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to OTP a .
+        /// </summary>
+        public static string resent_otp {
+            get {
+                return ResourceManager.GetString("resent_otp", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tanpri reyinisyalize OTP a apre 1 minit.
+        /// </summary>
+        public static string reset_after_1_minute {
+            get {
+                return ResourceManager.GetString("reset_after_1_minute", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Rezilta.
+        /// </summary>
+        public static string results {
+            get {
+                return ResourceManager.GetString("results", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tounen nan paj akey.
+        /// </summary>
+        public static string return_home_page {
+            get {
+                return ResourceManager.GetString("return_home_page", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Verifye peyman.
+        /// </summary>
+        public static string review_payment {
+            get {
+                return ResourceManager.GetString("review_payment", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 2 - 80.
+        /// </summary>
+        public static string rule_01_80 {
+            get {
+                return ResourceManager.GetString("rule_01_80", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 10 HTG.
+        /// </summary>
+        public static string rule_10_htg {
+            get {
+                return ResourceManager.GetString("rule_10_htg", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 10 nimewo ap chwazi pami 20 tiraj la.
+        /// </summary>
+        public static string rule_10_taken_from {
+            get {
+                return ResourceManager.GetString("rule_10_taken_from", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 14 nimewo pami &lt;span class=&quot;font-[900]&quot;&gt;01-40&lt;/span&gt;.
+        /// </summary>
+        public static string rule_13_from_01_40 {
+            get {
+                return ResourceManager.GetString("rule_13_from_01_40", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 13 nimewo pami &lt;span class=&quot;font-[900]&quot;&gt;41-80&lt;/span&gt;.
+        /// </summary>
+        public static string rule_13_from_41_80 {
+            get {
+                return ResourceManager.GetString("rule_13_from_41_80", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to (Jwe 13 nimewo).
+        /// </summary>
+        public static string rule_13_numbers_game {
+            get {
+                return ResourceManager.GetString("rule_13_numbers_game", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 13nimewo oswa plis ant &lt;span class=&quot;text-[#0BA01A] font-bold&quot;&gt;01–40&lt;/span&gt; → PITI genyen.
+        /// </summary>
+        public static string rule_13_or_more_01_40 {
+            get {
+                return ResourceManager.GetString("rule_13_or_more_01_40", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 14 nimewo oswa plis ant &lt;span class=&quot;text-[#0BA01A] font-bold&quot;&gt;41–80&lt;/span&gt; → Gwo genyen.
+        /// </summary>
+        public static string rule_13_or_more_41_80 {
+            get {
+                return ResourceManager.GetString("rule_13_or_more_41_80", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to (Jwe 15 nimewo).
+        /// </summary>
+        public static string rule_15_numbers_game {
+            get {
+                return ResourceManager.GetString("rule_15_numbers_game", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 20:30 chak jou.
+        /// </summary>
+        public static string rule_20_00_daily {
+            get {
+                return ResourceManager.GetString("rule_20_00_daily", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 20:30 chak jou.
+        /// </summary>
+        public static string rule_20_30_daily {
+            get {
+                return ResourceManager.GetString("rule_20_30_daily", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 20 nimewo pa tiraj.
+        /// </summary>
+        public static string rule_20_per_draw {
+            get {
+                return ResourceManager.GetString("rule_20_per_draw", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tout tike Pe yo genyen..
+        /// </summary>
+        public static string rule_all_even_win {
+            get {
+                return ResourceManager.GetString("rule_all_even_win", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tout tike Enpe yo genyen..
+        /// </summary>
+        public static string rule_all_odd_win {
+            get {
+                return ResourceManager.GetString("rule_all_odd_win", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Basic&lt;br&gt;Pick.
+        /// </summary>
+        public static string rule_basic_pick {
+            get {
+                return ResourceManager.GetString("rule_basic_pick", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Gwo Piti.
+        /// </summary>
+        public static string rule_big_small {
+            get {
+                return ResourceManager.GetString("rule_big_small", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Big Small Prize.
+        /// </summary>
+        public static string rule_bs_prize {
+            get {
+                return ResourceManager.GetString("rule_bs_prize", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to GWO  PITI – REGLEMAN .
+        /// </summary>
+        public static string rule_bs_winning_rule {
+            get {
+                return ResourceManager.GetString("rule_bs_winning_rule", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Le ou achte yon tike, chwazi swa GWO oswa TI..
+        /// </summary>
+        public static string rule_buy_big_small {
+            get {
+                return ResourceManager.GetString("rule_buy_big_small", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi 10 nimewo ant 1 - 80 .
+        /// </summary>
+        public static string rule_choose_10 {
+            get {
+                return ResourceManager.GetString("rule_choose_10", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pick 10.
+        /// </summary>
+        public static string rule_classic_pick_10 {
+            get {
+                return ResourceManager.GetString("rule_classic_pick_10", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kondisyon.
+        /// </summary>
+        public static string rule_condition {
+            get {
+                return ResourceManager.GetString("rule_condition", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Deskripsyon.
+        /// </summary>
+        public static string rule_description {
+            get {
+                return ResourceManager.GetString("rule_description", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo doub otorize.
+        /// </summary>
+        public static string rule_duplicate_allowed {
+            get {
+                return ResourceManager.GetString("rule_duplicate_allowed", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chak ganyan ap resevwa 100,00 HTG.
+        /// </summary>
+        public static string rule_each_receives {
+            get {
+                return ResourceManager.GetString("rule_each_receives", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo Pe.
+        /// </summary>
+        public static string rule_even_numbers {
+            get {
+                return ResourceManager.GetString("rule_even_numbers", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo Pe &lt;span class=&quot;font-[900]&quot;&gt;0,2,4,6,8&lt;/span&gt;.
+        /// </summary>
+        public static string rule_even_numbers_02468 {
+            get {
+                return ResourceManager.GetString("rule_even_numbers_02468", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ekzanp.
+        /// </summary>
+        public static string rule_example {
+            get {
+                return ResourceManager.GetString("rule_example", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 16 nimewo pe.
+        /// </summary>
+        public static string rule_example_15_even {
+            get {
+                return ResourceManager.GetString("rule_example_15_even", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 16 nimewo enpe.
+        /// </summary>
+        public static string rule_example_16_odd {
+            get {
+                return ResourceManager.GetString("rule_example_16_odd", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 4 nimewo pe.
+        /// </summary>
+        public static string rule_example_4_even {
+            get {
+                return ResourceManager.GetString("rule_example_4_even", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 4 nimewo enpe.
+        /// </summary>
+        public static string rule_example_5_odd {
+            get {
+                return ResourceManager.GetString("rule_example_5_odd", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ekzanp:Parye 50 HTG → Resevwa 100 HTG..
+        /// </summary>
+        public static string rule_example_bet_50 {
+            get {
+                return ResourceManager.GetString("rule_example_bet_50", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ekzamp: Parye 50 HTG → Resevwa 200 HTG..
+        /// </summary>
+        public static string rule_example_bet_50_4x {
+            get {
+                return ResourceManager.GetString("rule_example_bet_50_4x", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to II. GAME 1 – BASIC PICK 11.
+        /// </summary>
+        public static string rule_game_1_title {
+            get {
+                return ResourceManager.GetString("rule_game_1_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to ENFOMASYON JENERAL.
+        /// </summary>
+        public static string rule_general_info {
+            get {
+                return ResourceManager.GetString("rule_general_info", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan yo detemine rezilta gayan an.
+        /// </summary>
+        public static string rule_how_result_determined {
+            get {
+                return ResourceManager.GetString("rule_how_result_determined", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to KILE TIKE OU A GENYEN.
+        /// </summary>
+        public static string rule_how_ticket_wins {
+            get {
+                return ResourceManager.GetString("rule_how_ticket_wins", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan pouw jwe.
+        /// </summary>
+        public static string rule_how_to_play {
+            get {
+                return ResourceManager.GetString("rule_how_to_play", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kijan pouw genyen .
+        /// </summary>
+        public static string rule_how_to_win {
+            get {
+                return ResourceManager.GetString("rule_how_to_win", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tike idantik otorize.
+        /// </summary>
+        public static string rule_identical_allowed {
+            get {
+                return ResourceManager.GetString("rule_identical_allowed", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si 13 nimewo pami 20 nimewo yo tire a soti nan seri a &lt;span class=&quot;text-[#0BA01A] font-bold&quot;&gt;01–40&lt;/span&gt;,.
+        /// </summary>
+        public static string rule_if_13_01_40 {
+            get {
+                return ResourceManager.GetString("rule_if_13_01_40", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si 13 nimewo pami 20 nimewo yo tire a soti nan seri a &lt;span class=&quot;text-[#0BA01A] font-bold&quot;&gt;41–80&lt;/span&gt;,.
+        /// </summary>
+        public static string rule_if_13_41_80 {
+            get {
+                return ResourceManager.GetString("rule_if_13_41_80", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si 15 nimewo oswa plis pami 20 nimewo yo tire a se nimewo pe,&lt;br&gt;the official result is &lt;span class=&quot;font-bold text-[#A236C8]&quot;&gt;EVEN&lt;/span&gt;..
+        /// </summary>
+        public static string rule_if_15_even_result_even {
+            get {
+                return ResourceManager.GetString("rule_if_15_even_result_even", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si 15 nimewo oswa plis pami 20 nimewo yo tiraj la se nimewo Enpe, &lt;br&gt;rezilta ofisyel la se&lt;span class=&quot;font-bold text-[#A236C8]&quot;&gt;ODD&lt;/span&gt;..
+        /// </summary>
+        public static string rule_if_15_odd_result_odd {
+            get {
+                return ResourceManager.GetString("rule_if_15_odd_result_odd", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si 20 nimewo ki tire yo genyen 15 oswa plis &lt;span class=&quot;font-bold&quot;&gt;even&lt;/span&gt; nimewo .
+        /// </summary>
+        public static string rule_if_20_contain_15_even {
+            get {
+                return ResourceManager.GetString("rule_if_20_contain_15_even", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si 20 nimewo ki tire yo genyen 15 oswa plis nimewo enpe &lt;span class=&quot;font-bold&quot;&gt;odd&lt;/span&gt; numbers.
+        /// </summary>
+        public static string rule_if_20_contain_15_odd {
+            get {
+                return ResourceManager.GetString("rule_if_20_contain_15_odd", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si 20 nimewo yo tire a gen:.
+        /// </summary>
+        public static string rule_if_20_drawn_contain {
+            get {
+                return ResourceManager.GetString("rule_if_20_drawn_contain", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si  &gt; 10 Ganyan.
+        /// </summary>
+        public static string rule_if_gt_10 {
+            get {
+                return ResourceManager.GetString("rule_if_gt_10", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si  ≤ 10 Ganyan.
+        /// </summary>
+        public static string rule_if_le_10 {
+            get {
+                return ResourceManager.GetString("rule_if_le_10", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si w ap fe yon peman preske le limit la:.
+        /// </summary>
+        public static string rule_if_making_payment {
+            get {
+                return ResourceManager.GetString("rule_if_making_payment", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si ou te achte yon GWO tike:.
+        /// </summary>
+        public static string rule_if_purchased_big {
+            get {
+                return ResourceManager.GetString("rule_if_purchased_big", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si ou te achte yon tike Pe:.
+        /// </summary>
+        public static string rule_if_purchased_even {
+            get {
+                return ResourceManager.GetString("rule_if_purchased_even", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si ou achte yon tike enpe:.
+        /// </summary>
+        public static string rule_if_purchased_odd {
+            get {
+                return ResourceManager.GetString("rule_if_purchased_odd", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Si ou te achte yon tike Piti:.
+        /// </summary>
+        public static string rule_if_purchased_small {
+            get {
+                return ResourceManager.GetString("rule_if_purchased_small", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Not enpotan.
+        /// </summary>
+        public static string rule_important_notes {
+            get {
+                return ResourceManager.GetString("rule_important_notes", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Atik.
+        /// </summary>
+        public static string rule_item {
+            get {
+                return ResourceManager.GetString("rule_item", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Prim Jakpot.
+        /// </summary>
+        public static string rule_jackpot_prize {
+            get {
+                return ResourceManager.GetString("rule_jackpot_prize", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Regleman Jakpot la.
+        /// </summary>
+        public static string rule_jackpot_rule {
+            get {
+                return ResourceManager.GetString("rule_jackpot_rule", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Matche tout 10 nimewo &amp; 9989.
+        /// </summary>
+        public static string rule_match_all_10 {
+            get {
+                return ResourceManager.GetString("rule_match_all_10", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Matche kantite nimewo kew kapab.
+        /// </summary>
+        public static string rule_match_as_many {
+            get {
+                return ResourceManager.GetString("rule_match_as_many", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pwochen tou.
+        /// </summary>
+        public static string rule_next_round {
+            get {
+                return ResourceManager.GetString("rule_next_round", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo ki soti.
+        /// </summary>
+        public static string rule_numbers_drawn {
+            get {
+                return ResourceManager.GetString("rule_numbers_drawn", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo matche.
+        /// </summary>
+        public static string rule_numbers_matches {
+            get {
+                return ResourceManager.GetString("rule_numbers_matches", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Objective..
+        /// </summary>
+        public static string rule_objective {
+            get {
+                return ResourceManager.GetString("rule_objective", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Enpe Pe.
+        /// </summary>
+        public static string rule_odd_even {
+            get {
+                return ResourceManager.GetString("rule_odd_even", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo Enpe.
+        /// </summary>
+        public static string rule_odd_numbers {
+            get {
+                return ResourceManager.GetString("rule_odd_numbers", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo enpe&lt;span class=&quot;font-[900]&quot;&gt;1,3,5,7,9&lt;/span&gt;.
+        /// </summary>
+        public static string rule_odd_numbers_13579 {
+            get {
+                return ResourceManager.GetString("rule_odd_numbers_13579", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Prim Enpe/Pe.
+        /// </summary>
+        public static string rule_oe_prize {
+            get {
+                return ResourceManager.GetString("rule_oe_prize", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to ENPE/PE &amp;#8211; REG GANYAN.
+        /// </summary>
+        public static string rule_oe_winning_rule {
+            get {
+                return ResourceManager.GetString("rule_oe_winning_rule", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ou ka chwazi yon sel opsyon (PE oswa ENPE) pou chak tike..
+        /// </summary>
+        public static string rule_only_one_option {
+            get {
+                return ResourceManager.GetString("rule_only_one_option", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Peman ki fet pita ap anrejistre otomatikman pou pwochen tiraj la..
+        /// </summary>
+        public static string rule_payment_later {
+            get {
+                return ResourceManager.GetString("rule_payment_later", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Peman ki fet ak sikseap konplete nan yon ti tan apre 8e diswa pou tiraj aktyel la..
+        /// </summary>
+        public static string rule_payment_shortly {
+            get {
+                return ResourceManager.GetString("rule_payment_shortly", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Jwe.
+        /// </summary>
+        public static string rule_play_now {
+            get {
+                return ResourceManager.GetString("rule_play_now", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 12,000 HTG..
+        /// </summary>
+        public static string rule_prize_12k {
+            get {
+                return ResourceManager.GetString("rule_prize_12k", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 160 HTG..
+        /// </summary>
+        public static string rule_prize_160 {
+            get {
+                return ResourceManager.GetString("rule_prize_160", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 💰20 HTG..
+        /// </summary>
+        public static string rule_prize_20 {
+            get {
+                return ResourceManager.GetString("rule_prize_20", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 💰5 HTG..
+        /// </summary>
+        public static string rule_prize_5 {
+            get {
+                return ResourceManager.GetString("rule_prize_5", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 💰600 HTG..
+        /// </summary>
+        public static string rule_prize_600 {
+            get {
+                return ResourceManager.GetString("rule_prize_600", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Prize Pool.
+        /// </summary>
+        public static string rule_prize_pool {
+            get {
+                return ResourceManager.GetString("rule_prize_pool", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Prize Pool (HTG).
+        /// </summary>
+        public static string rule_prize_pool_htg {
+            get {
+                return ResourceManager.GetString("rule_prize_pool_htg", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to PRIZE POOL.
+        /// </summary>
+        public static string rule_prize_pool_title {
+            get {
+                return ResourceManager.GetString("rule_prize_pool_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Achte chanel.
+        /// </summary>
+        public static string rule_purchase_channels {
+            get {
+                return ResourceManager.GetString("rule_purchase_channels", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Regleman tiraj .
+        /// </summary>
+        public static string rule_regulation_draw {
+            get {
+                return ResourceManager.GetString("rule_regulation_draw", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Rezilta chanel .
+        /// </summary>
+        public static string rule_result_channel {
+            get {
+                return ResourceManager.GetString("rule_result_channel", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Rezilta ofisyel la se &lt;span class=&quot;text-[#A236C8]&quot;&gt;EVEN&lt;/span&gt;..
+        /// </summary>
+        public static string rule_result_is_even {
+            get {
+                return ResourceManager.GetString("rule_result_is_even", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 
+        ///Rezilta ofisyel la se &lt;span class=&quot;text-[#A236C8]&quot;&gt;ODD&lt;/span&gt;..
+        /// </summary>
+        public static string rule_result_is_odd {
+            get {
+                return ResourceManager.GetString("rule_result_is_odd", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Le pou vann tike a 20:00 chakjou .
+        /// </summary>
+        public static string rule_sales_close {
+            get {
+                return ResourceManager.GetString("rule_sales_close", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Le ak limit pou vann tike.
+        /// </summary>
+        public static string rule_sales_cutoff {
+            get {
+                return ResourceManager.GetString("rule_sales_cutoff", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi.
+        /// </summary>
+        public static string rule_select {
+            get {
+                return ResourceManager.GetString("rule_select", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi.
+        /// </summary>
+        public static string rule_selected {
+            get {
+                return ResourceManager.GetString("rule_selected", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi metod.
+        /// </summary>
+        public static string rule_selection_method {
+            get {
+                return ResourceManager.GetString("rule_selection_method", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 1.000 .000 HTG ap separe egal bay ganyan yo .
+        /// </summary>
+        public static string rule_shared_equally {
+            get {
+                return ResourceManager.GetString("rule_shared_equally", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Standard Prize Structure.
+        /// </summary>
+        public static string rule_standard_prize {
+            get {
+                return ResourceManager.GetString("rule_standard_prize", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Apre tiraj la, sistem nan ap verifye 20 nimewo yo te tire yo..
+        /// </summary>
+        public static string rule_system_check_20 {
+            get {
+                return ResourceManager.GetString("rule_system_check_20", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Rezilta final ak Kont ofisyel sistem nan.
+        /// </summary>
+        public static string rule_system_count_final {
+            get {
+                return ResourceManager.GetString("rule_system_count_final", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to 
+        ///Pou jwet sa a, sistem nan ap konte konbyen nan 20 nimewo ki tire yo ki:.
+        /// </summary>
+        public static string rule_system_count_how_many {
+            get {
+                return ResourceManager.GetString("rule_system_count_how_many", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Sistem nan tire 20 nimewo soti nan 01 rive nan 80..
+        /// </summary>
+        public static string rule_system_draws_20_01_80 {
+            get {
+                return ResourceManager.GetString("rule_system_draws_20_01_80", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Le ofisyel sistem nan ap detemine si tike a valid.
+        /// </summary>
+        public static string rule_system_time {
+            get {
+                return ResourceManager.GetString("rule_system_time", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tike denye le.
+        /// </summary>
+        public static string rule_ticket_closure {
+            get {
+                return ResourceManager.GetString("rule_ticket_closure", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pri tike.
+        /// </summary>
+        public static string rule_ticket_price {
+            get {
+                return ResourceManager.GetString("rule_ticket_price", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Le.
+        /// </summary>
+        public static string rule_time {
+            get {
+                return ResourceManager.GetString("rule_time", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Reg.
+        /// </summary>
+        public static string rule_title {
+            get {
+                return ResourceManager.GetString("rule_title", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo total.
+        /// </summary>
+        public static string rule_total_numbers {
+            get {
+                return ResourceManager.GetString("rule_total_numbers", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to USSD / Web / APP.
+        /// </summary>
+        public static string rule_ussd_web_app {
+            get {
+                return ResourceManager.GetString("rule_ussd_web_app", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chak tike valab pou yon sel tiraj..
+        /// </summary>
+        public static string rule_valid_one_draw {
+            get {
+                return ResourceManager.GetString("rule_valid_one_draw", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Web / APP.
+        /// </summary>
+        public static string rule_web_app {
+            get {
+                return ResourceManager.GetString("rule_web_app", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tike ki genyen yo resevwa 2 fwa kantite lajan yo te parye a..
+        /// </summary>
+        public static string rule_win_receive_2x {
+            get {
+                return ResourceManager.GetString("rule_win_receive_2x", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tike ki genyen yo ap resevwa 4 fwa kantite lajan yo te parye a..
+        /// </summary>
+        public static string rule_win_receive_4x {
+            get {
+                return ResourceManager.GetString("rule_win_receive_4x", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kondisyon.
+        /// </summary>
+        public static string rule_winning_condition {
+            get {
+                return ResourceManager.GetString("rule_winning_condition", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Regleman ganyan.
+        /// </summary>
+        public static string rule_winning_rule {
+            get {
+                return ResourceManager.GetString("rule_winning_rule", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Wi.
+        /// </summary>
+        public static string rule_yes {
+            get {
+                return ResourceManager.GetString("rule_yes", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ou genyen.
+        /// </summary>
+        public static string rule_you_win {
+            get {
+                return ResourceManager.GetString("rule_you_win", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Regleman .
+        /// </summary>
+        public static string rules {
+            get {
+                return ResourceManager.GetString("rules", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Rechech.
+        /// </summary>
+        public static string search {
+            get {
+                return ResourceManager.GetString("search", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Secs.
+        /// </summary>
+        public static string seconds {
+            get {
+                return ResourceManager.GetString("seconds", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Secs.
+        /// </summary>
+        public static string Secs {
+            get {
+                return ResourceManager.GetString("Secs", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Plis.
+        /// </summary>
+        public static string see_more {
+            get {
+                return ResourceManager.GetString("see_more", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Transfere sou kont ou .
+        /// </summary>
+        public static string select_an_account {
+            get {
+                return ResourceManager.GetString("select_an_account", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Espedite.
+        /// </summary>
+        public static string sender {
+            get {
+                return ResourceManager.GetString("sender", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo ou.
+        /// </summary>
+        public static string sender_phone {
+            get {
+                return ResourceManager.GetString("sender_phone", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Sote .
+        /// </summary>
+        public static string skip_to_guest {
+            get {
+                return ResourceManager.GetString("skip_to_guest", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Piti.
+        /// </summary>
+        public static string Small {
+            get {
+                return ResourceManager.GetString("Small", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Piti Gwo.
+        /// </summary>
+        public static string small_big {
+            get {
+                return ResourceManager.GetString("small_big", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Komanse itilize loto.
+        /// </summary>
+        public static string start_using_bee_loto {
+            get {
+                return ResourceManager.GetString("start_using_bee_loto", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Estati.
+        /// </summary>
+        public static string status {
+            get {
+                return ResourceManager.GetString("status", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Reyisi.
+        /// </summary>
+        public static string success {
+            get {
+                return ResourceManager.GetString("success", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to System nan okipe. Tanpri eseye apre 1 minit.
+        /// </summary>
+        public static string system_update {
+            get {
+                return ResourceManager.GetString("system_update", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Dat ou achte a.
+        /// </summary>
+        public static string term {
+            get {
+                return ResourceManager.GetString("term", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kondisyon sa espire. Tanpri eseye anko .
+        /// </summary>
+        public static string term_timeout {
+            get {
+                return ResourceManager.GetString("term_timeout", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tem ak kondisyon.
+        /// </summary>
+        public static string terms_and_conditions {
+            get {
+                return ResourceManager.GetString("terms_and_conditions", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Mesi!.
+        /// </summary>
+        public static string thank_you {
+            get {
+                return ResourceManager.GetString("thank_you", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tike.
+        /// </summary>
+        public static string ticket {
+            get {
+                return ResourceManager.GetString("ticket", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Bill code.
+        /// </summary>
+        public static string ticket_code {
+            get {
+                return ResourceManager.GetString("ticket_code", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tike a pa bon.
+        /// </summary>
+        public static string ticket_invalid {
+            get {
+                return ResourceManager.GetString("ticket_invalid", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Le.
+        /// </summary>
+        public static string time {
+            get {
+                return ResourceManager.GetString("time", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to a.
+        /// </summary>
+        public static string to {
+            get {
+                return ResourceManager.GetString("to", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to bay lot nimewo Natcom.
+        /// </summary>
+        public static string to_other_natcom_number {
+            get {
+                return ResourceManager.GetString("to_other_natcom_number", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Envalid.
+        /// </summary>
+        public static string token_invalid {
+            get {
+                return ResourceManager.GetString("token_invalid", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Lajan total .
+        /// </summary>
+        public static string total_money {
+            get {
+                return ResourceManager.GetString("total_money", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Peman Total.
+        /// </summary>
+        public static string total_payment {
+            get {
+                return ResourceManager.GetString("total_payment", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tike total.
+        /// </summary>
+        public static string total_ticket {
+            get {
+                return ResourceManager.GetString("total_ticket", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Retire lajan.
+        /// </summary>
+        public static string tranfer_win_money {
+            get {
+                return ResourceManager.GetString("tranfer_win_money", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Transfe.
+        /// </summary>
+        public static string transfer {
+            get {
+                return ResourceManager.GetString("transfer", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Metod transfe.
+        /// </summary>
+        public static string transfer_method {
+            get {
+                return ResourceManager.GetString("transfer_method", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Lajan an transfer ak sikse!.
+        /// </summary>
+        public static string transfer_success {
+            get {
+                return ResourceManager.GetString("transfer_success", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Esye anko.
+        /// </summary>
+        public static string try_again {
+            get {
+                return ResourceManager.GetString("try_again", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tip.
+        /// </summary>
+        public static string type {
+            get {
+                return ResourceManager.GetString("type", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Mizajou.
+        /// </summary>
+        public static string update {
+            get {
+                return ResourceManager.GetString("update", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Gen yon ere. Nan mizajou pwofil la.
+        /// </summary>
+        public static string update_profile_error {
+            get {
+                return ResourceManager.GetString("update_profile_error", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Mizajou reyisi.
+        /// </summary>
+        public static string update_successful {
+            get {
+                return ResourceManager.GetString("update_successful", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Echek foto itilizate .
+        /// </summary>
+        public static string user_avatar_error {
+            get {
+                return ResourceManager.GetString("user_avatar_error", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kont Loto.
+        /// </summary>
+        public static string v2_account_name {
+            get {
+                return ResourceManager.GetString("v2_account_name", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ajoute tike.
+        /// </summary>
+        public static string v2_add_more_ticket {
+            get {
+                return ResourceManager.GetString("v2_add_more_ticket", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tout.
+        /// </summary>
+        public static string v2_all {
+            get {
+                return ResourceManager.GetString("v2_all", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Montan.
+        /// </summary>
+        public static string v2_amount {
+            get {
+                return ResourceManager.GetString("v2_amount", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Montan (HTG).
+        /// </summary>
+        public static string v2_amount_htg {
+            get {
+                return ResourceManager.GetString("v2_amount_htg", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Montan ou te jwe .
+        /// </summary>
+        public static string v2_amount_played {
+            get {
+                return ResourceManager.GetString("v2_amount_played", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Montan ou genyen.
+        /// </summary>
+        public static string v2_amount_won {
+            get {
+                return ResourceManager.GetString("v2_amount_won", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tounen.
+        /// </summary>
+        public static string v2_back {
+            get {
+                return ResourceManager.GetString("v2_back", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Gwo  PITI .
+        /// </summary>
+        public static string v2_big_small {
+            get {
+                return ResourceManager.GetString("v2_big_small", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Bill Code.
+        /// </summary>
+        public static string v2_bill_code {
+            get {
+                return ResourceManager.GetString("v2_bill_code", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Achte pick 10.
+        /// </summary>
+        public static string v2_buy_classic_pick_10 {
+            get {
+                return ResourceManager.GetString("v2_buy_classic_pick_10", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Achte tike.
+        /// </summary>
+        public static string v2_buy_ticket_label {
+            get {
+                return ResourceManager.GetString("v2_buy_ticket_label", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Anile.
+        /// </summary>
+        public static string v2_cancel {
+            get {
+                return ResourceManager.GetString("v2_cancel", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chanel achte.
+        /// </summary>
+        public static string v2_channel {
+            get {
+                return ResourceManager.GetString("v2_channel", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi kont.
+        /// </summary>
+        public static string v2_choose_account {
+            get {
+                return ResourceManager.GetString("v2_choose_account", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pack 10.
+        /// </summary>
+        public static string v2_classic_pick_10 {
+            get {
+                return ResourceManager.GetString("v2_classic_pick_10", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Femen.
+        /// </summary>
+        public static string v2_close {
+            get {
+                return ResourceManager.GetString("v2_close", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pyes.
+        /// </summary>
+        public static string v2_coins {
+            get {
+                return ResourceManager.GetString("v2_coins", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konfime.
+        /// </summary>
+        public static string v2_confirm {
+            get {
+                return ResourceManager.GetString("v2_confirm", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konfime.
+        /// </summary>
+        public static string v2_confirm_purchase {
+            get {
+                return ResourceManager.GetString("v2_confirm_purchase", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konfime tranzaksyon.
+        /// </summary>
+        public static string v2_confirm_transaction {
+            get {
+                return ResourceManager.GetString("v2_confirm_transaction", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kontinye.
+        /// </summary>
+        public static string v2_continue {
+            get {
+                return ResourceManager.GetString("v2_continue", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Konveti.
+        /// </summary>
+        public static string v2_convert {
+            get {
+                return ResourceManager.GetString("v2_convert", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Dat ak le.
+        /// </summary>
+        public static string v2_date_and_time {
+            get {
+                return ResourceManager.GetString("v2_date_and_time", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Efase.
+        /// </summary>
+        public static string v2_delete {
+            get {
+                return ResourceManager.GetString("v2_delete", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Detay.
+        /// </summary>
+        public static string v2_detail {
+            get {
+                return ResourceManager.GetString("v2_detail", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Dat tiraj .
+        /// </summary>
+        public static string v2_draw_date {
+            get {
+                return ResourceManager.GetString("v2_draw_date", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Modifye.
+        /// </summary>
+        public static string v2_edit {
+            get {
+                return ResourceManager.GetString("v2_edit", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tanpri konfime epi antre OTP a pou kontinye..
+        /// </summary>
+        public static string v2_enter_otp_proceed {
+            get {
+                return ResourceManager.GetString("v2_enter_otp_proceed", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tanpri antre yon montan ki valab..
+        /// </summary>
+        public static string v2_enter_valid_amount {
+            get {
+                return ResourceManager.GetString("v2_enter_valid_amount", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Estimasyon pri tike.
+        /// </summary>
+        public static string v2_estimated_ticket_price {
+            get {
+                return ResourceManager.GetString("v2_estimated_ticket_price", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Gratis.
+        /// </summary>
+        public static string v2_fee {
+            get {
+                return ResourceManager.GetString("v2_fee", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Fre.
+        /// </summary>
+        public static string v2_free {
+            get {
+                return ResourceManager.GetString("v2_free", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Non jwet .
+        /// </summary>
+        public static string v2_game {
+            get {
+                return ResourceManager.GetString("v2_game", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Jwet sa bloke.
+        /// </summary>
+        public static string v2_game_locked {
+            get {
+                return ResourceManager.GetString("v2_game_locked", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to HTG.
+        /// </summary>
+        public static string v2_htg {
+            get {
+                return ResourceManager.GetString("v2_htg", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Balans sa pa sifi..
+        /// </summary>
+        public static string v2_insufficient_balance {
+            get {
+                return ResourceManager.GetString("v2_insufficient_balance", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Money Ticket.
+        /// </summary>
+        public static string v2_money_ticket {
+            get {
+                return ResourceManager.GetString("v2_money_ticket", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Lajan ou genyen.
+        /// </summary>
+        public static string v2_money_win {
+            get {
+                return ResourceManager.GetString("v2_money_win", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pedi.
+        /// </summary>
+        public static string v2_not_win {
+            get {
+                return ResourceManager.GetString("v2_not_win", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Enpe Pe.
+        /// </summary>
+        public static string v2_odd_even {
+            get {
+                return ResourceManager.GetString("v2_odd_even", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tanpri konfime epi antre OTP a pou kontinye..
+        /// </summary>
+        public static string v2_otp_instruction {
+            get {
+                return ResourceManager.GetString("v2_otp_instruction", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to OTP ale ak sikse. Tanpri verifye mesaj ou!.
+        /// </summary>
+        public static string v2_otp_sent_successfully {
+            get {
+                return ResourceManager.GetString("v2_otp_sent_successfully", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kole.
+        /// </summary>
+        public static string v2_paste {
+            get {
+                return ResourceManager.GetString("v2_paste", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Peman.
+        /// </summary>
+        public static string v2_payment {
+            get {
+                return ResourceManager.GetString("v2_payment", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Metod peman.
+        /// </summary>
+        public static string v2_payment_method {
+            get {
+                return ResourceManager.GetString("v2_payment_method", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Lajan’¸ an transfere ak sikse!.
+        /// </summary>
+        public static string v2_payment_successfully {
+            get {
+                return ResourceManager.GetString("v2_payment_successfully", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Prim ou ka genyen.
+        /// </summary>
+        public static string v2_prize_if_win {
+            get {
+                return ResourceManager.GetString("v2_prize_if_win", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Dat ou achte a.
+        /// </summary>
+        public static string v2_purchase_date {
+            get {
+                return ResourceManager.GetString("v2_purchase_date", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo destinate.
+        /// </summary>
+        public static string v2_receiver_phone {
+            get {
+                return ResourceManager.GetString("v2_receiver_phone", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Demand nouvo OTP.
+        /// </summary>
+        public static string v2_request_new_otp {
+            get {
+                return ResourceManager.GetString("v2_request_new_otp", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tou.
+        /// </summary>
+        public static string v2_round {
+            get {
+                return ResourceManager.GetString("v2_round", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Pou jwet sa a, sistem nan ap konte konbyen nan 20 nimewo ki tire yo ki:.
+        /// </summary>
+        public static string v2_rule_drawn_count_desc {
+            get {
+                return ResourceManager.GetString("v2_rule_drawn_count_desc", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Anrejistre.
+        /// </summary>
+        public static string v2_save {
+            get {
+                return ResourceManager.GetString("v2_save", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi.
+        /// </summary>
+        public static string v2_select {
+            get {
+                return ResourceManager.GetString("v2_select", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi nimewo chans.
+        /// </summary>
+        public static string v2_select_10_lucky_numbers {
+            get {
+                return ResourceManager.GetString("v2_select_10_lucky_numbers", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi.
+        /// </summary>
+        public static string v2_selected {
+            get {
+                return ResourceManager.GetString("v2_selected", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi tike.
+        /// </summary>
+        public static string v2_selected_ticket {
+            get {
+                return ResourceManager.GetString("v2_selected_ticket", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo espedite.
+        /// </summary>
+        public static string v2_sender_phone {
+            get {
+                return ResourceManager.GetString("v2_sender_phone", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Touche pouw we detay .
+        /// </summary>
+        public static string v2_tap_to_see_detail {
+            get {
+                return ResourceManager.GetString("v2_tap_to_see_detail", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tike.
+        /// </summary>
+        public static string v2_ticket {
+            get {
+                return ResourceManager.GetString("v2_ticket", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kod tike.
+        /// </summary>
+        public static string v2_ticket_code {
+            get {
+                return ResourceManager.GetString("v2_ticket_code", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to detay tike .
+        /// </summary>
+        public static string v2_ticket_detail {
+            get {
+                return ResourceManager.GetString("v2_ticket_detail", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to tike sa pa valid.
+        /// </summary>
+        public static string v2_ticket_not_valid {
+            get {
+                return ResourceManager.GetString("v2_ticket_not_valid", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Transfere.
+        /// </summary>
+        public static string v2_transfer {
+            get {
+                return ResourceManager.GetString("v2_transfer", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Rezilta yo disponib.
+        /// </summary>
+        public static string v2_updating_results {
+            get {
+                return ResourceManager.GetString("v2_updating_results", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tann.
+        /// </summary>
+        public static string v2_waiting {
+            get {
+                return ResourceManager.GetString("v2_waiting", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Genyen.
+        /// </summary>
+        public static string v2_win {
+            get {
+                return ResourceManager.GetString("v2_win", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Sa ou chwazi.
+        /// </summary>
+        public static string v2_you_choose {
+            get {
+                return ResourceManager.GetString("v2_you_choose", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Chwazi.
+        /// </summary>
+        public static string v2_your_choice {
+            get {
+                return ResourceManager.GetString("v2_your_choice", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Veifye kont ou pou konekte.
+        /// </summary>
+        public static string verify_otp {
+            get {
+                return ResourceManager.GetString("verify_otp", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tann rezilta a.
+        /// </summary>
+        public static string waiting_for_result {
+            get {
+                return ResourceManager.GetString("waiting_for_result", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kont sa pa aktive.
+        /// </summary>
+        public static string wallet_not_active {
+            get {
+                return ResourceManager.GetString("wallet_not_active", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Tranzaksyon sa pa reyisi, ou pa gen kont Natcash. Pou kreye kont Natcash, fe *202# epi swiv enstriksyon yo. Mesi!.
+        /// </summary>
+        public static string wallet_not_existed {
+            get {
+                return ResourceManager.GetString("wallet_not_existed", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Welcome to Bee Lotto.
+        /// </summary>
+        public static string welcome_to_bee_loto {
+            get {
+                return ResourceManager.GetString("welcome_to_bee_loto", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Genyen.
+        /// </summary>
+        public static string win {
+            get {
+                return ResourceManager.GetString("win", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Kont ganyan.
+        /// </summary>
+        public static string winning_account {
+            get {
+                return ResourceManager.GetString("winning_account", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Modpas la pa bon. Tanpri eseye anko.
+        /// </summary>
+        public static string wrong_otp {
+            get {
+                return ResourceManager.GetString("wrong_otp", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ou anrejistre kont Loto ou ak sikse.
+        /// </summary>
+        public static string you_have_registered_Bee_loto {
+            get {
+                return ResourceManager.GetString("you_have_registered_Bee_loto", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ou genyen, prim ou a se:.
+        /// </summary>
+        public static string you_have_winning_number {
+            get {
+                return ResourceManager.GetString("you_have_winning_number", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Ou pa ko gen ase laj pou sevis sa .
+        /// </summary>
+        public static string younger_to_use {
+            get {
+                return ResourceManager.GetString("younger_to_use", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nimewo ou .
+        /// </summary>
+        public static string your_number {
+            get {
+                return ResourceManager.GetString("your_number", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Komand sa depase 5000 HTG. Tanpri verifye anko..
+        /// </summary>
+        public static string your_password_reset {
+            get {
+                return ResourceManager.GetString("your_password_reset", resourceCulture);
+            }
+        }
+    }
+}

+ 2152 - 0
website_natcash/Languages/Lang.fr.resx

@@ -0,0 +1,2152 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="account_lock" xml:space="preserve">
+    <value>You number is locked. Please wait to 5:00 to try again.</value>
+  </data>
+  <data name="account_not_existed" xml:space="preserve">
+    <value>Your account is not existed</value>
+  </data>
+  <data name="add_more_order" xml:space="preserve">
+    <value>Add more</value>
+  </data>
+  <data name="agree_policy_1" xml:space="preserve">
+    <value>Using Bee Lotto indicates that you have agreed to the terms presented in the </value>
+  </data>
+  <data name="agree_policy_2" xml:space="preserve">
+    <value>Let us know your language preferences.</value>
+  </data>
+  <data name="already_have_an_account" xml:space="preserve">
+    <value>Already have an account?</value>
+  </data>
+  <data name="amount_transfered" xml:space="preserve">
+    <value>Amount to transfer</value>
+  </data>
+  <data name="auto_fill" xml:space="preserve">
+    <value>Auto fill</value>
+  </data>
+  <data name="basic_account" xml:space="preserve">
+    <value>Basic Account</value>
+  </data>
+  <data name="bee_account" xml:space="preserve">
+    <value>Natcom Lotto  Account</value>
+  </data>
+  <data name="bee_loto_des" xml:space="preserve">
+    <value>Natcom Lotto is a Bolet, Maryaj and Lotto3 games, results of NewYork and Florida lottery games. Pick your numbers and wait for the winning combination to be announced. You can convert the winning amount to Natcom mobile balance or Natcash. Good luck!</value>
+  </data>
+  <data name="bee_loto_intro" xml:space="preserve">
+    <value>Natcom Lotto is a new VAS lottery service of Natcom. You can play via USSD or WEB/APP. You can also receive SMS results with FREE once you send ON to 7777 and you can send OFF to 7777 to request for not receive MT sms results or MT information from Lottery and ON to recover MT sms.
+You can also try your luck with Natcom Lottery draw.
+We’ll help you create an account in a few easy steps.</value>
+  </data>
+  <data name="bet_amount" xml:space="preserve">
+    <value>Bet Amount</value>
+  </data>
+  <data name="bill_order" xml:space="preserve">
+    <value>Bill Order</value>
+  </data>
+  <data name="bolet" xml:space="preserve">
+    <value>Bolet</value>
+  </data>
+  <data name="bolet_content" xml:space="preserve">
+    <value>&lt;p&gt;&lt;span style="white-space:pre-wrap;"&gt;1. Bolet is a game in Bee Lotto. Customers choose any 2 numbers from 00 - 99. The minimum ticket value is 1 HTG, the maximum is 1,000 HTG. Bolet's results are based on the NUMBER and WIN4 results of the New York lottery. &lt;br&gt;&lt;br&gt;2. Bolet includes 3 prizes:&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Lot 1: includes the numbers in the 2nd and 3rd positions of the NUMBER draw. Winning ratio: buy 1 HTG win 50 HTG&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Lot 2: includes the numbers in the 1st and 2nd positions of the WIN4 draw. Winning ratio: buy 1 HTG win 20 HTG&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Lot 3: includes the numbers in the 3rd and 4th positions of the WIN4 draw. Winning ratio: buy 1 HTG win 20 HTG&lt;br&gt;&lt;br&gt;3. Ticket purchasing time&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Day frame: From 0:00 - 14:00. Result time: 14:30&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Night frame: From 15:00 - 20:00. Result time 20:30&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/p&gt;</value>
+  </data>
+  <data name="bolet_how_to_play" xml:space="preserve">
+    <value>&lt;p&gt;&lt;span style=white-space:pre-wrap;"&gt;&lt;strong&gt;&lt;span style="font-size: 20px;"&gt;How to play Bolet&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="brought_success" xml:space="preserve">
+    <value>You have bought ticket Natcom Lotto successfully.</value>
+  </data>
+  <data name="buy" xml:space="preserve">
+    <value>Buy</value>
+  </data>
+  <data name="buying" xml:space="preserve">
+    <value>Buying</value>
+  </data>
+  <data name="buying_code_not_existed" xml:space="preserve">
+    <value>Buying code is not existed</value>
+  </data>
+  <data name="buy_bolet" xml:space="preserve">
+    <value>Buy Bolet</value>
+  </data>
+  <data name="buy_lotto3" xml:space="preserve">
+    <value>Buy Lotto3</value>
+  </data>
+  <data name="buy_maryaj" xml:space="preserve">
+    <value>Buy Maryaj</value>
+  </data>
+  <data name="buy_ticket" xml:space="preserve">
+    <value>Buy Ticket</value>
+  </data>
+  <data name="buy_ticket1" xml:space="preserve">
+    <value>Buy ticket</value>
+  </data>
+  <data name="buy_time" xml:space="preserve">
+    <value>Buy Time</value>
+  </data>
+  <data name="call" xml:space="preserve">
+    <value>Call</value>
+  </data>
+  <data name="cancel" xml:space="preserve">
+    <value>Cancel</value>
+  </data>
+  <data name="cash_agent" xml:space="preserve">
+    <value>Cash Agent</value>
+  </data>
+  <data name="change_language" xml:space="preserve">
+    <value>Change Language</value>
+  </data>
+  <data name="change_password" xml:space="preserve">
+    <value>Change your password</value>
+  </data>
+  <data name="channel_buy" xml:space="preserve">
+    <value>Channel Buy</value>
+  </data>
+  <data name="check_phone_or_password" xml:space="preserve">
+    <value>Please check the number or password</value>
+  </data>
+  <data name="choose_your_number" xml:space="preserve">
+    <value>Choose your number</value>
+  </data>
+  <data name="clean_all" xml:space="preserve">
+    <value>Clean all</value>
+  </data>
+  <data name="close" xml:space="preserve">
+    <value>Close</value>
+  </data>
+  <data name="confirm" xml:space="preserve">
+    <value>Confirm</value>
+  </data>
+  <data name="confirm_otp" xml:space="preserve">
+    <value>Confirm OTP</value>
+  </data>
+  <data name="confirm_payment_1" xml:space="preserve">
+    <value>Confirm payment</value>
+  </data>
+  <data name="confirm_payment_2" xml:space="preserve">
+    <value>HTG to buy </value>
+  </data>
+  <data name="confirm_payment_3" xml:space="preserve">
+    <value>ticket, fee</value>
+  </data>
+  <data name="confirm_payment_4" xml:space="preserve">
+    <value>HTG, draw time</value>
+  </data>
+  <data name="confirm_payment_5" xml:space="preserve">
+    <value>. Please fill OTP:</value>
+  </data>
+  <data name="confirm_transaction" xml:space="preserve">
+    <value>Confirm transaction</value>
+  </data>
+  <data name="confirm_transfer_1" xml:space="preserve">
+    <value>Confirm transfer</value>
+  </data>
+  <data name="confirm_transfer_2" xml:space="preserve">
+    <value>HTG from Lottery account to</value>
+  </data>
+  <data name="confirm_transfer_3" xml:space="preserve">
+    <value>, fee 0 HTG. Please fill OTP:</value>
+  </data>
+  <data name="confirm_your_new_password" xml:space="preserve">
+    <value>Confirm your new password</value>
+  </data>
+  <data name="contact_us" xml:space="preserve">
+    <value>Contact us</value>
+  </data>
+  <data name="content" xml:space="preserve">
+    <value>Content</value>
+  </data>
+  <data name="continue" xml:space="preserve">
+    <value>Continue</value>
+  </data>
+  <data name="create_new_account" xml:space="preserve">
+    <value>Create new account</value>
+  </data>
+  <data name="creole" xml:space="preserve">
+    <value>Creole</value>
+  </data>
+  <data name="dateOfBirth" xml:space="preserve">
+    <value>Date of birth</value>
+  </data>
+  <data name="date_purchase" xml:space="preserve">
+    <value>Date of purchase</value>
+  </data>
+  <data name="days" xml:space="preserve">
+    <value>Days</value>
+  </data>
+  <data name="details" xml:space="preserve">
+    <value>Details</value>
+  </data>
+  <data name="detail_of_payment" xml:space="preserve">
+    <value>Details of Payment</value>
+  </data>
+  <data name="drawn" xml:space="preserve">
+    <value>Drawn</value>
+  </data>
+  <data name="draw_date" xml:space="preserve">
+    <value>Draw Date</value>
+  </data>
+  <data name="draw_time" xml:space="preserve">
+    <value>Draw Time</value>
+  </data>
+  <data name="english" xml:space="preserve">
+    <value>English</value>
+  </data>
+  <data name="enter_amount" xml:space="preserve">
+    <value>Enter amount 1-10,000 HTG</value>
+  </data>
+  <data name="enter_amount1" xml:space="preserve">
+    <value>Enter amount</value>
+  </data>
+  <data name="enter_amount_1_1000" xml:space="preserve">
+    <value>Enter amount (maximum 5000HTG/transaction)</value>
+  </data>
+  <data name="enter_birthday" xml:space="preserve">
+    <value>Enter your birthday</value>
+  </data>
+  <data name="enter_digit_2" xml:space="preserve">
+    <value>Enter 2 digits (00 to 99)</value>
+  </data>
+  <data name="enter_digit_3" xml:space="preserve">
+    <value>Enter 3 digits (000 to 999)</value>
+  </data>
+  <data name="enter_digit_4" xml:space="preserve">
+    <value>Enter 4 digits (0000 to 9999)</value>
+  </data>
+  <data name="enter_money" xml:space="preserve">
+    <value>Enter your money</value>
+  </data>
+  <data name="enter_name" xml:space="preserve">
+    <value>Enter your full name</value>
+  </data>
+  <data name="enter_otp" xml:space="preserve">
+    <value>Enter your OTP</value>
+  </data>
+  <data name="enter_otp_to_login" xml:space="preserve">
+    <value>Please enter your OTP to log in</value>
+  </data>
+  <data name="enter_password" xml:space="preserve">
+    <value>Enter your 6 digits password</value>
+  </data>
+  <data name="enter_phone_number" xml:space="preserve">
+    <value>Enter your number</value>
+  </data>
+  <data name="enter_your_new_password" xml:space="preserve">
+    <value>Enter your new password</value>
+  </data>
+  <data name="enter_your_old_password" xml:space="preserve">
+    <value>Enter your old password</value>
+  </data>
+  <data name="error_happened" xml:space="preserve">
+    <value>An error was happened. Please try again.</value>
+  </data>
+  <data name="error_happened1" xml:space="preserve">
+    <value>An error was happened. Please try again</value>
+  </data>
+  <data name="fail" xml:space="preserve">
+    <value>Fail</value>
+  </data>
+  <data name="faq" xml:space="preserve">
+    <value>FAQ</value>
+  </data>
+  <data name="fee" xml:space="preserve">
+    <value>Fee</value>
+  </data>
+  <data name="fee_tranfer" xml:space="preserve">
+    <value>Fee transfer</value>
+  </data>
+  <data name="fill_password" xml:space="preserve">
+    <value>Please fill your password</value>
+  </data>
+  <data name="fill_phone" xml:space="preserve">
+    <value>Please fill your phone number</value>
+  </data>
+  <data name="fill_your_number" xml:space="preserve">
+    <value>Please fill your number</value>
+  </data>
+  <data name="florida_lottery" xml:space="preserve">
+    <value>Florida Lottery</value>
+  </data>
+  <data name="forgot_password" xml:space="preserve">
+    <value>Forgot Password</value>
+  </data>
+  <data name="free" xml:space="preserve">
+    <value>Free</value>
+  </data>
+  <data name="from" xml:space="preserve">
+    <value>From</value>
+  </data>
+  <data name="from_your_number" xml:space="preserve">
+    <value>Transfer to Your number</value>
+  </data>
+  <data name="fullname_not_valid" xml:space="preserve">
+    <value>Your fullname is not valid</value>
+  </data>
+  <data name="get_otp1" xml:space="preserve">
+    <value>Get OTP</value>
+  </data>
+  <data name="get_started" xml:space="preserve">
+    <value>Get started</value>
+  </data>
+  <data name="have_chance_to_get" xml:space="preserve">
+    <value>Have a chance to get</value>
+  </data>
+  <data name="history" xml:space="preserve">
+    <value>History</value>
+  </data>
+  <data name="home" xml:space="preserve">
+    <value>Home</value>
+  </data>
+  <data name="home_page" xml:space="preserve">
+    <value>Homepage</value>
+  </data>
+  <data name="hours" xml:space="preserve">
+    <value>Hours</value>
+  </data>
+  <data name="how_to_play" xml:space="preserve">
+    <value>How to play ?</value>
+  </data>
+  <data name="internet_error" xml:space="preserve">
+    <value>Your internet has a problem.</value>
+  </data>
+  <data name="in_blacklist" xml:space="preserve">
+    <value>System is upgrading.</value>
+  </data>
+  <data name="in_draw_date" xml:space="preserve">
+    <value>Your number in this draw date:</value>
+  </data>
+  <data name="language" xml:space="preserve">
+    <value>Language</value>
+  </data>
+  <data name="login" xml:space="preserve">
+    <value>Log in</value>
+  </data>
+  <data name="login_fail_wrong_pass" xml:space="preserve">
+    <value>Login failed because incorrect password.</value>
+  </data>
+  <data name="logout" xml:space="preserve">
+    <value>Log out</value>
+  </data>
+  <data name="loto_des_v2" xml:space="preserve">
+    <value> is a Bolet, Maryaj and Lotto3 games, results of NewYork and Florida lottery games. Pick your numbers and wait for the winning combination to be announced. You can convert the winning amount to Natcom mobile balance or Natcash. Good luck!</value>
+  </data>
+  <data name="lotto3" xml:space="preserve">
+    <value>Lotto3</value>
+  </data>
+  <data name="lotto3_content" xml:space="preserve">
+    <value>&lt;p&gt;&lt;span style="white-space:pre-wrap;"&gt;1. Bolet is a game in Bee Lotto. Customers choose any 2 numbers from 00 - 99. The minimum ticket value is 1 HTG, the maximum is 1,000 HTG. Bolet's results are based on the NUMBER and WIN4 results of the New York lottery. &lt;br&gt;&lt;br&gt;2. Bolet includes 3 prizes:&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Lot 1: includes the numbers in the 2nd and 3rd positions of the NUMBER draw. Winning ratio: buy 1 HTG win 50 HTG&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Lot 2: includes the numbers in the 1st and 2nd positions of the WIN4 draw. Winning ratio: buy 1 HTG win 20 HTG&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Lot 3: includes the numbers in the 3rd and 4th positions of the WIN4 draw. Winning ratio: buy 1 HTG win 20 HTG&lt;br&gt;&lt;br&gt;3. Ticket purchasing time&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Day frame: From 0:00 - 14:00. Result time: 14:30&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Night frame: From 15:00 - 20:00. Result time 20:30&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/p&gt;</value>
+  </data>
+  <data name="maryaj" xml:space="preserve">
+    <value>Maryaj</value>
+  </data>
+  <data name="marya_content" xml:space="preserve">
+    <value>&lt;p&gt;&lt;span style="white-space:pre-wrap;"&gt;1. Bolet is a game in Bee Lotto. Customers choose any 2 numbers from 00 - 99. The minimum ticket value is 1 HTG, the maximum is 1,000 HTG. Bolet's results are based on the NUMBER and WIN4 results of the New York lottery. &lt;br&gt;&lt;br&gt;2. Bolet includes 3 prizes:&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Lot 1: includes the numbers in the 2nd and 3rd positions of the NUMBER draw. Winning ratio: buy 1 HTG win 50 HTG&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Lot 2: includes the numbers in the 1st and 2nd positions of the WIN4 draw. Winning ratio: buy 1 HTG win 20 HTG&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Lot 3: includes the numbers in the 3rd and 4th positions of the WIN4 draw. Winning ratio: buy 1 HTG win 20 HTG&lt;br&gt;&lt;br&gt;3. Ticket purchasing time&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Day frame: From 0:00 - 14:00. Result time: 14:30&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Night frame: From 15:00 - 20:00. Result time 20:30&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/p&gt;</value>
+  </data>
+  <data name="max_5_tickets" xml:space="preserve">
+    <value>The max number of tickets is 5 tickets. Please check again.</value>
+  </data>
+  <data name="max_transfer_1000HTG" xml:space="preserve">
+    <value>Max transering is 10,000HTG. Please check again.</value>
+  </data>
+  <data name="mins" xml:space="preserve">
+    <value>Mins</value>
+  </data>
+  <data name="money" xml:space="preserve">
+    <value>Money</value>
+  </data>
+  <data name="money_on" xml:space="preserve">
+    <value>Transfer amount (HTG)</value>
+  </data>
+  <data name="more" xml:space="preserve">
+    <value>More</value>
+  </data>
+  <data name="must_login" xml:space="preserve">
+    <value>You have not logined yet. Please login to do this action.</value>
+  </data>
+  <data name="name" xml:space="preserve">
+    <value>Name</value>
+  </data>
+  <data name="NatCash" xml:space="preserve">
+    <value>NatCash</value>
+  </data>
+  <data name="new_pass_error" xml:space="preserve">
+    <value>Please check your new password</value>
+  </data>
+  <data name="new_york_lottery" xml:space="preserve">
+    <value>New York Lottery</value>
+  </data>
+  <data name="next_draw" xml:space="preserve">
+    <value>Next Draw</value>
+  </data>
+  <data name="note_password" xml:space="preserve">
+    <value>Note: Keep your password, and don't share with anyone.</value>
+  </data>
+  <data name="not_defined" xml:space="preserve">
+    <value>not defined</value>
+  </data>
+  <data name="not_draw" xml:space="preserve">
+    <value>Not draw</value>
+  </data>
+  <data name="not_enough_money" xml:space="preserve">
+    <value>Your money on Lottery Account has not enough to process the transaction.</value>
+  </data>
+  <data name="not_enough_money_to_exchange" xml:space="preserve">
+    <value>Not enough money to exchange.</value>
+  </data>
+  <data name="not_get_otp" xml:space="preserve">
+    <value>Didn't get OTP?</value>
+  </data>
+  <data name="not_register_natcash" xml:space="preserve">
+    <value>Receiver has not registered Natcash yet. Please check again the Natcash account.</value>
+  </data>
+  <data name="not_win" xml:space="preserve">
+    <value>Not win</value>
+  </data>
+  <data name="no_permission" xml:space="preserve">
+    <value>You have no permission to do this action</value>
+  </data>
+  <data name="number" xml:space="preserve">
+    <value>Number</value>
+  </data>
+  <data name="or" xml:space="preserve">
+    <value>OR</value>
+  </data>
+  <data name="order_code" xml:space="preserve">
+    <value>Order code</value>
+  </data>
+  <data name="or_select" xml:space="preserve">
+    <value>Or select amount (HTG)</value>
+  </data>
+  <data name="otp" xml:space="preserve">
+    <value>OTP</value>
+  </data>
+  <data name="otp_invalid" xml:space="preserve">
+    <value>OTP is invalid</value>
+  </data>
+  <data name="otp_timeout" xml:space="preserve">
+    <value>OTP timeout</value>
+  </data>
+  <data name="over_1000HTG_transfer" xml:space="preserve">
+    <value>Your order is over 5000 HTG. Please check again.</value>
+  </data>
+  <data name="over_each_exchange" xml:space="preserve">
+    <value>Your money is over the limit for each exchange.</value>
+  </data>
+  <data name="over_exchange_per_day" xml:space="preserve">
+    <value>Your money is over the limit for exchange in a day.</value>
+  </data>
+  <data name="params_invalid" xml:space="preserve">
+    <value>Params are invalid</value>
+  </data>
+  <data name="password" xml:space="preserve">
+    <value>Password</value>
+  </data>
+  <data name="password_tip" xml:space="preserve">
+    <value>Password Tips</value>
+  </data>
+  <data name="pass_tip_1" xml:space="preserve">
+    <value>1. Must be 6 digits</value>
+  </data>
+  <data name="pass_tip_2" xml:space="preserve">
+    <value>2. Password strong: from 0 - 9, should be included character (not special characters)</value>
+  </data>
+  <data name="payment" xml:space="preserve">
+    <value>Payment</value>
+  </data>
+  <data name="payment_account" xml:space="preserve">
+    <value>Payment Account</value>
+  </data>
+  <data name="payment_mothod" xml:space="preserve">
+    <value>Payment Method</value>
+  </data>
+  <data name="phone_invalid" xml:space="preserve">
+    <value>Your phone number is not valid.</value>
+  </data>
+  <data name="phone_number" xml:space="preserve">
+    <value>Phone number</value>
+  </data>
+  <data name="pin_wrong" xml:space="preserve">
+    <value>Your pin is wrong</value>
+  </data>
+  <data name="play" xml:space="preserve">
+    <value>Play</value>
+  </data>
+  <data name="price" xml:space="preserve">
+    <value>Price</value>
+  </data>
+  <data name="profile" xml:space="preserve">
+    <value>Profile</value>
+  </data>
+  <data name="promotion_code_inactive" xml:space="preserve">
+    <value>Your promotion code is not active</value>
+  </data>
+  <data name="promotion_code_invalid" xml:space="preserve">
+    <value>Your promotion code is invalid</value>
+  </data>
+  <data name="promotion_code_used" xml:space="preserve">
+    <value>Your promotion code was used.</value>
+  </data>
+  <data name="question" xml:space="preserve">
+    <value>Question</value>
+  </data>
+  <data name="receiver" xml:space="preserve">
+    <value>Receiver</value>
+  </data>
+  <data name="receiver_phone" xml:space="preserve">
+    <value>To other Natcom's number</value>
+  </data>
+  <data name="register" xml:space="preserve">
+    <value>Register</value>
+  </data>
+  <data name="reorder" xml:space="preserve">
+    <value>Re-order</value>
+  </data>
+  <data name="resend_otp" xml:space="preserve">
+    <value>Resend OTP</value>
+  </data>
+  <data name="resent_otp" xml:space="preserve">
+    <value>Resent OTP</value>
+  </data>
+  <data name="reset_after_1_minute" xml:space="preserve">
+    <value>Please reset pass after 1 minute.</value>
+  </data>
+  <data name="results" xml:space="preserve">
+    <value>Results</value>
+  </data>
+  <data name="return_home_page" xml:space="preserve">
+    <value>Return to home page</value>
+  </data>
+  <data name="review_payment" xml:space="preserve">
+    <value>Review Payment</value>
+  </data>
+  <data name="rules" xml:space="preserve">
+    <value>Rules</value>
+  </data>
+  <data name="search" xml:space="preserve">
+    <value>Search</value>
+  </data>
+  <data name="seconds" xml:space="preserve">
+    <value>Secs</value>
+  </data>
+  <data name="see_more" xml:space="preserve">
+    <value>See more</value>
+  </data>
+  <data name="select_an_account" xml:space="preserve">
+    <value>Transfer to your account</value>
+  </data>
+  <data name="sender" xml:space="preserve">
+    <value>Sender</value>
+  </data>
+  <data name="sender_phone" xml:space="preserve">
+    <value>Your number</value>
+  </data>
+  <data name="skip_to_guest" xml:space="preserve">
+    <value>Skip to login as a Guest</value>
+  </data>
+  <data name="start_using_bee_loto" xml:space="preserve">
+    <value>Start Using Bee Lotto</value>
+  </data>
+  <data name="status" xml:space="preserve">
+    <value>Status</value>
+  </data>
+  <data name="success" xml:space="preserve">
+    <value>Success</value>
+  </data>
+  <data name="system_update" xml:space="preserve">
+    <value>The system is updating. Please try again after 1 minutes.</value>
+  </data>
+  <data name="term" xml:space="preserve">
+    <value>Buying Date</value>
+  </data>
+  <data name="terms_and_conditions" xml:space="preserve">
+    <value>Terms &amp; Conditions. </value>
+  </data>
+  <data name="term_timeout" xml:space="preserve">
+    <value>This term's time is timeout. Please try again.</value>
+  </data>
+  <data name="thank_you" xml:space="preserve">
+    <value>Thank you!</value>
+  </data>
+  <data name="ticket" xml:space="preserve">
+    <value>Ticket</value>
+  </data>
+  <data name="ticket_code" xml:space="preserve">
+    <value>Bill code</value>
+  </data>
+  <data name="ticket_invalid" xml:space="preserve">
+    <value>Your tickets are not valid</value>
+  </data>
+  <data name="time" xml:space="preserve">
+    <value>Time</value>
+  </data>
+  <data name="to" xml:space="preserve">
+    <value>To</value>
+  </data>
+  <data name="token_invalid" xml:space="preserve">
+    <value>Your token is invalid</value>
+  </data>
+  <data name="total_money" xml:space="preserve">
+    <value>Total money</value>
+  </data>
+  <data name="total_ticket" xml:space="preserve">
+    <value>Total tickets</value>
+  </data>
+  <data name="to_other_natcom_number" xml:space="preserve">
+    <value>To other Natcom number</value>
+  </data>
+  <data name="tranfer_win_money" xml:space="preserve">
+    <value>Withdraw money</value>
+  </data>
+  <data name="transfer" xml:space="preserve">
+    <value>Transfer</value>
+  </data>
+  <data name="transfer_method" xml:space="preserve">
+    <value>Transfer Method</value>
+  </data>
+  <data name="transfer_success" xml:space="preserve">
+    <value>Money has been transferred successfully!</value>
+  </data>
+  <data name="type" xml:space="preserve">
+    <value>Type</value>
+  </data>
+  <data name="update" xml:space="preserve">
+    <value>Update</value>
+  </data>
+  <data name="update_successful" xml:space="preserve">
+    <value>Update successful</value>
+  </data>
+  <data name="user_avatar_error" xml:space="preserve">
+    <value>User avatar error</value>
+  </data>
+  <data name="verify_otp" xml:space="preserve">
+    <value>Verify your account to login</value>
+  </data>
+  <data name="waiting_for_result" xml:space="preserve">
+    <value>Waiting the result</value>
+  </data>
+  <data name="wallet_not_active" xml:space="preserve">
+    <value>Your wallet is not active.</value>
+  </data>
+  <data name="wallet_not_existed" xml:space="preserve">
+    <value>Your transaction unsuccessful, you are not register a Natcash account. To register Natcash, dial *202# and follow the instruction. Thank you!</value>
+  </data>
+  <data name="welcome_to_bee_loto" xml:space="preserve">
+    <value>Welcome to Bee Lotto</value>
+  </data>
+  <data name="win" xml:space="preserve">
+    <value>Win</value>
+  </data>
+  <data name="winning_account" xml:space="preserve">
+    <value>Winning Account</value>
+  </data>
+  <data name="wrong_otp" xml:space="preserve">
+    <value>The password is incorrect. Please try again.</value>
+  </data>
+  <data name="younger_to_use" xml:space="preserve">
+    <value>Your are too younger to use this service.</value>
+  </data>
+  <data name="your_number" xml:space="preserve">
+    <value>Your number</value>
+  </data>
+  <data name="your_password_reset" xml:space="preserve">
+    <value>Your order is over 5000 HTG. Please check again.</value>
+  </data>
+  <data name="you_have_registered_Bee_loto" xml:space="preserve">
+    <value>You have registerd your Bee Lotto Account Successfully</value>
+  </data>
+  <data name="you_have_winning_number" xml:space="preserve">
+    <value>You have winning number, winning prize is:</value>
+  </data>
+  <data name="quick_pick" xml:space="preserve">
+    <value>Quick Pick</value>
+  </data>
+  <data name="my_ticket" xml:space="preserve">
+    <value>My Tickit</value>
+  </data>
+  <data name="jackpot_prize" xml:space="preserve">
+    <value>Jackpot Prize</value>
+  </data>
+  <data name="next_round" xml:space="preserve">
+    <value>Next Round</value>
+  </data>
+  <data name="small_big" xml:space="preserve">
+    <value>Small Big</value>
+  </data>
+  <data name="odd_even" xml:space="preserve">
+    <value>Odd Even</value>
+  </data>
+  <data name="v2_select" xml:space="preserve">
+    <value>Select</value>
+  </data>
+  <data name="v2_selected" xml:space="preserve">
+    <value>Selected</value>
+  </data>
+  <data name="v2_prize_if_win" xml:space="preserve">
+    <value>Prize if win</value>
+  </data>
+  <data name="v2_you_choose" xml:space="preserve">
+    <value>Your Choose</value>
+  </data>
+  <data name="how_to_play_pick10" xml:space="preserve">
+    <value>How to play Pick 10</value>
+  </data>
+  <data name="how_to_play_millionair" xml:space="preserve">
+    <value>How to play Millionair?</value>
+  </data>
+  <data name="how_to_play_megabet" xml:space="preserve">
+    <value>How to play Mega Bet?</value>
+  </data>
+  <data name="MEGA" xml:space="preserve">
+    <value>MEGA</value>
+  </data>
+  <data name="Bet" xml:space="preserve">
+    <value>Bet</value>
+  </data>
+  <data name="faq_q1" xml:space="preserve">
+    <value>How do I play the Pick 10 game?</value>
+  </data>
+  <data name="faq_a1" xml:space="preserve">
+    <value>Pick 10 numbers from 1 to 80 or choose the Quick Pick option. Purchase your ticket and wait for the draw.</value>
+  </data>
+  <data name="faq_q2" xml:space="preserve">
+    <value>When do Pick 10 draws take place?</value>
+  </data>
+  <data name="faq_a2" xml:space="preserve">
+    <value>Draws take place every day at 8:30 p.m. Ticket sales stop at 8:00 p.m.</value>
+  </data>
+  <data name="faq_a3" xml:space="preserve">
+    <value>The odds of winning the top Pick 10 prize are 1 in 8,911,711.</value>
+  </data>
+  <data name="rule_payment_shortly" xml:space="preserve">
+    <value>Payments successfully completed shortly after 20:00 may still be accepted for the current draw.</value>
+  </data>
+  <data name="rule_system_count_final" xml:space="preserve">
+    <value>The official system count and result are final.</value>
+  </data>
+  <data name="rule_select" xml:space="preserve">
+    <value>Select</value>
+  </data>
+  <data name="rule_if_purchased_small" xml:space="preserve">
+    <value>If you purchased a SMALL ticket:</value>
+  </data>
+  <data name="rule_jackpot_prize" xml:space="preserve">
+    <value>Jackpot Prize</value>
+  </data>
+  <data name="rule_regulation_draw" xml:space="preserve">
+    <value>RegulationDraw</value>
+  </data>
+  <data name="rule_objective" xml:space="preserve">
+    <value>Objective.</value>
+  </data>
+  <data name="rule_general_info" xml:space="preserve">
+    <value>I. GENERAL INFORMATION</value>
+  </data>
+  <data name="rule_oe_winning_rule" xml:space="preserve">
+    <value>ODD / EVEN &amp;#8211; WINNING RULE</value>
+  </data>
+  <data name="rule_ticket_closure" xml:space="preserve">
+    <value>Ticket Closing Time</value>
+  </data>
+  <data name="rule_standard_prize" xml:space="preserve">
+    <value>Standard Prize Structure</value>
+  </data>
+  <data name="rule_if_purchased_odd" xml:space="preserve">
+    <value>If you purchased an Odd ticket:</value>
+  </data>
+  <data name="rule_condition" xml:space="preserve">
+    <value>Condition</value>
+  </data>
+  <data name="rule_match_all_10" xml:space="preserve">
+    <value>Match all 10 numbers &amp;#9989;</value>
+  </data>
+  <data name="rule_if_15_odd_result_odd" xml:space="preserve">
+    <value>If 15 or more numbers among the 20 drawn numbers are Odd numbers,&lt;br&gt;the official result is &lt;span class="font-bold text-[#A236C8]"&gt;ODD&lt;/span&gt;.</value>
+  </data>
+  <data name="rule_title" xml:space="preserve">
+    <value>Rules</value>
+  </data>
+  <data name="rule_classic_pick_10" xml:space="preserve">
+    <value>Basic Pick 10</value>
+  </data>
+  <data name="rule_big_small" xml:space="preserve">
+    <value>Big Small</value>
+  </data>
+  <data name="rule_odd_even" xml:space="preserve">
+    <value>Odd Even</value>
+  </data>
+  <data name="rule_13_numbers_game" xml:space="preserve">
+    <value>(13 Numbers Game)</value>
+  </data>
+  <data name="rule_15_numbers_game" xml:space="preserve">
+    <value>(15 Numbers Game)</value>
+  </data>
+  <data name="rule_item" xml:space="preserve">
+    <value>Item</value>
+  </data>
+  <data name="rule_time" xml:space="preserve">
+    <value>Time</value>
+  </data>
+  <data name="rule_total_numbers" xml:space="preserve">
+    <value>Total Numbers</value>
+  </data>
+  <data name="rule_numbers_drawn" xml:space="preserve">
+    <value>Numbers Drawn</value>
+  </data>
+  <data name="rule_purchase_channels" xml:space="preserve">
+    <value>Purchase Channels</value>
+  </data>
+  <data name="rule_result_channel" xml:space="preserve">
+    <value>Result Channel</value>
+  </data>
+  <data name="rule_duplicate_allowed" xml:space="preserve">
+    <value>Duplicate Numbers Allowed</value>
+  </data>
+  <data name="rule_identical_allowed" xml:space="preserve">
+    <value>Identical Tickets Allowed</value>
+  </data>
+  <data name="rule_20_30_daily" xml:space="preserve">
+    <value>20:30 daily</value>
+  </data>
+  <data name="rule_20_00_daily" xml:space="preserve">
+    <value>20:00 daily</value>
+  </data>
+  <data name="rule_01_80" xml:space="preserve">
+    <value>01 - 80</value>
+  </data>
+  <data name="rule_20_per_draw" xml:space="preserve">
+    <value>20 numbers per draw</value>
+  </data>
+  <data name="rule_ussd_web_app" xml:space="preserve">
+    <value>USSD / Web / APP</value>
+  </data>
+  <data name="rule_web_app" xml:space="preserve">
+    <value>Web / APP</value>
+  </data>
+  <data name="rule_yes" xml:space="preserve">
+    <value>Yes</value>
+  </data>
+  <data name="rule_game_1_title" xml:space="preserve">
+    <value>II. GAME 1 – BASIC PICK 10</value>
+  </data>
+  <data name="rule_basic_pick" xml:space="preserve">
+    <value>Basic&lt;br&gt;Pick</value>
+  </data>
+  <data name="rule_next_round" xml:space="preserve">
+    <value>Next round</value>
+  </data>
+  <data name="rule_play_now" xml:space="preserve">
+    <value>Play Now</value>
+  </data>
+  <data name="rule_how_to_play" xml:space="preserve">
+    <value>How to Play</value>
+  </data>
+  <data name="rule_description" xml:space="preserve">
+    <value>Description</value>
+  </data>
+  <data name="rule_ticket_price" xml:space="preserve">
+    <value>Ticket Price</value>
+  </data>
+  <data name="rule_10_htg" xml:space="preserve">
+    <value>10 HTG</value>
+  </data>
+  <data name="rule_selection_method" xml:space="preserve">
+    <value>Selection Method</value>
+  </data>
+  <data name="rule_choose_10" xml:space="preserve">
+    <value>Choose 10 numbers from 01–80.</value>
+  </data>
+  <data name="rule_winning_rule" xml:space="preserve">
+    <value>Winning Rule</value>
+  </data>
+  <data name="rule_10_taken_from" xml:space="preserve">
+    <value>10 numbers will be taken from the 20 Drawn numbers as the official</value>
+  </data>
+  <data name="rule_match_as_many" xml:space="preserve">
+    <value>Match as many numbers as possible.</value>
+  </data>
+  <data name="rule_jackpot_rule" xml:space="preserve">
+    <value>Jackpot Rule</value>
+  </data>
+  <data name="rule_prize_pool" xml:space="preserve">
+    <value>Prize Pool</value>
+  </data>
+  <data name="rule_if_le_10" xml:space="preserve">
+    <value>If ≤ 10 winners</value>
+  </data>
+  <data name="rule_each_receives" xml:space="preserve">
+    <value>Each winner receives 💰100,000 HTG.</value>
+  </data>
+  <data name="rule_if_gt_10" xml:space="preserve">
+    <value>If &gt; 10 winners</value>
+  </data>
+  <data name="rule_shared_equally" xml:space="preserve">
+    <value>💰1,000,000 HTG shared equally among winners.</value>
+  </data>
+  <data name="rule_numbers_matches" xml:space="preserve">
+    <value>Numbers Matches</value>
+  </data>
+  <data name="rule_prize_pool_htg" xml:space="preserve">
+    <value>Prize Pool (HTG)</value>
+  </data>
+  <data name="rule_prize_12k" xml:space="preserve">
+    <value>💰12,000 HTG.</value>
+  </data>
+  <data name="rule_prize_600" xml:space="preserve">
+    <value>💰600 HTG.</value>
+  </data>
+  <data name="rule_prize_160" xml:space="preserve">
+    <value>💰160 HTG.</value>
+  </data>
+  <data name="rule_prize_20" xml:space="preserve">
+    <value>💰20 HTG.</value>
+  </data>
+  <data name="rule_prize_5" xml:space="preserve">
+    <value>💰5 HTG.</value>
+  </data>
+  <data name="rule_sales_cutoff" xml:space="preserve">
+    <value>Ticket Sales Cut-off Time</value>
+  </data>
+  <data name="rule_sales_close" xml:space="preserve">
+    <value>Ticket sales close at 20:00 daily.</value>
+  </data>
+  <data name="rule_if_making_payment" xml:space="preserve">
+    <value>If you are making a payment near the cut-off time:</value>
+  </data>
+  <data name="rule_payment_later" xml:space="preserve">
+    <value>Payments completed later will be automatically recorded for the next draw.</value>
+  </data>
+  <data name="rule_system_time" xml:space="preserve">
+    <value>The official system time will determine ticket validity.</value>
+  </data>
+  <data name="rule_bs_winning_rule" xml:space="preserve">
+    <value>BIG  SMALL – WINNING RULE</value>
+  </data>
+  <data name="rule_how_to_win" xml:space="preserve">
+    <value>How to win?</value>
+  </data>
+  <data name="rule_buy_big_small" xml:space="preserve">
+    <value>When you purchase a ticket, you choose either BIG or SMALL.</value>
+  </data>
+  <data name="rule_system_check_20" xml:space="preserve">
+    <value>After the draw, the system will check the 20 drawn numbers.</value>
+  </data>
+  <data name="rule_bs_prize" xml:space="preserve">
+    <value>Big Small Prize</value>
+  </data>
+  <data name="rule_if_purchased_big" xml:space="preserve">
+    <value>If you purchased a BIG ticket:</value>
+  </data>
+  <data name="rule_13_from_41_80" xml:space="preserve">
+    <value>13 number from &lt;span class="font-[900]"&gt;41-80&lt;/span&gt;</value>
+  </data>
+  <data name="rule_selected" xml:space="preserve">
+    <value>Selected</value>
+  </data>
+  <data name="rule_if_13_41_80" xml:space="preserve">
+    <value>If 13 numbers among the 20 drawn numbers fall within the range &lt;span class="text-[#0BA01A] font-bold"&gt;41–80&lt;/span&gt;,</value>
+  </data>
+  <data name="rule_you_win" xml:space="preserve">
+    <value>You win.</value>
+  </data>
+  <data name="rule_13_from_01_40" xml:space="preserve">
+    <value>13 number from &lt;span class="font-[900]"&gt;01-40&lt;/span&gt;</value>
+  </data>
+  <data name="rule_if_13_01_40" xml:space="preserve">
+    <value>If 13 numbers among the 20 drawn numbers fall within the range &lt;span class="text-[#0BA01A] font-bold"&gt;01–40&lt;/span&gt;,</value>
+  </data>
+  <data name="rule_example" xml:space="preserve">
+    <value>Example</value>
+  </data>
+  <data name="rule_if_20_drawn_contain" xml:space="preserve">
+    <value>If the 20 drawn numbers contain:</value>
+  </data>
+  <data name="rule_13_or_more_41_80" xml:space="preserve">
+    <value>13 or more numbers between &lt;span class="text-[#0BA01A] font-bold"&gt;41–80&lt;/span&gt; → BIG wins</value>
+  </data>
+  <data name="rule_13_or_more_01_40" xml:space="preserve">
+    <value>13 or more numbers between &lt;span class="text-[#0BA01A] font-bold"&gt;01–40&lt;/span&gt; → SMALL wins</value>
+  </data>
+  <data name="rule_prize_pool_title" xml:space="preserve">
+    <value>PRIZE POOL</value>
+  </data>
+  <data name="rule_win_receive_2x" xml:space="preserve">
+    <value>Winning tickets receive 2x the bet amount.</value>
+  </data>
+  <data name="rule_example_bet_50" xml:space="preserve">
+    <value>Example: Bet 50 HTG → Win 100 HTG.</value>
+  </data>
+  <data name="rule_how_result_determined" xml:space="preserve">
+    <value>How the Winning Result is Determined</value>
+  </data>
+  <data name="rule_system_draws_20_01_80" xml:space="preserve">
+    <value>The system draws 20 numbers from 01 to 80.</value>
+  </data>
+  <data name="rule_system_count_how_many" xml:space="preserve">
+    <value>For this game, the system will count how many of the 20 drawn numbers are:</value>
+  </data>
+  <data name="rule_odd_numbers" xml:space="preserve">
+    <value>Odd numbers</value>
+  </data>
+  <data name="rule_even_numbers" xml:space="preserve">
+    <value>Even numbers</value>
+  </data>
+  <data name="rule_oe_prize" xml:space="preserve">
+    <value>Odd/Even Prize</value>
+  </data>
+  <data name="rule_winning_condition" xml:space="preserve">
+    <value>Winning Condition</value>
+  </data>
+  <data name="rule_if_15_even_result_even" xml:space="preserve">
+    <value>If 15 or more numbers among the 20 drawn numbers are Even numbers,&lt;br&gt;the official result is &lt;span class="font-bold text-[#A236C8]"&gt;EVEN&lt;/span&gt;.</value>
+  </data>
+  <data name="rule_how_ticket_wins" xml:space="preserve">
+    <value>HOW YOUR TICKET WINS</value>
+  </data>
+  <data name="rule_odd_numbers_13579" xml:space="preserve">
+    <value>Odd numbers &lt;span class="font-[900]"&gt;1,3,5,7,9&lt;/span&gt;</value>
+  </data>
+  <data name="rule_if_20_contain_15_odd" xml:space="preserve">
+    <value>If the 20 drawn numbers contain 15 or more &lt;span class="font-bold"&gt;odd&lt;/span&gt; numbers</value>
+  </data>
+  <data name="rule_if_purchased_even" xml:space="preserve">
+    <value>If you purchased a Even ticket:</value>
+  </data>
+  <data name="rule_even_numbers_02468" xml:space="preserve">
+    <value>Even numbers &lt;span class="font-[900]"&gt;0,2,4,6,8&lt;/span&gt;</value>
+  </data>
+  <data name="rule_if_20_contain_15_even" xml:space="preserve">
+    <value>If the 20 drawn numbers contain 15 or more &lt;span class="font-bold"&gt;even&lt;/span&gt; numbers</value>
+  </data>
+  <data name="rule_example_16_odd" xml:space="preserve">
+    <value>16 odd numbers</value>
+  </data>
+  <data name="rule_example_4_even" xml:space="preserve">
+    <value>4 even numbers</value>
+  </data>
+  <data name="rule_result_is_odd" xml:space="preserve">
+    <value>The official result is &lt;span class="text-[#A236C8]"&gt;ODD&lt;/span&gt;.</value>
+  </data>
+  <data name="rule_all_odd_win" xml:space="preserve">
+    <value>All ODD tickets win.</value>
+  </data>
+  <data name="rule_example_15_even" xml:space="preserve">
+    <value>15 even numbers</value>
+  </data>
+  <data name="rule_example_5_odd" xml:space="preserve">
+    <value>5 odd numbers</value>
+  </data>
+  <data name="rule_result_is_even" xml:space="preserve">
+    <value>The official result is &lt;span class="text-[#A236C8]"&gt;EVEN&lt;/span&gt;.</value>
+  </data>
+  <data name="rule_all_even_win" xml:space="preserve">
+    <value>All EVEN tickets win.</value>
+  </data>
+  <data name="rule_win_receive_4x" xml:space="preserve">
+    <value>Winning tickets receive 4x the bet amount.</value>
+  </data>
+  <data name="rule_example_bet_50_4x" xml:space="preserve">
+    <value>Example: Bet 50 HTG → Win 200 HTG.</value>
+  </data>
+  <data name="rule_important_notes" xml:space="preserve">
+    <value>Important Notes</value>
+  </data>
+  <data name="rule_only_one_option" xml:space="preserve">
+    <value>Only one option (ODD or EVEN) can be selected per ticket.</value>
+  </data>
+  <data name="rule_valid_one_draw" xml:space="preserve">
+    <value>Each ticket is valid for one draw only.</value>
+  </data>
+  <data name="fail_exclamation" xml:space="preserve">
+    <value>Fail !</value>
+  </data>
+  <data name="back_to_homepage" xml:space="preserve">
+    <value>Back to homepage</value>
+  </data>
+  <data name="try_again" xml:space="preserve">
+    <value>Try again</value>
+  </data>
+  <data name="update_profile_error" xml:space="preserve">
+    <value>Une erreur est survenue lors de la mise à jour de votre profil.</value>
+  </data>
+  <data name="jackpot_today_htg" xml:space="preserve">
+    <value>1.000.000 HTG today !</value>
+  </data>
+  <data name="no_results_found" xml:space="preserve">
+    <value>No results found</value>
+  </data>
+  <data name="v2_win" xml:space="preserve">
+    <value>Win</value>
+  </data>
+  <data name="v2_not_win" xml:space="preserve">
+    <value>Not Win</value>
+  </data>
+  <data name="v2_waiting" xml:space="preserve">
+    <value>Waiting</value>
+  </data>
+  <data name="v2_all" xml:space="preserve">
+    <value>All</value>
+  </data>
+  <data name="v2_classic_pick_10" xml:space="preserve">
+    <value>BASIC PICK 10</value>
+  </data>
+  <data name="v2_big_small" xml:space="preserve">
+    <value>Big  Small</value>
+  </data>
+  <data name="v2_odd_even" xml:space="preserve">
+    <value>Odd Even</value>
+  </data>
+  <data name="v2_amount_played" xml:space="preserve">
+    <value>Amount played</value>
+  </data>
+  <data name="v2_amount_won" xml:space="preserve">
+    <value>Amount win</value>
+  </data>
+  <data name="v2_date_and_time" xml:space="preserve">
+    <value>Date and Time</value>
+  </data>
+  <data name="v2_game_locked" xml:space="preserve">
+    <value>This game is currently locked.</value>
+  </data>
+  <data name="v2_updating_results" xml:space="preserve">
+    <value>Results are being updated.</value>
+  </data>
+  <data name="v2_buy_classic_pick_10" xml:space="preserve">
+    <value>Buy Basic Pick 10</value>
+  </data>
+  <data name="v2_select_10_lucky_numbers" xml:space="preserve">
+    <value>Select Lucky Numbers</value>
+  </data>
+  <data name="v2_add_more_ticket" xml:space="preserve">
+    <value>Add more Ticket</value>
+  </data>
+  <data name="v2_estimated_ticket_price" xml:space="preserve">
+    <value>Estimated Ticket Price</value>
+  </data>
+  <data name="v2_payment" xml:space="preserve">
+    <value>Payment</value>
+  </data>
+  <data name="v2_round" xml:space="preserve">
+    <value>Round</value>
+  </data>
+  <data name="v2_edit" xml:space="preserve">
+    <value>Edit</value>
+  </data>
+  <data name="v2_delete" xml:space="preserve">
+    <value>Delete</value>
+  </data>
+  <data name="v2_back" xml:space="preserve">
+    <value>back</value>
+  </data>
+  <data name="Random" xml:space="preserve">
+    <value>Random</value>
+  </data>
+  <data name="v2_save" xml:space="preserve">
+    <value>Save</value>
+  </data>
+  <data name="v2_selected_ticket" xml:space="preserve">
+    <value>Selected Tickets</value>
+  </data>
+  <data name="v2_ticket_not_valid" xml:space="preserve">
+    <value>Ticket not valid</value>
+  </data>
+  <data name="v2_confirm_purchase" xml:space="preserve">
+    <value>Confirm Purchase</value>
+  </data>
+  <data name="v2_ticket" xml:space="preserve">
+    <value>Ticket</value>
+  </data>
+  <data name="v2_amount" xml:space="preserve">
+    <value>Amount</value>
+  </data>
+  <data name="v2_otp_instruction" xml:space="preserve">
+    <value>Please confirm and enter OTP to proceed.</value>
+  </data>
+  <data name="v2_request_new_otp" xml:space="preserve">
+    <value>Request new OTP</value>
+  </data>
+  <data name="v2_cancel" xml:space="preserve">
+    <value>Cancel</value>
+  </data>
+  <data name="v2_confirm" xml:space="preserve">
+    <value>Confirm</value>
+  </data>
+  <data name="v2_payment_successfully" xml:space="preserve">
+    <value>The money has been successfully transferred!</value>
+  </data>
+  <data name="v2_your_choice" xml:space="preserve">
+    <value>Your choice</value>
+  </data>
+  <data name="v2_buy_ticket_label" xml:space="preserve">
+    <value>Buy ticket</value>
+  </data>
+  <data name="v2_transfer" xml:space="preserve">
+    <value>Transfer</value>
+  </data>
+  <data name="v2_choose_account" xml:space="preserve">
+    <value>Choose the account</value>
+  </data>
+  <data name="v2_sender_phone" xml:space="preserve">
+    <value>Sender phone</value>
+  </data>
+  <data name="v2_receiver_phone" xml:space="preserve">
+    <value>💰 Receiver phone</value>
+  </data>
+  <data name="v2_amount_htg" xml:space="preserve">
+    <value>Amount (HTG)</value>
+  </data>
+  <data name="v2_paste" xml:space="preserve">
+    <value>Paste</value>
+  </data>
+  <data name="v2_continue" xml:space="preserve">
+    <value>Continue</value>
+  </data>
+  <data name="v2_account_name" xml:space="preserve">
+    <value>Bee Lotto’s Account</value>
+  </data>
+  <data name="v2_fee" xml:space="preserve">
+    <value>Fee</value>
+  </data>
+  <data name="v2_free" xml:space="preserve">
+    <value>Free</value>
+  </data>
+  <data name="v2_enter_valid_amount" xml:space="preserve">
+    <value>Please enter a valid amount.</value>
+  </data>
+  <data name="v2_insufficient_balance" xml:space="preserve">
+    <value>The winnings balance is insufficient.</value>
+  </data>
+  <data name="v2_confirm_transaction" xml:space="preserve">
+    <value>Confirm transaction</value>
+  </data>
+  <data name="v2_enter_otp_proceed" xml:space="preserve">
+    <value>Please confirm and enter OTP to proceed</value>
+  </data>
+  <data name="Basic" xml:space="preserve">
+    <value>Basic</value>
+  </data>
+  <data name="Account" xml:space="preserve">
+    <value>Account</value>
+  </data>
+  <data name="v2_convert" xml:space="preserve">
+    <value>Convert</value>
+  </data>
+  <data name="v2_coins" xml:space="preserve">
+    <value>Coins</value>
+  </data>
+  <data name="v2_htg" xml:space="preserve">
+    <value>HTG</value>
+  </data>
+  <data name="v2_rule_drawn_count_desc" xml:space="preserve">
+    <value>For this game, the system will count how many of the 20 drawn numbers are:</value>
+  </data>
+  <data name="millionair" xml:space="preserve">
+    <value>millionair</value>
+  </data>
+  <data name="faq_v2_q4" xml:space="preserve">
+    <value>How many matching numbers do I need to win a prize?</value>
+  </data>
+  <data name="faq_v2_a4" xml:space="preserve">
+    <value>The more numbers you match, the bigger your prize! &lt;br/&gt; In BASIC PICK 10, your 10 selected numbers are compared with the 10 official result numbers. You win when you match 6 or more numbers — and even matching 0 numbers still gives you a reward!&lt;br/&gt;&lt;br/&gt; 🎯 Match 10 numbers → Win the Jackpot&lt;br/&gt; 🔥 Match 9 numbers → Win 12,000 HTG&lt;br/&gt; 💰 Match 8 numbers → Win 600 HTG&lt;br/&gt; ⭐ Match 7 numbers → Win 160 HTG&lt;br/&gt; 🎉 Match 6 numbers → Win 20 HTG&lt;br/&gt; 🎁 Match 0 numbers → Win 5 HTG&lt;br/&gt;&lt;br/&gt; Every ticket gives you a chance to win — even when luck surprises you!</value>
+  </data>
+  <data name="faq_v2_q5" xml:space="preserve">
+    <value>How do I play the Big / Small game?</value>
+  </data>
+  <data name="faq_v2_a5" xml:space="preserve">
+    <value>Choose Big (41–80) or Small (01–40). Purchase your ticket before 20:00 and wait for the draw at 20:30.</value>
+  </data>
+  <data name="faq_v2_q6" xml:space="preserve">
+    <value>How do I win in the Big / Small game?</value>
+  </data>
+  <data name="faq_v2_a6" xml:space="preserve">
+    <value>After 20 numbers are drawn, the system checks how many numbers fall within each range: &lt;br/&gt; - If 13 or more numbers are between 41–80, the result is BIG.&lt;br/&gt; - If 13 or more numbers are between 01–40, the result is SMALL.&lt;br/&gt;&lt;br/&gt; If your selected option matches the official result, you win.</value>
+  </data>
+  <data name="faq_v2_q7" xml:space="preserve">
+    <value>How do I play the Odd / Even game?</value>
+  </data>
+  <data name="faq_v2_a7" xml:space="preserve">
+    <value>Choose Odd or Even. Purchase your ticket before 20:00 and wait for the draw at 20:30.</value>
+  </data>
+  <data name="faq_v2_q8" xml:space="preserve">
+    <value>How do I win in the Odd / Even game?</value>
+  </data>
+  <data name="faq_v2_a8" xml:space="preserve">
+    <value>After 20 numbers are drawn, the system counts how many numbers are odd or even: &lt;br/&gt; - If 15 or more numbers are odd, the result is ODD.&lt;br/&gt; - If 15 or more numbers are even, the result is EVEN.&lt;br/&gt;&lt;br/&gt; If your selected option matches the official result, you win.</value>
+  </data>
+  <data name="pick10" xml:space="preserve">
+    <value>Pick 10</value>
+  </data>
+  <data name="bigsmall" xml:space="preserve">
+    <value>Big Small</value>
+  </data>
+  <data name="oddeven" xml:space="preserve">
+    <value>Odd Even</value>
+  </data>
+  <data name="Pick" xml:space="preserve">
+    <value>Pick</value>
+  </data>
+  <data name="Small" xml:space="preserve">
+    <value>Small</value>
+  </data>
+  <data name="Big" xml:space="preserve">
+    <value>Big</value>
+  </data>
+  <data name="Odd" xml:space="preserve">
+    <value>Odd</value>
+  </data>
+  <data name="Even" xml:space="preserve">
+    <value>Even</value>
+  </data>
+  <data name="Number_of_ticket" xml:space="preserve">
+    <value>Number of ticket</value>
+  </data>
+  <data name="next" xml:space="preserve">
+    <value>Next</value>
+  </data>
+  <data name="Pick_Number" xml:space="preserve">
+    <value>Pick_Number</value>
+  </data>
+  <data name="total_payment" xml:space="preserve">
+    <value>Total Payment</value>
+  </data>
+  <data name="Minutes" xml:space="preserve">
+    <value>Minutes</value>
+  </data>
+  <data name="Secs" xml:space="preserve">
+    <value>Secs</value>
+  </data>
+  <data name="v2_otp_sent_successfully" xml:space="preserve">
+    <value>Your OTP has been sent successfully. Please check your messages !</value>
+  </data>
+  <data name="v2_detail" xml:space="preserve">
+    <value>Detail</value>
+  </data>
+  <data name="v2_tap_to_see_detail" xml:space="preserve">
+    <value>Tap to see detail</value>
+  </data>
+  <data name="v2_ticket_detail" xml:space="preserve">
+    <value>Ticket Detail</value>
+  </data>
+  <data name="v2_bill_code" xml:space="preserve">
+    <value>Bill Code</value>
+  </data>
+  <data name="v2_money_ticket" xml:space="preserve">
+    <value>Money Ticket</value>
+  </data>
+  <data name="v2_money_win" xml:space="preserve">
+    <value>Money Win</value>
+  </data>
+  <data name="v2_purchase_date" xml:space="preserve">
+    <value>Purchase Date</value>
+  </data>
+  <data name="v2_channel" xml:space="preserve">
+    <value>Channel Buy</value>
+  </data>
+  <data name="v2_payment_method" xml:space="preserve">
+    <value>Payment Method</value>
+  </data>
+  <data name="v2_close" xml:space="preserve">
+    <value>Close</value>
+  </data>
+  <data name="v2_game" xml:space="preserve">
+    <value>Game Name</value>
+  </data>
+  <data name="v2_draw_date" xml:space="preserve">
+    <value>Draw Date</value>
+  </data>
+  <data name="v2_ticket_code" xml:space="preserve">
+    <value>Ticket Code</value>
+  </data>
+  <data name="faq_q3" xml:space="preserve">
+    <value>What are the chances of winning the top prize?</value>
+  </data>
+  <data name="loto_des_millions" xml:space="preserve">
+    <value> is a Bolet, Maryaj and Lotto3 games, results of NewYork and Florida lottery games. Pick your numbers and wait for the winning combination to be announced. You can convert the winning amount to Natcom mobile balance or Natcash. Good luck!</value>
+  </data>
+  <data name="millions_select" xml:space="preserve">
+    <value>Select</value>
+  </data>
+  <data name="millions_selected" xml:space="preserve">
+    <value>Selected</value>
+  </data>
+  <data name="millions_prize_if_win" xml:space="preserve">
+    <value>Prize if win</value>
+  </data>
+  <data name="millions_you_choose" xml:space="preserve">
+    <value>Your Choose</value>
+  </data>
+  <data name="millions_win" xml:space="preserve">
+    <value>Win</value>
+  </data>
+  <data name="millions_not_win" xml:space="preserve">
+    <value>Not Win</value>
+  </data>
+  <data name="millions_waiting" xml:space="preserve">
+    <value>Waiting</value>
+  </data>
+  <data name="millions_all" xml:space="preserve">
+    <value>All</value>
+  </data>
+  <data name="millions_classic_pick_10" xml:space="preserve">
+    <value>BASIC PICK 10</value>
+  </data>
+  <data name="millions_big_small" xml:space="preserve">
+    <value>Big  Small</value>
+  </data>
+  <data name="millions_odd_even" xml:space="preserve">
+    <value>Odd Even</value>
+  </data>
+  <data name="millions_amount_played" xml:space="preserve">
+    <value>Amount played</value>
+  </data>
+  <data name="millions_amount_won" xml:space="preserve">
+    <value>Amount win</value>
+  </data>
+  <data name="millions_date_and_time" xml:space="preserve">
+    <value>Date and Time</value>
+  </data>
+  <data name="millions_game_locked" xml:space="preserve">
+    <value>This game is currently locked.</value>
+  </data>
+  <data name="millions_updating_results" xml:space="preserve">
+    <value>Results are being updated.</value>
+  </data>
+  <data name="millions_buy_classic_pick_10" xml:space="preserve">
+    <value>Buy Basic Pick 10</value>
+  </data>
+  <data name="millions_select_10_lucky_numbers" xml:space="preserve">
+    <value>Select Lucky Numbers</value>
+  </data>
+  <data name="millions_add_more_ticket" xml:space="preserve">
+    <value>Add more Ticket</value>
+  </data>
+  <data name="millions_estimated_ticket_price" xml:space="preserve">
+    <value>Estimated Ticket Price</value>
+  </data>
+  <data name="millions_payment" xml:space="preserve">
+    <value>Payment</value>
+  </data>
+  <data name="millions_round" xml:space="preserve">
+    <value>Round</value>
+  </data>
+  <data name="millions_edit" xml:space="preserve">
+    <value>Edit</value>
+  </data>
+  <data name="millions_delete" xml:space="preserve">
+    <value>Delete</value>
+  </data>
+  <data name="millions_back" xml:space="preserve">
+    <value>back</value>
+  </data>
+  <data name="millions_save" xml:space="preserve">
+    <value>Save</value>
+  </data>
+  <data name="millions_selected_ticket" xml:space="preserve">
+    <value>Selected Tickets</value>
+  </data>
+  <data name="millions_ticket_not_valid" xml:space="preserve">
+    <value>Ticket not valid</value>
+  </data>
+  <data name="millions_confirm_purchase" xml:space="preserve">
+    <value>Confirm Purchase</value>
+  </data>
+  <data name="millions_ticket" xml:space="preserve">
+    <value>Ticket</value>
+  </data>
+  <data name="millions_amount" xml:space="preserve">
+    <value>Amount</value>
+  </data>
+  <data name="millions_otp_instruction" xml:space="preserve">
+    <value>Please confirm and enter OTP to proceed.</value>
+  </data>
+  <data name="millions_request_new_otp" xml:space="preserve">
+    <value>Request new OTP</value>
+  </data>
+  <data name="millions_cancel" xml:space="preserve">
+    <value>Cancel</value>
+  </data>
+  <data name="millions_confirm" xml:space="preserve">
+    <value>Confirm</value>
+  </data>
+  <data name="millions_payment_successfully" xml:space="preserve">
+    <value>Money ¸ has been transferred successfully!</value>
+  </data>
+  <data name="millions_your_choice" xml:space="preserve">
+    <value>Your choice</value>
+  </data>
+  <data name="millions_buy_ticket_label" xml:space="preserve">
+    <value>Buy ticket</value>
+  </data>
+  <data name="millions_transfer" xml:space="preserve">
+    <value>Transfer</value>
+  </data>
+  <data name="millions_choose_account" xml:space="preserve">
+    <value>Choose the account</value>
+  </data>
+  <data name="millions_sender_phone" xml:space="preserve">
+    <value>Sender phone</value>
+  </data>
+  <data name="millions_receiver_phone" xml:space="preserve">
+    <value>Receiver phone</value>
+  </data>
+  <data name="millions_amount_htg" xml:space="preserve">
+    <value>Amount (HTG)</value>
+  </data>
+  <data name="millions_paste" xml:space="preserve">
+    <value>Paste</value>
+  </data>
+  <data name="millions_continue" xml:space="preserve">
+    <value>Continue</value>
+  </data>
+  <data name="millions_account_name" xml:space="preserve">
+    <value>Bee Lotto Account</value>
+  </data>
+  <data name="millions_fee" xml:space="preserve">
+    <value>Fee</value>
+  </data>
+  <data name="millions_free" xml:space="preserve">
+    <value>Free</value>
+  </data>
+  <data name="millions_enter_valid_amount" xml:space="preserve">
+    <value>Please enter a valid amount.</value>
+  </data>
+  <data name="millions_insufficient_balance" xml:space="preserve">
+    <value>The winnings balance is insufficient.</value>
+  </data>
+  <data name="millions_confirm_transaction" xml:space="preserve">
+    <value>Confirm transaction</value>
+  </data>
+  <data name="millions_enter_otp_proceed" xml:space="preserve">
+    <value>Please confirm and enter OTP to proceed</value>
+  </data>
+  <data name="millions_convert" xml:space="preserve">
+    <value>Convert</value>
+  </data>
+  <data name="millions_coins" xml:space="preserve">
+    <value>Coins</value>
+  </data>
+  <data name="millions_htg" xml:space="preserve">
+    <value>HTG</value>
+  </data>
+  <data name="millions_rule_drawn_count_desc" xml:space="preserve">
+    <value>For this game, the system will count how many of the 20 drawn numbers are:</value>
+  </data>
+  <data name="faq_millions_q4" xml:space="preserve">
+    <value>How are winnings calculated?</value>
+  </data>
+  <data name="faq_millions_a4" xml:space="preserve">
+    <value>Winnings depend on how many numbers you match, including the Mega Ball. The more numbers you match, the higher your prize.</value>
+  </data>
+  <data name="faq_millions_q5" xml:space="preserve">
+    <value>Can I win multiple prizes with one ticket?</value>
+  </data>
+  <data name="faq_millions_a5" xml:space="preserve">
+    <value>No. If your ticket qualifies for multiple prizes, you will receive only the highest prize.</value>
+  </data>
+  <data name="faq_millions_q6" xml:space="preserve">
+    <value>Where do the results come from?</value>
+  </data>
+  <data name="faq_millions_a6" xml:space="preserve">
+    <value>All results are taken from the official Mega Millions source:https://www.lotteryusa.com/new-york/</value>
+  </data>
+  <data name="faq_millions_q7" xml:space="preserve">
+    <value>How will I receive my winnings?</value>
+  </data>
+  <data name="faq_millions_a7" xml:space="preserve">
+    <value> Winnings are credited to your main balance or Natcash account.
+1 coin = 1 HTG
+ Jackpot prizes may follow a different payout process.</value>
+  </data>
+  <data name="millions_otp_sent_successfully" xml:space="preserve">
+    <value>Your OTP has been sent successfully. Please check your messages !</value>
+  </data>
+  <data name="millions_detail" xml:space="preserve">
+    <value>Detail</value>
+  </data>
+  <data name="millions_tap_to_see_detail" xml:space="preserve">
+    <value>Tap to see detail</value>
+  </data>
+  <data name="millions_ticket_detail" xml:space="preserve">
+    <value>Ticket Detail</value>
+  </data>
+  <data name="millions_bill_code" xml:space="preserve">
+    <value>Bill Code</value>
+  </data>
+  <data name="millions_money_ticket" xml:space="preserve">
+    <value>Money Ticket</value>
+  </data>
+  <data name="millions_money_win" xml:space="preserve">
+    <value>Money Win</value>
+  </data>
+  <data name="millions_purchase_date" xml:space="preserve">
+    <value>Purchase Date</value>
+  </data>
+  <data name="millions_channel" xml:space="preserve">
+    <value>Channel Buy</value>
+  </data>
+  <data name="millions_payment_method" xml:space="preserve">
+    <value>Payment Method</value>
+  </data>
+  <data name="millions_close" xml:space="preserve">
+    <value>Close</value>
+  </data>
+  <data name="millions_game" xml:space="preserve">
+    <value>Game Name</value>
+  </data>
+  <data name="millions_draw_date" xml:space="preserve">
+    <value>Draw Date</value>
+  </data>
+  <data name="millions_ticket_code" xml:space="preserve">
+    <value>Ticket Code</value>
+  </data>
+  <data name="millions_jackpot_today_htg" xml:space="preserve">
+    <value>30.000.000 HTG today !</value>
+  </data>
+  <data name="millions_play" xml:space="preserve">
+    <value>Play</value>
+  </data>
+  <data name="millions_now" xml:space="preserve">
+    <value>now</value>
+  </data>
+  <data name="millions" xml:space="preserve">
+    <value>Millions</value>
+  </data>
+  <data name="millions_rule_title" xml:space="preserve">
+    <value>Rule</value>
+  </data>
+  <data name="millions_mega_millions" xml:space="preserve">
+    <value>Mega Millions</value>
+  </data>
+  <data name="millions_draw_schedule" xml:space="preserve">
+    <value>Draw Schedule</value>
+  </data>
+  <data name="millions_draw_frequency" xml:space="preserve">
+    <value>Draw frequency: 2 times per week (Tuesday &amp; Friday)</value>
+  </data>
+  <data name="millions_draw_time" xml:space="preserve">
+    <value>Draw time: 11:00 PM (Eastern Time - ET)</value>
+  </data>
+  <data name="millions_ticket_closing_time" xml:space="preserve">
+    <value>Ticket closing time: 10:30 PM (ET)</value>
+  </data>
+  <data name="millions_how_to_play" xml:space="preserve">
+    <value>How to play</value>
+  </data>
+  <data name="millions_ticket_includes_6" xml:space="preserve">
+    <value>Each ticket includes 6 numbers:</value>
+  </data>
+  <data name="millions_select_5_main" xml:space="preserve">
+    <value>Select 5 main numbers from 1 → 70</value>
+  </data>
+  <data name="millions_select_1_mega" xml:space="preserve">
+    <value>Select 1 Mega Ball from 1 → 24</value>
+  </data>
+  <data name="millions_ticket_price" xml:space="preserve">
+    <value>Ticket price: 6 HTG per ticket</value>
+  </data>
+  <data name="millions_payment_via" xml:space="preserve">
+    <value>Payment via: Account balance</value>
+  </data>
+  <data name="millions_game_rules_title" xml:space="preserve">
+    <value>Game rules</value>
+  </data>
+  <data name="millions_results_based_on" xml:space="preserve">
+    <value>Results are based on official lottery draw.</value>
+  </data>
+  <data name="millions_one_highest_prize" xml:space="preserve">
+    <value>Only one highest prize is awarded per ticket (if multiple prize conditions are met).</value>
+  </data>
+  <data name="millions_winnings_calculated" xml:space="preserve">
+    <value>Winnings are calculated based on matching numbers and Mega Ball.</value>
+  </data>
+  <data name="millions_prize_structure" xml:space="preserve">
+    <value>Prize Structure</value>
+  </data>
+  <data name="millions_match_result_header" xml:space="preserve">
+    <value>Number Matched</value>
+  </data>
+  <data name="millions_prize_htg_header" xml:space="preserve">
+    <value>Prizes (HTG)</value>
+  </data>
+  <data name="millions_rate_header" xml:space="preserve">
+    <value>Rate</value>
+  </data>
+  <data name="millions_match_5_plus_mega" xml:space="preserve">
+    <value>5+ Mega Ball</value>
+  </data>
+  <data name="millions_jackpot_label" xml:space="preserve">
+    <value>Jackpot</value>
+  </data>
+  <data name="millions_match_5_numbers" xml:space="preserve">
+    <value>5 (First 5 balls, no position required)</value>
+  </data>
+  <data name="millions_match_4_plus_mega" xml:space="preserve">
+    <value>4 + Mega Ball</value>
+  </data>
+  <data name="millions_match_4_numbers" xml:space="preserve">
+    <value>4 (First 4 balls, no position required)</value>
+  </data>
+  <data name="millions_match_3_plus_mega" xml:space="preserve">
+    <value>3 + Mega Ball</value>
+  </data>
+  <data name="millions_match_3_numbers" xml:space="preserve">
+    <value>3 (First 3 balls, no position required)</value>
+  </data>
+  <data name="millions_match_2_plus_mega" xml:space="preserve">
+    <value>2 + Mega Ball</value>
+  </data>
+  <data name="millions_match_1_plus_mega" xml:space="preserve">
+    <value>1 + Mega Ball</value>
+  </data>
+  <data name="millions_match_mega_only" xml:space="preserve">
+    <value>Mega Ball</value>
+  </data>
+  <data name="faq_millions_a1" xml:space="preserve">
+    <value>You select 5 numbers from 1 to 70 and 1 Mega Ball from 1 to 24, then purchase your ticket before the draw time.</value>
+  </data>
+  <data name="faq_millions_a2" xml:space="preserve">
+    <value>Draws take place twice a week (Tuesday and Friday) at 11:00 PM (ET). Ticket sales close at 10:30 PM (ET)</value>
+  </data>
+  <data name="faq_millions_a3" xml:space="preserve">
+    <value>Each ticket costs 6 HTG.</value>
+  </data>
+  <data name="faq_millions_q1" xml:space="preserve">
+    <value>How do I play Mega Millions?</value>
+  </data>
+  <data name="faq_millions_q2" xml:space="preserve">
+    <value>When are Mega Millions draws held?</value>
+  </data>
+  <data name="faq_millions_q3" xml:space="preserve">
+    <value>How much does a ticket cost?</value>
+  </data>
+  <data name="millions_redeem_rewards" xml:space="preserve">
+    <value>Draw winning</value>
+  </data>
+  <data name="millions_mega_jackpot" xml:space="preserve">
+    <value>Mega Jackpot</value>
+  </data>
+  <data name="millions_estimate_jackpot_prize" xml:space="preserve">
+    <value>Estimate Jackpot Prize</value>
+  </data>
+  <data name="millions_be_the_next_millionaire" xml:space="preserve">
+    <value>Be the next millions</value>
+  </data>
+  <data name="millions_jackpot_results_title" xml:space="preserve">
+    <value>Jackpot results</value>
+  </data>
+  <data name="millions_list_jackpot_results" xml:space="preserve">
+    <value>List of Jackpot results</value>
+  </data>
+  <data name="millions_total_draws" xml:space="preserve">
+    <value>Total {0} draws</value>
+  </data>
+  <data name="millions_draw_no_short" xml:space="preserve">
+    <value>Draw #</value>
+  </data>
+  <data name="millions_jackpot" xml:space="preserve">
+    <value>Jackpot</value>
+  </data>
+  <data name="millions_subscribers_won" xml:space="preserve">
+    <value>{0} abonnés gagnants</value>
+  </data>
+  <data name="millions_no_jackpot_results" xml:space="preserve">
+    <value>No Jackpot results</value>
+  </data>
+  <data name="millions_note_results_updated" xml:space="preserve">
+    <value>Note: Results are updated after each draw.</value>
+  </data>
+  <data name="millions_jackpot_prize" xml:space="preserve">
+    <value>Jackpot Prize</value>
+  </data>
+  <data name="millions_winning_numbers" xml:space="preserve">
+    <value>Winning Numbers</value>
+  </data>
+  <data name="millions_winning_subscribes" xml:space="preserve">
+    <value>Winning Subscribes</value>
+  </data>
+  <data name="millions_subscribers_won_jackpot" xml:space="preserve">
+    <value>{0} subscribers won the jackpot prize</value>
+  </data>
+  <data name="millions_no_winners" xml:space="preserve">
+    <value>No winners yet</value>
+  </data>
+  <data name="millions_draw_information" xml:space="preserve">
+    <value>Draw information</value>
+  </data>
+  <data name="millions_game_type" xml:space="preserve">
+    <value>Game Type</value>
+  </data>
+  <data name="millions_total_winners" xml:space="preserve">
+    <value>Total Winners</value>
+  </data>
+  <data name="millions_draw_date_time" xml:space="preserve">
+    <value>Draw Date &amp; Time</value>
+  </data>
+  <data name="millions_note" xml:space="preserve">
+    <value>Note</value>
+  </data>
+  <data name="millions_note_results_public" xml:space="preserve">
+    <value>The result is public announced and verified</value>
+  </data>
+  <data name="millions_note_thank_you" xml:space="preserve">
+    <value>Thank you for your trust and support</value>
+  </data>
+  <data name="millions_back_to_results_list" xml:space="preserve">
+    <value>Back to Results list</value>
+  </data>
+  <data name="millions_jackpot_disclaimer" xml:space="preserve">
+    <value>Tickets purchased after 10:30 join the next draw. Final jackpot amount will be confirmed after the 11:00 result announcement.</value>
+  </data>
+  <data name="millions_view" xml:space="preserve">
+    <value>View</value>
+  </data>
+  <data name="millions_next_round" xml:space="preserve">
+    <value>Next draw</value>
+  </data>
+  <data name="millions_jackpot_prize_to" xml:space="preserve">
+    <value>Win Up To</value>
+  </data>
+  <data name="millions_view_all_results" xml:space="preserve">
+    <value>View all results</value>
+  </data>
+  <data name="millions_megaball_invalid_title" xml:space="preserve">
+    <value>Mega Ball Invalide</value>
+  </data>
+  <data name="millions_megaball_invalid_desc" xml:space="preserve">
+    <value>Mega Ball must be between 01–24</value>
+  </data>
+  <data name="millions_standardball_invalid_title" xml:space="preserve">
+    <value>Standard Ball Invalide</value>
+  </data>
+  <data name="millions_standardball_invalid_desc" xml:space="preserve">
+    <value>Standard Ball doit être entre 01 et 70</value>
+  </data>
+  <data name="millions_note_title" xml:space="preserve">
+    <value>Remarque:</value>
+  </data>
+  <data name="millions_note_coin_rate" xml:space="preserve">
+    <value>(*) 1 coin = 1 HTG</value>
+  </data>
+  <data name="millions_note_rewards_credit" xml:space="preserve">
+    <value>Rewards will be credited to the Winning Coins balance. Customers can convert Winning Coins into their Main Balance or NatCash balance (excluding Jackpot rewards).</value>
+  </data>
+  <data name="millions_note_conversion_main" xml:space="preserve">
+    <value>1 Winning Coin = 1 HTG in Main Balance</value>
+  </data>
+  <data name="millions_note_conversion_natcash" xml:space="preserve">
+    <value>1 Winning Coin = 1 HTG in NatCash</value>
+  </data>
+  <data name="millions_reward_transferred_to_wallet" xml:space="preserve">
+    <value>💸 Reward transferred to Wallet</value>
+  </data>
+  <data name="millions_reward_transferred_to_main_account" xml:space="preserve">
+    <value>💸 Reward transferred to Main Account</value>
+  </data>
+  <data name="millions_jackpot_rules_title" xml:space="preserve">
+    <value>Mega Jackpot Rules</value>
+  </data>
+  <data name="millions_jackpot_rule1_title" xml:space="preserve">
+    <value>1. Mega Jackpot Prize</value>
+  </data>
+  <data name="millions_jackpot_rule1_desc1" xml:space="preserve">
+    <value>The Mega Jackpot is awarded to customers who match all 6 balls.</value>
+  </data>
+  <data name="millions_jackpot_rule1_desc2" xml:space="preserve">
+    <value>The prize amount is paid from the Mega Jackpot Pool.</value>
+  </data>
+  <data name="millions_jackpot_rule2_title" xml:space="preserve">
+    <value>2. Jackpot Sharing Policy</value>
+  </data>
+  <data name="millions_jackpot_rule2_desc1" xml:space="preserve">
+    <value>If two or more winning tickets match all 6 balls, the Jackpot Pool will be shared equally among all winning tickets.</value>
+  </data>
+  <data name="millions_jackpot_rule2_desc2" xml:space="preserve">
+    <value>A customer holding multiple winning tickets may receive multiple prize shares.</value>
+  </data>
+  <data name="millions_jackpot_rule3_title" xml:space="preserve">
+    <value>3. Jackpot Value</value>
+  </data>
+  <data name="millions_jackpot_rule3_desc1" xml:space="preserve">
+    <value>The Mega Jackpot Pool starts from 2,000,000 HTG.</value>
+  </data>
+  <data name="millions_jackpot_rule3_desc2" xml:space="preserve">
+    <value>The maximum Jackpot value is 30,000,000 HTG.</value>
+  </data>
+  <data name="millions_jackpot_rule4_title" xml:space="preserve">
+    <value>4. Jackpot Reset Policy</value>
+  </data>
+  <data name="millions_jackpot_rule4_desc1" xml:space="preserve">
+    <value>Once the Mega Jackpot is won, the Jackpot Pool will automatically reset to 2,000,000 HTG.</value>
+  </data>
+  <data name="millions_jackpot_rule4_desc2" xml:space="preserve">
+    <value>The Jackpot accumulation cycle will then restart automatically.</value>
+  </data>
+  <data name="millions_jackpot_rule5_title" xml:space="preserve">
+    <value>5. Prize Payout Method</value>
+  </data>
+  <data name="millions_jackpot_rule5_desc1" xml:space="preserve">
+    <value>Mega Jackpot prizes may be paid via:</value>
+  </data>
+  <data name="millions_jackpot_rule5_item1" xml:space="preserve">
+    <value>Main Account</value>
+  </data>
+  <data name="millions_jackpot_rule5_item2" xml:space="preserve">
+    <value>Natcash E-wallet</value>
+  </data>
+  <data name="millions_jackpot_rule5_item3" xml:space="preserve">
+    <value>Cash payout (if applicable)</value>
+  </data>
+  <data name="millions_jackpot_rule5_desc2" xml:space="preserve">
+    <value>The payout method will depend on the Jackpot value and operational policy at the payout time.</value>
+  </data>
+  <data name="millions_jackpot_rule6_title" xml:space="preserve">
+    <value>6. Prize Verification</value>
+  </data>
+  <data name="millions_jackpot_rule6_desc1" xml:space="preserve">
+    <value>Natcom reserves the right to verify all winning tickets before processing Jackpot payouts.</value>
+  </data>
+  <data name="millions_jackpot_rule6_desc2" xml:space="preserve">
+    <value>An official award confirmation letter may be provided if required.</value>
+  </data>
+  <data name="millions_jackpot_rule7_title" xml:space="preserve">
+    <value>7. Important Notes</value>
+  </data>
+  <data name="millions_jackpot_rule7_desc1" xml:space="preserve">
+    <value>Jackpot values displayed on the website are updated in real time.</value>
+  </data>
+  <data name="millions_jackpot_rule7_desc2" xml:space="preserve">
+    <value>During the draw processing and result confirmation period, the displayed Jackpot value may not reflect the final updated amount immediately.</value>
+  </data>
+  <data name="millions_jackpot_rule7_desc3" xml:space="preserve">
+    <value>In case of any dispute, Natcom's decision shall be final.</value>
+  </data>
+  <data name="payment_method_title" xml:space="preserve">
+    <value>Choose payment method</value>
+  </data>
+  <data name="payment_method_subtitle" xml:space="preserve">
+    <value>Select an account to complete your purchase</value>
+  </data>
+  <data name="payment_main_account" xml:space="preserve">
+    <value>Main account</value>
+  </data>
+  <data name="payment_main_account_desc" xml:space="preserve">
+    <value>Pay with your mobile balance</value>
+  </data>
+  <data name="payment_wallet" xml:space="preserve">
+    <value>WALLET</value>
+  </data>
+  <data name="payment_wallet_desc" xml:space="preserve">
+    <value>Secure payment with wallet PIN</value>
+  </data>
+  <data name="payment_security_message" xml:space="preserve">
+    <value>Your payment information is protected</value>
+  </data>
+  <data name="payment_wallet_pin_instruction" xml:space="preserve">
+    <value>Enter your WALLET PIN</value>
+  </data>
+  <data name="get_free_ticket_code_38" xml:space="preserve">
+    <value>Promotion code invalid</value>
+  </data>
+  <data name="get_free_ticket_code_39" xml:space="preserve">
+    <value>Promotion code has already been used</value>
+  </data>
+  <data name="get_free_ticket_code_40" xml:space="preserve">
+    <value>Promotion is not active</value>
+  </data>
+  <data name="get_free_ticket_code_41" xml:space="preserve">
+    <value>Ticket request does not exist</value>
+  </data>
+  <data name="get_free_ticket_code_42" xml:space="preserve">
+    <value>Your transaction was unsuccessful</value>
+  </data>
+  <data name="get_free_ticket_code_43" xml:space="preserve">
+    <value>Good luck next time</value>
+  </data>
+  <data name="get_free_ticket_code_44" xml:space="preserve">
+    <value>The code has been sent</value>
+  </data>
+  <data name="free_ticket_error_43_title" xml:space="preserve">
+    <value>Good luck next time!</value>
+  </data>
+  <data name="free_ticket_error_43_description" xml:space="preserve">
+    <value>You did not receive a free ticket today. Come back tomorrow and try your luck again.</value>
+  </data>
+  <data name="free_ticket_waiting_title" xml:space="preserve">
+    <value>Your FREE ticket is waiting!</value>
+  </data>
+  <data name="free_ticket_waiting_description" xml:space="preserve">
+    <value>You have 1 free Millions ticket that has not been used. Use it for today's draw.</value>
+  </data>
+  <data name="free_ticket_buy_now" xml:space="preserve">
+    <value>Buy now</value>
+  </data>
+  <data name="free_ticket_success_badge" xml:space="preserve">
+    <value>FREE TICKET</value>
+  </data>
+  <data name="free_ticket_success_title" xml:space="preserve">
+    <value>Congratulations!</value>
+  </data>
+  <data name="free_ticket_success_received" xml:space="preserve">
+    <value>You have received</value>
+  </data>
+  <data name="free_ticket_success_ticket" xml:space="preserve">
+    <value>1 FREE Millions Ticket.</value>
+  </data>
+  <data name="free_ticket_success_chance" xml:space="preserve">
+    <value>Use it now for your chance to win up to</value>
+  </data>
+  <data name="free_ticket_success_use" xml:space="preserve">
+    <value>Use Ticket Now</value>
+  </data>
+  <data name="free_ticket_success_later" xml:space="preserve">
+    <value>Later</value>
+  </data>
+  <data name="free_ticket_success_validity" xml:space="preserve">
+    <value>The free ticket is valid for today's draw only.</value>
+  </data>
+  <data name="free_ticket_error_43_badge" xml:space="preserve">
+    <value>BETTER LUCK NEXT TIME!</value>
+  </data>
+  <data name="free_ticket_error_43_daily_title" xml:space="preserve">
+    <value>New chances every day!</value>
+  </data>
+  <data name="free_ticket_error_43_daily_description" xml:space="preserve">
+    <value>Free tickets are given out daily. Don't miss your chance tomorrow!</value>
+  </data>
+  <data name="free_ticket_error_43_footer" xml:space="preserve">
+    <value>Buy a ticket now for your chance to win up to 30,000,000 HTG!</value>
+  </data>
+  <data name="free_ticket_waiting_badge" xml:space="preserve">
+    <value>FREE TICKET</value>
+  </data>
+  <data name="free_ticket_waiting_validity" xml:space="preserve">
+    <value>Free ticket is valid for today's draw only. Don't forget to use it!</value>
+  </data>
+  <data name="free_ticket_error_45_ticket_free" xml:space="preserve"><value>FREE</value></data>
+  <data name="free_ticket_error_45_ticket_tickets" xml:space="preserve"><value>TICKETS</value></data>
+  <data name="free_ticket_error_45_ticket_sold_out" xml:space="preserve"><value>SOLD OUT</value></data>
+  <data name="free_ticket_error_45_title" xml:space="preserve"><value>Free Tickets</value></data>
+  <data name="free_ticket_error_45_title_emphasis" xml:space="preserve"><value>Are Sold Out</value></data>
+  <data name="free_ticket_error_45_description" xml:space="preserve"><value>All free tickets for today have been claimed. Please come back tomorrow and try your luck again!</value></data>
+  <data name="free_ticket_error_45_next_title" xml:space="preserve"><value>Next chance:</value></data>
+  <data name="free_ticket_error_45_next_primary" xml:space="preserve"><value>Come back tomorrow</value></data>
+  <data name="free_ticket_error_45_next_secondary" xml:space="preserve"><value>and try your luck again!</value></data>
+  <data name="free_ticket_error_45_footer" xml:space="preserve"><value>Don't miss your chance to win up to 30,000,000 HTG!</value></data>
+  <data name="free_ticket_banner_cta" xml:space="preserve"><value>Tap here to get your</value></data>
+  <data name="free_ticket_banner_highlight" xml:space="preserve"><value>FREE TICKET!</value></data>
+</root>

+ 2153 - 0
website_natcash/Languages/Lang.resx

@@ -0,0 +1,2153 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="account_lock" xml:space="preserve">
+    <value>Nimewo sa bloke. Tanpri tann 5:00 epi eseye anko.</value>
+  </data>
+  <data name="account_not_existed" xml:space="preserve">
+    <value>Kont sa pa ekziste</value>
+  </data>
+  <data name="add_more_order" xml:space="preserve">
+    <value>Ajoute plis</value>
+  </data>
+  <data name="agree_policy_1" xml:space="preserve">
+    <value>Le w sevi ak Bee Lotto, sa vle di ou dako ak kondisyon yo </value>
+  </data>
+  <data name="agree_policy_2" xml:space="preserve">
+    <value>Chwazi lang</value>
+  </data>
+  <data name="already_have_an_account" xml:space="preserve">
+    <value>Ou gen yon kont deja?</value>
+  </data>
+  <data name="amount_transfered" xml:space="preserve">
+    <value>Montan transfe a</value>
+  </data>
+  <data name="auto_fill" xml:space="preserve">
+    <value>Ranpli</value>
+  </data>
+  <data name="basic_account" xml:space="preserve">
+    <value>Kont de baz</value>
+  </data>
+  <data name="bee_account" xml:space="preserve">
+    <value>Kont Natcom Lotto </value>
+  </data>
+  <data name="bee_loto_des" xml:space="preserve">
+    <value>Natcom Loto se yon jwet Bolet, Maryaj ak Lotto3, rezilta jwet lotri Nouyok ak Florid. Chwazi nimewo ou yo epi tann yo anonse ganyan an. Ou ka voye lajan ou genyen an sou balans prensipal ou oswa Natcash. Bon chans!</value>
+  </data>
+  <data name="bee_loto_intro" xml:space="preserve">
+    <value>Natcom Loto se yon nouvo sevis lotri VAS Natcom. Ou ka jwe ak USSD oswa WEB/APP. Ou kapab resevwa rezilta SMS GRATIS tou yon fwa ou voye ON nan 7777 epi ou kapab voye OFF nan 7777 pou mande pou ou pa resevwa rezilta SMS MT, oswan enfomasyon MT nan men Lotri a epi ON pou rekipere SMS MT ou.
+Ou kapab tou eseye chans ou ak tiraj Lotri Natcom.
+N ap ede w kreye yon kont byen fasil.</value>
+  </data>
+  <data name="bet_amount" xml:space="preserve">
+    <value>Montan paryaj</value>
+  </data>
+  <data name="bill_order" xml:space="preserve">
+    <value>Bill Order</value>
+  </data>
+  <data name="bolet" xml:space="preserve">
+    <value>Bolet</value>
+  </data>
+  <data name="bolet_content" xml:space="preserve">
+    <value>&lt;p&gt;&lt;span style="white-space:pre-wrap;"&gt;1. Bolet is a game in Bee Lotto. Customers choose any 2 numbers from 00 - 99. The minimum ticket value is 1 HTG, the maximum is 1,000 HTG. Bolet's results are based on the NUMBER and WIN4 results of the New York lottery. &lt;br&gt;&lt;br&gt;2. Bolet includes 3 prizes:&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Lot 1: includes the numbers in the 2nd and 3rd positions of the NUMBER draw. Winning ratio: buy 1 HTG win 50 HTG&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Lot 2: includes the numbers in the 1st and 2nd positions of the WIN4 draw. Winning ratio: buy 1 HTG win 20 HTG&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Lot 3: includes the numbers in the 3rd and 4th positions of the WIN4 draw. Winning ratio: buy 1 HTG win 20 HTG&lt;br&gt;&lt;br&gt;3. Ticket purchasing time&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Day frame: From 0:00 - 14:00. Result time: 14:30&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Night frame: From 15:00 - 20:00. Result time 20:30&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/p&gt;</value>
+  </data>
+  <data name="bolet_how_to_play" xml:space="preserve">
+    <value>&lt;p&gt;&lt;span style=white-space:pre-wrap;"&gt;&lt;strong&gt;&lt;span style="font-size: 20px;"&gt;How to play Bolet&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="brought_success" xml:space="preserve">
+    <value>Ou achte tike natcom Loto ak sikse.</value>
+  </data>
+  <data name="buy" xml:space="preserve">
+    <value>Achte</value>
+  </data>
+  <data name="buying" xml:space="preserve">
+    <value>Achte</value>
+  </data>
+  <data name="buying_code_not_existed" xml:space="preserve">
+    <value>Kod sa pa ekziste</value>
+  </data>
+  <data name="buy_bolet" xml:space="preserve">
+    <value>Bolet </value>
+  </data>
+  <data name="buy_lotto3" xml:space="preserve">
+    <value>Loto3</value>
+  </data>
+  <data name="buy_maryaj" xml:space="preserve">
+    <value>Maryaj</value>
+  </data>
+  <data name="buy_ticket" xml:space="preserve">
+    <value>Tike</value>
+  </data>
+  <data name="buy_ticket1" xml:space="preserve">
+    <value>Tike</value>
+  </data>
+  <data name="buy_time" xml:space="preserve">
+    <value>Le</value>
+  </data>
+  <data name="call" xml:space="preserve">
+    <value>Apel</value>
+  </data>
+  <data name="cancel" xml:space="preserve">
+    <value>Anile</value>
+  </data>
+  <data name="cash_agent" xml:space="preserve">
+    <value>Lajan Kach</value>
+  </data>
+  <data name="change_language" xml:space="preserve">
+    <value>Chanje lang</value>
+  </data>
+  <data name="change_password" xml:space="preserve">
+    <value>Chanje Modpas</value>
+  </data>
+  <data name="channel_buy" xml:space="preserve">
+    <value>Chanel </value>
+  </data>
+  <data name="check_phone_or_password" xml:space="preserve">
+    <value>Tanpri verifye nimewo a oswa modpas la</value>
+  </data>
+  <data name="choose_your_number" xml:space="preserve">
+    <value>Chwazi nimewo</value>
+  </data>
+  <data name="clean_all" xml:space="preserve">
+    <value>Efase</value>
+  </data>
+  <data name="close" xml:space="preserve">
+    <value>Femen</value>
+  </data>
+  <data name="confirm" xml:space="preserve">
+    <value>Konfime</value>
+  </data>
+  <data name="confirm_otp" xml:space="preserve">
+    <value>Konfime OTP</value>
+  </data>
+  <data name="confirm_payment_1" xml:space="preserve">
+    <value>Konfiman peyman</value>
+  </data>
+  <data name="confirm_payment_2" xml:space="preserve">
+    <value>HTG pou achte</value>
+  </data>
+  <data name="confirm_payment_3" xml:space="preserve">
+    <value>Fre, Tike</value>
+  </data>
+  <data name="confirm_payment_4" xml:space="preserve">
+    <value>HTG, Le tiraj</value>
+  </data>
+  <data name="confirm_payment_5" xml:space="preserve">
+    <value>Tanpri antre OTP</value>
+  </data>
+  <data name="confirm_transaction" xml:space="preserve">
+    <value>Konfime tranzaksyon </value>
+  </data>
+  <data name="confirm_transfer_1" xml:space="preserve">
+    <value>Konfime transfe</value>
+  </data>
+  <data name="confirm_transfer_2" xml:space="preserve">
+    <value> HTG kont lotri a </value>
+  </data>
+  <data name="confirm_transfer_3" xml:space="preserve">
+    <value>Fre 0 HTG. Tanpri antre OTP:</value>
+  </data>
+  <data name="confirm_your_new_password" xml:space="preserve">
+    <value>Konfime nouvo modpas </value>
+  </data>
+  <data name="contact_us" xml:space="preserve">
+    <value>Kontakte nou</value>
+  </data>
+  <data name="content" xml:space="preserve">
+    <value>Kontni</value>
+  </data>
+  <data name="continue" xml:space="preserve">
+    <value>Kontinye</value>
+  </data>
+  <data name="create_new_account" xml:space="preserve">
+    <value>Kreye nouvo kont</value>
+  </data>
+  <data name="creole" xml:space="preserve">
+    <value>Kreyol</value>
+  </data>
+  <data name="dateOfBirth" xml:space="preserve">
+    <value>Dat nesans</value>
+  </data>
+  <data name="date_purchase" xml:space="preserve">
+    <value>Dat ou achte</value>
+  </data>
+  <data name="days" xml:space="preserve">
+    <value>Jou</value>
+  </data>
+  <data name="details" xml:space="preserve">
+    <value>Detay</value>
+  </data>
+  <data name="detail_of_payment" xml:space="preserve">
+    <value>Detay peyman</value>
+  </data>
+  <data name="drawn" xml:space="preserve">
+    <value>Tiraj</value>
+  </data>
+  <data name="draw_date" xml:space="preserve">
+    <value>Dat tiraj</value>
+  </data>
+  <data name="draw_time" xml:space="preserve">
+    <value>Le tiraj</value>
+  </data>
+  <data name="english" xml:space="preserve">
+    <value>Angle</value>
+  </data>
+  <data name="enter_amount" xml:space="preserve">
+    <value>Antre montan 1 - 10,000 HTG</value>
+  </data>
+  <data name="enter_amount1" xml:space="preserve">
+    <value>Antre montan</value>
+  </data>
+  <data name="enter_amount_1_1000" xml:space="preserve">
+    <value>Antre montan ( Maksimon 5000HTG/tranzaksyon)</value>
+  </data>
+  <data name="enter_birthday" xml:space="preserve">
+    <value>Antre Dat Nesans</value>
+  </data>
+  <data name="enter_digit_2" xml:space="preserve">
+    <value>Antre 2 chif (00 a 99)</value>
+  </data>
+  <data name="enter_digit_3" xml:space="preserve">
+    <value>Antre 2 chif (000 a 999)</value>
+  </data>
+  <data name="enter_digit_4" xml:space="preserve">
+    <value>Antre 2 chif (0000 a 9999)</value>
+  </data>
+  <data name="enter_money" xml:space="preserve">
+    <value>Antre lajan</value>
+  </data>
+  <data name="enter_name" xml:space="preserve">
+    <value>Antre tout non ou </value>
+  </data>
+  <data name="enter_otp" xml:space="preserve">
+    <value>Antre OTP </value>
+  </data>
+  <data name="enter_otp_to_login" xml:space="preserve">
+    <value>Tanpri antre OTP a pou konekte</value>
+  </data>
+  <data name="enter_password" xml:space="preserve">
+    <value>Antre 6 chif modpas la</value>
+  </data>
+  <data name="enter_phone_number" xml:space="preserve">
+    <value>Antre yon nonb</value>
+  </data>
+  <data name="enter_your_new_password" xml:space="preserve">
+    <value>Mete yon nouvo modpas</value>
+  </data>
+  <data name="enter_your_old_password" xml:space="preserve">
+    <value>Mete ansye modpas la</value>
+  </data>
+  <data name="error_happened" xml:space="preserve">
+    <value>Gen yon ere. Tanpri eseye anko</value>
+  </data>
+  <data name="error_happened1" xml:space="preserve">
+    <value>Gen yon ere. Tanpri eseye anko</value>
+  </data>
+  <data name="fail" xml:space="preserve">
+    <value>Echek</value>
+  </data>
+  <data name="faq" xml:space="preserve">
+    <value>FAQ</value>
+  </data>
+  <data name="fee" xml:space="preserve">
+    <value>Fre</value>
+  </data>
+  <data name="fee_tranfer" xml:space="preserve">
+    <value>Fre transfe</value>
+  </data>
+  <data name="fill_password" xml:space="preserve">
+    <value>Tanpri antre Modpas ou </value>
+  </data>
+  <data name="fill_phone" xml:space="preserve">
+    <value>Tanpri antre nimewo telefon ou </value>
+  </data>
+  <data name="fill_your_number" xml:space="preserve">
+    <value>Tanpri antre nimewo ou </value>
+  </data>
+  <data name="florida_lottery" xml:space="preserve">
+    <value>Lotri Florida</value>
+  </data>
+  <data name="forgot_password" xml:space="preserve">
+    <value>Blye modpas</value>
+  </data>
+  <data name="free" xml:space="preserve">
+    <value>Gratis</value>
+  </data>
+  <data name="from" xml:space="preserve">
+    <value>Soti nan</value>
+  </data>
+  <data name="from_your_number" xml:space="preserve">
+    <value>Transfere sou nimewo ou </value>
+  </data>
+  <data name="fullname_not_valid" xml:space="preserve">
+    <value>Non konple a pa bon</value>
+  </data>
+  <data name="get_otp1" xml:space="preserve">
+    <value>Jwenn OTP</value>
+  </data>
+  <data name="get_started" xml:space="preserve">
+    <value>Komanse</value>
+  </data>
+  <data name="have_chance_to_get" xml:space="preserve">
+    <value>Gen chans pouw genyen</value>
+  </data>
+  <data name="history" xml:space="preserve">
+    <value>Istorik</value>
+  </data>
+  <data name="home" xml:space="preserve">
+    <value>Akey</value>
+  </data>
+  <data name="home_page" xml:space="preserve">
+    <value>Paj akey</value>
+  </data>
+  <data name="hours" xml:space="preserve">
+    <value>Hours</value>
+  </data>
+  <data name="how_to_play" xml:space="preserve">
+    <value>Kijan pouw jwe?</value>
+  </data>
+  <data name="internet_error" xml:space="preserve">
+    <value>Koneksyon an pa bon</value>
+  </data>
+  <data name="in_blacklist" xml:space="preserve">
+    <value>Sistem nan ap travay</value>
+  </data>
+  <data name="in_draw_date" xml:space="preserve">
+    <value>Nimewo ou pou tiraj nan dat:</value>
+  </data>
+  <data name="language" xml:space="preserve">
+    <value>Lang</value>
+  </data>
+  <data name="login" xml:space="preserve">
+    <value>Konekte</value>
+  </data>
+  <data name="login_fail_wrong_pass" xml:space="preserve">
+    <value>Koneksyon echwe akoz move modpas</value>
+  </data>
+  <data name="logout" xml:space="preserve">
+    <value>Dekonekte</value>
+  </data>
+  <data name="loto_des_v2" xml:space="preserve">
+    <value>se yon jwet Bolet, Maryaj ak Lotto3, rezilta jwet lotri Nouyok ak Florid. Chwazi nimewo ou yo epi tann yo anonse ganyan an. Ou ka voye lajan ou genyen an sou balans prensipal ou oswa Natcash. Bon chans!</value>
+  </data>
+  <data name="lotto3" xml:space="preserve">
+    <value>Lotto3</value>
+  </data>
+  <data name="lotto3_content" xml:space="preserve">
+    <value>&lt;p&gt;&lt;span style="white-space:pre-wrap;"&gt;1. Bolet se yon jwet nan Bee Lotto. Kliyan yo chwazi nenpot 2 nimewo ant 00 ak 99. Vale minimom tike a se 1 HTG, maksimom nan se 1,000 HTG. Rezilta Bolet yo baze sou rezilta NIMEWO ak WIN4 nan lotri Nouyok la. &lt;br&gt;&lt;br&gt;2. Bolet gen ladan l 3 pri:&lt;br&gt;* Lo 1: gen ladan l nimewo ki nan 2yem ak 3yem pozisyon tiraj NIMEWO a. Rapo genyen: achte 1 HTG genyen 50 HTG&lt;br&gt;* Lo 2: gen ladan l nimewo ki nan 1ye ak 2yem pozisyon tiraj WIN4 la. Rapo genyen: achte 1 HTG genyen 20 HTG&lt;br&gt;* Lo 3: gen ladan l nimewo ki nan 3yem ak 4yem pozisyon tiraj WIN4 la. Rapo genyen: achte 1 HTG genyen 20 HTG&lt;br&gt;&lt;br&gt;3. Le pou achte tike&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Lajounen: Soti 0:00 - 14:00. Le rezilta: 14:30&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Lannuit: Soti 15:00 - 8:00. Le rezilta 20:30&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/p&gt;</value>
+  </data>
+  <data name="maryaj" xml:space="preserve">
+    <value>Maryaj</value>
+  </data>
+  <data name="marya_content" xml:space="preserve">
+    <value>&lt;p&gt;&lt;span style="white-space:pre-wrap;"&gt;1. Bolet se yon jwet nan Bee Lotto. Kliyan yo chwazi nenpot 2 nimewo ant 00 ak 99. Vale minimom tike a se 1 HTG, maksimom nan se 1,000 HTG. Rezilta Bolet yo baze sou rezilta NIMEWO ak WIN4 nan lotri Nouyok la. &lt;br&gt;&lt;br&gt;2. Bolet gen ladan l 3 pri:&lt;br&gt;* Lo 1: gen ladan l nimewo ki nan 2yem ak 3yem pozisyon tiraj NIMEWO a. Rapo genyen: achte 1 HTG genyen 50 HTG&lt;br&gt;* Lo 2: gen ladan l nimewo ki nan 1ye ak 2yem pozisyon tiraj WIN4 la. Rapo genyen: achte 1 HTG genyen 20 HTG&lt;br&gt;* Lo 3: gen ladan l nimewo ki nan 3yem ak 4yem pozisyon tiraj WIN4 la. Rapo genyen: achte 1 HTG genyen 20 HTG&lt;br&gt;&lt;br&gt;3. Le pou achte tike&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Lajounen: Soti 0:00 - 14:00. Le rezilta: 14:30&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Lannuit: Soti 15:00 - 8:00. Le rezilta 20:30&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/p&gt;</value>
+  </data>
+  <data name="max_5_tickets" xml:space="preserve">
+    <value>Maksimom nimewo nan yon tike se 5. Tanpri eseye anko.</value>
+  </data>
+  <data name="max_transfer_1000HTG" xml:space="preserve">
+    <value>Trnasfe maksimom nan se 10,000 HTG. Tanpri eseye anko.</value>
+  </data>
+  <data name="mins" xml:space="preserve">
+    <value>Mins</value>
+  </data>
+  <data name="money" xml:space="preserve">
+    <value>Lajan</value>
+  </data>
+  <data name="money_on" xml:space="preserve">
+    <value>Montan transfe (HTG)</value>
+  </data>
+  <data name="more" xml:space="preserve">
+    <value>Plis</value>
+  </data>
+  <data name="must_login" xml:space="preserve">
+    <value>OU pako konekte. Tanpri konekte.</value>
+  </data>
+  <data name="name" xml:space="preserve">
+    <value>Non </value>
+  </data>
+  <data name="NatCash" xml:space="preserve">
+    <value>Natcash</value>
+  </data>
+  <data name="new_pass_error" xml:space="preserve">
+    <value>Tanpri verifye nouvo modpas ou</value>
+  </data>
+  <data name="new_york_lottery" xml:space="preserve">
+    <value>Lotri New York </value>
+  </data>
+  <data name="next_draw" xml:space="preserve">
+    <value>Pwochen tiraj</value>
+  </data>
+  <data name="note_password" xml:space="preserve">
+    <value>Not: Sere modpas ou, piga pataje li ak moun </value>
+  </data>
+  <data name="not_defined" xml:space="preserve">
+    <value>Pa defini</value>
+  </data>
+  <data name="not_draw" xml:space="preserve">
+    <value>Tiraj </value>
+  </data>
+  <data name="not_enough_money" xml:space="preserve">
+    <value>Oupa gen ase lajan sou kont lotri ou pou fe tranzaksyon sa</value>
+  </data>
+  <data name="not_enough_money_to_exchange" xml:space="preserve">
+    <value>Oupa gen ase lajan</value>
+  </data>
+  <data name="not_get_otp" xml:space="preserve">
+    <value>Ou pa resevwa OTP?</value>
+  </data>
+  <data name="not_register_natcash" xml:space="preserve">
+    <value>Oupa ko gen kont natcash. Tanpri verifye kew gen kont Natcash.</value>
+  </data>
+  <data name="not_win" xml:space="preserve">
+    <value>Ou pedi </value>
+  </data>
+  <data name="no_permission" xml:space="preserve">
+    <value>Oupa gen pemisyon pou sa</value>
+  </data>
+  <data name="number" xml:space="preserve">
+    <value>Nimewo</value>
+  </data>
+  <data name="or" xml:space="preserve">
+    <value>OR</value>
+  </data>
+  <data name="order_code" xml:space="preserve">
+    <value>Komand kod</value>
+  </data>
+  <data name="or_select" xml:space="preserve">
+    <value>Chwazi montan (HTG)</value>
+  </data>
+  <data name="otp" xml:space="preserve">
+    <value>OTP</value>
+  </data>
+  <data name="otp_invalid" xml:space="preserve">
+    <value>OTP a pa bon</value>
+  </data>
+  <data name="otp_timeout" xml:space="preserve">
+    <value>OTP ekspire</value>
+  </data>
+  <data name="over_1000HTG_transfer" xml:space="preserve">
+    <value>Komand sa depase 5000 HTG. Tanpri verifye anko.</value>
+  </data>
+  <data name="over_each_exchange" xml:space="preserve">
+    <value>Montan an depase limit la.</value>
+  </data>
+  <data name="over_exchange_per_day" xml:space="preserve">
+    <value>Montan an depase limit pou jounen an.</value>
+  </data>
+  <data name="params_invalid" xml:space="preserve">
+    <value>Envalid</value>
+  </data>
+  <data name="password" xml:space="preserve">
+    <value>Modpas</value>
+  </data>
+  <data name="password_tip" xml:space="preserve">
+    <value>Modpas</value>
+  </data>
+  <data name="pass_tip_1" xml:space="preserve">
+    <value>1. Antre 6 chif</value>
+  </data>
+  <data name="pass_tip_2" xml:space="preserve">
+    <value>2.Modpas: 0-9, dwe gen karakte espesyal ( pa dwe gen espas)</value>
+  </data>
+  <data name="payment" xml:space="preserve">
+    <value>Peyman</value>
+  </data>
+  <data name="payment_account" xml:space="preserve">
+    <value>Kont peyman</value>
+  </data>
+  <data name="payment_mothod" xml:space="preserve">
+    <value>Metod peyman</value>
+  </data>
+  <data name="phone_invalid" xml:space="preserve">
+    <value>Nimewo telefon nan pa bon</value>
+  </data>
+  <data name="phone_number" xml:space="preserve">
+    <value>Nimewo telefon</value>
+  </data>
+  <data name="pin_wrong" xml:space="preserve">
+    <value>PIN sa pa bon </value>
+  </data>
+  <data name="play" xml:space="preserve">
+    <value>Jwe</value>
+  </data>
+  <data name="price" xml:space="preserve">
+    <value>Pri</value>
+  </data>
+  <data name="profile" xml:space="preserve">
+    <value>Pwofil</value>
+  </data>
+  <data name="promotion_code_inactive" xml:space="preserve">
+    <value>Kod pwomosyon sa pa aktive</value>
+  </data>
+  <data name="promotion_code_invalid" xml:space="preserve">
+    <value>Kod pwomosyon sa pa bon</value>
+  </data>
+  <data name="promotion_code_used" xml:space="preserve">
+    <value>Kod pwomosyon sa itilize deja</value>
+  </data>
+  <data name="question" xml:space="preserve">
+    <value>Kesyon </value>
+  </data>
+  <data name="receiver" xml:space="preserve">
+    <value>Destinate</value>
+  </data>
+  <data name="receiver_phone" xml:space="preserve">
+    <value>bay lot nimewo Natcom</value>
+  </data>
+  <data name="register" xml:space="preserve">
+    <value>Anrejistre</value>
+  </data>
+  <data name="reorder" xml:space="preserve">
+    <value>Refe komand</value>
+  </data>
+  <data name="resend_otp" xml:space="preserve">
+    <value>Voye OTP a anko</value>
+  </data>
+  <data name="resent_otp" xml:space="preserve">
+    <value>OTP a </value>
+  </data>
+  <data name="reset_after_1_minute" xml:space="preserve">
+    <value>Tanpri reyinisyalize OTP a apre 1 minit</value>
+  </data>
+  <data name="results" xml:space="preserve">
+    <value>Rezilta</value>
+  </data>
+  <data name="return_home_page" xml:space="preserve">
+    <value>Tounen nan paj akey</value>
+  </data>
+  <data name="review_payment" xml:space="preserve">
+    <value>Verifye peyman</value>
+  </data>
+  <data name="rules" xml:space="preserve">
+    <value>Regleman </value>
+  </data>
+  <data name="search" xml:space="preserve">
+    <value>Rechech</value>
+  </data>
+  <data name="seconds" xml:space="preserve">
+    <value>Secs</value>
+  </data>
+  <data name="see_more" xml:space="preserve">
+    <value>Plis</value>
+  </data>
+  <data name="select_an_account" xml:space="preserve">
+    <value>Transfere sou kont ou </value>
+  </data>
+  <data name="sender" xml:space="preserve">
+    <value>Espedite</value>
+  </data>
+  <data name="sender_phone" xml:space="preserve">
+    <value>Nimewo ou</value>
+  </data>
+  <data name="skip_to_guest" xml:space="preserve">
+    <value>Sote </value>
+  </data>
+  <data name="start_using_bee_loto" xml:space="preserve">
+    <value>Komanse itilize loto</value>
+  </data>
+  <data name="status" xml:space="preserve">
+    <value>Estati</value>
+  </data>
+  <data name="success" xml:space="preserve">
+    <value>Reyisi</value>
+  </data>
+  <data name="system_update" xml:space="preserve">
+    <value>System nan okipe. Tanpri eseye apre 1 minit</value>
+  </data>
+  <data name="term" xml:space="preserve">
+    <value>Dat ou achte a</value>
+  </data>
+  <data name="terms_and_conditions" xml:space="preserve">
+    <value>Tem ak kondisyon</value>
+  </data>
+  <data name="term_timeout" xml:space="preserve">
+    <value>Kondisyon sa espire. Tanpri eseye anko </value>
+  </data>
+  <data name="thank_you" xml:space="preserve">
+    <value>Mesi!</value>
+  </data>
+  <data name="ticket" xml:space="preserve">
+    <value>Tike</value>
+  </data>
+  <data name="ticket_code" xml:space="preserve">
+    <value>Bill code</value>
+  </data>
+  <data name="ticket_invalid" xml:space="preserve">
+    <value>Tike a pa bon</value>
+  </data>
+  <data name="time" xml:space="preserve">
+    <value>Le</value>
+  </data>
+  <data name="to" xml:space="preserve">
+    <value>a</value>
+  </data>
+  <data name="token_invalid" xml:space="preserve">
+    <value>Envalid</value>
+  </data>
+  <data name="total_money" xml:space="preserve">
+    <value>Lajan total </value>
+  </data>
+  <data name="total_ticket" xml:space="preserve">
+    <value>Tike total</value>
+  </data>
+  <data name="to_other_natcom_number" xml:space="preserve">
+    <value>bay lot nimewo Natcom</value>
+  </data>
+  <data name="tranfer_win_money" xml:space="preserve">
+    <value>Retire lajan</value>
+  </data>
+  <data name="transfer" xml:space="preserve">
+    <value>Transfe</value>
+  </data>
+  <data name="transfer_method" xml:space="preserve">
+    <value>Metod transfe</value>
+  </data>
+  <data name="transfer_success" xml:space="preserve">
+    <value>Lajan an transfer ak sikse!</value>
+  </data>
+  <data name="type" xml:space="preserve">
+    <value>Tip</value>
+  </data>
+  <data name="update" xml:space="preserve">
+    <value>Mizajou</value>
+  </data>
+  <data name="update_successful" xml:space="preserve">
+    <value>Mizajou reyisi</value>
+  </data>
+  <data name="user_avatar_error" xml:space="preserve">
+    <value>Echek foto itilizate </value>
+  </data>
+  <data name="verify_otp" xml:space="preserve">
+    <value>Veifye kont ou pou konekte</value>
+  </data>
+  <data name="waiting_for_result" xml:space="preserve">
+    <value>Tann rezilta a</value>
+  </data>
+  <data name="wallet_not_active" xml:space="preserve">
+    <value>Kont sa pa aktive</value>
+  </data>
+  <data name="wallet_not_existed" xml:space="preserve">
+    <value>Tranzaksyon sa pa reyisi, ou pa gen kont Natcash. Pou kreye kont Natcash, fe *202# epi swiv enstriksyon yo. Mesi!</value>
+  </data>
+  <data name="welcome_to_bee_loto" xml:space="preserve">
+    <value>Welcome to Bee Lotto</value>
+  </data>
+  <data name="win" xml:space="preserve">
+    <value>Genyen</value>
+  </data>
+  <data name="winning_account" xml:space="preserve">
+    <value>Kont ganyan</value>
+  </data>
+  <data name="wrong_otp" xml:space="preserve">
+    <value>Modpas la pa bon. Tanpri eseye anko</value>
+  </data>
+  <data name="younger_to_use" xml:space="preserve">
+    <value>Ou pa ko gen ase laj pou sevis sa </value>
+  </data>
+  <data name="your_number" xml:space="preserve">
+    <value>Nimewo ou </value>
+  </data>
+  <data name="your_password_reset" xml:space="preserve">
+    <value>Komand sa depase 5000 HTG. Tanpri verifye anko.</value>
+  </data>
+  <data name="you_have_registered_Bee_loto" xml:space="preserve">
+    <value>Ou anrejistre kont Loto ou ak sikse</value>
+  </data>
+  <data name="you_have_winning_number" xml:space="preserve">
+    <value>Ou genyen, prim ou a se:</value>
+  </data>
+  <data name="quick_pick" xml:space="preserve">
+    <value>Pick rapid</value>
+  </data>
+  <data name="my_ticket" xml:space="preserve">
+    <value>Tike mwen</value>
+  </data>
+  <data name="jackpot_prize" xml:space="preserve">
+    <value>Prim Jakpot</value>
+  </data>
+  <data name="next_round" xml:space="preserve">
+    <value>Pwochen tou</value>
+  </data>
+  <data name="small_big" xml:space="preserve">
+    <value>Piti Gwo</value>
+  </data>
+  <data name="odd_even" xml:space="preserve">
+    <value>Enpe Pe</value>
+  </data>
+  <data name="v2_select" xml:space="preserve">
+    <value>Chwazi</value>
+  </data>
+  <data name="v2_selected" xml:space="preserve">
+    <value>Chwazi</value>
+  </data>
+  <data name="v2_prize_if_win" xml:space="preserve">
+    <value>Prim ou ka genyen</value>
+  </data>
+  <data name="v2_you_choose" xml:space="preserve">
+    <value>Sa ou chwazi</value>
+  </data>
+  <data name="how_to_play_pick10" xml:space="preserve">
+    <value>Kijan pouw jwe Pick 10</value>
+  </data>
+  <data name="how_to_play_millionair" xml:space="preserve">
+    <value>Kijan pouw jwe Milyone?</value>
+  </data>
+  <data name="how_to_play_megabet" xml:space="preserve">
+    <value>Kijan pouw jwe Mega Bet?</value>
+  </data>
+  <data name="MEGA" xml:space="preserve">
+    <value>MEGA</value>
+  </data>
+  <data name="Bet" xml:space="preserve">
+    <value>Paryaj</value>
+  </data>
+  <data name="faq_q1" xml:space="preserve">
+    <value>Kijan pouw jwe Pick 10?</value>
+  </data>
+  <data name="faq_a1" xml:space="preserve">
+    <value>Chwazi 10 nimewo ant 1 ak 80 oswa chwazi opsyon Pick Rapid la. Achte tike w epi tann tiraj la.</value>
+  </data>
+  <data name="faq_q2" xml:space="preserve">
+    <value>Ki le tiraj Pick 10 yo ap fet?</value>
+  </data>
+  <data name="faq_a2" xml:space="preserve">
+    <value>Tiraj yo fet chak jou a 8:30 p.m. Vann tike yo sispann a 8:00 p.m.</value>
+  </data>
+  <data name="faq_a3" xml:space="preserve">
+    <value>Chans pou genyen premye pri Pick 10 la se 1 sou 8,911,711.</value>
+  </data>
+  <data name="rule_payment_shortly" xml:space="preserve">
+    <value>Peman ki fet ak sikseap konplete nan yon ti tan apre 8e diswa pou tiraj aktyel la.</value>
+  </data>
+  <data name="rule_system_count_final" xml:space="preserve">
+    <value>Rezilta final ak Kont ofisyel sistem nan</value>
+  </data>
+  <data name="rule_select" xml:space="preserve">
+    <value>Chwazi</value>
+  </data>
+  <data name="rule_if_purchased_small" xml:space="preserve">
+    <value>Si ou te achte yon tike Piti:</value>
+  </data>
+  <data name="rule_jackpot_prize" xml:space="preserve">
+    <value>Prim Jakpot</value>
+  </data>
+  <data name="rule_regulation_draw" xml:space="preserve">
+    <value>Regleman tiraj </value>
+  </data>
+  <data name="rule_objective" xml:space="preserve">
+    <value>Objective.</value>
+  </data>
+  <data name="rule_general_info" xml:space="preserve">
+    <value>ENFOMASYON JENERAL</value>
+  </data>
+  <data name="rule_oe_winning_rule" xml:space="preserve">
+    <value>ENPE/PE &amp;#8211; REG GANYAN</value>
+  </data>
+  <data name="rule_ticket_closure" xml:space="preserve">
+    <value>Tike denye le</value>
+  </data>
+  <data name="rule_standard_prize" xml:space="preserve">
+    <value>Standard Prize Structure</value>
+  </data>
+  <data name="rule_if_purchased_odd" xml:space="preserve">
+    <value>Si ou achte yon tike enpe:</value>
+  </data>
+  <data name="rule_condition" xml:space="preserve">
+    <value>Kondisyon</value>
+  </data>
+  <data name="rule_match_all_10" xml:space="preserve">
+    <value>Matche tout 10 nimewo &amp; 9989</value>
+  </data>
+  <data name="rule_if_15_odd_result_odd" xml:space="preserve">
+    <value>Si 15 nimewo oswa plis pami 20 nimewo yo tiraj la se nimewo Enpe, &lt;br&gt;rezilta ofisyel la se&lt;span class="font-bold text-[#A236C8]"&gt;ODD&lt;/span&gt;.</value>
+  </data>
+  <data name="rule_title" xml:space="preserve">
+    <value>Reg</value>
+  </data>
+  <data name="rule_classic_pick_10" xml:space="preserve">
+    <value>Pick 10</value>
+  </data>
+  <data name="rule_big_small" xml:space="preserve">
+    <value>Gwo Piti</value>
+  </data>
+  <data name="rule_odd_even" xml:space="preserve">
+    <value>Enpe Pe</value>
+  </data>
+  <data name="rule_13_numbers_game" xml:space="preserve">
+    <value>(Jwe 13 nimewo)</value>
+  </data>
+  <data name="rule_15_numbers_game" xml:space="preserve">
+    <value>(Jwe 15 nimewo)</value>
+  </data>
+  <data name="rule_item" xml:space="preserve">
+    <value>Atik</value>
+  </data>
+  <data name="rule_time" xml:space="preserve">
+    <value>Le</value>
+  </data>
+  <data name="rule_total_numbers" xml:space="preserve">
+    <value>Nimewo total</value>
+  </data>
+  <data name="rule_numbers_drawn" xml:space="preserve">
+    <value>Nimewo ki soti</value>
+  </data>
+  <data name="rule_purchase_channels" xml:space="preserve">
+    <value>Achte chanel</value>
+  </data>
+  <data name="rule_result_channel" xml:space="preserve">
+    <value>Rezilta chanel </value>
+  </data>
+  <data name="rule_duplicate_allowed" xml:space="preserve">
+    <value>Nimewo doub otorize</value>
+  </data>
+  <data name="rule_identical_allowed" xml:space="preserve">
+    <value>Tike idantik otorize</value>
+  </data>
+  <data name="rule_20_30_daily" xml:space="preserve">
+    <value>20:30 chak jou</value>
+  </data>
+  <data name="rule_20_00_daily" xml:space="preserve">
+    <value>20:30 chak jou</value>
+  </data>
+  <data name="rule_01_80" xml:space="preserve">
+    <value>2 - 80</value>
+  </data>
+  <data name="rule_20_per_draw" xml:space="preserve">
+    <value>20 nimewo pa tiraj</value>
+  </data>
+  <data name="rule_ussd_web_app" xml:space="preserve">
+    <value>USSD / Web / APP</value>
+  </data>
+  <data name="rule_web_app" xml:space="preserve">
+    <value>Web / APP</value>
+  </data>
+  <data name="rule_yes" xml:space="preserve">
+    <value>Wi</value>
+  </data>
+  <data name="rule_game_1_title" xml:space="preserve">
+    <value>II. GAME 1 – BASIC PICK 11</value>
+  </data>
+  <data name="rule_basic_pick" xml:space="preserve">
+    <value>Basic&lt;br&gt;Pick</value>
+  </data>
+  <data name="rule_next_round" xml:space="preserve">
+    <value>Pwochen tou</value>
+  </data>
+  <data name="rule_play_now" xml:space="preserve">
+    <value>Jwe</value>
+  </data>
+  <data name="rule_how_to_play" xml:space="preserve">
+    <value>Kijan pouw jwe</value>
+  </data>
+  <data name="rule_description" xml:space="preserve">
+    <value>Deskripsyon</value>
+  </data>
+  <data name="rule_ticket_price" xml:space="preserve">
+    <value>Pri tike</value>
+  </data>
+  <data name="rule_10_htg" xml:space="preserve">
+    <value>10 HTG</value>
+  </data>
+  <data name="rule_selection_method" xml:space="preserve">
+    <value>Chwazi metod</value>
+  </data>
+  <data name="rule_choose_10" xml:space="preserve">
+    <value>Chwazi 10 nimewo ant 1 - 80 </value>
+  </data>
+  <data name="rule_winning_rule" xml:space="preserve">
+    <value>Regleman ganyan</value>
+  </data>
+  <data name="rule_10_taken_from" xml:space="preserve">
+    <value>10 nimewo ap chwazi pami 20 tiraj la</value>
+  </data>
+  <data name="rule_match_as_many" xml:space="preserve">
+    <value>Matche kantite nimewo kew kapab</value>
+  </data>
+  <data name="rule_jackpot_rule" xml:space="preserve">
+    <value>Regleman Jakpot la</value>
+  </data>
+  <data name="rule_prize_pool" xml:space="preserve">
+    <value>Prize Pool</value>
+  </data>
+  <data name="rule_if_le_10" xml:space="preserve">
+    <value>Si  ≤ 10 Ganyan</value>
+  </data>
+  <data name="rule_each_receives" xml:space="preserve">
+    <value>Chak ganyan ap resevwa 100,00 HTG</value>
+  </data>
+  <data name="rule_if_gt_10" xml:space="preserve">
+    <value>Si  &gt; 10 Ganyan</value>
+  </data>
+  <data name="rule_shared_equally" xml:space="preserve">
+    <value>1.000 .000 HTG ap separe egal bay ganyan yo </value>
+  </data>
+  <data name="rule_numbers_matches" xml:space="preserve">
+    <value>Nimewo matche</value>
+  </data>
+  <data name="rule_prize_pool_htg" xml:space="preserve">
+    <value>Prize Pool (HTG)</value>
+  </data>
+  <data name="rule_prize_12k" xml:space="preserve">
+    <value>12,000 HTG.</value>
+  </data>
+  <data name="rule_prize_600" xml:space="preserve">
+    <value>💰600 HTG.</value>
+  </data>
+  <data name="rule_prize_160" xml:space="preserve">
+    <value>160 HTG.</value>
+  </data>
+  <data name="rule_prize_20" xml:space="preserve">
+    <value>💰20 HTG.</value>
+  </data>
+  <data name="rule_prize_5" xml:space="preserve">
+    <value>💰5 HTG.</value>
+  </data>
+  <data name="rule_sales_cutoff" xml:space="preserve">
+    <value>Le ak limit pou vann tike</value>
+  </data>
+  <data name="rule_sales_close" xml:space="preserve">
+    <value>Le pou vann tike a 20:00 chakjou </value>
+  </data>
+  <data name="rule_if_making_payment" xml:space="preserve">
+    <value>Si w ap fe yon peman preske le limit la:</value>
+  </data>
+  <data name="rule_payment_later" xml:space="preserve">
+    <value>Peman ki fet pita ap anrejistre otomatikman pou pwochen tiraj la.</value>
+  </data>
+  <data name="rule_system_time" xml:space="preserve">
+    <value>Le ofisyel sistem nan ap detemine si tike a valid</value>
+  </data>
+  <data name="rule_bs_winning_rule" xml:space="preserve">
+    <value>GWO  PITI – REGLEMAN </value>
+  </data>
+  <data name="rule_how_to_win" xml:space="preserve">
+    <value>Kijan pouw genyen </value>
+  </data>
+  <data name="rule_buy_big_small" xml:space="preserve">
+    <value>Le ou achte yon tike, chwazi swa GWO oswa TI.</value>
+  </data>
+  <data name="rule_system_check_20" xml:space="preserve">
+    <value>Apre tiraj la, sistem nan ap verifye 20 nimewo yo te tire yo.</value>
+  </data>
+  <data name="rule_bs_prize" xml:space="preserve">
+    <value>Big Small Prize</value>
+  </data>
+  <data name="rule_if_purchased_big" xml:space="preserve">
+    <value>Si ou te achte yon GWO tike:</value>
+  </data>
+  <data name="rule_13_from_41_80" xml:space="preserve">
+    <value>13 nimewo pami &lt;span class="font-[900]"&gt;41-80&lt;/span&gt;</value>
+  </data>
+  <data name="rule_selected" xml:space="preserve">
+    <value>Chwazi</value>
+  </data>
+  <data name="rule_if_13_41_80" xml:space="preserve">
+    <value>Si 13 nimewo pami 20 nimewo yo tire a soti nan seri a &lt;span class="text-[#0BA01A] font-bold"&gt;41–80&lt;/span&gt;,</value>
+  </data>
+  <data name="rule_you_win" xml:space="preserve">
+    <value>Ou genyen</value>
+  </data>
+  <data name="rule_13_from_01_40" xml:space="preserve">
+    <value>14 nimewo pami &lt;span class="font-[900]"&gt;01-40&lt;/span&gt;</value>
+  </data>
+  <data name="rule_if_13_01_40" xml:space="preserve">
+    <value>Si 13 nimewo pami 20 nimewo yo tire a soti nan seri a &lt;span class="text-[#0BA01A] font-bold"&gt;01–40&lt;/span&gt;,</value>
+  </data>
+  <data name="rule_example" xml:space="preserve">
+    <value>Ekzanp</value>
+  </data>
+  <data name="rule_if_20_drawn_contain" xml:space="preserve">
+    <value>Si 20 nimewo yo tire a gen:</value>
+  </data>
+  <data name="rule_13_or_more_41_80" xml:space="preserve">
+    <value>14 nimewo oswa plis ant &lt;span class="text-[#0BA01A] font-bold"&gt;41–80&lt;/span&gt; → Gwo genyen</value>
+  </data>
+  <data name="rule_13_or_more_01_40" xml:space="preserve">
+    <value>13nimewo oswa plis ant &lt;span class="text-[#0BA01A] font-bold"&gt;01–40&lt;/span&gt; → PITI genyen</value>
+  </data>
+  <data name="rule_prize_pool_title" xml:space="preserve">
+    <value>PRIZE POOL</value>
+  </data>
+  <data name="rule_win_receive_2x" xml:space="preserve">
+    <value>Tike ki genyen yo resevwa 2 fwa kantite lajan yo te parye a.</value>
+  </data>
+  <data name="rule_example_bet_50" xml:space="preserve">
+    <value>Ekzanp:Parye 50 HTG → Resevwa 100 HTG.</value>
+  </data>
+  <data name="rule_how_result_determined" xml:space="preserve">
+    <value>Kijan yo detemine rezilta gayan an</value>
+  </data>
+  <data name="rule_system_draws_20_01_80" xml:space="preserve">
+    <value>Sistem nan tire 20 nimewo soti nan 01 rive nan 80.</value>
+  </data>
+  <data name="rule_system_count_how_many" xml:space="preserve">
+    <value>
+Pou jwet sa a, sistem nan ap konte konbyen nan 20 nimewo ki tire yo ki:</value>
+  </data>
+  <data name="rule_odd_numbers" xml:space="preserve">
+    <value>Nimewo Enpe</value>
+  </data>
+  <data name="rule_even_numbers" xml:space="preserve">
+    <value>Nimewo Pe</value>
+  </data>
+  <data name="rule_oe_prize" xml:space="preserve">
+    <value>Prim Enpe/Pe</value>
+  </data>
+  <data name="rule_winning_condition" xml:space="preserve">
+    <value>Kondisyon</value>
+  </data>
+  <data name="rule_if_15_even_result_even" xml:space="preserve">
+    <value>Si 15 nimewo oswa plis pami 20 nimewo yo tire a se nimewo pe,&lt;br&gt;the official result is &lt;span class="font-bold text-[#A236C8]"&gt;EVEN&lt;/span&gt;.</value>
+  </data>
+  <data name="rule_how_ticket_wins" xml:space="preserve">
+    <value>KILE TIKE OU A GENYEN</value>
+  </data>
+  <data name="rule_odd_numbers_13579" xml:space="preserve">
+    <value>Nimewo enpe&lt;span class="font-[900]"&gt;1,3,5,7,9&lt;/span&gt;</value>
+  </data>
+  <data name="rule_if_20_contain_15_odd" xml:space="preserve">
+    <value>Si 20 nimewo ki tire yo genyen 15 oswa plis nimewo enpe &lt;span class="font-bold"&gt;odd&lt;/span&gt; numbers</value>
+  </data>
+  <data name="rule_if_purchased_even" xml:space="preserve">
+    <value>Si ou te achte yon tike Pe:</value>
+  </data>
+  <data name="rule_even_numbers_02468" xml:space="preserve">
+    <value>Nimewo Pe &lt;span class="font-[900]"&gt;0,2,4,6,8&lt;/span&gt;</value>
+  </data>
+  <data name="rule_if_20_contain_15_even" xml:space="preserve">
+    <value>Si 20 nimewo ki tire yo genyen 15 oswa plis &lt;span class="font-bold"&gt;even&lt;/span&gt; nimewo </value>
+  </data>
+  <data name="rule_example_16_odd" xml:space="preserve">
+    <value>16 nimewo enpe</value>
+  </data>
+  <data name="rule_example_4_even" xml:space="preserve">
+    <value>4 nimewo pe</value>
+  </data>
+  <data name="rule_result_is_odd" xml:space="preserve">
+    <value>
+Rezilta ofisyel la se &lt;span class="text-[#A236C8]"&gt;ODD&lt;/span&gt;.</value>
+  </data>
+  <data name="rule_all_odd_win" xml:space="preserve">
+    <value>Tout tike Enpe yo genyen.</value>
+  </data>
+  <data name="rule_example_15_even" xml:space="preserve">
+    <value>16 nimewo pe</value>
+  </data>
+  <data name="rule_example_5_odd" xml:space="preserve">
+    <value>4 nimewo enpe</value>
+  </data>
+  <data name="rule_result_is_even" xml:space="preserve">
+    <value>Rezilta ofisyel la se &lt;span class="text-[#A236C8]"&gt;EVEN&lt;/span&gt;.</value>
+  </data>
+  <data name="rule_all_even_win" xml:space="preserve">
+    <value>Tout tike Pe yo genyen.</value>
+  </data>
+  <data name="rule_win_receive_4x" xml:space="preserve">
+    <value>Tike ki genyen yo ap resevwa 4 fwa kantite lajan yo te parye a.</value>
+  </data>
+  <data name="rule_example_bet_50_4x" xml:space="preserve">
+    <value>Ekzamp: Parye 50 HTG → Resevwa 200 HTG.</value>
+  </data>
+  <data name="rule_important_notes" xml:space="preserve">
+    <value>Not enpotan</value>
+  </data>
+  <data name="rule_only_one_option" xml:space="preserve">
+    <value>Ou ka chwazi yon sel opsyon (PE oswa ENPE) pou chak tike.</value>
+  </data>
+  <data name="rule_valid_one_draw" xml:space="preserve">
+    <value>Chak tike valab pou yon sel tiraj.</value>
+  </data>
+  <data name="fail_exclamation" xml:space="preserve">
+    <value>Echek</value>
+  </data>
+  <data name="back_to_homepage" xml:space="preserve">
+    <value>Tounen nan paj dakey</value>
+  </data>
+  <data name="try_again" xml:space="preserve">
+    <value>Esye anko</value>
+  </data>
+  <data name="update_profile_error" xml:space="preserve">
+    <value>Gen yon ere. Nan mizajou pwofil la</value>
+  </data>
+  <data name="jackpot_today_htg" xml:space="preserve">
+    <value>1.000.000 HTG jodia  !</value>
+  </data>
+  <data name="no_results_found" xml:space="preserve">
+    <value>Pagen rezilta</value>
+  </data>
+  <data name="v2_win" xml:space="preserve">
+    <value>Genyen</value>
+  </data>
+  <data name="v2_not_win" xml:space="preserve">
+    <value>Pedi</value>
+  </data>
+  <data name="v2_waiting" xml:space="preserve">
+    <value>Tann</value>
+  </data>
+  <data name="v2_all" xml:space="preserve">
+    <value>Tout</value>
+  </data>
+  <data name="v2_classic_pick_10" xml:space="preserve">
+    <value>Pack 10</value>
+  </data>
+  <data name="v2_big_small" xml:space="preserve">
+    <value>Gwo  PITI </value>
+  </data>
+  <data name="v2_odd_even" xml:space="preserve">
+    <value>Enpe Pe</value>
+  </data>
+  <data name="v2_amount_played" xml:space="preserve">
+    <value>Montan ou te jwe </value>
+  </data>
+  <data name="v2_amount_won" xml:space="preserve">
+    <value>Montan ou genyen</value>
+  </data>
+  <data name="v2_date_and_time" xml:space="preserve">
+    <value>Dat ak le</value>
+  </data>
+  <data name="v2_game_locked" xml:space="preserve">
+    <value>Jwet sa bloke</value>
+  </data>
+  <data name="v2_updating_results" xml:space="preserve">
+    <value>Rezilta yo disponib</value>
+  </data>
+  <data name="v2_buy_classic_pick_10" xml:space="preserve">
+    <value>Achte pick 10</value>
+  </data>
+  <data name="v2_select_10_lucky_numbers" xml:space="preserve">
+    <value>Chwazi nimewo chans</value>
+  </data>
+  <data name="v2_add_more_ticket" xml:space="preserve">
+    <value>Ajoute tike</value>
+  </data>
+  <data name="v2_estimated_ticket_price" xml:space="preserve">
+    <value>Estimasyon pri tike</value>
+  </data>
+  <data name="v2_payment" xml:space="preserve">
+    <value>Peman</value>
+  </data>
+  <data name="v2_round" xml:space="preserve">
+    <value>Tou</value>
+  </data>
+  <data name="v2_edit" xml:space="preserve">
+    <value>Modifye</value>
+  </data>
+  <data name="v2_delete" xml:space="preserve">
+    <value>Efase</value>
+  </data>
+  <data name="v2_back" xml:space="preserve">
+    <value>Tounen</value>
+  </data>
+  <data name="Random" xml:space="preserve">
+    <value>O aza</value>
+  </data>
+  <data name="v2_save" xml:space="preserve">
+    <value>Anrejistre</value>
+  </data>
+  <data name="v2_selected_ticket" xml:space="preserve">
+    <value>Chwazi tike</value>
+  </data>
+  <data name="v2_ticket_not_valid" xml:space="preserve">
+    <value>tike sa pa valid</value>
+  </data>
+  <data name="v2_confirm_purchase" xml:space="preserve">
+    <value>Konfime</value>
+  </data>
+  <data name="v2_ticket" xml:space="preserve">
+    <value>Tike</value>
+  </data>
+  <data name="v2_amount" xml:space="preserve">
+    <value>Montan</value>
+  </data>
+  <data name="v2_otp_instruction" xml:space="preserve">
+    <value>Tanpri konfime epi antre OTP a pou kontinye.</value>
+  </data>
+  <data name="v2_request_new_otp" xml:space="preserve">
+    <value>Demand nouvo OTP</value>
+  </data>
+  <data name="v2_cancel" xml:space="preserve">
+    <value>Anile</value>
+  </data>
+  <data name="v2_confirm" xml:space="preserve">
+    <value>Konfime</value>
+  </data>
+  <data name="v2_payment_successfully" xml:space="preserve">
+    <value>Lajan’¸ an transfere ak sikse!</value>
+  </data>
+  <data name="v2_your_choice" xml:space="preserve">
+    <value>Chwazi</value>
+  </data>
+  <data name="v2_buy_ticket_label" xml:space="preserve">
+    <value>Achte tike</value>
+  </data>
+  <data name="v2_transfer" xml:space="preserve">
+    <value>Transfere</value>
+  </data>
+  <data name="v2_choose_account" xml:space="preserve">
+    <value>Chwazi kont</value>
+  </data>
+  <data name="v2_sender_phone" xml:space="preserve">
+    <value>Nimewo espedite</value>
+  </data>
+  <data name="v2_receiver_phone" xml:space="preserve">
+    <value>Nimewo destinate</value>
+  </data>
+  <data name="v2_amount_htg" xml:space="preserve">
+    <value>Montan (HTG)</value>
+  </data>
+  <data name="v2_paste" xml:space="preserve">
+    <value>Kole</value>
+  </data>
+  <data name="v2_continue" xml:space="preserve">
+    <value>Kontinye</value>
+  </data>
+  <data name="v2_account_name" xml:space="preserve">
+    <value>Kont Loto</value>
+  </data>
+  <data name="v2_fee" xml:space="preserve">
+    <value>Gratis</value>
+  </data>
+  <data name="v2_free" xml:space="preserve">
+    <value>Fre</value>
+  </data>
+  <data name="v2_enter_valid_amount" xml:space="preserve">
+    <value>Tanpri antre yon montan ki valab.</value>
+  </data>
+  <data name="v2_insufficient_balance" xml:space="preserve">
+    <value>Balans sa pa sifi.</value>
+  </data>
+  <data name="v2_confirm_transaction" xml:space="preserve">
+    <value>Konfime tranzaksyon</value>
+  </data>
+  <data name="v2_enter_otp_proceed" xml:space="preserve">
+    <value>Tanpri konfime epi antre OTP a pou kontinye.</value>
+  </data>
+  <data name="Basic" xml:space="preserve">
+    <value>Prensipal</value>
+  </data>
+  <data name="Account" xml:space="preserve">
+    <value>Kont</value>
+  </data>
+  <data name="v2_convert" xml:space="preserve">
+    <value>Konveti</value>
+  </data>
+  <data name="v2_coins" xml:space="preserve">
+    <value>Pyes</value>
+  </data>
+  <data name="v2_htg" xml:space="preserve">
+    <value>HTG</value>
+  </data>
+  <data name="v2_rule_drawn_count_desc" xml:space="preserve">
+    <value>Pou jwet sa a, sistem nan ap konte konbyen nan 20 nimewo ki tire yo ki:</value>
+  </data>
+  <data name="millionair" xml:space="preserve">
+    <value>Milyone</value>
+  </data>
+  <data name="faq_v2_q4" xml:space="preserve">
+    <value>Konbyen nimewo ki Match mwen bezwen pou m genyen yon pri?</value>
+  </data>
+  <data name="faq_v2_a4" xml:space="preserve">
+    <value>Plis nimewo ou jwenn, se plis pri w ap genyen! &lt;br/&gt; Nan PICK 10, yo konpare 10 nimewo ou chwazi yo ak 10 nimewo rezilta ofisyel yo. Ou genyen le ou jwenn 6 nimewo oswa plis — e menm si ou pa jwenn yon nimewo, wap jwenn yon rekonpans !&lt;br/&gt;&lt;br/&gt; 🎯 Jwenn 10 nimewo → Genyen Jakpot la&lt;br/&gt; 🔥 Jwenn 9 nimewo → Genyen 12,000 HTG&lt;br/&gt; 💰 Jwenn 8 nimewo → Genyen 600 HTG&lt;br/&gt; ⭐ Jwenn 7 nimewo → Genyen 160 HTG&lt;br/&gt; 🎉 Jwenn 6 nimewo → Genyen 20 HTG&lt;br/&gt; 🎁 Jwenn 0 nimewo → Genyen 5 HTG&lt;br/&gt;&lt;br/&gt; Chak tike ba w yon chans pou w genyen — menm le chans ta siprann ou!</value>
+  </data>
+  <data name="faq_v2_q5" xml:space="preserve">
+    <value>Kijan pou m jwe Gwo / Ti a?</value>
+  </data>
+  <data name="faq_v2_a5" xml:space="preserve">
+    <value>Chwazi Gwo (41–80) oubyen Ti (01–40). Achte tike ou anvan 8e diswa epi tann tiraj la a 8e edmi diswa.</value>
+  </data>
+  <data name="faq_v2_q6" xml:space="preserve">
+    <value>Kijan pou m genyen nan jwet la gwo/ti ?</value>
+  </data>
+  <data name="faq_v2_a6" xml:space="preserve">
+    <value>Apre yo fin tire 20 nimewo, sistem nan verifye konbyen nimewo ki nan chak seri: &lt;br/&gt; - Si gen 13 nimewo oswa plis ant 41 ak 80, rezilta a GWO.&lt;br/&gt; - Si gen 13 nimewo oswa plis ant 01 ak 40, rezilta a TI.&lt;br/&gt;&lt;br/&gt; Si opsyon ou chwazi a koresponn ak rezilta ofisyel la, ou genyen.</value>
+  </data>
+  <data name="faq_v2_q7" xml:space="preserve">
+    <value>Kijan pou m jwe jwet Pe/Enpe a?</value>
+  </data>
+  <data name="faq_v2_a7" xml:space="preserve">
+    <value>Chwazi Pe oubyen Enpe. Achte tike ou anvan 8e diswa epi tann tiraj la a 8e edmi diswa.</value>
+  </data>
+  <data name="faq_v2_q8" xml:space="preserve">
+    <value>Kijan pou m genyen nan jwet Pe/Enpe a?</value>
+  </data>
+  <data name="faq_v2_a8" xml:space="preserve">
+    <value>
+Apre yo fin tire 20 nimewo, sistem nan konte konbyen nimewo ki enpe oswa pe: &lt;br/&gt; - Si 15 nimewo oswa plis enpe, rezilta a se ENPE.&lt;br/&gt; - Si 15 nimewo oswa plis pe, rezilta a se PE.&lt;br/&gt;&lt;br/&gt; Si opsyon ou chwazi a koresponn ak rezilta ofisel la, ou genyen.</value>
+  </data>
+  <data name="pick10" xml:space="preserve">
+    <value>Pick 11</value>
+  </data>
+  <data name="bigsmall" xml:space="preserve">
+    <value>Gwo Pitti</value>
+  </data>
+  <data name="oddeven" xml:space="preserve">
+    <value>Enpe Pe</value>
+  </data>
+  <data name="Pick" xml:space="preserve">
+    <value>Pick </value>
+  </data>
+  <data name="Small" xml:space="preserve">
+    <value>Piti</value>
+  </data>
+  <data name="Big" xml:space="preserve">
+    <value>Gwo</value>
+  </data>
+  <data name="Odd" xml:space="preserve">
+    <value>Enpe</value>
+  </data>
+  <data name="Even" xml:space="preserve">
+    <value>Pe</value>
+  </data>
+  <data name="Number_of_ticket" xml:space="preserve">
+    <value>nimewo tike</value>
+  </data>
+  <data name="next" xml:space="preserve">
+    <value>Pwochen</value>
+  </data>
+  <data name="Pick_Number" xml:space="preserve">
+    <value>Nimewo_pick</value>
+  </data>
+  <data name="total_payment" xml:space="preserve">
+    <value>Peman Total</value>
+  </data>
+  <data name="Minutes" xml:space="preserve">
+    <value>Minit</value>
+  </data>
+  <data name="Secs" xml:space="preserve">
+    <value>Secs</value>
+  </data>
+  <data name="v2_otp_sent_successfully" xml:space="preserve">
+    <value>OTP ale ak sikse. Tanpri verifye mesaj ou!</value>
+  </data>
+  <data name="v2_detail" xml:space="preserve">
+    <value>Detay</value>
+  </data>
+  <data name="v2_tap_to_see_detail" xml:space="preserve">
+    <value>Touche pouw we detay </value>
+  </data>
+  <data name="v2_ticket_detail" xml:space="preserve">
+    <value>detay tike </value>
+  </data>
+  <data name="v2_bill_code" xml:space="preserve">
+    <value>Bill Code</value>
+  </data>
+  <data name="v2_money_ticket" xml:space="preserve">
+    <value>Money Ticket</value>
+  </data>
+  <data name="v2_money_win" xml:space="preserve">
+    <value>Lajan ou genyen</value>
+  </data>
+  <data name="v2_purchase_date" xml:space="preserve">
+    <value>Dat ou achte a</value>
+  </data>
+  <data name="v2_channel" xml:space="preserve">
+    <value>Chanel achte</value>
+  </data>
+  <data name="v2_payment_method" xml:space="preserve">
+    <value>Metod peman</value>
+  </data>
+  <data name="v2_close" xml:space="preserve">
+    <value>Femen</value>
+  </data>
+  <data name="v2_game" xml:space="preserve">
+    <value>Non jwet </value>
+  </data>
+  <data name="v2_draw_date" xml:space="preserve">
+    <value>Dat tiraj </value>
+  </data>
+  <data name="v2_ticket_code" xml:space="preserve">
+    <value>Kod tike</value>
+  </data>
+  <data name="faq_q3" xml:space="preserve">
+    <value>Ki chans ki genyen pou genyen gwo pri a?</value>
+  </data>
+  <data name="loto_des_millions" xml:space="preserve">
+    <value>se yon jwet Bolet, Maryaj ak Lotto3, rezilta jwet lotri Nouyok ak Florid. Chwazi nimewo ou yo epi tann yo anonse ganyan an. Ou ka voye lajan ou genyen an sou balans prensipal ou oswa Natcash. Bon chans!</value>
+  </data>
+  <data name="millions_select" xml:space="preserve">
+    <value>Chwazi</value>
+  </data>
+  <data name="millions_selected" xml:space="preserve">
+    <value>Chwazi</value>
+  </data>
+  <data name="millions_prize_if_win" xml:space="preserve">
+    <value>Prim ou ka genyen</value>
+  </data>
+  <data name="millions_you_choose" xml:space="preserve">
+    <value>Chwazi</value>
+  </data>
+  <data name="millions_win" xml:space="preserve">
+    <value>Genyen</value>
+  </data>
+  <data name="millions_not_win" xml:space="preserve">
+    <value>Pedi</value>
+  </data>
+  <data name="millions_waiting" xml:space="preserve">
+    <value>Tann</value>
+  </data>
+  <data name="millions_all" xml:space="preserve">
+    <value>Tout</value>
+  </data>
+  <data name="millions_classic_pick_10" xml:space="preserve">
+    <value>Pack 10</value>
+  </data>
+  <data name="millions_big_small" xml:space="preserve">
+    <value>Gwo  Piti</value>
+  </data>
+  <data name="millions_odd_even" xml:space="preserve">
+    <value>Enpe Pe</value>
+  </data>
+  <data name="millions_amount_played" xml:space="preserve">
+    <value>Montan ou te jwe </value>
+  </data>
+  <data name="millions_amount_won" xml:space="preserve">
+    <value>Montan ou genyen</value>
+  </data>
+  <data name="millions_date_and_time" xml:space="preserve">
+    <value>Dat ak le</value>
+  </data>
+  <data name="millions_game_locked" xml:space="preserve">
+    <value>Jwet sa bloke</value>
+  </data>
+  <data name="millions_updating_results" xml:space="preserve">
+    <value>Rezilta yo disponib</value>
+  </data>
+  <data name="millions_buy_classic_pick_10" xml:space="preserve">
+    <value>Achte Basic pick 10</value>
+  </data>
+  <data name="millions_select_10_lucky_numbers" xml:space="preserve">
+    <value>Chwazi nimewo chans</value>
+  </data>
+  <data name="millions_add_more_ticket" xml:space="preserve">
+    <value>Ajoute tike</value>
+  </data>
+  <data name="millions_estimated_ticket_price" xml:space="preserve">
+    <value>Estimasyon pri tike</value>
+  </data>
+  <data name="millions_payment" xml:space="preserve">
+    <value>Peman</value>
+  </data>
+  <data name="millions_round" xml:space="preserve">
+    <value>Tou</value>
+  </data>
+  <data name="millions_edit" xml:space="preserve">
+    <value>Modifye</value>
+  </data>
+  <data name="millions_delete" xml:space="preserve">
+    <value>Efase</value>
+  </data>
+  <data name="millions_back" xml:space="preserve">
+    <value>Tounen</value>
+  </data>
+  <data name="millions_save" xml:space="preserve">
+    <value>Anrejistre</value>
+  </data>
+  <data name="millions_selected_ticket" xml:space="preserve">
+    <value>Chwazi tike</value>
+  </data>
+  <data name="millions_ticket_not_valid" xml:space="preserve">
+    <value>tike sa pa valid</value>
+  </data>
+  <data name="millions_confirm_purchase" xml:space="preserve">
+    <value>Konfime</value>
+  </data>
+  <data name="millions_ticket" xml:space="preserve">
+    <value>Tike</value>
+  </data>
+  <data name="millions_amount" xml:space="preserve">
+    <value>Montan</value>
+  </data>
+  <data name="millions_otp_instruction" xml:space="preserve">
+    <value>Tanpri konfime epi antre OTP a pou kontinye.</value>
+  </data>
+  <data name="millions_request_new_otp" xml:space="preserve">
+    <value>Demand nouvo OTP</value>
+  </data>
+  <data name="millions_cancel" xml:space="preserve">
+    <value>Anile</value>
+  </data>
+  <data name="millions_confirm" xml:space="preserve">
+    <value>Konfime</value>
+  </data>
+  <data name="millions_payment_successfully" xml:space="preserve">
+    <value>Lajan ’¸ an transfere ak sikse!</value>
+  </data>
+  <data name="millions_your_choice" xml:space="preserve">
+    <value>Chwazi</value>
+  </data>
+  <data name="millions_buy_ticket_label" xml:space="preserve">
+    <value>Achte tike</value>
+  </data>
+  <data name="millions_transfer" xml:space="preserve">
+    <value>Transfere</value>
+  </data>
+  <data name="millions_choose_account" xml:space="preserve">
+    <value>Chwazi kont</value>
+  </data>
+  <data name="millions_sender_phone" xml:space="preserve">
+    <value>Nimewo espedite</value>
+  </data>
+  <data name="millions_receiver_phone" xml:space="preserve">
+    <value>Nimewo destinate</value>
+  </data>
+  <data name="millions_amount_htg" xml:space="preserve">
+    <value>Montan (HTG)</value>
+  </data>
+  <data name="millions_paste" xml:space="preserve">
+    <value>Kole</value>
+  </data>
+  <data name="millions_continue" xml:space="preserve">
+    <value>Kontinye</value>
+  </data>
+  <data name="millions_account_name" xml:space="preserve">
+    <value>Kont Bee Loto</value>
+  </data>
+  <data name="millions_fee" xml:space="preserve">
+    <value>Gratis</value>
+  </data>
+  <data name="millions_free" xml:space="preserve">
+    <value>Fre</value>
+  </data>
+  <data name="millions_enter_valid_amount" xml:space="preserve">
+    <value>Tanpri antre yon montan ki valab.</value>
+  </data>
+  <data name="millions_insufficient_balance" xml:space="preserve">
+    <value>Balans sa pa sifizan.</value>
+  </data>
+  <data name="millions_confirm_transaction" xml:space="preserve">
+    <value>Konfime tranzaksyon</value>
+  </data>
+  <data name="millions_enter_otp_proceed" xml:space="preserve">
+    <value>Tanpri konfime epi antre OTP a pou kontinye.</value>
+  </data>
+  <data name="millions_convert" xml:space="preserve">
+    <value>Konveti</value>
+  </data>
+  <data name="millions_coins" xml:space="preserve">
+    <value>Pyes</value>
+  </data>
+  <data name="millions_htg" xml:space="preserve">
+    <value>HTG</value>
+  </data>
+  <data name="millions_rule_drawn_count_desc" xml:space="preserve">
+    <value>Pou jwet sa a, sistem nan ap konte konbyen nan 20 nimewo ki tire yo ki:</value>
+  </data>
+  <data name="faq_millions_q4" xml:space="preserve">
+    <value>Konbyen nimewo ki Match mwen bezwen pou m genyen yon pri?</value>
+  </data>
+  <data name="faq_millions_a4" xml:space="preserve">
+    <value>Plis nimewo ou jwenn, se plis pri w ap genyen! &lt;br/&gt; Nan PICK 10, yo konpare 10 nimewo ou chwazi yo ak 10 nimewo rezilta ofisyel yo. Ou genyen le ou jwenn 6 nimewo oswa plis — e menm si ou pa jwenn yon nimewo, wap jwenn yon rekonpans !&lt;br/&gt;&lt;br/&gt; 🎯 Jwenn 10 nimewo → Genyen Jakpot la&lt;br/&gt; 🔥 Jwenn 9 nimewo → Genyen 12,000 HTG&lt;br/&gt; 💰 Jwenn 8 nimewo → Genyen 600 HTG&lt;br/&gt; ⭐ Jwenn 7 nimewo → Genyen 160 HTG&lt;br/&gt; 🎉 Jwenn 6 nimewo → Genyen 20 HTG&lt;br/&gt; 🎁 Jwenn 0 nimewo → Genyen 5 HTG&lt;br/&gt;&lt;br/&gt; Chak tike ba w yon chans pou w genyen — menm le chans ta siprann ou!</value>
+  </data>
+  <data name="faq_millions_q5" xml:space="preserve">
+    <value>Kijan pou m jwe Gwo / Ti a?</value>
+  </data>
+  <data name="faq_millions_a5" xml:space="preserve">
+    <value>Chwazi Gwo (41–80) oubyen Ti (01–40). Achte tike ou anvan 8e diswa epi tann tiraj la a 8e edmi diswa.</value>
+  </data>
+  <data name="faq_millions_q6" xml:space="preserve">
+    <value>Kijan pou m genyen nan jwet la gwo/ti ?</value>
+  </data>
+  <data name="faq_millions_a6" xml:space="preserve">
+    <value>Apre yo fin tire 20 nimewo, sistem nan verifye konbyen nimewo ki nan chak seri: &lt;br/&gt; - Si gen 13 nimewo oswa plis ant 41 ak 80, rezilta a GWO.&lt;br/&gt; - Si gen 13 nimewo oswa plis ant 01 ak 40, rezilta a TI.&lt;br/&gt;&lt;br/&gt; Si opsyon ou chwazi a koresponn ak rezilta ofisyel la, ou genyen.</value>
+  </data>
+  <data name="faq_millions_q7" xml:space="preserve">
+    <value>❓ Kijan pou m jwe jwet Pe/Enpe a?</value>
+  </data>
+  <data name="faq_millions_a7" xml:space="preserve">
+    <value>Chwazi Pe oubyen Enpe. Achte tike ou anvan 8e diswa epi tann tiraj la a 8e edmi diswa.</value>
+  </data>
+  <data name="millions_otp_sent_successfully" xml:space="preserve">
+    <value>OTP ale ak sikse. Tanpri verifye mesaj ou!</value>
+  </data>
+  <data name="millions_detail" xml:space="preserve">
+    <value>Detay</value>
+  </data>
+  <data name="millions_tap_to_see_detail" xml:space="preserve">
+    <value>Touche pouw we detay </value>
+  </data>
+  <data name="millions_ticket_detail" xml:space="preserve">
+    <value>detay tike </value>
+  </data>
+  <data name="millions_bill_code" xml:space="preserve">
+    <value>Kod bil</value>
+  </data>
+  <data name="millions_money_ticket" xml:space="preserve">
+    <value>Money Ticket</value>
+  </data>
+  <data name="millions_money_win" xml:space="preserve">
+    <value>Lajan ou genyen</value>
+  </data>
+  <data name="millions_purchase_date" xml:space="preserve">
+    <value>Dat ou achte a</value>
+  </data>
+  <data name="millions_channel" xml:space="preserve">
+    <value>Chanel</value>
+  </data>
+  <data name="millions_payment_method" xml:space="preserve">
+    <value>Metod peman</value>
+  </data>
+  <data name="millions_close" xml:space="preserve">
+    <value>Femen</value>
+  </data>
+  <data name="millions_game" xml:space="preserve">
+    <value>Non jwet </value>
+  </data>
+  <data name="millions_draw_date" xml:space="preserve">
+    <value>Dat tiraj </value>
+  </data>
+  <data name="millions_ticket_code" xml:space="preserve">
+    <value>Kod tike</value>
+  </data>
+  <data name="millions_jackpot_today_htg" xml:space="preserve">
+    <value>30.000.000 HTG jodia  !</value>
+  </data>
+  <data name="millions_play" xml:space="preserve">
+    <value>Jwe</value>
+  </data>
+  <data name="millions_now" xml:space="preserve">
+    <value>now</value>
+  </data>
+  <data name="millions" xml:space="preserve">
+    <value>Milyone</value>
+  </data>
+  <data name="millions_rule_title" xml:space="preserve">
+    <value>Rule</value>
+  </data>
+  <data name="millions_mega_millions" xml:space="preserve">
+    <value>Mega Millions</value>
+  </data>
+  <data name="millions_draw_schedule" xml:space="preserve">
+    <value>Ore tiraj </value>
+  </data>
+  <data name="millions_draw_frequency" xml:space="preserve">
+    <value>Frekans tiraj: 2fwa pa semen ( Madi ak vandredi )</value>
+  </data>
+  <data name="millions_draw_time" xml:space="preserve">
+    <value>Le tiraj: 11: 00 pM (Eastern Time-ET)</value>
+  </data>
+  <data name="millions_ticket_closing_time" xml:space="preserve">
+    <value>Ticket closing time: 10:30 PM (ET)</value>
+  </data>
+  <data name="millions_how_to_play" xml:space="preserve">
+    <value>Kijan pouw jwe </value>
+  </data>
+  <data name="millions_ticket_includes_6" xml:space="preserve">
+    <value>Each ticket includes 6 numbers:</value>
+  </data>
+  <data name="millions_select_5_main" xml:space="preserve">
+    <value>Select 5 main numbers from 1 → 70</value>
+  </data>
+  <data name="millions_select_1_mega" xml:space="preserve">
+    <value>Select 1 Mega Ball from 1 → 24</value>
+  </data>
+  <data name="millions_ticket_price" xml:space="preserve">
+    <value>Ticket price: 6 HTG per ticket</value>
+  </data>
+  <data name="millions_payment_via" xml:space="preserve">
+    <value>Payment via: Account balance</value>
+  </data>
+  <data name="millions_game_rules_title" xml:space="preserve">
+    <value>Regleman jwet la</value>
+  </data>
+  <data name="millions_results_based_on" xml:space="preserve">
+    <value>Results are based on official lottery draw.</value>
+  </data>
+  <data name="millions_one_highest_prize" xml:space="preserve">
+    <value>Only one highest prize is awarded per ticket (if multiple prize conditions are met).</value>
+  </data>
+  <data name="millions_winnings_calculated" xml:space="preserve">
+    <value>Winnings are calculated based on matching numbers and Mega Ball.</value>
+  </data>
+  <data name="millions_prize_structure" xml:space="preserve">
+    <value>Prize Structure</value>
+  </data>
+  <data name="millions_match_result_header" xml:space="preserve">
+    <value>Nimewo Koresponn</value>
+  </data>
+  <data name="millions_prize_htg_header" xml:space="preserve">
+    <value>Pri (win coin)</value>
+  </data>
+  <data name="millions_rate_header" xml:space="preserve">
+    <value>To</value>
+  </data>
+  <data name="millions_match_5_plus_mega" xml:space="preserve">
+    <value>5+ Mega Ball</value>
+  </data>
+  <data name="millions_jackpot_label" xml:space="preserve">
+    <value>Jackpot</value>
+  </data>
+  <data name="millions_match_5_numbers" xml:space="preserve">
+    <value>5 (Premye 5 boul yo, pa gen bezwen pozisyon)</value>
+  </data>
+  <data name="millions_match_4_plus_mega" xml:space="preserve">
+    <value>4 + Mega Ball</value>
+  </data>
+  <data name="millions_match_4_numbers" xml:space="preserve">
+    <value>4 (Premye 4 boul yo, pa gen bezwen pozisyon)</value>
+  </data>
+  <data name="millions_match_3_plus_mega" xml:space="preserve">
+    <value>3 + Mega Ball</value>
+  </data>
+  <data name="millions_match_3_numbers" xml:space="preserve">
+    <value>3 (Premye 3 boul yo, pa gen bezwen pozisyon)</value>
+  </data>
+  <data name="millions_match_2_plus_mega" xml:space="preserve">
+    <value>2 + Mega Ball</value>
+  </data>
+  <data name="millions_match_1_plus_mega" xml:space="preserve">
+    <value>1 + Mega Ball</value>
+  </data>
+  <data name="millions_match_mega_only" xml:space="preserve">
+    <value>Mega Ball</value>
+  </data>
+  <data name="faq_millions_a1" xml:space="preserve">
+    <value>Chwazi 10 nimewo ant 1 ak 80 oswa chwazi opsyon Pick Rapid la. Achte tike w epi tann tiraj la.</value>
+  </data>
+  <data name="faq_millions_a2" xml:space="preserve">
+    <value>Tiraj yo fet chak jou a 8:30 p.m. Vann tike yo sispann a 8:00 p.m.</value>
+  </data>
+  <data name="faq_millions_a3" xml:space="preserve">
+    <value>Chak tikè koute 6 HTG.</value>
+  </data>
+  <data name="faq_millions_q1" xml:space="preserve">
+    <value>Kijan pouw jwe Pick 10?</value>
+  </data>
+  <data name="faq_millions_q2" xml:space="preserve">
+    <value>Ki le tiraj Pick 10 yo ap fet?</value>
+  </data>
+  <data name="faq_millions_q3" xml:space="preserve">
+    <value>faq_millions_q3</value>
+  </data>
+  <data name="millions_redeem_rewards" xml:space="preserve">
+    <value>Redeem Rewards</value>
+  </data>
+  <data name="millions_mega_jackpot" xml:space="preserve">
+    <value>Mega Jackpot</value>
+  </data>
+  <data name="millions_estimate_jackpot_prize" xml:space="preserve">
+    <value>Estimate Jackpot Prize</value>
+  </data>
+  <data name="millions_be_the_next_millionaire" xml:space="preserve">
+    <value>Pouw pwochen milyone a </value>
+  </data>
+  <data name="millions_jackpot_results_title" xml:space="preserve">
+    <value>Rezilta Jakpot</value>
+  </data>
+  <data name="millions_list_jackpot_results" xml:space="preserve">
+    <value>Liste des résultats Jackpot</value>
+  </data>
+  <data name="millions_total_draws" xml:space="preserve">
+    <value>Total {0} tirages</value>
+  </data>
+  <data name="millions_draw_no_short" xml:space="preserve">
+    <value>Tirage #</value>
+  </data>
+  <data name="millions_jackpot" xml:space="preserve">
+    <value>Jackpot</value>
+  </data>
+  <data name="millions_subscribers_won" xml:space="preserve">
+    <value>{0} subscribers won</value>
+  </data>
+  <data name="millions_no_jackpot_results" xml:space="preserve">
+    <value>Aucun résultat Jackpot</value>
+  </data>
+  <data name="millions_note_results_updated" xml:space="preserve">
+    <value>Note: Les résultats sont mis à jour après chaque tirage.</value>
+  </data>
+  <data name="millions_jackpot_prize" xml:space="preserve">
+    <value>Pri Jakpot la</value>
+  </data>
+  <data name="millions_winning_numbers" xml:space="preserve">
+    <value>Numéros gagnants</value>
+  </data>
+  <data name="millions_winning_subscribes" xml:space="preserve">
+    <value>Abonnés gagnants</value>
+  </data>
+  <data name="millions_subscribers_won_jackpot" xml:space="preserve">
+    <value>{0} abonnés ont gagné le jackpot</value>
+  </data>
+  <data name="millions_no_winners" xml:space="preserve">
+    <value>Pas encore de gagnants</value>
+  </data>
+  <data name="millions_draw_information" xml:space="preserve">
+    <value>Enfomasyon tiraj</value>
+  </data>
+  <data name="millions_game_type" xml:space="preserve">
+    <value>Tip jwet</value>
+  </data>
+  <data name="millions_total_winners" xml:space="preserve">
+    <value>Total gagnants</value>
+  </data>
+  <data name="millions_draw_date_time" xml:space="preserve">
+    <value>Date &amp; Heure du tirage</value>
+  </data>
+  <data name="millions_note" xml:space="preserve">
+    <value>Note</value>
+  </data>
+  <data name="millions_note_results_public" xml:space="preserve">
+    <value>Le résultat est annoncé publiquement et vérifié</value>
+  </data>
+  <data name="millions_note_thank_you" xml:space="preserve">
+    <value>Merci pour votre confiance et votre soutien</value>
+  </data>
+  <data name="millions_back_to_results_list" xml:space="preserve">
+    <value>Tounen nan rezilta</value>
+  </data>
+  <data name="millions_jackpot_disclaimer" xml:space="preserve">
+    <value>Ou achte tike a apre 10:30 lap konte pou pwochen tiraj la. Montan jakpot final la ap konfime apre 11:00 rezilta a ap anonse.</value>
+  </data>
+  <data name="millions_view" xml:space="preserve">
+    <value>Gade</value>
+  </data>
+  <data name="millions_next_round" xml:space="preserve">
+    <value>Pwochen tou</value>
+  </data>
+  <data name="millions_jackpot_prize_to" xml:space="preserve">
+    <value>Genyen jiska</value>
+  </data>
+  <data name="millions_view_all_results" xml:space="preserve">
+    <value>Voir tous les résultats</value>
+  </data>
+  <data name="millions_megaball_invalid_title" xml:space="preserve">
+    <value>Mega Ball Invalid</value>
+  </data>
+  <data name="millions_megaball_invalid_desc" xml:space="preserve">
+    <value>Mega Ball doit être entre 01 et 24</value>
+  </data>
+  <data name="millions_standardball_invalid_title" xml:space="preserve">
+    <value>Standard Ball Invalid</value>
+  </data>
+  <data name="millions_standardball_invalid_desc" xml:space="preserve">
+    <value>Standard Ball must be between 01–70</value>
+  </data>
+  <data name="millions_note_title" xml:space="preserve">
+    <value>Note:</value>
+  </data>
+  <data name="millions_note_coin_rate" xml:space="preserve">
+    <value>(*) 1 coin = 1 HTG</value>
+  </data>
+  <data name="millions_note_rewards_credit" xml:space="preserve">
+    <value>• Les récompenses seront créditées sur le solde des Winning Coins. Les clients peuvent convertir les Winning Coins en leur solde principal ou solde NatCash (à l'exclusion des récompenses Jackpot).</value>
+  </data>
+  <data name="millions_note_conversion_main" xml:space="preserve">
+    <value>1 Winning Coin = 1 HTG sur le solde principal</value>
+  </data>
+  <data name="millions_note_conversion_natcash" xml:space="preserve">
+    <value>1 Winning Coin = 1 HTG sur NatCash</value>
+  </data>
+  <data name="millions_reward_transferred_to_wallet" xml:space="preserve">
+    <value>💸 Récompense transférée vers le portefeuille</value>
+  </data>
+  <data name="millions_reward_transferred_to_main_account" xml:space="preserve">
+    <value>💸 Récompense transférée vers le compte principal</value>
+  </data>
+  <data name="millions_jackpot_rules_title" xml:space="preserve">
+    <value>Règ pou Mega Jackpot</value>
+  </data>
+  <data name="millions_jackpot_rule1_title" xml:space="preserve">
+    <value>1.Pri Mega jakpot la</value>
+  </data>
+  <data name="millions_jackpot_rule1_desc1" xml:space="preserve">
+    <value>Mega jakpot la se kliyan ki jwenn 6 boul ki match yo kap resevwa li</value>
+  </data>
+  <data name="millions_jackpot_rule1_desc2" xml:space="preserve">
+    <value>Prim nan se Mega jakpot kap bay li</value>
+  </data>
+  <data name="millions_jackpot_rule2_title" xml:space="preserve">
+    <value>2. Politik pou jakpot la pataje</value>
+  </data>
+  <data name="millions_jackpot_rule2_desc1" xml:space="preserve">
+    <value>Si gen 2 oswa plis tike ki genyen 6 boul ki match, Jakpot la ap separe pou chak jwenm menm kantite</value>
+  </data>
+  <data name="millions_jackpot_rule2_desc2" xml:space="preserve">
+    <value>Yon kliyan ki gen plizye tike ka resevwa plizye prim</value>
+  </data>
+  <data name="millions_jackpot_rule3_title" xml:space="preserve">
+    <value>3. Jakpot</value>
+  </data>
+  <data name="millions_jackpot_rule3_desc1" xml:space="preserve">
+    <value>Mega jakpot la komanse nan 2,000,000 HTG</value>
+  </data>
+  <data name="millions_jackpot_rule3_desc2" xml:space="preserve">
+    <value>Pigwo montan an se 30,000,000HTG</value>
+  </data>
+  <data name="millions_jackpot_rule4_title" xml:space="preserve">
+    <value>4.Politik pou reyinisyalize jakpot la</value>
+  </data>
+  <data name="millions_jackpot_rule4_desc1" xml:space="preserve">
+    <value>Depi gen yon moun ki genyen Mega jakpot la, jakpot la ap tou reyinisyalize otomatikman a 2,000,000 HTG</value>
+  </data>
+  <data name="millions_jackpot_rule4_desc2" xml:space="preserve">
+    <value>Jakpot la ap rekomanse otomatikman</value>
+  </data>
+  <data name="millions_jackpot_rule5_title" xml:space="preserve">
+    <value>5. Metod pou peye pri</value>
+  </data>
+  <data name="millions_jackpot_rule5_desc1" xml:space="preserve">
+    <value>Mega Jakpot la ka peye apati:</value>
+  </data>
+  <data name="millions_jackpot_rule5_item1" xml:space="preserve">
+    <value>Kont prensipal</value>
+  </data>
+  <data name="millions_jackpot_rule5_item2" xml:space="preserve">
+    <value>Kont Natcom</value>
+  </data>
+  <data name="millions_jackpot_rule5_item3" xml:space="preserve">
+    <value>Pewol Kach </value>
+  </data>
+  <data name="millions_jackpot_rule5_desc2" xml:space="preserve">
+    <value>Metod pewol pou jakpot la depann de montan an epi politik operasyonel pou peryod la</value>
+  </data>
+  <data name="millions_jackpot_rule6_title" xml:space="preserve">
+    <value>6. Verifikasyon Pri</value>
+  </data>
+  <data name="millions_jackpot_rule6_desc1" xml:space="preserve">
+    <value>Natcom gen dwa pou verifye tout tike ki genyen yo avan pewol jakpot la fet</value>
+  </data>
+  <data name="millions_jackpot_rule6_desc2" xml:space="preserve">
+    <value>Yo ka bay yon lèt konfimasyon ofisyèl si sa nesesè.</value>
+  </data>
+  <data name="millions_jackpot_rule7_title" xml:space="preserve">
+    <value>7. Nòt Enpòtan</value>
+  </data>
+  <data name="millions_jackpot_rule7_desc1" xml:space="preserve">
+    <value>Valè Jackpot ki parèt sou sit entènèt la mete ajou an tan reyèl.</value>
+  </data>
+  <data name="millions_jackpot_rule7_desc2" xml:space="preserve">
+    <value>Pandan tan y ap trete tiraj la ak konfime rezilta yo, valè Jackpot ki parèt la ka pa montre kantite final la touswit.</value>
+  </data>
+  <data name="millions_jackpot_rule7_desc3" xml:space="preserve">
+    <value>Si gen nenpòt diskisyon, desizyon Natcom se desizyon final la.</value>
+  </data>
+  <data name="payment_method_title" xml:space="preserve">
+    <value>Chwazi metòd peman</value>
+  </data>
+  <data name="payment_method_subtitle" xml:space="preserve">
+    <value>Chwazi yon kont pou fini acha ou</value>
+  </data>
+  <data name="payment_main_account" xml:space="preserve">
+    <value>Kont prensipal</value>
+  </data>
+  <data name="payment_main_account_desc" xml:space="preserve">
+    <value>Peye avèk balans mobil ou</value>
+  </data>
+  <data name="payment_wallet" xml:space="preserve">
+    <value>WALLET</value>
+  </data>
+  <data name="payment_wallet_desc" xml:space="preserve">
+    <value>Peman sekirize avèk PIN wallet la</value>
+  </data>
+  <data name="payment_security_message" xml:space="preserve">
+    <value>Enfòmasyon peman ou pwoteje</value>
+  </data>
+  <data name="payment_wallet_pin_instruction" xml:space="preserve">
+    <value>Antre PIN WALLET ou</value>
+  </data>
+  <data name="get_free_ticket_code_38" xml:space="preserve">
+    <value>Kòd pwomosyon an pa valid</value>
+  </data>
+  <data name="get_free_ticket_code_39" xml:space="preserve">
+    <value>Kòd pwomosyon an deja itilize</value>
+  </data>
+  <data name="get_free_ticket_code_40" xml:space="preserve">
+    <value>Pwomosyon an pa aktif</value>
+  </data>
+  <data name="get_free_ticket_code_41" xml:space="preserve">
+    <value>Demann tikè a pa egziste</value>
+  </data>
+  <data name="get_free_ticket_code_42" xml:space="preserve">
+    <value>Tranzaksyon ou an pa reyisi</value>
+  </data>
+  <data name="get_free_ticket_code_43" xml:space="preserve">
+    <value>Bòn chans pwochen fwa</value>
+  </data>
+  <data name="get_free_ticket_code_44" xml:space="preserve">
+    <value>Yo voye kòd la</value>
+  </data>
+  <data name="free_ticket_error_43_title" xml:space="preserve">
+    <value>Bòn chans pwochen fwa!</value>
+  </data>
+  <data name="free_ticket_error_43_description" xml:space="preserve">
+    <value>Ou pa t resevwa yon tikè gratis jodi a. Retounen demen epi eseye chans ou ankò.</value>
+  </data>
+  <data name="free_ticket_waiting_title" xml:space="preserve">
+    <value>Tikè GRATIS ou ap tann ou!</value>
+  </data>
+  <data name="free_ticket_waiting_description" xml:space="preserve">
+    <value>Ou gen 1 tikè Millions gratis ki poko itilize. Sèvi avè l pou tiraj jodi a.</value>
+  </data>
+  <data name="free_ticket_buy_now" xml:space="preserve">
+    <value>Achte kounye a</value>
+  </data>
+  <data name="free_ticket_success_badge" xml:space="preserve">
+    <value>TIKÈ GRATIS</value>
+  </data>
+  <data name="free_ticket_success_title" xml:space="preserve">
+    <value>Felisitasyon!</value>
+  </data>
+  <data name="free_ticket_success_received" xml:space="preserve">
+    <value>Ou resevwa</value>
+  </data>
+  <data name="free_ticket_success_ticket" xml:space="preserve">
+    <value>1 Tikè Millions GRATIS.</value>
+  </data>
+  <data name="free_ticket_success_chance" xml:space="preserve">
+    <value>Sèvi avè l kounye a pou chans genyen jiska</value>
+  </data>
+  <data name="free_ticket_success_use" xml:space="preserve">
+    <value>Sèvi ak tikè a</value>
+  </data>
+  <data name="free_ticket_success_later" xml:space="preserve">
+    <value>Pita</value>
+  </data>
+  <data name="free_ticket_success_validity" xml:space="preserve">
+    <value>Tikè gratis la valab sèlman pou tiraj jodi a.</value>
+  </data>
+  <data name="free_ticket_error_43_badge" xml:space="preserve">
+    <value>PLIS CHANS PWOCHEN FWA!</value>
+  </data>
+  <data name="free_ticket_error_43_daily_title" xml:space="preserve">
+    <value>Nouvo chans chak jou!</value>
+  </data>
+  <data name="free_ticket_error_43_daily_description" xml:space="preserve">
+    <value>Yo bay tikè gratis chak jou. Pa rate chans ou demen!</value>
+  </data>
+  <data name="free_ticket_error_43_footer" xml:space="preserve">
+    <value>Achte yon tikè kounye a pou chans genyen jiska 30,000,000 HTG!</value>
+  </data>
+  <data name="free_ticket_waiting_badge" xml:space="preserve">
+    <value>TIKÈ GRATIS</value>
+  </data>
+  <data name="free_ticket_waiting_validity" xml:space="preserve">
+    <value>Tikè gratis la valab sèlman pou tiraj jodi a. Pa bliye sèvi avè l!</value>
+  </data>
+  <data name="free_ticket_error_45_ticket_free" xml:space="preserve"><value>GRATIS</value></data>
+  <data name="free_ticket_error_45_ticket_tickets" xml:space="preserve"><value>TIKÈ</value></data>
+  <data name="free_ticket_error_45_ticket_sold_out" xml:space="preserve"><value>FINI</value></data>
+  <data name="free_ticket_error_45_title" xml:space="preserve"><value>Tikè gratis yo</value></data>
+  <data name="free_ticket_error_45_title_emphasis" xml:space="preserve"><value>fini</value></data>
+  <data name="free_ticket_error_45_description" xml:space="preserve"><value>Tout tikè gratis pou jodi a deja reklame. Tanpri retounen demen epi eseye chans ou ankò!</value></data>
+  <data name="free_ticket_error_45_next_title" xml:space="preserve"><value>Pwochen chans:</value></data>
+  <data name="free_ticket_error_45_next_primary" xml:space="preserve"><value>Retounen demen</value></data>
+  <data name="free_ticket_error_45_next_secondary" xml:space="preserve"><value>epi eseye chans ou ankò!</value></data>
+  <data name="free_ticket_error_45_footer" xml:space="preserve"><value>Pa rate chans ou pou genyen jiska 30,000,000 HTG!</value></data>
+  <data name="free_ticket_banner_cta" xml:space="preserve"><value>Peze la pou jwenn</value></data>
+  <data name="free_ticket_banner_highlight" xml:space="preserve"><value>TIKÈ GRATIS ou!</value></data>
+</root>

+ 446 - 0
website_natcash/Languages/Question.Designer.cs

@@ -0,0 +1,446 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace LotteryWebApp.Languages {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    public class Question {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Question() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LotteryWebApp.Languages.Question", typeof(Question).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        public static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;1.1 A ki kont mwen ka jwe nan Natcom Lotto?&lt;/p&gt;
+        ///&lt;ul&gt;
+        ///&lt;li&gt;Jwe ak yon prensipal, fe *5555# oswa sou sitweb/aplikasyon htttps://lotto.natcom.com.ht&lt;/li&gt;
+        ///&lt;li&gt;Jwe ak kont prensipal &amp;ndash; Natcash, fe *202#&lt;/li&gt;
+        ///&lt;/ul&gt;
+        ///&lt;p&gt;1.2 Ki kantite minimom ak maksimom ou ka achte yon tike?&lt;/p&gt;
+        ///&lt;ul&gt;
+        ///&lt;li&gt;Maksimom: 5000 HTG&lt;/li&gt;
+        ///&lt;li&gt;Minimom: 1 HTG&lt;/li&gt;
+        ///&lt;/ul&gt;
+        ///&lt;p&gt;1.3 Rezilta Lotri Nouyok:&lt;/p&gt;
+        ///&lt;p&gt;&lt;span style=color: #ff0000;&quot;&gt;B&amp;ograve;L&amp;egrave;t&lt;/span&gt;&lt;/p&gt;
+        ///&lt;ul&gt;
+        ///&lt;li&gt;Achte 1 tike: *5555*1*XX*Paryaj# Voye&lt;/li&gt;
+        ///&lt;li&gt;Ach [rest of string was truncated]&quot;;.
+        /// </summary>
+        public static string a1 {
+            get {
+                return ResourceManager.GetString("a1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Apre chak tiraj, sistem nan voye yon SMS otomatikman bay chak ganyan. Jwe ki pa genyen tike PA P RESEVWA SMS..
+        /// </summary>
+        public static string a2 {
+            get {
+                return ResourceManager.GetString("a2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Lajan ganyan an ap direkteman sou kont Natcom loto nan kek minit apre le tiraj la (nomalman nan 5 minit). Ganyan yo ka verifye kantite lajan an le yo fe *5555*5#..
+        /// </summary>
+        public static string a3 {
+            get {
+                return ResourceManager.GetString("a3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Wi, ou kapab. Fe *5555*5#  oswa telechaje aplikasyon NatcomID la =&gt; Natcom Lotto oswa vizite sitweb la: htttps://lotto.natcom.com.ht.
+        /// </summary>
+        public static string a4 {
+            get {
+                return ResourceManager.GetString("a4", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;Wi, ou ka transfere kantite lajan ou te genyen an sou kont prensipal ou ak oswa - kont Natcash epi retire lajan kach nan kay ajan Natcash&lt;/p&gt;
+        ///&lt;ul&gt;
+        ///&lt;li&gt;Pou transfere apati ussd, fe *5555*5# Voye&lt;/li&gt;
+        ///&lt;li&gt;Oubyen sou aplikasyon Natcom Lotto: Klike sou &quot;Retire Lajan&quot; epi swiv etap yo&lt;/li&gt;
+        ///&lt;li&gt;Not: Ou ka retire yon maksimom 40,000 HTG pa jou&lt;/li&gt;
+        ///&lt;/ul&gt;.
+        /// </summary>
+        public static string a5 {
+            get {
+                return ResourceManager.GetString("a5", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Sou sitweb la: Chwazi lang sou paj koneksyon an.
+        ///Sou USSD: Fe *5555# epi chwazi Opsyon 8 la..
+        /// </summary>
+        public static string a6 {
+            get {
+                return ResourceManager.GetString("a6", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;Wi, ou ka achte Bolet, Maryaj, Lotto3 pou tou de Lotri New York ak Florida sou kont Nacash:&lt;/p&gt;
+        ///&lt;ul&gt;
+        ///&lt;li&gt;Via USSD: Fe *202# epi Opsyon 6&lt;/li&gt;
+        ///&lt;li&gt;Apati aplikasyon Natcash&lt;/li&gt;
+        ///&lt;/ul&gt;
+        ///&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; Si ou pa gen yon kont Natcash, ou ka kreye yon kont le w fe *202# epi swiv enstriksyon yo oswa vizite nenpot Showroom ak ajan Natcom&lt;/p&gt;.
+        /// </summary>
+        public static string a7 {
+            get {
+                return ResourceManager.GetString("a7", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Natcom:&lt;/p&gt;
+        ///&lt;ul&gt;
+        ///&lt;ul&gt;
+        ///&lt;li&gt;Rele yon ajan sant apel 111 (1htg/min)&lt;/li&gt;
+        ///&lt;li&gt;Tchat: WhatsApp +509 33 25 1111 ; Facebook: NATCOM S.A&lt;/li&gt;
+        ///&lt;li&gt;Oswa voye yon imel nan: vas.department@natcom.com.ht&lt;/li&gt;
+        ///&lt;/ul&gt;
+        ///&lt;/ul&gt;.
+        /// </summary>
+        public static string a8 {
+            get {
+                return ResourceManager.GetString("a8", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;9.1 Ki moun ki ka jwe Natcom Lotto?&lt;/p&gt;
+        ///&lt;p&gt;- Nenpot moun ki poko gen 18 an pa gen dwa jwe Natcom Lotto&lt;/p&gt;
+        ///&lt;p&gt;9.2 Obligasyon ganyan an?&lt;/p&gt;
+        ///&lt;p&gt;- Le jwe a jwe Natcom Lotto, li aksepte ke Natcom, san avetisman alavans, ka, gen dwa, itilize non li ak imaj li pou rezon pwomosyonel pandan nenpot kanpay piblisite. Gayan an, san okenn lot konpansasyon pou peye li pou rezon sa a.&lt;/p&gt;
+        ///&lt;p&gt;9.3 Dat limit pou reklame tike?&lt;/p&gt;
+        ///&lt;p&gt;- Tout pri yo dwe reklame nan 90 jou apre dat tiraj la. Apre peryod sa a, Natcom Lo [rest of string was truncated]&quot;;.
+        /// </summary>
+        public static string a9 {
+            get {
+                return ResourceManager.GetString("a9", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;Peman:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;1ye Lot: genyen 50 fwa (50x) parye ou a&lt;/p&gt;
+        ///&lt;p&gt;2yem Lot: genyen 20 fwa (20x) parye ou a&lt;/p&gt;
+        ///&lt;p&gt;3yem Lot: Genyen 10 fwa (10x) parye ou a&lt;/p&gt;
+        ///&lt;p&gt;&lt;strong&gt;Le tiraj la:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;- Rezilta NewYork: 14:30 (Midi), 22:30 (Aswe), nimewo ganyan yo: NUMBERS ak Win4&lt;/p&gt;
+        ///&lt;p&gt;- Not: Tike yo ap deplase nan pwochen sek la 30’ anvan chak le tiraj la&lt;/p&gt;
+        ///&lt;p&gt;&lt;strong&gt;Egzanp:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;- Rezilta NewYork nan dat 14/03/2022 (Le tiraj la: 14:30):&lt;/p&gt;
+        ///&lt;ul style=&quot;list-style-type: [rest of string was truncated]&quot;;.
+        /// </summary>
+        public static string h1 {
+            get {
+                return ResourceManager.GetString("h1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;Peman:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;Genyen 1000 fwa (1000x) parye ou&lt;/p&gt;
+        ///&lt;p&gt;&lt;strong&gt;Le tiraj la:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;- Rezilta NewYork: 14:30 (Midi), 22:30 (Aswe)&lt;/p&gt;
+        ///&lt;p&gt;- Not: Tike yo ap deplase nan pwochen sek la 30’ anvan chak le tiraj la&lt;/p&gt;
+        ///&lt;p&gt;&lt;strong&gt;Nimewo gayan yo:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;- Konbine 2 nimewo gayan pe Bol&amp;egrave;t NewYork&lt;/p&gt;
+        ///.
+        /// </summary>
+        public static string h2 {
+            get {
+                return ResourceManager.GetString("h2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;Peman:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;Genyen 500 fwa (500x) parye ou&lt;/p&gt;
+        ///&lt;p&gt;&lt;strong&gt;Le tiraj la:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;- Rezilta NewYork: 14:30 (Midi), 22:30 (Aswe)&lt;/p&gt;
+        ///&lt;p&gt;- Not: Tike yo ap deplase nan pwochen sek la 30’ anvan chak le tiraj la&lt;/p&gt;
+        ///&lt;p&gt;&lt;strong&gt;Nimewo gayan yo:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;- Tiraj NewYork: NIMEWO&lt;/p&gt;.
+        /// </summary>
+        public static string h3 {
+            get {
+                return ResourceManager.GetString("h3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;Peman:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;1ye Lot: genyen 50 fwa (50x) parye ou&lt;/p&gt;
+        ///&lt;p&gt;2yem Lot: genyen 20 fwa (20x) parye ou&lt;/p&gt;
+        ///&lt;p&gt;3yem Lot: Genyen 10 fwa (10x) parye ou&lt;/p&gt;
+        ///&lt;p&gt;&lt;strong&gt;Le tiraj la:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;ul&gt;
+        ///&lt;li&gt;Rezilta Florid: 13:30 (Midi), 21:45 (Aswe), nimewo gayan yo: Pick3 ak Pick4&lt;/li&gt;
+        ///&lt;li&gt;Not: Tike yo ap deplase nan pwochen sek la 30’ anvan chak le tiraj la&lt;/li&gt;
+        ///&lt;/ul&gt;
+        ///&lt;p&gt;&lt;strong&gt;Egzanp:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;- Rezilta Florid nan dat 14/03/2022 (Le tiraj la: 13:30):&lt;/p&gt;
+        ///&lt;ul style=list-style-typ [rest of string was truncated]&quot;;.
+        /// </summary>
+        public static string h4 {
+            get {
+                return ResourceManager.GetString("h4", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;Peman:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;Genyen 1000 fwa (1000x) parye ou&lt;/p&gt;
+        ///&lt;p&gt;&lt;strong&gt;Le tiraj la:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;- Rezilta Florid: 13:30 (Midi), 21:45 (Aswe)
+        ///&lt;/p&gt;
+        ///&lt;p&gt;- Not: Tike yo ap deplase nan pwochen sek la 30’ anvan chak le tiraj la&lt;/p&gt;
+        ///&lt;p&gt;&lt;strong&gt;Nimewo gayan yo:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;- Konbine 2 nimewo gayan pe Bel&amp;egrave;t Florida&lt;/p&gt;.
+        /// </summary>
+        public static string h5 {
+            get {
+                return ResourceManager.GetString("h5", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;Peman:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;Genyen 500 fwa (500x) parye ou&lt;/p&gt;
+        ///&lt;p&gt;&lt;strong&gt;Le tiraj la:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;- Rezilta Florid: 13:30 (Midi), 21:45 (Aswe)&lt;/p&gt;
+        ///&lt;p&gt;- Not: Tike yo ap deplase nan pwochen sek la 30’ anvan chak le tiraj&lt;/p&gt;
+        ///&lt;p&gt;&lt;strong&gt;Nimewo gayan yo:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;- Tiraj Florid: PICK3&lt;/p&gt;.
+        /// </summary>
+        public static string h6 {
+            get {
+                return ResourceManager.GetString("h6", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;Peman: &lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;1ye pri: Genyen 40 fwa (40x) parye ou&lt;/p&gt;
+        ///&lt;p&gt;2n pri - 11yem pri: Genyen 4 fwa (4x) parye ou&lt;/p&gt;
+        ///&lt;p&gt;&lt;strong&gt;Le tiraj la:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;- Rezilta chak 30 minit epi tann rezilta a nan 10 minit&lt;/p&gt;
+        ///&lt;p&gt;Egzanp:&lt;/p&gt;
+        ///&lt;p&gt;- Le tiraj la komanse: 0:00&lt;/p&gt;
+        ///&lt;p&gt;- Le tiraj la fini: 0:30&lt;/p&gt;
+        ///&lt;p&gt;- Tann sistem nan tire loto a epi voye rezilta a nan 10 minit. Kliyan an ap resevwa rezilta a soti 0:30:01 – 0:40:00&lt;/p&gt;
+        ///&lt;p&gt;&lt;strong&gt;Nimewo gayan yo:&lt;/strong&gt;&lt;/p&gt;
+        ///&lt;p&gt;- Tiraj la fet pa sis [rest of string was truncated]&quot;;.
+        /// </summary>
+        public static string h7 {
+            get {
+                return ResourceManager.GetString("h7", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;- Jwe ak balans prensipal ou: *5555# ak entenet/aplikasyon loto Natcom&lt;/p&gt;
+        ///&lt;p&gt;- Jwe ak kont Natcash ou: *202# ak opsyon 6&lt;/p&gt;
+        ///&lt;p&gt;- Chwa rapid:&lt;/p&gt;
+        ///&lt;p&gt;Rezilta lotri New York:&lt;/p&gt;
+        ///&lt;p&gt;+ Achte 1 tike: &lt;span style=color: #ff0000;&quot;&gt;*5555*1&lt;/span&gt;*XX*Pari# Voye&lt;/p&gt;
+        ///&lt;p&gt;+ Achte 2-5 tike: &lt;span style=&quot;color: #ff0000;&quot;&gt;*5555*1&lt;/span&gt;*XX*Paryaj1*XX*Paryaj2*XX*Paryaj3# Voye&lt;/p&gt;
+        ///&lt;p&gt;Rezilta lotri Florida:&lt;/p&gt;
+        ///&lt;p&gt;+ Achte 1 tike: &lt;span style=&quot;color: #ff0000;&quot;&gt;*5555*2&lt;/span&gt;*XX*Pari# Voye&lt;/p&gt;
+        ///&lt;p&gt;+ Achte 2-5 tike:  [rest of string was truncated]&quot;;.
+        /// </summary>
+        public static string p1 {
+            get {
+                return ResourceManager.GetString("p1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;- Jwe ak balans prensipal ou: *5555# ak entenet/aplikasyon loto Natcom&lt;/p&gt;
+        ///&lt;p&gt;- Jwe ak kont Natcash ou: *202# ak opsyon 6&lt;/p&gt;
+        ///&lt;p&gt;- Chwa rapid:&lt;/p&gt;
+        ///&lt;p&gt;Rezilta lotri New York:&lt;/p&gt;
+        ///&lt;p&gt;+ Achte 1 tike:&lt;span style=color: #ff0000;&quot;&gt; *5555*1&lt;/span&gt;*XXXX*Paryaj# Voye&lt;/p&gt;
+        ///&lt;p&gt;+ Achte 2-5 tike: &lt;span style=&quot;color: #ff0000;&quot;&gt;*5555*1&lt;/span&gt;*XXXX*Paryaj1*XXXX*Paryaj2*XXXX*Paryaj3# Voye&lt;/p&gt;
+        ///&lt;p&gt;Rezilta lotri Florida:&lt;/p&gt;
+        ///&lt;p&gt;+ Achte 1 tike: &lt;span style=&quot;color: #ff0000;&quot;&gt;*5555*2&lt;/span&gt;*XXXX*Pari# Voye&lt;/p&gt;
+        ///&lt;p&gt;+ Acht [rest of string was truncated]&quot;;.
+        /// </summary>
+        public static string p2 {
+            get {
+                return ResourceManager.GetString("p2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;- Jwe ak balans prensipal ou: *5555# ak entenet/aplikasyon loto Natcom&lt;/p&gt;
+        ///&lt;p&gt;- Jwe ak kont Natcash ou: *202# ak opsyon 6&lt;/p&gt;
+        ///&lt;p&gt;- Chwa rapid:&lt;/p&gt;
+        ///&lt;p&gt;Rezilta lotri New York:&lt;/p&gt;
+        ///&lt;p&gt;+ Achte 1 tike:&lt;span style=color: #ff0000;&quot;&gt; *5555*1&lt;/span&gt;*XXX*Pari# Voye&lt;/p&gt;
+        ///&lt;p&gt;+ Achte 2-5 tike: &lt;span style=&quot;color: #ff0000;&quot;&gt;*5555*1&lt;/span&gt;*XXX*Paryaj1*XXX*Paryaj2*XXX*Paryaj3# Voye&lt;/p&gt;
+        ///&lt;p&gt;Rezilta lotri Florida:&lt;/p&gt;
+        ///&lt;p&gt;+ Achte 1 tike: &lt;span style=&quot;color: #ff0000;&quot;&gt;*5555*2&lt;/span&gt;*XXX*Paryaj# Voye&lt;/p&gt;
+        ///&lt;p&gt;+ Achte 2-5 [rest of string was truncated]&quot;;.
+        /// </summary>
+        public static string p3 {
+            get {
+                return ResourceManager.GetString("p3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;- Jwe ak balans prensipal ou: *5555# ak loto entenet/aplikasyon Natcom&lt;/p&gt;
+        ///&lt;p&gt;- Chwa rapid:&lt;/p&gt;
+        ///&lt;p&gt;Rezilta lotri Boulchans:&lt;/p&gt;
+        ///&lt;p&gt;+ Achte 1 tike:&lt;span style=color: #ff0000;&quot;&gt; *5555*3&lt;/span&gt;*XX*Pari# Voye&lt;/p&gt;
+        ///&lt;p&gt;+ Achte 2-5 tike: &lt;span style=&quot;color: #ff0000;&quot;&gt;*5555*3&lt;/span&gt;*XX*Paryaj1*XX*Paryaj2*XX*Paryaj3# Voye&lt;/p&gt;
+        ///&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; Mete yon X soti nan 0-9 epi &lt;span style=&quot;color: #ff0000;&quot;&gt;2 chif&lt;/span&gt;&lt;/p.
+        /// </summary>
+        public static string p4 {
+            get {
+                return ResourceManager.GetString("p4", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;1. Kijan pou achte tike, chwazi tike rapid ak tike miltip (2-5 tike an menm tan)?&lt;/strong&gt;&lt;/p&gt;.
+        /// </summary>
+        public static string q1 {
+            get {
+                return ResourceManager.GetString("q1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;2. Kijan m ka konnen si tike mwen an genyen oswa pedi?&lt;/strong&gt;&lt;/p&gt;.
+        /// </summary>
+        public static string q2 {
+            get {
+                return ResourceManager.GetString("q2", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;3. Kijan m ka resevwa lajan kem genyen an?&lt;/strong&gt;&lt;/p&gt;.
+        /// </summary>
+        public static string q3 {
+            get {
+                return ResourceManager.GetString("q3", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;4. Kijan m ka verifye lajan mwen genyen an?&lt;/strong&gt;&lt;/p&gt;.
+        /// </summary>
+        public static string q4 {
+            get {
+                return ResourceManager.GetString("q4", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;5. Kijan mwen ka retire lajan mwen te genyen an?&lt;/strong&gt;&lt;/p&gt;.
+        /// </summary>
+        public static string q5 {
+            get {
+                return ResourceManager.GetString("q5", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;6. Kijan pou chanje lang nan?&lt;/strong&gt;&lt;/p&gt;.
+        /// </summary>
+        public static string q6 {
+            get {
+                return ResourceManager.GetString("q6", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;7. Kijan pou jwe loto Natcom sou kont Natcash?&lt;/strong&gt;&lt;/p&gt;.
+        /// </summary>
+        public static string q7 {
+            get {
+                return ResourceManager.GetString("q7", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;8. Ou bezwen sipo an direk?&lt;/strong&gt;&lt;/p&gt;.
+        /// </summary>
+        public static string q8 {
+            get {
+                return ResourceManager.GetString("q8", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &lt;p&gt;&lt;strong&gt;9. Definisyon ak Kondisyon konsenan Natcom Loto &lt;/strong&gt;&lt;/p&gt;.
+        /// </summary>
+        public static string q9 {
+            get {
+                return ResourceManager.GetString("q9", resourceCulture);
+            }
+        }
+    }
+}

+ 369 - 0
website_natcash/Languages/Question.fr.resx

@@ -0,0 +1,369 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="a1" xml:space="preserve">
+    <value>&lt;p&gt;1.1 Which money account I can play Natcom Lotto?&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Play via mobile account, dial *5555# or website/application htttps://lotto.natcom.com.ht&lt;/li&gt;
+&lt;li&gt;Play via Mobile money &amp;ndash; Natcash, dial *202#&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;1.2 What is minimum and maximum you can buy a Ticket?&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Maximum: 5000 HTG&lt;/li&gt;
+&lt;li&gt;Minimum: 1 HTG&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;1.3 NewYork Lottery results:&lt;/p&gt;
+&lt;p&gt;&lt;span style=color: #ff0000;"&gt;B&amp;ograve;L&amp;egrave;t&lt;/span&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Buy 1 ticket: *5555*1*XX*Bet# Send&lt;/li&gt;
+&lt;li&gt;Buy 2-5 tickets: *5555*1*XX*Bet1*XX*Bet2*XX*Bet3# Send&amp;nbsp;&lt;em&gt;(X from 0-9 and 2 digits)&lt;/em&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;span style="color: #ff0000;"&gt;Maryaj:&lt;/span&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Buy 1 ticket: *5555*1*XXXX*Bet#&lt;/li&gt;
+&lt;li&gt;Buy 2-5 tickets: *5555*1*XXXX*Bet1*XXXX*Bet2*XXXX*Bet3# Send&amp;nbsp;&lt;em&gt;(X from 0-9 and 4 digits)&lt;/em&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;span style="color: #ff0000;"&gt;Lotto3:&lt;/span&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Buy 1 ticket: *5555*1*XXX*Bet#&lt;/li&gt;
+&lt;li&gt;Buy 2-5 tickets: *5555*1*XXX*Bet1*XXX*Bet2*XXX*Bet3# Send&amp;nbsp;&lt;em&gt;(X from 0-9 and 3 digits)&lt;/em&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;1.4 Florida Lottery results&lt;/p&gt;
+&lt;p&gt;&lt;span style="color: #0000ff;"&gt;B&amp;ograve;L&amp;egrave;t&lt;/span&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Buy 1 ticket: *5555*2*XX*Bet#&lt;/li&gt;
+&lt;li&gt;Buy 2-5 tickets: *5555*2*XX*Bet1*XX*Bet2*XX*Bet3&lt;strong&gt;#&lt;/strong&gt; Send&amp;nbsp;&lt;em&gt;(X from 0-9 and 2 digits)&lt;/em&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;Maryaj:&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Buy 1 ticket: *5555*2*XXXX*Bet#&lt;/li&gt;
+&lt;li&gt;Buy 2-5 tickets: *5555*2*XXXX*Bet1*XXXX*Bet2*XXXX*Bet3# Send&lt;em&gt;(X from 0-9 and 4 digits)&lt;/em&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;span style="color: #0000ff;"&gt;Lotto3:&lt;/span&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Buy 1 ticket: *5555*2*XXX*Bet# Send&lt;/li&gt;
+&lt;li&gt;Buy 2-5 tickets: *5555*2*XXX*Bet1*XXX*Bet2*XXX*Bet3# Send&amp;nbsp;&lt;em&gt;(X from 0-9 and 3 digits)&lt;/em&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;1.5 Boulchans Lottery results&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Buy 1 ticket: *5555*3*XX*Bet#&lt;/li&gt;
+&lt;li&gt;Buy 2-5 tickets: *5555*3*XX*Bet1*XX*Bet2*XX*Bet3&lt;strong&gt;#&lt;/strong&gt; Send&amp;nbsp;&lt;em&gt;(X from 0-9 and 2 digits)&lt;/em&gt;&lt;/li&gt;
+&lt;/ul&gt;</value>
+  </data>
+  <data name="a2" xml:space="preserve">
+    <value>After each draw, the system automatically sends an SMS notification to each of the winners. Players without winning tickets WILL NOT RECEIVE SMS.</value>
+  </data>
+  <data name="a3" xml:space="preserve">
+    <value>The winning money will be sent directly to Natcom Lotto account after few minutes from drawing time (in normal case within 5 minutes), Winners can check the amount, by dialing *5555*5#</value>
+  </data>
+  <data name="a4" xml:space="preserve">
+    <value>Yes, you can. Dial *5555*5# send or download NatcomID application =&gt;  Natcom Lotto or visit website: htttps://lotto.natcom.com.ht</value>
+  </data>
+  <data name="a5" xml:space="preserve">
+    <value>&lt;p&gt;Yes, you can transfer your winning amount to your mobile account and your mobile wallet &amp;ndash; Natcash account and withdraw cash at any Natcash agents&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;To transfer via ussd, dial *5555*5# Send&lt;/li&gt;
+&lt;li&gt;Or via Natcom Lotto application: Click &amp;ldquo;Withdraw Money&amp;rdquo; and follow steps&lt;/li&gt;
+&lt;li&gt;Note: You can withdraw maximum 40,000 HTG per day&lt;/li&gt;
+&lt;/ul&gt;</value>
+  </data>
+  <data name="a6" xml:space="preserve">
+    <value>On website: Select the language on login Page.
+On USSD: Dial *5555# and choose the Option 8.</value>
+  </data>
+  <data name="a7" xml:space="preserve">
+    <value>&lt;p&gt;Yes, you can buy Bolet, Maryaj, Lotto3 for both NewYork and Florida Lottery on Nacash account:&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Via USSD: Dial *202# and Option 6&lt;/li&gt;
+&lt;li&gt;Via Natcash application&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Note:&lt;/strong&gt; If you are not a Natcash account, you can register Natcash by dialing *202# and follow instruction or visit any Natcom showroom and Agents&lt;/p&gt;</value>
+  </data>
+  <data name="a8" xml:space="preserve">
+    <value>&lt;p&gt;Natcom Lottery support:&lt;/p&gt;
+&lt;ul&gt;
+&lt;ul&gt;
+&lt;li&gt;Call a callcenter agent 111 (1htg/min)&lt;/li&gt;
+&lt;li&gt;Chat: WhatsApp +509 33 25 1111 ; Facebook: NATCOM S.A&lt;/li&gt;
+&lt;li&gt;Or email to:vas.department@natcom.com.ht&lt;/li&gt;
+&lt;/ul&gt;
+&lt;/ul&gt;</value>
+  </data>
+  <data name="a9" xml:space="preserve">
+    <value>&lt;p&gt;9.1 Who can play Natcom Lotto?&lt;/p&gt;
+&lt;p&gt;- Anyone under the age of 18 is not allowed to play Natcom Lotto games&lt;/p&gt;
+&lt;p&gt;9.2 Winner&amp;rsquo;s obligations?&lt;/p&gt;
+&lt;p&gt;- By purchasing games from Natcom Lotto, the Player accepts that Natcom, without prior notice, may, as of right, use his name and image for promotional purposes during any advertising campaign. Winner, without any other compensation to be paid to him for this purpose.&lt;/p&gt;
+&lt;p&gt;9.3 Ticket claim deadline?&lt;/p&gt;
+&lt;p&gt;- All prizes must be claimed within 90 days of the draw date. After this period, Natcom Lotto declines all responsibility for the payment of this amount, the amount of which will be added to the Grand Prizes. In such a case, the Player agrees to be deprived of all rights relating to this winning ticket.&lt;/p&gt;</value>
+  </data>
+  <data name="h1" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;Payout:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;1&lt;sup&gt;st&lt;/sup&gt; Lot: win 50 times (50x) your bet&lt;/p&gt;
+&lt;p&gt;2&lt;sup&gt;nd&lt;/sup&gt; Lot: win 20 times (20x) your bet&lt;/p&gt;
+&lt;p&gt;3&lt;sup&gt;rd&lt;/sup&gt; Lot: Win 10 times (10x) your bet&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Draw time:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- NewYork result: 14:30 (Midday), 22:30 (Evening), winning numbers: NUMBERS and Win4&lt;/p&gt;
+&lt;p&gt;- Note: Tickets will move to next circle 30’ before each draw time&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- NewYork results on 14/03/2022 (Drawing time: 14:30):&lt;/p&gt;
+&lt;ul style="list-style-type: square;"&gt;
+&lt;li&gt;Drawing: NUMBERS: 139; Win4: 3505&lt;/li&gt;
+&lt;li&gt;B&amp;ograve;l&amp;egrave;t NewYork winning numbers: 1&lt;sup&gt;st&lt;/sup&gt; Lot: 39; 2&lt;sup&gt;nd&lt;/sup&gt; Lot: 35; 3&lt;sup&gt;rd&lt;/sup&gt; Lot: 05&lt;/li&gt;
+&lt;/ul&gt;</value>
+  </data>
+  <data name="h2" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;Payout: &lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;Win 1000 times (1000x) your bet&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Draw time:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- NewYork result: 14:30 (Midday), 22:30 (Evening)&lt;/p&gt;
+&lt;p&gt;- Note: Tickets will move to next circle 30’ before each draw time&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Winning numbers:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Combined 2 pair winning numbers of B&amp;ograve;l&amp;egrave;t NewYork&lt;/p&gt;</value>
+  </data>
+  <data name="h3" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;Payout: &lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;Win 500 times (500x) your bet&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Draw time:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- NewYork result: 14:30 (Midday), 22:30 (Evening)&lt;/p&gt;
+&lt;p&gt;- Note: Tickets will move to next circle 30’ before each draw time&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Winning numbers:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;-&amp;nbsp;NewYork drawing: NUMBERS&lt;/p&gt;</value>
+  </data>
+  <data name="h4" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;Payout:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;1&lt;sup&gt;st&lt;/sup&gt; Lot: win 50 times (50x) your bet&lt;/p&gt;
+&lt;p&gt;2&lt;sup&gt;nd&lt;/sup&gt; Lot: win 20 times (20x) your bet&lt;/p&gt;
+&lt;p&gt;3&lt;sup&gt;rd&lt;/sup&gt; Lot: Win 10 times (10x) your bet&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Draw time:&lt;/strong&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Florida result: 13:30 (Midday), 21:45 (Evening), winning&amp;nbsp;numbers: Pick3 and Pick4&lt;/li&gt;
+&lt;li&gt;Note: Tickets will move to next circle 30’ before each draw time&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;-&amp;nbsp;Florida results on 14/03/2022 (Drawing time: 13:30):&lt;/p&gt;
+&lt;ul style=list-style-type: square;"&gt;
+&lt;li&gt;Drawing: PICK3: 462; PICK4: 0453&lt;/li&gt;
+&lt;li&gt;B&amp;ograve;l&amp;egrave;t Florida winning numbers: 1&lt;sup&gt;st&lt;/sup&gt; Lot: 62; 2&lt;sup&gt;nd&lt;/sup&gt; Lot: 04; 3&lt;sup&gt;rd&lt;/sup&gt; Lot: 53&lt;/li&gt;
+&lt;/ul&gt;</value>
+  </data>
+  <data name="h5" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;Payout: &lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;Win 1000 times (1000x) your bet&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Draw time:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;-&amp;nbsp;Florida result: 13:30 (Midday), 21:45 (Evening)
+&lt;/p&gt;
+&lt;p&gt;- Note: Tickets will move to next circle 30’ before each draw time&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Winning numbers:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Combined 2 pair winning numbers of B&amp;ograve;l&amp;egrave;t Florida&lt;/p&gt;</value>
+  </data>
+  <data name="h6" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;Payout: &lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;Win 500 times (500x) your bet&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Draw time:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Florida result: 13:30 (Midday), 21:45 (Evening)&lt;/p&gt;
+&lt;p&gt;- Note: Tickets will move to next circle 30’ before each draw time&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Winning numbers:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;-&amp;nbsp;Florida drawing: PICK3&lt;/p&gt;</value>
+  </data>
+  <data name="h7" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;Payout: &lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;1st prize: Win 40 times (40x) your bet&lt;/p&gt;
+&lt;p&gt;2n prize - 11st prize: Win 4 times (4x) your bet&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Draw time:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Result each 30 minute and waiting the result in 10 minutes&lt;/p&gt;
+&lt;p&gt;Example:&lt;/p&gt;
+&lt;p&gt;- Begin draw time: 0:00&lt;/p&gt;
+&lt;p&gt;- Close draw time: 0:30&lt;/p&gt;
+&lt;p&gt;- Waiting the system draw lotto and send the result in 10 minutes. Customer will receive the result from 0:30:01 – 0:40:00&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Winning numbers:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;-&amp;nbsp;Draw by Natcom Lotto system, include 2 numbers.&lt;/p&gt;</value>
+  </data>
+  <data name="p1" xml:space="preserve">
+    <value>&lt;p&gt;- Play with your Natcom balance: *5555# and web/app Natcom lotto&lt;/p&gt;
+&lt;p&gt;- Play with your Natcash account: *202# and option 6&lt;/p&gt;
+&lt;p&gt;- Quick Pick:&lt;/p&gt;
+&lt;p&gt;NewYork Lottery results:&lt;/p&gt;
+&lt;p&gt;+ Buy 1 ticket: &lt;span style=color: #ff0000;"&gt;*5555*1&lt;/span&gt;*XX*Bet# Send&lt;/p&gt;
+&lt;p&gt;+ Buy 2-5 tickets: &lt;span style="color: #ff0000;"&gt;*5555*1&lt;/span&gt;*XX*Bet1*XX*Bet2*XX*Bet3# Send&lt;/p&gt;
+&lt;p&gt;Florida Lottery results:&lt;/p&gt;
+&lt;p&gt;+ Buy 1 ticket: &lt;span style="color: #ff0000;"&gt;*5555*2&lt;/span&gt;*XX*Bet# Send&lt;/p&gt;
+&lt;p&gt;+ Buy 2-5 tickets: *5555*2*XX*Bet1*XX*Bet2*XX*Bet3# Send&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; X from 0-9 and &lt;span style="color: #ff0000;"&gt;2 digits&lt;/span&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="p2" xml:space="preserve">
+    <value>&lt;p&gt;- Play with your Natcom balance: *5555# and web/app Natcom lotto&lt;/p&gt;
+&lt;p&gt;- Play with your Natcash account: *202# and option 6&lt;/p&gt;
+&lt;p&gt;- Quick Pick:&lt;/p&gt;
+&lt;p&gt;NewYork Lottery results:&lt;/p&gt;
+&lt;p&gt;+ Buy 1 ticket:&lt;span style=color: #ff0000;"&gt; *5555*1&lt;/span&gt;*XXXX*Bet# Send&lt;/p&gt;
+&lt;p&gt;+ Buy 2-5 tickets: &lt;span style="color: #ff0000;"&gt;*5555*1&lt;/span&gt;*XXXX*Bet1*XXXX*Bet2*XXXX*Bet3# Send&lt;/p&gt;
+&lt;p&gt;Florida Lottery results:&lt;/p&gt;
+&lt;p&gt;+ Buy 1 ticket: &lt;span style="color: #ff0000;"&gt;*5555*2&lt;/span&gt;*XXXX*Bet# Send&lt;/p&gt;
+&lt;p&gt;+ Buy 2-5 tickets: &lt;span style="color: #ff0000;"&gt;*5555*2&lt;/span&gt;*XXXX*Bet1*XXXX*Bet2*XXXX*Bet3# Send&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; X from 0-9 and &lt;span style="color: #ff0000;"&gt;4 digits&lt;/span&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="p3" xml:space="preserve">
+    <value>&lt;p&gt;- Play with your Natcom balance: *5555# and web/app Natcom lotto&lt;/p&gt;
+&lt;p&gt;- Play with your Natcash account: *202# and option 6&lt;/p&gt;
+&lt;p&gt;- Quick Pick:&lt;/p&gt;
+&lt;p&gt;NewYork Lottery results:&lt;/p&gt;
+&lt;p&gt;+ Buy 1 ticket:&lt;span style=color: #ff0000;"&gt; *5555*1&lt;/span&gt;*XXX*Bet# Send&lt;/p&gt;
+&lt;p&gt;+ Buy 2-5 tickets: &lt;span style="color: #ff0000;"&gt;*5555*1&lt;/span&gt;*XXX*Bet1*XXX*Bet2*XXX*Bet3# Send&lt;/p&gt;
+&lt;p&gt;Florida Lottery results:&lt;/p&gt;
+&lt;p&gt;+ Buy 1 ticket: &lt;span style="color: #ff0000;"&gt;*5555*2&lt;/span&gt;*XXX*Bet# Send&lt;/p&gt;
+&lt;p&gt;+ Buy 2-5 tickets: &lt;span style="color: #ff0000;"&gt;*5555*2&lt;/span&gt;*XXX*Bet1*XXX*Bet2*XXX*Bet3# Send&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; X from 0-9 and &lt;span style="color: #ff0000;"&gt;3 digits&lt;/span&gt;&lt;/p&gt;"</value>
+  </data>
+  <data name="p4" xml:space="preserve">
+    <value>&lt;p&gt;- Play with your Natcom balance: *5555# and web/app Natcom lotto&lt;/p&gt;
+&lt;p&gt;- Quick Pick:&lt;/p&gt;
+&lt;p&gt;Boulchans lottery results:&lt;/p&gt;
+&lt;p&gt;+ Buy 1 ticket:&lt;span style=color: #ff0000;"&gt; *5555*3&lt;/span&gt;*XX*Bet# Send&lt;/p&gt;
+&lt;p&gt;+ Buy 2-5 tickets: &lt;span style="color: #ff0000;"&gt;*5555*3&lt;/span&gt;*XX*Bet1*XX*Bet2*XX*Bet3# Send&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; X from 0-9 and &lt;span style="color: #ff0000;"&gt;2 digits&lt;/span&gt;&lt;/p</value>
+  </data>
+  <data name="q1" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;1. How to buy tickets, Quick pick and multil tickets (2-5 tickets same time)?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q2" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;2. How do I know if my ticket is a winner or a loser?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q3" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;3. How I can receive the winning money?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q4" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;4. How I can check my winning money?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q5" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;5. How I can withdraw the winning money?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q6" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;6. How to change the language?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q7" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;7. How to Play Natcom Lotto on Natcash account?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q8" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;8. You need a online support?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q9" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;9. Definitions &amp; Conditions about Natcom Lotto&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+</root>

+ 370 - 0
website_natcash/Languages/Question.resx

@@ -0,0 +1,370 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="a1" xml:space="preserve">
+    <value>&lt;p&gt;1.1 A ki kont mwen ka jwe nan Natcom Lotto?&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Jwe ak yon prensipal, fe *5555# oswa sou sitweb/aplikasyon htttps://lotto.natcom.com.ht&lt;/li&gt;
+&lt;li&gt;Jwe ak kont prensipal &amp;ndash; Natcash, fe *202#&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;1.2 Ki kantite minimom ak maksimom ou ka achte yon tike?&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Maksimom: 5000 HTG&lt;/li&gt;
+&lt;li&gt;Minimom: 1 HTG&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;1.3 Rezilta Lotri Nouyok:&lt;/p&gt;
+&lt;p&gt;&lt;span style=color: #ff0000;"&gt;B&amp;ograve;L&amp;egrave;t&lt;/span&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Achte 1 tike: *5555*1*XX*Paryaj# Voye&lt;/li&gt;
+&lt;li&gt;Achte 2-5 tike: *5555*1*XX*Paryaj1*XX*Paryaj2*XX*Paryaj3# Voye&lt;em&gt;(X soti nan 0-9 ak 2 chif)&lt;/em&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;span style="color: #ff0000;"&gt;Maryaj:&lt;/span&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Achte 1 tike: *5555*1*XXXX*Pari#&lt;/li&gt;
+&lt;li&gt;Achte 2-5 tike: *5555*1*XXXX*Paryaj1*XXXX*Paryaj2*XXXX*Paryaj3# Voye&lt;em&gt;(X soti nan 0-9 ak 4 chif)&lt;/em&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;span style="color: #ff0000;"&gt;Lotto3:&lt;/span&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Achte 1 tike: *5555*1*XXX*Pari#&lt;/li&gt;
+&lt;li&gt;Achte 2-5 tike: *5555*1*XXX*Paryaj1*XXX*Paryaj2*XXX*Paryaj3# Voye&lt;em&gt;(X soti nan 0-9 ak 3 chif)&lt;/em&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;1.4 Rezilta Lotri Florida&lt;/p&gt;
+&lt;p&gt;&lt;span style="color: #0000ff;"&gt;B&amp;ograve;L&amp;egrave;t&lt;/span&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Achte 1 tike: *5555*2*XX*Bet#&lt;/li&gt;
+&lt;li&gt;Achte 2-5 tike: *5555*2*XX*Paryaj1*XX*Bet2*XX*Paryaj3&lt;strong&gt;#&lt;/strong&gt; Voye&lt;em&gt;(X soti nan 0-9 ak 2 chif)&lt;/em&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;Maryaj:&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Achte 1 tike: *5555*2*XXXX*Bet#&lt;/li&gt;
+&lt;li&gt;Achte 2-5 tike: *5555*2*XXXX*Paryaj1*XXXX*Paryaj2*XXXX*Paryaj3# Voye&lt;em&gt;(X soti nan 0-9 ak 4 chif)&lt;/em&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;span style="color: #0000ff;"&gt;Lotto3:&lt;/span&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Achte 1 tike: *5555*2*XXX*Paryaj# Voye&lt;/li&gt;
+&lt;li&gt;Achte 2-5 tike: *5555*2*XXX*Paryaj1*XXX*Paryaj2*XXX*Paryaji3# Voye&lt;em&gt;(X soti nan 0-9 ak 3 chif)&lt;/em&gt;&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;Rezilta Lotri 1.5 Boulchans&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Achte 1 tike: *5555*3*XX*Pari#&lt;/li&gt;
+&lt;li&gt;Achte 2-5 tike: *5555*3*XX*Paryaj1*XX*Paryaj2*XX*Paryaj3&lt;strong&gt;#&lt;/strong&gt; Voye&lt;em&gt;(X soti nan 0-9 ak 2 chif)&lt;/em&gt;&lt;/li&gt;
+&lt;/ul&gt;</value>
+  </data>
+  <data name="a2" xml:space="preserve">
+    <value>Apre chak tiraj, sistem nan voye yon SMS otomatikman bay chak ganyan. Jwe ki pa genyen tike PA P RESEVWA SMS.</value>
+  </data>
+  <data name="a3" xml:space="preserve">
+    <value>Lajan ganyan an ap direkteman sou kont Natcom loto nan kek minit apre le tiraj la (nomalman nan 5 minit). Ganyan yo ka verifye kantite lajan an le yo fe *5555*5#.</value>
+  </data>
+  <data name="a4" xml:space="preserve">
+    <value>Wi, ou kapab. Fe *5555*5#  oswa telechaje aplikasyon NatcomID la =&gt; Natcom Lotto oswa vizite sitweb la: htttps://lotto.natcom.com.ht</value>
+  </data>
+  <data name="a5" xml:space="preserve">
+    <value>&lt;p&gt;Wi, ou ka transfere kantite lajan ou te genyen an sou kont prensipal ou ak oswa - kont Natcash epi retire lajan kach nan kay ajan Natcash&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Pou transfere apati ussd, fe *5555*5# Voye&lt;/li&gt;
+&lt;li&gt;Oubyen sou aplikasyon Natcom Lotto: Klike sou "Retire Lajan" epi swiv etap yo&lt;/li&gt;
+&lt;li&gt;Not: Ou ka retire yon maksimom 40,000 HTG pa jou&lt;/li&gt;
+&lt;/ul&gt;</value>
+  </data>
+  <data name="a6" xml:space="preserve">
+    <value>Sou sitweb la: Chwazi lang sou paj koneksyon an.
+Sou USSD: Fe *5555# epi chwazi Opsyon 8 la.</value>
+  </data>
+  <data name="a7" xml:space="preserve">
+    <value>&lt;p&gt;Wi, ou ka achte Bolet, Maryaj, Lotto3 pou tou de Lotri New York ak Florida sou kont Nacash:&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Via USSD: Fe *202# epi Opsyon 6&lt;/li&gt;
+&lt;li&gt;Apati aplikasyon Natcash&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; Si ou pa gen yon kont Natcash, ou ka kreye yon kont le w fe *202# epi swiv enstriksyon yo oswa vizite nenpot Showroom ak ajan Natcom&lt;/p&gt;</value>
+  </data>
+  <data name="a8" xml:space="preserve">
+    <value>Natcom:&lt;/p&gt;
+&lt;ul&gt;
+&lt;ul&gt;
+&lt;li&gt;Rele yon ajan sant apel 111 (1htg/min)&lt;/li&gt;
+&lt;li&gt;Tchat: WhatsApp +509 33 25 1111 ; Facebook: NATCOM S.A&lt;/li&gt;
+&lt;li&gt;Oswa voye yon imel nan: vas.department@natcom.com.ht&lt;/li&gt;
+&lt;/ul&gt;
+&lt;/ul&gt;</value>
+  </data>
+  <data name="a9" xml:space="preserve">
+    <value>&lt;p&gt;9.1 Ki moun ki ka jwe Natcom Lotto?&lt;/p&gt;
+&lt;p&gt;- Nenpot moun ki poko gen 18 an pa gen dwa jwe Natcom Lotto&lt;/p&gt;
+&lt;p&gt;9.2 Obligasyon ganyan an?&lt;/p&gt;
+&lt;p&gt;- Le jwe a jwe Natcom Lotto, li aksepte ke Natcom, san avetisman alavans, ka, gen dwa, itilize non li ak imaj li pou rezon pwomosyonel pandan nenpot kanpay piblisite. Gayan an, san okenn lot konpansasyon pou peye li pou rezon sa a.&lt;/p&gt;
+&lt;p&gt;9.3 Dat limit pou reklame tike?&lt;/p&gt;
+&lt;p&gt;- Tout pri yo dwe reklame nan 90 jou apre dat tiraj la. Apre peryod sa a, Natcom Lotto refize tout responsablite pou peman montan sa a, ki pral ajoute nan Gran Pri yo. Nan yon ka konsa, jwe a dako pou yo prive l de tout dwa ki gen rapo ak tike ganyan sa a.&lt;/p&gt;</value>
+  </data>
+  <data name="h1" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;Peman:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;1ye Lot: genyen 50 fwa (50x) parye ou a&lt;/p&gt;
+&lt;p&gt;2yem Lot: genyen 20 fwa (20x) parye ou a&lt;/p&gt;
+&lt;p&gt;3yem Lot: Genyen 10 fwa (10x) parye ou a&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Le tiraj la:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Rezilta NewYork: 14:30 (Midi), 22:30 (Aswe), nimewo ganyan yo: NUMBERS ak Win4&lt;/p&gt;
+&lt;p&gt;- Not: Tike yo ap deplase nan pwochen sek la 30’ anvan chak le tiraj la&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Egzanp:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Rezilta NewYork nan dat 14/03/2022 (Le tiraj la: 14:30):&lt;/p&gt;
+&lt;ul style="list-style-type: square;"&gt;
+&lt;li&gt;Tiraj: NIMEWO: 139; Win4: 3505&lt;/li&gt;
+&lt;li&gt;Nimewo gayan B&amp;ograve;l&amp;egrave;t New York: 1ye Lo: 39; 2yem Lo: 35; 3yem Lo: 05&lt;/li&gt;
+&lt;/ul&gt;</value>
+  </data>
+  <data name="h2" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;Peman:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;Genyen 1000 fwa (1000x) parye ou&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Le tiraj la:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Rezilta NewYork: 14:30 (Midi), 22:30 (Aswe)&lt;/p&gt;
+&lt;p&gt;- Not: Tike yo ap deplase nan pwochen sek la 30’ anvan chak le tiraj la&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Nimewo gayan yo:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Konbine 2 nimewo gayan pe Bol&amp;egrave;t NewYork&lt;/p&gt;
+</value>
+  </data>
+  <data name="h3" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;Peman:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;Genyen 500 fwa (500x) parye ou&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Le tiraj la:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Rezilta NewYork: 14:30 (Midi), 22:30 (Aswe)&lt;/p&gt;
+&lt;p&gt;- Not: Tike yo ap deplase nan pwochen sek la 30’ anvan chak le tiraj la&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Nimewo gayan yo:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Tiraj NewYork: NIMEWO&lt;/p&gt;</value>
+  </data>
+  <data name="h4" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;Peman:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;1ye Lot: genyen 50 fwa (50x) parye ou&lt;/p&gt;
+&lt;p&gt;2yem Lot: genyen 20 fwa (20x) parye ou&lt;/p&gt;
+&lt;p&gt;3yem Lot: Genyen 10 fwa (10x) parye ou&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Le tiraj la:&lt;/strong&gt;&lt;/p&gt;
+&lt;ul&gt;
+&lt;li&gt;Rezilta Florid: 13:30 (Midi), 21:45 (Aswe), nimewo gayan yo: Pick3 ak Pick4&lt;/li&gt;
+&lt;li&gt;Not: Tike yo ap deplase nan pwochen sek la 30’ anvan chak le tiraj la&lt;/li&gt;
+&lt;/ul&gt;
+&lt;p&gt;&lt;strong&gt;Egzanp:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Rezilta Florid nan dat 14/03/2022 (Le tiraj la: 13:30):&lt;/p&gt;
+&lt;ul style=list-style-type: square;"&gt;
+&lt;li&gt;Tiraj: PICK3: 462; PICK4: 0453&lt;/li&gt;
+&lt;li&gt;Nimewo gayan Bol&amp;egrave;t Florida yo: 1ye Lo: 62; 2yem Lo: 04; 3yem Lo: 53&lt;/li&gt;
+&lt;/ul&gt;</value>
+  </data>
+  <data name="h5" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;Peman:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;Genyen 1000 fwa (1000x) parye ou&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Le tiraj la:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Rezilta Florid: 13:30 (Midi), 21:45 (Aswe)
+&lt;/p&gt;
+&lt;p&gt;- Not: Tike yo ap deplase nan pwochen sek la 30’ anvan chak le tiraj la&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Nimewo gayan yo:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Konbine 2 nimewo gayan pe Bel&amp;egrave;t Florida&lt;/p&gt;</value>
+  </data>
+  <data name="h6" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;Peman:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;Genyen 500 fwa (500x) parye ou&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Le tiraj la:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Rezilta Florid: 13:30 (Midi), 21:45 (Aswe)&lt;/p&gt;
+&lt;p&gt;- Not: Tike yo ap deplase nan pwochen sek la 30’ anvan chak le tiraj&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Nimewo gayan yo:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Tiraj Florid: PICK3&lt;/p&gt;</value>
+  </data>
+  <data name="h7" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;Peman: &lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;1ye pri: Genyen 40 fwa (40x) parye ou&lt;/p&gt;
+&lt;p&gt;2n pri - 11yem pri: Genyen 4 fwa (4x) parye ou&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Le tiraj la:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Rezilta chak 30 minit epi tann rezilta a nan 10 minit&lt;/p&gt;
+&lt;p&gt;Egzanp:&lt;/p&gt;
+&lt;p&gt;- Le tiraj la komanse: 0:00&lt;/p&gt;
+&lt;p&gt;- Le tiraj la fini: 0:30&lt;/p&gt;
+&lt;p&gt;- Tann sistem nan tire loto a epi voye rezilta a nan 10 minit. Kliyan an ap resevwa rezilta a soti 0:30:01 – 0:40:00&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Nimewo gayan yo:&lt;/strong&gt;&lt;/p&gt;
+&lt;p&gt;- Tiraj la fet pa sistem loto Natcom, gen ladan 2 nimewo.&lt;/p&gt;</value>
+  </data>
+  <data name="p1" xml:space="preserve">
+    <value>&lt;p&gt;- Jwe ak balans prensipal ou: *5555# ak entenet/aplikasyon loto Natcom&lt;/p&gt;
+&lt;p&gt;- Jwe ak kont Natcash ou: *202# ak opsyon 6&lt;/p&gt;
+&lt;p&gt;- Chwa rapid:&lt;/p&gt;
+&lt;p&gt;Rezilta lotri New York:&lt;/p&gt;
+&lt;p&gt;+ Achte 1 tike: &lt;span style=color: #ff0000;"&gt;*5555*1&lt;/span&gt;*XX*Pari# Voye&lt;/p&gt;
+&lt;p&gt;+ Achte 2-5 tike: &lt;span style="color: #ff0000;"&gt;*5555*1&lt;/span&gt;*XX*Paryaj1*XX*Paryaj2*XX*Paryaj3# Voye&lt;/p&gt;
+&lt;p&gt;Rezilta lotri Florida:&lt;/p&gt;
+&lt;p&gt;+ Achte 1 tike: &lt;span style="color: #ff0000;"&gt;*5555*2&lt;/span&gt;*XX*Pari# Voye&lt;/p&gt;
+&lt;p&gt;+ Achte 2-5 tike: *5555*2*XX*Paryaj1*XX*PParyaj2*XX*Paryaj3# Voye&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; Yon X soti nan 0-9 epi &lt;span style="color: #ff0000;"&gt;2 chif&lt;/span&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="p2" xml:space="preserve">
+    <value>&lt;p&gt;- Jwe ak balans prensipal ou: *5555# ak entenet/aplikasyon loto Natcom&lt;/p&gt;
+&lt;p&gt;- Jwe ak kont Natcash ou: *202# ak opsyon 6&lt;/p&gt;
+&lt;p&gt;- Chwa rapid:&lt;/p&gt;
+&lt;p&gt;Rezilta lotri New York:&lt;/p&gt;
+&lt;p&gt;+ Achte 1 tike:&lt;span style=color: #ff0000;"&gt; *5555*1&lt;/span&gt;*XXXX*Paryaj# Voye&lt;/p&gt;
+&lt;p&gt;+ Achte 2-5 tike: &lt;span style="color: #ff0000;"&gt;*5555*1&lt;/span&gt;*XXXX*Paryaj1*XXXX*Paryaj2*XXXX*Paryaj3# Voye&lt;/p&gt;
+&lt;p&gt;Rezilta lotri Florida:&lt;/p&gt;
+&lt;p&gt;+ Achte 1 tike: &lt;span style="color: #ff0000;"&gt;*5555*2&lt;/span&gt;*XXXX*Pari# Voye&lt;/p&gt;
+&lt;p&gt;+ Achte 2-5 tike: &lt;span style="color: #ff0000;"&gt;*5555*2&lt;/span&gt;*XXXX*Pari1*XXXX*Pariyaj*XXXX*Paryaj3# Voye&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; X soti nan 0-9 ak &lt;span style="color: #ff0000;"&gt;4 chif&lt;/span&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="p3" xml:space="preserve">
+    <value>&lt;p&gt;- Jwe ak balans prensipal ou: *5555# ak entenet/aplikasyon loto Natcom&lt;/p&gt;
+&lt;p&gt;- Jwe ak kont Natcash ou: *202# ak opsyon 6&lt;/p&gt;
+&lt;p&gt;- Chwa rapid:&lt;/p&gt;
+&lt;p&gt;Rezilta lotri New York:&lt;/p&gt;
+&lt;p&gt;+ Achte 1 tike:&lt;span style=color: #ff0000;"&gt; *5555*1&lt;/span&gt;*XXX*Pari# Voye&lt;/p&gt;
+&lt;p&gt;+ Achte 2-5 tike: &lt;span style="color: #ff0000;"&gt;*5555*1&lt;/span&gt;*XXX*Paryaj1*XXX*Paryaj2*XXX*Paryaj3# Voye&lt;/p&gt;
+&lt;p&gt;Rezilta lotri Florida:&lt;/p&gt;
+&lt;p&gt;+ Achte 1 tike: &lt;span style="color: #ff0000;"&gt;*5555*2&lt;/span&gt;*XXX*Paryaj# Voye&lt;/p&gt;
+&lt;p&gt;+ Achte 2-5 tike: &lt;span style="color: #ff0000;"&gt;*5555*2&lt;/span&gt;*XXX*Paryaj1*XXX*Paryaj2*XXX*Paryaj3# Voye&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; Yon X soti nan 0-9 epi &lt;span style="color: #ff0000;"&gt;3 chif&lt;/span&gt;&lt;/p&gt;"</value>
+  </data>
+  <data name="p4" xml:space="preserve">
+    <value>&lt;p&gt;- Jwe ak balans prensipal ou: *5555# ak loto entenet/aplikasyon Natcom&lt;/p&gt;
+&lt;p&gt;- Chwa rapid:&lt;/p&gt;
+&lt;p&gt;Rezilta lotri Boulchans:&lt;/p&gt;
+&lt;p&gt;+ Achte 1 tike:&lt;span style=color: #ff0000;"&gt; *5555*3&lt;/span&gt;*XX*Pari# Voye&lt;/p&gt;
+&lt;p&gt;+ Achte 2-5 tike: &lt;span style="color: #ff0000;"&gt;*5555*3&lt;/span&gt;*XX*Paryaj1*XX*Paryaj2*XX*Paryaj3# Voye&lt;/p&gt;
+&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; Mete yon X soti nan 0-9 epi &lt;span style="color: #ff0000;"&gt;2 chif&lt;/span&gt;&lt;/p</value>
+  </data>
+  <data name="q1" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;1. Kijan pou achte tike, chwazi tike rapid ak tike miltip (2-5 tike an menm tan)?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q2" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;2. Kijan m ka konnen si tike mwen an genyen oswa pedi?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q3" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;3. Kijan m ka resevwa lajan kem genyen an?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q4" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;4. Kijan m ka verifye lajan mwen genyen an?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q5" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;5. Kijan mwen ka retire lajan mwen te genyen an?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q6" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;6. Kijan pou chanje lang nan?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q7" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;7. Kijan pou jwe loto Natcom sou kont Natcash?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q8" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;8. Ou bezwen sipo an direk?&lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+  <data name="q9" xml:space="preserve">
+    <value>&lt;p&gt;&lt;strong&gt;9. Definisyon ak Kondisyon konsenan Natcom Loto &lt;/strong&gt;&lt;/p&gt;</value>
+  </data>
+</root>

+ 68 - 0
website_natcash/LotteryWebAppNatcash.csproj

@@ -0,0 +1,68 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>net7.0</TargetFramework>
+    <CopyRefAssembliesToPublishDirectory>false</CopyRefAssembliesToPublishDirectory>
+    <UserSecretsId>67c9c22c-cd93-4598-8c46-ffa318b90e19</UserSecretsId>
+    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
+    <DockerfileContext>.</DockerfileContext>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Grpc.AspNetCore" Version="2.40.0" />
+    <PackageReference Include="log4net" Version="2.0.14" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.9" />
+    <PackageReference Include="Microsoft.Extensions.ApiDescription.Client" Version="3.0.0">
+      <PrivateAssets>all</PrivateAssets>
+      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+    </PackageReference>
+    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.22" />
+    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.14.0" />
+    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.5" />
+    <PackageReference Include="Nancy" Version="2.0.0" />
+    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
+    <PackageReference Include="NSwag.ApiDescription.Client" Version="13.0.5">
+      <PrivateAssets>all</PrivateAssets>
+      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+    </PackageReference>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Update="Languages\Lang.Designer.cs">
+      <DesignTime>True</DesignTime>
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Lang.resx</DependentUpon>
+    </Compile>
+    <Compile Update="Languages\Question.Designer.cs">
+      <DesignTime>True</DesignTime>
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Question.resx</DependentUpon>
+    </Compile>
+    <Compile Update="Languages\Question.en.Designer.cs">
+      <DesignTime>True</DesignTime>
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Question.en.resx</DependentUpon>
+    </Compile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <EmbeddedResource Update="Languages\Lang.fr.resx">
+    </EmbeddedResource>
+    <EmbeddedResource Update="Languages\Lang.resx">
+      <Generator>PublicResXFileCodeGenerator</Generator>
+      <LastGenOutput>Lang.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <EmbeddedResource Update="Languages\Question.en.resx">
+      <Generator>PublicResXFileCodeGenerator</Generator>
+      <LastGenOutput>Question.en.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <EmbeddedResource Update="Languages\Question.fr.resx">
+      <Generator>PublicResXFileCodeGenerator</Generator>
+    </EmbeddedResource>
+    <EmbeddedResource Update="Languages\Question.resx">
+      <Generator>PublicResXFileCodeGenerator</Generator>
+      <LastGenOutput>Question.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+  </ItemGroup>
+
+</Project>

+ 25 - 0
website_natcash/Models/AccountViewModel.cs

@@ -0,0 +1,25 @@
+namespace LotteryWebApp.Models
+{
+    public class AccountIndex_ViewModel
+    {
+    }
+
+    public class AccountLogin_ViewModel
+    {
+        public string code { get; set;}
+        public string step { get; set; }
+        public string message { get; set; }
+        public string phonenumber { get; set; }
+    }
+
+    public class AccountRegister_ViewModel
+    {
+        public string code { get; set; }
+    }
+
+    public class AccountForgotPassword_ViewModel
+    {
+        public string code { get; set; }
+
+    }
+}

+ 35 - 0
website_natcash/Models/BuyTicketViewModel.cs

@@ -0,0 +1,35 @@
+using LotteryWebApp.Service;
+using System.Collections.Generic;
+
+namespace LotteryWebApp.Models
+{
+    public class BuyTicket_ViewModel
+    {
+        public string termType { get; set; }
+    }
+
+    public class BuyTicketChoose_ViewModel
+    {
+        public string ticketType { get; set;}
+    }
+
+    public class BuyTicketPayment_ViewModel
+    {
+        public string code { get; set; }
+        public string step { get; set; }
+        public string tickets { get; set; }
+        public string ticketType { get; set; }
+        public ConfirmTicketDataResponse confirmTicketDataResponse { get; set; }
+        public ConfirmBuyingTicketResponse confirmBuyingTicketResponse { get; set; }
+
+        public Profile profile { get; set; }
+        public string termType { get; set;}
+    }
+
+    public class LastTermResult_ViewModel
+    {
+        public List<Term> listTermNotDrawn { get; set; }
+        public List<Term> listTerm { get; set; }
+        public string termType { get; set; }
+    }
+}

+ 11 - 0
website_natcash/Models/ErrorViewModel.cs

@@ -0,0 +1,11 @@
+using System;
+
+namespace LotteryWebApp.Models
+{
+    public class ErrorViewModel
+    {
+        public string RequestId { get; set; }
+
+        public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
+    }
+}

+ 27 - 0
website_natcash/Models/HistoryViewModel.cs

@@ -0,0 +1,27 @@
+using LotteryWebApp.Service;
+using System.Collections.Generic;
+
+namespace LotteryWebApp.Models
+{
+    public class History_ViewModel
+    {
+        public string winType { get; set; }
+        public string gameId { get; set; }
+    }
+
+    public class HistoryUserTicket_ViewModel
+    {
+        public string winType { get; set; }
+        public string gameId { get; set; }
+        public List<Ticket> tickets { get; set; }
+    }
+
+    public class HistoryTicketDetail_ViewModel
+    {
+        public Ticket ticket { get; set; }
+        public string winType { get; set; }
+        public string msisdn { get; set; }
+        public string type { get; set; }
+
+    }
+}

+ 79 - 0
website_natcash/Models/HomeViewModel.cs

@@ -0,0 +1,79 @@
+using LotteryWebApp.Service;
+using System;
+using System.Collections.Generic;
+
+namespace LotteryWebApp.Models
+{
+    public class HomeIndex_ViewModel
+    {
+        public string termType { get; set; }
+        public Profile profile { get; set; }
+        public UserStatus userStatus { get; set; }
+        public List<Term> listTerm { get; set; }
+        public String uuid { get; set; }
+        public String subDomain { get; set; }
+        public String topWinner { get; set; }
+        public DateTime serverTime { get; set; }
+        public double secondsUntilDraw { get; set; }
+        public string bolet { get; set; }
+        public string lastResult { get; set; }
+        public string lastResultDate { get; set; }
+        public string nextRoundDate { get; set; }
+    }
+
+    public class HomeTransfer_ViewModel
+    {
+        public string step { get; set; }
+        public string code { get; set; }
+        public string walletType { get; set; }
+        public Profile profile { get; set; }
+        public UserStatus userStatus { get; set; }
+        public Transaction transaction { get; set; }
+        public TransferMoneyRequest transferData { get; set; }
+        public DateTime serverTime { get; set; }
+    }
+
+    public class HomeRules_ViewModel
+    {
+        public string termType { get; set; }
+        public DateTime serverTime { get; set; }
+    }
+    public class HomeFAQ_ViewModel
+    {
+        public DateTime serverTime { get; set; }
+    }
+
+    public class HomeResults_ViewModel
+    {
+        public string termType { get; set; }
+        public string fromDate { get; set; }
+        public string toDate { get; set; }
+        public DateTime serverTime { get; set; }
+    }
+    public class TermResultModel
+    {
+        public List<Term> listTerm { get; set; }
+        public string termType { get; set; }
+        public DateTime serverTime { get; set; }
+    }
+
+    public class TermResultHistoryModel
+    {
+        public List<Term> listTerm { get; set; }
+        public string termType { get; set; }
+        public string fromDate { get; set; }
+        public string toDate { get; set; }
+        public DateTime serverTime { get; set; }
+    }
+
+    public class UserTicketHistoryModel
+    {
+        public List<Ticket> listTicket { get; set; }
+        public string termType { get; set; }
+        public string status { get; set; }
+        public string totalPage { get; set; }
+        public string seqPage { get; set; }
+        public DateTime serverTime { get; set; }
+    }
+
+}

+ 18 - 0
website_natcash/Models/PartialViewModel.cs

@@ -0,0 +1,18 @@
+using LotteryWebApp.Service;
+
+namespace LotteryWebApp.Models
+{
+    public class PartialInform_ViewModel
+    {
+        public string message { get; set; }
+    }
+
+    public class PartialTransaction_ViewModel
+    {
+        public string content { get; set; }
+        public string confirmFunc { get; set; }
+        public string resentFunc { get; set; }
+        public string cancelFunc { get; set; }
+
+    }
+}

+ 30 - 0
website_natcash/Models/ProfileViewModel.cs

@@ -0,0 +1,30 @@
+using LotteryWebApp.Service;
+
+namespace LotteryWebApp.Models
+{
+    public class ProfileViewModel
+    {
+        public Profile profile { get; set; }
+        public UserStatus userStatus { get; set; }
+        public string channel { get; set; }
+
+
+    }
+    public class ProfileChangePassword_ViewModel
+    {
+        public string code { get; set; }
+    }
+    public class ProfileProfileInfo_ViewModel
+    {
+        public string code { get; set; }
+        public Profile profile { get; set; }
+        public UserStatus userStatus { get; set; }
+
+
+    }
+
+    public class ProfileHowToPlay_ViewModel
+    {
+        public string termType { get; set; }
+    }
+}

+ 12 - 0
website_natcash/Models/RewardHistoryViewModel.cs

@@ -0,0 +1,12 @@
+using System.Collections.Generic;
+using LotteryWebApp.Service;
+
+namespace LotteryWebApp.Models
+{
+    public class RewardHistoryModel
+    {
+        public List<Transaction> list { get; set; } = new List<Transaction>();
+        public string totalPage { get; set; } = "0";
+        public string seqPage { get; set; } = "1";
+    }
+}

+ 42 - 0
website_natcash/Program.cs

@@ -0,0 +1,42 @@
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Threading.Tasks;
+using System.Xml;
+
+namespace LotteryWebApp
+{
+    public class Program
+    {
+        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
+
+        public static void Main(string[] args)
+        {
+            XmlDocument log4netConfig = new XmlDocument();
+            log4netConfig.Load(File.OpenRead("log4net.config"));
+
+            var repo = log4net.LogManager.CreateRepository(
+                Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
+
+            log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);
+
+            log.Info("Application - Main is invoked");
+
+            CreateHostBuilder(args).Build().Run();
+        }
+
+        public static IHostBuilder CreateHostBuilder(string[] args) =>
+            Host.CreateDefaultBuilder(args)
+                .ConfigureWebHostDefaults(webBuilder =>
+                {
+                    webBuilder.UseStartup<Startup>()
+                    .UseUrls("http://localhost:8800");
+                });
+    }
+}

+ 12 - 0
website_natcash/Properties/launchSettings.json

@@ -0,0 +1,12 @@
+{
+  "profiles": {
+    "LotteryWebAppNatcash": {
+      "commandName": "Project",
+      "launchBrowser": true,
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      },
+      "applicationUrl": "https://localhost:60041;http://localhost:60042"
+    }
+  }
+}

+ 5 - 0
website_natcash/Rsa/Policy.txt

@@ -0,0 +1,5 @@
+{ 
+   "Statement": [{ 
+      "Resource":"RESOURCE"
+   }] 
+}

+ 10 - 0
website_natcash/Rsa/private-rsa-key.xml

@@ -0,0 +1,10 @@
+<RSAKeyValue>
+	<D>kkFXJqBENrjtEaGF8oQKhD3G/FTfbN4UheVQzrdoMr6wD6xy5xP6mB8wJHRm7HpLY2isD42WJ49l4NeMZeUK0WlUutWirKlrFpgNBUwopGSdAlrCX9LMV14kZPVIfURv16rlICRW9WSkm56EGzdzP6aIL/gN1wlTzeCw8Y+vEJS1ZTN6FC/SWrF5CPtGFIa8kSQyAsEheNXOXkGBA5/DuumYSsYJuLqhp578QblopyWtdD1zeQ5Wwa8uEo+uML9yZLxK1dJaZIui1IpajU04m7L7LCBLMgKTRnXDSZtONu22oQgTN5AYksnCP2EYIxhT35eBtgsgZDJ1tWqY+3FcsQ==</D>
+	<DP>TGSWeKJKgx6jyS9qVUhSMxHG4jav4iCA2kT1iJk3y58gAgPJxKnor2U152uONxY9cE85By6bBkgrKC5TO3WAAXKRH5j5YLTS1aenuQNQEYk2M799l+qqPjxAeb3UbWJ0PYeS4UqzlJ/96TgQoGHDr7Hh0CBH/2xGJHCG3+jyQXU=</DP>
+	<DQ>dYQQjk9xOTdzckYLXNcPskaXq1MMVSpLxPtBezG/dE1uNK7LpKKVyJhQRw7iaadQouKev3OmLKifmhnmVP5t87rsymINu7RHGkVTuoAwUWid5upYNt4+1nrpjgGyK3cQr9rdG4JDyOMVYIdtG3/az8AryD4Y2GU6PWxl0emhJoE=</DQ>
+	<Exponent>AQAB</Exponent>
+	<InverseQ>nj7yF6LTnff4KZDWQNqJ9Y5GQ/BFXxuCWtC7YzoNJAynbDN1Xa7NYQ2W/6kO1IBHs1L+jjTHsBZjGuKX1dMRw/Z52tajekqIrfbz4eBuzR/sp3NNHw8hGtroGGkotofqAPr+n8LpezfgDbTc21z7djkTCiKFOYeT4voaEb4EBrc=</InverseQ>
+	<Modulus>yM2QCmwy4RUu1Uq0f8exh4EmHwTmiOqF55Nm5U3KZwdtQhCYrEFaN8OMkE/c/qTyAvXyYQmF8Wu64dtHzC3eYEdBGP5o72LBAXGDJ8Sb9ecZ+9vFaAnu6gkYLrtfFEQ+1YdQaJDiKJXgOw2hpBipbL13D/5xlagrHVwpwhIhZw0pjjMQPuUz86XHJxvwzMIsu7/0bV84zASkfJ1Cy071hjFrWHhCS9C6Kk4kXq72GqFbPMFIA6Nrdpk0nTgJRo+kG4Q66KQIuMbo38Zo13nz84NHH2VtZSrOIFprB8w4UIg6FZNziUA7urPeLdMTWyoqgOAHQLxgGsPjh6Yy3+ponw==</Modulus>
+	<P>469UaI5B7zmyk9K6xaU1TW6QtlW78wMG18wewOV+zgfjmzkOSkvyLyxEXsjM1w9K1Knx5PZrv0KTOyvTdFlQBxu//kE7GojuFpdvLdL1E+9HXbpHaACtVt47+v9Wns9F6T++6C/WFI4cWeaSWPNqZEHpjdCGTQEruYaoPBJTpGU=</P>
+	<Q>4cZo1+UZhVkw0s2M/WBk7uBf9FAlw+RjxuWhyhxMLEjIyAXEG7lanthSXeR0LTih8A3w4tb5/6F5Dlw4jAsRqtA2y0dD8hYdaFGEFM1o1maos7G0XKBXz3FZ4hDP1B8wzWo+XeTblLRW9iE+OIhVIVfchVuBXprL6EZjaNJGPrM=</Q>
+</RSAKeyValue>

+ 3 - 0
website_natcash/Rsa/private.pem

@@ -0,0 +1,3 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDIzZAKbDLhFS7VSrR/x7GHgSYfBOaI6oXnk2blTcpnB21CEJisQVo3w4yQT9z+pPIC9fJhCYXxa7rh20fMLd5gR0EY/mjvYsEBcYMnxJv15xn728VoCe7qCRguu18URD7Vh1BokOIoleA7DaGkGKlsvXcP/nGVqCsdXCnCEiFnDSmOMxA+5TPzpccnG/DMwiy7v/RtXzjMBKR8nULLTvWGMWtYeEJL0LoqTiRervYaoVs8wUgDo2t2mTSdOAlGj6QbhDropAi4xujfxmjXefPzg0cfZW1lKs4gWmsHzDhQiDoVk3OJQDu6s94t0xNbKiqA4AdAvGAaw+OHpjLf6mifAgMBAAECggEBAJJBVyagRDa47RGhhfKECoQ9xvxU32zeFIXlUM63aDK+sA+scucT+pgfMCR0Zux6S2NorA+NliePZeDXjGXlCtFpVLrVoqypaxaYDQVMKKRknQJawl/SzFdeJGT1SH1Eb9eq5SAkVvVkpJuehBs3cz+miC/4DdcJU83gsPGPrxCUtWUzehQv0lqxeQj7RhSGvJEkMgLBIXjVzl5BgQOfw7rpmErGCbi6oaee/EG5aKclrXQ9c3kOVsGvLhKPrjC/cmS8StXSWmSLotSKWo1NOJuy+ywgSzICk0Z1w0mbTjbttqEIEzeQGJLJwj9hGCMYU9+XgbYLIGQydbVqmPtxXLECgYEA469UaI5B7zmyk9K6xaU1TW6QtlW78wMG18wewOV+zgfjmzkOSkvyLyxEXsjM1w9K1Knx5PZrv0KTOyvTdFlQBxu//kE7GojuFpdvLdL1E+9HXbpHaACtVt47+v9Wns9F6T++6C/WFI4cWeaSWPNqZEHpjdCGTQEruYaoPBJTpGUCgYEA4cZo1+UZhVkw0s2M/WBk7uBf9FAlw+RjxuWhyhxMLEjIyAXEG7lanthSXeR0LTih8A3w4tb5/6F5Dlw4jAsRqtA2y0dD8hYdaFGEFM1o1maos7G0XKBXz3FZ4hDP1B8wzWo+XeTblLRW9iE+OIhVIVfchVuBXprL6EZjaNJGPrMCgYBMZJZ4okqDHqPJL2pVSFIzEcbiNq/iIIDaRPWImTfLnyACA8nEqeivZTXna443Fj1wTzkHLpsGSCsoLlM7dYABcpEfmPlgtNLVp6e5A1ARiTYzv32X6qo+PEB5vdRtYnQ9h5LhSrOUn/3pOBCgYcOvseHQIEf/bEYkcIbf6PJBdQKBgHWEEI5PcTk3c3JGC1zXD7JGl6tTDFUqS8T7QXsxv3RNbjSuy6SilciYUEcO4mmnUKLinr9zpiyon5oZ5lT+bfO67MpiDbu0RxpFU7qAMFFonebqWDbePtZ66Y4Bsit3EK/a3RuCQ8jjFWCHbRt/2s/AK8g+GNhlOj1sZdHpoSaBAoGBAJ4+8hei0533+CmQ1kDaifWORkPwRV8bglrQu2M6DSQMp2wzdV2uzWENlv+pDtSAR7NS/o40x7AWYxril9XTEcP2edrWo3pKiK328+Hgbs0f7KdzTR8PIRra6BhpKLaH6gD6/p/C6Xs34A203Ntc+3Y5EwoihTmHk+L6GhG+BAa3
+-----END RSA PRIVATE KEY-----

+ 4 - 0
website_natcash/Rsa/public-rsa-key.xml

@@ -0,0 +1,4 @@
+<RSAKeyValue>
+	<Exponent>AQAB</Exponent>
+	<Modulus>yM2QCmwy4RUu1Uq0f8exh4EmHwTmiOqF55Nm5U3KZwdtQhCYrEFaN8OMkE/c/qTyAvXyYQmF8Wu64dtHzC3eYEdBGP5o72LBAXGDJ8Sb9ecZ+9vFaAnu6gkYLrtfFEQ+1YdQaJDiKJXgOw2hpBipbL13D/5xlagrHVwpwhIhZw0pjjMQPuUz86XHJxvwzMIsu7/0bV84zASkfJ1Cy071hjFrWHhCS9C6Kk4kXq72GqFbPMFIA6Nrdpk0nTgJRo+kG4Q66KQIuMbo38Zo13nz84NHH2VtZSrOIFprB8w4UIg6FZNziUA7urPeLdMTWyoqgOAHQLxgGsPjh6Yy3+ponw==</Modulus>
+</RSAKeyValue>

+ 3 - 0
website_natcash/Rsa/public.pem

@@ -0,0 +1,3 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyM2QCmwy4RUu1Uq0f8exh4EmHwTmiOqF55Nm5U3KZwdtQhCYrEFaN8OMkE/c/qTyAvXyYQmF8Wu64dtHzC3eYEdBGP5o72LBAXGDJ8Sb9ecZ+9vFaAnu6gkYLrtfFEQ+1YdQaJDiKJXgOw2hpBipbL13D/5xlagrHVwpwhIhZw0pjjMQPuUz86XHJxvwzMIsu7/0bV84zASkfJ1Cy071hjFrWHhCS9C6Kk4kXq72GqFbPMFIA6Nrdpk0nTgJRo+kG4Q66KQIuMbo38Zo13nz84NHH2VtZSrOIFprB8w4UIg6FZNziUA7urPeLdMTWyoqgOAHQLxgGsPjh6Yy3+ponwIDAQAB
+-----END PUBLIC KEY-----

+ 141 - 0
website_natcash/Service/ApiClasses.cs

@@ -0,0 +1,141 @@
+using Newtonsoft.Json.Linq;
+using System;
+
+namespace LotteryWebApp.Service
+{
+    public class Posting
+    {
+        public string serviceId { get; set; }
+        public string SV_ID { get; set; }
+        public string service_id { get; set; }
+
+    }
+
+    public class Profile
+    {
+        public String status { get; set; }
+        public String message { get; set; }
+        public String id { get; set; }
+        public String usersId { get; set; }
+        public String users { get; set; }
+        public String serviceId { get; set; }
+        public String fullName { get; set; }
+        public String picture { get; set; }
+        public String realPicture { get; set; }
+
+        public String birthday { get; set; }
+    }
+
+    public class UserStatus
+    {
+        public String status { get; set; }
+        public String message { get; set; }
+        public String id { get; set; }
+        public String msisdn { get; set; }
+        public String users { get; set; }
+        public String pass { get; set; }
+        public String serviceid { get; set; }
+        public String dateregist { get; set; }
+        public String isactive { get; set; }
+        public String channel { get; set; }
+        public String bet_coin { get; set; }
+        public String cash_coin { get; set; }
+        public String role { get; set; }
+        public String language { get; set; }
+    }
+
+    public class Service
+    {
+        public String id { get; set; }
+        public String code { get; set; }
+        public String name { get; set; }
+        public String country { get; set; }
+        public String shortCode { get; set; }
+        public String prefix { get; set; }
+    }
+
+    public class Term
+    {
+        public String id { get; set; }
+        public String seq { get; set; }
+        public String status { get; set; }
+        public String date_start { get; set; }
+        public String date_end { get; set; }
+        public String date_random { get; set; }
+        public String money_winner { get; set; }
+        public String gameId { get; set; }
+        public String result { get; set; }
+        public String split { get; set; }
+        public String countDownSeconds { get; set; }
+        public String isEvening { get; set; }
+        public String numberGame { get; set; }
+        public String win4Game { get; set; }
+        public String bolet { get; set; }
+        public String mariaj { get; set; }
+        public String lotto3 { get; set; }
+
+    }
+
+    public class Ticket
+    {
+        public String id { get; set; }
+        public String seq { get; set; }
+        public String money { get; set; }
+        public String code { get; set; }
+        public String createDate { get; set; }
+        public String termId { get; set; }
+        public String status { get; set; }
+        public String paymentCode { get; set; }
+        public String paymentMessage { get; set; }
+        public String split { get; set; }
+        public String billCode { get; set; }
+        public String channel { get; set; }
+        public String channelPayment { get; set; }
+        public String termStartDate { get; set; }
+        public String termEndDate { get; set; }
+        public String termRandomDate { get; set; }
+        public String termResult { get; set; }
+        public String isEvening { get; set; }
+        public String moneyWin { get; set; }
+        public String gameId { get; set; }
+
+    }
+
+    public class TicketInfo
+    {
+        public String code { get; set; }
+        public String money { get; set; }
+
+    }
+
+    public class Transaction
+    {
+        public String id { get; set; }
+        public String seq { get; set; }
+        public String acountSend { get; set; }
+        public String acountRecieve { get; set; }
+        public String timeRequest { get; set; }
+        public String timeTopup { get; set; }
+        public String status { get; set; }
+        public String money { get; set; }
+        public String channelRequest { get; set; }
+        public String channelPayment { get; set; }
+        public String reqeustId { get; set; }
+        public String responseId { get; set; }
+        public String errCode { get; set; }
+        public String errMsg { get; set; }
+        public String serviceId { get; set; }
+        public String responseCode { get; set; }
+        public String responseMessage { get; set; }
+    }
+
+    public class TermObj
+    {
+        public String id { get; set; }
+        public String status { get; set; }
+        public String startDate { get; set; }
+        public String endDate { get; set; }
+        public String randomDate { get; set; }
+        public String moneyWinner { get; set; }
+    }
+}

+ 17 - 0
website_natcash/Service/ApiConstants.cs

@@ -0,0 +1,17 @@
+namespace LotteryWebApp.Service
+{
+    public class ApiConstants
+    {
+        public const string WEB = "WEB";
+        public const string WALLET = "WALLET";
+
+        public const string LOGIN = "LOGIN";
+        public const string REGIST = "REGIST";
+        public const string CANCEL = "CANCEL";
+        public const string RESETPASS = "RESETPASS";
+        public const string CHANGEPASS = "CHANGEPASS";
+        public const string SERVICE_ID = "1";
+        public const string WALLET_TOKEN = "xbdIk7T0KOO+o8W3ARwiCHBy6F3SrNl4sqmFkKLWRjhbgkrZ26KiSiwOXJW2Vg10a3jGqNqFbt+YqXgoXQDpaaP5zPt71pe9YKQ4rsqwz+E=";
+
+    }
+}

+ 406 - 0
website_natcash/Service/ApiFunctions.cs

@@ -0,0 +1,406 @@
+using LotteryWebApp.Common;
+using Microsoft.Extensions.Configuration;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Net.Http.Headers;
+using System.Text;
+using System.Text.Json;
+using System.Threading.Tasks;
+using JsonSerializer = System.Text.Json.JsonSerializer;
+
+namespace LotteryWebApp.Service
+{
+
+    public class APIFunctions
+    {
+        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
+
+        public RegisterResponse UserLoginApi(IConfiguration configuration, RegisterRequest registerRequest)
+        {
+            String url = configuration.GetSection("user_register").Value;
+            registerRequest.Users = registerRequest.Msisdn;
+            registerRequest.Command = ApiConstants.LOGIN;
+            registerRequest.Channel = configuration.GetSection("channel").Value;
+            registerRequest.serviceId = ApiConstants.SERVICE_ID;
+            registerRequest.channel = configuration.GetSection("channel").Value;
+
+            string jsonData = SendPost(registerRequest, ApiConstants.SERVICE_ID, url);
+
+            RegisterResponse deptObj = JsonSerializer.Deserialize<RegisterResponse>(jsonData);
+            return deptObj;
+        }
+
+        public RegisterResponse UserForgotPasswordApi(IConfiguration configuration, RegisterRequest registerRequest)
+        {
+            String url = configuration.GetSection("user_register").Value;
+            registerRequest.Users = registerRequest.Msisdn;
+            registerRequest.Command = ApiConstants.RESETPASS;
+            registerRequest.Channel = configuration.GetSection("channel").Value;
+            registerRequest.serviceId = ApiConstants.SERVICE_ID;
+            registerRequest.channel = configuration.GetSection("channel").Value;
+
+            string jsonData = SendPost(registerRequest, ApiConstants.SERVICE_ID, url);
+
+            RegisterResponse deptObj = JsonSerializer.Deserialize<RegisterResponse>(jsonData);
+            return deptObj;
+        }
+
+        public RegisterResponse UserChangePasswordApi(IConfiguration configuration, RegisterRequest registerRequest)
+        {
+            registerRequest.Command = ApiConstants.CHANGEPASS;
+            registerRequest.Channel = configuration.GetSection("channel").Value;
+            registerRequest.Users = registerRequest.Msisdn;
+            registerRequest.serviceId = ApiConstants.SERVICE_ID;
+            registerRequest.channel = configuration.GetSection("channel").Value;
+
+            String url = configuration.GetSection("user_register").Value;
+            String jsonData = SendPost(registerRequest, ApiConstants.SERVICE_ID, url);
+            RegisterResponse deptObj = JsonSerializer.Deserialize<RegisterResponse>(jsonData);
+            return deptObj;
+        }
+
+        public RegisterResponse UserRegisterApi(IConfiguration configuration, RegisterRequest registerRequest)
+        {
+            registerRequest.Command = ApiConstants.REGIST;
+            registerRequest.Channel = configuration.GetSection("channel").Value;
+            registerRequest.Users = registerRequest.Msisdn;
+            registerRequest.serviceId = ApiConstants.SERVICE_ID;
+            registerRequest.channel = configuration.GetSection("channel").Value;
+
+
+            String url = configuration.GetSection("user_register").Value;
+            String jsonData = SendPost(registerRequest, ApiConstants.SERVICE_ID, url);
+            RegisterResponse deptObj = JsonSerializer.Deserialize<RegisterResponse>(jsonData);
+            return deptObj;
+        }
+
+        public Profile UserLoadProfileApi(IConfiguration configuration, UserGetProfileRequest userGetProfileRequest)
+        {
+            userGetProfileRequest.usersQuery = userGetProfileRequest.users;
+            userGetProfileRequest.serviceId = ApiConstants.SERVICE_ID;
+            userGetProfileRequest.channel = configuration.GetSection("channel").Value;
+
+            String url = configuration.GetSection("user_get_profile").Value;
+            String jsonData = SendPost(userGetProfileRequest, ApiConstants.SERVICE_ID, url);
+            Profile deptObj = JsonSerializer.Deserialize<Profile>(jsonData);
+            deptObj.realPicture = deptObj.picture;
+            deptObj.picture = Constants.PATH + deptObj.users + "/" + deptObj.picture;
+            return deptObj;
+        }
+
+        public UserUpdateProfileResponse UserUpdateProfileApi(IConfiguration configuration, UserUpdateProfileRequest userUpdateProfileRequest)
+        {
+            userUpdateProfileRequest.serviceId = ApiConstants.SERVICE_ID;
+            userUpdateProfileRequest.channel = configuration.GetSection("channel").Value;
+
+            String url = configuration.GetSection("user_update_profile").Value;
+            String jsonData = SendPost(userUpdateProfileRequest, ApiConstants.SERVICE_ID, url);
+            UserUpdateProfileResponse deptObj = JsonSerializer.Deserialize<UserUpdateProfileResponse>(jsonData);
+            return deptObj;
+        }
+
+        public UserPicUploadResponse UserPicUploadApi(IConfiguration configuration, UserPicUploadRequest userPicUploadRequest)
+        {
+            userPicUploadRequest.serviceId = ApiConstants.SERVICE_ID;
+            userPicUploadRequest.channel = configuration.GetSection("channel").Value;
+
+            String url = configuration.GetSection("user_pic_upload").Value;
+            String jsonData = SendPost(userPicUploadRequest, ApiConstants.SERVICE_ID, url);
+            UserPicUploadResponse deptObj = JsonSerializer.Deserialize<UserPicUploadResponse>(jsonData);
+            return deptObj;
+        }
+
+        public UserStatus GetUserStatusApi(IConfiguration configuration, UserStatusRequest userStatusRequest)
+        {
+            userStatusRequest.serviceId = ApiConstants.SERVICE_ID;
+            userStatusRequest.channel = configuration.GetSection("channel").Value;
+
+            String url = configuration.GetSection("get_user_status").Value;
+            String jsonData = SendPost(userStatusRequest, ApiConstants.SERVICE_ID, url);
+            UserStatus deptObj = JsonSerializer.Deserialize<UserStatus>(jsonData);
+            return deptObj;
+        }
+
+        public ResultOfTermResponse GetResultOfTermApi(IConfiguration configuration, ResultOfTermRequest resultOfTermRequest)
+        {
+            resultOfTermRequest.serviceId = ApiConstants.SERVICE_ID;
+            resultOfTermRequest.channel = configuration.GetSection("channel").Value;
+
+            String url = configuration.GetSection("get_result_of_term").Value;
+            String jsonData = SendPost(resultOfTermRequest, ApiConstants.SERVICE_ID, url);
+            ResultOfTermResponse deptObj = JsonSerializer.Deserialize<ResultOfTermResponse>(jsonData);
+            return deptObj;
+        }
+
+        public RpSearchDetailTicketResponse RpSearchDetailTicketApi(IConfiguration configuration, RpSearchDetailTicketRequest request)
+        {
+            request.serviceId = ApiConstants.SERVICE_ID;
+            request.channel = configuration.GetSection("channel").Value;
+
+            String url = configuration.GetSection("rp_search_detail_ticket").Value;
+            String jsonData = SendPost(request, ApiConstants.SERVICE_ID, url);
+            RpSearchDetailTicketResponse deptObj = JsonSerializer.Deserialize<RpSearchDetailTicketResponse>(jsonData);
+            return deptObj;
+        }
+
+
+        public TransferMoneyResponse TransferMoneyApi(IConfiguration configuration, TransferMoneyRequest transferMoneyRequest)
+        {
+            transferMoneyRequest.serviceId = ApiConstants.SERVICE_ID;
+            transferMoneyRequest.channel = configuration.GetSection("channel").Value;
+
+            String url = configuration.GetSection("transfer_money").Value;
+            String jsonData = SendPost(transferMoneyRequest, ApiConstants.SERVICE_ID, url);
+            TransferMoneyResponse deptObj = JsonSerializer.Deserialize<TransferMoneyResponse>(jsonData);
+            return deptObj;
+        }
+
+        public SendOTPResponse SendOTPApi(IConfiguration configuration, SendOTPRequest sendOTPRequest)
+        {
+            sendOTPRequest.serviceId = ApiConstants.SERVICE_ID;
+            sendOTPRequest.channel = configuration.GetSection("channel").Value;
+
+            String url = configuration.GetSection("send_otp").Value;
+            String jsonData = SendPost(sendOTPRequest, ApiConstants.SERVICE_ID, url);
+            SendOTPResponse deptObj = JsonSerializer.Deserialize<SendOTPResponse>(jsonData);
+            return deptObj;
+        }
+
+        public TransactionInfoResponse GetTransactionInfoApi(IConfiguration configuration, TransactionInfoRequest transactionInfoRequest)
+        {
+            transactionInfoRequest.serviceId = ApiConstants.SERVICE_ID;
+            transactionInfoRequest.channel = configuration.GetSection("channel").Value;
+
+            String url = configuration.GetSection("get_transaction_info").Value;
+            String jsonData = SendPost(transactionInfoRequest, ApiConstants.SERVICE_ID, url);
+            TransactionInfoResponse deptObj = JsonSerializer.Deserialize<TransactionInfoResponse>(jsonData);
+            return deptObj;
+        }
+
+        public ConfirmTicketDataResponse ConfirmTicketDataApi(IConfiguration configuration, ConfirmTicketDataRequest confirmTicketDataRequest)
+        {
+            confirmTicketDataRequest.serviceId = ApiConstants.SERVICE_ID;
+            confirmTicketDataRequest.channel = configuration.GetSection("channel").Value;
+
+            String url = configuration.GetSection("confirm_ticket_data").Value;
+            String jsonData = SendPost(confirmTicketDataRequest, ApiConstants.SERVICE_ID, url);
+            ConfirmTicketDataResponse deptObj = JsonSerializer.Deserialize<ConfirmTicketDataResponse>(jsonData);
+            return deptObj;
+        }
+
+        public ConfirmOTPResponse ConfirmOTPApi(IConfiguration configuration, ConfirmOTPRequest confirmOTPRequest)
+        {
+            confirmOTPRequest.serviceId = ApiConstants.SERVICE_ID;
+            confirmOTPRequest.channel = configuration.GetSection("channel").Value;
+
+            String url = configuration.GetSection("confirm_otp").Value;
+            String jsonData = SendPost(confirmOTPRequest, ApiConstants.SERVICE_ID, url);
+            ConfirmOTPResponse deptObj = JsonSerializer.Deserialize<ConfirmOTPResponse>(jsonData);
+            return deptObj;
+        }
+
+        public ConfirmBuyingTicketResponse ConfirmBuyingTicketApi(IConfiguration configuration, ConfirmBuyingTicketRequest confirmBuyingTicketRequest)
+        {
+            confirmBuyingTicketRequest.serviceId = ApiConstants.SERVICE_ID;
+            confirmBuyingTicketRequest.channel = configuration.GetSection("channel").Value;
+
+            String url = configuration.GetSection("confirm_buying_ticket").Value;
+            String jsonData = SendPost(confirmBuyingTicketRequest, ApiConstants.SERVICE_ID, url);
+            ConfirmBuyingTicketResponse deptObj = JsonSerializer.Deserialize<ConfirmBuyingTicketResponse>(jsonData);
+            return deptObj;
+        }
+
+        public ConfirmTicketDataResponse BuyTicketV2Api(IConfiguration configuration, ConfirmTicketDataRequest confirmTicketDataRequest)
+        {
+            confirmTicketDataRequest.serviceId = ApiConstants.SERVICE_ID;
+            confirmTicketDataRequest.channel = configuration.GetSection("channel").Value;
+            confirmTicketDataRequest.channelPayment = null;
+
+            String url = configuration.GetSection("buy_ticketv2").Value;
+            String jsonData = SendPost(confirmTicketDataRequest, ApiConstants.SERVICE_ID, url);
+            ConfirmTicketDataResponse deptObj = JsonSerializer.Deserialize<ConfirmTicketDataResponse>(jsonData);
+            return deptObj;
+        }
+        public ConfirmBuyingTicketResponse ConfirmBuyingTicketV2Api(IConfiguration configuration, ConfirmBuyingTicketRequest confirmBuyingTicketRequest, string channelPayment = null, string walletPin = null)
+        {
+            confirmBuyingTicketRequest.serviceId = ApiConstants.SERVICE_ID;
+            confirmBuyingTicketRequest.channel = configuration.GetSection("channel").Value;
+            confirmBuyingTicketRequest.channelPayment = channelPayment;
+            confirmBuyingTicketRequest.walletPin = walletPin;
+
+            String url = configuration.GetSection("confirm_buying_ticketv2").Value;
+            String jsonData = SendPost(confirmBuyingTicketRequest, ApiConstants.SERVICE_ID, url);
+            ConfirmBuyingTicketResponse deptObj = JsonSerializer.Deserialize<ConfirmBuyingTicketResponse>(jsonData);
+            return deptObj;
+        }
+
+        public UserTicketResponse GetUserTicketApi(IConfiguration configuration, UserTicketRequest userTicketRequest)
+        {
+            userTicketRequest.serviceId = ApiConstants.SERVICE_ID;
+            userTicketRequest.channel = configuration.GetSection("channel").Value;
+
+            String url = configuration.GetSection("get_user_ticket").Value;
+            String jsonData = SendPost(userTicketRequest, ApiConstants.SERVICE_ID, url);
+            UserTicketResponse deptObj = JsonSerializer.Deserialize<UserTicketResponse>(jsonData);
+            return deptObj;
+        }
+
+        public GetFreeTicketResponse GetFreeTicketApi(IConfiguration configuration, GetFreeTicketRequest getFreeTicketRequest)
+        {
+            getFreeTicketRequest.channel = configuration.GetSection("channel").Value;
+
+            String url = configuration.GetSection("get_free_ticket").Value;
+            if (String.IsNullOrWhiteSpace(url))
+            {
+                log.Error("Missing configuration: get_free_ticket");
+                return new GetFreeTicketResponse
+                {
+                    responseCode = Code.ERROR,
+                    responseMessage = "Missing configuration: get_free_ticket"
+                };
+            }
+
+            String jsonData = SendPost(getFreeTicketRequest, ApiConstants.SERVICE_ID, url);
+            try
+            {
+                GetFreeTicketResponse deptObj = JsonSerializer.Deserialize<GetFreeTicketResponse>(jsonData);
+                return deptObj;
+            }
+            catch (System.Text.Json.JsonException ex)
+            {
+                log.Error($"GetFreeTicketApi returned invalid JSON: {jsonData}", ex);
+                return new GetFreeTicketResponse
+                {
+                    responseCode = Code.ERROR,
+                    responseMessage = $"Get free ticket API returned an invalid response: {jsonData}"
+                };
+            }
+        }
+
+        public GetTopWininerResponse GetTopWinnerApi(IConfiguration configuration, GetTopWinnerRequest userTicketRequest)
+        {
+            userTicketRequest.serviceId = ApiConstants.SERVICE_ID;
+
+            String url = configuration.GetSection("get_top_winner").Value;
+            String jsonData = SendPost(userTicketRequest, ApiConstants.SERVICE_ID, url);
+            GetTopWininerResponse deptObj = JsonSerializer.Deserialize<GetTopWininerResponse>(jsonData);
+            return deptObj;
+        }
+
+        //public AutoLoginResponse AutoLoginApi(IConfiguration configuration, AutoLoginRequest request)
+        //{
+        //    String url = configuration.GetSection("auto_login").Value;
+        //    String jsonData = SendPostObj(request, ApiConstants.SERVICE_ID, url);
+        //    AutoLoginResponse deptObj = JsonSerializer.Deserialize<AutoLoginResponse>(jsonData);
+        //    return deptObj;
+        //}
+
+        public async Task<AutoLoginResponse> AutoLoginApiAsync(IConfiguration configuration, AutoLoginRequest request)
+        {
+            String url = configuration.GetSection("auto_login").Value;
+            String jsonData = await SendFormDataPostAsync(request.token, url);
+            //String jsonData = "{\"code\":200,\"message\":\"Success\",\"data\":{\"tokenGame\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ1c2VySW5mb3IiLCJleHAiOjE3MDU1NTIzODgsInV1aWQiOiI2ZmQ1MWE0YzcyNzAxMTBmMzViNTFjODUyNTAwZjZmOSJ9.1cg95nEMdFTZRaccKDw7cVWArfXXq2JkSY6WrOos7Tg\",\"msisdn\":\"+50942133007\",\"name\":\"Test 007 Julyy May Skuhyu\",\"birthday\":\"1999-02-25\"}}";
+            //String jsonData = "{\"code\":200,\"message\":\"Success\",\"data\":{\"tokenGame\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ1c2VySW5mb3IiLCJleHAiOjE3MDU1NTIzODgsInV1aWQiOiI2ZmQ1MWE0YzcyNzAxMTBmMzViNTFjODUyNTAwZjZmOSJ9.1cg95nEMdFTZRaccKDw7cVWArfXXq2JkSY6WrOos7Tg\",\"msisdn\":\"+50955797979\",\"name\":\"Test 007 Julyy May Skuhyu\",\"birthday\":\"1999-02-25\"}}";
+
+            //"{ "code":200,"message":"Success","data":{ "tokenGame":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ1c2VySW5mb3IiLCJleHAiOjE3MTAzODE0NTksInV1aWQiOiI1MGEwYjNlNzk5ZjllZDU3YTE1ZjZjNjljODVmYTM3NSJ9.EgR-P_KzsHJ1XCdgeu25Gy_-qAHOfM9uv9RTZSvr0AA","msisdn":"+50955797979","name":"Morgan Dinh","birthday":"1983-06-23"} }
+            AutoLoginResponse deptObj = JsonSerializer.Deserialize<AutoLoginResponse>(jsonData);
+            return deptObj;
+        }
+
+        public CheckAccountResponse CheckAccountApi(IConfiguration configuration, CheckAccountRequest checkAccountRequest)
+        {
+            checkAccountRequest.serviceId = ApiConstants.SERVICE_ID;
+
+            String url = configuration.GetSection("check_account").Value;
+            String jsonData = SendPost(checkAccountRequest, ApiConstants.SERVICE_ID, url);
+            CheckAccountResponse deptObj = JsonSerializer.Deserialize<CheckAccountResponse>(jsonData);
+            return deptObj;
+        }
+
+        private async Task<string> SendFormDataPostAsync(string token, String url)
+        {
+
+            log.Debug(url);
+            log.Debug("Request token: " + token);
+
+            var parameters = new Dictionary<string, string>();
+            parameters.Add("token", token);
+
+            using (HttpClient client = new HttpClient())
+            {
+                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
+
+                HttpResponseMessage response = client.PostAsync(url, new FormUrlEncodedContent(parameters)).Result;
+                var responseString = response.Content.ReadAsStringAsync().Result;
+
+                log.Debug("Response: " + responseString);
+                return responseString;
+            }
+        }
+
+        private String SendPost(Posting obj, String serviceId, String url)
+        {
+            // get configuration
+
+            obj.serviceId = serviceId;
+            obj.SV_ID = serviceId;
+            obj.service_id = serviceId;
+
+            var json = JsonConvert.SerializeObject(obj);
+            var data = new StringContent(json, Encoding.UTF8, "application/json");
+
+            log.Debug(url);
+            log.Debug("Request: " + json);
+
+            using (var client = new HttpClient())
+            {
+                var response = client.PostAsync(url, data).Result;
+                if (response.IsSuccessStatusCode)
+                {
+                    var responseContent = response.Content;
+                    // by calling .Result you are synchronously reading the result
+                    string responseString = responseContent.ReadAsStringAsync().Result;
+                    log.Debug("Response: " + responseString);
+                    return responseString;
+                }
+                else
+                {
+                    log.Error("Response: " + response.StatusCode.ToString());
+                    return response.StatusCode.ToString();
+                }
+            }
+        }
+
+        private String SendPostObj(Object obj, String serviceId, String url)
+        {
+            var json = JsonConvert.SerializeObject(obj);
+            var data = new StringContent(json, Encoding.UTF8, "application/json");
+
+            log.Debug(url);
+            log.Debug("Request: " + json);
+
+            using (var client = new HttpClient())
+            {
+                var response = client.PostAsync(url, data).Result;
+                if (response.IsSuccessStatusCode)
+                {
+                    var responseContent = response.Content;
+                    // by calling .Result you are synchronously reading the result
+                    string responseString = responseContent.ReadAsStringAsync().Result;
+                    log.Debug("Response: " + responseString);
+                    return responseString;
+                }
+                else
+                {
+                    log.Error("Response: " + response.StatusCode.ToString());
+                    return response.StatusCode.ToString();
+                }
+            }
+        }
+    }
+
+
+
+}

+ 427 - 0
website_natcash/Service/ApiModels.cs

@@ -0,0 +1,427 @@
+using System.Collections.Generic;
+
+namespace LotteryWebApp.Service
+{
+    public class RegisterRequest : Posting
+    {
+        public string Msisdn { get; set; }
+        public string Users { get; set; }
+        public string pass { get; set; }
+        public string Passnew { get; set; }
+        public string serviceId { get; set; }
+        public string Command { get; set; }
+        public string Channel { get; set; }
+        public string Role { get; set; }
+        public string token { get; set; }
+        public string channel { get; set; }
+
+
+    }
+    public class RegisterResponse
+    {
+        public string role { get; set; }
+        public string token { get; set; }
+        public string status { get; set; }
+        public string message { get; set; }
+    }
+
+
+
+    public class UserCheckStatusRequest : Posting
+    {
+        public string users { get; set; }
+        public string serviceId { get; set; }
+        public string language { get; set; }
+        public string channel { get; set; }
+        public string token { get; set; }
+    }
+    public class UserCheckStatusResponse
+    {
+        public string status { get; set; }
+        public string message { get; set; }
+        public string id { get; set; }
+        public string msisdn { get; set; }
+        public string users { get; set; }
+        public string pass { get; set; }
+        public string serviceid { get; set; }
+        public string dateregist { get; set; }
+        public string isactive { get; set; }
+        public string channel { get; set; }
+        public string bet_coin { get; set; }
+        public string cash_coin { get; set; }
+        public string role { get; set; }
+        public string language { get; set; }
+    }
+
+    public class GetServiceRequest : Posting
+    {
+        public string type { get; set; }
+        public string token { get; set; }
+        public string Channel { get; set; }
+        public string language { get; set; }
+    }
+    public class GetServiceResponse
+    {
+        public string status { get; set; }
+        public string message { get; set; }
+        public List<Service> listSubService { get; set; }
+    }
+
+    public class UserUpdateProfileRequest : Posting
+    {
+        public string users { get; set; }
+        public string serviceId { get; set; }
+        public string fullName { get; set; }
+        public string picture { get; set; }
+        public string birthday { get; set; }
+        public string token { get; set; }
+        public string Channel { get; set; }
+        public string language { get; set; }
+        public string channel { get; set; }
+
+    }
+    public class UserUpdateProfileResponse
+    {
+        public string status { get; set; }
+        public string message { get; set; }
+    }
+
+    public class UserGetProfileRequest : Posting
+    {
+        public string usersQuery { get; set; }
+        public string users { get; set; }
+        public string serviceId { get; set; }
+        public string token { get; set; }
+        public string channel { get; set; }
+        public string language { get; set; }
+    }
+
+
+    public class UserPicUploadRequest : Posting
+    {
+        public string users { get; set; }
+        public string serviceId { get; set; }
+        public string url { get; set; }
+        public string token { get; set; }
+        public string Channel { get; set; }
+        public string language { get; set; }
+        public string channel { get; set; }
+
+    }
+    public class UserPicUploadResponse
+    {
+        public string status { get; set; }
+        public string message { get; set; }
+    }
+
+
+    public class ResultOfTermRequest : Posting
+    {
+        public string gameId { get; set; }
+        public string language { get; set; }
+        public string channel { get; set; }
+        public string token { get; set; }
+        public string id { get; set; }
+        public string type { get; set; }
+        public string fromDate { get; set; }
+        public string toDate { get; set; }
+        public string order { get; set; }
+        public string rowsOnPage { get; set; }
+        public string seqPage { get; set; }
+
+    }
+    public class ResultOfTermResponse
+    {
+        public string rowsOnPage { get; set; }
+        public string seqPage { get; set; }
+        public string totalPage { get; set; }
+        public string totalRow { get; set; }
+        public string gameId { get; set; }
+        public List<Term> listTerm { get; set; }
+        public string responseCode { get; set; }
+        public string responseMessage { get; set; }
+    }
+
+    public class RpSearchDetailTicketRequest : Posting
+    {
+        public string requestId { get; set; }
+        public string msisdn { get; set; }
+        public string gameId { get; set; }
+        public string fromDate { get; set; }
+        public string toDate { get; set; }
+        public string prize { get; set; }
+        public string language { get; set; }
+        public string channel { get; set; }
+        public string token { get; set; }
+    }
+
+    public class JackpotWinnerItem
+    {
+        public string msisdn { get; set; }
+        public string ticketId { get; set; }
+        public string ticket { get; set; }
+        public string dateBuy { get; set; }
+        public string money { get; set; }
+        public string channelBuy { get; set; }
+        public string moneyWin { get; set; }
+        public string randomId { get; set; }
+        public string startDate { get; set; }
+        public string endDate { get; set; }
+        public string randomDate { get; set; }
+        public string result { get; set; }
+    }
+
+    public class RpSearchDetailTicketResponse
+    {
+        public string responseCode { get; set; }
+        public string responseMessage { get; set; }
+        public List<JackpotWinnerItem> list { get; set; }
+    }
+
+    public class UserStatusRequest : Posting
+    {
+        public string users { get; set; }
+        public string serviceId { get; set; }
+        public string language { get; set; }
+        public string channel { get; set; }
+        public string token { get; set; }
+    }
+
+    public class TransferMoneyRequest : Posting
+    {
+        public string msisdn { get; set; }
+        public string msisdnReceive { get; set; }
+        public string money { get; set; }
+        public string channelPayment { get; set; }
+        public string language { get; set; }
+        public string channel { get; set; }
+        public string serviceId { get; set; }
+        public string token { get; set; }
+        public string otp { get; set; }
+
+    }
+
+    public class TransferMoneyResponse
+    {
+        public string paymentCode { get; set; }
+        public string responseCode { get; set; }
+        public string responseMessage { get; set; }
+    }
+
+    public class SendOTPRequest : Posting
+    {
+        public string msisdn { get; set; }
+        public string language { get; set; }
+        public string channel { get; set; }
+        public string serviceId { get; set; }
+        public string token { get; set; }
+
+    }
+
+    public class SendOTPResponse
+    {
+        public string responseCode { get; set; }
+        public string responseMessage { get; set; }
+    }
+
+    public class TransactionInfoRequest : Posting
+    {
+        public string id { get; set; }
+        public string msisdn { get; set; }
+        public string language { get; set; }
+        public string channel { get; set; }
+        public string serviceId { get; set; }
+        public string token { get; set; }
+        public string type { get; set; }
+        public string fromDate { get; set; }
+        public string toDate { get; set; }
+        public string order { get; set; }
+        public string rowsOnPage { get; set; }
+        public string seqPage { get; set; }
+
+    }
+
+    public class TransactionInfoResponse
+    {
+        public string rowsOnPage { get; set; }
+        public string seqPage { get; set; }
+        public string totalPage { get; set; }
+        public string totalRow { get; set; }
+        public string responseCode { get; set; }
+        public string responseMessage { get; set; }
+        public List<Transaction> list { get; set; }
+
+    }
+
+    public class ConfirmTicketDataRequest : Posting
+    {
+        public string requestId { get; set; }
+        public string msisdn { get; set; }
+        public string language { get; set; }
+        public string channel { get; set; }
+        public string serviceId { get; set; }
+        public string token { get; set; }
+        public string gameId { get; set; }
+        public string promotionCode { get; set; }
+        [Newtonsoft.Json.JsonProperty(NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
+        public string channelPayment { get; set; }
+        public List<TicketInfo> ticket { get; set; }
+    }
+
+    public class ConfirmTicketDataResponse
+    {
+        public string requestId { get; set; }
+        public TermObj termObj { get; set; }
+        public string isPromotion { get; set; }
+        public string totalMoney { get; set; }
+        public string totalMoneyPromotion { get; set; }
+        public string promotionId { get; set; }
+        public string transId { get; set; }
+        public string responseCode { get; set; }
+        public string responseMessage { get; set; }
+    }
+
+    public class ConfirmBuyingTicketRequest : Posting
+    {
+        public string requestId { get; set; }
+        public string msisdn { get; set; }
+        public string language { get; set; }
+        public string channel { get; set; }
+        public string serviceId { get; set; }
+        public string token { get; set; }
+        public string paymentCode { get; set; }
+        public string walletPin { get; set; }
+        public string channelPayment { get; set; }
+        public string transIdByTicket { get; set; }
+        public string gameId { get; set; }
+    }
+
+    public class ConfirmBuyingTicketResponse
+    {
+        public string requestId { get; set; }
+        public string orderId { get; set; }
+        public string listTiketId { get; set; }
+        public string transId { get; set; }
+        public string responseCode { get; set; }
+        public string responseMessage { get; set; }
+    }
+
+    public class ConfirmOTPRequest : Posting
+    {
+        public string otp { get; set; }
+        [Newtonsoft.Json.JsonProperty(NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
+        public string transIdByTicket { get; set; }
+        public string msisdn { get; set; }
+        public string language { get; set; }
+        public string channel { get; set; }
+        public string serviceId { get; set; }
+        public string token { get; set; }
+    }
+
+    public class ConfirmOTPResponse
+    {
+        public string responseCode { get; set; }
+        public string responseMessage { get; set; }
+    }
+
+    public class UserTicketRequest : Posting
+    {
+        public string gameId { get; set; }
+        public string msisdn { get; set; }
+        public string language { get; set; }
+        public string channel { get; set; }
+        public string serviceId { get; set; }
+        public string token { get; set; }
+        public string id { get; set; }
+        public string type { get; set; }
+        public string order { get; set; }
+        public string rowsOnPage { get; set; }
+        public string seqPage { get; set; }
+
+    }
+
+    public class GetTopWinnerRequest : Posting
+    {
+        public string type { get; set; }
+        public string token { get; set; }
+
+    }
+
+    public class UserTicketResponse
+    {
+        public string responseCode { get; set; }
+        public string responseMessage { get; set; }
+        public string rowsOnPage { get; set; }
+        public string seqPage { get; set; }
+        public string totalPage { get; set; }
+        public List<Ticket> listTicket { get; set; }
+
+    }
+
+    public class GetFreeTicketRequest : Posting
+    {
+        public string requestId { get; set; }
+        public string gameId { get; set; }
+        public string type { get; set; }
+        public string msisdn { get; set; }
+        public string channel { get; set; }
+        public string language { get; set; }
+        public string token { get; set; }
+    }
+
+    public class GetFreeTicketResponse
+    {
+        public string code { get; set; }
+        public string money { get; set; }
+        public string expireDate { get; set; }
+        public string responseCode { get; set; }
+        public string responseMessage { get; set; }
+    }
+
+    public class GetTopWininerResponse
+    {
+        public string responseCode { get; set; }
+        public string responseMessage { get; set; }
+        public string rowsOnPage { get; set; }
+        public string seqPage { get; set; }
+        public string totalPage { get; set; }
+        public string list { get; set; }
+    }
+
+    public class AutoLoginRequest
+    {
+        public string token { get; set; }
+
+    }
+
+    public class AutoLoginResponse
+    {
+        public int code { get; set; }
+        public string message { get; set; }
+        public AutoLoginData data { get; set; }
+    }
+
+    public class AutoLoginData
+    {
+        public string tokenGame { get; set; }
+        public string msisdn { get; set; }
+        public string name { get; set; }
+        public string birthday { get; set; }
+    }
+
+    public class CheckAccountRequest : Posting
+    {
+        public string msisdn { get; set; }
+        public string language { get; set; }
+        public string channel { get; set; }
+    }
+
+    public class CheckAccountResponse
+    {
+        public string status { get; set; }
+        public string message { get; set; }
+        public string function { get; set; }
+        public string token { get; set; }
+        public string role { get; set; }
+    }
+}

+ 136 - 0
website_natcash/Startup.cs

@@ -0,0 +1,136 @@
+using Microsoft.AspNetCore.Authentication.Cookies;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.HttpsPolicy;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.FileProviders;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Options;
+using LotteryWebApp.Extensions;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Threading.Tasks;
+using LotteryWebApp.Common;
+
+namespace LotteryWebApp
+{
+    public class Startup
+    {
+        readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
+
+        public Startup(IConfiguration configuration)
+        {
+            Configuration = configuration;
+        }
+
+        public IConfiguration Configuration { get; }
+
+        // This method gets called by the runtime. Use this method to add services to the container.
+        public void ConfigureServices(IServiceCollection services)
+        {
+            //services.AddControllersWithViews();
+            services.AddSingleton<IConfiguration>(Configuration);
+            services.AddMvc().AddRazorOptions(options =>
+            {
+                options.ViewLocationFormats.Add("/{0}.cshtml");
+            });
+
+            services.AddCors(options =>
+            {
+                options.AddPolicy(name: MyAllowSpecificOrigins,
+                                  builder =>
+                                  {
+                                      builder.AllowAnyOrigin()
+                                             .AllowAnyMethod()
+                                             .AllowAnyHeader();
+                                  });
+            });
+
+
+            services.Configure<RequestLocalizationOptions>(options =>
+            {
+                var cultures = new List<CultureInfo> {
+                    new CultureInfo("fr"),
+                    new CultureInfo("en")
+                };
+                options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("fr");
+                options.SupportedCultures = cultures;
+                options.SupportedUICultures = cultures;
+            });
+
+            //.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
+            //.AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
+            services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
+            services.AddDistributedMemoryCache(); // Adds a default in-memory implementation of IDistributedCache
+            services.AddSession(options =>
+            {
+                options.IdleTimeout = TimeSpan.FromSeconds(600);
+                options.Cookie.HttpOnly = true;
+                options.Cookie.IsEssential = true;
+            });
+            //services.AddSession();
+            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
+            services.AddHttpContextAccessor();
+            services.AddMvc(options =>
+            {
+                options.Filters.Add(new ConfigAction(
+                    Configuration.GetSection("MyConfig")
+                ));
+            });
+
+            //services.AddAuthentication()
+            //    .AddJwtBearer(options =>
+            //    {
+            //        // your other config
+            //        options.SaveToken = true;
+            //    });
+        }
+
+        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
+        {
+            if (env.IsDevelopment())
+            {
+                app.UseDeveloperExceptionPage();
+            }
+            else
+            {
+                app.UseExceptionHandler("/Home/Error");
+                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
+                app.UseHsts();
+            }
+            app.UseSession();
+            app.UseCookiePolicy();
+            app.UseHttpsRedirection();
+            app.UseStaticFiles();
+            //app.UseStaticFiles(new StaticFileOptions()
+            //{
+            //    FileProvider = new PhysicalFileProvider(Configuration.GetSection(Constants.PATH_OUTSIDE).Value),
+            //    RequestPath = new PathString("/outside")
+            //});
+
+            app.UseRequestLocalization(app.ApplicationServices.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value);
+
+            app.UseCors(MyAllowSpecificOrigins);
+
+            app.UseRouting();
+
+            app.UseAuthorization();
+
+            app.UseEndpoints(endpoints =>
+            {
+                endpoints.MapControllerRoute(
+                    name: "areas",
+                    pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
+
+                endpoints.MapControllerRoute(
+                    name: "default",
+                    pattern: "{controller=Home}/{action=Index}/{id?}");
+            });
+        }
+    }
+}

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä