playsout-web-sdk 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +310 -131
- package/chunk-I2HADAGI.js +2 -0
- package/chunk-R6BPBCQR.cjs +2 -0
- package/core/api.d.ts.map +1 -1
- package/core/index.d.ts +2 -0
- package/core/index.d.ts.map +1 -1
- package/core/types.d.ts +0 -1
- package/core/types.d.ts.map +1 -1
- package/index.cjs +1 -1
- package/index.global.js +224 -142
- package/index.iife.js +224 -142
- package/index.js +1 -1
- package/package.json +1 -1
- package/react/context.d.ts.map +1 -1
- package/react/index.cjs +1 -1
- package/react/index.js +1 -1
- package/vue/composable.d.ts.map +1 -1
- package/vue/index.cjs +1 -1
- package/vue/index.js +1 -1
- package/web-components/PlaysoutWidget.d.ts +9 -0
- package/web-components/PlaysoutWidget.d.ts.map +1 -1
- package/web-components/PrivyBridge.d.ts +58 -0
- package/web-components/PrivyBridge.d.ts.map +1 -0
- package/web-components/index.cjs +220 -138
- package/web-components/index.js +220 -138
- package/chunk-AJVRILLC.js +0 -2
- package/chunk-MUMDBAO7.cjs +0 -2
package/index.global.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var Playsout=(()=>{var q=Object.defineProperty;var Me=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var ze=Object.prototype.hasOwnProperty;var Ge=(o,t)=>{for(var e in t)q(o,e,{get:t[e],enumerable:!0})},De=(o,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of _e(t))!ze.call(o,i)&&i!==e&&q(o,i,{get:()=>t[i],enumerable:!(a=Me(t,i))||a.enumerable});return o};var Ne=o=>De(q({},"__esModule",{value:!0}),o);var Et={};Ge(Et,{Login:()=>ut,PlaysoutSDKClass:()=>At,destroy:()=>gt,getCategories:()=>wt,getGames:()=>vt,getLocale:()=>yt,getToken:()=>ht,getUser:()=>ft,getUserInfo:()=>pt,init:()=>lt,instance:()=>It,isInitialized:()=>St,isLoggedIn:()=>Tt,logout:()=>mt,mount:()=>ct,off:()=>xt,on:()=>kt,setLocale:()=>bt,unmount:()=>dt});var x=class extends Error{constructor(e,a,i){super(a);this.code=e;this.details=i;this.name="SDKError"}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details}}},Oe={NOT_INITIALIZED:"SDK not initialized. Please call PlaysoutSDK.init() first.",ALREADY_INITIALIZED:"SDK already initialized. Please do not call init() more than once.",NOT_LOGGED_IN:"User not logged in. Please log in first.",TOKEN_EXPIRED:"Login token has expired. Please log in again.",INVALID_TOKEN:"Invalid login token. Please log in again.",NETWORK_ERROR:"Network connection failed. Please check your network.",TIMEOUT:"Request timed out. Please try again later.",SERVER_ERROR:"Server is busy. Please try again later.",API_ERROR:"API request failed.",INVALID_PARAMS:"Invalid parameter(s).",MISSING_PARAMS:"Missing required parameter(s).",FEATURE_NOT_SUPPORTED:"This feature is not supported in the current environment.",UNKNOWN:"An unknown error occurred.",PAYMENT_FAILED:"Payment failed.",SHARE_FAILED:"Share failed."};function g(o,t){return new x(o,Oe[o],t)}var z="playsout_",G=class{constructor(t){this.storage=t}get(t){try{return this.storage.getItem(z+t)}catch{return null}}set(t,e){try{this.storage.setItem(z+t,e)}catch(a){console.warn("[PlaysoutSDK] Storage set failed:",a)}}remove(t){try{this.storage.removeItem(z+t)}catch{}}clear(){try{let t=[];for(let e=0;e<this.storage.length;e++){let a=this.storage.key(e);a&&a.startsWith(z)&&t.push(a)}t.forEach(e=>this.storage.removeItem(e))}catch{}}},W=class{constructor(){this.store=new Map}get(t){return this.store.get(t)??null}set(t,e){this.store.set(t,e)}remove(t){this.store.delete(t)}clear(){this.store.clear()}};function ie(o="localStorage"){return typeof window>"u"||o==="memory"?new W:o==="sessionStorage"?new G(sessionStorage):new G(localStorage)}var S=ie(),h={get:o=>S.get(o),set:(o,t)=>{S.set(o,t)},remove:o=>{S.remove(o)},clear:()=>{S.clear()},getJSON:o=>{let t=S.get(o);if(!t)return null;try{return JSON.parse(t)}catch{return null}},setJSON:(o,t)=>{S.set(o,JSON.stringify(t))},configure(o){S=ie(o)}},p={TOKEN_DATA:"token_data",USER:"user",LOCALE:"locale",CONFIG:"config"};var V=class{constructor(){this.events=new Map}on(t,e){return this.events.has(t)||this.events.set(t,new Set),this.events.get(t).add(e),()=>{this.off(t,e)}}once(t,e){let a=i=>{e(i),this.off(t,a)};return this.on(t,a)}off(t,e){this.events.get(t)?.delete(e),this.events.get(t)?.size===0&&this.events.delete(t)}emit(t,e){this.events.get(t)?.forEach(a=>{try{a(e)}catch(i){console.error(`[PlaysoutSDK] Event handler error for "${t}":`,i)}})}listenerCount(t){return this.events.get(t)?.size??0}clear(){this.events.clear()}},I=new V,y={on:(o,t)=>I.on(o,t),once:(o,t)=>I.once(o,t),off:(o,t)=>{I.off(o,t)},clear:()=>{I.clear()},emit:(o,t)=>{I.emit(o,t)}};var Ue="https://games.playsout.com/resources/icon/image";function s(o){if(!o||/^(data:|https?:|blob:)/i.test(o))return o;let t=o.replace(/^\.\//,"");return`${Ue}/${t}`}var Be=o=>{if(!o)return o;try{let t=new URL(o);if(t.hostname==="games.playsout.com"){let e=t.pathname,a=e.endsWith("/"),i=/\.[a-z0-9]+$/i.test(e);!a&&!i&&(t.pathname=`${e}/`)}return t.toString()}catch{return o}},je=o=>o.map(t=>{if(!t.externalUrl)return t;let e=Be(t.externalUrl);return e===t.externalUrl?t:{...t,externalUrl:e}}),He=[{id:"BlockCrushFun",title:"Block Crush Fun",category:"Puzzle",image:s("./games/BlockCrushFun.png"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/BlockCrushFun"},{id:"DogeSurvivors",title:"Doge Survivors",category:"Doge OS",image:s("./games/DogeSurvivors.jpg"),isNew:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Doge/DogeSurvivors/"},{id:"DogeMaze",title:"Doge Maze",category:"Doge OS",image:s("./games/DogeMaze.jpg"),isNew:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Doge/DogeMaze/"},{id:"DogeMart",title:"Doge Mart",category:"Doge OS",image:s("./games/DogeMart.jpg"),isNew:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Doge/DogeMart/"},{id:"KittyEscape",title:"Kitty Escape",category:"Puzzle",image:s("./games/KittyEscape.jpg"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/KittyEscape/"},{id:"ProjectGarden",title:"Project: Garden",category:"Adventure",image:s("./games/SimulatedAdventures.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/simulated/"},{id:"ProjectIDLE",title:"Project: IDLE",category:"Simulation",image:s("./games/ProjectIDLE.jpg"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/idle/"},{id:"CulinaryStarWeb",title:"Culinary Star",category:"Casual",image:s("./games/CulinaryStar.webp"),description:"Cooking game",isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CulinaryStar/"},{id:"PickaxeQuest",title:"Pickaxe Quest",category:"Adventure",image:s("./games/PickaxeQuest.jpg"),description:"Mining and adventure game",isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/PickaxeQuest/",apiGameId:73},{id:"MonsterSurvivors",title:"Monster Survivors",category:"Adventure",image:s("./games/MonsterSurvivors.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/MonsterSurvivors/"},{id:"IdleTowerDefense",title:"Idle Tower Defense",category:"RPG",image:s("./games/IdleTowerDefense.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/IdleTowerDefense/"},{id:"MushroomWarriors",title:"Mushroom Warriors",category:"RPG",image:s("./games/MushroomWarriors.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/MushroomWarriors/"},{id:"FollowThePath",title:"Follow The Path",category:"Arcade",image:s("./games/FollowThePath.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/FollowThePath/"},{id:"ColorRun",title:"Color Run",category:"Arcade",image:s("./games/ColorRun.jpg"),isNew:!1,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ColorRun/"},{id:"StupidArrow",title:"Stupid Arrow",category:"Arcade",image:s("./games/StupidArrow.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/StupidArrow/"},{id:"ZigZag",title:"Zig Zag",category:"Arcade",image:s("./games/ZigZag.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ZigZag/"},{id:"SpikesEverywhere",title:"Spikes Everywhere",category:"Arcade",image:s("./games/SpikesEverywhere.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/SpikesEverywhere/"},{id:"ArrowRacer",title:"Arrow Racer",category:"Arcade",image:s("./games/ArrowRacer.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ArrowRacer/"},{id:"CircleLeap",title:"Circle Leap",category:"Arcade",image:s("./games/CircleLeap.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CircleLeap/"},{id:"ColorMatcher",title:"Color Matcher",category:"Arcade",image:s("./games/ColorMatcher.jpg"),isNew:!1,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ColorMatcher/"},{id:"EndlessMaze",title:"Endless Maze",category:"Arcade",image:s("./games/EndlessMaze.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/EndlessMaze/"},{id:"SpinningAround",title:"Spinning Around",category:"Arcade",image:s("./games/SpinningAround.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/SpinningAround/"},{id:"BoomBallz",title:"Boom Ballz",category:"Arcade",image:s("./games/BoomBallz.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/BoomBallz/"},{id:"CubeHead",title:"Cube Head",category:"Arcade",image:s("./games/CubeHead.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CubeHead/"},{id:"CapybaraLink",title:"Capybara Link",category:"Puzzle",image:s("./games/CapybaraLink.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CapybaraLink/"},{id:"Snake2048",title:"Snake 2048",category:"Puzzle",image:s("./games/Snake2048.jpg"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Snake2048/"},{id:"FishTankFury",title:"Fish Tank Fury",category:"Puzzle",image:s("./games/FishTankFury.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/FishTankFury/"},{id:"ConnectBalls",title:"Connect Balls",category:"Arcade",image:s("./games/ConnectBalls.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ConnectBalls/"},{id:"CircularBreaker",title:"Circular Breaker",category:"Arcade",image:s("./games/CircularBreaker.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CircularBreaker/"},{id:"OneDoor",title:"One Door",category:"Arcade",image:s("./games/OneDoor.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/OneDoor/"},{id:"CatchtheFruits",title:"Catch the Fruits",category:"Casual",image:s("./games/CatchtheFruits.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CatchtheFruits/"},{id:"Falling2048",title:"Falling 2048",category:"Casual",image:s("./games/Falling2048.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Falling2048/"}],re=je(He),w=()=>re.filter(o=>o.enable),zt={Adventure:w().filter(o=>o.category==="Adventure"),Moba:w().filter(o=>o.category==="Moba")};var ne=o=>re.find(t=>t.id===o);var se=()=>Array.from(new Set(w().map(o=>o.category)));var Q="https://api.playsout.com",X=3e4,$e=new Set([10010,10011,10012,10013]);function Fe(o){let t=String(o?.platform||"").toLowerCase();if(t==="tiktok"){let e=o.authorizationCode;if(typeof e!="string"||!e.trim())throw g("MISSING_PARAMS","authorizationCode is required for TikTok login");return{platform:t,authorizationCode:e}}if(t==="grab"||t==="eros"){let e=o;if(typeof e.platformUserId!="string"||!e.platformUserId.trim())throw g("MISSING_PARAMS","platformUserId is required for Grab/Eros login");if(typeof e.platformToken!="string"||!e.platformToken.trim())throw g("MISSING_PARAMS","platformToken is required for Grab/Eros login");return{platform:t,platformUserId:e.platformUserId,platformToken:e.platformToken,username:typeof e.username=="string"?e.username:void 0,inviteCode:typeof e.inviteCode=="string"?e.inviteCode:void 0}}throw g("INVALID_PARAMS","Unsupported platform. Expected grab, eros, or tiktok")}var A=null,J=null,E=null;function de(o){J=o}function ge(o){E=o}async function le(o,t={},e,a=!1){let i=e?.apiBaseUrl||Q,r=o.startsWith("http")?o:`${i}${o}`,n=new AbortController,d=setTimeout(()=>n.abort(),X);try{let m=h.getJSON(p.TOKEN_DATA),b={"Content-Type":"application/json",...t.headers};m?.accessToken&&!b.token&&(b.token=m.accessToken);let f=await fetch(r,{...t,signal:n.signal,headers:b});if(clearTimeout(d),!f.ok){if(f.status===401&&!a)return await ce(o,t,e);throw g(f.status>=500?"SERVER_ERROR":"API_ERROR",`HTTP ${f.status}: ${f.statusText}`)}let u=await f.json();if(u.code!==void 0&&$e.has(u.code)&&!a){if(o.includes("/platform/refreshToken"))throw g("TOKEN_EXPIRED",u.msg||"Token expired");return await ce(o,t,e)}if(u.code!==0&&u.code!==1e4)throw g("API_ERROR",u.msg||"API request failed");return u.data}catch(m){throw clearTimeout(d),m instanceof x?m:m instanceof Error?m.name==="AbortError"?g("TIMEOUT"):g("NETWORK_ERROR",m.message):g("UNKNOWN")}}async function ce(o,t,e){await ue(e);let a=e?.apiBaseUrl||Q,i=o.startsWith("http")?o:`${a}${o}`,r=new AbortController,n=setTimeout(()=>r.abort(),X);try{let d=h.getJSON(p.TOKEN_DATA),m={"Content-Type":"application/json",...t.headers};d?.accessToken&&(m.token=d.accessToken);let b=await fetch(i,{...t,signal:r.signal,headers:m});if(clearTimeout(n),!b.ok)throw g(b.status>=500?"SERVER_ERROR":"API_ERROR",`HTTP ${b.status}: ${b.statusText}`);let f=await b.json();if(f.code!==0&&f.code!==1e4)throw g("API_ERROR",f.msg||"API request failed");return f.data}catch(d){throw clearTimeout(n),d instanceof x?d:d instanceof Error&&d.name==="AbortError"?g("TIMEOUT"):g("NETWORK_ERROR",d?.message||"Request failed")}}async function ue(o){return A||(A=(async()=>{let t=h.getJSON(p.TOKEN_DATA);if(!t?.refreshToken)throw g("NOT_LOGGED_IN","No refresh token available");let e=o?.apiBaseUrl||Q,a=new AbortController,i=setTimeout(()=>a.abort(),X);try{let r=await fetch(`${e}/platform/refreshToken`,{method:"POST",signal:a.signal,headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:t.refreshToken})});if(clearTimeout(i),!r.ok)throw g("TOKEN_EXPIRED","Failed to refresh token");let n=await r.json();if(n.code!==0&&n.code!==1e4||!n.data)throw g("TOKEN_EXPIRED",n.msg||"Failed to refresh token");let d=n.data;if(h.setJSON(p.TOKEN_DATA,d),J)try{J(d)}catch{}return d}catch(r){if(clearTimeout(i),r instanceof x){if(E)try{E()}catch{}throw r}if(r instanceof Error&&r.name==="AbortError")throw g("TIMEOUT");if(E)try{E()}catch{}throw g("TOKEN_EXPIRED","Refresh token failed")}finally{A=null}})(),A)}var Z=class{constructor(){this.config=null}configure(t){this.config=t}async refreshToken(){return await ue(this.config||void 0)}async getGames(t){let e=w();if(t?.category&&(e=e.filter(a=>a.category===t.category)),t?.search){let a=t.search.toLowerCase();e=e.filter(i=>i.title.toLowerCase().includes(a)||i.category.toLowerCase().includes(a)||i.description&&i.description.toLowerCase().includes(a))}if(t?.sortBy)switch(t.sortBy){case"newest":e=e.filter(a=>a.isNew).concat(e.filter(a=>!a.isNew));break;case"rating":e=e.filter(a=>a.isHot).concat(e.filter(a=>!a.isHot));break}if(t?.page&&t?.pageSize){let a=(t.page-1)*t.pageSize;e=e.slice(a,a+t.pageSize)}return e}async getCategories(){let t=w(),e=new Map;return t.forEach(a=>{let i=e.get(a.category)||0;e.set(a.category,i+1)}),Array.from(e.entries()).map(([a,i],r)=>({id:`category_${r}`,name:a,count:i}))}async getGameById(t){return ne(t)}async getCategoryNames(){return se()}async loginOnly(t){let e=Fe(t);return await le("/platform/login",{method:"POST",body:JSON.stringify(e)},this.config??void 0)}async Login(t){let e=await this.loginOnly(t),a;try{a=await this.getUserInfo()}catch{}return{tokenData:e,user:a}}async getUserInfo(){return await le("/platform/user",{method:"GET"},this.config??void 0)}async getUser(){return h.getJSON(p.USER)}async validateToken(t){return!!t}},Y=null;function D(){return Y||(Y=new Z),Y}var We="https://api.playsout.com",me="zh",C=class o{constructor(){this.config=null;this._isInitialized=!1;this._user=null;this._token=null;this._locale=me;this._widget=null}static getInstance(){return o.instance||(o.instance=new o),o.instance}async init(t={}){if(this._isInitialized)throw g("ALREADY_INITIALIZED");this.config={apiBaseUrl:t.apiBaseUrl||We,debug:t.debug||!1,storage:t.storage||"localStorage",locale:t.locale||me,appId:t.appId||""},h.configure(this.config.storage),de(i=>{this._token=i.accessToken}),ge(()=>{this._user=null,this._token=null,h.remove(p.TOKEN_DATA),h.remove(p.USER),y.emit("authExpired"),this.config?.debug&&console.warn("[PlaysoutSDK] Auth expired, logged out")});let e=h.getJSON(p.TOKEN_DATA);this._user=h.getJSON(p.USER),this._locale=h.get(p.LOCALE)||this.config.locale;let a=Math.floor(Date.now()/1e3);if(e&&e.refreshExpiresAt>a&&(this._token=e.accessToken),this._isInitialized=!0,this.config.debug&&(console.log("[PlaysoutSDK] Initialized with config:",this.config),console.log("[PlaysoutSDK] Restored token:",this._token?this._token.substring(0,20)+"...":"(none)")),y.emit("initialized"),e){let i=Math.floor(Date.now()/1e3);if(e.expiresAt-i<=300)try{let r=D();r.configure(this.config),await r.refreshToken();let n=h.getJSON(p.TOKEN_DATA);n&&(this._token=n.accessToken),this.config.debug&&console.log("[PlaysoutSDK] Token proactively refreshed at init")}catch(r){this.config.debug&&console.warn("[PlaysoutSDK] Proactive refresh failed, will retry on next request:",r)}}}destroy(){this.config=null,this._isInitialized=!1,this._user=null,this._token=null,h.clear(),y.clear()}get isInitialized(){return this._isInitialized}get isLoggedIn(){return!!this._token}get user(){return this._user}get token(){return this._token}get locale(){return this._locale}get sdkConfig(){return this.config}async Login(t){this.ensureInitialized(),this.config?.debug&&console.log("[PlaysoutSDK] Login with params:",t);let e=D();e.configure(this.config);let a=await e.loginOnly(t);h.setJSON(p.TOKEN_DATA,a),this.config?.debug&&console.log("[PlaysoutSDK] Token saved, expires at:",new Date(a.expiresAt*1e3).toISOString());let i;try{i=await e.getUserInfo()}catch(r){this.config?.debug&&console.log("[PlaysoutSDK] getUserInfo failed, login still success:",r)}return this._token=a.accessToken,i&&(this._user={userId:String(i.id),username:i.username},h.setJSON(p.USER,this._user)),this.config?.debug&&console.log("[PlaysoutSDK] Login success, user:",i),y.emit("login",{user:this._user,token:this._token}),{tokenData:a,user:i}}async getUserInfo(){if(this.ensureInitialized(),!this._token)throw g("NOT_LOGGED_IN","Please login first");let t=D();t.configure(this.config);let e=await t.getUserInfo();return this.config?.debug&&console.log("[PlaysoutSDK] getUserInfo result:",e),e&&(this._user={userId:String(e.id),username:e.username},h.setJSON(p.USER,this._user)),e}logout(){this._user=null,this._token=null,h.remove(p.TOKEN_DATA),h.remove(p.USER),y.emit("logout")}getToken(){return this.ensureInitialized(),this._token}getUser(){return this.ensureInitialized(),this._user}setLocale(t){if(this.ensureInitialized(),!["zh","en","ja","ko","vi","th","id","ms"].includes(t))throw g("INVALID_PARAMS",`Unsupported locale: ${t}`);this._locale=t,h.set(p.LOCALE,t),this.config?.debug&&console.log("[PlaysoutSDK] Locale changed to:",t);let e=this._widget||document.querySelector("playsout-widget");e&&e.getAttribute("locale")!==t&&e.setAttribute("locale",t),y.emit("localeChange",t)}getLocale(){return this.ensureInitialized(),this._locale}async getGames(t){this.ensureInitialized();let e=w();if(t?.category&&(e=e.filter(a=>a.category===t.category)),t?.search){let a=t.search.toLowerCase();e=e.filter(i=>i.title.toLowerCase().includes(a)||i.category.toLowerCase().includes(a)||i.description&&i.description.toLowerCase().includes(a))}if(t?.sortBy)switch(t.sortBy){case"newest":e=e.filter(a=>a.isNew).concat(e.filter(a=>!a.isNew));break;case"rating":e=e.filter(a=>a.isHot).concat(e.filter(a=>!a.isHot));break}if(t?.page&&t?.pageSize){let a=(t.page-1)*t.pageSize;e=e.slice(a,a+t.pageSize)}return e}async getCategories(){this.ensureInitialized();let t=w(),e=new Map;return t.forEach(a=>{let i=e.get(a.category)||0;e.set(a.category,i+1)}),Array.from(e.entries()).map(([a,i],r)=>({id:`category_${r}`,name:a,count:i}))}async getGameById(t){return this.ensureInitialized(),w().find(e=>e.id===t)}mount(t,e){if(this.ensureInitialized(),typeof document>"u")throw g("FEATURE_NOT_SUPPORTED","mount requires DOM environment");let a=document.querySelector(t);if(!a)throw g("INVALID_PARAMS",`Container not found: ${t}`);let i=document.createElement("playsout-widget");this.config?.appId&&i.setAttribute("app-id",this.config.appId),i.setAttribute("locale",e?.locale||this._locale),i.setAttribute("theme",e?.theme||"dark"),e?.detailMode&&i.setAttribute("detail-mode",e.detailMode),this._widget=i,e?.onGameClick&&i.addEventListener("game-click",r=>{let n=r;e.onGameClick(n.detail)}),e?.onLoginRequired&&i.addEventListener("login-required",e.onLoginRequired),e?.onLocaleChange&&i.addEventListener("locale-change",r=>{let n=r;e.onLocaleChange(n.detail)}),a.appendChild(i),this.config?.debug&&console.log("[PlaysoutSDK] Widget mounted to:",t)}unmount(){let t=document.querySelector("playsout-widget");t&&t.remove(),this._widget=null}on(t,e){return this.ensureInitialized(),y.on(t,e)}off(t,e){this.ensureInitialized(),y.off(t,e)}ensureInitialized(){if(!this._isInitialized)throw g("NOT_INITIALIZED")}},l=C.getInstance();typeof window<"u"&&(window.__playsout_sdk_instance=l);var N=Object.freeze({init:l.init.bind(l),mount:l.mount.bind(l),unmount:l.unmount.bind(l),destroy:l.destroy.bind(l),Login:l.Login.bind(l),logout:l.logout.bind(l),getToken:l.getToken.bind(l),getUserInfo:l.getUserInfo.bind(l),getUser:l.getUser.bind(l),setLocale:l.setLocale.bind(l),getLocale:l.getLocale.bind(l),getGames:l.getGames.bind(l),getCategories:l.getCategories.bind(l),on:l.on.bind(l),off:l.off.bind(l),get isInitialized(){return l.isInitialized},get isLoggedIn(){return l.isLoggedIn},instance:l,PlaysoutSDKClass:C});var Ve="games.playsout.com";var ee="__playsout_img_cache_v1",H=`${ee}_blob_`,K=!1,U=4*1024*1024-1024*1024;function c(...o){}var T=new Map,O=new Map,Ye=50,L=new Map,B=new Map,v=0;function te(){try{let o=localStorage.getItem(ee);if(!o)return c("loadCacheIndex: \u65E0\u7F13\u5B58\u7D22\u5F15"),v=0,new Map;let t=JSON.parse(o);c("loadCacheIndex: \u52A0\u8F7D\u4E86",t.length,"\u6761\u8BB0\u5F55"),v=0;for(let e of t){let a=`${H}${btoa(e.url).replace(/[\/+=]/g,"_")}`;localStorage.getItem(a)&&(v+=e.size)}return c("loadCacheIndex: \u5F53\u524D blob \u603B\u91CF",v,"bytes"),new Map(t.map(e=>[e.url,e]))}catch{return c("loadCacheIndex: \u89E3\u6790\u5931\u8D25"),v=0,new Map}}function j(o){try{let t=Array.from(o.values());t.length>200&&(t.sort((e,a)=>a.timestamp-e.timestamp),t.length=200),localStorage.setItem(ee,JSON.stringify(t)),c("saveCacheIndex: \u4FDD\u5B58\u4E86",t.length,"\u6761\u8BB0\u5F55")}catch(t){c("saveCacheIndex: \u4FDD\u5B58\u5931\u8D25",t)}}function Je(o,t){if(!(v+t<=U))try{let e=te(),a=Array.from(e.values()).map(i=>({record:i,score:pe(i.url)??1/0})).filter(i=>i.score>o).sort((i,r)=>r.score-i.score);for(let{record:i}of a){if(v+t<=U)break;let r=`${H}${btoa(i.url).replace(/[\/+=]/g,"_")}`;localStorage.removeItem(r),e.delete(i.url),v-=i.size,c("evictLowerPriorityEntries: \u91CA\u653E\u4F4E\u4F18\u5148\u7EA7\u7F13\u5B58",i.url,"\u8282\u7701",i.size,"bytes")}j(e)}catch(e){c("evictLowerPriorityEntries: \u5931\u8D25",e)}}function he(o,t){if(T.size>=Ye){let e=null,a=1/0;for(let[i,r]of T)r.lastAccess<a&&(a=r.lastAccess,e=i);if(e){let i=T.get(e);URL.revokeObjectURL(URL.createObjectURL(i.blob)),T.delete(e),c("addToMemoryCache: LRU\u6DD8\u6C70",e)}}T.set(o,{blob:t,lastAccess:Date.now()}),c("addToMemoryCache: \u6DFB\u52A0\u5230\u5185\u5B58\u7F13\u5B58",o,"\u5927\u5C0F:",t.size,"bytes")}async function Ze(o){if(!K)return;if(O.has(o)){c("cacheImage:",o,"\u8BE5\u8BF7\u6C42\u5DF2\u5728\u8FDB\u884C\u4E2D\uFF0C\u7B49\u5F85\u5B8C\u6210"),await O.get(o);return}c("cacheImage: \u5F00\u59CB\u4E0B\u8F7D",o);let t=(async()=>{try{let e=await fetch(o);if(!e.ok){c("cacheImage:",o,"\u54CD\u5E94\u5931\u8D25",e.status);return}let a=await e.blob(),i=e.headers.get("ETag")||"";c("cacheImage:",o,"\u4E0B\u8F7D\u6210\u529F\uFF0C\u5927\u5C0F:",a.size,"ETag:",i),he(o,a);let r=pe(o);if(r!==void 0)if(Je(r,a.size),v+a.size<=U)try{let n=te();n.set(o,{url:o,timestamp:Date.now(),etag:i,size:a.size}),j(n);let d=JSON.stringify({type:a.type,data:Array.from(new Uint8Array(await a.arrayBuffer()))}),m=`${H}${btoa(o).replace(/[\/+=]/g,"_")}`;localStorage.setItem(m,d),v+=a.size,c("cacheImage:",o,"\u5DF2\u4FDD\u5B58\u5230localStorage\uFF08\u5360\u7528",a.size,"bytes\uFF0C\u9884\u7B97\u5269\u4F59",U-v,"\uFF09")}catch(n){n.name==="QuotaExceededError"?c("cacheImage: localStorage \u914D\u989D\u5DF2\u6EE1\uFF0C\u505C\u6B62\u5199\u5165"):c("cacheImage:",o,"localStorage\u4FDD\u5B58\u5931\u8D25",n)}else c("cacheImage:",o,"\u817E\u51FA\u7A7A\u95F4\u540E\u4ECD\u8D85\u8FC7\u9884\u7B97\uFF0C\u8DF3\u8FC7");else c("cacheImage:",o,"\u975E\u4F18\u5148\u7EA7URL\uFF0C\u4E0D\u5199\u5165localStorage")}catch(e){c("cacheImage:",o,"\u4E0B\u8F7D\u5931\u8D25",e)}finally{O.delete(o)}})();O.set(o,t)}function ae(o){try{if(new URL(o).hostname===Ve)return c("isCacheableImage:",o,"\u662FCDN\u56FE\u7247"),!0}catch{}return o.startsWith("/games/")||o.startsWith("./games/")||o.startsWith("/home-")||o.startsWith("./home-")||o.startsWith("/logo")||o.startsWith("./logo")?(c("isCacheableImage:",o,"\u662F\u672C\u5730\u56FE\u7247"),!0):(c("isCacheableImage:",o,"\u4E0D\u662F\u53EF\u7F13\u5B58\u7684\u56FE\u7247"),!1)}function pe(o){return B.has(o)?B.get(o):L.get(o)}function fe(o){if(!K)return;let t=-1e3;for(let e of o)ae(e)&&B.set(e,t++);c("setCriticalAssets: \u5171",B.size,"\u4E2A\u5173\u952E\u8D44\u6E90")}function be(o,t=!1){if(!K)return;t||L.clear();let e=0;if(t){for(let i of L.values())i>e&&(e=i);e+=1}let a=e;for(let i of o)ae(i)&&L.set(i,a++);c("setPriorityCache: \u5F53\u524D\u5171",L.size,"\u4E2A\u4F18\u5148\u7F13\u5B58URL")}function ye(o){if(!K)return o;if(c("resolveWithCache:",o),!ae(o))return c("resolveWithCache:",o,"\u4E0D\u662FCDN\u56FE\u7247\uFF0C\u539F\u6837\u8FD4\u56DE"),o;if(T.has(o)){let e=T.get(o);e.lastAccess=Date.now();try{let a=URL.createObjectURL(e.blob);return c("resolveWithCache:",o,"\u547D\u4E2D\u5185\u5B58\u7F13\u5B58\uFF0C\u8FD4\u56DEblob URL"),a}catch{c("resolveWithCache:",o,"\u521B\u5EFAblob URL\u5931\u8D25")}}let t=te();if(t.has(o)){let e=`${H}${btoa(o).replace(/[\/+=]/g,"_")}`,a=localStorage.getItem(e);if(a)try{let{type:i,data:r}=JSON.parse(a),n=new Blob([new Uint8Array(r)],{type:i});he(o,n);let d=URL.createObjectURL(n);return c("resolveWithCache:",o,"\u547D\u4E2DlocalStorage\u7F13\u5B58\uFF0C\u540C\u6B65\u8FD4\u56DEblob URL"),d}catch(i){c("resolveWithCache:",o,"localStorage blob\u89E3\u6790\u5931\u8D25\uFF0C\u6E05\u9664\u7F13\u5B58",i),t.delete(o),j(t),localStorage.removeItem(e)}else c("resolveWithCache:",o,"localStorage blob\u4E0D\u5B58\u5728\uFF0C\u6E05\u9664\u7D22\u5F15"),t.delete(o),j(t)}return c("resolveWithCache:",o,"\u5B8C\u5168\u6CA1\u6709\u7F13\u5B58\uFF0C\u540E\u53F0\u4E0B\u8F7D"),Ze(o),o}var ve={app:{title:"Playsout Mini Games",description:"Play quick games without login."},home:{loggedIn:"Logged in",logIn:"Log in",games:"Games",bannerAlt:"Playsout Games",searchPlaceholder:"Search by title or category",noGames:"No games found"},profile:{title:"Profile",settings:"Settings",language:"Language",recentGames:"Recently Played Games",noGames:"No games played yet",guest:"Guest",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Adventure",Simulation:"Simulation",Casual:"Casual",Arcade:"Arcade",Moba:"Moba",Puzzle:"Puzzle"},auth:{loginSuccess:"Login successful!",loginTitle:"Playsout Login",welcome:"Welcome to the Playsout game platform",prompt:"Log in to start playing",mustLogin:"You must log in to play",authorizeHint:"Click the button below to authorize your login",authorizing:"Authorizing...",authorize:"Authorize login",terms:"By authorizing, you agree to our Terms of Service",signingIn:"Signing In",signMessage:"Please sign the message in your wallet"},game:{loading:"Loading",notFound:"Game not found",backHome:"Back to home",pageTitleSuffix:"Game Platform",header:{back:"Back",shareAria:"Share game",toggleMenuAria:"Toggle menu",fallbackTitle:"Game"}},menu:{favorite:"Favorite",favorited:"Favorited",profile:"Profile",login:"Login",refresh:"Refresh",loggedIn:"Logged in"},share:{title:"Share Game",closeLabel:"Close",retry:"Retry",loading:"Loading...",imageAlt:"Game share image",shareUrlLabel:"Share URL:",copied:"Copied",copy:"Copy",saveShare:"Save & Share",hint:"Image includes a QR code that links to this game",loadError:"Failed to load share image",downloadError:"Failed to download image"},checkin:{successTitle:"You got rewards!",successMessage:"Your rewards have been claimed.",failedTitle:"Check-in failed",canceledTitle:"Check-in canceled",errors:{userRejected:"You canceled the check-in operation",insufficientFunds:"Insufficient funds to pay gas",alreadyCheckedIn:"You already checked in today. Come back tomorrow!",network:"Network error. Please try again later"}},store:{title:"Gem Store",hot:"HOT",buy:"BUY",cancel:"Cancel",unit:"Gems",successTitle:"Payment Successful",successMessage:"You received {amount} gems!"},payment:{title:"Confirm Purchase",insufficientTitle:"Insufficient Balance",insufficientDesc:"Available: {gems} Gems",cancel:"Cancel",confirm:"Confirm",recharge:"Recharge",successTitle:"Payment Successful",successMessage:"{cost} <gem></gem> have been deducted."}};var we={app:{title:"Playsout \u5C0F\u6E38\u620F",description:"\u65E0\u9700\u767B\u5F55\u5373\u53EF\u7545\u73A9\u5C0F\u6E38\u620F\u3002"},home:{loggedIn:"\u5DF2\u767B\u5F55",logIn:"\u767B\u5F55",games:"\u6E38\u620F",bannerAlt:"Playsout \u6E38\u620F",searchPlaceholder:"\u6309\u6807\u9898\u6216\u7C7B\u522B\u641C\u7D22",noGames:"\u672A\u627E\u5230\u6E38\u620F"},profile:{title:"\u4E2A\u4EBA\u4E2D\u5FC3",settings:"\u8BBE\u7F6E",language:"\u8BED\u8A00",recentGames:"\u6700\u8FD1\u73A9\u8FC7\u7684\u6E38\u620F",noGames:"\u8FD8\u6CA1\u6709\u73A9\u8FC7\u6E38\u620F",guest:"\u6E38\u5BA2",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\u5192\u9669",Simulation:"\u6A21\u62DF",Casual:"\u4F11\u95F2",Arcade:"\u8857\u673A",Moba:"MOBA",Puzzle:"\u76CA\u667A"},auth:{loginSuccess:"\u767B\u5F55\u6210\u529F!",loginTitle:"Playsout \u767B\u5F55",welcome:"\u6B22\u8FCE\u6765\u5230 Playsout \u6E38\u620F\u5E73\u53F0",prompt:"\u767B\u5F55\u5F00\u59CB\u6E38\u620F",mustLogin:"\u60A8\u5FC5\u987B\u767B\u5F55\u624D\u80FD\u73A9\u6E38\u620F",authorizeHint:"\u70B9\u51FB\u4E0B\u65B9\u6309\u94AE\u6388\u6743\u767B\u5F55",authorizing:"\u6388\u6743\u4E2D...",authorize:"\u6388\u6743\u767B\u5F55",terms:"\u6388\u6743\u5373\u8868\u793A\u60A8\u540C\u610F\u6211\u4EEC\u7684\u670D\u52A1\u6761\u6B3E",signingIn:"\u767B\u5F55\u4E2D",signMessage:"\u8BF7\u5728\u94B1\u5305\u4E2D\u7B7E\u540D"},game:{loading:"\u52A0\u8F7D\u4E2D",notFound:"\u627E\u4E0D\u5230\u6E38\u620F",backHome:"\u8FD4\u56DE\u9996\u9875",pageTitleSuffix:"\u6E38\u620F\u5E73\u53F0",header:{back:"\u8FD4\u56DE",shareAria:"\u5206\u4EAB\u6E38\u620F",toggleMenuAria:"\u5207\u6362\u83DC\u5355",fallbackTitle:"\u6E38\u620F"}},menu:{favorite:"\u6536\u85CF",favorited:"\u5DF2\u6536\u85CF",profile:"\u4E2A\u4EBA\u4E2D\u5FC3",login:"\u767B\u5F55",refresh:"\u5237\u65B0",loggedIn:"\u5DF2\u767B\u5F55"},share:{title:"\u5206\u4EAB\u6E38\u620F",closeLabel:"\u5173\u95ED",retry:"\u91CD\u8BD5",loading:"\u52A0\u8F7D\u4E2D...",imageAlt:"\u6E38\u620F\u5206\u4EAB\u56FE\u7247",shareUrlLabel:"\u5206\u4EAB\u94FE\u63A5:",copied:"\u5DF2\u590D\u5236",copy:"\u590D\u5236",saveShare:"\u4FDD\u5B58\u5E76\u5206\u4EAB",hint:"\u56FE\u7247\u5305\u542B\u6B64\u6E38\u620F\u7684\u4E8C\u7EF4\u7801",loadError:"\u52A0\u8F7D\u5206\u4EAB\u56FE\u7247\u5931\u8D25",downloadError:"\u4E0B\u8F7D\u56FE\u7247\u5931\u8D25"},checkin:{successTitle:"\u9886\u53D6\u6210\u529F!",successMessage:"\u60A8\u7684\u5956\u52B1\u5DF2\u9886\u53D6\u3002",failedTitle:"\u7B7E\u5230\u5931\u8D25",canceledTitle:"\u7B7E\u5230\u53D6\u6D88",errors:{userRejected:"\u60A8\u53D6\u6D88\u4E86\u7B7E\u5230\u64CD\u4F5C",insufficientFunds:"\u4F59\u989D\u4E0D\u8DB3\u4EE5\u652F\u4ED8 Gas \u8D39",alreadyCheckedIn:"\u4ECA\u5929\u5DF2\u7ECF\u7B7E\u5230\u8FC7\u4E86\u3002\u660E\u5929\u518D\u6765\u5427!",network:"\u7F51\u7EDC\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5"}},store:{title:"\u5B9D\u77F3\u5546\u5E97",hot:"\u70ED\u95E8",buy:"\u8D2D\u4E70",cancel:"\u53D6\u6D88",unit:"\u5B9D\u77F3",successTitle:"\u652F\u4ED8\u6210\u529F",successMessage:"\u60A8\u83B7\u5F97\u4E86 {amount} \u5B9D\u77F3\uFF01"},payment:{title:"\u786E\u8BA4\u8D2D\u4E70",insufficientTitle:"\u4F59\u989D\u4E0D\u8DB3",insufficientDesc:"\u53EF\u7528\u4F59\u989D: {gems} \u5B9D\u77F3",cancel:"\u53D6\u6D88",confirm:"\u786E\u8BA4",recharge:"\u5145\u503C",successTitle:"\u652F\u4ED8\u6210\u529F",successMessage:"\u5DF2\u6263\u9664 {cost}<gem></gem>\u3002"}};var ke={app:{title:"Playsout \u30DF\u30CB\u30B2\u30FC\u30E0",description:"\u30ED\u30B0\u30A4\u30F3\u306A\u3057\u3067\u30B2\u30FC\u30E0\u3092\u30D7\u30EC\u30A4\u3002"},home:{loggedIn:"\u30ED\u30B0\u30A4\u30F3\u6E08\u307F",logIn:"\u30ED\u30B0\u30A4\u30F3",games:"\u30B2\u30FC\u30E0",bannerAlt:"Playsout \u30B2\u30FC\u30E0",searchPlaceholder:"\u30BF\u30A4\u30C8\u30EB\u307E\u305F\u306F\u30AB\u30C6\u30B4\u30EA\u3067\u691C\u7D22",noGames:"\u30B2\u30FC\u30E0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093"},profile:{title:"\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB",settings:"\u8A2D\u5B9A",language:"\u8A00\u8A9E",recentGames:"\u6700\u8FD1\u30D7\u30EC\u30A4\u3057\u305F\u30B2\u30FC\u30E0",noGames:"\u307E\u3060\u30D7\u30EC\u30A4\u3057\u305F\u30B2\u30FC\u30E0\u304C\u3042\u308A\u307E\u305B\u3093",guest:"\u30B2\u30B9\u30C8",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\u30A2\u30C9\u30D9\u30F3\u30C1\u30E3\u30FC",Simulation:"\u30B7\u30DF\u30E5\u30EC\u30FC\u30B7\u30E7\u30F3",Casual:"\u30AB\u30B8\u30E5\u30A2\u30EB",Arcade:"\u30A2\u30FC\u30B1\u30FC\u30C9",Moba:"MOBA",Puzzle:"\u30D1\u30BA\u30EB"},auth:{loginSuccess:"\u30ED\u30B0\u30A4\u30F3\u6210\u529F!",loginTitle:"Playsout \u30ED\u30B0\u30A4\u30F3",welcome:"Playsout \u30B2\u30FC\u30E0\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u3078\u3088\u3046\u3053\u305D",prompt:"\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u30D7\u30EC\u30A4\u3092\u958B\u59CB",mustLogin:"\u30D7\u30EC\u30A4\u3059\u308B\u306B\u306F\u30ED\u30B0\u30A4\u30F3\u304C\u5FC5\u8981\u3067\u3059",authorizeHint:"\u4E0B\u306E\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044",authorizing:"\u627F\u8A8D\u4E2D...",authorize:"\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D",terms:"\u627F\u8A8D\u3059\u308B\u3053\u3068\u3067\u3001\u5229\u7528\u898F\u7D04\u306B\u540C\u610F\u3057\u305F\u3053\u3068\u306B\u306A\u308A\u307E\u3059",signingIn:"\u30B5\u30A4\u30F3\u30A4\u30F3\u4E2D",signMessage:"\u30A6\u30A9\u30EC\u30C3\u30C8\u3067\u30E1\u30C3\u30BB\u30FC\u30B8\u306B\u7F72\u540D\u3057\u3066\u304F\u3060\u3055\u3044"},game:{loading:"\u8AAD\u307F\u8FBC\u307F\u4E2D",notFound:"\u30B2\u30FC\u30E0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093",backHome:"\u30DB\u30FC\u30E0\u306B\u623B\u308B",pageTitleSuffix:"\u30B2\u30FC\u30E0\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0",header:{back:"\u623B\u308B",shareAria:"\u30B2\u30FC\u30E0\u3092\u5171\u6709",toggleMenuAria:"\u30E1\u30CB\u30E5\u30FC\u5207\u308A\u66FF\u3048",fallbackTitle:"\u30B2\u30FC\u30E0"}},menu:{favorite:"\u304A\u6C17\u306B\u5165\u308A",favorited:"\u304A\u6C17\u306B\u5165\u308A\u6E08\u307F",profile:"\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB",login:"\u30ED\u30B0\u30A4\u30F3",refresh:"\u66F4\u65B0",loggedIn:"\u30ED\u30B0\u30A4\u30F3\u6E08\u307F"},share:{title:"\u30B2\u30FC\u30E0\u3092\u5171\u6709",closeLabel:"\u9589\u3058\u308B",retry:"\u518D\u8A66\u884C",loading:"\u8AAD\u307F\u8FBC\u307F\u4E2D...",imageAlt:"\u30B2\u30FC\u30E0\u5171\u6709\u753B\u50CF",shareUrlLabel:"\u5171\u6709URL:",copied:"\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F",copy:"\u30B3\u30D4\u30FC",saveShare:"\u4FDD\u5B58\u3057\u3066\u5171\u6709",hint:"\u753B\u50CF\u306B\u306F\u30B2\u30FC\u30E0\u3078\u306EQR\u30B3\u30FC\u30C9\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059",loadError:"\u5171\u6709\u753B\u50CF\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F",downloadError:"\u753B\u50CF\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F"},checkin:{successTitle:"\u5831\u916C\u3092\u7372\u5F97\u3057\u307E\u3057\u305F!",successMessage:"\u5831\u916C\u304C\u8ACB\u6C42\u3055\u308C\u307E\u3057\u305F\u3002",failedTitle:"\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u5931\u6557",canceledTitle:"\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u30AD\u30E3\u30F3\u30BB\u30EB",errors:{userRejected:"\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u64CD\u4F5C\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F",insufficientFunds:"\u30AC\u30B9\u4EE3\u3092\u652F\u6255\u3046\u6B8B\u9AD8\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059",alreadyCheckedIn:"\u672C\u65E5\u306F\u65E2\u306B\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u6E08\u307F\u3067\u3059\u3002\u660E\u65E5\u307E\u305F\u6765\u3066\u304F\u3060\u3055\u3044!",network:"\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30A8\u30E9\u30FC\u3002\u5F8C\u3067\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044"}},store:{title:"\u30B8\u30A7\u30E0\u30B9\u30C8\u30A2",hot:"HOT",buy:"\u8CFC\u5165",cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB",unit:"\u30B8\u30A7\u30E0",successTitle:"\u652F\u6255\u3044\u5B8C\u4E86",successMessage:"{amount}\u30B8\u30A7\u30E0\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\uFF01"},payment:{title:"\u8CFC\u5165\u78BA\u8A8D",insufficientTitle:"\u6B8B\u9AD8\u4E0D\u8DB3",insufficientDesc:"\u4FDD\u6709: {gems} \u30B8\u30A7\u30E0",cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB",confirm:"\u78BA\u8A8D",recharge:"\u30C1\u30E3\u30FC\u30B8",successTitle:"\u652F\u6255\u3044\u5B8C\u4E86",successMessage:"{cost}<gem></gem>\u304C\u5DEE\u3057\u5F15\u304B\u308C\u307E\u3057\u305F\u3002"}};var xe={app:{title:"Playsout \uBBF8\uB2C8 \uAC8C\uC784",description:"\uB85C\uADF8\uC778 \uC5C6\uC774 \uAC8C\uC784\uC744 \uC990\uAE30\uC138\uC694."},home:{loggedIn:"\uB85C\uADF8\uC778\uB428",logIn:"\uB85C\uADF8\uC778",games:"\uAC8C\uC784",bannerAlt:"Playsout \uAC8C\uC784",searchPlaceholder:"\uC81C\uBAA9 \uB610\uB294 \uCE74\uD14C\uACE0\uB9AC\uB85C \uAC80\uC0C9",noGames:"\uAC8C\uC784\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4"},profile:{title:"\uD504\uB85C\uD544",settings:"\uC124\uC815",language:"\uC5B8\uC5B4",recentGames:"\uCD5C\uADFC \uD50C\uB808\uC774\uD55C \uAC8C\uC784",noGames:"\uC544\uC9C1 \uD50C\uB808\uC774\uD55C \uAC8C\uC784\uC774 \uC5C6\uC2B5\uB2C8\uB2E4",guest:"\uC190\uB2D8",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\uC5B4\uB4DC\uBCA4\uCC98",Simulation:"\uC2DC\uBBAC\uB808\uC774\uC158",Casual:"\uCE90\uC8FC\uC5BC",Arcade:"\uC544\uCF00\uC774\uB4DC",Moba:"MOBA",Puzzle:"\uD37C\uC990"},auth:{loginSuccess:"\uB85C\uADF8\uC778 \uC131\uACF5!",loginTitle:"Playsout \uB85C\uADF8\uC778",welcome:"Playsout \uAC8C\uC784 \uD50C\uB7AB\uD3FC\uC5D0 \uC624\uC2E0 \uAC83\uC744 \uD658\uC601\uD569\uB2C8\uB2E4",prompt:"\uAC8C\uC784\uC744 \uC2DC\uC791\uD558\uB824\uBA74 \uB85C\uADF8\uC778\uD558\uC138\uC694",mustLogin:"\uAC8C\uC784\uC744 \uD558\uB824\uBA74 \uB85C\uADF8\uC778\uD574\uC57C \uD569\uB2C8\uB2E4",authorizeHint:"\uB85C\uADF8\uC778\uC744 \uC2B9\uC778\uD558\uB824\uBA74 \uC544\uB798 \uBC84\uD2BC\uC744 \uD074\uB9AD\uD558\uC138\uC694",authorizing:"\uC2B9\uC778 \uC911...",authorize:"\uB85C\uADF8\uC778 \uC2B9\uC778",terms:"\uC2B9\uC778\uD558\uBA74 \uC11C\uBE44\uC2A4 \uC57D\uAD00\uC5D0 \uB3D9\uC758\uD558\uAC8C \uB429\uB2C8\uB2E4",signingIn:"\uB85C\uADF8\uC778 \uC911",signMessage:"\uC9C0\uAC11\uC5D0\uC11C \uBA54\uC2DC\uC9C0\uC5D0 \uC11C\uBA85\uD574\uC8FC\uC138\uC694"},game:{loading:"\uB85C\uB529 \uC911",notFound:"\uAC8C\uC784\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",backHome:"\uD648\uC73C\uB85C \uB3CC\uC544\uAC00\uAE30",pageTitleSuffix:"\uAC8C\uC784 \uD50C\uB7AB\uD3FC",header:{back:"\uB4A4\uB85C",shareAria:"\uAC8C\uC784 \uACF5\uC720",toggleMenuAria:"\uBA54\uB274 \uC804\uD658",fallbackTitle:"\uAC8C\uC784"}},menu:{favorite:"\uC990\uACA8\uCC3E\uAE30",favorited:"\uC990\uACA8\uCC3E\uAE30\uB428",profile:"\uD504\uB85C\uD544",login:"\uB85C\uADF8\uC778",refresh:"\uC0C8\uB85C\uACE0\uCE68",loggedIn:"\uB85C\uADF8\uC778\uB428"},share:{title:"\uAC8C\uC784 \uACF5\uC720",closeLabel:"\uB2EB\uAE30",retry:"\uC7AC\uC2DC\uB3C4",loading:"\uB85C\uB529 \uC911...",imageAlt:"\uAC8C\uC784 \uACF5\uC720 \uC774\uBBF8\uC9C0",shareUrlLabel:"\uACF5\uC720 URL:",copied:"\uBCF5\uC0AC\uB428",copy:"\uBCF5\uC0AC",saveShare:"\uC800\uC7A5 \uBC0F \uACF5\uC720",hint:"\uC774\uBBF8\uC9C0\uC5D0 \uAC8C\uC784\uC73C\uB85C \uC5F0\uACB0\uB418\uB294 QR \uCF54\uB4DC\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4",loadError:"\uACF5\uC720 \uC774\uBBF8\uC9C0\uB97C \uBD88\uB7EC\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4",downloadError:"\uC774\uBBF8\uC9C0\uB97C \uB2E4\uC6B4\uB85C\uB4DC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4"},checkin:{successTitle:"\uBCF4\uC0C1\uC744 \uBC1B\uC558\uC2B5\uB2C8\uB2E4!",successMessage:"\uBCF4\uC0C1\uC774 \uC9C0\uAE09\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",failedTitle:"\uCD9C\uC11D \uC2E4\uD328",canceledTitle:"\uCD9C\uC11D \uCDE8\uC18C\uB428",errors:{userRejected:"\uCD9C\uC11D \uC791\uC5C5\uC744 \uCDE8\uC18C\uD588\uC2B5\uB2C8\uB2E4",insufficientFunds:"\uAC00\uC2A4\uBE44\uB97C \uC9C0\uBD88\uD560 \uC790\uAE08\uC774 \uBD80\uC871\uD569\uB2C8\uB2E4",alreadyCheckedIn:"\uC624\uB298 \uC774\uBBF8 \uCD9C\uC11D\uD588\uC2B5\uB2C8\uB2E4. \uB0B4\uC77C \uB2E4\uC2DC \uC624\uC138\uC694!",network:"\uB124\uD2B8\uC6CC\uD06C \uC624\uB958. \uB098\uC911\uC5D0 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694"}},store:{title:"\uBCF4\uC11D \uC0C1\uC810",hot:"\uC778\uAE30",buy:"\uAD6C\uB9E4",cancel:"\uCDE8\uC18C",unit:"\uBCF4\uC11D",successTitle:"\uACB0\uC81C \uC131\uACF5",successMessage:"{amount}\uAC1C\uC758 \uBCF4\uC11D\uC744 \uBC1B\uC558\uC2B5\uB2C8\uB2E4!"},payment:{title:"\uAD6C\uB9E4 \uD655\uC778",insufficientTitle:"\uC794\uC561 \uBD80\uC871",insufficientDesc:"\uBCF4\uC720: {gems} \uBCF4\uC11D",cancel:"\uCDE8\uC18C",confirm:"\uD655\uC778",recharge:"\uCDA9\uC804",successTitle:"\uACB0\uC81C \uC131\uACF5",successMessage:"{cost}<gem></gem>\uC774 \uCC28\uAC10\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}};var Se={app:{title:"Playsout \u0E21\u0E34\u0E19\u0E34\u0E40\u0E01\u0E21",description:"\u0E40\u0E25\u0E48\u0E19\u0E40\u0E01\u0E21\u0E14\u0E48\u0E27\u0E19\u0E42\u0E14\u0E22\u0E44\u0E21\u0E48\u0E15\u0E49\u0E2D\u0E07\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A"},home:{loggedIn:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E41\u0E25\u0E49\u0E27",logIn:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",games:"\u0E40\u0E01\u0E21",bannerAlt:"\u0E40\u0E01\u0E21 Playsout",searchPlaceholder:"\u0E04\u0E49\u0E19\u0E2B\u0E32\u0E15\u0E32\u0E21\u0E0A\u0E37\u0E48\u0E2D\u0E2B\u0E23\u0E37\u0E2D\u0E2B\u0E21\u0E27\u0E14\u0E2B\u0E21\u0E39\u0E48",noGames:"\u0E44\u0E21\u0E48\u0E1E\u0E1A\u0E40\u0E01\u0E21"},profile:{title:"\u0E42\u0E1B\u0E23\u0E44\u0E1F\u0E25\u0E4C",settings:"\u0E01\u0E32\u0E23\u0E15\u0E31\u0E49\u0E07\u0E04\u0E48\u0E32",language:"\u0E20\u0E32\u0E29\u0E32",recentGames:"\u0E40\u0E01\u0E21\u0E17\u0E35\u0E48\u0E40\u0E25\u0E48\u0E19\u0E25\u0E48\u0E32\u0E2A\u0E38\u0E14",noGames:"\u0E22\u0E31\u0E07\u0E44\u0E21\u0E48\u0E21\u0E35\u0E40\u0E01\u0E21\u0E17\u0E35\u0E48\u0E40\u0E25\u0E48\u0E19",guest:"\u0E1C\u0E39\u0E49\u0E40\u0E22\u0E35\u0E48\u0E22\u0E21\u0E0A\u0E21",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\u0E1C\u0E08\u0E0D\u0E20\u0E31\u0E22",Simulation:"\u0E08\u0E33\u0E25\u0E2D\u0E07\u0E2A\u0E16\u0E32\u0E19\u0E01\u0E32\u0E23\u0E13\u0E4C",Casual:"\u0E41\u0E04\u0E0A\u0E0A\u0E27\u0E25",Arcade:"\u0E2D\u0E32\u0E23\u0E4C\u0E40\u0E04\u0E14",Moba:"\u0E42\u0E21\u0E1A\u0E32",Puzzle:"\u0E1B\u0E23\u0E34\u0E28\u0E19\u0E32"},auth:{loginSuccess:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08!",loginTitle:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A Playsout",welcome:"\u0E22\u0E34\u0E19\u0E14\u0E35\u0E15\u0E49\u0E2D\u0E19\u0E23\u0E31\u0E1A\u0E2A\u0E39\u0E48\u0E41\u0E1E\u0E25\u0E15\u0E1F\u0E2D\u0E23\u0E4C\u0E21\u0E40\u0E01\u0E21 Playsout",prompt:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E23\u0E34\u0E48\u0E21\u0E40\u0E25\u0E48\u0E19",mustLogin:"\u0E04\u0E38\u0E13\u0E15\u0E49\u0E2D\u0E07\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E25\u0E48\u0E19",authorizeHint:"\u0E04\u0E25\u0E34\u0E01\u0E1B\u0E38\u0E48\u0E21\u0E14\u0E49\u0E32\u0E19\u0E25\u0E48\u0E32\u0E07\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",authorizing:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15...",authorize:"\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",terms:"\u0E01\u0E32\u0E23\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E41\u0E2A\u0E14\u0E07\u0E27\u0E48\u0E32\u0E04\u0E38\u0E13\u0E22\u0E2D\u0E21\u0E23\u0E31\u0E1A\u0E02\u0E49\u0E2D\u0E01\u0E33\u0E2B\u0E19\u0E14\u0E43\u0E19\u0E01\u0E32\u0E23\u0E43\u0E2B\u0E49\u0E1A\u0E23\u0E34\u0E01\u0E32\u0E23\u0E02\u0E2D\u0E07\u0E40\u0E23\u0E32",signingIn:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E25\u0E07\u0E0A\u0E37\u0E48\u0E2D\u0E40\u0E02\u0E49\u0E32\u0E43\u0E0A\u0E49",signMessage:"\u0E01\u0E23\u0E38\u0E13\u0E32\u0E40\u0E0B\u0E47\u0E19\u0E0A\u0E37\u0E48\u0E2D\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E43\u0E19\u0E01\u0E23\u0E30\u0E40\u0E1B\u0E4B\u0E32\u0E40\u0E07\u0E34\u0E19\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13"},game:{loading:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E42\u0E2B\u0E25\u0E14",notFound:"\u0E44\u0E21\u0E48\u0E1E\u0E1A\u0E40\u0E01\u0E21",backHome:"\u0E01\u0E25\u0E31\u0E1A\u0E2B\u0E19\u0E49\u0E32\u0E2B\u0E25\u0E31\u0E01",pageTitleSuffix:"\u0E41\u0E1E\u0E25\u0E15\u0E1F\u0E2D\u0E23\u0E4C\u0E21\u0E40\u0E01\u0E21",header:{back:"\u0E01\u0E25\u0E31\u0E1A",shareAria:"\u0E41\u0E0A\u0E23\u0E4C\u0E40\u0E01\u0E21",toggleMenuAria:"\u0E2A\u0E25\u0E31\u0E1A\u0E40\u0E21\u0E19\u0E39",fallbackTitle:"\u0E40\u0E01\u0E21"}},menu:{favorite:"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E42\u0E1B\u0E23\u0E14",favorited:"\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E43\u0E19\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E42\u0E1B\u0E23\u0E14\u0E41\u0E25\u0E49\u0E27",profile:"\u0E42\u0E1B\u0E23\u0E44\u0E1F\u0E25\u0E4C",login:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",refresh:"\u0E23\u0E35\u0E40\u0E1F\u0E23\u0E0A",loggedIn:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E41\u0E25\u0E49\u0E27"},share:{title:"\u0E41\u0E0A\u0E23\u0E4C\u0E40\u0E01\u0E21",closeLabel:"\u0E1B\u0E34\u0E14",retry:"\u0E25\u0E2D\u0E07\u0E43\u0E2B\u0E21\u0E48",loading:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E42\u0E2B\u0E25\u0E14...",imageAlt:"\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E41\u0E0A\u0E23\u0E4C\u0E40\u0E01\u0E21",shareUrlLabel:"\u0E41\u0E0A\u0E23\u0E4C URL:",copied:"\u0E04\u0E31\u0E14\u0E25\u0E2D\u0E01\u0E41\u0E25\u0E49\u0E27",copy:"\u0E04\u0E31\u0E14\u0E25\u0E2D\u0E01",saveShare:"\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E41\u0E25\u0E30\u0E41\u0E0A\u0E23\u0E4C",hint:"\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E23\u0E27\u0E21\u0E23\u0E2B\u0E31\u0E2A QR \u0E17\u0E35\u0E48\u0E25\u0E34\u0E07\u0E01\u0E4C\u0E44\u0E1B\u0E22\u0E31\u0E07\u0E40\u0E01\u0E21\u0E19\u0E35\u0E49",loadError:"\u0E42\u0E2B\u0E25\u0E14\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E41\u0E0A\u0E23\u0E4C\u0E44\u0E21\u0E48\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08",downloadError:"\u0E14\u0E32\u0E27\u0E19\u0E4C\u0E42\u0E2B\u0E25\u0E14\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E44\u0E21\u0E48\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08"},checkin:{successTitle:"\u0E04\u0E38\u0E13\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A\u0E23\u0E32\u0E07\u0E27\u0E31\u0E25!",successMessage:"\u0E23\u0E31\u0E1A\u0E23\u0E32\u0E07\u0E27\u0E31\u0E25\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E41\u0E25\u0E49\u0E27",failedTitle:"\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19\u0E25\u0E49\u0E21\u0E40\u0E2B\u0E25\u0E27",canceledTitle:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19",errors:{userRejected:"\u0E04\u0E38\u0E13\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\u0E01\u0E32\u0E23\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19",insufficientFunds:"\u0E40\u0E07\u0E34\u0E19\u0E44\u0E21\u0E48\u0E1E\u0E2D\u0E08\u0E48\u0E32\u0E22\u0E04\u0E48\u0E32\u0E41\u0E01\u0E4A\u0E2A",alreadyCheckedIn:"\u0E04\u0E38\u0E13\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19\u0E27\u0E31\u0E19\u0E19\u0E35\u0E49\u0E44\u0E1B\u0E41\u0E25\u0E49\u0E27 \u0E01\u0E25\u0E31\u0E1A\u0E21\u0E32\u0E43\u0E2B\u0E21\u0E48\u0E1E\u0E23\u0E38\u0E48\u0E07\u0E19\u0E35\u0E49!",network:"\u0E02\u0E49\u0E2D\u0E1C\u0E34\u0E14\u0E1E\u0E25\u0E32\u0E14\u0E40\u0E04\u0E23\u0E37\u0E2D\u0E02\u0E48\u0E32\u0E22 \u0E42\u0E1B\u0E23\u0E14\u0E25\u0E2D\u0E07\u0E43\u0E2B\u0E21\u0E48\u0E20\u0E32\u0E22\u0E2B\u0E25\u0E31\u0E07"}},store:{title:"\u0E23\u0E49\u0E32\u0E19\u0E04\u0E49\u0E32\u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",hot:"\u0E21\u0E32\u0E41\u0E23\u0E07",buy:"\u0E0B\u0E37\u0E49\u0E2D",cancel:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01",unit:"\u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",successTitle:"\u0E0A\u0E33\u0E23\u0E30\u0E40\u0E07\u0E34\u0E19\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08",successMessage:"\u0E04\u0E38\u0E13\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A {amount} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35!"},payment:{title:"\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E01\u0E32\u0E23\u0E0B\u0E37\u0E49\u0E2D",insufficientTitle:"\u0E22\u0E2D\u0E14\u0E04\u0E07\u0E40\u0E2B\u0E25\u0E37\u0E2D\u0E44\u0E21\u0E48\u0E1E\u0E2D",insufficientDesc:"\u0E21\u0E35\u0E2D\u0E22\u0E39\u0E48: {gems} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",cancel:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01",confirm:"\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19",recharge:"\u0E40\u0E15\u0E34\u0E21\u0E40\u0E07\u0E34\u0E19",successTitle:"\u0E0A\u0E33\u0E23\u0E30\u0E40\u0E07\u0E34\u0E19\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08",successMessage:"\u0E2B\u0E31\u0E01 {cost} <gem></gem> \u0E41\u0E25\u0E49\u0E27"}};var Te={app:{title:"Playsout Mini Games",description:"Ch\u01A1i game nhanh kh\xF4ng c\u1EA7n \u0111\u0103ng nh\u1EADp."},home:{loggedIn:"\u0110\xE3 \u0111\u0103ng nh\u1EADp",logIn:"\u0110\u0103ng nh\u1EADp",games:"Tr\xF2 ch\u01A1i",bannerAlt:"Tr\xF2 ch\u01A1i Playsout",searchPlaceholder:"T\xECm ki\u1EBFm theo ti\xEAu \u0111\u1EC1 ho\u1EB7c danh m\u1EE5c",noGames:"Kh\xF4ng t\xECm th\u1EA5y tr\xF2 ch\u01A1i"},profile:{title:"H\u1ED3 s\u01A1",settings:"C\xE0i \u0111\u1EB7t",language:"Ng\xF4n ng\u1EEF",recentGames:"Tr\xF2 ch\u01A1i \u0111\xE3 ch\u01A1i g\u1EA7n \u0111\xE2y",noGames:"Ch\u01B0a ch\u01A1i game n\xE0o",guest:"Kh\xE1ch",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Phi\xEAu l\u01B0u",Simulation:"M\xF4 ph\u1ECFng",Casual:"Ph\u1ED5 th\xF4ng",Arcade:"Arcade",Moba:"Moba",Puzzle:"Gi\u1EA3i \u0111\u1ED1"},auth:{loginSuccess:"\u0110\u0103ng nh\u1EADp th\xE0nh c\xF4ng!",loginTitle:"\u0110\u0103ng nh\u1EADp Playsout",welcome:"Ch\xE0o m\u1EEBng \u0111\u1EBFn v\u1EDBi n\u1EC1n t\u1EA3ng tr\xF2 ch\u01A1i Playsout",prompt:"\u0110\u0103ng nh\u1EADp \u0111\u1EC3 b\u1EAFt \u0111\u1EA7u ch\u01A1i",mustLogin:"B\u1EA1n ph\u1EA3i \u0111\u0103ng nh\u1EADp \u0111\u1EC3 ch\u01A1i",authorizeHint:"Nh\u1EA5p v\xE0o n\xFAt b\xEAn d\u01B0\u1EDBi \u0111\u1EC3 \u1EE7y quy\u1EC1n \u0111\u0103ng nh\u1EADp",authorizing:"\u0110ang \u1EE7y quy\u1EC1n...",authorize:"\u1EE6y quy\u1EC1n \u0111\u0103ng nh\u1EADp",terms:"B\u1EB1ng c\xE1ch \u1EE7y quy\u1EC1n, b\u1EA1n \u0111\u1ED3ng \xFD v\u1EDBi \u0110i\u1EC1u kho\u1EA3n d\u1ECBch v\u1EE5 c\u1EE7a ch\xFAng t\xF4i",signingIn:"\u0110ang \u0111\u0103ng nh\u1EADp",signMessage:"Vui l\xF2ng k\xFD tin nh\u1EAFn trong v\xED c\u1EE7a b\u1EA1n"},game:{loading:"\u0110ang t\u1EA3i",notFound:"Kh\xF4ng t\xECm th\u1EA5y tr\xF2 ch\u01A1i",backHome:"V\u1EC1 trang ch\u1EE7",pageTitleSuffix:"N\u1EC1n t\u1EA3ng tr\xF2 ch\u01A1i",header:{back:"Quay l\u1EA1i",shareAria:"Chia s\u1EBB tr\xF2 ch\u01A1i",toggleMenuAria:"Chuy\u1EC3n \u0111\u1ED5i menu",fallbackTitle:"Tr\xF2 ch\u01A1i"}},menu:{favorite:"Y\xEAu th\xEDch",favorited:"\u0110\xE3 y\xEAu th\xEDch",profile:"H\u1ED3 s\u01A1",login:"\u0110\u0103ng nh\u1EADp",refresh:"L\xE0m m\u1EDBi",loggedIn:"\u0110\xE3 \u0111\u0103ng nh\u1EADp"},share:{title:"Chia s\u1EBB tr\xF2 ch\u01A1i",closeLabel:"\u0110\xF3ng",retry:"Th\u1EED l\u1EA1i",loading:"\u0110ang t\u1EA3i...",imageAlt:"H\xECnh \u1EA3nh chia s\u1EBB tr\xF2 ch\u01A1i",shareUrlLabel:"URL chia s\u1EBB:",copied:"\u0110\xE3 sao ch\xE9p",copy:"Sao ch\xE9p",saveShare:"L\u01B0u & Chia s\u1EBB",hint:"H\xECnh \u1EA3nh bao g\u1ED3m m\xE3 QR li\xEAn k\u1EBFt \u0111\u1EBFn tr\xF2 ch\u01A1i n\xE0y",loadError:"Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c h\xECnh \u1EA3nh chia s\u1EBB",downloadError:"Kh\xF4ng t\u1EA3i xu\u1ED1ng \u0111\u01B0\u1EE3c h\xECnh \u1EA3nh"},checkin:{successTitle:"B\u1EA1n \u0111\xE3 nh\u1EADn ph\u1EA7n th\u01B0\u1EDFng!",successMessage:"Ph\u1EA7n th\u01B0\u1EDFng c\u1EE7a b\u1EA1n \u0111\xE3 \u0111\u01B0\u1EE3c nh\u1EADn.",failedTitle:"\u0110i\u1EC3m danh th\u1EA5t b\u1EA1i",canceledTitle:"\u0110i\u1EC3m danh \u0111\xE3 h\u1EE7y",errors:{userRejected:"B\u1EA1n \u0111\xE3 h\u1EE7y thao t\xE1c \u0111i\u1EC3m danh",insufficientFunds:"Kh\xF4ng \u0111\u1EE7 ti\u1EC1n \u0111\u1EC3 tr\u1EA3 ph\xED Gas",alreadyCheckedIn:"H\xF4m nay b\u1EA1n \u0111\xE3 \u0111i\u1EC3m danh r\u1ED3i. H\xE3y quay l\u1EA1i v\xE0o ng\xE0y mai!",network:"L\u1ED7i m\u1EA1ng. Vui l\xF2ng th\u1EED l\u1EA1i sau"}},store:{title:"C\u1EEDa h\xE0ng \u0110\xE1 qu\xFD",hot:"HOT",buy:"MUA",cancel:"H\u1EE7y",unit:"\u0110\xE1 qu\xFD",successTitle:"Thanh to\xE1n th\xE0nh c\xF4ng",successMessage:"B\u1EA1n \u0111\xE3 nh\u1EADn \u0111\u01B0\u1EE3c {amount} \u0111\xE1 qu\xFD!"},payment:{title:"X\xE1c nh\u1EADn mua",insufficientTitle:"S\u1ED1 d\u01B0 kh\xF4ng \u0111\u1EE7",insufficientDesc:"Hi\u1EC7n c\xF3: {gems} \u0110\xE1 qu\xFD",cancel:"H\u1EE7y",confirm:"X\xE1c nh\u1EADn",recharge:"N\u1EA1p ti\u1EC1n",successTitle:"Thanh to\xE1n th\xE0nh c\xF4ng",successMessage:"\u0110\xE3 tr\u1EEB {cost} <gem></gem>."}};var Ie={app:{title:"Playsout Mini Games",description:"Mainkan game cepat tanpa login."},home:{loggedIn:"Sudah login",logIn:"Login",games:"Game",bannerAlt:"Game Playsout",searchPlaceholder:"Cari berdasarkan judul atau kategori",noGames:"Game tidak ditemukan"},profile:{title:"Profil",settings:"Pengaturan",language:"Bahasa",recentGames:"Game yang Baru Dimainkan",noGames:"Belum ada game yang dimainkan",guest:"Tamu",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Petualangan",Simulation:"Simulasi",Casual:"Kasual",Arcade:"Arcade",Moba:"Moba",Puzzle:"Teka-teki"},auth:{loginSuccess:"Login berhasil!",loginTitle:"Login Playsout",welcome:"Selamat datang di platform game Playsout",prompt:"Login untuk mulai bermain",mustLogin:"Anda harus login untuk bermain",authorizeHint:"Klik tombol di bawah untuk mengotorisasi login",authorizing:"Mengotorisasi...",authorize:"Otorisasi login",terms:"Dengan mengotorisasi, Anda menyetujui Ketentuan Layanan kami",signingIn:"Masuk...",signMessage:"Silakan tanda tangani pesan di dompet Anda"},game:{loading:"Memuat",notFound:"Game tidak ditemukan",backHome:"Kembali ke beranda",pageTitleSuffix:"Platform Game",header:{back:"Kembali",shareAria:"Bagikan game",toggleMenuAria:"Alihkan menu",fallbackTitle:"Game"}},menu:{favorite:"Favorit",favorited:"Difavoritkan",profile:"Profil",login:"Login",refresh:"Segarkan",loggedIn:"Sudah login"},share:{title:"Bagikan Game",closeLabel:"Tutup",retry:"Coba lagi",loading:"Memuat...",imageAlt:"Gambar berbagi game",shareUrlLabel:"URL Berbagi:",copied:"Disalin",copy:"Salin",saveShare:"Simpan & Bagikan",hint:"Gambar termasuk kode QR yang menautkan ke game ini",loadError:"Gagal memuat gambar berbagi",downloadError:"Gagal mengunduh gambar"},checkin:{successTitle:"Anda mendapat hadiah!",successMessage:"Hadiah Anda telah diklaim.",failedTitle:"Check-in gagal",canceledTitle:"Check-in dibatalkan",errors:{userRejected:"Anda membatalkan operasi check-in",insufficientFunds:"Dana tidak cukup untuk membayar biaya Gas",alreadyCheckedIn:"Anda sudah check-in hari ini. Kembali lagi besok!",network:"Kesalahan jaringan. Silakan coba lagi nanti"}},store:{title:"Toko Permata",hot:"HOT",buy:"BELI",cancel:"Batal",unit:"Permata",successTitle:"Pembayaran Berhasil",successMessage:"Anda menerima {amount} permata!"},payment:{title:"Konfirmasi Pembelian",insufficientTitle:"Saldo Tidak Cukup",insufficientDesc:"Tersedia: {gems} Permata",cancel:"Batal",confirm:"Konfirmasi",recharge:"Isi Ulang",successTitle:"Pembayaran Berhasil",successMessage:"{cost} <gem></gem> telah dikurangi."}};var Ae={app:{title:"Permainan Mini Playsout",description:"Main permainan pantas tanpa log masuk."},home:{loggedIn:"Log masuk",logIn:"Log masuk",games:"Permainan",bannerAlt:"Permainan Playsout",searchPlaceholder:"Cari mengikut tajuk atau kategori",noGames:"Tiada permainan dijumpai"},profile:{title:"Profil",settings:"Tetapan",language:"Bahasa",recentGames:"Permainan Baru Dimainkan",noGames:"Belum ada permainan dimainkan",guest:"Pelawat",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Pengembaraan",Simulation:"Simulasi",Casual:"Santai",Arcade:"Arked",Moba:"Moba",Puzzle:"Teka-teki"},auth:{loginSuccess:"Log masuk berjaya!",loginTitle:"Log masuk Playsout",welcome:"Selamat datang ke platform permainan Playsout",prompt:"Log masuk untuk mula bermain",mustLogin:"Anda mesti log masuk untuk bermain",authorizeHint:"Klik butang di bawah untuk membenarkan log masuk",authorizing:"Membenarkan...",authorize:"Benarkan log masuk",terms:"Dengan membenarkan, anda bersetuju dengan Syarat Perkhidmatan kami",signingIn:"Sedang log masuk",signMessage:"Sila tandatangan mesej dalam dompet anda"},game:{loading:"Memuatkan",notFound:"Permainan tidak dijumpai",backHome:"Kembali ke laman utama",pageTitleSuffix:"Platform Permainan",header:{back:"Kembali",shareAria:"Kongsi permainan",toggleMenuAria:"Togol menu",fallbackTitle:"Permainan"}},menu:{favorite:"Kegemaran",favorited:"Dikegemarankan",profile:"Profil",login:"Log masuk",refresh:"Muat semula",loggedIn:"Log masuk"},share:{title:"Kongsi Permainan",closeLabel:"Tutup",retry:"Cuba lagi",loading:"Memuatkan...",imageAlt:"Imej kongsi permainan",shareUrlLabel:"URL Kongsi:",copied:"Disalin",copy:"Salin",saveShare:"Simpan & Kongsi",hint:"Imej termasuk kod QR yang memaut ke permainan ini",loadError:"Gagal memuatkan imej kongsi",downloadError:"Gagal memuat turun imej"},checkin:{successTitle:"Anda mendapat ganjaran!",successMessage:"Ganjaran anda telah dituntut.",failedTitle:"Daftar masuk gagal",canceledTitle:"Daftar masuk dibatalkan",errors:{userRejected:"Anda membatalkan operasi daftar masuk",insufficientFunds:"Dana tidak mencukupi untuk membayar yuran Gas",alreadyCheckedIn:"Anda sudah daftar masuk hari ini. Kembali lagi esok!",network:"Ralat rangkaian. Sila cuba lagi kemudian"}},store:{title:"Kedai Permata",hot:"HOT",buy:"BELI",cancel:"Batal",unit:"Permata",successTitle:"Pembayaran Berjaya",successMessage:"Anda menerima {amount} permata!"},payment:{title:"Sahkan Pembelian",insufficientTitle:"Baki Tidak Mencukupi",insufficientDesc:"Tersedia: {gems} Permata",cancel:"Batal",confirm:"Sahkan",recharge:"Tambah Nilai",successTitle:"Pembayaran Berjaya",successMessage:"{cost} <gem></gem> telah ditolak."}};var P=o=>{if(typeof window>"u")return o;let t=s(o);return ye(t)},nt="https://games.playsout.com/resources/icon/fonts",$=o=>{if(typeof window>"u")return o;let t=o.replace(/^\.\//,"");return`${nt}/${t}`},R={en:ve,zh:we,ja:ke,ko:xe,th:Se,vi:Te,id:Ie,ms:Ae};function oe(o,t){let e=t.split("."),a=o;for(let i of e)if(a&&typeof a=="object"&&i in a)a=a[i];else return t;return typeof a=="string"?a:t}function Ee(o,t={}){return o.replace(/\{(\w+)\}/g,(e,a)=>String(t[a]??`{${a}}`))}var Ce=`
|
|
1
|
+
"use strict";var __PlaysoutBundle=(()=>{var F=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var Ge=Object.getOwnPropertyNames;var Ne=Object.prototype.hasOwnProperty;var ze=(n,t)=>{for(var e in t)F(n,e,{get:t[e],enumerable:!0})},Ue=(n,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Ge(t))!Ne.call(n,r)&&r!==e&&F(n,r,{get:()=>t[r],enumerable:!(a=Oe(t,r))||a.enumerable});return n};var Be=n=>Ue(F({},"__esModule",{value:!0}),n);var Mt={};ze(Mt,{Login:()=>yt,PlaysoutSDKClass:()=>Rt,destroy:()=>ft,getCategories:()=>St,getGames:()=>Et,getLocale:()=>It,getToken:()=>vt,getUser:()=>kt,getUserInfo:()=>wt,init:()=>mt,instance:()=>Ct,isInitialized:()=>At,isLoggedIn:()=>Lt,logout:()=>bt,mount:()=>ht,off:()=>Pt,on:()=>Tt,setLocale:()=>xt,unmount:()=>pt});var v=class extends Error{constructor(e,a,r){super(a);this.code=e;this.details=r;this.name="SDKError"}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details}}},je={NOT_INITIALIZED:"SDK not initialized. Please call PlaysoutSDK.init() first.",ALREADY_INITIALIZED:"SDK already initialized. Please do not call init() more than once.",NOT_LOGGED_IN:"User not logged in. Please log in first.",TOKEN_EXPIRED:"Login token has expired. Please log in again.",INVALID_TOKEN:"Invalid login token. Please log in again.",NETWORK_ERROR:"Network connection failed. Please check your network.",TIMEOUT:"Request timed out. Please try again later.",SERVER_ERROR:"Server is busy. Please try again later.",API_ERROR:"API request failed.",INVALID_PARAMS:"Invalid parameter(s).",MISSING_PARAMS:"Missing required parameter(s).",FEATURE_NOT_SUPPORTED:"This feature is not supported in the current environment.",UNKNOWN:"An unknown error occurred.",PAYMENT_FAILED:"Payment failed.",SHARE_FAILED:"Share failed."};function u(n,t){return new v(n,je[n],t)}var R="playsout_",M=class{constructor(t){this.storage=t}get(t){try{return this.storage.getItem(R+t)}catch{return null}}set(t,e){try{this.storage.setItem(R+t,e)}catch(a){console.warn("[PlaysoutSDK] Storage set failed:",a)}}remove(t){try{this.storage.removeItem(R+t)}catch{}}clear(){try{let t=[];for(let e=0;e<this.storage.length;e++){let a=this.storage.key(e);a&&a.startsWith(R)&&t.push(a)}t.forEach(e=>this.storage.removeItem(e))}catch{}}},q=class{constructor(){this.store=new Map}get(t){return this.store.get(t)??null}set(t,e){this.store.set(t,e)}remove(t){this.store.delete(t)}clear(){this.store.clear()}};function ie(n="localStorage"){return typeof window>"u"||n==="memory"?new q:n==="sessionStorage"?new M(sessionStorage):new M(localStorage)}var k=ie(),m={get:n=>k.get(n),set:(n,t)=>{k.set(n,t)},remove:n=>{k.remove(n)},clear:()=>{k.clear()},getJSON:n=>{let t=k.get(n);if(!t)return null;try{return JSON.parse(t)}catch{return null}},setJSON:(n,t)=>{k.set(n,JSON.stringify(t))},configure(n){k=ie(n)}},f={TOKEN_DATA:"token_data",USER:"user",LOCALE:"locale",CONFIG:"config"};var W=class{constructor(){this.events=new Map}on(t,e){return this.events.has(t)||this.events.set(t,new Set),this.events.get(t).add(e),()=>{this.off(t,e)}}once(t,e){let a=r=>{e(r),this.off(t,a)};return this.on(t,a)}off(t,e){this.events.get(t)?.delete(e),this.events.get(t)?.size===0&&this.events.delete(t)}emit(t,e){this.events.get(t)?.forEach(a=>{try{a(e)}catch(r){console.error(`[PlaysoutSDK] Event handler error for "${t}":`,r)}})}listenerCount(t){return this.events.get(t)?.size??0}clear(){this.events.clear()}},E=new W,y={on:(n,t)=>E.on(n,t),once:(n,t)=>E.once(n,t),off:(n,t)=>{E.off(n,t)},clear:()=>{E.clear()},emit:(n,t)=>{E.emit(n,t)}};var He="https://games.playsout.com/resources/icon/image";function l(n){if(!n||/^(data:|https?:|blob:)/i.test(n))return n;let t=n.replace(/^\.\//,"");return`${He}/${t}`}var $e=n=>{if(!n)return n;try{let t=new URL(n);if(t.hostname==="games.playsout.com"){let e=t.pathname,a=e.endsWith("/"),r=/\.[a-z0-9]+$/i.test(e);!a&&!r&&(t.pathname=`${e}/`)}return t.toString()}catch{return n}},Ke=n=>n.map(t=>{if(!t.externalUrl)return t;let e=$e(t.externalUrl);return e===t.externalUrl?t:{...t,externalUrl:e}}),Fe=[{id:"BlockCrushFun",title:"Block Crush Fun",category:"Puzzle",image:l("./games/BlockCrushFun.png"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/BlockCrushFun"},{id:"DogeSurvivors",title:"Doge Survivors",category:"Doge OS",image:l("./games/DogeSurvivors.jpg"),isNew:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Doge/DogeSurvivors/"},{id:"DogeMaze",title:"Doge Maze",category:"Doge OS",image:l("./games/DogeMaze.jpg"),isNew:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Doge/DogeMaze/"},{id:"DogeMart",title:"Doge Mart",category:"Doge OS",image:l("./games/DogeMart.jpg"),isNew:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Doge/DogeMart/"},{id:"KittyEscape",title:"Kitty Escape",category:"Puzzle",image:l("./games/KittyEscape.jpg"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/KittyEscape/"},{id:"ProjectGarden",title:"Project: Garden",category:"Adventure",image:l("./games/SimulatedAdventures.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/simulated/"},{id:"ProjectIDLE",title:"Project: IDLE",category:"Simulation",image:l("./games/ProjectIDLE.jpg"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/idle/"},{id:"CulinaryStarWeb",title:"Culinary Star",category:"Casual",image:l("./games/CulinaryStar.webp"),description:"Cooking game",isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CulinaryStar/"},{id:"PickaxeQuest",title:"Pickaxe Quest",category:"Adventure",image:l("./games/PickaxeQuest.jpg"),description:"Mining and adventure game",isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/PickaxeQuest/",apiGameId:73},{id:"MonsterSurvivors",title:"Monster Survivors",category:"Adventure",image:l("./games/MonsterSurvivors.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/MonsterSurvivors/"},{id:"IdleTowerDefense",title:"Idle Tower Defense",category:"RPG",image:l("./games/IdleTowerDefense.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/IdleTowerDefense/"},{id:"MushroomWarriors",title:"Mushroom Warriors",category:"RPG",image:l("./games/MushroomWarriors.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/MushroomWarriors/"},{id:"FollowThePath",title:"Follow The Path",category:"Arcade",image:l("./games/FollowThePath.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/FollowThePath/"},{id:"ColorRun",title:"Color Run",category:"Arcade",image:l("./games/ColorRun.jpg"),isNew:!1,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ColorRun/"},{id:"StupidArrow",title:"Stupid Arrow",category:"Arcade",image:l("./games/StupidArrow.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/StupidArrow/"},{id:"ZigZag",title:"Zig Zag",category:"Arcade",image:l("./games/ZigZag.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ZigZag/"},{id:"SpikesEverywhere",title:"Spikes Everywhere",category:"Arcade",image:l("./games/SpikesEverywhere.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/SpikesEverywhere/"},{id:"ArrowRacer",title:"Arrow Racer",category:"Arcade",image:l("./games/ArrowRacer.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ArrowRacer/"},{id:"CircleLeap",title:"Circle Leap",category:"Arcade",image:l("./games/CircleLeap.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CircleLeap/"},{id:"ColorMatcher",title:"Color Matcher",category:"Arcade",image:l("./games/ColorMatcher.jpg"),isNew:!1,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ColorMatcher/"},{id:"EndlessMaze",title:"Endless Maze",category:"Arcade",image:l("./games/EndlessMaze.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/EndlessMaze/"},{id:"SpinningAround",title:"Spinning Around",category:"Arcade",image:l("./games/SpinningAround.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/SpinningAround/"},{id:"BoomBallz",title:"Boom Ballz",category:"Arcade",image:l("./games/BoomBallz.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/BoomBallz/"},{id:"CubeHead",title:"Cube Head",category:"Arcade",image:l("./games/CubeHead.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CubeHead/"},{id:"CapybaraLink",title:"Capybara Link",category:"Puzzle",image:l("./games/CapybaraLink.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CapybaraLink/"},{id:"Snake2048",title:"Snake 2048",category:"Puzzle",image:l("./games/Snake2048.jpg"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Snake2048/"},{id:"FishTankFury",title:"Fish Tank Fury",category:"Puzzle",image:l("./games/FishTankFury.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/FishTankFury/"},{id:"ConnectBalls",title:"Connect Balls",category:"Arcade",image:l("./games/ConnectBalls.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ConnectBalls/"},{id:"CircularBreaker",title:"Circular Breaker",category:"Arcade",image:l("./games/CircularBreaker.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CircularBreaker/"},{id:"OneDoor",title:"One Door",category:"Arcade",image:l("./games/OneDoor.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/OneDoor/"},{id:"CatchtheFruits",title:"Catch the Fruits",category:"Casual",image:l("./games/CatchtheFruits.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CatchtheFruits/"},{id:"Falling2048",title:"Falling 2048",category:"Casual",image:l("./games/Falling2048.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Falling2048/"}],se=Ke(Fe),w=()=>se.filter(n=>n.enable),Ut={Adventure:w().filter(n=>n.category==="Adventure"),Moba:w().filter(n=>n.category==="Moba")};var le=n=>se.find(t=>t.id===n);var ce=()=>Array.from(new Set(w().map(n=>n.category)));var X="https://api.playsout.com",Z=3e4;function We(n){let t=String(n?.platform||"").toLowerCase();if(t==="tiktok"){let e=n.authorizationCode;if(typeof e!="string"||!e.trim())throw u("MISSING_PARAMS","authorizationCode is required for TikTok login");return{platform:t,authorizationCode:e}}if(t==="grab"||t==="eros"){let e=n;if(typeof e.platformUserId!="string"||!e.platformUserId.trim())throw u("MISSING_PARAMS","platformUserId is required for Grab/Eros login");if(typeof e.platformToken!="string"||!e.platformToken.trim())throw u("MISSING_PARAMS","platformToken is required for Grab/Eros login");return{platform:t,platformUserId:e.platformUserId,platformToken:e.platformToken,username:typeof e.username=="string"?e.username:void 0,inviteCode:typeof e.inviteCode=="string"?e.inviteCode:void 0}}throw u("INVALID_PARAMS","Unsupported platform. Expected grab, eros, or tiktok")}var S=null,Y=null,Q=null;function me(n){Y=n}function he(n){Q=n}function de(){if(Q)try{Q()}catch{}}async function ge(n,t={},e,a=!1){let r=e?.apiBaseUrl||X,o=n.startsWith("http")?n:`${r}${n}`,i=new AbortController,s=setTimeout(()=>i.abort(),Z);try{let g=m.getJSON(f.TOKEN_DATA),h={"Content-Type":"application/json",...t.headers};g?.accessToken&&!h.token&&(h.token=g.accessToken);let p=await fetch(o,{...t,signal:i.signal,headers:h});if(clearTimeout(s),!p.ok){if(p.status===401&&a)return await ue(n,t,e);throw u(p.status>=500?"SERVER_ERROR":"API_ERROR",`HTTP ${p.status}: ${p.statusText}`)}let C=await p.json();if(C.code!==1e4){if(a)return await ue(n,t,e);throw u("API_ERROR",C.msg||"API request failed")}return C.data}catch(g){throw clearTimeout(s),g instanceof v?g:g instanceof Error?g.name==="AbortError"?u("TIMEOUT"):u("NETWORK_ERROR",g.message):u("UNKNOWN")}}async function ue(n,t,e){await pe(e);let a=e?.apiBaseUrl||X,r=n.startsWith("http")?n:`${a}${n}`,o=new AbortController,i=setTimeout(()=>o.abort(),Z);try{let s=m.getJSON(f.TOKEN_DATA),g={"Content-Type":"application/json",...t.headers};s?.accessToken&&(g.token=s.accessToken);let h=await fetch(r,{...t,signal:o.signal,headers:g});if(clearTimeout(i),!h.ok)throw u(h.status>=500?"SERVER_ERROR":"API_ERROR",`HTTP ${h.status}: ${h.statusText}`);let p=await h.json();if(p.code!==1e4)throw u("API_ERROR",p.msg||"API request failed");return p.data}catch(s){throw clearTimeout(i),s instanceof v?s:s instanceof Error&&s.name==="AbortError"?u("TIMEOUT"):u("NETWORK_ERROR",s?.message||"Request failed")}}async function pe(n){if(S)return S;let t=(async()=>{let e=m.getJSON(f.TOKEN_DATA),a=Math.floor(Date.now()/1e3);if(!e?.refreshToken||e.refreshExpiresAt<=a)throw de(),u("TOKEN_EXPIRED","Refresh token has expired");let r=n?.apiBaseUrl||X,o=new AbortController,i=setTimeout(()=>o.abort(),Z);try{let s=await fetch(`${r}/platform/refreshToken`,{method:"POST",signal:o.signal,headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e.refreshToken})});if(clearTimeout(i),!s.ok)throw s.status>=500?u("SERVER_ERROR",`HTTP ${s.status}: ${s.statusText}`):u("TOKEN_EXPIRED",`HTTP ${s.status}: ${s.statusText}`);let g=await s.json();if(g.code!==1e4||!g.data)throw u("TOKEN_EXPIRED",g.msg||"Failed to refresh token");let h=g.data;if(m.setJSON(f.TOKEN_DATA,h),Y)try{Y(h)}catch{}return h}catch(s){throw clearTimeout(i),s instanceof v?((s.code==="TOKEN_EXPIRED"||s.code==="NOT_LOGGED_IN")&&de(),s):s instanceof Error&&s.name==="AbortError"?u("TIMEOUT"):u("NETWORK_ERROR",s?.message||"Refresh token failed")}})();S=t;try{return await t}finally{S===t&&(S=null)}}var J=class{constructor(){this.config=null}configure(t){this.config=t}async refreshToken(){return await pe(this.config||void 0)}async getGames(t){let e=w();if(t?.category&&(e=e.filter(a=>a.category===t.category)),t?.search){let a=t.search.toLowerCase();e=e.filter(r=>r.title.toLowerCase().includes(a)||r.category.toLowerCase().includes(a)||r.description&&r.description.toLowerCase().includes(a))}if(t?.sortBy)switch(t.sortBy){case"newest":e=e.filter(a=>a.isNew).concat(e.filter(a=>!a.isNew));break;case"rating":e=e.filter(a=>a.isHot).concat(e.filter(a=>!a.isHot));break}if(t?.page&&t?.pageSize){let a=(t.page-1)*t.pageSize;e=e.slice(a,a+t.pageSize)}return e}async getCategories(){let t=w(),e=new Map;return t.forEach(a=>{let r=e.get(a.category)||0;e.set(a.category,r+1)}),Array.from(e.entries()).map(([a,r],o)=>({id:`category_${o}`,name:a,count:r}))}async getGameById(t){return le(t)}async getCategoryNames(){return ce()}async loginOnly(t){let e=We(t);return await ge("/platform/login",{method:"POST",body:JSON.stringify(e)},this.config??void 0)}async Login(t){let e=await this.loginOnly(t),a;try{a=await this.getUserInfo()}catch{}return{tokenData:e,user:a}}async getUserInfo(){return await ge("/platform/user",{method:"GET"},this.config??void 0,!0)}async getUser(){return m.getJSON(f.USER)}async validateToken(t){return!!t}},V=null;function _(){return V||(V=new J),V}var Ye="https://api.playsout.com",fe="zh",T=class n{constructor(){this.config=null;this._isInitialized=!1;this._user=null;this._token=null;this._locale=fe;this._widget=null}clearAuthState(){let t=!!(this._token||m.get(f.TOKEN_DATA)||m.get(f.USER));return this._user=null,this._token=null,m.remove(f.TOKEN_DATA),m.remove(f.USER),t}handleAuthExpired(){this.clearAuthState()&&y.emit("authExpired"),this.config?.debug&&console.warn("[PlaysoutSDK] Auth expired, logged out")}static getInstance(){return n.instance||(n.instance=new n),n.instance}async init(t={}){if(this._isInitialized)throw u("ALREADY_INITIALIZED");this.config={apiBaseUrl:t.apiBaseUrl||Ye,debug:t.debug||!1,storage:t.storage||"localStorage",locale:t.locale||fe,appId:t.appId||""},m.configure(this.config.storage),me(r=>{this._token=r.accessToken}),he(()=>{this.handleAuthExpired()});let e=m.getJSON(f.TOKEN_DATA);this._user=m.getJSON(f.USER),this._locale=m.get(f.LOCALE)||this.config.locale;let a=Math.floor(Date.now()/1e3);if(e)if(!e.refreshToken||e.refreshExpiresAt<=a)this.handleAuthExpired();else if(e.accessToken&&e.expiresAt>a)this._token=e.accessToken;else try{let r=_();r.configure(this.config),await r.refreshToken()}catch(r){if(!(r instanceof v&&(r.code==="TOKEN_EXPIRED"||r.code==="NOT_LOGGED_IN")))throw r}this._isInitialized=!0,this.config.debug&&(console.log("[PlaysoutSDK] Initialized with config:",this.config),console.log("[PlaysoutSDK] Restored token:",this._token?this._token.substring(0,20)+"...":"(none)")),y.emit("initialized")}destroy(){this.config=null,this._isInitialized=!1,this._user=null,this._token=null,m.clear(),y.clear()}get isInitialized(){return this._isInitialized}get isLoggedIn(){return!!this._token}get user(){return this._user}get token(){return this._token}get locale(){return this._locale}get sdkConfig(){return this.config}async Login(t){this.ensureInitialized(),this.config?.debug&&console.log("[PlaysoutSDK] Login with params:",t);let e=_();e.configure(this.config);let a=await e.loginOnly(t);m.setJSON(f.TOKEN_DATA,a),this.config?.debug&&console.log("[PlaysoutSDK] Token saved, expires at:",new Date(a.expiresAt*1e3).toISOString());let r;try{r=await e.getUserInfo()}catch(i){if(i instanceof v&&(i.code==="TOKEN_EXPIRED"||i.code==="NOT_LOGGED_IN"||i.code==="INVALID_TOKEN"))throw i;this.config?.debug&&console.log("[PlaysoutSDK] getUserInfo failed, login still success:",i)}let o=m.getJSON(f.TOKEN_DATA);return this._token=o?.accessToken||a.accessToken,r&&(this._user={userId:String(r.id),username:r.username},m.setJSON(f.USER,this._user)),this.config?.debug&&console.log("[PlaysoutSDK] Login success, user:",r),y.emit("login",{user:this._user,token:this._token}),{tokenData:a,user:r}}async getUserInfo(){if(this.ensureInitialized(),!this._token)throw u("NOT_LOGGED_IN","Please login first");let t=_();t.configure(this.config);let e=await t.getUserInfo();return this.config?.debug&&console.log("[PlaysoutSDK] getUserInfo result:",e),e&&(this._user={userId:String(e.id),username:e.username},m.setJSON(f.USER,this._user)),e}logout(){this.clearAuthState(),y.emit("logout")}getToken(){return this.ensureInitialized(),this._token}getUser(){return this.ensureInitialized(),this._user}setLocale(t){if(this.ensureInitialized(),!["zh","en","ja","ko","vi","th","id","ms"].includes(t))throw u("INVALID_PARAMS",`Unsupported locale: ${t}`);this._locale=t,m.set(f.LOCALE,t),this.config?.debug&&console.log("[PlaysoutSDK] Locale changed to:",t);let e=this._widget||document.querySelector("playsout-widget");e&&e.getAttribute("locale")!==t&&e.setAttribute("locale",t),y.emit("localeChange",t)}getLocale(){return this.ensureInitialized(),this._locale}async getGames(t){this.ensureInitialized();let e=w();if(t?.category&&(e=e.filter(a=>a.category===t.category)),t?.search){let a=t.search.toLowerCase();e=e.filter(r=>r.title.toLowerCase().includes(a)||r.category.toLowerCase().includes(a)||r.description&&r.description.toLowerCase().includes(a))}if(t?.sortBy)switch(t.sortBy){case"newest":e=e.filter(a=>a.isNew).concat(e.filter(a=>!a.isNew));break;case"rating":e=e.filter(a=>a.isHot).concat(e.filter(a=>!a.isHot));break}if(t?.page&&t?.pageSize){let a=(t.page-1)*t.pageSize;e=e.slice(a,a+t.pageSize)}return e}async getCategories(){this.ensureInitialized();let t=w(),e=new Map;return t.forEach(a=>{let r=e.get(a.category)||0;e.set(a.category,r+1)}),Array.from(e.entries()).map(([a,r],o)=>({id:`category_${o}`,name:a,count:r}))}async getGameById(t){return this.ensureInitialized(),w().find(e=>e.id===t)}mount(t,e){if(this.ensureInitialized(),typeof document>"u")throw u("FEATURE_NOT_SUPPORTED","mount requires DOM environment");let a=document.querySelector(t);if(!a)throw u("INVALID_PARAMS",`Container not found: ${t}`);let r=document.createElement("playsout-widget");this.config?.appId&&r.setAttribute("app-id",this.config.appId),r.setAttribute("locale",e?.locale||this._locale),e?.detailMode&&r.setAttribute("detail-mode",e.detailMode),this._widget=r,e?.onGameClick&&r.addEventListener("game-click",o=>{let i=o;e.onGameClick(i.detail)}),e?.onLoginRequired&&r.addEventListener("login-required",e.onLoginRequired),e?.onLocaleChange&&r.addEventListener("locale-change",o=>{let i=o;e.onLocaleChange(i.detail)}),a.appendChild(r),this.config?.debug&&console.log("[PlaysoutSDK] Widget mounted to:",t)}unmount(){let t=document.querySelector("playsout-widget");t&&t.remove(),this._widget=null}on(t,e){return this.ensureInitialized(),y.on(t,e)}off(t,e){this.ensureInitialized(),y.off(t,e)}ensureInitialized(){if(!this._isInitialized)throw u("NOT_INITIALIZED")}},c=T.getInstance();typeof window<"u"&&(window.__playsout_sdk_instance=c);var D=Object.freeze({init:c.init.bind(c),mount:c.mount.bind(c),unmount:c.unmount.bind(c),destroy:c.destroy.bind(c),Login:c.Login.bind(c),logout:c.logout.bind(c),getToken:c.getToken.bind(c),getUserInfo:c.getUserInfo.bind(c),getUser:c.getUser.bind(c),setLocale:c.setLocale.bind(c),getLocale:c.getLocale.bind(c),getGames:c.getGames.bind(c),getCategories:c.getCategories.bind(c),on:c.on.bind(c),off:c.off.bind(c),get isInitialized(){return c.isInitialized},get isLoggedIn(){return c.isLoggedIn},instance:c,PlaysoutSDKClass:T});var Qe="games.playsout.com";var ee="__playsout_img_cache_v1",U=`${ee}_blob_`,B=!1,G=4*1024*1024-1024*1024;function d(...n){}var x=new Map,O=new Map,Je=50,P=new Map,N=new Map,b=0;function te(){try{let n=localStorage.getItem(ee);if(!n)return d("loadCacheIndex: \u65E0\u7F13\u5B58\u7D22\u5F15"),b=0,new Map;let t=JSON.parse(n);d("loadCacheIndex: \u52A0\u8F7D\u4E86",t.length,"\u6761\u8BB0\u5F55"),b=0;for(let e of t){let a=`${U}${btoa(e.url).replace(/[\/+=]/g,"_")}`;localStorage.getItem(a)&&(b+=e.size)}return d("loadCacheIndex: \u5F53\u524D blob \u603B\u91CF",b,"bytes"),new Map(t.map(e=>[e.url,e]))}catch{return d("loadCacheIndex: \u89E3\u6790\u5931\u8D25"),b=0,new Map}}function z(n){try{let t=Array.from(n.values());t.length>200&&(t.sort((e,a)=>a.timestamp-e.timestamp),t.length=200),localStorage.setItem(ee,JSON.stringify(t)),d("saveCacheIndex: \u4FDD\u5B58\u4E86",t.length,"\u6761\u8BB0\u5F55")}catch(t){d("saveCacheIndex: \u4FDD\u5B58\u5931\u8D25",t)}}function Xe(n,t){if(!(b+t<=G))try{let e=te(),a=Array.from(e.values()).map(r=>({record:r,score:be(r.url)??1/0})).filter(r=>r.score>n).sort((r,o)=>o.score-r.score);for(let{record:r}of a){if(b+t<=G)break;let o=`${U}${btoa(r.url).replace(/[\/+=]/g,"_")}`;localStorage.removeItem(o),e.delete(r.url),b-=r.size,d("evictLowerPriorityEntries: \u91CA\u653E\u4F4E\u4F18\u5148\u7EA7\u7F13\u5B58",r.url,"\u8282\u7701",r.size,"bytes")}z(e)}catch(e){d("evictLowerPriorityEntries: \u5931\u8D25",e)}}function ye(n,t){if(x.size>=Je){let e=null,a=1/0;for(let[r,o]of x)o.lastAccess<a&&(a=o.lastAccess,e=r);if(e){let r=x.get(e);URL.revokeObjectURL(URL.createObjectURL(r.blob)),x.delete(e),d("addToMemoryCache: LRU\u6DD8\u6C70",e)}}x.set(n,{blob:t,lastAccess:Date.now()}),d("addToMemoryCache: \u6DFB\u52A0\u5230\u5185\u5B58\u7F13\u5B58",n,"\u5927\u5C0F:",t.size,"bytes")}async function Ze(n){if(!B)return;if(O.has(n)){d("cacheImage:",n,"\u8BE5\u8BF7\u6C42\u5DF2\u5728\u8FDB\u884C\u4E2D\uFF0C\u7B49\u5F85\u5B8C\u6210"),await O.get(n);return}d("cacheImage: \u5F00\u59CB\u4E0B\u8F7D",n);let t=(async()=>{try{let e=await fetch(n);if(!e.ok){d("cacheImage:",n,"\u54CD\u5E94\u5931\u8D25",e.status);return}let a=await e.blob(),r=e.headers.get("ETag")||"";d("cacheImage:",n,"\u4E0B\u8F7D\u6210\u529F\uFF0C\u5927\u5C0F:",a.size,"ETag:",r),ye(n,a);let o=be(n);if(o!==void 0)if(Xe(o,a.size),b+a.size<=G)try{let i=te();i.set(n,{url:n,timestamp:Date.now(),etag:r,size:a.size}),z(i);let s=JSON.stringify({type:a.type,data:Array.from(new Uint8Array(await a.arrayBuffer()))}),g=`${U}${btoa(n).replace(/[\/+=]/g,"_")}`;localStorage.setItem(g,s),b+=a.size,d("cacheImage:",n,"\u5DF2\u4FDD\u5B58\u5230localStorage\uFF08\u5360\u7528",a.size,"bytes\uFF0C\u9884\u7B97\u5269\u4F59",G-b,"\uFF09")}catch(i){i.name==="QuotaExceededError"?d("cacheImage: localStorage \u914D\u989D\u5DF2\u6EE1\uFF0C\u505C\u6B62\u5199\u5165"):d("cacheImage:",n,"localStorage\u4FDD\u5B58\u5931\u8D25",i)}else d("cacheImage:",n,"\u817E\u51FA\u7A7A\u95F4\u540E\u4ECD\u8D85\u8FC7\u9884\u7B97\uFF0C\u8DF3\u8FC7");else d("cacheImage:",n,"\u975E\u4F18\u5148\u7EA7URL\uFF0C\u4E0D\u5199\u5165localStorage")}catch(e){d("cacheImage:",n,"\u4E0B\u8F7D\u5931\u8D25",e)}finally{O.delete(n)}})();O.set(n,t)}function ae(n){try{if(new URL(n).hostname===Qe)return d("isCacheableImage:",n,"\u662FCDN\u56FE\u7247"),!0}catch{}return n.startsWith("/games/")||n.startsWith("./games/")||n.startsWith("/home-")||n.startsWith("./home-")||n.startsWith("/logo")||n.startsWith("./logo")?(d("isCacheableImage:",n,"\u662F\u672C\u5730\u56FE\u7247"),!0):(d("isCacheableImage:",n,"\u4E0D\u662F\u53EF\u7F13\u5B58\u7684\u56FE\u7247"),!1)}function be(n){return N.has(n)?N.get(n):P.get(n)}function ve(n){if(!B)return;let t=-1e3;for(let e of n)ae(e)&&N.set(e,t++);d("setCriticalAssets: \u5171",N.size,"\u4E2A\u5173\u952E\u8D44\u6E90")}function we(n,t=!1){if(!B)return;t||P.clear();let e=0;if(t){for(let r of P.values())r>e&&(e=r);e+=1}let a=e;for(let r of n)ae(r)&&P.set(r,a++);d("setPriorityCache: \u5F53\u524D\u5171",P.size,"\u4E2A\u4F18\u5148\u7F13\u5B58URL")}function ke(n){if(!B)return n;if(d("resolveWithCache:",n),!ae(n))return d("resolveWithCache:",n,"\u4E0D\u662FCDN\u56FE\u7247\uFF0C\u539F\u6837\u8FD4\u56DE"),n;if(x.has(n)){let e=x.get(n);e.lastAccess=Date.now();try{let a=URL.createObjectURL(e.blob);return d("resolveWithCache:",n,"\u547D\u4E2D\u5185\u5B58\u7F13\u5B58\uFF0C\u8FD4\u56DEblob URL"),a}catch{d("resolveWithCache:",n,"\u521B\u5EFAblob URL\u5931\u8D25")}}let t=te();if(t.has(n)){let e=`${U}${btoa(n).replace(/[\/+=]/g,"_")}`,a=localStorage.getItem(e);if(a)try{let{type:r,data:o}=JSON.parse(a),i=new Blob([new Uint8Array(o)],{type:r});ye(n,i);let s=URL.createObjectURL(i);return d("resolveWithCache:",n,"\u547D\u4E2DlocalStorage\u7F13\u5B58\uFF0C\u540C\u6B65\u8FD4\u56DEblob URL"),s}catch(r){d("resolveWithCache:",n,"localStorage blob\u89E3\u6790\u5931\u8D25\uFF0C\u6E05\u9664\u7F13\u5B58",r),t.delete(n),z(t),localStorage.removeItem(e)}else d("resolveWithCache:",n,"localStorage blob\u4E0D\u5B58\u5728\uFF0C\u6E05\u9664\u7D22\u5F15"),t.delete(n),z(t)}return d("resolveWithCache:",n,"\u5B8C\u5168\u6CA1\u6709\u7F13\u5B58\uFF0C\u540E\u53F0\u4E0B\u8F7D"),Ze(n),n}var re="privy-bridge";var j="DIAMOND",et="2025.01";var tt=()=>`host-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,I=n=>typeof n!="string"||n.length>128?"":n,at=n=>{let t=Number(n);return!Number.isSafeInteger(t)||t<=0?0:t},H=class{constructor(t){this.orders=new Map;this.pendingPayment=null;this.attached=!1;this.options=t,this.handleMessage=this.handleMessage.bind(this)}attach(){this.attached||typeof window>"u"||(window.addEventListener("message",this.handleMessage),this.attached=!0)}detach(){!this.attached||typeof window>"u"||(window.removeEventListener("message",this.handleMessage),this.attached=!1,this.cancelPendingPayment({code:"USER_CANCELLED",message:"Host view closed"}))}cancelPendingPayment(t={code:"USER_CANCELLED",message:"Payment cancelled"}){if(!this.pendingPayment)return;let e=this.pendingPayment;this.pendingPayment=null,this.updateOrderStatus(e.order.hostOrderId,"cancelled"),this.sendError(e.request,t)}handleMessage(t){let e=this.options.getIframe();if(!e?.contentWindow||t.source!==e.contentWindow)return;let a=this.getGameOrigin();if(!a||t.origin!==a)return;let r=t.data;if(this.isValidRequest(r))switch(r.method){case"bridge.handshake":this.handleHandshake(r);return;case"auth.getUser":this.handleGetUser(r);return;case"pay.createOrder":this.handleCreateOrder(r);return;case"pay.request":this.handlePaymentRequest(r);return;case"pay.query":this.handlePaymentQuery(r);return;default:this.sendError(r,{code:"INVALID_METHOD",message:"Unsupported method"})}}isValidRequest(t){return!!(t&&t.channel===re&&t.type==="request"&&typeof t.id=="string"&&t.id.length>0&&t.id.length<=128&&typeof t.method=="string"&&t.method.length>0&&t.method.length<=128)}getGameOrigin(){let t=this.options.getGameUrl();if(!t||typeof window>"u")return"";try{return new URL(t,window.location.href).origin}catch{return""}}postToGame(t){let e=this.options.getIframe(),a=this.getGameOrigin();!e?.contentWindow||!a||e.contentWindow.postMessage(t,a)}sendResponse(t,e){this.postToGame({channel:re,version:"1.0",type:"response",id:t.id,method:t.method,payload:e})}sendError(t,e){this.postToGame({channel:re,version:"1.0",type:"response",id:t.id,method:t.method,error:e})}handleHandshake(t){this.sendResponse(t,{hostVersion:et,capabilities:["auth.getUser","pay.createOrder","pay.request","pay.query"],capabilitiesDetail:{auth:{methods:["account"],scopes:["basic"]},pay:{methods:["balance"],currency:j,flow:["createOrder","request"]}},config:{currency:j}})}handleGetUser(t){let e=this.options.getUser();if(!e){this.sendError(t,{code:"AUTH_REQUIRED",message:"User not logged in"});return}this.sendResponse(t,{uid:e.uid,nickname:e.nickname,avatarUrl:e.avatarUrl||"",locale:this.options.getLocale(),roles:["player"]})}handleCreateOrder(t){let e=t.payload||{},a=I(e.orderId),r=I(e.productId),o=at(e.amount);if(!a||!o){this.sendError(t,{code:"INVALID_REQUEST",message:"Invalid order payload"});return}let i=tt(),s=Math.floor((Date.now()+6e5)/1e3),g={orderId:a,hostOrderId:i,amount:o,currency:j,productId:r,status:"created",expiresAt:s};this.orders.set(i,g),this.sendResponse(t,{orderId:a,hostOrderId:i,amount:o,currency:j,productId:r,expiresAt:s})}async handlePaymentRequest(t){let e=t.payload||{},a=I(e.orderId),r=I(e.hostOrderId);if(!a||!r){this.sendError(t,{code:"INVALID_REQUEST",message:"Missing orderId or hostOrderId"});return}if(this.pendingPayment){this.sendError(t,{code:"PAYMENT_PENDING",message:"Payment already in progress"});return}let o=this.orders.get(r);if(!o||o.orderId!==a){this.sendError(t,{code:"INVALID_REQUEST",message:"Order not found"});return}if(o.status==="success"){this.sendError(t,{code:"ORDER_ALREADY_PAID",message:"Order already paid"});return}if(o.expiresAt<=Math.floor(Date.now()/1e3)){this.updateOrderStatus(r,"expired"),this.sendError(t,{code:"ORDER_EXPIRED",message:"Order expired"});return}this.updateOrderStatus(r,"pending"),this.pendingPayment={request:t,order:o};let i=await this.options.requestPayment({orderId:o.orderId,hostOrderId:o.hostOrderId,amount:o.amount,currency:o.currency,productId:o.productId});if(this.pendingPayment?.request.id===t.id){if(this.pendingPayment=null,i.status==="success"){this.updateOrderStatus(r,"success"),this.sendResponse(t,{success:!0,orderId:a,hostOrderId:r,balance:i.balance});return}this.updateOrderStatus(r,i.status==="insufficient"?"created":"cancelled"),this.sendError(t,{code:i.status==="insufficient"?"INSUFFICIENT_BALANCE":"USER_CANCELLED",message:i.status==="insufficient"?"Insufficient balance":"User cancelled payment"})}}handlePaymentQuery(t){let e=t.payload||{},a=I(e.hostOrderId),r=I(e.orderId),o;if(a?o=this.orders.get(a):r&&(o=Array.from(this.orders.values()).find(i=>i.orderId===r)),!o){this.sendError(t,{code:"INVALID_REQUEST",message:"Order not found"});return}this.sendResponse(t,{orderId:o.orderId,hostOrderId:o.hostOrderId,amount:o.amount,currency:o.currency,status:o.status,expiresAt:o.expiresAt})}updateOrderStatus(t,e){let a=this.orders.get(t);a&&this.orders.set(t,{...a,status:e})}};var xe={app:{title:"Playsout Mini Games",description:"Play quick games without login."},home:{loggedIn:"Logged in",logIn:"Log in",games:"Games",bannerAlt:"Playsout Games",searchPlaceholder:"Search by title or category",noGames:"No games found"},profile:{title:"Profile",settings:"Settings",language:"Language",recentGames:"Recently Played Games",noGames:"No games played yet",guest:"Guest",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Adventure",Simulation:"Simulation",Casual:"Casual",Arcade:"Arcade",Moba:"Moba",Puzzle:"Puzzle"},auth:{loginSuccess:"Login successful!",loginTitle:"Playsout Login",welcome:"Welcome to the Playsout game platform",prompt:"Log in to start playing",mustLogin:"You must log in to play",authorizeHint:"Click the button below to authorize your login",authorizing:"Authorizing...",authorize:"Authorize login",terms:"By authorizing, you agree to our Terms of Service",signingIn:"Signing In",signMessage:"Please sign the message in your wallet"},game:{loading:"Loading",notFound:"Game not found",backHome:"Back to home",pageTitleSuffix:"Game Platform",header:{back:"Back",shareAria:"Share game",toggleMenuAria:"Toggle menu",fallbackTitle:"Game"}},menu:{favorite:"Favorite",favorited:"Favorited",profile:"Profile",login:"Login",refresh:"Refresh",loggedIn:"Logged in"},share:{title:"Share Game",closeLabel:"Close",retry:"Retry",loading:"Loading...",imageAlt:"Game share image",shareUrlLabel:"Share URL:",copied:"Copied",copy:"Copy",saveShare:"Save & Share",hint:"Image includes a QR code that links to this game",loadError:"Failed to load share image",downloadError:"Failed to download image"},checkin:{successTitle:"You got rewards!",successMessage:"Your rewards have been claimed.",failedTitle:"Check-in failed",canceledTitle:"Check-in canceled",errors:{userRejected:"You canceled the check-in operation",insufficientFunds:"Insufficient funds to pay gas",alreadyCheckedIn:"You already checked in today. Come back tomorrow!",network:"Network error. Please try again later"}},store:{title:"Gem Store",hot:"HOT",buy:"BUY",cancel:"Cancel",unit:"Gems",successTitle:"Payment Successful",successMessage:"You received {amount} gems!"},payment:{title:"Confirm Purchase",description:"Spend {amount} gems for this in-game item?",amountLabel:"{amount} gems",balance:"Current balance: {balance} gems",insufficientTitle:"Insufficient Balance",insufficientDesc:"Available: {gems} Gems",insufficientMessage:"Current balance is {balance} gems. This purchase needs {amount} gems.",cancel:"Cancel",confirm:"Confirm",recharge:"Recharge",successTitle:"Payment Successful",successMessage:"{amount} gems have been deducted.",invalidRequest:"Invalid payment request."}};var Ie={app:{title:"Playsout \u5C0F\u6E38\u620F",description:"\u65E0\u9700\u767B\u5F55\u5373\u53EF\u7545\u73A9\u5C0F\u6E38\u620F\u3002"},home:{loggedIn:"\u5DF2\u767B\u5F55",logIn:"\u767B\u5F55",games:"\u6E38\u620F",bannerAlt:"Playsout \u6E38\u620F",searchPlaceholder:"\u6309\u6807\u9898\u6216\u7C7B\u522B\u641C\u7D22",noGames:"\u672A\u627E\u5230\u6E38\u620F"},profile:{title:"\u4E2A\u4EBA\u4E2D\u5FC3",settings:"\u8BBE\u7F6E",language:"\u8BED\u8A00",recentGames:"\u6700\u8FD1\u73A9\u8FC7\u7684\u6E38\u620F",noGames:"\u8FD8\u6CA1\u6709\u73A9\u8FC7\u6E38\u620F",guest:"\u6E38\u5BA2",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\u5192\u9669",Simulation:"\u6A21\u62DF",Casual:"\u4F11\u95F2",Arcade:"\u8857\u673A",Moba:"MOBA",Puzzle:"\u76CA\u667A"},auth:{loginSuccess:"\u767B\u5F55\u6210\u529F!",loginTitle:"Playsout \u767B\u5F55",welcome:"\u6B22\u8FCE\u6765\u5230 Playsout \u6E38\u620F\u5E73\u53F0",prompt:"\u767B\u5F55\u5F00\u59CB\u6E38\u620F",mustLogin:"\u60A8\u5FC5\u987B\u767B\u5F55\u624D\u80FD\u73A9\u6E38\u620F",authorizeHint:"\u70B9\u51FB\u4E0B\u65B9\u6309\u94AE\u6388\u6743\u767B\u5F55",authorizing:"\u6388\u6743\u4E2D...",authorize:"\u6388\u6743\u767B\u5F55",terms:"\u6388\u6743\u5373\u8868\u793A\u60A8\u540C\u610F\u6211\u4EEC\u7684\u670D\u52A1\u6761\u6B3E",signingIn:"\u767B\u5F55\u4E2D",signMessage:"\u8BF7\u5728\u94B1\u5305\u4E2D\u7B7E\u540D"},game:{loading:"\u52A0\u8F7D\u4E2D",notFound:"\u627E\u4E0D\u5230\u6E38\u620F",backHome:"\u8FD4\u56DE\u9996\u9875",pageTitleSuffix:"\u6E38\u620F\u5E73\u53F0",header:{back:"\u8FD4\u56DE",shareAria:"\u5206\u4EAB\u6E38\u620F",toggleMenuAria:"\u5207\u6362\u83DC\u5355",fallbackTitle:"\u6E38\u620F"}},menu:{favorite:"\u6536\u85CF",favorited:"\u5DF2\u6536\u85CF",profile:"\u4E2A\u4EBA\u4E2D\u5FC3",login:"\u767B\u5F55",refresh:"\u5237\u65B0",loggedIn:"\u5DF2\u767B\u5F55"},share:{title:"\u5206\u4EAB\u6E38\u620F",closeLabel:"\u5173\u95ED",retry:"\u91CD\u8BD5",loading:"\u52A0\u8F7D\u4E2D...",imageAlt:"\u6E38\u620F\u5206\u4EAB\u56FE\u7247",shareUrlLabel:"\u5206\u4EAB\u94FE\u63A5:",copied:"\u5DF2\u590D\u5236",copy:"\u590D\u5236",saveShare:"\u4FDD\u5B58\u5E76\u5206\u4EAB",hint:"\u56FE\u7247\u5305\u542B\u6B64\u6E38\u620F\u7684\u4E8C\u7EF4\u7801",loadError:"\u52A0\u8F7D\u5206\u4EAB\u56FE\u7247\u5931\u8D25",downloadError:"\u4E0B\u8F7D\u56FE\u7247\u5931\u8D25"},checkin:{successTitle:"\u9886\u53D6\u6210\u529F!",successMessage:"\u60A8\u7684\u5956\u52B1\u5DF2\u9886\u53D6\u3002",failedTitle:"\u7B7E\u5230\u5931\u8D25",canceledTitle:"\u7B7E\u5230\u53D6\u6D88",errors:{userRejected:"\u60A8\u53D6\u6D88\u4E86\u7B7E\u5230\u64CD\u4F5C",insufficientFunds:"\u4F59\u989D\u4E0D\u8DB3\u4EE5\u652F\u4ED8 Gas \u8D39",alreadyCheckedIn:"\u4ECA\u5929\u5DF2\u7ECF\u7B7E\u5230\u8FC7\u4E86\u3002\u660E\u5929\u518D\u6765\u5427!",network:"\u7F51\u7EDC\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5"}},store:{title:"\u5B9D\u77F3\u5546\u5E97",hot:"\u70ED\u95E8",buy:"\u8D2D\u4E70",cancel:"\u53D6\u6D88",unit:"\u5B9D\u77F3",successTitle:"\u652F\u4ED8\u6210\u529F",successMessage:"\u60A8\u83B7\u5F97\u4E86 {amount} \u5B9D\u77F3\uFF01"},payment:{title:"\u786E\u8BA4\u8D2D\u4E70",description:"\u662F\u5426\u6D88\u8017 {amount} \u5B9D\u77F3\u8D2D\u4E70\u8BE5\u6E38\u620F\u9053\u5177\uFF1F",amountLabel:"{amount} \u5B9D\u77F3",balance:"\u5F53\u524D\u4F59\u989D\uFF1A{balance} \u5B9D\u77F3",insufficientTitle:"\u4F59\u989D\u4E0D\u8DB3",insufficientDesc:"\u53EF\u7528\u4F59\u989D: {gems} \u5B9D\u77F3",insufficientMessage:"\u5F53\u524D\u4F59\u989D\u4E3A {balance} \u5B9D\u77F3\uFF0C\u672C\u6B21\u8D2D\u4E70\u9700\u8981 {amount} \u5B9D\u77F3\u3002",cancel:"\u53D6\u6D88",confirm:"\u786E\u8BA4",recharge:"\u5145\u503C",successTitle:"\u652F\u4ED8\u6210\u529F",successMessage:"\u5DF2\u6263\u9664 {amount} \u5B9D\u77F3\u3002",invalidRequest:"\u652F\u4ED8\u8BF7\u6C42\u65E0\u6548\u3002"}};var Ee={app:{title:"Playsout \u30DF\u30CB\u30B2\u30FC\u30E0",description:"\u30ED\u30B0\u30A4\u30F3\u306A\u3057\u3067\u30B2\u30FC\u30E0\u3092\u30D7\u30EC\u30A4\u3002"},home:{loggedIn:"\u30ED\u30B0\u30A4\u30F3\u6E08\u307F",logIn:"\u30ED\u30B0\u30A4\u30F3",games:"\u30B2\u30FC\u30E0",bannerAlt:"Playsout \u30B2\u30FC\u30E0",searchPlaceholder:"\u30BF\u30A4\u30C8\u30EB\u307E\u305F\u306F\u30AB\u30C6\u30B4\u30EA\u3067\u691C\u7D22",noGames:"\u30B2\u30FC\u30E0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093"},profile:{title:"\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB",settings:"\u8A2D\u5B9A",language:"\u8A00\u8A9E",recentGames:"\u6700\u8FD1\u30D7\u30EC\u30A4\u3057\u305F\u30B2\u30FC\u30E0",noGames:"\u307E\u3060\u30D7\u30EC\u30A4\u3057\u305F\u30B2\u30FC\u30E0\u304C\u3042\u308A\u307E\u305B\u3093",guest:"\u30B2\u30B9\u30C8",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\u30A2\u30C9\u30D9\u30F3\u30C1\u30E3\u30FC",Simulation:"\u30B7\u30DF\u30E5\u30EC\u30FC\u30B7\u30E7\u30F3",Casual:"\u30AB\u30B8\u30E5\u30A2\u30EB",Arcade:"\u30A2\u30FC\u30B1\u30FC\u30C9",Moba:"MOBA",Puzzle:"\u30D1\u30BA\u30EB"},auth:{loginSuccess:"\u30ED\u30B0\u30A4\u30F3\u6210\u529F!",loginTitle:"Playsout \u30ED\u30B0\u30A4\u30F3",welcome:"Playsout \u30B2\u30FC\u30E0\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u3078\u3088\u3046\u3053\u305D",prompt:"\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u30D7\u30EC\u30A4\u3092\u958B\u59CB",mustLogin:"\u30D7\u30EC\u30A4\u3059\u308B\u306B\u306F\u30ED\u30B0\u30A4\u30F3\u304C\u5FC5\u8981\u3067\u3059",authorizeHint:"\u4E0B\u306E\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044",authorizing:"\u627F\u8A8D\u4E2D...",authorize:"\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D",terms:"\u627F\u8A8D\u3059\u308B\u3053\u3068\u3067\u3001\u5229\u7528\u898F\u7D04\u306B\u540C\u610F\u3057\u305F\u3053\u3068\u306B\u306A\u308A\u307E\u3059",signingIn:"\u30B5\u30A4\u30F3\u30A4\u30F3\u4E2D",signMessage:"\u30A6\u30A9\u30EC\u30C3\u30C8\u3067\u30E1\u30C3\u30BB\u30FC\u30B8\u306B\u7F72\u540D\u3057\u3066\u304F\u3060\u3055\u3044"},game:{loading:"\u8AAD\u307F\u8FBC\u307F\u4E2D",notFound:"\u30B2\u30FC\u30E0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093",backHome:"\u30DB\u30FC\u30E0\u306B\u623B\u308B",pageTitleSuffix:"\u30B2\u30FC\u30E0\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0",header:{back:"\u623B\u308B",shareAria:"\u30B2\u30FC\u30E0\u3092\u5171\u6709",toggleMenuAria:"\u30E1\u30CB\u30E5\u30FC\u5207\u308A\u66FF\u3048",fallbackTitle:"\u30B2\u30FC\u30E0"}},menu:{favorite:"\u304A\u6C17\u306B\u5165\u308A",favorited:"\u304A\u6C17\u306B\u5165\u308A\u6E08\u307F",profile:"\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB",login:"\u30ED\u30B0\u30A4\u30F3",refresh:"\u66F4\u65B0",loggedIn:"\u30ED\u30B0\u30A4\u30F3\u6E08\u307F"},share:{title:"\u30B2\u30FC\u30E0\u3092\u5171\u6709",closeLabel:"\u9589\u3058\u308B",retry:"\u518D\u8A66\u884C",loading:"\u8AAD\u307F\u8FBC\u307F\u4E2D...",imageAlt:"\u30B2\u30FC\u30E0\u5171\u6709\u753B\u50CF",shareUrlLabel:"\u5171\u6709URL:",copied:"\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F",copy:"\u30B3\u30D4\u30FC",saveShare:"\u4FDD\u5B58\u3057\u3066\u5171\u6709",hint:"\u753B\u50CF\u306B\u306F\u30B2\u30FC\u30E0\u3078\u306EQR\u30B3\u30FC\u30C9\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059",loadError:"\u5171\u6709\u753B\u50CF\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F",downloadError:"\u753B\u50CF\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F"},checkin:{successTitle:"\u5831\u916C\u3092\u7372\u5F97\u3057\u307E\u3057\u305F!",successMessage:"\u5831\u916C\u304C\u8ACB\u6C42\u3055\u308C\u307E\u3057\u305F\u3002",failedTitle:"\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u5931\u6557",canceledTitle:"\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u30AD\u30E3\u30F3\u30BB\u30EB",errors:{userRejected:"\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u64CD\u4F5C\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F",insufficientFunds:"\u30AC\u30B9\u4EE3\u3092\u652F\u6255\u3046\u6B8B\u9AD8\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059",alreadyCheckedIn:"\u672C\u65E5\u306F\u65E2\u306B\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u6E08\u307F\u3067\u3059\u3002\u660E\u65E5\u307E\u305F\u6765\u3066\u304F\u3060\u3055\u3044!",network:"\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30A8\u30E9\u30FC\u3002\u5F8C\u3067\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044"}},store:{title:"\u30B8\u30A7\u30E0\u30B9\u30C8\u30A2",hot:"HOT",buy:"\u8CFC\u5165",cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB",unit:"\u30B8\u30A7\u30E0",successTitle:"\u652F\u6255\u3044\u5B8C\u4E86",successMessage:"{amount}\u30B8\u30A7\u30E0\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\uFF01"},payment:{title:"\u8CFC\u5165\u78BA\u8A8D",description:"\u3053\u306E\u30B2\u30FC\u30E0\u5185\u30A2\u30A4\u30C6\u30E0\u306B {amount} \u30B8\u30A7\u30E0\u3092\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F",amountLabel:"{amount} \u30B8\u30A7\u30E0",balance:"\u73FE\u5728\u306E\u6B8B\u9AD8: {balance} \u30B8\u30A7\u30E0",insufficientTitle:"\u6B8B\u9AD8\u4E0D\u8DB3",insufficientDesc:"\u4FDD\u6709: {gems} \u30B8\u30A7\u30E0",insufficientMessage:"\u73FE\u5728\u306E\u6B8B\u9AD8\u306F {balance} \u30B8\u30A7\u30E0\u3067\u3059\u3002\u3053\u306E\u8CFC\u5165\u306B\u306F {amount} \u30B8\u30A7\u30E0\u304C\u5FC5\u8981\u3067\u3059\u3002",cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB",confirm:"\u78BA\u8A8D",recharge:"\u30C1\u30E3\u30FC\u30B8",successTitle:"\u652F\u6255\u3044\u5B8C\u4E86",successMessage:"{amount} \u30B8\u30A7\u30E0\u304C\u5DEE\u3057\u5F15\u304B\u308C\u307E\u3057\u305F\u3002",invalidRequest:"\u652F\u6255\u3044\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u7121\u52B9\u3067\u3059\u3002"}};var Se={app:{title:"Playsout \uBBF8\uB2C8 \uAC8C\uC784",description:"\uB85C\uADF8\uC778 \uC5C6\uC774 \uAC8C\uC784\uC744 \uC990\uAE30\uC138\uC694."},home:{loggedIn:"\uB85C\uADF8\uC778\uB428",logIn:"\uB85C\uADF8\uC778",games:"\uAC8C\uC784",bannerAlt:"Playsout \uAC8C\uC784",searchPlaceholder:"\uC81C\uBAA9 \uB610\uB294 \uCE74\uD14C\uACE0\uB9AC\uB85C \uAC80\uC0C9",noGames:"\uAC8C\uC784\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4"},profile:{title:"\uD504\uB85C\uD544",settings:"\uC124\uC815",language:"\uC5B8\uC5B4",recentGames:"\uCD5C\uADFC \uD50C\uB808\uC774\uD55C \uAC8C\uC784",noGames:"\uC544\uC9C1 \uD50C\uB808\uC774\uD55C \uAC8C\uC784\uC774 \uC5C6\uC2B5\uB2C8\uB2E4",guest:"\uC190\uB2D8",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\uC5B4\uB4DC\uBCA4\uCC98",Simulation:"\uC2DC\uBBAC\uB808\uC774\uC158",Casual:"\uCE90\uC8FC\uC5BC",Arcade:"\uC544\uCF00\uC774\uB4DC",Moba:"MOBA",Puzzle:"\uD37C\uC990"},auth:{loginSuccess:"\uB85C\uADF8\uC778 \uC131\uACF5!",loginTitle:"Playsout \uB85C\uADF8\uC778",welcome:"Playsout \uAC8C\uC784 \uD50C\uB7AB\uD3FC\uC5D0 \uC624\uC2E0 \uAC83\uC744 \uD658\uC601\uD569\uB2C8\uB2E4",prompt:"\uAC8C\uC784\uC744 \uC2DC\uC791\uD558\uB824\uBA74 \uB85C\uADF8\uC778\uD558\uC138\uC694",mustLogin:"\uAC8C\uC784\uC744 \uD558\uB824\uBA74 \uB85C\uADF8\uC778\uD574\uC57C \uD569\uB2C8\uB2E4",authorizeHint:"\uB85C\uADF8\uC778\uC744 \uC2B9\uC778\uD558\uB824\uBA74 \uC544\uB798 \uBC84\uD2BC\uC744 \uD074\uB9AD\uD558\uC138\uC694",authorizing:"\uC2B9\uC778 \uC911...",authorize:"\uB85C\uADF8\uC778 \uC2B9\uC778",terms:"\uC2B9\uC778\uD558\uBA74 \uC11C\uBE44\uC2A4 \uC57D\uAD00\uC5D0 \uB3D9\uC758\uD558\uAC8C \uB429\uB2C8\uB2E4",signingIn:"\uB85C\uADF8\uC778 \uC911",signMessage:"\uC9C0\uAC11\uC5D0\uC11C \uBA54\uC2DC\uC9C0\uC5D0 \uC11C\uBA85\uD574\uC8FC\uC138\uC694"},game:{loading:"\uB85C\uB529 \uC911",notFound:"\uAC8C\uC784\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",backHome:"\uD648\uC73C\uB85C \uB3CC\uC544\uAC00\uAE30",pageTitleSuffix:"\uAC8C\uC784 \uD50C\uB7AB\uD3FC",header:{back:"\uB4A4\uB85C",shareAria:"\uAC8C\uC784 \uACF5\uC720",toggleMenuAria:"\uBA54\uB274 \uC804\uD658",fallbackTitle:"\uAC8C\uC784"}},menu:{favorite:"\uC990\uACA8\uCC3E\uAE30",favorited:"\uC990\uACA8\uCC3E\uAE30\uB428",profile:"\uD504\uB85C\uD544",login:"\uB85C\uADF8\uC778",refresh:"\uC0C8\uB85C\uACE0\uCE68",loggedIn:"\uB85C\uADF8\uC778\uB428"},share:{title:"\uAC8C\uC784 \uACF5\uC720",closeLabel:"\uB2EB\uAE30",retry:"\uC7AC\uC2DC\uB3C4",loading:"\uB85C\uB529 \uC911...",imageAlt:"\uAC8C\uC784 \uACF5\uC720 \uC774\uBBF8\uC9C0",shareUrlLabel:"\uACF5\uC720 URL:",copied:"\uBCF5\uC0AC\uB428",copy:"\uBCF5\uC0AC",saveShare:"\uC800\uC7A5 \uBC0F \uACF5\uC720",hint:"\uC774\uBBF8\uC9C0\uC5D0 \uAC8C\uC784\uC73C\uB85C \uC5F0\uACB0\uB418\uB294 QR \uCF54\uB4DC\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4",loadError:"\uACF5\uC720 \uC774\uBBF8\uC9C0\uB97C \uBD88\uB7EC\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4",downloadError:"\uC774\uBBF8\uC9C0\uB97C \uB2E4\uC6B4\uB85C\uB4DC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4"},checkin:{successTitle:"\uBCF4\uC0C1\uC744 \uBC1B\uC558\uC2B5\uB2C8\uB2E4!",successMessage:"\uBCF4\uC0C1\uC774 \uC9C0\uAE09\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",failedTitle:"\uCD9C\uC11D \uC2E4\uD328",canceledTitle:"\uCD9C\uC11D \uCDE8\uC18C\uB428",errors:{userRejected:"\uCD9C\uC11D \uC791\uC5C5\uC744 \uCDE8\uC18C\uD588\uC2B5\uB2C8\uB2E4",insufficientFunds:"\uAC00\uC2A4\uBE44\uB97C \uC9C0\uBD88\uD560 \uC790\uAE08\uC774 \uBD80\uC871\uD569\uB2C8\uB2E4",alreadyCheckedIn:"\uC624\uB298 \uC774\uBBF8 \uCD9C\uC11D\uD588\uC2B5\uB2C8\uB2E4. \uB0B4\uC77C \uB2E4\uC2DC \uC624\uC138\uC694!",network:"\uB124\uD2B8\uC6CC\uD06C \uC624\uB958. \uB098\uC911\uC5D0 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694"}},store:{title:"\uBCF4\uC11D \uC0C1\uC810",hot:"\uC778\uAE30",buy:"\uAD6C\uB9E4",cancel:"\uCDE8\uC18C",unit:"\uBCF4\uC11D",successTitle:"\uACB0\uC81C \uC131\uACF5",successMessage:"{amount}\uAC1C\uC758 \uBCF4\uC11D\uC744 \uBC1B\uC558\uC2B5\uB2C8\uB2E4!"},payment:{title:"\uAD6C\uB9E4 \uD655\uC778",description:"\uC774 \uAC8C\uC784 \uC544\uC774\uD15C\uC5D0 \uBCF4\uC11D {amount}\uAC1C\uB97C \uC0AC\uC6A9\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",amountLabel:"\uBCF4\uC11D {amount}\uAC1C",balance:"\uD604\uC7AC \uC794\uC561: \uBCF4\uC11D {balance}\uAC1C",insufficientTitle:"\uC794\uC561 \uBD80\uC871",insufficientDesc:"\uBCF4\uC720: {gems} \uBCF4\uC11D",insufficientMessage:"\uD604\uC7AC \uC794\uC561\uC740 \uBCF4\uC11D {balance}\uAC1C\uC785\uB2C8\uB2E4. \uC774 \uAD6C\uB9E4\uC5D0\uB294 \uBCF4\uC11D {amount}\uAC1C\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.",cancel:"\uCDE8\uC18C",confirm:"\uD655\uC778",recharge:"\uCDA9\uC804",successTitle:"\uACB0\uC81C \uC131\uACF5",successMessage:"\uBCF4\uC11D {amount}\uAC1C\uAC00 \uCC28\uAC10\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",invalidRequest:"\uACB0\uC81C \uC694\uCCAD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."}};var Te={app:{title:"Playsout \u0E21\u0E34\u0E19\u0E34\u0E40\u0E01\u0E21",description:"\u0E40\u0E25\u0E48\u0E19\u0E40\u0E01\u0E21\u0E14\u0E48\u0E27\u0E19\u0E42\u0E14\u0E22\u0E44\u0E21\u0E48\u0E15\u0E49\u0E2D\u0E07\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A"},home:{loggedIn:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E41\u0E25\u0E49\u0E27",logIn:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",games:"\u0E40\u0E01\u0E21",bannerAlt:"\u0E40\u0E01\u0E21 Playsout",searchPlaceholder:"\u0E04\u0E49\u0E19\u0E2B\u0E32\u0E15\u0E32\u0E21\u0E0A\u0E37\u0E48\u0E2D\u0E2B\u0E23\u0E37\u0E2D\u0E2B\u0E21\u0E27\u0E14\u0E2B\u0E21\u0E39\u0E48",noGames:"\u0E44\u0E21\u0E48\u0E1E\u0E1A\u0E40\u0E01\u0E21"},profile:{title:"\u0E42\u0E1B\u0E23\u0E44\u0E1F\u0E25\u0E4C",settings:"\u0E01\u0E32\u0E23\u0E15\u0E31\u0E49\u0E07\u0E04\u0E48\u0E32",language:"\u0E20\u0E32\u0E29\u0E32",recentGames:"\u0E40\u0E01\u0E21\u0E17\u0E35\u0E48\u0E40\u0E25\u0E48\u0E19\u0E25\u0E48\u0E32\u0E2A\u0E38\u0E14",noGames:"\u0E22\u0E31\u0E07\u0E44\u0E21\u0E48\u0E21\u0E35\u0E40\u0E01\u0E21\u0E17\u0E35\u0E48\u0E40\u0E25\u0E48\u0E19",guest:"\u0E1C\u0E39\u0E49\u0E40\u0E22\u0E35\u0E48\u0E22\u0E21\u0E0A\u0E21",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\u0E1C\u0E08\u0E0D\u0E20\u0E31\u0E22",Simulation:"\u0E08\u0E33\u0E25\u0E2D\u0E07\u0E2A\u0E16\u0E32\u0E19\u0E01\u0E32\u0E23\u0E13\u0E4C",Casual:"\u0E41\u0E04\u0E0A\u0E0A\u0E27\u0E25",Arcade:"\u0E2D\u0E32\u0E23\u0E4C\u0E40\u0E04\u0E14",Moba:"\u0E42\u0E21\u0E1A\u0E32",Puzzle:"\u0E1B\u0E23\u0E34\u0E28\u0E19\u0E32"},auth:{loginSuccess:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08!",loginTitle:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A Playsout",welcome:"\u0E22\u0E34\u0E19\u0E14\u0E35\u0E15\u0E49\u0E2D\u0E19\u0E23\u0E31\u0E1A\u0E2A\u0E39\u0E48\u0E41\u0E1E\u0E25\u0E15\u0E1F\u0E2D\u0E23\u0E4C\u0E21\u0E40\u0E01\u0E21 Playsout",prompt:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E23\u0E34\u0E48\u0E21\u0E40\u0E25\u0E48\u0E19",mustLogin:"\u0E04\u0E38\u0E13\u0E15\u0E49\u0E2D\u0E07\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E25\u0E48\u0E19",authorizeHint:"\u0E04\u0E25\u0E34\u0E01\u0E1B\u0E38\u0E48\u0E21\u0E14\u0E49\u0E32\u0E19\u0E25\u0E48\u0E32\u0E07\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",authorizing:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15...",authorize:"\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",terms:"\u0E01\u0E32\u0E23\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E41\u0E2A\u0E14\u0E07\u0E27\u0E48\u0E32\u0E04\u0E38\u0E13\u0E22\u0E2D\u0E21\u0E23\u0E31\u0E1A\u0E02\u0E49\u0E2D\u0E01\u0E33\u0E2B\u0E19\u0E14\u0E43\u0E19\u0E01\u0E32\u0E23\u0E43\u0E2B\u0E49\u0E1A\u0E23\u0E34\u0E01\u0E32\u0E23\u0E02\u0E2D\u0E07\u0E40\u0E23\u0E32",signingIn:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E25\u0E07\u0E0A\u0E37\u0E48\u0E2D\u0E40\u0E02\u0E49\u0E32\u0E43\u0E0A\u0E49",signMessage:"\u0E01\u0E23\u0E38\u0E13\u0E32\u0E40\u0E0B\u0E47\u0E19\u0E0A\u0E37\u0E48\u0E2D\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E43\u0E19\u0E01\u0E23\u0E30\u0E40\u0E1B\u0E4B\u0E32\u0E40\u0E07\u0E34\u0E19\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13"},game:{loading:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E42\u0E2B\u0E25\u0E14",notFound:"\u0E44\u0E21\u0E48\u0E1E\u0E1A\u0E40\u0E01\u0E21",backHome:"\u0E01\u0E25\u0E31\u0E1A\u0E2B\u0E19\u0E49\u0E32\u0E2B\u0E25\u0E31\u0E01",pageTitleSuffix:"\u0E41\u0E1E\u0E25\u0E15\u0E1F\u0E2D\u0E23\u0E4C\u0E21\u0E40\u0E01\u0E21",header:{back:"\u0E01\u0E25\u0E31\u0E1A",shareAria:"\u0E41\u0E0A\u0E23\u0E4C\u0E40\u0E01\u0E21",toggleMenuAria:"\u0E2A\u0E25\u0E31\u0E1A\u0E40\u0E21\u0E19\u0E39",fallbackTitle:"\u0E40\u0E01\u0E21"}},menu:{favorite:"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E42\u0E1B\u0E23\u0E14",favorited:"\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E43\u0E19\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E42\u0E1B\u0E23\u0E14\u0E41\u0E25\u0E49\u0E27",profile:"\u0E42\u0E1B\u0E23\u0E44\u0E1F\u0E25\u0E4C",login:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",refresh:"\u0E23\u0E35\u0E40\u0E1F\u0E23\u0E0A",loggedIn:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E41\u0E25\u0E49\u0E27"},share:{title:"\u0E41\u0E0A\u0E23\u0E4C\u0E40\u0E01\u0E21",closeLabel:"\u0E1B\u0E34\u0E14",retry:"\u0E25\u0E2D\u0E07\u0E43\u0E2B\u0E21\u0E48",loading:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E42\u0E2B\u0E25\u0E14...",imageAlt:"\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E41\u0E0A\u0E23\u0E4C\u0E40\u0E01\u0E21",shareUrlLabel:"\u0E41\u0E0A\u0E23\u0E4C URL:",copied:"\u0E04\u0E31\u0E14\u0E25\u0E2D\u0E01\u0E41\u0E25\u0E49\u0E27",copy:"\u0E04\u0E31\u0E14\u0E25\u0E2D\u0E01",saveShare:"\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E41\u0E25\u0E30\u0E41\u0E0A\u0E23\u0E4C",hint:"\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E23\u0E27\u0E21\u0E23\u0E2B\u0E31\u0E2A QR \u0E17\u0E35\u0E48\u0E25\u0E34\u0E07\u0E01\u0E4C\u0E44\u0E1B\u0E22\u0E31\u0E07\u0E40\u0E01\u0E21\u0E19\u0E35\u0E49",loadError:"\u0E42\u0E2B\u0E25\u0E14\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E41\u0E0A\u0E23\u0E4C\u0E44\u0E21\u0E48\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08",downloadError:"\u0E14\u0E32\u0E27\u0E19\u0E4C\u0E42\u0E2B\u0E25\u0E14\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E44\u0E21\u0E48\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08"},checkin:{successTitle:"\u0E04\u0E38\u0E13\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A\u0E23\u0E32\u0E07\u0E27\u0E31\u0E25!",successMessage:"\u0E23\u0E31\u0E1A\u0E23\u0E32\u0E07\u0E27\u0E31\u0E25\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E41\u0E25\u0E49\u0E27",failedTitle:"\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19\u0E25\u0E49\u0E21\u0E40\u0E2B\u0E25\u0E27",canceledTitle:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19",errors:{userRejected:"\u0E04\u0E38\u0E13\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\u0E01\u0E32\u0E23\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19",insufficientFunds:"\u0E40\u0E07\u0E34\u0E19\u0E44\u0E21\u0E48\u0E1E\u0E2D\u0E08\u0E48\u0E32\u0E22\u0E04\u0E48\u0E32\u0E41\u0E01\u0E4A\u0E2A",alreadyCheckedIn:"\u0E04\u0E38\u0E13\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19\u0E27\u0E31\u0E19\u0E19\u0E35\u0E49\u0E44\u0E1B\u0E41\u0E25\u0E49\u0E27 \u0E01\u0E25\u0E31\u0E1A\u0E21\u0E32\u0E43\u0E2B\u0E21\u0E48\u0E1E\u0E23\u0E38\u0E48\u0E07\u0E19\u0E35\u0E49!",network:"\u0E02\u0E49\u0E2D\u0E1C\u0E34\u0E14\u0E1E\u0E25\u0E32\u0E14\u0E40\u0E04\u0E23\u0E37\u0E2D\u0E02\u0E48\u0E32\u0E22 \u0E42\u0E1B\u0E23\u0E14\u0E25\u0E2D\u0E07\u0E43\u0E2B\u0E21\u0E48\u0E20\u0E32\u0E22\u0E2B\u0E25\u0E31\u0E07"}},store:{title:"\u0E23\u0E49\u0E32\u0E19\u0E04\u0E49\u0E32\u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",hot:"\u0E21\u0E32\u0E41\u0E23\u0E07",buy:"\u0E0B\u0E37\u0E49\u0E2D",cancel:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01",unit:"\u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",successTitle:"\u0E0A\u0E33\u0E23\u0E30\u0E40\u0E07\u0E34\u0E19\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08",successMessage:"\u0E04\u0E38\u0E13\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A {amount} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35!"},payment:{title:"\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E01\u0E32\u0E23\u0E0B\u0E37\u0E49\u0E2D",description:"\u0E43\u0E0A\u0E49 {amount} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E0B\u0E37\u0E49\u0E2D\u0E44\u0E2D\u0E40\u0E17\u0E21\u0E43\u0E19\u0E40\u0E01\u0E21\u0E19\u0E35\u0E49\u0E2B\u0E23\u0E37\u0E2D\u0E44\u0E21\u0E48?",amountLabel:"{amount} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",balance:"\u0E22\u0E2D\u0E14\u0E04\u0E07\u0E40\u0E2B\u0E25\u0E37\u0E2D\u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19: {balance} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",insufficientTitle:"\u0E22\u0E2D\u0E14\u0E04\u0E07\u0E40\u0E2B\u0E25\u0E37\u0E2D\u0E44\u0E21\u0E48\u0E1E\u0E2D",insufficientDesc:"\u0E21\u0E35\u0E2D\u0E22\u0E39\u0E48: {gems} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",insufficientMessage:"\u0E22\u0E2D\u0E14\u0E04\u0E07\u0E40\u0E2B\u0E25\u0E37\u0E2D\u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19\u0E04\u0E37\u0E2D {balance} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35 \u0E01\u0E32\u0E23\u0E0B\u0E37\u0E49\u0E2D\u0E19\u0E35\u0E49\u0E15\u0E49\u0E2D\u0E07\u0E43\u0E0A\u0E49 {amount} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",cancel:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01",confirm:"\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19",recharge:"\u0E40\u0E15\u0E34\u0E21\u0E40\u0E07\u0E34\u0E19",successTitle:"\u0E0A\u0E33\u0E23\u0E30\u0E40\u0E07\u0E34\u0E19\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08",successMessage:"\u0E2B\u0E31\u0E01 {amount} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35\u0E41\u0E25\u0E49\u0E27",invalidRequest:"\u0E04\u0E33\u0E02\u0E2D\u0E0A\u0E33\u0E23\u0E30\u0E40\u0E07\u0E34\u0E19\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07"}};var Pe={app:{title:"Playsout Mini Games",description:"Ch\u01A1i game nhanh kh\xF4ng c\u1EA7n \u0111\u0103ng nh\u1EADp."},home:{loggedIn:"\u0110\xE3 \u0111\u0103ng nh\u1EADp",logIn:"\u0110\u0103ng nh\u1EADp",games:"Tr\xF2 ch\u01A1i",bannerAlt:"Tr\xF2 ch\u01A1i Playsout",searchPlaceholder:"T\xECm ki\u1EBFm theo ti\xEAu \u0111\u1EC1 ho\u1EB7c danh m\u1EE5c",noGames:"Kh\xF4ng t\xECm th\u1EA5y tr\xF2 ch\u01A1i"},profile:{title:"H\u1ED3 s\u01A1",settings:"C\xE0i \u0111\u1EB7t",language:"Ng\xF4n ng\u1EEF",recentGames:"Tr\xF2 ch\u01A1i \u0111\xE3 ch\u01A1i g\u1EA7n \u0111\xE2y",noGames:"Ch\u01B0a ch\u01A1i game n\xE0o",guest:"Kh\xE1ch",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Phi\xEAu l\u01B0u",Simulation:"M\xF4 ph\u1ECFng",Casual:"Ph\u1ED5 th\xF4ng",Arcade:"Arcade",Moba:"Moba",Puzzle:"Gi\u1EA3i \u0111\u1ED1"},auth:{loginSuccess:"\u0110\u0103ng nh\u1EADp th\xE0nh c\xF4ng!",loginTitle:"\u0110\u0103ng nh\u1EADp Playsout",welcome:"Ch\xE0o m\u1EEBng \u0111\u1EBFn v\u1EDBi n\u1EC1n t\u1EA3ng tr\xF2 ch\u01A1i Playsout",prompt:"\u0110\u0103ng nh\u1EADp \u0111\u1EC3 b\u1EAFt \u0111\u1EA7u ch\u01A1i",mustLogin:"B\u1EA1n ph\u1EA3i \u0111\u0103ng nh\u1EADp \u0111\u1EC3 ch\u01A1i",authorizeHint:"Nh\u1EA5p v\xE0o n\xFAt b\xEAn d\u01B0\u1EDBi \u0111\u1EC3 \u1EE7y quy\u1EC1n \u0111\u0103ng nh\u1EADp",authorizing:"\u0110ang \u1EE7y quy\u1EC1n...",authorize:"\u1EE6y quy\u1EC1n \u0111\u0103ng nh\u1EADp",terms:"B\u1EB1ng c\xE1ch \u1EE7y quy\u1EC1n, b\u1EA1n \u0111\u1ED3ng \xFD v\u1EDBi \u0110i\u1EC1u kho\u1EA3n d\u1ECBch v\u1EE5 c\u1EE7a ch\xFAng t\xF4i",signingIn:"\u0110ang \u0111\u0103ng nh\u1EADp",signMessage:"Vui l\xF2ng k\xFD tin nh\u1EAFn trong v\xED c\u1EE7a b\u1EA1n"},game:{loading:"\u0110ang t\u1EA3i",notFound:"Kh\xF4ng t\xECm th\u1EA5y tr\xF2 ch\u01A1i",backHome:"V\u1EC1 trang ch\u1EE7",pageTitleSuffix:"N\u1EC1n t\u1EA3ng tr\xF2 ch\u01A1i",header:{back:"Quay l\u1EA1i",shareAria:"Chia s\u1EBB tr\xF2 ch\u01A1i",toggleMenuAria:"Chuy\u1EC3n \u0111\u1ED5i menu",fallbackTitle:"Tr\xF2 ch\u01A1i"}},menu:{favorite:"Y\xEAu th\xEDch",favorited:"\u0110\xE3 y\xEAu th\xEDch",profile:"H\u1ED3 s\u01A1",login:"\u0110\u0103ng nh\u1EADp",refresh:"L\xE0m m\u1EDBi",loggedIn:"\u0110\xE3 \u0111\u0103ng nh\u1EADp"},share:{title:"Chia s\u1EBB tr\xF2 ch\u01A1i",closeLabel:"\u0110\xF3ng",retry:"Th\u1EED l\u1EA1i",loading:"\u0110ang t\u1EA3i...",imageAlt:"H\xECnh \u1EA3nh chia s\u1EBB tr\xF2 ch\u01A1i",shareUrlLabel:"URL chia s\u1EBB:",copied:"\u0110\xE3 sao ch\xE9p",copy:"Sao ch\xE9p",saveShare:"L\u01B0u & Chia s\u1EBB",hint:"H\xECnh \u1EA3nh bao g\u1ED3m m\xE3 QR li\xEAn k\u1EBFt \u0111\u1EBFn tr\xF2 ch\u01A1i n\xE0y",loadError:"Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c h\xECnh \u1EA3nh chia s\u1EBB",downloadError:"Kh\xF4ng t\u1EA3i xu\u1ED1ng \u0111\u01B0\u1EE3c h\xECnh \u1EA3nh"},checkin:{successTitle:"B\u1EA1n \u0111\xE3 nh\u1EADn ph\u1EA7n th\u01B0\u1EDFng!",successMessage:"Ph\u1EA7n th\u01B0\u1EDFng c\u1EE7a b\u1EA1n \u0111\xE3 \u0111\u01B0\u1EE3c nh\u1EADn.",failedTitle:"\u0110i\u1EC3m danh th\u1EA5t b\u1EA1i",canceledTitle:"\u0110i\u1EC3m danh \u0111\xE3 h\u1EE7y",errors:{userRejected:"B\u1EA1n \u0111\xE3 h\u1EE7y thao t\xE1c \u0111i\u1EC3m danh",insufficientFunds:"Kh\xF4ng \u0111\u1EE7 ti\u1EC1n \u0111\u1EC3 tr\u1EA3 ph\xED Gas",alreadyCheckedIn:"H\xF4m nay b\u1EA1n \u0111\xE3 \u0111i\u1EC3m danh r\u1ED3i. H\xE3y quay l\u1EA1i v\xE0o ng\xE0y mai!",network:"L\u1ED7i m\u1EA1ng. Vui l\xF2ng th\u1EED l\u1EA1i sau"}},store:{title:"C\u1EEDa h\xE0ng \u0110\xE1 qu\xFD",hot:"HOT",buy:"MUA",cancel:"H\u1EE7y",unit:"\u0110\xE1 qu\xFD",successTitle:"Thanh to\xE1n th\xE0nh c\xF4ng",successMessage:"B\u1EA1n \u0111\xE3 nh\u1EADn \u0111\u01B0\u1EE3c {amount} \u0111\xE1 qu\xFD!"},payment:{title:"X\xE1c nh\u1EADn mua",description:"D\xF9ng {amount} \u0111\xE1 qu\xFD \u0111\u1EC3 mua v\u1EADt ph\u1EA9m trong game n\xE0y?",amountLabel:"{amount} \u0111\xE1 qu\xFD",balance:"S\u1ED1 d\u01B0 hi\u1EC7n t\u1EA1i: {balance} \u0111\xE1 qu\xFD",insufficientTitle:"S\u1ED1 d\u01B0 kh\xF4ng \u0111\u1EE7",insufficientDesc:"Hi\u1EC7n c\xF3: {gems} \u0110\xE1 qu\xFD",insufficientMessage:"S\u1ED1 d\u01B0 hi\u1EC7n t\u1EA1i l\xE0 {balance} \u0111\xE1 qu\xFD. Giao d\u1ECBch n\xE0y c\u1EA7n {amount} \u0111\xE1 qu\xFD.",cancel:"H\u1EE7y",confirm:"X\xE1c nh\u1EADn",recharge:"N\u1EA1p ti\u1EC1n",successTitle:"Thanh to\xE1n th\xE0nh c\xF4ng",successMessage:"\u0110\xE3 tr\u1EEB {amount} \u0111\xE1 qu\xFD.",invalidRequest:"Y\xEAu c\u1EA7u thanh to\xE1n kh\xF4ng h\u1EE3p l\u1EC7."}};var Ae={app:{title:"Playsout Mini Games",description:"Mainkan game cepat tanpa login."},home:{loggedIn:"Sudah login",logIn:"Login",games:"Game",bannerAlt:"Game Playsout",searchPlaceholder:"Cari berdasarkan judul atau kategori",noGames:"Game tidak ditemukan"},profile:{title:"Profil",settings:"Pengaturan",language:"Bahasa",recentGames:"Game yang Baru Dimainkan",noGames:"Belum ada game yang dimainkan",guest:"Tamu",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Petualangan",Simulation:"Simulasi",Casual:"Kasual",Arcade:"Arcade",Moba:"Moba",Puzzle:"Teka-teki"},auth:{loginSuccess:"Login berhasil!",loginTitle:"Login Playsout",welcome:"Selamat datang di platform game Playsout",prompt:"Login untuk mulai bermain",mustLogin:"Anda harus login untuk bermain",authorizeHint:"Klik tombol di bawah untuk mengotorisasi login",authorizing:"Mengotorisasi...",authorize:"Otorisasi login",terms:"Dengan mengotorisasi, Anda menyetujui Ketentuan Layanan kami",signingIn:"Masuk...",signMessage:"Silakan tanda tangani pesan di dompet Anda"},game:{loading:"Memuat",notFound:"Game tidak ditemukan",backHome:"Kembali ke beranda",pageTitleSuffix:"Platform Game",header:{back:"Kembali",shareAria:"Bagikan game",toggleMenuAria:"Alihkan menu",fallbackTitle:"Game"}},menu:{favorite:"Favorit",favorited:"Difavoritkan",profile:"Profil",login:"Login",refresh:"Segarkan",loggedIn:"Sudah login"},share:{title:"Bagikan Game",closeLabel:"Tutup",retry:"Coba lagi",loading:"Memuat...",imageAlt:"Gambar berbagi game",shareUrlLabel:"URL Berbagi:",copied:"Disalin",copy:"Salin",saveShare:"Simpan & Bagikan",hint:"Gambar termasuk kode QR yang menautkan ke game ini",loadError:"Gagal memuat gambar berbagi",downloadError:"Gagal mengunduh gambar"},checkin:{successTitle:"Anda mendapat hadiah!",successMessage:"Hadiah Anda telah diklaim.",failedTitle:"Check-in gagal",canceledTitle:"Check-in dibatalkan",errors:{userRejected:"Anda membatalkan operasi check-in",insufficientFunds:"Dana tidak cukup untuk membayar biaya Gas",alreadyCheckedIn:"Anda sudah check-in hari ini. Kembali lagi besok!",network:"Kesalahan jaringan. Silakan coba lagi nanti"}},store:{title:"Toko Permata",hot:"HOT",buy:"BELI",cancel:"Batal",unit:"Permata",successTitle:"Pembayaran Berhasil",successMessage:"Anda menerima {amount} permata!"},payment:{title:"Konfirmasi Pembelian",description:"Gunakan {amount} permata untuk membeli item game ini?",amountLabel:"{amount} permata",balance:"Saldo saat ini: {balance} permata",insufficientTitle:"Saldo Tidak Cukup",insufficientDesc:"Tersedia: {gems} Permata",insufficientMessage:"Saldo saat ini {balance} permata. Pembelian ini membutuhkan {amount} permata.",cancel:"Batal",confirm:"Konfirmasi",recharge:"Isi Ulang",successTitle:"Pembayaran Berhasil",successMessage:"{amount} permata telah dikurangi.",invalidRequest:"Permintaan pembayaran tidak valid."}};var Le={app:{title:"Permainan Mini Playsout",description:"Main permainan pantas tanpa log masuk."},home:{loggedIn:"Log masuk",logIn:"Log masuk",games:"Permainan",bannerAlt:"Permainan Playsout",searchPlaceholder:"Cari mengikut tajuk atau kategori",noGames:"Tiada permainan dijumpai"},profile:{title:"Profil",settings:"Tetapan",language:"Bahasa",recentGames:"Permainan Baru Dimainkan",noGames:"Belum ada permainan dimainkan",guest:"Pelawat",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Pengembaraan",Simulation:"Simulasi",Casual:"Santai",Arcade:"Arked",Moba:"Moba",Puzzle:"Teka-teki"},auth:{loginSuccess:"Log masuk berjaya!",loginTitle:"Log masuk Playsout",welcome:"Selamat datang ke platform permainan Playsout",prompt:"Log masuk untuk mula bermain",mustLogin:"Anda mesti log masuk untuk bermain",authorizeHint:"Klik butang di bawah untuk membenarkan log masuk",authorizing:"Membenarkan...",authorize:"Benarkan log masuk",terms:"Dengan membenarkan, anda bersetuju dengan Syarat Perkhidmatan kami",signingIn:"Sedang log masuk",signMessage:"Sila tandatangan mesej dalam dompet anda"},game:{loading:"Memuatkan",notFound:"Permainan tidak dijumpai",backHome:"Kembali ke laman utama",pageTitleSuffix:"Platform Permainan",header:{back:"Kembali",shareAria:"Kongsi permainan",toggleMenuAria:"Togol menu",fallbackTitle:"Permainan"}},menu:{favorite:"Kegemaran",favorited:"Dikegemarankan",profile:"Profil",login:"Log masuk",refresh:"Muat semula",loggedIn:"Log masuk"},share:{title:"Kongsi Permainan",closeLabel:"Tutup",retry:"Cuba lagi",loading:"Memuatkan...",imageAlt:"Imej kongsi permainan",shareUrlLabel:"URL Kongsi:",copied:"Disalin",copy:"Salin",saveShare:"Simpan & Kongsi",hint:"Imej termasuk kod QR yang memaut ke permainan ini",loadError:"Gagal memuatkan imej kongsi",downloadError:"Gagal memuat turun imej"},checkin:{successTitle:"Anda mendapat ganjaran!",successMessage:"Ganjaran anda telah dituntut.",failedTitle:"Daftar masuk gagal",canceledTitle:"Daftar masuk dibatalkan",errors:{userRejected:"Anda membatalkan operasi daftar masuk",insufficientFunds:"Dana tidak mencukupi untuk membayar yuran Gas",alreadyCheckedIn:"Anda sudah daftar masuk hari ini. Kembali lagi esok!",network:"Ralat rangkaian. Sila cuba lagi kemudian"}},store:{title:"Kedai Permata",hot:"HOT",buy:"BELI",cancel:"Batal",unit:"Permata",successTitle:"Pembayaran Berjaya",successMessage:"Anda menerima {amount} permata!"},payment:{title:"Sahkan Pembelian",description:"Gunakan {amount} permata untuk membeli item permainan ini?",amountLabel:"{amount} permata",balance:"Baki semasa: {balance} permata",insufficientTitle:"Baki Tidak Mencukupi",insufficientDesc:"Tersedia: {gems} Permata",insufficientMessage:"Baki semasa ialah {balance} permata. Pembelian ini memerlukan {amount} permata.",cancel:"Batal",confirm:"Sahkan",recharge:"Tambah Nilai",successTitle:"Pembayaran Berjaya",successMessage:"{amount} permata telah ditolak.",invalidRequest:"Permintaan pembayaran tidak sah."}};var $=n=>{if(typeof window>"u")return n;let t=l(n);return ke(t)},gt="https://games.playsout.com/resources/icon/fonts",K=n=>{if(typeof window>"u")return n;let t=n.replace(/^\.\//,"");return`${gt}/${t}`},A={en:xe,zh:Ie,ja:Ee,ko:Se,th:Te,vi:Pe,id:Ae,ms:Le};function ne(n,t){let e=t.split("."),a=n;for(let r of e)if(a&&typeof a=="object"&&r in a)a=a[r];else return t;return typeof a=="string"?a:t}function Ce(n,t={}){return n.replace(/\{(\w+)\}/g,(e,a)=>String(t[a]??`{${a}}`))}var Re=`
|
|
2
2
|
:root {
|
|
3
3
|
--playsout-primary: #6366f1;
|
|
4
4
|
--playsout-bg: #0f1419;
|
|
@@ -13,16 +13,16 @@
|
|
|
13
13
|
/* Adelle Sans \u5B57\u4F53 */
|
|
14
14
|
@font-face {
|
|
15
15
|
font-family: "Adelle Sans";
|
|
16
|
-
src: url('${
|
|
17
|
-
url('${
|
|
16
|
+
src: url('${K("./AdelleSans-Regular.woff2")}') format('woff2'),
|
|
17
|
+
url('${K("./AdelleSans-Regular.woff")}') format('woff');
|
|
18
18
|
font-style: normal;
|
|
19
19
|
font-display: swap;
|
|
20
20
|
font-weight: 300;
|
|
21
21
|
}
|
|
22
22
|
@font-face {
|
|
23
23
|
font-family: "Adelle Sans";
|
|
24
|
-
src: url('${
|
|
25
|
-
url('${
|
|
24
|
+
src: url('${K("./AdelleSans-Semibold.woff2")}') format('woff2'),
|
|
25
|
+
url('${K("./AdelleSans-Semibold.woff")}') format('woff');
|
|
26
26
|
font-style: normal;
|
|
27
27
|
font-display: swap;
|
|
28
28
|
font-weight: 600;
|
|
@@ -138,7 +138,8 @@
|
|
|
138
138
|
color: #a855f7; /* \u7D2B\u8272 */
|
|
139
139
|
width: 1rem;
|
|
140
140
|
height: 1rem;
|
|
141
|
-
fill:
|
|
141
|
+
fill: currentColor;
|
|
142
|
+
stroke: currentColor;
|
|
142
143
|
}
|
|
143
144
|
|
|
144
145
|
/* Profile Button: demo \u98CE\u683C */
|
|
@@ -560,90 +561,6 @@
|
|
|
560
561
|
padding-left: 0.75rem;
|
|
561
562
|
}
|
|
562
563
|
|
|
563
|
-
.profile-recent-games {
|
|
564
|
-
display: flex;
|
|
565
|
-
overflow-x: auto;
|
|
566
|
-
gap: 1rem;
|
|
567
|
-
padding: 0.25rem 1rem 1rem;
|
|
568
|
-
margin: 0 -1rem;
|
|
569
|
-
scrollbar-width: none;
|
|
570
|
-
}
|
|
571
|
-
.profile-recent-games::-webkit-scrollbar {
|
|
572
|
-
display: none;
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
.profile-recent-game {
|
|
576
|
-
flex-shrink: 0;
|
|
577
|
-
width: 5.25rem;
|
|
578
|
-
display: flex;
|
|
579
|
-
flex-direction: column;
|
|
580
|
-
gap: 0.5rem;
|
|
581
|
-
cursor: pointer;
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
@media (min-width: 640px) {
|
|
585
|
-
.profile-recent-game {
|
|
586
|
-
width: 11rem;
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
|
|
590
|
-
.profile-recent-game-image {
|
|
591
|
-
width: 100%;
|
|
592
|
-
aspect-ratio: 1;
|
|
593
|
-
border-radius: 1rem;
|
|
594
|
-
object-fit: cover;
|
|
595
|
-
background: #2a2a2a;
|
|
596
|
-
border: 1px solid #2a2a2a;
|
|
597
|
-
transition: transform 0.15s;
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
.profile-recent-game:active .profile-recent-game-image {
|
|
601
|
-
transform: scale(0.98);
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
.profile-recent-info {
|
|
605
|
-
min-width: 0;
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
.profile-recent-title {
|
|
609
|
-
font-size: 0.875rem;
|
|
610
|
-
font-weight: 500;
|
|
611
|
-
color: white;
|
|
612
|
-
overflow: hidden;
|
|
613
|
-
text-overflow: ellipsis;
|
|
614
|
-
white-space: nowrap;
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
@media (min-width: 640px) {
|
|
618
|
-
.profile-recent-title {
|
|
619
|
-
font-size: 1rem;
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
.profile-recent-category {
|
|
624
|
-
font-size: 0.75rem;
|
|
625
|
-
color: #6b7280;
|
|
626
|
-
overflow: hidden;
|
|
627
|
-
text-overflow: ellipsis;
|
|
628
|
-
white-space: nowrap;
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
@media (min-width: 640px) {
|
|
632
|
-
.profile-recent-category {
|
|
633
|
-
font-size: 0.875rem;
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
.profile-no-games {
|
|
638
|
-
text-align: center;
|
|
639
|
-
padding: 2.5rem;
|
|
640
|
-
color: #6b7280;
|
|
641
|
-
font-size: 0.875rem;
|
|
642
|
-
background: #1a1a1a;
|
|
643
|
-
border-radius: 0.75rem;
|
|
644
|
-
border: 1px dashed #2a2a2a;
|
|
645
|
-
}
|
|
646
|
-
|
|
647
564
|
/* \u7528\u6237\u4FE1\u606F\u5FBD\u7AE0\uFF08\u7B80\u6D01\u98CE\u683C\uFF09 */
|
|
648
565
|
.profile-user-badge {
|
|
649
566
|
display: inline-flex;
|
|
@@ -909,9 +826,11 @@
|
|
|
909
826
|
}
|
|
910
827
|
|
|
911
828
|
.store-pack-icon svg {
|
|
912
|
-
color: #
|
|
829
|
+
color: #9333ea; /* purple-600 */
|
|
913
830
|
width: 1.25rem;
|
|
914
831
|
height: 1.25rem;
|
|
832
|
+
fill: rgba(147, 51, 234, 0.1);
|
|
833
|
+
stroke: currentColor;
|
|
915
834
|
}
|
|
916
835
|
|
|
917
836
|
.store-pack-info {
|
|
@@ -984,6 +903,150 @@
|
|
|
984
903
|
color: #e5e7eb;
|
|
985
904
|
}
|
|
986
905
|
|
|
906
|
+
/* ========== Payment Modal ========== */
|
|
907
|
+
.payment-modal-overlay {
|
|
908
|
+
position: fixed;
|
|
909
|
+
inset: 0;
|
|
910
|
+
z-index: 1500;
|
|
911
|
+
background: rgba(0, 0, 0, 0.6);
|
|
912
|
+
backdrop-filter: blur(4px);
|
|
913
|
+
-webkit-backdrop-filter: blur(4px);
|
|
914
|
+
display: flex;
|
|
915
|
+
align-items: flex-end;
|
|
916
|
+
justify-content: center;
|
|
917
|
+
animation: modalFadeIn 0.2s ease-out;
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
.payment-modal {
|
|
921
|
+
width: 100%;
|
|
922
|
+
max-width: 28rem;
|
|
923
|
+
background: #ffffff;
|
|
924
|
+
border-top: 1px solid #f3f4f6;
|
|
925
|
+
border-radius: 1.5rem 1.5rem 0 0;
|
|
926
|
+
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
|
|
927
|
+
overflow: hidden;
|
|
928
|
+
animation: modalSlideUp 0.3s ease-out;
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
@media (min-width: 640px) {
|
|
932
|
+
.payment-modal {
|
|
933
|
+
max-width: 20rem;
|
|
934
|
+
border-radius: 1.5rem;
|
|
935
|
+
margin: 1rem;
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
.payment-modal-content {
|
|
940
|
+
padding: 1.5rem 1rem;
|
|
941
|
+
display: flex;
|
|
942
|
+
flex-direction: column;
|
|
943
|
+
align-items: center;
|
|
944
|
+
text-align: center;
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
.payment-modal-title {
|
|
948
|
+
font-size: 1.125rem;
|
|
949
|
+
font-weight: 700;
|
|
950
|
+
color: #111827;
|
|
951
|
+
margin-bottom: 0.5rem;
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
.payment-modal-desc {
|
|
955
|
+
font-size: 0.8125rem;
|
|
956
|
+
color: #6b7280;
|
|
957
|
+
line-height: 1.375;
|
|
958
|
+
margin-bottom: 1rem;
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
.payment-cost-card {
|
|
962
|
+
width: 100%;
|
|
963
|
+
display: flex;
|
|
964
|
+
align-items: center;
|
|
965
|
+
justify-content: center;
|
|
966
|
+
gap: 0.75rem;
|
|
967
|
+
background: #f9fafb;
|
|
968
|
+
border: 1px solid #f3f4f6;
|
|
969
|
+
border-radius: 1rem;
|
|
970
|
+
padding: 0.75rem 1rem;
|
|
971
|
+
margin-bottom: 0.75rem;
|
|
972
|
+
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.04);
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
.payment-cost-amount {
|
|
976
|
+
font-size: 1.875rem;
|
|
977
|
+
font-weight: 900;
|
|
978
|
+
color: #9333ea;
|
|
979
|
+
line-height: 1;
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
.payment-cost-icon {
|
|
983
|
+
width: 1.5rem;
|
|
984
|
+
height: 1.5rem;
|
|
985
|
+
color: #9333ea;
|
|
986
|
+
fill: rgba(147, 51, 234, 0.12);
|
|
987
|
+
stroke: currentColor;
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
.payment-balance {
|
|
991
|
+
width: 100%;
|
|
992
|
+
font-size: 0.75rem;
|
|
993
|
+
color: #6b7280;
|
|
994
|
+
margin-bottom: 1rem;
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
.payment-insufficient {
|
|
998
|
+
width: 100%;
|
|
999
|
+
background: #fef2f2;
|
|
1000
|
+
border: 1px solid #fee2e2;
|
|
1001
|
+
border-radius: 0.75rem;
|
|
1002
|
+
color: #dc2626;
|
|
1003
|
+
font-size: 0.75rem;
|
|
1004
|
+
font-weight: 600;
|
|
1005
|
+
padding: 0.625rem;
|
|
1006
|
+
margin-bottom: 1rem;
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
.payment-actions {
|
|
1010
|
+
display: flex;
|
|
1011
|
+
gap: 0.75rem;
|
|
1012
|
+
width: 100%;
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
.payment-action-btn {
|
|
1016
|
+
flex: 1;
|
|
1017
|
+
min-width: 0;
|
|
1018
|
+
border: none;
|
|
1019
|
+
border-radius: 0.75rem;
|
|
1020
|
+
padding: 0.75rem 0.5rem;
|
|
1021
|
+
font-size: 0.875rem;
|
|
1022
|
+
font-weight: 700;
|
|
1023
|
+
cursor: pointer;
|
|
1024
|
+
transition: transform 0.15s, background 0.15s;
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
.payment-action-btn:active {
|
|
1028
|
+
transform: scale(0.97);
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
.payment-cancel-btn {
|
|
1032
|
+
background: #f3f4f6;
|
|
1033
|
+
color: #4b5563;
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
.payment-cancel-btn:hover {
|
|
1037
|
+
background: #e5e7eb;
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
.payment-confirm-btn {
|
|
1041
|
+
background: linear-gradient(135deg, #22c55e, #059669);
|
|
1042
|
+
color: #ffffff;
|
|
1043
|
+
box-shadow: 0 10px 15px -3px rgba(5, 150, 105, 0.22);
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
.payment-confirm-btn:hover {
|
|
1047
|
+
background: linear-gradient(135deg, #4ade80, #10b981);
|
|
1048
|
+
}
|
|
1049
|
+
|
|
987
1050
|
/* ========== Toast ========== */
|
|
988
1051
|
.toast-container {
|
|
989
1052
|
position: fixed;
|
|
@@ -1035,6 +1098,15 @@
|
|
|
1035
1098
|
color: #16a34a;
|
|
1036
1099
|
}
|
|
1037
1100
|
|
|
1101
|
+
.toast-warning .toast-icon {
|
|
1102
|
+
background: #fef3c7;
|
|
1103
|
+
border-color: #fde68a;
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
.toast-warning .toast-icon svg {
|
|
1107
|
+
color: #d97706;
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1038
1110
|
.toast-content {
|
|
1039
1111
|
flex: 1;
|
|
1040
1112
|
min-width: 0;
|
|
@@ -1153,7 +1225,7 @@
|
|
|
1153
1225
|
border: none;
|
|
1154
1226
|
display: block;
|
|
1155
1227
|
}
|
|
1156
|
-
`,
|
|
1228
|
+
`,Me=`
|
|
1157
1229
|
<svg xmlns="http://www.w3.org/2000/svg" style="display:none">
|
|
1158
1230
|
<symbol id="icon-adventure" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1159
1231
|
<polyline points="14.5 17.5 3 6 3 3 6 3 17.5 14.5"/>
|
|
@@ -1200,8 +1272,13 @@
|
|
|
1200
1272
|
<symbol id="icon-warning" viewBox="0 0 24 24" fill="currentColor">
|
|
1201
1273
|
<path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/>
|
|
1202
1274
|
</symbol>
|
|
1275
|
+
<symbol id="icon-gem" viewBox="0 0 24 24">
|
|
1276
|
+
<path d="M10.5 3 8 9l4 13 4-13-2.5-6"/>
|
|
1277
|
+
<path d="M17 3a2 2 0 0 1 1.6.8l3 4a2 2 0 0 1 .013 2.382l-7.99 10.986a2 2 0 0 1-3.247 0l-7.99-10.986A2 2 0 0 1 2.4 7.8l2.998-3.997A2 2 0 0 1 7 3z"/>
|
|
1278
|
+
<path d="M2 9h20"/>
|
|
1279
|
+
</symbol>
|
|
1203
1280
|
</svg>
|
|
1204
|
-
`,
|
|
1281
|
+
`,ut=n=>{switch(n){case"Adventure":return"#FF7D54";case"Simulation":return"#4ADE80";case"Casual":return"#60A5FA";case"Arcade":return"#A78BFA";case"Moba":return"#FACC15";case"Puzzle":return"#FB923C";case"Doge OS":return"#FBBF24";default:return"#22d3ee"}},_e=[{id:"Doge OS",name:"Doge OS",iconType:"image",iconSrc:"https://games.playsout.com/resources/icon/image/doge32.png"},{id:"Adventure",name:"Adventure",iconType:"icon",iconKey:"adventure",color:"#FF7D54"},{id:"Simulation",name:"Simulation",iconType:"icon",iconKey:"simulation",color:"#4ADE80"},{id:"Casual",name:"Casual",iconType:"icon",iconKey:"casual",color:"#60A5FA"},{id:"Arcade",name:"Arcade",iconType:"icon",iconKey:"arcade",color:"#A78BFA"},{id:"Moba",name:"Moba",iconType:"icon",iconKey:"moba",color:"#FACC15"},{id:"Puzzle",name:"Puzzle",iconType:"icon",iconKey:"puzzle",color:"#FB923C"}],L=class extends HTMLElement{constructor(){super();this._appId="";this._locale="zh";this.games=[];this.filteredGames=[];this.selectedCategory=null;this.searchQuery="";this.bannerUrl="";this.userPoints=1e3;this.avatarUrl="";this.recentGames=[];this._detailMode="iframe";this.currentView="list";this.currentGame=null;this.currentIframeSrc="";this.pendingPaymentResolver=null;this.gemPacks=[{amount:12,price:.99,hot:!1},{amount:60,price:4.99,hot:!0},{amount:180,price:14.99,hot:!1},{amount:360,price:29.99,hot:!1}];this.toastTimeout=null;this.shadow=this.attachShadow({mode:"open"}),this.bridge=new H({getIframe:()=>this.shadow.querySelector(".detail-iframe"),getGameUrl:()=>this.currentIframeSrc,getBalance:()=>this.userPoints,getUser:()=>this.getBridgeUser(),getLocale:()=>this._locale,requestPayment:e=>this.showPaymentModal(e)})}static get observedAttributes(){return["app-id","locale","banner-url","user-points","avatar-url","recent-games","detail-mode"]}t(e,a){let r=A[this._locale]??A.en,o=ne(r,e);if(o!==e)return Ce(o,a??{});let i=ne(A.en,e);return Ce(i,a??{})}hasTranslation(e){let a=A[this._locale]??A.en;return ne(a,e)!==e}getBridgeUser(){let e=window.__playsout_sdk_instance,a=typeof e?.isInitialized=="function"?e.isInitialized():e?.isInitialized,r=typeof e?.isLoggedIn=="function"?e.isLoggedIn():e?.isLoggedIn,o=a&&r&&typeof e?.getUser=="function"?e.getUser():null;return o?{uid:String(o.userId||o.id||o.username||"user"),nickname:String(o.username||o.name||"User"),avatarUrl:o.avatar||o.avatarUrl||""}:null}setUserPoints(e,a,r){let o=this.userPoints;this.userPoints=Math.max(0,Math.floor(e)),this.updateUI(),this.dispatchEvent(new CustomEvent("gem-balance-change",{bubbles:!0,composed:!0,detail:{balance:this.userPoints,previousBalance:o,delta:this.userPoints-o,reason:a,orderId:r}}))}connectedCallback(){this.bridge.attach(),this.render(),this.loadGames()}disconnectedCallback(){this.resolvePendingPayment({status:"cancelled",balance:this.userPoints}),this.bridge.detach(),this.toastTimeout&&(clearTimeout(this.toastTimeout),this.toastTimeout=null)}attributeChangedCallback(e,a,r){if(a!==r){switch(e){case"app-id":this._appId=r||"";break;case"locale":this._locale=r||"zh";break;case"banner-url":this.bannerUrl=r||"";break;case"user-points":{let o=parseInt(r||"1000",10);this.userPoints=Number.isFinite(o)?o:1e3}break;case"avatar-url":this.avatarUrl=r||"";break;case"recent-games":try{this.recentGames=r?JSON.parse(r):[]}catch{this.recentGames=[]}break;case"detail-mode":this._detailMode=r||"link";break}this.shadow.innerHTML&&(e==="locale"?(this.resolvePendingPayment({status:"cancelled",balance:this.userPoints}),this.bridge.cancelPendingPayment(),this.render(),this.loadGames()):this.updateUI())}}async loadGames(){this.showLoading();let e=window.__playsout_sdk_instance;if(!e||!e.isInitialized){let a=()=>{e&&e.isInitialized&&(y.off("initialized",a),this.loadGames())};e?y.on("initialized",a):this.pollForSDK();return}this.doLoadGames(e)}pollForSDK(){let e=setInterval(()=>{let a=window.__playsout_sdk_instance;a&&a.isInitialized&&(clearInterval(e),this.loadGames())},100);setTimeout(()=>{clearInterval(e),this.games.length||(this.showError(),console.warn("[PlaysoutWidget] SDK initialization timeout"))},1e4)}async doLoadGames(e){try{this.games=await e.getGames();let a=this.games.map(r=>{if(!r.image)return null;let o=window.__playsout_resolveAsset,i=typeof o=="function"?o(r.image):r.image;return typeof i!="string"?null:i.startsWith("http")?i:null}).filter(Boolean);a.length>0&&we(a,!0),this.filterGames()}catch(a){console.error("[PlaysoutWidget] Failed to load games:",a),this.showError()}}filterGames(){let e=[...this.games];if(this.selectedCategory&&(e=e.filter(a=>a.category===this.selectedCategory)),this.searchQuery){let a=this.searchQuery.toLowerCase();e=e.filter(r=>r.title.toLowerCase().includes(a)||r.category.toLowerCase().includes(a))}this.filteredGames=e,this.renderGames()}showLoading(){let e=this.shadow.querySelector(".widget-content");e&&(e.innerHTML=`
|
|
1205
1282
|
<div class="loading">
|
|
1206
1283
|
<div class="loading-spinner"></div>
|
|
1207
1284
|
</div>
|
|
@@ -1214,25 +1291,23 @@
|
|
|
1214
1291
|
</div>
|
|
1215
1292
|
<p>Failed to load games</p>
|
|
1216
1293
|
</div>
|
|
1217
|
-
`)}render(){
|
|
1218
|
-
<style>${
|
|
1219
|
-
${
|
|
1294
|
+
`)}render(){let e=this.bannerUrl||l("./home-banner.webp");if(this.__criticalAssetsMarked!==!0){let a=l("./logowhite.png"),r=_e.filter(o=>o.iconType==="image"&&o.iconSrc).map(o=>o.iconSrc);ve([a,e,...r]),this.__criticalAssetsMarked=!0}if(this.currentView==="detail"&&this.currentGame){this.renderGameDetail();return}this.shadow.innerHTML=`
|
|
1295
|
+
<style>${Re}</style>
|
|
1296
|
+
${Me}
|
|
1220
1297
|
<div class="playsout-scroll-container">
|
|
1221
1298
|
<div class="mobile-container">
|
|
1222
1299
|
<div class="playsout-widget">
|
|
1223
1300
|
<!-- Header -->
|
|
1224
1301
|
<header class="widget-header">
|
|
1225
1302
|
<div class="widget-logo">
|
|
1226
|
-
<img src="${
|
|
1303
|
+
<img src="${$("./logowhite.png")}" alt="Playsout" />
|
|
1227
1304
|
</div>
|
|
1228
1305
|
<div class="widget-user">
|
|
1229
1306
|
<!-- Gems Button -->
|
|
1230
1307
|
<button class="widget-gems-btn" id="gems-btn" aria-label="Gem Store">
|
|
1231
1308
|
<span class="widget-gems-amount" id="gems-amount">${this.userPoints}</span>
|
|
1232
|
-
<svg class="widget-gems-icon" viewBox="0 0 24 24"
|
|
1233
|
-
<
|
|
1234
|
-
<path d="M11 3 8 9l4 13 4-13-3-6"/>
|
|
1235
|
-
<path d="M2 9h20"/>
|
|
1309
|
+
<svg class="widget-gems-icon" viewBox="0 0 24 24" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
1310
|
+
<use href="#icon-gem"/>
|
|
1236
1311
|
</svg>
|
|
1237
1312
|
</button>
|
|
1238
1313
|
<!-- Profile Button -->
|
|
@@ -1249,7 +1324,7 @@
|
|
|
1249
1324
|
<div class="widget-banner">
|
|
1250
1325
|
<img
|
|
1251
1326
|
class="banner-image"
|
|
1252
|
-
src="${e
|
|
1327
|
+
src="${e?$(e):""}"
|
|
1253
1328
|
alt="Playsout Games"
|
|
1254
1329
|
/>
|
|
1255
1330
|
</div>
|
|
@@ -1279,10 +1354,10 @@
|
|
|
1279
1354
|
<!-- Categories -->
|
|
1280
1355
|
<div class="widget-categories">
|
|
1281
1356
|
<div class="categories-wrapper" id="categories">
|
|
1282
|
-
${
|
|
1283
|
-
<button class="category-btn${
|
|
1284
|
-
<span class="category-icon">${
|
|
1285
|
-
<span class="category-label">${
|
|
1357
|
+
${_e.map(a=>{let r=this.selectedCategory===a.id,o=a.color||ut(a.id),i=a.iconType==="image"&&a.iconSrc?`<img src="${$(a.iconSrc)}" alt="" style="width:1rem;height:1rem;object-fit:contain;" />`:`<svg width="1rem" height="1rem" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" color="${o}" style="color:${o}"><use href="#icon-${a.iconKey}"/></svg>`,s=this.hasTranslation(`categories.${a.id}`)?this.t(`categories.${a.id}`):a.name;return`
|
|
1358
|
+
<button class="category-btn${r?" active":""}" data-category="${a.id}">
|
|
1359
|
+
<span class="category-icon">${i}</span>
|
|
1360
|
+
<span class="category-label">${s}</span>
|
|
1286
1361
|
</button>`}).join("")}
|
|
1287
1362
|
</div>
|
|
1288
1363
|
</div>
|
|
@@ -1304,15 +1379,15 @@
|
|
|
1304
1379
|
<div class="store-modal-content">
|
|
1305
1380
|
${this.gemPacks.map(a=>`
|
|
1306
1381
|
<div class="store-pack">
|
|
1307
|
-
${a.hot
|
|
1382
|
+
${a.hot?`<div class="store-pack-hot">${this.t("store.hot")}</div>`:""}
|
|
1308
1383
|
<div class="store-pack-left">
|
|
1309
1384
|
<div class="store-pack-icon">
|
|
1310
|
-
<svg viewBox="0 0 24 24"
|
|
1311
|
-
<
|
|
1385
|
+
<svg viewBox="0 0 24 24" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
1386
|
+
<use href="#icon-gem"/>
|
|
1312
1387
|
</svg>
|
|
1313
1388
|
</div>
|
|
1314
1389
|
<div class="store-pack-info">
|
|
1315
|
-
<span class="store-pack-amount">${a.amount} <span
|
|
1390
|
+
<span class="store-pack-amount">${a.amount} <span>${this.t("store.unit")}</span></span>
|
|
1316
1391
|
<span class="store-pack-price">US$${a.price}</span>
|
|
1317
1392
|
</div>
|
|
1318
1393
|
</div>
|
|
@@ -1324,15 +1399,26 @@
|
|
|
1324
1399
|
<button class="store-cancel-btn" id="store-cancel">${this.t("store.cancel")}</button>
|
|
1325
1400
|
</div>
|
|
1326
1401
|
</div>
|
|
1327
|
-
`,this.shadow.appendChild(e),e.querySelectorAll(".store-buy-btn").forEach(a=>{a.addEventListener("click",()=>{let
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
<
|
|
1331
|
-
|
|
1332
|
-
|
|
1402
|
+
`,this.shadow.appendChild(e),e.querySelectorAll(".store-buy-btn").forEach(a=>{a.addEventListener("click",()=>{let r=parseInt(a.dataset.amount||"0",10);this.handleGemPurchase(r)})}),e.querySelector("#store-cancel")?.addEventListener("click",()=>{this.hideStoreModal()}),e.addEventListener("click",a=>{a.target===e&&this.hideStoreModal()})}hideStoreModal(){this.shadow.querySelector("#store-modal-overlay")?.remove()}showPaymentModal(e){return this.hidePaymentModal(),new Promise(a=>{this.pendingPaymentResolver=a;let r=document.createElement("div");r.className="payment-modal-overlay",r.id="payment-modal-overlay";let o=this.userPoints<e.amount;r.innerHTML=`
|
|
1403
|
+
<div class="payment-modal" role="dialog" aria-modal="true" aria-labelledby="payment-modal-title">
|
|
1404
|
+
<div class="payment-modal-content">
|
|
1405
|
+
<h2 class="payment-modal-title" id="payment-modal-title">${this.t("payment.title")}</h2>
|
|
1406
|
+
<p class="payment-modal-desc">${this.t("payment.description",{amount:e.amount})}</p>
|
|
1407
|
+
<div class="payment-cost-card" aria-label="${this.t("payment.amountLabel",{amount:e.amount})}">
|
|
1408
|
+
<span class="payment-cost-amount">${e.amount}</span>
|
|
1409
|
+
<svg class="payment-cost-icon" viewBox="0 0 24 24" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
1410
|
+
<use href="#icon-gem"/>
|
|
1411
|
+
</svg>
|
|
1412
|
+
</div>
|
|
1413
|
+
<div class="payment-balance">${this.t("payment.balance",{balance:this.userPoints})}</div>
|
|
1414
|
+
${o?`<div class="payment-insufficient">${this.t("payment.insufficientMessage",{balance:this.userPoints,amount:e.amount})}</div>`:""}
|
|
1415
|
+
<div class="payment-actions">
|
|
1416
|
+
<button class="payment-action-btn payment-cancel-btn" id="payment-cancel-btn">${this.t("payment.cancel")}</button>
|
|
1417
|
+
<button class="payment-action-btn payment-confirm-btn" id="payment-confirm-btn">${this.t("payment.confirm")}</button>
|
|
1333
1418
|
</div>
|
|
1334
1419
|
</div>
|
|
1335
|
-
|
|
1420
|
+
</div>
|
|
1421
|
+
`,this.shadow.appendChild(r),r.querySelector("#payment-cancel-btn")?.addEventListener("click",()=>{this.resolvePendingPayment({status:"cancelled",balance:this.userPoints})}),r.querySelector("#payment-confirm-btn")?.addEventListener("click",()=>{if(this.userPoints<e.amount){this.showToast(this.t("payment.insufficientTitle"),this.t("payment.insufficientMessage",{balance:this.userPoints,amount:e.amount}),"warning"),this.resolvePendingPayment({status:"insufficient",balance:this.userPoints});return}this.setUserPoints(this.userPoints-e.amount,"payment",e.orderId),this.showToast(this.t("payment.successTitle"),this.t("payment.successMessage",{amount:e.amount})),this.resolvePendingPayment({status:"success",balance:this.userPoints})}),r.addEventListener("click",i=>{i.target===r&&this.resolvePendingPayment({status:"cancelled",balance:this.userPoints})})})}hidePaymentModal(){this.shadow.querySelector("#payment-modal-overlay")?.remove()}resolvePendingPayment(e){let a=this.pendingPaymentResolver;this.pendingPaymentResolver=null,this.hidePaymentModal(),a&&a(e)}showProfileModal(){this.hideProfileModal();let e=document.createElement("div");e.className="profile-modal-overlay",e.id="profile-modal-overlay";let a=window.__playsout_sdk_instance,i=((typeof a?.isInitialized=="function"?a.isInitialized():a?.isInitialized)?a.getUser():null)?.username||this.t("profile.guest");e.innerHTML=`
|
|
1336
1422
|
<div class="profile-modal" id="profile-modal">
|
|
1337
1423
|
<div class="profile-modal-header">
|
|
1338
1424
|
<h2 class="profile-modal-title">${this.t("profile.title")}</h2>
|
|
@@ -1345,13 +1431,9 @@
|
|
|
1345
1431
|
<path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path>
|
|
1346
1432
|
<circle cx="12" cy="7" r="4"></circle>
|
|
1347
1433
|
</svg>
|
|
1348
|
-
<span class="profile-username-text">${
|
|
1434
|
+
<span class="profile-username-text">${i}</span>
|
|
1349
1435
|
</div>
|
|
1350
1436
|
|
|
1351
|
-
<section class="profile-section">
|
|
1352
|
-
<h3 class="profile-section-title">${this.t("profile.recentGames")}</h3>
|
|
1353
|
-
<div class="profile-recent-games">${d}</div>
|
|
1354
|
-
</section>
|
|
1355
1437
|
<section class="profile-section">
|
|
1356
1438
|
<h3 class="profile-section-title">${this.t("profile.settings")}</h3>
|
|
1357
1439
|
<div class="profile-settings">
|
|
@@ -1366,34 +1448,34 @@
|
|
|
1366
1448
|
</section>
|
|
1367
1449
|
</div>
|
|
1368
1450
|
</div>
|
|
1369
|
-
`,this.shadow.appendChild(e),e.querySelector("#profile-close-btn")?.addEventListener("click",()=>{this.hideProfileModal()}),e.addEventListener("click",
|
|
1451
|
+
`,this.shadow.appendChild(e),e.querySelector("#profile-close-btn")?.addEventListener("click",()=>{this.hideProfileModal()}),e.addEventListener("click",p=>{p.target===e&&this.hideProfileModal()});let s=()=>{let p=window.__playsout_sdk_instance,De=(p?.getUser?p.getUser():null)?.username||this.t("profile.guest"),oe=this.shadow.querySelector(".profile-username-text");oe&&(oe.textContent=De)},g=()=>{let p=this.shadow.querySelector(".profile-username-text");p&&(p.textContent=this.t("profile.guest")),this.hideProfileModal()},h=window.__playsout_sdk_instance;h?.on&&(h.on("login",s),h.on("logout",s),h.on("authExpired",g)),e.querySelector("#profile-language-btn")?.addEventListener("click",()=>{this.showLanguageSelectModal()})}hideProfileModal(){this.shadow.querySelector("#profile-modal-overlay")?.remove(),this.shadow.querySelector("#language-modal-overlay")?.remove()}showLanguageSelectModal(){this.shadow.querySelector("#language-modal-overlay")?.remove();let e=document.createElement("div");e.className="language-modal-overlay",e.id="language-modal-overlay";let a=[{code:"en",label:"English"},{code:"zh",label:"\u4E2D\u6587"},{code:"ja",label:"\u65E5\u672C\u8A9E"},{code:"ko",label:"\uD55C\uAD6D\uC5B4"},{code:"th",label:"\u0E44\u0E17\u0E22"},{code:"vi",label:"Ti\u1EBFng Vi\u1EC7t"},{code:"id",label:"Bahasa Indonesia"},{code:"ms",label:"Bahasa Melayu"},{code:"es",label:"Espa\xF1ol"}];e.innerHTML=`
|
|
1370
1452
|
<div class="language-modal">
|
|
1371
1453
|
<div class="language-modal-header">
|
|
1372
1454
|
<h3 class="language-modal-title">${this.t("profile.language")}</h3>
|
|
1373
1455
|
<button class="language-modal-close" id="language-close-btn">\u2715</button>
|
|
1374
1456
|
</div>
|
|
1375
1457
|
<div class="language-modal-list">
|
|
1376
|
-
${a.map(
|
|
1377
|
-
<button class="language-option${
|
|
1378
|
-
<span class="language-option-label">${
|
|
1379
|
-
${
|
|
1458
|
+
${a.map(r=>`
|
|
1459
|
+
<button class="language-option${r.code===this._locale?" active":""}" data-lang="${r.code}">
|
|
1460
|
+
<span class="language-option-label">${r.label}</span>
|
|
1461
|
+
${r.code===this._locale?'<span class="language-option-check">\u2713</span>':""}
|
|
1380
1462
|
</button>
|
|
1381
1463
|
`).join("")}
|
|
1382
1464
|
</div>
|
|
1383
1465
|
</div>
|
|
1384
|
-
`,this.shadow.appendChild(e),e.querySelector("#language-close-btn")?.addEventListener("click",()=>{this.shadow.querySelector("#language-modal-overlay")?.remove()}),e.addEventListener("click",
|
|
1385
|
-
<div class="toast">
|
|
1466
|
+
`,this.shadow.appendChild(e),e.querySelector("#language-close-btn")?.addEventListener("click",()=>{this.shadow.querySelector("#language-modal-overlay")?.remove()}),e.addEventListener("click",r=>{r.target===e&&this.shadow.querySelector("#language-modal-overlay")?.remove()}),e.querySelectorAll(".language-option").forEach(r=>{r.addEventListener("click",()=>{let o=r.dataset.lang;if(o&&o!==this._locale){this._locale=o,this.setAttribute("locale",this._locale),this.dispatchEvent(new CustomEvent("locale-change",{bubbles:!0,composed:!0,detail:this._locale}));let i=this.shadow.querySelector("#profile-current-lang");i&&(i.textContent=this.t(`profile.languages.${this._locale}`)),this.shadow.querySelector("#language-modal-overlay")?.remove()}})})}handleGemPurchase(e){this.setUserPoints(this.userPoints+e,"store"),this.hideStoreModal(),this.showToast(this.t("store.successTitle"),this.t("store.successMessage",{amount:e}))}showToast(e,a="",r="success"){this.toastTimeout&&clearTimeout(this.toastTimeout),this.shadow.querySelector("#toast-container")?.remove();let o=document.createElement("div");o.className="toast-container",o.id="toast-container",o.innerHTML=`
|
|
1467
|
+
<div class="toast${r==="warning"?" toast-warning":""}">
|
|
1386
1468
|
<div class="toast-icon">
|
|
1387
1469
|
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
1388
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/>
|
|
1470
|
+
${r==="warning"?'<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M12 9v4m0 4h.01M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/>':'<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/>'}
|
|
1389
1471
|
</svg>
|
|
1390
1472
|
</div>
|
|
1391
1473
|
<div class="toast-content">
|
|
1392
1474
|
<div class="toast-title">${e}</div>
|
|
1393
|
-
|
|
1475
|
+
${a?`<div class="toast-message">${a}</div>`:""}
|
|
1394
1476
|
</div>
|
|
1395
1477
|
</div>
|
|
1396
|
-
`,this.shadow.appendChild(
|
|
1478
|
+
`,this.shadow.appendChild(o),this.toastTimeout=window.setTimeout(()=>{o.style.opacity="0",o.style.transition="opacity 0.2s",setTimeout(()=>o.remove(),200)},3e3)}renderGames(){let e=this.shadow.querySelector(".widget-content");if(e){if(this.filteredGames.length===0){e.innerHTML=`
|
|
1397
1479
|
<div class="widget-games">
|
|
1398
1480
|
<div class="no-results">
|
|
1399
1481
|
<p>${this.t("home.noGames")}</p>
|
|
@@ -1402,10 +1484,10 @@
|
|
|
1402
1484
|
`;return}e.innerHTML=`
|
|
1403
1485
|
<div class="widget-games">
|
|
1404
1486
|
<div class="games-grid">
|
|
1405
|
-
${this.filteredGames.map((a,
|
|
1487
|
+
${this.filteredGames.map((a,r)=>this.renderGameCard(a,r)).join("")}
|
|
1406
1488
|
</div>
|
|
1407
1489
|
</div>
|
|
1408
|
-
`,e.querySelectorAll(".game-card").forEach(a=>{a.addEventListener("click",()=>{let
|
|
1490
|
+
`,e.querySelectorAll(".game-card").forEach(a=>{a.addEventListener("click",()=>{let r=a.getAttribute("data-game-id"),o=this.games.find(i=>i.id===r);if(o){let i=window.__playsout_sdk_instance,s=typeof i?.isInitialized=="function"?i.isInitialized():i?.isInitialized,g=typeof i?.isLoggedIn=="function"?i.isLoggedIn():i?.isLoggedIn;if(!s||!g){this.showLoginPrompt();return}if(this.dispatchEvent(new CustomEvent("game-click",{detail:o,bubbles:!0,composed:!0})),this._detailMode==="iframe"&&o.externalUrl)this.currentGame=o,this.currentView="detail",this.render();else{let h=o.externalUrl||`/games/${o.id}`;window.location.href=h}}})})}}showLoginPrompt(){this.toastTimeout&&clearTimeout(this.toastTimeout),this.shadow.querySelector("#toast-container")?.remove();let e=document.createElement("div");e.className="toast-container";let a=this.t.bind(this);e.innerHTML=`
|
|
1409
1491
|
<div class="toast login-prompt-toast">
|
|
1410
1492
|
<div class="toast-icon">
|
|
1411
1493
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
@@ -1418,29 +1500,29 @@
|
|
|
1418
1500
|
<div class="toast-title">${a("auth.mustLogin")}</div>
|
|
1419
1501
|
</div>
|
|
1420
1502
|
</div>
|
|
1421
|
-
`,this.shadow.appendChild(e),this.toastTimeout=window.setTimeout(()=>{e.style.opacity="0",e.style.transform="translateY(10px)",e.style.transition="all 0.2s ease-out",setTimeout(()=>e.remove(),200)},1e3)}renderGameCard(e,a){let
|
|
1503
|
+
`,this.shadow.appendChild(e),this.toastTimeout=window.setTimeout(()=>{e.style.opacity="0",e.style.transform="translateY(10px)",e.style.transition="all 0.2s ease-out",setTimeout(()=>e.remove(),200)},1e3)}renderGameCard(e,a){let r=[];e.isNew&&r.push('<span class="game-tag new">NEW</span>'),e.isHot&&r.push('<span class="game-tag hot">HOT</span>');let o=a<8?"eager":"lazy";return`
|
|
1422
1504
|
<div class="game-card" data-game-id="${e.id}">
|
|
1423
1505
|
<div class="game-image-wrapper">
|
|
1424
1506
|
<img
|
|
1425
1507
|
class="game-image"
|
|
1426
|
-
src="${
|
|
1508
|
+
src="${$(e.image)}"
|
|
1427
1509
|
alt="${e.title}"
|
|
1428
|
-
loading="${
|
|
1510
|
+
loading="${o}"
|
|
1429
1511
|
draggable="false"
|
|
1430
1512
|
/>
|
|
1431
1513
|
</div>
|
|
1432
1514
|
<div class="game-info">
|
|
1433
1515
|
<div class="title-row">
|
|
1434
1516
|
<h3 class="game-title">${e.title}</h3>
|
|
1435
|
-
${
|
|
1517
|
+
${r.length>0?r.join(""):""}
|
|
1436
1518
|
</div>
|
|
1437
1519
|
<div class="divider"></div>
|
|
1438
1520
|
<p class="game-category">${this.hasTranslation(`categories.${e.category}`)?this.t(`categories.${e.category}`):e.category}</p>
|
|
1439
1521
|
</div>
|
|
1440
1522
|
</div>
|
|
1441
|
-
`}renderGameDetail(){if(!this.currentGame)return;let e=this.currentGame,a=e.externalUrl||`/games/${e.id}`;this.shadow.innerHTML=`
|
|
1442
|
-
<style>${
|
|
1443
|
-
${
|
|
1523
|
+
`}renderGameDetail(){if(!this.currentGame)return;let e=this.currentGame,a=e.externalUrl||`/games/${e.id}`;this.currentIframeSrc=a,this.shadow.innerHTML=`
|
|
1524
|
+
<style>${Re}</style>
|
|
1525
|
+
${Me}
|
|
1444
1526
|
<div class="playsout-scroll-container">
|
|
1445
1527
|
<div class="mobile-container">
|
|
1446
1528
|
<div class="playsout-widget">
|
|
@@ -1468,4 +1550,4 @@
|
|
|
1468
1550
|
</div>
|
|
1469
1551
|
</div>
|
|
1470
1552
|
</div>
|
|
1471
|
-
`,this.shadow.getElementById("detail-back-btn")?.addEventListener("click",()=>{this.currentView="list",this.currentGame=null,this.render(),this.loadGames()})}attachEventListeners(){this.shadow.getElementById("gems-btn")?.addEventListener("click",()=>{this.showStoreModal()}),this.shadow.getElementById("profile-btn")?.addEventListener("click",()=>{this.showProfileModal()});let e=this.shadow.getElementById("search-input");e?.addEventListener("input",
|
|
1553
|
+
`,this.shadow.getElementById("detail-back-btn")?.addEventListener("click",()=>{this.resolvePendingPayment({status:"cancelled",balance:this.userPoints}),this.bridge.cancelPendingPayment(),this.currentView="list",this.currentGame=null,this.currentIframeSrc="",this.render(),this.loadGames()})}attachEventListeners(){this.shadow.getElementById("gems-btn")?.addEventListener("click",()=>{this.showStoreModal()}),this.shadow.getElementById("profile-btn")?.addEventListener("click",()=>{this.showProfileModal()});let e=this.shadow.getElementById("search-input");e?.addEventListener("input",r=>{let o=r.target;this.searchQuery=o.value,this.filterGames()}),this.shadow.getElementById("search-btn")?.addEventListener("click",()=>{e?.focus()});let a=this.shadow.getElementById("categories");a?.addEventListener("click",r=>{let i=r.target.closest(".category-btn");if(i){let s=i.getAttribute("data-category")||"";this.selectedCategory===s?(this.selectedCategory=null,a.querySelectorAll(".category-btn").forEach(g=>{g.classList.remove("active")})):(this.selectedCategory=s,a.querySelectorAll(".category-btn").forEach(g=>{g.classList.remove("active")}),i.classList.add("active")),this.filterGames()}})}};customElements.get("playsout-widget")||customElements.define("playsout-widget",L);typeof customElements<"u"&&(customElements.get("playsout-widget")||customElements.define("playsout-widget",L));var{init:mt,mount:ht,unmount:pt,destroy:ft,Login:yt,logout:bt,getToken:vt,getUserInfo:wt,getUser:kt,setLocale:xt,getLocale:It,getGames:Et,getCategories:St,on:Tt,off:Pt,isInitialized:At,isLoggedIn:Lt,instance:Ct,PlaysoutSDKClass:Rt}=D;typeof window<"u"&&(window.Playsout=D,window.__playsout_sdk_instance=D.instance);return Be(Mt);})();
|