{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/libs/ggo/sgfparser.js","webpack:///./src/libs/ggo/basicplayer.js","webpack:///./src/App.vue?c90f","webpack:///./src/libs/ggo/player.trymove.js","webpack:///./src/assets/pdf/logo.jpg","webpack:///./src/components/board.vue?83c0","webpack:///./src/App.vue","webpack:///./src/App.vue?dfb6","webpack:///./src/components/footer.vue","webpack:///./src/components/footer.vue?d150","webpack:///./src/components/board.vue","webpack:///./src/components/board.vue?9d16","webpack:///./src/main.js","webpack:///./src/components/footer.vue?dc12","webpack:///./src/components/report_logo.vue?fdc2","webpack:///./src/libs/ggo/player.js","webpack:///./src/libs/ggo/wgo.js","webpack:///./src/libs/ggo/score.js","webpack:///./src/router/index.js","webpack:///./src/components/report_logo.vue?7b76","webpack:///./src/libs/ggo/player.editable.js","webpack:///./src/libs/ggo/player.maker.js","webpack:///./src/components/report_logo.vue","webpack:///./src/libs/ggo/kifu.js"],"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","installedCssChunks","jsonpScriptSrc","p","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","WGo","SGF","to_num","str","charCodeAt","sgf_player_info","black","kifu","node","ident","info","properties","size","move","pass","B","W","x","y","addSetup","turn","comment","join","addMarkup","text","substr","parseInt","this","BL","WL","reg_seq","reg_node","reg_ident","reg_props","parse","sequence","props","vals","stack","Kifu","match","pop","nodeCount","KNode","root","propertyCount","k","exec","substring","replace","parent","pl_count","playerBlock","visible","element","className","wrapper","style","display","BPgenerateDom","dom","center","board","regions","left","right","top","bottom","getCurrentLayout","cl","config","layout","constructor","Array","bh","height","maxHeight","conditions","minWidth","width","minHeight","maxWidth","custom","appendComponents","area","components","currentLayout","BasicPlayer","component","appendTo","_detachFromPlayer","manageComponents","extendClass","Player","elem","default","innerHTML","classes","id","Board","init","addEventListener","noresize","updateDimensions","initGame","css","getComputedStyle","els","firstChild","tmp_w","tmp_h","tmp_mh","lastLayout","bw","clientWidth","offsetHeight","setHeight","setWidth","diff","paddingTop","showMessage","closeCallback","permanent","info_overlay","offsetWidth","info_message","close_info","hideMessage","setFrozen","ERROR_REPORT","url","stacktrace","layouts","dynamicLayout","i18n","en","attributes","sgf","sgfFile","eval","kifuLoaded","Function","update","frozen","unfrozen","toLowerCase","enableWheel","lockScroll","enableKeys","rememberPath","allowIllegalMoves","isNaN","markLastMove","player_from_tag","att","pl","a","_wgo_player","pl_elems","querySelectorAll","tryMove","player","marker","trySgf","state","BLACK_STONE","WHITE_STONE","edit_board_mouse_move","_lastX","_lastY","_last_mark","removeObject","kifuReader","game","isValid","addObject","edit_board_mouse_out","toSgf","curPos","path","position","bs","ws","x1","String","fromCharCode","y1","AB","AW","loadSgf","last","capCount","_bind_evn","play","_ev_move","_ev_out","editMode","_edited","next","children","endTry","goTo","removeEventListener","TryMove","render","class","title","page","__scopeId","cap_list","item","coor","is_scale","fontsize","margintop","desc","show_move","Number","Boolean","markerConfig","markerStyle","markerNum","lastMoveColor","start","mounted","initBoard","methods","self","getElementById","displayVariations","theme","gridLinesColor","stoneHandler","drawHandlers","MONO","op","tempPos","clone","temp","addStone","forEach","set","cap","index","setCoordinates","Marker","fastClick","attach","body","createApp","App","use","router","report_logo","footer","mount","FileError","loadFromUrl","callback","xmlhttp","XMLHttpRequest","onreadystatechange","readyState","status","responseText","open","send","update_board","change","temp_marks","add","notification","variationColor","markup","concat","prepare_board","setSize","removeAllObjects","setWheel","detect_scrolling","bp","_wgo_scrollable","scrollHeight","overflow","wheel_lis","delta","wheelDelta","detail","preventDefault","previous","key_lis","focusedElements","querySelector","keyCode","board_click_default","selectBranch","listeners","focus","json","loadJSON","loadSgfFromFile","ev","getPosition","dispatchEvent","loadKifu","KifuReader","fromSgf","fromJGO","file_path","game_path","_this","listener","indexOf","evt","log","help","first","getGameInfo","infoList","infoFormatters","filterHTML","setKeys","b","onkeydown","_wheel_listener","onmousewheel","coordinates","setSection","addCustomObject","removeCustomObject","removeStone","remove","_last_selected","player_terms","scripts","split","mydir","version","DIR","lang","opera","navigator","userAgent","search","webkit","msie","mozilla","loc","arguments","child","super","abstractMethod","obj","n_obj","themes","tx","section","ty","bx","by","pixelRatio","devicePixelRatio","setDimensions","old","shadowColor","shadowTransparentColor","shadowBlur","shadowSize","markupBlackColor","markupWhiteColor","markupNoneColor","markupLinesWidth","autoLineWidth","stoneRadius","lineWidth","gridLinesWidth","Math","min","starColor","starSize","stoneSize","fieldWidth","fieldHeight","coordinatesColor","font","linesShift","shell_seed","theme_variable","shadow_handler","draw","args","xr","getX","yr","getY","sr","beginPath","blur","radius","max","gradient","createRadialGradient","ls","addColorStop","fillStyle","arc","PI","fill","clear","clearRect","get_markup_color","obj_arr","is_here_stone","redraw_layer","layer","z","handler","getContext","obj_list","draw_shell_line","ctx","start_angle","end_angle","factor","thickness","strokeStyle","angle","diff_x","diff_y","cos","sin","x2","y2","atan","bx1","by1","bx2","by2","moveTo","bezierCurveTo","stroke","draw_shell","arg","from_angle","to_angle","lines","NORMAL","stone","radgrad","shadow","PAINTED","REALISTIC","whiteCount","whiteStoneGraphic","blackCount","blackStoneGraphic","randIndex","ceil","random","redraw","isOkay","img","complete","naturalWidth","idx","stoneGraphic","Image","drawImage","GLOW","SHELL","lw","REDMONO","round","textBaseline","textAlign","fillText","outside","CR","LB","grid","_nodraw","CR_BIG","SQ","rect","TR","lineTo","closePath","MA","lineCap","SL","SM","outline","alpha","globalAlpha","stoneStyle","mini","GLSQ","YKLB","color","PDFLB","draw1","ch","xright","xleft","ytop","ybottom","chArr","textFont","measureText","zh","save","restore","CanvasLayer","context","scale","weight","zIndex","removeFrom","GridLayer","tmp","strokeRect","starPoints","MultipleCanvasLayer","tmpContext","layers","elements","contexts","ShadowLayer","setTransform","default_field_clear","calcLeftMargin","calcTopMargin","calcFieldWidth","calcFieldHeight","clearField","drawField","getMousePos","offsetX","offsetY","updateDim","background","backgroundColor","backgroundImage","addLayer","getSection","section_or_top","removeLayer","changes","unshift","removeObjectsAt","evListener","handleEvent","coo","getState","objects","restoreState","5","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","Position","schema","compare","floor","Game","checkRepeat","allowRewrite","allowSuicide","repeating","allow_rewrite","allow_suicide","white","pos","do_capture","captured","check_liberties","testing","check_capturing","checkHistory","flag","stop","noplay","isOnBoard","new_pos","cap_color","pushPosition","setStone","getStone","popPosition","firstPosition","getCaptureCount","validatePosition","ratio","ScoreMode","originalPosition","UNKNOWN","BLACK_CANDIDATE","WHITE_CANDIDATE","BLACK_NEUTRAL","WHITE_NEUTRAL","NEUTRAL","saved_state","displayScore","RU","toLocaleLowerCase","trim","end","calculateKm","km","ha","colorText","abs","score","newpos","sqrt","routes","createRouter","history","createWebHashHistory","process","beforeEach","to","from","screen","query","playcb","Editable","playType","colorType","preplayMove","setPlayType","setIsDrop","setAllowIllegalMoves","_ev_click","postion","curNode","curColor","addLastNode","lastNode","getLastNode","Control","menu","control","MenuItem","togglable","click","_editable","_disabled","disabled","disable","enable","_CrNum","addCr","defConfig","branchPath","poss","_bindEvent","clearDefaultSytle","showMarker","clearMarker","num","switchMaker","curPath","comparePosition","oldNum","curNum","branchNum","tempMarknum","v","recursive_clone","JSON","stringify","getProperties","find_property","prop","res","recursive_save","gameTree","nt","recursive_save2","tnode","anode","insertAfter","sgf_escape","a_char","sgf_coordinates","sgf_write_group_desc","values","output","sgf_write_group","sgf_write_node","setup","AE","sgf_write_variantion","hasComments","jgo","pureSgf","root_props","SZ","write_node_sgf","selected","deleteLastNode","cleanSgf","PB","rank","BR","team","BT","PW","WR","WT","AP","FF","GM","CA","scoreSgf","KM","HA","noSetupsgf","getForbidden","toJGO","player_formatter","TM","time","RE","no_add","arr","no_remove","getChild","removeSetup","removeMarkup","Exception","pos_diff","old_p","new_p","allow_illegal","exec_node","set_subtract","q","concat_changes","ch_orig","ch_new","InvalidMoveError","exec_next","exec_previous","exec_first","old_pos","previousFork","letter","WHITE"],"mappings":"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","file":"static/report/js/app.25e6f1db.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 CSS chunks\n \tvar installedCssChunks = {\n \t\t\"app\": 0\n \t}\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// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"static/report/js/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-61c06e03\":\"969c0b9f\",\"chunk-5098bf75\":\"fb62a1b8\",\"chunk-9b804618\":\"3b09ec2f\",\"chunk-231fd906\":\"5492262e\",\"chunk-3e13f578\":\"e764d55e\",\"chunk-2c3e099c\":\"496c6c79\",\"chunk-7b325c1e\":\"df8e861a\",\"chunk-7f75b5bc\":\"41b5309c\",\"chunk-2d216214\":\"4700c1d8\",\"chunk-461b141f\":\"238fd8fa\"}[chunkId] + \".js\"\n \t}\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 \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"chunk-231fd906\":1,\"chunk-2c3e099c\":1,\"chunk-7b325c1e\":1,\"chunk-7f75b5bc\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"static/report/css/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-61c06e03\":\"31d6cfe0\",\"chunk-5098bf75\":\"31d6cfe0\",\"chunk-9b804618\":\"31d6cfe0\",\"chunk-231fd906\":\"570bec8f\",\"chunk-3e13f578\":\"31d6cfe0\",\"chunk-2c3e099c\":\"5e9e7306\",\"chunk-7b325c1e\":\"d6e9f354\",\"chunk-7f75b5bc\":\"c521bcf8\",\"chunk-2d216214\":\"31d6cfe0\",\"chunk-461b141f\":\"31d6cfe0\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\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 = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\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([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","\n(function(WGo, undefined){\n\nWGo.SGF = {};\n\nvar to_num = function(str, i) {\n\treturn str.charCodeAt(i)-97;\n}\n\nvar sgf_player_info = function(type, black, kifu, node, value, ident) {\n\tvar c = ident == black ? \"black\" : \"white\";\n\tkifu.info[c] = kifu.info[c] || {};\n\tkifu.info[c][type] = value[0];\n}\n\n// handling properties specifically\nvar properties = WGo.SGF.properties = {}\n\n// Move properties\nproperties[\"B\"] = properties[\"W\"] = function(kifu, node, value, ident) {\n\tif(!value[0] || (kifu.size <= 19 && value[0] == \"tt\")) node.move = {\n\t\tpass: true,\n\t\tc: ident == \"B\" ? WGo.B : WGo.W\n\t};\n\telse node.move = {\n\t\tx: to_num(value[0], 0), \n\t\ty: to_num(value[0], 1), \n\t\tc: ident == \"B\" ? WGo.B : WGo.W\n\t};\n}\n\t\n// Setup properties\nproperties[\"AB\"] = properties[\"AW\"] = function(kifu, node, value, ident) {\n\tfor(var i in value) {\n\t\tnode.addSetup({\n\t\t\tx: to_num(value[i], 0), \n\t\t\ty: to_num(value[i], 1), \n\t\t\tc: ident == \"AB\" ? WGo.B : WGo.W\n\t\t});\n\t}\n}\nproperties[\"AE\"] = function(kifu, node, value) {\n\tfor(var i in value) {\n\t\tnode.addSetup({\n\t\t\tx: to_num(value[i], 0), \n\t\t\ty: to_num(value[i], 1), \n\t\t});\n\t}\n}\nproperties[\"PL\"] = function(kifu, node, value) {\n\tnode.turn = (value[0] == \"b\" || value[0] == \"B\") ? WGo.B : WGo.W;\n}\n\t\n// Node annotation properties\nproperties[\"C\"] = function(kifu, node, value) {\n\tnode.comment = value.join();\n}\n\t\n// Markup properties\nproperties[\"LB\"] = function(kifu, node, value) {\n\tfor(var i in value) {\n\t\tnode.addMarkup({\n\t\t\tx: to_num(value[i],0), \n\t\t\ty: to_num(value[i],1), \n\t\t\ttype: \"LB\", \n\t\t\ttext: value[i].substr(3)\n\t\t});\n\t}\n}\nproperties[\"CR\"] = properties[\"SQ\"] = properties[\"TR\"] = properties[\"SL\"] = properties[\"MA\"] = function(kifu, node, value, ident) {\n\tfor(var i in value) {\n\t\tnode.addMarkup({\n\t\t\tx: to_num(value[i],0), \n\t\t\ty: to_num(value[i],1), \n\t\t\ttype: ident\n\t\t});\n\t}\n}\n\n// Root properties\nproperties[\"SZ\"] = function(kifu, node, value) {\n\tkifu.size = parseInt(value[0]);\n}\n\t\n// Game info properties\nproperties[\"BR\"] = properties[\"WR\"] = sgf_player_info.bind(this, \"rank\", \"BR\");\nproperties[\"PB\"] = properties[\"PW\"] = sgf_player_info.bind(this, \"name\", \"PB\");\nproperties[\"BT\"] = properties[\"WT\"] = sgf_player_info.bind(this, \"team\", \"BT\");\nproperties[\"TM\"] = function(kifu, node, value, ident) {\n\tkifu.info[ident] = value[0];\n\tnode.BL = value[0];\n\tnode.WL = value[0];\n}\n\nvar reg_seq = /\\(|\\)|(;(\\s*[A-Z]+(\\s*((\\[\\])|(\\[(.|\\s)*?([^\\\\]\\]))))+)*)/g;\nvar reg_node = /[A-Z]+(\\s*((\\[\\])|(\\[(.|\\s)*?([^\\\\]\\]))))+/g;\nvar reg_ident = /[A-Z]+/;\nvar reg_props = /(\\[\\])|(\\[(.|\\s)*?([^\\\\]\\]))/g;\n\n// parse SGF string, return WGo.Kifu object\nWGo.SGF.parse = function(str) { \n\n\tvar stack = [],\n\t\tsequence, props, vals, ident,\n\t\tkifu = new WGo.Kifu(),\n\t\tnode = null;\n\t\t\n\t// make sequence of elements and process it\n\tsequence = str.match(reg_seq);\n\t\n\tfor(var i in sequence) {\n\t\t// push stack, if new variant\n\t\tif(sequence[i] == \"(\") stack.push(node);\n\t\t\n\t\t// pop stack at the end of variant\n\t\telse if(sequence[i] == \")\") node = stack.pop();\n\t\t\n\t\t// reading node (string starting with ';')\n\t\telse {\n\t\t\t// create node or use root\n\t\t\tif(node) kifu.nodeCount++;\n\t\t\tnode = node ? node.appendChild(new WGo.KNode()) : kifu.root;\n\t\t\t\n\t\t\t// make array of properties\n\t\t\tprops = sequence[i].match(reg_node) || [];\n\t\t\tkifu.propertyCount += props.length;\n\t\t\t\n\t\t\t// insert all properties to node\n\t\t\tfor(var j in props) {\n\t\t\t\t// get property's identificator\n\t\t\t\tident = reg_ident.exec(props[j])[0];\n\t\t\t\t\n\t\t\t\t// separate property's values\n\t\t\t\tvals = props[j].match(reg_props);\n\t\t\t\t\n\t\t\t\t// remove additional braces [ and ]\n\t\t\t\tfor(var k in vals) vals[k] = vals[k].substring(1, vals[k].length-1).replace(/\\\\(?!\\\\)/g, \"\");\n\t\t\t\t\n\t\t\t\t// call property handler if any\n\t\t\t\tif(WGo.SGF.properties[ident]) WGo.SGF.properties[ident](kifu, node, vals, ident);\n\t\t\t\telse {\n\t\t\t\t\t// if there is only one property, strip array\n\t\t\t\t\tif(vals.length <= 1) vals = vals[0];\n\t\t\t\t\t\n\t\t\t\t\t// default node property saving\n\t\t\t\t\tif(node.parent) node[ident] = vals;\n\t\t\t\t\t\n\t\t\t\t\t// default root property saving\n\t\t\t\t\telse {\n\t\t\t\t\t\tkifu.info[ident] = vals;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn kifu;\t\t\n}\n})(WGo);","\n(function(WGo){\n\n\"use strict\";\n\n// player counter - for creating unique ids\nvar pl_count = 0;\n\n// generate DOM of region\nvar playerBlock = function(name, parent, visible) {\n\tvar e = {};\n\te.element = document.createElement(\"div\");\n\te.element.className = \"wgo-player-\"+name;\n\te.wrapper = document.createElement(\"div\");\n\te.wrapper.className = \"wgo-player-\"+name+\"-wrapper\";\n\te.element.appendChild(e.wrapper);\n\tparent.appendChild(e.element);\n\tif(!visible) e.element.style.display = \"none\";\n\treturn e;\n}\n\n// generate all DOM of player\nvar BPgenerateDom = function() {\n\t// wrapper object for common DOM\n\tthis.dom = {};\n\n\t// center element\n\tthis.dom.center = document.createElement(\"div\");\n\tthis.dom.center.className = \"wgo-player-center\";\n\n\t// board wrapper element\n\tthis.dom.board = document.createElement(\"div\");\n\tthis.dom.board.className = \"wgo-player-board\";\n\n\t// object wrapper for regions (left, right, top, bottom)\n\tthis.regions = {};\n\n\t/*\n\tpseudo DOM structure:\n\t
\n\t\t\n\t\t
\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
\n\t\t\n\t
\n\t*/\n\n\tthis.regions.left = playerBlock(\"left\", this.element);\n\tthis.element.appendChild(this.dom.center);\n\tthis.regions.right = playerBlock(\"right\", this.element);\n\n\tthis.regions.top = playerBlock(\"top\", this.dom.center);\n\tthis.dom.center.appendChild(this.dom.board);\n\tthis.regions.bottom = playerBlock(\"bottom\", this.dom.center);\n}\n\nvar getCurrentLayout = function() {\n\tvar cl = this.config.layout;\n\tif(cl.constructor != Array) return cl;\n\n\tvar bh = this.height || this.maxHeight;\n\tfor(var i = 0; i < cl.length; i++) {\n\n\t\tif(!cl[i].conditions || (\n\t\t\t(!cl[i].conditions.minWidth || cl[i].conditions.minWidth <= this.width) &&\n\t\t\t(!cl[i].conditions.minHeight || !bh || cl[i].conditions.minHeight <= bh) &&\n\t\t\t(!cl[i].conditions.maxWidth || cl[i].conditions.maxWidth >= this.width) &&\n\t\t\t(!cl[i].conditions.maxHeight || !bh || cl[i].conditions.maxHeight >= bh) &&\n\t\t\t(!cl[i].conditions.custom || cl[i].conditions.custom.call(this))\n\t\t )) {\n\t\t\treturn cl[i];\n\t\t}\n\t}\n}\n\nvar appendComponents = function(area) {\n\tvar components;\n\n\tif(this.currentLayout.layout) components = this.currentLayout.layout[area];\n\telse components = this.currentLayout[area];\n\n\tif(components) {\n\t\tthis.regions[area].element.style.display = \"none\";\n\n\t\tif(components.constructor != Array) components = [components];\n\n\t\tfor(var i in components) {\n\t\t\tif(!this.components[components[i]]) this.components[components[i]] = new BasicPlayer.component[components[i]](this);\n\n\t\t\tthis.components[components[i]].appendTo(this.regions[area].wrapper);\n\n\t\t\t// remove detach flag\n\t\t\tthis.components[components[i]]._detachFromPlayer = false;\n\t\t}\n\t}\n\telse {\n\t\tthis.regions[area].element.style.display = \"none\";\n\t}\n\n}\n\nvar manageComponents = function() {\n\t// add detach flags to every widget\n\tfor(var key in this.components) {\n\t\tthis.components[key]._detachFromPlayer = true;\n\t}\n\n\tappendComponents.call(this, \"left\");\n\tappendComponents.call(this, \"right\");\n\tappendComponents.call(this, \"top\");\n\tappendComponents.call(this, \"bottom\");\n\n\t// detach all invisible components\n\tfor(var key in this.components) {\n\t\tif(this.components[key]._detachFromPlayer && this.components[key].element.parentNode) this.components[key].element.parentNode.removeChild(this.components[key].element);\n\t}\n}\n\n/**\n * Main object of player, it binds all magic together and produces visible player.\n * It inherits some functionality from WGo.Player, but full html structure is done here.\n *\n * Layout of player can be set. It can be even dynamic according to screen resolution.\n * There are 5 areas - left, right, top and bottom, and there is special region for board.\n * You can put BasicPlayer.Component objects to these regions. Basic components are:\n * - BasicPlayer.CommentBox - box with comments and game informations\n * - BasicPlayer.InfoBox - box with information about players\n * - BasicPlayer.Control - buttons and staff for control\n *\n * Possible configurations:\n * - sgf: sgf string (default: undefined)\n * - json: kifu stored in json/jgo (default: undefined)\n * - sgfFile: sgf file path (default: undefined)\n * - board: configuration object of board (default: {})\n * - enableWheel: allow player to be controlled by mouse wheel (default: true)\n * - lockScroll: disable window scrolling while hovering player (default: true)\n * - enableKeys: allow player to be controlled by arrow keys (default: true)\n * - kifuLoaded: extra Player's kifuLoaded event listener (default: undefined)\n * - update: extra Player's update event listener (default: undefined)\n * - frozen: extra Player's frozen event listener (default: undefined)\n * - unfrozen: extra Player's unfrozen event listener (default: undefined)\n * - layout: layout object. Look below how to define your own layout (default: BasicPlayer.dynamicLayout)\n *\n * You also must specify main DOMElement of player.\n */\n\nvar BasicPlayer = WGo.extendClass(WGo.Player, function(elem, config) {\n\tthis.config = config;\n\n\t// add default configuration of BasicPlayer\n\tfor(var key in BasicPlayer.default) if(this.config[key] === undefined && BasicPlayer.default[key] !== undefined) this.config[key] = BasicPlayer.default[key];\n\t// add default configuration of Player class\n\tfor(var key in WGo.Player.default) if(this.config[key] === undefined && WGo.Player.default[key] !== undefined) this.config[key] = WGo.Player.default[key];\n\n\tthis.element = elem\n\tthis.element.innerHTML = \"\";\n\tthis.classes = (this.element.className ? this.element.className+\" \" : \"\")+\"wgo-player-main\" ;\n\tthis.element.className = this.classes;\n\tif(!this.element.id) this.element.id = \"wgo_\"+(pl_count++);\n\n\tBPgenerateDom.call(this);\n\n\tthis.board = new WGo.Board(this.dom.board, this.config.board);\n\n\tthis.init();\n\n\tthis.components = {};\n\n\twindow.addEventListener(\"resize\", function() {\n\t\tif(!this.noresize) {\n\t\t\tthis.updateDimensions();\n\t\t}\n\n\t}.bind(this));\n\n\tthis.updateDimensions();\n\n\tthis.initGame();\n});\n\n/**\n * Append player to different element.\n */\n\nBasicPlayer.prototype.appendTo = function(elem) {\n\telem.appendChild(this.element);\n\tthis.updateDimensions();\n}\n\n/**\n * Set right dimensions of all elements.\n */\n\nBasicPlayer.prototype.updateDimensions = function() {\n var css = window.getComputedStyle(this.element);\n\n var els = [];\n while(this.element.firstChild) {\n els.push(this.element.firstChild);\n this.element.removeChild(this.element.firstChild);\n }\n\n var tmp_w = parseInt(css.width);\n var tmp_h = parseInt(css.height);\n var tmp_mh = parseInt(css.maxHeight) || 0;\n\n for(var i = 0; i < els.length; i++) {\n this.element.appendChild(els[i]);\n }\n\n if(tmp_w == this.width && tmp_h == this.height && tmp_mh == this.maxHeight) return;\n\n this.width = tmp_w;\n this.height = tmp_h;\n this.maxHeight = tmp_mh;\n\n this.currentLayout = getCurrentLayout.call(this);\n\n if(this.currentLayout && this.lastLayout != this.currentLayout) {\n if(this.currentLayout.className) this.element.className = this.classes+\" \"+this.currentLayout.className;\n else this.element.className = this.classes;\n manageComponents.call(this);\n this.lastLayout = this.currentLayout;\n }\n\n //var bw = this.width - this.regions.left.element.clientWidth - this.regions.right.element.clientWidth;\n var bw = this.dom.board.clientWidth;\n var bh = this.height || this.maxHeight;\n\n if(bh) {\n bh -= this.regions.top.element.offsetHeight + this.regions.bottom.element.offsetHeight;\n }\n\n if(bh && bh < bw) {\n if(bh != this.board.height) this.board.setHeight(bh);\n }\n else {\n if(bw != this.board.width) this.board.setWidth(bw);\n }\n\n var diff = bh - bw;\n\n if(diff > 0) {\n this.dom.board.style.height = bh+\"px\";\n this.dom.board.style.paddingTop = (diff/2)+\"px\";\n }\n else {\n this.dom.board.style.height = \"auto\";\n this.dom.board.style.paddingTop = \"0\";\n }\n\n this.regions.left.element.style.height = this.dom.center.offsetHeight+\"px\";\n this.regions.right.element.style.height = this.dom.center.offsetHeight+\"px\";\n\n for(var i in this.components) {\n if(this.components[i].updateDimensions) this.components[i].updateDimensions();\n }\n}\n\n/**\n * Layout contains built-in info box, for displaying of text(html) messages.\n * You can use this method to display a message.\n *\n * @param text or html to display\n * @param closeCallback optional callback function which is called when message is closed\n */\n\nBasicPlayer.prototype.showMessage = function(text, closeCallback, permanent) {\n\tthis.info_overlay = document.createElement(\"div\");\n\tthis.info_overlay.style.width = this.element.offsetWidth+\"px\";\n\tthis.info_overlay.style.height = this.element.offsetHeight+\"px\";\n\tthis.info_overlay.className = \"wgo-info-overlay\";\n\tthis.element.appendChild(this.info_overlay);\n\n\tvar info_message = document.createElement(\"div\");\n\tinfo_message.className = \"wgo-info-message\";\n\tinfo_message.innerHTML = text;\n\n\tvar close_info = document.createElement(\"div\");\n\tclose_info.className = \"wgo-info-close\";\n\tif(!permanent) close_info.innerHTML = WGo.t(\"BP:closemsg\");\n\n\tinfo_message.appendChild(close_info);\n\n\tthis.info_overlay.appendChild(info_message);\n\n\tif(closeCallback) {\n\t\tthis.info_overlay.addEventListener(\"click\",function(e) {\n\t\t\tcloseCallback(e);\n\t\t});\n\t}\n\telse if(!permanent) {\n\t\tthis.info_overlay.addEventListener(\"click\",function(e) {\n\t\t\tthis.hideMessage();\n\t\t}.bind(this));\n\t}\n\n\tthis.setFrozen(true);\n}\n\n/**\n * Hide a message box.\n */\n\nBasicPlayer.prototype.hideMessage = function() {\n\tthis.element.removeChild(this.info_overlay);\n\tthis.setFrozen(false);\n}\n\n/**\n * Error handling\n */\n\nBasicPlayer.prototype.error = function(err) {\n\tif(!WGo.ERROR_REPORT) throw err;\n\n\tvar url = \"#\";\n\n\tswitch(err.name) {\n\t\tcase \"InvalidMoveError\":\n\t\t\tthis.showMessage(\"

\"+err.name+\"

\"+err.message+\"

If this message isn't correct, please report it by clicking here, otherwise contact maintainer of this site.

\");\n\t\tbreak;\n\t\tcase \"FileError\":\n\t\t\tthis.showMessage(\"

\"+err.name+\"

\"+err.message+\"

Please contact maintainer of this site. Note: it is possible to read files only from this host.

\");\n\t\tbreak;\n\t\tdefault:\n\t\t\tthis.showMessage(\"

\"+err.name+\"

\"+err.message+\"

\"+err.stacktrace+\"

Please contact maintainer of this site. You can also report it here.

\");\n\t}\n}\n\nBasicPlayer.component = {};\n\n/**\n * Preset layouts\n * They have defined regions as arrays, which can contain components. For each of these layouts each component specifies where it is placed.\n * You can create your own layout in same manners, but you must specify components manually.\n */\n\nBasicPlayer.layouts = {\n\t\"one_column\": {\n\t\ttop: [],\n\t\tbottom: [],\n\t},\n\t\"no_comment\": {\n\t\ttop: [],\n\t\tbottom: [],\n\t},\n\t\"right_top\": {\n\t\ttop: [],\n\t\tright: [],\n\t},\n\t\"right\": {\n\t\tright: [],\n\t},\n\t\"minimal\": {\n\t\tbottom: []\n\t},\n};\n\n/**\n * WGo player can have more layouts. It allows responsive design of the player.\n * Possible layouts are defined as array of object with this structure:\n *\n * layout = {\n * Object layout, // layout as specified above\n * Object conditions, // conditions that has to be valid to apply this layout\n * String className // custom classnames\n * }\n *\n * possible conditions:\n * - minWidth - minimal width of player in px\n * - maxWidth - maximal width of player in px\n * - minHeight - minimal height of player in px\n * - maxHeight - maximal height of player in px\n * - custom - function which is called in template context, must return true or false\n *\n * Player's template evaluates layouts step by step and first layout that matches the conditions is applied.\n *\n * Look below at the default dynamic layout. Layouts are tested after every window resize.\n */\n\nBasicPlayer.dynamicLayout = [\n\t{\n\t\tconditions: {\n\t\t\tminWidth: 650,\n\t\t},\n\t\tlayout: BasicPlayer.layouts[\"right_top\"],\n\t\tclassName: \"wgo-twocols wgo-large\",\n\t},\n\t{\n\t\tconditions: {\n\t\t\tminWidth: 550,\n\t\t\tminHeight: 600,\n\t\t},\n\t\tlayout: BasicPlayer.layouts[\"one_column\"],\n\t\tclassName: \"wgo-medium\"\n\t},\n\t{\n\t\tconditions: {\n\t\t\tminWidth: 350,\n\t\t},\n\t\tlayout: BasicPlayer.layouts[\"no_comment\"],\n\t\tclassName: \"wgo-small\"\n\t},\n\t{\t// if conditions object is omitted, layout is applied\n\t\tlayout: BasicPlayer.layouts[\"no_comment\"],\n\t\tclassName: \"wgo-xsmall\",\n\t},\n];\n\n// default settings, they are merged with user settings in constructor.\nBasicPlayer.default = {\n\tlayout: BasicPlayer.dynamicLayout,\n}\n\nWGo.i18n.en[\"BP:closemsg\"] = \"click anywhere to close this window\";\n\n//--- Handling
with HTML5 data attributes -----------------------------------------------------------------\n\nBasicPlayer.attributes = {\n\t\"data-wgo\": function(value) {\n\t\tif(value) {\n\t\t\tif(value[0] == \"(\") this.sgf = value;\n\t\t\telse this.sgfFile = value;\n\t\t}\n\t},\n\n\t\"data-wgo-board\": function(value) {\n\t\t// using eval to parse strings like \"stoneStyle: 'painted'\"\n\t\tthis.board = eval(\"({\"+value+\"})\");\n\t},\n\n\t\"data-wgo-onkifuload\": function(value) {\n\t\tthis.kifuLoaded = new Function(value);\n\t},\n\n\t\"data-wgo-onupdate\": function(value) {\n\t\tthis.update = new Function(value);\n\t},\n\n\t\"data-wgo-onfrozen\": function(value) {\n\t\tthis.frozen = new Function(value);\n\t},\n\n\t\"data-wgo-onunfrozen\": function(value) {\n\t\tthis.unfrozen = new Function(value);\n\t},\n\n\t\"data-wgo-layout\": function(value) {\n\t\tthis.layout = eval(\"({\"+value+\"})\");\n\t},\n\n\t\"data-wgo-enablewheel\": function(value) {\n\t\tif(value.toLowerCase() == \"false\") this.enableWheel = false;\n\t},\n\n\t\"data-wgo-lockscroll\": function(value) {\n\t\tif(value.toLowerCase() == \"false\") this.lockScroll = false;\n\t},\n\n\t\"data-wgo-enablekeys\": function(value) {\n\t\tif(value.toLowerCase() == \"false\") this.enableKeys = false;\n\t},\n\n\t\"data-wgo-rememberpath\": function(value) {\n\t\tif(value.toLowerCase() == \"false\") this.rememberPath = false;\n\t},\n\n\t\"data-wgo-allowillegal\": function(value) {\n\t\tif(value.toLowerCase() != \"false\") this.allowIllegalMoves = true;\n\t},\n\n\t\"data-wgo-move\": function(value) {\n\t\tvar m = parseInt(value);\n\t\tif(!isNaN(m)) this.move = m;\n\t\telse this.move = eval(\"({\"+value+\"})\");\n\t},\n\n\t\"data-wgo-marklastmove\": function(value) {\n\t\tif(value.toLowerCase() == \"false\") this.markLastMove = false;\n\t},\n\n\t\"data-wgo-diagram\": function(value) {\n\t\tif(value) {\n\t\t\tif(value[0] == \"(\") this.sgf = value;\n\t\t\telse this.sgfFile = value;\n\n\t\t\tthis.markLastMove = false;\n\t\t\tthis.enableKeys = false;\n\t\t\tthis.enableWheel = false;\n\t\t\tthis.layout = {top: [], right: [], left: [], bottom: []};\n\t\t}\n\t}\n}\n\nvar player_from_tag = function(elem) {\n\tvar att, config, pl;\n\n\tconfig = {};\n\n\tfor(var a = 0; a < elem.attributes.length; a++) {\n\t\tatt = elem.attributes[a];\n\t\tif(BasicPlayer.attributes[att.name]) BasicPlayer.attributes[att.name].call(config, att.value, att.name);\n\t}\n\n\tpl = new BasicPlayer(elem, config);\n\telem._wgo_player = pl;\n}\n\nWGo.BasicPlayer = BasicPlayer;\n\nwindow.addEventListener(\"load\", function() {\n\tvar pl_elems = document.querySelectorAll(\"[data-wgo],[data-wgo-diagram]\");\n\n\tfor(var i = 0; i < pl_elems.length; i++) {\n\t\tplayer_from_tag(pl_elems[i]);\n\t}\n});\n\n})(WGo);\n","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-v16/dist/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-v16/dist/index.js??ref--0-1!./App.vue?vue&type=style&index=0&id=6feade24&lang=css\"","/**\n * Created by larry on 2017/1/6.\n */\n(function(WGo) {\n\tvar tryMove = function(player, board, marker, trySgf) {\n\t\t// this.oldMark = {};\n\t\tthis.player = player;\n\t\tthis.board = board;\n\t\tthis.marker = marker;\n\t\t// this.isPlayVoice = true;\n\t\tthis.trySgf = trySgf || '';\n\t\tthis.init();\n\t};\n\tvar state = {\n\t\tBLACK_STONE: 1, // must be equal to WGo.B\n\t\tWHITE_STONE: -1, // must be equal to WGo.W\n\t};\n\t var edit_board_mouse_move = function (x, y) {\n\t if (this.player.frozen || (this._lastX == x && this._lastY == y)) return;\n\n\t this._lastX = x;\n\t this._lastY = y;\n\n\t if (this._last_mark) {\n\t this.board.removeObject(this._last_mark);\n\t }\n\n\t if (x != -1 && y != -1 && this.player.kifuReader.game.isValid(x, y)) {\n\t this._last_mark = {\n\t type: \"GLSQ\",\n\t x: x,\n\t y: y,\n\t c: this.player.kifuReader.game.turn\n\t };\n\t this.board.addObject(this._last_mark);\n\t }\n\t else {\n\t delete this._last_mark;\n\t }\n\t };\n\t // board mouseout callback for edit move\n\t var edit_board_mouse_out = function () {\n\t if (this._last_mark) {\n\t this.board.removeObject(this._last_mark);\n\t delete this._last_mark;\n\t delete this._lastX;\n\t delete this._lastY;\n\t }\n\t };\n\ttryMove.prototype = {\n\t\tinit: function() {\n\t\t\tthis.sgf = this.player.kifuReader.kifu.toSgf();\n\t\t\tthis.curPos = this.player.kifuReader.path.m;\n\t\t\t// this.oldMark.branchPath = this.marker.config.branchPath;\n\t\t\t// this.oldMark.lastMoveColor = this.marker.config.lastMoveColor;\n\t\t\t// this.oldMark.markerNum = this.marker.config.markerNum;\n\t\t\t// this.oldMark.markerStyle = this.marker.config.markerStyle;\n\t\t\t// this.oldMark.start = this.marker.config.start;\n\t\t\tvar turn = this.player.kifuReader.game.turn;\n\t\t\tvar p = this.player.kifuReader.game.position;\n\t\t\tvar bs = [],\n\t\t\t\tws = [];\n\t\t\tfor(var i = 0; i < p.size; i++) {\n\t\t\t\tfor(var j = 0; j < p.size; j++) {\n\t\t\t\t\tvar s = p.get(j, i);\n\t\t\t\t\tvar x1 = String.fromCharCode(j + 97);\n\t\t\t\t\tvar y1 = String.fromCharCode(i + 97);\n\t\t\t\t\tif(s == state.BLACK_STONE) {\n\t\t\t\t\t\tbs.push(\"[\" + x1 + \"\" + y1 + \"]\");\n\t\t\t\t\t} else if(s == state.WHITE_STONE) {\n\t\t\t\t\t\tws.push(\"[\" + x1 + \"\" + y1 + \"]\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// this.marker.switchMaker({\n\t\t\t// \tmarkerStyle: 'LB',\n\t\t\t// \tmarkerNum: 0\n\t\t\t// });\n\t\t\tvar AB = bs.length > 0 ? bs.join(' ') : '[]';\n\t\t\tvar AW = ws.length > 0 ? ws.join(' ') : '[]';\n\t\t\tvar sgf = \"(;SZ[\" + this.player.kifuReader.kifu.size + \"]AB\" + AB + \"AW\" + AW + this.trySgf + \")\";\n\t\t\t// this.isPlayVoice = true;\n\t\t\tthis.player.loadSgf(sgf);\n\t\t\tthis.player.last();\n\t\t\t// this.isPlayVoice = false;\n\t\t\tthis.player.kifuReader.game.turn = turn;\n\t\t\tthis.player.kifuReader.game.position.capCount = p.capCount;\n\t\t\tif(!this._bind_evn) this._bind_evn = this.play.bind(this);\n\t\t\tthis._ev_move = this._ev_move || edit_board_mouse_move.bind(this);\n\t\t\tthis._ev_out = this._ev_out || edit_board_mouse_out.bind(this);\n\t\t\tthis.board.addEventListener(\"click\", this._bind_evn);\n\t\t\tthis.board.addEventListener(\"mousemove\", this._ev_move);\n\t\t\tthis.board.addEventListener(\"mouseout\", this._ev_out);\n\t\t},\n\t\tplay: function(x, y) {\n\t\t\tif(this.player.frozen || !this.player.kifuReader.game.isValid(x, y) || (this.editMode == false)) return;\n\t\t\tthis.player.kifuReader.node.appendChild(new WGo.KNode({\n\t\t\t\tmove: {\n\t\t\t\t\tx: x,\n\t\t\t\t\ty: y,\n\t\t\t\t\tc: this.player.kifuReader.game.turn\n\t\t\t\t},\n\t\t\t\t_edited: true\n\t\t\t}));\n\t\t\tthis.player.kifu.nodeCount++\n\t\t\tthis.player.next(this.player.kifuReader.node.children.length - 1);\n\t\t},\n\t\tendTry: function(curPos) {\n\t\t\t// this.marker.switchMaker(this.oldMark);\n\t\t\t// this.isPlayVoice = true;\n\t\t\tthis.player.loadSgf(this.sgf);\n\t\t\tthis.player.goTo(curPos || this.curPos);\n\t\t\t// this.isPlayVoice = false;\n\t\t\tthis.board.removeEventListener(\"click\", this._bind_evn);\n this.board.removeEventListener(\"mousemove\", this._ev_move);\n this.board.removeEventListener(\"mouseout\", this._ev_out);\n\t\t\tvar sgf = this.player.kifuReader.kifu.toSgf();\n\t\t\treturn sgf;\n\t\t},\n\t};\n\tWGo.TryMove = tryMove;\n})(WGo)\n","module.exports = __webpack_public_path__ + \"static/report/img/logo.64eda035.jpg\";","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-v16/dist/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-v16/dist/index.js??ref--0-1!./board.vue?vue&type=style&index=0&id=4585108b&scoped=true&lang=css\"","\n\n","import { render } from \"./App.vue?vue&type=template&id=6feade24\"\nconst script = {}\n\nimport \"./App.vue?vue&type=style&index=0&id=6feade24&lang=css\"\nscript.render = render\n\nexport default script","\n\n","import { render } from \"./footer.vue?vue&type=template&id=2d78328a&scoped=true\"\nimport script from \"./footer.vue?vue&type=script&lang=js\"\nexport * from \"./footer.vue?vue&type=script&lang=js\"\n\nimport \"./footer.vue?vue&type=style&index=0&id=2d78328a&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-2d78328a\"\n\nexport default script","\n\n","import { render } from \"./board.vue?vue&type=template&id=4585108b&scoped=true\"\nimport script from \"./board.vue?vue&type=script&lang=js\"\nexport * from \"./board.vue?vue&type=script&lang=js\"\n\nimport \"./board.vue?vue&type=style&index=0&id=4585108b&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-4585108b\"\n\nexport default script","import { createApp } from 'vue'\nimport App from './App.vue'\nimport router from './router'\nimport fastClick from 'fastclick'\nimport \"babel-polyfill\";\nimport report_logo from '@/components/report_logo'\nimport footer from '@/components/footer'\nimport board from '@/components/board'\nfastClick.attach(document.body)\n\ncreateApp(App).use(router).\ncomponent(\"reportLogo\",report_logo).\ncomponent(\"footerCom\",footer).\ncomponent(\"board\",board).\nmount('#app')\n","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-v16/dist/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-v16/dist/index.js??ref--0-1!./footer.vue?vue&type=style&index=0&id=2d78328a&scoped=true&lang=css\"","import { render } from \"./report_logo.vue?vue&type=template&id=691a3702&scoped=true\"\nimport script from \"./report_logo.vue?vue&type=script&lang=js\"\nexport * from \"./report_logo.vue?vue&type=script&lang=js\"\nscript.render = render\nscript.__scopeId = \"data-v-691a3702\"\n\nexport default script","\n(function(WGo){\n\n\"use strict\";\n\nvar FileError = function(path, code) {\n\tthis.name = \"FileError\";\n\n if(code == 1) this.message = \"File '\"+path+\"' is empty.\";\n\telse if(code == 2) this.message = \"Network error. It is not possible to read '\"+path+\"'.\";\n\telse this.message = \"File '\"+path+\"' hasn't been found on server.\";\n}\n\nFileError.prototype = new Error();\nFileError.prototype.constructor = FileError;\n\nWGo.FileError = FileError;\n\n// ajax function for loading of files\nvar loadFromUrl = WGo.loadFromUrl = function(url, callback) {\n\n\tvar xmlhttp = new XMLHttpRequest();\n\txmlhttp.onreadystatechange = function() {\n\t\tif (xmlhttp.readyState == 4) {\n\t\t\tif(xmlhttp.status == 200) {\n\t\t\t\tif(xmlhttp.responseText.length == 0) {\n\t\t\t\t\tthrow new FileError(url, 1);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcallback(xmlhttp.responseText);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow new FileError(url);\n\t\t\t}\n\t\t}\n\t}\n\n\ttry {\n\t\txmlhttp.open(\"GET\", url, true);\n\t\txmlhttp.send();\n\t}\n\tcatch(err) {\n\t\tthrow new FileError(url, 2);\n\t}\n\n}\n\n// basic updating function - handles board changes\nvar update_board = function(e) {\n\t// update board's position\n\tif(e.change) this.board.update(e.change);\n\n\t// remove old markers from the board\n\tif(this.temp_marks) this.board.removeObject(this.temp_marks);\n\n\t// init array for new objects\n\tvar add = [];\n\n\tthis.notification();\n\n\t// add current move marker\n\tif(e.node.move && this.config.markLastMove) {\n\t\tif(e.node.move.pass) this.notification(WGo.t((e.node.move.c == WGo.B ? \"b\" : \"w\")+\"pass\"));\n\t\telse add.push({\n\t\t\ttype: \"CR\",\n\t\t\tx: e.node.move.x,\n\t\t\ty: e.node.move.y\n\t\t});\n\t}\n\t// add variation letters\n\tif(e.node.children.length > 1 && this.config.displayVariations) {\n\t\tfor(var i = 0; i < e.node.children.length; i++) {\n\t\t\tif(e.node.children[i].move && !e.node.children[i].move.pass)\tadd.push({\n\t\t\t\ttype: \"LB\",\n\t\t\t\ttext: String.fromCharCode(65+i),\n\t\t\t\tx: e.node.children[i].move.x,\n\t\t\t\ty: e.node.children[i].move.y,\n\t\t\t\tc: this.board.theme.variationColor || \"rgba(0,32,128,0.8)\"\n\t\t\t});\n\t\t}\n\t}\n\n\t// add other markup\n\tif(e.node.markup) {\n\t\tfor(var i in e.node.markup) {\n\t\t\tfor(var j = 0; j < add.length; j++) {\n\t\t\t\tif(e.node.markup[i].x == add[j].x && e.node.markup[i].y == add[j].y) {\n\t\t\t\t\tadd.splice(j,1);\n\t\t\t\t\tj--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tadd = add.concat(e.node.markup);\n\t}\n\n\t// add new markers on the board\n\tthis.temp_marks = add;\n\tthis.board.addObject(add);\n}\n\n// preparing board\nvar prepare_board = function(e) {\n\t// set board size\n\tthis.board.setSize(e.kifu.size);\n\n\t// remove old objects\n\tthis.board.removeAllObjects();\n\n\t// activate wheel\n\tif(this.config.enableWheel) this.setWheel(true);\n}\n\n// detecting scrolling of element - e.g. when we are scrolling text in comment box, we want to be aware.\nvar detect_scrolling = function(node, bp) {\n\tif(node == bp.element || node == bp.element) return false;\n\telse if(node._wgo_scrollable || (node.scrollHeight > node.offsetHeight && window.getComputedStyle(node).overflow == \"auto\")) return true;\n\telse return detect_scrolling(node.parentNode, bp);\n}\n\n// mouse wheel event callback, for replaying a game\nvar wheel_lis = function(e) {\n\tvar delta = e.wheelDelta || e.detail*(-1);\n\n\t// if there is scrolling in progress within an element, don't change position\n\tif(detect_scrolling(e.target, this)) return true;\n\n\tif(delta < 0) {\n\t\tthis.next();\n\t\tif(this.config.lockScroll && e.preventDefault) e.preventDefault();\n\t\treturn !this.config.lockScroll;\n\t}\n\telse if(delta > 0) {\n\t\tthis.previous();\n\t\tif(this.config.lockScroll && e.preventDefault) e.preventDefault();\n\t\treturn !this.config.lockScroll;\n\t}\n\treturn true;\n};\n\n// keyboard click callback, for replaying a game\nvar key_lis = function(e) {\n\t// disable game replay, when there is focus on some form text field\n\tvar focusedElements = document.querySelector(\"input:focus, textarea:focus\");\n\tif(focusedElements) return true;\n\n\tswitch(e.keyCode){\n\t\tcase 39: this.next(); break;\n\t\tcase 37: this.previous(); break;\n\t\t//case 40: this.selectAlternativeVariation(); break;\n\t\tdefault: return true;\n\t}\n\tif(this.config.lockScroll && e.preventDefault) e.preventDefault()\n\treturn !this.config.lockScroll;\n};\n\n// function handling board clicks in normal mode\nvar board_click_default = function(x,y) {\n\tif(!this.kifuReader || !this.kifuReader.node|| !this.config.selectBranch) return false;\n\tfor(var i in this.kifuReader.node.children) {\n\t\tif(this.kifuReader.node.children[i].move && this.kifuReader.node.children[i].move.x == x && this.kifuReader.node.children[i].move.y == y) {\n\t\t\tthis.next(i);\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n// coordinates drawing handler - adds coordinates on the board\n/*var coordinates = {\n\tgrid: {\n\t\tdraw: function(args, board) {\n\t\t\tvar ch, t, xright, xleft, ytop, ybottom;\n\n\t\t\tthis.fillStyle = \"rgba(0,0,0,0.7)\";\n\t\t\tthis.textBaseline=\"middle\";\n\t\t\tthis.textAlign=\"center\";\n\t\t\tthis.font = board.stoneRadius+\"px \"+(board.font || \"\");\n\n\t\t\txright = board.getX(-0.75);\n\t\t\txleft = board.getX(board.size-0.25);\n\t\t\tytop = board.getY(-0.75);\n\t\t\tybottom = board.getY(board.size-0.25);\n\n\t\t\tfor(var i = 0; i < board.size; i++) {\n\t\t\t\tch = i+\"A\".charCodeAt(0);\n\t\t\t\tif(ch >= \"I\".charCodeAt(0)) ch++;\n\n\t\t\t\tt = board.getY(i);\n\t\t\t\tthis.fillText(board.size-i, xright, t);\n\t\t\t\tthis.fillText(board.size-i, xleft, t);\n\n\t\t\t\tt = board.getX(i);\n\t\t\t\tthis.fillText(String.fromCharCode(ch), t, ytop);\n\t\t\t\tthis.fillText(String.fromCharCode(ch), t, ybottom);\n\t\t\t}\n\n\t\t\tthis.fillStyle = \"black\";\n\t\t}\n\t}\n}*/\n\n/**\n * We can say this class is abstract, stand alone it doesn't do anything.\n * However it is useful skelet for building actual player's GUI. Extend this class to create custom player template.\n * It controls board and inputs from mouse and keyboard, but everything can be overriden.\n *\n * Possible configurations:\n * - sgf: sgf string (default: undefined)\n * - json: kifu stored in json/jgo (default: undefined)\n * - sgfFile: sgf file path (default: undefined)\n * - board: configuration object of board (default: {})\n * - enableWheel: allow player to be controlled by mouse wheel (default: true)\n * - lockScroll: disable window scrolling while hovering player (default: true),\n * - enableKeys: allow player to be controlled by arrow keys (default: true),\n * - markLastMove: marks the last move with a circle (default: true),\n *\n * @param {object} config object if form: {key1: value1, key2: value2, ...}\n */\n\nvar Player = function(config) {\n\tthis.config = config;\n\n\t// add default configuration\n\tfor(var key in Player.default) if(this.config[key] === undefined && Player.default[key] !== undefined) this.config[key] = Player.default[key];\n\n\tthis.element = document.createElement(\"div\");\n\tthis.board = new WGo.Board(this.element, this.config.board);\n\n\tthis.init();\n\tthis.initGame();\n}\n\nPlayer.prototype = {\n\tconstructor: Player,\n\n\t/**\n\t * Init player. If you want to call this method PlayerView object must have these properties:\n\t * - player - WGo.Player object\n\t * - board - WGo.Board object (or other board renderer)\n\t * - element - main DOMElement of player\n\t */\n\n\tinit: function() {\n\t\t// declare kifu\n\t\tthis.kifu = null;\n\n\t\t// creating listeners\n\t\tthis.listeners = {\n\t\t\tkifuLoaded: [prepare_board.bind(this)],\n\t\t\tupdate: [update_board.bind(this)],\n\t\t\tfrozen: [],\n\t\t\tunfrozen: [],\n\t\t};\n\t\tif(this.config.kifuLoaded) this.addEventListener(\"kifuLoaded\", this.config.kifuLoaded);\n\t\tif(this.config.update) this.addEventListener(\"update\", this.config.update);\n\t\tif(this.config.frozen) this.addEventListener(\"frozen\", this.config.frozen);\n\t\tif(this.config.unfrozen) this.addEventListener(\"unfrozen\", this.config.unfrozen);\n\n\t\tthis.board.addEventListener(\"click\", board_click_default.bind(this));\n\t\tthis.element.addEventListener(\"click\", this.focus.bind(this));\n\n\t\tthis.focus();\n\t},\n\n\tinitGame: function() {\n\t\t// try to load game passed in configuration\n\t\tif(this.config.sgf) {\n\t\t\tthis.loadSgf(this.config.sgf, this.config.move);\n\t\t}\n\t\telse if(this.config.json) {\n\t\t\tthis.loadJSON(this.config.json, this.config.move);\n\t\t}\n\t\telse if(this.config.sgfFile) {\n\t\t\tthis.loadSgfFromFile(this.config.sgfFile, this.config.move);\n\t\t}\n\n\t},\n\n\t/**\n\t * Create update event and dispatch it. It is called after position's changed.\n\t *\n\t * @param {string} op an operation that produced update (e.g. next, previous...)\n\t */\n\n\tupdate: function(op) {\n\t\tif(!this.kifuReader || !this.kifuReader.change) return;\n\n\t\tvar ev = {\n\t\t\ttype: \"update\",\n\t\t\top: op,\n\t\t\ttarget: this,\n\t\t\tnode: this.kifuReader.node,\n\t\t\tposition: this.kifuReader.getPosition(),\n\t\t\tpath: this.kifuReader.path,\n\t\t\tchange: this.kifuReader.change,\n\t\t}\n\t\t//if(!this.kifuReader.node.parent) ev.msg = this.getGameInfo();\n\n\t\tthis.dispatchEvent(ev);\n\t},\n\n\t/**\n\t * Prepare kifu for replaying. Event 'kifuLoaded' is triggered.\n\t *\n\t * @param {WGo.Kifu} kifu object\n\t * @param {Array} path array\n\t */\n\n\tloadKifu: function(kifu, path) {\n\t\tthis.kifu = kifu;\n\n\t\t// kifu is replayed by KifuReader, it manipulates a Kifu object and gets all changes\n\t\tthis.kifuReader = new WGo.KifuReader(this.kifu, this.config.rememberPath, this.config.allowIllegalMoves);\n\n\t\t// fire kifu loaded event\n\t\tthis.dispatchEvent({\n\t\t\ttype: \"kifuLoaded\",\n\t\t\ttarget: this,\n\t\t\tkifu: this.kifu,\n\t\t});\n\n\t\t// handle permalink\n\t\t/*if(this.config.permalinks) {\n\t\t\tif(!permalinks.active) init_permalinks();\n\t\t\tif(permalinks.query.length && permalinks.query[0] == this.view.element.id) {\n\t\t\t\thandle_hash(this);\n\t\t\t}\n\t\t}*/\n\n\t\t// update player - initial position in kifu doesn't have to be an empty board\n\t\tthis.update(\"init\");\n\n\t\tif(path) {\n\t\t\tthis.goTo(path);\n\t\t}\n\n\t\t/*if(this.kifu.nodeCount === 0) this.error(\"\");\n\t\telse if(this.kifu.propertyCount === 0)*/\n\n\t},\n\n\t/**\n\t * Load go kifu from sgf string.\n\t *\n\t * @param {string} sgf\n\t */\n\n\tloadSgf: function(sgf, path) {\n\t\ttry {\n\t\t\tthis.loadKifu(WGo.Kifu.fromSgf(sgf), path);\n\t\t}\n\t\tcatch(err) {\n\t\t\tthis.error(err);\n\t\t}\n\t},\n\n\t/**\n\t * Load go kifu from JSON object.\n\t */\n\n\tloadJSON: function(json, path) {\n\t\ttry {\n\t\t\tthis.loadKifu(WGo.Kifu.fromJGO(json), path);\n\t\t}\n\t\tcatch(err) {\n\t\t\tthis.error(err);\n\t\t}\n\t},\n\n\t/**\n\t * Load kifu from sgf file specified with path. AJAX is used to load sgf content.\n\t */\n\n\tloadSgfFromFile: function(file_path, game_path) {\n\t\tvar _this = this;\n\t\ttry {\n\t\t\tloadFromUrl(file_path, function(sgf) {\n\t\t\t\t_this.loadSgf(sgf, game_path);\n\t\t\t});\n\t\t}\n\t\tcatch(err) {\n\t\t\tthis.error(err);\n\t\t}\n\t},\n\n\t/**\n\t * Implementation of EventTarget interface, though it's a little bit simplified.\n\t * You need to save listener if you would like to remove it later.\n\t *\n\t * @param {string} type of listeners\n\t * @param {Function} listener callback function\n\t */\n\n\taddEventListener: function(type, listener) {\n\t\tthis.listeners[type] = this.listeners[type] || [];\n\t\tthis.listeners[type].push(listener);\n\t},\n\n\t/**\n\t * Remove event listener previously added with addEventListener.\n\t *\n\t * @param {string} type of listeners\n\t * @param {Function} listener function\n\t */\n\n\tremoveEventListener: function(type, listener) {\n\t\tif(!this.listeners[type]) return;\n\t\tvar i = this.listeners[type].indexOf(listener);\n\t\tif(i != -1) this.listeners[type].splice(i,1);\n\t},\n\n\t/**\n\t * Dispatch an event. In default there are two events: \"kifuLoaded\" and \"update\"\n\t *\n\t * @param {string} evt event\n\t */\n\n\tdispatchEvent: function(evt) {\n\t\tif(!this.listeners[evt.type]) return;\n\t\tfor(var i=0;iWGo.js Player 2.0\"\n\t\t\t\t+ \"

WGo.js Player is extension of WGo.js, HTML5 library for purposes of game of go. It allows to replay go game records and it has many features like score counting. It is also designed to be easily extendable.

\"\n\t\t\t\t+ \"

WGo.js is open source licensed under MIT license. You can use and modify any code from this project.

\"\n\t\t\t\t+ \"

You can find more information at wgo.waltheri.net/player

\"\n\t\t\t\t+ \"

Copyright © 2013 Jan Prokop

\",\n\t\"black\": \"Black\",\n\t\"white\": \"White\",\n\t\"DT\": \"Date\",\n\t\"KM\": \"Komi\",\n\t\"HA\": \"Handicap\",\n\t\"AN\": \"Annotations\",\n\t\"CP\": \"Copyright\",\n\t\"GC\": \"Game comments\",\n\t\"GN\": \"Game name\",\n\t\"ON\": \"Fuseki\",\n\t\"OT\": \"Overtime\",\n\t\"TM\": \"Basic time\",\n\t\"RE\": \"Result\",\n\t\"RO\": \"Round\",\n\t\"RU\": \"Rules\",\n\t\"US\": \"Recorder\",\n\t\"PC\": \"Place\",\n\t\"EV\": \"Event\",\n\t\"SO\": \"Source\",\n\t\"none\": \"none\",\n\t\"bpass\": \"Black passed.\",\n\t\"wpass\": \"White passed.\",\n};\n\nfor(var key in player_terms) WGo.i18n.en[key] = player_terms[key];\n\n})(WGo);\n","/*!\n * Copyright (c) 2013 Jan Prokop\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this\n * software and associated documentation files (the \"Software\"), to deal in the Software\n * without restriction, including without limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons\n * to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n/* WGo.js 2.3.1 */\n\n(function (window, undefined) {\n 'use strict'\n\n var scripts = document.getElementsByTagName('script')\n var path = scripts[scripts.length - 1].src.split('?')[0] // remove any ?query\n var mydir = path.split('/').slice(0, -1).join('/') + '/'\n\n /**\n * Main namespace - it initializes WGo in first run and then execute main function.\n * You must call WGo.init() if you want to use library, without calling WGo.\n */\n\n var WGo = {\n // basic information\n version: '2.3.1.2',\n\n // constants for colors (rather use WGo.B or WGo.W)\n B: 1,\n W: -1,\n\n // if true errors will be shown in dialog window, otherwise they will be ignored\n ERROR_REPORT: true,\n DIR: mydir,\n\n // Language of player, you can change this global variable any time. Object WGo.i18n. must exist.\n lang: 'en',\n\n // Add terms for each language here\n i18n: {\n en: {}\n }\n }\n\n // browser detection - can be handy\n WGo.opera = navigator.userAgent.search(/(opera)(?:.*version)?[ \\/]([\\w.]+)/i) != -1\n WGo.webkit = navigator.userAgent.search(/(webkit)[ \\/]([\\w.]+)/i) != -1\n WGo.msie = navigator.userAgent.search(/(msie) ([\\w.]+)/i) != -1\n WGo.mozilla = navigator.userAgent.search(/(mozilla)(?:.*? rv:([\\w.]+))?/i) != -1 && !WGo.webkit && !WGo.msie\n\n // translating function\n WGo.t = function (str) {\n var loc = WGo.i18n[WGo.lang][str] || WGo.i18n.en[str]\n if (loc) {\n for (var i = 1; i < arguments.length; i++) {\n loc = loc.replace('$', arguments[i])\n }\n return loc\n }\n return str\n }\n\n // helping function for class inheritance\n WGo.extendClass = function (parent, child) {\n child.prototype = Object.create(parent.prototype)\n child.prototype.constructor = child\n child.prototype.super = parent\n\n return child\n }\n\n // helping function for class inheritance\n WGo.abstractMethod = function () {\n throw Error('unimplemented abstract method')\n }\n\n // helping function for deep cloning of simple objects,\n WGo.clone = function (obj) {\n if (obj && typeof obj == 'object') {\n var n_obj = obj.constructor == Array ? [] : {}\n\n for (var key in obj) {\n if (obj[key] == obj) n_obj[key] = obj\n else n_obj[key] = WGo.clone(obj[key])\n }\n\n return n_obj\n } else return obj\n }\n\n // filter html to avoid XSS\n WGo.filterHTML = function (text) {\n if (!text || typeof text != 'string') return text\n return text.replace(//g, '>')\n }\n\n // ---------------------- WGo.Board -----------------------------------------------------------------------------\n\n /**\n * Board class constructor - it creates a canvas board\n *\n * @param elem DOM element to put in\n * @param config configuration object. It is object with \"key: value\" structure. Possible configurations are:\n *\n * - size: number - size of the board (default: 19)\n * - width: number - width of the board (default: 0)\n * - height: number - height of the board (default: 0)\n * - font: string - font of board writings (!deprecated)\n * - lineWidth: number - line width of board drawings (!deprecated)\n * - autoLineWidth: boolean - if set true, line width will be automatically computed accordingly to board size - this option rewrites 'lineWidth' /and it will keep markups sharp/ (!deprecated)\n * - starPoints: Object - star points coordinates, defined for various board sizes. Look at Board.default for more info.\n * - stoneHandler: Board.DrawHandler - stone drawing handler (default: Board.drawHandlers.SHELL)\n * - starSize: number - size of star points (default: 1). Radius of stars is dynamic, however you can modify it by given constant. (!deprecated)\n * - stoneSize: number - size of stone (default: 1). Radius of stone is dynamic, however you can modify it by given constant. (!deprecated)\n * - shadowSize: number - size of stone shadow (default: 1). Radius of shadow is dynamic, however you can modify it by given constant. (!deprecated)\n * - background: string - background of the board, it can be either color (#RRGGBB) or url. Empty string means no background. (default: WGo.DIR+\"wood1.jpg\")\n * - section: {\n * top: number,\n * right: number,\n * bottom: number,\n * left: number\n * }\n * It defines a section of board to be displayed. You can set a number of rows(or cols) to be skipped on each side.\n * Numbers can be negative, in that case there will be more empty space. In default all values are zeros.\n * - theme: Object - theme object, which defines all graphical attributes of the board. Default theme object is \"WGo.Board.themes.default\". For old look you may use \"WGo.Board.themes.old\".\n *\n * Note: properties lineWidth, autoLineWidth, starPoints, starSize, stoneSize and shadowSize will be considered only if you set property 'theme' to 'WGo.Board.themes.old'.\n */\n\n var Board = function (elem, config) {\n var config = config || {}\n\n // set user configuration\n for (var key in config) this[key] = config[key]\n\n // add default configuration\n for (var key in WGo.Board.default) { if (this[key] === undefined) this[key] = WGo.Board.default[key] }\n // add default theme variables\n for (var key in Board.themes.default) { if (this.theme[key] === undefined) this.theme[key] = Board.themes.default[key] }\n\n // set section if set\n this.tx = this.section.left\n this.ty = this.section.top\n this.bx = this.size - 1 - this.section.right\n this.by = this.size - 1 - this.section.bottom\n\n // init board\n this.init()\n\n // append to element\n elem.appendChild(this.element)\n\n // set initial dimensions\n\n // set the pixel ratio for HDPI (e.g. Retina) screens\n this.pixelRatio = window.devicePixelRatio || 1\n\n if (this.width && this.height) this.setDimensions(this.width, this.height)\n else if (this.width) this.setWidth(this.width)\n else if (this.height) this.setHeight(this.height)\n }\n\n // New experimental board theme system - it can be changed in future, if it will appear to be unsuitable.\n Board.themes = {}\n\n Board.themes.old = {\n shadowColor: 'rgba(32,32,32,0.5)',\n shadowTransparentColor: 'rgba(32,32,32,0)',\n shadowBlur: 0,\n shadowSize: function (board) {\n return board.shadowSize\n },\n markupBlackColor: 'rgba(255,255,255,0.8)',\n markupWhiteColor: 'rgba(0,0,0,0.8)',\n markupNoneColor: 'rgba(0,0,0,0.8)',\n markupLinesWidth: function (board) {\n return board.autoLineWidth ? board.stoneRadius / 7 : board.lineWidth\n },\n gridLinesWidth: 1,\n gridLinesColor: function (board) {\n return 'rgba(0,0,0,' + Math.min(1, board.stoneRadius / 15) + ')'\n },\n starColor: '#000',\n starSize: function (board) {\n return board.starSize * ((board.width / 300) + 1)\n },\n stoneSize: function (board) {\n return board.stoneSize * Math.min(board.fieldWidth, board.fieldHeight) / 2\n },\n coordinatesColor: 'rgba(0,0,0,0.7)',\n font: function (board) {\n return board.font\n },\n linesShift: 0.5\n }\n\n /**\n * Object containing default graphical properties of a board.\n * A value of all properties can be even static value or function, returning final value.\n * Theme object doesn't set board and stone textures - they are set separately.\n */\n\n Board.themes.default = {\n shadowColor: 'rgba(62,32,32,0.5)',\n shadowTransparentColor: 'rgba(62,32,32,0)',\n shadowBlur: function (board) {\n return board.stoneRadius * 0.1\n },\n shadowSize: 1,\n markupBlackColor: 'rgba(255,255,255,0.9)',\n markupWhiteColor: 'rgba(0,0,0,0.7)',\n markupNoneColor: 'rgba(0,0,0,0.7)',\n markupLinesWidth: function (board) {\n return board.stoneRadius / 8\n },\n gridLinesWidth: function (board) {\n return board.stoneRadius / 15\n },\n gridLinesColor: '#654525',\n starColor: '#531',\n starSize: function (board) {\n return (board.stoneRadius / 8) + 1\n },\n stoneSize: function (board) {\n return Math.min(board.fieldWidth, board.fieldHeight) / 2\n },\n coordinatesColor: '#531',\n variationColor: 'rgba(0,32,128,0.8)',\n font: 'calibri',\n linesShift: 0.25\n }\n\n var theme_variable = function (key, board) {\n return typeof board.theme[key] == 'function' ? board.theme[key](board) : board.theme[key]\n }\n\n var shadow_handler = {\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius\n\n this.beginPath()\n\n var blur = theme_variable('shadowBlur', board)\n var radius = Math.max(0, sr - 0.5)\n var gradient = this.createRadialGradient(xr - board.ls, yr - board.ls, radius - 1 - blur, xr - board.ls, yr - board.ls, radius + blur)\n\n gradient.addColorStop(0, theme_variable('shadowColor', board))\n gradient.addColorStop(1, theme_variable('shadowTransparentColor', board))\n\n this.fillStyle = gradient\n\n this.arc(xr - board.ls, yr - board.ls, radius + blur, 0, 2 * Math.PI, true)\n this.fill()\n },\n clear: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius\n this.clearRect(xr - 1.1 * sr - board.ls, yr - 1.1 * sr - board.ls, 2.2 * sr, 2.2 * sr)\n }\n }\n\n // Shadow handler for the 'REALISITC' rendering mode\n var shadow_handler_realistic = {\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius,\n lsX = 1.0,\n lsY = -2.0,\n blur = 3.0\n\n this.beginPath()\n\n var radius = Math.max(0, (sr - 0.5) * 0.85)\n var gradient = this.createRadialGradient(xr - lsX, yr - lsY, radius - 1 - blur, xr - lsX, yr - lsY, radius + blur)\n\n gradient.addColorStop(0, theme_variable('shadowColor', board))\n gradient.addColorStop(1, theme_variable('shadowTransparentColor', board))\n\n this.fillStyle = gradient\n\n this.arc(xr - lsX, yr - lsY, radius + blur, 0, 2 * Math.PI, true)\n this.fill()\n },\n clear: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius,\n lsX = 1.0,\n lsY = -5.0,\n blur = 5.0\n\n this.clearRect(xr - 1.1 * sr - lsX, yr - 1.1 * sr - lsY, 2.2 * sr, 2.2 * sr)\n }\n }\n\n var get_markup_color = function (board, x, y) {\n if (board.obj_arr[x][y][0].c == WGo.B) return theme_variable('markupBlackColor', board)\n else if (board.obj_arr[x][y][0].c == WGo.W) return theme_variable('markupWhiteColor', board)\n return theme_variable('markupNoneColor', board)\n }\n\n var is_here_stone = function (board, x, y) {\n return (board.obj_arr[x][y][0] && board.obj_arr[x][y][0].c == WGo.W || board.obj_arr[x][y][0].c == WGo.B)\n }\n\n var redraw_layer = function (board, layer) {\n var handler\n\n board[layer].clear()\n board[layer].draw(board)\n\n for (var x = 0; x < board.size; x++) {\n for (var y = 0; y < board.size; y++) {\n for (var z = 0; z < board.obj_arr[x][y].length; z++) {\n var obj = board.obj_arr[x][y][z]\n if (!obj.type) handler = board.stoneHandler\n else if (typeof obj.type == 'string') handler = Board.drawHandlers[obj.type]\n else handler = obj.type\n\n if (handler[layer]) handler[layer].draw.call(board[layer].getContext(obj), obj, board)\n }\n }\n }\n\n for (var i = 0; i < board.obj_list.length; i++) {\n var obj = board.obj_list[i]\n var handler = obj.handler\n\n if (handler[layer]) handler[layer].draw.call(board[layer].getContext(obj.args), obj.args, board)\n }\n }\n\n // shell stone helping functions\n\n var shell_seed\n\n var draw_shell_line = function (ctx, x, y, radius, start_angle, end_angle, factor, thickness) {\n ctx.strokeStyle = 'rgba(64,64,64,0.2)'\n\n ctx.lineWidth = (radius / 30) * thickness\n ctx.beginPath()\n\n radius -= Math.max(1, ctx.lineWidth)\n\n var x1 = x + radius * Math.cos(start_angle * Math.PI)\n var y1 = y + radius * Math.sin(start_angle * Math.PI)\n var x2 = x + radius * Math.cos(end_angle * Math.PI)\n var y2 = y + radius * Math.sin(end_angle * Math.PI)\n\n var m, angle, x, diff_x, diff_y\n if (x2 > x1) {\n m = (y2 - y1) / (x2 - x1)\n angle = Math.atan(m)\n } else if (x2 == x1) {\n angle = Math.PI / 2\n } else {\n m = (y2 - y1) / (x2 - x1)\n angle = Math.atan(m) - Math.PI\n }\n\n var c = factor * radius\n diff_x = Math.sin(angle) * c\n diff_y = Math.cos(angle) * c\n\n var bx1 = x1 + diff_x\n var by1 = y1 - diff_y\n\n var bx2 = x2 + diff_x\n var by2 = y2 - diff_y\n\n ctx.moveTo(x1, y1)\n ctx.bezierCurveTo(bx1, by1, bx2, by2, x2, y2)\n ctx.stroke()\n }\n\n var draw_shell = function (arg) {\n var from_angle = arg.angle\n var to_angle = arg.angle\n\n for (var i = 0; i < arg.lines.length; i++) {\n from_angle += arg.lines[i]\n to_angle -= arg.lines[i]\n draw_shell_line(arg.ctx, arg.x, arg.y, arg.radius, from_angle, to_angle, arg.factor, arg.thickness)\n }\n }\n\n // drawing handlers\n\n Board.drawHandlers = {\n // 'SQ' 框 'TR' 三角 'LB' lable 'LBIG' 大文本 'NORMAL' 'PAINTED' 'GLOW' 'SHELL' 'MONO' 棋子\n // handler for normal stones\n NORMAL: {\n // draw handler for stone layer\n stone: {\n // drawing function - args object contain info about drawing object, board is main board object\n // this function is called from canvas2D context\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius,\n radgrad\n\n // set stone texture\n if (args.c == WGo.W) {\n radgrad = this.createRadialGradient(xr - 2 * sr / 5, yr - 2 * sr / 5, sr / 3, xr - sr / 5, yr - sr / 5, 5 * sr / 5)\n radgrad.addColorStop(0, '#fff')\n radgrad.addColorStop(1, '#aaa')\n } else {\n radgrad = this.createRadialGradient(xr - 2 * sr / 5, yr - 2 * sr / 5, 1, xr - sr / 5, yr - sr / 5, 4 * sr / 5)\n radgrad.addColorStop(0, '#666')\n radgrad.addColorStop(1, '#000')\n }\n\n // paint stone\n this.beginPath()\n this.fillStyle = radgrad\n this.arc(xr - board.ls, yr - board.ls, Math.max(0, sr - 0.5), 0, 2 * Math.PI, true)\n this.fill()\n }\n },\n // adding shadow handler\n shadow: shadow_handler\n },\n PAINTED: {\n stone: {\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius,\n radgrad\n\n if (args.c == WGo.W) {\n radgrad = this.createRadialGradient(xr - 2 * sr / 5, yr - 2 * sr / 5, 2, xr - sr / 5, yr - sr / 5, 4 * sr / 5)\n radgrad.addColorStop(0, '#fff')\n radgrad.addColorStop(1, '#ddd')\n } else {\n radgrad = this.createRadialGradient(xr - 2 * sr / 5, yr - 2 * sr / 5, 1, xr - sr / 5, yr - sr / 5, 4 * sr / 5)\n radgrad.addColorStop(0, '#111')\n radgrad.addColorStop(1, '#000')\n }\n\n this.beginPath()\n this.fillStyle = radgrad\n this.arc(xr - board.ls, yr - board.ls, Math.max(0, sr - 0.5), 0, 2 * Math.PI, true)\n this.fill()\n\n this.beginPath()\n this.lineWidth = sr / 6\n\n if (args.c == WGo.W) {\n this.strokeStyle = '#999'\n this.arc(xr + sr / 8, yr + sr / 8, sr / 2, 0, Math.PI / 2, false)\n } else {\n this.strokeStyle = '#ccc'\n this.arc(xr - sr / 8, yr - sr / 8, sr / 2, Math.PI, 1.5 * Math.PI)\n }\n\n this.stroke()\n }\n },\n shadow: shadow_handler\n },\n // handler for image based stones\n REALISTIC: {\n stone: {\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius\n\n var whiteCount = board.whiteStoneGraphic.length\n var blackCount = board.blackStoneGraphic.length\n\n if (typeof this.randIndex === 'undefined') {\n this.randIndex = Math.ceil(Math.random() * 1e5)\n }\n\n var redraw = function () {\n board.redraw()\n }\n\n // Check if image has been loaded properly\n // see https://stereochro.me/ideas/detecting-broken-images-js\n var isOkay = function (img) {\n if (typeof img === 'string') { return false }\n if (!img.complete) { return false }\n if (typeof img.naturalWidth != 'undefined' && img.naturalWidth == 0) {\n return false\n }\n return true\n }\n\n if (args.c == WGo.W) {\n var idx = this.randIndex % whiteCount\n if (typeof board.whiteStoneGraphic[idx] === 'string') {\n // The image has not been loaded yet\n var stoneGraphic = new Image()\n // Redraw the whole board after the image has been loaded.\n // This prevents 'missing stones' and similar graphical errors\n // especially on slower internet connections.\n stoneGraphic.onload = redraw\n stoneGraphic.src = board.whiteStoneGraphic[idx]\n board.whiteStoneGraphic[idx] = stoneGraphic\n }\n\n if (isOkay(board.whiteStoneGraphic[idx])) {\n this.drawImage(board.whiteStoneGraphic[idx], xr - sr, yr - sr, 2 * sr, 2 * sr)\n } else {\n // Fall back to SHELL handler if there was a problem loading the image\n // Board.drawHandlers.SHELL.stone.draw.call(this, args, board);\n }\n } else { // args.c == WGo.B\n var idx = this.randIndex % blackCount\n if (typeof board.blackStoneGraphic[idx] === 'string') {\n var stoneGraphic = new Image()\n stoneGraphic.onload = redraw\n stoneGraphic.src = board.blackStoneGraphic[idx]\n board.blackStoneGraphic[idx] = stoneGraphic\n }\n\n if (isOkay(board.blackStoneGraphic[idx])) {\n this.drawImage(board.blackStoneGraphic[idx], xr - sr, yr - sr, 2 * sr, 2 * sr)\n } else {\n // Board.drawHandlers.SHELL.stone.draw.call(this, args, board);\n }\n }\n }\n }\n // shadow: shadow_handler_realistic,\n },\n // 当前可使用的子\n GLOW: {\n stone: {\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius\n\n var radgrad\n if (args.c == WGo.W) {\n radgrad = this.createRadialGradient(xr - 2 * sr / 5, yr - 2 * sr / 5, sr / 3, xr - sr / 5, yr - sr / 5, 8 * sr / 5)\n radgrad.addColorStop(0, '#fff')\n radgrad.addColorStop(1, '#666')\n } else {\n radgrad = this.createRadialGradient(xr - 2 * sr / 5, yr - 2 * sr / 5, 1, xr - sr / 5, yr - sr / 5, 3 * sr / 5)\n radgrad.addColorStop(0, '#555')\n radgrad.addColorStop(1, '#000')\n }\n\n this.beginPath()\n this.fillStyle = radgrad\n this.arc(xr - board.ls, yr - board.ls, Math.max(0, sr - 0.5), 0, 2 * Math.PI, true)\n this.fill()\n }\n },\n shadow: shadow_handler\n },\n SHELL: {\n stone: {\n draw: function (args, board) {\n var xr,\n yr,\n sr = board.stoneRadius\n\n shell_seed = shell_seed || Math.ceil(Math.random() * 9999999)\n\n xr = board.getX(args.x)\n yr = board.getY(args.y)\n\n var radgrad\n\n if (args.c == WGo.W) {\n radgrad = '#aaa'\n } else {\n radgrad = '#000'\n }\n\n this.beginPath()\n this.fillStyle = radgrad\n this.arc(xr - board.ls, yr - board.ls, Math.max(0, sr - 0.5), 0, 2 * Math.PI, true)\n this.fill()\n\n // do shell magic here\n if (args.c == WGo.W) {\n // do shell magic here\n var type = shell_seed % (3 + args.x * board.size + args.y) % 3\n var z = board.size * board.size + args.x * board.size + args.y\n var angle = (2 / z) * (shell_seed % z)\n\n if (type == 0) {\n draw_shell({\n ctx: this,\n x: xr,\n y: yr,\n radius: sr,\n angle: angle,\n lines: [0.10, 0.12, 0.11, 0.10, 0.09, 0.09, 0.09, 0.09],\n factor: 0.25,\n thickness: 1.75\n })\n } else if (type == 1) {\n draw_shell({\n ctx: this,\n x: xr,\n y: yr,\n radius: sr,\n angle: angle,\n lines: [0.10, 0.09, 0.08, 0.07, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06],\n factor: 0.2,\n thickness: 1.5\n })\n } else {\n draw_shell({\n ctx: this,\n x: xr,\n y: yr,\n radius: sr,\n angle: angle,\n lines: [0.12, 0.14, 0.13, 0.12, 0.12, 0.12],\n factor: 0.3,\n thickness: 2\n })\n }\n radgrad = this.createRadialGradient(xr - 2 * sr / 5, yr - 2 * sr / 5, sr / 3, xr - sr / 5, yr - sr / 5, 5 * sr / 5)\n radgrad.addColorStop(0, 'rgba(255,255,255,0.9)')\n radgrad.addColorStop(1, 'rgba(255,255,255,0)')\n\n // add radial gradient //\n this.beginPath()\n this.fillStyle = radgrad\n this.arc(xr - board.ls, yr - board.ls, Math.max(0, sr - 0.5), 0, 2 * Math.PI, true)\n this.fill()\n } else {\n radgrad = this.createRadialGradient(xr + 0.4 * sr, yr + 0.4 * sr, 0, xr + 0.5 * sr, yr + 0.5 * sr, sr)\n radgrad.addColorStop(0, 'rgba(32,32,32,1)')\n radgrad.addColorStop(1, 'rgba(0,0,0,0)')\n\n this.beginPath()\n this.fillStyle = radgrad\n this.arc(xr - board.ls, yr - board.ls, Math.max(0, sr - 0.5), 0, 2 * Math.PI, true)\n this.fill()\n\n radgrad = this.createRadialGradient(xr - 0.4 * sr, yr - 0.4 * sr, 1, xr - 0.5 * sr, yr - 0.5 * sr, 1.5 * sr)\n radgrad.addColorStop(0, 'rgba(64,64,64,1)')\n radgrad.addColorStop(1, 'rgba(0,0,0,0)')\n\n this.beginPath()\n this.fillStyle = radgrad\n this.arc(xr - board.ls, yr - board.ls, Math.max(0, sr - 0.5), 0, 2 * Math.PI, true)\n this.fill()\n }\n }\n },\n shadow: shadow_handler\n },\n // 实心 无渐变子\n MONO: {\n stone: {\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius,\n lw = theme_variable('markupLinesWidth', board) || 1\n\n if (args.c == WGo.W) this.fillStyle = 'white'\n else this.fillStyle = 'black'\n\n this.beginPath()\n this.arc(xr, yr, Math.max(0, sr - lw), 0, 2 * Math.PI, true)\n this.fill()\n\n this.lineWidth = lw\n this.strokeStyle = 'black'\n this.stroke()\n }\n }\n },\n REDMONO: {\n stone: {\n draw: function (args, board) {\n var xr = board.getX(args.x)\n var yr = board.getY(args.y)\n var sr = board.stoneRadius\n var lw = theme_variable('markupLinesWidth', board) || 1\n var font = args.font || theme_variable('font', board) || ''\n\n this.fillStyle = args.c || get_markup_color(board, args.x, args.y)\n\n if (args.text.length == 1) this.font = Math.round(sr * 1.5) + 'px ' + font\n else if (args.text.length == 2) this.font = Math.round(sr * 1.2) + 'px ' + font\n else if (args.text.length > 2) this.font = Math.round(sr * 3 / 4) + 'px ' + font\n else this.font = Math.round(sr) + 'px ' + font\n this.beginPath()\n this.arc(xr, yr, Math.max(0, sr - lw), 0, 2 * Math.PI, true)\n this.fill()\n this.fillStyle = '#eeeeee'\n this.textBaseline = 'middle'\n this.textAlign = 'center'\n this.fillText(args.text, xr, yr, 2 * sr)\n if (args.outside) {\n this.lineWidth = 2\n this.strokeStyle = 'red'\n this.stroke()\n }\n }\n },\n shadow: shadow_handler\n },\n CR: {\n stone: {\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius\n\n // this.strokeStyle = args.c || get_markup_color(board, args.x, args.y)\n this.strokeStyle = \"red\"\n this.lineWidth = args.lineWidth || theme_variable('markupLinesWidth', board) || 1\n this.beginPath()\n this.arc(xr - board.ls, yr - board.ls, sr / 2, 0, 2 * Math.PI, true)\n this.stroke()\n }\n }\n },\n // Label drawing handler\n LB: {\n stone: {\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius,\n font = args.font || theme_variable('font', board) || ''\n\n this.fillStyle = args.c || get_markup_color(board, args.x, args.y)\n\n if (args.text.length == 1) this.font = Math.round(sr * 1.5) + 'px ' + font\n else if (args.text.length == 2) this.font = Math.round(sr * 1.2) + 'px ' + font\n else this.font = Math.round(sr) + 'px ' + font\n\n this.beginPath()\n this.textBaseline = 'middle'\n this.textAlign = 'center'\n this.fillText(args.text, xr, yr, 2 * sr)\n }\n },\n\n // modifies grid layer too\n grid: {\n draw: function (args, board) {\n if (!is_here_stone(board, args.x, args.y) && !args._nodraw) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius\n this.clearRect(xr - sr, yr - sr, 2 * sr, 2 * sr)\n }\n },\n clear: function (args, board) {\n if (!is_here_stone(board, args.x, args.y)) {\n args._nodraw = true\n redraw_layer(board, 'grid')\n delete args._nodraw\n }\n }\n }\n },\n CR_BIG: {\n stone: {\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius\n\n this.strokeStyle = args.c || get_markup_color(board, args.x, args.y)\n this.lineWidth = args.lineWidth || theme_variable('markupLinesWidth', board) || 1\n this.beginPath()\n this.arc(xr - board.ls, yr - board.ls, sr, 0, 2 * Math.PI, true)\n this.stroke()\n }\n }\n },\n // 镂空方框\n SQ: {\n stone: {\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = Math.round(board.stoneRadius)\n\n this.strokeStyle = args.c || get_markup_color(board, args.x, args.y)\n this.lineWidth = args.lineWidth || theme_variable('markupLinesWidth', board) || 1\n this.beginPath()\n this.rect(Math.round(xr - sr / 2) - board.ls, Math.round(yr - sr / 2) - board.ls, sr, sr)\n this.stroke()\n }\n }\n },\n // 红三角\n TR: {\n stone: {\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius\n\n this.strokeStyle = args.c || get_markup_color(board, args.x, args.y)\n this.lineWidth = args.lineWidth || theme_variable('markupLinesWidth', board) || 1\n this.beginPath()\n this.moveTo(xr - board.ls, yr - board.ls - Math.round(sr / 2))\n this.lineTo(Math.round(xr - sr / 2) - board.ls, Math.round(yr + sr / 3) + board.ls)\n this.lineTo(Math.round(xr + sr / 2) + board.ls, Math.round(yr + sr / 3) + board.ls)\n this.closePath()\n this.stroke()\n }\n }\n },\n // 叉\n MA: {\n stone: {\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius\n\n this.strokeStyle = args.c || get_markup_color(board, args.x, args.y)\n this.lineCap = 'round'\n this.lineWidth = (args.lineWidth || theme_variable('markupLinesWidth', board) || 1) * 2 - 1\n this.beginPath()\n this.moveTo(Math.round(xr - sr / 2), Math.round(yr - sr / 2))\n this.lineTo(Math.round(xr + sr / 2), Math.round(yr + sr / 2))\n this.moveTo(Math.round(xr + sr / 2) - 1, Math.round(yr - sr / 2))\n this.lineTo(Math.round(xr - sr / 2) - 1, Math.round(yr + sr / 2))\n this.stroke()\n this.lineCap = 'butt'\n }\n }\n },\n // 小方块\n SL: {\n stone: {\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius\n\n this.fillStyle = args.c || get_markup_color(board, args.x, args.y)\n this.beginPath()\n this.rect(xr - sr / 2, yr - sr / 2, sr, sr)\n this.fill()\n }\n }\n },\n // 笑脸\n SM: {\n stone: {\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius\n\n this.strokeStyle = args.c || get_markup_color(board, args.x, args.y)\n this.lineWidth = (args.lineWidth || theme_variable('markupLinesWidth', board) || 1) * 2\n this.beginPath()\n this.arc(xr - sr / 3, yr - sr / 3, sr / 6, 0, 2 * Math.PI, true)\n this.stroke()\n this.beginPath()\n this.arc(xr + sr / 3, yr - sr / 3, sr / 6, 0, 2 * Math.PI, true)\n this.stroke()\n this.beginPath()\n this.moveTo(xr - sr / 1.5, yr)\n this.bezierCurveTo(xr - sr / 1.5, yr + sr / 2, xr + sr / 1.5, yr + sr / 2, xr + sr / 1.5, yr)\n this.stroke()\n }\n }\n },\n // 也是正常棋子\n outline: {\n stone: {\n draw: function (args, board) {\n if (args.alpha) this.globalAlpha = args.alpha\n else this.globalAlpha = 0.5\n if (args.stoneStyle) Board.drawHandlers[args.stoneStyle].stone.draw.call(this, args, board)\n else board.stoneHandler.stone.draw.call(this, args, board)\n this.globalAlpha = 1\n }\n }\n },\n // 小棋子\n mini: {\n stone: {\n draw: function (args, board) {\n board.stoneRadius = board.stoneRadius / 2\n if (args.stoneStyle) Board.drawHandlers[args.stoneStyle].stone.draw.call(this, args, board)\n else board.stoneHandler.stone.draw.call(this, args, board)\n board.stoneRadius = board.stoneRadius * 2\n }\n }\n },\n GLSQ: {\n stone: {\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius\n var radgrad = this.createRadialGradient(xr - sr / 10, yr, 0, xr - sr / 10, yr, sr)\n if (args.c == 1) {\n radgrad.addColorStop(0, 'rgba(10,10,10,0.4)')\n radgrad.addColorStop(1, 'rgba(10,10,10,0.4)')\n } else if (args.c == -1) {\n radgrad.addColorStop(0, 'rgba(255,255,255,0.4)')\n radgrad.addColorStop(1, 'rgba(255,255,255,0.4)')\n }\n this.beginPath()\n this.fillStyle = radgrad\n // this.rect(Math.round(xr - sr / 2) - board.ls, Math.round(yr - sr / 2) - board.ls, sr, sr)\n this.arc(xr - board.ls, yr - board.ls, Math.max(0, sr - 0.5), 0, 2 * Math.PI, true);\n this.fill()\n }\n }\n },\n // 支招使用棋子\n YKLB: {\n // draw handler for stone layer\n stone: {\n // drawing function - args object contain info about drawing object, board is main board object\n // this function is called from canvas2D context\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius,\n lw = theme_variable('markupLinesWidth', board) || 1,\n font = args.font || theme_variable('font', board) || ''\n\n this.fillStyle = args.c || get_markup_color(board, args.x, args.y)\n\n if (args.text.length == 1) this.font = Math.round(sr * 1.6) + 'px ' + font\n else if (args.text.length == 2) this.font = Math.round(sr * 1.2) + 'px ' + font\n else if (args.text.length > 2) this.font = Math.round(sr * 3 / 4) + 'px ' + font\n else this.font = Math.round(sr) + 'px ' + font\n this.beginPath()\n this.arc(xr, yr, Math.max(0, sr - lw)+2, 0, 2 * Math.PI, true)\n this.fill()\n this.fillStyle = '#ffffff'\n this.textBaseline = 'middle'\n this.textAlign = 'center'\n this.fillText(args.text, xr, yr, 2 * sr)\n if (args.outside) {\n this.lineWidth = 3\n this.strokeStyle =args.color==1? 'black':'white'\n this.stroke()\n }\n }\n },\n // adding shadow handler\n // shadow: shadow_handler\n },\n // pdf 填子\n PDFLB: {\n // draw handler for stone layer\n stone: {\n // drawing function - args object contain info about drawing object, board is main board object\n // this function is called from canvas2D context\n draw: function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius,\n lw = theme_variable('markupLinesWidth', board) || 1,\n font = args.font || theme_variable('font', board) || '';\n\n if (args.text.length == 1) this.font = Math.round(sr * 1.6) + 'px ' + font\n else if (args.text.length == 2) this.font = Math.round(sr * 1.2) + 'px ' + font\n else if (args.text.length > 2) this.font = Math.round(sr * 3 / 4) + 'px ' + font\n else this.font = Math.round(sr) + 'px ' + font\n\n if (args.c == WGo.W) this.fillStyle = 'white'\n else this.fillStyle = 'black'\n\n this.beginPath()\n this.arc(xr, yr, Math.max(0, sr - lw), 0, 2 * Math.PI, true)\n this.fill()\n this.fillStyle = args.c==1?\"#fff\":\"#000\"\n this.textBaseline = 'middle'\n this.textAlign = 'center'\n this.fillText(args.text, xr, yr, 2 * sr)\n\n this.lineWidth = lw\n this.strokeStyle = 'black'\n this.stroke()\n },\n\n draw1: function (args, board) {\n\n\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius,\n lw = theme_variable('markupLinesWidth', board) || 1,\n font = args.font || theme_variable('font', board) || ''\n\n this.fillStyle = args.c || get_markup_color(board, args.x, args.y)\n\n if (args.text.length == 1) this.font = Math.round(sr * 1.6) + 'px ' + font\n else if (args.text.length == 2) this.font = Math.round(sr * 1.2) + 'px ' + font\n else if (args.text.length > 2) this.font = Math.round(sr * 3 / 4) + 'px ' + font\n else this.font = Math.round(sr) + 'px ' + font\n this.beginPath()\n this.arc(xr, yr, Math.max(0, sr - lw)+2, 0, 2 * Math.PI, true)\n this.fill()\n \n if (args.outside) {\n this.lineWidth = 1\n this.strokeStyle ='black'\n this.stroke()\n }\n }\n },\n // adding shadow handler\n // shadow: shadow_handler\n }\n }\n\n Board.coordinates = {\n grid: {\n draw: function (args, board) {\n var ch, t, xright, xleft, ytop, ybottom\n\n this.fillStyle = theme_variable('coordinatesColor', board)\n this.textBaseline = 'middle'\n this.textAlign = 'center'\n this.font = (board.stoneRadius * 0.7) + 'px ' + (board.font || '')\n\n xright = board.getX(-0.75)\n xleft = board.getX(board.size - 0.25)\n ytop = board.getY(-0.75)\n ybottom = board.getY(board.size - 0.25)\n\n let chArr = []\n let lang = ''\n // 此处是我的主题 | 语言 是通过 在 root class 里加的 对应classname 实现判断的\n if (document.body.className.indexOf('lang_cn') >= 0) {\n lang = 'lang_cn'\n chArr = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十', '二十一']\n } else {\n lang = 'lang_en'\n chArr = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21']\n }\n\n let textFont = this.measureText('一').width\n for (var i = 0; i < board.size; i++) {\n ch = i + 'A'.charCodeAt(0)\n if (ch >= 'I'.charCodeAt(0)) ch++\n\n let zh = chArr[i]\n t = board.getY(i)\n if (lang == 'lang_en') {\n t = board.getY(i)\n this.fillText(board.size - i, xright, t)\n this.fillText(board.size - i, xleft, t)\n\n t = board.getX(i)\n this.fillText(String.fromCharCode(ch), t, ytop)\n this.fillText(String.fromCharCode(ch), t, ybottom)\n } else {\n for (let s = 0; s < zh.length; s++) {\n if (s == 0) {\n this.textBaseline = 'top'\n this.fillText(zh[s], xright, i > 9 ? t - (textFont * 0.65) : t - (textFont * 0.65))\n this.fillText(zh[s], xleft, i > 9 ? t - (textFont * 0.85) : t - (textFont * 0.65))\n t = t + this.measureText(zh[s]).width // 计算文字宽度\n } else {\n this.save()\n this.textBaseline = 'bottom'\n this.fillText(zh[s], xright, t + (textFont * 0.25))\n this.fillText(zh[s], xleft, t + (textFont * 0.25))\n this.restore()\n t = t + this.measureText(zh[s]).width // 计算文字宽度\n }\n }\n t = board.getX(i)\n this.textBaseline = 'middle'\n this.fillText(i + 1, t, ytop)\n this.fillText(i + 1, t, ybottom)\n }\n }\n\n this.fillStyle = 'black'\n }\n }\n }\n\n Board.CanvasLayer = function () {\n this.element = document.createElement('canvas')\n this.context = this.element.getContext('2d')\n\n // Adjust pixel ratio for HDPI screens (e.g. Retina)\n this.pixelRatio = window.devicePixelRatio || 1\n if (this.pixelRatio > 1) {\n this.context.scale(this.pixelRatio, this.pixelRatio)\n }\n }\n\n Board.CanvasLayer.prototype = {\n constructor: Board.CanvasLayer,\n\n setDimensions: function (width, height) {\n this.element.width = width\n this.element.style.width = (width / this.pixelRatio) + 'px'\n this.element.height = height\n this.element.style.height = (height / this.pixelRatio) + 'px'\n },\n\n appendTo: function (element, weight) {\n this.element.style.position = 'absolute'\n this.element.style.zIndex = weight\n element.appendChild(this.element)\n },\n\n removeFrom: function (element) {\n element.removeChild(this.element)\n },\n\n getContext: function () {\n return this.context\n },\n\n draw: function (board) {},\n\n clear: function () {\n this.context.clearRect(0, 0, this.element.width, this.element.height)\n }\n }\n\n Board.GridLayer = WGo.extendClass(Board.CanvasLayer, function () {\n this.super.call(this)\n })\n\n Board.GridLayer.prototype.draw = function (board) {\n // draw grid\n var tmp\n\n this.context.beginPath()\n this.context.lineWidth = theme_variable('gridLinesWidth', board)\n this.context.strokeStyle = theme_variable('gridLinesColor', board)\n\n var tx = Math.round(board.left),\n ty = Math.round(board.top),\n bw = Math.round(board.fieldWidth * (board.size - 1)),\n bh = Math.round(board.fieldHeight * (board.size - 1))\n\n this.context.strokeRect(tx - board.ls, ty - board.ls, bw, bh)\n\n for (var i = 1; i < board.size - 1; i++) {\n tmp = Math.round(board.getX(i)) - board.ls\n this.context.moveTo(tmp, ty)\n this.context.lineTo(tmp, ty + bh)\n\n tmp = Math.round(board.getY(i)) - board.ls\n this.context.moveTo(tx, tmp)\n this.context.lineTo(tx + bw, tmp)\n }\n\n this.context.stroke()\n\n // draw stars\n this.context.fillStyle = theme_variable('starColor', board)\n\n if (board.starPoints[board.size]) {\n for (var key in board.starPoints[board.size]) {\n this.context.beginPath()\n this.context.arc(board.getX(board.starPoints[board.size][key].x) - board.ls, board.getY(board.starPoints[board.size][key].y) - board.ls, theme_variable('starSize', board), 0, 2 * Math.PI, true)\n this.context.fill()\n }\n }\n }\n\n /**\n * Layer that is composed from more canvases. The proper canvas is selected according to drawn object.\n * In default there are 4 canvases and they are used for board objects like stones. This allows overlapping of objects.\n */\n Board.MultipleCanvasLayer = WGo.extendClass(Board.CanvasLayer, function () {\n this.init(4)\n })\n\n Board.MultipleCanvasLayer.prototype.init = function (n) {\n var tmp, tmpContext\n\n this.layers = n\n\n this.elements = []\n this.contexts = []\n\n // Adjust pixel ratio for HDPI screens (e.g. Retina)\n this.pixelRatio = window.devicePixelRatio || 1\n\n for (var i = 0; i < n; i++) {\n tmp = document.createElement('canvas')\n tmpContext = tmp.getContext('2d')\n\n if (this.pixelRatio > 1) {\n tmpContext.scale(this.pixelRatio, this.pixelRatio)\n }\n\n this.elements.push(tmp)\n this.contexts.push(tmpContext)\n }\n }\n\n Board.MultipleCanvasLayer.prototype.appendTo = function (element, weight) {\n for (var i = 0; i < this.layers; i++) {\n this.elements[i].style.position = 'absolute'\n this.elements[i].style.zIndex = weight\n element.appendChild(this.elements[i])\n }\n }\n\n Board.MultipleCanvasLayer.prototype.removeFrom = function (element) {\n for (var i = 0; i < this.layers; i++) {\n element.removeChild(this.elements[i])\n }\n }\n\n Board.MultipleCanvasLayer.prototype.getContext = function (args) {\n if (args.x % 2) {\n return (args.y % 2) ? this.contexts[0] : this.contexts[1]\n } else {\n return (args.y % 2) ? this.contexts[2] : this.contexts[3]\n }\n // return ((args.x%2) && (args.y%2) || !(args.x%2) && !(args.y%2)) ? this.context_odd : this.context_even;\n }\n\n Board.MultipleCanvasLayer.prototype.clear = function (element, weight) {\n for (var i = 0; i < this.layers; i++) {\n this.contexts[i].clearRect(0, 0, this.elements[i].width, this.elements[i].height)\n }\n }\n\n Board.MultipleCanvasLayer.prototype.setDimensions = function (width, height) {\n for (var i = 0; i < this.layers; i++) {\n this.elements[i].width = width\n this.elements[i].style.width = (width / this.pixelRatio) + 'px'\n this.elements[i].height = height\n this.elements[i].style.height = (height / this.pixelRatio) + 'px'\n }\n }\n\n Board.ShadowLayer = WGo.extendClass(Board.MultipleCanvasLayer, function (board, shadowSize, shadowBlur) {\n this.init(2)\n this.shadowSize = shadowSize === undefined ? 1 : shadowSize\n this.board = board\n })\n\n Board.ShadowLayer.prototype.getContext = function (args) {\n return ((args.x % 2) && (args.y % 2) || !(args.x % 2) && !(args.y % 2)) ? this.contexts[0] : this.contexts[1]\n }\n\n Board.ShadowLayer.prototype.setDimensions = function (width, height) {\n this.super.prototype.setDimensions.call(this, width, height)\n\n for (var i = 0; i < this.layers; i++) {\n this.contexts[i].setTransform(1, 0, 0, 1, Math.round(this.shadowSize * this.board.stoneRadius / 7), Math.round(this.shadowSize * this.board.stoneRadius / 7))\n }\n }\n\n var default_field_clear = function (args, board) {\n var xr = board.getX(args.x),\n yr = board.getY(args.y),\n sr = board.stoneRadius\n this.clearRect(xr - 2 * sr - board.ls, yr - 2 * sr - board.ls, 4 * sr, 4 * sr)\n }\n\n // Private methods of WGo.Board\n\n var calcLeftMargin = function () {\n return (3 * this.width) / (4 * (this.bx + 1 - this.tx) + 2) - this.fieldWidth * this.tx\n }\n\n var calcTopMargin = function () {\n return (3 * this.height) / (4 * (this.by + 1 - this.ty) + 2) - this.fieldHeight * this.ty\n }\n\n var calcFieldWidth = function () {\n return (4 * this.width) / (4 * (this.bx + 1 - this.tx) + 2)\n }\n\n var calcFieldHeight = function () {\n return (4 * this.height) / (4 * (this.by + 1 - this.ty) + 2)\n }\n\n var clearField = function (x, y) {\n var handler\n for (var z = 0; z < this.obj_arr[x][y].length; z++) {\n var obj = this.obj_arr[x][y][z]\n if (!obj.type) handler = this.stoneHandler\n else if (typeof obj.type == 'string') handler = Board.drawHandlers[obj.type]\n else handler = obj.type\n\n for (var layer in handler) {\n if (handler[layer].clear) handler[layer].clear.call(this[layer].getContext(obj), obj, this)\n else default_field_clear.call(this[layer].getContext(obj), obj, this)\n }\n }\n }\n\n var drawField = function (x, y) {\n var handler\n for (var z = 0; z < this.obj_arr[x][y].length; z++) {\n var obj = this.obj_arr[x][y][z]\n if (!obj.type) handler = this.stoneHandler\n else if (typeof obj.type == 'string') handler = Board.drawHandlers[obj.type]\n else handler = obj.type\n\n for (var layer in handler) {\n handler[layer].draw.call(this[layer].getContext(obj), obj, this)\n }\n }\n }\n\n var getMousePos = function (e) {\n // new hopefully better translation of coordinates\n var x, y\n\n x = e.offsetX * this.pixelRatio\n x -= this.left\n x /= this.fieldWidth\n x = Math.round(x)\n\n y = e.offsetY * this.pixelRatio\n y -= this.top\n y /= this.fieldHeight\n y = Math.round(y)\n\n return {\n x: x >= this.size ? -1 : x,\n y: y >= this.size ? -1 : y\n }\n }\n\n var updateDim = function () {\n this.element.style.width = (this.width / this.pixelRatio) + 'px'\n this.element.style.height = (this.height / this.pixelRatio) + 'px'\n\n this.stoneRadius = theme_variable('stoneSize', this)\n // if(this.autoLineWidth) this.lineWidth = this.stoneRadius/7; //< 15 ? 1 : 3;\n this.ls = theme_variable('linesShift', this)\n\n for (var i = 0; i < this.layers.length; i++) {\n this.layers[i].setDimensions(this.width, this.height)\n }\n }\n\n // Public methods are in the prototype:\n\n Board.prototype = {\n constructor: Board,\n\n /**\n * Initialization method, it is called in constructor. You shouldn't call it, but you can alter it.\n */\n\n init: function () {\n // placement of objects (in 3D array)\n this.obj_arr = []\n for (var i = 0; i < this.size; i++) {\n this.obj_arr[i] = []\n for (var j = 0; j < this.size; j++) this.obj_arr[i][j] = []\n }\n\n // other objects, stored in list\n this.obj_list = []\n\n // layers\n this.layers = []\n\n // event listeners, binded to board\n this.listeners = []\n\n this.element = document.createElement('div')\n this.element.className = 'wgo-board'\n this.element.style.position = 'relative'\n if (this.background) {\n if (this.background[0] == '#') this.element.style.backgroundColor = this.background\n else {\n this.element.style.backgroundImage = \"url('\" + this.background + \"')\"\n /* this.element.style.backgroundRepeat = \"repeat\"; */\n }\n }\n\n this.grid = new Board.GridLayer()\n this.shadow = new Board.ShadowLayer(this, theme_variable('shadowSize', this))\n this.stone = new Board.MultipleCanvasLayer()\n\n this.addLayer(this.grid, 100)\n this.addLayer(this.shadow, 200)\n this.addLayer(this.stone, 300)\n },\n\n /**\n * Set new width of board, height is computed to keep aspect ratio.\n *\n * @param {number} width\n */\n\n setWidth: function (width) {\n this.width = width\n this.width *= this.pixelRatio\n this.fieldHeight = this.fieldWidth = calcFieldWidth.call(this)\n this.left = calcLeftMargin.call(this)\n\n this.height = (this.by - this.ty + 1.5) * this.fieldHeight\n this.top = calcTopMargin.call(this)\n\n updateDim.call(this)\n this.redraw()\n },\n\n /**\n * Set new height of board, width is computed to keep aspect ratio.\n *\n * @param {number} height\n */\n\n setHeight: function (height) {\n this.height = height\n this.height *= this.pixelRatio\n this.fieldWidth = this.fieldHeight = calcFieldHeight.call(this)\n this.top = calcTopMargin.call(this)\n\n this.width = (this.bx - this.tx + 1.5) * this.fieldWidth\n this.left = calcLeftMargin.call(this)\n\n updateDim.call(this)\n this.redraw()\n },\n\n /**\n * Set both dimensions.\n *\n * @param {number} width\n * @param {number} height\n */\n\n setDimensions: function (width, height) {\n this.width = width || parseInt(this.element.style.width, 10)\n this.width *= this.pixelRatio\n this.height = height || parseInt(this.element.style.height, 10)\n this.height *= this.pixelRatio\n\n this.fieldWidth = calcFieldWidth.call(this)\n this.fieldHeight = calcFieldHeight.call(this)\n this.left = calcLeftMargin.call(this)\n this.top = calcTopMargin.call(this)\n\n updateDim.call(this)\n this.redraw()\n },\n\n /**\n * Get currently visible section of the board\n */\n\n getSection: function () {\n return this.section\n },\n\n /**\n * Set section of the board to be displayed\n */\n\n setSection: function (section_or_top, right, bottom, left) {\n if (typeof section_or_top == 'object') {\n this.section = section_or_top\n } else {\n this.section = {\n top: section_or_top,\n right: right,\n bottom: bottom,\n left: left\n }\n }\n\n this.tx = this.section.left\n this.ty = this.section.top\n this.bx = this.size - 1 - this.section.right\n this.by = this.size - 1 - this.section.bottom\n\n this.setDimensions()\n },\n\n /**\n * Set board size (eg: 9, 13 or 19), this will clear board's objects.\n */\n\n setSize: function (size) {\n var size = size || 19\n\n if (size != this.size) {\n this.size = size\n\n this.obj_arr = []\n for (var i = 0; i < this.size; i++) {\n this.obj_arr[i] = []\n for (var j = 0; j < this.size; j++) this.obj_arr[i][j] = []\n }\n\n this.bx = this.size - 1 - this.section.right\n this.by = this.size - 1 - this.section.bottom\n this.setDimensions()\n }\n },\n\n /**\n * Redraw everything.\n */\n\n redraw: function () {\n try {\n // redraw layers\n for (var i = 0; i < this.layers.length; i++) {\n this.layers[i].clear(this)\n this.layers[i].draw(this)\n }\n\n // redraw field objects\n for (var i = 0; i < this.size; i++) {\n for (var j = 0; j < this.size; j++) {\n drawField.call(this, i, j)\n }\n }\n\n // redraw custom objects\n for (var i = 0; i < this.obj_list.length; i++) {\n var obj = this.obj_list[i]\n var handler = obj.handler\n\n for (var layer in handler) {\n handler[layer].draw.call(this[layer].getContext(obj.args), obj.args, this)\n }\n }\n } catch (err) {\n // If the board is too small some canvas painting function can throw an exception, but we don't want to break our app\n console.log('WGo board failed to render. Error: ' + err.message)\n }\n },\n\n /**\n * Get absolute X coordinate\n *\n * @param {number} x relative coordinate\n */\n\n getX: function (x) {\n return this.left + x * this.fieldWidth\n },\n\n /**\n * Get absolute Y coordinate\n *\n * @param {number} y relative coordinate\n */\n\n getY: function (y) {\n return this.top + y * this.fieldHeight\n },\n\n /**\n * Add layer to the board. It is meant to be only for canvas layers.\n *\n * @param {Board.CanvasLayer} layer to add\n * @param {number} weight layer with biggest weight is on the top\n */\n\n addLayer: function (layer, weight) {\n layer.appendTo(this.element, weight)\n layer.setDimensions(this.width, this.height)\n this.layers.push(layer)\n },\n\n /**\n * Remove layer from the board.\n *\n * @param {Board.CanvasLayer} layer to remove\n */\n\n removeLayer: function (layer) {\n var i = this.layers.indexOf(layer)\n if (i >= 0) {\n this.layers.splice(i, 1)\n layer.removeFrom(this.element)\n }\n },\n\n update: function (changes) {\n var i\n if (changes.remove && changes.remove == 'all') this.removeAllObjects()\n else if (changes.remove) {\n for (i = 0; i < changes.remove.length; i++) this.removeObject(changes.remove[i])\n }\n\n if (changes.add) {\n for (i = 0; i < changes.add.length; i++) this.addObject(changes.add[i])\n }\n },\n\n addObject: function (obj) {\n // handling multiple objects\n if (obj.constructor == Array) {\n for (var i = 0; i < obj.length; i++) this.addObject(obj[i])\n return\n }\n\n try {\n // clear all objects on object's coordinates\n clearField.call(this, obj.x, obj.y)\n // console.log(obj.x, obj.y)\n\n // if object of this type is on the board, replace it\n var layers = this.obj_arr[obj.x][obj.y]\n for (var z = 0; z < layers.length; z++) {\n if (layers[z].type == obj.type) {\n layers[z] = obj\n drawField.call(this, obj.x, obj.y)\n return\n }\n }\n // if object is a stone, add it at the beginning, otherwise at the end\n if (!obj.type) layers.unshift(obj)\n else layers.push(obj)\n\n // draw all objects\n drawField.call(this, obj.x, obj.y)\n } catch (err) {\n console.log('WGo board failed to render.')\n // If the board is too small some canvas painting function can throw an exception, but we don't want to break our app\n // console.log(\"WGo board failed to render. Error: \"+err.message);\n }\n },\n\n removeObject: function (obj) {\n // handling multiple objects\n if (obj.constructor == Array) {\n for (var n = 0; n < obj.length; n++) this.removeObject(obj[n])\n return\n }\n\n try {\n var i\n for (var j = 0; j < this.obj_arr[obj.x][obj.y].length; j++) {\n if (this.obj_arr[obj.x][obj.y][j].type == obj.type) {\n i = j\n break\n }\n }\n if (i === undefined) return\n\n // clear all objects on object's coordinates\n clearField.call(this, obj.x, obj.y)\n\n this.obj_arr[obj.x][obj.y].splice(i, 1)\n\n drawField.call(this, obj.x, obj.y)\n } catch (err) {\n // If the board is too small some canvas painting function can throw an exception, but we don't want to break our app\n console.log('WGo board failed to render. Error: ' + err.message)\n }\n },\n\n removeObjectsAt: function (x, y) {\n if (!this.obj_arr[x][y].length) return\n\n clearField.call(this, x, y)\n this.obj_arr[x][y] = []\n },\n\n removeAllObjects: function () {\n this.obj_arr = []\n for (var i = 0; i < this.size; i++) {\n this.obj_arr[i] = []\n for (var j = 0; j < this.size; j++) this.obj_arr[i][j] = []\n }\n this.redraw()\n },\n\n addCustomObject: function (handler, args) {\n this.obj_list.push({ handler: handler, args: args })\n this.redraw()\n },\n\n removeCustomObject: function (handler, args) {\n for (var i = 0; i < this.obj_list.length; i++) {\n var obj = this.obj_list[i]\n if (obj.handler == handler && obj.args == args) {\n this.obj_list.splice(i, 1)\n this.redraw()\n return true\n }\n }\n return false\n },\n\n addEventListener: function (type, callback) {\n var _this = this,\n evListener = {\n type: type,\n callback: callback,\n handleEvent: function (e) {\n var coo = getMousePos.call(_this, e)\n callback(coo.x, coo.y, e)\n }\n }\n\n this.element.addEventListener(type, evListener, true)\n this.listeners.push(evListener)\n },\n\n removeEventListener: function (type, callback) {\n for (var i = 0; i < this.listeners.length; i++) {\n var listener = this.listeners[i]\n if (listener.type == type && listener.callback == callback) {\n this.element.removeEventListener(listener.type, listener, true)\n this.listeners.splice(i, 1)\n return true\n }\n }\n return false\n },\n\n getState: function () {\n return {\n objects: WGo.clone(this.obj_arr),\n custom: WGo.clone(this.obj_list)\n }\n },\n\n restoreState: function (state) {\n this.obj_arr = state.objects || this.obj_arr\n this.obj_list = state.custom || this.obj_list\n\n this.redraw()\n }\n }\n\n Board.default = {\n size: 19,\n width: 0,\n height: 0,\n font: 'Calibri', // deprecated\n lineWidth: 1, // deprecated\n autoLineWidth: false, // deprecated\n starPoints: {\n 5: [{ x: 2, y: 2 }],\n 7: [{ x: 3, y: 3 }],\n 8: [{ x: 2, y: 2 }, { x: 5, y: 2 }, { x: 2, y: 5 }, { x: 5, y: 5 }],\n 9: [{ x: 2, y: 2 }, { x: 6, y: 2 }, { x: 4, y: 4 }, { x: 2, y: 6 }, { x: 6, y: 6 }],\n 10: [{ x: 2, y: 2 }, { x: 7, y: 2 }, { x: 2, y: 7 }, { x: 7, y: 7 }],\n 11: [{ x: 2, y: 2 }, { x: 8, y: 2 }, { x: 5, y: 5 }, { x: 2, y: 8 }, { x: 8, y: 8 }],\n 12: [{ x: 3, y: 3 }, { x: 8, y: 3 }, { x: 3, y: 8 }, { x: 8, y: 8 }],\n 13: [{ x: 3, y: 3 }, { x: 9, y: 3 }, { x: 6, y: 6 }, { x: 3, y: 9 }, { x: 9, y: 9 }],\n 14: [{ x: 3, y: 3 }, { x: 10, y: 3 }, { x: 3, y: 10 }, { x: 10, y: 10 }],\n 15: [{ x: 3, y: 3 }, { x: 11, y: 3 }, { x: 7, y: 7 }, { x: 3, y: 11 }, { x: 11, y: 11 }],\n 16: [{ x: 3, y: 3 }, { x: 12, y: 3 }, { x: 3, y: 12 }, { x: 12, y: 12 }],\n 17: [{ x: 3, y: 3 }, { x: 8, y: 3 }, { x: 13, y: 3 }, { x: 3, y: 8 }, { x: 8, y: 8 },\n { x: 13, y: 8 }, { x: 3, y: 13 }, { x: 8, y: 13 }, { x: 13, y: 13 }\n ],\n 18: [{ x: 3, y: 3 }, { x: 14, y: 3 }, { x: 3, y: 14 }, { x: 14, y: 14 }],\n 19: [{ x: 3, y: 3 }, { x: 9, y: 3 }, { x: 15, y: 3 }, { x: 3, y: 9 }, { x: 9, y: 9 },\n { x: 15, y: 9 }, { x: 3, y: 15 }, { x: 9, y: 15 }, { x: 15, y: 15 }\n ],\n 20: [{ x: 3, y: 3 }, { x: 16, y: 3 }, { x: 3, y: 16 }, { x: 16, y: 16 }],\n 21: [{ x: 3, y: 3 }, { x: 10, y: 3 }, { x: 17, y: 3 }, { x: 3, y: 10 }, { x: 10, y: 10 },\n { x: 17, y: 10 }, { x: 3, y: 17 }, { x: 10, y: 17 }, { x: 17, y: 17 }\n ]\n },\n stoneHandler: Board.drawHandlers.SHELL,\n // stoneHandler: Board.drawHandlers.MONO, // New photograph based stones\n starSize: 1, // deprecated\n shadowSize: 1, // deprecated\n stoneSize: 1, // deprecated\n section: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n },\n\n background: WGo.DIR+\"boardNew.png\", // Original version, tileing\n // background: WGo.DIR+\"wood_512.jpg\", // Mobile friendly, low resolution\n // background: WGo.DIR+\"board.png\", // High resolution version, use with REALISTIC handler\n\n // whiteStoneGraphic: [ WGo.DIR+\"white_128.png\" ], // Single image only, hires\n // blackStoneGraphic: [ WGo.DIR+\"black_128.png\" ], // Single image only, hires\n\n // whiteStoneGraphic: [ WGo.DIR+\"white_64.png\" ], // Single image only, lowres\n // blackStoneGraphic: [ WGo.DIR+\"black_64.png\" ], // Single image only, lowres\n\n // whiteStoneGraphic: [ WGo.DIR + \"stones/white00_128.png\",\n // \t\t\t\t\t\t\t\t\t\t\tWGo.DIR + \"stones/white01_128.png\",\n // \t\t\t\t\t\t\t\t\t\t\tWGo.DIR + \"stones/white02_128.png\",\n // \t\t\t\t\t\t\t\t\t\t\tWGo.DIR + \"stones/white03_128.png\",\n // \t\t\t\t\t\t\t\t\t\t\tWGo.DIR + \"stones/white04_128.png\",\n // \t\t\t\t\t\t\t\t\t\t\tWGo.DIR + \"stones/white05_128.png\",\n // \t\t\t\t\t\t\t\t\t\t\tWGo.DIR + \"stones/white06_128.png\",\n // \t\t\t\t\t\t\t\t\t\t\tWGo.DIR + \"stones/white07_128.png\",\n // \t\t\t\t\t\t\t\t\t\t\tWGo.DIR + \"stones/white08_128.png\",\n // \t\t\t\t\t\t\t\t\t\t\tWGo.DIR + \"stones/white09_128.png\",\n // \t\t\t\t\t\t\t\t\t\t\tWGo.DIR + \"stones/white10_128.png\"\n // \t\t\t\t\t\t\t\t\t ],\n // blackStoneGraphic: [ \tWGo.DIR + \"stones/black00_128.png\",\n // \t\t\t\t\t\t\t\t\t\t\tWGo.DIR + \"stones/black01_128.png\",\n // \t\t\t\t\t\t\t\t\t\t\tWGo.DIR + \"stones/black02_128.png\",\n // \t\t\t\t\t\t\t\t\t\t\tWGo.DIR + \"stones/black03_128.png\"\n // \t\t\t\t\t\t\t\t\t ],\n\n theme: {}\n }\n\n // save Board\n WGo.Board = Board\nconsole.log()\n // -------- WGo.Game ---------------------------------------------------------------------------\n\n /**\n * Creates instance of position object.\n *\n * @class\n *

WGo.Position is simple object storing position of go game. It is implemented as matrix size x size with values WGo.BLACK, WGo.WHITE or 0. It can be used by any extension.

\n *\n * @param {number} size of the board\n */\n\n var Position = function (size) {\n this.size = size || 19\n this.schema = []\n for (var i = 0; i < this.size * this.size; i++) {\n this.schema[i] = 0\n }\n }\n\n Position.prototype = {\n constructor: WGo.Position,\n\n /**\n * Returns value of given coordinates.\n *\n * @param {number} x coordinate\n * @param {number} y coordinate\n * @return {(WGo.BLACK|WGo.WHITE|0)} color\n */\n\n get: function (x, y) {\n if (x < 0 || y < 0 || x >= this.size || y >= this.size) return undefined\n return this.schema[x * this.size + y]\n },\n\n /**\n * Sets value of given coordinates.\n *\n * @param {number} x coordinate\n * @param {number} y coordinate\n * @param {(WGo.B|WGo.W|0)} c color\n */\n\n set: function (x, y, c) {\n this.schema[x * this.size + y] = c\n return this\n },\n\n /**\n * Clears the whole position (every value is set to 0).\n */\n\n clear: function () {\n for (var i = 0; i < this.size * this.size; i++) this.schema[i] = 0\n return this\n },\n\n /**\n * Clones the whole position.\n *\n * @return {WGo.Position} copy of position\n */\n\n clone: function () {\n var clone = new Position(this.size)\n clone.schema = this.schema.slice(0)\n return clone\n },\n\n /**\n * Compares this position with another position and return change object\n *\n * @param {WGo.Position} position to compare to.\n * @return {object} change object with structure: {add:[], remove:[]}\n */\n\n compare: function (position) {\n var add = [],\n remove = []\n\n for (var i = 0; i < this.size * this.size; i++) {\n if (this.schema[i] && !position.schema[i]) {\n remove.push({\n x: Math.floor(i / this.size),\n y: i % this.size\n })\n } else if (this.schema[i] != position.schema[i]) {\n add.push({\n x: Math.floor(i / this.size),\n y: i % this.size,\n c: position.schema[i]\n })\n }\n }\n\n return {\n add: add,\n remove: remove\n }\n }\n }\n\n WGo.Position = Position\n\n /**\n * Creates instance of game class.\n *\n * @class\n * This class implements game logic. It basically analyses given moves and returns capture stones.\n * WGo.Game also stores every position from beginning, so it has ability to check repeating positions\n * and it can effectively restore old positions.

\n *\n * @param {number} size of the board\n * @param {\"KO\"|\"ALL\"|\"NONE\"} checkRepeat (optional, default is \"KO\") - how to handle repeated position:\n * KO - ko is properly handled - position cannot be same like previous position\n * ALL - position cannot be same like any previous position - e.g. it forbids triple ko\n * NONE - position can be repeated\n *\n * @param {boolean} allowRewrite (optional, default is false) - allow to play moves, which were already played:\n * @param {boolean} allowSuicide (optional, default is false) - allow to play suicides, stones are immediately captured\n */\n\n var Game = function (size, checkRepeat, allowRewrite, allowSuicide) {\n this.size = size || 19\n\n this.repeating = checkRepeat === undefined ? 'KO' : checkRepeat // possible values: KO, ALL or nothing\n this.allow_rewrite = allowRewrite || false\n this.allow_suicide = allowSuicide || false\n\n this.stack = []\n this.stack[0] = new Position(this.size)\n this.stack[0].capCount = { black: 0, white: 0 }\n this.turn = WGo.B\n\n Object.defineProperty(this, 'position', {\n get: function () { return this.stack[this.stack.length - 1] },\n set: function (pos) { this.stack[this.stack.length - 1] = pos }\n })\n }\n\n // function for stone capturing\n var do_capture = function (position, captured, x, y, c) {\n if (x >= 0 && x < position.size && y >= 0 && y < position.size && position.get(x, y) == c) {\n position.set(x, y, 0)\n captured.push({ x: x, y: y })\n\n do_capture(position, captured, x, y - 1, c)\n do_capture(position, captured, x, y + 1, c)\n do_capture(position, captured, x - 1, y, c)\n do_capture(position, captured, x + 1, y, c)\n }\n }\n\n // looking at liberties\n var check_liberties = function (position, testing, x, y, c) {\n // out of the board there aren't liberties\n if (x < 0 || x >= position.size || y < 0 || y >= position.size) return true\n // however empty field means liberty\n if (position.get(x, y) == 0) return false\n // already tested field or stone of enemy isn't giving us a liberty.\n if (testing.get(x, y) == true || position.get(x, y) == -c) return true\n\n // set this field as tested\n testing.set(x, y, true)\n\n // in this case we are checking our stone, if we get 4 trues, it has no liberty\n return check_liberties(position, testing, x, y - 1, c) &&\n check_liberties(position, testing, x, y + 1, c) &&\n check_liberties(position, testing, x - 1, y, c) &&\n check_liberties(position, testing, x + 1, y, c)\n }\n\n // analysing function - modifies original position, if there are some capturing, and returns array of captured stones\n var check_capturing = function (position, x, y, c) {\n var captured = []\n // is there a stone possible to capture?\n if (x >= 0 && x < position.size && y >= 0 && y < position.size && position.get(x, y) == c) {\n // create testing map\n var testing = new Position(position.size)\n // if it has zero liberties capture it\n if (check_liberties(position, testing, x, y, c)) {\n // capture stones from game\n do_capture(position, captured, x, y, c)\n }\n }\n return captured\n }\n\n // analysing history\n var checkHistory = function (position, x, y) {\n var flag, stop\n\n if (this.repeating == 'KO' && this.stack.length - 2 >= 0) stop = this.stack.length - 2\n else if (this.repeating == 'ALL') stop = 0\n else return true\n\n for (var i = this.stack.length - 2; i >= stop; i--) {\n if (this.stack[i].get(x, y) == position.get(x, y)) {\n flag = true\n for (var j = 0; j < this.size * this.size; j++) {\n if (this.stack[i].schema[j] != position.schema[j]) {\n flag = false\n break\n }\n }\n if (flag) return false\n }\n }\n\n return true\n }\n\n Game.prototype = {\n\n constructor: Game,\n\n /**\n * Gets actual position.\n *\n * @return {WGo.Position} actual position\n */\n\n getPosition: function () {\n return this.stack[this.stack.length - 1]\n },\n\n /**\n * Play move.\n *\n * @param {number} x coordinate\n * @param {number} y coordinate\n * @param {(WGo.B|WGo.W)} c color\n * @param {boolean} noplay - if true, move isn't played. Used by WGo.Game.isValid.\n * @return {number} code of error, if move isn't valid. If it is valid, function returns array of captured stones.\n *\n * Error codes:\n * 1 - given coordinates are not on board\n * 2 - on given coordinates already is a stone\n * 3 - suicide (currently they are forbbiden)\n * 4 - repeated position\n */\n\n play: function (x, y, c, noplay) {\n // check coordinates validity\n if (!this.isOnBoard(x, y)) return 1\n if (!this.allow_rewrite && this.position.get(x, y) != 0) return 2\n\n // clone position\n if (!c) c = this.turn\n\n var new_pos = this.position.clone()\n new_pos.set(x, y, c)\n\n // check capturing\n var cap_color = c\n var captured = check_capturing(new_pos, x - 1, y, -c).concat(check_capturing(new_pos, x + 1, y, -c), check_capturing(new_pos, x, y - 1, -c), check_capturing(new_pos, x, y + 1, -c))\n\n // check suicide\n if (!captured.length) {\n var testing = new Position(this.size)\n if (check_liberties(new_pos, testing, x, y, c)) {\n if (this.allow_suicide) {\n cap_color = -c\n do_capture(new_pos, captured, x, y, c)\n } else return 3\n }\n }\n\n // check history\n if (this.repeating && !checkHistory.call(this, new_pos, x, y)) {\n return 4\n }\n\n if (noplay) return false\n\n // update position info\n new_pos.color = c\n new_pos.capCount = {\n black: this.position.capCount.black,\n white: this.position.capCount.white\n }\n if (cap_color == WGo.B) new_pos.capCount.black += captured.length\n else new_pos.capCount.white += captured.length\n\n // save position\n this.pushPosition(new_pos)\n\n // reverse turn\n this.turn = -c\n\n return captured\n },\n\n /**\n * Play pass.\n *\n * @param {(WGo.B|WGo.W)} c color\n */\n\n pass: function (c) {\n this.pushPosition()\n if (c) {\n this.position.color = c\n this.turn = -c\n } else {\n this.position.color = this.turn\n this.turn = -this.turn\n }\n },\n\n /**\n * Finds out validity of the move.\n *\n * @param {number} x coordinate\n * @param {number} y coordinate\n * @param {(WGo.B|WGo.W)} c color\n * @return {boolean} true if move can be played.\n */\n\n isValid: function (x, y, c) {\n return typeof this.play(x, y, c, true) != 'number'\n },\n\n /**\n * Controls position of the move.\n *\n * @param {number} x coordinate\n * @param {number} y coordinate\n * @return {boolean} true if move is on board.\n */\n\n isOnBoard: function (x, y) {\n return x >= 0 && y >= 0 && x < this.size && y < this.size\n },\n\n /**\n * Inserts move into current position. Use for setting position, for example in handicap game. Field must be empty.\n *\n * @param {number} x coordinate\n * @param {number} y coordinate\n * @param {(WGo.B|WGo.W)} c color\n * @return {boolean} true if operation is successfull.\n */\n\n addStone: function (x, y, c) {\n if (this.isOnBoard(x, y) && this.position.get(x, y) == 0) {\n this.position.set(x, y, c || 0)\n return true\n }\n return false\n },\n\n /**\n * Removes move from current position.\n *\n * @param {number} x coordinate\n * @param {number} y coordinate\n * @return {boolean} true if operation is successfull.\n */\n\n removeStone: function (x, y) {\n if (this.isOnBoard(x, y) && this.position.get(x, y) != 0) {\n this.position.set(x, y, 0)\n return true\n }\n return false\n },\n\n /**\n * Set or insert move of current position.\n *\n * @param {number} x coordinate\n * @param {number} y coordinate\n * @param {(WGo.B|WGo.W)} c color\n * @return {boolean} true if operation is successfull.\n */\n\n setStone: function (x, y, c) {\n if (this.isOnBoard(x, y)) {\n this.position.set(x, y, c || 0)\n return true\n }\n return false\n },\n\n /**\n * Get stone on given position.\n *\n * @param {number} x coordinate\n * @param {number} y coordinate\n * @return {(WGo.B|WGo.W|0)} color\n */\n\n getStone: function (x, y) {\n if (this.isOnBoard(x, y)) {\n return this.position.get(x, y)\n }\n return 0\n },\n\n /**\n * Add position to stack. If position isn't specified current position is cloned and stacked.\n * Pointer of actual position is moved to the new position.\n *\n * @param {WGo.Position} tmp position (optional)\n */\n\n pushPosition: function (pos) {\n if (!pos) {\n var pos = this.position.clone()\n pos.capCount = {\n black: this.position.capCount.black,\n white: this.position.capCount.white\n }\n pos.color = this.position.color\n }\n this.stack.push(pos)\n if (pos.color) this.turn = -pos.color\n return this\n },\n\n /**\n * Remove current position from stack. Pointer of actual position is moved to the previous position.\n */\n\n popPosition: function () {\n var old = null\n if (this.stack.length > 0) {\n old = this.stack.pop()\n\n if (this.stack.length == 0) this.turn = WGo.B\n else if (this.position.color) this.turn = -this.position.color\n else this.turn = -this.turn\n }\n return old\n },\n\n /**\n * Removes all positions.\n */\n\n firstPosition: function () {\n this.stack = []\n this.stack[0] = new Position(this.size)\n this.stack[0].capCount = { black: 0, white: 0 }\n this.turn = WGo.B\n return this\n },\n\n /**\n * Gets count of captured stones.\n *\n * @param {(WGo.BLACK|WGo.WHITE)} color\n * @return {number} count\n */\n\n getCaptureCount: function (color) {\n return color == WGo.B ? this.position.capCount.black : this.position.capCount.white\n },\n\n /**\n * Validate postion. Position is tested from 0:0 to size:size, if there are some moves, that should be captured, they will be removed.\n * You can use this, after insertion of more stones.\n *\n * @return array removed stones\n */\n\n validatePosition: function () {\n var c, p,\n white = 0,\n black = 0,\n captured = [],\n new_pos = this.position.clone()\n\n for (var x = 0; x < this.size; x++) {\n for (var y = 0; y < this.size; y++) {\n c = this.position.get(x, y)\n if (c) {\n p = captured.length\n captured = captured.concat(check_capturing(new_pos, x - 1, y, -c),\n check_capturing(new_pos, x + 1, y, -c),\n check_capturing(new_pos, x, y - 1, -c),\n check_capturing(new_pos, x, y + 1, -c))\n\n if (c == WGo.B) black += captured - p\n else white += captured - p\n }\n }\n }\n this.position.capCount.black += black\n this.position.capCount.white += white\n this.position.schema = new_pos.schema\n\n return captured\n }\n }\n\n // save Game\n WGo.Game = Game\n\n // register WGo\n window.WGo = WGo\n})(window)\n","(function (WGo) {\n\n\tWGo.Board.drawHandlers['SQF'] = {\n\t\tstone: {\n\t\t\tdraw: function (args, board) {\n\t\t\t\tvar xr = board.getX(args.x),\n\t\t\t\t\tyr = board.getY(args.y),\n\t\t\t\t\tsr = Math.round(board.stoneRadius),\n\t\t\t\t\tratio = args.ratio;\n\t\t\t\tsr = sr * ratio;\n\t\t\t\tthis.lineWidth = args.lineWidth || theme_variable(\"markupLinesWidth\", board) || 1;\n\t\t\t\tthis.beginPath();\n\t\t\t\tthis.fillStyle = args.c || get_markup_color(board, args.x, args.y);\n\t\t\t\tthis.rect(Math.round(xr - sr / 2) - board.ls, Math.round(yr - sr / 2) - board.ls, sr, sr);\n\t\t\t\tthis.fill();\n\t\t\t}\n\t\t}\n\t}\n\tvar theme_variable = function (key, board) {\n\t\treturn typeof board.theme[key] == \"function\" ? board.theme[key](board) : board.theme[key];\n\t}\n\tvar ScoreMode = function (player, callback) {\n\t\tthis.originalPosition = player.kifuReader.game.position;\n\t\tthis.player = player;\n\t\tthis.position = this.originalPosition.clone();\n\t\tthis.board = player.board;\n\t\tthis.callback = callback;\n\t}\n\tvar state = ScoreMode.state = {\n\t\tUNKNOWN: 0,\n\t\tBLACK_STONE: 1, // must be equal to WGo.B\n\t\tWHITE_STONE: -1, // must be equal to WGo.W\n\t\tBLACK_CANDIDATE: 2,\n\t\tWHITE_CANDIDATE: -2,\n\t\tBLACK_NEUTRAL: 3,\n\t\tWHITE_NEUTRAL: -3,\n\t\tNEUTRAL: 4,\n\t}\n\tScoreMode.prototype.start = function (result) {\n\t\tthis.player.setFrozen(true);\n\t\t// if(waiting) {\n\t\t// \tif(window.plus) {\n\t\t// \t\tthis.waiting = plus.nativeUI.showWaiting();\n\t\t// \t} else {\n\t\t// \t\tthis.waiting = waiting;\n\t\t// \t\tthis.waiting.show();\n\t\t// \t}\n\t\t// }\n\t\tthis.result = result;\n\t\tthis.saved_state = this.board.getState();\n\t\tthis.displayScore();\n\t\t// setTimeout(function() {\n\t\t// \tthis.waiting && this.waiting.close();\n\t\t// }.bind(this), 200)\n\t\tvar RU = this.player.kifuReader.kifu.info[\"RU\"] || 'cn';\n\t\tRU = RU.toLocaleLowerCase().trim();\n\t\tRU = RU != 'jp' ? 'cn' : RU;\n\t\tthis.callback && this.callback(RU);\n\t}\n\tScoreMode.prototype.end = function () {\n\t\t// this.waiting && this.waiting.close();\n\t\tthis.board.restoreState({\n\t\t\tobjects: WGo.clone(this.saved_state.objects)\n\t\t});\n\t\tthis.player.setFrozen(false);\n\t}\n\tScoreMode.prototype.calculateKm = function (km, ha) {\n\t\tvar colorText = ''\n\t\tvar result = ''\n\t\tvar ha = ha\n\t\tha = ha == 1 ? 0 : ha\n\t\tresult = (ha + km) / 2\n\t\tif (result > 0) {\n\t\t\tcolorText = '黑'\n\t\t} else if (result == 0) {\n\t\t\tcolorText = ''\n\t\t} else {\n\t\t\tcolorText = '白'\n\t\t}\n\t\treturn colorText + '贴' + Math.abs(result) + '子'\n\t}\n\tScoreMode.prototype.displayScore = function () {\n\t\tvar score = {\n\t\t\tblack: [],\n\t\t\twhite: [],\n\t\t}\n\t\tthis.newpos = new WGo.Position(this.board.size)\n\t\tthis.newpos.schema = this.result;\n\t\tfor (var i = 0; i < this.position.size; i++) {\n\t\t\tfor (var j = 0; j < this.position.size; j++) {\n\t\t\t\tvar s = this.newpos.get(i, j)\n\t\t\t\tvar t = this.originalPosition.get(i, j);\n\t\t\t\tif (s > 0.1 && t != WGo.B) {\n\t\t\t\t\tscore.black.push({\n\t\t\t\t\t\tx: i,\n\t\t\t\t\t\ty: j,\n\t\t\t\t\t\ttype: \"SQF\",\n\t\t\t\t\t\tc: \"black\",\n\t\t\t\t\t\tratio: Math.sqrt(s),\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (s < -0.1 && t != WGo.W) {\n\t\t\t\t\tscore.white.push({\n\t\t\t\t\t\tx: i,\n\t\t\t\t\t\ty: j,\n\t\t\t\t\t\ttype: \"SQF\",\n\t\t\t\t\t\tc: \"white\",\n\t\t\t\t\t\tratio: Math.sqrt(Math.abs(s)),\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.board.addObject(score.black);\n\t\tthis.board.addObject(score.white);\n\t}\n\n\tWGo.ScoreMode = ScoreMode;\n})(WGo)\n","import { createRouter, createWebHashHistory, createWebHistory } from 'vue-router'\n\nconst routes = [\n {\n path: '/',\n name: 'home',\n },\n {\n path: '/mobile',\n name: 'mobile',\n\n component: () => import('../views/Mobile.vue')\n },\n {\n path: '/desktop',\n name: 'desktop',\n component: () => import('../views/Desktop.vue')\n },\n {\n path: '/report',\n name: 'report',\n component: () => import('../views/Report.vue')\n },\n {\n path: '/pdf',\n name: 'pdf',\n component: () => import('../views/pdf.vue')\n },\n {\n path: '/ifk_mobile',\n name: 'ifk_mobile',\n component: () => import('../views/IfkMobile.vue')\n }\n]\n\n\n\nconst router = createRouter({\n history: createWebHashHistory(process.env.BASE_URL),\n routes\n})\n\nrouter.beforeEach((to, from, next) => {\n setTimeout(() => {\n if (to.path == \"/desktop\") {\n if (window.screen.width <= 640 || window.screen.width < window.screen.height) {\n next({ path: '/mobile', query: to.query })\n return\n }\n } else if (to.path == \"/mobile\") {\n if (window.screen.width > 640 && window.screen.width > window.screen.height) {\n next({ path: '/desktop', query: to.query })\n return\n }\n } else if (to.path == \"/report\") {\n // next({ path: '/report', query: to.query })\n } else if (to.path == \"/pdf\") {\n // next({ path: '/report', query: to.query })\n } else if(to.path == \"/ifk_mobile\"){\n // next({ path: '/ifk_mobile', query: to.query })\n } else {\n if (window.screen.width <= 640 || window.screen.width < window.screen.height) {\n next({ path: '/mobile', query: to.query })\n } else {\n next({ path: '/desktop', query: to.query })\n }\n }\n next()\n }, 200);\n})\n\nexport default router\n","export { default } from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./report_logo.vue?vue&type=script&lang=js\"; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./report_logo.vue?vue&type=script&lang=js\"","(function(WGo) {\n\t// board mousemove callback for edit move - adds highlighting\n\tvar edit_board_mouse_move = function(x, y) {\n\t\tif (this.player.frozen || (this._lastX == x && this._lastY == y)) return\n\n\t\tthis._lastX = x\n\t\tthis._lastY = y\n\n\t\tif (this._last_mark) {\n\t\t\tthis.board.removeObject(this._last_mark)\n\t\t}\n\n\t\tif (x != -1 && y != -1 && this.player.kifuReader.game.isValid(x, y)) {\n\t\t\tthis._last_mark = {\n\t\t\t\ttype: 'GLSQ',\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t\tc: this.player.kifuReader.game.turn\n\t\t\t}\n\t\t\tthis.board.addObject(this._last_mark)\n\n\t\t\tthis.playcb && this.playcb(x, y, 'board_mouse')\n\t\t\treturn\n\t\t} else {\n\t\t\tthis.playcb && this.playcb(x, y, 'cancelTry')\n\t\t\tdelete this._last_mark\n\t\t}\n\t}\n\n\t// board mouseout callback for edit move\n\tvar edit_board_mouse_out = function() {\n\t\tif (this._last_mark) {\n\t\t\tthis.board.removeObject(this._last_mark)\n\t\t\tdelete this._last_mark\n\t\t\tdelete this._lastX\n\t\t\tdelete this._lastY\n\t\t}\n\t}\n\n\t// get differences of two positions as a change object (TODO create a better solution, without need of this function)\n\tvar pos_diff = function(old_p, new_p) {\n\t\tvar size = old_p.size,\n\t\t\tadd = [],\n\t\t\tremove = []\n\n\t\tfor (var i = 0; i < size * size; i++) {\n\t\t\tif (old_p.schema[i] && !new_p.schema[i]) {\n remove.push({\n\t\t\t\tx: Math.floor(i / size),\n\t\t\t\ty: i % size\n\t\t\t})\n} else if (old_p.schema[i] != new_p.schema[i]) {\n add.push({\n\t\t\t\tx: Math.floor(i / size),\n\t\t\t\ty: i % size,\n\t\t\t\tc: new_p.schema[i]\n\t\t\t})\n}\n\t\t}\n\n\t\treturn {\n\t\t\tadd: add,\n\t\t\tremove: remove\n\t\t}\n\t}\n\n\tWGo.Player.Editable = {}\n\n\t/**\n\t * Toggle edit mode.\n\t */\n\n\tWGo.Player.Editable = function(player, board, playcb) {\n\t\tthis.player = player\n\t\tthis.board = board\n\t\tthis.playcb = playcb\n\t\tthis.editMode = false\n\t\tthis.playType = 'normal'\n\t\tthis.colorType = 0\n\t\tthis.preplayMove = null\n\t}\n\tWGo.Player.Editable.prototype.setPlayType = function(type) {\n\t\t// this.playType = type;\n\t\tif (type == this.playType) return\n\t\tif (this.preplayMove) {\n\t\t\tvar preplayMove = this.preplayMove\n\t\t\tthis.board.removeObject({\n\t\t\t\tx: preplayMove.x,\n\t\t\t\ty: preplayMove.y,\n\t\t\t\tc: preplayMove.c,\n\t\t\t\ttype: 'GLSQ'\n\t\t\t})\n\t\t\tthis.preplayMove = null\n\t\t}\n\t\tif (type != 'clear') {\n\t\t\tthis.playType = type\n\t\t}\n\t}\n\tWGo.Player.Editable.prototype.setIsDrop = function(colorType) {\n\t\tthis.colorType = colorType\n\t}\n\tWGo.Player.Editable.prototype.setAllowIllegalMoves = function(allowIllegalMoves) {\n\t\tif (allowIllegalMoves) {\n\t\t\tthis.player.kifuReader.game.allow_rewrite = true\n\t\t\tthis.player.kifuReader.game.allow_rewrite = true\n\t\t\tthis.player.kifuReader.game.repeating = 'NONE'\n\t\t} else {\n\t\t\tthis.player.kifuReader.game.allow_rewrite = false\n\t\t\tthis.player.kifuReader.game.allow_rewrite = false\n\t\t\tthis.player.kifuReader.game.repeating = 'KO'\n\t\t}\n\t}\n\tWGo.Player.Editable.prototype.set = function(set) {\n\t\tif (!this.editMode && set) {\n\t\t\t// save original kifu reader\n\t\t\t//\t\tthis.originalReader = this.player.kifuReader;\n\t\t\t/// /\n\t\t\t/// /\t\t// create new reader with cloned kifu\n\t\t\t//\t\tthis.player.kifuReader = new WGo.KifuReader(this.player.kifu.clone(), this.originalReader.rememberPath, this.originalReader.allow_illegal, this.originalReader.allow_illegal);\n\t\t\t/// /\n\t\t\t/// /\t\t// go to current position\n\t\t\t//\t\tthis.player.kifuReader.goTo(this.originalReader.path);\n\n\t\t\t// register edit listeners\n\t\t\tthis._ev_click = this._ev_click || this.play.bind(this)\n\t\t\tthis._ev_move = this._ev_move || edit_board_mouse_move.bind(this)\n\t\t\tthis._ev_out = this._ev_out || edit_board_mouse_out.bind(this)\n\n\t\t\tthis.board.addEventListener('click', this._ev_click)\n\t\t\tthis.board.addEventListener('mousemove', this._ev_move)\n\t\t\tthis.board.addEventListener('mouseout', this._ev_out)\n\n\t\t\tthis.editMode = true\n\t\t} else if (this.editMode && !set) {\n\t\t\t// go to the last original position\n\t\t\t//\t\tthis.player.kifuReader.goTo(this.player.kifuReader.path);\n\t\t\t//\n\t\t\t//\t\t// change object isn't actual - update it, not elegant solution, but simple\n\t\t\t//\t\tthis.originalReader.change = pos_diff(this.player.kifuReader.getPosition(), this.originalReader.getPosition());\n\t\t\t/// /\t\t// update kifu reader\n\t\t\t//\t\tthis.player.kifuReader = this.originalReader;\n\t\t\t//\t\tthis.player.update(true);\n\t\t\t//\t\tthis.player.kifuReader.goTo(this.player.kifuReader.path);\n\t\t\t// remove edit listeners\n\t\t\tthis.board.removeEventListener('click', this._ev_click)\n\t\t\tthis.board.removeEventListener('mousemove', this._ev_move)\n\t\t\tthis.board.removeEventListener('mouseout', this._ev_out)\n\n\t\t\tthis.editMode = false\n\t\t}\n\t}\n\n\tWGo.Player.Editable.prototype.play = function(x, y, c) {\n\t\tvar postion = this.player.kifuReader.getPosition(),\n\t\t\ttarget = y + x * postion.size\n\t\t// if(postion.schema[target] != 0) return;\n\t\t// if(this.player.frozen || !this.player.kifuReader.game.isValid(x, y) || (this.editMode == false)) return;\n // if (this.player.frozen || !this.player.kifuReader.game.isValid(x, y) || (this.editMode == false && this.playcb)) return;\n\t // if (this.playType == 'preplay' && this.preplayMove) {\n\t // var preplayMove = this.preplayMove\n\t // this.board.removeObject({\n\t // x: preplayMove.x,\n\t // y: preplayMove.y,\n\t // c: preplayMove.c,\n\t // type: 'GLSQ'\n\t // })\n\t // this.preplayMove = null\n\t // this.playcb && this.playcb(x, y, 'cancel')\n\t // return\n\t // }\n\t if (postion.schema[target] != 0) return\n\t if (this.player.frozen || !this.player.kifuReader.game.isValid(x, y) || (this.editMode == false)) return\n \tvar selectIdx = this.player.kifuReader.node._last_selected,\n\t\t\tcurNode = this.player.kifuReader.node,\n\t\t\tcurColor = this.player.kifuReader.game.turn\n\t\tif (!isNaN(c)) curColor = c\n\t\tcurColor = this.colorType == 0 ? curColor : this.colorType\n\t\tswitch (this.playType) {\n\t\t\tcase 'normal':\n\t\t\t\tif (curNode.children.length > 0||\tthis.player.kifuReader.path.m ==this.player.kifuReader.kifu.nodeCount) {\n\t\t\t\t\tthis.playcb && this.playcb(x, y, 'select')\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tcurNode.appendChild(new WGo.KNode({\n\t\t\t\t\tmove: {\n\t\t\t\t\t\tx: x,\n\t\t\t\t\t\ty: y,\n\t\t\t\t\t\tc: curColor,\n\t\t\t\t\t},\n\t\t\t\t\t_edited: true\n\t\t\t\t}))\n\t\t\t\tthis.player.kifuReader.kifu.nodeCount++\n\t\t\t\tthis.player.next(curNode._last_selected)\n\t\t\t\tthis.playcb && this.playcb(x, y, 'normal')\n\t\t\t\tbreak\n\t\t\tcase 'try':\n\t\t\t\t// 当前手下有子节点\n\t\t\t\tif (curNode.children.length > 0) {\n\t\t\t\t\t// 新增分支时,添加节点\n\t\t\t\t\tif (curNode.children.length == curNode._last_selected) {\n\t\t\t\t\t\tcurNode.children.push(new WGo.KNode({\n\t\t\t\t\t\t\tparent: curNode,\n\t\t\t\t\t\t\t_edited: true\n\t\t\t\t\t\t}))\n\t\t\t\t\t}\n\t\t\t\t\tcurNode.children[curNode._last_selected].children = []\n\t\t\t\t\tcurNode.children[curNode._last_selected].move = {\n\t\t\t\t\t\tx: x,\n\t\t\t\t\t\ty: y,\n\t\t\t\t\t\tc: curColor\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcurNode.appendChild(new WGo.KNode({\n\t\t\t\t\t\tmove: {\n\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\ty: y,\n\t\t\t\t\t\t\tc: curColor\n\t\t\t\t\t\t},\n\t\t\t\t\t\t_edited: true\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t\tthis.player.next(curNode._last_selected)\n\t\t\t\tthis.playcb && this.playcb(x, y, 'try')\n\t\t\t\tbreak\n\t\t\tcase 'cover':\n\t\t\t\tcurNode.children = []\n\t\t\t\tcurNode._last_selected = 0\n\t\t\t\tvar path = this.player.kifuReader.path.m\n\t\t\t\tcurNode.appendChild(new WGo.KNode({\n\t\t\t\t\tmove: {\n\t\t\t\t\t\tx: x,\n\t\t\t\t\t\ty: y,\n\t\t\t\t\t\tc: curColor\n\t\t\t\t\t},\n\t\t\t\t\t_edited: true\n\t\t\t\t}))\n\t\t\t\tthis.player.kifu.nodeCount = path + 1\n\t\t\t\tthis.player.next(curNode._last_selected)\n\t\t\t\tthis.playcb && this.playcb(x, y, 'cover')\n\t\t\t\tbreak\n\t\t\tcase 'insert':\n\t\t\t\tif (curNode.children.length == 0) {\n\t\t\t\t\tthis.playType = 'normal'\n\t\t\t\t\tthis.player.next(curNode._last_selected)\n\t\t\t\t\tthis.playcb && this.playcb(x, y, 'normal')\n\t\t\t\t} else {\n\t\t\t\t\tif (x == curNode.children[curNode._last_selected].move.x && y == curNode.children[curNode._last_selected].move.y) {\n\t\t\t\t\t\tthis.playType = 'normal'\n\t\t\t\t\t\tthis.player.next(curNode._last_selected)\n\t\t\t\t\t\tthis.playcb && this.playcb(x, y, 'normal')\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar node = new WGo.KNode({\n\t\t\t\t\t\t\tparent: curNode,\n\t\t\t\t\t\t\tchildren: [curNode.children[curNode._last_selected]],\n\t\t\t\t\t\t\tmove: {\n\t\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\t\ty: y,\n\t\t\t\t\t\t\t\tc: curColor\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t_edited: true,\n\t\t\t\t\t\t\t_last_selected: curNode._last_selected\n\t\t\t\t\t\t})\n\t\t\t\t\t\tcurNode.children[curNode._last_selected].parent = node\n\t\t\t\t\t\tcurNode.children[curNode._last_selected] = node\n\t\t\t\t\t\tthis.player.next(curNode._last_selected)\n\t\t\t\t\t\tthis.playType = 'normal'\n\t\t\t\t\t\tthis.playcb && this.playcb(x, y, 'insert')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase 'preplay':\n\t\t\t\tthis.board.addObject([{\n\t\t\t\t\tx: x,\n\t\t\t\t\ty: y,\n\t\t\t\t\tc: curColor,\n\t\t\t\t\ttype: 'GLSQ'\n\t\t\t\t}])\n\t\t\t\tthis.preplayMove = {\n\t\t\t\t\tx: x,\n\t\t\t\t\ty: y,\n\t\t\t\t\tc: curColor\n\t\t\t\t}\n\t\t\t\tthis.playcb && this.playcb(x, y, 'preplay')\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tWGo.Player.Editable.prototype.addLastNode = function(move) {\n\t\tvar curColor = this.player.kifuReader.game.turn\n\t\tif (!isNaN(move.c)) curColor = move.c\n\t\tvar lastNode = this.player.kifu.getLastNode()\n\t\tvar stone = {\n\t\t\tx: move.x,\n\t\t\ty: move.y,\n\t\t\tc: curColor\n\t\t}\n\t\tif (move.x == -1 || move.y == -1) {\n\t\t\tstone = {\n\t\t\t\tpass: true,\n\t\t\t\tc: curColor\n\t\t\t}\n\t\t}\n\t\tlastNode.appendChild(new WGo.KNode({\n\t\t\tmove: stone,\n\t\t\t_edited: true\n\t\t}))\n\t\tthis.player.kifuReader.kifu.nodeCount++\n\t}\n\n\tWGo.Player.Editable.prototype.pass = function(x, y, c) {\n\t\tx = x || -1\n \ty = y || -1\n\t\tif (this.player.frozen) return\n\t\tthis.player.kifuReader.node.appendChild(new WGo.KNode({\n\t\t\tmove: {\n\t\t\t\tpass: true,\n\t\t\t\tc: c || this.player.kifuReader.game.turn\n\t\t\t},\n\t\t\t_edited: true\n\t\t}))\n\t\tthis.player.kifuReader.kifu.nodeCount++\n\t\tthis.player.next(this.player.kifuReader.node.children.length - 1)\n\t\tthis.playcb && this.playcb(x, y, 'pass')\n\t}\n\n\tif (WGo.BasicPlayer && WGo.BasicPlayer.component.Control) {\n\t\tWGo.BasicPlayer.component.Control.menu.push({\n\t\t\tconstructor: WGo.BasicPlayer.control.MenuItem,\n\t\t\targs: {\n\t\t\t\tname: 'editmode',\n\t\t\t\ttogglable: true,\n\t\t\t\tclick: function(player) {\n\t\t\t\t\tthis._editable = this._editable || new WGo.Player.Editable(player, player.board)\n\t\t\t\t\tthis._editable.set(!this._editable.editMode)\n\t\t\t\t\treturn this._editable.editMode\n\t\t\t\t},\n\t\t\t\tinit: function(player) {\n\t\t\t\t\tvar _this = this\n\t\t\t\t\tplayer.addEventListener('frozen', function(e) {\n\t\t\t\t\t\t_this._disabled = _this.disabled\n\t\t\t\t\t\tif (!_this.disabled) _this.disable()\n\t\t\t\t\t})\n\t\t\t\t\tplayer.addEventListener('unfrozen', function(e) {\n\t\t\t\t\t\tif (!_this._disabled) _this.enable()\n\t\t\t\t\t\tdelete _this._disabled\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tWGo.i18n.en['editmode'] = 'Edit mode'\n})(WGo)\n","/**\n * Created by larry on 2016/12/30.\n * display marks move in board\n */\n(function (WGo) {\n\t\"use strict\";\n\t/*\n\t * add solid triangle for show\n\t */\n\tWGo.Board.drawHandlers['TRS'] = WGo.Board.drawHandlers['TR'] = {\n\t\tstone: {\n\t\t\tdraw: function (args, board) {\n\t\t\t\tvar xr = board.getX(args.x),\n\t\t\t\t\tyr = board.getY(args.y),\n\t\t\t\t\tsr = board.stoneRadius;\n\n\t\t\t\t//this.strokeStyle =\"red\";// args.c || get_markup_color(board, args.x, args.y);\n\t\t\t\t//this.lineWidth = args.lineWidth || board.lineWidth || 1;\n\t\t\t\tthis.fillStyle = \"#FF0000\";\n\t\t\t\tthis.beginPath();\n\t\t\t\tthis.moveTo(xr - 0.5, yr - 0.5 - Math.round(sr / 2));\n\t\t\t\tthis.lineTo(Math.round(xr - sr / 2) - 0.5, Math.round(yr + sr / 3) + 0.5);\n\t\t\t\tthis.lineTo(Math.round(xr + sr / 2) + 0.5, Math.round(yr + sr / 3) + 0.5);\n\t\t\t\tthis.closePath();\n\t\t\t\tthis.fill();\n\t\t\t\t//this.stroke();\n\t\t\t}\n\t\t}\n\t}\n\tWGo.Board.drawHandlers['RMD'] = {\n\t\tstone: {\n\t\t\tdraw: function (args, board) {\n\t\t\t\tvar xr = board.getX(args.x),\n\t\t\t\t\tyr = board.getY(args.y),\n\t\t\t\t\tsr = board.stoneRadius;\n\t\t\t\tvar radgrad = this.createRadialGradient(xr - sr / 10, yr, 0, xr - sr / 10, yr, sr);\n\t\t\t\tradgrad.addColorStop(0, 'rgba(255,0,0,1)');\n\t\t\t\tradgrad.addColorStop(1, 'rgba(255,0,0,0.2)');\n\t\t\t\tthis.beginPath();\n\t\t\t\tthis.fillStyle = radgrad;\n\t\t\t\tthis.arc(xr - board.ls, yr - board.ls, Math.max(0, sr - 0.5), 0, 2 * Math.PI, true);\n\t\t\t\tthis.fill();\n\t\t\t}\n\t\t}\n\t}\n\n\tWGo.Board.drawHandlers['GMD'] = {\n\t\tstone: {\n\t\t\tdraw: function (args, board) {\n\t\t\t\tvar xr = board.getX(args.x),\n\t\t\t\t\tyr = board.getY(args.y),\n\t\t\t\t\tsr = board.stoneRadius;\n\t\t\t\tvar radgrad = this.createRadialGradient(xr - sr / 10, yr, 0, xr - sr / 10, yr, sr);\n\t\t\t\tradgrad.addColorStop(0, 'rgba(0,255,0,1)');\n\t\t\t\tradgrad.addColorStop(1, 'rgba(0,255,0,0.2)');\n\t\t\t\tthis.beginPath();\n\t\t\t\tthis.fillStyle = radgrad;\n\t\t\t\tthis.arc(xr - board.ls, yr - board.ls, Math.max(0, sr - 0.5), 0, 2 * Math.PI, true);\n\t\t\t\tthis.fill();\n\t\t\t}\n\t\t}\n\t}\n\n\tvar theme_variable = function (key, board) {\n\t\treturn typeof board.theme[key] == \"function\" ? board.theme[key](board) : board.theme[key];\n\t}\n\tvar get_markup_color = function (board, x, y) {\n\t\tif (board.obj_arr[x][y][0].c == WGo.B) return theme_variable(\"markupBlackColor\", board);\n\t\telse if (board.obj_arr[x][y][0].c == WGo.W) return theme_variable(\"markupWhiteColor\", board);\n\t\treturn theme_variable(\"markupNoneColor\", board);\n\t}\n\tvar _CrNum = null;\n\tWGo.Board.drawHandlers['LB'] = {\n\t\tstone: {\n\t\t\tdraw: function (args, board) {\n\t\t\t\tvar xr = board.getX(args.x),\n\t\t\t\t\tyr = board.getY(args.y),\n\t\t\t\t\tsr = board.stoneRadius,\n\t\t\t\t\tfont = args.font || theme_variable(\"font\", board) || \"\";\n\t\t\t\tthis.fillStyle = args.c || get_markup_color(board, args.x, args.y);\n\t\t\t\tif (args.text.length == 1) this.font = Math.round(sr * 1.5) + \"px \" + font;\n\t\t\t\telse if (args.text.length == 2) this.font = Math.round(sr * 1.2) + \"px \" + font;\n\t\t\t\telse this.font = Math.round(sr) + \"px \" + font;\n\t\t\t\tthis.beginPath();\n\t\t\t\tthis.textBaseline = \"middle\";\n\t\t\t\tthis.textAlign = \"center\";\n\t\t\t\tthis.fillText(args.text, xr, yr, 2 * sr);\n\t\t\t\tif (args.addCr) {\n\t\t\t\t\t_CrNum = args.text;\n\t\t\t\t\tthis.fillStyle = \"#FF0000\";\n\t\t\t\t\tthis.beginPath();\n\t\t\t\t\tthis.moveTo(xr - 0.5, yr + 0.5 + Math.round(sr / 1.2));\n\t\t\t\t\tthis.lineTo(Math.round(xr - sr / 1.5) - 0.5, Math.round(yr + sr / 2) + 0.5);\n\t\t\t\t\tthis.lineTo(Math.round(xr + sr / 1.5) + 0.5, Math.round(yr + sr / 2) + 0.5);\n\t\t\t\t\tthis.closePath();\n\t\t\t\t\tthis.fill();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}\n\tvar Marker = {};\n\tvar defConfig = {\n\t\tmarkerStyle: 'TRS', //display style\n\t\tmarkerNum: 1, // Set to specify how many items should be displayed at once. from back to front\n\t\tlastMoveColor: 'red',\n\t\tstart: 0,\n\t\tbranchPath: -1,\n\t}\n\n\tMarker = function (player, board, config) {\n\t\tthis.player = player;\n\t\tthis.board = board;\n\t\tthis.config = config || {};\n\t\tfor (var key in defConfig)\n\t\t\tif (this.config[key] === undefined && defConfig[key] !== undefined) this.config[key] = defConfig[key];\n\t\tthis.init();\n\t}\n\n\tMarker.prototype = {\n\t\tinit: function () {\n\t\t\tthis.poss = new WGo.Position(this.player.kifu.size);\n\t\t\tthis._bindEvent();\n\t\t},\n\t\tclearDefaultSytle: function () {\n\t\t\tvar node = this.player.kifuReader.node;\n\t\t\tif (node.move) {\n\t\t\t\tthis.board.removeObject({\n\t\t\t\t\tx: node.move.x,\n\t\t\t\t\ty: node.move.y,\n\t\t\t\t\ttype: 'CR'\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t_bindEvent: function () {\n\t\t\tvar self = this;\n\t\t\tthis.player.addEventListener('update', function (e) {\n\t\t\t\tself.showMarker(e);\n\t\t\t});\n\t\t},\n\t\tclearMarker: function () {\n\t\t\tfor (var x = 0; x < this.player.kifu.size; x++) {\n\t\t\t\tfor (var y = 0; y < this.player.kifu.size; y++) {\n\t\t\t\t\tvar num = this.poss.get(x, y);\n\t\t\t\t\tif (num > 0)\n\t\t\t\t\t\tthis.board.removeObject({\n\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\ty: y,\n\t\t\t\t\t\t\ttype: this.config.markerStyle\n\t\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t},\n\t\tswitchMaker: function (config) {\n\t\t\tthis.clearMarker();\n\t\t\tfor (var key in config) this.config[key] = config[key];\n\t\t\tvar curPath = this.player.kifuReader.path.m\n\t\t\tthis.player.first();\n\t\t\tthis.player.goTo(curPath);\n\t\t},\n\t\tcomparePosition: function (position) {\n\t\t\tvar add = [],\n\t\t\t\tremove = [];\n\t\t\tfor (var x = 0; x < this.player.kifu.size; x++) {\n\t\t\t\tfor (var y = 0; y < this.player.kifu.size; y++) {\n\t\t\t\t\tvar oldNum = this.poss.get(x, y),\n\t\t\t\t\t\tcurNum = position.get(x, y);\n\t\t\t\t\tif (oldNum > 0 && curNum > 0) {\n\t\t\t\t\t\tif (oldNum != curNum) {\n\t\t\t\t\t\t\tadd.push({\n\t\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\t\ty: y,\n\t\t\t\t\t\t\t\ttext: curNum\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tremove.push({\n\t\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\t\ty: y,\n\t\t\t\t\t\t\t\ttext: oldNum\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (oldNum > 0 && curNum == 0) {\n\t\t\t\t\t\tremove.push({\n\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\ty: y,\n\t\t\t\t\t\t\ttext: oldNum\n\t\t\t\t\t\t})\n\t\t\t\t\t} else if (oldNum == 0 && curNum > 0) {\n\t\t\t\t\t\tadd.push({\n\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\ty: y,\n\t\t\t\t\t\t\ttext: curNum\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tif (_CrNum && _CrNum == curNum) {\n\t\t\t\t\t\tremove.push({\n\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\ty: y,\n\t\t\t\t\t\t\ttext: curNum\n\t\t\t\t\t\t})\n\t\t\t\t\t\tadd.push({\n\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\ty: y,\n\t\t\t\t\t\t\ttext: curNum\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tif (curNum == this.player.kifuReader.path.m) {\n\t\t\t\t\t\tadd.push({\n\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\ty: y,\n\t\t\t\t\t\t\ttext: curNum\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.poss = position.clone();\n\t\t\treturn {\n\t\t\t\tadd: add,\n\t\t\t\tremove: remove\n\t\t\t}\n\t\t},\n\t\tgetPosition: function (position, node) {\n\t\t\tvar poss = new WGo.Position(this.player.kifu.size),\n\t\t\t\tbranchNum = 0;\n\t\t\tif (this.config.branchPath != -1)\n\t\t\t\tbranchNum = this.config.branchPath;\n\t\t\tvar num = this.player.kifuReader.path.m - branchNum - this.config.start,\n\t\t\t\ttempMarknum = this.config.markerNum == 0 ? num : this.config.markerNum;\n\t\t\twhile (node.move) {\n\t\t\t\tvar x = node.move.x;\n\t\t\t\tvar y = node.move.y;\n\t\t\t\tif (position.get(x, y) != 0 && (!poss.get(x, y))) {\n\t\t\t\t\tposs.set(x, y, num);\n\t\t\t\t}\n\t\t\t\tnum--;\n\t\t\t\ttempMarknum--;\n\t\t\t\tnode = node.parent;\n\t\t\t\tif (tempMarknum <= 0) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (num <= 0) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn poss;\n\t\t},\n\t\tshowMarker: function (e) {\n\t\t\tvar node = this.player.kifuReader.node;\n\t\t\tvar poss = this.getPosition(e.position.clone(), node)\n\t\t\tvar result = this.comparePosition(poss);\n\t\t\tvar temp = [];\n\t\t\tresult.remove.forEach(function (v, i) {\n\t\t\t\tthis.board.removeObject({\n\t\t\t\t\tx: v.x,\n\t\t\t\t\ty: v.y,\n\t\t\t\t\ttype: this.config.markerStyle\n\t\t\t\t});\n\t\t\t}.bind(this))\n\t\t\tresult.add.forEach(function (v, i) {\n\t\t\t\tif (v.text > 0) {\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\tx: v.x,\n\t\t\t\t\t\ty: v.y,\n\t\t\t\t\t\ttext: v.text,\n\t\t\t\t\t\ttype: this.config.markerStyle\n\t\t\t\t\t};\n\t\t\t\t\tvar branchNum = 0;\n\t\t\t\t\tif (this.config.branchPath != -1)\n\t\t\t\t\t\tbranchNum = this.config.branchPath;\n\t\t\t\t\tif (v.text == this.player.kifuReader.path.m - branchNum&&this.config.lastMoveColor!=\"\") {\n\t\t\t\t\t\tdata.addCr = true;\n\t\t\t\t\t}\n\t\t\t\t\ttemp.push(data)\n\t\t\t\t}\n\t\t\t}.bind(this))\n\t\t\tfor (var i = 0; i < temp.length; i++) {\n\t\t\t\tthis.board.addObject(temp[i])\n\t\t\t}\n\t\t},\n\t}\n\tWGo.Player.Marker = Marker\n})(WGo)","\n\n","/**\n * This extension handles go game records(kifu). In WGo kifu is stored in JSON. Kifu structure example:\n *\n * JGO proposal = {\n *\t size: 19,\n *\t info: {\n *\t \tblack: {name:\"Lee Chang-Ho\", rank:\"9p\"},\n *\t \twhite: {name:\"Lee Sedol\", rank:\"9p\"},\n *\t \tkomi: 6.5,\n * },\n *\t game: [\n *\t {B:\"mm\"},\n * \t {W:\"nn\"},\n *\t {B:\"cd\"},\n * {},\n * ]\n * }\n *\n */\n\n(function (WGo, undefined) {\n 'use strict'\n\n var recursive_clone = function (node) {\n var n = new KNode(JSON.parse(JSON.stringify(node.getProperties())))\n for (var ch in node.children) {\n n.appendChild(recursive_clone(node.children[ch]))\n }\n return n\n }\n\n var find_property = function (prop, node) {\n var res\n if (node[prop] !== undefined) return node[prop]\n for (var ch in node.children) {\n res = find_property(prop, node.children[ch])\n if (res) return res\n }\n return false\n }\n\n var recursive_save = function (gameTree, node) {\n gameTree.push(JSON.parse(JSON.stringify(node.getProperties())))\n if (node.children.length > 1) {\n var nt = []\n for (var i = 0; i < node.children.length; i++) {\n var t = []\n recursive_save(t, node.children[i])\n nt.push(t)\n }\n gameTree.push(nt)\n } else if (node.children.length) {\n recursive_save(gameTree, node.children[0])\n }\n }\n\n var recursive_save2 = function (gameTree, node) {\n var anode = node\n var tnode\n\n for (var i = 1; i < gameTree.length; i++) {\n if (gameTree[i].constructor == Array) {\n for (var j = 0; j < gameTree[i].length; j++) {\n tnode = new KNode(gameTree[i][j][0])\n anode.appendChild(tnode)\n recursive_save2(gameTree[i][j], tnode)\n }\n } else {\n tnode = new KNode(gameTree[i])\n anode.insertAfter(tnode)\n anode = tnode\n }\n }\n }\n\n var sgf_escape = function (text) {\n if (typeof text == 'string') return text.replace(/\\\\/g, '\\\\\\\\').replace(/]/g, '\\\\]')\n else return text\n }\n\n var a_char = 'a'.charCodeAt(0)\n\n var sgf_coordinates = function (x, y) {\n return String.fromCharCode(a_char + x) + String.fromCharCode(a_char + y)\n }\n\n var sgf_write_group_desc = function (prop, values, output) {\n if (!values.length) return\n for (var i in values) {\n output.sgf = '[' + values[i] + ']' + output.sgf\n }\n output.sgf = prop + output.sgf\n }\n\n var sgf_write_group = function (prop, values, output) {\n if (!values.length) return\n\n output.sgf += prop\n for (var i in values) {\n output.sgf += '[' + values[i] + ']'\n }\n }\n\n var sgf_write_node = function (node, output) {\n // move\n if (node.move) {\n var move = ''\n if (!node.move.pass) move = sgf_coordinates(node.move.x, node.move.y)\n\n if (node.move.c == WGo.B) output.sgf += 'B[' + move + ']'\n else output.sgf += 'W[' + move + ']'\n }\n\n // setup\n if (node.setup) {\n var AB = []\n var AW = []\n var AE = []\n\n for (var i in node.setup) {\n if (node.setup[i].c == WGo.B) AB.push(sgf_coordinates(node.setup[i].x, node.setup[i].y))\n else if (node.setup[i].c == WGo.W) AW.push(sgf_coordinates(node.setup[i].x, node.setup[i].y))\n else AE.push(sgf_coordinates(node.setup[i].x, node.setup[i].y))\n }\n\n sgf_write_group('AB', AB, output)\n sgf_write_group('AW', AW, output)\n sgf_write_group('AE', AE, output)\n }\n\n // markup\n if (node.markup) {\n var markup = {}\n\n for (var i in node.markup) {\n markup[node.markup[i].type] = markup[node.markup[i].type] || []\n if (node.markup[i].type == 'LB') markup['LB'].push(sgf_coordinates(node.markup[i].x, node.markup[i].y) + ':' + sgf_escape(node.markup[i].text))\n else markup[node.markup[i].type].push(sgf_coordinates(node.markup[i].x, node.markup[i].y))\n }\n\n for (var key in markup) {\n sgf_write_group(key, markup[key], output)\n }\n }\n\n // other\n var props = node.getProperties()\n\n for (var key in props) {\n if (typeof props[key] == 'object') continue\n if (key == 'turn') output.sgf += 'PL[' + (props[key] == WGo.B ? 'B' : 'W') + ']'\n else if (key == 'comment') output.sgf += 'C[' + sgf_escape(props[key]) + ']'\n else output.sgf += key + '[' + sgf_escape(props[key]) + ']'\n }\n\n if (node.children.length == 1) {\n output.sgf += ';'\n sgf_write_node(node.children[0], output)\n } else if (node.children.length > 1) {\n for (var key in node.children) {\n sgf_write_variantion(node.children[key], output)\n }\n }\n }\n\n var sgf_write_variantion = function (node, output) {\n output.sgf += '(;'\n sgf_write_node(node, output)\n output.sgf += ')'\n }\n\n /**\n * Kifu class - for storing go game record and easy manipulation with it\n */\n\n var Kifu = function () {\n this.size = 19\n this.info = {}\n this.root = new KNode()\n this.nodeCount = 0\n this.propertyCount = 0\n }\n\n Kifu.prototype = {\n constructor: Kifu,\n clone: function () {\n var clone = new Kifu()\n clone.size = this.size\n clone.info = JSON.parse(JSON.stringify(this.info))\n clone.root = recursive_clone(this.root)\n clone.nodeCount = this.nodeCount\n clone.propertyCount = this.propertyCount\n return clone\n },\n hasComments: function () {\n return !!find_property('comment', this.root)\n }\n }\n\n /**\n * Create kifu object from SGF string\n */\n\n Kifu.fromSgf = function (sgf) {\n return WGo.SGF.parse(sgf)\n }\n\n /**\n * Create kifu object from JGO\n */\n\n Kifu.fromJGO = function (arg) {\n var jgo = typeof arg == 'string' ? JSON.parse(arg) : arg\n var kifu = new Kifu()\n kifu.info = JSON.parse(JSON.stringify(jgo.info))\n kifu.size = jgo.size\n kifu.nodeCount = jgo.nodeCount\n kifu.propertyCount = jgo.propertyCount\n\n kifu.root = new KNode(jgo.game[0])\n recursive_save2(jgo.game, kifu.root)\n\n return kifu\n }\n\n // 纯净版SGF(没有解说)\n Kifu.prototype.pureSgf = function () {\n var output = {\n sgf: '(;'\n }\n var root_props = {}\n if (this.size) root_props.SZ = this.size\n for (var key in root_props) {\n if (root_props[key]) output.sgf += key + '[' + root_props[key] + ']'\n }\n write_node_sgf(this.root, output)\n output.sgf += ')'\n return output.sgf\n }\n Kifu.prototype.getLastNode = function () {\n var curNode = this.root\n while (curNode.children.length > 0) {\n var selected = curNode._last_selected || 0\n curNode = curNode.children[selected]\n }\n return curNode\n }\n // 校验是否是最后一个子并删除\n Kifu.prototype.deleteLastNode = function (player, move) {\n var lastNode = player.kifu.getLastNode()\n if (move.x == lastNode.move.x && move.y == lastNode.move.y) {\n lastNode.parent.children = []\n player.kifu.nodeCount--\n return true\n }\n return false\n }\n // 获得纯净sgf(没有分支,没有头,没有解说)\n Kifu.prototype.cleanSgf = function () {\n var output = {\n sgf: '(;'\n }\n var root_props = {}\n\n // other info\n for (var key in this.info) {\n if (key == 'black') {\n if (this.info.black.name) root_props.PB = sgf_escape(this.info.black.name)\n if (this.info.black.rank) root_props.BR = sgf_escape(this.info.black.rank)\n if (this.info.black.team) root_props.BT = sgf_escape(this.info.black.team)\n } else if (key == 'white') {\n if (this.info.white.name) root_props.PW = sgf_escape(this.info.white.name)\n if (this.info.white.rank) root_props.WR = sgf_escape(this.info.white.rank)\n if (this.info.white.team) root_props.WT = sgf_escape(this.info.white.team)\n } else root_props[key] = sgf_escape(this.info[key])\n }\n\n // board size\n if (this.size) root_props.SZ = this.size\n // add missing info\n if (!root_props.AP) root_props.AP = '对弈平台'\n if (!root_props.FF) root_props.FF = '4'\n if (!root_props.GM) root_props.GM = '1'\n if (!root_props.CA) root_props.CA = 'UTF-8'\n\n // write root\n for (var key in root_props) {\n if (root_props[key]) output.sgf += key + '[' + root_props[key] + ']'\n }\n var node = this.root\n while (node.children.length > 0) {\n node = node.children[0]\n if (node.move) {\n var move = ''\n if (!node.move.pass) move = sgf_coordinates(node.move.x, node.move.y)\n else move = 'tt'\n if (node.move.c == WGo.B) output.sgf += ';B[' + move + ']'\n else output.sgf += ';W[' + move + ']'\n }\n if (node.setup) {\n var AB = []\n var AW = []\n var AE = []\n for (var i in node.setup) {\n if (node.setup[i].c == WGo.B) AB.push(sgf_coordinates(node.setup[i].x, node.setup[i].y))\n else if (node.setup[i].c == WGo.W) AW.push(sgf_coordinates(node.setup[i].x, node.setup[i].y))\n else AE.push(sgf_coordinates(node.setup[i].x, node.setup[i].y))\n }\n sgf_write_group_desc('AB', AB, output)\n sgf_write_group_desc('AW', AW, output)\n sgf_write_group_desc('AE', AE, output)\n }\n }\n\n output.sgf += ')'\n return output.sgf\n }\n\n // 形式判断生产当前盘面sgf\n Kifu.prototype.scoreSgf = function (node, KM, HA) {\n var output = {\n sgf: ')'\n }\n while (node) {\n if (node.move) {\n var move = ''\n if (!node.move.pass) move = sgf_coordinates(node.move.x, node.move.y)\n else move = 'tt'\n if (node.move.c == WGo.B) output.sgf = ';B[' + move + ']' + output.sgf\n else output.sgf = ';W[' + move + ']' + output.sgf\n }\n //\t\t\tif(node.setup) {\n //\t\t\t\tvar AB = [];\n //\t\t\t\tvar AW = [];\n //\t\t\t\tvar AE = [];\n //\t\t\t\tfor(var i in node.setup) {\n //\t\t\t\t\tif(node.setup[i].c == WGo.B) output.sgf=\";B[\" + sgf_coordinates(node.setup[i].x, node.setup[i].y) + \"]\" + output.sgf;\n //\t\t\t\t\telse if(node.setup[i].c == WGo.W) output.sgf=\";W[\" + sgf_coordinates(node.setup[i].x, node.setup[i].y) + \"]\" + output.sgf;\n //\t\t\t\t}\n //\t\t\t}\n\n if (node.setup) {\n var AB = []\n var AW = []\n var AE = []\n for (var i in node.setup) {\n if (node.setup[i].c == WGo.B) AB.push(sgf_coordinates(node.setup[i].x, node.setup[i].y))\n else if (node.setup[i].c == WGo.W) AW.push(sgf_coordinates(node.setup[i].x, node.setup[i].y))\n else AE.push(sgf_coordinates(node.setup[i].x, node.setup[i].y))\n }\n sgf_write_group_desc('AB', AB, output)\n sgf_write_group_desc('AW', AW, output)\n sgf_write_group_desc('AE', AE, output)\n }\n\n node = node.parent\n }\n\n var root_props = {}\n KM = isNaN(KM) ? 7.5 : KM\n HA = isNaN(HA) ? 0 : HA\n KM = HA > 0 ? 0 : KM\n root_props.HA = HA\n root_props.KM = KM\n if (this.size) root_props.SZ = this.size\n if (this.info.RU)root_props.RU = this.info.RU\n for (var key in root_props) {\n if (root_props[key] || root_props[key] == 0) output.sgf = key + '[' + root_props[key] + ']' + output.sgf\n }\n output.sgf = '(;' + output.sgf\n return output.sgf\n }\n\n // 获取当前不含无序\n Kifu.prototype.noSetupsgf = function (node) {\n var output = {\n sgf: ')'\n }\n while (node) {\n if (node.move) {\n var move = ''\n if (!node.move.pass) move = sgf_coordinates(node.move.x, node.move.y)\n else move = 'tt'\n if (node.move.c == WGo.B) output.sgf = ';B[' + move + ']' + output.sgf\n else output.sgf = ';W[' + move + ']' + output.sgf\n }\n node = node.parent\n }\n output.sgf = '(;' + output.sgf\n return output.sgf\n }\n\n // 获得禁着点\n Kifu.prototype.getForbidden = function (player) {\n var size = this.size || 19\n var p = player.kifuReader.game.getPosition()\n var bs = []\n for (var i = 0; i < size; i++) {\n for (var j = 0; j < size; j++) {\n var s = p.get(j, i)\n var x1 = String.fromCharCode(j + 97)\n var y1 = String.fromCharCode(i + 97)\n if (s == 1 || s == -1) {\n bs.push(x1 + '' + y1)\n }\n }\n }\n return bs.join(',')\n }\n\n var write_node_sgf = function (node, output) {\n if (node.move) {\n var move = ''\n if (!node.move.pass) move = sgf_coordinates(node.move.x, node.move.y)\n if (node.move.c == WGo.B) output.sgf += 'B[' + move + ']'\n else output.sgf += 'W[' + move + ']'\n }\n if (node.setup) {\n var AB = []\n var AW = []\n var AE = []\n for (var i in node.setup) {\n if (node.setup[i].c == WGo.B) AB.push(sgf_coordinates(node.setup[i].x, node.setup[i].y))\n else if (node.setup[i].c == WGo.W) AW.push(sgf_coordinates(node.setup[i].x, node.setup[i].y))\n else AE.push(sgf_coordinates(node.setup[i].x, node.setup[i].y))\n }\n sgf_write_group('AB', AB, output)\n sgf_write_group('AW', AW, output)\n sgf_write_group('AE', AE, output)\n }\n if (node.markup) {\n var markup = {}\n for (var i in node.markup) {\n markup[node.markup[i].type] = markup[node.markup[i].type] || []\n if (node.markup[i].type == 'LB') markup['LB'].push(sgf_coordinates(node.markup[i].x, node.markup[i].y) + ':' + sgf_escape(node.markup[i].text))\n else markup[node.markup[i].type].push(sgf_coordinates(node.markup[i].x, node.markup[i].y))\n }\n for (var key in markup) {\n sgf_write_group(key, markup[key], output)\n }\n }\n var props = node.getProperties()\n for (var key in props) {\n if (typeof props[key] == 'object') continue\n if (key == 'turn') output.sgf += 'PL[' + (props[key] == WGo.B ? 'B' : 'W') + ']'\n else if (key == 'comment') output.sgf += 'C[' + sgf_escape(props[key]) + ']'\n }\n if (node.children.length == 1) {\n output.sgf += ';'\n sgf_write_node(node.children[0], output)\n } else if (node.children.length > 1) {\n for (var key in node.children) {\n sgf_write_variantion(node.children[key], output)\n }\n }\n }\n /**\n * Return SGF string from kifu object\n */\n Kifu.prototype.toSgf = function () {\n var output = {\n sgf: '(;'\n }\n var root_props = {}\n\n // other info\n for (var key in this.info) {\n if (key == 'black') {\n if (this.info.black.name) root_props.PB = sgf_escape(this.info.black.name)\n if (this.info.black.rank) root_props.BR = sgf_escape(this.info.black.rank)\n if (this.info.black.team) root_props.BT = sgf_escape(this.info.black.team)\n } else if (key == 'white') {\n if (this.info.white.name) root_props.PW = sgf_escape(this.info.white.name)\n if (this.info.white.rank) root_props.WR = sgf_escape(this.info.white.rank)\n if (this.info.white.team) root_props.WT = sgf_escape(this.info.white.team)\n } else root_props[key] = sgf_escape(this.info[key])\n }\n\n // board size\n if (this.size) root_props.SZ = this.size\n\n // add missing info\n if (!root_props.AP) root_props.AP = '对弈平台'\n if (!root_props.FF) root_props.FF = '4'\n if (!root_props.GM) root_props.GM = '1'\n if (!root_props.CA) root_props.CA = 'UTF-8'\n\n // write root\n for (var key in root_props) {\n if (root_props[key]) output.sgf += key + '[' + root_props[key] + ']'\n }\n\n sgf_write_node(this.root, output)\n output.sgf += ')'\n\n return output.sgf\n }\n\n /**\n * Return JGO from kifu object\n */\n\n Kifu.prototype.toJGO = function (stringify) {\n var jgo = {}\n jgo.size = this.size\n jgo.info = JSON.parse(JSON.stringify(this.info))\n jgo.nodeCount = this.nodeCount\n jgo.propertyCount = this.propertyCount\n jgo.game = []\n recursive_save(jgo.game, this.root)\n if (stringify) return JSON.stringify(jgo)\n else return jgo\n }\n\n var player_formatter = function (value) {\n var str\n if (value.name) {\n str = WGo.filterHTML(value.name)\n if (value.rank) str += ' (' + WGo.filterHTML(value.rank) + ')'\n if (value.team) str += ', ' + WGo.filterHTML(value.team)\n } else {\n if (value.team) str = WGo.filterHTML(value.team)\n if (value.rank) str += ' (' + WGo.filterHTML(value.rank) + ')'\n }\n return str\n }\n\n /**\n * Game information formatters. Each formatter is a function which somehow formats input text.\n */\n\n Kifu.infoFormatters = {\n black: player_formatter,\n white: player_formatter,\n TM: function (time) {\n if (time == 0) return WGo.t('none')\n\n var res, t = Math.floor(time / 60)\n\n if (t == 1) res = '1 ' + WGo.t('minute')\n else if (t > 1) res = t + ' ' + WGo.t('minutes')\n\n t = time % 60\n if (t == 1) res += ' 1 ' + WGo.t('second')\n else if (t > 1) res += ' ' + t + ' ' + WGo.t('seconds')\n\n return res\n },\n RE: function (res) {\n return '' + WGo.t('show') + ''\n }\n }\n\n /**\n * List of game information properties\n */\n\n Kifu.infoList = ['black', 'white', 'AN', 'CP', 'DT', 'EV', 'GN', 'GC', 'HA', 'ON', 'OT', 'RE', 'RO', 'RU', 'SO', 'TM', 'US', 'PC', 'KM','PB','PW']\n\n WGo.Kifu = Kifu\n\n var no_add = function (arr, obj, key) {\n for (var i = 0; i < arr.length; i++) {\n if (arr[i].x == obj.x && arr[i].y == obj.y) {\n arr[i][key] = obj[key]\n return\n }\n }\n arr.push(obj)\n }\n\n var no_remove = function (arr, obj) {\n if (!arr) return\n for (var i = 0; i < arr.length; i++) {\n if (arr[i].x == obj.x && arr[i].y == obj.y) {\n arr.splice(i, 1)\n return\n }\n }\n }\n\n /**\n * Node class of kifu game tree. It can contain move, setup or markup properties.\n *\n * @param {object} properties\n * @param {KNode} parent (null for root node)\n */\n\n var KNode = function (properties, parent) {\n this.parent = parent || null\n this.children = []\n // save all properties\n if (properties) { for (var key in properties) this[key] = properties[key] }\n }\n\n KNode.prototype = {\n constructor: KNode,\n\n /**\n * Get node's children specified by index. If it doesn't exist, method returns null.\n */\n\n getChild: function (ch) {\n var i = ch || 0\n if (this.children[i]) return this.children[i]\n else return null\n },\n\n /**\n * Add setup property.\n *\n * @param {object} setup object with structure: {x:, y:, c:}\n */\n\n addSetup: function (setup) {\n this.setup = this.setup || []\n no_add(this.setup, setup, 'c')\n return this\n },\n\n /**\n * Remove setup property.\n *\n * @param {object} setup object with structure: {x:, y:}\n */\n\n removeSetup: function (setup) {\n no_remove(this.setup, setup)\n return this\n },\n\n /**\n * Add markup property.\n *\n * @param {object} markup object with structure: {x:, y:, type:}\n */\n\n addMarkup: function (markup) {\n this.markup = this.markup || []\n no_add(this.markup, markup, 'type')\n return this\n },\n\n /**\n * Remove markup property.\n *\n * @param {object} markup object with structure: {x:, y:}\n */\n\n removeMarkup: function (markup) {\n no_remove(this.markup, markup)\n return this\n },\n\n /**\n * Remove this node.\n * Node is removed from its parent and children are passed to parent.\n */\n\n remove: function () {\n var p = this.parent\n if (!p) throw new Exception('Root node cannot be removed')\n for (var i in p.children) {\n if (p.children[i] == this) {\n p.children.splice(i, 1)\n break\n }\n }\n p.children = p.children.concat(this.children)\n this.parent = null\n return p\n },\n\n /**\n * Insert node after this node. All children are passed to new node.\n */\n\n insertAfter: function (node) {\n for (var child in this.children) {\n this.children[child].parent = node\n }\n node.children = node.children.concat(this.children)\n node.parent = this\n this.children = [node]\n return node\n },\n\n /**\n * Append child node to this node.\n */\n\n appendChild: function (node) {\n node.parent = this\n this.children.push(node)\n return node\n },\n\n /**\n * Get properties as object.\n */\n\n getProperties: function () {\n var props = {}\n for (var key in this) {\n if (this.hasOwnProperty(key) && key != 'children' && key != 'parent' && key[0] != '_') props[key] = this[key]\n }\n return props\n }\n }\n\n WGo.KNode = KNode\n\n var pos_diff = function (old_p, new_p) {\n var size = old_p.size,\n add = [],\n remove = []\n\n for (var i = 0; i < size * size; i++) {\n if (old_p.schema[i] && !new_p.schema[i]) {\n remove.push({\n x: Math.floor(i / size),\n y: i % size\n })\n} else if (old_p.schema[i] != new_p.schema[i]) {\n add.push({\n x: Math.floor(i / size),\n y: i % size,\n c: new_p.schema[i]\n })\n}\n }\n\n return {\n add: add,\n remove: remove\n }\n }\n\n /**\n * KifuReader object is capable of reading a kifu nodes and executing them. It contains Game object with actual position.\n * Variable change contains last changes of position.\n * If parameter rememberPath is set, KifuReader will remember last selected child of all nodes.\n * If parameter allowIllegalMoves is set, illegal moves will be played instead of throwing an exception\n */\n\n var KifuReader = function (kifu, rememberPath, allowIllegalMoves) {\n this.kifu = kifu\n this.node = this.kifu.root\n this.allow_illegal = allowIllegalMoves || false\n this.game = new WGo.Game(this.kifu.size, this.allow_illegal ? 'NONE' : 'KO', this.allow_illegal, this.allow_illegal)\n this.path = {\n m: 0\n }\n\n if (this.kifu.info['HA'] && this.kifu.info['HA'] > 1) this.game.turn = WGo.W\n this.change = exec_node(this.game, this.node, true)\n\n if (rememberPath) this.rememberPath = true\n else this.rememberPath = false\n }\n\n var set_subtract = function (a, b) {\n var n = [],\n q\n for (var i in a) {\n q = true\n for (var j in b) {\n if (a[i].x == b[j].x && a[i].y == b[j].y) {\n q = false\n break\n }\n }\n if (q) n.push(a[i])\n }\n return n\n }\n\n var concat_changes = function (ch_orig, ch_new) {\n ch_orig.add = set_subtract(ch_orig.add, ch_new.remove).concat(ch_new.add)\n ch_orig.remove = set_subtract(ch_orig.remove, ch_new.add).concat(ch_new.remove)\n }\n\n // change game object according to node, return changes\n var exec_node = function (game, node, first) {\n if (node.parent) node.parent._last_selected = node.parent.children.indexOf(node)\n\n // handle moves nodes\n if (node.move != undefined) {\n if (node.move.pass) {\n game.pass(node.move.c)\n return {\n add: [],\n remove: []\n }\n } else {\n var res = game.play(node.move.x, node.move.y, node.move.c)\n if (typeof res == 'number') throw new InvalidMoveError(res, node)\n // we must check whether to add move (it can be suicide)\n for (var i in res) {\n if (res[i].x == node.move.x && res[i].y == node.move.y) {\n return {\n add: [],\n remove: res\n }\n }\n }\n return {\n add: [node.move],\n remove: res\n }\n }\n }\n // handle other(setup) nodes\n else {\n if (!first) game.pushPosition()\n\n var add = [],\n remove = []\n\n if (node.setup != undefined) {\n for (var i in node.setup) {\n if (node.setup[i].c) {\n game.setStone(node.setup[i].x, node.setup[i].y, node.setup[i].c)\n add.push(node.setup[i])\n } else {\n game.removeStone(node.setup[i].x, node.setup[i].y)\n remove.push(node.setup[i])\n }\n }\n }\n\n if (node.turn) game.turn = node.turn\n\n return {\n add: add,\n remove: remove\n }\n }\n }\n\n var exec_next = function (i) {\n if (i === undefined && this.rememberPath) i = this.node._last_selected\n i = i || 0\n var node = this.node.children[i]\n\n if (!node) return false\n\n var ch = exec_node(this.game, node)\n\n this.path.m++\n if (this.node.children.length > 1) this.path[this.path.m] = i\n\n this.node = node\n return ch\n }\n\n var exec_previous = function () {\n if (!this.node.parent) return false\n\n this.node = this.node.parent\n\n this.game.popPosition()\n if (this.node.turn) this.game.turn = this.node.turn\n\n if (this.path[this.path.m] !== undefined) delete this.path[this.path.m]\n this.path.m--\n\n return true\n }\n\n var exec_first = function () {\n // if(!this.node.parent) return;\n\n this.game.firstPosition()\n this.node = this.kifu.root\n\n this.path = {\n m: 0\n }\n\n if (this.kifu.info['HA'] && this.kifu.info['HA'] > 1) this.game.turn = WGo.W\n this.change = exec_node(this.game, this.node, true)\n }\n\n KifuReader.prototype = {\n constructor: KifuReader,\n\n /**\n * Go to next node and if there is a move play it.\n */\n\n next: function (i) {\n this.change = exec_next.call(this, i)\n return this\n },\n\n /**\n * Execute all nodes till the end.\n */\n\n last: function () {\n var ch\n this.change = {\n add: [],\n remove: []\n }\n while (ch = exec_next.call(this)) concat_changes(this.change, ch)\n return this\n },\n\n /**\n * Return to the previous position (redo actual node)\n */\n\n previous: function () {\n var old_pos = this.game.getPosition()\n exec_previous.call(this)\n this.change = pos_diff(old_pos, this.game.getPosition())\n return this\n },\n\n /**\n * Go to the initial position\n */\n\n first: function () {\n var old_pos = this.game.getPosition()\n exec_first.call(this)\n this.change = pos_diff(old_pos, this.game.getPosition())\n return this\n },\n\n /**\n * Go to position specified by path object\n */\n\n goTo: function (path) {\n if (path === undefined) return this\n\n var old_pos = this.game.getPosition()\n\n exec_first.call(this)\n\n var r\n\n for (var i = 0; i < path.m; i++) {\n if (!exec_next.call(this, path[i + 1])) {\n break\n }\n }\n\n this.change = pos_diff(old_pos, this.game.getPosition())\n return this\n },\n\n /**\n * Go to previous fork (a node with more than one child)\n */\n\n previousFork: function () {\n var old_pos = this.game.getPosition()\n while (exec_previous.call(this) && this.node.children.length == 1) {\n }\n ;\n this.change = pos_diff(old_pos, this.game.getPosition())\n return this\n },\n\n /**\n * Shortcut. Get actual position object.\n */\n\n getPosition: function () {\n return this.game.getPosition()\n },\n\n pass: function () {\n var c = 'B'\n if (this.game.turn == '-1') {\n c = 'W'\n }\n\n WGo.SGF.properties[c](this.kifu, this.node.appendChild(new KNode()), ['tt'], c)\n exec_node(this.game, this.node.children[0])\n this.game.turn = -this.game.turn\n this.next()\n this.kifu.nodeCount = this.kifu.nodeCount++\n },\n\n /**\n * Allow or disallow illegal moves to be played\n */\n\n allowIllegalMoves: function (b) {\n if (b) {\n this.game.allow_rewrite = true\n this.game.allow_suicide = true\n this.repeating = 'NONE'\n } else {\n this.game.allow_rewrite = false\n this.game.allow_suicide = false\n this.repeating = 'KO'\n }\n }\n }\n\n WGo.KifuReader = KifuReader\n\n // Class handling invalid moves in kifu\n var InvalidMoveError = function (code, node) {\n this.name = 'InvalidMoveError'\n this.message = 'Invalid move in kifu detected. '\n\n if (node.move && node.move.c !== undefined && node.move.x !== undefined && node.move.y !== undefined) {\n var letter = node.move.x\n if (node.move.x > 7) letter++\n letter = String.fromCharCode(letter + 65)\n this.message += 'Trying to play ' + (node.move.c == WGo.WHITE ? 'white' : 'black') + ' move on ' + String.fromCharCode(node.move.x + 65) + '' + (19 - node.move.y)\n } else this.message += \"Move object doesn't contain arbitrary attributes.\"\n\n if (code) {\n switch (code) {\n case 1:\n this.message += ', but these coordinates are not on board.'\n break\n case 2:\n this.message += ', but there already is a stone.'\n break\n case 3:\n this.message += ', but this move is a suicide.'\n break\n case 4:\n this.message += ', but this position already occured.'\n break\n }\n } else this.message += '.'\n }\n InvalidMoveError.prototype = new Error()\n InvalidMoveError.prototype.constructor = InvalidMoveError\n\n WGo.InvalidMoveError = InvalidMoveError\n\n WGo.i18n.en['show'] = 'show'\n WGo.i18n.en['res-show-tip'] = 'Click to show result.'\n})(WGo)\n"],"sourceRoot":""}