UNPKG

tsshogi

Version:

TypeScript library for Shogi (Japanese chess)

642 lines 52.8 kB
"use strict"; // CSA file format (.csa) // See http://www2.computer-shogi.org/protocol/record_v22.html Object.defineProperty(exports, "__esModule", { value: true }); exports.getSpecialMoveByName = getSpecialMoveByName; exports.parseCSAMove = parseCSAMove; exports.importCSA = importCSA; exports.getCSASpecialMoveName = getCSASpecialMoveName; exports.formatCSAMove = formatCSAMove; exports.exportCSA = exportCSA; const string_1 = require("./helpers/string.cjs"); const errors_1 = require("./errors.cjs"); const color_1 = require("./color.cjs"); const move_1 = require("./move.cjs"); const piece_1 = require("./piece.cjs"); const position_1 = require("./position.cjs"); const record_1 = require("./record.cjs"); const square_1 = require("./square.cjs"); var LineType; (function (LineType) { LineType[LineType["VERSION"] = 0] = "VERSION"; LineType[LineType["EXTENDED_COMMENT"] = 1] = "EXTENDED_COMMENT"; LineType[LineType["COMMENT"] = 2] = "COMMENT"; LineType[LineType["BLACK_NAME"] = 3] = "BLACK_NAME"; LineType[LineType["WHITE_NAME"] = 4] = "WHITE_NAME"; LineType[LineType["METADATA"] = 5] = "METADATA"; LineType[LineType["POSITION"] = 6] = "POSITION"; LineType[LineType["RANK"] = 7] = "RANK"; LineType[LineType["PIECES"] = 8] = "PIECES"; LineType[LineType["FIRST_TURN"] = 9] = "FIRST_TURN"; LineType[LineType["MOVE"] = 10] = "MOVE"; LineType[LineType["SPECIAL_MOVE"] = 11] = "SPECIAL_MOVE"; LineType[LineType["ELAPSED"] = 12] = "ELAPSED"; })(LineType || (LineType = {})); var SectionType; (function (SectionType) { SectionType[SectionType["HEADER"] = 0] = "HEADER"; SectionType[SectionType["MOVE"] = 1] = "MOVE"; SectionType[SectionType["NEUTRAL"] = 2] = "NEUTRAL"; })(SectionType || (SectionType = {})); const linePatterns = [ { pattern: /^V/, type: LineType.VERSION, sectionType: SectionType.HEADER, }, { pattern: /^'\*(.+)$/, type: LineType.EXTENDED_COMMENT, sectionType: SectionType.NEUTRAL, }, { pattern: /^'(.+)$/, type: LineType.COMMENT, sectionType: SectionType.NEUTRAL, }, { pattern: /^N\+(.+)$/, type: LineType.BLACK_NAME, sectionType: SectionType.HEADER, }, { pattern: /^N-(.+)$/, type: LineType.WHITE_NAME, sectionType: SectionType.HEADER, }, { pattern: /^\$([^:]+):(.+)$/, type: LineType.METADATA, sectionType: SectionType.HEADER, }, { pattern: /^PI([1-9]{2}[A-Z]{2})*$/, type: LineType.POSITION, sectionType: SectionType.HEADER, }, { pattern: /^P[1-9]( \* ?|[-+][A-Z][A-Z]){9}$/, type: LineType.RANK, sectionType: SectionType.HEADER, }, { pattern: /^P[-+]([0-9]{2}[A-Z]{2})*/, type: LineType.PIECES, sectionType: SectionType.HEADER, }, { pattern: /^[-+]$/, type: LineType.FIRST_TURN, sectionType: SectionType.HEADER, }, { pattern: /^[-+][0-9]{4}[A-Z]{2}/, type: LineType.MOVE, sectionType: SectionType.MOVE, }, { pattern: /^%[-+A-Z_]+/, type: LineType.SPECIAL_MOVE, sectionType: SectionType.MOVE, }, { pattern: /^T([0-9]+(?:\.[0-9]*)?)/, type: LineType.ELAPSED, sectionType: SectionType.MOVE, }, ]; function parseLine(line) { const results = []; const lines = /^['N$]/.test(line) ? [line] : line.split(","); for (const line of lines) { for (let i = 0; i < linePatterns.length; i++) { const matched = linePatterns[i].pattern.exec(line); if (matched) { results.push({ type: linePatterns[i].type, line: line, args: matched.slice(1), sectionType: linePatterns[i].sectionType, }); break; } } } return results; } const csaNameToRecordMetadataKey = { EVENT: record_1.RecordMetadataKey.TITLE, SITE: record_1.RecordMetadataKey.PLACE, START_TIME: record_1.RecordMetadataKey.START_DATETIME, END_TIME: record_1.RecordMetadataKey.END_DATETIME, TIME_LIMIT: record_1.RecordMetadataKey.TIME_LIMIT, TIME: record_1.RecordMetadataKey.TIME_LIMIT, "TIME+": record_1.RecordMetadataKey.BLACK_TIME_LIMIT, "TIME-": record_1.RecordMetadataKey.WHITE_TIME_LIMIT, OPENING: record_1.RecordMetadataKey.STRATEGY, MAX_MOVES: record_1.RecordMetadataKey.MAX_MOVES, JISHOGI: record_1.RecordMetadataKey.JISHOGI, NOTE: record_1.RecordMetadataKey.NOTE, }; const csaNameToPieceType = { FU: piece_1.PieceType.PAWN, KY: piece_1.PieceType.LANCE, KE: piece_1.PieceType.KNIGHT, GI: piece_1.PieceType.SILVER, KI: piece_1.PieceType.GOLD, KA: piece_1.PieceType.BISHOP, HI: piece_1.PieceType.ROOK, OU: piece_1.PieceType.KING, TO: piece_1.PieceType.PROM_PAWN, NY: piece_1.PieceType.PROM_LANCE, NK: piece_1.PieceType.PROM_KNIGHT, NG: piece_1.PieceType.PROM_SILVER, UM: piece_1.PieceType.HORSE, RY: piece_1.PieceType.DRAGON, }; function parsePosition(line, position) { position.resetBySFEN(position_1.InitialPositionSFEN.STANDARD); for (let i = 2; i + 4 <= line.length; i += 4) { const file = Number(line[i]); const rank = Number(line[i + 1]); position.board.remove(new square_1.Square(file, rank)); } } function parseRank(line, position) { const rank = Number(line[1]); let begin = 2; for (let x = 0; x < 9; x += 1) { const file = 9 - x; const section = line.slice(begin, begin + 3); // 次のマス目は通常3文字先になる。 // ただし " * * " のように空きマスが続いた時にメールやHTML上で連続する空白がまとめられて " * * " となることがある。 // これはCSAの仕様といては正しいデータではないが、現実に存在するので配慮する。 // 3文字先へ進めるが、次の文字が "*" であれば1文字戻る。 begin += 3; if (line[begin] === "*") { begin -= 1; } if (section[0] === " ") { continue; } const color = section[0] === "+" ? color_1.Color.BLACK : color_1.Color.WHITE; const pieceType = csaNameToPieceType[section.slice(1)]; if (!pieceType) { return new errors_1.InvalidPieceNameError(section); } position.board.set(new square_1.Square(file, rank), new piece_1.Piece(color, pieceType)); } } function parsePieces(line, position) { const color = line[1] === "+" ? color_1.Color.BLACK : color_1.Color.WHITE; for (let begin = 2; begin + 4 <= line.length; begin += 4) { const section = line.slice(begin, begin + 4); if (section === "00AL") { const counts = (0, position_1.countNotExistingPieces)(position); if (color === color_1.Color.BLACK) { position.blackHand.forEach((pieceType) => { position.blackHand.add(pieceType, counts[pieceType]); }); } else { position.whiteHand.forEach((pieceType) => { position.whiteHand.add(pieceType, counts[pieceType]); }); } return; } const file = Number(section[0]); const rank = Number(section[1]); const pieceType = csaNameToPieceType[section.slice(2)]; if (!pieceType) { return new errors_1.InvalidPieceNameError(section); } if (file !== 0 && rank !== 0) { position.board.set(new square_1.Square(file, rank), new piece_1.Piece(color, pieceType)); } else if (color === color_1.Color.BLACK) { position.blackHand.add(pieceType, 1); } else { position.whiteHand.add(pieceType, 1); } } } function parseMove(line, position) { const color = line[0] === "+" ? color_1.Color.BLACK : color_1.Color.WHITE; if (color != position.color) { return new errors_1.InvalidTurnError(line); } const fromFile = Number(line[1]); const fromRank = Number(line[2]); const toFile = Number(line[3]); const toRank = Number(line[4]); const pieceType = csaNameToPieceType[line.slice(5, 7)]; if (!pieceType) { return new errors_1.InvalidPieceNameError(line); } const from = fromFile === 0 && fromRank === 0 ? pieceType : new square_1.Square(fromFile, fromRank); const to = new square_1.Square(toFile, toRank); let move = position.createMove(from, to); if (!move) { return new errors_1.InvalidMoveError(line); } if (from instanceof square_1.Square) { const basePiece = position.board.at(from); if (!basePiece) { return new errors_1.PieceNotExistsError(line); } if (basePiece.type !== pieceType) { if (basePiece.promoted().type === pieceType) { move = move.withPromote(); } else { return new errors_1.PieceNotExistsError(line); } } } return move; } /** * CSA形式の特殊な指し手の名前をSpecialMoveTypeに変換します。 * @param name 先頭の % 記号を含めない名前をしていします。 * @param color 手番を指定します。 +ILLEGAL_ACTION や -ILLEGAL_ACTION の読み取りに使用します。 */ function getSpecialMoveByName(name, color) { switch (name) { case "CHUDAN": return (0, move_1.specialMove)(move_1.SpecialMoveType.INTERRUPT); case "TORYO": return (0, move_1.specialMove)(move_1.SpecialMoveType.RESIGN); case "MAX_MOVES": return (0, move_1.specialMove)(move_1.SpecialMoveType.MAX_MOVES); case "JISHOGI": return (0, move_1.specialMove)(move_1.SpecialMoveType.IMPASS); case "HIKIWAKE": return (0, move_1.specialMove)(move_1.SpecialMoveType.DRAW); case "SENNICHITE": return (0, move_1.specialMove)(move_1.SpecialMoveType.REPETITION_DRAW); case "TSUMI": return (0, move_1.specialMove)(move_1.SpecialMoveType.MATE); case "FUZUMI": return (0, move_1.specialMove)(move_1.SpecialMoveType.NO_MATE); case "TIME_UP": return (0, move_1.specialMove)(move_1.SpecialMoveType.TIMEOUT); case "ILLEGAL_MOVE": return (0, move_1.specialMove)(move_1.SpecialMoveType.FOUL_LOSE); case "+ILLEGAL_ACTION": return (0, move_1.specialMove)(color == color_1.Color.BLACK ? move_1.SpecialMoveType.FOUL_WIN : move_1.SpecialMoveType.FOUL_LOSE); case "-ILLEGAL_ACTION": return (0, move_1.specialMove)(color == color_1.Color.WHITE ? move_1.SpecialMoveType.FOUL_WIN : move_1.SpecialMoveType.FOUL_LOSE); case "KACHI": return (0, move_1.specialMove)(move_1.SpecialMoveType.ENTERING_OF_KING); } return (0, move_1.anySpecialMove)(name); } /** * CSA形式の指し手を読み取ります。 * @param position * @param line */ function parseCSAMove(position, line) { return parseMove(line, position); } /** * CSA形式の棋譜を読み取ります。 * @param data */ function importCSA(data) { const metadata = new record_1.RecordMetadata(); const record = new record_1.Record(); const position = new position_1.Position(); position.resetBySFEN(position_1.InitialPositionSFEN.EMPTY); let preMoveComment = ""; let inMoveSection = false; const lines = data.replace(/\r?\n\/(\r?\n[\s\S]*)?$/, "").split(/\r?\n/); for (const line of lines) { for (const parsed of parseLine(line)) { if (parsed.sectionType === SectionType.MOVE && !inMoveSection) { return new errors_1.InvalidLineError(parsed.line); } // NOTE: // WCSC の棋譜中継ではファイルの末尾に $END_TIME が書かれる。 // V2.2 の仕様上は認められないはずだが、エラーにすると実用上困るので無視する。 if (parsed.sectionType === SectionType.HEADER && inMoveSection) { continue; } switch (parsed.type) { case LineType.VERSION: break; case LineType.EXTENDED_COMMENT: if (inMoveSection) { record.current.comment = (0, string_1.appendLine)(record.current.comment, parsed.args[0]); } else { preMoveComment = (0, string_1.appendLine)(preMoveComment, parsed.args[0]); } break; case LineType.COMMENT: break; case LineType.BLACK_NAME: metadata.setStandardMetadata(record_1.RecordMetadataKey.BLACK_NAME, parsed.args[0]); break; case LineType.WHITE_NAME: metadata.setStandardMetadata(record_1.RecordMetadataKey.WHITE_NAME, parsed.args[0]); break; case LineType.METADATA: { const key = csaNameToRecordMetadataKey[parsed.args[0]]; if (key) { metadata.setStandardMetadata(key, parsed.args[1]); } else { metadata.setCustomMetadata(parsed.args[0], parsed.args[1]); } break; } case LineType.POSITION: parsePosition(parsed.line, position); break; case LineType.RANK: { const error = parseRank(parsed.line, position); if (error) { return error; } break; } case LineType.PIECES: { const error = parsePieces(parsed.line, position); if (error) { return error; } break; } case LineType.FIRST_TURN: if (parsed.line[0] === "+") { position.setColor(color_1.Color.BLACK); } else { position.setColor(color_1.Color.WHITE); } record.clear(position); record.first.comment = preMoveComment; inMoveSection = true; break; case LineType.MOVE: { const moveOrError = parseMove(parsed.line, record.position); if (moveOrError instanceof Error) { return moveOrError; } record.append(moveOrError, { ignoreValidation: true }); break; } case LineType.SPECIAL_MOVE: { const specialMove = getSpecialMoveByName(parsed.line.slice(1), record.position.color); record.append(specialMove, { ignoreValidation: true }); break; } case LineType.ELAPSED: record.current.setElapsedMs(Number(parsed.args[0]) * 1e3); break; } } } if (!inMoveSection) { record.clear(position); record.first.comment = preMoveComment; } record.goto(0); record.resetAllBranchSelection(); record.metadata = metadata; return record; } const timeRegExpV2 = /^[0-9]+:[0-9]{2}\+[0-9]+$/; const timeRegExpV3 = /^[0-9.]+\+[0-9.]+\+[0-9.]+$/; function formatMetadata(metadata, options) { let ret = ""; const returnCode = options?.returnCode || "\n"; const blackName = (0, record_1.getBlackPlayerName)(metadata); if (blackName) { ret += "N+" + blackName + returnCode; } const whiteName = (0, record_1.getWhitePlayerName)(metadata); if (whiteName) { ret += "N-" + whiteName + returnCode; } const event = metadata.getStandardMetadata(record_1.RecordMetadataKey.TOURNAMENT) || metadata.getStandardMetadata(record_1.RecordMetadataKey.TITLE) || metadata.getStandardMetadata(record_1.RecordMetadataKey.OPUS_NAME) || metadata.getStandardMetadata(record_1.RecordMetadataKey.PUBLISHED_BY); if (event) { ret += "$EVENT:" + event + returnCode; } const site = metadata.getStandardMetadata(record_1.RecordMetadataKey.PLACE); if (site) { ret += "$SITE:" + site + returnCode; } const startTime = metadata.getStandardMetadata(record_1.RecordMetadataKey.START_DATETIME) || metadata.getStandardMetadata(record_1.RecordMetadataKey.DATE); if (startTime) { // 年月日 YYYY/MM/DD (10文字) については KIF 形式と共通 ret += "$START_TIME:" + startTime.slice(10) + returnCode; } const endTime = metadata.getStandardMetadata(record_1.RecordMetadataKey.DATE); if (endTime) { ret += "$END_TIME:" + endTime.slice(10) + returnCode; } const opening = metadata.getStandardMetadata(record_1.RecordMetadataKey.STRATEGY); if (opening) { ret += "$OPENING:" + opening + returnCode; } const timeLimit = metadata.getStandardMetadata(record_1.RecordMetadataKey.TIME_LIMIT); if (timeLimit && timeRegExpV2.test(timeLimit)) { ret += "$TIME_LIMIT:" + timeLimit + returnCode; } else if (timeLimit && timeRegExpV3.test(timeLimit)) { ret += "$TIME:" + timeLimit + returnCode; } const blackTimeLimit = metadata.getStandardMetadata(record_1.RecordMetadataKey.BLACK_TIME_LIMIT); if (blackTimeLimit && timeRegExpV3.test(blackTimeLimit)) { ret += "$TIME+:" + blackTimeLimit + returnCode; } const whiteTimeLimit = metadata.getStandardMetadata(record_1.RecordMetadataKey.WHITE_TIME_LIMIT); if (whiteTimeLimit && timeRegExpV3.test(whiteTimeLimit)) { ret += "$TIME-:" + whiteTimeLimit + returnCode; } const maxMoves = metadata.getStandardMetadata(record_1.RecordMetadataKey.MAX_MOVES); if (maxMoves) { ret += "$MAX_MOVES:" + maxMoves + returnCode; } const jishogi = metadata.getStandardMetadata(record_1.RecordMetadataKey.JISHOGI); if (jishogi) { ret += "$JISHOGI:" + jishogi + returnCode; } const note = metadata.getStandardMetadata(record_1.RecordMetadataKey.NOTE); if (note) { ret += "$NOTE:" + note + returnCode; } return ret; } const pieceTypeToString = { king: "OU", rook: "HI", dragon: "RY", bishop: "KA", horse: "UM", gold: "KI", silver: "GI", promSilver: "NG", knight: "KE", promKnight: "NK", lance: "KY", promLance: "NY", pawn: "FU", promPawn: "TO", }; function formatHand(hand) { let ret = ""; hand.forEach((pieceType, n) => { for (let i = 0; i < n; i++) { ret += "00" + pieceTypeToString[pieceType]; } }); return ret; } const sfenToPCommand = { [position_1.InitialPositionSFEN.STANDARD]: ["PI", "+"], [position_1.InitialPositionSFEN.HANDICAP_LANCE]: ["PI11KY", "-"], [position_1.InitialPositionSFEN.HANDICAP_RIGHT_LANCE]: ["PI91KY", "-"], [position_1.InitialPositionSFEN.HANDICAP_BISHOP]: ["PI22KA", "-"], [position_1.InitialPositionSFEN.HANDICAP_ROOK]: ["PI82HI", "-"], [position_1.InitialPositionSFEN.HANDICAP_ROOK_LANCE]: ["PI82HI11KY", "-"], [position_1.InitialPositionSFEN.HANDICAP_2PIECES]: ["PI82HI22KA", "-"], [position_1.InitialPositionSFEN.HANDICAP_4PIECES]: ["PI82HI22KA11KY91KY", "-"], [position_1.InitialPositionSFEN.HANDICAP_6PIECES]: ["PI82HI22KA21KE81KE11KY91KY", "-"], [position_1.InitialPositionSFEN.HANDICAP_8PIECES]: ["PI82HI22KA31GI71GI21KE81KE11KY91KY", "-"], [position_1.InitialPositionSFEN.HANDICAP_10PIECES]: ["PI82HI22KA41KI61KI31GI71GI21KE81KE11KY91KY", "-"], }; function formatPosition(position, options) { const returnCode = options?.returnCode || "\n"; const p = sfenToPCommand[position.sfen]; if (p) { return p[0] + returnCode + p[1] + returnCode; } let ret = ""; for (let rank = 1; rank <= 9; rank += 1) { ret += "P" + rank; for (let file = 9; file >= 1; file -= 1) { const piece = position.board.at(new square_1.Square(file, rank)); if (!piece) { ret += " * "; } else if (piece.color === color_1.Color.BLACK) { ret += "+" + pieceTypeToString[piece.type]; } else { ret += "-" + pieceTypeToString[piece.type]; } } ret += returnCode; } ret += "P+" + formatHand(position.blackHand) + returnCode; ret += "P-" + formatHand(position.whiteHand) + returnCode; ret += (position.color === color_1.Color.BLACK ? "+" : "-") + returnCode; return ret; } function formatSquare(square) { return square instanceof square_1.Square ? `${square.file}${square.rank}` : "00"; } /** * 特殊な指し手のCSA形式文字列を取得します。 * 先頭の % は含みません。 * @param move * @param color 手番を指定します。 +ILLEGAL_ACTION や -ILLEGAL_ACTION の出力に使用します。 */ function getCSASpecialMoveName(move, color) { switch (move.type) { case move_1.SpecialMoveType.INTERRUPT: return "CHUDAN"; case move_1.SpecialMoveType.RESIGN: return "TORYO"; case move_1.SpecialMoveType.MAX_MOVES: return "MAX_MOVES"; case move_1.SpecialMoveType.IMPASS: return "JISHOGI"; case move_1.SpecialMoveType.DRAW: return "HIKIWAKE"; case move_1.SpecialMoveType.REPETITION_DRAW: return "SENNICHITE"; case move_1.SpecialMoveType.MATE: return "TSUMI"; case move_1.SpecialMoveType.NO_MATE: return "FUZUMI"; case move_1.SpecialMoveType.TIMEOUT: return "TIME_UP"; case move_1.SpecialMoveType.FOUL_LOSE: return "ILLEGAL_MOVE"; case move_1.SpecialMoveType.FOUL_WIN: return color == color_1.Color.BLACK ? "+ILLEGAL_ACTION" : "-ILLEGAL_ACTION"; case move_1.SpecialMoveType.ENTERING_OF_KING: return "KACHI"; } } /** * CSA形式の指し手を出力します。 * @param move */ function formatCSAMove(move) { return ((move.color === color_1.Color.BLACK ? "+" : "-") + formatSquare(move.from) + formatSquare(move.to) + pieceTypeToString[move.promote ? (0, piece_1.promotedPieceType)(move.pieceType) : move.pieceType]); } /** * CSA形式の棋譜を出力します。 * @param record * @param options */ function exportCSA(record, options) { const returnCode = options?.returnCode || "\n"; let ret = ""; if (options?.v3) { ret += "'CSA encoding=" + (options.v3.encoding || "UTF-8") + returnCode; } if (options?.comment) { for (const line of options.comment.split("\n")) { ret += "'" + line + returnCode; } } ret += (options?.v3 ? "V3.0" : "V2.2") + returnCode; ret += formatMetadata(record.metadata, options); ret += formatPosition(record.initialPosition, options); record.moves.forEach((node) => { if (node.ply !== 0) { let move; if (node.move instanceof move_1.Move) { move = formatCSAMove(node.move); } else { const name = getCSASpecialMoveName(node.move, (0, color_1.reverseColor)(node.nextColor)); if (name) { move = "%" + name; } } if (move) { ret += move + returnCode; if (options?.v3?.milliseconds && node.elapsedMs % 1e3 !== 0) { ret += "T" + node.elapsedMs / 1e3 + returnCode; } else { ret += "T" + Math.floor(node.elapsedMs / 1e3) + returnCode; } } } if (node.comment) { const comment = node.comment.endsWith("\n") ? node.comment.slice(0, -1) : node.comment; comment.split("\n").forEach((line) => { ret += "'*" + line + returnCode; }); } }); return ret; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUJBQXlCO0FBQ3pCLDhEQUE4RDs7QUF1UzlELG9EQWtDQztBQU9ELG9DQUVDO0FBTUQsOEJBb0dDO0FBcUtELHNEQTJCQztBQU1ELHNDQU9DO0FBT0QsOEJBMENDO0FBeHJCRCw2Q0FBOEM7QUFDOUMscUNBTWtCO0FBQ2xCLG1DQUE4QztBQUU5QyxpQ0FBeUY7QUFDekYsbUNBQThEO0FBQzlELHlDQUtvQjtBQUNwQixxQ0FRa0I7QUFDbEIscUNBQWtDO0FBRWxDLElBQUssUUFjSjtBQWRELFdBQUssUUFBUTtJQUNYLDZDQUFPLENBQUE7SUFDUCwrREFBZ0IsQ0FBQTtJQUNoQiw2Q0FBTyxDQUFBO0lBQ1AsbURBQVUsQ0FBQTtJQUNWLG1EQUFVLENBQUE7SUFDViwrQ0FBUSxDQUFBO0lBQ1IsK0NBQVEsQ0FBQTtJQUNSLHVDQUFJLENBQUE7SUFDSiwyQ0FBTSxDQUFBO0lBQ04sbURBQVUsQ0FBQTtJQUNWLHdDQUFJLENBQUE7SUFDSix3REFBWSxDQUFBO0lBQ1osOENBQU8sQ0FBQTtBQUNULENBQUMsRUFkSSxRQUFRLEtBQVIsUUFBUSxRQWNaO0FBRUQsSUFBSyxXQUlKO0FBSkQsV0FBSyxXQUFXO0lBQ2QsaURBQU0sQ0FBQTtJQUNOLDZDQUFJLENBQUE7SUFDSixtREFBTyxDQUFBO0FBQ1QsQ0FBQyxFQUpJLFdBQVcsS0FBWCxXQUFXLFFBSWY7QUFFRCxNQUFNLFlBQVksR0FJWjtJQUNKO1FBQ0UsT0FBTyxFQUFFLElBQUk7UUFDYixJQUFJLEVBQUUsUUFBUSxDQUFDLE9BQU87UUFDdEIsV0FBVyxFQUFFLFdBQVcsQ0FBQyxNQUFNO0tBQ2hDO0lBQ0Q7UUFDRSxPQUFPLEVBQUUsV0FBVztRQUNwQixJQUFJLEVBQUUsUUFBUSxDQUFDLGdCQUFnQjtRQUMvQixXQUFXLEVBQUUsV0FBVyxDQUFDLE9BQU87S0FDakM7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