UNPKG

goban

Version:

[![License: Apache-2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/online-go/goban)

2 lines 346 kB
/*! For license information please see goban.min.js.LICENSE.txt */ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.goban=t():e.goban=t()}(self,(()=>(()=>{"use strict";var e={228:e=>{var t=Object.prototype.hasOwnProperty,i="~";function s(){}function o(e,t,i){this.fn=e,this.context=t,this.once=i||!1}function r(e,t,s,r,n){if("function"!=typeof s)throw new TypeError("The listener must be a function");var a=new o(s,r||e,n),l=i?i+t:t;return e._events[l]?e._events[l].fn?e._events[l]=[e._events[l],a]:e._events[l].push(a):(e._events[l]=a,e._eventsCount++),e}function n(e,t){0==--e._eventsCount?e._events=new s:delete e._events[t]}function a(){this._events=new s,this._eventsCount=0}Object.create&&(s.prototype=Object.create(null),(new s).__proto__||(i=!1)),a.prototype.eventNames=function(){var e,s,o=[];if(0===this._eventsCount)return o;for(s in e=this._events)t.call(e,s)&&o.push(i?s.slice(1):s);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(e)):o},a.prototype.listeners=function(e){var t=i?i+e:e,s=this._events[t];if(!s)return[];if(s.fn)return[s.fn];for(var o=0,r=s.length,n=new Array(r);o<r;o++)n[o]=s[o].fn;return n},a.prototype.listenerCount=function(e){var t=i?i+e:e,s=this._events[t];return s?s.fn?1:s.length:0},a.prototype.emit=function(e,t,s,o,r,n){var a=i?i+e:e;if(!this._events[a])return!1;var l,h,c=this._events[a],_=arguments.length;if(c.fn){switch(c.once&&this.removeListener(e,c.fn,void 0,!0),_){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,t),!0;case 3:return c.fn.call(c.context,t,s),!0;case 4:return c.fn.call(c.context,t,s,o),!0;case 5:return c.fn.call(c.context,t,s,o,r),!0;case 6:return c.fn.call(c.context,t,s,o,r,n),!0}for(h=1,l=new Array(_-1);h<_;h++)l[h-1]=arguments[h];c.fn.apply(c.context,l)}else{var d,u=c.length;for(h=0;h<u;h++)switch(c[h].once&&this.removeListener(e,c[h].fn,void 0,!0),_){case 1:c[h].fn.call(c[h].context);break;case 2:c[h].fn.call(c[h].context,t);break;case 3:c[h].fn.call(c[h].context,t,s);break;case 4:c[h].fn.call(c[h].context,t,s,o);break;default:if(!l)for(d=1,l=new Array(_-1);d<_;d++)l[d-1]=arguments[d];c[h].fn.apply(c[h].context,l)}}return!0},a.prototype.on=function(e,t,i){return r(this,e,t,i,!1)},a.prototype.once=function(e,t,i){return r(this,e,t,i,!0)},a.prototype.removeListener=function(e,t,s,o){var r=i?i+e:e;if(!this._events[r])return this;if(!t)return n(this,r),this;var a=this._events[r];if(a.fn)a.fn!==t||o&&!a.once||s&&a.context!==s||n(this,r);else{for(var l=0,h=[],c=a.length;l<c;l++)(a[l].fn!==t||o&&!a[l].once||s&&a[l].context!==s)&&h.push(a[l]);h.length?this._events[r]=1===h.length?h[0]:h:n(this,r)}return this},a.prototype.removeAllListeners=function(e){var t;return e?(t=i?i+e:e,this._events[t]&&n(this,t)):(this._events=new s,this._eventsCount=0),this},a.prototype.off=a.prototype.removeListener,a.prototype.addListener=a.prototype.on,a.prefixed=i,a.EventEmitter=a,e.exports=a},7925:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GobanCanvas=void 0;const s=i(3896),o=i(5862),r=i(4527),n=i(6512),a=i(1925),l=i(8619),h=i(7460),c=i(5336),_=i(2239),d={black:{},white:{}},u="#ff69b4";class m extends _.Goban{constructor(e,t){var i;super(e,t),this.__set_board_height=-1,this.__set_board_width=-1,this.ready_to_draw=!1,this.last_move_opacity=1,this.__borders_initialized=!1,this.autoplaying_puzzle_move=!1,this.byoyomi_label="",this.last_label_position={i:NaN,j:NaN},this.metrics={width:NaN,height:NaN,mid:NaN,offset:NaN},this.drawing_enabled=!0,this.themes={board:"Plain",black:"Plain",white:"Plain","removal-graphic":"x","removal-scale":1},this.theme_black_stones=[],this.theme_black_text_color=u,this.theme_blank_text_color=u,this.theme_faded_line_color=u,this.theme_faded_star_color=u,this.theme_line_color="",this.theme_star_color="",this.theme_stone_radius=10,this.theme_white_stones=[],this.theme_white_text_color=u,e.board_div?this.parent=e.board_div:(this.no_display=!0,this.parent=document.createElement("div")),this.title_div=e.title_div,this.board=(0,n.createDeviceScaledCanvas)(10,10),this.board.setAttribute("id","board-canvas"),this.board.className="StoneLayer",this.last_move_opacity=null!==(i=e.last_move_opacity)&&void 0!==i?i:1;const s=this.board.getContext("2d",{willReadFrequently:!0});if(!s)throw new Error("Failed to obtain drawing context for board");this.ctx=s,this.parent.appendChild(this.board),this.bindPointerBindings(this.board),this.move_tree_container=e.move_tree_container,this.handleShiftKey=e=>{try{e.shiftKey!==this.shift_key_is_down&&(this.shift_key_is_down=e.shiftKey,this.last_hover_square&&this.__drawSquare(this.last_hover_square.x,this.last_hover_square.y))}catch(e){console.error(e)}},window.addEventListener("keydown",this.handleShiftKey),window.addEventListener("keyup",this.handleShiftKey),this.setTheme(this.getSelectedThemes(),!0);let o=!0;const r=this.watchSelectedThemes((e=>{var t,i,s;this.engine&&("Custom"===e.black||"Custom"===e.white||e.board,null===(t=d.black)||void 0===t||delete t.Custom,null===(i=d.white)||void 0===i||delete i.Custom,null===(s=d.board)||void 0===s||delete s.Custom,this.setTheme(e,!!o),o=!1)}));this.on("destroy",(()=>r.remove())),this.engine=this.post_config_constructor(),this.emit("engine.updated",this.engine),this.ready_to_draw=!0,this.redraw(!0)}setLastMoveOpacity(e){this.last_move_opacity=e}enablePen(){this.attachPenCanvas()}disablePen(){this.detachPenCanvas()}destroy(){super.destroy(),this.board&&this.board.parentNode&&this.board.parentNode.removeChild(this.board),delete this.board,delete this.ctx,this.detachPenCanvas(),this.detachShadowLayer(),this.message_timeout&&(clearTimeout(this.message_timeout),delete this.message_timeout),window.removeEventListener("keydown",this.handleShiftKey),window.removeEventListener("keyup",this.handleShiftKey),this.theme_black_stones=[],this.theme_white_stones=[],delete this.theme_board,delete this.theme_black,delete this.theme_white,delete this.message_div,delete this.message_td,delete this.message_text,delete this.move_tree_container,delete this.move_tree_inner_container,delete this.move_tree_canvas,delete this.title_div}detachShadowLayer(){this.shadow_layer&&(this.shadow_layer.parentNode&&this.shadow_layer.parentNode.removeChild(this.shadow_layer),delete this.shadow_layer,delete this.shadow_ctx)}attachShadowLayer(){if(!this.shadow_layer&&this.parent){this.shadow_layer=(0,n.createDeviceScaledCanvas)(this.metrics.width,this.metrics.height),this.shadow_layer.setAttribute("id","shadow-canvas"),this.shadow_layer.className="ShadowLayer";try{this.parent.insertBefore(this.shadow_layer,this.board)}catch(e){console.warn("Error inserting shadow layer before board"),console.warn(e);try{this.parent.appendChild(this.shadow_layer)}catch(e){console.error(e)}}const e=this.shadow_layer.getContext("2d",{willReadFrequently:!0});if(!e)return void console.error(new Error("Failed to obtain shadow layer drawing context"));this.shadow_ctx=e,this.bindPointerBindings(this.shadow_layer)}}detachPenCanvas(){this.pen_layer&&(this.pen_layer.parentNode&&this.pen_layer.parentNode.removeChild(this.pen_layer),delete this.pen_layer,delete this.pen_ctx)}attachPenCanvas(){if(!this.pen_layer){this.pen_layer=(0,n.createDeviceScaledCanvas)(this.metrics.width,this.metrics.height),this.pen_layer.setAttribute("id","pen-canvas"),this.pen_layer.className="PenLayer",this.parent.appendChild(this.pen_layer);const e=this.pen_layer.getContext("2d",{willReadFrequently:!0});if(!e)throw new Error("Failed to obtain pen drawing context");this.pen_ctx=e,this.bindPointerBindings(this.pen_layer)}}bindPointerBindings(e){if(!this.interactive)return;if("true"===e.getAttribute("data-pointers-bound"))return;e.setAttribute("data-pointers-bound","true");let t=!1,i=this.xy2ij(0,0),s=0;const o=(e,o)=>{const r=performance.now()-s;try{if(!t)return;let s=!1;if(e instanceof MouseEvent&&2===e.button&&(s=!0,e.preventDefault()),t=!1,this.scoring_mode){const t=(0,n.getRelativeEventPosition)(e),i=this.xy2ij(t.x,t.y);return void(i.i>=0&&i.i<this.width&&i.j>=0&&i.j<this.height&&(this.score_estimator&&this.score_estimator.handleClick(i.i,i.j,e.ctrlKey||e.metaKey||e.altKey||e.shiftKey,r),this.emit("update")))}if(e.ctrlKey||e.metaKey||e.altKey){try{const t=(0,n.getRelativeEventPosition)(e),i=this.xy2ij(t.x,t.y);c.callbacks.addCoordinatesToChatInput&&c.callbacks.addCoordinatesToChatInput(this.engine.prettyCoordinates(i.i,i.j))}catch(e){console.error(e)}return}if("analyze"===this.mode&&"draw"===this.analyze_tool);else if("analyze"===this.mode&&"score"===this.analyze_tool);else if("analyze"===this.mode&&"removal"===this.analyze_tool)this.onAnalysisToggleStoneRemoval(e);else{const t=(0,n.getRelativeEventPosition)(e),a=this.xy2ij(t.x,t.y);if(o){if(i.i!==a.i||i.j!==a.j)return void this.onMouseOut(e)}else i=a;this.onTap(e,o,s,r),this.onMouseOut(e)}}catch(e){console.error(e)}},r=e=>{s=performance.now();try{if(t=!0,"analyze"===this.mode&&"draw"===this.analyze_tool)this.onPenStart(e);else if("analyze"===this.mode&&"label"===this.analyze_tool){if(e.shiftKey&&"letters"===this.analyze_subtool){const e=prompt((0,a._)("Enter the label you want to add to the board"),"");if(e)return this.label_character=e.substring(0,3),void(t=!1)}this.onLabelingStart(e)}else"analyze"===this.mode&&"score"===this.analyze_tool?this.onAnalysisScoringStart(e):"analyze"===this.mode&&this.analyze_tool}catch(e){console.error(e)}},l=e=>{try{if("analyze"===this.mode&&"draw"===this.analyze_tool){if(!t)return;this.onPenMove(e)}else t&&"analyze"===this.mode&&"label"===this.analyze_tool?this.onLabelingMove(e):t&&"analyze"===this.mode&&"score"===this.analyze_tool?this.onAnalysisScoringMove(e):t&&"analyze"===this.mode&&"removal"===this.analyze_tool||this.onMouseMove(e)}catch(e){console.error(e)}},h=e=>{try{t=!1,this.onMouseOut(e)}catch(e){console.error(e)}};let _=0;e.addEventListener("click",(e=>(_||(t=!0,o(e,!1)),e.preventDefault(),!1))),e.addEventListener("dblclick",(e=>(_||(t=!0,o(e,!0)),e.preventDefault(),!1))),e.addEventListener("mousedown",(e=>(_||r(e),e.preventDefault(),!1))),e.addEventListener("mousemove",(e=>(_||l(e),e.preventDefault(),!1))),e.addEventListener("mouseout",(e=>(_?e.preventDefault():h(e),!1))),e.addEventListener("contextmenu",(e=>(_?e.preventDefault():o(e,!1),!1))),e.addEventListener("focus",(e=>(e.preventDefault(),!1)));let d=0,u=0,m=0,g=0;const p=i=>{try{_&&clearTimeout(_),_=setTimeout((()=>{_=0}),5e3),(0,n.getRelativeEventPosition)(i),i.target===e?(d=i.touches[0].clientX,u=i.touches[0].clientY,m=i.touches[0].clientX,g=i.touches[0].clientY,r(i)):t&&h(i)}catch(e){console.error(e)}},v=i=>{try{const s=document.activeElement;i.target===e&&s&&s instanceof HTMLElement&&"input"===s.tagName.toLowerCase()&&s.blur(),_&&clearTimeout(_),_=setTimeout((()=>{_=0}),5e3),i.target===e?Math.sqrt((m-d)*(m-d)+(g-u)*(g-u))>10?h(i):o(i,!1):t&&h(i)}catch(e){console.error(e)}},f=i=>{try{if(_&&clearTimeout(_),_=setTimeout((()=>{_=0}),5e3),(0,n.getRelativeEventPosition)(i),i.target===e){if(d=i.touches[0].clientX,u=i.touches[0].clientY,"analyze"===this.mode&&"draw"===this.analyze_tool)return l(i),i.preventDefault(),!1}else t&&h(i)}catch(e){console.error(e)}};document.addEventListener("touchstart",p),document.addEventListener("touchend",v),document.addEventListener("touchmove",f);const y=()=>{document.removeEventListener("touchstart",p),document.removeEventListener("touchend",v),document.removeEventListener("touchmove",f),this.off("destroy",y)};this.on("destroy",y)}clearAnalysisDrawing(){this.pen_marks=[],this.pen_ctx&&this.pen_ctx.clearRect(0,0,this.metrics.width,this.metrics.height)}xy2pen(e,t){const i=this.draw_left_labels?0:1,s=this.draw_top_labels?0:1;return[Math.round(64*(e/this.square_size+i)),Math.round(64*(t/this.square_size+s))]}pen2xy(e,t){const i=this.draw_left_labels?0:1,s=this.draw_top_labels?0:1;return[(e/64-i)*this.square_size,(t/64-s)*this.square_size]}setPenStyle(e){if(!this.pen_ctx)throw new Error("setPenStyle called with null pen_ctx");this.pen_ctx.strokeStyle=e,this.pen_ctx.lineWidth=Math.max(1,Math.round(.1*this.square_size)),this.pen_ctx.lineCap="round"}onPenStart(e){this.attachPenCanvas();const t=(0,n.getRelativeEventPosition)(e);this.last_pen_position=this.xy2pen(t.x,t.y),this.current_pen_mark={color:this.analyze_subtool,points:this.xy2pen(t.x,t.y)},this.pen_marks.push(this.current_pen_mark),this.setPenStyle(this.analyze_subtool),this.syncReviewMove({pen:this.analyze_subtool,pp:this.xy2pen(t.x,t.y)})}onPenMove(e){if(!this.pen_ctx)throw new Error("onPenMove called with null pen_ctx");if(!this.last_pen_position||!this.current_pen_mark)throw new Error("onPenMove called with invalid last pen position or current pen mark");const t=(0,n.getRelativeEventPosition)(e),i=this.last_pen_position,s=this.pen2xy(i[0],i[1]),o=this.xy2pen(t.x,t.y),r=this.pen2xy(o[0],o[1]),a=o[0]-i[0],l=o[1]-i[1];a*a+l*l<64||(this.last_pen_position=o,this.current_pen_mark.points.push(a),this.current_pen_mark.points.push(l),this.pen_ctx.beginPath(),this.pen_ctx.moveTo(s[0],s[1]),this.pen_ctx.lineTo(r[0],r[1]),this.pen_ctx.stroke(),this.syncReviewMove({pp:[a,l]}))}drawPenMarks(e){if((!this.review_id||this.done_loading_review)&&e.length){if(this.attachPenCanvas(),!this.pen_ctx)throw new Error("onPenMove called with null pen_ctx");this.clearAnalysisDrawing(),this.pen_marks=e;for(let t=0;t<e.length;++t){const i=e[t];this.setPenStyle(i.color);let s=i.points[0],o=i.points[1];this.pen_ctx.beginPath();const r=this.pen2xy(s,o);this.pen_ctx.moveTo(r[0],r[1]);for(let e=2;e<i.points.length;e+=2){s+=i.points[e],o+=i.points[e+1];const t=this.pen2xy(s,o);this.pen_ctx.lineTo(t[0],t[1])}this.pen_ctx.stroke()}}}onTap(e,t,i,s){if(!this.stone_placement_enabled||!this.player_id&&this.engine.players.black.id&&"analyze"!==this.mode&&"puzzle"!==this.mode)return;if(i&&"play"===this.mode)return;const o=(0,n.getRelativeEventPosition)(e),r=o.x,l=o.y,c=this.xy2ij(r,l),_=c.i,d=c.j;if(_<0||d<0||_>=this.engine.width||d>=this.engine.height)return;if(this.double_click_submit||(t=!1),"analyze"===this.mode&&e.shiftKey&&("stone"!==this.analyze_tool||"black"!==this.analyze_subtool&&"white"!==this.analyze_subtool)&&"label"!==this.analyze_tool){const e=this.engine.getMoveByLocation(_,d,!0);return void(e&&(this.engine.jumpTo(e),this.emit("update")))}if("analyze"===this.mode&&"label"===this.analyze_tool)return;this.setSubmit(void 0);const u=Date.now();let m=0;const g=[],p=()=>{const e=Date.now();if(!(this.one_click_submit||this.double_click_submit&&t)){const t=e-u;if(t<=50)return void console.info("Submit button pressed only ",t,"ms after stone was placed, presuming bad click")}this.sendMove({game_id:this.game_id,move:(0,h.encodeMove)(_,d)})?(this.playMovementSound(),this.setTitle((0,a._)("Submitting...")),m&&this.debouncedEmitCapturedStones(g),this.disableStonePlacement(),delete this.move_selected):console.log("Move not sent, not playing movement sound")};try{let o=!1;if("stone removal"===this.engine.phase&&this.engine.isActivePlayer(this.player_id)&&this.engine.cur_move===this.engine.last_official_move){const{removed:t,group:i}=this.engine.toggleSingleGroupRemoval(_,d,e.shiftKey||s>500);i.length&&this.socket.send("game/removed_stones/set",{game_id:this.game_id,removed:t,stones:(0,h.encodeMoves)(i)})}else if("puzzle"===this.mode){let e="place",s=0;if(this.getPuzzlePlacementSetting){const t=this.getPuzzlePlacementSetting();e=t.mode,"setup"===t.mode&&(s=t.color,(this.shift_key_is_down||i)&&(s=1===s?2:1))}if("place"===e&&(t||(this.engine.place(_,d,!0,!1,!0,!1,!1),this.emit("puzzle-place",{x:_,y:d,width:this.engine.width,height:this.engine.height,color:this.engine.colorToMove()}))),"play"===e&&!t&&!this.autoplaying_puzzle_move){let e=0;if("fixed"!==this.engine.puzzle_player_move_mode||this.engine.cur_move.lookupMove(_,d,this.engine.player,!1)){const t=(i,s)=>{if(++e,m=this.engine.place(i,s,!0,!1,!0,!1,!1,g),this.emit("puzzle-place",{x:i,y:s,width:this.engine.width,height:this.engine.height,color:this.engine.colorToMove()}),this.engine.cur_move.wrong_answer&&this.emit("puzzle-wrong-answer"),this.engine.cur_move.correct_answer&&this.emit("puzzle-correct-answer"),0===this.engine.cur_move.branches.length){const e=this.engine.cur_move.findStrongIsobranches();if(e.length>0){const t=(0,h.getRandomInt)(0,e.length),i=e[t];console.info("Following isomorphism ("+(t+1)+" of "+e.length+")"),this.engine.jumpTo(i),this.emit("update")}}if(this.engine.cur_move.branches.length){const i=this.engine.cur_move.branches[(0,h.getRandomInt)(0,this.engine.cur_move.branches.length)];1===e&&(2===i.player&&"black"===this.engine.config.initial_player||1===i.player&&"white"===this.engine.config.initial_player)&&"manual"!==this.engine.puzzle_opponent_move_mode&&(this.autoplaying_puzzle_move=!0,setTimeout((()=>{this.autoplaying_puzzle_move=!1,t(i.x,i.y),this.emit("update")}),this.puzzle_autoplace_delay))}else{let e=this.engine.cur_move,t=!1;for(;e;){if(e.correct_answer){t=!0;break}e=e.parent}t||this.engine.cur_move.wrong_answer||this.emit("puzzle-wrong-answer")}};t(_,d)}}"setup"===e&&(this.engine.board[d][_]===s?this.engine.initialStatePlace(_,d,0):this.engine.initialStatePlace(_,d,s)),this.emit("update"),m>0&&(this.emit("audio-capture-stones",{count:m,already_captured:0}),this.debouncedEmitCapturedStones(g))}else if("play"===this.engine.phase||"finished"===this.engine.phase&&"analyze"===this.mode){if(this.move_selected){"play"===this.mode&&this.engine.cur_move.removeIfNoChildren();let e=!1;if(this.move_selected.x===_&&this.move_selected.y===d&&(delete this.move_selected,e=!0),this.engine.jumpTo(this.engine.last_official_move),e&&(this.updatePlayerToMoveTitle(),!t))return void this.emit("update")}this.move_selected={x:_,y:d};try{if("analyze"!==this.mode||"stone"!==this.analyze_tool||"alternate"===this.analyze_subtool)m=this.engine.place(_,d,!0,!0,void 0,void 0,void 0,g),"analyze"===this.mode&&this.engine.handicapMovesLeft()>0&&this.engine.place(-1,-1);else{if(!this.edit_color)throw new Error("Edit place called with invalid edit_color value");let t=this.engine.playerByColor(this.edit_color);e.shiftKey&&1===t?t=2:e.shiftKey&&2===t&&(t=1),this.engine.board[d][_]===t?this.engine.editPlace(_,d,0):this.engine.editPlace(_,d,t)}if("analyze"===this.mode&&"stone"===this.analyze_tool){let e=this.engine.cur_move;for(;e&&!e.trunk;){let t=e.getMoveNumberDifferenceFromTrunk();e.edited&&(t="triangle"),e.x>=0&&e.y>=0&&!this.engine.board[e.y][e.x]?this.clearTransientMark(e.x,e.y,t):this.setTransientMark(e.x,e.y,t,!0),e=e.parent}}this.isPlayerController()&&(this.syncReviewMove(),o=!0)}catch(e){throw delete this.move_selected,this.updatePlayerToMoveTitle(),e}switch(this.mode){case"play":this.one_click_submit||t?p():this.setSubmit(p);break;case"analyze":delete this.move_selected,this.updateTitleAndStonePlacement(),this.emit("update"),this.playMovementSound();break;case"conditional":this.followConditionalSegment(_,d),delete this.move_selected,this.updateTitleAndStonePlacement(),this.emit("update"),this.playMovementSound()}o&&this.redraw()}}catch(e){delete this.move_selected,"stone_already_placed_here"!==e.message_id&&(this.errorHandler(e),this.emit("error","stone_already_placed_here")),this.emit("update")}}onMouseMove(e){if(!this.stone_placement_enabled||!this.player_id&&this.engine.players.black.id&&"analyze"!==this.mode&&!this.scoring_mode)return;const t=(0,n.getRelativeEventPosition)(e),i=this.xy2ij(t.x,t.y);if(this.__last_pt.i!==i.i||this.__last_pt.j!==i.j){if(this.__last_pt.valid){const e=this.last_hover_square;delete this.last_hover_square,e&&this.drawSquare(e.x,e.y)}this.__last_pt=i,i.valid&&(this.last_hover_square={x:i.i,y:i.j},this.drawSquare(i.i,i.j))}}onMouseOut(e){if(this.__last_pt.valid){const e=this.last_hover_square;delete this.last_hover_square,e&&this.drawSquare(e.x,e.y)}this.__last_pt=this.xy2ij(-1,-1)}enableDrawing(){this.drawing_enabled=!0}disableDrawing(){this.drawing_enabled=!1}setByoYomiLabel(e){this.byoyomi_label!==e&&(this.byoyomi_label=e,this.last_hover_square&&this.drawSquare(this.last_hover_square.x,this.last_hover_square.y))}drawSquare(e,t){e<0||t<0||!this.drawing_enabled||this.no_display||this.__draw_state[t][e]!==this.drawingHash(e,t)&&this.__drawSquare(e,t)}__drawSquare(e,t){var i,o,r;if(!this.drawing_enabled||this.no_display)return;const n=this.ctx;if(!n)return;if(e<0||t<0)return;const a=this.square_size;let l,c,d=this.draw_left_labels?a:0,u=this.draw_top_labels?a:0;this.bounds.left>0&&(d=-a*this.bounds.left),this.bounds.top>0&&(u=-a*this.bounds.top);let m=!this.dont_draw_last_move,g=0;this.engine&&(g=this.engine.board[t][e]);let v,f=this.getMarks(e,t);if(f||(console.error("No position for ",t,e),f={}),this.engine&&this.engine.cur_move&&("play"!==this.mode||void 0!==this.isInPushedAnalysis()&&this.isInPushedAnalysis())){let i=this.engine.cur_move;for(;i&&!i.trunk;i=i.parent)if(i.x===e&&i.y===t){i.getMoveNumberDifferenceFromTrunk()!==i.move_number&&!i.edited&&this.show_variation_move_numbers&&(v=i.getMoveNumberDifferenceFromTrunk().toString())}}let y=!1;this.engine&&this.engine.cur_move.lookupMove(e,t,this.engine.player,!1)&&(y=!0);let b=!1,w=this.theme_blank_text_color;for(const e in f)e.length<=3&&(b=!0);(f.circle||f.triangle||f.chat_triangle||f.sub_triangle||f.cross||f.square)&&(b=!0),f.letter&&f.letter.length>0&&(b=!0),f.subscript&&f.subscript.length>0&&(b=!0);{const i=e*a+d,s=(e+1)*a+d,o=t*a+u,r=(t+1)*a+u;if(n.clearRect(i,o,s-i,r-o),this.shadow_ctx){let e=.1*this.square_size;this.shadow_ctx.clearRect(i+e,o+e,this.square_size,this.square_size),e=.2*this.square_size,this.shadow_ctx.clearRect(i+e,o+e,this.square_size,this.square_size),e=.3*this.square_size,this.shadow_ctx.clearRect(i+e,o+e,this.square_size,this.square_size)}l=i+this.metrics.mid,c=o+this.metrics.mid;let h=i,_=s;const m=(s+i)/2-this.metrics.offset;let g=o,p=r;const v=(o+r)/2-this.metrics.offset;0===e&&(h+=this.metrics.mid),e===this.width-1&&(_-=this.metrics.mid),0===t&&(g+=this.metrics.mid),t===this.height-1&&(p-=this.metrics.mid),e===this.width-1&&t===this.height-1&&m===_&&v===p&&(_+=1,p+=1),this.square_size<5?n.lineWidth=.2:n.lineWidth=1,n.strokeStyle=b?this.theme_faded_line_color:this.theme_line_color,n.lineCap="butt",n.beginPath(),n.moveTo(Math.floor(h),v),n.lineTo(Math.floor(_),v),n.moveTo(m,Math.floor(g)),n.lineTo(m,Math.floor(p)),n.stroke()}{let i;i=this.square_size<5?.5:Math.max(2,.16*(this.metrics.mid-1.5));let s=!1;19!==this.width||19!==this.height||(3!==e||3!==t&&9!==t&&15!==t)&&(9!==e||3!==t&&9!==t&&15!==t)&&(15!==e||3!==t&&9!==t&&15!==t)||(s=!0),13===this.width&&13===this.height&&(3===e&&(3===t||9===t)||6===e&&6===t||9===e&&(3===t||9===t))&&(s=!0),9===this.width&&9===this.height&&(2===e&&(2===t||6===t)||4===e&&4===t||6===e&&(2===t||6===t))&&(s=!0),s&&(n.beginPath(),n.fillStyle=this.theme_star_color,b&&(n.fillStyle=this.theme_faded_star_color),n.arc(l,c,i,.001,2*Math.PI,!1),n.fill())}if(this.heatmap&&this.heatmap[t][e]>.001){const i="#00FF00";n.lineCap="square",n.save(),n.beginPath(),n.globalAlpha=Math.min(this.heatmap[t][e],.5);const s=Math.floor(.5*this.square_size)-.5;n.moveTo(l-s,c-s),n.lineTo(l+s,c-s),n.lineTo(l+s,c+s),n.lineTo(l-s,c+s),n.lineTo(l-s,c-s),n.fillStyle=i,n.fill(),n.restore()}if(f.hint||this.highlight_movetree_moves&&y||f.color){const e=f.color?f.color:f.hint?"#8EFF0A":"#FF8E0A";n.lineCap="square",n.save(),n.beginPath(),n.globalAlpha=.6;const t=Math.floor(.5*this.square_size)-.5;n.moveTo(l-t,c-t),n.lineTo(l+t,c-t),n.lineTo(l+t,c+t),n.lineTo(l-t,c+t),n.lineTo(l-t,c-t),n.fillStyle=e,n.fill(),n.restore()}const k=null===(i=this.colored_circles)||void 0===i?void 0:i[t][e];if(k){const e=k.color;n.save(),n.globalAlpha=1;const t=Math.floor(.5*this.square_size)-.5;let i=t*(k.border_width||.1);i<.3&&(i=0),n.fillStyle=e,n.strokeStyle=k.border_color||"#000000",i>0&&(n.lineWidth=i),n.beginPath(),n.arc(l,c,Math.max(.1,t-i/2),.001,2*Math.PI,!1),i>0&&n.stroke(),n.fill(),n.restore()}let x=!1;if(g||this.stone_placement_enabled&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&("analyze"!==this.mode||"stone"===this.analyze_tool)&&this.engine&&!this.scoring_mode&&("play"===this.engine.phase||"finished"===this.engine.phase&&"analyze"===this.mode)&&("fixed"!==this.engine.puzzle_player_move_mode||y||this.getPuzzlePlacementSetting&&"play"===this.getPuzzlePlacementSetting().mode)||this.scoring_mode&&this.score_estimator&&this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e]||this.engine&&"stone removal"===this.engine.phase&&this.engine.board[t][e]&&this.engine.removal[t][e]||f.black||f.white){let i,s=!1,a=.6;if(this.scoring_mode&&this.score_estimator&&this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e])i=this.score_estimator.board[t][e],s=!0;else if(this.engine&&("stone removal"===this.engine.phase&&this.engine.last_official_move===this.engine.cur_move||"finished"===this.engine.phase&&"analyze"!==this.mode)&&this.engine.board&&this.engine.removal&&this.engine.board[t][e]&&this.engine.removal[t][e])i=this.engine.board[t][e],s=!0;else if(g)i=g;else if("analyze"===this.mode&&"stone"===this.analyze_tool&&"alternate"!==this.analyze_subtool)i="black"===this.edit_color?1:2,this.shift_key_is_down&&(i="black"===this.edit_color?2:1);else if(this.move_selected)i=this.engine.handicapMovesLeft()<=0?this.engine.otherPlayer():this.engine.player;else if("puzzle"===this.mode)if(this.getPuzzlePlacementSetting){const e=this.getPuzzlePlacementSetting();"setup"===e.mode?(i=e.color,this.shift_key_is_down&&(i=1===i?2:1)):i=this.engine.player}else i=this.engine.player;else f.black||f.white?(i=f.black?1:2,s=!0,a=this.variation_stone_opacity):i=this.engine.player;if(f.stone_removed&&(s=!0),!this.autoplaying_puzzle_move||g){if(w=1===i?this.theme_black_text_color:this.theme_white_text_color,!this.theme_black_stones){const e=new Error(`Goban.theme_black_stones not set. Current themes is ${JSON.stringify(this.themes)}`);return void setTimeout((()=>{throw e}),1)}if(!this.theme_white_stones){const e=new Error(`Goban.theme_white_stones not set. Current themes is ${JSON.stringify(this.themes)}`);return void setTimeout((()=>{throw e}),1)}n.save();let o=this.shadow_ctx;if(g&&!s||(n.globalAlpha=a,o=null),void 0===o&&(o=null),1===i){const i=this.theme_black.getStone(e,t,this.theme_black_stones,this);this.theme_black.placeBlackStone(n,o,i,l,c,this.theme_stone_radius)}else{const i=this.theme_white.getStone(e,t,this.theme_white_stones,this);this.theme_white.placeWhiteStone(n,o,i,l,c,this.theme_stone_radius)}n.restore()}const h=null===(r=null===(o=this.colored_circles)||void 0===o?void 0:o[t])||void 0===r?void 0:r[e];if(f.blue_move&&h){n.save(),n.globalAlpha=1;const e=Math.floor(.5*this.square_size)-.5;let t=e*(h.border_width||.1);t<.3&&(t=0),n.strokeStyle=h.border_color||"#000000",t>0&&(n.lineWidth=t),n.beginPath(),n.arc(l,c,Math.max(.1,e-t/2),.001,2*Math.PI,!1),t>0&&n.stroke(),n.restore()}(this.engine&&"stone removal"===this.engine.phase&&this.engine.last_official_move===this.engine.cur_move&&this.engine.board[t][e]&&this.engine.removal[t][e]||this.scoring_mode&&this.score_estimator&&this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e]||f.stone_removed)&&(x="x"===this.themes["removal-graphic"])}if(x||"analyze"===this.mode&&"removal"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t||"stone removal"===this.engine.phase&&this.engine.isActivePlayer(this.player_id)&&this.engine.cur_move===this.engine.last_official_move&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t){const i=this.engine.board[t][e]===s.JGOFNumericPlayerColor.BLACK?"black":"white",o=this.engine.board[t][e]?1:.2;n.lineCap="square",n.save(),n.beginPath(),n.lineWidth=.125*this.square_size,n.globalAlpha=o;const r=Math.max(1,.65*this.metrics.mid);n.moveTo(l-r,c-r),n.lineTo(l+r,c+r),n.moveTo(l+r,c-r),n.lineTo(l-r,c+r),"black"===f.score&&"white"===i?n.strokeStyle=this.theme_white_text_color:"white"===f.score&&"black"===i?n.strokeStyle=this.theme_black_text_color:"white"===f.score&&"white"===i||"black"===f.score&&"black"===i?n.strokeStyle="#ff0000":n.strokeStyle="#888888",n.stroke(),n.restore(),m=!1}if(f.score&&("finished"!==this.engine.phase||"play"===this.mode||"analyze"===this.mode)||this.scoring_mode&&this.score_estimator&&(this.score_estimator.territory[t][e]||this.score_estimator.removal[t][e]&&0===this.score_estimator.board[t][e])||("stone removal"===this.engine.phase||"finished"===this.engine.phase&&"play"===this.mode)&&0===this.engine.board[t][e]&&(this.engine.removal[t][e]||f.needs_sealing)||"analyze"===this.mode&&"score"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t){n.beginPath();let i=f.score;this.scoring_mode&&this.score_estimator&&(this.score_estimator.territory[t][e]||this.score_estimator.removal[t][e]&&0===this.score_estimator.board[t][e])&&(i=1===this.score_estimator.territory[t][e]?"black":"white",0===this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e]&&(i="dame")),("stone removal"===this.engine.phase||"finished"===this.engine.phase&&"play"===this.mode)&&0===this.engine.board[t][e]&&this.engine.removal[t][e]&&(i="dame"),f.needs_sealing&&(i="seal"),"analyze"===this.mode&&"score"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&(i=this.analyze_subtool),"white"===i?(n.fillStyle=this.theme_black_text_color,n.strokeStyle="#777777"):"black"===i?(n.fillStyle=this.theme_white_text_color,n.strokeStyle="#888888"):"dame"===i?(n.fillStyle="#ff0000",n.strokeStyle="#365FE6"):"seal"===i&&(n.fillStyle="#ff0000",n.strokeStyle="#E079CE"),"#"===(null==i?void 0:i[0])&&(n.fillStyle=i,n.strokeStyle=(0,h.color_blend)("#888888",i)),n.lineWidth=Math.ceil(.065*this.square_size)-.5;const s=.15*this.square_size;n.rect(l-s,c-s,2*s,2*s),"dame"!==i&&n.fill(),n.stroke()}let S=!1;{let i,s,o=!1;if(f.letter&&(i=f.letter),f.subscript&&(s=f.subscript),"play"===this.mode&&this.byoyomi_label&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&(i=this.byoyomi_label),"analyze"!==this.mode||"label"!==this.analyze_tool||"letters"!==this.analyze_subtool&&"numbers"!==this.analyze_subtool||!this.last_hover_square||this.last_hover_square.x!==e||this.last_hover_square.y!==t||(o=!0,i=this.label_character),i||"triangle"===v||(i=v),this.show_variation_move_numbers&&!i&&!(f.circle||f.triangle||f.chat_triangle||f.sub_triangle||f.cross||f.square)){const s=this.engine.getMoveByLocation(e,t,!1);s&&!s.trunk&&(s.edited?this.engine.board[t][e]:i=s.getMoveNumberDifferenceFromTrunk().toString())}if(i){S=!0,n.save(),n.fillStyle=w;const[,,e]=p(n,i,`bold FONT_SIZEpx ${_.GOBAN_FONT}`,.4*this.square_size,.8*this.square_size*(s?.9:1)),t=l-e.width/2;let r=c+(/WebKit|Trident/.test(navigator.userAgent)?-.03*this.square_size:1);s&&(r-=.15*this.square_size),n.textBaseline="middle",o&&(n.globalAlpha=.6),n.fillText(i,t,r),m=!1,n.restore()}if(s){S=!0,n.save(),n.fillStyle=w,i&&"0"===s&&(s="0.0");const[,,e]=p(n,s,`bold FONT_SIZEpx ${_.GOBAN_FONT}`,.4*this.square_size,.8*this.square_size*(i?.9:1)),t=l-e.width/2;let r=c+(/WebKit|Trident/.test(navigator.userAgent)?-.03*this.square_size:1);i&&(r+=.3*this.square_size),n.textBaseline="middle",o&&(n.globalAlpha=.6),n.fillText(s,t,r),m=!1,n.restore()}}{let i,s=S;const o=1===g?this.theme_black_text_color:2===g?this.theme_white_text_color:w;if("label"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&("triangle"!==this.analyze_subtool&&"square"!==this.analyze_subtool&&"cross"!==this.analyze_subtool&&"circle"!==this.analyze_subtool||(s=!0,i=this.analyze_subtool)),f.circle||"circle"===i){n.lineCap="round",n.save(),n.beginPath(),s&&(n.globalAlpha=.6),n.strokeStyle=o,n.lineWidth=.075*this.square_size;const e=Math.max(.1,this.square_size*this.circle_radius);n.arc(l,c,e,0,2*Math.PI,!1),n.stroke(),n.restore(),m=!1}if(f.triangle||f.chat_triangle||f.sub_triangle||"triangle"===v||"triangle"===i){let e=1,t=0;f.sub_triangle&&(e=.5,t=.3*this.square_size,s=!1),n.lineCap="round",n.save(),n.beginPath(),s&&(n.globalAlpha=.6),n.strokeStyle=o,f.chat_triangle&&(n.strokeStyle="#00aaFF"),n.lineWidth=.075*this.square_size*e;let i=-2*Math.PI/4;const r=.3*this.square_size*e;n.moveTo(l+r*Math.cos(i),c+t+r*Math.sin(i)),i+=2*Math.PI/3,n.lineTo(l+r*Math.cos(i),c+t+r*Math.sin(i)),i+=2*Math.PI/3,n.lineTo(l+r*Math.cos(i),c+t+r*Math.sin(i)),i+=2*Math.PI/3,n.lineTo(l+r*Math.cos(i),c+t+r*Math.sin(i)),n.stroke(),n.restore(),m=!1}if(f.cross||"cross"===i){n.lineCap="square",n.save(),n.beginPath(),n.lineWidth=.075*this.square_size,s&&(n.globalAlpha=.6);const e=Math.max(1,.35*this.metrics.mid);n.moveTo(l-e,c-e),n.lineTo(l+e,c+e),n.moveTo(l+e,c-e),n.lineTo(l-e,c+e),n.strokeStyle=o,n.stroke(),n.restore(),m=!1}if(f.square||"square"===i){n.lineCap="square",n.save(),n.beginPath(),n.lineWidth=.075*this.square_size,s&&(n.globalAlpha=.6);const e=Math.max(1,.4*this.metrics.mid);n.moveTo(l-e,c-e),n.lineTo(l+e,c-e),n.lineTo(l+e,c+e),n.lineTo(l-e,c+e),n.lineTo(l-e,c-e),n.strokeStyle=o,n.stroke(),n.restore(),m=!1}}if(this.last_move&&this.engine&&!this.last_move.is(this.engine.cur_move)){const e=this.last_move;delete this.last_move,this.drawSquare(e.x,e.y)}if(m&&this.engine&&this.engine.cur_move&&this.engine.cur_move.x===e&&this.engine.cur_move.y===t&&this.engine.board[t][e]&&("play"===this.engine.phase||"finished"===this.engine.phase)&&(this.last_move=this.engine.cur_move,e>=0&&t>=0)){const e=1===g?this.theme_black_text_color:this.theme_white_text_color;if(this.submit_move){n.lineCap="square",n.save(),n.beginPath(),n.lineWidth=.075*this.square_size,n.globalAlpha=this.last_move_opacity;const t=.8*Math.max(1,.35*this.metrics.mid);n.moveTo(l-t,c),n.lineTo(l+t,c),n.moveTo(l,c-t),n.lineTo(l,c+t),n.strokeStyle=e,n.stroke(),n.restore(),m=!1}else if(this.engine.undo_requested&&this.getShowUndoRequestIndicator()&&this.engine.undo_requested===this.engine.cur_move.move_number){const t="?";n.save(),n.fillStyle=e;const i=l-n.measureText(t).width/2,s=c+(/WebKit|Trident/.test(navigator.userAgent)?-.03*this.square_size:1);n.textBaseline="middle",n.fillText(t,i,s),m=!1,n.restore()}else{n.save(),n.beginPath(),n.strokeStyle=e,n.lineWidth=.075*this.square_size,n.globalAlpha=this.last_move_opacity;let t=this.square_size*this.last_move_radius;this.submit_move&&(t=.3*this.square_size),t=Math.max(.1,t),n.arc(l,c,t,0,2*Math.PI,!1),n.stroke(),n.restore()}}if(!0===this.scoring_mode&&this.score_estimator||"stalling-scoring-mode"===this.scoring_mode&&this.stalling_score_estimate&&"analyze"!==this.mode){const i=("stalling-scoring-mode"===this.scoring_mode?this.stalling_score_estimate:this.score_estimator).ownership[t][e];n.beginPath();const s=i<0?"white":"black";if(("black"===s?1:2)!==g){"white"===s?(n.fillStyle=this.theme_black_text_color,n.strokeStyle="#777777"):"black"===s&&(n.fillStyle=this.theme_white_text_color,n.strokeStyle="#888888"),n.lineWidth=Math.ceil(.035*this.square_size)-.5;const e=.2*this.square_size*Math.abs(i);n.rect(l-e,c-e,2*e,2*e),n.fill(),n.stroke()}}this.__draw_state[t][e]=this.drawingHash(e,t)}drawingHash(e,t){var i;if(this.no_display)return"";if(e<0||t<0)return"..";let o=this.square_size+",";const r=!this.dont_draw_last_move;let n=0;this.engine&&(n=this.engine.board[t][e]),o+=n+",",this.heatmap&&this.heatmap[t][e]>.001&&(o+="heat "+this.heatmap[t][e]+",");const a=null===(i=this.colored_circles)||void 0===i?void 0:i[t][e];a&&(o+="circle "+a.color);let l,h=this.getMarks(e,t);if(h||(console.error("No position for ",t,e),h={}),this.engine&&this.engine.cur_move&&("play"!==this.mode||void 0!==this.isInPushedAnalysis()&&this.isInPushedAnalysis())){let i=this.engine.cur_move;for(;i&&!i.trunk;i=i.parent)if(i.x===e&&i.y===t){i.getMoveNumberDifferenceFromTrunk()!==i.move_number&&!i.edited&&this.show_variation_move_numbers&&(l=i.getMoveNumberDifferenceFromTrunk().toString())}}let c=!1;this.engine&&this.engine.cur_move.lookupMove(e,t,this.engine.player,!1)&&(c=!0);let _=!1;if(n||this.stone_placement_enabled&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&("analyze"!==this.mode||"stone"===this.analyze_tool)&&this.engine&&!this.scoring_mode&&("play"===this.engine.phase||"finished"===this.engine.phase&&"analyze"===this.mode)&&("fixed"!==this.engine.puzzle_player_move_mode||c||this.getPuzzlePlacementSetting&&"play"!==this.getPuzzlePlacementSetting().mode)||this.scoring_mode&&this.score_estimator&&this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e]||this.engine&&"stone removal"===this.engine.phase&&this.engine.board[t][e]&&this.engine.removal[t][e]||h.black||h.white){let i,s=!1;this.scoring_mode&&this.score_estimator&&this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e]?(i=this.score_estimator.board[t][e],s=!0):this.engine&&"stone removal"===this.engine.phase&&this.engine.board&&this.engine.removal&&this.engine.board[t][e]&&this.engine.removal[t][e]?(i=this.engine.board[t][e],s=!0):n?i=n:"analyze"===this.mode&&"stone"===this.analyze_tool&&"alternate"!==this.analyze_subtool?i="black"===this.edit_color?1:2:this.move_selected?i=this.engine.handicapMovesLeft()<=0?this.engine.otherPlayer():this.engine.player:h.black||h.white?(i=h.black?1:2,s=!0):i=this.engine.player,h.stone_removed&&(s=!0),1===i&&(o+=this.theme_black.getStoneHash(e,t,this.theme_black_stones,this)),2===i&&(o+=this.theme_white.getStoneHash(e,t,this.theme_white_stones,this)),(this.engine&&"stone removal"===this.engine.phase&&this.engine.last_official_move===this.engine.cur_move&&this.engine.board[t][e]&&this.engine.removal[t][e]||this.scoring_mode&&this.score_estimator&&this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e]||h.stone_removed)&&(_=!0),o+=(s?"T":"")+i+","}if(_||"analyze"===this.mode&&"removal"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t||"stone removal"===this.engine.phase&&this.engine.isActivePlayer(this.player_id)&&this.engine.cur_move===this.engine.last_official_move&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t){const i=this.engine.board[t][e]===s.JGOFNumericPlayerColor.BLACK?"black":"white";"black"===h.score&&"white"===i?o+="whiteX":"white"===h.score&&"black"===i?o+="blackX":o+="redX"}(h.hint||this.highlight_movetree_moves&&c)&&(h.hint?o+="hint,":o+="highlight,");{let i=!1,s=!1;this.engine&&(this.scoring_mode||"stone removal"===this.engine.phase)&&this.stone_placement_enabled&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&("analyze"!==this.mode||"stone"===this.analyze_tool)&&(i=!0,s=!0),h.mark_x&&(i=!0,s=!1),this.scoring_mode&&this.score_estimator&&this.score_estimator.removal[t][e]&&(i=!0,s=!1),h.remove&&"analyze"!==this.mode&&(i=!0,s=!1),o+=i+","+s}if(h.score&&("finished"!==this.engine.phase||"play"===this.mode||"analyze"===this.mode)||this.scoring_mode&&this.score_estimator&&(this.score_estimator.territory[t][e]||this.score_estimator.removal[t][e]&&0===this.score_estimator.board[t][e])||("stone removal"===this.engine.phase||"finished"===this.engine.phase&&"play"===this.mode)&&0===this.engine.board[t][e]&&(this.engine.removal[t][e]||h.needs_sealing)||"analyze"===this.mode&&"score"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t){let i=h.score;this.scoring_mode&&this.score_estimator&&(this.score_estimator.territory[t][e]||this.score_estimator.removal[t][e]&&0===this.score_estimator.board[t][e])&&(i=1===this.score_estimator.territory[t][e]?"black":"white",0===this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e]&&(i="dame")),("stone removal"===this.engine.phase||"finished"===this.engine.phase&&"play"===this.mode)&&0===this.engine.board[t][e]&&this.engine.removal[t][e]&&(i="dame"),h.needs_sealing&&(i="seal"),"analyze"===this.mode&&"score"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&(i=this.analyze_subtool),this.scoring_mode&&this.score_estimator&&this.score_estimator.territory[t][e]&&(i=1===this.score_estimator.territory[t][e]?"black":"white"),o+="score "+i+","}{let i,s=!1;if(h.letter&&(i=h.letter),"play"===this.mode&&this.byoyomi_label&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&(i=this.byoyomi_label),"analyze"===this.mode&&"label"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&(s=!0,i=this.label_character),i||"triangle"===l||(i=l),this.show_variation_move_numbers&&!i&&!(h.circle||h.triangle||h.chat_triangle||h.cross||h.square)){const s=this.engine.getMoveByLocation(e,t,!1);s&&!s.trunk&&(s.edited?this.engine.board[t][e]:i=s.getMoveNumberDifferenceFromTrunk().toString())}i&&(o+=i+(s?" fade":"")+","),h.subscript&&(o+=" _ "+h.subscript+(s?" fade":"")+",")}if("label"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&("triangle"!==this.analyze_subtool&&"square"!==this.analyze_subtool&&"cross"!==this.analyze_subtool&&"circle"!==this.analyze_subtool||(o+="hover "+this.analyze_subtool+",")),h.circle&&(o+="circle,"),(h.triangle||h.chat_triangle||"triangle"===l)&&(o+="triangle,"),h.cross&&(o+="cross,"),h.square&&(o+="square,"),r&&this.engine&&this.engine.cur_move&&(this.engine.cur_move.x!==e||this.engine.cur_move.y!==t||!this.engine.board[t][e]||"play"!==this.engine.phase&&"finished"!==this.engine.phase||(o+="last_move,",this.engine.undo_requested&&this.getShowUndoRequestIndicator()&&this.engine.undo_requested===this.engine.cur_move.move_number&&(o+="?,"))),!0===this.scoring_mode&&this.score_estimator||"stalling-scoring-mode"===this.scoring_mode&&this.stalling_score_estimate&&"analyze"!==this.mode){o+=("stalling-scoring-mode"===this.scoring_mode?this.stalling_score_estimate:this.score_estimator).ownership[t][e].toFixed(5)+","}return o}redraw(e){if(!this.ready_to_draw)return;if(this.destroyed)return void console.debug("Attempting to redraw destroyed goban");if(!this.drawing_enabled)return;if(this.no_display)return;const t=this.metrics=this.computeMetrics();if(e||this.__set_board_width!==t.width||this.__set_board_height!==t.height||this.theme_stone_radius!==this.computeThemeStoneRadius()){e=!0;try{if(this.parent.style.width=t.width+"px",this.parent.style.height=t.height+"px",(0,n.resizeDeviceScaledCanvas)(this.board,t.width,t.height),this.pen_layer)if(this.pen_marks.length){(0,n.resizeDeviceScaledCanvas)(this.pen_layer,t.width,t.height);const e=this.pen_layer.getContext("2d",{willReadFrequently:!0});if(!e)throw new Error("Failed to obtain drawing context for pen layer");this.pen_ctx=e}else this.detachPenCanvas();if(this.shadow_layer){(0,n.resizeDeviceScaledCanvas)(this.shadow_layer,t.width,t.height);const e=this.shadow_layer.getContext("2d",{willReadFrequently:!0});if(!e)throw new Error("Failed to obtain drawing context for shadow layer");this.shadow_ctx=e}this.__set_board_width=t.width,this.__set_board_height=t.height;const e=this.board.getContext("2d",{willReadFrequently:!0});if(!e)throw new Error("Failed to obtain drawing context for board");this.ctx=e,this.setTheme(this.getSelectedThemes(),!0)}catch(e){return void setTimeout((()=>{throw e}),1)}}const i=this.ctx,s=(e,t,s)=>{const o=t-i.measureText(e).width/2,r=s;i.fillText(e,o,r)},o=(e,t,s)=>{for(let o=0;o<e.length;++o){const r=i.measureText(e[o]),n=t-r.width/2;let a=s;const l=r.width;2===e.length&&(a=a-l+o*l),3===e.length&&(a=a-1.5*l+o*l),i.fillText(e[o],n,a)}},r=(e,t)=>{switch(this.getCoordinateDisplaySystem()){case"A1":for(let i=0;i<this.width;++e,++i){const o=(e-this.bounds.left-(this.bounds.left>0?+this.draw_left_labels:0))*this.square_size+this.square_size/2,r=t*this.square_size+this.square_size/2;s((0,h.encodePrettyXCoordinate)(i),o,r)}break;case"1-1":for(let i=0;i<this.width;++e,++i){const o=(e-this.bounds.left-(this.bounds.left>0?+this.draw_left_labels:0))*this.square_size+this.square_size/2,r=t*this.square_size+this.square_size/2;s(""+(i+1),o,r)}}},a=(e,t)=>{switch(this.getCoordinateDisplaySystem()){case"A1":for(let i=0;i<this.height;++t,++i){const o=e*this.square_size+this.square_size/2,r=(t-this.bounds.top-(this.bounds.top>0?+this.draw_top_labels:0))*this.square_size+this.square_size/2;s(""+(this.height-i),o,r)}break;case"1-1":const i=["一","二","三","四","五","六","七","八","九","十","十一","十二","十三","十四","十五","十六","十七","十八","十九","二十","二十一","二十二","二十三","二十四","二十五"];for(let s=0;s<this.height;++t,++s){const r=e*this.square_size+this.square_size/2,n=(t-this.bounds.top-(this.bounds.top>0?+this.draw_top_labels:0))*this.square_size+this.square_size/2;o(i[s],r,n)}}};if(e||!this.__borders_initialized){this.__borders_initialized=!0,this.shadow_ctx&&this.shadow_ctx.clearRect(0,0,t.width,t.height),i.clearRect(0,0,t.width,t.height);let e=Math.round(.5*this.square_size),s="bold";"1-1"===this.getCoordinateDisplaySystem()&&(e*=.7,s="",this.height>20&&(e*=.7)),i.font=`${s} ${e}px ${_.GOBAN_FONT}`,i.textBaseline="middle",i.fillStyle=this.theme_board.getLabelTextColor(),i.save(),this.draw_top_labels&&0===this.bounds.top&&r(this.draw_left_labels?1:0,0),this.draw_bottom_labels&&this.bounds.bottom===this.height-1&&r(this.draw_left_labels?1:0,+this.draw_top_labels+this.bounded_height),this.draw_left_labels&&0===this.bounds.left&&a(0,this.draw_top_labels?1:0),this.draw_right_labels&&this.bounds.right===this.width-1&&a(+this.draw_left_labels+this.bounded_width,+this.draw_top_labels),i.restore()}this.__draw_state&&!e&&this.__draw_state.length===this.height&&this.__draw_state[0].length===this.width||(this.__draw_state=(0,h.makeMatrix)(this.width,this.height,""));{const e=Math.round(.45*this.square_size);i.font="bold "+e+"px "+_.GOBAN_FONT}for(let e=this.bounds.top;e<=this.bounds.bottom;++e)for(let t=this.bounds.left;t<=this.bounds.right;++t)this.drawSquare(t,e);this.drawPenMarks(this.pen_marks),this.move_tree_redraw()}showMessage(e,t,i=5e3){var s;this.clearMessage();const o=(null===(s=null==t?void 0:t.error)||void 0===s?void 0:s.message_id)||e,r=(0,l.formatMessage)(o,t);if(this.emit("show-message",{formatted:r,message_id:o,parameters:t}),!this.config.dont_show_messages){this.message_div=document.createElement("div"),this.message_div.className="GobanMessage",this.message_td=document.createElement("td");const e=document.createElement("table"),t=document.createElement("tr");t.appendChild(this.message_td),e.appendChild(t),this.message_div.appendChild(e),this.message_text=document.createElement("div"),this.message_text.innerHTML=r,this.message_td.appendChild(this.message_text),this.parent.appendChild(this.message_div);const s=Date.now();this.message_div.addEventListener("click",(()=>{try{if(Date.now()-s<100)return;i>0&&this.clearMessage()}catch(e){console.error(e)}}))}i||(i=5e3),i>0&&(this.message_timeout=window.setTimeout((()=>{this.clearMessage()}),i))}clearMessage(){var e;this.message_div&&(null===(e=this.message_div.parentNode)||void 0===e||e.removeChild(this.message_div),delete this.message_div),this.message_timeout&&(clearTimeout(this.message_timeout),delete this.message_timeout),this.emit("clear-message")}setTheme(e,t){var i,s,a;if(this.no_display)return;this.themes=e;const l=(null===(i=r.THEMES.board)||void 0===i?void 0:i[e.board])||r.THEMES.board.Plain,h=(null===(s=r.THEMES.white)||void 0===s?void 0:s[e.white])||r.THEMES.white.Plain,c=(null===(a=r.THEMES.black)||void 0===a?void 0:a[e.black])||r.THEMES.black.Plain;if(this.theme_board=new l,this.theme_white=new h(this.theme_board),this.theme_black=new c(this.theme_board),this.metrics||(this.metrics=this.computeMetrics()),this.theme_stone_radius=this.computeThemeStoneRadius(),isNaN(this.theme_stone_radius))throw console.error("setThemes was not able to find the board size, metrics were: ",JSON.stringify(this.metrics)),new Error("invalid stone radius computed");if(this.theme_white.stoneCastsShadow(this.theme_stone_radius)||this.theme_black.stoneCastsShadow(this.theme_stone_radius))if(this.shadow_layer){(0,n.resizeDeviceScaledCanvas)(this.shadow_layer,this.metrics.width,this.metrics.height);const e=this.shadow_layer.getContext("2d",{willReadFrequently:!0});if(!e)throw new Error("Failed to get drawing context for shadow layer");this.shadow_ctx=e}else this.attachShadowLayer();else this.detachShadowLayer();e.white in d.white||(d.white[e.white]={creation_order:[]}),e.black in d.black||(d.black[e.black]={creation_order:[]});const _=()=>{this.redraw(!0),this.move_tree_redraw()};try{this.theme_stone_radius in d.white[e.white]||(d.white[e.white][this.theme_stone_radius]=this.theme_white.preRenderWhite(this.theme_stone_radius,23434,_),d.white[e.white].creation_order.push(this.theme_stone_radius)),this.theme_stone_radius in d.black[e.black]||(d.black[e.black][this.theme_stone_radius]=this.theme_black.preRenderBlack(this.theme_stone_radius,2081,_),d.black[e.black].creation_order.push(this.theme_stone_radius)),o.MoveTree.stone_radius in d.white[e.white]||(d.white[e.white][o.MoveTree.stone_radius]=this.theme_white.preRenderWhite(o.MoveTree.stone_radius,23434,_),d.white[e.white].creation_order.push(o.MoveTree.stone_radius)),o.MoveTree.stone_radius in d.black[e.black]||(d.black[e.black][o.MoveTree.stone_radius]=this.theme_black.preRenderBlack(o.MoveTree.stone_radius,2081,_),d.black[e.black].creation_order.push(o.MoveTree.stone_radius))}catch(t){throw console.error("Error pre-rendering stones.",{themes:e,move_tree_stone_radius:o.MoveTree.stone_radius}),t}let u=500;try{/iP(ad|hone|od).+(Version\/[\d.]|OS \d.*like mac os x)+.*Safari/i.test(navigator.userAgent)&&(console.log("iOS device detected, reducing cache size"),u=12)}catch(e){console.error(e)}if(d.black[e.black].creation_order.length>u){const t=d.black[e.black].creation_order.shift();t&&(console.log("deleting old radius [black]",t),delete d.black[e.black][t])}if(d.white[e.white].creation_order.length>u){const t=d.white[e.white].creation_order.shift();t&&(console.log("deleting old radius [white]",t),delet