{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/assets/icons/washerwoman.png","webpack:///./src/assets/icons/barista.png","webpack:///./src/assets/icons/cerenovus.png","webpack:///./src/assets/icons/amnesiac.png","webpack:///./src/assets/icons/shabaloth.png","webpack:///./src/assets/icons/lunatic.png","webpack:///./src/assets/icons/oracle.png","webpack:///./src/assets/icons/ravenkeeper.png","webpack:///./src/assets/icons/undertaker.png","webpack:///./src/assets/icons/chambermaid.png","webpack:///./src/assets/icons/plus.png","webpack:///./src/assets/icons/recluse.png","webpack:///./src/assets/icons/mutant.png","webpack:///./src/assets/icons/chef.png","webpack:///./src/assets/icons/zombuul.png","webpack:///./src/assets/icons/sailor.png","webpack:///./src/assets/icons/widow.png","webpack:///./src/store/session.js","webpack:///./src/assets/icons/bonecollector.png","webpack:///./src/assets/icons/baron.png","webpack:///./src/assets/icons/bureaucrat.png","webpack:///./src/assets/icons/leviathan.png","webpack:///./src/assets/icons/artist.png","webpack:///./src/assets/icons/sage.png","webpack:///./src/assets/icons/scapegoat.png","webpack:///./src/assets/icons/philosopher.png","webpack:///./src/components/TownSquare.vue?b88a","webpack:///./src/components/modals/EditionModal.vue?9a31","webpack:///./src/assets/icons/butcher.png","webpack:///./src/assets/icons/towncrier.png","webpack:///./src/assets/icons/vortox.png","webpack:///./src/assets/icons/deviant.png","webpack:///./src/assets/icons/imp.png","webpack:///./src/assets/icons/moonchild.png","webpack:///./src/assets/icons/snakecharmer.png","webpack:///./src/assets/icons/fortuneteller.png","webpack:///./src/assets/icons/fool.png","webpack:///./src/assets/icons/apprentice.png","webpack:///./src/assets/icons/librarian.png","webpack:///./src/assets/icons/soldier.png","webpack:///./src/assets/icons/minstrel.png","webpack:///./src/assets/icons/exorcist.png","webpack:///./src/assets/icons/harlot.png","webpack:///./src/assets/icons/goon.png","webpack:///./src/App.vue?b598","webpack:///./src/components/TownSquare.vue?c630","webpack:///./src/components/Player.vue?a47d","webpack:///./src/components/Token.vue?b481","webpack:///src/components/Token.vue","webpack:///./src/components/Token.vue?ca97","webpack:///./src/components/Token.vue","webpack:///src/components/Player.vue","webpack:///./src/components/Player.vue?1369","webpack:///./src/components/Player.vue","webpack:///./src/components/modals/ReminderModal.vue?fd10","webpack:///./src/components/modals/Modal.vue?52c3","webpack:///src/components/modals/Modal.vue","webpack:///./src/components/modals/Modal.vue?a5e5","webpack:///./src/components/modals/Modal.vue","webpack:///src/components/modals/ReminderModal.vue","webpack:///./src/components/modals/ReminderModal.vue?c533","webpack:///./src/components/modals/ReminderModal.vue","webpack:///./src/components/modals/RoleModal.vue?e98b","webpack:///src/components/modals/RoleModal.vue","webpack:///./src/components/modals/RoleModal.vue?15f8","webpack:///./src/components/modals/RoleModal.vue","webpack:///src/components/TownSquare.vue","webpack:///./src/components/TownSquare.vue?335a","webpack:///./src/components/TownSquare.vue","webpack:///./src/components/TownInfo.vue?0961","webpack:///src/components/TownInfo.vue","webpack:///./src/components/TownInfo.vue?6260","webpack:///./src/components/TownInfo.vue","webpack:///./src/components/Menu.vue?2f64","webpack:///./src/components/Screenshot.vue?ed03","webpack:///src/components/Screenshot.vue","webpack:///./src/components/Screenshot.vue?82cf","webpack:///./src/components/Screenshot.vue","webpack:///src/components/Menu.vue","webpack:///./src/components/Menu.vue?9842","webpack:///./src/components/Menu.vue","webpack:///./src/components/modals/RolesModal.vue?7af3","webpack:///src/components/modals/RolesModal.vue","webpack:///./src/components/modals/RolesModal.vue?b003","webpack:///./src/components/modals/RolesModal.vue","webpack:///./src/components/modals/EditionModal.vue?cbbd","webpack:///src/components/modals/EditionModal.vue","webpack:///./src/components/modals/EditionModal.vue?d6f4","webpack:///./src/components/modals/EditionModal.vue","webpack:///./src/components/Intro.vue?7446","webpack:///src/components/Intro.vue","webpack:///./src/components/Intro.vue?a380","webpack:///./src/components/Intro.vue","webpack:///src/App.vue","webpack:///./src/App.vue?b65f","webpack:///./src/App.vue","webpack:///./src/store/modules/players.js","webpack:///./src/store/index.js","webpack:///./src/main.js","webpack:///./src/assets/icons/cannibal.png","webpack:///./src/App.vue?6ee5","webpack:///./src/assets/icons/goblin.png","webpack:///./src/assets/icons/x.png","webpack:///./src/assets/icons sync ^\\.\\/.*\\.png$","webpack:///./src/assets/icons/butler.png","webpack:///./src/assets/icons/juggler.png","webpack:///./src/assets/icons/balloonist.png","webpack:///./src/assets/icons/innkeeper.png","webpack:///./src/assets/icons/good.png","webpack:///./src/assets/icons/flowergirl.png","webpack:///./src/assets/icons/monk.png","webpack:///./src/assets/icons/nodashii.png","webpack:///./src/assets/icons/saint.png","webpack:///./src/assets/icons/fanggu.png","webpack:///./src/assets/icons/dreamer.png","webpack:///./src/components/Player.vue?6d3c","webpack:///./src/assets/icons/pithag.png","webpack:///./src/assets/icons/bishop.png","webpack:///./src/components/modals/Modal.vue?3563","webpack:///./src/assets/icons/mathematician.png","webpack:///./src/components/Menu.vue?ce3e","webpack:///./src/components/TownInfo.vue?ca37","webpack:///./src/components/Intro.vue?d506","webpack:///./src/assets/icons/assassin.png","webpack:///./src/assets/icons/godfather.png","webpack:///./src/assets/icons/thief.png","webpack:///./src/assets/icons/tinker.png","webpack:///./src/assets/icons/pukka.png","webpack:///./src/assets/icons/voudon.png","webpack:///./src/components/modals/RoleModal.vue?240c","webpack:///./src/assets/icons/seamstress.png","webpack:///./src/assets/icons/klutz.png","webpack:///./src/assets/icons/matron.png","webpack:///./src/assets/icons/mayor.png","webpack:///./src/assets/icons/professor.png","webpack:///./src/assets/icons/investigator.png","webpack:///./src/assets/icons/tealady.png","webpack:///./src/assets/icons/empath.png","webpack:///./src/components/Token.vue?0f0c","webpack:///./src/components/modals/RolesModal.vue?53f0","webpack:///./src/components/modals/ReminderModal.vue?3635","webpack:///./src/assets/icons/evil.png","webpack:///./src/assets/icons/fisherman.png","webpack:///./src/assets/icons/po.png","webpack:///./src/components/Screenshot.vue?d943","webpack:///./src/assets/icons/grandmother.png","webpack:///./src/assets/icons/gossip.png","webpack:///./src/assets/icons/devilsadvocate.png","webpack:///./src/assets/icons/beggar.png","webpack:///./src/assets/icons/slayer.png","webpack:///./src/assets/icons/savant.png","webpack:///./src/assets/icons/drunk.png","webpack:///./src/assets/icons/gambler.png","webpack:///./src/store/persistence.js","webpack:///./src/assets/icons/eviltwin.png","webpack:///./src/assets/icons/spy.png","webpack:///./src/assets/icons/courtier.png","webpack:///./src/assets/icons/gunslinger.png","webpack:///./src/assets/icons/virgin.png","webpack:///./src/assets/icons/judge.png","webpack:///./src/assets/icons/sweetheart.png","webpack:///./src/assets/icons/poisoner.png","webpack:///./src/assets/icons/scarletwoman.png","webpack:///./src/assets/icons/vigormortis.png","webpack:///./src/assets/icons/witch.png","webpack:///./src/assets/icons/mastermind.png","webpack:///./src/assets/icons/clockmaker.png","webpack:///./src/assets/icons/barber.png","webpack:///./src/assets/icons/pacifist.png"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","LiveSession","store","this","wss","socket","isSpectator","gamestate","channel","disconnect","WebSocket","addEventListener","_handleMessage","onopen","_onOpen","onclose","commit","command","params","send","JSON","stringify","_send","sendGamestate","parse","err","console","log","_updateGamestate","_updatePlayer","state","session","_open","close","players","map","player","isDead","isVoteless","role","team","id","edition","x","forEach","index","indexOf","subscribe","type","payload","connect","location","hash","sendPlayer","param","substr","split","render","_vm","_h","$createElement","_c","_self","class","screenshot","grimoire","isScreenshot","style","backgroundImage","background","attrs","on","keyup","_e","takeScreenshot","ref","staticRenderFns","staticClass","public","isPublic","spectator","zoom","_l","swapFrom","swap","$event","openReminderModal","openRoleModal","removePlayer","swapSeats","$emit","_v","stopPropagation","bluffs","selectedPlayer","dead","traveler","toggleStatus","nightOrder","first","isNightOrder","_s","_f","firstNightReminder","other","otherNightReminder","doSwap","updatePlayer","active","isMenuOpen","changeName","initSwap","reminder","removeReminder","setRole","reminders","ability","props","default","filters","nameToFontSize","methods","component","components","Token","required","computed","isSwap","handleEmojis","text","replace","width","height","y","$refs","getBoundingClientRect","prompt","$store","cancel","playerIndex","directives","rawName","modals","availableReminders","expression","toggleModal","addReminder","_t","Modal","roles","some","availableRoles","Player","RoleModal","ReminderModal","confirm","from","to","undefined","teams","alive","votes","townsfolk","outsider","minion","demon","nonTravelers","getters","filter","game","leaveSession","success","isScreenshotSuccess","open","toggleMenu","toggleGrimoire","toggleNightOrder","updateZoom","Math","round","setBackground","sessionId","hostSession","joinSession","copySessionUrl","addPlayer","randomizeSeatings","clearPlayers","clearRoles","stream","canvas","video","alert","navigator","mediaDevices","getDisplayMedia","cursor","audio","srcObject","play","setTimeout","context","getContext","setAttribute","videoWidth","videoHeight","drawImage","toBlob","blob","item","ClipboardItem","clipboard","write","Screenshot","dimensions","capture","random","permissions","query","then","url","href","link","writeText","dispatch","teamRoles","selected","disabled","selectedRoles","assignRoles","selectRandomRoles","randomElement","arr","floor","roleSelection","values","reduce","a","b","hasSelectedSetupRoles","setup","$set","playerCount","max","composition","keys","available","sort","pop","mounted","watch","setEdition","editions","Intro","TownInfo","TownSquare","Menu","EditionModal","RolesModal","menu","NEWPLAYER","min","firstNight","otherNight","includes","Map","set","actions","mutations","namespaced","use","getRolesByEdition","selectedEdition","find","localeCompare","Store","document","title","by","status","plugins","add","config","productionTip","h","App","$mount","webpackContext","req","webpackContextResolve","e","Error","code","resolve","localStorage","getItem","setItem","removeItem"],"mappings":"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","file":"js/app.c515675b.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/townsquare/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([\"56d7\",\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","module.exports = __webpack_public_path__ + \"img/washerwoman.a0c66e53.png\";","module.exports = __webpack_public_path__ + \"img/barista.fd2bba67.png\";","module.exports = __webpack_public_path__ + \"img/cerenovus.736554ca.png\";","module.exports = __webpack_public_path__ + \"img/amnesiac.03ce8f67.png\";","module.exports = __webpack_public_path__ + \"img/shabaloth.f461dd08.png\";","module.exports = __webpack_public_path__ + \"img/lunatic.f2982146.png\";","module.exports = __webpack_public_path__ + \"img/oracle.63459162.png\";","module.exports = __webpack_public_path__ + \"img/ravenkeeper.552f1f2f.png\";","module.exports = __webpack_public_path__ + \"img/undertaker.1df72155.png\";","module.exports = __webpack_public_path__ + \"img/chambermaid.b6f002ce.png\";","module.exports = __webpack_public_path__ + \"img/plus.c11bf1ed.png\";","module.exports = __webpack_public_path__ + \"img/recluse.a6519a1d.png\";","module.exports = __webpack_public_path__ + \"img/mutant.b28a535c.png\";","module.exports = __webpack_public_path__ + \"img/chef.d4e7f9a6.png\";","module.exports = __webpack_public_path__ + \"img/zombuul.ec71a259.png\";","module.exports = __webpack_public_path__ + \"img/sailor.631521c2.png\";","module.exports = __webpack_public_path__ + \"img/widow.ec8d8cb0.png\";","class LiveSession {\n  constructor(store) {\n    this.wss = \"wss://connect.websocket.in/v3/\";\n    this.key = \"zXzDomOphNQ94tWXrHfT8E8gkxjUMSXOQt0ypZetKoFsIUiEBegqWNAlExyd\";\n    this.socket = null;\n    this.isSpectator = true;\n    this.gamestate = [];\n    this.store = store;\n  }\n\n  /**\n   * Open a new session for the passed channel.\n   * @param channel\n   * @private\n   */\n  _open(channel) {\n    this.disconnect();\n    this.socket = new WebSocket(this.wss + channel + \"?apiKey=\" + this.key);\n    this.socket.addEventListener(\"message\", this._handleMessage.bind(this));\n    this.socket.onopen = this._onOpen.bind(this);\n    this.socket.onclose = () => {\n      this.socket = null;\n      this.store.commit(\"setSessionId\", \"\");\n    };\n  }\n\n  /**\n   * Send a message through the socket.\n   * @param command\n   * @param params\n   * @private\n   */\n  _send(command, params) {\n    if (this.socket) {\n      this.socket.send(JSON.stringify([command, params]));\n    }\n  }\n\n  /**\n   * Open event handler for socket.\n   * @private\n   */\n  _onOpen() {\n    if (this.isSpectator) {\n      this._send(\"req\", \"gs\");\n    } else {\n      this.sendGamestate();\n    }\n  }\n\n  /**\n   * Handle an incoming socket message.\n   * @param data\n   * @private\n   */\n  _handleMessage({ data }) {\n    let command, params;\n    try {\n      [command, params] = JSON.parse(data);\n    } catch (err) {\n      console.log(\"unsupported socket message\", data);\n    }\n    switch (command) {\n      case \"req\":\n        if (params === \"gs\") {\n          this.sendGamestate();\n        }\n        break;\n      case \"gs\":\n        this._updateGamestate(params);\n        break;\n      case \"player\":\n        this._updatePlayer(params);\n    }\n  }\n\n  /**\n   * Connect to a new live session, either as host or spectator.\n   * @param channel\n   */\n  connect(channel) {\n    this.isSpectator = this.store.state.session.isSpectator;\n    this._open(channel);\n  }\n\n  /**\n   * Close the current session, if any.\n   */\n  disconnect() {\n    if (this.socket) {\n      this.socket.close();\n      this.socket = null;\n    }\n  }\n\n  /**\n   * Publish the current gamestate.\n   */\n  sendGamestate() {\n    if (this.isSpectator) return;\n    this.gamestate = this.store.state.players.players.map(player => ({\n      name: player.name,\n      isDead: player.isDead,\n      isVoteless: player.isVoteless,\n      ...(player.role && player.role.team === \"traveler\"\n        ? {\n            role: {\n              id: player.role.id,\n              team: \"traveler\",\n              name: player.role.name\n            }\n          }\n        : {})\n    }));\n    this._send(\"gs\", {\n      gamestate: this.gamestate,\n      edition: this.store.state.edition\n    });\n  }\n\n  /**\n   * Update the gamestate based on incoming data.\n   * @param gamestate\n   * @param edition\n   * @private\n   */\n  _updateGamestate({ gamestate, edition }) {\n    this.store.commit(\"setEdition\", edition);\n    const players = this.store.state.players.players;\n    // adjust number of players\n    if (players.length < gamestate.length) {\n      for (let x = players.length; x < gamestate.length; x++) {\n        this.store.commit(\"players/add\", gamestate[x].name);\n      }\n    } else if (players.length > gamestate.length) {\n      for (let x = players.length; x > gamestate.length; x--) {\n        this.store.commit(\"players/remove\", x - 1);\n      }\n    }\n    // update status for each player\n    gamestate.forEach((state, x) => {\n      const player = players[x];\n      const { name, isDead, isVoteless, role } = state;\n      if (player.name !== name) {\n        this.store.commit(\"players/update\", {\n          player,\n          property: \"name\",\n          value: name\n        });\n      }\n      if (player.isDead !== isDead) {\n        this.store.commit(\"players/update\", {\n          player,\n          property: \"isDead\",\n          value: isDead\n        });\n      }\n      if (player.isVoteless !== isVoteless) {\n        this.store.commit(\"players/update\", {\n          player,\n          property: \"isVoteless\",\n          value: isVoteless\n        });\n      }\n      if (role && player.role.id !== role.id) {\n        this.store.commit(\"players/update\", {\n          player,\n          property: \"role\",\n          value: role\n        });\n      } else if (!role && player.role.team === \"traveler\") {\n        this.store.commit(\"players/update\", {\n          player,\n          property: \"role\",\n          value: {}\n        });\n      }\n    });\n  }\n\n  /**\n   * Publish a player update.\n   * @param player\n   * @param property\n   * @param value\n   */\n  sendPlayer({ player, property, value }) {\n    if (this.isSpectator || property === \"reminders\") return;\n    const index = this.store.state.players.players.indexOf(player);\n    if (property === \"role\") {\n      if (value.team && value.team === \"traveler\") {\n        // update local gamestate to remember this player as a traveler\n        this.gamestate[index].role = {\n          id: player.role.id,\n          team: \"traveler\",\n          name: player.role.name\n        };\n        this._send(\"player\", {\n          index,\n          property,\n          value: this.gamestate[index].role\n        });\n      } else if (this.gamestate[index].role) {\n        delete this.gamestate[index].role;\n        this._send(\"player\", { index, property, value: {} });\n      }\n    } else {\n      this._send(\"player\", { index, property, value });\n    }\n  }\n\n  /**\n   * Update a player based on incoming data.\n   * @param index\n   * @param property\n   * @param value\n   * @private\n   */\n  _updatePlayer({ index, property, value }) {\n    const player = this.store.state.players.players[index];\n    if (!player) return;\n    // special case where a player stops being a traveler\n    if (\n      property === \"role\" &&\n      value.team !== \"traveler\" &&\n      player.role.team === \"traveler\"\n    ) {\n      // reset to an unknown role\n      this.store.commit(\"players/update\", {\n        player,\n        property: \"role\",\n        value: {}\n      });\n    } else {\n      // just update the player otherwise\n      this.store.commit(\"players/update\", { player, property, value });\n    }\n  }\n}\n\nmodule.exports = store => {\n  // setup\n  const session = new LiveSession(store);\n\n  // listen to mutations\n  store.subscribe(({ type, payload }) => {\n    switch (type) {\n      case \"setSessionId\":\n        if (payload) {\n          session.connect(payload);\n        } else {\n          window.location.hash = \"\";\n          session.disconnect();\n        }\n        break;\n      case \"players/set\":\n      case \"players/swap\":\n      case \"players/clear\":\n      case \"players/remove\":\n      case \"players/add\":\n      case \"setEdition\":\n        session.sendGamestate();\n        break;\n      case \"players/update\":\n        session.sendPlayer(payload);\n        break;\n    }\n  });\n\n  // check for session Id in hash\n  const [command, param] = window.location.hash.substr(1).split(\"/\");\n  if (command === \"play\") {\n    store.commit(\"setSpectator\", true);\n    store.commit(\"setSessionId\", param);\n  }\n};\n","module.exports = __webpack_public_path__ + \"img/bonecollector.846af8c8.png\";","module.exports = __webpack_public_path__ + \"img/baron.9ce9bd3b.png\";","module.exports = __webpack_public_path__ + \"img/bureaucrat.88ec372a.png\";","module.exports = __webpack_public_path__ + \"img/leviathan.dfbff6e8.png\";","module.exports = __webpack_public_path__ + \"img/artist.f89690cd.png\";","module.exports = __webpack_public_path__ + \"img/sage.5afc100d.png\";","module.exports = __webpack_public_path__ + \"img/scapegoat.8bd95c23.png\";","module.exports = __webpack_public_path__ + \"img/philosopher.92032c70.png\";","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownSquare.vue?vue&type=style&index=0&lang=scss&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownSquare.vue?vue&type=style&index=0&lang=scss&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditionModal.vue?vue&type=style&index=0&id=155bdb2d&scoped=true&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditionModal.vue?vue&type=style&index=0&id=155bdb2d&scoped=true&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/butcher.e0b672b7.png\";","module.exports = __webpack_public_path__ + \"img/towncrier.18a4377b.png\";","module.exports = __webpack_public_path__ + \"img/vortox.6add3a3a.png\";","module.exports = __webpack_public_path__ + \"img/deviant.e8a761ae.png\";","module.exports = __webpack_public_path__ + \"img/imp.cd0fa5b8.png\";","module.exports = __webpack_public_path__ + \"img/moonchild.6c84161e.png\";","module.exports = __webpack_public_path__ + \"img/snakecharmer.e512cc1e.png\";","module.exports = __webpack_public_path__ + \"img/fortuneteller.4396927c.png\";","module.exports = __webpack_public_path__ + \"img/fool.a730aab3.png\";","module.exports = __webpack_public_path__ + \"img/apprentice.b7055345.png\";","module.exports = __webpack_public_path__ + \"img/librarian.6fd7f267.png\";","module.exports = __webpack_public_path__ + \"img/soldier.451de0df.png\";","module.exports = __webpack_public_path__ + \"img/minstrel.1647382d.png\";","module.exports = __webpack_public_path__ + \"img/exorcist.8c0f5cac.png\";","module.exports = __webpack_public_path__ + \"img/harlot.1a418200.png\";","module.exports = __webpack_public_path__ + \"img/goon.719106f2.png\";","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:{ screenshot: _vm.grimoire.isScreenshot },style:({\n    backgroundImage: _vm.grimoire.background\n      ? (\"url('\" + (_vm.grimoire.background) + \"')\")\n      : ''\n  }),attrs:{\"id\":\"app\",\"tabindex\":\"-1\"},on:{\"keyup\":_vm.keyup}},[(!_vm.players.length)?_c('Intro'):_vm._e(),(_vm.players.length)?_c('TownInfo'):_vm._e(),_c('TownSquare',{on:{\"screenshot\":_vm.takeScreenshot}}),_c('Menu',{ref:\"menu\"}),_c('EditionModal'),_c('RolesModal')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"square\",class:{\n    public: _vm.grimoire.isPublic,\n    spectator: _vm.session.isSpectator\n  },style:({ zoom: _vm.grimoire.zoom }),attrs:{\"id\":\"townsquare\"}},[_c('ul',{staticClass:\"circle\",class:['size-' + _vm.players.length]},_vm._l((_vm.players),function(player,index){return _c('Player',{key:index,class:{\n        'swap-from': _vm.swapFrom === index,\n        swap: _vm.swapFrom > -1\n      },attrs:{\"player\":player},on:{\"add-reminder\":function($event){return _vm.openReminderModal(index)},\"set-role\":function($event){return _vm.openRoleModal(index)},\"remove-player\":function($event){return _vm.removePlayer(index)},\"swap-seats\":function($event){return _vm.swapSeats(index, $event)},\"screenshot\":function($event){return _vm.$emit('screenshot', $event)}}})}),1),(_vm.players.length > 6)?_c('div',{ref:\"bluffs\",staticClass:\"bluffs\"},[_c('h3',[_vm._v(\"Demon bluffs\")]),_c('font-awesome-icon',{attrs:{\"icon\":\"camera\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.takeScreenshot($event)}}}),_c('ul',_vm._l((_vm.bluffs),function(index){return _c('li',{key:index,on:{\"click\":function($event){return _vm.openRoleModal(index * -1)}}},[_c('Token',{attrs:{\"role\":_vm.grimoire.bluffs[index - 1]}})],1)}),0)],1):_vm._e(),_c('ReminderModal',{attrs:{\"player-index\":_vm.selectedPlayer}}),_c('RoleModal',{attrs:{\"player-index\":_vm.selectedPlayer}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('li',[_c('div',{ref:\"player\",staticClass:\"player\",class:{\n      dead: _vm.player.isDead,\n      'no-vote': _vm.player.isVoteless,\n      traveler: _vm.player.role && _vm.player.role.team === 'traveler'\n    }},[_c('div',{staticClass:\"shroud\",on:{\"click\":function($event){return _vm.toggleStatus()}}}),_c('div',{staticClass:\"life\",on:{\"click\":function($event){return _vm.toggleStatus()}}}),(_vm.nightOrder.get(_vm.player).first && _vm.grimoire.isNightOrder)?_c('div',{staticClass:\"night first\"},[_c('em',[_vm._v(_vm._s(_vm.nightOrder.get(_vm.player).first)+\".\")]),(_vm.player.role.firstNightReminder)?_c('span',[_vm._v(_vm._s(_vm._f(\"handleEmojis\")(_vm.player.role.firstNightReminder)))]):_vm._e()]):_vm._e(),(_vm.nightOrder.get(_vm.player).other && _vm.grimoire.isNightOrder)?_c('div',{staticClass:\"night other\"},[_c('em',[_vm._v(_vm._s(_vm.nightOrder.get(_vm.player).other)+\".\")]),(_vm.player.role.otherNightReminder)?_c('span',[_vm._v(_vm._s(_vm._f(\"handleEmojis\")(_vm.player.role.otherNightReminder)))]):_vm._e()]):_vm._e(),_c('Token',{attrs:{\"role\":_vm.player.role},on:{\"set-role\":function($event){return _vm.$emit('set-role')}}}),_c('font-awesome-icon',{staticClass:\"cancel\",attrs:{\"icon\":\"times-circle\",\"title\":\"Cancel\"},on:{\"click\":function($event){return _vm.doSwap(true)}}}),_c('font-awesome-icon',{staticClass:\"swap\",attrs:{\"icon\":\"exchange-alt\",\"title\":\"Swap seats with this player\"},on:{\"click\":function($event){return _vm.doSwap()}}}),(_vm.player.isDead && !_vm.player.isVoteless)?_c('font-awesome-icon',{staticClass:\"vote\",attrs:{\"icon\":\"vote-yea\",\"title\":\"Ghost vote\"},on:{\"click\":function($event){return _vm.updatePlayer('isVoteless', true)}}}):_vm._e(),_c('div',{staticClass:\"name\",class:{ active: _vm.isMenuOpen },on:{\"click\":function($event){_vm.isMenuOpen = !_vm.isMenuOpen}}},[_vm._v(\" \"+_vm._s(_vm.player.name)+\" \")]),_c('transition',{attrs:{\"name\":\"fold\"}},[(_vm.isMenuOpen && !_vm.session.isSpectator)?_c('ul',{staticClass:\"menu\"},[_c('li',{on:{\"click\":_vm.changeName}},[_c('font-awesome-icon',{attrs:{\"icon\":\"user-edit\"}}),_vm._v(\" Rename \")],1),_c('li',{on:{\"click\":_vm.initSwap}},[_c('font-awesome-icon',{attrs:{\"icon\":\"exchange-alt\"}}),_vm._v(\" Swap seats \")],1),_c('li',{on:{\"click\":_vm.takeScreenshot}},[_c('font-awesome-icon',{attrs:{\"icon\":\"camera\"}}),_vm._v(\" Screenshot \")],1),_c('li',{on:{\"click\":function($event){return _vm.$emit('remove-player')}}},[_c('font-awesome-icon',{attrs:{\"icon\":\"times-circle\"}}),_vm._v(\" Remove \")],1)]):_vm._e()])],1),(_vm.player.reminders)?_vm._l((_vm.player.reminders),function(reminder){return _c('div',{key:reminder.role + ' ' + reminder.name,staticClass:\"reminder\",class:[reminder.role],on:{\"click\":function($event){return _vm.removeReminder(reminder)}}},[_c('span',{staticClass:\"icon\",style:({\n          backgroundImage: (\"url(\" + (require('../assets/icons/' +\n            reminder.role +\n            '.png')) + \")\")\n        })}),_vm._v(\" \"+_vm._s(reminder.name)+\" \")])}):_vm._e(),_c('div',{staticClass:\"reminder add\",on:{\"click\":function($event){return _vm.$emit('add-reminder')}}},[_c('span',{staticClass:\"icon\"})])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"token\",class:[_vm.role.id],on:{\"click\":_vm.setRole}},[(_vm.role.id)?_c('span',{staticClass:\"icon\",style:({\n      backgroundImage: (\"url(\" + (require('../assets/icons/' +\n        _vm.role.id +\n        '.png')) + \")\")\n    })}):_vm._e(),(_vm.role.firstNight)?_c('span',{staticClass:\"leaf-left\"}):_vm._e(),(_vm.role.otherNight)?_c('span',{staticClass:\"leaf-right\"}):_vm._e(),(_vm.role.reminders && _vm.role.reminders.length)?_c('span',{class:['leaf-top' + _vm.role.reminders.length]}):_vm._e(),(_vm.role.setup)?_c('span',{staticClass:\"leaf-orange\"}):_vm._e(),_c('svg',{staticClass:\"name\",attrs:{\"viewBox\":\"0 0 150 150\"}},[_c('path',{attrs:{\"d\":\"M 13 75 C 13 160, 138 160, 138 75\",\"id\":\"curve\",\"fill\":\"transparent\"}}),_c('text',{staticClass:\"label\",attrs:{\"width\":\"150\",\"x\":\"66.6%\",\"text-anchor\":\"middle\",\"font-size\":_vm._f(\"nameToFontSize\")(_vm.role.name)}},[_c('textPath',{attrs:{\"xlink:href\":\"#curve\"}},[_vm._v(\" \"+_vm._s(_vm.role.name)+\" \")])])]),_c('div',{staticClass:\"edition\",class:[(\"edition-\" + (_vm.role.edition)), _vm.role.team]}),(_vm.role.ability)?_c('div',{staticClass:\"ability\"},[_vm._v(\" \"+_vm._s(_vm.role.ability)+\" \")]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"token\" @click=\"setRole\" :class=\"[role.id]\">\n    <span\n      class=\"icon\"\n      v-if=\"role.id\"\n      v-bind:style=\"{\n        backgroundImage: `url(${require('../assets/icons/' +\n          role.id +\n          '.png')})`\n      }\"\n    ></span>\n    <span class=\"leaf-left\" v-if=\"role.firstNight\"></span>\n    <span class=\"leaf-right\" v-if=\"role.otherNight\"></span>\n    <span\n      v-if=\"role.reminders && role.reminders.length\"\n      v-bind:class=\"['leaf-top' + role.reminders.length]\"\n    ></span>\n    <span class=\"leaf-orange\" v-if=\"role.setup\"></span>\n    <svg viewBox=\"0 0 150 150\" class=\"name\">\n      <path\n        d=\"M 13 75 C 13 160, 138 160, 138 75\"\n        id=\"curve\"\n        fill=\"transparent\"\n      />\n      <text\n        width=\"150\"\n        x=\"66.6%\"\n        text-anchor=\"middle\"\n        class=\"label\"\n        v-bind:font-size=\"role.name | nameToFontSize\"\n      >\n        <textPath xlink:href=\"#curve\">\n          {{ role.name }}\n        </textPath>\n      </text>\n    </svg>\n    <div\n      class=\"edition\"\n      v-bind:class=\"[`edition-${role.edition}`, role.team]\"\n    ></div>\n    <div class=\"ability\" v-if=\"role.ability\">\n      {{ role.ability }}\n    </div>\n  </div>\n</template>\n\n<script>\nexport default {\n  name: \"Token\",\n  props: {\n    role: {\n      type: Object,\n      default: () => ({})\n    }\n  },\n  data() {\n    return {};\n  },\n  filters: {\n    nameToFontSize: name => (name && name.length > 10 ? \"20px\" : \"24px\")\n  },\n  methods: {\n    setRole() {\n      this.$emit(\"set-role\");\n    }\n  }\n};\n</script>\n\n<style scoped lang=\"scss\">\n.token {\n  border-radius: 50%;\n  height: 100%;\n  width: 100%;\n  background: url(\"../assets/token.png\") center center;\n  background-size: 100%;\n  text-align: center;\n  border: 3px solid black;\n  box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n\n  .icon {\n    background-size: 100%;\n    position: absolute;\n    width: 100%;\n    height: 100%;\n    margin-top: 3%;\n  }\n\n  span {\n    position: absolute;\n    width: 100%;\n    height: 100%;\n    background-size: 100%;\n    pointer-events: none;\n\n    &.leaf-left {\n      background-image: url(\"../assets/leaf-left.png\");\n    }\n\n    &.leaf-orange {\n      background-image: url(\"../assets/leaf-orange.png\");\n    }\n\n    &.leaf-right {\n      background-image: url(\"../assets/leaf-right.png\");\n    }\n\n    &.leaf-top1 {\n      background-image: url(\"../assets/leaf-top1.png\");\n    }\n\n    &.leaf-top2 {\n      background-image: url(\"../assets/leaf-top2.png\");\n    }\n\n    &.leaf-top3 {\n      background-image: url(\"../assets/leaf-top3.png\");\n    }\n\n    &.leaf-top4 {\n      background-image: url(\"../assets/leaf-top4.png\");\n    }\n\n    &.leaf-top5 {\n      background-image: url(\"../assets/leaf-top5.png\");\n    }\n  }\n\n  .name {\n    width: 100%;\n    height: 100%;\n    .label {\n      fill: black;\n      stroke: white;\n      stroke-width: 2px;\n      paint-order: stroke;\n      font-family: \"Papyrus\", serif;\n      font-weight: bold;\n      text-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);\n      letter-spacing: 1px;\n    }\n  }\n\n  .edition {\n    position: absolute;\n    right: 0;\n    bottom: 5px;\n    width: 30px;\n    height: 30px;\n    background-size: 100%;\n    display: none;\n  }\n\n  .ability {\n    display: flex;\n    position: absolute;\n    padding: 5px 10px;\n    left: 120%;\n    width: 250px;\n    z-index: 25;\n    font-size: 80%;\n    background: rgba(0, 0, 0, 0.5);\n    border-radius: 10px;\n    border: 3px solid black;\n    filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.5));\n    text-align: left;\n    justify-items: center;\n    align-content: center;\n    align-items: center;\n    pointer-events: none;\n    opacity: 0;\n    transition: opacity 200ms ease-in-out;\n\n    &:before {\n      content: \" \";\n      border: 10px solid transparent;\n      width: 0;\n      height: 0;\n      border-right-color: black;\n      position: absolute;\n      margin-right: 2px;\n      right: 100%;\n    }\n\n    #app.screenshot & {\n      display: none;\n    }\n  }\n\n  &:hover .ability {\n    opacity: 1;\n  }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Token.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Token.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Token.vue?vue&type=template&id=77841dfe&scoped=true&\"\nimport script from \"./Token.vue?vue&type=script&lang=js&\"\nexport * from \"./Token.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Token.vue?vue&type=style&index=0&id=77841dfe&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"77841dfe\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <li>\n    <div\n      ref=\"player\"\n      class=\"player\"\n      :class=\"{\n        dead: player.isDead,\n        'no-vote': player.isVoteless,\n        traveler: player.role && player.role.team === 'traveler'\n      }\"\n    >\n      <div class=\"shroud\" @click=\"toggleStatus()\"></div>\n      <div class=\"life\" @click=\"toggleStatus()\"></div>\n\n      <div\n        class=\"night first\"\n        v-if=\"nightOrder.get(player).first && grimoire.isNightOrder\"\n      >\n        <em>{{ nightOrder.get(player).first }}.</em>\n        <span v-if=\"player.role.firstNightReminder\">{{\n          player.role.firstNightReminder | handleEmojis\n        }}</span>\n      </div>\n      <div\n        class=\"night other\"\n        v-if=\"nightOrder.get(player).other && grimoire.isNightOrder\"\n      >\n        <em>{{ nightOrder.get(player).other }}.</em>\n        <span v-if=\"player.role.otherNightReminder\">{{\n          player.role.otherNightReminder | handleEmojis\n        }}</span>\n      </div>\n\n      <Token :role=\"player.role\" @set-role=\"$emit('set-role')\" />\n\n      <font-awesome-icon\n        icon=\"times-circle\"\n        class=\"cancel\"\n        title=\"Cancel\"\n        @click=\"doSwap(true)\"\n      />\n      <font-awesome-icon\n        icon=\"exchange-alt\"\n        class=\"swap\"\n        @click=\"doSwap()\"\n        title=\"Swap seats with this player\"\n      />\n\n      <font-awesome-icon\n        icon=\"vote-yea\"\n        class=\"vote\"\n        v-if=\"player.isDead && !player.isVoteless\"\n        @click=\"updatePlayer('isVoteless', true)\"\n        title=\"Ghost vote\"\n      />\n\n      <div\n        class=\"name\"\n        @click=\"isMenuOpen = !isMenuOpen\"\n        v-bind:class=\"{ active: isMenuOpen }\"\n      >\n        {{ player.name }}\n      </div>\n\n      <transition name=\"fold\">\n        <ul class=\"menu\" v-if=\"isMenuOpen && !session.isSpectator\">\n          <li @click=\"changeName\">\n            <font-awesome-icon icon=\"user-edit\" />\n            Rename\n          </li>\n          <!--<li @click=\"nomination\">\n            <font-awesome-icon icon=\"hand-point-right\" />\n            Nomination\n          </li>-->\n          <li @click=\"initSwap\">\n            <font-awesome-icon icon=\"exchange-alt\" />\n            Swap seats\n          </li>\n          <li @click=\"takeScreenshot\">\n            <font-awesome-icon icon=\"camera\" />\n            Screenshot\n          </li>\n          <li @click=\"$emit('remove-player')\">\n            <font-awesome-icon icon=\"times-circle\" />\n            Remove\n          </li>\n        </ul>\n      </transition>\n    </div>\n\n    <template v-if=\"player.reminders\">\n      <div\n        class=\"reminder\"\n        v-bind:key=\"reminder.role + ' ' + reminder.name\"\n        v-for=\"reminder in player.reminders\"\n        v-bind:class=\"[reminder.role]\"\n        @click=\"removeReminder(reminder)\"\n      >\n        <span\n          class=\"icon\"\n          v-bind:style=\"{\n            backgroundImage: `url(${require('../assets/icons/' +\n              reminder.role +\n              '.png')})`\n          }\"\n        ></span>\n        {{ reminder.name }}\n      </div>\n    </template>\n    <div class=\"reminder add\" @click=\"$emit('add-reminder')\">\n      <span class=\"icon\"></span>\n    </div>\n  </li>\n</template>\n\n<script>\nimport Token from \"./Token\";\nimport { mapGetters, mapState } from \"vuex\";\n\nexport default {\n  components: {\n    Token\n  },\n  props: {\n    player: {\n      type: Object,\n      required: true\n    }\n  },\n  computed: {\n    ...mapState([\"grimoire\", \"session\"]),\n    ...mapGetters({ nightOrder: \"players/nightOrder\" })\n  },\n  data() {\n    return {\n      isMenuOpen: false,\n      isSwap: false\n    };\n  },\n  filters: {\n    handleEmojis: text => text.replace(/:([^: ]+?):/g, \"\").replace(/ •/g, \"\\n•\")\n  },\n  methods: {\n    takeScreenshot() {\n      const { width, height, x, y } = this.$refs.player.getBoundingClientRect();\n      this.$emit(\"screenshot\", { width, height, x, y });\n      this.isMenuOpen = false;\n    },\n    toggleStatus() {\n      if (this.grimoire.isPublic) {\n        if (!this.player.isDead) {\n          this.updatePlayer(\"isDead\", true);\n        } else if (this.player.isVoteless) {\n          this.updatePlayer(\"isVoteless\", false);\n          this.updatePlayer(\"isDead\", false);\n        } else {\n          this.updatePlayer(\"isVoteless\", true);\n        }\n      } else {\n        this.updatePlayer(\"isDead\", !this.player.isDead);\n        if (this.player.isVoteless) {\n          this.updatePlayer(\"isVoteless\", false);\n        }\n      }\n    },\n    changeName() {\n      if (this.session.isSpectator) return;\n      const name = prompt(\"Player name\", this.player.name) || this.player.name;\n      this.updatePlayer(\"name\", name);\n      this.isMenuOpen = false;\n    },\n    removeReminder(reminder) {\n      const reminders = [...this.player.reminders];\n      reminders.splice(this.player.reminders.indexOf(reminder), 1);\n      this.updatePlayer(\"reminders\", reminders);\n    },\n    updatePlayer(property, value) {\n      if (this.session.isSpectator && property !== \"reminders\") return;\n      this.$store.commit(\"players/update\", {\n        player: this.player,\n        property,\n        value\n      });\n    },\n    initSwap() {\n      this.isMenuOpen = false;\n      this.$emit(\"swap-seats\");\n    },\n    doSwap(cancel) {\n      this.$emit(\"swap-seats\", cancel ? false : this.player);\n    }\n  }\n};\n</script>\n\n<style lang=\"scss\">\n@import \"../vars.scss\";\n\n.fold-enter-active,\n.fold-leave-active {\n  transition: transform 250ms ease-in-out;\n  transform-origin: left center;\n  transform: perspective(200px);\n}\n.fold-enter,\n.fold-leave-to {\n  transform: perspective(200px) rotateY(90deg);\n}\n\n/***** Player token *****/\n.circle .player {\n  margin-bottom: 10px;\n  padding-top: $token + 6px;\n  padding-bottom: 5px;\n\n  .shroud {\n    top: 0;\n    left: 0;\n    position: absolute;\n    width: 100%;\n    height: 2/3 * $token;\n    cursor: pointer;\n    transform: rotateX(0deg);\n    transform-origin: top center;\n    transition: transform 200ms ease-in-out;\n    z-index: 2;\n    filter: drop-shadow(0 0 5px rgba(0, 0, 0, 0.8));\n\n    &:before {\n      content: \" \";\n      background: url(\"../assets/shroud.png\") center -10px no-repeat;\n      background-size: auto 100%;\n      position: absolute;\n      margin-left: -2/6 * $token;\n      width: 2/3 * $token;\n      height: 2/3 * $token;\n      left: 50%;\n      top: -30px;\n      opacity: 0;\n      transform: perspective(400px) scale(1.5);\n      transform-origin: top center;\n      transition: all 200ms ease-in-out;\n      pointer-events: none;\n    }\n\n    #townsquare:not(.spectator) &:hover:before {\n      opacity: 0.5;\n      top: -10px;\n      transform: scale(1);\n    }\n  }\n\n  &.dead .shroud:before {\n    opacity: 1;\n    top: 0;\n    transform: perspective(400px) scale(1);\n  }\n}\n\n/****** Life token *******/\n.player {\n  z-index: 2;\n  .life {\n    border-radius: 50%;\n    height: $token + 6px;\n    width: $token + 6px;\n    background: url(\"../assets/life.png\") center center;\n    background-size: 100%;\n    border: 3px solid black;\n    box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n    cursor: pointer;\n    transition: transform 200ms ease-in-out;\n    transform: perspective(400px) rotateY(180deg);\n    backface-visibility: hidden;\n    position: absolute;\n    left: 50%;\n    top: 0;\n    margin-left: ($token + 6) / -2;\n  }\n\n  &.dead {\n    &.no-vote .life:after {\n      display: none;\n    }\n\n    .life {\n      background-image: url(\"../assets/death.png\");\n\n      &:after {\n        content: \" \";\n        position: absolute;\n        left: 0;\n        top: 0;\n        width: 100%;\n        background: url(\"../assets/vote.png\") center center no-repeat;\n        background-size: 50%;\n        height: $token + 3px;\n        pointer-events: none;\n      }\n    }\n  }\n\n  &.traveler .life {\n    filter: grayscale(100%);\n  }\n}\n\n#townsquare.public .player {\n  .shroud {\n    transform: perspective(400px) rotateX(90deg);\n    pointer-events: none;\n  }\n\n  .life {\n    transform: perspective(400px) rotateY(0deg);\n  }\n\n  &.traveler:not(.dead) .token {\n    transform: perspective(400px) scale(0.8);\n    pointer-events: none;\n    transition-delay: 0s;\n  }\n\n  &.traveler.dead .token {\n    transition-delay: 0s;\n  }\n}\n\n/***** Role token ******/\n.player .token {\n  position: absolute;\n  left: 0;\n  top: 0;\n  height: $token + 6px;\n  width: $token + 6px;\n  transition: transform 200ms ease-in-out;\n  transform: perspective(400px) rotateY(0deg);\n  backface-visibility: hidden;\n}\n\n#townsquare.public .circle .token {\n  transform: perspective(400px) rotateY(-180deg);\n}\n\n/****** Player choice icons *******/\n.player > svg {\n  position: absolute;\n  filter: drop-shadow(0 0 3px black);\n  z-index: 2;\n  cursor: pointer;\n  &.swap,\n  &.cancel {\n    top: 9%;\n    left: 20%;\n    width: 60%;\n    height: 60%;\n    opacity: 0;\n    pointer-events: none;\n    transition: all 250ms;\n    transform: scale(0.2);\n    &:hover {\n      color: red;\n    }\n  }\n}\n\nli.swap-from .player > svg.cancel {\n  opacity: 1;\n  transform: scale(1);\n  pointer-events: all;\n}\n\nli.swap:not(.swap-from) .player > svg.swap {\n  opacity: 1;\n  transform: scale(1);\n  pointer-events: all;\n}\n\n/****** Vote icon ********/\n.player .vote {\n  position: absolute;\n  right: 2px;\n  bottom: 45px;\n  color: #fff;\n  filter: drop-shadow(0 0 3px black);\n  cursor: pointer;\n  transition: opacity 250ms;\n\n  #townsquare.public & {\n    opacity: 0;\n    pointer-events: none;\n  }\n}\n\n/***** Player name *****/\n.player > .name {\n  font-size: 120%;\n  line-height: 120%;\n  cursor: pointer;\n  white-space: nowrap;\n  width: 100%;\n  display: flex;\n  justify-content: center;\n  background: rgba(0, 0, 0, 0.5);\n  border: 3px solid black;\n  border-radius: 10px;\n  top: 5px;\n  box-shadow: 0 0 5px black;\n  text-overflow: ellipsis;\n  overflow: hidden;\n\n  #townsquare:not(.spectator) &:hover,\n  &.active {\n    color: red;\n  }\n}\n\n.player.dead > .name {\n  opacity: 0.5;\n}\n\n/***** Player menu *****/\n.player > .menu {\n  position: absolute;\n  left: 100%;\n  bottom: 0;\n  text-align: left;\n  white-space: nowrap;\n  background: rgba(0, 0, 0, 0.5);\n  padding: 0 5px;\n  border-radius: 5px;\n  border: 3px solid black;\n  margin-left: 15px;\n  cursor: pointer;\n  box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n\n  &:before {\n    content: \" \";\n    width: 0;\n    height: 0;\n    position: absolute;\n    border: 10px solid transparent;\n    border-right-color: black;\n    right: 100%;\n    bottom: 7px;\n    margin-right: 2px;\n  }\n\n  li:hover {\n    color: red;\n  }\n  svg {\n    margin-right: 2px;\n  }\n}\n\n/***** Ability text *****/\n#townsquare.public .ability {\n  display: none;\n}\n.circle .player .shroud:hover ~ .token .ability,\n.circle .player .token:hover .ability {\n  opacity: 1;\n}\n\n/**** Night reminders ****/\n.player .night {\n  position: absolute;\n  height: 100%;\n  width: 100%;\n  z-index: 2;\n  cursor: pointer;\n  opacity: 1;\n  transition: opacity 200ms;\n  display: flex;\n  top: -20px;\n  align-items: center;\n  pointer-events: none;\n\n  #townsquare.public & {\n    opacity: 0;\n    pointer-events: none;\n  }\n\n  &:hover ~ .token .ability {\n    opacity: 0;\n  }\n\n  span {\n    display: flex;\n    position: absolute;\n    padding: 5px 10px 5px 30px;\n    width: 350px;\n    z-index: 25;\n    font-size: 70%;\n    background: rgba(0, 0, 0, 0.5);\n    border-radius: 10px;\n    border: 3px solid black;\n    filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.5));\n    text-align: left;\n    align-items: center;\n    opacity: 0;\n    transition: opacity 200ms ease-in-out;\n\n    &:before {\n      transform: rotate(-90deg);\n      transform-origin: center top;\n      left: -98px;\n      top: 50%;\n      font-size: 100%;\n      position: absolute;\n      font-weight: bold;\n      text-align: center;\n      width: 200px;\n    }\n\n    &:after {\n      content: \" \";\n      border: 10px solid transparent;\n      width: 0;\n      height: 0;\n      position: absolute;\n    }\n  }\n\n  &.first span {\n    right: 120%;\n    background: linear-gradient(\n      to right,\n      $townsfolk 0%,\n      rgba(0, 0, 0, 0.5) 20%\n    );\n    &:before {\n      content: \"First Night\";\n    }\n    &:after {\n      border-left-color: $townsfolk;\n      margin-left: 3px;\n      left: 100%;\n    }\n  }\n\n  &.other span {\n    left: 120%;\n    background: linear-gradient(to right, $demon 0%, rgba(0, 0, 0, 0.5) 20%);\n    &:before {\n      content: \"Other Nights\";\n    }\n    &:after {\n      right: 100%;\n      margin-right: 3px;\n      border-right-color: $demon;\n    }\n  }\n\n  em {\n    font-style: normal;\n    position: absolute;\n    width: 40px;\n    height: 40px;\n    text-align: center;\n    line-height: 37px;\n    border-radius: 50%;\n    border: 3px solid black;\n    filter: drop-shadow(0 0 6px rgba(0, 0, 0, 0.5));\n    font-weight: bold;\n    opacity: 1;\n    pointer-events: all;\n    transition: opacity 200ms;\n  }\n\n  &.first em {\n    left: -15px;\n    background: linear-gradient(180deg, rgba(0, 0, 0, 1) 0%, $townsfolk 100%);\n  }\n\n  &.other em {\n    right: -15px;\n    background: linear-gradient(180deg, rgba(0, 0, 0, 1) 0%, $demon 100%);\n  }\n\n  em:hover + span {\n    opacity: 1;\n  }\n\n  #app.screenshot & {\n    display: none;\n  }\n}\n\n.player.dead .night em {\n  opacity: 0;\n}\n\n/***** Reminder token *****/\n.circle .reminder {\n  background: url(\"../assets/reminder.png\") center center;\n  background-size: 100%;\n  width: $token / 2;\n  height: $token / 2;\n  color: black;\n  font-size: 45%;\n  font-weight: bold;\n  display: block;\n  margin: 5px ($token / -4) 0;\n  text-align: center;\n  padding: ($token * 0.3 + 2px) 5px 0;\n  border-radius: 50%;\n  line-height: 90%;\n  border: 3px solid black;\n  box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n  transition: all 200ms;\n  cursor: pointer;\n\n  .icon,\n  &:after {\n    content: \" \";\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100%;\n    background-size: 100%;\n    background-position: center 0;\n    background-repeat: no-repeat;\n    background-image: url(\"../assets/icons/plus.png\");\n    transition: opacity 200ms;\n  }\n\n  &:after {\n    background-image: url(\"../assets/icons/x.png\");\n    opacity: 0;\n  }\n\n  &.add {\n    opacity: 0;\n    top: 30px;\n    &:after {\n      display: none;\n    }\n  }\n\n  &:hover:before {\n    opacity: 0;\n  }\n  &:hover:after {\n    opacity: 1;\n  }\n}\n.circle li:hover .reminder.add {\n  opacity: 1;\n  top: 0;\n}\n.circle li:hover .reminder.add:before {\n  opacity: 1;\n}\n\n#townsquare.public .reminder {\n  opacity: 0;\n  pointer-events: none;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Player.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Player.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Player.vue?vue&type=template&id=0e4ecd94&\"\nimport script from \"./Player.vue?vue&type=script&lang=js&\"\nexport * from \"./Player.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Player.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.players[_vm.playerIndex])?_c('Modal',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.modals.reminder && _vm.availableReminders.length),expression:\"modals.reminder && availableReminders.length\"}],on:{\"close\":function($event){return _vm.toggleModal('reminder')}}},[_c('h3',[_vm._v(\"Choose a reminder token:\")]),_c('ul',{staticClass:\"reminders\"},_vm._l((_vm.availableReminders),function(reminder){return _c('li',{key:reminder.role + ' ' + reminder.name,staticClass:\"reminder\",class:[reminder.role],on:{\"click\":function($event){return _vm.addReminder(reminder)}}},[_c('span',{staticClass:\"icon\",style:({\n          backgroundImage: (\"url(\" + (require('../../assets/icons/' +\n            reminder.role +\n            '.png')) + \")\")\n        })}),_vm._v(\" \"+_vm._s(reminder.name)+\" \")])}),0)]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('transition',{attrs:{\"name\":\"modal-fade\"}},[_c('div',{staticClass:\"modal-backdrop\",on:{\"click\":_vm.close}},[_c('div',{staticClass:\"modal\",attrs:{\"role\":\"dialog\",\"aria-labelledby\":\"modalTitle\",\"aria-describedby\":\"modalDescription\"},on:{\"click\":function($event){$event.stopPropagation();}}},[_c('font-awesome-icon',{staticClass:\"close\",attrs:{\"icon\":\"times-circle\"},on:{\"click\":_vm.close}}),_vm._t(\"default\")],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <transition name=\"modal-fade\">\n    <div class=\"modal-backdrop\" @click=\"close\">\n      <div\n        class=\"modal\"\n        role=\"dialog\"\n        aria-labelledby=\"modalTitle\"\n        aria-describedby=\"modalDescription\"\n        @click.stop=\"\"\n      >\n        <font-awesome-icon @click=\"close\" class=\"close\" icon=\"times-circle\" />\n        <slot></slot>\n      </div>\n    </div>\n  </transition>\n</template>\n\n<script>\nexport default {\n  methods: {\n    close() {\n      this.$emit(\"close\");\n    }\n  }\n};\n</script>\n\n<style lang=\"scss\">\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  background-color: rgba(0, 0, 0, 0.3);\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  z-index: 100;\n}\n\n.modal {\n  background: rgba(0, 0, 0, 0.8);\n  padding: 10px 20px;\n  border-radius: 10px;\n  box-shadow: 2px 2px 20px 1px #000;\n  display: flex;\n  flex-direction: column;\n  max-width: 60%;\n\n  ul {\n    list-style-type: none;\n    margin: 0;\n    padding: 0;\n    display: flex;\n    flex-wrap: wrap;\n    align-content: center;\n    align-items: center;\n    justify-content: center;\n    font-size: 75%;\n    line-height: 100%;\n  }\n  > .close {\n    position: absolute;\n    right: 20px;\n    top: 20px;\n    cursor: pointer;\n    z-index: 5;\n    &:hover {\n      color: red;\n    }\n  }\n}\n\n.modal-fade-enter,\n.modal-fade-leave-active {\n  opacity: 0;\n}\n\n.modal-fade-enter-active,\n.modal-fade-leave-active {\n  transition: opacity 0.2s ease;\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Modal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Modal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Modal.vue?vue&type=template&id=e5ed0adc&\"\nimport script from \"./Modal.vue?vue&type=script&lang=js&\"\nexport * from \"./Modal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Modal.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","<template>\n  <Modal\n    v-show=\"modals.reminder && availableReminders.length\"\n    v-if=\"players[playerIndex]\"\n    @close=\"toggleModal('reminder')\"\n  >\n    <h3>Choose a reminder token:</h3>\n    <ul class=\"reminders\">\n      <li\n        v-for=\"reminder in availableReminders\"\n        class=\"reminder\"\n        v-bind:class=\"[reminder.role]\"\n        v-bind:key=\"reminder.role + ' ' + reminder.name\"\n        @click=\"addReminder(reminder)\"\n      >\n        <span\n          class=\"icon\"\n          v-bind:style=\"{\n            backgroundImage: `url(${require('../../assets/icons/' +\n              reminder.role +\n              '.png')})`\n          }\"\n        ></span>\n        {{ reminder.name }}\n      </li>\n    </ul>\n  </Modal>\n</template>\n\n<script>\nimport Modal from \"./Modal\";\nimport { mapMutations, mapState } from \"vuex\";\n\nexport default {\n  components: { Modal },\n  props: [\"playerIndex\"],\n  computed: {\n    availableReminders() {\n      let reminders = [];\n      const players = this.$store.state.players.players;\n      this.$store.state.roles.forEach(role => {\n        if (players.some(p => p.role.id === role.id)) {\n          reminders = [\n            ...reminders,\n            ...role.reminders.map(name => ({ role: role.id, name }))\n          ];\n        }\n      });\n      reminders.push({ role: \"good\", name: \"Good\" });\n      reminders.push({ role: \"evil\", name: \"Evil\" });\n      return reminders;\n    },\n    ...mapState([\"modals\"]),\n    ...mapState(\"players\", [\"players\"])\n  },\n  methods: {\n    addReminder(reminder) {\n      const player = this.$store.state.players.players[this.playerIndex];\n      const value = [...player.reminders, reminder];\n      this.$store.commit(\"players/update\", {\n        player,\n        property: \"reminders\",\n        value\n      });\n      this.$store.commit(\"toggleModal\", \"reminder\");\n    },\n    ...mapMutations([\"toggleModal\"])\n  }\n};\n</script>\n\n<style scoped lang=\"scss\">\nul.reminders .reminder {\n  background: url(\"../../assets/reminder.png\") center center;\n  background-size: 100%;\n  width: 100px;\n  height: 100px;\n  color: black;\n  font-size: 65%;\n  font-weight: bold;\n  display: block;\n  margin: 5px;\n  text-align: center;\n  border-radius: 50%;\n  border: 3px solid black;\n  box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n  cursor: pointer;\n  padding: 65px 9px 0;\n  line-height: 100%;\n  transition: transform 500ms ease;\n\n  .icon {\n    position: absolute;\n    left: 0;\n    top: 0;\n    width: 100%;\n    height: 100%;\n    background-size: 100%;\n    background-position: center 0;\n    background-repeat: no-repeat;\n  }\n\n  &:hover {\n    transform: scale(1.2);\n  }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReminderModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReminderModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ReminderModal.vue?vue&type=template&id=1e8ee28e&scoped=true&\"\nimport script from \"./ReminderModal.vue?vue&type=script&lang=js&\"\nexport * from \"./ReminderModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ReminderModal.vue?vue&type=style&index=0&id=1e8ee28e&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"1e8ee28e\",\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Modal',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.modals.role && _vm.availableRoles.length),expression:\"modals.role && availableRoles.length\"}],on:{\"close\":function($event){return _vm.toggleModal('role')}}},[_c('h3',[_vm._v(\" Choose a new character for \"+_vm._s(_vm.playerIndex >= 0 && _vm.players.length ? _vm.players[_vm.playerIndex].name : \"bluffing\")+\" \")]),_c('ul',{staticClass:\"tokens\"},_vm._l((_vm.availableRoles),function(role){return _c('li',{key:role.id,class:[role.team],on:{\"click\":function($event){return _vm.setRole(role)}}},[_c('Token',{attrs:{\"role\":role}})],1)}),0)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <Modal\n    v-show=\"modals.role && availableRoles.length\"\n    @close=\"toggleModal('role')\"\n  >\n    <h3>\n      Choose a new character for\n      {{\n        playerIndex >= 0 && players.length\n          ? players[playerIndex].name\n          : \"bluffing\"\n      }}\n    </h3>\n    <ul class=\"tokens\">\n      <li\n        v-for=\"role in availableRoles\"\n        v-bind:class=\"[role.team]\"\n        v-bind:key=\"role.id\"\n        @click=\"setRole(role)\"\n      >\n        <Token :role=\"role\" />\n      </li>\n    </ul>\n  </Modal>\n</template>\n\n<script>\nimport { mapMutations, mapState } from \"vuex\";\nimport Modal from \"./Modal\";\nimport Token from \"../Token\";\n\nexport default {\n  components: { Token, Modal },\n  props: [\"playerIndex\"],\n  computed: {\n    availableRoles() {\n      const availableRoles = [];\n      const players = this.$store.state.players.players;\n      this.$store.state.roles.forEach(role => {\n        // don't show bluff roles that are already assigned to players\n        if (\n          this.playerIndex >= 0 ||\n          (this.playerIndex < 0 &&\n            !players.some(player => player.role.id === role.id))\n        ) {\n          availableRoles.push(role);\n        }\n      });\n      availableRoles.push({});\n      return availableRoles;\n    },\n    ...mapState([\"modals\", \"roles\"]),\n    ...mapState(\"players\", [\"players\"])\n  },\n  methods: {\n    setRole(role) {\n      if (this.playerIndex < 0) {\n        // assign to bluff slot\n        this.$store.commit(\"setBluff\", {\n          index: this.playerIndex * -1 - 1,\n          role\n        });\n      } else {\n        // assign to player\n        const player = this.$store.state.players.players[this.playerIndex];\n        this.$store.commit(\"players/update\", {\n          player,\n          property: \"role\",\n          value: role\n        });\n      }\n      this.$store.commit(\"toggleModal\", \"role\");\n    },\n    ...mapMutations([\"toggleModal\"])\n  }\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import \"../../vars.scss\";\n\nul.tokens li {\n  border-radius: 50%;\n  width: 6vw;\n  margin: 5px;\n  transition: transform 500ms ease;\n\n  &.townsfolk {\n    box-shadow: 0 0 10px $townsfolk, 0 0 10px #004cff;\n  }\n  &.outsider {\n    box-shadow: 0 0 10px $outsider, 0 0 10px $outsider;\n  }\n  &.minion {\n    box-shadow: 0 0 10px $minion, 0 0 10px $minion;\n  }\n  &.demon {\n    box-shadow: 0 0 10px $demon, 0 0 10px $demon;\n  }\n  &.traveler {\n    box-shadow: 0 0 10px $traveler, 0 0 10px $traveler;\n  }\n  &:hover {\n    transform: scale(1.2);\n    z-index: 10;\n  }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RoleModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RoleModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./RoleModal.vue?vue&type=template&id=b7e1897a&scoped=true&\"\nimport script from \"./RoleModal.vue?vue&type=script&lang=js&\"\nexport * from \"./RoleModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RoleModal.vue?vue&type=style&index=0&id=b7e1897a&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"b7e1897a\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div\n    id=\"townsquare\"\n    class=\"square\"\n    v-bind:class=\"{\n      public: grimoire.isPublic,\n      spectator: session.isSpectator\n    }\"\n    v-bind:style=\"{ zoom: grimoire.zoom }\"\n  >\n    <ul class=\"circle\" v-bind:class=\"['size-' + players.length]\">\n      <Player\n        v-for=\"(player, index) in players\"\n        :key=\"index\"\n        :player=\"player\"\n        @add-reminder=\"openReminderModal(index)\"\n        @set-role=\"openRoleModal(index)\"\n        @remove-player=\"removePlayer(index)\"\n        @swap-seats=\"swapSeats(index, $event)\"\n        @screenshot=\"$emit('screenshot', $event)\"\n        v-bind:class=\"{\n          'swap-from': swapFrom === index,\n          swap: swapFrom > -1\n        }\"\n      ></Player>\n    </ul>\n\n    <div class=\"bluffs\" v-if=\"players.length > 6\" ref=\"bluffs\">\n      <h3>Demon bluffs</h3>\n      <font-awesome-icon icon=\"camera\" @click.stop=\"takeScreenshot\" />\n      <ul>\n        <li\n          v-for=\"index in bluffs\"\n          :key=\"index\"\n          @click=\"openRoleModal(index * -1)\"\n        >\n          <Token :role=\"grimoire.bluffs[index - 1]\"></Token>\n        </li>\n      </ul>\n    </div>\n\n    <ReminderModal :player-index=\"selectedPlayer\"></ReminderModal>\n    <RoleModal :player-index=\"selectedPlayer\"></RoleModal>\n  </div>\n</template>\n\n<script>\nimport { mapState } from \"vuex\";\nimport Player from \"./Player\";\nimport Token from \"./Token\";\nimport ReminderModal from \"./modals/ReminderModal\";\nimport RoleModal from \"./modals/RoleModal\";\n\nexport default {\n  components: {\n    Player,\n    Token,\n    RoleModal,\n    ReminderModal\n  },\n  computed: {\n    ...mapState([\"grimoire\", \"roles\", \"session\"]),\n    ...mapState(\"players\", [\"players\"])\n  },\n  data() {\n    return {\n      selectedPlayer: 0,\n      bluffs: 3,\n      swapFrom: -1\n    };\n  },\n  methods: {\n    takeScreenshot() {\n      const { width, height, x, y } = this.$refs.bluffs.getBoundingClientRect();\n      this.$emit(\"screenshot\", { width, height, x, y });\n    },\n    openReminderModal(playerIndex) {\n      this.selectedPlayer = playerIndex;\n      this.$store.commit(\"toggleModal\", \"reminder\");\n    },\n    openRoleModal(playerIndex) {\n      const player = this.players[playerIndex];\n      if (this.session.isSpectator && player.role.team === \"traveler\") return;\n      this.selectedPlayer = playerIndex;\n      this.$store.commit(\"toggleModal\", \"role\");\n    },\n    removePlayer(playerIndex) {\n      if (this.session.isSpectator) return;\n      if (\n        confirm(\n          `Do you really want to remove ${this.players[playerIndex].name}?`\n        )\n      ) {\n        this.$store.commit(\"players/remove\", playerIndex);\n      }\n    },\n    swapSeats(from, to) {\n      if (to === undefined) {\n        this.swapFrom = from;\n      } else if (to === false) {\n        this.swapFrom = -1;\n      } else {\n        this.$store.commit(\"players/swap\", [\n          this.swapFrom,\n          this.players.indexOf(to)\n        ]);\n        this.swapFrom = -1;\n      }\n    }\n  }\n};\n</script>\n\n<style lang=\"scss\">\n.circle {\n  padding: 0;\n  width: 100%;\n  height: 100%;\n  list-style: none;\n  margin: 0;\n\n  > li {\n    position: absolute;\n    top: 0;\n    left: 50%;\n    height: 50%;\n    transform-origin: 0 100%;\n    text-align: center;\n\n    &:hover {\n      z-index: 25 !important;\n    }\n\n    > * {\n      margin-left: -78px;\n      width: 156px;\n    }\n  }\n}\n\n@mixin on-circle($item-count) {\n  $angle: (360 / $item-count);\n  $rot: 0;\n\n  @for $i from 1 through $item-count {\n    &:nth-child(#{$i}) {\n      transform: rotate($rot * 1deg);\n      @if $i - 1 <= $item-count / 2 {\n        z-index: $item-count - $i + 1;\n      } @else {\n        z-index: $i - 1;\n        .ability {\n          right: 120%;\n          left: auto;\n          &:before {\n            border-right-color: transparent;\n            border-left-color: black;\n            right: auto;\n            left: 100%;\n          }\n        }\n      }\n      > * {\n        transform: rotate($rot * -1deg);\n      }\n      .life,\n      .token,\n      .shroud,\n      .night {\n        transition-delay: ($i - 1) * 50ms;\n      }\n\n      // move reminders closer to the sides of the circle\n      $q: $item-count / 4;\n      $x: $i - 1;\n      @if $x < $q or ($x >= $item-count / 2 and $x < $q * 3) {\n        .player {\n          margin-bottom: -10px + 20px * (1 - ($x % $q / $q));\n        }\n      } @else {\n        .player {\n          margin-bottom: -10px + 20px * ($x % $q / $q);\n        }\n      }\n    }\n    $rot: $rot + $angle;\n  }\n}\n\n@for $i from 1 through 20 {\n  .circle.size-#{$i} > li {\n    @include on-circle($item-count: $i);\n  }\n}\n\n#townsquare {\n  width: 100%;\n  height: 100%;\n  border-radius: 50%;\n  padding: 20px;\n}\n\n/***** Demon bluffs *******/\n.bluffs {\n  position: absolute;\n  bottom: 10px;\n  left: 10px;\n  background: rgba(0, 0, 0, 0.5);\n  border-radius: 10px;\n  border: 3px solid black;\n  filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.5));\n  transform-origin: bottom left;\n  transform: scale(1);\n  opacity: 1;\n  transition: all 200ms ease-in-out;\n\n  #townsquare.public & {\n    opacity: 0;\n    transform: scale(0.1);\n  }\n  > svg {\n    position: absolute;\n    top: 10px;\n    right: 10px;\n    cursor: pointer;\n    &:hover {\n      color: red;\n    }\n    #app.screenshot & {\n      display: none;\n    }\n  }\n  h3 {\n    margin-top: 5px;\n  }\n  li {\n    width: 120px;\n    height: 120px;\n    margin: 0 5px;\n    display: inline-block;\n    font-size: 18px;\n  }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownSquare.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownSquare.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TownSquare.vue?vue&type=template&id=7db87acc&\"\nimport script from \"./TownSquare.vue?vue&type=script&lang=js&\"\nexport * from \"./TownSquare.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TownSquare.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ul',{staticClass:\"info\"},[_c('li',{staticClass:\"edition\",class:['edition-' + _vm.edition]}),(_vm.players.length - _vm.teams.traveler < 5)?_c('li',[_vm._v(\" Please add more players! \")]):_vm._e(),_c('li',[_vm._v(\" \"+_vm._s(_vm.players.length)+\" \"),_c('font-awesome-icon',{staticClass:\"players\",attrs:{\"icon\":\"users\"}}),_vm._v(\" \"+_vm._s(_vm.teams.alive)+\" \"),_c('font-awesome-icon',{staticClass:\"alive\",attrs:{\"icon\":\"heartbeat\"}}),_vm._v(\" \"+_vm._s(_vm.teams.votes)+\" \"),_c('font-awesome-icon',{staticClass:\"votes\",attrs:{\"icon\":\"vote-yea\"}})],1),(_vm.players.length - _vm.teams.traveler >= 5)?_c('li',[_vm._v(\" \"+_vm._s(_vm.teams.townsfolk)+\" \"),_c('font-awesome-icon',{staticClass:\"townsfolk\",attrs:{\"icon\":\"user-friends\"}}),_vm._v(\" \"+_vm._s(_vm.teams.outsider)+\" \"),_c('font-awesome-icon',{staticClass:\"outsider\",attrs:{\"icon\":_vm.teams.outsider > 1 ? 'user-friends' : 'user'}}),_vm._v(\" \"+_vm._s(_vm.teams.minion)+\" \"),_c('font-awesome-icon',{staticClass:\"minion\",attrs:{\"icon\":_vm.teams.minion > 1 ? 'user-friends' : 'user'}}),_vm._v(\" \"+_vm._s(_vm.teams.demon)+\" \"),_c('font-awesome-icon',{staticClass:\"demon\",attrs:{\"icon\":_vm.teams.demon > 1 ? 'user-friends' : 'user'}}),(_vm.teams.traveler)?[_vm._v(\" \"+_vm._s(_vm.teams.traveler)+\" \"),_c('font-awesome-icon',{staticClass:\"traveler\",attrs:{\"icon\":_vm.teams.traveler > 1 ? 'user-friends' : 'user'}})]:_vm._e()],2):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <ul class=\"info\">\n    <li class=\"edition\" v-bind:class=\"['edition-' + edition]\"></li>\n    <li v-if=\"players.length - teams.traveler < 5\">\n      Please add more players!\n    </li>\n    <li>\n      {{ players.length }} <font-awesome-icon class=\"players\" icon=\"users\" />\n      {{ teams.alive }} <font-awesome-icon class=\"alive\" icon=\"heartbeat\" />\n      {{ teams.votes }} <font-awesome-icon class=\"votes\" icon=\"vote-yea\" />\n    </li>\n    <li v-if=\"players.length - teams.traveler >= 5\">\n      {{ teams.townsfolk }}\n      <font-awesome-icon class=\"townsfolk\" icon=\"user-friends\" />\n      {{ teams.outsider }}\n      <font-awesome-icon\n        class=\"outsider\"\n        v-bind:icon=\"teams.outsider > 1 ? 'user-friends' : 'user'\"\n      />\n      {{ teams.minion }}\n      <font-awesome-icon\n        class=\"minion\"\n        v-bind:icon=\"teams.minion > 1 ? 'user-friends' : 'user'\"\n      />\n      {{ teams.demon }}\n      <font-awesome-icon\n        class=\"demon\"\n        v-bind:icon=\"teams.demon > 1 ? 'user-friends' : 'user'\"\n      />\n      <template v-if=\"teams.traveler\">\n        {{ teams.traveler }}\n        <font-awesome-icon\n          class=\"traveler\"\n          v-bind:icon=\"teams.traveler > 1 ? 'user-friends' : 'user'\"\n        />\n      </template>\n    </li>\n  </ul>\n</template>\n\n<script>\nimport gameJSON from \"./../game\";\nimport { mapState } from \"vuex\";\n\nexport default {\n  computed: {\n    teams: function() {\n      const { players } = this.$store.state.players;\n      const nonTravelers = this.$store.getters[\"players/nonTravelers\"];\n      const alive = players.filter(player => player.isDead !== true).length;\n      return {\n        ...gameJSON[nonTravelers - 5],\n        traveler: players.length - nonTravelers,\n        alive,\n        votes:\n          alive +\n          players.filter(\n            player => player.isDead === true && player.isVoteless !== true\n          ).length\n      };\n    },\n    ...mapState({\n      edition: state => state.edition,\n      players: state => state.players.players\n    })\n  }\n};\n</script>\n\n<style lang=\"scss\">\n@import \"../vars.scss\";\n\n// Editions\n@each $img, $skipIcons in $editions {\n  .edition-#{$img} {\n    background-image: url(\"../assets/editions/#{$img}.png\");\n  }\n  @if $skipIcons != true {\n    .edition-#{$img}.townsfolk {\n      background-image: url(\"../assets/editions/#{$img}-townsfolk.png\");\n    }\n    .edition-#{$img}.outsider {\n      background-image: url(\"../assets/editions/#{$img}-outsider.png\");\n    }\n    .edition-#{$img}.minion {\n      background-image: url(\"../assets/editions/#{$img}-minion.png\");\n    }\n    .edition-#{$img}.demon {\n      background-image: url(\"../assets/editions/#{$img}-demon.png\");\n    }\n  }\n}\n\n.info {\n  position: absolute;\n  display: flex;\n  left: 50%;\n  top: 50%;\n  width: 20%;\n  height: 20%;\n  margin-left: -10%;\n  margin-top: -5%;\n  padding: 50px 0 0;\n  align-items: center;\n  align-content: center;\n  justify-content: center;\n  flex-wrap: wrap;\n  background: url(\"../assets/demon-head.png\") center center no-repeat;\n  background-size: auto 100%;\n\n  li {\n    display: block;\n    white-space: nowrap;\n    font-weight: bold;\n    text-align: center;\n    padding: 0 5px;\n    width: 100%;\n    filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.7));\n\n    svg {\n      margin-right: 10px;\n    }\n\n    .players {\n      color: #00f700;\n    }\n    .alive {\n      color: #ff4a50;\n    }\n    .votes {\n      color: #fff;\n    }\n    .townsfolk {\n      color: $townsfolk;\n    }\n    .outsider {\n      color: $outsider;\n    }\n    .minion {\n      color: $minion;\n    }\n    .demon {\n      color: $demon;\n    }\n    .traveler {\n      color: $traveler;\n    }\n  }\n\n  li.edition {\n    width: 220px;\n    height: 200px;\n    background-position: 0 center;\n    background-repeat: no-repeat;\n    background-size: 100% auto;\n    position: absolute;\n    top: -50px;\n  }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownInfo.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownInfo.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TownInfo.vue?vue&type=template&id=262546e0&\"\nimport script from \"./TownInfo.vue?vue&type=script&lang=js&\"\nexport * from \"./TownInfo.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TownInfo.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"controls\"}},[_c('Screenshot',{ref:\"screenshot\"}),(_vm.session.sessionId)?_c('font-awesome-icon',{class:{ spectator: _vm.session.isSpectator },attrs:{\"icon\":\"broadcast-tower\",\"title\":\"You're currently in a live game!\"},on:{\"click\":_vm.leaveSession}}):_vm._e(),_c('font-awesome-icon',{class:{ success: _vm.grimoire.isScreenshotSuccess },attrs:{\"icon\":\"camera\",\"title\":\"Take a screenshot\"},on:{\"click\":function($event){return _vm.takeScreenshot()}}}),_c('div',{staticClass:\"menu\",class:{ open: _vm.grimoire.isMenuOpen }},[_c('font-awesome-icon',{attrs:{\"icon\":\"cog\"},on:{\"click\":_vm.toggleMenu}}),_c('ul',[_c('li',{staticClass:\"headline\"},[_c('font-awesome-icon',{attrs:{\"icon\":\"book-open\"}}),_vm._v(\" Grimoire \")],1),(_vm.players.length)?_c('li',{on:{\"click\":_vm.toggleGrimoire}},[_c('em',[_vm._v(\"[G]\")]),(!_vm.grimoire.isPublic)?[_vm._v(\"Hide\")]:_vm._e(),(_vm.grimoire.isPublic)?[_vm._v(\"Show\")]:_vm._e()],2):_vm._e(),(_vm.players.length)?_c('li',{on:{\"click\":_vm.toggleNightOrder}},[_c('em',[_c('font-awesome-icon',{attrs:{\"icon\":['fas', _vm.grimoire.isNightOrder ? 'check-square' : 'square']}})],1),_vm._v(\" Night order \")]):_vm._e(),(_vm.players.length)?_c('li',[_c('em',[_c('font-awesome-icon',{attrs:{\"icon\":\"search-minus\"},on:{\"click\":function($event){return _vm.updateZoom(-0.1)}}}),_vm._v(\" \"+_vm._s(Math.round(_vm.grimoire.zoom * 100))+\"% \"),_c('font-awesome-icon',{attrs:{\"icon\":\"search-plus\"},on:{\"click\":function($event){return _vm.updateZoom(0.1)}}})],1),_vm._v(\" Zoom \")]):_vm._e(),_c('li',{on:{\"click\":_vm.setBackground}},[_vm._v(\" Background image \")]),(!_vm.session.sessionId)?_c('li',{on:{\"click\":_vm.hostSession}},[_vm._v(\" Host Live Session \")]):_vm._e(),(!_vm.session.sessionId)?_c('li',{on:{\"click\":_vm.joinSession}},[_vm._v(\" Join Live Session \")]):_vm._e(),(_vm.session.sessionId)?_c('li',{staticClass:\"headline\"},[_c('font-awesome-icon',{attrs:{\"icon\":\"broadcast-tower\"}}),_vm._v(\" \"+_vm._s(_vm.session.isSpectator ? \"Playing\" : \"Hosting\")+\" \")],1):_vm._e(),(_vm.session.sessionId)?_c('li',{on:{\"click\":_vm.copySessionUrl}},[_c('em',[_c('font-awesome-icon',{attrs:{\"icon\":\"copy\"}})],1),_vm._v(\" Copy player link \")]):_vm._e(),(_vm.session.sessionId)?_c('li',{on:{\"click\":_vm.leaveSession}},[_c('em',[_vm._v(_vm._s(_vm.session.sessionId))]),_vm._v(\" Leave Session \")]):_vm._e(),(!_vm.session.isSpectator)?[_c('li',{staticClass:\"headline\"},[_c('font-awesome-icon',{attrs:{\"icon\":\"users\"}}),_vm._v(\" Players \")],1),(_vm.players.length < 20)?_c('li',{on:{\"click\":_vm.addPlayer}},[_c('em',[_vm._v(\"[A]\")]),_vm._v(\" Add \")]):_vm._e(),(_vm.players.length > 2)?_c('li',{on:{\"click\":_vm.randomizeSeatings}},[_c('em',[_vm._v(\"[R]\")]),_vm._v(\" Randomize \")]):_vm._e(),(_vm.players.length)?_c('li',{on:{\"click\":_vm.clearPlayers}},[_vm._v(\" Remove all \")]):_vm._e(),_c('li',{staticClass:\"headline\"},[_c('font-awesome-icon',{attrs:{\"icon\":\"theater-masks\"}}),_vm._v(\" Characters \")],1),_c('li',{on:{\"click\":function($event){return _vm.toggleModal('edition')}}},[_c('em',[_vm._v(\"[E]\")]),_vm._v(\" Select Edition \")]),(_vm.players.length > 4)?_c('li',{on:{\"click\":function($event){return _vm.toggleModal('roles')}}},[_c('em',[_vm._v(\"[C]\")]),_vm._v(\" Choose & Assign \")]):_vm._e(),(_vm.players.length)?_c('li',{on:{\"click\":_vm.clearRoles}},[_vm._v(\" Remove all \")]):_vm._e()]:_vm._e()],2)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"screenshot\"}},[_c('video',{ref:\"video\",attrs:{\"autoplay\":\"\"}}),_c('canvas',{ref:\"canvas\"})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div id=\"screenshot\">\n    <video ref=\"video\" autoplay></video>\n    <canvas ref=\"canvas\"></canvas>\n  </div>\n</template>\n\n<script>\nexport default {\n  data: function() {\n    return {\n      stream: null\n    };\n  },\n  methods: {\n    async capture({ x = 0, y = 0, width = 0, height = 0 }) {\n      const canvas = this.$refs.canvas;\n      const video = this.$refs.video;\n      const zoom = this.$store.state.grimoire.zoom;\n      // start capturing\n      if (!this.stream || !this.stream.active) {\n        alert(\n          \"Please select to stream the current browser tab to get the appropriate screenshots\"\n        );\n        try {\n          this.stream = await navigator.mediaDevices.getDisplayMedia({\n            video: {\n              // frameRate: 5,\n              cursor: \"never\"\n            },\n            audio: false\n          });\n        } catch (err) {\n          this.$store.commit(\"updateScreenshot\", false);\n        }\n      }\n      // get screenshot\n      if (this.stream && this.stream.active) {\n        video.srcObject = this.stream;\n        video.play();\n        setTimeout(() => {\n          const context = canvas.getContext(\"2d\");\n          canvas.setAttribute(\"width\", width * zoom || video.videoWidth);\n          canvas.setAttribute(\"height\", height * zoom || video.videoHeight);\n          context.drawImage(\n            video,\n            x * zoom || 0,\n            y * zoom || 0,\n            width * zoom || video.videoWidth,\n            height * zoom || video.videoHeight,\n            0,\n            0,\n            width * zoom || video.videoWidth,\n            height * zoom || video.videoHeight\n          );\n          canvas.toBlob(blob => {\n            try {\n              // eslint-disable-next-line no-undef\n              const item = new ClipboardItem({ \"image/png\": blob });\n              navigator.clipboard.write([item]);\n              this.$store.commit(\"updateScreenshot\", true);\n            } catch (err) {\n              this.$store.commit(\"updateScreenshot\", false);\n            }\n          });\n        }, 100);\n      }\n    }\n  }\n};\n</script>\n\n<style scoped>\nvideo {\n  width: 100%;\n  height: 100%;\n  display: none;\n}\ncanvas {\n  width: 100%;\n  height: 100%;\n  display: none;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Screenshot.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Screenshot.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Screenshot.vue?vue&type=template&id=e449adba&scoped=true&\"\nimport script from \"./Screenshot.vue?vue&type=script&lang=js&\"\nexport * from \"./Screenshot.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Screenshot.vue?vue&type=style&index=0&id=e449adba&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"e449adba\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div id=\"controls\">\n    <Screenshot ref=\"screenshot\"></Screenshot>\n    <font-awesome-icon\n      @click=\"leaveSession\"\n      icon=\"broadcast-tower\"\n      v-if=\"session.sessionId\"\n      v-bind:class=\"{ spectator: session.isSpectator }\"\n      title=\"You're currently in a live game!\"\n    />\n    <font-awesome-icon\n      icon=\"camera\"\n      @click=\"takeScreenshot()\"\n      title=\"Take a screenshot\"\n      v-bind:class=\"{ success: grimoire.isScreenshotSuccess }\"\n    />\n    <div class=\"menu\" v-bind:class=\"{ open: grimoire.isMenuOpen }\">\n      <font-awesome-icon icon=\"cog\" @click=\"toggleMenu\" />\n      <ul>\n        <!-- Grimoire -->\n        <li class=\"headline\">\n          <font-awesome-icon icon=\"book-open\" />\n          Grimoire\n        </li>\n        <li @click=\"toggleGrimoire\" v-if=\"players.length\">\n          <em>[G]</em>\n          <template v-if=\"!grimoire.isPublic\">Hide</template>\n          <template v-if=\"grimoire.isPublic\">Show</template>\n        </li>\n        <li @click=\"toggleNightOrder\" v-if=\"players.length\">\n          <em\n            ><font-awesome-icon\n              :icon=\"['fas', grimoire.isNightOrder ? 'check-square' : 'square']\"\n          /></em>\n          Night order\n        </li>\n        <li v-if=\"players.length\">\n          <em>\n            <font-awesome-icon @click=\"updateZoom(-0.1)\" icon=\"search-minus\" />\n            {{ Math.round(grimoire.zoom * 100) }}%\n            <font-awesome-icon @click=\"updateZoom(0.1)\" icon=\"search-plus\" />\n          </em>\n          Zoom\n        </li>\n        <li @click=\"setBackground\">\n          Background image\n        </li>\n        <li @click=\"hostSession\" v-if=\"!session.sessionId\">\n          Host Live Session\n        </li>\n        <li @click=\"joinSession\" v-if=\"!session.sessionId\">\n          Join Live Session\n        </li>\n        <li class=\"headline\" v-if=\"session.sessionId\">\n          <font-awesome-icon icon=\"broadcast-tower\" />\n          {{ session.isSpectator ? \"Playing\" : \"Hosting\" }}\n        </li>\n        <li v-if=\"session.sessionId\" @click=\"copySessionUrl\">\n          <em><font-awesome-icon icon=\"copy\"/></em>\n          Copy player link\n        </li>\n        <li @click=\"leaveSession\" v-if=\"session.sessionId\">\n          <em>{{ session.sessionId }}</em>\n          Leave Session\n        </li>\n\n        <template v-if=\"!session.isSpectator\">\n          <!-- Users -->\n          <li class=\"headline\">\n            <font-awesome-icon icon=\"users\" />\n            Players\n          </li>\n          <li @click=\"addPlayer\" v-if=\"players.length < 20\">\n            <em>[A]</em> Add\n          </li>\n          <li @click=\"randomizeSeatings\" v-if=\"players.length > 2\">\n            <em>[R]</em> Randomize\n          </li>\n          <li @click=\"clearPlayers\" v-if=\"players.length\">\n            Remove all\n          </li>\n\n          <!-- Characters -->\n          <li class=\"headline\">\n            <font-awesome-icon icon=\"theater-masks\" />\n            Characters\n          </li>\n          <li @click=\"toggleModal('edition')\">\n            <em>[E]</em>\n            Select Edition\n          </li>\n          <li @click=\"toggleModal('roles')\" v-if=\"players.length > 4\">\n            <em>[C]</em>\n            Choose & Assign\n          </li>\n          <li @click=\"clearRoles\" v-if=\"players.length\">\n            Remove all\n          </li>\n        </template>\n      </ul>\n    </div>\n  </div>\n</template>\n\n<script>\nimport { mapMutations, mapState } from \"vuex\";\nimport Screenshot from \"./Screenshot\";\n\nexport default {\n  components: {\n    Screenshot\n  },\n  computed: {\n    ...mapState([\"grimoire\", \"session\"]),\n    ...mapState(\"players\", [\"players\"])\n  },\n  methods: {\n    takeScreenshot(dimensions = {}) {\n      this.$store.commit(\"updateScreenshot\");\n      this.$refs.screenshot.capture(dimensions);\n    },\n    setBackground() {\n      this.$store.commit(\n        \"setBackground\",\n        prompt(\"Enter custom background URL\")\n      );\n    },\n    hostSession() {\n      const sessionId = prompt(\n        \"Enter a channel number for your session\",\n        Math.round(Math.random() * 10000)\n      );\n      if (sessionId) {\n        this.$store.commit(\"setSpectator\", false);\n        this.$store.commit(\n          \"setSessionId\",\n          sessionId.replace(/[^0-9]/g, \"\").substr(0, 5)\n        );\n        this.copySessionUrl();\n      }\n    },\n    copySessionUrl() {\n      // check for clipboard permissions\n      navigator.permissions\n        .query({ name: \"clipboard-write\" })\n        .then(({ state }) => {\n          if (state === \"granted\" || state === \"prompt\") {\n            const url = window.location.href.split(\"#\")[0];\n            const link = url + \"#play/\" + this.session.sessionId;\n            navigator.clipboard.writeText(link);\n          }\n        });\n    },\n    joinSession() {\n      const sessionId = prompt(\n        \"Enter the channel number of the session you want to join\"\n      );\n      if (sessionId) {\n        this.$store.commit(\"setSpectator\", true);\n        this.$store.commit(\n          \"setSessionId\",\n          sessionId.replace(/[^0-9]/g, \"\").substr(0, 5)\n        );\n      }\n    },\n    leaveSession() {\n      if (confirm(\"Are you sure you want to leave the active live game?\")) {\n        this.$store.commit(\"setSpectator\", false);\n        this.$store.commit(\"setSessionId\", \"\");\n      }\n    },\n    addPlayer() {\n      if (this.session.isSpectator) return;\n      const name = prompt(\"Player name\");\n      if (name) {\n        this.$store.commit(\"players/add\", name);\n      }\n    },\n    randomizeSeatings() {\n      if (this.session.isSpectator) return;\n      if (confirm(\"Are you sure you want to randomize seatings?\")) {\n        this.$store.dispatch(\"players/randomize\");\n      }\n    },\n    clearPlayers() {\n      if (this.session.isSpectator) return;\n      if (confirm(\"Are you sure you want to remove all players?\")) {\n        this.$store.commit(\"players/clear\");\n        this.$store.commit(\"setBluff\");\n      }\n    },\n    clearRoles() {\n      if (this.session.isSpectator) return;\n      if (confirm(\"Are you sure you want to remove all player roles?\")) {\n        this.$store.dispatch(\"players/clearRoles\");\n        this.$store.commit(\"setBluff\");\n      }\n    },\n    ...mapMutations([\n      \"toggleGrimoire\",\n      \"toggleMenu\",\n      \"toggleNightOrder\",\n      \"updateScreenshot\",\n      \"updateZoom\",\n      \"toggleModal\"\n    ])\n  }\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import \"../vars.scss\";\n\n// success animation\n@keyframes greenToWhite {\n  from {\n    color: green;\n  }\n  to {\n    color: white;\n  }\n}\n\n// Controls\n#controls {\n  position: absolute;\n  right: 3px;\n  top: 3px;\n  text-align: right;\n  padding-right: 50px;\n\n  #app.screenshot & {\n    display: none;\n  }\n\n  svg {\n    filter: drop-shadow(0 0 5px rgba(0, 0, 0, 1));\n    &.success {\n      animation: greenToWhite 1s normal forwards;\n      animation-iteration-count: 1;\n    }\n  }\n\n  > svg {\n    cursor: pointer;\n    z-index: 5;\n    margin-top: 10px;\n    margin-left: 10px;\n  }\n\n  > .fa-broadcast-tower {\n    color: $demon;\n    &.spectator {\n      color: $townsfolk;\n    }\n  }\n}\n\n.menu {\n  width: 210px;\n  transform-origin: 190px 22px;\n  transition: transform 500ms cubic-bezier(0.68, -0.55, 0.27, 1.55);\n  transform: rotate(-90deg);\n  position: absolute;\n  right: 0;\n  top: 0;\n\n  &.open {\n    transform: rotate(0deg);\n  }\n\n  > svg {\n    cursor: pointer;\n    background: rgba(0, 0, 0, 0.5);\n    border: 3px solid black;\n    width: 40px;\n    height: 50px;\n    margin-bottom: -8px;\n    border-bottom: 0;\n    border-radius: 10px 10px 0 0;\n    padding: 5px 5px 15px;\n  }\n\n  ul {\n    display: flex;\n    list-style-type: none;\n    padding: 0;\n    margin: 0;\n    flex-direction: column;\n    overflow: hidden;\n    box-shadow: 0 0 10px black;\n    border: 3px solid black;\n    border-radius: 10px 0 10px 10px;\n\n    li {\n      padding: 2px 10px;\n      color: white;\n      text-align: left;\n      background: rgba(0, 0, 0, 0.7);\n\n      &:last-child {\n        margin-bottom: 0;\n      }\n\n      &:not(.headline):hover {\n        cursor: pointer;\n        color: red;\n      }\n\n      em {\n        float: right;\n        font-style: normal;\n        margin-left: 10px;\n        font-size: 80%;\n        line-height: 31px;\n      }\n    }\n\n    .headline {\n      padding: 5px 10px;\n      text-align: center;\n      font-weight: bold;\n      background: linear-gradient(\n        to right,\n        $townsfolk 0%,\n        rgba(0, 0, 0, 0.5) 20%,\n        rgba(0, 0, 0, 0.5) 80%,\n        $demon 100%\n      );\n    }\n  }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Menu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Menu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Menu.vue?vue&type=template&id=03e4212e&scoped=true&\"\nimport script from \"./Menu.vue?vue&type=script&lang=js&\"\nexport * from \"./Menu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Menu.vue?vue&type=style&index=0&id=03e4212e&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"03e4212e\",\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.nonTravelers >= 5)?_c('Modal',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.modals.roles),expression:\"modals.roles\"}],staticClass:\"roles\",on:{\"close\":function($event){return _vm.toggleModal('roles')}}},[_c('h3',[_vm._v(\"Select the characters for \"+_vm._s(_vm.nonTravelers)+\" players:\")]),_vm._l((_vm.roleSelection),function(teamRoles,team){return _c('ul',{key:team,staticClass:\"tokens\"},[_c('li',{staticClass:\"count\",class:[team]},[_vm._v(\" \"+_vm._s(teamRoles.filter(function (role) { return role.selected; }).length)+\" / \"+_vm._s(_vm.game[_vm.nonTravelers - 5][team])+\" \")]),_vm._l((teamRoles),function(role){return _c('li',{key:role.id,class:[role.team, role.selected ? 'selected' : ''],on:{\"click\":function($event){role.selected = !role.selected}}},[_c('Token',{attrs:{\"role\":role}})],1)})],2)}),(_vm.hasSelectedSetupRoles)?_c('div',{staticClass:\"warning\"},[_vm._v(\" Warning: there are characters selected that modify the game setup! The randomizer does not account for these characters. \")]):_vm._e(),_c('div',{staticClass:\"button-group\"},[_c('div',{staticClass:\"button\",class:{\n        disabled: _vm.selectedRoles > _vm.nonTravelers || !_vm.selectedRoles\n      },on:{\"click\":_vm.assignRoles}},[_c('font-awesome-icon',{attrs:{\"icon\":\"people-arrows\"}}),_vm._v(\" Assign \"+_vm._s(_vm.selectedRoles)+\" characters randomly \")],1),_c('div',{staticClass:\"button\",on:{\"click\":_vm.selectRandomRoles}},[_c('font-awesome-icon',{attrs:{\"icon\":\"random\"}}),_vm._v(\" Shuffle characters \")],1)])],2):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <Modal\n    class=\"roles\"\n    v-show=\"modals.roles\"\n    @close=\"toggleModal('roles')\"\n    v-if=\"nonTravelers >= 5\"\n  >\n    <h3>Select the characters for {{ nonTravelers }} players:</h3>\n    <ul\n      class=\"tokens\"\n      v-for=\"(teamRoles, team) in roleSelection\"\n      v-bind:key=\"team\"\n    >\n      <li class=\"count\" v-bind:class=\"[team]\">\n        {{ teamRoles.filter(role => role.selected).length }} /\n        {{ game[nonTravelers - 5][team] }}\n      </li>\n      <li\n        v-for=\"role in teamRoles\"\n        v-bind:class=\"[role.team, role.selected ? 'selected' : '']\"\n        v-bind:key=\"role.id\"\n        @click=\"role.selected = !role.selected\"\n      >\n        <Token :role=\"role\" />\n      </li>\n    </ul>\n    <div class=\"warning\" v-if=\"hasSelectedSetupRoles\">\n      Warning: there are characters selected that modify the game setup! The\n      randomizer does not account for these characters.\n    </div>\n    <div class=\"button-group\">\n      <div\n        class=\"button\"\n        @click=\"assignRoles\"\n        v-bind:class=\"{\n          disabled: selectedRoles > nonTravelers || !selectedRoles\n        }\"\n      >\n        <font-awesome-icon icon=\"people-arrows\" />\n        Assign {{ selectedRoles }} characters randomly\n      </div>\n      <div class=\"button\" @click=\"selectRandomRoles\">\n        <font-awesome-icon icon=\"random\" />\n        Shuffle characters\n      </div>\n    </div>\n  </Modal>\n</template>\n\n<script>\nimport Modal from \"./Modal\";\nimport gameJSON from \"./../../game\";\nimport Token from \"./../Token\";\nimport { mapGetters, mapMutations, mapState } from \"vuex\";\n\nconst randomElement = arr => arr[Math.floor(Math.random() * arr.length)];\n\nexport default {\n  components: {\n    Token,\n    Modal\n  },\n  data: function() {\n    return {\n      roleSelection: {},\n      game: gameJSON\n    };\n  },\n  computed: {\n    selectedRoles: function() {\n      return Object.values(this.roleSelection)\n        .map(roles => roles.filter(role => role.selected).length)\n        .reduce((a, b) => a + b, 0);\n    },\n    hasSelectedSetupRoles: function() {\n      return Object.values(this.roleSelection).some(roles =>\n        roles.some(role => role.selected && role.setup)\n      );\n    },\n    ...mapState([\"roles\", \"modals\"]),\n    ...mapState(\"players\", [\"players\"]),\n    ...mapGetters({ nonTravelers: \"players/nonTravelers\" })\n  },\n  methods: {\n    selectRandomRoles() {\n      this.roleSelection = {};\n      this.roles.forEach(role => {\n        if (!this.roleSelection[role.team]) {\n          this.$set(this.roleSelection, role.team, []);\n        }\n        this.roleSelection[role.team].push(role);\n        this.$set(role, \"selected\", false);\n      });\n      delete this.roleSelection[\"traveler\"];\n      const playerCount = Math.max(5, this.nonTravelers);\n      const composition = this.game[playerCount - 5];\n      Object.keys(composition).forEach(team => {\n        for (let x = 0; x < composition[team]; x++) {\n          const available = this.roleSelection[team].filter(\n            role => role.selected !== true\n          );\n          if (available.length) {\n            randomElement(available).selected = true;\n          }\n        }\n      });\n    },\n    assignRoles() {\n      if (this.selectedRoles <= this.nonTravelers && this.selectedRoles) {\n        // generate list of selected roles and randomize it\n        const roles = Object.values(this.roleSelection)\n          .map(roles => roles.filter(role => role.selected))\n          .reduce((a, b) => [...a, ...b], [])\n          .map(a => [Math.random(), a])\n          .sort((a, b) => a[0] - b[0])\n          .map(a => a[1]);\n        this.players.forEach(player => {\n          if (player.role.team !== \"traveler\" && roles.length) {\n            const value = roles.pop();\n            this.$store.commit(\"players/update\", {\n              player,\n              property: \"role\",\n              value\n            });\n          }\n        });\n        this.$store.commit(\"toggleModal\", \"roles\");\n      }\n    },\n    ...mapMutations([\"toggleModal\"])\n  },\n  mounted: function() {\n    if (!Object.keys(this.roleSelection).length) {\n      this.selectRandomRoles();\n    }\n  },\n  watch: {\n    roles() {\n      this.selectRandomRoles();\n    }\n  }\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"../../vars.scss\";\n\nul.tokens {\n  padding-left: 55px;\n  li {\n    border-radius: 50%;\n    width: 6vw;\n    margin: 5px;\n    opacity: 0.5;\n    transition: all 250ms;\n    &.selected {\n      opacity: 1;\n    }\n    &.townsfolk {\n      box-shadow: 0 0 10px $townsfolk, 0 0 10px #004cff;\n    }\n    &.outsider {\n      box-shadow: 0 0 10px $outsider, 0 0 10px $outsider;\n    }\n    &.minion {\n      box-shadow: 0 0 10px $minion, 0 0 10px $minion;\n    }\n    &.demon {\n      box-shadow: 0 0 10px $demon, 0 0 10px $demon;\n    }\n    &.traveler {\n      box-shadow: 0 0 10px $traveler, 0 0 10px $traveler;\n    }\n    &:hover {\n      transform: scale(1.2);\n      z-index: 10;\n    }\n  }\n  .count {\n    opacity: 1;\n    position: absolute;\n    left: 0;\n    font-weight: bold;\n    line-height: 50px;\n    text-align: center;\n    font-size: 100%;\n    width: 50px;\n    height: 50px;\n    &.townsfolk {\n      color: $townsfolk;\n    }\n    &.outsider {\n      color: $outsider;\n    }\n    &.minion {\n      color: $minion;\n    }\n    &.demon {\n      color: $demon;\n    }\n  }\n}\n\n.roles .modal .warning {\n  color: red;\n  text-align: center;\n  margin: auto;\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RolesModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RolesModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./RolesModal.vue?vue&type=template&id=56f09202&scoped=true&\"\nimport script from \"./RolesModal.vue?vue&type=script&lang=js&\"\nexport * from \"./RolesModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RolesModal.vue?vue&type=style&index=0&id=56f09202&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"56f09202\",\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Modal',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.modals.edition),expression:\"modals.edition\"}],staticClass:\"editions\",on:{\"close\":function($event){return _vm.toggleModal('edition')}}},[_c('h3',[_vm._v(\"Select an edition:\")]),_c('ul',{staticClass:\"editions\"},_vm._l((_vm.editions),function(edition){return _c('li',{key:edition.id,staticClass:\"edition\",class:['edition-' + edition.id],on:{\"click\":function($event){return _vm.setEdition(edition.id)}}},[_vm._v(\" \"+_vm._s(edition.name)+\" \")])}),0)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <Modal\n    class=\"editions\"\n    v-show=\"modals.edition\"\n    @close=\"toggleModal('edition')\"\n  >\n    <h3>Select an edition:</h3>\n    <ul class=\"editions\">\n      <li\n        v-for=\"edition in editions\"\n        class=\"edition\"\n        v-bind:class=\"['edition-' + edition.id]\"\n        v-bind:key=\"edition.id\"\n        @click=\"setEdition(edition.id)\"\n      >\n        {{ edition.name }}\n      </li>\n    </ul>\n  </Modal>\n</template>\n\n<script>\nimport editionJSON from \"../../editions\";\nimport { mapMutations, mapState } from \"vuex\";\nimport Modal from \"./Modal\";\n\nexport default {\n  components: {\n    Modal\n  },\n  data: function() {\n    return {\n      editions: editionJSON\n    };\n  },\n  computed: mapState([\"modals\"]),\n  methods: mapMutations([\"toggleModal\", \"setEdition\"])\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import \"../../vars\";\n\n// Editions\n@each $img, $skipIcons in $editions {\n  .edition-#{$img} {\n    background-image: url(\"../../assets/editions/#{$img}.png\");\n  }\n  @if $skipIcons != true {\n    .edition-#{$img}.townsfolk {\n      background-image: url(\"../../assets/editions/#{$img}-townsfolk.png\");\n    }\n    .edition-#{$img}.outsider {\n      background-image: url(\"../../assets/editions/#{$img}-outsider.png\");\n    }\n    .edition-#{$img}.minion {\n      background-image: url(\"../../assets/editions/#{$img}-minion.png\");\n    }\n    .edition-#{$img}.demon {\n      background-image: url(\"../../assets/editions/#{$img}-demon.png\");\n    }\n  }\n}\n\nul.editions .edition {\n  text-align: center;\n  padding-top: 100px;\n  background-position: center center;\n  background-size: 100% auto;\n  background-repeat: no-repeat;\n  width: 200px;\n  margin: 5px;\n  font-size: 120%;\n  font-weight: bold;\n  text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000,\n    1px 1px 0 #000, 0 0 5px rgba(0, 0, 0, 0.75);\n  cursor: pointer;\n  &:hover {\n    color: red;\n  }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditionModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditionModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EditionModal.vue?vue&type=template&id=155bdb2d&scoped=true&\"\nimport script from \"./EditionModal.vue?vue&type=script&lang=js&\"\nexport * from \"./EditionModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EditionModal.vue?vue&type=style&index=0&id=155bdb2d&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"155bdb2d\",\n  null\n  \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"intro\"},[_c('img',{attrs:{\"src\":\"static/apple-icon.png\",\"alt\":\"\"}}),_vm._v(\" Welcome to the (unofficial) \"),_c('b',[_vm._v(\" Virtual Blood on the Clocktower Town Square\")]),_vm._v(\"!\"),_c('br'),_vm._v(\" Please add more players through the \"),_c('span',{staticClass:\"button\"},[_c('font-awesome-icon',{attrs:{\"icon\":\"cog\"},on:{\"click\":_vm.toggleMenu}}),_vm._v(\" Menu \")],1),_vm._v(\" on the top right or by pressing \"),_c('b',[_vm._v(\"[A]\")]),_vm._v(\".\"),_c('br'),_vm._v(\" This project is free and open source and can be found on \"),_c('a',{attrs:{\"href\":\"https://github.com/bra1n/townsquare\",\"target\":\"_blank\"}},[_vm._v(\"GitHub\")]),_vm._v(\". \")])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div class=\"intro\" >\n    <img src=\"static/apple-icon.png\" alt=\"\" />\n    Welcome to the (unofficial)\n    <b> Virtual Blood on the Clocktower Town Square</b>!<br />\n    Please add more players through the\n    <span class=\"button\">\n        <font-awesome-icon icon=\"cog\" @click=\"toggleMenu\" /> Menu\n      </span>\n    on the top right or by pressing <b>[A]</b>.<br />\n    This project is free and open source and can be found on\n    <a href=\"https://github.com/bra1n/townsquare\" target=\"_blank\">GitHub</a>.\n  </div>\n</template>\n\n<script>\nimport { mapMutations } from \"vuex\";\n\nexport default {\n  methods: mapMutations([\"toggleMenu\"])\n};\n</script>\n\n<style scoped lang=\"scss\">\n// Intro\n.intro {\n  text-align: center;\n  width: 50%;\n  font-size: 120%;\n  position: absolute;\n  padding: 10px;\n  background: rgba(0, 0, 0, 0.5);\n  border: 3px solid black;\n  border-radius: 10px;\n  z-index: 3;\n  img {\n    position: absolute;\n    bottom: 100%;\n    left: 50%;\n    margin-left: -96px;\n    margin-bottom: 20px;\n    border-radius: 50%;\n    box-shadow: 0 0 10px black;\n    border: 3px solid black;\n  }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Intro.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Intro.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Intro.vue?vue&type=template&id=7f9306d0&scoped=true&\"\nimport script from \"./Intro.vue?vue&type=script&lang=js&\"\nexport * from \"./Intro.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Intro.vue?vue&type=style&index=0&id=7f9306d0&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7f9306d0\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div\n    id=\"app\"\n    @keyup=\"keyup\"\n    tabindex=\"-1\"\n    v-bind:class=\"{ screenshot: grimoire.isScreenshot }\"\n    v-bind:style=\"{\n      backgroundImage: grimoire.background\n        ? `url('${grimoire.background}')`\n        : ''\n    }\"\n  >\n    <Intro v-if=\"!players.length\"></Intro>\n    <TownInfo v-if=\"players.length\"></TownInfo>\n    <TownSquare @screenshot=\"takeScreenshot\"></TownSquare>\n    <Menu ref=\"menu\"></Menu>\n    <EditionModal></EditionModal>\n    <RolesModal></RolesModal>\n  </div>\n</template>\n\n<script>\nimport { mapState } from \"vuex\";\nimport TownSquare from \"./components/TownSquare\";\nimport TownInfo from \"./components/TownInfo\";\nimport Menu from \"./components/Menu\";\nimport RolesModal from \"./components/modals/RolesModal\";\nimport EditionModal from \"./components/modals/EditionModal\";\nimport Intro from \"./components/Intro\";\n\nexport default {\n  components: {\n    Intro,\n    TownInfo,\n    TownSquare,\n    Menu,\n    EditionModal,\n    RolesModal\n  },\n  computed: {\n    ...mapState([\"grimoire\", \"session\"]),\n    ...mapState(\"players\", [\"players\"])\n  },\n  methods: {\n    takeScreenshot(dimensions) {\n      this.$refs.menu.takeScreenshot(dimensions);\n    },\n    keyup({ key }) {\n      switch (key) {\n        case \"g\":\n          this.$store.commit(\"toggleGrimoire\");\n          break;\n        case \"a\":\n          this.$refs.menu.addPlayer();\n          break;\n        case \"r\":\n          this.$refs.menu.randomizeSeatings();\n          break;\n        case \"e\":\n          if (this.session.isSpectator) return;\n          this.$store.commit(\"toggleModal\", \"edition\");\n          break;\n        case \"c\":\n          if (this.session.isSpectator) return;\n          this.$store.commit(\"toggleModal\", \"roles\");\n          break;\n        case \"Escape\":\n          this.$store.commit(\"toggleMenu\");\n      }\n    }\n  }\n};\n</script>\n\n<style lang=\"scss\">\n@import \"vars\";\n\n@font-face {\n  font-family: \"Papyrus\";\n  src: url(\"assets/fonts/papyrus.eot\"); /* IE9*/\n  src: url(\"assets/fonts/papyrus.eot?#iefix\") format(\"embedded-opentype\"),\n    /* IE6-IE8 */ url(\"assets/fonts/papyrus.woff2\") format(\"woff2\"),\n    /* chrome firefox */ url(\"assets/fonts/papyrus.woff\") format(\"woff\"),\n    /* chrome firefox */ url(\"assets/fonts/papyrus.ttf\") format(\"truetype\"),\n    /* chrome firefox opera Safari, Android, iOS 4.2+*/\n      url(\"assets/fonts/papyrus.svg#PapyrusW01\") format(\"svg\"); /* iOS 4.1- */\n}\n\nhtml,\nbody {\n  font-size: 1.2em;\n  line-height: 1.4;\n  background: url(\"assets/background.jpg\") center center;\n  background-size: cover;\n  color: white;\n  height: 100%;\n  font-family: \"Roboto Condensed\", sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  padding: 0;\n  margin: 0;\n  overflow: hidden;\n}\n\n* {\n  box-sizing: border-box;\n  position: relative;\n}\n\na {\n  color: $townsfolk;\n  &:hover {\n    color: $demon;\n  }\n}\n\nh1,\nh2,\nh3,\nh4,\nh5 {\n  margin: 0;\n  text-align: center;\n}\n\nul {\n  list-style-type: none;\n  margin: 0;\n  padding: 0;\n}\n\n#app {\n  height: 100%;\n  background-position: center center;\n  background-size: cover;\n  display: flex;\n  align-items: center;\n  align-content: center;\n  justify-content: center;\n}\n\n// Buttons\n.button-group {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  align-content: center;\n  .button {\n    margin: 5px 0;\n    border-radius: 0;\n    &:first-child {\n      border-top-left-radius: 15px;\n      border-bottom-left-radius: 15px;\n    }\n    &:last-child {\n      border-top-right-radius: 15px;\n      border-bottom-right-radius: 15px;\n    }\n  }\n}\n.button {\n  padding: 0;\n  border: solid 0.125em transparent;\n  border-radius: 15px;\n  box-shadow: inset 0 1px 1px #9c9c9c, 0 0 10px #000;\n  background: radial-gradient(\n        at 0 -15%,\n        rgba(#fff, 0.07) 70%,\n        rgba(#fff, 0) 71%\n      )\n      0 0/ 80% 90% no-repeat content-box,\n    linear-gradient(#4e4e4e, #040404) content-box,\n    linear-gradient(#292929, #010101) border-box;\n  color: white;\n  font-weight: bold;\n  text-shadow: 1px 1px rgba(0, 0, 0, 0.5);\n  line-height: 40px;\n  margin: 5px auto;\n  font-size: 1em;\n  cursor: pointer;\n  transition: all 200ms;\n  &:hover {\n    color: red;\n  }\n  &.disabled {\n    color: gray;\n    cursor: default;\n  }\n  &:before,\n  &:after {\n    content: \" \";\n    display: inline-block;\n    width: 10px;\n    height: 10px;\n  }\n}\n</style>\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=5a6126ef&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","const NEWPLAYER = {\n  role: {},\n  reminders: [],\n  isVoteless: false,\n  isDead: false\n};\n\nconst state = () => ({\n  players: []\n});\n\nconst getters = {\n  nonTravelers({ players }) {\n    const nonTravelers = players.filter(\n      player => player.role.team !== \"traveler\"\n    );\n    return Math.min(nonTravelers.length, 15);\n  },\n  // calculate a Map of player => night order\n  nightOrder({ players }) {\n    const firstNight = [0];\n    const otherNight = [0];\n    players.forEach(({ role }) => {\n      if (role.firstNight && !firstNight.includes(role.firstNight)) {\n        firstNight.push(role.firstNight);\n      }\n      if (role.otherNight && !otherNight.includes(role.otherNight)) {\n        otherNight.push(role.otherNight);\n      }\n    });\n    firstNight.sort((a, b) => a - b);\n    otherNight.sort((a, b) => a - b);\n    const nightOrder = new Map();\n    players.forEach(player => {\n      const first = Math.max(firstNight.indexOf(player.role.firstNight), 0);\n      const other = Math.max(otherNight.indexOf(player.role.otherNight), 0);\n      nightOrder.set(player, { first, other });\n    });\n    return nightOrder;\n  }\n};\n\nconst actions = {\n  randomize({ state, commit }) {\n    const players = state.players\n      .map(a => [Math.random(), a])\n      .sort((a, b) => a[0] - b[0])\n      .map(a => a[1]);\n    commit(\"set\", players);\n  },\n  clearRoles({ state, commit }) {\n    const players = state.players.map(({ name }) => ({\n      name,\n      ...NEWPLAYER\n    }));\n    commit(\"set\", players);\n  }\n};\n\nconst mutations = {\n  clear(state) {\n    state.players = [];\n  },\n  set(state, players = []) {\n    state.players = players;\n  },\n  update(state, { player, property, value }) {\n    const index = state.players.indexOf(player);\n    if (index >= 0) {\n      state.players[index][property] = value;\n    }\n  },\n  add(state, name) {\n    state.players.push({\n      name,\n      ...NEWPLAYER\n    });\n  },\n  remove(state, index) {\n    state.players.splice(index, 1);\n  },\n  swap(state, [from, to]) {\n    [state.players[from], state.players[to]] = [\n      state.players[to],\n      state.players[from]\n    ];\n  }\n};\n\nexport default {\n  namespaced: true,\n  state,\n  getters,\n  actions,\n  mutations\n};\n","import Vue from \"vue\";\nimport Vuex from \"vuex\";\nimport persistence from \"./persistence\";\nimport session from \"./session\";\nimport players from \"./modules/players\";\nimport editionJSON from \"../editions.json\";\nimport rolesJSON from \"../roles.json\";\n\nVue.use(Vuex);\n\nconst getRolesByEdition = (edition = \"tb\") => {\n  const selectedEdition =\n    editionJSON.find(({ id }) => id === edition) || editionJSON[0];\n  return new Map(\n    rolesJSON\n      .filter(\n        r => r.edition === edition || selectedEdition.roles.includes(r.id)\n      )\n      .sort((a, b) => b.team.localeCompare(a.team))\n      .map(role => [role.id, role])\n  );\n};\n\nexport default new Vuex.Store({\n  modules: {\n    players\n  },\n  state: {\n    grimoire: {\n      isNightOrder: true,\n      isPublic: true,\n      isMenuOpen: false,\n      isScreenshot: false,\n      isScreenshotSuccess: false,\n      zoom: 1,\n      background: \"\",\n      bluffs: []\n    },\n    session: {\n      sessionId: \"\",\n      isSpectator: false\n    },\n    modals: {\n      edition: false,\n      roles: false,\n      role: false,\n      reminder: false\n    },\n    edition: \"tb\",\n    roles: getRolesByEdition()\n  },\n  mutations: {\n    toggleMenu({ grimoire }) {\n      grimoire.isMenuOpen = !grimoire.isMenuOpen;\n    },\n    toggleGrimoire({ grimoire }, isPublic) {\n      if (isPublic === true || isPublic === false) {\n        grimoire.isPublic = isPublic;\n      } else {\n        grimoire.isPublic = !grimoire.isPublic;\n      }\n      document.title = `Blood on the Clocktower ${\n        grimoire.isPublic ? \"Town Square\" : \"Grimoire\"\n      }`;\n    },\n    toggleNightOrder({ grimoire }) {\n      grimoire.isNightOrder = !grimoire.isNightOrder;\n    },\n    updateZoom({ grimoire }, by = 0) {\n      grimoire.zoom += by;\n    },\n    setBackground({ grimoire }, background) {\n      grimoire.background = background;\n    },\n    setSessionId({ session }, sessionId) {\n      session.sessionId = sessionId;\n    },\n    setSpectator({ session }, spectator) {\n      session.isSpectator = spectator;\n    },\n    setBluff({ grimoire }, { index, role } = {}) {\n      if (index !== undefined) {\n        grimoire.bluffs.splice(index, 1, role);\n      } else {\n        grimoire.bluffs = [];\n      }\n    },\n    toggleModal({ modals }, name) {\n      modals[name] = !modals[name];\n    },\n    updateScreenshot({ grimoire }, status) {\n      if (status !== true && status !== false) {\n        grimoire.isScreenshotSuccess = false;\n        grimoire.isScreenshot = true;\n      } else {\n        grimoire.isScreenshotSuccess = status;\n        grimoire.isScreenshot = false;\n      }\n    },\n    setEdition(state, edition) {\n      state.edition = edition;\n      state.modals.edition = false;\n      state.roles = getRolesByEdition(edition);\n    }\n  },\n  plugins: [persistence, session]\n});\n","import Vue from \"vue\";\nimport App from \"./App\";\nimport store from \"./store\";\nimport { library } from \"@fortawesome/fontawesome-svg-core\";\nimport {\n  faBookOpen,\n  faCamera,\n  faCog,\n  faHeartbeat,\n  faSearchMinus,\n  faSearchPlus,\n  faTheaterMasks,\n  faTimesCircle,\n  faUser,\n  faUserEdit,\n  faUserFriends,\n  faUsers,\n  faVoteYea,\n  faCheckSquare,\n  faSquare,\n  faRandom,\n  faPeopleArrows,\n  faBroadcastTower,\n  faCopy,\n  faExchangeAlt,\n  faHandPointRight\n} from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/vue-fontawesome\";\n\nlibrary.add(\n  faBookOpen,\n  faCamera,\n  faCog,\n  faHeartbeat,\n  faSearchMinus,\n  faSearchPlus,\n  faTheaterMasks,\n  faTimesCircle,\n  faUser,\n  faUserEdit,\n  faUserFriends,\n  faUsers,\n  faVoteYea,\n  faCheckSquare,\n  faSquare,\n  faRandom,\n  faPeopleArrows,\n  faBroadcastTower,\n  faCopy,\n  faExchangeAlt,\n  faHandPointRight\n);\n\nVue.component(\"font-awesome-icon\", FontAwesomeIcon);\n\nVue.config.productionTip = false;\n\nnew Vue({\n  render: h => h(App),\n  store\n}).$mount(\"#app\");\n","module.exports = __webpack_public_path__ + \"img/cannibal.e2bfb541.png\";","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/goblin.7ebbd9ad.png\";","module.exports = __webpack_public_path__ + \"img/x.fbca4d75.png\";","var map = {\n\t\"./amnesiac.png\": \"043b\",\n\t\"./apprentice.png\": \"4bea\",\n\t\"./artist.png\": \"2cd0\",\n\t\"./assassin.png\": \"9187\",\n\t\"./balloonist.png\": \"65db\",\n\t\"./barber.png\": \"fcc6\",\n\t\"./barista.png\": \"027a\",\n\t\"./baron.png\": \"24d3\",\n\t\"./beggar.png\": \"cfcc\",\n\t\"./bishop.png\": \"8030\",\n\t\"./bonecollector.png\": \"23b1\",\n\t\"./bureaucrat.png\": \"25f6\",\n\t\"./butcher.png\": \"37dd\",\n\t\"./butler.png\": \"64fe\",\n\t\"./cannibal.png\": \"5bd9\",\n\t\"./cerenovus.png\": \"0436\",\n\t\"./chambermaid.png\": \"125e\",\n\t\"./chef.png\": \"1e83\",\n\t\"./clockmaker.png\": \"f93f\",\n\t\"./courtier.png\": \"ee02\",\n\t\"./deviant.png\": \"3b65\",\n\t\"./devilsadvocate.png\": \"cd8b\",\n\t\"./dreamer.png\": \"71b8\",\n\t\"./drunk.png\": \"d97d\",\n\t\"./empath.png\": \"bb7a\",\n\t\"./evil.png\": \"c24f\",\n\t\"./eviltwin.png\": \"e014\",\n\t\"./exorcist.png\": \"5072\",\n\t\"./fanggu.png\": \"6ac0\",\n\t\"./fisherman.png\": \"c5db\",\n\t\"./flowergirl.png\": \"66ae\",\n\t\"./fool.png\": \"4720\",\n\t\"./fortuneteller.png\": \"43e8\",\n\t\"./gambler.png\": \"dce6\",\n\t\"./goblin.png\": \"5c8e\",\n\t\"./godfather.png\": \"99d0\",\n\t\"./good.png\": \"667e\",\n\t\"./goon.png\": \"55aa\",\n\t\"./gossip.png\": \"cadc\",\n\t\"./grandmother.png\": \"c9f5\",\n\t\"./gunslinger.png\": \"ee92\",\n\t\"./harlot.png\": \"559e\",\n\t\"./imp.png\": \"3e70\",\n\t\"./innkeeper.png\": \"663c\",\n\t\"./investigator.png\": \"b570\",\n\t\"./judge.png\": \"f09b\",\n\t\"./juggler.png\": \"65ab\",\n\t\"./klutz.png\": \"adfc\",\n\t\"./leviathan.png\": \"2b04\",\n\t\"./librarian.png\": \"4d73\",\n\t\"./lunatic.png\": \"0b61\",\n\t\"./mastermind.png\": \"f834\",\n\t\"./mathematician.png\": \"8888\",\n\t\"./matron.png\": \"b1cb\",\n\t\"./mayor.png\": \"b223\",\n\t\"./minstrel.png\": \"4efd\",\n\t\"./monk.png\": \"6741\",\n\t\"./moonchild.png\": \"3f65\",\n\t\"./mutant.png\": \"17ad\",\n\t\"./nodashii.png\": \"68a4\",\n\t\"./oracle.png\": \"0c12\",\n\t\"./pacifist.png\": \"fff1\",\n\t\"./philosopher.png\": \"3603\",\n\t\"./pithag.png\": \"7f07\",\n\t\"./plus.png\": \"160b\",\n\t\"./po.png\": \"c73a\",\n\t\"./poisoner.png\": \"f282\",\n\t\"./professor.png\": \"b30c\",\n\t\"./pukka.png\": \"a6a2\",\n\t\"./ravenkeeper.png\": \"0c59\",\n\t\"./recluse.png\": \"177d\",\n\t\"./sage.png\": \"30b6\",\n\t\"./sailor.png\": \"223c\",\n\t\"./saint.png\": \"6936\",\n\t\"./savant.png\": \"d715\",\n\t\"./scapegoat.png\": \"327a\",\n\t\"./scarletwoman.png\": \"f322\",\n\t\"./seamstress.png\": \"ac7c\",\n\t\"./shabaloth.png\": \"0b29\",\n\t\"./slayer.png\": \"d62b\",\n\t\"./snakecharmer.png\": \"4021\",\n\t\"./soldier.png\": \"4e76\",\n\t\"./spy.png\": \"ec1e\",\n\t\"./sweetheart.png\": \"f1e5\",\n\t\"./tealady.png\": \"ba9b\",\n\t\"./thief.png\": \"9ce3\",\n\t\"./tinker.png\": \"9f7e\",\n\t\"./towncrier.png\": \"38a5\",\n\t\"./undertaker.png\": \"0e20\",\n\t\"./vigormortis.png\": \"f4bd\",\n\t\"./virgin.png\": \"eff4\",\n\t\"./vortox.png\": \"3a43\",\n\t\"./voudon.png\": \"a710\",\n\t\"./washerwoman.png\": \"013f\",\n\t\"./widow.png\": \"22c9\",\n\t\"./witch.png\": \"f558\",\n\t\"./x.png\": \"5cf2\",\n\t\"./zombuul.png\": \"20ca\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"61b0\";","module.exports = __webpack_public_path__ + \"img/butler.3763fa3d.png\";","module.exports = __webpack_public_path__ + \"img/juggler.7cc6d089.png\";","module.exports = __webpack_public_path__ + \"img/balloonist.3d6e31f8.png\";","module.exports = __webpack_public_path__ + \"img/innkeeper.8b0b87f1.png\";","module.exports = __webpack_public_path__ + \"img/good.9b3436c8.png\";","module.exports = __webpack_public_path__ + \"img/flowergirl.4ee69cb5.png\";","module.exports = __webpack_public_path__ + \"img/monk.a6f2667a.png\";","module.exports = __webpack_public_path__ + \"img/nodashii.5c943357.png\";","module.exports = __webpack_public_path__ + \"img/saint.f81db252.png\";","module.exports = __webpack_public_path__ + \"img/fanggu.cb4e346c.png\";","module.exports = __webpack_public_path__ + \"img/dreamer.ab7f2328.png\";","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Player.vue?vue&type=style&index=0&lang=scss&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Player.vue?vue&type=style&index=0&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/pithag.adc1ce12.png\";","module.exports = __webpack_public_path__ + \"img/bishop.dec14fdc.png\";","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Modal.vue?vue&type=style&index=0&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Modal.vue?vue&type=style&index=0&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/mathematician.31142ad1.png\";","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Menu.vue?vue&type=style&index=0&id=03e4212e&scoped=true&lang=scss&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Menu.vue?vue&type=style&index=0&id=03e4212e&scoped=true&lang=scss&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownInfo.vue?vue&type=style&index=0&lang=scss&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownInfo.vue?vue&type=style&index=0&lang=scss&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Intro.vue?vue&type=style&index=0&id=7f9306d0&scoped=true&lang=scss&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Intro.vue?vue&type=style&index=0&id=7f9306d0&scoped=true&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/assassin.db54a5ff.png\";","module.exports = __webpack_public_path__ + \"img/godfather.2febcd81.png\";","module.exports = __webpack_public_path__ + \"img/thief.60ce8845.png\";","module.exports = __webpack_public_path__ + \"img/tinker.669b5612.png\";","module.exports = __webpack_public_path__ + \"img/pukka.cbbc2d26.png\";","module.exports = __webpack_public_path__ + \"img/voudon.2b1f0492.png\";","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RoleModal.vue?vue&type=style&index=0&id=b7e1897a&scoped=true&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RoleModal.vue?vue&type=style&index=0&id=b7e1897a&scoped=true&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/seamstress.05f0eb74.png\";","module.exports = __webpack_public_path__ + \"img/klutz.c7e784cd.png\";","module.exports = __webpack_public_path__ + \"img/matron.ffb17746.png\";","module.exports = __webpack_public_path__ + \"img/mayor.98dda8d8.png\";","module.exports = __webpack_public_path__ + \"img/professor.8a5ccf04.png\";","module.exports = __webpack_public_path__ + \"img/investigator.13194f19.png\";","module.exports = __webpack_public_path__ + \"img/tealady.2d47353e.png\";","module.exports = __webpack_public_path__ + \"img/empath.d7a89ed7.png\";","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Token.vue?vue&type=style&index=0&id=77841dfe&scoped=true&lang=scss&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Token.vue?vue&type=style&index=0&id=77841dfe&scoped=true&lang=scss&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RolesModal.vue?vue&type=style&index=0&id=56f09202&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RolesModal.vue?vue&type=style&index=0&id=56f09202&lang=scss&scoped=true&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReminderModal.vue?vue&type=style&index=0&id=1e8ee28e&scoped=true&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReminderModal.vue?vue&type=style&index=0&id=1e8ee28e&scoped=true&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/evil.908a2622.png\";","module.exports = __webpack_public_path__ + \"img/fisherman.9077de7e.png\";","module.exports = __webpack_public_path__ + \"img/po.4c484011.png\";","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Screenshot.vue?vue&type=style&index=0&id=e449adba&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Screenshot.vue?vue&type=style&index=0&id=e449adba&scoped=true&lang=css&\"","module.exports = __webpack_public_path__ + \"img/grandmother.16001541.png\";","module.exports = __webpack_public_path__ + \"img/gossip.dd8d7312.png\";","module.exports = __webpack_public_path__ + \"img/devilsadvocate.e455fea0.png\";","module.exports = __webpack_public_path__ + \"img/beggar.b7a4fbda.png\";","module.exports = __webpack_public_path__ + \"img/slayer.0859544b.png\";","module.exports = __webpack_public_path__ + \"img/savant.16bfbc30.png\";","module.exports = __webpack_public_path__ + \"img/drunk.4883c5a1.png\";","module.exports = __webpack_public_path__ + \"img/gambler.000b4b9b.png\";","module.exports = store => {\n  // initialize data\n  if (localStorage.background !== undefined) {\n    store.commit(\"setBackground\", localStorage.background);\n  }\n  if (localStorage.isPublic !== undefined) {\n    store.commit(\"toggleGrimoire\", JSON.parse(localStorage.isPublic));\n  }\n  if (localStorage.edition !== undefined) {\n    // this will initialize state.roles!\n    store.commit(\"setEdition\", localStorage.edition);\n  }\n  if (localStorage.bluffs !== undefined) {\n    JSON.parse(localStorage.bluffs).forEach((role, index) => {\n      store.commit(\"setBluff\", {\n        index,\n        role: store.state.roles.get(role) || {}\n      });\n    });\n  }\n  if (localStorage.players) {\n    store.commit(\n      \"players/set\",\n      JSON.parse(localStorage.players).map(player => ({\n        ...player,\n        role: store.state.roles.get(player.role) || {}\n      }))\n    );\n  }\n  if (localStorage.getItem(\"session\")) {\n    const [spectator, sessionId] = JSON.parse(localStorage.getItem(\"session\"));\n    store.commit(\"setSpectator\", spectator);\n    store.commit(\"setSessionId\", sessionId);\n  }\n\n  // listen to mutations\n  store.subscribe(({ type, payload }, state) => {\n    switch (type) {\n      case \"toggleGrimoire\":\n        localStorage.setItem(\n          \"isPublic\",\n          JSON.stringify(state.grimoire.isPublic)\n        );\n        break;\n      case \"setBackground\":\n        if (payload) {\n          localStorage.setItem(\"background\", payload);\n        } else {\n          localStorage.removeItem(\"background\");\n        }\n        break;\n      case \"setEdition\":\n        localStorage.setItem(\"edition\", payload);\n        break;\n      case \"setBluff\":\n        localStorage.setItem(\n          \"bluffs\",\n          JSON.stringify(state.grimoire.bluffs.map(({ id }) => id))\n        );\n        break;\n      case \"setSessionId\":\n        if (payload) {\n          localStorage.setItem(\n            \"session\",\n            JSON.stringify([state.session.isSpectator, payload])\n          );\n        } else {\n          localStorage.removeItem(\"session\");\n        }\n        break;\n      case \"players/add\":\n      case \"players/update\":\n      case \"players/remove\":\n      case \"players/clear\":\n      case \"players/set\":\n      case \"players/swap\":\n        if (state.players.players.length) {\n          localStorage.setItem(\n            \"players\",\n            JSON.stringify(\n              state.players.players.map(player => ({\n                ...player,\n                // simplify the stored data\n                role: player.role.id || {}\n              }))\n            )\n          );\n        } else {\n          localStorage.removeItem(\"players\");\n        }\n        break;\n    }\n  });\n};\n","module.exports = __webpack_public_path__ + \"img/eviltwin.06a5a8b8.png\";","module.exports = __webpack_public_path__ + \"img/spy.b739966f.png\";","module.exports = __webpack_public_path__ + \"img/courtier.345180fb.png\";","module.exports = __webpack_public_path__ + \"img/gunslinger.9f84c9f2.png\";","module.exports = __webpack_public_path__ + \"img/virgin.eaf181e8.png\";","module.exports = __webpack_public_path__ + \"img/judge.79ec3877.png\";","module.exports = __webpack_public_path__ + \"img/sweetheart.ec1cef03.png\";","module.exports = __webpack_public_path__ + \"img/poisoner.44c80b94.png\";","module.exports = __webpack_public_path__ + \"img/scarletwoman.d2cdaffd.png\";","module.exports = __webpack_public_path__ + \"img/vigormortis.7716a80d.png\";","module.exports = __webpack_public_path__ + \"img/witch.2f895245.png\";","module.exports = __webpack_public_path__ + \"img/mastermind.c3ba5fbb.png\";","module.exports = __webpack_public_path__ + \"img/clockmaker.41906ffc.png\";","module.exports = __webpack_public_path__ + \"img/barber.a354ad9e.png\";","module.exports = __webpack_public_path__ + \"img/pacifist.ad2d0310.png\";"],"sourceRoot":""}