lichess-pgn-viewer
Version:
PGN viewer widget, designed to be embedded in content pages.
3 lines • 98.5 kB
JavaScript
var Pe=["a","b","c","d","e","f","g","h"],Je=["1","2","3","4","5","6","7","8"],$=["white","black"],U=["pawn","knight","bishop","rook","queen","king"],qn=["a","h"],oe=e=>"role"in e;var k=e=>e!==void 0,M=e=>e==="white"?"black":"white",J=e=>e>>3,B=e=>e&7,et=(e,t)=>0<=e&&e<8&&0<=t&&t<8?e+8*t:void 0,se=e=>{switch(e){case"pawn":return"p";case"knight":return"n";case"bishop":return"b";case"rook":return"r";case"queen":return"q";case"king":return"k"}};function Me(e){switch(e.toLowerCase()){case"p":return"pawn";case"n":return"knight";case"b":return"bishop";case"r":return"rook";case"q":return"queen";case"k":return"king";default:return}}function ue(e){if(e.length===2)return et(e.charCodeAt(0)-97,e.charCodeAt(1)-49)}var j=e=>Pe[B(e)]+Je[J(e)];var Lt=e=>oe(e)?`${se(e.role).toUpperCase()}@${j(e.to)}`:j(e.from)+j(e.to)+(e.promotion?se(e.promotion):""),Ke=(e,t)=>e==="white"?t==="a"?2:6:t==="a"?58:62,tt=(e,t)=>e==="white"?t==="a"?3:5:t==="a"?59:61;var Dn=e=>(e=e-(e>>>1&1431655765),e=(e&858993459)+(e>>>2&858993459),Math.imul(e+(e>>>4)&252645135,16843009)>>24),It=e=>(e=e>>>8&16711935|(e&16711935)<<8,e>>>16&65535|(e&65535)<<16),Bn=e=>(e=e>>>1&1431655765|(e&1431655765)<<1,e=e>>>2&858993459|(e&858993459)<<2,e=e>>>4&252645135|(e&252645135)<<4,It(e)),l=class e{constructor(t,n){this.lo=t|0,this.hi=n|0}static fromSquare(t){return t>=32?new e(0,1<<t-32):new e(1<<t,0)}static fromRank(t){return new e(255,0).shl64(8*t)}static fromFile(t){return new e(16843009<<t,16843009<<t)}static empty(){return new e(0,0)}static full(){return new e(4294967295,4294967295)}static corners(){return new e(129,2164260864)}static center(){return new e(402653184,24)}static backranks(){return new e(255,4278190080)}static backrank(t){return t==="white"?new e(255,0):new e(0,4278190080)}static lightSquares(){return new e(1437226410,1437226410)}static darkSquares(){return new e(2857740885,2857740885)}complement(){return new e(~this.lo,~this.hi)}xor(t){return new e(this.lo^t.lo,this.hi^t.hi)}union(t){return new e(this.lo|t.lo,this.hi|t.hi)}intersect(t){return new e(this.lo&t.lo,this.hi&t.hi)}diff(t){return new e(this.lo&~t.lo,this.hi&~t.hi)}intersects(t){return this.intersect(t).nonEmpty()}isDisjoint(t){return this.intersect(t).isEmpty()}supersetOf(t){return t.diff(this).isEmpty()}subsetOf(t){return this.diff(t).isEmpty()}shr64(t){return t>=64?e.empty():t>=32?new e(this.hi>>>t-32,0):t>0?new e(this.lo>>>t^this.hi<<32-t,this.hi>>>t):this}shl64(t){return t>=64?e.empty():t>=32?new e(0,this.lo<<t-32):t>0?new e(this.lo<<t,this.hi<<t^this.lo>>>32-t):this}bswap64(){return new e(It(this.hi),It(this.lo))}rbit64(){return new e(Bn(this.hi),Bn(this.lo))}minus64(t){let n=this.lo-t.lo,r=(n&t.lo&1)+(t.lo>>>1)+(n>>>1)>>>31;return new e(n,this.hi-(t.hi+r))}equals(t){return this.lo===t.lo&&this.hi===t.hi}size(){return Dn(this.lo)+Dn(this.hi)}isEmpty(){return this.lo===0&&this.hi===0}nonEmpty(){return this.lo!==0||this.hi!==0}has(t){return(t>=32?this.hi&1<<t-32:this.lo&1<<t)!==0}set(t,n){return n?this.with(t):this.without(t)}with(t){return t>=32?new e(this.lo,this.hi|1<<t-32):new e(this.lo|1<<t,this.hi)}without(t){return t>=32?new e(this.lo,this.hi&~(1<<t-32)):new e(this.lo&~(1<<t),this.hi)}toggle(t){return t>=32?new e(this.lo,this.hi^1<<t-32):new e(this.lo^1<<t,this.hi)}last(){if(this.hi!==0)return 63-Math.clz32(this.hi);if(this.lo!==0)return 31-Math.clz32(this.lo)}first(){if(this.lo!==0)return 31-Math.clz32(this.lo&-this.lo);if(this.hi!==0)return 63-Math.clz32(this.hi&-this.hi)}withoutFirst(){return this.lo!==0?new e(this.lo&this.lo-1,this.hi):new e(0,this.hi&this.hi-1)}moreThanOne(){return this.hi!==0&&this.lo!==0||(this.lo&this.lo-1)!==0||(this.hi&this.hi-1)!==0}singleSquare(){return this.moreThanOne()?void 0:this.last()}*[Symbol.iterator](){let t=this.lo,n=this.hi;for(;t!==0;){let r=31-Math.clz32(t&-t);t^=1<<r,yield r}for(;n!==0;){let r=31-Math.clz32(n&-n);n^=1<<r,yield 32+r}}*reversed(){let t=this.lo,n=this.hi;for(;n!==0;){let r=31-Math.clz32(n);n^=1<<r,yield 32+r}for(;t!==0;){let r=31-Math.clz32(t);t^=1<<r,yield r}}};var nt=(e,t)=>{let n=l.empty();for(let r of t){let i=e+r;0<=i&&i<64&&Math.abs(B(e)-B(i))<=2&&(n=n.with(i))}return n},ke=e=>{let t=[];for(let n=0;n<64;n++)t[n]=e(n);return t},Pi=ke(e=>nt(e,[-9,-8,-7,-1,1,7,8,9])),Mi=ke(e=>nt(e,[-17,-15,-10,-6,6,10,15,17])),Ei={white:ke(e=>nt(e,[7,9])),black:ke(e=>nt(e,[-7,-9]))},ae=e=>Pi[e],Te=e=>Mi[e],be=(e,t)=>Ei[e][t],Kt=ke(e=>l.fromFile(B(e)).without(e)),zt=ke(e=>l.fromRank(J(e)).without(e)),Ft=ke(e=>{let t=new l(134480385,2151686160),n=8*(J(e)-B(e));return(n>=0?t.shl64(n):t.shr64(-n)).without(e)}),Ht=ke(e=>{let t=new l(270549120,16909320),n=8*(J(e)+B(e)-7);return(n>=0?t.shl64(n):t.shr64(-n)).without(e)}),$t=(e,t,n)=>{let r=n.intersect(t),i=r.bswap64();return r=r.minus64(e),i=i.minus64(e.bswap64()),r.xor(i.bswap64()).intersect(t)},Ai=(e,t)=>$t(l.fromSquare(e),Kt[e],t),_i=(e,t)=>{let n=zt[e],r=t.intersect(n),i=r.rbit64();return r=r.minus64(l.fromSquare(e)),i=i.minus64(l.fromSquare(63-e)),r.xor(i.rbit64()).intersect(n)},we=(e,t)=>{let n=l.fromSquare(e);return $t(n,Ft[e],t).xor($t(n,Ht[e],t))},ve=(e,t)=>Ai(e,t).xor(_i(e,t)),ze=(e,t)=>we(e,t).xor(ve(e,t)),rt=(e,t,n)=>{switch(e.role){case"pawn":return be(e.color,t);case"knight":return Te(t);case"bishop":return we(t,n);case"rook":return ve(t,n);case"queen":return ze(t,n);case"king":return ae(t)}},Vt=(e,t)=>{let n=l.fromSquare(t);return zt[e].intersects(n)?zt[e].with(e):Ht[e].intersects(n)?Ht[e].with(e):Ft[e].intersects(n)?Ft[e].with(e):Kt[e].intersects(n)?Kt[e].with(e):l.empty()},ye=(e,t)=>Vt(e,t).intersect(l.full().shl64(e).xor(l.full().shl64(t))).withoutFirst();var he=class e{constructor(){}static default(){let t=new e;return t.reset(),t}reset(){this.occupied=new l(65535,4294901760),this.promoted=l.empty(),this.white=new l(65535,0),this.black=new l(0,4294901760),this.pawn=new l(65280,16711680),this.knight=new l(66,1107296256),this.bishop=new l(36,603979776),this.rook=new l(129,2164260864),this.queen=new l(8,134217728),this.king=new l(16,268435456)}static empty(){let t=new e;return t.clear(),t}clear(){this.occupied=l.empty(),this.promoted=l.empty();for(let t of $)this[t]=l.empty();for(let t of U)this[t]=l.empty()}clone(){let t=new e;t.occupied=this.occupied,t.promoted=this.promoted;for(let n of $)t[n]=this[n];for(let n of U)t[n]=this[n];return t}getColor(t){if(this.white.has(t))return"white";if(this.black.has(t))return"black"}getRole(t){for(let n of U)if(this[n].has(t))return n}get(t){let n=this.getColor(t);if(!n)return;let r=this.getRole(t),i=this.promoted.has(t);return{color:n,role:r,promoted:i}}take(t){let n=this.get(t);return n&&(this.occupied=this.occupied.without(t),this[n.color]=this[n.color].without(t),this[n.role]=this[n.role].without(t),n.promoted&&(this.promoted=this.promoted.without(t))),n}set(t,n){let r=this.take(t);return this.occupied=this.occupied.with(t),this[n.color]=this[n.color].with(t),this[n.role]=this[n.role].with(t),n.promoted&&(this.promoted=this.promoted.with(t)),r}has(t){return this.occupied.has(t)}*[Symbol.iterator](){for(let t of this.occupied)yield[t,this.get(t)]}pieces(t,n){return this[t].intersect(this[n])}rooksAndQueens(){return this.rook.union(this.queen)}bishopsAndQueens(){return this.bishop.union(this.queen)}kingOf(t){return this.pieces(t,"king").singleSquare()}};var de=class e{constructor(){}static empty(){let t=new e;for(let n of U)t[n]=0;return t}static fromBoard(t,n){let r=new e;for(let i of U)r[i]=t.pieces(n,i).size();return r}clone(){let t=new e;for(let n of U)t[n]=this[n];return t}equals(t){return U.every(n=>this[n]===t[n])}add(t){let n=new e;for(let r of U)n[r]=this[r]+t[r];return n}subtract(t){let n=new e;for(let r of U)n[r]=this[r]-t[r];return n}nonEmpty(){return U.some(t=>this[t]>0)}isEmpty(){return!this.nonEmpty()}hasPawns(){return this.pawn>0}hasNonPawns(){return this.knight>0||this.bishop>0||this.rook>0||this.queen>0||this.king>0}size(){return this.pawn+this.knight+this.bishop+this.rook+this.queen+this.king}},Ee=class e{constructor(t,n){this.white=t,this.black=n}static empty(){return new e(de.empty(),de.empty())}static fromBoard(t){return new e(de.fromBoard(t,"white"),de.fromBoard(t,"black"))}clone(){return new e(this.white.clone(),this.black.clone())}equals(t){return this.white.equals(t.white)&&this.black.equals(t.black)}add(t){return new e(this.white.add(t.white),this.black.add(t.black))}subtract(t){return new e(this.white.subtract(t.white),this.black.subtract(t.black))}count(t){return this.white[t]+this.black[t]}size(){return this.white.size()+this.black.size()}isEmpty(){return this.white.isEmpty()&&this.black.isEmpty()}nonEmpty(){return!this.isEmpty()}hasPawns(){return this.white.hasPawns()||this.black.hasPawns()}hasNonPawns(){return this.white.hasNonPawns()||this.black.hasNonPawns()}},xe=class e{constructor(t,n){this.white=t,this.black=n}static default(){return new e(3,3)}clone(){return new e(this.white,this.black)}equals(t){return this.white===t.white&&this.black===t.black}};var it=class{unwrap(t,n){let r=this._chain(i=>m.ok(t?t(i):i),i=>n?m.ok(n(i)):m.err(i));if(r.isErr)throw r.error;return r.value}map(t,n){return this._chain(r=>m.ok(t(r)),r=>m.err(n?n(r):r))}chain(t,n){return this._chain(t,n||(r=>m.err(r)))}},Gt=class extends it{constructor(t){super(),this.value=void 0,this.isOk=!0,this.isErr=!1,this.value=t}_chain(t,n){return t(this.value)}},Wt=class extends it{constructor(t){super(),this.error=void 0,this.isOk=!1,this.isErr=!0,this.error=t}_chain(t,n){return n(this.error)}},m;(function(e){e.ok=function(t){return new Gt(t)},e.err=function(t){return new Wt(t||new Error)},e.all=function(t){if(Array.isArray(t)){let i=[];for(let o=0;o<t.length;o++){let s=t[o];if(s.isErr)return s;i.push(s.value)}return e.ok(i)}let n={},r=Object.keys(t);for(let i=0;i<r.length;i++){let o=t[r[i]];if(o.isErr)return o;n[r[i]]=o.value}return e.ok(n)}})(m||(m={}));var q;(function(e){e.Empty="ERR_EMPTY",e.OppositeCheck="ERR_OPPOSITE_CHECK",e.PawnsOnBackrank="ERR_PAWNS_ON_BACKRANK",e.Kings="ERR_KINGS",e.Variant="ERR_VARIANT"})(q||(q={}));var D=class extends Error{},Ni=(e,t,n,r)=>n[t].intersect(ve(e,r).intersect(n.rooksAndQueens()).union(we(e,r).intersect(n.bishopsAndQueens())).union(Te(e).intersect(n.knight)).union(ae(e).intersect(n.king)).union(be(M(t),e).intersect(n.pawn))),ce=class e{constructor(){}static default(){let t=new e;return t.castlingRights=l.corners(),t.rook={white:{a:0,h:7},black:{a:56,h:63}},t.path={white:{a:new l(14,0),h:new l(96,0)},black:{a:new l(0,234881024),h:new l(0,1610612736)}},t}static empty(){let t=new e;return t.castlingRights=l.empty(),t.rook={white:{a:void 0,h:void 0},black:{a:void 0,h:void 0}},t.path={white:{a:l.empty(),h:l.empty()},black:{a:l.empty(),h:l.empty()}},t}clone(){let t=new e;return t.castlingRights=this.castlingRights,t.rook={white:{a:this.rook.white.a,h:this.rook.white.h},black:{a:this.rook.black.a,h:this.rook.black.h}},t.path={white:{a:this.path.white.a,h:this.path.white.h},black:{a:this.path.black.a,h:this.path.black.h}},t}add(t,n,r,i){let o=Ke(t,n),s=tt(t,n);this.castlingRights=this.castlingRights.with(i),this.rook[t][n]=i,this.path[t][n]=ye(i,s).with(s).union(ye(r,o).with(o)).without(r).without(i)}static fromSetup(t){let n=e.empty(),r=t.castlingRights.intersect(t.board.rook);for(let i of $){let o=l.backrank(i),s=t.board.kingOf(i);if(!k(s)||!o.has(s))continue;let a=r.intersect(t.board[i]).intersect(o),u=a.first();k(u)&&u<s&&n.add(i,"a",s,u);let c=a.last();k(c)&&s<c&&n.add(i,"h",s,c)}return n}discardRook(t){if(this.castlingRights.has(t)){this.castlingRights=this.castlingRights.without(t);for(let n of $)for(let r of qn)this.rook[n][r]===t&&(this.rook[n][r]=void 0)}}discardColor(t){this.castlingRights=this.castlingRights.diff(l.backrank(t)),this.rook[t].a=void 0,this.rook[t].h=void 0}},ee=class{constructor(t){this.rules=t}reset(){this.board=he.default(),this.pockets=void 0,this.turn="white",this.castles=ce.default(),this.epSquare=void 0,this.remainingChecks=void 0,this.halfmoves=0,this.fullmoves=1}setupUnchecked(t){this.board=t.board.clone(),this.board.promoted=l.empty(),this.pockets=void 0,this.turn=t.turn,this.castles=ce.fromSetup(t),this.epSquare=Ri(this,t.epSquare),this.remainingChecks=void 0,this.halfmoves=t.halfmoves,this.fullmoves=t.fullmoves}kingAttackers(t,n,r){return Ni(t,n,this.board,r)}playCaptureAt(t,n){this.halfmoves=0,n.role==="rook"&&this.castles.discardRook(t),this.pockets&&this.pockets[M(n.color)][n.promoted?"pawn":n.role]++}ctx(){let t=this.isVariantEnd(),n=this.board.kingOf(this.turn);if(!k(n))return{king:n,blockers:l.empty(),checkers:l.empty(),variantEnd:t,mustCapture:!1};let r=ve(n,l.empty()).intersect(this.board.rooksAndQueens()).union(we(n,l.empty()).intersect(this.board.bishopsAndQueens())).intersect(this.board[M(this.turn)]),i=l.empty();for(let s of r){let a=ye(n,s).intersect(this.board.occupied);a.moreThanOne()||(i=i.union(a))}let o=this.kingAttackers(n,M(this.turn),this.board.occupied);return{king:n,blockers:i,checkers:o,variantEnd:t,mustCapture:!1}}clone(){var t,n;let r=new this.constructor;return r.board=this.board.clone(),r.pockets=(t=this.pockets)===null||t===void 0?void 0:t.clone(),r.turn=this.turn,r.castles=this.castles.clone(),r.epSquare=this.epSquare,r.remainingChecks=(n=this.remainingChecks)===null||n===void 0?void 0:n.clone(),r.halfmoves=this.halfmoves,r.fullmoves=this.fullmoves,r}validate(){if(this.board.occupied.isEmpty())return m.err(new D(q.Empty));if(this.board.king.size()!==2)return m.err(new D(q.Kings));if(!k(this.board.kingOf(this.turn)))return m.err(new D(q.Kings));let t=this.board.kingOf(M(this.turn));return k(t)?this.kingAttackers(t,this.turn,this.board.occupied).nonEmpty()?m.err(new D(q.OppositeCheck)):l.backranks().intersects(this.board.pawn)?m.err(new D(q.PawnsOnBackrank)):m.ok(void 0):m.err(new D(q.Kings))}dropDests(t){return l.empty()}dests(t,n){if(n=n||this.ctx(),n.variantEnd)return l.empty();let r=this.board.get(t);if(!r||r.color!==this.turn)return l.empty();let i,o;if(r.role==="pawn"){i=be(this.turn,t).intersect(this.board[M(this.turn)]);let s=this.turn==="white"?8:-8,a=t+s;if(0<=a&&a<64&&!this.board.occupied.has(a)){i=i.with(a);let u=this.turn==="white"?t<16:t>=48,c=a+s;u&&!this.board.occupied.has(c)&&(i=i.with(c))}k(this.epSquare)&&Ti(this,t,n)&&(o=l.fromSquare(this.epSquare))}else r.role==="bishop"?i=we(t,this.board.occupied):r.role==="knight"?i=Te(t):r.role==="rook"?i=ve(t,this.board.occupied):r.role==="queen"?i=ze(t,this.board.occupied):i=ae(t);if(i=i.diff(this.board[this.turn]),k(n.king)){if(r.role==="king"){let s=this.board.occupied.without(t);for(let a of i)this.kingAttackers(a,M(this.turn),s).nonEmpty()&&(i=i.without(a));return i.union(ot(this,"a",n)).union(ot(this,"h",n))}if(n.checkers.nonEmpty()){let s=n.checkers.singleSquare();if(!k(s))return l.empty();i=i.intersect(ye(s,n.king).with(s))}n.blockers.has(t)&&(i=i.intersect(Vt(t,n.king)))}return o&&(i=i.union(o)),i}isVariantEnd(){return!1}variantOutcome(t){}hasInsufficientMaterial(t){return this.board[t].intersect(this.board.pawn.union(this.board.rooksAndQueens())).nonEmpty()?!1:this.board[t].intersects(this.board.knight)?this.board[t].size()<=2&&this.board[M(t)].diff(this.board.king).diff(this.board.queen).isEmpty():this.board[t].intersects(this.board.bishop)?(!this.board.bishop.intersects(l.darkSquares())||!this.board.bishop.intersects(l.lightSquares()))&&this.board.pawn.isEmpty()&&this.board.knight.isEmpty():!0}toSetup(){var t,n;return{board:this.board.clone(),pockets:(t=this.pockets)===null||t===void 0?void 0:t.clone(),turn:this.turn,castlingRights:this.castles.castlingRights,epSquare:Oi(this),remainingChecks:(n=this.remainingChecks)===null||n===void 0?void 0:n.clone(),halfmoves:Math.min(this.halfmoves,150),fullmoves:Math.min(Math.max(this.fullmoves,1),9999)}}isInsufficientMaterial(){return $.every(t=>this.hasInsufficientMaterial(t))}hasDests(t){t=t||this.ctx();for(let n of this.board[this.turn])if(this.dests(n,t).nonEmpty())return!0;return this.dropDests(t).nonEmpty()}isLegal(t,n){if(oe(t))return!this.pockets||this.pockets[this.turn][t.role]<=0||t.role==="pawn"&&l.backranks().has(t.to)?!1:this.dropDests(n).has(t.to);{if(t.promotion==="pawn"||t.promotion==="king"&&this.rules!=="antichess"||!!t.promotion!==(this.board.pawn.has(t.from)&&l.backranks().has(t.to)))return!1;let r=this.dests(t.from,n);return r.has(t.to)||r.has(Ln(this,t).to)}}isCheck(){let t=this.board.kingOf(this.turn);return k(t)&&this.kingAttackers(t,M(this.turn),this.board.occupied).nonEmpty()}isEnd(t){return(t?t.variantEnd:this.isVariantEnd())?!0:this.isInsufficientMaterial()||!this.hasDests(t)}isCheckmate(t){return t=t||this.ctx(),!t.variantEnd&&t.checkers.nonEmpty()&&!this.hasDests(t)}isStalemate(t){return t=t||this.ctx(),!t.variantEnd&&t.checkers.isEmpty()&&!this.hasDests(t)}outcome(t){let n=this.variantOutcome(t);return n||(t=t||this.ctx(),this.isCheckmate(t)?{winner:M(this.turn)}:this.isInsufficientMaterial()||this.isStalemate(t)?{winner:void 0}:void 0)}allDests(t){t=t||this.ctx();let n=new Map;if(t.variantEnd)return n;for(let r of this.board[this.turn])n.set(r,this.dests(r,t));return n}play(t){let n=this.turn,r=this.epSquare,i=Ut(this,t);if(this.epSquare=void 0,this.halfmoves+=1,n==="black"&&(this.fullmoves+=1),this.turn=M(n),oe(t))this.board.set(t.to,{role:t.role,color:n}),this.pockets&&this.pockets[n][t.role]--,t.role==="pawn"&&(this.halfmoves=0);else{let o=this.board.take(t.from);if(!o)return;let s;if(o.role==="pawn"){this.halfmoves=0,t.to===r&&(s=this.board.take(t.to+(n==="white"?-8:8)));let a=t.from-t.to;Math.abs(a)===16&&8<=t.from&&t.from<=55&&(this.epSquare=t.from+t.to>>1),t.promotion&&(o.role=t.promotion,o.promoted=!!this.pockets)}else if(o.role==="rook")this.castles.discardRook(t.from);else if(o.role==="king"){if(i){let a=this.castles.rook[n][i];if(k(a)){let u=this.board.take(a);this.board.set(Ke(n,i),o),u&&this.board.set(tt(n,i),u)}}this.castles.discardColor(n)}if(!i){let a=this.board.set(t.to,o)||s;a&&this.playCaptureAt(t.to,a)}}this.remainingChecks&&this.isCheck()&&(this.remainingChecks[n]=Math.max(this.remainingChecks[n]-1,0))}},Fe=class extends ee{constructor(){super("chess")}static default(){let t=new this;return t.reset(),t}static fromSetup(t){let n=new this;return n.setupUnchecked(t),n.validate().map(r=>n)}clone(){return super.clone()}},Ri=(e,t)=>{if(!k(t))return;let n=e.turn==="white"?5:2,r=e.turn==="white"?8:-8;if(J(t)!==n||e.board.occupied.has(t+r))return;let i=t-r;if(!(!e.board.pawn.has(i)||!e.board[M(e.turn)].has(i)))return t},Oi=e=>{if(!k(e.epSquare))return;let t=e.ctx(),r=e.board.pieces(e.turn,"pawn").intersect(be(M(e.turn),e.epSquare));for(let i of r)if(e.dests(i,t).has(e.epSquare))return e.epSquare},Ti=(e,t,n)=>{if(!k(e.epSquare)||!be(e.turn,t).has(e.epSquare))return!1;if(!k(n.king))return!0;let r=e.turn==="white"?8:-8,i=e.epSquare-r;return e.kingAttackers(n.king,M(e.turn),e.board.occupied.toggle(t).toggle(i).with(e.epSquare)).without(i).isEmpty()},ot=(e,t,n)=>{if(!k(n.king)||n.checkers.nonEmpty())return l.empty();let r=e.castles.rook[e.turn][t];if(!k(r))return l.empty();if(e.castles.path[e.turn][t].intersects(e.board.occupied))return l.empty();let i=Ke(e.turn,t),o=ye(n.king,i),s=e.board.occupied.without(n.king);for(let c of o)if(e.kingAttackers(c,M(e.turn),s).nonEmpty())return l.empty();let a=tt(e.turn,t),u=e.board.occupied.toggle(n.king).toggle(r).toggle(a);return e.kingAttackers(i,M(e.turn),u).nonEmpty()?l.empty():l.fromSquare(r)},st=(e,t,n)=>{if(n.variantEnd)return l.empty();let r=e.board.get(t);if(!r||r.color!==e.turn)return l.empty();let i=rt(r,t,e.board.occupied);if(r.role==="pawn"){let o=e.board[M(e.turn)];k(e.epSquare)&&(o=o.with(e.epSquare)),i=i.intersect(o);let s=e.turn==="white"?8:-8,a=t+s;if(0<=a&&a<64&&!e.board.occupied.has(a)){i=i.with(a);let u=e.turn==="white"?t<16:t>=48,c=a+s;u&&!e.board.occupied.has(c)&&(i=i.with(c))}return i}else i=i.diff(e.board[e.turn]);return t===n.king?i.union(ot(e,"a",n)).union(ot(e,"h",n)):i};var Ut=(e,t)=>{if(oe(t))return;let n=t.to-t.from;if(!(Math.abs(n)!==2&&!e.board[e.turn].has(t.to))&&e.board.king.has(t.from))return n>0?"h":"a"},Ln=(e,t)=>{let n=Ut(e,t);if(!n)return t;let r=e.castles.rook[e.turn][n];return{from:t.from,to:k(r)?r:t.to}};var In=e=>oe(e)?String.fromCharCode(35+e.to,99+8*5+["queen","rook","bishop","knight","pawn"].indexOf(e.role)):String.fromCharCode(35+e.from,e.promotion?99+8*["queen","rook","bishop","knight","king"].indexOf(e.promotion)+B(e.to):35+e.to);var Di="rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR",Bi=Di+" w KQkq -",wa=Bi+" 0 1",Li="8/8/8/8/8/8/8/8",Ii=Li+" w - -",va=Ii+" 0 1",z;(function(e){e.Fen="ERR_FEN",e.Board="ERR_BOARD",e.Pockets="ERR_POCKETS",e.Turn="ERR_TURN",e.Castling="ERR_CASTLING",e.EpSquare="ERR_EP_SQUARE",e.RemainingChecks="ERR_REMAINING_CHECKS",e.Halfmoves="ERR_HALFMOVES",e.Fullmoves="ERR_FULLMOVES"})(z||(z={}));var F=class extends Error{},Ki=(e,t,n)=>{let r=e.indexOf(t);for(;n-- >0&&r!==-1;)r=e.indexOf(t,r+t.length);return r},qe=e=>/^\d{1,4}$/.test(e)?parseInt(e,10):void 0,Hn=e=>{let t=Me(e);return t&&{role:t,color:e.toLowerCase()===e?"black":"white"}},jt=e=>{let t=he.empty(),n=7,r=0;for(let i=0;i<e.length;i++){let o=e[i];if(o==="/"&&r===8)r=0,n--;else{let s=parseInt(o,10);if(s>0)r+=s;else{if(r>=8||n<0)return m.err(new F(z.Board));let a=r+n*8,u=Hn(o);if(!u)return m.err(new F(z.Board));e[i+1]==="~"&&(u.promoted=!0,i++),t.set(a,u),r++}}}return n!==0||r!==8?m.err(new F(z.Board)):m.ok(t)},Kn=e=>{if(e.length>64)return m.err(new F(z.Pockets));let t=Ee.empty();for(let n of e){let r=Hn(n);if(!r)return m.err(new F(z.Pockets));t[r.color][r.role]++}return m.ok(t)},zi=(e,t)=>{let n=l.empty();if(t==="-")return m.ok(n);for(let r of t){let i=r.toLowerCase(),o=r===i?"black":"white",s=o==="white"?0:7;if("a"<=i&&i<="h")n=n.with(et(i.charCodeAt(0)-97,s));else if(i==="k"||i==="q"){let a=e[o].intersect(l.backrank(o)).intersect(e.rook.union(e.king)),u=i==="k"?a.last():a.first();n=n.with(k(u)&&e.rook.has(u)?u:et(i==="k"?7:0,s))}else return m.err(new F(z.Castling))}return $.some(r=>l.backrank(r).intersect(n).size()>2)?m.err(new F(z.Castling)):m.ok(n)},zn=e=>{let t=e.split("+");if(t.length===3&&t[0]===""){let n=qe(t[1]),r=qe(t[2]);return!k(n)||n>3||!k(r)||r>3?m.err(new F(z.RemainingChecks)):m.ok(new xe(3-n,3-r))}else if(t.length===2){let n=qe(t[0]),r=qe(t[1]);return!k(n)||n>3||!k(r)||r>3?m.err(new F(z.RemainingChecks)):m.ok(new xe(n,r))}else return m.err(new F(z.RemainingChecks))},$n=e=>{let t=e.split(/[\s_]+/),n=t.shift(),r,i=m.ok(void 0);if(n.endsWith("]")){let a=n.indexOf("[");if(a===-1)return m.err(new F(z.Fen));r=jt(n.slice(0,a)),i=Kn(n.slice(a+1,-1))}else{let a=Ki(n,"/",7);a===-1?r=jt(n):(r=jt(n.slice(0,a)),i=Kn(n.slice(a+1)))}let o,s=t.shift();if(!k(s)||s==="w")o="white";else if(s==="b")o="black";else return m.err(new F(z.Turn));return r.chain(a=>{let u=t.shift(),c=k(u)?zi(a,u):m.ok(l.empty()),p=t.shift(),f;if(k(p)&&p!=="-"&&(f=ue(p),!k(f)))return m.err(new F(z.EpSquare));let S=t.shift(),b;k(S)&&S.includes("+")&&(b=zn(S),S=t.shift());let h=k(S)?qe(S):0;if(!k(h))return m.err(new F(z.Halfmoves));let d=t.shift(),w=k(d)?qe(d):1;if(!k(w))return m.err(new F(z.Fullmoves));let g=t.shift(),y=m.ok(void 0);if(k(g)){if(k(b))return m.err(new F(z.RemainingChecks));y=zn(g)}else k(b)&&(y=b);return t.length>0?m.err(new F(z.Fen)):i.chain(A=>c.chain(x=>y.map(C=>({board:a,pockets:A,turn:o,castlingRights:x,remainingChecks:C,epSquare:f,halfmoves:h,fullmoves:Math.max(1,w)}))))})};var Fi=e=>{let t=se(e.role);return e.color==="white"&&(t=t.toUpperCase()),e.promoted&&(t+="~"),t},Hi=e=>{let t="",n=0;for(let r=7;r>=0;r--)for(let i=0;i<8;i++){let o=i+r*8,s=e.get(o);s?(n>0&&(t+=n,n=0),t+=Fi(s)):n++,i===7&&(n>0&&(t+=n,n=0),r!==0&&(t+="/"))}return t},Fn=e=>U.map(t=>se(t).repeat(e[t])).join(""),$i=e=>Fn(e.white).toUpperCase()+Fn(e.black),Vi=(e,t)=>{let n="";for(let r of $){let i=l.backrank(r),o=e.kingOf(r);k(o)&&!i.has(o)&&(o=void 0);let s=e.pieces(r,"rook").intersect(i);for(let a of t.intersect(i).reversed())if(a===s.first()&&k(o)&&a<o)n+=r==="white"?"Q":"q";else if(a===s.last()&&k(o)&&o<a)n+=r==="white"?"K":"k";else{let u=Pe[B(a)];n+=r==="white"?u.toUpperCase():u}}return n||"-"},Gi=e=>`${e.white}+${e.black}`,at=(e,t)=>[Hi(e.board)+(e.pockets?`[${$i(e.pockets)}]`:""),e.turn[0],Vi(e.board,e.castlingRights),k(e.epSquare)?j(e.epSquare):"-",...e.remainingChecks?[Gi(e.remainingChecks)]:[],...t?.epd?[]:[Math.max(0,Math.min(e.halfmoves,9999)),Math.max(1,Math.min(e.fullmoves,9999))]].join(" ");var Ui=(e,t)=>{let n="";if(oe(t))t.role!=="pawn"&&(n=se(t.role).toUpperCase()),n+="@"+j(t.to);else{let r=e.board.getRole(t.from);if(!r)return"--";if(r==="king"&&(e.board[e.turn].has(t.to)||Math.abs(t.to-t.from)===2))n=t.to>t.from?"O-O":"O-O-O";else{let i=e.board.occupied.has(t.to)||r==="pawn"&&B(t.from)!==B(t.to);if(r!=="pawn"){n=se(r).toUpperCase();let o;if(r==="king"?o=ae(t.to).intersect(e.board.king):r==="queen"?o=ze(t.to,e.board.occupied).intersect(e.board.queen):r==="rook"?o=ve(t.to,e.board.occupied).intersect(e.board.rook):r==="bishop"?o=we(t.to,e.board.occupied).intersect(e.board.bishop):o=Te(t.to).intersect(e.board.knight),o=o.intersect(e.board[e.turn]).without(t.from),o.nonEmpty()){let s=e.ctx();for(let a of o)e.dests(a,s).has(t.to)||(o=o.without(a));if(o.nonEmpty()){let a=!1,u=o.intersects(l.fromRank(J(t.from)));o.intersects(l.fromFile(B(t.from)))?a=!0:u=!0,u&&(n+=Pe[B(t.from)]),a&&(n+=Je[J(t.from)])}}}else i&&(n=Pe[B(t.from)]);i&&(n+="x"),n+=j(t.to),t.promotion&&(n+="="+se(t.promotion).toUpperCase())}}return n},Vn=(e,t)=>{var n;let r=Ui(e,t);return e.play(t),!((n=e.outcome())===null||n===void 0)&&n.winner?r+"#":e.isCheck()?r+"+":r};var Gn=(e,t)=>{let n=e.ctx(),r=t.match(/^([NBRQK])?([a-h])?([1-8])?[-x]?([a-h][1-8])(?:=?([nbrqkNBRQK]))?[+#]?$/);if(!r){let p;if(t==="O-O"||t==="O-O+"||t==="O-O#"?p="h":(t==="O-O-O"||t==="O-O-O+"||t==="O-O-O#")&&(p="a"),p){let b=e.castles.rook[e.turn][p];return!k(n.king)||!k(b)||!e.dests(n.king,n).has(b)?void 0:{from:n.king,to:b}}let f=t.match(/^([pnbrqkPNBRQK])?@([a-h][1-8])[+#]?$/);if(!f)return;let S={role:f[1]?Me(f[1]):"pawn",to:ue(f[2])};return e.isLegal(S,n)?S:void 0}let i=r[1]?Me(r[1]):"pawn",o=ue(r[4]),s=r[5]?Me(r[5]):void 0;if(!!s!==(i==="pawn"&&l.backranks().has(o))||s==="king"&&e.rules!=="antichess")return;let a=e.board.pieces(e.turn,i);i==="pawn"&&!r[2]?a=a.intersect(l.fromFile(B(o))):r[2]&&(a=a.intersect(l.fromFile(r[2].charCodeAt(0)-97))),r[3]&&(a=a.intersect(l.fromRank(r[3].charCodeAt(0)-49)));let u=i==="pawn"?l.fromFile(B(o)):l.empty();a=a.intersect(u.union(rt({color:M(e.turn),role:i},o,e.board.occupied)));let c;for(let p of a)if(e.dests(p,n).has(o)){if(k(c))return;c=p}if(k(c))return{from:c,to:o,promotion:s}};var ct=class extends ee{constructor(){super("crazyhouse")}reset(){super.reset(),this.pockets=Ee.empty()}setupUnchecked(t){super.setupUnchecked(t),this.board.promoted=t.board.promoted.intersect(t.board.occupied).diff(t.board.king).diff(t.board.pawn),this.pockets=t.pockets?t.pockets.clone():Ee.empty()}static default(){let t=new this;return t.reset(),t}static fromSetup(t){let n=new this;return n.setupUnchecked(t),n.validate().map(r=>n)}clone(){return super.clone()}validate(){return super.validate().chain(t=>{var n,r;return!((n=this.pockets)===null||n===void 0)&&n.count("king")?m.err(new D(q.Kings)):(((r=this.pockets)===null||r===void 0?void 0:r.size())||0)+this.board.occupied.size()>64?m.err(new D(q.Variant)):m.ok(void 0)})}hasInsufficientMaterial(t){return this.pockets?this.board.occupied.size()+this.pockets.size()<=3&&this.board.pawn.isEmpty()&&this.board.promoted.isEmpty()&&this.board.rooksAndQueens().isEmpty()&&this.pockets.count("pawn")<=0&&this.pockets.count("rook")<=0&&this.pockets.count("queen")<=0:super.hasInsufficientMaterial(t)}dropDests(t){var n,r;let i=this.board.occupied.complement().intersect(!((n=this.pockets)===null||n===void 0)&&n[this.turn].hasNonPawns()?l.full():!((r=this.pockets)===null||r===void 0)&&r[this.turn].hasPawns()?l.backranks().complement():l.empty());if(t=t||this.ctx(),k(t.king)&&t.checkers.nonEmpty()){let o=t.checkers.singleSquare();return k(o)?i.intersect(ye(o,t.king)):l.empty()}else return i}},lt=class extends ee{constructor(){super("atomic")}static default(){let t=new this;return t.reset(),t}static fromSetup(t){let n=new this;return n.setupUnchecked(t),n.validate().map(r=>n)}clone(){return super.clone()}validate(){if(this.board.occupied.isEmpty())return m.err(new D(q.Empty));if(this.board.king.size()>2)return m.err(new D(q.Kings));let t=this.board.kingOf(M(this.turn));return k(t)?this.kingAttackers(t,this.turn,this.board.occupied).nonEmpty()?m.err(new D(q.OppositeCheck)):l.backranks().intersects(this.board.pawn)?m.err(new D(q.PawnsOnBackrank)):m.ok(void 0):m.err(new D(q.Kings))}kingAttackers(t,n,r){let i=this.board.pieces(n,"king");return i.isEmpty()||ae(t).intersects(i)?l.empty():super.kingAttackers(t,n,r)}playCaptureAt(t,n){super.playCaptureAt(t,n),this.board.take(t);for(let r of ae(t).intersect(this.board.occupied).diff(this.board.pawn)){let i=this.board.take(r);i?.role==="rook"&&this.castles.discardRook(r),i?.role==="king"&&this.castles.discardColor(i.color)}}hasInsufficientMaterial(t){if(this.board.pieces(M(t),"king").isEmpty())return!1;if(this.board[t].diff(this.board.king).isEmpty())return!0;if(this.board[M(t)].diff(this.board.king).nonEmpty()){if(this.board.occupied.equals(this.board.bishop.union(this.board.king))){if(!this.board.bishop.intersect(this.board.white).intersects(l.darkSquares()))return!this.board.bishop.intersect(this.board.black).intersects(l.lightSquares());if(!this.board.bishop.intersect(this.board.white).intersects(l.lightSquares()))return!this.board.bishop.intersect(this.board.black).intersects(l.darkSquares())}return!1}return this.board.queen.nonEmpty()||this.board.pawn.nonEmpty()?!1:this.board.knight.union(this.board.bishop).union(this.board.rook).size()===1?!0:this.board.occupied.equals(this.board.knight.union(this.board.king))?this.board.knight.size()<=2:!1}dests(t,n){n=n||this.ctx();let r=l.empty();for(let i of st(this,t,n)){let o=this.clone();o.play({from:t,to:i});let s=o.board.kingOf(this.turn);k(s)&&(!k(o.board.kingOf(o.turn))||o.kingAttackers(s,o.turn,o.board.occupied).isEmpty())&&(r=r.with(i))}return r}isVariantEnd(){return!!this.variantOutcome()}variantOutcome(t){for(let n of $)if(this.board.pieces(n,"king").isEmpty())return{winner:M(n)}}},ut=class extends ee{constructor(){super("antichess")}reset(){super.reset(),this.castles=ce.empty()}setupUnchecked(t){super.setupUnchecked(t),this.castles=ce.empty()}static default(){let t=new this;return t.reset(),t}static fromSetup(t){let n=new this;return n.setupUnchecked(t),n.validate().map(r=>n)}clone(){return super.clone()}validate(){return this.board.occupied.isEmpty()?m.err(new D(q.Empty)):l.backranks().intersects(this.board.pawn)?m.err(new D(q.PawnsOnBackrank)):m.ok(void 0)}kingAttackers(t,n,r){return l.empty()}ctx(){let t=super.ctx();if(k(this.epSquare)&&be(M(this.turn),this.epSquare).intersects(this.board.pieces(this.turn,"pawn")))return t.mustCapture=!0,t;let n=this.board[M(this.turn)];for(let r of this.board[this.turn])if(st(this,r,t).intersects(n))return t.mustCapture=!0,t;return t}dests(t,n){n=n||this.ctx();let r=st(this,t,n),i=this.board[M(this.turn)];return r.intersect(n.mustCapture?k(this.epSquare)&&this.board.getRole(t)==="pawn"?i.with(this.epSquare):i:l.full())}hasInsufficientMaterial(t){if(this.board[t].isEmpty())return!1;if(this.board[M(t)].isEmpty())return!0;if(this.board.occupied.equals(this.board.bishop)){let n=this.board[t].intersects(l.lightSquares()),r=this.board[t].intersects(l.darkSquares()),i=this.board[M(t)].isDisjoint(l.lightSquares()),o=this.board[M(t)].isDisjoint(l.darkSquares());return n&&i||r&&o}return this.board.occupied.equals(this.board.knight)&&this.board.occupied.size()===2?this.board.white.intersects(l.lightSquares())!==this.board.black.intersects(l.darkSquares())!=(this.turn===t):!1}isVariantEnd(){return this.board[this.turn].isEmpty()}variantOutcome(t){if(t=t||this.ctx(),t.variantEnd||this.isStalemate(t))return{winner:this.turn}}},ht=class extends ee{constructor(){super("kingofthehill")}static default(){let t=new this;return t.reset(),t}static fromSetup(t){let n=new this;return n.setupUnchecked(t),n.validate().map(r=>n)}clone(){return super.clone()}hasInsufficientMaterial(t){return!1}isVariantEnd(){return this.board.king.intersects(l.center())}variantOutcome(t){for(let n of $)if(this.board.pieces(n,"king").intersects(l.center()))return{winner:n}}},dt=class extends ee{constructor(){super("3check")}reset(){super.reset(),this.remainingChecks=xe.default()}setupUnchecked(t){var n;super.setupUnchecked(t),this.remainingChecks=((n=t.remainingChecks)===null||n===void 0?void 0:n.clone())||xe.default()}static default(){let t=new this;return t.reset(),t}static fromSetup(t){let n=new this;return n.setupUnchecked(t),n.validate().map(r=>n)}clone(){return super.clone()}hasInsufficientMaterial(t){return this.board.pieces(t,"king").equals(this.board[t])}isVariantEnd(){return!!this.remainingChecks&&(this.remainingChecks.white<=0||this.remainingChecks.black<=0)}variantOutcome(t){if(this.remainingChecks){for(let n of $)if(this.remainingChecks[n]<=0)return{winner:n}}}},Yi=()=>{let e=he.empty();return e.occupied=new l(65535,0),e.promoted=l.empty(),e.white=new l(61680,0),e.black=new l(3855,0),e.pawn=l.empty(),e.knight=new l(6168,0),e.bishop=new l(9252,0),e.rook=new l(16962,0),e.queen=new l(129,0),e.king=new l(33024,0),e},ft=class extends ee{constructor(){super("racingkings")}reset(){this.board=Yi(),this.pockets=void 0,this.turn="white",this.castles=ce.empty(),this.epSquare=void 0,this.remainingChecks=void 0,this.halfmoves=0,this.fullmoves=1}setupUnchecked(t){super.setupUnchecked(t),this.castles=ce.empty()}static default(){let t=new this;return t.reset(),t}static fromSetup(t){let n=new this;return n.setupUnchecked(t),n.validate().map(r=>n)}clone(){return super.clone()}validate(){return this.isCheck()||this.board.pawn.nonEmpty()?m.err(new D(q.Variant)):super.validate()}dests(t,n){if(n=n||this.ctx(),t===n.king)return super.dests(t,n);let r=l.empty();for(let i of super.dests(t,n)){let o={from:t,to:i},s=this.clone();s.play(o),s.isCheck()||(r=r.with(i))}return r}hasInsufficientMaterial(t){return!1}isVariantEnd(){let t=l.fromRank(7),n=this.board.king.intersect(t);if(n.isEmpty())return!1;if(this.turn==="white"||n.intersects(this.board.black))return!0;let r=this.board.kingOf("black");if(k(r)){let i=this.board.occupied.without(r);for(let o of ae(r).intersect(t).diff(this.board.black))if(this.kingAttackers(o,"white",i).isEmpty())return!1}return!0}variantOutcome(t){if(t?!t.variantEnd:!this.isVariantEnd())return;let n=l.fromRank(7),r=this.board.pieces("black","king").intersects(n),i=this.board.pieces("white","king").intersects(n);return r&&!i?{winner:"black"}:i&&!r?{winner:"white"}:{winner:void 0}}},Zi=()=>{let e=he.empty();return e.occupied=new l(4294967295,4294901862),e.promoted=l.empty(),e.white=new l(4294967295,102),e.black=new l(0,4294901760),e.pawn=new l(4294967295,16711782),e.knight=new l(0,1107296256),e.bishop=new l(0,603979776),e.rook=new l(0,2164260864),e.queen=new l(0,134217728),e.king=new l(0,268435456),e},pt=class extends ee{constructor(){super("horde")}reset(){this.board=Zi(),this.pockets=void 0,this.turn="white",this.castles=ce.default(),this.castles.discardColor("white"),this.epSquare=void 0,this.remainingChecks=void 0,this.halfmoves=0,this.fullmoves=1}static default(){let t=new this;return t.reset(),t}static fromSetup(t){let n=new this;return n.setupUnchecked(t),n.validate().map(r=>n)}clone(){return super.clone()}validate(){if(this.board.occupied.isEmpty())return m.err(new D(q.Empty));if(this.board.king.size()!==1)return m.err(new D(q.Kings));let t=this.board.kingOf(M(this.turn));if(k(t)&&this.kingAttackers(t,this.turn,this.board.occupied).nonEmpty())return m.err(new D(q.OppositeCheck));for(let n of $){let r=this.board.pieces(n,"king").isEmpty()?l.backrank(M(n)):l.backranks();if(this.board.pieces(n,"pawn").intersects(r))return m.err(new D(q.PawnsOnBackrank))}return m.ok(void 0)}hasInsufficientMaterial(t){if(this.board.pieces(t,"king").nonEmpty())return!1;let n=b=>b==="light"?"dark":"light",r=b=>b==="light"?l.lightSquares():l.darkSquares(),i=b=>{let h=this.board.pieces(b,"bishop");return h.intersects(l.darkSquares())&&h.intersects(l.lightSquares())},o=de.fromBoard(this.board,t),s=b=>r(b).intersect(this.board.pieces(t,"bishop")).size(),a=s("light")>=1?"light":"dark",u=o.pawn+o.knight+o.rook+o.queen+Math.min(s("dark"),2)+Math.min(s("light"),2),c=de.fromBoard(this.board,M(t)),p=b=>r(b).intersect(this.board.pieces(M(t),"bishop")).size(),f=c.size(),S=b=>f-b;if(u===0)return!0;if(u>=4||(o.pawn>=1||o.queen>=1)&&u>=2||o.rook>=1&&u>=2&&!(u===2&&o.rook===1&&o.bishop===1&&S(p(a))===1))return!1;if(u===1){if(f===1)return!0;if(o.queen===1)return!(c.pawn>=1||c.rook>=1||p("light")>=2||p("dark")>=2);if(o.pawn===1){let b=this.board.pieces(t,"pawn").last(),h=this.clone();h.board.set(b,{color:t,role:"queen"});let d=this.clone();return d.board.set(b,{color:t,role:"knight"}),h.hasInsufficientMaterial(t)&&d.hasInsufficientMaterial(t)}else{if(o.rook===1)return!(c.pawn>=2||c.rook>=1&&c.pawn>=1||c.rook>=1&&c.knight>=1||c.pawn>=1&&c.knight>=1);if(o.bishop===1)return!(p(n(a))>=2||p(n(a))>=1&&c.pawn>=1||c.pawn>=2);if(o.knight===1)return!(f>=4&&(c.knight>=2||c.pawn>=2||c.rook>=1&&c.knight>=1||c.rook>=1&&c.bishop>=1||c.knight>=1&&c.bishop>=1||c.rook>=1&&c.pawn>=1||c.knight>=1&&c.pawn>=1||c.bishop>=1&&c.pawn>=1||i(M(t))&&c.pawn>=1)&&(p("dark")<2||S(p("dark"))>=3)&&(p("light")<2||S(p("light"))>=3))}}else{if(u===2)return f===1?!0:o.knight===2?c.pawn+c.bishop+c.knight<1:i(t)?!(c.pawn>=1||c.bishop>=1||c.knight>=1&&c.rook+c.queen>=1):o.bishop>=1&&o.knight>=1?!(c.pawn>=1||p(n(a))>=1||S(p(a))>=3):!(c.pawn>=1&&p(n(a))>=1||c.pawn>=1&&c.knight>=1||p(n(a))>=1&&c.knight>=1||p(n(a))>=2||c.knight>=2||c.pawn>=2);if(u===3)return o.knight===2&&o.bishop===1||o.knight===3||i(t)?!1:f===1}return!0}isVariantEnd(){return this.board.white.isEmpty()||this.board.black.isEmpty()}variantOutcome(t){if(this.board.white.isEmpty())return{winner:"black"};if(this.board.black.isEmpty())return{winner:"white"}}},Wn=e=>{switch(e){case"chess":return Fe.default();case"antichess":return ut.default();case"atomic":return lt.default();case"horde":return pt.default();case"racingkings":return ft.default();case"kingofthehill":return ht.default();case"3check":return dt.default();case"crazyhouse":return ct.default()}},Un=(e,t)=>{switch(e){case"chess":return Fe.fromSetup(t);case"antichess":return ut.fromSetup(t);case"atomic":return lt.fromSetup(t);case"horde":return pt.fromSetup(t);case"racingkings":return ft.fromSetup(t);case"kingofthehill":return ht.fromSetup(t);case"3check":return dt.fromSetup(t);case"crazyhouse":return ct.fromSetup(t)}};var Xi=(e=Jt)=>({headers:e(),moves:new He}),He=class{constructor(){this.children=[]}*mainlineNodes(){let t=this;for(;t.children.length;){let n=t.children[0];yield n,t=n}}*mainline(){for(let t of this.mainlineNodes())yield t.data}end(){let t=this;for(;t.children.length;)t=t.children[0];return t}},mt=class extends He{constructor(t){super(),this.data=t}};var Yn=(e,t,n)=>{let r=new He,i=[{before:e,after:r,ctx:t}],o;for(;o=i.pop();)for(let s=0;s<o.before.children.length;s++){let a=s<o.before.children.length-1?o.ctx.clone():o.ctx,u=o.before.children[s],c=n(a,u.data,s);if(k(c)){let p=new mt(c);o.after.children.push(p),i.push({before:u,after:p,ctx:a})}}return r};var Ji=e=>e?e.winner==="white"?"1-0":e.winner==="black"?"0-1":"1/2-1/2":"*",eo=e=>e==="1-0"||e==="1\u20130"||e==="1\u20140"?{winner:"white"}:e==="0-1"||e==="0\u20131"||e==="0\u20141"?{winner:"black"}:e==="1/2-1/2"||e==="1/2\u20131/2"||e==="1/2\u20141/2"?{winner:void 0}:void 0;var Jt=()=>new Map([["Event","?"],["Site","?"],["Date","????.??.??"],["Round","?"],["White","?"],["Black","?"],["Result","*"]]);var jn="\uFEFF",Yt=e=>/^\s*$/.test(e),Zt=e=>e.startsWith("%"),Qt=class extends Error{},Xt=class{constructor(t,n=Jt,r=1e6){this.emitGame=t,this.initHeaders=n,this.maxBudget=r,this.lineBuf=[],this.resetGame(),this.state=0}resetGame(){this.budget=this.maxBudget,this.found=!1,this.state=1,this.game=Xi(this.initHeaders),this.stack=[{parent:this.game.moves,root:!0}],this.commentBuf=[]}consumeBudget(t){if(this.budget-=t,this.budget<0)throw new Qt("ERR_PGN_BUDGET")}parse(t,n){if(!(this.budget<0))try{let r=0;for(;;){let i=t.indexOf(`
`,r);if(i===-1)break;let o=i>r&&t[i-1]==="\r"?i-1:i;this.consumeBudget(i-r),this.lineBuf.push(t.slice(r,o)),r=i+1,this.handleLine()}this.consumeBudget(t.length-r),this.lineBuf.push(t.slice(r)),n?.stream||(this.handleLine(),this.emit(void 0))}catch(r){this.emit(r)}}handleLine(){let t=!0,n=this.lineBuf.join("");this.lineBuf=[];e:for(;;)switch(this.state){case 0:n.startsWith(jn)&&(n=n.slice(jn.length)),this.state=1;case 1:if(Yt(n)||Zt(n))return;this.found=!0,this.state=2;case 2:{if(Zt(n))return;let r=!0;for(;r;)r=!1,n=n.replace(/^\s*\[([A-Za-z0-9][A-Za-z0-9_+#=:-]*)\s+"((?:[^"\\]|\\"|\\\\)*)"\]/,(i,o,s)=>(this.consumeBudget(200),this.handleHeader(o,s.replace(/\\"/g,'"').replace(/\\\\/g,"\\")),r=!0,t=!1,""));if(Yt(n))return;this.state=3}case 3:{if(t){if(Zt(n))return;if(Yt(n))return this.emit(void 0)}let r=/(?:[NBKRQ]?[a-h]?[1-8]?[-x]?[a-h][1-8](?:=?[nbrqkNBRQK])?|[pnbrqkPNBRQK]?@[a-h][1-8]|[O0o][-–—][O0o](?:[-–—][O0o])?)[+#]?|--|Z0|0000|@@@@|{|;|\$\d{1,4}|[?!]{1,2}|\(|\)|\*|1[-–—]0|0[-–—]1|1\/2[-–—]1\/2/g,i;for(;i=r.exec(n);){let o=this.stack[this.stack.length-1],s=i[0];if(s===";")return;if(s.startsWith("$"))this.handleNag(parseInt(s.slice(1),10));else if(s==="!")this.handleNag(1);else if(s==="?")this.handleNag(2);else if(s==="!!")this.handleNag(3);else if(s==="??")this.handleNag(4);else if(s==="!?")this.handleNag(5);else if(s==="?!")this.handleNag(6);else if(s==="1-0"||s==="1\u20130"||s==="1\u20140"||s==="0-1"||s==="0\u20131"||s==="0\u20141"||s==="1/2-1/2"||s==="1/2\u20131/2"||s==="1/2\u20141/2"||s==="*")this.stack.length===1&&s!=="*"&&this.handleHeader("Result",s);else if(s==="(")this.consumeBudget(100),this.stack.push({parent:o.parent,root:!1});else if(s===")")this.stack.length>1&&this.stack.pop();else if(s==="{"){let a=r.lastIndex,u=n[a]===" "?a+1:a;n=n.slice(u),this.state=4;continue e}else this.consumeBudget(100),s.startsWith("O")||s.startsWith("0")||s.startsWith("o")?s=s.replace(/[0o]/g,"O").replace(/[–—]/g,"-"):(s==="Z0"||s==="0000"||s==="@@@@")&&(s="--"),o.node&&(o.parent=o.node),o.node=new mt({san:s,startingComments:o.startingComments}),o.startingComments=void 0,o.root=!1,o.parent.children.push(o.node)}return}case 4:{let r=n.indexOf("}");if(r===-1){this.commentBuf.push(n);return}else{let i=r>0&&n[r-1]===" "?r-1:r;this.commentBuf.push(n.slice(0,i)),this.handleComment(),n=n.slice(r),this.state=3,t=!1}}}}handleHeader(t,n){this.game.headers.set(t,t==="Result"?Ji(eo(n)):n)}handleNag(t){var n;this.consumeBudget(50);let r=this.stack[this.stack.length-1];r.node&&((n=r.node.data).nags||(n.nags=[]),r.node.data.nags.push(t))}handleComment(){var t,n;this.consumeBudget(100);let r=this.stack[this.stack.length-1],i=this.commentBuf.join(`
`);this.commentBuf=[],r.node?((t=r.node.data).comments||(t.comments=[]),r.node.data.comments.push(i)):r.root?((n=this.game).comments||(n.comments=[]),this.game.comments.push(i)):(r.startingComments||(r.startingComments=[]),r.startingComments.push(i))}emit(t){if(this.state===4&&this.handleComment(),t)return this.emitGame(this.game,t);this.found&&this.emitGame(this.game,void 0),this.resetGame()}},en=(e,t=Jt)=>{let n=[];return new Xt(r=>n.push(r),t,NaN).parse(e),n},to=e=>{switch((e||"chess").toLowerCase()){case"chess":case"chess960":case"chess 960":case"standard":case"from position":case"classical":case"normal":case"fischerandom":case"fischerrandom":case"fischer random":case"wild/0":case"wild/1":case"wild/2":case"wild/3":case"wild/4":case"wild/5":case"wild/6":case"wild/7":case"wild/8":case"wild/8a":return"chess";case"crazyhouse":case"crazy house":case"house":case"zh":return"crazyhouse";case"king of the hill":case"koth":case"kingofthehill":return"kingofthehill";case"three-check":case"three check":case"threecheck":case"three check chess":case"3-check":case"3 check":case"3check":return"3check";case"antichess":case"anti chess":case"anti":return"antichess";case"atomic":case"atom":case"atomic chess":return"atomic";case"horde":case"horde chess":return"horde";case"racing kings":case"racingkings":case"racing":case"race":return"racingkings";default:return}};var Zn=e=>{let t=to(e.get("Variant"));if(!t)return m.err(new D(q.Variant));let n=e.get("FEN");return n?$n(n).chain(r=>Un(t,r)):m.ok(Wn(t))};function no(e){switch(e){case"G":return"green";case"R":return"red";case"Y":return"yellow";case"B":return"blue";default:return}}var ro=e=>{let t=no(e.slice(0,1)),n=ue(e.slice(1,3)),r=ue(e.slice(3,5));if(!(!t||!k(n))){if(e.length===3)return{color:t,from:n,to:n};if(e.length===5&&k(r))return{color:t,from:n,to:r}}};var Qn=e=>{let t,n,r,i=[];return{text:e.replace(/\s?\[%(emt|clk)\s(\d{1,5}):(\d{1,2}):(\d{1,2}(?:\.\d{0,3})?)\]\s?/g,(s,a,u,c,p)=>{let f=parseInt(u,10)*3600+parseInt(c,10)*60+parseFloat(p);return a==="emt"?t=f:a==="clk"&&(n=f)," "}).replace(/\s?\[%(?:csl|cal)\s([RGYB][a-h][1-8](?:[a-h][1-8])?(?:,[RGYB][a-h][1-8](?:[a-h][1-8])?)*)\]\s?/g,(s,a)=>{for(let u of a.split(","))i.push(ro(u));return" "}).replace(/\s?\[%eval\s(?:#([+-]?\d{1,5})|([+-]?(?:\d{1,5}|\d{0,5}\.\d{1,2})))(?:,(\d{1,5}))?\]\s?/g,(s,a,u,c)=>{let p=c&&parseInt(c,10);return r=a?{mate:parseInt(a,10),depth:p}:{pawns:parseFloat(u),depth:p}," "}).trim(),shapes:i,emt:t,clock:n,evaluation:r}};function tn(e){return t=>e&&e(t)||oo(t)}var oo=e=>so[e],so={flipTheBoard:"Flip the board",analysisBoard:"Analysis board",practiceWithComputer:"Practice with computer",getPgn:"Get PGN",download:"Download",viewOnLichess:"View on Lichess",viewOnSite:"View on site"};var Xn=["white","black"],Ae=["a","b","c","d","e","f","g","h"],De=["1","2","3","4","5","6","7","8"];var er=[...De].reverse(),gt=Array.prototype.concat(...Ae.map(e=>De.map(t=>e+t))),V=e=>gt[8*e[0]+e[1]],O=e=>[e.charCodeAt(0)-97,e.charCodeAt(1)-49],tr=e=>{if(e)return e[1]==="@"?[e.slice(2,4)]:[e.slice(0,2),e.slice(2,4)]},kt=gt.map(O);function nr(e){let t,n=()=>(t===void 0&&(t=e()),t);return n.clear=()=>{t=void 0},n}var rr=()=>{let e;return{start(){e=performance.now()},cancel(){e=void 0},stop(){if(!e)return 0;let t=performance.now()-e;return e=void 0,t}}},bt=e=>e==="white"?"black":"white",Se=(e,t)=>{let n=e[0]-t[0],r=e[1]-t[1];return n*n+r*r},$e=(e,t)=>e.role===t.role&&e.color===t.color,Ce=e=>(t,n)=>[(n?t[0]:7-t[0])*e.width/8,(n?7-t[1]:t[1])*e.height/8],Z=(e,t)=>{e.style.transform=`translate(${t[0]}px,${t[1]}px)`},nn=(e,t,n=1)=>{e.style.transform=`translate(${t[0]}px,${t[1]}px) scale(${n})`},Ve=(e,t)=>{e.style.visibility=t?"visible":"hidden"},le=e=>{var t;if(e.clientX||e.clientX===0)return[e.clientX,e.clientY];if(!((t=e.targetTouches)===null||t===void 0)&&t[0])return[e.targetTouches[0].clientX,e.targetTouches[0].clientY]},wt=e=>e.button===2,Q=(e,t)=>{let n=document.createElement(e);return t&&(n.className=t),n};function vt(e,t,n){let r=O(e);return t||(r[0]=7-r[0],r[1]=7-r[1]),[n.left+n.width*r[0]/8+n.width/16,n.top+n.height*(7-r[1])/8+n.height/16]}var te=class e{constructor(t){this.path=t;this.size=()=>this.path.length/2;this.head=()=>this.path.slice(0,2);this.tail=()=>new e(this.path.slice(2));this.init=()=>new e(this.path.slice(0,-2));this.last=()=>this.path.slice(-2);this.empty=()=>this.path=="";this.contains=t=>this.path.startsWith(t.path);this.isChildOf=t=>this.init()===t;this.append=t=>new e(this.path+t);this.equals=t=>this.path==t.path}static{this.root=new e("")}};var yt=class{constructor(t,n,r,i){this.initial=t;this.moves=n;this.players=r;this.metadata=i;this.nodeAt=t=>ir(this.moves,t);this.dataAt=t=>{let n=this.nodeAt(t);return n?co(n)?n.data:this.initial:void 0};this.title=()=>this.players.white.name?[this.players.white.title,this.players.white.name,"vs",this.players.black.title,this.players.black.name].filter(t=>t&&!!t.trim()).join("_").replace(" ","-"):"lichess-pgn-viewer";this.pathAtMainlinePly=t=>t==0?te.root:this.mainline[Math.max(0,Math.min(this.mainline.length-1,t=="last"?9999:t-1))]?.path||te.root;this.hasPlayerName=()=>!!(this.players.white?.name||this.players.black?.name);this.mainline=Array.from(this.moves.mainline())}},ao=(e,t)=>e.children.find(n=>n.data.path.last()==t),ir=(e,t)=>{if(t.empty())return e;let n=ao(e,t.head());return n?ir(n,t.tail()):void 0},co=e=>"data"in e,or=e=>"uci"in e;var rn=class e{constructor(t,n,r){this.pos=t;this.path=n;this.clocks=r;this.clone=()=>new e(this.pos.clone(),this.path,{...this.clocks})}},on=e=>{let t=e.map(Qn),n=r=>r.reduce((i,o)=>typeof o==null?i:o,void 0);return{texts:t.map(r=>r.text).filter(r=>!!r),shapes:t.flatMap(r=>r.shapes),clock:n(t.map(r=>r.clock)),emt:n(t.map(r=>r.emt))}},sr=(e,t=!1)=>{let n=en(e)[0]||en("*")[0],r=Zn(n.headers).unwrap(),i=at(r.toSetup()),o=on(n.comments||[]),s=new Map(Array.from(n.headers,([f,S])=>[f.toLowerCase(),S])),a=fo(s,t),u={fen:i,turn:r.turn,check:r.isCheck(),pos:r.clone(),comments:o.texts,shapes:o.shapes,clocks:{white:a.timeControl?.initial||o.clock,black:a.timeControl?.initial||o.clock}},c=lo(r,n.moves,a),p=ho(s,a);return new yt(u,c,p,a)},lo=(e,t,n)=>Yn(t,new rn(e,te.root,{}),(r,i,o)=>{let s=Gn(r.pos,i.san);if(!s)return;let a=In(s),u=r.path.append(a),c=Vn(r.pos,s);r.path=u;let p=r.pos.toSetup(),f=on(i.comments||[]),S=on(i.startingComments||[]),b=[...f.shapes,...S.shapes],h=(p.fullmoves-1)*2+(r.pos.turn==="white"?0:1),d=r.clocks=uo(r.clocks,r.pos.turn,f.clock);return h<2&&n.timeControl&&(d={white:n.timeControl.initial,black:n.timeControl.initial,...d}),{path:u,ply:h,move:s,san:c,uci:Lt(s),fen:at(r.pos.toSetup()),turn:r.pos.turn,check:r.pos.isCheck(),comments:f.texts,startingComments:S.texts,nags:i.nags||[],shapes:b,clocks:d,emt:f.emt}}),uo=(e,t,n)=>t=="white"?{...e,black:n}:{...e,white:n};function ho(e,t){let n=(i,o)=>{let s=e.get(`${i}${o}`);return s=="?"||s==""?void 0:s},r=i=>{let o=n(i,"");return{name:o,title:n(i,"title"),rating:parseInt(n(i,"elo")||"")||void 0,isLichessUser:t.isLichess&&!!o?.match(/^[a-z0-9][a-z0-9_-]{0,28}[a-z0-9]$/i)}};return{white:r("white"),black:r("black")}}function fo(e,