diff --git a/client/index.js b/client/index.js index 320d6362..3c0dcb13 100644 --- a/client/index.js +++ b/client/index.js @@ -1,2 +1,2 @@ -var snakey3;snakey3=(()=>{"use strict";var e,t,s,n,r={572:(e,t,s)=>{s.r(t)},406:(e,t,s)=>{var n;s.d(t,{R:()=>n}),function(e){let t;function s(e,t,s){t.forEach((t=>{if(!Object.getOwnPropertyNames(e).includes(t)){const s=`\`${e.__proto__.constructor.name}\` instance has no property named "${t}"`;throw new TypeError(s)}Object.defineProperty(e,t,s)}))}e.applyMixins=function(e,t){t.forEach((t=>{Object.getOwnPropertyNames(t.prototype).forEach((s=>{Object.defineProperty(e.prototype,s,Object.getOwnPropertyDescriptor(t.prototype,s))}))}))},e.deepFreeze=function e(t){return function(t){for(const s of Object.getOwnPropertyNames(t)){const n=t[s];"object"==typeof n&&e(n)}Object.freeze(t)}(t),t},function(e){let t;!function(e){e.access=function(e,t,s){s.enumerable=!1},e.cyclic=function(e,t,s){s.enumerable=!1}}(t=e.NonEnumerable||(e.NonEnumerable={}))}(t=e.Decor||(e.Decor={})),e.protoNoEnum=function(e,t){t.forEach((t=>{if(!Object.getOwnPropertyNames(e.prototype).includes(t)){const s=`\`${e.name}\` prototype has no property named "${t}"`;throw new TypeError(s)}Object.defineProperty(e.prototype,t,{enumerable:!1})}))},e.instNoEnum=function(e,t){s(e,t,{enumerable:!1})},e.propNoWrite=function(e,t){s(e,t,{writable:!1})},e.prependComment=function(e,t){e.parentNode.insertBefore(document.createComment(" "+t+" "),e)},e.camelCaseTransforms=function(e){const t=e.replace(/[A-Z]/g,(e=>" "+e.toLowerCase()));return Object.freeze({spaceyLowercase:t,spaceyUppercase:t.toUpperCase(),spaceyCapitalized:t.split(" ").map((e=>e.charAt(0).toUpperCase()+e.substring(1))).join(" ")})},e.mkEl=function(e,t,s){const n=document.createElement(e);try{Object.seal(n)}catch(e){}return n.classList.add(...t),"button"===e?n.type="button":"a"===e&&(n.rel="noopener"),void 0!==s&&Object.assign(n,s),n}}(n||(n={})),Object.freeze(n)},80:(e,t,s)=>{s.d(t,{Y:()=>n});var n,r=s(406);!function(e){let t,s,n,r,o,i;e.GLOBAL_IDS={PUBLIC_GAME_HOST_URLS:"public-game-hosts-list",CURRENT_HOST_GROUPS:"current-host-groups-list"},function(e){e.Class={TEXT_SELECT_DISABLED:"text-select-disabled",FILL_PARENT:"fill-parent",CENTER_CONTENTS:"center-contents",STACK_CONTENTS:"stack-contents",INPUT_GROUP:"sk-input-group",INPUT_GROUP_ITEM:"sk-input-group-item"},e.Dataset={COLOUR_SCHEME:"skColourScheme"}}(t=e.General||(e.General={})),function(e){e.Class={BASE:"tile",POINTER_HB:"tile__pointer-hitbox",LANG_CHAR_WRAP:"tile__char",LANG_SEQ:"tile__seq"},e.Dataset={HEALTH:"health"}}(s=e.Tile||(e.Tile={})),function(e){e.Class={GRID:"game-grid",SCROLL_OUTER:"game-grid-scroll-outer",SCROLL_INNER:"game-grid-scroll-inner",IMPL_BODY:"game-grid-impl-body",KBD_DC:"game-grid-kbd-dc",KBD_DC_ICON:"game-grid-kbd-dc__icon",PAUSE_OL:"game-grid-pause-overlay",PAUSE_OL_ICON:"game-grid-pause-overlay__icon",PLAYER_IOB_ROOT:"grid-player-intersection-root"},e.Dataset={IMPL_COORD_SYS:"coordSys",GAME_STATE:{KEY:"gameState",VALUES:{PLAYING:"playing",PAUSED:"paused",OVER:"over"}}}}(n=e.Grid||(e.Grid={})),function(e){e.Class={BASE:"player",FACE:"player__face",DOWNED_OVERLAY:"player__downed-overlay",SHORT_SPOTLIGHT:"player__spotlight-short",LONG_SPOTLIGHT:"player__spotlight-long"},e.Dataset={DOWNED:{KEY:"downed",VALUES:{TEAM:"team",SELF:"self",NO:"no"}},FACE_SWATCH:"face"}}(r=e.Player||(e.Player={})),function(e){let t;e.Id={ALL_SCREENS:"all-screens-container",SCREEN_TINT:"screen-tint"},e.Class={BASE:"sk-screen",NAV_NEXT:"screen--next-button",NAV_PREV:"screen--prev-button"},e.Dataset={CURRENT:"current"},function(e){let t,s,n,r,o,i;!function(e){e.Class={BASE:"screen-home",NAV:"screen-home--nav",NAV_PLAY_OFFLINE:"screen-home--nav--play-offline",NAV_PLAY_ONLINE:"screen-home--nav--play-online",NAV_HOW_TO_PLAY:"screen-home--nav--how-to-play",NAV_HOW_TO_HOST:"screen-home--nav--how-to-host",NAV_COLOURS:"screen-home--nav--colour-scheme",NAV_VIEW_REPO:"screen-home--nav--goto-repo",NAV_RPT_ISSUE:"screen-home--nav--report-issue"}}(t=e.Home||(e.Home={})),function(e){e.Class={BASE:"screen-colour",OPTION:"screen-colour--opt",OPTION_LABEL:"screen-colour--opt-label",OPTION_LABEL_TITLE:"screen-colour--opt-label--title",OPTION_LABEL_AUTHOR:"screen-colour--opt-label--author"}}(s=e.ColourCtrl||(e.ColourCtrl={})),function(e){e.Class={BASE:"screen-play",GRID_WRAPPER:"screen-play--grid-wrapper",CONTROLS_BAR:"screen-play--controls-bar",PLAYERS_BAR:"screen-play--players-bar"}}(n=e.Play||(e.Play={})),function(e){e.Class={BASE:"screen-setup",LANG_SEL:"screen-setup--lang-sel",LANG_WEIGHT_EXAGG:"screen-setup--lang-weight-exagg"},e.Id={LANG_WEIGHT_EXAGGERATION_LIST:"screen-setup--lang-weight-exaggeration-list"}}(r=e.Setup||(e.Setup={})),function(e){e.Class={BASE:"screen-joiner",CONTENT_WRAPPER:"screen-joiner--content-wrapper",HOST_URL:"screen-joiner--host-url",GROUP_NAME:"screen-joiner--group-name",PASSPHRASE:"screen-joiner--passphrase"}}(o=e.GroupJoiner||(e.GroupJoiner={})),function(e){e.Class={BASE:"screen-lobby",SEC_CLIENT_INFO:"screen-lobby--client-info-section",SEC_TEAMS:"screen-lobby--teams-section",TEAM:"screen-lobby--team",PLAYER:"screen-lobby--player",PLAYER_NAME:"screen-lobby--player__name"}}(i=e.GroupLobby||(e.GroupLobby={}))}(t=e.Impl||(e.Impl={}))}(o=e.Screen||(e.Screen={})),function(e){e.Class={BASE:"sk-pick-one",OPT_BASE:"sk-pick-one--opt"}}(i=e.SkPickOne||(e.SkPickOne={}))}(n||(n={})),Object.freeze(n.Player.Dataset.DOWNED),r.R.deepFreeze(n)},502:(e,t,s)=>{s.d(t,{b4:()=>n,ZA:()=>r,m4:()=>o,JD:()=>i});class n{}!function(e){let t;e.PROTOCOL="http://",e.DEFAULT_PORT=8080,function(e){e.GROUP_JOINER="/joiner.",e.GROUP_LOBBY_PREFIX="/group.",e.GROUP_GAME_PREFIX="/group-game."}(t=e.Nsps||(e.Nsps={}))}(n||(n={})),Object.freeze(n),Object.freeze(n.prototype);class r{}var o,i;!function(e){let t,s,n,r;!function(e){let t;!function(e){e.EVENT_NAME="group-lobby-user-info-change"}(t=e.UserInfoChange||(e.UserInfoChange={}))}(t=e.Socket||(e.Socket={})),function(e){e.REGEXP=/(?:[a-zA-Z0-9:-]+)/,e.MaxLength=30}(s=e.Name||(e.Name={})),function(e){e.REGEXP=/(?:[a-zA-Z0-9:-]*)/,e.MaxLength=30}(n=e.Passphrase||(e.Passphrase={})),e.GameServerReconnectionAttempts=2,e.DEFAULT_TTL=20,function(e){e.EVENT_NAME="group-exist";class t{constructor(e,t){this.groupName=e,this.passphrase=t}}let s;e.RequestCreate=t,function(e){let t;!function(e){e.OKAY="okay",e.NOPE="nope"}(t=e.Response||(e.Response={}))}(t=e.RequestCreate||(e.RequestCreate={})),function(e){e.IN_LOBBY="in-lobby",e.IN_GAME="in-game",e.DELETE="delete"}(s=e.Status||(e.Status={}))}(r=e.Exist||(e.Exist={}))}(r||(r={})),Object.freeze(r),Object.freeze(r.prototype),function(e){e.CREATE_GAME="group-game-create"}(o||(o={})),function(e){e.CREATE_GAME="game-create",e.RESET="game-reset",e.UNPAUSE="game-unpause",e.PAUSE="game-pause",e.RETURN_TO_LOBBY="game-return-to-lobby"}(i||(i={}))},951:(e,t,s)=>{s.d(t,{Bl:()=>n,J5:()=>r,Uo:()=>o});const n=Object.freeze({behavior:"smooth",block:"center",inline:"center"});class r{}!function(e){let t,s,n;e.Family=Object.freeze({HUMAN:"HUMAN",CHASER:"CHASER"}),e.Family,function(e){e.NULL=void 0}(t=e.Id||(e.Id={})),function(e){e.REGEXP=/[ a-zA-Z0-9:-]+/,e.MAX_LENGTH=15}(s=e.Username||(e.Username={})),function(e){e.LOREM_IPSUM="lorem-ipsum"}(n=e.Avatar||(e.Avatar={})),function(e){const t=Object.values(e).filter((e=>"string"==typeof e));e.GET_RANDOM=function(){return t[Math.random()*t.length]}}(n=e.Avatar||(e.Avatar={})),e.MoveType=Object.freeze({NORMAL:"NORMAL",BOOST:"BOOST"}),e.MoveType}(r||(r={})),Object.freeze(r),Object.freeze(r.prototype);class o{}!function(e){let t,s,n;!function(e){e.REGEXP=new RegExp("^[a-zA-Z0-9!@#$%^&*()-_=+;:'\"\\|,.<>/?]+$")}(t=e.Seq||(e.Seq={})),function(e){e.NULL=Object.freeze({char:"",seq:""})}(s=e.CharSeqPair||(e.CharSeqPair={})),function(e){e.MAX=4}(n=e.WeightExaggeration||(e.WeightExaggeration={})),e.CHAR_HIT_COUNT_SEED_CEILING=5,e._RemapTemplates=Object.freeze({IDENTITY:e=>e,TO_LOWER:e=>e.toLowerCase()}),e._RemapTemplates,e.FrontendDescs=Object.freeze([{id:"engl-low",module:"English",export:"Lowercase",numLeaves:26,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"English Lowercase (qwerty)",blurb:""},{id:"engl-mix",module:"English",export:"MixedCase",numLeaves:52,remapFunc:e._RemapTemplates.IDENTITY,displayName:"English Mixed-Case (Querty)",blurb:""},{id:"japn-hir",module:"Japanese",export:"Hiragana",numLeaves:71,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Hiragana",blurb:""},{id:"japn-kat",module:"Japanese",export:"Katakana",numLeaves:70,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Katakana",blurb:""},{id:"kore-dub",module:"Korean",export:"Dubeolsik",numLeaves:9177,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Dubeolsik (두벌식 키보드)",blurb:"The most common keyboard layout, and South Korea's only Hangul standard since 1969. Consonants are on the left, and vowels on the right."},{id:"kore-sub",module:"Korean",export:"Sebeolsik",numLeaves:10206,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Sebeolsik (세벌식 최종 키보드)",blurb:"Another Hangul keyboard layout used in South Korea, and the final Sebeolsik layout designed by Dr. Kong Byung Woo, hence the name. Syllable-initial consonants are on the right, final consonants on the left, and vowels in the middle. It is more ergonomic than the dubeolsik, but not widely used."},{id:"kore-rom",module:"Korean",export:"Romanization",numLeaves:3990,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Korean Revised Romanization",blurb:"The Revised Romanization of Korean (국어의 로마자 표기법; 國語의 로마字 表記法) is the official South Korean language romanization system. It was developed by the National Academy of the Korean Language from 1995, and was released on 7 July 2000 by South Korea's Ministry of Culture and Tourism"},{id:"engl-cell-enc",module:"English",export:"OldCellphone.Encode",numLeaves:8,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Old Cellphone Keyboard",blurb:""}].map((e=>Object.freeze(e)))),e.FrontendDescs,e.GET_FRONTEND_DESC_BY_ID=function(t){return e.FrontendDescs.find((e=>e.id===t))}}(o||(o={})),Object.freeze(o),Object.freeze(o.prototype)},504:(e,t,s)=>{var n;s.d(t,{l:()=>n}),function(e){let t,s;!function(e){e.SERVER="SERVER",e.ONLINE="ONLINE",e.OFFLINE="OFFLINE"}(t=e.Type||(e.Type={})),Object.freeze(t),function(e){e.PLAYING="PLAYING",e.PAUSED="PAUSED",e.OVER="OVER"}(s=e.Status||(e.Status={})),Object.freeze(s),e.K=Object.freeze({HEALTH_UPDATE_CHANCE:.1,AVERAGE_HEALTH_TO_SPAWN_ON_TILE:1,PORTION_OF_MOVES_THAT_ARE_BOOST:.4,HEALTH_COST_OF_BOOST(e,t){const s=t(this.AVERAGE_HEALTH_TO_SPAWN_ON_TILE/e);return this.AVERAGE_HEALTH_TO_SPAWN_ON_TILE/s/this.PORTION_OF_MOVES_THAT_ARE_BOOST},HEALTH_EFFECT_FOR_DOWNED_PLAYER:.6,EVENT_RECORD_WRAPPING_BUFFER_LENGTH:128,EVENT_RECORD_FORWARD_WINDOW_LENGTH:64})}(n||(n={})),Object.freeze(n)},735:(e,t,s)=>{s.r(t),s.d(t,{OmHooks:()=>l.Y,game:()=>$,screen:()=>Z,top:()=>X});var n,r,o,i=s(655),a=s(406),l=s(80),c=s(951);!function(e){let t;function s(e,t){const s={};return Object.keys(t).forEach((t=>{Object.defineProperty(s,t,{enumerable:!0,get:()=>{const s=e.getItem(t);return null===s?void 0:JSON.parse(s)},set:s=>{e.setItem(t,JSON.stringify(s))}})})),Object.freeze(s),s}e.Local=s(localStorage,{musicVolume:1,sfxVolume:1,colourSchemeId:"",colourSchemeStyleLiteral:"",gamePresetId:"",username:"",avatar:""}),e.getLastUserInfo=function(){var t,s;return Object.freeze({username:null!==(t=e.Local.username)&&void 0!==t?t:"unnamed player",teamId:0,avatar:null!==(s=e.Local.avatar)&&void 0!==s?s:c.J5.Avatar.GET_RANDOM()})},e.Session=s(localStorage,Object.freeze({})),function(e){let t;e.DB_NAME="snakeyDB",function(e){e.STORE_NAME="userGamePresets"}(t=e.UserGamePresetStore||(e.UserGamePresetStore={})),Object.freeze(t)}(t=e.IDB||(e.IDB={})),Object.freeze(t)}(n||(n={})),Object.freeze(n);const p=l.Y.Screen.Class;class d{constructor(e,t,s,n){r.set(this,void 0),o.set(this,void 0),this.screenId=e,this.screenNames=a.R.camelCaseTransforms(e),this.top=t,(0,i.YH)(this,r,s),this.requestGoToScreen=n,this.baseElem=a.R.mkEl("div",[p.BASE]),(0,i.YH)(this,o,!1),this.nav=Object.freeze({prev:a.R.mkEl("button",[]),next:a.R.mkEl("button",[])}),a.R.propNoWrite(this,["screenId","top","baseElem","nav","requestGoToScreen"]),this.nav.prev.classList.add(p.NAV_PREV),this.nav.next.classList.add(p.NAV_NEXT),this.nav.prev.textContent="Back",this.nav.next.textContent="Next",this.nav.prev.onclick=t=>{const s=d.NavTree,n=s[this.screenId];s[n.prev].href===n.href?this.requestGoToScreen(d.NavTree[e].prev,{}):window.history.back()}}_enter(e,t){var s;return(0,i.mG)(this,void 0,void 0,(function*(){if(document.title=`${this.screenNames.spaceyCapitalized} | ${this.top.defaultDocTitle}`,e===d.NavDir.FORWARD){const e=new window.URL(window.location.href),t=e.hash=d.NavTree[this.screenId].href,n=[{screenId:this.screenId},"",e.href];(null===(s=window.history.state)||void 0===s?void 0:s.screenId)!==t&&(d.NavTree[this.screenId].prev===this.screenId?history.replaceState(...n):history.pushState(...n))}(0,i.Q_)(this,o)||(this._lazyLoad(),(0,i.Q_)(this,r).appendChild(this.baseElem),a.R.prependComment(this.baseElem,this.screenNames.spaceyUppercase+" SCREEN"),this.baseElem.setAttribute("aria-label",this.screenNames.spaceyCapitalized+" Screen"),(0,i.YH)(this,o,!0)),yield this._abstractOnBeforeEnter(e,t)}))}_leave(e){return!!this._abstractOnBeforeLeave(e)}_onAfterEnter(){this.baseElem.dataset[l.Y.Screen.Dataset.CURRENT]="",this.baseElem.setAttribute("aria-hidden","false")}_onAfterLeave(){delete this.baseElem.dataset[l.Y.Screen.Dataset.CURRENT],this.baseElem.setAttribute("aria-hidden","true")}getRecommendedFocusElem(){}_abstractOnBeforeEnter(e,t){return(0,i.mG)(this,void 0,void 0,(function*(){}))}_abstractOnBeforeLeave(e){return!0}}r=new WeakMap,o=new WeakMap,function(e){let t,s,n;!function(e){e.HOME="home",e.HOW_TO_PLAY="howToPlay",e.HOW_TO_HOST="howToHost",e.COLOUR_CTRL="colourControl",e.SETUP_OFFLINE="setupOffline",e.PLAY_OFFLINE="playOffline",e.GROUP_JOINER="groupJoiner",e.SETUP_ONLINE="setupOnline",e.GROUP_LOBBY="groupLobby",e.PLAY_ONLINE="playOnline"}(t=e.Id||(e.Id={})),Object.freeze(t),s=e.HistoryEntryId||(e.HistoryEntryId={}),e.NavTree=Object.freeze({[t.HOME]:{prev:t.HOME,href:t.HOME},[t.HOW_TO_PLAY]:{prev:t.HOME,href:t.HOW_TO_PLAY},[t.HOW_TO_HOST]:{prev:t.HOME,href:t.HOW_TO_HOST},[t.COLOUR_CTRL]:{prev:t.HOME,href:t.COLOUR_CTRL},[t.SETUP_OFFLINE]:{prev:t.HOME,href:t.SETUP_OFFLINE},[t.PLAY_OFFLINE]:{prev:t.SETUP_OFFLINE,href:t.SETUP_OFFLINE},[t.GROUP_JOINER]:{prev:t.HOME,href:t.GROUP_JOINER},[t.GROUP_LOBBY]:{prev:t.GROUP_JOINER,href:t.GROUP_JOINER},[t.SETUP_ONLINE]:{prev:t.GROUP_LOBBY,href:t.GROUP_JOINER},[t.PLAY_ONLINE]:{prev:t.GROUP_LOBBY,href:t.GROUP_JOINER}}),Object.entries(e.NavTree).forEach((([s,n])=>{let r=s;const o=new Set;do{if(o.has(r))throw new Error("Navigation tree must not contain cycles.");if(o.add(r),r=e.NavTree[r].prev,r===s)break}while(r!==e.NavTree[r].prev);if(r!==t.HOME)throw new Error("The home screen must be the root of the screen-navigation tree.")})),function(e){e.FORWARD="forward",e.BACKWARD="backward"}(n=e.NavDir||(e.NavDir={})),e.GET_NAV_DIR=function(t){const{curr:s,dest:n}=t;if(void 0===s)return e.NavDir.FORWARD;let r=s;for(;r!==e.NavTree[r].prev;)if(r=e.NavTree[r].prev,r===n)return e.NavDir.BACKWARD;return e.NavDir.FORWARD}}(d||(d={})),Object.freeze(d),Object.freeze(d.prototype);class h extends d{_lazyLoad(){const e=l.Y.Screen.Impl.Home.Class;this.baseElem.classList.add(l.Y.General.Class.CENTER_CONTENTS,e.BASE);const t=this.navElem=a.R.mkEl("div",[l.Y.General.Class.TEXT_SELECT_DISABLED,l.Y.General.Class.INPUT_GROUP,e.NAV]);t.setAttribute("role","navigation"),t.addEventListener("pointerleave",(()=>{var e;(null===(e=document.activeElement)||void 0===e?void 0:e.parentElement)===t&&document.activeElement.blur()}));const s=(e,s)=>{e.classList.add(l.Y.General.Class.CENTER_CONTENTS,l.Y.General.Class.INPUT_GROUP_ITEM,s.cssClass),e.textContent=s.text,e.addEventListener("pointerenter",(()=>{window.requestAnimationFrame((t=>{e.focus()}))})),t.appendChild(e)};[{text:"Offline Single-player",cssClass:e.NAV_PLAY_OFFLINE,screenId:d.Id.SETUP_OFFLINE},{text:"Online Multi-player",cssClass:e.NAV_PLAY_ONLINE,screenId:d.Id.GROUP_JOINER},{text:"How To Play",cssClass:e.NAV_HOW_TO_PLAY,screenId:d.Id.HOW_TO_PLAY},{text:"How To Host",cssClass:e.NAV_HOW_TO_HOST,screenId:d.Id.HOW_TO_HOST},{text:"Colour Schemes",cssClass:e.NAV_COLOURS,screenId:d.Id.COLOUR_CTRL}].map((e=>Object.freeze(e))).forEach((e=>{const t=a.R.mkEl("button",[]);t.onclick=e.screenId instanceof Function?e.screenId:()=>{this.requestGoToScreen(e.screenId,{})},s(t,e)})),[{text:"Visit\nRepo",cssClass:e.NAV_VIEW_REPO,href:new window.URL("https://github.com/david-fong/snakey3")},{text:"Report\nIssue",cssClass:e.NAV_RPT_ISSUE,href:new window.URL("https://github.com/david-fong/snakey3/issues")}].map((e=>Object.freeze(e))).forEach((e=>{const t=a.R.mkEl("a",[],{href:e.href.toString(),target:"_blank"});s(t,e)})),this.baseElem.appendChild(t)}}Object.freeze(h),Object.freeze(h.prototype);class u extends d{_lazyLoad(){}}Object.freeze(u),Object.freeze(u.prototype);class m extends d{_lazyLoad(){}}var E,_,O;!function(e){e.INSTRUCTIONS_STEPS=Object.freeze(["$ npm install 'https://github.com/david-fong/snakey3#gh-pages'","$ npm run start","send the url to your friends"])}(m||(m={})),Object.freeze(m),Object.freeze(m.prototype);class v{constructor(){E.set(this,void 0),_.set(this,void 0),O.set(this,void 0);const e=a.R.mkEl("div",[l.Y.SkPickOne.Class.BASE],{tabIndex:0});e.setAttribute("role","listbox"),e.addEventListener("keydown",this._onKeyDown.bind(this)),e.addEventListener("pointerenter",(t=>{window.requestAnimationFrame((t=>{e.focus()}))})),this.baseElem=e,this.options=[]}addOption(e){this.options.push(e),this.baseElem.appendChild(e.baseElem),e.baseElem.addEventListener("pointerenter",this.hoverOpt.bind(this,e)),e.baseElem.addEventListener("click",this.selectOpt.bind(this,e,!0)),e._registerParent(this._onOptDisabledChange.bind(this))}hoverOpt(e){var t;this.hoveredOpt!==e&&(null===(t=this.hoveredOpt)||void 0===t||t.baseElem.setAttribute("aria-active-descendant","false"),(0,i.YH)(this,_,e),this.hoveredOpt.baseElem.setAttribute("aria-active-descendant","true"))}selectOpt(e,t=!0){var s;if(!e)throw new Error("opt must be defined");this.hoverOpt(e),this.confirmedOpt!==e&&(null===(s=this.confirmedOpt)||void 0===s||s.baseElem.setAttribute("aria-selected","false"),(0,i.YH)(this,E,e),this.confirmedOpt.baseElem.setAttribute("aria-selected","true"),t&&this._onSelectOpt(e))}get confirmedOpt(){return(0,i.Q_)(this,E)}get hoveredOpt(){return(0,i.Q_)(this,_)}_onOptDisabledChange(e){this.confirmedOpt===e&&(this._isValid=!e.disabled)}set _isValid(e){this._isValid!==e&&(this.baseElem.setAttribute("aria-invalid",e?"false":"true"),(0,i.YH)(this,O,e))}get _isValid(){return(0,i.Q_)(this,O)}_onKeyDown(e){if(" "===e.key||"Enter"===e.key)return this.selectOpt(this.hoveredOpt),e.preventDefault(),!1;{const t=this.options.indexOf(this.hoveredOpt);if("ArrowDown"===e.key||"Down"===e.key)for(let s=t+1;s=0;s--){const t=this.options[s];if(!t.disabled)return this.hoverOpt(t),e.preventDefault(),!1}}return!0}}E=new WeakMap,_=new WeakMap,O=new WeakMap,function(e){var t,s;t=new WeakMap,s=new WeakMap,e._Option=class{constructor(){t.set(this,void 0),s.set(this,void 0),(this.baseElem=a.R.mkEl("div",[l.Y.SkPickOne.Class.OPT_BASE])).setAttribute("role","option"),(0,i.YH)(this,t,!1)}_registerParent(e){(0,i.YH)(this,s,e)}get disabled(){return(0,i.Q_)(this,t)}set disabled(e){this.disabled!==e&&(this.baseElem.setAttribute("aria-disabled",e?"true":"false"),(0,i.YH)(this,t,e),(0,i.Q_)(this,s).call(this,this))}},Object.freeze(e),Object.freeze(e.prototype)}(v||(v={})),Object.freeze(v),Object.freeze(v.prototype),s(572);const f=l.Y.Screen.Impl.ColourCtrl.Class;l.Y.General.Class;class g extends d{_lazyLoad(){this.baseElem.classList.add(f.BASE),this.baseElem.appendChild(this.nav.prev);const e=this.sel=new g.PickOne(this.top.storage.Local,this.top.transition);a.R.propNoWrite(this,["sel"]),this.baseElem.appendChild(e.baseElem);const t=this.top.storage.Local.colourSchemeId;t&&this.sel.selectOpt(this.sel.getOptById(t),!1)}}var b;!function(e){var t,s,n;class r extends v{constructor(e,o){var a;super(),t.set(this,void 0),s.set(this,void 0),n.set(this,void 0),(0,i.YH)(this,t,!0),(0,i.YH)(this,s,e),(0,i.YH)(this,n,o),b.Schemes.forEach((e=>{this.addOption(new r.Option(e))})),this.selectOpt(this.getOptById(null!==(a=(0,i.Q_)(this,s).colourSchemeId)&&void 0!==a?a:"snakey"),!1)}_onHoverOpt(e){}_onSelectOpt(e){(0,i.Q_)(this,s).colourSchemeId=e.desc.id,(0,i.Q_)(this,s).colourSchemeStyleLiteral=e.cssLiteral;const r=(0,i.Q_)(this,t);(0,i.YH)(this,t,!1),(0,i.Q_)(this,n).do({intermediateTransitionTrigger:()=>{document.documentElement.dataset[l.Y.General.Dataset.COLOUR_SCHEME]=e.desc.id;const t=document.documentElement.style;if(r)for(const e of b.Swatch){const s="--colour-"+e;t.setProperty(s,"")}}})}getOptById(e){return this.options.find((t=>t.desc.id===e))}}t=new WeakMap,s=new WeakMap,n=new WeakMap,e.PickOne=r,function(e){class t extends v._Option{constructor(e){super(),this.desc=e;const s=this.baseElem;s.classList.add(f.OPTION),s.dataset[l.Y.General.Dataset.COLOUR_SCHEME]=e.id;const n=a.R.mkEl("span",[f.OPTION_LABEL]);n.appendChild(a.R.mkEl("div",[f.OPTION_LABEL_TITLE],{textContent:e.displayName})),n.appendChild(a.R.mkEl("div",[f.OPTION_LABEL_AUTHOR],{textContent:"by "+e.author})),s.appendChild(n);for(let e=0;eObject.freeze(e))))}(b||(b={})),Object.freeze(b);const T=l.Y.Screen.Impl.Setup.Class;class S extends d{_lazyLoad(){this.baseElem.classList.add(T.BASE),this.baseElem.appendChild(this.nav.prev),this.langSel=new S.LangPickOne,this.baseElem.appendChild(this.langSel.baseElem),this._createLangWeightExaggerationInput(),a.R.propNoWrite(this,["langSel","langWeightExaggeration"]),this.baseElem.appendChild(this.nav.next),this._loadLastUsedPreset()}_createLangWeightExaggerationInput(){const e=this.langWeightExaggeration=a.R.mkEl("input",[T.LANG_WEIGHT_EXAGG],{type:"range",min:"0",max:c.Uo.WeightExaggeration.MAX.toString(),step:"any",value:"1"});{const e=a.R.mkEl("datalist",[]);e.id=l.Y.Screen.Impl.Setup.Id.LANG_WEIGHT_EXAGGERATION_LIST,[{val:0,label:"0"},{val:1,label:"1"}].forEach((t=>{e.appendChild(a.R.mkEl("option",[],{value:t.val.toString(),label:t.label}))})),this.baseElem.appendChild(e)}e.setAttribute("list",l.Y.Screen.Impl.Setup.Id.LANG_WEIGHT_EXAGGERATION_LIST),this.baseElem.appendChild(e)}getRecommendedFocusElem(){return this.nav.next}_loadLastUsedPreset(){this.top.storage.Local.gamePresetId}parseArgsFromGui(){const e=Object.assign({},S.DEFAULT_PRESET());return e.langId=this.langSel.confirmedOpt.desc.id,e.langWeightExaggeration=parseFloat(this.langWeightExaggeration.value),e}}!function(e){e.DEFAULT_PRESET=()=>({coordSys:"EUCLID2",gridDimensions:{height:21,width:21},averageFreeHealthPerTile:1/45,langWeightExaggeration:1,langId:"engl-low",playerDescs:[{isALocalOperator:!1,familyId:"CHASER",teamId:1,clientId:void 0,username:"chaser1",avatar:void 0,noCheckGameOver:!0,familyArgs:{}},{isALocalOperator:!1,familyId:"CHASER",teamId:1,clientId:void 0,username:"chaser2",avatar:void 0,noCheckGameOver:!0,familyArgs:{fearDistance:6,bloodThirstDistance:5,healthReserve:5,keyPressesPerSecond:1.8}}]});class t extends v{constructor(){super(),this.baseElem.classList.add(T.LANG_SEL),c.Uo.FrontendDescs.forEach((e=>{this.addOption(new t.Option(e))})),this.selectOpt(this.options[0])}_onHoverOpt(e){}_onSelectOpt(e){}}e.LangPickOne=t,function(e){class t extends v._Option{constructor(e){super(),this.desc=e,this.baseElem.textContent=e.displayName}}e.Option=t,Object.freeze(t),Object.freeze(t.prototype)}(t=e.LangPickOne||(e.LangPickOne={}))}(S||(S={})),Object.freeze(S),Object.freeze(S.prototype);class N extends S{_lazyLoad(){super._lazyLoad(),this.nav.next.onclick=e=>{const t=this.parseArgsFromGui();this.requestGoToScreen(d.Id.PLAY_OFFLINE,t)}}parseArgsFromGui(){const e=super.parseArgsFromGui();return e.playerDescs.splice(e.playerDescs.length,0,{isALocalOperator:!0,familyId:"HUMAN",teamId:0,clientId:void 0,username:"hello1",avatar:void 0,noCheckGameOver:!1,familyArgs:{}},{isALocalOperator:!0,familyId:"HUMAN",teamId:1,clientId:void 0,username:"hello2",avatar:void 0,noCheckGameOver:!1,familyArgs:{}}),e}}Object.freeze(N),Object.freeze(N.prototype);var R,L,A,y,I=s(504);class C extends d{constructor(){super(...arguments),R.set(this,void 0),L.set(this,void 0),A.set(this,void 0),y.set(this,void 0)}_lazyLoad(){this.baseElem.classList.add(l.Y.General.Class.CENTER_CONTENTS,l.Y.Screen.Impl.Play.Class.BASE);const e=C.createCenterColElem();this._gridBaseElem=e.grid,this._gridImplHost=e.implHost,this._gridImplHost.appendChild(document.createComment("grid impl host")),this.baseElem.appendChild(e.top),e.pauseOl.addEventListener("click",(e=>{const t=this.currentGame;void 0!==t&&t.status===I.l.Status.PAUSED&&this._statusBecomePlaying()})),a.R.propNoWrite(this,["_gridBaseElem","_gridImplHost"]),this._initializeControlsBar(),this._initializePlayersBar(),(0,i.YH)(this,L,(()=>{if(this.wantsAutoPause)if(document.hidden){if(void 0===(0,i.Q_)(this,y)){const e=this.currentGame;(void 0===e||void 0!==e&&e.status!==I.l.Status.OVER)&&this._statusBecomePaused()}}else"page-hide"===(0,i.Q_)(this,y)&&this._statusBecomePlaying()})),(0,i.YH)(this,A,this._gridKeyDownCallback.bind(this))}_abstractOnBeforeEnter(e,t){return(0,i.mG)(this,void 0,void 0,(function*(){document.addEventListener("visibilitychange",(0,i.Q_)(this,L)),this.pauseButton.disabled=!0,this._statusBecomePaused(),(0,i.YH)(this,R,yield this._createNewGame(t)),this._gridBaseElem.addEventListener("keydown",(0,i.Q_)(this,A),{capture:!0}),yield this.currentGame.reset();const e=this.currentGame.htmlElements;this._gridImplHost.appendChild(e.gridImpl),this.playersBar.appendChild(e.playersBar),this.pauseButton.onclick=this._statusBecomePlaying.bind(this),this.pauseButton.disabled=!1,this.wantsAutoPause&&setTimeout((()=>{document.hidden||this._statusBecomePlaying()}),500)}))}_abstractOnBeforeLeave(e){if(this.askConfirmBeforeLeave&&!window.confirm("Are you sure you would like to leave?"))return!1;document.removeEventListener("visibilitychange",(0,i.Q_)(this,L)),this.currentGame.statusBecomePaused();for(const e of Object.values(this.currentGame.htmlElements))e.textContent="",e.remove();return this._gridBaseElem.removeEventListener("keydown",(0,i.Q_)(this,A)),(0,i.YH)(this,R,void 0),!0}get currentGame(){return(0,i.Q_)(this,R)}get probeCurrentGame(){return(0,i.Q_)(this,R)}_gridKeyDownCallback(e){e.stopPropagation();const t=this.currentGame;if(e.ctrlKey&&" "===e.key&&!e.repeat){const e=t.operators;t.setCurrentOperator((1+e.indexOf(t.currentOperator))%e.length)}else t.currentOperator.processKeyboardInput(e);return" "!==e.key||(e.preventDefault(),!1)}_statusBecomePlaying(){var e;const t=l.Y.Grid.Dataset.GAME_STATE;null===(e=this.probeCurrentGame)||void 0===e||e.statusBecomePlaying(),this.pauseButton.textContent="Pause",(0,i.YH)(this,y,void 0),this._gridBaseElem.dataset[t.KEY]=t.VALUES.PLAYING,this.pauseButton.onclick=this._statusBecomePaused.bind(this),this.resetButton.disabled=!0,window.requestAnimationFrame((e=>{this._gridBaseElem.focus()}))}_statusBecomePaused(){var e;const t=l.Y.Grid.Dataset.GAME_STATE;null===(e=this.probeCurrentGame)||void 0===e||e.statusBecomePaused(),this.pauseButton.textContent="Unpause",(0,i.YH)(this,y,document.hidden?"page-hide":"other"),this._gridBaseElem.dataset[t.KEY]=t.VALUES.PAUSED,this.pauseButton.onclick=this._statusBecomePlaying.bind(this),this.resetButton.disabled=!1}_onGameBecomeOver(){const e=l.Y.Grid.Dataset.GAME_STATE;this.pauseButton.disabled=!0,this.resetButton.disabled=!1,this._gridBaseElem.dataset[e.KEY]=e.VALUES.OVER}_resetGame(){this.currentGame.reset(),this.pauseButton.disabled=!1,this.wantsAutoPause&&this._statusBecomePlaying()}_initializeControlsBar(){const e=a.R.mkEl("div",[l.Y.General.Class.CENTER_CONTENTS,l.Y.General.Class.INPUT_GROUP,l.Y.Screen.Impl.Play.Class.CONTROLS_BAR]);function t(t,s){return(s=null!=s?s:a.R.mkEl("button",[])).classList.add(l.Y.General.Class.INPUT_GROUP_ITEM),s.textContent=t,s.addEventListener("pointerenter",(e=>{window.requestAnimationFrame((e=>{s.focus()}))})),e.appendChild(s),s}e.setAttribute("role","menu"),e.addEventListener("pointerleave",(e=>{window.requestAnimationFrame((e=>{this._gridBaseElem.focus()}))})),t("",this.nav.prev),this.pauseButton=t(""),(this.resetButton=t("Reset")).onclick=this._resetGame.bind(this),a.R.propNoWrite(this,["pauseButton","resetButton"]),this.baseElem.appendChild(e)}_initializePlayersBar(){const e=this.playersBar=a.R.mkEl("div",[l.Y.Screen.Impl.Play.Class.PLAYERS_BAR]);a.R.propNoWrite(this,["playersBar"]),this.baseElem.appendChild(e)}}R=new WeakMap,L=new WeakMap,A=new WeakMap,y=new WeakMap,function(e){e.createCenterColElem=function(){const e=l.Y.Grid.Class,t=l.Y.General.Class,s=a.R.mkEl("div",[l.Y.Screen.Impl.Play.Class.GRID_WRAPPER]),n=a.R.mkEl("div",[t.STACK_CONTENTS,t.TEXT_SELECT_DISABLED,e.GRID],{tabIndex:0});n.setAttribute("role","textbox"),n.setAttribute("aria-label","Game Grid");const r=a.R.mkEl("div",[e.SCROLL_OUTER]);r.setAttribute("role","presentation");{const s=a.R.mkEl("div",[t.FILL_PARENT,t.CENTER_CONTENTS,e.KBD_DC]);s.appendChild(a.R.mkEl("div",[e.KBD_DC_ICON],{textContent:"(click here to continue typing)"})),r.appendChild(s)}const o=a.R.mkEl("div",[t.FILL_PARENT,t.CENTER_CONTENTS,e.PAUSE_OL],{});return o.appendChild(a.R.mkEl("div",[e.PAUSE_OL_ICON],{textContent:"(Click to Unpause)"})),r.appendChild(o),n.appendChild(r),s.appendChild(n),Object.freeze({top:s,grid:n,intersectionRoot:r,implHost:r,pauseOl:o})}}(C||(C={})),a.R.protoNoEnum(C,["probeCurrentGame"]),a.R.instNoEnum(C,["createCenterColElem"]),Object.freeze(C),Object.freeze(C.prototype);class P extends C{constructor(){super(...arguments),this.wantsAutoPause=!0,this.askConfirmBeforeLeave=!0}_lazyLoad(){super._lazyLoad(),this.nav.prev.innerHTML="Return To Setup"}_createNewGame(e){return(0,i.mG)(this,void 0,void 0,(function*(){return new((yield Promise.all([s.e(929),s.e(755)]).then(s.bind(s,40))).OfflineGame)(this._onGameBecomeOver.bind(this),e)}))}}Object.freeze(P),Object.freeze(P.prototype);var k,G,w=s(502);class U extends d{constructor(){super(...arguments),k.set(this,void 0),G.set(this,!1)}get clientIsGroupHost(){return(0,i.Q_)(this,G)}_lazyLoad(){this.baseElem.classList.add(l.Y.General.Class.CENTER_CONTENTS,l.Y.Screen.Impl.GroupJoiner.Class.BASE);const e=this._initializeFormContents(),t=this._initializeHostUrlHandlers();this._initializeGroupNameHandlers(t),this._initializePassphraseHandlers(),this.nav.next.onclick=e=>{s()};const s=()=>{this.requestGoToScreen(d.Id.GROUP_LOBBY,{groupName:this.in.groupName.value,groupPassphrase:this.in.passphrase.value})};this._setFormState(H.CHOOSING_HOST),this.baseElem.appendChild(e)}getRecommendedFocusElem(){return void 0!==this.groupSocket?this.in.groupName:this.in.hostUrl}get state(){return(0,i.Q_)(this,k)}_setFormState(e){if(this.state!==e){if(e===H.IN_GROUP){if(this.state!==H.CHOOSING_GROUP)throw new Error("never");this.in.passphrase.disabled=!0,this.nav.next.disabled=!1,this.nav.next.focus()}else this.nav.next.disabled=!0,e===H.CHOOSING_HOST?(this.in.groupName.disabled=!0,this.in.groupName.value="",this.groupNameDataList.innerText="",this.in.passphrase.disabled=!0,this.in.passphrase.value="",this.in.hostUrl.focus()):e===H.CHOOSING_GROUP&&(this.in.groupName.disabled=!1,this.in.passphrase.disabled=!1,this.in.groupName.focus());(0,i.YH)(this,k,e)}}_initializeHostUrlHandlers(){const e=this.top,t=this.in.hostUrl,s=()=>(0,i.mG)(this,void 0,void 0,(function*(){var s,n;if(!t.value||!t.validity.valid)return;t.value.startsWith(w.b4.PROTOCOL)||(t.value=new window.URL(w.b4.PROTOCOL+t.value).origin);const r=new window.URL(t.value);if((null===(s=this.groupSocket)||void 0===s?void 0:s.io.opts.hostname)===r.hostname)return void(this.groupSocket.connected&&(this._setFormState(H.CHOOSING_GROUP),this.in.groupName.focus()));null===(n=this.joinerSocket)||void 0===n||n.close();const o=yield this.top.sockets.joinerSocketConnect({serverUrl:r});o.on("connect",(()=>{this._setFormState(H.CHOOSING_GROUP),o.on(w.ZA.Exist.EVENT_NAME,this._onNotifyGroupExist.bind(this))})).on("connect_error",(e=>{this.top.toast("Unable to connected to the specified server.")})).on("disconnect",(s=>{"io server disconnect"===s&&(this._setFormState(H.CHOOSING_HOST),t.value="",e.toast("The server disconnected you from the group joiner."))}))}));return t.oninput=e=>this._setFormState(H.CHOOSING_HOST),t.onkeydown=e=>{"Enter"===e.key&&s()},t.onpaste=e=>{window.setTimeout((()=>s()),0)},t.onchange=()=>{s()},s}_onNotifyGroupExist(e){if(e===w.ZA.Exist.RequestCreate.Response.NOPE)return void this.top.toast(`The server rejected your request to create a new group "${this.in.groupName.value}".`);if(e===w.ZA.Exist.RequestCreate.Response.OKAY)return this.top.toast(`server accepted request to create new group "${this.in.groupName.value}".`),this.top.toast("connecting to new group..."),void this._attemptToJoinExistingGroup();const t=this.groupNameDataList,s=Array.from(t.children);Object.entries(e).forEach((([e,n])=>{const r=s.find((t=>t.value===e))||(e=>{const n=a.R.mkEl("option",[],{value:e});for(const e of s)if(n.value.localeCompare(e.value)<0){t.insertBefore(n,e);break}return n.parentElement||t.appendChild(n),n})(e);switch(n){case w.ZA.Exist.Status.IN_LOBBY:r.textContent="In Lobby";break;case w.ZA.Exist.Status.IN_GAME:r.textContent="In Game";break;case w.ZA.Exist.Status.DELETE:r.remove()}}))}_initializeGroupNameHandlers(e){const t=this.in.groupName,s=()=>{t.value&&t.validity.valid&&(this.state===H.IN_GROUP?this.nav.next.focus():this.in.passphrase.focus())};this.in.groupName.oninput=t=>(0,i.mG)(this,void 0,void 0,(function*(){this.state===H.IN_GROUP&&(yield e()),this.in.passphrase.value="",(0,i.YH)(this,G,!1)})),t.onkeydown=e=>{"Enter"===e.key&&s()},t.onchange=e=>{s()}}_initializePassphraseHandlers(){const e=()=>(0,i.mG)(this,void 0,void 0,(function*(){if(this.in.passphrase.validity.valid)return void 0!==this.groupSocket&&this.groupSocket.nsp===w.b4.Nsps.GROUP_LOBBY_PREFIX+this.in.groupName.value?this.groupSocket.connected?(this._setFormState(H.IN_GROUP),void this.nav.next.focus()):void 0:void(Array.from(this.groupNameDataList.children).some((e=>e.value===this.in.groupName.value))?((0,i.YH)(this,G,!1),this._attemptToJoinExistingGroup()):((0,i.YH)(this,G,!0),this.joinerSocket.emit(w.ZA.Exist.EVENT_NAME,new w.ZA.Exist.RequestCreate(this.in.groupName.value,this.in.passphrase.value))))}));this.in.passphrase.onkeydown=t=>{"Enter"===t.key&&e()}}_attemptToJoinExistingGroup(){var e;null===(e=this.groupSocket)||void 0===e||e.close();const t=this.top,s=n.getLastUserInfo();this.top.sockets.groupSocketConnect(this.in.groupName.value,{passphrase:this.in.passphrase.value,userInfo:s}).on("connect",(()=>{this._setFormState(H.IN_GROUP)})).on("connect_error",(e=>{t.toast("Unable to connect to the specified group.")})).on("disconnect",(e=>{"io server disconnect"===e&&(t.toast("The server disconnected you from your group."),this.requestGoToScreen(d.Id.GROUP_JOINER,{}))}))}get joinerSocket(){return this.top.sockets.joinerSocket}get groupSocket(){return this.top.sockets.groupSocket}_initializeFormContents(){this.in={};const e=l.Y.Screen.Impl.GroupJoiner.Class,t=a.R.mkEl("div",[l.Y.General.Class.INPUT_GROUP,e.CONTENT_WRAPPER],{});function s(e,s){const n=a.R.mkEl("input",[l.Y.General.Class.INPUT_GROUP_ITEM,s],{type:"text",autocomplete:"off",spellcheck:!1}),r=a.R.mkEl("label",[],{textContent:e});return r.appendChild(n),t.appendChild(r),n}this.nav.prev.classList.add(l.Y.General.Class.INPUT_GROUP_ITEM),t.appendChild(this.nav.prev);{const t=this.in.hostUrl=Object.assign(s("Host URL",e.HOST_URL),{type:"url",maxLength:128,autocomplete:"on",required:!0}),n=U.SUGGEST_HOST(this.top.webpageHostType);if(n){const e=a.R.mkEl("option",[],{value:n.value,textContent:n.description});document.getElementById(l.Y.GLOBAL_IDS.PUBLIC_GAME_HOST_URLS).insertAdjacentElement("afterbegin",e)}t.setAttribute("list",l.Y.GLOBAL_IDS.PUBLIC_GAME_HOST_URLS)}{const t=this.in.groupName=Object.assign(s("Group Name",e.GROUP_NAME),{pattern:w.ZA.Name.REGEXP.source,minLength:1,maxLength:w.ZA.Name.MaxLength,autocomplete:"on",required:!0}),n=this.groupNameDataList=a.R.mkEl("datalist",[],{id:l.Y.GLOBAL_IDS.CURRENT_HOST_GROUPS});this.baseElem.appendChild(n),t.setAttribute("list",n.id)}{const t=this.in.passphrase=s("Group Passphrase",e.PASSPHRASE);t.pattern=w.ZA.Passphrase.REGEXP.source,t.maxLength=w.ZA.Passphrase.MaxLength}return this.nav.next.classList.add(l.Y.General.Class.INPUT_GROUP_ITEM),t.appendChild(this.nav.next),a.R.propNoWrite(this,["in","groupNameDataList"]),Object.freeze(this.in),t}}k=new WeakMap,G=new WeakMap,function(e){let t;!function(e){e.CHOOSING_HOST="choosing-host",e.CHOOSING_GROUP="choosing-group",e.IN_GROUP="in-group"}(t=e.State||(e.State={})),e.SUGGEST_HOST=function(e){switch(e){case"github":return;case"filesystem":return{value:"localhost:"+w.b4.DEFAULT_PORT,description:"dev shortcut :)"};case"sk-server":return{value:window.location.origin,description:"this page's server"};default:return}}}(U||(U={}));const H=U.State;Object.freeze(U),Object.freeze(U.prototype);class B extends S{_lazyLoad(){super._lazyLoad(),this.nav.next.textContent="Start Game",this.nav.next.onclick=e=>{const t=this.parseArgsFromGui();this.top.clientIsGroupHost&&this.top.sockets.groupSocket.emit(w.m4.CREATE_GAME,t)}}}Object.freeze(B),Object.freeze(B.prototype);const Y=l.Y.Screen.Impl.GroupLobby.Class;class j extends d{get socket(){return this.top.sockets.groupSocket}_lazyLoad(){this._players=new Map,this._createInputs(),this.nav.prev.textContent="Return To Joiner",this.teamsElem=a.R.mkEl("div",[Y.SEC_TEAMS]),this.baseElem.appendChild(this.teamsElem),this.teamElems=new Map,a.R.propNoWrite(this,["_players","teamsElem","teamElems","in"]);{const e=this.nav.next;e.textContent="Setup Game",e.onclick=()=>{this.requestGoToScreen(d.Id.SETUP_ONLINE,{})},this.baseElem.appendChild(e)}}_createInputs(){var e;const t=a.R.mkEl("div",[l.Y.General.Class.INPUT_GROUP,Y.SEC_CLIENT_INFO]),s=a.R.mkEl("input",[l.Y.General.Class.INPUT_GROUP_ITEM],{type:"text",minLength:1,maxLength:c.J5.Username.MAX_LENGTH,pattern:c.J5.Username.REGEXP.source,spellcheck:!1,value:null!==(e=this.top.storage.Local.username)&&void 0!==e?e:"",onchange:this._submitInputs.bind(this)});t.appendChild(s);const n=a.R.mkEl("input",[l.Y.General.Class.INPUT_GROUP_ITEM],{type:"number",inputMode:"numeric",min:"0",max:"0",step:"1",value:"0",onchange:this._submitInputs.bind(this)});n.classList.add(),t.appendChild(n);const r=a.R.mkEl("select",[]);this.in=Object.freeze({username:s,teamId:n,avatar:r}),this.baseElem.appendChild(t)}_submitInputs(){this.in.username.validity.valid&&this.in.teamId.validity.valid&&(this.top.storage.Local.username=this.in.username.value,this.top.storage.Local.avatar=this.in.avatar.value,this.socket.emit(w.ZA.Socket.UserInfoChange.EVENT_NAME,{username:this.in.username.value,teamId:parseInt(this.in.teamId.value),avatar:c.J5.Avatar.LOREM_IPSUM}))}_abstractOnBeforeEnter(e,t){return(0,i.mG)(this,void 0,void 0,(function*(){"forward"===e&&(this.nav.next.disabled=!this.top.clientIsGroupHost,this._players.clear(),this.teamElems.clear(),this.teamsElem.textContent="",this._submitInputs(),this.socket.on(w.ZA.Socket.UserInfoChange.EVENT_NAME,this._onUserInfoChange.bind(this))),this.socket.once(w.m4.CREATE_GAME,(()=>{console.log("group create game socket. now waiting for ctor args"),this.top.sockets.gameSocketConnect(t.groupName,{passphrase:t.groupPassphrase}).once(w.JD.CREATE_GAME,(e=>{this.requestGoToScreen(d.Id.PLAY_ONLINE,e)}))}))}))}getRecommendedFocusElem(){let e=this.in.username.validity.valid?this.in.teamId.validity.valid?void 0:this.in.teamId:this.in.username;return void 0===e&&(e=this.top.clientIsGroupHost?this.nav.next:this.in.teamId),e}_abstractOnBeforeLeave(e){return e===d.NavDir.BACKWARD&&this.socket.removeListener(w.m4.CREATE_GAME),!0}_onUserInfoChange(e){Object.entries(e).forEach((([e,t])=>{const s=this._players.get(e);if(!s||1!==this.teamElems.get(s.teamId).childElementCount||void 0!==t&&t.teamId===s.teamId||(this.teamElems.get(s.teamId).remove(),this.teamElems.delete(s.teamId)),t&&!this.teamElems.has(t.teamId)){const e=a.R.mkEl("div",[Y.TEAM]);this.teamElems.set(t.teamId,e),e.onclick=e=>{this.in.teamId.value=t.teamId.toString()},this.teamsElem.appendChild(e)}if(void 0===t)s.base.remove(),this._players.delete(e);else if(void 0===s){const s=new j.UserInfo(t);this._players.set(e,s),this.teamElems.get(t.teamId).appendChild(s.base)}else s.update(t)})),this.in.teamId.max=Object.keys(this._players).length.toString()}}!function(e){var t,s,n;t=new WeakMap,s=new WeakMap,n=new WeakMap,e.UserInfo=class{constructor(e){t.set(this,void 0),s.set(this,void 0),n.set(this,void 0),this.base=a.R.mkEl("div",[Y.PLAYER]);const r=()=>{const e=a.R.mkEl("div",[]);return this.base.appendChild(e),e};this.el=Object.freeze({username:r(),teamId:r(),avatar:r()}),this.el.username.classList.add(Y.PLAYER_NAME),this.username=e.username,this.teamId=e.teamId,a.R.propNoWrite(this,["base","el"])}update(e){this.username=e.username,this.teamId=e.teamId,this.avatar=e.avatar}get username(){return(0,i.Q_)(this,t)}set username(e){this.el.username.textContent=e,(0,i.YH)(this,t,e)}get teamId(){return(0,i.Q_)(this,s)}set teamId(e){this.el.teamId.textContent=e.toString(),(0,i.YH)(this,s,e)}get avatar(){return(0,i.Q_)(this,n)}set avatar(e){(0,i.YH)(this,n,e),this.el.avatar}}}(j||(j={})),a.R.protoNoEnum(j,["_createInputs","_submitInputs"]),Object.freeze(j),Object.freeze(j.prototype);class D extends C{constructor(){super(...arguments),this.askConfirmBeforeLeave=!1,this.wantsAutoPause=!1}get socket(){return this.top.sockets.gameSocket}_lazyLoad(){super._lazyLoad(),this.nav.prev.innerHTML="Return To Lobby"}_abstractOnBeforeLeave(e){const t=super._abstractOnBeforeLeave(e);return t&&(this.socket.emit(w.JD.RETURN_TO_LOBBY),this.socket.removeAllListeners()),t}_createNewGame(e){return(0,i.mG)(this,void 0,void 0,(function*(){const t=new((yield Promise.all([s.e(929),s.e(775)]).then(s.bind(s,25))).OnlineGame)(this._onGameBecomeOver.bind(this),this.top.sockets.gameSocket,e);return this.top.sockets.gameSocket.on(w.JD.UNPAUSE,(()=>{this._statusBecomePlaying()})).on(w.JD.PAUSE,(()=>{this._statusBecomePaused()})).on(w.JD.RETURN_TO_LOBBY,(e=>{void 0===e&&this.nav.prev.click()})),Promise.resolve(t)}))}_onGameBecomeOver(){super._onGameBecomeOver()}}var x,z,M,F,W;Object.freeze(D),Object.freeze(D.prototype);class V{constructor(e,t){x.set(this,void 0),z.set(this,void 0),(0,i.YH)(this,z,e.transition),t.setAttribute("role","presentation");const s=d.Id,n=e,r=t,o=Object.freeze(this.goToScreen.bind(this));this.dict=Object.freeze({[s.HOME]:new h(s.HOME,n,r,o),[s.HOW_TO_PLAY]:new u(s.HOW_TO_PLAY,n,r,o),[s.HOW_TO_HOST]:new m(s.HOW_TO_HOST,n,r,o),[s.COLOUR_CTRL]:new g(s.COLOUR_CTRL,n,r,o),[s.SETUP_OFFLINE]:new N(s.SETUP_OFFLINE,n,r,o),[s.PLAY_OFFLINE]:new P(s.PLAY_OFFLINE,n,r,o),[s.GROUP_JOINER]:new U(s.GROUP_JOINER,n,r,o),[s.SETUP_ONLINE]:new B(s.SETUP_ONLINE,n,r,o),[s.GROUP_LOBBY]:new j(s.GROUP_LOBBY,n,r,o),[s.PLAY_ONLINE]:new D(s.PLAY_ONLINE,n,r,o)}),a.R.propNoWrite(this,["dict"]);const l=d.NavTree[window.location.hash.slice(1)];window.setTimeout((()=>{var e;this.goToScreen(null!==(e=null==l?void 0:l.href)&&void 0!==e?e:d.Id.HOME,{})}),75),window.addEventListener("popstate",(e=>{this.goToScreen(window.history.state.screenId,{})}))}goToScreen(e,t){return(0,i.mG)(this,void 0,void 0,(function*(){const s=this.currentScreen,n=this.dict[e];if(s===n)throw new Error("never");(0,i.YH)(this,x,n);const r=d.GET_NAV_DIR({curr:null==s?void 0:s.screenId,dest:e});return!(void 0!==s&&!s._leave(r)||(yield(0,i.Q_)(this,z).do({beforeUnblurAwait:n._enter(r,t),beforeUnblur:()=>{var e;null==s||s._onAfterLeave(),n._onAfterEnter(),null===(e=n.getRecommendedFocusElem())||void 0===e||e.focus()}}),0))}))}get currentScreen(){return(0,i.Q_)(this,x)}}x=new WeakMap,z=new WeakMap,Object.freeze(V),Object.freeze(V.prototype);class K{constructor(){M.set(this,void 0),this.baseElem=document.getElementById(l.Y.Screen.Id.SCREEN_TINT),(0,i.YH)(this,M,void 0),a.R.propNoWrite(this,["baseElem"])}do(e){var t;return(0,i.YH)(this,M,(null!==(t=(0,i.Q_)(this,M))&&void 0!==t?t:Promise.resolve()).then((()=>this._atomicDo(e)))),(0,i.Q_)(this,M)}_atomicDo(e){return(0,i.mG)(this,void 0,void 0,(function*(){const t=this.baseElem.style;yield this._triggerCssTransition((()=>{t.pointerEvents="all",t.opacity="1.0"})),void 0!==e.intermediateTransitionTrigger&&(yield this._triggerCssTransition((()=>{e.intermediateTransitionTrigger()}))),yield e.beforeUnblurAwait,void 0!==e.beforeUnblur&&e.beforeUnblur(),yield this._triggerCssTransition((()=>{t.pointerEvents="none",t.opacity="0.0"}))}))}_triggerCssTransition(e){return new Promise(((t,s)=>{this.baseElem.addEventListener("transitionend",(()=>t()),{once:!0}),e()}))}}M=new WeakMap,a.R.protoNoEnum(K,["_atomicDo","_triggerCssTransition"]),Object.freeze(K),Object.freeze(K.prototype);class J{constructor(){F.set(this,void 0),(0,i.YH)(this,F,{joiner:void 0,group:void 0,game:void 0})}get socketIo(){return new Promise(((e,t)=>{const s=a.R.mkEl("script",[]);s.onload=()=>{e(io)},s.src=document.getElementById("socket.io-preload").href,document.body.appendChild(s)}))}get joinerSocket(){return(0,i.Q_)(this,F).joiner}get groupSocket(){return(0,i.Q_)(this,F).group}get gameSocket(){return(0,i.Q_)(this,F).game}joinerSocketConnect(e){return(0,i.mG)(this,void 0,void 0,(function*(){const t=(yield this.socketIo).Manager(e.serverUrl.toString(),{reconnectionAttempts:w.ZA.GameServerReconnectionAttempts}).socket(w.b4.Nsps.GROUP_JOINER);return this._registerSocket(t,"joiner"),t}))}groupSocketConnect(e,t){return this._groupSocketHelper("group",e,t)}gameSocketConnect(e,t){return this._groupSocketHelper("game",e,t)}_groupSocketHelper(e,t,s){let n;switch(e){case"group":n=w.b4.Nsps.GROUP_LOBBY_PREFIX;break;case"game":n=w.b4.Nsps.GROUP_GAME_PREFIX;break;default:throw new TypeError("never")}const r=this.joinerSocket.io.socket(n+t,s);return this._registerSocket(r,e),r}_registerSocket(e,t){(0,i.Q_)(this,F)[t]=e;const s=()=>{e.removeAllListeners(),e.close(),(0,i.Q_)(this,F)[t]=void 0};e.on("connect_error",(e=>{s()})).on("disconnect",(e=>{"io server disconnect"!==e&&"io client disconnect"!==e||s()}))}}F=new WeakMap,a.R.protoNoEnum(J,["joinerSocketConnect","groupSocketConnect","gameSocketConnect","_groupSocketHelper","_registerSocket"]),Object.freeze(J),Object.freeze(J.prototype);class Q{constructor(){W.set(this,void 0),this.defaultDocTitle=document.title,this.webpageHostType=window.location.origin.match(/github\.io/)?Q.WebpageHostType.GITHUB:window.location.protocol.startsWith("file")?Q.WebpageHostType.FILESYSTEM:Q.WebpageHostType.SNAKEY_SERVER,a.R.propNoWrite(this,["defaultDocTitle","webpageHostType"]),this.storage=n,this.sockets=new J,this.transition=new K,a.R.propNoWrite(this,["storage","sockets","transition"]);const e=document.getElementById(l.Y.Screen.Id.ALL_SCREENS);if(!e)throw new Error("never");a.R.prependComment(e,"ALL SCREENS CONTAINER"),(0,i.YH)(this,W,new V(this,e)),a.R.propNoWrite(this,[])}get clientIsGroupHost(){return(0,i.Q_)(this,W).dict.groupJoiner.clientIsGroupHost}toast(e){console.info(e)}get game(){var e;return null!==(e=(0,i.Q_)(this,W).dict.playOffline.probeCurrentGame)&&void 0!==e?e:(0,i.Q_)(this,W).dict.playOnline.probeCurrentGame}get currentScreen(){return(0,i.Q_)(this,W).currentScreen}}W=new WeakMap,function(e){let t;!function(e){e.GITHUB="github",e.FILESYSTEM="filesystem",e.SNAKEY_SERVER="sk-server"}(t=e.WebpageHostType||(e.WebpageHostType={}))}(Q||(Q={})),Object.freeze(Q),Object.freeze(Q.prototype),Object.freeze(Object.prototype);const q=new Q,X=q;function Z(){return q.currentScreen}function $(){return q.game}console.log("%c🩺 welcome! 🐍","font:700 2.3em /1.5 monospace; margin:0.4em; border:0.3em solid black;padding:0.4em; color:white; background-color:#3f5e77; border-radius:0.7em; "),q.webpageHostType===Q.WebpageHostType.GITHUB&&"serviceWorker"in navigator&&window.addEventListener("load",(function(){navigator.serviceWorker.register("/ServiceWorker.js").then((e=>{console.log("ServiceWorker registration successful with scope: ",e.scope)}),(e=>{console.log("ServiceWorker registration failed: ",e)}))}))},655:(e,t,s)=>{function n(e,t,s,n){return new(s||(s=Promise))((function(r,o){function i(e){try{l(n.next(e))}catch(e){o(e)}}function a(e){try{l(n.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?r(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(i,a)}l((n=n.apply(e,t||[])).next())}))}function r(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)}function o(e,t,s){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,s),s}s.d(t,{mG:()=>n,Q_:()=>r,YH:()=>o}),Object.create,Object.create}},o={};function i(e){if(o[e])return o[e].exports;var t=o[e]={exports:{}};return r[e](t,t.exports,i),t.exports}return i.m=r,i.d=(e,t)=>{for(var s in t)i.o(t,s)&&!i.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,s)=>(i.f[s](e,t),t)),[])),i.u=e=>"chunk/"+({184:"lang/English-ts",227:"lang/Korean-ts",285:"lang/Morse-ts",410:"lang/Japanese-ts",755:"game/offline",775:"game/online",858:"lang/Emote-ts"}[e]||e)+".js",i.miniCssF=e=>826===e?"_barrel.css":"chunk/"+({184:"lang/English-ts",227:"lang/Korean-ts",285:"lang/Morse-ts",410:"lang/Japanese-ts",755:"game/offline",775:"game/online",858:"lang/Emote-ts"}[e]||e)+".css",i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="snakey3:",i.l=(s,n,r)=>{if(e[s])e[s].push(n);else{var o,a;if(void 0!==r)for(var l=document.getElementsByTagName("script"),c=0;c{o.onerror=o.onload=null,clearTimeout(h);var r=e[s];if(delete e[s],o.parentNode&&o.parentNode.removeChild(o),r&&r.forEach((e=>e(n))),t)return t(n)},h=setTimeout(d.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=d.bind(null,o.onerror),o.onload=d.bind(null,o.onload),a&&document.head.appendChild(o)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="./",s=e=>new Promise(((t,s)=>{var n=i.miniCssF(e),r=i.p+n;if(((e,t)=>{for(var s=document.getElementsByTagName("link"),n=0;n{var r=document.createElement("link");r.rel="stylesheet",r.type="text/css",r.onerror=r.onload=o=>{if(r.onerror=r.onload=null,"load"===o.type)s();else{var i=o&&o.target&&o.target.href||t,a=new Error("Loading CSS chunk "+e+" failed.\n("+i+")");a.code="CSS_CHUNK_LOAD_FAILED",a.request=i,r.parentNode.removeChild(r),n(a)}},r.href=t,document.head.appendChild(r)})(e,r,t,s)})),n={826:0},i.f.miniCss=(e,t)=>{n[e]?t.push(n[e]):0!==n[e]&&{755:1,775:1}[e]&&t.push(n[e]=s(e).then((()=>{n[e]=0}),(t=>{throw delete n[e],t})))},(()=>{var e={826:0};i.f.j=(t,s)=>{var n=i.o(e,t)?e[t]:void 0;if(0!==n)if(n)s.push(n[2]);else{var r=new Promise(((s,r)=>{n=e[t]=[s,r]}));s.push(n[2]=r);var o=i.p+i.u(t),a=new Error;i.l(o,(s=>{if(i.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var r=s&&("load"===s.type?"missing":s.type),o=s&&s.target&&s.target.src;a.message="Loading chunk "+t+" failed.\n("+r+": "+o+")",a.name="ChunkLoadError",a.type=r,a.request=o,n[1](a)}}),"chunk-"+t)}};var t=self.webpackChunksnakey3=self.webpackChunksnakey3||[],s=t.push.bind(t);t.push=t=>{for(var n,r,[o,a,l]=t,c=0,p=[];c{"use strict";var e,t,s,n,r={572:(e,t,s)=>{s.r(t)},406:(e,t,s)=>{var n;s.d(t,{R:()=>n}),function(e){let t;function s(e,t,s){t.forEach((t=>{if(!Object.getOwnPropertyNames(e).includes(t)){const s=`\`${e.__proto__.constructor.name}\` instance has no property named "${t}"`;throw new TypeError(s)}Object.defineProperty(e,t,s)}))}e.applyMixins=function(e,t){t.forEach((t=>{Object.getOwnPropertyNames(t.prototype).forEach((s=>{Object.defineProperty(e.prototype,s,Object.getOwnPropertyDescriptor(t.prototype,s))}))}))},e.deepFreeze=function e(t){return function(t){for(const s of Object.getOwnPropertyNames(t)){const n=t[s];"object"==typeof n&&e(n)}Object.freeze(t)}(t),t},function(e){let t;!function(e){e.access=function(e,t,s){s.enumerable=!1},e.cyclic=function(e,t,s){s.enumerable=!1}}(t=e.NonEnumerable||(e.NonEnumerable={}))}(t=e.Decor||(e.Decor={})),e.protoNoEnum=function(e,t){t.forEach((t=>{if(!Object.getOwnPropertyNames(e.prototype).includes(t)){const s=`\`${e.name}\` prototype has no property named "${t}"`;throw new TypeError(s)}Object.defineProperty(e.prototype,t,{enumerable:!1})}))},e.instNoEnum=function(e,t){s(e,t,{enumerable:!1})},e.propNoWrite=function(e,t){s(e,t,{writable:!1})},e.prependComment=function(e,t){e.parentNode.insertBefore(document.createComment(" "+t+" "),e)},e.camelCaseTransforms=function(e){const t=e.replace(/[A-Z]/g,(e=>" "+e.toLowerCase()));return Object.freeze({spaceyLowercase:t,spaceyUppercase:t.toUpperCase(),spaceyCapitalized:t.split(" ").map((e=>e.charAt(0).toUpperCase()+e.substring(1))).join(" ")})},e.mkEl=function(e,t,s){const n=document.createElement(e);try{Object.seal(n)}catch(e){}return n.classList.add(...t),"button"===e?n.type="button":"a"===e&&(n.rel="noopener"),void 0!==s&&Object.assign(n,s),n}}(n||(n={})),Object.freeze(n)},80:(e,t,s)=>{s.d(t,{Y:()=>n});var n,r=s(406);!function(e){let t,s,n,r,o,i;e.GLOBAL_IDS={PUBLIC_GAME_HOST_URLS:"public-game-hosts-list",CURRENT_HOST_GROUPS:"current-host-groups-list"},function(e){e.Class={TEXT_SELECT_DISABLED:"text-select-disabled",FILL_PARENT:"fill-parent",CENTER_CONTENTS:"center-contents",STACK_CONTENTS:"stack-contents",INPUT_GROUP:"sk-input-group",INPUT_GROUP_ITEM:"sk-input-group-item"},e.Dataset={COLOUR_SCHEME:"skColourScheme"}}(t=e.General||(e.General={})),function(e){e.Class={BASE:"tile",POINTER_HB:"tile__pointer-hitbox",LANG_CHAR_WRAP:"tile__char",LANG_SEQ:"tile__seq"},e.Dataset={HEALTH:"health"}}(s=e.Tile||(e.Tile={})),function(e){e.Class={GRID:"game-grid",SCROLL_OUTER:"game-grid-scroll-outer",SCROLL_INNER:"game-grid-scroll-inner",IMPL_BODY:"game-grid-impl-body",KBD_DC:"game-grid-kbd-dc",KBD_DC_ICON:"game-grid-kbd-dc__icon",PAUSE_OL:"game-grid-pause-overlay",PAUSE_OL_ICON:"game-grid-pause-overlay__icon",PLAYER_IOB_ROOT:"grid-player-intersection-root"},e.Dataset={IMPL_COORD_SYS:"coordSys",GAME_STATE:{KEY:"gameState",VALUES:{PLAYING:"playing",PAUSED:"paused",OVER:"over"}}}}(n=e.Grid||(e.Grid={})),function(e){e.Class={BASE:"player",FACE:"player__face",DOWNED_OVERLAY:"player__downed-overlay",SHORT_SPOTLIGHT:"player__spotlight-short",LONG_SPOTLIGHT:"player__spotlight-long"},e.Dataset={DOWNED:{KEY:"downed",VALUES:{TEAM:"team",SELF:"self",NO:"no"}},FACE_SWATCH:"face"}}(r=e.Player||(e.Player={})),function(e){let t;e.Id={ALL_SCREENS:"all-screens-container",SCREEN_TINT:"screen-tint"},e.Class={BASE:"sk-screen",NAV_NEXT:"screen--next-button",NAV_PREV:"screen--prev-button"},e.Dataset={CURRENT:"current"},function(e){let t,s,n,r,o,i;!function(e){e.Class={BASE:"screen-home",NAV:"screen-home--nav",NAV_PLAY_OFFLINE:"screen-home--nav--play-offline",NAV_PLAY_ONLINE:"screen-home--nav--play-online",NAV_HOW_TO_PLAY:"screen-home--nav--how-to-play",NAV_HOW_TO_HOST:"screen-home--nav--how-to-host",NAV_COLOURS:"screen-home--nav--colour-scheme",NAV_VIEW_REPO:"screen-home--nav--goto-repo",NAV_RPT_ISSUE:"screen-home--nav--report-issue"}}(t=e.Home||(e.Home={})),function(e){e.Class={BASE:"screen-colour",OPTION:"screen-colour--opt",OPTION_LABEL:"screen-colour--opt-label",OPTION_LABEL_TITLE:"screen-colour--opt-label--title",OPTION_LABEL_AUTHOR:"screen-colour--opt-label--author"}}(s=e.ColourCtrl||(e.ColourCtrl={})),function(e){e.Class={BASE:"screen-play",GRID_WRAPPER:"screen-play--grid-wrapper",CONTROLS_BAR:"screen-play--controls-bar",PLAYERS_BAR:"screen-play--players-bar"}}(n=e.Play||(e.Play={})),function(e){e.Class={BASE:"screen-setup",LANG_SEL:"screen-setup--lang-sel",LANG_WEIGHT_EXAGG:"screen-setup--lang-weight-exagg"},e.Id={LANG_WEIGHT_EXAGGERATION_LIST:"screen-setup--lang-weight-exaggeration-list"}}(r=e.Setup||(e.Setup={})),function(e){e.Class={BASE:"screen-joiner",CONTENT_WRAPPER:"screen-joiner--content-wrapper",HOST_URL:"screen-joiner--host-url",GROUP_NAME:"screen-joiner--group-name",PASSPHRASE:"screen-joiner--passphrase"}}(o=e.GroupJoiner||(e.GroupJoiner={})),function(e){e.Class={BASE:"screen-lobby",SEC_CLIENT_INFO:"screen-lobby--client-info-section",SEC_TEAMS:"screen-lobby--teams-section",TEAM:"screen-lobby--team",PLAYER:"screen-lobby--player",PLAYER_NAME:"screen-lobby--player__name"}}(i=e.GroupLobby||(e.GroupLobby={}))}(t=e.Impl||(e.Impl={}))}(o=e.Screen||(e.Screen={})),function(e){e.Class={BASE:"sk-pick-one",OPT_BASE:"sk-pick-one--opt"}}(i=e.SkPickOne||(e.SkPickOne={}))}(n||(n={})),Object.freeze(n.Player.Dataset.DOWNED),r.R.deepFreeze(n)},502:(e,t,s)=>{s.d(t,{b4:()=>n,ZA:()=>r,m4:()=>o,JD:()=>i});class n{}!function(e){let t;e.PROTOCOL="http://",e.DEFAULT_PORT=80,function(e){e.GROUP_JOINER="/joiner.",e.GROUP_LOBBY_PREFIX="/group.",e.GROUP_GAME_PREFIX="/group-game."}(t=e.Nsps||(e.Nsps={}))}(n||(n={})),Object.freeze(n),Object.freeze(n.prototype);class r{}var o,i;!function(e){let t,s,n,r;!function(e){let t;!function(e){e.EVENT_NAME="group-lobby-user-info-change"}(t=e.UserInfoChange||(e.UserInfoChange={}))}(t=e.Socket||(e.Socket={})),function(e){e.REGEXP=/(?:[a-zA-Z0-9:-]+)/,e.MaxLength=30}(s=e.Name||(e.Name={})),function(e){e.REGEXP=/(?:[a-zA-Z0-9:-]*)/,e.MaxLength=30}(n=e.Passphrase||(e.Passphrase={})),e.GameServerReconnectionAttempts=2,e.DEFAULT_TTL=20,function(e){e.EVENT_NAME="group-exist";class t{constructor(e,t){this.groupName=e,this.passphrase=t}}let s;e.RequestCreate=t,function(e){let t;!function(e){e.OKAY="okay",e.NOPE="nope"}(t=e.Response||(e.Response={}))}(t=e.RequestCreate||(e.RequestCreate={})),function(e){e.IN_LOBBY="in-lobby",e.IN_GAME="in-game",e.DELETE="delete"}(s=e.Status||(e.Status={}))}(r=e.Exist||(e.Exist={}))}(r||(r={})),Object.freeze(r),Object.freeze(r.prototype),function(e){e.CREATE_GAME="group-game-create"}(o||(o={})),function(e){e.CREATE_GAME="game-create",e.RESET="game-reset",e.UNPAUSE="game-unpause",e.PAUSE="game-pause",e.RETURN_TO_LOBBY="game-return-to-lobby"}(i||(i={}))},951:(e,t,s)=>{s.d(t,{Bl:()=>n,J5:()=>r,Uo:()=>o});const n=Object.freeze({behavior:"smooth",block:"center",inline:"center"});class r{}!function(e){let t,s,n;e.Family=Object.freeze({HUMAN:"HUMAN",CHASER:"CHASER"}),e.Family,function(e){e.NULL=void 0}(t=e.Id||(e.Id={})),function(e){e.REGEXP=/[ a-zA-Z0-9:-]+/,e.MAX_LENGTH=15}(s=e.Username||(e.Username={})),function(e){e.LOREM_IPSUM="lorem-ipsum"}(n=e.Avatar||(e.Avatar={})),function(e){const t=Object.values(e).filter((e=>"string"==typeof e));e.GET_RANDOM=function(){return t[Math.random()*t.length]}}(n=e.Avatar||(e.Avatar={})),e.MoveType=Object.freeze({NORMAL:"NORMAL",BOOST:"BOOST"}),e.MoveType}(r||(r={})),Object.freeze(r),Object.freeze(r.prototype);class o{}!function(e){let t,s,n;!function(e){e.REGEXP=new RegExp("^[a-zA-Z0-9!@#$%^&*()-_=+;:'\"\\|,.<>/?]+$")}(t=e.Seq||(e.Seq={})),function(e){e.NULL=Object.freeze({char:"",seq:""})}(s=e.CharSeqPair||(e.CharSeqPair={})),function(e){e.MAX=4}(n=e.WeightExaggeration||(e.WeightExaggeration={})),e.CHAR_HIT_COUNT_SEED_CEILING=5,e._RemapTemplates=Object.freeze({IDENTITY:e=>e,TO_LOWER:e=>e.toLowerCase()}),e._RemapTemplates,e.FrontendDescs=Object.freeze([{id:"engl-low",module:"English",export:"Lowercase",numLeaves:26,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"English Lowercase (qwerty)",blurb:""},{id:"engl-mix",module:"English",export:"MixedCase",numLeaves:52,remapFunc:e._RemapTemplates.IDENTITY,displayName:"English Mixed-Case (Querty)",blurb:""},{id:"japn-hir",module:"Japanese",export:"Hiragana",numLeaves:71,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Hiragana",blurb:""},{id:"japn-kat",module:"Japanese",export:"Katakana",numLeaves:70,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Katakana",blurb:""},{id:"kore-dub",module:"Korean",export:"Dubeolsik",numLeaves:9177,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Dubeolsik (두벌식 키보드)",blurb:"The most common keyboard layout, and South Korea's only Hangul standard since 1969. Consonants are on the left, and vowels on the right."},{id:"kore-sub",module:"Korean",export:"Sebeolsik",numLeaves:10206,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Sebeolsik (세벌식 최종 키보드)",blurb:"Another Hangul keyboard layout used in South Korea, and the final Sebeolsik layout designed by Dr. Kong Byung Woo, hence the name. Syllable-initial consonants are on the right, final consonants on the left, and vowels in the middle. It is more ergonomic than the dubeolsik, but not widely used."},{id:"kore-rom",module:"Korean",export:"Romanization",numLeaves:3990,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Korean Revised Romanization",blurb:"The Revised Romanization of Korean (국어의 로마자 표기법; 國語의 로마字 表記法) is the official South Korean language romanization system. It was developed by the National Academy of the Korean Language from 1995, and was released on 7 July 2000 by South Korea's Ministry of Culture and Tourism"},{id:"engl-cell-enc",module:"English",export:"OldCellphone.Encode",numLeaves:8,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Old Cellphone Keyboard",blurb:""}].map((e=>Object.freeze(e)))),e.FrontendDescs,e.GET_FRONTEND_DESC_BY_ID=function(t){return e.FrontendDescs.find((e=>e.id===t))}}(o||(o={})),Object.freeze(o),Object.freeze(o.prototype)},504:(e,t,s)=>{var n;s.d(t,{l:()=>n}),function(e){let t,s;!function(e){e.SERVER="SERVER",e.ONLINE="ONLINE",e.OFFLINE="OFFLINE"}(t=e.Type||(e.Type={})),Object.freeze(t),function(e){e.PLAYING="PLAYING",e.PAUSED="PAUSED",e.OVER="OVER"}(s=e.Status||(e.Status={})),Object.freeze(s),e.K=Object.freeze({HEALTH_UPDATE_CHANCE:.1,AVERAGE_HEALTH_TO_SPAWN_ON_TILE:1,PORTION_OF_MOVES_THAT_ARE_BOOST:.4,HEALTH_COST_OF_BOOST(e,t){const s=t(this.AVERAGE_HEALTH_TO_SPAWN_ON_TILE/e);return this.AVERAGE_HEALTH_TO_SPAWN_ON_TILE/s/this.PORTION_OF_MOVES_THAT_ARE_BOOST},HEALTH_EFFECT_FOR_DOWNED_PLAYER:.6,EVENT_RECORD_WRAPPING_BUFFER_LENGTH:128,EVENT_RECORD_FORWARD_WINDOW_LENGTH:64})}(n||(n={})),Object.freeze(n)},735:(e,t,s)=>{s.r(t),s.d(t,{OmHooks:()=>l.Y,game:()=>$,screen:()=>Z,top:()=>X});var n,r,o,i=s(655),a=s(406),l=s(80),c=s(951);!function(e){let t;function s(e,t){const s={};return Object.keys(t).forEach((t=>{Object.defineProperty(s,t,{enumerable:!0,get:()=>{const s=e.getItem(t);return null===s?void 0:JSON.parse(s)},set:s=>{e.setItem(t,JSON.stringify(s))}})})),Object.freeze(s),s}e.Local=s(localStorage,{musicVolume:1,sfxVolume:1,colourSchemeId:"",colourSchemeStyleLiteral:"",gamePresetId:"",username:"",avatar:""}),e.getLastUserInfo=function(){var t,s;return Object.freeze({username:null!==(t=e.Local.username)&&void 0!==t?t:"unnamed player",teamId:0,avatar:null!==(s=e.Local.avatar)&&void 0!==s?s:c.J5.Avatar.GET_RANDOM()})},e.Session=s(localStorage,Object.freeze({})),function(e){let t;e.DB_NAME="snakeyDB",function(e){e.STORE_NAME="userGamePresets"}(t=e.UserGamePresetStore||(e.UserGamePresetStore={})),Object.freeze(t)}(t=e.IDB||(e.IDB={})),Object.freeze(t)}(n||(n={})),Object.freeze(n);const p=l.Y.Screen.Class;class d{constructor(e,t,s,n){r.set(this,void 0),o.set(this,void 0),this.screenId=e,this.screenNames=a.R.camelCaseTransforms(e),this.top=t,(0,i.YH)(this,r,s),this.requestGoToScreen=n,this.baseElem=a.R.mkEl("div",[p.BASE]),(0,i.YH)(this,o,!1),this.nav=Object.freeze({prev:a.R.mkEl("button",[]),next:a.R.mkEl("button",[])}),a.R.propNoWrite(this,["screenId","top","baseElem","nav","requestGoToScreen"]),this.nav.prev.classList.add(p.NAV_PREV),this.nav.next.classList.add(p.NAV_NEXT),this.nav.prev.textContent="Back",this.nav.next.textContent="Next",this.nav.prev.onclick=t=>{const s=d.NavTree,n=s[this.screenId];s[n.prev].href===n.href?this.requestGoToScreen(d.NavTree[e].prev,{}):window.history.back()}}_enter(e,t){var s;return(0,i.mG)(this,void 0,void 0,(function*(){if(document.title=`${this.screenNames.spaceyCapitalized} | ${this.top.defaultDocTitle}`,e===d.NavDir.FORWARD){const e=new window.URL(window.location.href),t=e.hash=d.NavTree[this.screenId].href,n=[{screenId:this.screenId},"",e.href];(null===(s=window.history.state)||void 0===s?void 0:s.screenId)!==t&&(d.NavTree[this.screenId].prev===this.screenId?history.replaceState(...n):history.pushState(...n))}(0,i.Q_)(this,o)||(this._lazyLoad(),(0,i.Q_)(this,r).appendChild(this.baseElem),a.R.prependComment(this.baseElem,this.screenNames.spaceyUppercase+" SCREEN"),this.baseElem.setAttribute("aria-label",this.screenNames.spaceyCapitalized+" Screen"),(0,i.YH)(this,o,!0)),yield this._abstractOnBeforeEnter(e,t)}))}_leave(e){return!!this._abstractOnBeforeLeave(e)}_onAfterEnter(){this.baseElem.dataset[l.Y.Screen.Dataset.CURRENT]="",this.baseElem.setAttribute("aria-hidden","false")}_onAfterLeave(){delete this.baseElem.dataset[l.Y.Screen.Dataset.CURRENT],this.baseElem.setAttribute("aria-hidden","true")}getRecommendedFocusElem(){}_abstractOnBeforeEnter(e,t){return(0,i.mG)(this,void 0,void 0,(function*(){}))}_abstractOnBeforeLeave(e){return!0}}r=new WeakMap,o=new WeakMap,function(e){let t,s,n;!function(e){e.HOME="home",e.HOW_TO_PLAY="howToPlay",e.HOW_TO_HOST="howToHost",e.COLOUR_CTRL="colourControl",e.SETUP_OFFLINE="setupOffline",e.PLAY_OFFLINE="playOffline",e.GROUP_JOINER="groupJoiner",e.SETUP_ONLINE="setupOnline",e.GROUP_LOBBY="groupLobby",e.PLAY_ONLINE="playOnline"}(t=e.Id||(e.Id={})),Object.freeze(t),s=e.HistoryEntryId||(e.HistoryEntryId={}),e.NavTree=Object.freeze({[t.HOME]:{prev:t.HOME,href:t.HOME},[t.HOW_TO_PLAY]:{prev:t.HOME,href:t.HOW_TO_PLAY},[t.HOW_TO_HOST]:{prev:t.HOME,href:t.HOW_TO_HOST},[t.COLOUR_CTRL]:{prev:t.HOME,href:t.COLOUR_CTRL},[t.SETUP_OFFLINE]:{prev:t.HOME,href:t.SETUP_OFFLINE},[t.PLAY_OFFLINE]:{prev:t.SETUP_OFFLINE,href:t.SETUP_OFFLINE},[t.GROUP_JOINER]:{prev:t.HOME,href:t.GROUP_JOINER},[t.GROUP_LOBBY]:{prev:t.GROUP_JOINER,href:t.GROUP_JOINER},[t.SETUP_ONLINE]:{prev:t.GROUP_LOBBY,href:t.GROUP_JOINER},[t.PLAY_ONLINE]:{prev:t.GROUP_LOBBY,href:t.GROUP_JOINER}}),Object.entries(e.NavTree).forEach((([s,n])=>{let r=s;const o=new Set;do{if(o.has(r))throw new Error("Navigation tree must not contain cycles.");if(o.add(r),r=e.NavTree[r].prev,r===s)break}while(r!==e.NavTree[r].prev);if(r!==t.HOME)throw new Error("The home screen must be the root of the screen-navigation tree.")})),function(e){e.FORWARD="forward",e.BACKWARD="backward"}(n=e.NavDir||(e.NavDir={})),e.GET_NAV_DIR=function(t){const{curr:s,dest:n}=t;if(void 0===s)return e.NavDir.FORWARD;let r=s;for(;r!==e.NavTree[r].prev;)if(r=e.NavTree[r].prev,r===n)return e.NavDir.BACKWARD;return e.NavDir.FORWARD}}(d||(d={})),Object.freeze(d),Object.freeze(d.prototype);class h extends d{_lazyLoad(){const e=l.Y.Screen.Impl.Home.Class;this.baseElem.classList.add(l.Y.General.Class.CENTER_CONTENTS,e.BASE);const t=this.navElem=a.R.mkEl("div",[l.Y.General.Class.TEXT_SELECT_DISABLED,l.Y.General.Class.INPUT_GROUP,e.NAV]);t.setAttribute("role","navigation"),t.addEventListener("pointerleave",(()=>{var e;(null===(e=document.activeElement)||void 0===e?void 0:e.parentElement)===t&&document.activeElement.blur()}));const s=(e,s)=>{e.classList.add(l.Y.General.Class.CENTER_CONTENTS,l.Y.General.Class.INPUT_GROUP_ITEM,s.cssClass),e.textContent=s.text,e.addEventListener("pointerenter",(()=>{window.requestAnimationFrame((t=>{e.focus()}))})),t.appendChild(e)};[{text:"Offline Single-player",cssClass:e.NAV_PLAY_OFFLINE,screenId:d.Id.SETUP_OFFLINE},{text:"Online Multi-player",cssClass:e.NAV_PLAY_ONLINE,screenId:d.Id.GROUP_JOINER},{text:"How To Play",cssClass:e.NAV_HOW_TO_PLAY,screenId:d.Id.HOW_TO_PLAY},{text:"How To Host",cssClass:e.NAV_HOW_TO_HOST,screenId:d.Id.HOW_TO_HOST},{text:"Colour Schemes",cssClass:e.NAV_COLOURS,screenId:d.Id.COLOUR_CTRL}].map((e=>Object.freeze(e))).forEach((e=>{const t=a.R.mkEl("button",[]);t.onclick=e.screenId instanceof Function?e.screenId:()=>{this.requestGoToScreen(e.screenId,{})},s(t,e)})),[{text:"Visit\nRepo",cssClass:e.NAV_VIEW_REPO,href:new window.URL("https://github.com/david-fong/snakey3")},{text:"Report\nIssue",cssClass:e.NAV_RPT_ISSUE,href:new window.URL("https://github.com/david-fong/snakey3/issues")}].map((e=>Object.freeze(e))).forEach((e=>{const t=a.R.mkEl("a",[],{href:e.href.toString(),target:"_blank"});s(t,e)})),this.baseElem.appendChild(t)}}Object.freeze(h),Object.freeze(h.prototype);class u extends d{_lazyLoad(){}}Object.freeze(u),Object.freeze(u.prototype);class m extends d{_lazyLoad(){}}var E,_,O;!function(e){e.INSTRUCTIONS_STEPS=Object.freeze(["$ npm install 'https://github.com/david-fong/snakey3#gh-pages'","$ npm run start","send the url to your friends"])}(m||(m={})),Object.freeze(m),Object.freeze(m.prototype);class v{constructor(){E.set(this,void 0),_.set(this,void 0),O.set(this,void 0);const e=a.R.mkEl("div",[l.Y.SkPickOne.Class.BASE],{tabIndex:0});e.setAttribute("role","listbox"),e.addEventListener("keydown",this._onKeyDown.bind(this)),e.addEventListener("pointerenter",(t=>{window.requestAnimationFrame((t=>{e.focus()}))})),this.baseElem=e,this.options=[]}addOption(e){this.options.push(e),this.baseElem.appendChild(e.baseElem),e.baseElem.addEventListener("pointerenter",this.hoverOpt.bind(this,e)),e.baseElem.addEventListener("click",this.selectOpt.bind(this,e,!0)),e._registerParent(this._onOptDisabledChange.bind(this))}hoverOpt(e){var t;this.hoveredOpt!==e&&(null===(t=this.hoveredOpt)||void 0===t||t.baseElem.setAttribute("aria-active-descendant","false"),(0,i.YH)(this,_,e),this.hoveredOpt.baseElem.setAttribute("aria-active-descendant","true"))}selectOpt(e,t=!0){var s;if(!e)throw new Error("opt must be defined");this.hoverOpt(e),this.confirmedOpt!==e&&(null===(s=this.confirmedOpt)||void 0===s||s.baseElem.setAttribute("aria-selected","false"),(0,i.YH)(this,E,e),this.confirmedOpt.baseElem.setAttribute("aria-selected","true"),t&&this._onSelectOpt(e))}get confirmedOpt(){return(0,i.Q_)(this,E)}get hoveredOpt(){return(0,i.Q_)(this,_)}_onOptDisabledChange(e){this.confirmedOpt===e&&(this._isValid=!e.disabled)}set _isValid(e){this._isValid!==e&&(this.baseElem.setAttribute("aria-invalid",e?"false":"true"),(0,i.YH)(this,O,e))}get _isValid(){return(0,i.Q_)(this,O)}_onKeyDown(e){if(" "===e.key||"Enter"===e.key)return this.selectOpt(this.hoveredOpt),e.preventDefault(),!1;{const t=this.options.indexOf(this.hoveredOpt);if("ArrowDown"===e.key||"Down"===e.key)for(let s=t+1;s=0;s--){const t=this.options[s];if(!t.disabled)return this.hoverOpt(t),e.preventDefault(),!1}}return!0}}E=new WeakMap,_=new WeakMap,O=new WeakMap,function(e){var t,s;t=new WeakMap,s=new WeakMap,e._Option=class{constructor(){t.set(this,void 0),s.set(this,void 0),(this.baseElem=a.R.mkEl("div",[l.Y.SkPickOne.Class.OPT_BASE])).setAttribute("role","option"),(0,i.YH)(this,t,!1)}_registerParent(e){(0,i.YH)(this,s,e)}get disabled(){return(0,i.Q_)(this,t)}set disabled(e){this.disabled!==e&&(this.baseElem.setAttribute("aria-disabled",e?"true":"false"),(0,i.YH)(this,t,e),(0,i.Q_)(this,s).call(this,this))}},Object.freeze(e),Object.freeze(e.prototype)}(v||(v={})),Object.freeze(v),Object.freeze(v.prototype),s(572);const f=l.Y.Screen.Impl.ColourCtrl.Class;l.Y.General.Class;class g extends d{_lazyLoad(){this.baseElem.classList.add(f.BASE),this.baseElem.appendChild(this.nav.prev);const e=this.sel=new g.PickOne(this.top.storage.Local,this.top.transition);a.R.propNoWrite(this,["sel"]),this.baseElem.appendChild(e.baseElem);const t=this.top.storage.Local.colourSchemeId;t&&this.sel.selectOpt(this.sel.getOptById(t),!1)}}var b;!function(e){var t,s,n;class r extends v{constructor(e,o){var a;super(),t.set(this,void 0),s.set(this,void 0),n.set(this,void 0),(0,i.YH)(this,t,!0),(0,i.YH)(this,s,e),(0,i.YH)(this,n,o),b.Schemes.forEach((e=>{this.addOption(new r.Option(e))})),this.selectOpt(this.getOptById(null!==(a=(0,i.Q_)(this,s).colourSchemeId)&&void 0!==a?a:"snakey"),!1)}_onHoverOpt(e){}_onSelectOpt(e){(0,i.Q_)(this,s).colourSchemeId=e.desc.id,(0,i.Q_)(this,s).colourSchemeStyleLiteral=e.cssLiteral;const r=(0,i.Q_)(this,t);(0,i.YH)(this,t,!1),(0,i.Q_)(this,n).do({intermediateTransitionTrigger:()=>{document.documentElement.dataset[l.Y.General.Dataset.COLOUR_SCHEME]=e.desc.id;const t=document.documentElement.style;if(r)for(const e of b.Swatch){const s="--colour-"+e;t.setProperty(s,"")}}})}getOptById(e){return this.options.find((t=>t.desc.id===e))}}t=new WeakMap,s=new WeakMap,n=new WeakMap,e.PickOne=r,function(e){class t extends v._Option{constructor(e){super(),this.desc=e;const s=this.baseElem;s.classList.add(f.OPTION),s.dataset[l.Y.General.Dataset.COLOUR_SCHEME]=e.id;const n=a.R.mkEl("span",[f.OPTION_LABEL]);n.appendChild(a.R.mkEl("div",[f.OPTION_LABEL_TITLE],{textContent:e.displayName})),n.appendChild(a.R.mkEl("div",[f.OPTION_LABEL_AUTHOR],{textContent:"by "+e.author})),s.appendChild(n);for(let e=0;eObject.freeze(e))))}(b||(b={})),Object.freeze(b);const T=l.Y.Screen.Impl.Setup.Class;class S extends d{_lazyLoad(){this.baseElem.classList.add(T.BASE),this.baseElem.appendChild(this.nav.prev),this.langSel=new S.LangPickOne,this.baseElem.appendChild(this.langSel.baseElem),this._createLangWeightExaggerationInput(),a.R.propNoWrite(this,["langSel","langWeightExaggeration"]),this.baseElem.appendChild(this.nav.next),this._loadLastUsedPreset()}_createLangWeightExaggerationInput(){const e=this.langWeightExaggeration=a.R.mkEl("input",[T.LANG_WEIGHT_EXAGG],{type:"range",min:"0",max:c.Uo.WeightExaggeration.MAX.toString(),step:"any",value:"1"});{const e=a.R.mkEl("datalist",[]);e.id=l.Y.Screen.Impl.Setup.Id.LANG_WEIGHT_EXAGGERATION_LIST,[{val:0,label:"0"},{val:1,label:"1"}].forEach((t=>{e.appendChild(a.R.mkEl("option",[],{value:t.val.toString(),label:t.label}))})),this.baseElem.appendChild(e)}e.setAttribute("list",l.Y.Screen.Impl.Setup.Id.LANG_WEIGHT_EXAGGERATION_LIST),this.baseElem.appendChild(e)}getRecommendedFocusElem(){return this.nav.next}_loadLastUsedPreset(){this.top.storage.Local.gamePresetId}parseArgsFromGui(){const e=Object.assign({},S.DEFAULT_PRESET());return e.langId=this.langSel.confirmedOpt.desc.id,e.langWeightExaggeration=parseFloat(this.langWeightExaggeration.value),e}}!function(e){e.DEFAULT_PRESET=()=>({coordSys:"EUCLID2",gridDimensions:{height:21,width:21},averageFreeHealthPerTile:1/45,langWeightExaggeration:1,langId:"engl-low",playerDescs:[{isALocalOperator:!1,familyId:"CHASER",teamId:1,clientId:void 0,username:"chaser1",avatar:void 0,noCheckGameOver:!0,familyArgs:{}},{isALocalOperator:!1,familyId:"CHASER",teamId:1,clientId:void 0,username:"chaser2",avatar:void 0,noCheckGameOver:!0,familyArgs:{fearDistance:6,bloodThirstDistance:5,healthReserve:5,keyPressesPerSecond:1.8}}]});class t extends v{constructor(){super(),this.baseElem.classList.add(T.LANG_SEL),c.Uo.FrontendDescs.forEach((e=>{this.addOption(new t.Option(e))})),this.selectOpt(this.options[0])}_onHoverOpt(e){}_onSelectOpt(e){}}e.LangPickOne=t,function(e){class t extends v._Option{constructor(e){super(),this.desc=e,this.baseElem.textContent=e.displayName}}e.Option=t,Object.freeze(t),Object.freeze(t.prototype)}(t=e.LangPickOne||(e.LangPickOne={}))}(S||(S={})),Object.freeze(S),Object.freeze(S.prototype);class N extends S{_lazyLoad(){super._lazyLoad(),this.nav.next.onclick=e=>{const t=this.parseArgsFromGui();this.requestGoToScreen(d.Id.PLAY_OFFLINE,t)}}parseArgsFromGui(){const e=super.parseArgsFromGui();return e.playerDescs.splice(e.playerDescs.length,0,{isALocalOperator:!0,familyId:"HUMAN",teamId:0,clientId:void 0,username:"hello1",avatar:void 0,noCheckGameOver:!1,familyArgs:{}},{isALocalOperator:!0,familyId:"HUMAN",teamId:1,clientId:void 0,username:"hello2",avatar:void 0,noCheckGameOver:!1,familyArgs:{}}),e}}Object.freeze(N),Object.freeze(N.prototype);var R,L,A,y,I=s(504);class C extends d{constructor(){super(...arguments),R.set(this,void 0),L.set(this,void 0),A.set(this,void 0),y.set(this,void 0)}_lazyLoad(){this.baseElem.classList.add(l.Y.General.Class.CENTER_CONTENTS,l.Y.Screen.Impl.Play.Class.BASE);const e=C.createCenterColElem();this._gridBaseElem=e.grid,this._gridImplHost=e.implHost,this._gridImplHost.appendChild(document.createComment("grid impl host")),this.baseElem.appendChild(e.top),e.pauseOl.addEventListener("click",(e=>{const t=this.currentGame;void 0!==t&&t.status===I.l.Status.PAUSED&&this._statusBecomePlaying()})),a.R.propNoWrite(this,["_gridBaseElem","_gridImplHost"]),this._initializeControlsBar(),this._initializePlayersBar(),(0,i.YH)(this,L,(()=>{if(this.wantsAutoPause)if(document.hidden){if(void 0===(0,i.Q_)(this,y)){const e=this.currentGame;(void 0===e||void 0!==e&&e.status!==I.l.Status.OVER)&&this._statusBecomePaused()}}else"page-hide"===(0,i.Q_)(this,y)&&this._statusBecomePlaying()})),(0,i.YH)(this,A,this._gridKeyDownCallback.bind(this))}_abstractOnBeforeEnter(e,t){return(0,i.mG)(this,void 0,void 0,(function*(){document.addEventListener("visibilitychange",(0,i.Q_)(this,L)),this.pauseButton.disabled=!0,this._statusBecomePaused(),(0,i.YH)(this,R,yield this._createNewGame(t)),this._gridBaseElem.addEventListener("keydown",(0,i.Q_)(this,A),{capture:!0}),yield this.currentGame.reset();const e=this.currentGame.htmlElements;this._gridImplHost.appendChild(e.gridImpl),this.playersBar.appendChild(e.playersBar),this.pauseButton.onclick=this._statusBecomePlaying.bind(this),this.pauseButton.disabled=!1,this.wantsAutoPause&&setTimeout((()=>{document.hidden||this._statusBecomePlaying()}),500)}))}_abstractOnBeforeLeave(e){if(this.askConfirmBeforeLeave&&!window.confirm("Are you sure you would like to leave?"))return!1;document.removeEventListener("visibilitychange",(0,i.Q_)(this,L)),this.currentGame.statusBecomePaused();for(const e of Object.values(this.currentGame.htmlElements))e.textContent="",e.remove();return this._gridBaseElem.removeEventListener("keydown",(0,i.Q_)(this,A)),(0,i.YH)(this,R,void 0),!0}get currentGame(){return(0,i.Q_)(this,R)}get probeCurrentGame(){return(0,i.Q_)(this,R)}_gridKeyDownCallback(e){e.stopPropagation();const t=this.currentGame;if(e.ctrlKey&&" "===e.key&&!e.repeat){const e=t.operators;t.setCurrentOperator((1+e.indexOf(t.currentOperator))%e.length)}else t.currentOperator.processKeyboardInput(e);return" "!==e.key||(e.preventDefault(),!1)}_statusBecomePlaying(){var e;const t=l.Y.Grid.Dataset.GAME_STATE;null===(e=this.probeCurrentGame)||void 0===e||e.statusBecomePlaying(),this.pauseButton.textContent="Pause",(0,i.YH)(this,y,void 0),this._gridBaseElem.dataset[t.KEY]=t.VALUES.PLAYING,this.pauseButton.onclick=this._statusBecomePaused.bind(this),this.resetButton.disabled=!0,window.requestAnimationFrame((e=>{this._gridBaseElem.focus()}))}_statusBecomePaused(){var e;const t=l.Y.Grid.Dataset.GAME_STATE;null===(e=this.probeCurrentGame)||void 0===e||e.statusBecomePaused(),this.pauseButton.textContent="Unpause",(0,i.YH)(this,y,document.hidden?"page-hide":"other"),this._gridBaseElem.dataset[t.KEY]=t.VALUES.PAUSED,this.pauseButton.onclick=this._statusBecomePlaying.bind(this),this.resetButton.disabled=!1}_onGameBecomeOver(){const e=l.Y.Grid.Dataset.GAME_STATE;this.pauseButton.disabled=!0,this.resetButton.disabled=!1,this._gridBaseElem.dataset[e.KEY]=e.VALUES.OVER}_resetGame(){this.currentGame.reset(),this.pauseButton.disabled=!1,this.wantsAutoPause&&this._statusBecomePlaying()}_initializeControlsBar(){const e=a.R.mkEl("div",[l.Y.General.Class.CENTER_CONTENTS,l.Y.General.Class.INPUT_GROUP,l.Y.Screen.Impl.Play.Class.CONTROLS_BAR]);function t(t,s){return(s=null!=s?s:a.R.mkEl("button",[])).classList.add(l.Y.General.Class.INPUT_GROUP_ITEM),s.textContent=t,s.addEventListener("pointerenter",(e=>{window.requestAnimationFrame((e=>{s.focus()}))})),e.appendChild(s),s}e.setAttribute("role","menu"),e.addEventListener("pointerleave",(e=>{window.requestAnimationFrame((e=>{this._gridBaseElem.focus()}))})),t("",this.nav.prev),this.pauseButton=t(""),(this.resetButton=t("Reset")).onclick=this._resetGame.bind(this),a.R.propNoWrite(this,["pauseButton","resetButton"]),this.baseElem.appendChild(e)}_initializePlayersBar(){const e=this.playersBar=a.R.mkEl("div",[l.Y.Screen.Impl.Play.Class.PLAYERS_BAR]);a.R.propNoWrite(this,["playersBar"]),this.baseElem.appendChild(e)}}R=new WeakMap,L=new WeakMap,A=new WeakMap,y=new WeakMap,function(e){e.createCenterColElem=function(){const e=l.Y.Grid.Class,t=l.Y.General.Class,s=a.R.mkEl("div",[l.Y.Screen.Impl.Play.Class.GRID_WRAPPER]),n=a.R.mkEl("div",[t.STACK_CONTENTS,t.TEXT_SELECT_DISABLED,e.GRID],{tabIndex:0});n.setAttribute("role","textbox"),n.setAttribute("aria-label","Game Grid");const r=a.R.mkEl("div",[e.SCROLL_OUTER]);r.setAttribute("role","presentation");{const s=a.R.mkEl("div",[t.FILL_PARENT,t.CENTER_CONTENTS,e.KBD_DC]);s.appendChild(a.R.mkEl("div",[e.KBD_DC_ICON],{textContent:"(click here to continue typing)"})),r.appendChild(s)}const o=a.R.mkEl("div",[t.FILL_PARENT,t.CENTER_CONTENTS,e.PAUSE_OL],{});return o.appendChild(a.R.mkEl("div",[e.PAUSE_OL_ICON],{textContent:"(Click to Unpause)"})),r.appendChild(o),n.appendChild(r),s.appendChild(n),Object.freeze({top:s,grid:n,intersectionRoot:r,implHost:r,pauseOl:o})}}(C||(C={})),a.R.protoNoEnum(C,["probeCurrentGame"]),a.R.instNoEnum(C,["createCenterColElem"]),Object.freeze(C),Object.freeze(C.prototype);class P extends C{constructor(){super(...arguments),this.wantsAutoPause=!0,this.askConfirmBeforeLeave=!0}_lazyLoad(){super._lazyLoad(),this.nav.prev.innerHTML="Return To Setup"}_createNewGame(e){return(0,i.mG)(this,void 0,void 0,(function*(){return new((yield Promise.all([s.e(929),s.e(755)]).then(s.bind(s,40))).OfflineGame)(this._onGameBecomeOver.bind(this),e)}))}}Object.freeze(P),Object.freeze(P.prototype);var k,G,w=s(502);class U extends d{constructor(){super(...arguments),k.set(this,void 0),G.set(this,!1)}get clientIsGroupHost(){return(0,i.Q_)(this,G)}_lazyLoad(){this.baseElem.classList.add(l.Y.General.Class.CENTER_CONTENTS,l.Y.Screen.Impl.GroupJoiner.Class.BASE);const e=this._initializeFormContents(),t=this._initializeHostUrlHandlers();this._initializeGroupNameHandlers(t),this._initializePassphraseHandlers(),this.nav.next.onclick=e=>{s()};const s=()=>{this.requestGoToScreen(d.Id.GROUP_LOBBY,{groupName:this.in.groupName.value,groupPassphrase:this.in.passphrase.value})};this._setFormState(H.CHOOSING_HOST),this.baseElem.appendChild(e)}getRecommendedFocusElem(){return void 0!==this.groupSocket?this.in.groupName:this.in.hostUrl}get state(){return(0,i.Q_)(this,k)}_setFormState(e){if(this.state!==e){if(e===H.IN_GROUP){if(this.state!==H.CHOOSING_GROUP)throw new Error("never");this.in.passphrase.disabled=!0,this.nav.next.disabled=!1,this.nav.next.focus()}else this.nav.next.disabled=!0,e===H.CHOOSING_HOST?(this.in.groupName.disabled=!0,this.in.groupName.value="",this.groupNameDataList.innerText="",this.in.passphrase.disabled=!0,this.in.passphrase.value="",this.in.hostUrl.focus()):e===H.CHOOSING_GROUP&&(this.in.groupName.disabled=!1,this.in.passphrase.disabled=!1,this.in.groupName.focus());(0,i.YH)(this,k,e)}}_initializeHostUrlHandlers(){const e=this.top,t=this.in.hostUrl,s=()=>(0,i.mG)(this,void 0,void 0,(function*(){var s,n;if(!t.value||!t.validity.valid)return;t.value.startsWith(w.b4.PROTOCOL)||(t.value=new window.URL(w.b4.PROTOCOL+t.value).origin);const r=new window.URL(t.value);if((null===(s=this.groupSocket)||void 0===s?void 0:s.io.opts.hostname)===r.hostname)return void(this.groupSocket.connected&&(this._setFormState(H.CHOOSING_GROUP),this.in.groupName.focus()));null===(n=this.joinerSocket)||void 0===n||n.close();const o=yield this.top.sockets.joinerSocketConnect({serverUrl:r});o.on("connect",(()=>{this._setFormState(H.CHOOSING_GROUP),o.on(w.ZA.Exist.EVENT_NAME,this._onNotifyGroupExist.bind(this))})).on("connect_error",(e=>{this.top.toast("Unable to connected to the specified server.")})).on("disconnect",(s=>{"io server disconnect"===s&&(this._setFormState(H.CHOOSING_HOST),t.value="",e.toast("The server disconnected you from the group joiner."))}))}));return t.oninput=e=>this._setFormState(H.CHOOSING_HOST),t.onkeydown=e=>{"Enter"===e.key&&s()},t.onpaste=e=>{window.setTimeout((()=>s()),0)},t.onchange=()=>{s()},s}_onNotifyGroupExist(e){if(e===w.ZA.Exist.RequestCreate.Response.NOPE)return void this.top.toast(`The server rejected your request to create a new group "${this.in.groupName.value}".`);if(e===w.ZA.Exist.RequestCreate.Response.OKAY)return this.top.toast(`server accepted request to create new group "${this.in.groupName.value}".`),this.top.toast("connecting to new group..."),void this._attemptToJoinExistingGroup();const t=this.groupNameDataList,s=Array.from(t.children);Object.entries(e).forEach((([e,n])=>{const r=s.find((t=>t.value===e))||(e=>{const n=a.R.mkEl("option",[],{value:e});for(const e of s)if(n.value.localeCompare(e.value)<0){t.insertBefore(n,e);break}return n.parentElement||t.appendChild(n),n})(e);switch(n){case w.ZA.Exist.Status.IN_LOBBY:r.textContent="In Lobby";break;case w.ZA.Exist.Status.IN_GAME:r.textContent="In Game";break;case w.ZA.Exist.Status.DELETE:r.remove()}}))}_initializeGroupNameHandlers(e){const t=this.in.groupName,s=()=>{t.value&&t.validity.valid&&(this.state===H.IN_GROUP?this.nav.next.focus():this.in.passphrase.focus())};this.in.groupName.oninput=t=>(0,i.mG)(this,void 0,void 0,(function*(){this.state===H.IN_GROUP&&(yield e()),this.in.passphrase.value="",(0,i.YH)(this,G,!1)})),t.onkeydown=e=>{"Enter"===e.key&&s()},t.onchange=e=>{s()}}_initializePassphraseHandlers(){const e=()=>(0,i.mG)(this,void 0,void 0,(function*(){if(this.in.passphrase.validity.valid)return void 0!==this.groupSocket&&this.groupSocket.nsp===w.b4.Nsps.GROUP_LOBBY_PREFIX+this.in.groupName.value?this.groupSocket.connected?(this._setFormState(H.IN_GROUP),void this.nav.next.focus()):void 0:void(Array.from(this.groupNameDataList.children).some((e=>e.value===this.in.groupName.value))?((0,i.YH)(this,G,!1),this._attemptToJoinExistingGroup()):((0,i.YH)(this,G,!0),this.joinerSocket.emit(w.ZA.Exist.EVENT_NAME,new w.ZA.Exist.RequestCreate(this.in.groupName.value,this.in.passphrase.value))))}));this.in.passphrase.onkeydown=t=>{"Enter"===t.key&&e()}}_attemptToJoinExistingGroup(){var e;null===(e=this.groupSocket)||void 0===e||e.close();const t=this.top,s=n.getLastUserInfo();this.top.sockets.groupSocketConnect(this.in.groupName.value,{passphrase:this.in.passphrase.value,userInfo:s}).on("connect",(()=>{this._setFormState(H.IN_GROUP)})).on("connect_error",(e=>{t.toast("Unable to connect to the specified group.")})).on("disconnect",(e=>{"io server disconnect"===e&&(t.toast("The server disconnected you from your group."),this.requestGoToScreen(d.Id.GROUP_JOINER,{}))}))}get joinerSocket(){return this.top.sockets.joinerSocket}get groupSocket(){return this.top.sockets.groupSocket}_initializeFormContents(){this.in={};const e=l.Y.Screen.Impl.GroupJoiner.Class,t=a.R.mkEl("div",[l.Y.General.Class.INPUT_GROUP,e.CONTENT_WRAPPER],{});function s(e,s){const n=a.R.mkEl("input",[l.Y.General.Class.INPUT_GROUP_ITEM,s],{type:"text",autocomplete:"off",spellcheck:!1}),r=a.R.mkEl("label",[],{textContent:e});return r.appendChild(n),t.appendChild(r),n}this.nav.prev.classList.add(l.Y.General.Class.INPUT_GROUP_ITEM),t.appendChild(this.nav.prev);{const t=this.in.hostUrl=Object.assign(s("Host URL",e.HOST_URL),{type:"url",maxLength:128,autocomplete:"on",required:!0}),n=U.SUGGEST_HOST(this.top.webpageHostType);if(n){const e=a.R.mkEl("option",[],{value:n.value,textContent:n.description});document.getElementById(l.Y.GLOBAL_IDS.PUBLIC_GAME_HOST_URLS).insertAdjacentElement("afterbegin",e)}t.setAttribute("list",l.Y.GLOBAL_IDS.PUBLIC_GAME_HOST_URLS)}{const t=this.in.groupName=Object.assign(s("Group Name",e.GROUP_NAME),{pattern:w.ZA.Name.REGEXP.source,minLength:1,maxLength:w.ZA.Name.MaxLength,autocomplete:"on",required:!0}),n=this.groupNameDataList=a.R.mkEl("datalist",[],{id:l.Y.GLOBAL_IDS.CURRENT_HOST_GROUPS});this.baseElem.appendChild(n),t.setAttribute("list",n.id)}{const t=this.in.passphrase=s("Group Passphrase",e.PASSPHRASE);t.pattern=w.ZA.Passphrase.REGEXP.source,t.maxLength=w.ZA.Passphrase.MaxLength}return this.nav.next.classList.add(l.Y.General.Class.INPUT_GROUP_ITEM),t.appendChild(this.nav.next),a.R.propNoWrite(this,["in","groupNameDataList"]),Object.freeze(this.in),t}}k=new WeakMap,G=new WeakMap,function(e){let t;!function(e){e.CHOOSING_HOST="choosing-host",e.CHOOSING_GROUP="choosing-group",e.IN_GROUP="in-group"}(t=e.State||(e.State={})),e.SUGGEST_HOST=function(e){switch(e){case"github":return;case"filesystem":return{value:"localhost:"+w.b4.DEFAULT_PORT,description:"dev shortcut :)"};case"sk-server":return{value:window.location.origin,description:"this page's server"};default:return}}}(U||(U={}));const H=U.State;Object.freeze(U),Object.freeze(U.prototype);class B extends S{_lazyLoad(){super._lazyLoad(),this.nav.next.textContent="Start Game",this.nav.next.onclick=e=>{const t=this.parseArgsFromGui();this.top.clientIsGroupHost&&this.top.sockets.groupSocket.emit(w.m4.CREATE_GAME,t)}}}Object.freeze(B),Object.freeze(B.prototype);const Y=l.Y.Screen.Impl.GroupLobby.Class;class j extends d{get socket(){return this.top.sockets.groupSocket}_lazyLoad(){this._players=new Map,this._createInputs(),this.nav.prev.textContent="Return To Joiner",this.teamsElem=a.R.mkEl("div",[Y.SEC_TEAMS]),this.baseElem.appendChild(this.teamsElem),this.teamElems=new Map,a.R.propNoWrite(this,["_players","teamsElem","teamElems","in"]);{const e=this.nav.next;e.textContent="Setup Game",e.onclick=()=>{this.requestGoToScreen(d.Id.SETUP_ONLINE,{})},this.baseElem.appendChild(e)}}_createInputs(){var e;const t=a.R.mkEl("div",[l.Y.General.Class.INPUT_GROUP,Y.SEC_CLIENT_INFO]),s=a.R.mkEl("input",[l.Y.General.Class.INPUT_GROUP_ITEM],{type:"text",minLength:1,maxLength:c.J5.Username.MAX_LENGTH,pattern:c.J5.Username.REGEXP.source,spellcheck:!1,value:null!==(e=this.top.storage.Local.username)&&void 0!==e?e:"",onchange:this._submitInputs.bind(this)});t.appendChild(s);const n=a.R.mkEl("input",[l.Y.General.Class.INPUT_GROUP_ITEM],{type:"number",inputMode:"numeric",min:"0",max:"0",step:"1",value:"0",onchange:this._submitInputs.bind(this)});n.classList.add(),t.appendChild(n);const r=a.R.mkEl("select",[]);this.in=Object.freeze({username:s,teamId:n,avatar:r}),this.baseElem.appendChild(t)}_submitInputs(){this.in.username.validity.valid&&this.in.teamId.validity.valid&&(this.top.storage.Local.username=this.in.username.value,this.top.storage.Local.avatar=this.in.avatar.value,this.socket.emit(w.ZA.Socket.UserInfoChange.EVENT_NAME,{username:this.in.username.value,teamId:parseInt(this.in.teamId.value),avatar:c.J5.Avatar.LOREM_IPSUM}))}_abstractOnBeforeEnter(e,t){return(0,i.mG)(this,void 0,void 0,(function*(){"forward"===e&&(this.nav.next.disabled=!this.top.clientIsGroupHost,this._players.clear(),this.teamElems.clear(),this.teamsElem.textContent="",this._submitInputs(),this.socket.on(w.ZA.Socket.UserInfoChange.EVENT_NAME,this._onUserInfoChange.bind(this))),this.socket.once(w.m4.CREATE_GAME,(()=>{console.log("group create game socket. now waiting for ctor args"),this.top.sockets.gameSocketConnect(t.groupName,{passphrase:t.groupPassphrase}).once(w.JD.CREATE_GAME,(e=>{this.requestGoToScreen(d.Id.PLAY_ONLINE,e)}))}))}))}getRecommendedFocusElem(){let e=this.in.username.validity.valid?this.in.teamId.validity.valid?void 0:this.in.teamId:this.in.username;return void 0===e&&(e=this.top.clientIsGroupHost?this.nav.next:this.in.teamId),e}_abstractOnBeforeLeave(e){return e===d.NavDir.BACKWARD&&this.socket.removeListener(w.m4.CREATE_GAME),!0}_onUserInfoChange(e){Object.entries(e).forEach((([e,t])=>{const s=this._players.get(e);if(!s||1!==this.teamElems.get(s.teamId).childElementCount||void 0!==t&&t.teamId===s.teamId||(this.teamElems.get(s.teamId).remove(),this.teamElems.delete(s.teamId)),t&&!this.teamElems.has(t.teamId)){const e=a.R.mkEl("div",[Y.TEAM]);this.teamElems.set(t.teamId,e),e.onclick=e=>{this.in.teamId.value=t.teamId.toString()},this.teamsElem.appendChild(e)}if(void 0===t)s.base.remove(),this._players.delete(e);else if(void 0===s){const s=new j.UserInfo(t);this._players.set(e,s),this.teamElems.get(t.teamId).appendChild(s.base)}else s.update(t)})),this.in.teamId.max=Object.keys(this._players).length.toString()}}!function(e){var t,s,n;t=new WeakMap,s=new WeakMap,n=new WeakMap,e.UserInfo=class{constructor(e){t.set(this,void 0),s.set(this,void 0),n.set(this,void 0),this.base=a.R.mkEl("div",[Y.PLAYER]);const r=()=>{const e=a.R.mkEl("div",[]);return this.base.appendChild(e),e};this.el=Object.freeze({username:r(),teamId:r(),avatar:r()}),this.el.username.classList.add(Y.PLAYER_NAME),this.username=e.username,this.teamId=e.teamId,a.R.propNoWrite(this,["base","el"])}update(e){this.username=e.username,this.teamId=e.teamId,this.avatar=e.avatar}get username(){return(0,i.Q_)(this,t)}set username(e){this.el.username.textContent=e,(0,i.YH)(this,t,e)}get teamId(){return(0,i.Q_)(this,s)}set teamId(e){this.el.teamId.textContent=e.toString(),(0,i.YH)(this,s,e)}get avatar(){return(0,i.Q_)(this,n)}set avatar(e){(0,i.YH)(this,n,e),this.el.avatar}}}(j||(j={})),a.R.protoNoEnum(j,["_createInputs","_submitInputs"]),Object.freeze(j),Object.freeze(j.prototype);class D extends C{constructor(){super(...arguments),this.askConfirmBeforeLeave=!1,this.wantsAutoPause=!1}get socket(){return this.top.sockets.gameSocket}_lazyLoad(){super._lazyLoad(),this.nav.prev.innerHTML="Return To Lobby"}_abstractOnBeforeLeave(e){const t=super._abstractOnBeforeLeave(e);return t&&(this.socket.emit(w.JD.RETURN_TO_LOBBY),this.socket.removeAllListeners()),t}_createNewGame(e){return(0,i.mG)(this,void 0,void 0,(function*(){const t=new((yield Promise.all([s.e(929),s.e(775)]).then(s.bind(s,25))).OnlineGame)(this._onGameBecomeOver.bind(this),this.top.sockets.gameSocket,e);return this.top.sockets.gameSocket.on(w.JD.UNPAUSE,(()=>{this._statusBecomePlaying()})).on(w.JD.PAUSE,(()=>{this._statusBecomePaused()})).on(w.JD.RETURN_TO_LOBBY,(e=>{void 0===e&&this.nav.prev.click()})),Promise.resolve(t)}))}_onGameBecomeOver(){super._onGameBecomeOver()}}var x,z,M,F,W;Object.freeze(D),Object.freeze(D.prototype);class V{constructor(e,t){x.set(this,void 0),z.set(this,void 0),(0,i.YH)(this,z,e.transition),t.setAttribute("role","presentation");const s=d.Id,n=e,r=t,o=Object.freeze(this.goToScreen.bind(this));this.dict=Object.freeze({[s.HOME]:new h(s.HOME,n,r,o),[s.HOW_TO_PLAY]:new u(s.HOW_TO_PLAY,n,r,o),[s.HOW_TO_HOST]:new m(s.HOW_TO_HOST,n,r,o),[s.COLOUR_CTRL]:new g(s.COLOUR_CTRL,n,r,o),[s.SETUP_OFFLINE]:new N(s.SETUP_OFFLINE,n,r,o),[s.PLAY_OFFLINE]:new P(s.PLAY_OFFLINE,n,r,o),[s.GROUP_JOINER]:new U(s.GROUP_JOINER,n,r,o),[s.SETUP_ONLINE]:new B(s.SETUP_ONLINE,n,r,o),[s.GROUP_LOBBY]:new j(s.GROUP_LOBBY,n,r,o),[s.PLAY_ONLINE]:new D(s.PLAY_ONLINE,n,r,o)}),a.R.propNoWrite(this,["dict"]);const l=d.NavTree[window.location.hash.slice(1)];window.setTimeout((()=>{var e;this.goToScreen(null!==(e=null==l?void 0:l.href)&&void 0!==e?e:d.Id.HOME,{})}),75),window.addEventListener("popstate",(e=>{this.goToScreen(window.history.state.screenId,{})}))}goToScreen(e,t){return(0,i.mG)(this,void 0,void 0,(function*(){const s=this.currentScreen,n=this.dict[e];if(s===n)throw new Error("never");(0,i.YH)(this,x,n);const r=d.GET_NAV_DIR({curr:null==s?void 0:s.screenId,dest:e});return!(void 0!==s&&!s._leave(r)||(yield(0,i.Q_)(this,z).do({beforeUnblurAwait:n._enter(r,t),beforeUnblur:()=>{var e;null==s||s._onAfterLeave(),n._onAfterEnter(),null===(e=n.getRecommendedFocusElem())||void 0===e||e.focus()}}),0))}))}get currentScreen(){return(0,i.Q_)(this,x)}}x=new WeakMap,z=new WeakMap,Object.freeze(V),Object.freeze(V.prototype);class K{constructor(){M.set(this,void 0),this.baseElem=document.getElementById(l.Y.Screen.Id.SCREEN_TINT),(0,i.YH)(this,M,void 0),a.R.propNoWrite(this,["baseElem"])}do(e){var t;return(0,i.YH)(this,M,(null!==(t=(0,i.Q_)(this,M))&&void 0!==t?t:Promise.resolve()).then((()=>this._atomicDo(e)))),(0,i.Q_)(this,M)}_atomicDo(e){return(0,i.mG)(this,void 0,void 0,(function*(){const t=this.baseElem.style;yield this._triggerCssTransition((()=>{t.pointerEvents="all",t.opacity="1.0"})),void 0!==e.intermediateTransitionTrigger&&(yield this._triggerCssTransition((()=>{e.intermediateTransitionTrigger()}))),yield e.beforeUnblurAwait,void 0!==e.beforeUnblur&&e.beforeUnblur(),yield this._triggerCssTransition((()=>{t.pointerEvents="none",t.opacity="0.0"}))}))}_triggerCssTransition(e){return new Promise(((t,s)=>{this.baseElem.addEventListener("transitionend",(()=>t()),{once:!0}),e()}))}}M=new WeakMap,a.R.protoNoEnum(K,["_atomicDo","_triggerCssTransition"]),Object.freeze(K),Object.freeze(K.prototype);class J{constructor(){F.set(this,void 0),(0,i.YH)(this,F,{joiner:void 0,group:void 0,game:void 0})}get socketIo(){return new Promise(((e,t)=>{const s=a.R.mkEl("script",[]);s.onload=()=>{e(io)},s.src=document.getElementById("socket.io-preload").href,document.body.appendChild(s)}))}get joinerSocket(){return(0,i.Q_)(this,F).joiner}get groupSocket(){return(0,i.Q_)(this,F).group}get gameSocket(){return(0,i.Q_)(this,F).game}joinerSocketConnect(e){return(0,i.mG)(this,void 0,void 0,(function*(){const t=(yield this.socketIo).Manager(e.serverUrl.toString(),{reconnectionAttempts:w.ZA.GameServerReconnectionAttempts}).socket(w.b4.Nsps.GROUP_JOINER);return this._registerSocket(t,"joiner"),t}))}groupSocketConnect(e,t){return this._groupSocketHelper("group",e,t)}gameSocketConnect(e,t){return this._groupSocketHelper("game",e,t)}_groupSocketHelper(e,t,s){let n;switch(e){case"group":n=w.b4.Nsps.GROUP_LOBBY_PREFIX;break;case"game":n=w.b4.Nsps.GROUP_GAME_PREFIX;break;default:throw new TypeError("never")}const r=this.joinerSocket.io.socket(n+t,s);return this._registerSocket(r,e),r}_registerSocket(e,t){(0,i.Q_)(this,F)[t]=e;const s=()=>{e.removeAllListeners(),e.close(),(0,i.Q_)(this,F)[t]=void 0};e.on("connect_error",(e=>{s()})).on("disconnect",(e=>{"io server disconnect"!==e&&"io client disconnect"!==e||s()}))}}F=new WeakMap,a.R.protoNoEnum(J,["joinerSocketConnect","groupSocketConnect","gameSocketConnect","_groupSocketHelper","_registerSocket"]),Object.freeze(J),Object.freeze(J.prototype);class Q{constructor(){W.set(this,void 0),this.defaultDocTitle=document.title,this.webpageHostType=window.location.origin.match(/github\.io/)?Q.WebpageHostType.GITHUB:window.location.protocol.startsWith("file")?Q.WebpageHostType.FILESYSTEM:Q.WebpageHostType.SNAKEY_SERVER,a.R.propNoWrite(this,["defaultDocTitle","webpageHostType"]),this.storage=n,this.sockets=new J,this.transition=new K,a.R.propNoWrite(this,["storage","sockets","transition"]);const e=document.getElementById(l.Y.Screen.Id.ALL_SCREENS);if(!e)throw new Error("never");a.R.prependComment(e,"ALL SCREENS CONTAINER"),(0,i.YH)(this,W,new V(this,e)),a.R.propNoWrite(this,[])}get clientIsGroupHost(){return(0,i.Q_)(this,W).dict.groupJoiner.clientIsGroupHost}toast(e){console.info(e)}get game(){var e;return null!==(e=(0,i.Q_)(this,W).dict.playOffline.probeCurrentGame)&&void 0!==e?e:(0,i.Q_)(this,W).dict.playOnline.probeCurrentGame}get currentScreen(){return(0,i.Q_)(this,W).currentScreen}}W=new WeakMap,function(e){let t;!function(e){e.GITHUB="github",e.FILESYSTEM="filesystem",e.SNAKEY_SERVER="sk-server"}(t=e.WebpageHostType||(e.WebpageHostType={}))}(Q||(Q={})),Object.freeze(Q),Object.freeze(Q.prototype),Object.freeze(Object.prototype);const q=new Q,X=q;function Z(){return q.currentScreen}function $(){return q.game}console.log("%c🩺 welcome! 🐍","font:700 2.3em /1.5 monospace; margin:0.4em; border:0.3em solid black;padding:0.4em; color:white; background-color:#3f5e77; border-radius:0.7em; "),q.webpageHostType===Q.WebpageHostType.GITHUB&&"serviceWorker"in navigator&&window.addEventListener("load",(function(){navigator.serviceWorker.register("/ServiceWorker.js").then((e=>{console.log("ServiceWorker registration successful with scope: ",e.scope)}),(e=>{console.log("ServiceWorker registration failed: ",e)}))}))},655:(e,t,s)=>{function n(e,t,s,n){return new(s||(s=Promise))((function(r,o){function i(e){try{l(n.next(e))}catch(e){o(e)}}function a(e){try{l(n.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?r(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(i,a)}l((n=n.apply(e,t||[])).next())}))}function r(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)}function o(e,t,s){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,s),s}s.d(t,{mG:()=>n,Q_:()=>r,YH:()=>o}),Object.create,Object.create}},o={};function i(e){if(o[e])return o[e].exports;var t=o[e]={exports:{}};return r[e](t,t.exports,i),t.exports}return i.m=r,i.d=(e,t)=>{for(var s in t)i.o(t,s)&&!i.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,s)=>(i.f[s](e,t),t)),[])),i.u=e=>"chunk/"+({184:"lang/English-ts",227:"lang/Korean-ts",285:"lang/Morse-ts",410:"lang/Japanese-ts",755:"game/offline",775:"game/online",858:"lang/Emote-ts"}[e]||e)+".js",i.miniCssF=e=>826===e?"_barrel.css":"chunk/"+({184:"lang/English-ts",227:"lang/Korean-ts",285:"lang/Morse-ts",410:"lang/Japanese-ts",755:"game/offline",775:"game/online",858:"lang/Emote-ts"}[e]||e)+".css",i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="snakey3:",i.l=(s,n,r)=>{if(e[s])e[s].push(n);else{var o,a;if(void 0!==r)for(var l=document.getElementsByTagName("script"),c=0;c{o.onerror=o.onload=null,clearTimeout(h);var r=e[s];if(delete e[s],o.parentNode&&o.parentNode.removeChild(o),r&&r.forEach((e=>e(n))),t)return t(n)},h=setTimeout(d.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=d.bind(null,o.onerror),o.onload=d.bind(null,o.onload),a&&document.head.appendChild(o)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="./",s=e=>new Promise(((t,s)=>{var n=i.miniCssF(e),r=i.p+n;if(((e,t)=>{for(var s=document.getElementsByTagName("link"),n=0;n{var r=document.createElement("link");r.rel="stylesheet",r.type="text/css",r.onerror=r.onload=o=>{if(r.onerror=r.onload=null,"load"===o.type)s();else{var i=o&&o.target&&o.target.href||t,a=new Error("Loading CSS chunk "+e+" failed.\n("+i+")");a.code="CSS_CHUNK_LOAD_FAILED",a.request=i,r.parentNode.removeChild(r),n(a)}},r.href=t,document.head.appendChild(r)})(e,r,t,s)})),n={826:0},i.f.miniCss=(e,t)=>{n[e]?t.push(n[e]):0!==n[e]&&{755:1,775:1}[e]&&t.push(n[e]=s(e).then((()=>{n[e]=0}),(t=>{throw delete n[e],t})))},(()=>{var e={826:0};i.f.j=(t,s)=>{var n=i.o(e,t)?e[t]:void 0;if(0!==n)if(n)s.push(n[2]);else{var r=new Promise(((s,r)=>{n=e[t]=[s,r]}));s.push(n[2]=r);var o=i.p+i.u(t),a=new Error;i.l(o,(s=>{if(i.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var r=s&&("load"===s.type?"missing":s.type),o=s&&s.target&&s.target.src;a.message="Loading chunk "+t+" failed.\n("+r+": "+o+")",a.name="ChunkLoadError",a.type=r,a.request=o,n[1](a)}}),"chunk-"+t)}};var t=self.webpackChunksnakey3=self.webpackChunksnakey3||[],s=t.push.bind(t);t.push=t=>{for(var n,r,[o,a,l]=t,c=0,p=[];c{var e,t={406:(e,t,s)=>{"use strict";var r;s.r(t),s.d(t,{JsUtils:()=>r}),function(e){let t;function s(e,t,s){t.forEach((t=>{if(!Object.getOwnPropertyNames(e).includes(t)){const s=`\`${e.__proto__.constructor.name}\` instance has no property named "${t}"`;throw new TypeError(s)}Object.defineProperty(e,t,s)}))}e.applyMixins=function(e,t){t.forEach((t=>{Object.getOwnPropertyNames(t.prototype).forEach((s=>{Object.defineProperty(e.prototype,s,Object.getOwnPropertyDescriptor(t.prototype,s))}))}))},e.deepFreeze=function e(t){return function(t){for(const s of Object.getOwnPropertyNames(t)){const r=t[s];"object"==typeof r&&e(r)}Object.freeze(t)}(t),t},function(e){let t;!function(e){e.access=function(e,t,s){s.enumerable=!1},e.cyclic=function(e,t,s){s.enumerable=!1}}(t=e.NonEnumerable||(e.NonEnumerable={}))}(t=e.Decor||(e.Decor={})),e.protoNoEnum=function(e,t){t.forEach((t=>{if(!Object.getOwnPropertyNames(e.prototype).includes(t)){const s=`\`${e.name}\` prototype has no property named "${t}"`;throw new TypeError(s)}Object.defineProperty(e.prototype,t,{enumerable:!1})}))},e.instNoEnum=function(e,t){s(e,t,{enumerable:!1})},e.propNoWrite=function(e,t){s(e,t,{writable:!1})},e.prependComment=function(e,t){e.parentNode.insertBefore(document.createComment(" "+t+" "),e)},e.camelCaseTransforms=function(e){const t=e.replace(/[A-Z]/g,(e=>" "+e.toLowerCase()));return Object.freeze({spaceyLowercase:t,spaceyUppercase:t.toUpperCase(),spaceyCapitalized:t.split(" ").map((e=>e.charAt(0).toUpperCase()+e.substring(1))).join(" ")})},e.mkEl=function(e,t,s){const r=document.createElement(e);try{Object.seal(r)}catch(e){}return r.classList.add(...t),"button"===e?r.type="button":"a"===e&&(r.rel="noopener"),void 0!==s&&Object.assign(r,s),r}}(r||(r={})),Object.freeze(r)},502:(e,t,s)=>{"use strict";s.r(t),s.d(t,{SkServer:()=>r,Group:()=>i,GroupEv:()=>a,GameEv:()=>o});class r{}!function(e){let t;e.PROTOCOL="http://",e.DEFAULT_PORT=8080,function(e){e.GROUP_JOINER="/joiner.",e.GROUP_LOBBY_PREFIX="/group.",e.GROUP_GAME_PREFIX="/group-game."}(t=e.Nsps||(e.Nsps={}))}(r||(r={})),Object.freeze(r),Object.freeze(r.prototype);class i{}var a,o;!function(e){let t,s,r,i;!function(e){let t;!function(e){e.EVENT_NAME="group-lobby-user-info-change"}(t=e.UserInfoChange||(e.UserInfoChange={}))}(t=e.Socket||(e.Socket={})),function(e){e.REGEXP=/(?:[a-zA-Z0-9:-]+)/,e.MaxLength=30}(s=e.Name||(e.Name={})),function(e){e.REGEXP=/(?:[a-zA-Z0-9:-]*)/,e.MaxLength=30}(r=e.Passphrase||(e.Passphrase={})),e.GameServerReconnectionAttempts=2,e.DEFAULT_TTL=20,function(e){e.EVENT_NAME="group-exist";class t{constructor(e,t){this.groupName=e,this.passphrase=t}}let s;e.RequestCreate=t,function(e){let t;!function(e){e.OKAY="okay",e.NOPE="nope"}(t=e.Response||(e.Response={}))}(t=e.RequestCreate||(e.RequestCreate={})),function(e){e.IN_LOBBY="in-lobby",e.IN_GAME="in-game",e.DELETE="delete"}(s=e.Status||(e.Status={}))}(i=e.Exist||(e.Exist={}))}(i||(i={})),Object.freeze(i),Object.freeze(i.prototype),function(e){e.CREATE_GAME="group-game-create"}(a||(a={})),function(e){e.CREATE_GAME="game-create",e.RESET="game-reset",e.UNPAUSE="game-unpause",e.PAUSE="game-pause",e.RETURN_TO_LOBBY="game-return-to-lobby"}(o||(o={}))},951:(e,t,s)=>{"use strict";s.d(t,{J5:()=>r,Uo:()=>i}),Object.freeze({behavior:"smooth",block:"center",inline:"center"});class r{}!function(e){let t,s,r;e.Family=Object.freeze({HUMAN:"HUMAN",CHASER:"CHASER"}),e.Family,function(e){e.NULL=void 0}(t=e.Id||(e.Id={})),function(e){e.REGEXP=/[ a-zA-Z0-9:-]+/,e.MAX_LENGTH=15}(s=e.Username||(e.Username={})),function(e){e.LOREM_IPSUM="lorem-ipsum"}(r=e.Avatar||(e.Avatar={})),function(e){const t=Object.values(e).filter((e=>"string"==typeof e));e.GET_RANDOM=function(){return t[Math.random()*t.length]}}(r=e.Avatar||(e.Avatar={})),e.MoveType=Object.freeze({NORMAL:"NORMAL",BOOST:"BOOST"}),e.MoveType}(r||(r={})),Object.freeze(r),Object.freeze(r.prototype);class i{}!function(e){let t,s,r;!function(e){e.REGEXP=new RegExp("^[a-zA-Z0-9!@#$%^&*()-_=+;:'\"\\|,.<>/?]+$")}(t=e.Seq||(e.Seq={})),function(e){e.NULL=Object.freeze({char:"",seq:""})}(s=e.CharSeqPair||(e.CharSeqPair={})),function(e){e.MAX=4}(r=e.WeightExaggeration||(e.WeightExaggeration={})),e.CHAR_HIT_COUNT_SEED_CEILING=5,e._RemapTemplates=Object.freeze({IDENTITY:e=>e,TO_LOWER:e=>e.toLowerCase()}),e._RemapTemplates,e.FrontendDescs=Object.freeze([{id:"engl-low",module:"English",export:"Lowercase",numLeaves:26,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"English Lowercase (qwerty)",blurb:""},{id:"engl-mix",module:"English",export:"MixedCase",numLeaves:52,remapFunc:e._RemapTemplates.IDENTITY,displayName:"English Mixed-Case (Querty)",blurb:""},{id:"japn-hir",module:"Japanese",export:"Hiragana",numLeaves:71,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Hiragana",blurb:""},{id:"japn-kat",module:"Japanese",export:"Katakana",numLeaves:70,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Katakana",blurb:""},{id:"kore-dub",module:"Korean",export:"Dubeolsik",numLeaves:9177,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Dubeolsik (두벌식 키보드)",blurb:"The most common keyboard layout, and South Korea's only Hangul standard since 1969. Consonants are on the left, and vowels on the right."},{id:"kore-sub",module:"Korean",export:"Sebeolsik",numLeaves:10206,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Sebeolsik (세벌식 최종 키보드)",blurb:"Another Hangul keyboard layout used in South Korea, and the final Sebeolsik layout designed by Dr. Kong Byung Woo, hence the name. Syllable-initial consonants are on the right, final consonants on the left, and vowels in the middle. It is more ergonomic than the dubeolsik, but not widely used."},{id:"kore-rom",module:"Korean",export:"Romanization",numLeaves:3990,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Korean Revised Romanization",blurb:"The Revised Romanization of Korean (국어의 로마자 표기법; 國語의 로마字 表記法) is the official South Korean language romanization system. It was developed by the National Academy of the Korean Language from 1995, and was released on 7 July 2000 by South Korea's Ministry of Culture and Tourism"},{id:"engl-cell-enc",module:"English",export:"OldCellphone.Encode",numLeaves:8,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Old Cellphone Keyboard",blurb:""}].map((e=>Object.freeze(e)))),e.FrontendDescs,e.GET_FRONTEND_DESC_BY_ID=function(t){return e.FrontendDescs.find((e=>e.id===t))}}(i||(i={})),Object.freeze(i),Object.freeze(i.prototype)},985:(e,t,s)=>{"use strict";s.r(t),s.d(t,{Grid:()=>a});var r=s(406),i=s(495);class a{constructor(e){this.static=e.gridClass,this.dimensions=e.dimensions,this.tile=new i.N(this),r.JsUtils.propNoWrite(this,["static","dimensions","tile"])}get area(){return this.static.getArea(this.dimensions)}reset(){this.forEachTile((e=>e.reset()))}getDestsFromSourcesTo(e){return Array.from(new Set(this.tile.sourcesTo(e).get.flatMap((e=>this.tile.destsFrom(e.coord).get))))}getRandomCoord(){return this.static.getRandomCoord(this.dimensions)}}!function(e){e.getImplementation=t=>e._Constructors[t]}(a||(a={}))},789:(e,t,s)=>{"use strict";s.r(t),s.d(t,{Tile:()=>h});var r,i,a,o,n=s(780),l=s(406),c=s(951);class h{constructor(e){r.set(this,void 0),i.set(this,void 0),a.set(this,void 0),o.set(this,void 0),this.coord=e,l.JsUtils.propNoWrite(this,["coord"]),(0,n.__classPrivateFieldSet)(this,r,c.J5.Id.NULL)}reset(){this.evictOccupant(),this.lastKnownUpdateId=0,this.freeHealth=0,this.setLangCharSeqPair(c.Uo.CharSeqPair.NULL)}_setOccupant(e,t){(0,n.__classPrivateFieldSet)(this,r,e)}get isOccupied(){return this.occupantId!==c.J5.Id.NULL}evictOccupant(){(0,n.__classPrivateFieldSet)(this,r,c.J5.Id.NULL)}get occupantId(){return(0,n.__classPrivateFieldGet)(this,r)}get freeHealth(){return(0,n.__classPrivateFieldGet)(this,i)}set freeHealth(e){(0,n.__classPrivateFieldSet)(this,i,e)}setLangCharSeqPair(e){(0,n.__classPrivateFieldSet)(this,a,e.char),(0,n.__classPrivateFieldSet)(this,o,e.seq)}get langChar(){return(0,n.__classPrivateFieldGet)(this,a)}get langSeq(){return(0,n.__classPrivateFieldGet)(this,o)}}r=new WeakMap,i=new WeakMap,a=new WeakMap,o=new WeakMap,Object.freeze(h),Object.freeze(h.prototype)},495:(e,t,s)=>{"use strict";s.d(t,{N:()=>a});var r,i=s(780);class a{constructor(e){r.set(this,void 0),(0,i.__classPrivateFieldSet)(this,r,e),Object.freeze(this)}get _source(){return(0,i.__classPrivateFieldGet)(this,r)}at(...e){return(0,i.__classPrivateFieldGet)(this,r)._getTileAt(...e)}destsFrom(...e){return new o((0,i.__classPrivateFieldGet)(this,r)._getTileDestsFrom(...e))}sourcesTo(...e){return new o((0,i.__classPrivateFieldGet)(this,r)._getTileSourcesTo(...e))}}r=new WeakMap,Object.freeze(a),Object.freeze(a.prototype);class o{constructor(e){this.contents=e,Object.seal(this)}get occupied(){return this.contents=this.contents.filter((e=>e.isOccupied)),this}get unoccupied(){return this.contents=this.contents.filter((e=>!e.isOccupied)),this}get get(){return this.contents}}Object.freeze(o),Object.freeze(o.prototype)},504:(e,t,s)=>{"use strict";var r;s.r(t),s.d(t,{Game:()=>r}),function(e){let t,s;!function(e){e.SERVER="SERVER",e.ONLINE="ONLINE",e.OFFLINE="OFFLINE"}(t=e.Type||(e.Type={})),Object.freeze(t),function(e){e.PLAYING="PLAYING",e.PAUSED="PAUSED",e.OVER="OVER"}(s=e.Status||(e.Status={})),Object.freeze(s),e.K=Object.freeze({HEALTH_UPDATE_CHANCE:.1,AVERAGE_HEALTH_TO_SPAWN_ON_TILE:1,PORTION_OF_MOVES_THAT_ARE_BOOST:.4,HEALTH_COST_OF_BOOST(e,t){const s=t(this.AVERAGE_HEALTH_TO_SPAWN_ON_TILE/e);return this.AVERAGE_HEALTH_TO_SPAWN_ON_TILE/s/this.PORTION_OF_MOVES_THAT_ARE_BOOST},HEALTH_EFFECT_FOR_DOWNED_PLAYER:.6,EVENT_RECORD_WRAPPING_BUFFER_LENGTH:128,EVENT_RECORD_FORWARD_WINDOW_LENGTH:64})}(r||(r={})),Object.freeze(r)},671:(e,t,s)=>{"use strict";var r;s.r(t),s.d(t,{EventRecordEntry:()=>r}),function(e){e.EVENT_ID_REJECT=-1}(r||(r={})),Object.freeze(r)},699:(e,t,s)=>{"use strict";s.r(t),s.d(t,{PlayerActionEvent:()=>r});var r,i=s(671);!function(e){e.INITIAL_REQUEST_ID=-1,e.EVENT_NAME=Object.freeze({BUBBLE:"player-bubble",MOVEMENT:"player-movement"});class t{constructor(e,t){this.eventId=i.EventRecordEntry.EVENT_ID_REJECT,this.affectedNeighbours=void 0,this.playerId=e,this.playerLastAcceptedRequestId=t}}e.Bubble=t,e.Movement=class extends t{constructor(e,t,s,r){super(e,t),this.newPlayerHealth=void 0,this.tileHealthModDescs=void 0,this.destModDesc={coord:s.coord,lastKnownUpdateId:s.lastKnownUpdateId,newCharSeqPair:void 0,newFreeHealth:void 0},this.moveType=r}}}(r||(r={})),Object.freeze(r)},604:(e,t,s)=>{"use strict";s.r(t),s.d(t,{GamepartManager:()=>j});var r,i=s(780),a=s(406),o=s(979),n=s(504);!function(e){let t;!function(e){e.EUCLID2="EUCLID2",e.BEEHIVE="BEEHIVE"}(t=e.System||(e.System={})),e.equals=function(e,t){return e._equals(t)}}(r||(r={})),Object.freeze(r);var l=s(216);class c extends l.Player{constructor(e,t){if(super(e,t),e.gameType===n.Game.Type.ONLINE)throw new TypeError("OnlineGames should be using regular Players instead.")}_notifyGameNowPlaying(){this.delayedMovementContinue()}_notifyGameNowPaused(){this.game.cancelTimeout(this._scheduledMovementCallbackId),this._scheduledMovementCallbackId=void 0}_notifyGameNowOver(){this.game.cancelTimeout(this._scheduledMovementCallbackId),this._scheduledMovementCallbackId=void 0}movementContinue(){const e=this.computeDesiredDest();this._nextMovementTimerMultiplier=this.game.grid.tile.at(e).langSeq.length,this.makeMovementRequest(this.game.grid.getUntToward(e,this.coord),this.getNextMoveType()),this.delayedMovementContinue()}delayedMovementContinue(){this._scheduledMovementCallbackId=this.game.setTimeout(this.movementContinue.bind(this),this.computeNextMovementTimer()*this._nextMovementTimerMultiplier)}}!function(e){e.of=(t,s)=>{const r=s.familyId;return new e._Constructors[r](t,s)}}(c||(c={})),a.JsUtils.protoNoEnum(c,["movementContinue"]);var h=s(951);class d{constructor(e){const t=[];for(const s of e)t[s]=new d.Entry;this.entries=t,a.JsUtils.propNoWrite(this,["entries"])}reset(){for(const e of this.entries)e.reset()}}!function(e){class t{constructor(){this.moveCounts={}}reset(){this.totalHealthPickedUp=0,Object.getOwnPropertyNames(h.J5.MoveType).forEach((e=>{this.moveCounts[e]=0}))}}e.Entry=t,Object.freeze(t),Object.freeze(t.prototype)}(d||(d={})),Object.freeze(d),Object.freeze(d.prototype);var u,p,m,E,_=s(671),g=(s(699),s(473));class f{constructor(e,t,s){u.set(this,void 0),p.set(this,void 0),m.set(this,void 0),this.gameType=e;const r=this._getGridImplementation(s.coordSys);this.grid=new r({gridClass:r,tileClass:t.tileClass,coordSys:s.coordSys,dimensions:s.gridDimensions}),(0,i.__classPrivateFieldSet)(this,u,t.onGameBecomeOver),this.langFrontend=h.Uo.GET_FRONTEND_DESC_BY_ID(s.langId),this._playerStatusCtor=t.playerStatusCtor,this.players=this.createPlayers(s),this.operators=Object.freeze(this.players.filter((e=>e.isALocalOperator))),this.setCurrentOperator(0);{const e=[];if(this.players.forEach((t=>{e[t.teamId]||(e[t.teamId]=[]),e[t.teamId].push(t)})),this.teams=e.map(((e,t)=>new g.S(t,e))),this.teams.every((e=>e.id===g.S.ElimOrder.IMMORTAL)))throw new Error("All teams are immortal. The game will never end.")}a.JsUtils.propNoWrite(this,["gameType","grid","langFrontend","players","operators","teams","_playerStatusCtor"]),this.players.forEach((e=>e._afterAllPlayersConstruction()))}reset(){return this.grid.reset(),(0,i.__classPrivateFieldSet)(this,m,n.Game.Status.PAUSED),Promise.resolve()}createPlayers(e){const t=e.playerDescs=this.gameType===n.Game.Type.ONLINE?e.playerDescs:l.Player.CtorArgs.finalize(e.playerDescs);return Object.freeze(t.map((e=>e.familyId===l.Player.Family.HUMAN?e.isALocalOperator?this._createOperatorPlayer(e):new l.Player(this,e):this._createArtifPlayer(e))))}serializeResetState(){const e=[],t=this.players.map((e=>e.coord)),s=[];return this.grid.forEachTile((t=>{t.lastKnownUpdateId++,e.push({char:t.langChar,seq:t.langSeq}),t.freeHealth&&s.push({coord:t.coord,health:t.freeHealth})})),{csps:e,playerCoords:t,healthCoords:s}}deserializeResetState(e){this.grid.forEachTile(((t,s)=>{t.setLangCharSeqPair(e.csps[s]),t.lastKnownUpdateId++})),e.playerCoords.forEach(((e,t)=>{this.players[t].reset(this.grid.tile.at(e))})),e.healthCoords.forEach((e=>{this.grid.tile.at(e.coord).freeHealth=e.health}))}get currentOperator(){return(0,i.__classPrivateFieldGet)(this,p)}setCurrentOperator(e){const t=this.operators[e];this.currentOperator!==t&&(t._notifyWillBecomeCurrent(),(0,i.__classPrivateFieldSet)(this,p,t))}get status(){return(0,i.__classPrivateFieldGet)(this,m)}statusBecomePlaying(){if(this.status!==n.Game.Status.PLAYING){if(this.status!==n.Game.Status.PAUSED)throw new Error("Can only resume a game that is currently paused.");this.players.forEach((e=>{e._notifyGameNowPlaying()})),this._abstractStatusBecomePlaying(),(0,i.__classPrivateFieldSet)(this,m,n.Game.Status.PLAYING)}else console.log("[statusBecomePlaying]: Game is already playing")}statusBecomePaused(){this.status!==n.Game.Status.PAUSED?this.status!==n.Game.Status.OVER&&(this.players.forEach((e=>{e._notifyGameNowPaused()})),this._abstractStatusBecomePaused(),(0,i.__classPrivateFieldSet)(this,m,n.Game.Status.PAUSED)):console.log("[statusBecomePaused]: Game is already paused")}statusBecomeOver(){if(this.status!==n.Game.Status.PLAYING)throw new Error("Can only end a game that is currently playing.");this.players.forEach((e=>{e._notifyGameNowOver()})),this._abstractStatusBecomeOver(),(0,i.__classPrivateFieldSet)(this,m,n.Game.Status.OVER),(0,i.__classPrivateFieldGet)(this,u).call(this),console.log("game is over!")}_abstractStatusBecomePlaying(){}_abstractStatusBecomePaused(){}_abstractStatusBecomeOver(){}}u=new WeakMap,p=new WeakMap,m=new WeakMap,a.JsUtils.protoNoEnum(f,["_abstractStatusBecomePlaying","_abstractStatusBecomePaused","_abstractStatusBecomeOver"]),Object.freeze(f),Object.freeze(f.prototype);class v extends f{constructor(e,t,s){super(e,t,s),E.set(this,void 0),this.eventRecordBitmap=[]}reset(){const e=super.reset();return this.eventRecordBitmap.fill(!1,0,n.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH),(0,i.__classPrivateFieldSet)(this,E,0),e}get nextUnusedEventId(){return(0,i.__classPrivateFieldGet)(this,E)}_recordEvent(e){const t=e.eventId,s=t%n.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH;if(t===_.EventRecordEntry.EVENT_ID_REJECT)throw new TypeError("Do not try to record events for rejected requests.");if(t<0||t!==Math.trunc(t))throw new RangeError("Event ID's must only be assigned positive, integer values.");if(this.eventRecordBitmap[s])throw new Error("Event ID's must be assigned unique values.");this.eventRecordBitmap[s]=!0,this.eventRecordBitmap[(t+n.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH-n.Game.K.EVENT_RECORD_FORWARD_WINDOW_LENGTH)%n.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH]=!1,(0,i.__classPrivateFieldSet)(this,E,+(0,i.__classPrivateFieldGet)(this,E)+1)}executeTileModEvent(e,t=!0){Object.freeze(e);const s=this.grid.tile.at(e.coord);if(s.lastKnownUpdateId>e.lastKnownUpdateId)return s;if(s.lastKnownUpdateId===e.lastKnownUpdateId)throw new RangeError("never");return e.newCharSeqPair&&(s.setLangCharSeqPair(e.newCharSeqPair),t&&this.operators.filter((e=>e.tile.destsFrom().get.includes(s))).forEach((e=>e.seqBufferAcceptKey("")))),s.lastKnownUpdateId=e.lastKnownUpdateId,s.freeHealth=e.newFreeHealth,s}executePlayerMoveEvent(e){var t;const s=this.players[e.playerId],r=e.playerLastAcceptedRequestId-s.lastAcceptedRequestId;if(e.eventId===_.EventRecordEntry.EVENT_ID_REJECT)return void(0===r&&(s.requestInFlight=!1));this._recordEvent(e);const i=this.executeTileModEvent(e.destModDesc,s!==this.currentOperator);if(null===(t=e.tileHealthModDescs)||void 0===t||t.forEach((e=>{this.executeTileModEvent(e)})),r>1){if(s===this.currentOperator)throw new Error("never")}else{if(s.requestInFlight=!1,!(s===this.currentOperator?1===r:r<=1))throw new RangeError("never");s.status.health=e.newPlayerHealth.health,s.moveTo(i),s.lastAcceptedRequestId=e.playerLastAcceptedRequestId}}executePlayerBubbleEvent(e){this.players[e.playerId].requestInFlight=!1,e.eventId!==_.EventRecordEntry.EVENT_ID_REJECT&&this._recordEvent(e)}}E=new WeakMap,Object.freeze(v),Object.freeze(v.prototype);var O,y=s(985);!function(e){let t,s,r,i,a,o;e.GLOBAL_IDS={PUBLIC_GAME_HOST_URLS:"public-game-hosts-list",CURRENT_HOST_GROUPS:"current-host-groups-list"},function(e){e.Class={TEXT_SELECT_DISABLED:"text-select-disabled",FILL_PARENT:"fill-parent",CENTER_CONTENTS:"center-contents",STACK_CONTENTS:"stack-contents",INPUT_GROUP:"sk-input-group",INPUT_GROUP_ITEM:"sk-input-group-item"},e.Dataset={COLOUR_SCHEME:"skColourScheme"}}(t=e.General||(e.General={})),function(e){e.Class={BASE:"tile",POINTER_HB:"tile__pointer-hitbox",LANG_CHAR_WRAP:"tile__char",LANG_SEQ:"tile__seq"},e.Dataset={HEALTH:"health"}}(s=e.Tile||(e.Tile={})),function(e){e.Class={GRID:"game-grid",SCROLL_OUTER:"game-grid-scroll-outer",SCROLL_INNER:"game-grid-scroll-inner",IMPL_BODY:"game-grid-impl-body",KBD_DC:"game-grid-kbd-dc",KBD_DC_ICON:"game-grid-kbd-dc__icon",PAUSE_OL:"game-grid-pause-overlay",PAUSE_OL_ICON:"game-grid-pause-overlay__icon",PLAYER_IOB_ROOT:"grid-player-intersection-root"},e.Dataset={IMPL_COORD_SYS:"coordSys",GAME_STATE:{KEY:"gameState",VALUES:{PLAYING:"playing",PAUSED:"paused",OVER:"over"}}}}(r=e.Grid||(e.Grid={})),function(e){e.Class={BASE:"player",FACE:"player__face",DOWNED_OVERLAY:"player__downed-overlay",SHORT_SPOTLIGHT:"player__spotlight-short",LONG_SPOTLIGHT:"player__spotlight-long"},e.Dataset={DOWNED:{KEY:"downed",VALUES:{TEAM:"team",SELF:"self",NO:"no"}},FACE_SWATCH:"face"}}(i=e.Player||(e.Player={})),function(e){let t;e.Id={ALL_SCREENS:"all-screens-container",SCREEN_TINT:"screen-tint"},e.Class={BASE:"sk-screen",NAV_NEXT:"screen--next-button",NAV_PREV:"screen--prev-button"},e.Dataset={CURRENT:"current"},function(e){let t,s,r,i,a,o;!function(e){e.Class={BASE:"screen-home",NAV:"screen-home--nav",NAV_PLAY_OFFLINE:"screen-home--nav--play-offline",NAV_PLAY_ONLINE:"screen-home--nav--play-online",NAV_HOW_TO_PLAY:"screen-home--nav--how-to-play",NAV_HOW_TO_HOST:"screen-home--nav--how-to-host",NAV_COLOURS:"screen-home--nav--colour-scheme",NAV_VIEW_REPO:"screen-home--nav--goto-repo",NAV_RPT_ISSUE:"screen-home--nav--report-issue"}}(t=e.Home||(e.Home={})),function(e){e.Class={BASE:"screen-colour",OPTION:"screen-colour--opt",OPTION_LABEL:"screen-colour--opt-label",OPTION_LABEL_TITLE:"screen-colour--opt-label--title",OPTION_LABEL_AUTHOR:"screen-colour--opt-label--author"}}(s=e.ColourCtrl||(e.ColourCtrl={})),function(e){e.Class={BASE:"screen-play",GRID_WRAPPER:"screen-play--grid-wrapper",CONTROLS_BAR:"screen-play--controls-bar",PLAYERS_BAR:"screen-play--players-bar"}}(r=e.Play||(e.Play={})),function(e){e.Class={BASE:"screen-setup",LANG_SEL:"screen-setup--lang-sel",LANG_WEIGHT_EXAGG:"screen-setup--lang-weight-exagg"},e.Id={LANG_WEIGHT_EXAGGERATION_LIST:"screen-setup--lang-weight-exaggeration-list"}}(i=e.Setup||(e.Setup={})),function(e){e.Class={BASE:"screen-joiner",CONTENT_WRAPPER:"screen-joiner--content-wrapper",HOST_URL:"screen-joiner--host-url",GROUP_NAME:"screen-joiner--group-name",PASSPHRASE:"screen-joiner--passphrase"}}(a=e.GroupJoiner||(e.GroupJoiner={})),function(e){e.Class={BASE:"screen-lobby",SEC_CLIENT_INFO:"screen-lobby--client-info-section",SEC_TEAMS:"screen-lobby--teams-section",TEAM:"screen-lobby--team",PLAYER:"screen-lobby--player",PLAYER_NAME:"screen-lobby--player__name"}}(o=e.GroupLobby||(e.GroupLobby={}))}(t=e.Impl||(e.Impl={}))}(a=e.Screen||(e.Screen={})),function(e){e.Class={BASE:"sk-pick-one",OPT_BASE:"sk-pick-one--opt"}}(o=e.SkPickOne||(e.SkPickOne={}))}(O||(O={})),Object.freeze(O.Player.Dataset.DOWNED),a.JsUtils.deepFreeze(O);var T,b,N,P,S,A,I,C,R=s(789);class w extends R.Tile{constructor(e){super(e),T.set(this,void 0),(0,i.__classPrivateFieldSet)(this,T,a.JsUtils.mkEl("div",[O.General.Class.CENTER_CONTENTS,O.General.Class.STACK_CONTENTS,O.Tile.Class.BASE])).setAttribute("aria-label","Tile");{const e=a.JsUtils.mkEl("div",[O.Tile.Class.POINTER_HB]);e.setAttribute("aria-hidden","true"),(0,i.__classPrivateFieldGet)(this,T).appendChild(e)}{const e=a.JsUtils.mkEl("div",[O.Tile.Class.LANG_CHAR_WRAP]);e.setAttribute("role","presentation");const t=this.langCharElem=a.JsUtils.mkEl("div",[]);e.appendChild(t),(0,i.__classPrivateFieldGet)(this,T).appendChild(e)}{const e=this.langSeqElem=a.JsUtils.mkEl("div",[O.Tile.Class.LANG_SEQ]);e.setAttribute("role","tooltip"),(0,i.__classPrivateFieldGet)(this,T).appendChild(e)}a.JsUtils.propNoWrite(this,["langCharElem","langSeqElem"])}_addToDom(e){e.appendChild((0,i.__classPrivateFieldGet)(this,T))}_setOccupant(e,t){super._setOccupant(e,t),this.langCharElem.parentElement.insertAdjacentElement("beforebegin",t.playerElem),this.langSeqElem.textContent=t.username}evictOccupant(){super.evictOccupant(),this.langSeqElem.textContent=this.langSeq}set freeHealth(e){super.freeHealth=e,this.freeHealth>0?(0,i.__classPrivateFieldGet)(this,T).dataset[O.Tile.Dataset.HEALTH]=this.freeHealth.toString():delete(0,i.__classPrivateFieldGet)(this,T).dataset[O.Tile.Dataset.HEALTH]}get freeHealth(){return super.freeHealth}setLangCharSeqPair(e){super.setLangCharSeqPair(e),this.langCharElem.textContent=this.langChar,this.langSeqElem.textContent=this.langSeq}}T=new WeakMap,a.JsUtils.protoNoEnum(w,["_addToDom"]),Object.freeze(w),Object.freeze(w.prototype),function(e){e.getImplementation=t=>e._Constructors[t]}(b||(b={}));class G{_superVisibleGrid(e,t){if(e.tileClass!==w)throw new TypeError("never");const s=O.Grid;t.setAttribute("role","presentation"),t.classList.add(s.Class.IMPL_BODY),t.dataset[s.Dataset.IMPL_COORD_SYS]=e.coordSys,t.translate=!1,t.spellcheck=!1,this.baseElem=t;const r=a.JsUtils.mkEl("div",[O.Player.Class.SHORT_SPOTLIGHT]),i=a.JsUtils.mkEl("div",[O.Player.Class.LONG_SPOTLIGHT]);this.spotlightElems=Object.freeze([r,i])}}Object.freeze(G),Object.freeze(G.prototype),function(e){class t{constructor(e){this.x=e.x,this.y=e.y,Object.freeze(this)}_equals(e){return this.x===e.x&&this.y===e.y}round(){return new t({x:Math.round(this.x),y:Math.round(this.y)})}oneNorm(e){return this.sub(e).originOneNorm()}originOneNorm(){return Math.abs(this.x)+Math.abs(this.y)}infNorm(e){return this.sub(e).originInfNorm()}originInfNorm(){return Math.max(Math.abs(this.x),Math.abs(this.y))}axialAlignment(e){return this.sub(e).originAxialAlignment()}originAxialAlignment(){return Math.abs(Math.abs(this.x)-Math.abs(this.y))/(Math.abs(this.x)+Math.abs(this.y))}add(e){return new t({x:this.x+e.x,y:this.y+e.y})}sub(e){return new t({x:this.x-e.x,y:this.y-e.y})}mul(e){return new t({x:e*this.x,y:e*this.y})}}e.Coord=t,Object.freeze(t),Object.freeze(t.prototype);class s extends y.Grid{constructor(e){super(e);const s=[];for(let r=0;rMath.random()-.5)).forEach((t=>e(t)))}getUntToward(e,t){const s=this.tile.destsFrom(t).unoccupied.get;if(0===s.length)return this.tile.at(t);if(1===s.length)return s[0];s.sort(((t,s)=>t.coord.oneNorm(e)-s.coord.oneNorm(e))).sort(((t,s)=>t.coord.infNorm(e)-s.coord.infNorm(e)));for(let t=1;ts[0].coord.infNorm(e)){s.splice(t);break}if(1===s.length)return s[0];if(s[0].coord.x-t.x==0||s[0].coord.y-t.y==0){if(t.axialAlignment(t.sub(e))-.5>0)return s[0];s.shift()}return s[Math.floor(s.length*Math.random())]}getUntAwayFrom(e,t){return this.getUntToward(t.add(t.sub(e)),t)}getDestsFromSourcesTo(e){return this._getTileDestsFrom(e,2)}getRandomCoordAround(e,s){return new t({x:e.x+Math.trunc(2*s*(Math.random()-.5)),y:e.y+Math.trunc(2*s*(Math.random()-.5))})}_getTileAt(e){return this.grid[e.y][e.x]}_getTileDestsFrom(e,t=1){let s=e.y-t,r=e.y+t+1,i=e.x-t,a=e.x+t+1;return s>=this.dimensions.height||r<0||i>=this.dimensions.width||a<0?[]:this.grid.slice(Math.max(0,s),Math.min(this.dimensions.height,r)).flatMap((e=>e.slice(Math.max(0,i),Math.min(this.dimensions.width,a))))}_getTileSourcesTo(e,t=1){return this._getTileDestsFrom(e,t)}minMovesFromTo(e,t){return Math.min(Math.abs(t.x-e.x),Math.abs(t.y-e.y))}static getSpawnCoords(e,t){const r=[];return e.map((e=>{const i=[];for(;e>0;){let a;do{a=s.getRandomCoord(t)}while(r.find((e=>a._equals(e))));i.push(a),r.push(a),e--}return i}))}static getArea(e){return e.height*e.width}static getDiameterOfLatticePatchHavingArea(e){return Math.sqrt(e)}static getRandomCoord(e){const s=Math.floor(e.width*Math.random()),r=Math.floor(e.height*Math.random());return new t({x:s,y:r})}}s.SIZE_LIMITS=Object.freeze({height:Object.freeze({min:11,max:51}),width:Object.freeze({min:11,max:51})}),e.Grid=s,a.JsUtils.protoNoEnum(s,["_getTileAt","_getTileDestsFrom","_getTileSourcesTo"]),Object.freeze(s),Object.freeze(s.prototype)}(N||(N={})),Object.freeze(N);class L extends N.Grid{constructor(e){super(e);const t=a.JsUtils.mkEl("div",[]);t.style.setProperty("--euclid2-grid-width",this.dimensions.width.toString());for(const e of this.grid)for(const s of e)s._addToDom(t);this._superVisibleGrid(e,t)}}a.JsUtils.applyMixins(L,[G]),Object.freeze(L),Object.freeze(L.prototype),function(e){class t{constructor(e){this.dash=e.dash,this.bash=e.bash,Object.freeze(this)}_equals(e){return this.dash===e.dash&&this.bash===e.bash}round(){const e=Math.floor(this.dash),s=Math.floor(this.bash),r=e-this.dash,i=s-this.bash;return r>2*i?new t({dash:e+1,bash:s}):r<.5*i?new t({dash:e,bash:s+1}):Math.min(r,i)>.5?new t({dash:e+1,bash:s+1}):new t({dash:e,bash:s})}add(e){return new t({dash:this.dash+e.dash,bash:this.bash+e.bash})}sub(e){return new t({dash:this.dash-e.dash,bash:this.bash-e.bash})}mul(e){return new t({dash:e*this.dash,bash:e*this.bash})}}e.Coord=t,Object.freeze(t),Object.freeze(t.prototype);class s extends y.Grid{constructor(e){super(e),this.grid=Object.freeze(void 0)}static getAmbiguityThreshold(){return 18}static getSizeLimits(){return this.SIZE_LIMITS}forEachTile(e){let t=0;for(const s of this.grid)for(const r of s)e(r,t++)}shuffledForEachTile(e){this.grid.flat().sort(((e,t)=>Math.random()-.5)).forEach((t=>e(t)))}getUntToward(e,t){}getUntAwayFrom(e,t){return this.getUntToward(t.add(t.sub(e)),t)}getRandomCoordAround(e,t){}_getTileAt(e){}_getTileDestsFrom(e,t=1){}_getTileSourcesTo(e,t=1){}minMovesFromTo(e,t){}getDestsFromSourcesTo(e){return this._getTileDestsFrom(e,2)}static getSpawnCoords(e,t){}static getArea(e){const t=Math.min(e.fslash,e.bslash),s=Math.max(e.fslash,e.bslash),r=-1+e.dash+t;let i=2*t*(e.dash+r);return i+=(s-t-1)*r,i}static getDiameterOfLatticePatchHavingArea(e){if(e<.25)throw new RangeError("determinant of a radical will be strictly negative.");return 1+(-3+Math.sqrt(9-12*(1-e)))/6*2}static getRandomCoord(e){return new t(void 0)}}s.SIZE_LIMITS=Object.freeze({dash:Object.freeze({min:10,max:50}),bslash:Object.freeze({min:10,max:50}),fslash:Object.freeze({min:10,max:50})}),e.Grid=s,a.JsUtils.protoNoEnum(s,["_getTileAt","_getTileDestsFrom","_getTileSourcesTo"]),Object.freeze(s),Object.freeze(s.prototype)}(P||(P={})),Object.freeze(P);class M extends P.Grid{constructor(e){super(e),this._superVisibleGrid(e,void 0)}}a.JsUtils.applyMixins(M,[G]),Object.freeze(M),Object.freeze(M.prototype);class F extends c{constructor(e,t){super(e,t),S.set(this,void 0),this.behaviour=Object.freeze(Object.assign({},F.Behaviour.DEFAULT,t.familyArgs)),this.grid=this.game.grid}_afterAllPlayersConstruction(){super._afterAllPlayersConstruction(),this.threatProximity=this.game.teams.filter((e=>e.id!==this.teamId)).flatMap((e=>e.members)),this.targetProximity=[...this.threatProximity],a.JsUtils.propNoWrite(this,["threatProximity","targetProximity","behaviour","grid"])}reset(e){super.reset(e),(0,i.__classPrivateFieldSet)(this,S,this.coord)}moveTo(e){(0,i.__classPrivateFieldSet)(this,S,this.coord),super.moveTo(e)}computeDesiredDest(){this.threatProximity.sort(((e,t)=>this.grid.minMovesFromTo(e.coord,this.coord)-this.grid.minMovesFromTo(t.coord,this.coord)));for(const e of this.threatProximity){if(this.grid.minMovesFromTo(e.coord,this.coord)>this.behaviour.fearDistance)break;if(!e.status.isDowned&&e.status.health>this.status.health)return this.grid.getUntAwayFrom(e.coord,this.coord).coord}if(this.targetProximity.sort(((e,t)=>this.grid.minMovesFromTo(this.coord,e.coord)-this.grid.minMovesFromTo(this.coord,t.coord))),this.status.isDowned)for(const e of this.targetProximity){if(this.grid.minMovesFromTo(this.coord,e.coord)>this.behaviour.bloodThirstDistance)break;if(e.status.health{y.Grid._Constructors=Object.freeze({EUCLID2:N.Grid,BEEHIVE:P.Grid}),Object.freeze(y.Grid),Object.freeze(y.Grid.prototype);{const e=c;e._Constructors=Object.freeze({CHASER:F}),Object.freeze(e),Object.freeze(e.prototype)}})();class j extends v{constructor(e,t,r){super(e,t,r),A.set(this,void 0),I.set(this,void 0),C.set(this,void 0),this.averageFreeHealth=r.averageFreeHealthPerTile*this.grid.area,this.averageFreeHealthPerTile=r.averageFreeHealthPerTile,this.healthCostOfBoost=n.Game.K.HEALTH_COST_OF_BOOST(this.averageFreeHealthPerTile,this.grid.static.getDiameterOfLatticePatchHavingArea),(0,i.__classPrivateFieldSet)(this,I,new Set),this.scoreInfo=new d(this.players.map((e=>e.playerId))),a.JsUtils.propNoWrite(this,["averageFreeHealth","averageFreeHealthPerTile","healthCostOfBoost","scoreInfo"]),(0,i.__classPrivateFieldSet)(this,C,s(59)(`./${this.langFrontend.module}.ts`).then((e=>{const t=this.langFrontend.export.split(".").reduce(((e,t)=>e[t]),e[this.langFrontend.module]);this.lang=new t(r.langWeightExaggeration),a.JsUtils.propNoWrite(this,["lang"]);const s=this.grid.static.getAmbiguityThreshold();if(this.lang.numLeavessuper.reset}});return(0,i.__awaiter)(this,void 0,void 0,(function*(){yield e.reset.call(this),(0,i.__classPrivateFieldSet)(this,A,0),(0,i.__classPrivateFieldGet)(this,I).clear(),yield(0,i.__classPrivateFieldGet)(this,C),this.lang.reset(),this.grid.shuffledForEachTile((e=>{e.setLangCharSeqPair(this.dryRunShuffleLangCharSeqAt(e))})),this.teams.forEach((e=>e.reset()));const t=this.grid.static.getSpawnCoords(this.teams.map((e=>e.members.length)),this.grid.dimensions);return this.teams.forEach(((e,s)=>{e.members.forEach(((e,r)=>{e.reset(this.grid.tile.at(t[s][r]))}))})),this.scoreInfo.reset(),Promise.resolve()}))}_createArtifPlayer(e){return c.of(this,e)}dryRunShuffleLangCharSeqAt(e,t=!1){e.setLangCharSeqPair(o.U.CharSeqPair.NULL);let s=this.grid.getDestsFromSourcesTo(e.coord).map((e=>e.langSeq));if(t){const e=o.U.CharSeqPair.NULL.seq;s=s.filter((t=>t!==e))}return this.lang.getNonConflictingChar(s)}get currentFreeHealth(){return(0,i.__classPrivateFieldGet)(this,A)}get freeHealthTiles(){return(0,i.__classPrivateFieldGet)(this,I)}dryRunSpawnFreeHealth(e){var t;let s=this.averageFreeHealth-this.currentFreeHealth;if(s<=0)return;const i=[];for(;s>0;){let a;do{a=this.grid.tile.at(this.grid.getRandomCoord())}while(a.isOccupied||i.find((e=>r.equals(a.coord,e.coord))));const o=n.Game.K.AVERAGE_HEALTH_TO_SPAWN_ON_TILE;if(Math.random()r.equals(a.coord,e.coord))))?s.newFreeHealth=(null!==(t=s.newFreeHealth)&&void 0!==t?t:0)+o:i.push({coord:a.coord,lastKnownUpdateId:1+a.lastKnownUpdateId,newCharSeqPair:void 0,newFreeHealth:a.freeHealth+o})}s-=o}return i}executeTileModEvent(e,t=!0){Object.freeze(e);const s=this.grid.tile.at(e.coord);if(e.lastKnownUpdateId!==1+s.lastKnownUpdateId)throw new RangeError("never");return(0,i.__classPrivateFieldSet)(this,A,(0,i.__classPrivateFieldGet)(this,A)+(e.newFreeHealth-s.freeHealth)),0===e.newFreeHealth?(0,i.__classPrivateFieldGet)(this,I).delete(s):(0,i.__classPrivateFieldGet)(this,I).add(s),super.executeTileModEvent(e,t),s}managerCheckGamePlayingRequest(e){if(this.status!==n.Game.Status.PLAYING)return;const t=this.players[e.playerId];if(!t)throw new Error("No such player exists.");if(e.playerLastAcceptedRequestId!==t.lastAcceptedRequestId)throw new RangeError(e.playerLastAcceptedRequestId{"use strict";s.r(t),s.d(t,{Player:()=>m,PlayerSkeleton:()=>h,PlayerStatus:()=>p});var r,i=s(406),a=s(504),o=s(699),n=s(780),l=s(951),c=s(495);class h extends l.J5{constructor(e,t){if(super(),r.set(this,void 0),Math.trunc(t.playerId)!==t.playerId)throw new RangeError("Player ID's must be integer values.");this.playerId=t.playerId,this.isALocalOperator=t.isALocalOperator,this.game=e,this.status=new this.game._playerStatusCtor(this,t.noCheckGameOver),this.tile=new c.N(new h.TileGetterSource(this)),i.JsUtils.instNoEnum(this,["game"]),i.JsUtils.propNoWrite(this,["playerId","isALocalOperator","game","status","tile"])}_afterAllPlayersConstruction(){this.status._afterAllPlayersConstruction()}reset(e){(0,n.__classPrivateFieldSet)(this,r,e),this.hostTile._setOccupant(this.playerId,this.status.immigrantInfo)}get coord(){return this.hostTile.coord}get hostTile(){return(0,n.__classPrivateFieldGet)(this,r)}moveTo(e){if(this.hostTile.occupantId!==this.playerId){if(this.game.gameType!==a.Game.Type.ONLINE)throw new Error("Linkage between player and occupied tile disagrees.")}else this.hostTile.evictOccupant();if(e.isOccupied){if(this.game.gameType!==a.Game.Type.ONLINE)throw new Error("Only one player can occupy a tile at a time.")}else(0,n.__classPrivateFieldSet)(this,r,e),e._setOccupant(this.playerId,this.status.immigrantInfo)}}r=new WeakMap,function(e){var t,s;class r{constructor(e){t.set(this,void 0),s.set(this,void 0),(0,n.__classPrivateFieldSet)(this,t,e),(0,n.__classPrivateFieldSet)(this,s,e.game.grid.tile._source)}_getTileAt(){return(0,n.__classPrivateFieldGet)(this,s)._getTileAt((0,n.__classPrivateFieldGet)(this,t).coord)}_getTileDestsFrom(){return(0,n.__classPrivateFieldGet)(this,s)._getTileDestsFrom((0,n.__classPrivateFieldGet)(this,t).coord)}_getTileSourcesTo(){return(0,n.__classPrivateFieldGet)(this,s)._getTileSourcesTo((0,n.__classPrivateFieldGet)(this,t).coord)}}t=new WeakMap,s=new WeakMap,e.TileGetterSource=r,Object.freeze(r),Object.freeze(r.prototype)}(h||(h={})),i.JsUtils.protoNoEnum(h,["_afterAllPlayersConstruction"]),Object.freeze(h),Object.freeze(h.prototype);var d,u=s(473);class p{constructor(e,t){d.set(this,void 0),this.player=e,this.noCheckGameOver=t,i.JsUtils.instNoEnum(this,["player"])}reset(){this.health=0}_afterAllPlayersConstruction(){}get immigrantInfo(){}get health(){return(0,n.__classPrivateFieldGet)(this,d)}set health(e){const t=this.isDowned;if((0,n.__classPrivateFieldSet)(this,d,e),t||!this.isDowned||this.noCheckGameOver)return;const s=this.player.team,r=this.player.game.teams;if(s.elimOrder===u.S.ElimOrder.STANDING&&s.members.every((e=>e.status.noCheckGameOver||e.status.isDowned))){const e=1+r.filter((e=>e.elimOrder!==u.S.ElimOrder.STANDING)).length;s.elimOrder=1+r.filter((e=>e.elimOrder!==u.S.ElimOrder.STANDING&&e.elimOrder!==u.S.ElimOrder.IMMORTAL)).length,e===r.length&&this.player.game.statusBecomeOver()}}get isDowned(){return this.health<0}}d=new WeakMap,i.JsUtils.protoNoEnum(p,["_afterAllPlayersConstruction"]),Object.freeze(p),Object.freeze(p.prototype);class m extends h{constructor(e,t){var s;super(e,t),this.familyId=t.familyId,this.teamId=t.teamId,this.username=t.username,this.avatar=null!==(s=t.avatar)&&void 0!==s?s:m.Avatar.GET_RANDOM(),i.JsUtils.propNoWrite(this,["familyId","teamId","username","avatar"])}reset(e){super.reset(e),this.status.reset(),this.lastAcceptedRequestId=o.PlayerActionEvent.INITIAL_REQUEST_ID,this.requestInFlight=!1}_notifyGameNowPlaying(){}_notifyGameNowPaused(){}_notifyGameNowOver(){}makeMovementRequest(e,t){if(this.game.status!==a.Game.Status.PLAYING)throw new Error("This is not a necessary precondition, but we're doing it anyway.");if(this.requestInFlight)throw new Error("Only one request should ever be in flight at a time.");this.requestInFlight=!0,this.game.processMoveRequest(new o.PlayerActionEvent.Movement(this.playerId,this.lastAcceptedRequestId,e,t))}get team(){return this.game.teams[this.teamId]}isTeamedWith(e){return this.team.members.includes(e)}}!function(e){let t;!function(e){e.finalize=function(e){const t=Array.from(new Set(e.map((e=>e.teamId)))).sort(((e,t)=>e-t)).reduce(((e,t,s)=>(e[t]=s,e)),[]);return e.slice().sort(((e,s)=>t[e.teamId]-t[s.teamId])).map(((e,s)=>Object.assign({},e,{playerId:s,teamId:t[e.teamId]})))}}(t=e.CtorArgs||(e.CtorArgs={})),Object.freeze(t)}(m||(m={})),i.JsUtils.protoNoEnum(m,["_notifyGameNowPaused","_notifyGameNowPlaying","_notifyGameNowOver"]),Object.freeze(m),Object.freeze(m.prototype)},473:(e,t,s)=>{"use strict";s.d(t,{S:()=>o});var r,i=s(780),a=s(406);class o{constructor(e,t){if(r.set(this,void 0),0===t.length)throw new Error("Teams must have at least one member.");this.id=e,this.members=t,(0,i.__classPrivateFieldSet)(this,r,this.members.every((e=>e.status.noCheckGameOver))?o.ElimOrder.IMMORTAL:o.ElimOrder.STANDING),a.JsUtils.propNoWrite(this,["id","members"])}reset(){this.elimOrder!==o.ElimOrder.IMMORTAL&&(this.elimOrder=o.ElimOrder.STANDING)}get elimOrder(){return(0,i.__classPrivateFieldGet)(this,r)}set elimOrder(e){if(this.elimOrder===o.ElimOrder.IMMORTAL)throw new TypeError("Cannot change the elimination status of an immortal team.");(0,i.__classPrivateFieldSet)(this,r,e)}}r=new WeakMap,function(e){let t;!function(e){e.IMMORTAL=-1,e.STANDING=0}(t=e.ElimOrder||(e.ElimOrder={}))}(o||(o={})),Object.freeze(o),Object.freeze(o.prototype)},979:(e,t,s)=>{"use strict";s.d(t,{U:()=>l});var r,i=s(406),a=s(951),o=s(780);!function(e){var t,s;class r{constructor(){this.children=[]}reset(){this.inheritingWeightedHitCount=0,this.children.forEach((e=>e.reset()))}_finalize(){Object.freeze(this.children),this.children.forEach((e=>e._finalize()))}_addCharMapping(e,t){if(!a.Uo.Seq.REGEXP.test(e))throw new RangeError(`Mapping-sequence "${e}" did not match the required regular expression "${a.Uo.Seq.REGEXP.source}".`);if(0===t.length)throw new RangeError("never");let s=this;{let t=this;for(;t;)s=t,t=t.children.find((t=>e.startsWith(t.sequence)))}if(s.sequence===e)throw new Error(`Mappings for all written-characters with a commoncorresponding typeable-sequence should be registered together,but an existing mapping for the sequence "${e}" was found.`);s.children.push(new i(s,e,t))}getLeafNodes(){const e=[];return this._recursiveGetLeafNodes(e),e}_recursiveGetLeafNodes(e){this.children.length?this.children.forEach((t=>{t._recursiveGetLeafNodes(e)})):e.push(this)}simpleView(){return this.children}static CREATE_TREE_MAP(e,t){const s=Object.values(e).reduce(((e,t)=>e+t.weight),0),i=0===t?e=>1:1===t?e=>e:e=>Math.pow(e/s,t),a=new Map;for(const t in e){const s=e[t].seq,r=new n(t,i(e[t].weight)),o=a.get(s);o?o.push(r):a.set(s,[r])}const o=new r;return Array.from(a).sort(((e,t)=>e[0].length-t[0].length)).forEach((e=>{o._addCharMapping(...e)})),o._finalize(),o}}r.LEAF_CMP=(e,t)=>e.inheritingWeightedHitCount-t.inheritingWeightedHitCount,e.ParentNode=r,Object.freeze(r),Object.freeze(r.prototype);class i extends r{constructor(e,r,i){super(),t.set(this,void 0),s.set(this,void 0),this.sequence=r,(0,o.__classPrivateFieldSet)(this,s,i),(0,o.__classPrivateFieldSet)(this,t,e)}_finalize(){Object.freeze((0,o.__classPrivateFieldGet)(this,s)),super._finalize()}reset(){super.reset(),(0,o.__classPrivateFieldGet)(this,s).forEach((e=>{e.reset(),this.incrementNumHits(e,Math.random()*a.Uo.CHAR_HIT_COUNT_SEED_CEILING)}))}chooseOnePair(){const e=(0,o.__classPrivateFieldGet)(this,s).slice(0).sort(n.CMP).shift(),t={char:e.char,seq:this.sequence};return this.incrementNumHits(e),t}incrementNumHits(e,t=1){e._incrementNumHits(),this._recursiveIncrementNumHits(e.weightInv*t)}_recursiveIncrementNumHits(e){this.inheritingWeightedHitCount+=e,this.children.forEach((t=>t._recursiveIncrementNumHits(e)))}get personalWeightedHitCount(){return this.inheritingWeightedHitCount-(0,o.__classPrivateFieldGet)(this,t).inheritingWeightedHitCount}andNonRootParents(){const e=[];for(let s=this;s instanceof i;s=(0,o.__classPrivateFieldGet)(s,t))e.push(s);return e}simpleView(){let e=(0,o.__classPrivateFieldGet)(this,s).map((e=>e.simpleView()));return Object.assign(Object.create(null),{seq:this.sequence,chars:1===e.length?e[0]:e,kids:this.children.map((e=>e.simpleView()))})}}t=new WeakMap,s=new WeakMap,i.PATH_CMP=(e,t)=>e.personalWeightedHitCount-t.personalWeightedHitCount,e.ChildNode=i,Object.freeze(i),Object.freeze(i.prototype)}(r||(r={})),Object.freeze(r);class n{constructor(e,t){if(t<=0)throw new RangeError(`All weights must be positive, but we were passed the value "${t}" for the character "${e}".`);this.char=e,this.weightInv=1/t}reset(){this.hitCount=0,this.weightedHitCount=0}_incrementNumHits(){this.hitCount+=1,this.weightedHitCount+=this.weightInv}simpleView(){return Object.assign(Object.create(null),{char:this.char,hits:this.hitCount})}}n.CMP=(e,t)=>e.weightedHitCount-t.weightedHitCount,Object.freeze(n),Object.freeze(n.prototype);class l extends a.Uo{constructor(e,t,s){if(super(),this.frontendDesc=l.GET_FRONTEND_DESC_BY_ID(e),this.treeMap=r.ParentNode.CREATE_TREE_MAP(t,s),this.leafNodes=this.treeMap.getLeafNodes(),i.JsUtils.propNoWrite(this,["frontendDesc","treeMap","leafNodes"]),this.leafNodes.length!==this.frontendDesc.numLeaves)throw new Error(`maintenance required: the frontend constant for the language "${this.frontendDesc.id}" needs to be updated to the correct, computed value, which is \`${this.leafNodes.length}\`.`)}get numLeaves(){return this.leafNodes.length}reset(){this.treeMap.reset()}getNonConflictingChar(e){this.leafNodes.sort(r.ParentNode.LEAF_CMP);let t=void 0;for(const s of this.leafNodes){const r=s.andNonRootParents();for(let t=0;te.startsWith(r[t].sequence)));if(s){s===r[t].sequence?r.length=0:r.splice(t);break}}if(r.length){t=r[0];for(const e of r)e.personalWeightedHitCount{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.Group=t.ServerGame=void 0;const i=s(780),a=s(406),o=s(502),n=s(290);Object.defineProperty(t,"ServerGame",{enumerable:!0,get:function(){return n.ServerGame}});const l=s(502),c=s(604);class h extends l.Group{constructor(e){super(),r.set(this,void 0),this.namespace=e.namespace,this.name=e.name,this.passphrase=e.passphrase,i.__classPrivateFieldSet(this,r,void 0),this._deleteExternalRefs=e.deleteExternalRefs,this._initialTtlTimeout=setTimeout((()=>{0===Object.keys(this.namespace.sockets).length&&this.terminate()}),1e3*e.initialTtl).unref(),this.socketListeners=Object.freeze({disconnect:e=>{if(e===this._sessionHost)return void this.terminate();if(1===Object.keys(e.nsp.sockets).length)return void this.terminate();const t={[e.id]:void 0};e.nsp.emit(h.Socket.UserInfoChange.EVENT_NAME,t)},[h.Socket.UserInfoChange.EVENT_NAME]:(e,t)=>{if("string"!=typeof t.username||"number"!=typeof t.teamId||"string"!=typeof t.avatar)return void console.log(`bad format: username: \`${t.username}\`, teamId: \`${t.teamId}\`, avatar: \`${t.avatar}\`.`);e.userInfo=t;const s={[e.id]:t};e.nsp.emit(h.Socket.UserInfoChange.EVENT_NAME,s)}}),a.JsUtils.instNoEnum(this,["socketListeners"]),a.JsUtils.propNoWrite(this,["socketListeners"]),this.namespace.use(((e,t)=>{e.handshake.query.passphrase!==this.passphrase&&t(new Error("Incorrect passphrase"));const s=e.handshake.query;return void 0!==s&&0===s.teamId||t(new Error(`a socket attempted to connect to group \`${this.name}\` without providing userInfo.`)),t()})).on("connection",this.onConnection.bind(this))}onConnection(e){console.log("socket connect: "+e.id),i.__classPrivateFieldGet(this,r)&&e.disconnect(),e.userInfo=e.handshake.query.userInfo;{const t=h.Socket.UserInfoChange.EVENT_NAME;e.nsp.emit(t,{[e.id]:e.userInfo}),e.emit(t,Object.entries(this.sockets).reduce(((e,[t,s])=>(e[t]=s.userInfo,e)),{}))}1===Object.keys(e.nsp.connected).length&&(clearTimeout(this._initialTtlTimeout),this._initialTtlTimeout=void 0,this._sessionHost=e,this.namespace.server.of(l.SkServer.Nsps.GROUP_JOINER).emit(h.Exist.EVENT_NAME,{[this.name]:h.Exist.Status.IN_LOBBY}),e.on(o.GroupEv.CREATE_GAME,this._socketOnHostCreateGame.bind(this))),Object.entries(this.socketListeners).forEach((([t,s])=>{e.on(t,s.bind(this,e))}))}_socketOnHostCreateGame(e){this._createGameInstance(e).length||(this.namespace.server.of(l.SkServer.Nsps.GROUP_JOINER).emit(h.Exist.EVENT_NAME,{[this.name]:h.Exist.Status.IN_GAME}),console.log(`group ${this.name} new game`))}get isCurrentlyPlayingAGame(){return void 0!==i.__classPrivateFieldGet(this,r)}terminate(){function e(e){e.removeAllListeners("connect"),e.removeAllListeners("connection"),Object.values(e.connected).forEach((e=>{e.disconnect(!1),e.removeAllListeners()})),e.removeAllListeners(),delete e.server.nsps[e.name]}void 0!==i.__classPrivateFieldGet(this,r)&&(e(i.__classPrivateFieldGet(this,r).namespace),i.__classPrivateFieldSet(this,r,void 0));const t=this.namespace.server;e(this.namespace),this.namespace=void 0,this._deleteExternalRefs(),t.of(l.SkServer.Nsps.GROUP_JOINER).emit(h.Exist.EVENT_NAME,{[this.name]:h.Exist.Status.DELETE}),console.log(`terminated group: \`${this.name}\``)}_createGameInstance(e){const t=[];return this.isCurrentlyPlayingAGame?(t.push("a game is already in session for this group"),t):(t.push(...c.GamepartManager.CHECK_VALID_CTOR_ARGS(e)),t.length?(console.log(t),t):(e.playerDescs=[...e.playerDescs,...Object.values(this.sockets).map((e=>Object.freeze({isALocalOperator:!1,familyId:"HUMAN",teamId:e.userInfo.teamId,clientId:e.client.id,username:e.userInfo.username,avatar:e.userInfo.avatar,noCheckGameOver:!1,familyArgs:{}})))],i.__classPrivateFieldSet(this,r,new n.ServerGame({groupNsps:this.namespace,passphrase:this.passphrase,groupHostClient:this._sessionHost.client,deleteExternalRefs:()=>{i.__classPrivateFieldSet(this,r,void 0)},gameDesc:e})),[]))}get sockets(){return this.namespace.sockets}}t.Group=h,r=new WeakMap,a.JsUtils.protoNoEnum(h,["_socketOnHostCreateGame"]),Object.freeze(h),Object.freeze(h.prototype)},290:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ServerGame=void 0;const r=s(213),i=s(406),a=s(502),o=s(504),n=s(789),l=s(985),c=s(216),h=s(671),d=s(699),u=s(604);class p extends u.GamepartManager{constructor(e){super(o.Game.Type.SERVER,{onGameBecomeOver:()=>{},tileClass:n.Tile,playerStatusCtor:c.PlayerStatus},e.gameDesc),this._groupHostClient=e.groupHostClient,this._deleteExternalRefs=e.deleteExternalRefs,i.JsUtils.instNoEnum(this,["operators","_deleteExternalRefs"]),i.JsUtils.propNoWrite(this,["_groupHostClient","_deleteExternalRefs"]),this.namespace=e.groupNsps.server.of(a.SkServer.Nsps.GROUP_GAME_PREFIX+e.groupNsps.name.replace(a.SkServer.Nsps.GROUP_LOBBY_PREFIX,"")).use(((t,s)=>(t.handshake.query.passphrase!==e.passphrase&&s(new Error("Incorrect passphrase")),s()))),this.socketListeners=Object.freeze({[d.PlayerActionEvent.EVENT_NAME.MOVEMENT]:this.processMoveRequest.bind(this),[d.PlayerActionEvent.EVENT_NAME.BUBBLE]:this.processBubbleRequest.bind(this)}),i.JsUtils.instNoEnum(this,["socketListeners"]),i.JsUtils.propNoWrite(this,["socketListeners"]);const t=new Map;function s(e){t.get(e.client)(),t.delete(e.client)}Promise.all(Object.values(e.groupNsps.sockets).map((e=>new Promise(((r,i)=>{t.set(e.client,r),this.namespace.once("connect",s)}))))).then((()=>this._greetGameSockets(e.groupNsps,e.gameDesc))).catch((e=>{setImmediate((()=>{throw e}))})),e.groupNsps.emit(a.GroupEv.CREATE_GAME)}_getGridImplementation(e){return l.Grid.getImplementation(e)}_greetGameSockets(e,t){this.playerSockets=t.playerDescs.filter((e=>e.familyId===c.Player.Family.HUMAN)).reduce(((e,t)=>{if(void 0===t.clientId)throw console.log(t),new Error("missing socket client for player "+t.playerId);const s=Object.values(this.namespace.sockets).find((e=>e.client.id===t.clientId));if(void 0===s)throw new Error("never");return e.set(t.playerId,s),e}),new Map),i.JsUtils.propNoWrite(this,["playerSockets"]),Promise.all(Object.values(this.namespace.sockets).map((e=>new Promise(((t,s)=>{e.once(a.GameEv.RESET,(()=>{t()}))}))))).then((()=>{this.reset()})),Object.values(this.namespace.sockets).forEach((e=>{e.on("disconnect",(()=>{1!==Object.keys(e.nsp.sockets).length||this.terminate()})),e.on(a.GameEv.RETURN_TO_LOBBY,(()=>{e.client===this._groupHostClient?(this.statusBecomeOver(),e.broadcast.emit(a.GameEv.RETURN_TO_LOBBY)):e.broadcast.emit(a.GameEv.RETURN_TO_LOBBY,e.id)})),Object.entries(this.socketListeners).forEach((([t,s])=>{e.on(t,s)})),t.playerDescs.forEach((t=>{t.isALocalOperator=t.clientId===e.client.id})),e.emit(a.GameEv.CREATE_GAME,t)}))}async reset(){console.log("starting reset"),Promise.all(Object.values(this.namespace.sockets).map((e=>new Promise(((t,s)=>{e.once(a.GameEv.UNPAUSE,(()=>{t()}))}))))).then((()=>{this.statusBecomePlaying(),this.namespace.emit(a.GameEv.UNPAUSE)}));const e=super.reset();return await e,this.namespace.emit(a.GameEv.RESET,this.serializeResetState()),e}_createOperatorPlayer(e){throw new TypeError("This should never be called for a ServerGame.")}setCurrentOperator(e){}setTimeout(e,t,...s){return r.setTimeout(e,t,s).unref()}cancelTimeout(e){clearTimeout(e)}executePlayerMoveEvent(e){super.executePlayerMoveEvent(e),e.eventId===h.EventRecordEntry.EVENT_ID_REJECT?this.playerSockets.get(e.playerId).emit(d.PlayerActionEvent.EVENT_NAME.MOVEMENT,e):this.namespace.emit(d.PlayerActionEvent.EVENT_NAME.MOVEMENT,e)}executePlayerBubbleEvent(e){super.executePlayerBubbleEvent(e),e.eventId===h.EventRecordEntry.EVENT_ID_REJECT?this.playerSockets.get(e.playerId).emit(d.PlayerActionEvent.EVENT_NAME.BUBBLE,e):this.namespace.emit(d.PlayerActionEvent.EVENT_NAME.BUBBLE,e)}terminate(){Object.values(this.namespace.sockets).forEach((e=>{e.disconnect(),e.removeAllListeners()})),this.namespace.removeAllListeners(),this._deleteExternalRefs()}}t.ServerGame=p,i.JsUtils.protoNoEnum(p,["_greetGameSockets","_getGridImplementation","_createOperatorPlayer","setCurrentOperator"]),Object.freeze(p),Object.freeze(p.prototype)},904:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SnakeyServer=void 0;const r=s(87),i=s(622),a=s(605),o=s(127),n=s(395),l=s(406),c=s(410),h=s(502);class d extends h.SkServer{constructor(e=d.DEFAULT_PORT,t){super(),this.app=o(),this.http=a.createServer({},this.app),this.io=n(this.http,{origins:"*:*",cookie:!1}),this.allGroups=new Map,l.JsUtils.propNoWrite(this,["http","app","io","allGroups"]);const s=i.resolve(__dirname,"../..");this.app.disable("x-powered-by"),this.app.get("/",((e,t)=>{t.sendFile(i.resolve(s,"index.html"))})),this.app.use("/dist/client",o.static(i.resolve(s,"dist","client"))),this.app.use("/assets",o.static(i.resolve(s,"assets"))),this.http.listen({port:e,host:t},(()=>{const t=this.http.address();console.log(`\n\nServer mounted to: \`${t.address}${t.port}\` using ${t.family}.\n`),console.log("This host can be reached at any of the following addresses:\n"),d.chooseIPAddress().sort().forEach((t=>{console.log(`${t}:${e}`)})),console.log("")})),this._joinerSocketListeners=Object.freeze({[c.Group.Exist.EVENT_NAME]:(e,t)=>{!t.groupName||this.allGroups.has(t.groupName)||t.groupName.length>c.Group.Name.MaxLength||!t.groupName.match(c.Group.Name.REGEXP)||t.passphrase.length>c.Group.Passphrase.MaxLength||!t.passphrase.match(c.Group.Passphrase.REGEXP)?e.emit(c.Group.Exist.EVENT_NAME,c.Group.Exist.RequestCreate.Response.NOPE):(this.allGroups.set(t.groupName,new c.Group(Object.freeze({namespace:this.io.of(d.Nsps.GROUP_LOBBY_PREFIX+t.groupName),name:t.groupName,passphrase:t.passphrase,deleteExternalRefs:()=>this.allGroups.delete(t.groupName),initialTtl:c.Group.DEFAULT_TTL}))),e.emit(c.Group.Exist.EVENT_NAME,c.Group.Exist.RequestCreate.Response.OKAY))}}),l.JsUtils.instNoEnum(this,["_joinerSocketListeners"]),l.JsUtils.propNoWrite(this,["_joinerSocketListeners"]),this.io.of(d.Nsps.GROUP_JOINER).on("connection",this.onJoinerNspsConnection.bind(this))}onJoinerNspsConnection(e){console.log("socket connect: "+e.id),e.emit(c.Group.Exist.EVENT_NAME,(()=>{const e={};return Array.from(this.allGroups).forEach((([t,s])=>{e[t]=s.isCurrentlyPlayingAGame?c.Group.Exist.Status.IN_GAME:c.Group.Exist.Status.IN_LOBBY})),e})()),Object.entries(this._joinerSocketListeners).forEach((([t,s])=>{e.on(t,s.bind(this,e))}))}}t.SnakeyServer=d,function(e){e.chooseIPAddress=()=>Object.values(r.networkInterfaces()).flat().filter((e=>!e.internal)).map((e=>"IPv6"===e.family?`[${e.address}]`:e.address))}(d=t.SnakeyServer||(t.SnakeyServer={})),Object.freeze(d),Object.freeze(d.prototype)},687:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.server=void 0;const r=s(904);t.server=new r.SnakeyServer},59:(e,t,s)=>{var r={"./Emote.ts":[981,858],"./English.ts":[215,184],"./Japanese.ts":[117,410],"./Korean.ts":[181,227],"./Morse.ts":[222,285]};function i(e){if(!s.o(r,e))return Promise.resolve().then((()=>{var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}));var t=r[e],i=t[0];return s.e(t[1]).then((()=>s(i)))}i.keys=()=>Object.keys(r),i.id=59,e.exports=i},127:e=>{"use strict";e.exports=require("express")},605:e=>{"use strict";e.exports=require("http")},87:e=>{"use strict";e.exports=require("os")},622:e=>{"use strict";e.exports=require("path")},395:e=>{"use strict";e.exports=require("socket.io")},213:e=>{"use strict";e.exports=require("timers")},780:e=>{"use strict";e.exports=require("tslib")}},s={};function r(e){if(s[e])return s[e].exports;var i=s[e]={exports:{}};return t[e](i,i.exports,r),i.exports}return r.m=t,r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var s in t)r.o(t,s)&&!r.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((t,s)=>(r.f[s](e,t),t)),[])),r.u=e=>"chunk/"+{184:"lang/English-ts",227:"lang/Korean-ts",285:"lang/Morse-ts",410:"lang/Japanese-ts",858:"lang/Emote-ts"}[e]+".js",r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},e={826:1},r.f.require=function(t,s){e[t]||(t=>{var s=t.modules,i=t.ids,a=t.runtime;for(var o in s)r.o(s,o)&&(r.m[o]=s[o]);a&&a(r);for(var n=0;n{var e,t={406:(e,t,s)=>{"use strict";var r;s.r(t),s.d(t,{JsUtils:()=>r}),function(e){let t;function s(e,t,s){t.forEach((t=>{if(!Object.getOwnPropertyNames(e).includes(t)){const s=`\`${e.__proto__.constructor.name}\` instance has no property named "${t}"`;throw new TypeError(s)}Object.defineProperty(e,t,s)}))}e.applyMixins=function(e,t){t.forEach((t=>{Object.getOwnPropertyNames(t.prototype).forEach((s=>{Object.defineProperty(e.prototype,s,Object.getOwnPropertyDescriptor(t.prototype,s))}))}))},e.deepFreeze=function e(t){return function(t){for(const s of Object.getOwnPropertyNames(t)){const r=t[s];"object"==typeof r&&e(r)}Object.freeze(t)}(t),t},function(e){let t;!function(e){e.access=function(e,t,s){s.enumerable=!1},e.cyclic=function(e,t,s){s.enumerable=!1}}(t=e.NonEnumerable||(e.NonEnumerable={}))}(t=e.Decor||(e.Decor={})),e.protoNoEnum=function(e,t){t.forEach((t=>{if(!Object.getOwnPropertyNames(e.prototype).includes(t)){const s=`\`${e.name}\` prototype has no property named "${t}"`;throw new TypeError(s)}Object.defineProperty(e.prototype,t,{enumerable:!1})}))},e.instNoEnum=function(e,t){s(e,t,{enumerable:!1})},e.propNoWrite=function(e,t){s(e,t,{writable:!1})},e.prependComment=function(e,t){e.parentNode.insertBefore(document.createComment(" "+t+" "),e)},e.camelCaseTransforms=function(e){const t=e.replace(/[A-Z]/g,(e=>" "+e.toLowerCase()));return Object.freeze({spaceyLowercase:t,spaceyUppercase:t.toUpperCase(),spaceyCapitalized:t.split(" ").map((e=>e.charAt(0).toUpperCase()+e.substring(1))).join(" ")})},e.mkEl=function(e,t,s){const r=document.createElement(e);try{Object.seal(r)}catch(e){}return r.classList.add(...t),"button"===e?r.type="button":"a"===e&&(r.rel="noopener"),void 0!==s&&Object.assign(r,s),r}}(r||(r={})),Object.freeze(r)},502:(e,t,s)=>{"use strict";s.r(t),s.d(t,{SkServer:()=>r,Group:()=>i,GroupEv:()=>a,GameEv:()=>o});class r{}!function(e){let t;e.PROTOCOL="http://",e.DEFAULT_PORT=80,function(e){e.GROUP_JOINER="/joiner.",e.GROUP_LOBBY_PREFIX="/group.",e.GROUP_GAME_PREFIX="/group-game."}(t=e.Nsps||(e.Nsps={}))}(r||(r={})),Object.freeze(r),Object.freeze(r.prototype);class i{}var a,o;!function(e){let t,s,r,i;!function(e){let t;!function(e){e.EVENT_NAME="group-lobby-user-info-change"}(t=e.UserInfoChange||(e.UserInfoChange={}))}(t=e.Socket||(e.Socket={})),function(e){e.REGEXP=/(?:[a-zA-Z0-9:-]+)/,e.MaxLength=30}(s=e.Name||(e.Name={})),function(e){e.REGEXP=/(?:[a-zA-Z0-9:-]*)/,e.MaxLength=30}(r=e.Passphrase||(e.Passphrase={})),e.GameServerReconnectionAttempts=2,e.DEFAULT_TTL=20,function(e){e.EVENT_NAME="group-exist";class t{constructor(e,t){this.groupName=e,this.passphrase=t}}let s;e.RequestCreate=t,function(e){let t;!function(e){e.OKAY="okay",e.NOPE="nope"}(t=e.Response||(e.Response={}))}(t=e.RequestCreate||(e.RequestCreate={})),function(e){e.IN_LOBBY="in-lobby",e.IN_GAME="in-game",e.DELETE="delete"}(s=e.Status||(e.Status={}))}(i=e.Exist||(e.Exist={}))}(i||(i={})),Object.freeze(i),Object.freeze(i.prototype),function(e){e.CREATE_GAME="group-game-create"}(a||(a={})),function(e){e.CREATE_GAME="game-create",e.RESET="game-reset",e.UNPAUSE="game-unpause",e.PAUSE="game-pause",e.RETURN_TO_LOBBY="game-return-to-lobby"}(o||(o={}))},951:(e,t,s)=>{"use strict";s.d(t,{J5:()=>r,Uo:()=>i}),Object.freeze({behavior:"smooth",block:"center",inline:"center"});class r{}!function(e){let t,s,r;e.Family=Object.freeze({HUMAN:"HUMAN",CHASER:"CHASER"}),e.Family,function(e){e.NULL=void 0}(t=e.Id||(e.Id={})),function(e){e.REGEXP=/[ a-zA-Z0-9:-]+/,e.MAX_LENGTH=15}(s=e.Username||(e.Username={})),function(e){e.LOREM_IPSUM="lorem-ipsum"}(r=e.Avatar||(e.Avatar={})),function(e){const t=Object.values(e).filter((e=>"string"==typeof e));e.GET_RANDOM=function(){return t[Math.random()*t.length]}}(r=e.Avatar||(e.Avatar={})),e.MoveType=Object.freeze({NORMAL:"NORMAL",BOOST:"BOOST"}),e.MoveType}(r||(r={})),Object.freeze(r),Object.freeze(r.prototype);class i{}!function(e){let t,s,r;!function(e){e.REGEXP=new RegExp("^[a-zA-Z0-9!@#$%^&*()-_=+;:'\"\\|,.<>/?]+$")}(t=e.Seq||(e.Seq={})),function(e){e.NULL=Object.freeze({char:"",seq:""})}(s=e.CharSeqPair||(e.CharSeqPair={})),function(e){e.MAX=4}(r=e.WeightExaggeration||(e.WeightExaggeration={})),e.CHAR_HIT_COUNT_SEED_CEILING=5,e._RemapTemplates=Object.freeze({IDENTITY:e=>e,TO_LOWER:e=>e.toLowerCase()}),e._RemapTemplates,e.FrontendDescs=Object.freeze([{id:"engl-low",module:"English",export:"Lowercase",numLeaves:26,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"English Lowercase (qwerty)",blurb:""},{id:"engl-mix",module:"English",export:"MixedCase",numLeaves:52,remapFunc:e._RemapTemplates.IDENTITY,displayName:"English Mixed-Case (Querty)",blurb:""},{id:"japn-hir",module:"Japanese",export:"Hiragana",numLeaves:71,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Hiragana",blurb:""},{id:"japn-kat",module:"Japanese",export:"Katakana",numLeaves:70,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Katakana",blurb:""},{id:"kore-dub",module:"Korean",export:"Dubeolsik",numLeaves:9177,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Dubeolsik (두벌식 키보드)",blurb:"The most common keyboard layout, and South Korea's only Hangul standard since 1969. Consonants are on the left, and vowels on the right."},{id:"kore-sub",module:"Korean",export:"Sebeolsik",numLeaves:10206,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Sebeolsik (세벌식 최종 키보드)",blurb:"Another Hangul keyboard layout used in South Korea, and the final Sebeolsik layout designed by Dr. Kong Byung Woo, hence the name. Syllable-initial consonants are on the right, final consonants on the left, and vowels in the middle. It is more ergonomic than the dubeolsik, but not widely used."},{id:"kore-rom",module:"Korean",export:"Romanization",numLeaves:3990,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Korean Revised Romanization",blurb:"The Revised Romanization of Korean (국어의 로마자 표기법; 國語의 로마字 表記法) is the official South Korean language romanization system. It was developed by the National Academy of the Korean Language from 1995, and was released on 7 July 2000 by South Korea's Ministry of Culture and Tourism"},{id:"engl-cell-enc",module:"English",export:"OldCellphone.Encode",numLeaves:8,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Old Cellphone Keyboard",blurb:""}].map((e=>Object.freeze(e)))),e.FrontendDescs,e.GET_FRONTEND_DESC_BY_ID=function(t){return e.FrontendDescs.find((e=>e.id===t))}}(i||(i={})),Object.freeze(i),Object.freeze(i.prototype)},985:(e,t,s)=>{"use strict";s.r(t),s.d(t,{Grid:()=>a});var r=s(406),i=s(495);class a{constructor(e){this.static=e.gridClass,this.dimensions=e.dimensions,this.tile=new i.N(this),r.JsUtils.propNoWrite(this,["static","dimensions","tile"])}get area(){return this.static.getArea(this.dimensions)}reset(){this.forEachTile((e=>e.reset()))}getDestsFromSourcesTo(e){return Array.from(new Set(this.tile.sourcesTo(e).get.flatMap((e=>this.tile.destsFrom(e.coord).get))))}getRandomCoord(){return this.static.getRandomCoord(this.dimensions)}}!function(e){e.getImplementation=t=>e._Constructors[t]}(a||(a={}))},789:(e,t,s)=>{"use strict";s.r(t),s.d(t,{Tile:()=>h});var r,i,a,o,n=s(780),l=s(406),c=s(951);class h{constructor(e){r.set(this,void 0),i.set(this,void 0),a.set(this,void 0),o.set(this,void 0),this.coord=e,l.JsUtils.propNoWrite(this,["coord"]),(0,n.__classPrivateFieldSet)(this,r,c.J5.Id.NULL)}reset(){this.evictOccupant(),this.lastKnownUpdateId=0,this.freeHealth=0,this.setLangCharSeqPair(c.Uo.CharSeqPair.NULL)}_setOccupant(e,t){(0,n.__classPrivateFieldSet)(this,r,e)}get isOccupied(){return this.occupantId!==c.J5.Id.NULL}evictOccupant(){(0,n.__classPrivateFieldSet)(this,r,c.J5.Id.NULL)}get occupantId(){return(0,n.__classPrivateFieldGet)(this,r)}get freeHealth(){return(0,n.__classPrivateFieldGet)(this,i)}set freeHealth(e){(0,n.__classPrivateFieldSet)(this,i,e)}setLangCharSeqPair(e){(0,n.__classPrivateFieldSet)(this,a,e.char),(0,n.__classPrivateFieldSet)(this,o,e.seq)}get langChar(){return(0,n.__classPrivateFieldGet)(this,a)}get langSeq(){return(0,n.__classPrivateFieldGet)(this,o)}}r=new WeakMap,i=new WeakMap,a=new WeakMap,o=new WeakMap,Object.freeze(h),Object.freeze(h.prototype)},495:(e,t,s)=>{"use strict";s.d(t,{N:()=>a});var r,i=s(780);class a{constructor(e){r.set(this,void 0),(0,i.__classPrivateFieldSet)(this,r,e),Object.freeze(this)}get _source(){return(0,i.__classPrivateFieldGet)(this,r)}at(...e){return(0,i.__classPrivateFieldGet)(this,r)._getTileAt(...e)}destsFrom(...e){return new o((0,i.__classPrivateFieldGet)(this,r)._getTileDestsFrom(...e))}sourcesTo(...e){return new o((0,i.__classPrivateFieldGet)(this,r)._getTileSourcesTo(...e))}}r=new WeakMap,Object.freeze(a),Object.freeze(a.prototype);class o{constructor(e){this.contents=e,Object.seal(this)}get occupied(){return this.contents=this.contents.filter((e=>e.isOccupied)),this}get unoccupied(){return this.contents=this.contents.filter((e=>!e.isOccupied)),this}get get(){return this.contents}}Object.freeze(o),Object.freeze(o.prototype)},504:(e,t,s)=>{"use strict";var r;s.r(t),s.d(t,{Game:()=>r}),function(e){let t,s;!function(e){e.SERVER="SERVER",e.ONLINE="ONLINE",e.OFFLINE="OFFLINE"}(t=e.Type||(e.Type={})),Object.freeze(t),function(e){e.PLAYING="PLAYING",e.PAUSED="PAUSED",e.OVER="OVER"}(s=e.Status||(e.Status={})),Object.freeze(s),e.K=Object.freeze({HEALTH_UPDATE_CHANCE:.1,AVERAGE_HEALTH_TO_SPAWN_ON_TILE:1,PORTION_OF_MOVES_THAT_ARE_BOOST:.4,HEALTH_COST_OF_BOOST(e,t){const s=t(this.AVERAGE_HEALTH_TO_SPAWN_ON_TILE/e);return this.AVERAGE_HEALTH_TO_SPAWN_ON_TILE/s/this.PORTION_OF_MOVES_THAT_ARE_BOOST},HEALTH_EFFECT_FOR_DOWNED_PLAYER:.6,EVENT_RECORD_WRAPPING_BUFFER_LENGTH:128,EVENT_RECORD_FORWARD_WINDOW_LENGTH:64})}(r||(r={})),Object.freeze(r)},671:(e,t,s)=>{"use strict";var r;s.r(t),s.d(t,{EventRecordEntry:()=>r}),function(e){e.EVENT_ID_REJECT=-1}(r||(r={})),Object.freeze(r)},699:(e,t,s)=>{"use strict";s.r(t),s.d(t,{PlayerActionEvent:()=>r});var r,i=s(671);!function(e){e.INITIAL_REQUEST_ID=-1,e.EVENT_NAME=Object.freeze({BUBBLE:"player-bubble",MOVEMENT:"player-movement"});class t{constructor(e,t){this.eventId=i.EventRecordEntry.EVENT_ID_REJECT,this.affectedNeighbours=void 0,this.playerId=e,this.playerLastAcceptedRequestId=t}}e.Bubble=t,e.Movement=class extends t{constructor(e,t,s,r){super(e,t),this.newPlayerHealth=void 0,this.tileHealthModDescs=void 0,this.destModDesc={coord:s.coord,lastKnownUpdateId:s.lastKnownUpdateId,newCharSeqPair:void 0,newFreeHealth:void 0},this.moveType=r}}}(r||(r={})),Object.freeze(r)},604:(e,t,s)=>{"use strict";s.r(t),s.d(t,{GamepartManager:()=>j});var r,i=s(780),a=s(406),o=s(979),n=s(504);!function(e){let t;!function(e){e.EUCLID2="EUCLID2",e.BEEHIVE="BEEHIVE"}(t=e.System||(e.System={})),e.equals=function(e,t){return e._equals(t)}}(r||(r={})),Object.freeze(r);var l=s(216);class c extends l.Player{constructor(e,t){if(super(e,t),e.gameType===n.Game.Type.ONLINE)throw new TypeError("OnlineGames should be using regular Players instead.")}_notifyGameNowPlaying(){this.delayedMovementContinue()}_notifyGameNowPaused(){this.game.cancelTimeout(this._scheduledMovementCallbackId),this._scheduledMovementCallbackId=void 0}_notifyGameNowOver(){this.game.cancelTimeout(this._scheduledMovementCallbackId),this._scheduledMovementCallbackId=void 0}movementContinue(){const e=this.computeDesiredDest();this._nextMovementTimerMultiplier=this.game.grid.tile.at(e).langSeq.length,this.makeMovementRequest(this.game.grid.getUntToward(e,this.coord),this.getNextMoveType()),this.delayedMovementContinue()}delayedMovementContinue(){this._scheduledMovementCallbackId=this.game.setTimeout(this.movementContinue.bind(this),this.computeNextMovementTimer()*this._nextMovementTimerMultiplier)}}!function(e){e.of=(t,s)=>{const r=s.familyId;return new e._Constructors[r](t,s)}}(c||(c={})),a.JsUtils.protoNoEnum(c,["movementContinue"]);var h=s(951);class d{constructor(e){const t=[];for(const s of e)t[s]=new d.Entry;this.entries=t,a.JsUtils.propNoWrite(this,["entries"])}reset(){for(const e of this.entries)e.reset()}}!function(e){class t{constructor(){this.moveCounts={}}reset(){this.totalHealthPickedUp=0,Object.getOwnPropertyNames(h.J5.MoveType).forEach((e=>{this.moveCounts[e]=0}))}}e.Entry=t,Object.freeze(t),Object.freeze(t.prototype)}(d||(d={})),Object.freeze(d),Object.freeze(d.prototype);var u,p,m,E,_=s(671),g=(s(699),s(473));class f{constructor(e,t,s){u.set(this,void 0),p.set(this,void 0),m.set(this,void 0),this.gameType=e;const r=this._getGridImplementation(s.coordSys);this.grid=new r({gridClass:r,tileClass:t.tileClass,coordSys:s.coordSys,dimensions:s.gridDimensions}),(0,i.__classPrivateFieldSet)(this,u,t.onGameBecomeOver),this.langFrontend=h.Uo.GET_FRONTEND_DESC_BY_ID(s.langId),this._playerStatusCtor=t.playerStatusCtor,this.players=this.createPlayers(s),this.operators=Object.freeze(this.players.filter((e=>e.isALocalOperator))),this.setCurrentOperator(0);{const e=[];if(this.players.forEach((t=>{e[t.teamId]||(e[t.teamId]=[]),e[t.teamId].push(t)})),this.teams=e.map(((e,t)=>new g.S(t,e))),this.teams.every((e=>e.id===g.S.ElimOrder.IMMORTAL)))throw new Error("All teams are immortal. The game will never end.")}a.JsUtils.propNoWrite(this,["gameType","grid","langFrontend","players","operators","teams","_playerStatusCtor"]),this.players.forEach((e=>e._afterAllPlayersConstruction()))}reset(){return this.grid.reset(),(0,i.__classPrivateFieldSet)(this,m,n.Game.Status.PAUSED),Promise.resolve()}createPlayers(e){const t=e.playerDescs=this.gameType===n.Game.Type.ONLINE?e.playerDescs:l.Player.CtorArgs.finalize(e.playerDescs);return Object.freeze(t.map((e=>e.familyId===l.Player.Family.HUMAN?e.isALocalOperator?this._createOperatorPlayer(e):new l.Player(this,e):this._createArtifPlayer(e))))}serializeResetState(){const e=[],t=this.players.map((e=>e.coord)),s=[];return this.grid.forEachTile((t=>{t.lastKnownUpdateId++,e.push({char:t.langChar,seq:t.langSeq}),t.freeHealth&&s.push({coord:t.coord,health:t.freeHealth})})),{csps:e,playerCoords:t,healthCoords:s}}deserializeResetState(e){this.grid.forEachTile(((t,s)=>{t.setLangCharSeqPair(e.csps[s]),t.lastKnownUpdateId++})),e.playerCoords.forEach(((e,t)=>{this.players[t].reset(this.grid.tile.at(e))})),e.healthCoords.forEach((e=>{this.grid.tile.at(e.coord).freeHealth=e.health}))}get currentOperator(){return(0,i.__classPrivateFieldGet)(this,p)}setCurrentOperator(e){const t=this.operators[e];this.currentOperator!==t&&(t._notifyWillBecomeCurrent(),(0,i.__classPrivateFieldSet)(this,p,t))}get status(){return(0,i.__classPrivateFieldGet)(this,m)}statusBecomePlaying(){if(this.status!==n.Game.Status.PLAYING){if(this.status!==n.Game.Status.PAUSED)throw new Error("Can only resume a game that is currently paused.");this.players.forEach((e=>{e._notifyGameNowPlaying()})),this._abstractStatusBecomePlaying(),(0,i.__classPrivateFieldSet)(this,m,n.Game.Status.PLAYING)}else console.log("[statusBecomePlaying]: Game is already playing")}statusBecomePaused(){this.status!==n.Game.Status.PAUSED?this.status!==n.Game.Status.OVER&&(this.players.forEach((e=>{e._notifyGameNowPaused()})),this._abstractStatusBecomePaused(),(0,i.__classPrivateFieldSet)(this,m,n.Game.Status.PAUSED)):console.log("[statusBecomePaused]: Game is already paused")}statusBecomeOver(){if(this.status!==n.Game.Status.PLAYING)throw new Error("Can only end a game that is currently playing.");this.players.forEach((e=>{e._notifyGameNowOver()})),this._abstractStatusBecomeOver(),(0,i.__classPrivateFieldSet)(this,m,n.Game.Status.OVER),(0,i.__classPrivateFieldGet)(this,u).call(this),console.log("game is over!")}_abstractStatusBecomePlaying(){}_abstractStatusBecomePaused(){}_abstractStatusBecomeOver(){}}u=new WeakMap,p=new WeakMap,m=new WeakMap,a.JsUtils.protoNoEnum(f,["_abstractStatusBecomePlaying","_abstractStatusBecomePaused","_abstractStatusBecomeOver"]),Object.freeze(f),Object.freeze(f.prototype);class v extends f{constructor(e,t,s){super(e,t,s),E.set(this,void 0),this.eventRecordBitmap=[]}reset(){const e=super.reset();return this.eventRecordBitmap.fill(!1,0,n.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH),(0,i.__classPrivateFieldSet)(this,E,0),e}get nextUnusedEventId(){return(0,i.__classPrivateFieldGet)(this,E)}_recordEvent(e){const t=e.eventId,s=t%n.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH;if(t===_.EventRecordEntry.EVENT_ID_REJECT)throw new TypeError("Do not try to record events for rejected requests.");if(t<0||t!==Math.trunc(t))throw new RangeError("Event ID's must only be assigned positive, integer values.");if(this.eventRecordBitmap[s])throw new Error("Event ID's must be assigned unique values.");this.eventRecordBitmap[s]=!0,this.eventRecordBitmap[(t+n.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH-n.Game.K.EVENT_RECORD_FORWARD_WINDOW_LENGTH)%n.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH]=!1,(0,i.__classPrivateFieldSet)(this,E,+(0,i.__classPrivateFieldGet)(this,E)+1)}executeTileModEvent(e,t=!0){Object.freeze(e);const s=this.grid.tile.at(e.coord);if(s.lastKnownUpdateId>e.lastKnownUpdateId)return s;if(s.lastKnownUpdateId===e.lastKnownUpdateId)throw new RangeError("never");return e.newCharSeqPair&&(s.setLangCharSeqPair(e.newCharSeqPair),t&&this.operators.filter((e=>e.tile.destsFrom().get.includes(s))).forEach((e=>e.seqBufferAcceptKey("")))),s.lastKnownUpdateId=e.lastKnownUpdateId,s.freeHealth=e.newFreeHealth,s}executePlayerMoveEvent(e){var t;const s=this.players[e.playerId],r=e.playerLastAcceptedRequestId-s.lastAcceptedRequestId;if(e.eventId===_.EventRecordEntry.EVENT_ID_REJECT)return void(0===r&&(s.requestInFlight=!1));this._recordEvent(e);const i=this.executeTileModEvent(e.destModDesc,s!==this.currentOperator);if(null===(t=e.tileHealthModDescs)||void 0===t||t.forEach((e=>{this.executeTileModEvent(e)})),r>1){if(s===this.currentOperator)throw new Error("never")}else{if(s.requestInFlight=!1,!(s===this.currentOperator?1===r:r<=1))throw new RangeError("never");s.status.health=e.newPlayerHealth.health,s.moveTo(i),s.lastAcceptedRequestId=e.playerLastAcceptedRequestId}}executePlayerBubbleEvent(e){this.players[e.playerId].requestInFlight=!1,e.eventId!==_.EventRecordEntry.EVENT_ID_REJECT&&this._recordEvent(e)}}E=new WeakMap,Object.freeze(v),Object.freeze(v.prototype);var O,y=s(985);!function(e){let t,s,r,i,a,o;e.GLOBAL_IDS={PUBLIC_GAME_HOST_URLS:"public-game-hosts-list",CURRENT_HOST_GROUPS:"current-host-groups-list"},function(e){e.Class={TEXT_SELECT_DISABLED:"text-select-disabled",FILL_PARENT:"fill-parent",CENTER_CONTENTS:"center-contents",STACK_CONTENTS:"stack-contents",INPUT_GROUP:"sk-input-group",INPUT_GROUP_ITEM:"sk-input-group-item"},e.Dataset={COLOUR_SCHEME:"skColourScheme"}}(t=e.General||(e.General={})),function(e){e.Class={BASE:"tile",POINTER_HB:"tile__pointer-hitbox",LANG_CHAR_WRAP:"tile__char",LANG_SEQ:"tile__seq"},e.Dataset={HEALTH:"health"}}(s=e.Tile||(e.Tile={})),function(e){e.Class={GRID:"game-grid",SCROLL_OUTER:"game-grid-scroll-outer",SCROLL_INNER:"game-grid-scroll-inner",IMPL_BODY:"game-grid-impl-body",KBD_DC:"game-grid-kbd-dc",KBD_DC_ICON:"game-grid-kbd-dc__icon",PAUSE_OL:"game-grid-pause-overlay",PAUSE_OL_ICON:"game-grid-pause-overlay__icon",PLAYER_IOB_ROOT:"grid-player-intersection-root"},e.Dataset={IMPL_COORD_SYS:"coordSys",GAME_STATE:{KEY:"gameState",VALUES:{PLAYING:"playing",PAUSED:"paused",OVER:"over"}}}}(r=e.Grid||(e.Grid={})),function(e){e.Class={BASE:"player",FACE:"player__face",DOWNED_OVERLAY:"player__downed-overlay",SHORT_SPOTLIGHT:"player__spotlight-short",LONG_SPOTLIGHT:"player__spotlight-long"},e.Dataset={DOWNED:{KEY:"downed",VALUES:{TEAM:"team",SELF:"self",NO:"no"}},FACE_SWATCH:"face"}}(i=e.Player||(e.Player={})),function(e){let t;e.Id={ALL_SCREENS:"all-screens-container",SCREEN_TINT:"screen-tint"},e.Class={BASE:"sk-screen",NAV_NEXT:"screen--next-button",NAV_PREV:"screen--prev-button"},e.Dataset={CURRENT:"current"},function(e){let t,s,r,i,a,o;!function(e){e.Class={BASE:"screen-home",NAV:"screen-home--nav",NAV_PLAY_OFFLINE:"screen-home--nav--play-offline",NAV_PLAY_ONLINE:"screen-home--nav--play-online",NAV_HOW_TO_PLAY:"screen-home--nav--how-to-play",NAV_HOW_TO_HOST:"screen-home--nav--how-to-host",NAV_COLOURS:"screen-home--nav--colour-scheme",NAV_VIEW_REPO:"screen-home--nav--goto-repo",NAV_RPT_ISSUE:"screen-home--nav--report-issue"}}(t=e.Home||(e.Home={})),function(e){e.Class={BASE:"screen-colour",OPTION:"screen-colour--opt",OPTION_LABEL:"screen-colour--opt-label",OPTION_LABEL_TITLE:"screen-colour--opt-label--title",OPTION_LABEL_AUTHOR:"screen-colour--opt-label--author"}}(s=e.ColourCtrl||(e.ColourCtrl={})),function(e){e.Class={BASE:"screen-play",GRID_WRAPPER:"screen-play--grid-wrapper",CONTROLS_BAR:"screen-play--controls-bar",PLAYERS_BAR:"screen-play--players-bar"}}(r=e.Play||(e.Play={})),function(e){e.Class={BASE:"screen-setup",LANG_SEL:"screen-setup--lang-sel",LANG_WEIGHT_EXAGG:"screen-setup--lang-weight-exagg"},e.Id={LANG_WEIGHT_EXAGGERATION_LIST:"screen-setup--lang-weight-exaggeration-list"}}(i=e.Setup||(e.Setup={})),function(e){e.Class={BASE:"screen-joiner",CONTENT_WRAPPER:"screen-joiner--content-wrapper",HOST_URL:"screen-joiner--host-url",GROUP_NAME:"screen-joiner--group-name",PASSPHRASE:"screen-joiner--passphrase"}}(a=e.GroupJoiner||(e.GroupJoiner={})),function(e){e.Class={BASE:"screen-lobby",SEC_CLIENT_INFO:"screen-lobby--client-info-section",SEC_TEAMS:"screen-lobby--teams-section",TEAM:"screen-lobby--team",PLAYER:"screen-lobby--player",PLAYER_NAME:"screen-lobby--player__name"}}(o=e.GroupLobby||(e.GroupLobby={}))}(t=e.Impl||(e.Impl={}))}(a=e.Screen||(e.Screen={})),function(e){e.Class={BASE:"sk-pick-one",OPT_BASE:"sk-pick-one--opt"}}(o=e.SkPickOne||(e.SkPickOne={}))}(O||(O={})),Object.freeze(O.Player.Dataset.DOWNED),a.JsUtils.deepFreeze(O);var T,b,N,P,S,A,I,C,R=s(789);class w extends R.Tile{constructor(e){super(e),T.set(this,void 0),(0,i.__classPrivateFieldSet)(this,T,a.JsUtils.mkEl("div",[O.General.Class.CENTER_CONTENTS,O.General.Class.STACK_CONTENTS,O.Tile.Class.BASE])).setAttribute("aria-label","Tile");{const e=a.JsUtils.mkEl("div",[O.Tile.Class.POINTER_HB]);e.setAttribute("aria-hidden","true"),(0,i.__classPrivateFieldGet)(this,T).appendChild(e)}{const e=a.JsUtils.mkEl("div",[O.Tile.Class.LANG_CHAR_WRAP]);e.setAttribute("role","presentation");const t=this.langCharElem=a.JsUtils.mkEl("div",[]);e.appendChild(t),(0,i.__classPrivateFieldGet)(this,T).appendChild(e)}{const e=this.langSeqElem=a.JsUtils.mkEl("div",[O.Tile.Class.LANG_SEQ]);e.setAttribute("role","tooltip"),(0,i.__classPrivateFieldGet)(this,T).appendChild(e)}a.JsUtils.propNoWrite(this,["langCharElem","langSeqElem"])}_addToDom(e){e.appendChild((0,i.__classPrivateFieldGet)(this,T))}_setOccupant(e,t){super._setOccupant(e,t),this.langCharElem.parentElement.insertAdjacentElement("beforebegin",t.playerElem),this.langSeqElem.textContent=t.username}evictOccupant(){super.evictOccupant(),this.langSeqElem.textContent=this.langSeq}set freeHealth(e){super.freeHealth=e,this.freeHealth>0?(0,i.__classPrivateFieldGet)(this,T).dataset[O.Tile.Dataset.HEALTH]=this.freeHealth.toString():delete(0,i.__classPrivateFieldGet)(this,T).dataset[O.Tile.Dataset.HEALTH]}get freeHealth(){return super.freeHealth}setLangCharSeqPair(e){super.setLangCharSeqPair(e),this.langCharElem.textContent=this.langChar,this.langSeqElem.textContent=this.langSeq}}T=new WeakMap,a.JsUtils.protoNoEnum(w,["_addToDom"]),Object.freeze(w),Object.freeze(w.prototype),function(e){e.getImplementation=t=>e._Constructors[t]}(b||(b={}));class G{_superVisibleGrid(e,t){if(e.tileClass!==w)throw new TypeError("never");const s=O.Grid;t.setAttribute("role","presentation"),t.classList.add(s.Class.IMPL_BODY),t.dataset[s.Dataset.IMPL_COORD_SYS]=e.coordSys,t.translate=!1,t.spellcheck=!1,this.baseElem=t;const r=a.JsUtils.mkEl("div",[O.Player.Class.SHORT_SPOTLIGHT]),i=a.JsUtils.mkEl("div",[O.Player.Class.LONG_SPOTLIGHT]);this.spotlightElems=Object.freeze([r,i])}}Object.freeze(G),Object.freeze(G.prototype),function(e){class t{constructor(e){this.x=e.x,this.y=e.y,Object.freeze(this)}_equals(e){return this.x===e.x&&this.y===e.y}round(){return new t({x:Math.round(this.x),y:Math.round(this.y)})}oneNorm(e){return this.sub(e).originOneNorm()}originOneNorm(){return Math.abs(this.x)+Math.abs(this.y)}infNorm(e){return this.sub(e).originInfNorm()}originInfNorm(){return Math.max(Math.abs(this.x),Math.abs(this.y))}axialAlignment(e){return this.sub(e).originAxialAlignment()}originAxialAlignment(){return Math.abs(Math.abs(this.x)-Math.abs(this.y))/(Math.abs(this.x)+Math.abs(this.y))}add(e){return new t({x:this.x+e.x,y:this.y+e.y})}sub(e){return new t({x:this.x-e.x,y:this.y-e.y})}mul(e){return new t({x:e*this.x,y:e*this.y})}}e.Coord=t,Object.freeze(t),Object.freeze(t.prototype);class s extends y.Grid{constructor(e){super(e);const s=[];for(let r=0;rMath.random()-.5)).forEach((t=>e(t)))}getUntToward(e,t){const s=this.tile.destsFrom(t).unoccupied.get;if(0===s.length)return this.tile.at(t);if(1===s.length)return s[0];s.sort(((t,s)=>t.coord.oneNorm(e)-s.coord.oneNorm(e))).sort(((t,s)=>t.coord.infNorm(e)-s.coord.infNorm(e)));for(let t=1;ts[0].coord.infNorm(e)){s.splice(t);break}if(1===s.length)return s[0];if(s[0].coord.x-t.x==0||s[0].coord.y-t.y==0){if(t.axialAlignment(t.sub(e))-.5>0)return s[0];s.shift()}return s[Math.floor(s.length*Math.random())]}getUntAwayFrom(e,t){return this.getUntToward(t.add(t.sub(e)),t)}getDestsFromSourcesTo(e){return this._getTileDestsFrom(e,2)}getRandomCoordAround(e,s){return new t({x:e.x+Math.trunc(2*s*(Math.random()-.5)),y:e.y+Math.trunc(2*s*(Math.random()-.5))})}_getTileAt(e){return this.grid[e.y][e.x]}_getTileDestsFrom(e,t=1){let s=e.y-t,r=e.y+t+1,i=e.x-t,a=e.x+t+1;return s>=this.dimensions.height||r<0||i>=this.dimensions.width||a<0?[]:this.grid.slice(Math.max(0,s),Math.min(this.dimensions.height,r)).flatMap((e=>e.slice(Math.max(0,i),Math.min(this.dimensions.width,a))))}_getTileSourcesTo(e,t=1){return this._getTileDestsFrom(e,t)}minMovesFromTo(e,t){return Math.min(Math.abs(t.x-e.x),Math.abs(t.y-e.y))}static getSpawnCoords(e,t){const r=[];return e.map((e=>{const i=[];for(;e>0;){let a;do{a=s.getRandomCoord(t)}while(r.find((e=>a._equals(e))));i.push(a),r.push(a),e--}return i}))}static getArea(e){return e.height*e.width}static getDiameterOfLatticePatchHavingArea(e){return Math.sqrt(e)}static getRandomCoord(e){const s=Math.floor(e.width*Math.random()),r=Math.floor(e.height*Math.random());return new t({x:s,y:r})}}s.SIZE_LIMITS=Object.freeze({height:Object.freeze({min:11,max:51}),width:Object.freeze({min:11,max:51})}),e.Grid=s,a.JsUtils.protoNoEnum(s,["_getTileAt","_getTileDestsFrom","_getTileSourcesTo"]),Object.freeze(s),Object.freeze(s.prototype)}(N||(N={})),Object.freeze(N);class L extends N.Grid{constructor(e){super(e);const t=a.JsUtils.mkEl("div",[]);t.style.setProperty("--euclid2-grid-width",this.dimensions.width.toString());for(const e of this.grid)for(const s of e)s._addToDom(t);this._superVisibleGrid(e,t)}}a.JsUtils.applyMixins(L,[G]),Object.freeze(L),Object.freeze(L.prototype),function(e){class t{constructor(e){this.dash=e.dash,this.bash=e.bash,Object.freeze(this)}_equals(e){return this.dash===e.dash&&this.bash===e.bash}round(){const e=Math.floor(this.dash),s=Math.floor(this.bash),r=e-this.dash,i=s-this.bash;return r>2*i?new t({dash:e+1,bash:s}):r<.5*i?new t({dash:e,bash:s+1}):Math.min(r,i)>.5?new t({dash:e+1,bash:s+1}):new t({dash:e,bash:s})}add(e){return new t({dash:this.dash+e.dash,bash:this.bash+e.bash})}sub(e){return new t({dash:this.dash-e.dash,bash:this.bash-e.bash})}mul(e){return new t({dash:e*this.dash,bash:e*this.bash})}}e.Coord=t,Object.freeze(t),Object.freeze(t.prototype);class s extends y.Grid{constructor(e){super(e),this.grid=Object.freeze(void 0)}static getAmbiguityThreshold(){return 18}static getSizeLimits(){return this.SIZE_LIMITS}forEachTile(e){let t=0;for(const s of this.grid)for(const r of s)e(r,t++)}shuffledForEachTile(e){this.grid.flat().sort(((e,t)=>Math.random()-.5)).forEach((t=>e(t)))}getUntToward(e,t){}getUntAwayFrom(e,t){return this.getUntToward(t.add(t.sub(e)),t)}getRandomCoordAround(e,t){}_getTileAt(e){}_getTileDestsFrom(e,t=1){}_getTileSourcesTo(e,t=1){}minMovesFromTo(e,t){}getDestsFromSourcesTo(e){return this._getTileDestsFrom(e,2)}static getSpawnCoords(e,t){}static getArea(e){const t=Math.min(e.fslash,e.bslash),s=Math.max(e.fslash,e.bslash),r=-1+e.dash+t;let i=2*t*(e.dash+r);return i+=(s-t-1)*r,i}static getDiameterOfLatticePatchHavingArea(e){if(e<.25)throw new RangeError("determinant of a radical will be strictly negative.");return 1+(-3+Math.sqrt(9-12*(1-e)))/6*2}static getRandomCoord(e){return new t(void 0)}}s.SIZE_LIMITS=Object.freeze({dash:Object.freeze({min:10,max:50}),bslash:Object.freeze({min:10,max:50}),fslash:Object.freeze({min:10,max:50})}),e.Grid=s,a.JsUtils.protoNoEnum(s,["_getTileAt","_getTileDestsFrom","_getTileSourcesTo"]),Object.freeze(s),Object.freeze(s.prototype)}(P||(P={})),Object.freeze(P);class M extends P.Grid{constructor(e){super(e),this._superVisibleGrid(e,void 0)}}a.JsUtils.applyMixins(M,[G]),Object.freeze(M),Object.freeze(M.prototype);class F extends c{constructor(e,t){super(e,t),S.set(this,void 0),this.behaviour=Object.freeze(Object.assign({},F.Behaviour.DEFAULT,t.familyArgs)),this.grid=this.game.grid}_afterAllPlayersConstruction(){super._afterAllPlayersConstruction(),this.threatProximity=this.game.teams.filter((e=>e.id!==this.teamId)).flatMap((e=>e.members)),this.targetProximity=[...this.threatProximity],a.JsUtils.propNoWrite(this,["threatProximity","targetProximity","behaviour","grid"])}reset(e){super.reset(e),(0,i.__classPrivateFieldSet)(this,S,this.coord)}moveTo(e){(0,i.__classPrivateFieldSet)(this,S,this.coord),super.moveTo(e)}computeDesiredDest(){this.threatProximity.sort(((e,t)=>this.grid.minMovesFromTo(e.coord,this.coord)-this.grid.minMovesFromTo(t.coord,this.coord)));for(const e of this.threatProximity){if(this.grid.minMovesFromTo(e.coord,this.coord)>this.behaviour.fearDistance)break;if(!e.status.isDowned&&e.status.health>this.status.health)return this.grid.getUntAwayFrom(e.coord,this.coord).coord}if(this.targetProximity.sort(((e,t)=>this.grid.minMovesFromTo(this.coord,e.coord)-this.grid.minMovesFromTo(this.coord,t.coord))),this.status.isDowned)for(const e of this.targetProximity){if(this.grid.minMovesFromTo(this.coord,e.coord)>this.behaviour.bloodThirstDistance)break;if(e.status.health{y.Grid._Constructors=Object.freeze({EUCLID2:N.Grid,BEEHIVE:P.Grid}),Object.freeze(y.Grid),Object.freeze(y.Grid.prototype);{const e=c;e._Constructors=Object.freeze({CHASER:F}),Object.freeze(e),Object.freeze(e.prototype)}})();class j extends v{constructor(e,t,r){super(e,t,r),A.set(this,void 0),I.set(this,void 0),C.set(this,void 0),this.averageFreeHealth=r.averageFreeHealthPerTile*this.grid.area,this.averageFreeHealthPerTile=r.averageFreeHealthPerTile,this.healthCostOfBoost=n.Game.K.HEALTH_COST_OF_BOOST(this.averageFreeHealthPerTile,this.grid.static.getDiameterOfLatticePatchHavingArea),(0,i.__classPrivateFieldSet)(this,I,new Set),this.scoreInfo=new d(this.players.map((e=>e.playerId))),a.JsUtils.propNoWrite(this,["averageFreeHealth","averageFreeHealthPerTile","healthCostOfBoost","scoreInfo"]),(0,i.__classPrivateFieldSet)(this,C,s(59)(`./${this.langFrontend.module}.ts`).then((e=>{const t=this.langFrontend.export.split(".").reduce(((e,t)=>e[t]),e[this.langFrontend.module]);this.lang=new t(r.langWeightExaggeration),a.JsUtils.propNoWrite(this,["lang"]);const s=this.grid.static.getAmbiguityThreshold();if(this.lang.numLeavessuper.reset}});return(0,i.__awaiter)(this,void 0,void 0,(function*(){yield e.reset.call(this),(0,i.__classPrivateFieldSet)(this,A,0),(0,i.__classPrivateFieldGet)(this,I).clear(),yield(0,i.__classPrivateFieldGet)(this,C),this.lang.reset(),this.grid.shuffledForEachTile((e=>{e.setLangCharSeqPair(this.dryRunShuffleLangCharSeqAt(e))})),this.teams.forEach((e=>e.reset()));const t=this.grid.static.getSpawnCoords(this.teams.map((e=>e.members.length)),this.grid.dimensions);return this.teams.forEach(((e,s)=>{e.members.forEach(((e,r)=>{e.reset(this.grid.tile.at(t[s][r]))}))})),this.scoreInfo.reset(),Promise.resolve()}))}_createArtifPlayer(e){return c.of(this,e)}dryRunShuffleLangCharSeqAt(e,t=!1){e.setLangCharSeqPair(o.U.CharSeqPair.NULL);let s=this.grid.getDestsFromSourcesTo(e.coord).map((e=>e.langSeq));if(t){const e=o.U.CharSeqPair.NULL.seq;s=s.filter((t=>t!==e))}return this.lang.getNonConflictingChar(s)}get currentFreeHealth(){return(0,i.__classPrivateFieldGet)(this,A)}get freeHealthTiles(){return(0,i.__classPrivateFieldGet)(this,I)}dryRunSpawnFreeHealth(e){var t;let s=this.averageFreeHealth-this.currentFreeHealth;if(s<=0)return;const i=[];for(;s>0;){let a;do{a=this.grid.tile.at(this.grid.getRandomCoord())}while(a.isOccupied||i.find((e=>r.equals(a.coord,e.coord))));const o=n.Game.K.AVERAGE_HEALTH_TO_SPAWN_ON_TILE;if(Math.random()r.equals(a.coord,e.coord))))?s.newFreeHealth=(null!==(t=s.newFreeHealth)&&void 0!==t?t:0)+o:i.push({coord:a.coord,lastKnownUpdateId:1+a.lastKnownUpdateId,newCharSeqPair:void 0,newFreeHealth:a.freeHealth+o})}s-=o}return i}executeTileModEvent(e,t=!0){Object.freeze(e);const s=this.grid.tile.at(e.coord);if(e.lastKnownUpdateId!==1+s.lastKnownUpdateId)throw new RangeError("never");return(0,i.__classPrivateFieldSet)(this,A,(0,i.__classPrivateFieldGet)(this,A)+(e.newFreeHealth-s.freeHealth)),0===e.newFreeHealth?(0,i.__classPrivateFieldGet)(this,I).delete(s):(0,i.__classPrivateFieldGet)(this,I).add(s),super.executeTileModEvent(e,t),s}managerCheckGamePlayingRequest(e){if(this.status!==n.Game.Status.PLAYING)return;const t=this.players[e.playerId];if(!t)throw new Error("No such player exists.");if(e.playerLastAcceptedRequestId!==t.lastAcceptedRequestId)throw new RangeError(e.playerLastAcceptedRequestId{"use strict";s.r(t),s.d(t,{Player:()=>m,PlayerSkeleton:()=>h,PlayerStatus:()=>p});var r,i=s(406),a=s(504),o=s(699),n=s(780),l=s(951),c=s(495);class h extends l.J5{constructor(e,t){if(super(),r.set(this,void 0),Math.trunc(t.playerId)!==t.playerId)throw new RangeError("Player ID's must be integer values.");this.playerId=t.playerId,this.isALocalOperator=t.isALocalOperator,this.game=e,this.status=new this.game._playerStatusCtor(this,t.noCheckGameOver),this.tile=new c.N(new h.TileGetterSource(this)),i.JsUtils.instNoEnum(this,["game"]),i.JsUtils.propNoWrite(this,["playerId","isALocalOperator","game","status","tile"])}_afterAllPlayersConstruction(){this.status._afterAllPlayersConstruction()}reset(e){(0,n.__classPrivateFieldSet)(this,r,e),this.hostTile._setOccupant(this.playerId,this.status.immigrantInfo)}get coord(){return this.hostTile.coord}get hostTile(){return(0,n.__classPrivateFieldGet)(this,r)}moveTo(e){if(this.hostTile.occupantId!==this.playerId){if(this.game.gameType!==a.Game.Type.ONLINE)throw new Error("Linkage between player and occupied tile disagrees.")}else this.hostTile.evictOccupant();if(e.isOccupied){if(this.game.gameType!==a.Game.Type.ONLINE)throw new Error("Only one player can occupy a tile at a time.")}else(0,n.__classPrivateFieldSet)(this,r,e),e._setOccupant(this.playerId,this.status.immigrantInfo)}}r=new WeakMap,function(e){var t,s;class r{constructor(e){t.set(this,void 0),s.set(this,void 0),(0,n.__classPrivateFieldSet)(this,t,e),(0,n.__classPrivateFieldSet)(this,s,e.game.grid.tile._source)}_getTileAt(){return(0,n.__classPrivateFieldGet)(this,s)._getTileAt((0,n.__classPrivateFieldGet)(this,t).coord)}_getTileDestsFrom(){return(0,n.__classPrivateFieldGet)(this,s)._getTileDestsFrom((0,n.__classPrivateFieldGet)(this,t).coord)}_getTileSourcesTo(){return(0,n.__classPrivateFieldGet)(this,s)._getTileSourcesTo((0,n.__classPrivateFieldGet)(this,t).coord)}}t=new WeakMap,s=new WeakMap,e.TileGetterSource=r,Object.freeze(r),Object.freeze(r.prototype)}(h||(h={})),i.JsUtils.protoNoEnum(h,["_afterAllPlayersConstruction"]),Object.freeze(h),Object.freeze(h.prototype);var d,u=s(473);class p{constructor(e,t){d.set(this,void 0),this.player=e,this.noCheckGameOver=t,i.JsUtils.instNoEnum(this,["player"])}reset(){this.health=0}_afterAllPlayersConstruction(){}get immigrantInfo(){}get health(){return(0,n.__classPrivateFieldGet)(this,d)}set health(e){const t=this.isDowned;if((0,n.__classPrivateFieldSet)(this,d,e),t||!this.isDowned||this.noCheckGameOver)return;const s=this.player.team,r=this.player.game.teams;if(s.elimOrder===u.S.ElimOrder.STANDING&&s.members.every((e=>e.status.noCheckGameOver||e.status.isDowned))){const e=1+r.filter((e=>e.elimOrder!==u.S.ElimOrder.STANDING)).length;s.elimOrder=1+r.filter((e=>e.elimOrder!==u.S.ElimOrder.STANDING&&e.elimOrder!==u.S.ElimOrder.IMMORTAL)).length,e===r.length&&this.player.game.statusBecomeOver()}}get isDowned(){return this.health<0}}d=new WeakMap,i.JsUtils.protoNoEnum(p,["_afterAllPlayersConstruction"]),Object.freeze(p),Object.freeze(p.prototype);class m extends h{constructor(e,t){var s;super(e,t),this.familyId=t.familyId,this.teamId=t.teamId,this.username=t.username,this.avatar=null!==(s=t.avatar)&&void 0!==s?s:m.Avatar.GET_RANDOM(),i.JsUtils.propNoWrite(this,["familyId","teamId","username","avatar"])}reset(e){super.reset(e),this.status.reset(),this.lastAcceptedRequestId=o.PlayerActionEvent.INITIAL_REQUEST_ID,this.requestInFlight=!1}_notifyGameNowPlaying(){}_notifyGameNowPaused(){}_notifyGameNowOver(){}makeMovementRequest(e,t){if(this.game.status!==a.Game.Status.PLAYING)throw new Error("This is not a necessary precondition, but we're doing it anyway.");if(this.requestInFlight)throw new Error("Only one request should ever be in flight at a time.");this.requestInFlight=!0,this.game.processMoveRequest(new o.PlayerActionEvent.Movement(this.playerId,this.lastAcceptedRequestId,e,t))}get team(){return this.game.teams[this.teamId]}isTeamedWith(e){return this.team.members.includes(e)}}!function(e){let t;!function(e){e.finalize=function(e){const t=Array.from(new Set(e.map((e=>e.teamId)))).sort(((e,t)=>e-t)).reduce(((e,t,s)=>(e[t]=s,e)),[]);return e.slice().sort(((e,s)=>t[e.teamId]-t[s.teamId])).map(((e,s)=>Object.assign({},e,{playerId:s,teamId:t[e.teamId]})))}}(t=e.CtorArgs||(e.CtorArgs={})),Object.freeze(t)}(m||(m={})),i.JsUtils.protoNoEnum(m,["_notifyGameNowPaused","_notifyGameNowPlaying","_notifyGameNowOver"]),Object.freeze(m),Object.freeze(m.prototype)},473:(e,t,s)=>{"use strict";s.d(t,{S:()=>o});var r,i=s(780),a=s(406);class o{constructor(e,t){if(r.set(this,void 0),0===t.length)throw new Error("Teams must have at least one member.");this.id=e,this.members=t,(0,i.__classPrivateFieldSet)(this,r,this.members.every((e=>e.status.noCheckGameOver))?o.ElimOrder.IMMORTAL:o.ElimOrder.STANDING),a.JsUtils.propNoWrite(this,["id","members"])}reset(){this.elimOrder!==o.ElimOrder.IMMORTAL&&(this.elimOrder=o.ElimOrder.STANDING)}get elimOrder(){return(0,i.__classPrivateFieldGet)(this,r)}set elimOrder(e){if(this.elimOrder===o.ElimOrder.IMMORTAL)throw new TypeError("Cannot change the elimination status of an immortal team.");(0,i.__classPrivateFieldSet)(this,r,e)}}r=new WeakMap,function(e){let t;!function(e){e.IMMORTAL=-1,e.STANDING=0}(t=e.ElimOrder||(e.ElimOrder={}))}(o||(o={})),Object.freeze(o),Object.freeze(o.prototype)},979:(e,t,s)=>{"use strict";s.d(t,{U:()=>l});var r,i=s(406),a=s(951),o=s(780);!function(e){var t,s;class r{constructor(){this.children=[]}reset(){this.inheritingWeightedHitCount=0,this.children.forEach((e=>e.reset()))}_finalize(){Object.freeze(this.children),this.children.forEach((e=>e._finalize()))}_addCharMapping(e,t){if(!a.Uo.Seq.REGEXP.test(e))throw new RangeError(`Mapping-sequence "${e}" did not match the required regular expression "${a.Uo.Seq.REGEXP.source}".`);if(0===t.length)throw new RangeError("never");let s=this;{let t=this;for(;t;)s=t,t=t.children.find((t=>e.startsWith(t.sequence)))}if(s.sequence===e)throw new Error(`Mappings for all written-characters with a commoncorresponding typeable-sequence should be registered together,but an existing mapping for the sequence "${e}" was found.`);s.children.push(new i(s,e,t))}getLeafNodes(){const e=[];return this._recursiveGetLeafNodes(e),e}_recursiveGetLeafNodes(e){this.children.length?this.children.forEach((t=>{t._recursiveGetLeafNodes(e)})):e.push(this)}simpleView(){return this.children}static CREATE_TREE_MAP(e,t){const s=Object.values(e).reduce(((e,t)=>e+t.weight),0),i=0===t?e=>1:1===t?e=>e:e=>Math.pow(e/s,t),a=new Map;for(const t in e){const s=e[t].seq,r=new n(t,i(e[t].weight)),o=a.get(s);o?o.push(r):a.set(s,[r])}const o=new r;return Array.from(a).sort(((e,t)=>e[0].length-t[0].length)).forEach((e=>{o._addCharMapping(...e)})),o._finalize(),o}}r.LEAF_CMP=(e,t)=>e.inheritingWeightedHitCount-t.inheritingWeightedHitCount,e.ParentNode=r,Object.freeze(r),Object.freeze(r.prototype);class i extends r{constructor(e,r,i){super(),t.set(this,void 0),s.set(this,void 0),this.sequence=r,(0,o.__classPrivateFieldSet)(this,s,i),(0,o.__classPrivateFieldSet)(this,t,e)}_finalize(){Object.freeze((0,o.__classPrivateFieldGet)(this,s)),super._finalize()}reset(){super.reset(),(0,o.__classPrivateFieldGet)(this,s).forEach((e=>{e.reset(),this.incrementNumHits(e,Math.random()*a.Uo.CHAR_HIT_COUNT_SEED_CEILING)}))}chooseOnePair(){const e=(0,o.__classPrivateFieldGet)(this,s).slice(0).sort(n.CMP).shift(),t={char:e.char,seq:this.sequence};return this.incrementNumHits(e),t}incrementNumHits(e,t=1){e._incrementNumHits(),this._recursiveIncrementNumHits(e.weightInv*t)}_recursiveIncrementNumHits(e){this.inheritingWeightedHitCount+=e,this.children.forEach((t=>t._recursiveIncrementNumHits(e)))}get personalWeightedHitCount(){return this.inheritingWeightedHitCount-(0,o.__classPrivateFieldGet)(this,t).inheritingWeightedHitCount}andNonRootParents(){const e=[];for(let s=this;s instanceof i;s=(0,o.__classPrivateFieldGet)(s,t))e.push(s);return e}simpleView(){let e=(0,o.__classPrivateFieldGet)(this,s).map((e=>e.simpleView()));return Object.assign(Object.create(null),{seq:this.sequence,chars:1===e.length?e[0]:e,kids:this.children.map((e=>e.simpleView()))})}}t=new WeakMap,s=new WeakMap,i.PATH_CMP=(e,t)=>e.personalWeightedHitCount-t.personalWeightedHitCount,e.ChildNode=i,Object.freeze(i),Object.freeze(i.prototype)}(r||(r={})),Object.freeze(r);class n{constructor(e,t){if(t<=0)throw new RangeError(`All weights must be positive, but we were passed the value "${t}" for the character "${e}".`);this.char=e,this.weightInv=1/t}reset(){this.hitCount=0,this.weightedHitCount=0}_incrementNumHits(){this.hitCount+=1,this.weightedHitCount+=this.weightInv}simpleView(){return Object.assign(Object.create(null),{char:this.char,hits:this.hitCount})}}n.CMP=(e,t)=>e.weightedHitCount-t.weightedHitCount,Object.freeze(n),Object.freeze(n.prototype);class l extends a.Uo{constructor(e,t,s){if(super(),this.frontendDesc=l.GET_FRONTEND_DESC_BY_ID(e),this.treeMap=r.ParentNode.CREATE_TREE_MAP(t,s),this.leafNodes=this.treeMap.getLeafNodes(),i.JsUtils.propNoWrite(this,["frontendDesc","treeMap","leafNodes"]),this.leafNodes.length!==this.frontendDesc.numLeaves)throw new Error(`maintenance required: the frontend constant for the language "${this.frontendDesc.id}" needs to be updated to the correct, computed value, which is \`${this.leafNodes.length}\`.`)}get numLeaves(){return this.leafNodes.length}reset(){this.treeMap.reset()}getNonConflictingChar(e){this.leafNodes.sort(r.ParentNode.LEAF_CMP);let t=void 0;for(const s of this.leafNodes){const r=s.andNonRootParents();for(let t=0;te.startsWith(r[t].sequence)));if(s){s===r[t].sequence?r.length=0:r.splice(t);break}}if(r.length){t=r[0];for(const e of r)e.personalWeightedHitCount{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.Group=t.ServerGame=void 0;const i=s(780),a=s(406),o=s(502),n=s(290);Object.defineProperty(t,"ServerGame",{enumerable:!0,get:function(){return n.ServerGame}});const l=s(502),c=s(604);class h extends l.Group{constructor(e){super(),r.set(this,void 0),this.namespace=e.namespace,this.name=e.name,this.passphrase=e.passphrase,i.__classPrivateFieldSet(this,r,void 0),this._deleteExternalRefs=e.deleteExternalRefs,this._initialTtlTimeout=setTimeout((()=>{0===Object.keys(this.namespace.sockets).length&&this.terminate()}),1e3*e.initialTtl).unref(),this.socketListeners=Object.freeze({disconnect:e=>{if(e===this._sessionHost)return void this.terminate();if(1===Object.keys(e.nsp.sockets).length)return void this.terminate();const t={[e.id]:void 0};e.nsp.emit(h.Socket.UserInfoChange.EVENT_NAME,t)},[h.Socket.UserInfoChange.EVENT_NAME]:(e,t)=>{if("string"!=typeof t.username||"number"!=typeof t.teamId||"string"!=typeof t.avatar)return void console.log(`bad format: username: \`${t.username}\`, teamId: \`${t.teamId}\`, avatar: \`${t.avatar}\`.`);e.userInfo=t;const s={[e.id]:t};e.nsp.emit(h.Socket.UserInfoChange.EVENT_NAME,s)}}),a.JsUtils.instNoEnum(this,["socketListeners"]),a.JsUtils.propNoWrite(this,["socketListeners"]),this.namespace.use(((e,t)=>{e.handshake.query.passphrase!==this.passphrase&&t(new Error("Incorrect passphrase"));const s=e.handshake.query;return void 0!==s&&0===s.teamId||t(new Error(`a socket attempted to connect to group \`${this.name}\` without providing userInfo.`)),t()})).on("connection",this.onConnection.bind(this))}onConnection(e){console.log("socket connect: "+e.id),i.__classPrivateFieldGet(this,r)&&e.disconnect(),e.userInfo=e.handshake.query.userInfo;{const t=h.Socket.UserInfoChange.EVENT_NAME;e.nsp.emit(t,{[e.id]:e.userInfo}),e.emit(t,Object.entries(this.sockets).reduce(((e,[t,s])=>(e[t]=s.userInfo,e)),{}))}1===Object.keys(e.nsp.connected).length&&(clearTimeout(this._initialTtlTimeout),this._initialTtlTimeout=void 0,this._sessionHost=e,this.namespace.server.of(l.SkServer.Nsps.GROUP_JOINER).emit(h.Exist.EVENT_NAME,{[this.name]:h.Exist.Status.IN_LOBBY}),e.on(o.GroupEv.CREATE_GAME,this._socketOnHostCreateGame.bind(this))),Object.entries(this.socketListeners).forEach((([t,s])=>{e.on(t,s.bind(this,e))}))}_socketOnHostCreateGame(e){this._createGameInstance(e).length||(this.namespace.server.of(l.SkServer.Nsps.GROUP_JOINER).emit(h.Exist.EVENT_NAME,{[this.name]:h.Exist.Status.IN_GAME}),console.log(`group ${this.name} new game`))}get isCurrentlyPlayingAGame(){return void 0!==i.__classPrivateFieldGet(this,r)}terminate(){function e(e){e.removeAllListeners("connect"),e.removeAllListeners("connection"),Object.values(e.connected).forEach((e=>{e.disconnect(!1),e.removeAllListeners()})),e.removeAllListeners(),delete e.server.nsps[e.name]}void 0!==i.__classPrivateFieldGet(this,r)&&(e(i.__classPrivateFieldGet(this,r).namespace),i.__classPrivateFieldSet(this,r,void 0));const t=this.namespace.server;e(this.namespace),this.namespace=void 0,this._deleteExternalRefs(),t.of(l.SkServer.Nsps.GROUP_JOINER).emit(h.Exist.EVENT_NAME,{[this.name]:h.Exist.Status.DELETE}),console.log(`terminated group: \`${this.name}\``)}_createGameInstance(e){const t=[];return this.isCurrentlyPlayingAGame?(t.push("a game is already in session for this group"),t):(t.push(...c.GamepartManager.CHECK_VALID_CTOR_ARGS(e)),t.length?(console.log(t),t):(e.playerDescs=[...e.playerDescs,...Object.values(this.sockets).map((e=>Object.freeze({isALocalOperator:!1,familyId:"HUMAN",teamId:e.userInfo.teamId,clientId:e.client.id,username:e.userInfo.username,avatar:e.userInfo.avatar,noCheckGameOver:!1,familyArgs:{}})))],i.__classPrivateFieldSet(this,r,new n.ServerGame({groupNsps:this.namespace,passphrase:this.passphrase,groupHostClient:this._sessionHost.client,deleteExternalRefs:()=>{i.__classPrivateFieldSet(this,r,void 0)},gameDesc:e})),[]))}get sockets(){return this.namespace.sockets}}t.Group=h,r=new WeakMap,a.JsUtils.protoNoEnum(h,["_socketOnHostCreateGame"]),Object.freeze(h),Object.freeze(h.prototype)},290:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ServerGame=void 0;const r=s(213),i=s(406),a=s(502),o=s(504),n=s(789),l=s(985),c=s(216),h=s(671),d=s(699),u=s(604);class p extends u.GamepartManager{constructor(e){super(o.Game.Type.SERVER,{onGameBecomeOver:()=>{},tileClass:n.Tile,playerStatusCtor:c.PlayerStatus},e.gameDesc),this._groupHostClient=e.groupHostClient,this._deleteExternalRefs=e.deleteExternalRefs,i.JsUtils.instNoEnum(this,["operators","_deleteExternalRefs"]),i.JsUtils.propNoWrite(this,["_groupHostClient","_deleteExternalRefs"]),this.namespace=e.groupNsps.server.of(a.SkServer.Nsps.GROUP_GAME_PREFIX+e.groupNsps.name.replace(a.SkServer.Nsps.GROUP_LOBBY_PREFIX,"")).use(((t,s)=>(t.handshake.query.passphrase!==e.passphrase&&s(new Error("Incorrect passphrase")),s()))),this.socketListeners=Object.freeze({[d.PlayerActionEvent.EVENT_NAME.MOVEMENT]:this.processMoveRequest.bind(this),[d.PlayerActionEvent.EVENT_NAME.BUBBLE]:this.processBubbleRequest.bind(this)}),i.JsUtils.instNoEnum(this,["socketListeners"]),i.JsUtils.propNoWrite(this,["socketListeners"]);const t=new Map;function s(e){t.get(e.client)(),t.delete(e.client)}Promise.all(Object.values(e.groupNsps.sockets).map((e=>new Promise(((r,i)=>{t.set(e.client,r),this.namespace.once("connect",s)}))))).then((()=>this._greetGameSockets(e.groupNsps,e.gameDesc))).catch((e=>{setImmediate((()=>{throw e}))})),e.groupNsps.emit(a.GroupEv.CREATE_GAME)}_getGridImplementation(e){return l.Grid.getImplementation(e)}_greetGameSockets(e,t){this.playerSockets=t.playerDescs.filter((e=>e.familyId===c.Player.Family.HUMAN)).reduce(((e,t)=>{if(void 0===t.clientId)throw console.log(t),new Error("missing socket client for player "+t.playerId);const s=Object.values(this.namespace.sockets).find((e=>e.client.id===t.clientId));if(void 0===s)throw new Error("never");return e.set(t.playerId,s),e}),new Map),i.JsUtils.propNoWrite(this,["playerSockets"]),Promise.all(Object.values(this.namespace.sockets).map((e=>new Promise(((t,s)=>{e.once(a.GameEv.RESET,(()=>{t()}))}))))).then((()=>{this.reset()})),Object.values(this.namespace.sockets).forEach((e=>{e.on("disconnect",(()=>{1!==Object.keys(e.nsp.sockets).length||this.terminate()})),e.on(a.GameEv.RETURN_TO_LOBBY,(()=>{e.client===this._groupHostClient?(this.statusBecomeOver(),e.broadcast.emit(a.GameEv.RETURN_TO_LOBBY)):e.broadcast.emit(a.GameEv.RETURN_TO_LOBBY,e.id)})),Object.entries(this.socketListeners).forEach((([t,s])=>{e.on(t,s)})),t.playerDescs.forEach((t=>{t.isALocalOperator=t.clientId===e.client.id})),e.emit(a.GameEv.CREATE_GAME,t)}))}async reset(){console.log("starting reset"),Promise.all(Object.values(this.namespace.sockets).map((e=>new Promise(((t,s)=>{e.once(a.GameEv.UNPAUSE,(()=>{t()}))}))))).then((()=>{this.statusBecomePlaying(),this.namespace.emit(a.GameEv.UNPAUSE)}));const e=super.reset();return await e,this.namespace.emit(a.GameEv.RESET,this.serializeResetState()),e}_createOperatorPlayer(e){throw new TypeError("This should never be called for a ServerGame.")}setCurrentOperator(e){}setTimeout(e,t,...s){return r.setTimeout(e,t,s).unref()}cancelTimeout(e){clearTimeout(e)}executePlayerMoveEvent(e){super.executePlayerMoveEvent(e),e.eventId===h.EventRecordEntry.EVENT_ID_REJECT?this.playerSockets.get(e.playerId).emit(d.PlayerActionEvent.EVENT_NAME.MOVEMENT,e):this.namespace.emit(d.PlayerActionEvent.EVENT_NAME.MOVEMENT,e)}executePlayerBubbleEvent(e){super.executePlayerBubbleEvent(e),e.eventId===h.EventRecordEntry.EVENT_ID_REJECT?this.playerSockets.get(e.playerId).emit(d.PlayerActionEvent.EVENT_NAME.BUBBLE,e):this.namespace.emit(d.PlayerActionEvent.EVENT_NAME.BUBBLE,e)}terminate(){Object.values(this.namespace.sockets).forEach((e=>{e.disconnect(),e.removeAllListeners()})),this.namespace.removeAllListeners(),this._deleteExternalRefs()}}t.ServerGame=p,i.JsUtils.protoNoEnum(p,["_greetGameSockets","_getGridImplementation","_createOperatorPlayer","setCurrentOperator"]),Object.freeze(p),Object.freeze(p.prototype)},904:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SnakeyServer=void 0;const r=s(87),i=s(622),a=s(605),o=s(127),n=s(395),l=s(406),c=s(410),h=s(502);class d extends h.SkServer{constructor(e=d.DEFAULT_PORT,t){super(),this.app=o(),this.http=a.createServer({},this.app),this.io=n(this.http,{origins:"*:*",cookie:!1}),this.allGroups=new Map,l.JsUtils.propNoWrite(this,["http","app","io","allGroups"]);const s=i.resolve(__dirname,"../client");this.app.disable("x-powered-by"),this.app.get("/",((e,t)=>{t.sendFile(i.resolve(__dirname,i.resolve(s,"index.html")))})),this.app.use("/",o.static(s)),this.http.listen({port:e,host:t},(()=>{const t=this.http.address();console.log(`\n\nServer mounted to: \`${t.address}${t.port}\` using ${t.family}.\n`),console.log("This host can be reached at any of the following addresses:\n"),d.chooseIPAddress().sort().forEach((t=>{console.log(`${t}:${e}`)})),console.log("")})),this._joinerSocketListeners=Object.freeze({[c.Group.Exist.EVENT_NAME]:(e,t)=>{!t.groupName||this.allGroups.has(t.groupName)||t.groupName.length>c.Group.Name.MaxLength||!t.groupName.match(c.Group.Name.REGEXP)||t.passphrase.length>c.Group.Passphrase.MaxLength||!t.passphrase.match(c.Group.Passphrase.REGEXP)?e.emit(c.Group.Exist.EVENT_NAME,c.Group.Exist.RequestCreate.Response.NOPE):(this.allGroups.set(t.groupName,new c.Group(Object.freeze({namespace:this.io.of(d.Nsps.GROUP_LOBBY_PREFIX+t.groupName),name:t.groupName,passphrase:t.passphrase,deleteExternalRefs:()=>this.allGroups.delete(t.groupName),initialTtl:c.Group.DEFAULT_TTL}))),e.emit(c.Group.Exist.EVENT_NAME,c.Group.Exist.RequestCreate.Response.OKAY))}}),l.JsUtils.instNoEnum(this,["_joinerSocketListeners"]),l.JsUtils.propNoWrite(this,["_joinerSocketListeners"]),this.io.of(d.Nsps.GROUP_JOINER).on("connection",this.onJoinerNspsConnection.bind(this))}onJoinerNspsConnection(e){console.log("socket connect: "+e.id),e.emit(c.Group.Exist.EVENT_NAME,(()=>{const e={};return Array.from(this.allGroups).forEach((([t,s])=>{e[t]=s.isCurrentlyPlayingAGame?c.Group.Exist.Status.IN_GAME:c.Group.Exist.Status.IN_LOBBY})),e})()),Object.entries(this._joinerSocketListeners).forEach((([t,s])=>{e.on(t,s.bind(this,e))}))}}t.SnakeyServer=d,function(e){e.chooseIPAddress=()=>Object.values(r.networkInterfaces()).flat().filter((e=>!e.internal)).map((e=>"IPv6"===e.family?`[${e.address}]`:e.address))}(d=t.SnakeyServer||(t.SnakeyServer={})),Object.freeze(d),Object.freeze(d.prototype)},687:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.server=void 0;const r=s(904);t.server=new r.SnakeyServer},59:(e,t,s)=>{var r={"./Emote.ts":[981,858],"./English.ts":[215,184],"./Japanese.ts":[117,410],"./Korean.ts":[181,227],"./Morse.ts":[222,285]};function i(e){if(!s.o(r,e))return Promise.resolve().then((()=>{var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}));var t=r[e],i=t[0];return s.e(t[1]).then((()=>s(i)))}i.keys=()=>Object.keys(r),i.id=59,e.exports=i},127:e=>{"use strict";e.exports=require("express")},605:e=>{"use strict";e.exports=require("http")},87:e=>{"use strict";e.exports=require("os")},622:e=>{"use strict";e.exports=require("path")},395:e=>{"use strict";e.exports=require("socket.io")},213:e=>{"use strict";e.exports=require("timers")},780:e=>{"use strict";e.exports=require("tslib")}},s={};function r(e){if(s[e])return s[e].exports;var i=s[e]={exports:{}};return t[e](i,i.exports,r),i.exports}return r.m=t,r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var s in t)r.o(t,s)&&!r.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((t,s)=>(r.f[s](e,t),t)),[])),r.u=e=>"chunk/"+{184:"lang/English-ts",227:"lang/Korean-ts",285:"lang/Morse-ts",410:"lang/Japanese-ts",858:"lang/Emote-ts"}[e]+".js",r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},e={826:1},r.f.require=function(t,s){e[t]||(t=>{var s=t.modules,i=t.ids,a=t.runtime;for(var o in s)r.o(s,o)&&(r.m[o]=s[o]);a&&a(r);for(var n=0;n