From d9fd2f24834054897e0e2e4cc5e065e4370ed67b Mon Sep 17 00:00:00 2001 From: winapiadmin Date: Mon, 19 Jan 2026 14:27:20 +0700 Subject: [PATCH 1/7] Add Chess960 support, castling refactor, and new tests (there's some headaches on Chess960 castling things, don't use it yet) --- .github/workflows/clang-format.yml | 7 +- .github/workflows/cmake-multi-platform.yml | 2 - CMakeLists.txt | 1 - attacks.cpp | 9 +- movegen.h | 2 +- moves_io.cpp | 2 +- position.cpp | 201 +- position.h | 97 +- tests.cpp | 5957 +++++++++++++++++++- 9 files changed, 5927 insertions(+), 351 deletions(-) diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml index 88b50d7..d6f0949 100644 --- a/.github/workflows/clang-format.yml +++ b/.github/workflows/clang-format.yml @@ -1,11 +1,8 @@ name: clang-format on: - workflow_run: - workflows: ["CMake on multiple platforms"] - types: - - completed - + pull_request: + branches: [ "main" ] jobs: format: if: > diff --git a/.github/workflows/cmake-multi-platform.yml b/.github/workflows/cmake-multi-platform.yml index c0d9094..0402087 100644 --- a/.github/workflows/cmake-multi-platform.yml +++ b/.github/workflows/cmake-multi-platform.yml @@ -1,8 +1,6 @@ name: CMake on multiple platforms on: - push: - branches: [ "main" ] pull_request: branches: [ "main" ] diff --git a/CMakeLists.txt b/CMakeLists.txt index a3a3c50..5b543ce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,6 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # --- Compiler tuning --- -set(SAN_ENABLED OFF CACHE BOOL "Whether to enable ASan or not") if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") # clang-cl: forward GCC/Clang style constexpr flags via /clang: diff --git a/attacks.cpp b/attacks.cpp index c767a24..69d0efc 100644 --- a/attacks.cpp +++ b/attacks.cpp @@ -173,11 +173,8 @@ inline static Bitboard att(PieceType pt, Square sq, Bitboard occ) { return (pt == BISHOP) ? chess::_chess::_HyperbolaBishopAttacks(sq, occ) : chess::_chess::_HyperbolaRookAttacks(sq, occ); } -inline static std::array, 64> generate_between() { - assert(att(BISHOP, SQ_A1, 0) == 9241421688590303744ULL && - "Well... this is a debug message, but this is a landmine that the magic bitboards are NOT initialized before this, " - "wontwork\n"); - std::array, 64> squares_between_bb{}; +inline static std::array, SQ_NONE + 1> generate_between() { + std::array, SQ_NONE + 1> squares_between_bb{}; for (int sq1 = 0; sq1 < 64; ++sq1) { for (PieceType pt : { BISHOP, ROOK }) { @@ -192,5 +189,5 @@ inline static std::array, 64> generate_between() { return squares_between_bb; } -std::array, 64> SQUARES_BETWEEN_BB = generate_between(); +std::array, SQ_NONE + 1> SQUARES_BETWEEN_BB = generate_between(); } // namespace chess::movegen \ No newline at end of file diff --git a/movegen.h b/movegen.h index e61bc66..ab79079 100644 --- a/movegen.h +++ b/movegen.h @@ -16,6 +16,6 @@ void genKnightMoves(const _Position &, Movelist &, Bitboard, Bitboard); template void genKingMoves(const _Position &, Movelist &); template void genSlidingMoves(const _Position &, Movelist &, Bitboard, Bitboard, Bitboard); -extern std::array, 64> SQUARES_BETWEEN_BB; +extern std::array, 65> SQUARES_BETWEEN_BB; [[nodiscard]] inline Bitboard between(Square sq1, Square sq2) noexcept { return SQUARES_BETWEEN_BB[sq1][sq2]; } } // namespace chess::movegen diff --git a/moves_io.cpp b/moves_io.cpp index 99069f9..3462ae9 100644 --- a/moves_io.cpp +++ b/moves_io.cpp @@ -85,7 +85,7 @@ template Move uciToMove(const _Position &pos, std THROW_IF_EXCEPTIONS_ON(IllegalMoveException("source need to be a existing piece, got nothing")); return Move::NO_MOVE; } - if (pt == KING && square_distance(target, source) == 2) { + if (!pos.chess960() && pt == KING && square_distance(target, source) == 2) { target = make_sq(target > source ? File::FILE_H : File::FILE_A, rank_of(source)); return Move::make(source, target); } diff --git a/position.cpp b/position.cpp index e87977b..beb79da 100644 --- a/position.cpp +++ b/position.cpp @@ -14,37 +14,12 @@ #else #define THROW_IF_EXCEPTIONS_ON(stuff) ((void)0) #endif +#if defined(_DEBUG) || !defined(NDEBUG) +#define INVALID_ARG_IF(c, s) assert(!(c) && s) +#elif defined(__EXCEPTIONS) +#define INVALID_ARG_IF(c, s) if (c) THROW_IF_EXCEPTIONS_ON(std::invalid_argument(s)) +#endif namespace chess { -static _POSSIBLY_CONSTEXPR CastlingRights make_clear_mask(Color c, PieceType pt, Square sq) { - if (pt == KING) { - if (c == WHITE && sq == SQ_E1) - return WHITE_CASTLING; - if (c == BLACK && sq == SQ_E8) - return BLACK_CASTLING; - } else if (pt == ROOK) { - if (c == WHITE && sq == SQ_H1) - return WHITE_OO; - if (c == WHITE && sq == SQ_A1) - return WHITE_OOO; - if (c == BLACK && sq == SQ_H8) - return BLACK_OO; - if (c == BLACK && sq == SQ_A8) - return BLACK_OOO; - } - return NO_CASTLING; -} - -static _POSSIBLY_CONSTEXPR auto make_castle_masks() { - std::array, PIECE_TYPE_NB>, COLOR_NB + 1> tbl{}; - - for (int c = 0; c <= COLOR_NB; ++c) - for (int pt = 0; pt < PIECE_TYPE_NB; ++pt) - for (int sq = 0; sq < SQUARE_NB; ++sq) - tbl[c][pt][sq] = make_clear_mask(Color(c), PieceType(pt), Square(sq)); - - return tbl; -} -static _POSSIBLY_CONSTEXPR auto clearCastleMask = make_castle_masks(); template template void _Position::doMove(const Move &move) { assert(move.is_ok() && "doMove called with invalid move"); @@ -62,13 +37,10 @@ template template void _Position template void _Position template void _Position template void _Position void _Position::setFEN(const std::string &str) { +template void _Position::setFEN(const std::string &str, bool chess960) { current_state = HistoryEntry(); history.clear(); + _chess960 = chess960; std::istringstream ss(str); std::string board_fen, active_color, castling, enpassant; int halfmove = 0, fullmove = 1; @@ -202,44 +188,25 @@ template void _Position::setFEN(const s { File f = FILE_A; Rank r = RANK_8; -#if defined(_DEBUG) || !defined(NDEBUG) || defined(__EXCEPTIONS) int file_count = 0; int rank_count = 0; -#endif - for (char c : board_fen) { if (c == '/') { -#if defined(_DEBUG) || !defined(NDEBUG) - assert(file_count == 8 && "Each rank must contain exactly 8 squares"); -#elif defined(__EXCEPTIONS) - if (file_count != 8) - THROW_IF_EXCEPTIONS_ON(std::invalid_argument("Each rank must contain exactly 8 squares")); -#endif + INVALID_ARG_IF(file_count != 8, "Each rank must contain exactly 8 squares"); f = FILE_A; --r; -#if defined(_DEBUG) || !defined(NDEBUG) || defined(__EXCEPTIONS) file_count = 0; ++rank_count; -#endif continue; } if (c >= '1' && c <= '8') { int empty_squares = c - '0'; -#if defined(_DEBUG) || !defined(NDEBUG) || defined(__EXCEPTIONS) file_count += empty_squares; -#endif f = static_cast(static_cast(f) + empty_squares); } else { -#if defined(_DEBUG) || !defined(NDEBUG) - assert(file_count < 8 && "Too many pieces in one rank"); - assert(chess::is_valid(r, f) && "Invalid file/rank position"); -#elif defined(__EXCEPTIONS) - if (file_count >= 8) - THROW_IF_EXCEPTIONS_ON(std::invalid_argument("Too many pieces in one rank")); - if (!chess::is_valid(r, f)) - THROW_IF_EXCEPTIONS_ON(std::invalid_argument("Invalid file/rank position")); -#endif + INVALID_ARG_IF(file_count >= 8, "Too many pieces in one rank"); + INVALID_ARG_IF(!chess::is_valid(r, f), "Invalid file/rank position"); switch (c) { case 'p': placePiece(make_sq(r, f), BLACK); @@ -278,33 +245,18 @@ template void _Position::setFEN(const s placePiece(make_sq(r, f), WHITE); break; default: -#if defined(_DEBUG) || !defined(NDEBUG) - assert(false && "Invalid FEN character"); -#elif defined(__EXCEPTIONS) - THROW_IF_EXCEPTIONS_ON(std::invalid_argument("Invalid FEN character")); -#endif + INVALID_ARG_IF(false, "Invalid FEN character"); break; } -#if defined(_DEBUG) || !defined(NDEBUG) || defined(__EXCEPTIONS) ++file_count; -#endif f = static_cast(static_cast(f) + 1); } } -#if defined(_DEBUG) || !defined(NDEBUG) // Final assertions after parsing - assert(file_count == 8 && "Last rank must have 8 squares"); - ++rank_count; - assert(rank_count == 8 && "FEN must contain exactly 8 ranks"); -#elif defined(__EXCEPTIONS) - if (file_count != 8) - THROW_IF_EXCEPTIONS_ON(std::invalid_argument("Last rank must have 8 squares")); - rank_count++; - if (rank_count != 8) - THROW_IF_EXCEPTIONS_ON(std::invalid_argument("FEN must contain exactly 8 ranks")); -#endif + INVALID_ARG_IF(file_count != 8, "Last rank must have 8 squares"); + INVALID_ARG_IF(rank_count != 7, "FEN must contain exactly 8 ranks"); } // 2. Turn @@ -314,11 +266,7 @@ template void _Position::setFEN(const s } else if (active_color == "b") { current_state.turn = BLACK; } else { -#if defined(_DEBUG) || !defined(NDEBUG) - assert(false && "Expected white or black, got something else."); -#elif defined(__EXCEPTIONS) - THROW_IF_EXCEPTIONS_ON(std::invalid_argument("Expected white or black, got something else.")); -#endif + INVALID_ARG_IF(active_color != "w" && active_color != "b", "Expected white or black, got something else."); } // 3. Castling rights @@ -326,32 +274,82 @@ template void _Position::setFEN(const s for (char c : castling) { switch (c) { case 'K': + INVALID_ARG_IF(chess960, "Chess960 needs specific file"); current_state.castlingRights |= WHITE_OO; current_state.hash ^= zobrist::RandomCastle[WHITE_OO]; + current_state.castlingMetadata[WHITE].king_start = kingSq(WHITE); + current_state.castlingMetadata[WHITE].rook_start_ks = SQ_H1; break; case 'Q': + INVALID_ARG_IF(chess960, "Chess960 needs specific file"); current_state.castlingRights |= WHITE_OOO; current_state.hash ^= zobrist::RandomCastle[WHITE_OOO]; + current_state.castlingMetadata[WHITE].king_start = kingSq(WHITE); + current_state.castlingMetadata[WHITE].rook_start_qs = SQ_A1; break; case 'k': + INVALID_ARG_IF(chess960, "Chess960 needs specific file"); current_state.castlingRights |= BLACK_OO; current_state.hash ^= zobrist::RandomCastle[BLACK_OO]; + current_state.castlingMetadata[BLACK].king_start = kingSq(BLACK); + current_state.castlingMetadata[BLACK].rook_start_ks = SQ_H8; break; case 'q': + INVALID_ARG_IF(chess960, "Chess960 needs specific file"); current_state.castlingRights |= BLACK_OOO; current_state.hash ^= zobrist::RandomCastle[BLACK_OOO]; + current_state.castlingMetadata[BLACK].king_start = kingSq(BLACK); + current_state.castlingMetadata[BLACK].rook_start_qs = SQ_A8; break; // some optional chess960? maybe not. case '-': break; - default: -#if defined(_DEBUG) || !defined(NDEBUG) - assert(false && "Invalid castling rights, this library doesn't support Chess960"); -#elif defined(__EXCEPTIONS) - THROW_IF_EXCEPTIONS_ON(std::invalid_argument("Invalid castling rights, this library doesn't support Chess960")); -#endif + default: { + INVALID_ARG_IF(!chess960, "Invalid castling right for non-Chess960"); + if (c >= 'A' && c <= 'H') // white-castling + { + CastlingRights cr = (make_sq(RANK_1, static_cast(c - 'a')) > SQ_E1 ? WHITE_OO : WHITE_OOO); + current_state.castlingRights |= cr; + current_state.castlingMetadata[WHITE].king_start = kingSq(WHITE); + if (cr & KING_SIDE) + current_state.castlingMetadata[WHITE].rook_start_ks = make_sq(RANK_1, static_cast(c - 'A')); + else + current_state.castlingMetadata[WHITE].rook_start_qs = make_sq(RANK_1, static_cast(c - 'A')); + } else if (c >= 'a' && c <= 'h') // white-castling + { + CastlingRights cr = (make_sq(RANK_8, static_cast(c - 'a')) > SQ_E8 ? BLACK_OO : BLACK_OOO); + current_state.castlingRights |= cr; + current_state.castlingMetadata[BLACK].king_start = kingSq(BLACK); + if (cr & KING_SIDE) + current_state.castlingMetadata[BLACK].rook_start_ks = make_sq(RANK_8, static_cast(c - 'A')); + else + current_state.castlingMetadata[BLACK].rook_start_qs = make_sq(RANK_8, static_cast(c - 'A')); + } break; } + } + } + for (Color c : { WHITE, BLACK }) { + // king + { + const auto king_from = current_state.castlingMetadata[c].king_start; + const auto rook_from = make_sq(file_of(current_state.castlingMetadata[c].rook_start_ks), rank_of(king_from)); + const auto king_to = castling_king_square(c, true); + const auto rook_to = castling_rook_square(c, true); + current_state.castlingMetadata[c].castling_paths[true] = + (movegen::between(rook_from, rook_to) | movegen::between(king_from, king_to)) & + ~((1ULL<= 'a' && enpassant[0] <= 'h' && enpassant[1] >= '1' && @@ -371,12 +369,7 @@ template void _Position::setFEN(const s current_state.epIncluded = true; } } else { -#if defined(_DEBUG) || !defined(NDEBUG) - assert(enpassant == "-" && "Invalid en passant FEN field"); -#elif defined(__EXCEPTIONS) - if (enpassant != "-") - THROW_IF_EXCEPTIONS_ON(std::invalid_argument("Invalid en passant FEN field")); -#endif + INVALID_ARG_IF(enpassant != "-", "Invalid en passant FEN field"); current_state.enPassant = SQ_NONE; } @@ -510,7 +503,7 @@ template template bool _Position 2) return false; - return false; + return true; } template CheckType _Position::givesCheck(Move m) const { const static auto getSniper = [](const _Position *p, Square ksq, Bitboard oc) { @@ -551,7 +544,7 @@ template CheckType _Position::givesChec Bitboard sniper = getSniper(this, ksq, oc); - while (sniper) { + if (sniper) { Square sq = (Square)pop_lsb(sniper); return (!(movegen::between(ksq, sq) & toBB) || m.typeOf() == Move::CASTLING) ? CheckType::DISCOVERY_CHECK : CheckType::NO_CHECK; @@ -655,7 +648,6 @@ template uint64_t _Position::zobrist() } return hash; } -template _Position::_Position(std::string fen) { setFEN(fen); } template Move _Position::parse_uci(std::string uci) const { return chess::uci::uciToMove(*this, uci); @@ -669,7 +661,7 @@ template Move _Position::push_uci(std:: template Square _Position::_valid_ep_square() const { if (ep_square() == SQ_NONE) return SQ_NONE; - Rank ep_rank = sideToMove() == WHITE ? RANK_3 : RANK_6; + Rank ep_rank = sideToMove() == WHITE ? RANK_6 : RANK_3; Bitboard mask = 1ULL << ep_square(); Bitboard pawn_mask = mask << 8; Bitboard org_pawn_mask = mask >> 8; @@ -755,7 +747,7 @@ template CastlingRights _Position::clea // king exists in e1/e8 depending on color if (!(occ(WHITE) & pieces(KING) & (1ULL << SQ_E1))) white_castling = 0; - if (!(occ(WHITE) & pieces(KING) & (1ULL << SQ_E8))) + if (!(occ(BLACK) & pieces(KING) & (1ULL << SQ_E8))) black_castling = 0; castling = white_castling | black_castling; // Re-map @@ -768,8 +760,7 @@ template CastlingRights _Position::clea } // clang-format off #define INSTANTIATE(PieceC) \ -template _Position::_Position(std::string); \ -template void _Position::setFEN(const std::string &); \ +template void _Position::setFEN(const std::string &, bool); \ template std::string _Position::fen() const; \ template void _Position::doMove(const Move &move); \ template void _Position::doMove(const Move &move); \ diff --git a/position.h b/position.h index 6aa9376..f311718 100644 --- a/position.h +++ b/position.h @@ -29,6 +29,12 @@ template struct alignas(64) HistoryEntry { CastlingRights castlingRights; // Castling rights bitmask Square incr_sqs[4] = { SQ_NONE, SQ_NONE, SQ_NONE, SQ_NONE }; Piece incr_pc[4] = { Piece::NO_PIECE, Piece::NO_PIECE, Piece::NO_PIECE, Piece::NO_PIECE }; + struct { + Square king_start = SQ_NONE; + Square rook_start_ks = SQ_NONE; + Square rook_start_qs = SQ_NONE; + std::array castling_paths; + } castlingMetadata[2]; // implementation-specific implementations goes here }; @@ -177,13 +183,7 @@ template , 2> castling_path = - {{ - {{ 0xe, 0x60 }}, - {{ 0xe00000000000000ULL, 0x6000000000000000ULL }} - }}; - + bool _chess960; public: // Legal move generation functions template __FORCEINLINE void legals(Movelist &out) const { @@ -488,7 +488,9 @@ template = n; } - __FORCEINLINE bool is_seventyfive_moves(int n) { return _is_halfmoves(150); } - __FORCEINLINE bool is_fifty_moves(int n) { return _is_halfmoves(150); } - __FORCEINLINE bool is_fivefold_repetition() { return is_repetition(5); } + __FORCEINLINE bool _is_halfmoves(int n) const { return rule50_count() >= n; } + __FORCEINLINE bool chess960() const { return _chess960; } + __FORCEINLINE bool is_seventyfive_moves(int n) const { return _is_halfmoves(150); } + __FORCEINLINE bool is_fifty_moves(int n) const { return _is_halfmoves(150); } + __FORCEINLINE bool is_fivefold_repetition() const { return is_repetition(5); } __FORCEINLINE bool is_attacked_by(Color color, Square sq, Bitboard occupied = 0) const { Bitboard occ_bb = occupied ? occupied : this->occ(); return attackers_mask(color, sq, occ_bb) != 0; @@ -618,7 +621,7 @@ template = 100; } - [[nodiscard]] __FORCEINLINE Bitboard getCastlingPath(Color c, bool isKingSide) const { return castling_path[c][isKingSide]; } + [[nodiscard]] __FORCEINLINE Bitboard getCastlingPath(Color c, bool isKingSide) const { return current_state.castlingMetadata[c].castling_paths[isKingSide]; } private: template [[nodiscard]] __FORCEINLINE Bitboard pinMask(Color c, Square sq) const { static_assert(pt == BISHOP || pt == ROOK, "Only bishop or rook allowed!"); @@ -643,74 +646,12 @@ template &state) { - // compatible! - current_state = state; - for (Square sq = SQ_A1; sq < SQ_NONE; sq++) { - Bitboard mask = (1ULL << sq); - if (((state.occ[WHITE] | state.occ[BLACK]) & mask) == 0) { - pieces_list[sq] = PieceC::NO_PIECE; - continue; - } - bool c = (state.occ[WHITE] & mask) != 0; - for (PieceType pt : { PAWN, KNIGHT, BISHOP, ROOK, QUEEN, KING }) { - bool is_p = (current_state.pieces[(int)pt] & mask) != 0; - if (is_p) { - pieces_list[sq] = make_piece(pt, c ? WHITE : BLACK); - break; - } - } - } - refresh_attacks(); - } __FORCEINLINE _Position(const _Position &other) - : current_state(other.current_state), history(other.history) // calls HeapAllocatedValueList's copy constructor + : current_state(other.current_state), history(other.history), _chess960(other._chess960) { std::copy(std::begin(other.pieces_list), std::end(other.pieces_list), std::begin(pieces_list)); refresh_attacks(); } - - template ::value && !std::is_same_v, int> = 0> - [[deprecated("Incompatible piece method used, you shouldn't call this")]] __FORCEINLINE - _Position(const HistoryEntry &state) { - // incompatible! - current_state = HistoryEntry(); - current_state.turn = state.turn; - current_state.castlingRights = state.castlingRights; - current_state.enPassant = state.enPassant; - current_state.halfMoveClock = state.halfMoveClock; - current_state.fullMoveNumber = state.fullMoveNumber; - current_state.hash = state.hash; - current_state.epIncluded = state.epIncluded; - std::copy(std::begin(state.pieces), std::end(state.pieces), current_state.pieces); - current_state.repetition = state.repetition; - std::copy(std::begin(state.kings), std::end(state.kings), current_state.kings); - std::copy(std::begin(state.occ), std::end(state.occ), current_state.occ); - current_state.pliesFromNull = state.pliesFromNull; - for (Square sq = SQ_A1; sq < SQ_NONE; sq++) { - Bitboard mask = (1ULL << sq); - if (((state.occ[WHITE] | state.occ[BLACK]) & mask) == 0) { - pieces_list[sq] = PieceC::NO_PIECE; - continue; - } - bool c = (state.occ[WHITE] & mask) != 0; - for (PieceType pt : { PAWN, KNIGHT, BISHOP, ROOK, QUEEN, KING }) { - bool is_p = (current_state.pieces[(int)pt] & mask) != 0; - if (is_p) { - pieces_list[sq] = make_piece(pt, c ? WHITE : BLACK); - break; - } - } - } - refresh_attacks(); - } }; namespace attacks{ /** diff --git a/tests.cpp b/tests.cpp index 1c3152a..74f21a4 100644 --- a/tests.cpp +++ b/tests.cpp @@ -15,14 +15,12 @@ static_assert(color_of(PolyglotPiece::BBISHOP) == BLACK, "BBISHOP should be BLAC static_assert(color_of(PolyglotPiece::BROOK) == BLACK, "BROOK should be BLACK"); static_assert(color_of(PolyglotPiece::BQUEEN) == BLACK, "BQUEEN should be BLACK"); static_assert(color_of(PolyglotPiece::BKING) == BLACK, "BKING should be BLACK"); - static_assert(color_of(PolyglotPiece::WPAWN) == WHITE, "WPAWN should be WHITE"); static_assert(color_of(PolyglotPiece::WKNIGHT) == WHITE, "WKNIGHT should be WHITE"); static_assert(color_of(PolyglotPiece::WBISHOP) == WHITE, "WBISHOP should be WHITE"); static_assert(color_of(PolyglotPiece::WROOK) == WHITE, "WROOK should be WHITE"); static_assert(color_of(PolyglotPiece::WQUEEN) == WHITE, "WQUEEN should be WHITE"); static_assert(color_of(PolyglotPiece::WKING) == WHITE, "WKING should be WHITE"); - static_assert(color_of(ContiguousMappingPiece::WPAWN) == WHITE, "WPAWN should be WHITE"); static_assert(color_of(ContiguousMappingPiece::WKNIGHT) == WHITE, "WKNIGHT should be WHITE"); static_assert(color_of(ContiguousMappingPiece::WBISHOP) == WHITE, "WBISHOP should be WHITE"); @@ -42,14 +40,12 @@ static_assert(piece_of(PolyglotPiece::BBISHOP) == BISHOP, "BBISHOP -> BISHOP"); static_assert(piece_of(PolyglotPiece::BROOK) == ROOK, "BROOK -> ROOK"); static_assert(piece_of(PolyglotPiece::BQUEEN) == QUEEN, "BQUEEN -> QUEEN"); static_assert(piece_of(PolyglotPiece::BKING) == KING, "BKING -> KING"); - static_assert(piece_of(PolyglotPiece::WPAWN) == PAWN, "WPAWN -> PAWN"); static_assert(piece_of(PolyglotPiece::WKNIGHT) == KNIGHT, "WKNIGHT -> KNIGHT"); static_assert(piece_of(PolyglotPiece::WBISHOP) == BISHOP, "WBISHOP -> BISHOP"); static_assert(piece_of(PolyglotPiece::WROOK) == ROOK, "WROOK -> ROOK"); static_assert(piece_of(PolyglotPiece::WQUEEN) == QUEEN, "WQUEEN -> QUEEN"); static_assert(piece_of(PolyglotPiece::WKING) == KING, "WKING -> KING"); - static_assert(piece_of(PolyglotPiece::NO_PIECE) == NO_PIECE_TYPE, "NO_PIECE -> NO_PIECE_TYPE"); static_assert(piece_of(ContiguousMappingPiece::WPAWN) == PAWN, "WPAWN should be PAWN"); static_assert(piece_of(ContiguousMappingPiece::WKNIGHT) == KNIGHT, "WKNIGHT should be KNIGHT"); @@ -64,7 +60,6 @@ static_assert(piece_of(ContiguousMappingPiece::BROOK) == ROOK, "BROOK should be static_assert(piece_of(ContiguousMappingPiece::BQUEEN) == QUEEN, "BQUEEN should be QUEEN"); static_assert(piece_of(ContiguousMappingPiece::BKING) == KING, "BKING should be KING"); static_assert(piece_of(ContiguousMappingPiece::NO_PIECE) == NO_PIECE_TYPE, "NO_PIECE -> NO_PIECE_TYPE"); - // --------- Round-trip make_piece assertions ---------- static_assert(make_piece(PAWN, BLACK) == PolyglotPiece::BPAWN, "make_piece PAWN,BLACK -> BPAWN"); static_assert(make_piece(KNIGHT, BLACK) == PolyglotPiece::BKNIGHT, "make_piece KNIGHT,BLACK -> BKNIGHT"); @@ -72,14 +67,12 @@ static_assert(make_piece(BISHOP, BLACK) == PolyglotPiece::BBISHOP static_assert(make_piece(ROOK, BLACK) == PolyglotPiece::BROOK, "make_piece ROOK,BLACK -> BROOK"); static_assert(make_piece(QUEEN, BLACK) == PolyglotPiece::BQUEEN, "make_piece QUEEN,BLACK -> BQUEEN"); static_assert(make_piece(KING, BLACK) == PolyglotPiece::BKING, "make_piece KING,BLACK -> BKING"); - static_assert(make_piece(PAWN, WHITE) == PolyglotPiece::WPAWN, "make_piece PAWN,WHITE -> WPAWN"); static_assert(make_piece(KNIGHT, WHITE) == PolyglotPiece::WKNIGHT, "make_piece KNIGHT,WHITE -> WKNIGHT"); static_assert(make_piece(BISHOP, WHITE) == PolyglotPiece::WBISHOP, "make_piece BISHOP,WHITE -> WBISHOP"); static_assert(make_piece(ROOK, WHITE) == PolyglotPiece::WROOK, "make_piece ROOK,WHITE -> WROOK"); static_assert(make_piece(QUEEN, WHITE) == PolyglotPiece::WQUEEN, "make_piece QUEEN,WHITE -> WQUEEN"); static_assert(make_piece(KING, WHITE) == PolyglotPiece::WKING, "make_piece KING,WHITE -> WKING"); - static_assert(make_piece(PAWN, BLACK) == ContiguousMappingPiece::BPAWN, "make_piece PAWN,BLACK -> BPAWN"); static_assert(make_piece(KNIGHT, BLACK) == ContiguousMappingPiece::BKNIGHT, @@ -92,7 +85,6 @@ static_assert(make_piece(QUEEN, BLACK) == ContiguousMapp "make_piece QUEEN,BLACK -> BQUEEN"); static_assert(make_piece(KING, BLACK) == ContiguousMappingPiece::BKING, "make_piece KING,BLACK -> BKING"); - static_assert(make_piece(PAWN, WHITE) == ContiguousMappingPiece::WPAWN, "make_piece PAWN,WHITE -> WPAWN"); static_assert(make_piece(KNIGHT, WHITE) == ContiguousMappingPiece::WKNIGHT, @@ -112,14 +104,12 @@ static_assert(piece_of(make_piece(BISHOP, WHITE)) == BISHOP, "Rou static_assert(piece_of(make_piece(ROOK, WHITE)) == ROOK, "Round-trip piece ROOK,WHITE"); static_assert(piece_of(make_piece(QUEEN, WHITE)) == QUEEN, "Round-trip piece ROOK,WHITE"); static_assert(piece_of(make_piece(KING, WHITE)) == KING, "Round-trip piece ROOK,WHITE"); - static_assert(piece_of(make_piece(PAWN, BLACK)) == PAWN, "Round-trip piece PAWN,BLACK"); static_assert(piece_of(make_piece(KNIGHT, BLACK)) == KNIGHT, "Round-trip piece KNIGHT,BLACK"); static_assert(piece_of(make_piece(BISHOP, BLACK)) == BISHOP, "Round-trip piece BISHOP,BLACK"); static_assert(piece_of(make_piece(ROOK, BLACK)) == ROOK, "Round-trip piece ROOK,BLACK"); static_assert(piece_of(make_piece(QUEEN, BLACK)) == QUEEN, "Round-trip piece ROOK,BLACK"); static_assert(piece_of(make_piece(KING, BLACK)) == KING, "Round-trip piece ROOK,BLACK"); - // --------- Color assertions ---------- static_assert(color_of(PolyglotPiece::BPAWN) == BLACK, "BPAWN should be BLACK"); static_assert(color_of(PolyglotPiece::BKNIGHT) == BLACK, "BKNIGHT should be BLACK"); @@ -127,14 +117,12 @@ static_assert(color_of(PolyglotPiece::BBISHOP) == BLACK, "BBISHOP should be BLAC static_assert(color_of(PolyglotPiece::BROOK) == BLACK, "BROOK should be BLACK"); static_assert(color_of(PolyglotPiece::BQUEEN) == BLACK, "BQUEEN should be BLACK"); static_assert(color_of(PolyglotPiece::BKING) == BLACK, "BKING should be BLACK"); - static_assert(color_of(PolyglotPiece::WPAWN) == WHITE, "WPAWN should be WHITE"); static_assert(color_of(PolyglotPiece::WKNIGHT) == WHITE, "WKNIGHT should be WHITE"); static_assert(color_of(PolyglotPiece::WBISHOP) == WHITE, "WBISHOP should be WHITE"); static_assert(color_of(PolyglotPiece::WROOK) == WHITE, "WROOK should be WHITE"); static_assert(color_of(PolyglotPiece::WQUEEN) == WHITE, "WQUEEN should be WHITE"); static_assert(color_of(PolyglotPiece::WKING) == WHITE, "WKING should be WHITE"); - // --------- PieceType assertions ---------- static_assert(piece_of(EnginePiece::BPAWN) == PAWN, "BPAWN -> PAWN"); static_assert(piece_of(EnginePiece::BKNIGHT) == KNIGHT, "BKNIGHT -> KNIGHT"); @@ -142,16 +130,13 @@ static_assert(piece_of(EnginePiece::BBISHOP) == BISHOP, "BBISHOP -> BISHOP"); static_assert(piece_of(EnginePiece::BROOK) == ROOK, "BROOK -> ROOK"); static_assert(piece_of(EnginePiece::BQUEEN) == QUEEN, "BQUEEN -> QUEEN"); static_assert(piece_of(EnginePiece::BKING) == KING, "BKING -> KING"); - static_assert(piece_of(EnginePiece::WPAWN) == PAWN, "WPAWN -> PAWN"); static_assert(piece_of(EnginePiece::WKNIGHT) == KNIGHT, "WKNIGHT -> KNIGHT"); static_assert(piece_of(EnginePiece::WBISHOP) == BISHOP, "WBISHOP -> BISHOP"); static_assert(piece_of(EnginePiece::WROOK) == ROOK, "WROOK -> ROOK"); static_assert(piece_of(EnginePiece::WQUEEN) == QUEEN, "WQUEEN -> QUEEN"); static_assert(piece_of(EnginePiece::WKING) == KING, "WKING -> KING"); - static_assert(piece_of(EnginePiece::NO_PIECE) == NO_PIECE_TYPE, "NO_PIECE -> NO_PIECE_TYPE"); - // --------- Round-trip make_piece assertions ---------- static_assert(make_piece(PAWN, BLACK) == EnginePiece::BPAWN, "make_piece PAWN,BLACK -> BPAWN"); static_assert(make_piece(KNIGHT, BLACK) == EnginePiece::BKNIGHT, "make_piece KNIGHT,BLACK -> BKNIGHT"); @@ -159,14 +144,12 @@ static_assert(make_piece(BISHOP, BLACK) == EnginePiece::BBISHOP, "m static_assert(make_piece(ROOK, BLACK) == EnginePiece::BROOK, "make_piece ROOK,BLACK -> BROOK"); static_assert(make_piece(QUEEN, BLACK) == EnginePiece::BQUEEN, "make_piece QUEEN,BLACK -> BQUEEN"); static_assert(make_piece(KING, BLACK) == EnginePiece::BKING, "make_piece KING,BLACK -> BKING"); - static_assert(make_piece(PAWN, WHITE) == EnginePiece::WPAWN, "make_piece PAWN,WHITE -> WPAWN"); static_assert(make_piece(KNIGHT, WHITE) == EnginePiece::WKNIGHT, "make_piece KNIGHT,WHITE -> WKNIGHT"); static_assert(make_piece(BISHOP, WHITE) == EnginePiece::WBISHOP, "make_piece BISHOP,WHITE -> WBISHOP"); static_assert(make_piece(ROOK, WHITE) == EnginePiece::WROOK, "make_piece ROOK,WHITE -> WROOK"); static_assert(make_piece(QUEEN, WHITE) == EnginePiece::WQUEEN, "make_piece QUEEN,WHITE -> WQUEEN"); static_assert(make_piece(KING, WHITE) == EnginePiece::WKING, "make_piece KING,WHITE -> WKING"); - // --------- Round-trip consistency ---------- static_assert(piece_of(make_piece(PAWN, WHITE)) == PAWN, "Round-trip piece PAWN,WHITE"); static_assert(piece_of(make_piece(KNIGHT, WHITE)) == KNIGHT, "Round-trip piece KNIGHT,WHITE"); @@ -174,7 +157,6 @@ static_assert(piece_of(make_piece(BISHOP, WHITE)) == BISHOP, "Round static_assert(piece_of(make_piece(ROOK, WHITE)) == ROOK, "Round-trip piece ROOK,WHITE"); static_assert(piece_of(make_piece(QUEEN, WHITE)) == QUEEN, "Round-trip piece ROOK,WHITE"); static_assert(piece_of(make_piece(KING, WHITE)) == KING, "Round-trip piece ROOK,WHITE"); - static_assert(piece_of(make_piece(PAWN, BLACK)) == PAWN, "Round-trip piece PAWN,BLACK"); static_assert(piece_of(make_piece(KNIGHT, BLACK)) == KNIGHT, "Round-trip piece KNIGHT,BLACK"); static_assert(piece_of(make_piece(BISHOP, BLACK)) == BISHOP, "Round-trip piece BISHOP,BLACK"); @@ -213,22 +195,17 @@ template uint64_t perft(_Po } else { Movelist moves; pos.template legals(moves); - uint64_t total = 0; for (const Move &m : moves) { pos.template doMove(m); const uint64_t nodes = perft(pos, depth - 1); pos.undoMove(); - if constexpr (EnableDiv) std::cout << m << ": " << nodes << '\n'; - total += nodes; } - if constexpr (EnableDiv) std::cout << "Total: " << total << '\n'; - return total; } } @@ -238,30 +215,39 @@ void check_perfts(const std::vector> &entries) { double elapsed = 0; using namespace std::chrono; for (auto &entry : entries) { - _Position pos(entry.input); - auto start_time = high_resolution_clock::now(); - REQUIRE(perft(pos, entry.info.depth) == entry.info.nodes); - auto end_time = high_resolution_clock::now(); - elapsed += duration(end_time - start_time).count(); - nodes += entry.info.nodes; - } - for (auto &entry : entries) { - _Position pos(entry.input); - auto start_time = high_resolution_clock::now(); - REQUIRE(perft(pos, entry.info.depth) == entry.info.nodes); - auto end_time = high_resolution_clock::now(); - elapsed += duration(end_time - start_time).count(); - nodes += entry.info.nodes; - } - for (auto &entry : entries) { - _Position pos(entry.input); - auto start_time = high_resolution_clock::now(); - REQUIRE(perft(pos, entry.info.depth) == entry.info.nodes); - auto end_time = high_resolution_clock::now(); - elapsed += duration(end_time - start_time).count(); - nodes += entry.info.nodes; + std::cerr << entry.input << ' '< 5e7) { + std::cerr << "(skipped)"; + continue; + } + #endif + std::cerr<<'\n'; + { + _Position pos(entry.input); + auto start_time = high_resolution_clock::now(); + REQUIRE(perft(pos, entry.info.depth) == entry.info.nodes); + auto end_time = high_resolution_clock::now(); + elapsed += duration(end_time - start_time).count(); + nodes += entry.info.nodes; + } + { + _Position pos(entry.input); + auto start_time = high_resolution_clock::now(); + REQUIRE(perft(pos, entry.info.depth) == entry.info.nodes); + auto end_time = high_resolution_clock::now(); + elapsed += duration(end_time - start_time).count(); + nodes += entry.info.nodes; + } + { + _Position pos(entry.input); + auto start_time = high_resolution_clock::now(); + REQUIRE(perft(pos, entry.info.depth) == entry.info.nodes); + auto end_time = high_resolution_clock::now(); + elapsed += duration(end_time - start_time).count(); + nodes += entry.info.nodes; + } } - double mnps = (nodes / elapsed) / 1'000'000.0; std::cout << "Speed: " << mnps << "Mnps\n"; } @@ -346,7 +332,6 @@ TEST_CASE("Move making pin update") { REQUIRE(pin_mask == 0x8040201000000ULL); } } - TEST_CASE("Perfts") { std::vector> tests = { { "5k2/8/8/8/3K4/8/8/8 w - - 0 1", 1, 8 }, @@ -357,9 +342,7 @@ TEST_CASE("Perfts") { { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 3, 8902 }, { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 4, 197281 }, { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 5, 4865609 }, -#if IS_RELEASE == 1 { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 6, 119060324 }, -#endif { "rnbqkbnr/pppppppp/8/8/8/3P4/PPP1PPPP/RNBQKBNR b KQkq - 0 1", 4, 328511 }, { "rnbqkbnr/pp1ppppp/2p5/8/8/3P4/PPP1PPPP/RNBQKBNR w KQkq - 0 2", 3, 15206 }, { "rnbqkbnr/pp1ppppp/2p5/8/8/3P4/PPPKPPPP/RNBQ1BNR b kq - 1 2", 2, 463 }, @@ -379,19 +362,15 @@ TEST_CASE("Perfts") { { "R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNNK1B1 w - - 0 1", 2, 95 }, { "R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNNK1B1 w - - 0 1", 3, 18138 }, { "R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNNK1B1 w - - 0 1", 4, 80766 }, -#if IS_RELEASE == 1 { "R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNNK1B1 w - - 0 1", 5, 11649711 }, -#endif { "8/2p5/3p4/KP3k1r/2R1Pp2/6P1/8/8 b - e3 0 1", 1, 7 }, { "8/2p5/3p4/KP3k1r/2R1Pp2/6P1/8/8 b - e3 0 1", 2, 108 }, { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 1, 48 }, { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 2, 2039 }, { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 3, 97862 }, -#if IS_RELEASE == 1 { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 4, 4085603 }, { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 5, 193690690 }, { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/P1N2Q1p/1PPBBPPP/R3K2R b KQkq - 0 1", 4, 4627439 }, -#endif { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/4P3/PpN2Q1p/1PPBBPPP/R3K2R w KQkq - 0 2", 3, 103849 }, { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/4P3/PPN2Q1p/1P1BBPPP/R3K2R b KQkq - 0 2", 2, 2098 }, { "r3k2r/p1ppqpb1/1n2pnp1/3PN3/4P3/PPNb1Q1p/1P1BBPPP/R3K2R w KQkq - 1 3", 1, 46 }, @@ -403,19 +382,15 @@ TEST_CASE("Perfts") { { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 3, 2812 }, { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 4, 43238 }, { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 5, 674624 }, -#if IS_RELEASE == 1 { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 6, 11030083 }, { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 7, 178633661 }, -#endif { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 1, 6 }, { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 2, 264 }, { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 3, 9467 }, { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 4, 422333 }, -#if IS_RELEASE == 1 { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 5, 15833292 }, //{ "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 6, 706045033 }, { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P1RPP/R2Q2K1 b kq - 1 1", 4, 2703427 }, -#endif { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/5q2/Pp1P1RPP/R2Q2K1 w kq - 0 2", 3, 58801 }, { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/5q2/Pp1P1RPP/R2Q1K2 b kq - 1 2", 2, 1732 }, { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/5q2/P2P1RPP/Rq1Q1K2 w kq - 0 3", 1, 30 }, @@ -424,24 +399,18 @@ TEST_CASE("Perfts") { { "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 2, 264 }, { "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 3, 9467 }, { "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 4, 422333 }, -#if IS_RELEASE == 1 { "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 5, 15833292 }, - //{ "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 6, 706045033 } -#endif + //{ "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 6, 706045033 } { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 1, 44 }, { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 2, 1486 }, { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 3, 62379 }, -#if IS_RELEASE == 1 { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 4, 2103487 }, { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 5, 89941194 }, -#endif { "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10", 1, 46 }, { "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10", 2, 2079 }, { "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10", 3, 89890 }, -#if IS_RELEASE == 1 { "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10", 4, 3894594 }, { "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10", 5, 164075551 }, -#endif { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 1, 5 }, { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 2, 18 }, { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 3, 176 }, @@ -450,9 +419,7 @@ TEST_CASE("Perfts") { { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 6, 63994 }, { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 7, 1109712 }, { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 8, 5763773 }, -#if IS_RELEASE == 1 { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 9, 109424670 }, -#endif // https://www.chessprogramming.net/perfect-perft/ { "3k4/3p4/8/K1P4r/8/8/8/8 b - - 0 1", 6, 1134888 }, { "8/8/4k3/8/2p5/8/B2P2K1/8 w - - 0 1", 6, 1015133 }, @@ -470,26 +437,18 @@ TEST_CASE("Perfts") { // https://github.com/SebLague/Chess-Coding-Adventure/blob/Chess-V2-Unity/Assets/Scripts/Testing/Perft/Suites/Suite%20Full.txt // converted to [fen, depth, nodes], deduped tests { "2b1b3/1r1P4/3K3p/1p6/2p5/6k1/1P3p2/4B3 w - - 0 42", 5, 5617302 }, -#if IS_RELEASE == 1 { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - -", 6, 11030083 }, { "r3k2r/pp3pp1/PN1pr1p1/4p1P1/4P3/3P4/P1P2PP1/R3K2R w KQkq - 4 4", 5, 15587335 }, { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 5, 89941194 }, -#endif -#if IS_RELEASE == 1 { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq -", 5, 193690690 }, -#endif { "r3k1nr/p2pp1pp/b1n1P1P1/1BK1Pp1q/8/8/2PP1PPP/6N1 w kq - 0 1", 4, 497787 }, -#if IS_RELEASE == 1 { "3k4/8/8/8/8/8/8/R3K3 w Q - 0 1", 7, 15594314 }, -#endif { "2K2r2/4P3/8/8/8/8/8/3k4 w - - 0 1", 6, 3821001 }, { "K1k5/8/P7/8/8/8/8/8 w - - 0 1", 10, 5966690 }, { "8/8/2k5/5q2/5n2/8/5K2/8 b - - 0 1", 6, 3114998 }, { "4k2r/1pp1n2p/6N1/K2P2r1/1P2P3/P5P1/3b3P/R7 w k - 1 8", 4, 380429 }, -#if IS_RELEASE == 1 { "r1bq2r1/1pppkppp/1b3n2/pP1PP3/2n5/2P5/P3QPPP/RNB1K2R w KQ a6 0 12", 5, 42761834 }, { "4k2r/1pp1n2p/6N1/1K1P2r1/4P3/P5P1/1Pp4P/R7 w k - 0 6", 5, 10574719 }, -#endif { "r3k2r/pppqbppp/3p1n1B/1N2p3/1nB1P3/3P3b/PPPQNPPP/R3K2R w KQkq - 11 10", 4, 3050662 }, { "1Bb3BN/R2Pk2r/1Q5B/4q2R/2bN4/4Q1BK/1p6/1bq1R1rb w - - 0 1", 4, 6871272 }, { "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1", 9, 7618365 }, @@ -561,57 +520,43 @@ TEST_CASE("Perfts") { { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 3, 13744 }, { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 4, 314346 }, { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 5, 7594526 }, -#if IS_RELEASE == 1 { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 6, 179862938 }, -#endif { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 1, 25 }, { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 2, 567 }, { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 3, 14095 }, { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 4, 328965 }, { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 5, 8153719 }, -#if IS_RELEASE == 1 { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 6, 195629489 }, -#endif { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 1, 25 }, { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 2, 548 }, { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 3, 13502 }, { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 4, 312835 }, { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 5, 7736373 }, -#if IS_RELEASE == 1 { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 6, 184411439 }, -#endif { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 1, 25 }, { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 2, 547 }, { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 3, 13579 }, { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 4, 316214 }, { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 5, 7878456 }, -#if IS_RELEASE == 1 { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 6, 189224276 }, -#endif { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 1, 26 }, { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 2, 583 }, { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 3, 14252 }, { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 4, 334705 }, { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 5, 8198901 }, -#if IS_RELEASE == 1 { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 6, 198328929 }, -#endif { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 1, 25 }, { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 2, 560 }, { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 3, 13592 }, { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 4, 317324 }, { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 5, 7710115 }, -#if IS_RELEASE == 1 { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 6, 185959088 }, -#endif { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 1, 25 }, { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 2, 560 }, { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 3, 13607 }, { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 4, 320792 }, { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 5, 7848606 }, -#if IS_RELEASE == 1 { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 6, 190755813 }, -#endif { "4k3/8/8/8/8/8/8/4K2R b K - 0 1", 1, 5 }, { "4k3/8/8/8/8/8/8/4K2R b K - 0 1", 2, 75 }, { "4k3/8/8/8/8/8/8/4K2R b K - 0 1", 3, 459 }, @@ -677,57 +622,43 @@ TEST_CASE("Perfts") { { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 3, 13744 }, { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 4, 314346 }, { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 5, 7594526 }, -#if IS_RELEASE == 1 { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 6, 179862938 }, -#endif { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 1, 26 }, { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 2, 583 }, { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 3, 14252 }, { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 4, 334705 }, { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 5, 8198901 }, -#if IS_RELEASE == 1 { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 6, 198328929 }, -#endif { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 1, 25 }, { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 2, 560 }, { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 3, 13592 }, { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 4, 317324 }, { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 5, 7710115 }, -#if IS_RELEASE == 1 { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 6, 185959088 }, -#endif { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 1, 25 }, { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 2, 560 }, { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 3, 13607 }, { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 4, 320792 }, { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 5, 7848606 }, -#if IS_RELEASE == 1 { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 6, 190755813 }, -#endif { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 1, 25 }, { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 2, 567 }, { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 3, 14095 }, { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 4, 328965 }, { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 5, 8153719 }, -#if IS_RELEASE == 1 { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 6, 195629489 }, -#endif { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 1, 25 }, { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 2, 548 }, { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 3, 13502 }, { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 4, 312835 }, { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 5, 7736373 }, -#if IS_RELEASE == 1 { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 6, 184411439 }, -#endif { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 1, 25 }, { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 2, 547 }, { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 3, 13579 }, { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 4, 316214 }, { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 5, 7878456 }, -#if IS_RELEASE == 1 { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 6, 189224276 }, -#endif { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1", 1, 14 }, { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1", 2, 195 }, { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1", 3, 2760 }, @@ -745,9 +676,7 @@ TEST_CASE("Perfts") { { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 3, 4442 }, { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 4, 73584 }, { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 5, 1198299 }, -#if IS_RELEASE == 1 { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 6, 19870403 }, -#endif { "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1", 1, 3 }, { "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1", 2, 51 }, { "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1", 3, 345 }, @@ -795,17 +724,13 @@ TEST_CASE("Perfts") { { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 3, 4607 }, { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 4, 76778 }, { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 5, 1320507 }, -#if IS_RELEASE == 1 { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 6, 22823890 }, -#endif { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 1, 21 }, { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 2, 316 }, { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 3, 5744 }, { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 4, 93338 }, { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 5, 1713368 }, -#if IS_RELEASE == 1 { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 6, 28861171 }, -#endif { "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1", 1, 21 }, { "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1", 2, 144 }, { "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1", 3, 3242 }, @@ -829,9 +754,7 @@ TEST_CASE("Perfts") { { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 3, 5133 }, { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 4, 93603 }, { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 5, 1591064 }, -#if IS_RELEASE == 1 { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 6, 29027891 }, -#endif { "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1", 1, 7 }, { "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1", 2, 143 }, { "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1", 3, 1416 }, @@ -849,33 +772,25 @@ TEST_CASE("Perfts") { { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 3, 5300 }, { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 4, 104342 }, { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 5, 2161211 }, -#if IS_RELEASE == 1 { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 6, 44956585 }, -#endif { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 1, 36 }, { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 2, 1027 }, { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 3, 29215 }, { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 4, 771461 }, -#if IS_RELEASE == 1 { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 5, 20506480 }, { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 6, 525169084 }, -#endif { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 1, 19 }, { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 2, 275 }, { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 3, 5300 }, { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 4, 104342 }, { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 5, 2161211 }, -#if IS_RELEASE == 1 { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 6, 44956585 }, -#endif { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 1, 36 }, { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 2, 1027 }, { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 3, 29227 }, { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 4, 771368 }, -#if IS_RELEASE == 1 { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 5, 20521342 }, { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 6, 524966748 }, -#endif { "6kq/8/8/8/8/8/8/7K w - - 0 1", 1, 2 }, { "6kq/8/8/8/8/8/8/7K w - - 0 1", 2, 36 }, { "6kq/8/8/8/8/8/8/7K w - - 0 1", 3, 143 }, @@ -1247,49 +1162,37 @@ TEST_CASE("Perfts") { { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 3, 7421 }, { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 4, 124608 }, { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 5, 2193768 }, -#if IS_RELEASE == 1 { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 6, 37665329 }, -#endif { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 1, 18 }, { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 2, 270 }, { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 3, 4699 }, { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 4, 79355 }, { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 5, 1533145 }, -#if IS_RELEASE == 1 { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 6, 28859283 }, -#endif { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 1, 24 }, { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 2, 496 }, { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 3, 9483 }, { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 4, 182838 }, { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 5, 3605103 }, -#if IS_RELEASE == 1 { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 6, 71179139 }, -#endif { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 1, 11 }, { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 2, 97 }, { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 3, 887 }, { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 4, 8048 }, { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 5, 90606 }, -#if IS_RELEASE == 1 { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 6, 1030499 }, -#endif { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 1, 24 }, { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 2, 421 }, { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 3, 7421 }, { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 4, 124608 }, { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 5, 2193768 }, -#if IS_RELEASE == 1 { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 6, 37665329 }, -#endif { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 1, 18 }, { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 2, 270 }, { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 3, 4699 }, { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 4, 79355 }, { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 5, 1533145 }, -#if IS_RELEASE == 1 { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 6, 28859283 }, -#endif { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 1, 24 }, { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 2, 496 }, { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 3, 9483 }, @@ -1299,9 +1202,7 @@ TEST_CASE("Perfts") { { "6k1/2nNrq2/bb1P2NR/P2bqqN1/qpKQ3n/2Rn2B1/B1r1N3/1Q1Nb3 w - - 0 1", 5, 0 }, // checkmate { "K7/3n3R/1r4k1/8/8/8/2p5/8 w - - 0 1", 5, 1056215 }, { "1Qn2n1k/P1K2P2/1pr2nrP/1p2Q1b1/bPP2B2/p2B1q1N/2Rpp1pn/Q3Q1N1 w - - 0 1", 1, 2 }, -#if IS_RELEASE == 1 { "1Qn2n1k/P1K2P2/1pr2nrP/1p2Q1b1/bPP2B2/p2B1q1N/2Rpp1pn/Q3Q1N1 w - - 0 1", 5, 11921325 }, -#endif { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 1, 3 }, { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 2, 57 }, { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 3, 261 }, @@ -1309,54 +1210,34 @@ TEST_CASE("Perfts") { { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 5, 22176 }, { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 6, 413723 }, { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 7, 2109569 }, -#if IS_RELEASE == 1 { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 8, 39470570 }, -#endif { "8/5K1p/r7/6q1/2p5/5qk1/8/8 w - - 0 1", 1, 1 }, { "8/5K1p/r7/6q1/2p5/5qk1/8/8 w - - 0 1", 5, 17218 }, { "3n2r1/2k2B1q/3B2Q1/N1n1P3/1r1R1NQ1/2brB1r1/PQB5/bK6 b - - 0 1", 1, 1 }, -#if IS_RELEASE == 1 { "3n2r1/2k2B1q/3B2Q1/N1n1P3/1r1R1NQ1/2brB1r1/PQB5/bK6 b - - 0 1", 5, 7037862 }, -#endif { "4q2R/BQ1Np2k/4pn2/bK1N4/4p3/1n6/8/8 b - - 0 1", 1, 4 }, -#if IS_RELEASE == 1 { "4q2R/BQ1Np2k/4pn2/bK1N4/4p3/1n6/8/8 b - - 0 1", 5, 3945793 }, -#endif { "1K6/6N1/5Q2/5p2/4Pk2/8/8/8 b - - 0 1", 1, 5 }, { "1K6/6N1/5Q2/5p2/4Pk2/8/8/8 b - - 0 1", 5, 188155 }, { "1K6/6N1/5Q2/5p2/4Pk2/8/8/8 b - - 0 1", 6, 5537444 }, -#if IS_RELEASE == 1 { "1K6/6N1/5Q2/5p2/4Pk2/8/8/8 b - - 0 1", 7, 33107724 }, -#endif { "k2bR1B1/NR3B2/2BR4/1N1p1bN1/N3b3/7r/B2n1KN1/2Q5 w - - 0 1", 1, 64 }, -#if IS_RELEASE == 1 { "k2bR1B1/NR3B2/2BR4/1N1p1bN1/N3b3/7r/B2n1KN1/2Q5 w - - 0 1", 4, 2641743 }, -#endif { "4B3/8/5K2/8/8/3k4/8/5N2 b - - 0 1", 1, 6 }, { "4B3/8/5K2/8/8/3k4/8/5N2 b - - 0 1", 5, 71831 }, -#if IS_RELEASE == 1 { "4B3/8/5K2/8/8/3k4/8/5N2 b - - 0 1", 6, 1376826 }, -#endif { "3q3B/3Q4/1k1N4/5Q2/6Q1/1B2N2Q/K4bB1/2q2N2 b - - 0 1", 1, 35 }, -#if IS_RELEASE == 1 { "3q3B/3Q4/1k1N4/5Q2/6Q1/1B2N2Q/K4bB1/2q2N2 b - - 0 1", 4, 5855605 }, -#endif { "8/1K6/8/8/6n1/1k6/8/8 w - - 0 1", 1, 8 }, { "8/1K6/8/8/6n1/1k6/8/8 w - - 0 1", 5, 50950 }, -#if IS_RELEASE == 1 { "8/1K6/8/8/6n1/1k6/8/8 w - - 0 1", 7, 3844295 }, -#endif -#if IS_RELEASE == 1 { "8/1K6/8/8/6n1/1k6/8/8 w - - 0 1", 8, 47694794 }, -#endif { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 1, 63 }, { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 2, 168 }, { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 3, 10739 }, { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 4, 28349 }, -#if IS_RELEASE == 1 { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 5, 1804208 }, { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 6, 5073106 }, -#endif { "2b5/2p5/8/8/5B1k/q7/2K5/8 w - - 0 1", 1, 13 }, { "2b5/2p5/8/8/5B1k/q7/2K5/8 w - - 0 1", 2, 376 }, { "2b5/2p5/8/8/5B1k/q7/2K5/8 w - - 0 1", 3, 3875 }, @@ -1410,6 +1291,13 @@ TEST_CASE("Experienced bugs in this repo") { REQUIRE(p.zobrist() == p.hash()); REQUIRE(p.hash() == 4177524090105507023); } + { + Position p; + REQUIRE(p.getCastlingPath(WHITE, true) == 0x60); + REQUIRE(p.getCastlingPath(WHITE, false) == 0xe); + REQUIRE(p.getCastlingPath(BLACK, true) == 0x6000000000000000ULL); + REQUIRE(p.getCastlingPath(BLACK, false) == 0xe00000000000000ULL); + } } TEST_CASE("Captures only?") { std::vector> tests = { @@ -1419,6 +1307,5771 @@ TEST_CASE("Captures only?") { }; check_perfts(tests); } +/*TEST_CASE("Chess960") { + std::vector> tests = { + { "bqnb1rkr/pp3ppp/3ppn2/2p5/5P2/P2P4/NPP1P1PP/BQ1BNRKR w HFhf - 2 9", 1, 21 }, + { "bqnb1rkr/pp3ppp/3ppn2/2p5/5P2/P2P4/NPP1P1PP/BQ1BNRKR w HFhf - 2 9", 2, 528 }, + { "bqnb1rkr/pp3ppp/3ppn2/2p5/5P2/P2P4/NPP1P1PP/BQ1BNRKR w HFhf - 2 9", 3, 12189 }, + { "bqnb1rkr/pp3ppp/3ppn2/2p5/5P2/P2P4/NPP1P1PP/BQ1BNRKR w HFhf - 2 9", 4, 326672 }, + { "bqnb1rkr/pp3ppp/3ppn2/2p5/5P2/P2P4/NPP1P1PP/BQ1BNRKR w HFhf - 2 9", 5, 8146062 }, + { "bqnb1rkr/pp3ppp/3ppn2/2p5/5P2/P2P4/NPP1P1PP/BQ1BNRKR w HFhf - 2 9", 6, 227689589 }, + { "2nnrbkr/p1qppppp/8/1ppb4/6PP/3PP3/PPP2P2/BQNNRBKR w HEhe - 1 9", 1, 21 }, + { "2nnrbkr/p1qppppp/8/1ppb4/6PP/3PP3/PPP2P2/BQNNRBKR w HEhe - 1 9", 2, 807 }, + { "2nnrbkr/p1qppppp/8/1ppb4/6PP/3PP3/PPP2P2/BQNNRBKR w HEhe - 1 9", 3, 18002 }, + { "2nnrbkr/p1qppppp/8/1ppb4/6PP/3PP3/PPP2P2/BQNNRBKR w HEhe - 1 9", 4, 667366 }, + { "2nnrbkr/p1qppppp/8/1ppb4/6PP/3PP3/PPP2P2/BQNNRBKR w HEhe - 1 9", 5, 16253601 }, + { "2nnrbkr/p1qppppp/8/1ppb4/6PP/3PP3/PPP2P2/BQNNRBKR w HEhe - 1 9", 6, 590751109 }, + { "b1q1rrkb/pppppppp/3nn3/8/P7/1PPP4/4PPPP/BQNNRKRB w GE - 1 9", 1, 20 }, + { "b1q1rrkb/pppppppp/3nn3/8/P7/1PPP4/4PPPP/BQNNRKRB w GE - 1 9", 2, 479 }, + { "b1q1rrkb/pppppppp/3nn3/8/P7/1PPP4/4PPPP/BQNNRKRB w GE - 1 9", 3, 10471 }, + { "b1q1rrkb/pppppppp/3nn3/8/P7/1PPP4/4PPPP/BQNNRKRB w GE - 1 9", 4, 273318 }, + { "b1q1rrkb/pppppppp/3nn3/8/P7/1PPP4/4PPPP/BQNNRKRB w GE - 1 9", 5, 6417013 }, + { "b1q1rrkb/pppppppp/3nn3/8/P7/1PPP4/4PPPP/BQNNRKRB w GE - 1 9", 6, 177654692 }, + { "qbbnnrkr/2pp2pp/p7/1p2pp2/8/P3PP2/1PPP1KPP/QBBNNR1R w hf - 0 9", 1, 22 }, + { "qbbnnrkr/2pp2pp/p7/1p2pp2/8/P3PP2/1PPP1KPP/QBBNNR1R w hf - 0 9", 2, 593 }, + { "qbbnnrkr/2pp2pp/p7/1p2pp2/8/P3PP2/1PPP1KPP/QBBNNR1R w hf - 0 9", 3, 13440 }, + { "qbbnnrkr/2pp2pp/p7/1p2pp2/8/P3PP2/1PPP1KPP/QBBNNR1R w hf - 0 9", 4, 382958 }, + { "qbbnnrkr/2pp2pp/p7/1p2pp2/8/P3PP2/1PPP1KPP/QBBNNR1R w hf - 0 9", 5, 9183776 }, + { "qbbnnrkr/2pp2pp/p7/1p2pp2/8/P3PP2/1PPP1KPP/QBBNNR1R w hf - 0 9", 6, 274103539 }, + { "1nbbnrkr/p1p1ppp1/3p4/1p3P1p/3Pq2P/8/PPP1P1P1/QNBBNRKR w HFhf - 0 9", 1, 28 }, + { "1nbbnrkr/p1p1ppp1/3p4/1p3P1p/3Pq2P/8/PPP1P1P1/QNBBNRKR w HFhf - 0 9", 2, 1120 }, + { "1nbbnrkr/p1p1ppp1/3p4/1p3P1p/3Pq2P/8/PPP1P1P1/QNBBNRKR w HFhf - 0 9", 3, 31058 }, + { "1nbbnrkr/p1p1ppp1/3p4/1p3P1p/3Pq2P/8/PPP1P1P1/QNBBNRKR w HFhf - 0 9", 4, 1171749 }, + { "1nbbnrkr/p1p1ppp1/3p4/1p3P1p/3Pq2P/8/PPP1P1P1/QNBBNRKR w HFhf - 0 9", 5, 34030312 }, + { "1nbbnrkr/p1p1ppp1/3p4/1p3P1p/3Pq2P/8/PPP1P1P1/QNBBNRKR w HFhf - 0 9", 6, 1250970898 }, + { "qnbnr1kr/ppp1b1pp/4p3/3p1p2/8/2NPP3/PPP1BPPP/QNB1R1KR w HEhe - 1 9", 1, 29 }, + { "qnbnr1kr/ppp1b1pp/4p3/3p1p2/8/2NPP3/PPP1BPPP/QNB1R1KR w HEhe - 1 9", 2, 899 }, + { "qnbnr1kr/ppp1b1pp/4p3/3p1p2/8/2NPP3/PPP1BPPP/QNB1R1KR w HEhe - 1 9", 3, 26578 }, + { "qnbnr1kr/ppp1b1pp/4p3/3p1p2/8/2NPP3/PPP1BPPP/QNB1R1KR w HEhe - 1 9", 4, 824055 }, + { "qnbnr1kr/ppp1b1pp/4p3/3p1p2/8/2NPP3/PPP1BPPP/QNB1R1KR w HEhe - 1 9", 5, 24851983 }, + { "qnbnr1kr/ppp1b1pp/4p3/3p1p2/8/2NPP3/PPP1BPPP/QNB1R1KR w HEhe - 1 9", 6, 775718317 }, + { "q1bnrkr1/ppppp2p/2n2p2/4b1p1/2NP4/8/PPP1PPPP/QNB1RRKB w ge - 1 9", 1, 30 }, + { "q1bnrkr1/ppppp2p/2n2p2/4b1p1/2NP4/8/PPP1PPPP/QNB1RRKB w ge - 1 9", 2, 860 }, + { "q1bnrkr1/ppppp2p/2n2p2/4b1p1/2NP4/8/PPP1PPPP/QNB1RRKB w ge - 1 9", 3, 24566 }, + { "q1bnrkr1/ppppp2p/2n2p2/4b1p1/2NP4/8/PPP1PPPP/QNB1RRKB w ge - 1 9", 4, 732757 }, + { "q1bnrkr1/ppppp2p/2n2p2/4b1p1/2NP4/8/PPP1PPPP/QNB1RRKB w ge - 1 9", 5, 21093346 }, + { "q1bnrkr1/ppppp2p/2n2p2/4b1p1/2NP4/8/PPP1PPPP/QNB1RRKB w ge - 1 9", 6, 649209803 }, + { "qbn1brkr/ppp1p1p1/2n4p/3p1p2/P7/6PP/QPPPPP2/1BNNBRKR w HFhf - 0 9", 1, 25 }, + { "qbn1brkr/ppp1p1p1/2n4p/3p1p2/P7/6PP/QPPPPP2/1BNNBRKR w HFhf - 0 9", 2, 635 }, + { "qbn1brkr/ppp1p1p1/2n4p/3p1p2/P7/6PP/QPPPPP2/1BNNBRKR w HFhf - 0 9", 3, 17054 }, + { "qbn1brkr/ppp1p1p1/2n4p/3p1p2/P7/6PP/QPPPPP2/1BNNBRKR w HFhf - 0 9", 4, 465806 }, + { "qbn1brkr/ppp1p1p1/2n4p/3p1p2/P7/6PP/QPPPPP2/1BNNBRKR w HFhf - 0 9", 5, 13203304 }, + { "qbn1brkr/ppp1p1p1/2n4p/3p1p2/P7/6PP/QPPPPP2/1BNNBRKR w HFhf - 0 9", 6, 377184252 }, + { "qnnbbrkr/1p2ppp1/2pp3p/p7/1P5P/2NP4/P1P1PPP1/Q1NBBRKR w HFhf - 0 9", 1, 24 }, + { "qnnbbrkr/1p2ppp1/2pp3p/p7/1P5P/2NP4/P1P1PPP1/Q1NBBRKR w HFhf - 0 9", 2, 572 }, + { "qnnbbrkr/1p2ppp1/2pp3p/p7/1P5P/2NP4/P1P1PPP1/Q1NBBRKR w HFhf - 0 9", 3, 15243 }, + { "qnnbbrkr/1p2ppp1/2pp3p/p7/1P5P/2NP4/P1P1PPP1/Q1NBBRKR w HFhf - 0 9", 4, 384260 }, + { "qnnbbrkr/1p2ppp1/2pp3p/p7/1P5P/2NP4/P1P1PPP1/Q1NBBRKR w HFhf - 0 9", 5, 11110203 }, + { "qnnbbrkr/1p2ppp1/2pp3p/p7/1P5P/2NP4/P1P1PPP1/Q1NBBRKR w HFhf - 0 9", 6, 293989890 }, + { "qn1rbbkr/ppp2p1p/1n1pp1p1/8/3P4/P6P/1PP1PPPK/QNNRBB1R w hd - 2 9", 1, 28 }, + { "qn1rbbkr/ppp2p1p/1n1pp1p1/8/3P4/P6P/1PP1PPPK/QNNRBB1R w hd - 2 9", 2, 811 }, + { "qn1rbbkr/ppp2p1p/1n1pp1p1/8/3P4/P6P/1PP1PPPK/QNNRBB1R w hd - 2 9", 3, 23175 }, + { "qn1rbbkr/ppp2p1p/1n1pp1p1/8/3P4/P6P/1PP1PPPK/QNNRBB1R w hd - 2 9", 4, 679699 }, + { "qn1rbbkr/ppp2p1p/1n1pp1p1/8/3P4/P6P/1PP1PPPK/QNNRBB1R w hd - 2 9", 5, 19836606 }, + { "qn1rbbkr/ppp2p1p/1n1pp1p1/8/3P4/P6P/1PP1PPPK/QNNRBB1R w hd - 2 9", 6, 594527992 }, + { "qnr1bkrb/pppp2pp/3np3/5p2/8/P2P2P1/NPP1PP1P/QN1RBKRB w GDg - 3 9", 1, 33 }, + { "qnr1bkrb/pppp2pp/3np3/5p2/8/P2P2P1/NPP1PP1P/QN1RBKRB w GDg - 3 9", 2, 823 }, + { "qnr1bkrb/pppp2pp/3np3/5p2/8/P2P2P1/NPP1PP1P/QN1RBKRB w GDg - 3 9", 3, 26895 }, + { "qnr1bkrb/pppp2pp/3np3/5p2/8/P2P2P1/NPP1PP1P/QN1RBKRB w GDg - 3 9", 4, 713420 }, + { "qnr1bkrb/pppp2pp/3np3/5p2/8/P2P2P1/NPP1PP1P/QN1RBKRB w GDg - 3 9", 5, 23114629 }, + { "qnr1bkrb/pppp2pp/3np3/5p2/8/P2P2P1/NPP1PP1P/QN1RBKRB w GDg - 3 9", 6, 646390782 }, + { "qb1nrkbr/1pppp1p1/1n3p2/p1B4p/8/3P1P1P/PPP1P1P1/QBNNRK1R w HEhe - 0 9", 1, 31 }, + { "qb1nrkbr/1pppp1p1/1n3p2/p1B4p/8/3P1P1P/PPP1P1P1/QBNNRK1R w HEhe - 0 9", 2, 855 }, + { "qb1nrkbr/1pppp1p1/1n3p2/p1B4p/8/3P1P1P/PPP1P1P1/QBNNRK1R w HEhe - 0 9", 3, 25620 }, + { "qb1nrkbr/1pppp1p1/1n3p2/p1B4p/8/3P1P1P/PPP1P1P1/QBNNRK1R w HEhe - 0 9", 4, 735703 }, + { "qb1nrkbr/1pppp1p1/1n3p2/p1B4p/8/3P1P1P/PPP1P1P1/QBNNRK1R w HEhe - 0 9", 5, 21796206 }, + { "qb1nrkbr/1pppp1p1/1n3p2/p1B4p/8/3P1P1P/PPP1P1P1/QBNNRK1R w HEhe - 0 9", 6, 651054626 }, + { "qnnbrk1r/1p1ppbpp/2p5/p4p2/2NP3P/8/PPP1PPP1/Q1NBRKBR w HEhe - 0 9", 1, 26 }, + { "qnnbrk1r/1p1ppbpp/2p5/p4p2/2NP3P/8/PPP1PPP1/Q1NBRKBR w HEhe - 0 9", 2, 790 }, + { "qnnbrk1r/1p1ppbpp/2p5/p4p2/2NP3P/8/PPP1PPP1/Q1NBRKBR w HEhe - 0 9", 3, 21238 }, + { "qnnbrk1r/1p1ppbpp/2p5/p4p2/2NP3P/8/PPP1PPP1/Q1NBRKBR w HEhe - 0 9", 4, 642367 }, + { "qnnbrk1r/1p1ppbpp/2p5/p4p2/2NP3P/8/PPP1PPP1/Q1NBRKBR w HEhe - 0 9", 5, 17819770 }, + { "qnnbrk1r/1p1ppbpp/2p5/p4p2/2NP3P/8/PPP1PPP1/Q1NBRKBR w HEhe - 0 9", 6, 544866674 }, + { "1qnrkbbr/1pppppp1/p1n4p/8/P7/1P1N1P2/2PPP1PP/QN1RKBBR w HDhd - 0 9", 1, 37 }, + { "1qnrkbbr/1pppppp1/p1n4p/8/P7/1P1N1P2/2PPP1PP/QN1RKBBR w HDhd - 0 9", 2, 883 }, + { "1qnrkbbr/1pppppp1/p1n4p/8/P7/1P1N1P2/2PPP1PP/QN1RKBBR w HDhd - 0 9", 3, 32187 }, + { "1qnrkbbr/1pppppp1/p1n4p/8/P7/1P1N1P2/2PPP1PP/QN1RKBBR w HDhd - 0 9", 4, 815535 }, + { "1qnrkbbr/1pppppp1/p1n4p/8/P7/1P1N1P2/2PPP1PP/QN1RKBBR w HDhd - 0 9", 5, 29370838 }, + { "1qnrkbbr/1pppppp1/p1n4p/8/P7/1P1N1P2/2PPP1PP/QN1RKBBR w HDhd - 0 9", 6, 783201510 }, + { "qn1rkrbb/pp1p1ppp/2p1p3/3n4/4P2P/2NP4/PPP2PP1/Q1NRKRBB w FDfd - 1 9", 1, 24 }, + { "qn1rkrbb/pp1p1ppp/2p1p3/3n4/4P2P/2NP4/PPP2PP1/Q1NRKRBB w FDfd - 1 9", 2, 585 }, + { "qn1rkrbb/pp1p1ppp/2p1p3/3n4/4P2P/2NP4/PPP2PP1/Q1NRKRBB w FDfd - 1 9", 3, 14769 }, + { "qn1rkrbb/pp1p1ppp/2p1p3/3n4/4P2P/2NP4/PPP2PP1/Q1NRKRBB w FDfd - 1 9", 4, 356950 }, + { "qn1rkrbb/pp1p1ppp/2p1p3/3n4/4P2P/2NP4/PPP2PP1/Q1NRKRBB w FDfd - 1 9", 5, 9482310 }, + { "qn1rkrbb/pp1p1ppp/2p1p3/3n4/4P2P/2NP4/PPP2PP1/Q1NRKRBB w FDfd - 1 9", 6, 233468620 }, + { "bb1qnrkr/pp1p1pp1/1np1p3/4N2p/8/1P4P1/P1PPPP1P/BBNQ1RKR w HFhf - 0 9", 1, 29 }, + { "bb1qnrkr/pp1p1pp1/1np1p3/4N2p/8/1P4P1/P1PPPP1P/BBNQ1RKR w HFhf - 0 9", 2, 864 }, + { "bb1qnrkr/pp1p1pp1/1np1p3/4N2p/8/1P4P1/P1PPPP1P/BBNQ1RKR w HFhf - 0 9", 3, 25747 }, + { "bb1qnrkr/pp1p1pp1/1np1p3/4N2p/8/1P4P1/P1PPPP1P/BBNQ1RKR w HFhf - 0 9", 4, 799727 }, + { "bb1qnrkr/pp1p1pp1/1np1p3/4N2p/8/1P4P1/P1PPPP1P/BBNQ1RKR w HFhf - 0 9", 5, 24219627 }, + { "bb1qnrkr/pp1p1pp1/1np1p3/4N2p/8/1P4P1/P1PPPP1P/BBNQ1RKR w HFhf - 0 9", 6, 776836316 }, + { "bnqbnr1r/p1p1ppkp/3p4/1p4p1/P7/3NP2P/1PPP1PP1/BNQB1RKR w HF - 0 9", 1, 26 }, + { "bnqbnr1r/p1p1ppkp/3p4/1p4p1/P7/3NP2P/1PPP1PP1/BNQB1RKR w HF - 0 9", 2, 889 }, + { "bnqbnr1r/p1p1ppkp/3p4/1p4p1/P7/3NP2P/1PPP1PP1/BNQB1RKR w HF - 0 9", 3, 24353 }, + { "bnqbnr1r/p1p1ppkp/3p4/1p4p1/P7/3NP2P/1PPP1PP1/BNQB1RKR w HF - 0 9", 4, 832956 }, + { "bnqbnr1r/p1p1ppkp/3p4/1p4p1/P7/3NP2P/1PPP1PP1/BNQB1RKR w HF - 0 9", 5, 23701014 }, + { "bnqbnr1r/p1p1ppkp/3p4/1p4p1/P7/3NP2P/1PPP1PP1/BNQB1RKR w HF - 0 9", 6, 809194268 }, + { "bnqnrbkr/1pp2pp1/p7/3pP2p/4P1P1/8/PPPP3P/BNQNRBKR w HEhe d6 0 9", 1, 31 }, + { "bnqnrbkr/1pp2pp1/p7/3pP2p/4P1P1/8/PPPP3P/BNQNRBKR w HEhe d6 0 9", 2, 984 }, + { "bnqnrbkr/1pp2pp1/p7/3pP2p/4P1P1/8/PPPP3P/BNQNRBKR w HEhe d6 0 9", 3, 28677 }, + { "bnqnrbkr/1pp2pp1/p7/3pP2p/4P1P1/8/PPPP3P/BNQNRBKR w HEhe d6 0 9", 4, 962591 }, + { "bnqnrbkr/1pp2pp1/p7/3pP2p/4P1P1/8/PPPP3P/BNQNRBKR w HEhe d6 0 9", 5, 29032175 }, + { "bnqnrbkr/1pp2pp1/p7/3pP2p/4P1P1/8/PPPP3P/BNQNRBKR w HEhe d6 0 9", 6, 1008880643 }, + { "b1qnrrkb/ppp1pp1p/n2p1Pp1/8/8/P7/1PPPP1PP/BNQNRKRB w GE - 0 9", 1, 20 }, + { "b1qnrrkb/ppp1pp1p/n2p1Pp1/8/8/P7/1PPPP1PP/BNQNRKRB w GE - 0 9", 2, 484 }, + { "b1qnrrkb/ppp1pp1p/n2p1Pp1/8/8/P7/1PPPP1PP/BNQNRKRB w GE - 0 9", 3, 10532 }, + { "b1qnrrkb/ppp1pp1p/n2p1Pp1/8/8/P7/1PPPP1PP/BNQNRKRB w GE - 0 9", 4, 281606 }, + { "b1qnrrkb/ppp1pp1p/n2p1Pp1/8/8/P7/1PPPP1PP/BNQNRKRB w GE - 0 9", 5, 6718715 }, + { "b1qnrrkb/ppp1pp1p/n2p1Pp1/8/8/P7/1PPPP1PP/BNQNRKRB w GE - 0 9", 6, 193594729 }, + { "n1bqnrkr/pp1ppp1p/2p5/6p1/2P2b2/PN6/1PNPPPPP/1BBQ1RKR w HFhf - 2 9", 1, 23 }, + { "n1bqnrkr/pp1ppp1p/2p5/6p1/2P2b2/PN6/1PNPPPPP/1BBQ1RKR w HFhf - 2 9", 2, 732 }, + { "n1bqnrkr/pp1ppp1p/2p5/6p1/2P2b2/PN6/1PNPPPPP/1BBQ1RKR w HFhf - 2 9", 3, 17746 }, + { "n1bqnrkr/pp1ppp1p/2p5/6p1/2P2b2/PN6/1PNPPPPP/1BBQ1RKR w HFhf - 2 9", 4, 558191 }, + { "n1bqnrkr/pp1ppp1p/2p5/6p1/2P2b2/PN6/1PNPPPPP/1BBQ1RKR w HFhf - 2 9", 5, 14481581 }, + { "n1bqnrkr/pp1ppp1p/2p5/6p1/2P2b2/PN6/1PNPPPPP/1BBQ1RKR w HFhf - 2 9", 6, 457140569 }, + { "n1bb1rkr/qpnppppp/2p5/p7/P1P5/5P2/1P1PPRPP/NQBBN1KR w Hhf - 1 9", 1, 27 }, + { "n1bb1rkr/qpnppppp/2p5/p7/P1P5/5P2/1P1PPRPP/NQBBN1KR w Hhf - 1 9", 2, 697 }, + { "n1bb1rkr/qpnppppp/2p5/p7/P1P5/5P2/1P1PPRPP/NQBBN1KR w Hhf - 1 9", 3, 18724 }, + { "n1bb1rkr/qpnppppp/2p5/p7/P1P5/5P2/1P1PPRPP/NQBBN1KR w Hhf - 1 9", 4, 505089 }, + { "n1bb1rkr/qpnppppp/2p5/p7/P1P5/5P2/1P1PPRPP/NQBBN1KR w Hhf - 1 9", 5, 14226907 }, + { "n1bb1rkr/qpnppppp/2p5/p7/P1P5/5P2/1P1PPRPP/NQBBN1KR w Hhf - 1 9", 6, 400942568 }, + { "nqb1rbkr/pppppp1p/4n3/6p1/4P3/1NP4P/PP1P1PP1/1QBNRBKR w HEhe - 1 9", 1, 28 }, + { "nqb1rbkr/pppppp1p/4n3/6p1/4P3/1NP4P/PP1P1PP1/1QBNRBKR w HEhe - 1 9", 2, 641 }, + { "nqb1rbkr/pppppp1p/4n3/6p1/4P3/1NP4P/PP1P1PP1/1QBNRBKR w HEhe - 1 9", 3, 18811 }, + { "nqb1rbkr/pppppp1p/4n3/6p1/4P3/1NP4P/PP1P1PP1/1QBNRBKR w HEhe - 1 9", 4, 456916 }, + { "nqb1rbkr/pppppp1p/4n3/6p1/4P3/1NP4P/PP1P1PP1/1QBNRBKR w HEhe - 1 9", 5, 13780398 }, + { "nqb1rbkr/pppppp1p/4n3/6p1/4P3/1NP4P/PP1P1PP1/1QBNRBKR w HEhe - 1 9", 6, 354122358 }, + { "n1bnrrkb/pp1pp2p/2p2p2/6p1/5B2/3P4/PPP1PPPP/NQ1NRKRB w GE - 2 9", 1, 28 }, + { "n1bnrrkb/pp1pp2p/2p2p2/6p1/5B2/3P4/PPP1PPPP/NQ1NRKRB w GE - 2 9", 2, 606 }, + { "n1bnrrkb/pp1pp2p/2p2p2/6p1/5B2/3P4/PPP1PPPP/NQ1NRKRB w GE - 2 9", 3, 16883 }, + { "n1bnrrkb/pp1pp2p/2p2p2/6p1/5B2/3P4/PPP1PPPP/NQ1NRKRB w GE - 2 9", 4, 381646 }, + { "n1bnrrkb/pp1pp2p/2p2p2/6p1/5B2/3P4/PPP1PPPP/NQ1NRKRB w GE - 2 9", 5, 10815324 }, + { "n1bnrrkb/pp1pp2p/2p2p2/6p1/5B2/3P4/PPP1PPPP/NQ1NRKRB w GE - 2 9", 6, 254026570 }, + { "nbqnbrkr/2ppp1p1/pp3p1p/8/4N2P/1N6/PPPPPPP1/1BQ1BRKR w HFhf - 0 9", 1, 26 }, + { "nbqnbrkr/2ppp1p1/pp3p1p/8/4N2P/1N6/PPPPPPP1/1BQ1BRKR w HFhf - 0 9", 2, 626 }, + { "nbqnbrkr/2ppp1p1/pp3p1p/8/4N2P/1N6/PPPPPPP1/1BQ1BRKR w HFhf - 0 9", 3, 17268 }, + { "nbqnbrkr/2ppp1p1/pp3p1p/8/4N2P/1N6/PPPPPPP1/1BQ1BRKR w HFhf - 0 9", 4, 437525 }, + { "nbqnbrkr/2ppp1p1/pp3p1p/8/4N2P/1N6/PPPPPPP1/1BQ1BRKR w HFhf - 0 9", 5, 12719546 }, + { "nbqnbrkr/2ppp1p1/pp3p1p/8/4N2P/1N6/PPPPPPP1/1BQ1BRKR w HFhf - 0 9", 6, 339132046 }, + { "nq1bbrkr/pp2nppp/2pp4/4p3/1PP1P3/1B6/P2P1PPP/NQN1BRKR w HFhf - 2 9", 1, 21 }, + { "nq1bbrkr/pp2nppp/2pp4/4p3/1PP1P3/1B6/P2P1PPP/NQN1BRKR w HFhf - 2 9", 2, 504 }, + { "nq1bbrkr/pp2nppp/2pp4/4p3/1PP1P3/1B6/P2P1PPP/NQN1BRKR w HFhf - 2 9", 3, 11812 }, + { "nq1bbrkr/pp2nppp/2pp4/4p3/1PP1P3/1B6/P2P1PPP/NQN1BRKR w HFhf - 2 9", 4, 302230 }, + { "nq1bbrkr/pp2nppp/2pp4/4p3/1PP1P3/1B6/P2P1PPP/NQN1BRKR w HFhf - 2 9", 5, 7697880 }, + { "nq1bbrkr/pp2nppp/2pp4/4p3/1PP1P3/1B6/P2P1PPP/NQN1BRKR w HFhf - 2 9", 6, 207028745 }, + { "nqnrb1kr/2pp1ppp/1p1bp3/p1B5/5P2/3N4/PPPPP1PP/NQ1R1BKR w HDhd - 0 9", 1, 30 }, + { "nqnrb1kr/2pp1ppp/1p1bp3/p1B5/5P2/3N4/PPPPP1PP/NQ1R1BKR w HDhd - 0 9", 2, 672 }, + { "nqnrb1kr/2pp1ppp/1p1bp3/p1B5/5P2/3N4/PPPPP1PP/NQ1R1BKR w HDhd - 0 9", 3, 19307 }, + { "nqnrb1kr/2pp1ppp/1p1bp3/p1B5/5P2/3N4/PPPPP1PP/NQ1R1BKR w HDhd - 0 9", 4, 465317 }, + { "nqnrb1kr/2pp1ppp/1p1bp3/p1B5/5P2/3N4/PPPPP1PP/NQ1R1BKR w HDhd - 0 9", 5, 13454573 }, + { "nqnrb1kr/2pp1ppp/1p1bp3/p1B5/5P2/3N4/PPPPP1PP/NQ1R1BKR w HDhd - 0 9", 6, 345445468 }, + { "nqn2krb/p1prpppp/1pbp4/7P/5P2/8/PPPPPKP1/NQNRB1RB w g - 3 9", 1, 21 }, + { "nqn2krb/p1prpppp/1pbp4/7P/5P2/8/PPPPPKP1/NQNRB1RB w g - 3 9", 2, 461 }, + { "nqn2krb/p1prpppp/1pbp4/7P/5P2/8/PPPPPKP1/NQNRB1RB w g - 3 9", 3, 10608 }, + { "nqn2krb/p1prpppp/1pbp4/7P/5P2/8/PPPPPKP1/NQNRB1RB w g - 3 9", 4, 248069 }, + { "nqn2krb/p1prpppp/1pbp4/7P/5P2/8/PPPPPKP1/NQNRB1RB w g - 3 9", 5, 6194124 }, + { "nqn2krb/p1prpppp/1pbp4/7P/5P2/8/PPPPPKP1/NQNRB1RB w g - 3 9", 6, 152861936 }, + { "nb1n1kbr/ppp1rppp/3pq3/P3p3/8/4P3/1PPPRPPP/NBQN1KBR w Hh - 1 9", 1, 19 }, + { "nb1n1kbr/ppp1rppp/3pq3/P3p3/8/4P3/1PPPRPPP/NBQN1KBR w Hh - 1 9", 2, 566 }, + { "nb1n1kbr/ppp1rppp/3pq3/P3p3/8/4P3/1PPPRPPP/NBQN1KBR w Hh - 1 9", 3, 11786 }, + { "nb1n1kbr/ppp1rppp/3pq3/P3p3/8/4P3/1PPPRPPP/NBQN1KBR w Hh - 1 9", 4, 358337 }, + { "nb1n1kbr/ppp1rppp/3pq3/P3p3/8/4P3/1PPPRPPP/NBQN1KBR w Hh - 1 9", 5, 8047916 }, + { "nb1n1kbr/ppp1rppp/3pq3/P3p3/8/4P3/1PPPRPPP/NBQN1KBR w Hh - 1 9", 6, 249171636 }, + { "nqnbrkbr/1ppppp1p/p7/6p1/6P1/P6P/1PPPPP2/NQNBRKBR w HEhe - 1 9", 1, 20 }, + { "nqnbrkbr/1ppppp1p/p7/6p1/6P1/P6P/1PPPPP2/NQNBRKBR w HEhe - 1 9", 2, 382 }, + { "nqnbrkbr/1ppppp1p/p7/6p1/6P1/P6P/1PPPPP2/NQNBRKBR w HEhe - 1 9", 3, 8694 }, + { "nqnbrkbr/1ppppp1p/p7/6p1/6P1/P6P/1PPPPP2/NQNBRKBR w HEhe - 1 9", 4, 187263 }, + { "nqnbrkbr/1ppppp1p/p7/6p1/6P1/P6P/1PPPPP2/NQNBRKBR w HEhe - 1 9", 5, 4708975 }, + { "nqnbrkbr/1ppppp1p/p7/6p1/6P1/P6P/1PPPPP2/NQNBRKBR w HEhe - 1 9", 6, 112278808 }, + { "nq1rkb1r/pp1pp1pp/1n2bp1B/2p5/8/5P1P/PPPPP1P1/NQNRKB1R w HDhd - 2 9", 1, 24 }, + { "nq1rkb1r/pp1pp1pp/1n2bp1B/2p5/8/5P1P/PPPPP1P1/NQNRKB1R w HDhd - 2 9", 2, 809 }, + { "nq1rkb1r/pp1pp1pp/1n2bp1B/2p5/8/5P1P/PPPPP1P1/NQNRKB1R w HDhd - 2 9", 3, 20090 }, + { "nq1rkb1r/pp1pp1pp/1n2bp1B/2p5/8/5P1P/PPPPP1P1/NQNRKB1R w HDhd - 2 9", 4, 673811 }, + { "nq1rkb1r/pp1pp1pp/1n2bp1B/2p5/8/5P1P/PPPPP1P1/NQNRKB1R w HDhd - 2 9", 5, 17647882 }, + { "nq1rkb1r/pp1pp1pp/1n2bp1B/2p5/8/5P1P/PPPPP1P1/NQNRKB1R w HDhd - 2 9", 6, 593457788 }, + { "nqnrkrb1/pppppp2/7p/4b1p1/8/PN1NP3/1PPP1PPP/1Q1RKRBB w FDfd - 1 9", 1, 26 }, + { "nqnrkrb1/pppppp2/7p/4b1p1/8/PN1NP3/1PPP1PPP/1Q1RKRBB w FDfd - 1 9", 2, 683 }, + { "nqnrkrb1/pppppp2/7p/4b1p1/8/PN1NP3/1PPP1PPP/1Q1RKRBB w FDfd - 1 9", 3, 18102 }, + { "nqnrkrb1/pppppp2/7p/4b1p1/8/PN1NP3/1PPP1PPP/1Q1RKRBB w FDfd - 1 9", 4, 473911 }, + { "nqnrkrb1/pppppp2/7p/4b1p1/8/PN1NP3/1PPP1PPP/1Q1RKRBB w FDfd - 1 9", 5, 13055173 }, + { "nqnrkrb1/pppppp2/7p/4b1p1/8/PN1NP3/1PPP1PPP/1Q1RKRBB w FDfd - 1 9", 6, 352398011 }, + { "bb1nqrkr/1pp1ppp1/pn5p/3p4/8/P2NNP2/1PPPP1PP/BB2QRKR w HFhf - 0 9", 1, 29 }, + { "bb1nqrkr/1pp1ppp1/pn5p/3p4/8/P2NNP2/1PPPP1PP/BB2QRKR w HFhf - 0 9", 2, 695 }, + { "bb1nqrkr/1pp1ppp1/pn5p/3p4/8/P2NNP2/1PPPP1PP/BB2QRKR w HFhf - 0 9", 3, 21193 }, + { "bb1nqrkr/1pp1ppp1/pn5p/3p4/8/P2NNP2/1PPPP1PP/BB2QRKR w HFhf - 0 9", 4, 552634 }, + { "bb1nqrkr/1pp1ppp1/pn5p/3p4/8/P2NNP2/1PPPP1PP/BB2QRKR w HFhf - 0 9", 5, 17454857 }, + { "bb1nqrkr/1pp1ppp1/pn5p/3p4/8/P2NNP2/1PPPP1PP/BB2QRKR w HFhf - 0 9", 6, 483785639 }, + { "bnn1qrkr/pp1ppp1p/2p5/b3Q1p1/8/5P1P/PPPPP1P1/BNNB1RKR w HFhf - 2 9", 1, 44 }, + { "bnn1qrkr/pp1ppp1p/2p5/b3Q1p1/8/5P1P/PPPPP1P1/BNNB1RKR w HFhf - 2 9", 2, 920 }, + { "bnn1qrkr/pp1ppp1p/2p5/b3Q1p1/8/5P1P/PPPPP1P1/BNNB1RKR w HFhf - 2 9", 3, 35830 }, + { "bnn1qrkr/pp1ppp1p/2p5/b3Q1p1/8/5P1P/PPPPP1P1/BNNB1RKR w HFhf - 2 9", 4, 795317 }, + { "bnn1qrkr/pp1ppp1p/2p5/b3Q1p1/8/5P1P/PPPPP1P1/BNNB1RKR w HFhf - 2 9", 5, 29742670 }, + { "bnn1qrkr/pp1ppp1p/2p5/b3Q1p1/8/5P1P/PPPPP1P1/BNNB1RKR w HFhf - 2 9", 6, 702867204 }, + { "bnnqrbkr/pp1p2p1/2p1p2p/5p2/1P5P/1R6/P1PPPPP1/BNNQRBK1 w Ehe - 0 9", 1, 33 }, + { "bnnqrbkr/pp1p2p1/2p1p2p/5p2/1P5P/1R6/P1PPPPP1/BNNQRBK1 w Ehe - 0 9", 2, 1022 }, + { "bnnqrbkr/pp1p2p1/2p1p2p/5p2/1P5P/1R6/P1PPPPP1/BNNQRBK1 w Ehe - 0 9", 3, 32724 }, + { "bnnqrbkr/pp1p2p1/2p1p2p/5p2/1P5P/1R6/P1PPPPP1/BNNQRBK1 w Ehe - 0 9", 4, 1024721 }, + { "bnnqrbkr/pp1p2p1/2p1p2p/5p2/1P5P/1R6/P1PPPPP1/BNNQRBK1 w Ehe - 0 9", 5, 32898113 }, + { "bnnqrbkr/pp1p2p1/2p1p2p/5p2/1P5P/1R6/P1PPPPP1/BNNQRBK1 w Ehe - 0 9", 6, 1047360456 }, + { "b1nqrkrb/2pppppp/p7/1P6/1n6/P4P2/1P1PP1PP/BNNQRKRB w GEge - 0 9", 1, 23 }, + { "b1nqrkrb/2pppppp/p7/1P6/1n6/P4P2/1P1PP1PP/BNNQRKRB w GEge - 0 9", 2, 638 }, + { "b1nqrkrb/2pppppp/p7/1P6/1n6/P4P2/1P1PP1PP/BNNQRKRB w GEge - 0 9", 3, 15744 }, + { "b1nqrkrb/2pppppp/p7/1P6/1n6/P4P2/1P1PP1PP/BNNQRKRB w GEge - 0 9", 4, 446539 }, + { "b1nqrkrb/2pppppp/p7/1P6/1n6/P4P2/1P1PP1PP/BNNQRKRB w GEge - 0 9", 5, 11735969 }, + { "b1nqrkrb/2pppppp/p7/1P6/1n6/P4P2/1P1PP1PP/BNNQRKRB w GEge - 0 9", 6, 344211589 }, + { "n1bnqrkr/3ppppp/1p6/pNp1b3/2P3P1/8/PP1PPP1P/NBB1QRKR w HFhf - 1 9", 1, 29 }, + { "n1bnqrkr/3ppppp/1p6/pNp1b3/2P3P1/8/PP1PPP1P/NBB1QRKR w HFhf - 1 9", 2, 728 }, + { "n1bnqrkr/3ppppp/1p6/pNp1b3/2P3P1/8/PP1PPP1P/NBB1QRKR w HFhf - 1 9", 3, 20768 }, + { "n1bnqrkr/3ppppp/1p6/pNp1b3/2P3P1/8/PP1PPP1P/NBB1QRKR w HFhf - 1 9", 4, 532084 }, + { "n1bnqrkr/3ppppp/1p6/pNp1b3/2P3P1/8/PP1PPP1P/NBB1QRKR w HFhf - 1 9", 5, 15621236 }, + { "n1bnqrkr/3ppppp/1p6/pNp1b3/2P3P1/8/PP1PPP1P/NBB1QRKR w HFhf - 1 9", 6, 415766465 }, + { "n2bqrkr/p1p1pppp/1pn5/3p1b2/P6P/1NP5/1P1PPPP1/1NBBQRKR w HFhf - 3 9", 1, 20 }, + { "n2bqrkr/p1p1pppp/1pn5/3p1b2/P6P/1NP5/1P1PPPP1/1NBBQRKR w HFhf - 3 9", 2, 533 }, + { "n2bqrkr/p1p1pppp/1pn5/3p1b2/P6P/1NP5/1P1PPPP1/1NBBQRKR w HFhf - 3 9", 3, 12152 }, + { "n2bqrkr/p1p1pppp/1pn5/3p1b2/P6P/1NP5/1P1PPPP1/1NBBQRKR w HFhf - 3 9", 4, 325059 }, + { "n2bqrkr/p1p1pppp/1pn5/3p1b2/P6P/1NP5/1P1PPPP1/1NBBQRKR w HFhf - 3 9", 5, 8088751 }, + { "n2bqrkr/p1p1pppp/1pn5/3p1b2/P6P/1NP5/1P1PPPP1/1NBBQRKR w HFhf - 3 9", 6, 223068417 }, + { "nnbqrbkr/1pp1p1p1/p2p4/5p1p/2P1P3/N7/PPQP1PPP/N1B1RBKR w HEhe - 0 9", 1, 27 }, + { "nnbqrbkr/1pp1p1p1/p2p4/5p1p/2P1P3/N7/PPQP1PPP/N1B1RBKR w HEhe - 0 9", 2, 619 }, + { "nnbqrbkr/1pp1p1p1/p2p4/5p1p/2P1P3/N7/PPQP1PPP/N1B1RBKR w HEhe - 0 9", 3, 18098 }, + { "nnbqrbkr/1pp1p1p1/p2p4/5p1p/2P1P3/N7/PPQP1PPP/N1B1RBKR w HEhe - 0 9", 4, 444421 }, + { "nnbqrbkr/1pp1p1p1/p2p4/5p1p/2P1P3/N7/PPQP1PPP/N1B1RBKR w HEhe - 0 9", 5, 13755384 }, + { "nnbqrbkr/1pp1p1p1/p2p4/5p1p/2P1P3/N7/PPQP1PPP/N1B1RBKR w HEhe - 0 9", 6, 357222394 }, + { "nnbqrkr1/pp1pp2p/2p2b2/5pp1/1P5P/4P1P1/P1PP1P2/NNBQRKRB w GEge - 1 9", 1, 32 }, + { "nnbqrkr1/pp1pp2p/2p2b2/5pp1/1P5P/4P1P1/P1PP1P2/NNBQRKRB w GEge - 1 9", 2, 1046 }, + { "nnbqrkr1/pp1pp2p/2p2b2/5pp1/1P5P/4P1P1/P1PP1P2/NNBQRKRB w GEge - 1 9", 3, 33721 }, + { "nnbqrkr1/pp1pp2p/2p2b2/5pp1/1P5P/4P1P1/P1PP1P2/NNBQRKRB w GEge - 1 9", 4, 1111186 }, + { "nnbqrkr1/pp1pp2p/2p2b2/5pp1/1P5P/4P1P1/P1PP1P2/NNBQRKRB w GEge - 1 9", 5, 36218182 }, + { "nnbqrkr1/pp1pp2p/2p2b2/5pp1/1P5P/4P1P1/P1PP1P2/NNBQRKRB w GEge - 1 9", 6, 1202830851 }, + { "nb1qbrkr/p1pppp2/1p1n2pp/8/1P6/2PN3P/P2PPPP1/NB1QBRKR w HFhf - 0 9", 1, 25 }, + { "nb1qbrkr/p1pppp2/1p1n2pp/8/1P6/2PN3P/P2PPPP1/NB1QBRKR w HFhf - 0 9", 2, 521 }, + { "nb1qbrkr/p1pppp2/1p1n2pp/8/1P6/2PN3P/P2PPPP1/NB1QBRKR w HFhf - 0 9", 3, 14021 }, + { "nb1qbrkr/p1pppp2/1p1n2pp/8/1P6/2PN3P/P2PPPP1/NB1QBRKR w HFhf - 0 9", 4, 306427 }, + { "nb1qbrkr/p1pppp2/1p1n2pp/8/1P6/2PN3P/P2PPPP1/NB1QBRKR w HFhf - 0 9", 5, 8697700 }, + { "nb1qbrkr/p1pppp2/1p1n2pp/8/1P6/2PN3P/P2PPPP1/NB1QBRKR w HFhf - 0 9", 6, 201455191 }, + { "nnq1brkr/pp1pppp1/8/2p4P/8/5K2/PPPbPP1P/NNQBBR1R w hf - 0 9", 1, 23 }, + { "nnq1brkr/pp1pppp1/8/2p4P/8/5K2/PPPbPP1P/NNQBBR1R w hf - 0 9", 2, 724 }, + { "nnq1brkr/pp1pppp1/8/2p4P/8/5K2/PPPbPP1P/NNQBBR1R w hf - 0 9", 3, 18263 }, + { "nnq1brkr/pp1pppp1/8/2p4P/8/5K2/PPPbPP1P/NNQBBR1R w hf - 0 9", 4, 571072 }, + { "nnq1brkr/pp1pppp1/8/2p4P/8/5K2/PPPbPP1P/NNQBBR1R w hf - 0 9", 5, 15338230 }, + { "nnq1brkr/pp1pppp1/8/2p4P/8/5K2/PPPbPP1P/NNQBBR1R w hf - 0 9", 6, 484638597 }, + { "nnqrbb1r/pppppk2/5pp1/7p/1P6/3P2PP/P1P1PP2/NNQRBBKR w HD - 0 9", 1, 30 }, + { "nnqrbb1r/pppppk2/5pp1/7p/1P6/3P2PP/P1P1PP2/NNQRBBKR w HD - 0 9", 2, 717 }, + { "nnqrbb1r/pppppk2/5pp1/7p/1P6/3P2PP/P1P1PP2/NNQRBBKR w HD - 0 9", 3, 21945 }, + { "nnqrbb1r/pppppk2/5pp1/7p/1P6/3P2PP/P1P1PP2/NNQRBBKR w HD - 0 9", 4, 547145 }, + { "nnqrbb1r/pppppk2/5pp1/7p/1P6/3P2PP/P1P1PP2/NNQRBBKR w HD - 0 9", 5, 17166700 }, + { "nnqrbb1r/pppppk2/5pp1/7p/1P6/3P2PP/P1P1PP2/NNQRBBKR w HD - 0 9", 6, 450069742 }, + { "nnqr1krb/p1p1pppp/2bp4/8/1p1P4/4P3/PPP2PPP/NNQRBKRB w GDgd - 0 9", 1, 25 }, + { "nnqr1krb/p1p1pppp/2bp4/8/1p1P4/4P3/PPP2PPP/NNQRBKRB w GDgd - 0 9", 2, 873 }, + { "nnqr1krb/p1p1pppp/2bp4/8/1p1P4/4P3/PPP2PPP/NNQRBKRB w GDgd - 0 9", 3, 20796 }, + { "nnqr1krb/p1p1pppp/2bp4/8/1p1P4/4P3/PPP2PPP/NNQRBKRB w GDgd - 0 9", 4, 728628 }, + { "nnqr1krb/p1p1pppp/2bp4/8/1p1P4/4P3/PPP2PPP/NNQRBKRB w GDgd - 0 9", 5, 18162741 }, + { "nnqr1krb/p1p1pppp/2bp4/8/1p1P4/4P3/PPP2PPP/NNQRBKRB w GDgd - 0 9", 6, 641708630 }, + { "nbnqrkbr/p2ppp2/1p4p1/2p4p/3P3P/3N4/PPP1PPPR/NB1QRKB1 w Ehe - 0 9", 1, 24 }, + { "nbnqrkbr/p2ppp2/1p4p1/2p4p/3P3P/3N4/PPP1PPPR/NB1QRKB1 w Ehe - 0 9", 2, 589 }, + { "nbnqrkbr/p2ppp2/1p4p1/2p4p/3P3P/3N4/PPP1PPPR/NB1QRKB1 w Ehe - 0 9", 3, 15190 }, + { "nbnqrkbr/p2ppp2/1p4p1/2p4p/3P3P/3N4/PPP1PPPR/NB1QRKB1 w Ehe - 0 9", 4, 382317 }, + { "nbnqrkbr/p2ppp2/1p4p1/2p4p/3P3P/3N4/PPP1PPPR/NB1QRKB1 w Ehe - 0 9", 5, 10630667 }, + { "nbnqrkbr/p2ppp2/1p4p1/2p4p/3P3P/3N4/PPP1PPPR/NB1QRKB1 w Ehe - 0 9", 6, 279474189 }, + { "n1qbrkbr/p1ppp2p/2n2pp1/1p6/1P6/2P3P1/P2PPP1P/NNQBRKBR w HEhe - 0 9", 1, 22 }, + { "n1qbrkbr/p1ppp2p/2n2pp1/1p6/1P6/2P3P1/P2PPP1P/NNQBRKBR w HEhe - 0 9", 2, 592 }, + { "n1qbrkbr/p1ppp2p/2n2pp1/1p6/1P6/2P3P1/P2PPP1P/NNQBRKBR w HEhe - 0 9", 3, 14269 }, + { "n1qbrkbr/p1ppp2p/2n2pp1/1p6/1P6/2P3P1/P2PPP1P/NNQBRKBR w HEhe - 0 9", 4, 401976 }, + { "n1qbrkbr/p1ppp2p/2n2pp1/1p6/1P6/2P3P1/P2PPP1P/NNQBRKBR w HEhe - 0 9", 5, 10356818 }, + { "n1qbrkbr/p1ppp2p/2n2pp1/1p6/1P6/2P3P1/P2PPP1P/NNQBRKBR w HEhe - 0 9", 6, 301583306 }, + { "2qrkbbr/ppn1pppp/n1p5/3p4/5P2/P1PP4/1P2P1PP/NNQRKBBR w HDhd - 1 9", 1, 27 }, + { "2qrkbbr/ppn1pppp/n1p5/3p4/5P2/P1PP4/1P2P1PP/NNQRKBBR w HDhd - 1 9", 2, 750 }, + { "2qrkbbr/ppn1pppp/n1p5/3p4/5P2/P1PP4/1P2P1PP/NNQRKBBR w HDhd - 1 9", 3, 20584 }, + { "2qrkbbr/ppn1pppp/n1p5/3p4/5P2/P1PP4/1P2P1PP/NNQRKBBR w HDhd - 1 9", 4, 605458 }, + { "2qrkbbr/ppn1pppp/n1p5/3p4/5P2/P1PP4/1P2P1PP/NNQRKBBR w HDhd - 1 9", 5, 16819085 }, + { "2qrkbbr/ppn1pppp/n1p5/3p4/5P2/P1PP4/1P2P1PP/NNQRKBBR w HDhd - 1 9", 6, 516796736 }, + { "1nqr1rbb/pppkp1pp/1n3p2/3p4/1P6/5P1P/P1PPPKP1/NNQR1RBB w - - 1 9", 1, 24 }, + { "1nqr1rbb/pppkp1pp/1n3p2/3p4/1P6/5P1P/P1PPPKP1/NNQR1RBB w - - 1 9", 2, 623 }, + { "1nqr1rbb/pppkp1pp/1n3p2/3p4/1P6/5P1P/P1PPPKP1/NNQR1RBB w - - 1 9", 3, 15921 }, + { "1nqr1rbb/pppkp1pp/1n3p2/3p4/1P6/5P1P/P1PPPKP1/NNQR1RBB w - - 1 9", 4, 429446 }, + { "1nqr1rbb/pppkp1pp/1n3p2/3p4/1P6/5P1P/P1PPPKP1/NNQR1RBB w - - 1 9", 5, 11594634 }, + { "1nqr1rbb/pppkp1pp/1n3p2/3p4/1P6/5P1P/P1PPPKP1/NNQR1RBB w - - 1 9", 6, 322745925 }, + { "bbn1rqkr/pp1pp2p/4npp1/2p5/1P6/2BPP3/P1P2PPP/1BNNRQKR w HEhe - 0 9", 1, 23 }, + { "bbn1rqkr/pp1pp2p/4npp1/2p5/1P6/2BPP3/P1P2PPP/1BNNRQKR w HEhe - 0 9", 2, 730 }, + { "bbn1rqkr/pp1pp2p/4npp1/2p5/1P6/2BPP3/P1P2PPP/1BNNRQKR w HEhe - 0 9", 3, 17743 }, + { "bbn1rqkr/pp1pp2p/4npp1/2p5/1P6/2BPP3/P1P2PPP/1BNNRQKR w HEhe - 0 9", 4, 565340 }, + { "bbn1rqkr/pp1pp2p/4npp1/2p5/1P6/2BPP3/P1P2PPP/1BNNRQKR w HEhe - 0 9", 5, 14496370 }, + { "bbn1rqkr/pp1pp2p/4npp1/2p5/1P6/2BPP3/P1P2PPP/1BNNRQKR w HEhe - 0 9", 6, 468608864 }, + { "bn1brqkr/pppp2p1/3npp2/7p/PPP5/8/3PPPPP/BNNBRQKR w HEhe - 0 9", 1, 25 }, + { "bn1brqkr/pppp2p1/3npp2/7p/PPP5/8/3PPPPP/BNNBRQKR w HEhe - 0 9", 2, 673 }, + { "bn1brqkr/pppp2p1/3npp2/7p/PPP5/8/3PPPPP/BNNBRQKR w HEhe - 0 9", 3, 17835 }, + { "bn1brqkr/pppp2p1/3npp2/7p/PPP5/8/3PPPPP/BNNBRQKR w HEhe - 0 9", 4, 513696 }, + { "bn1brqkr/pppp2p1/3npp2/7p/PPP5/8/3PPPPP/BNNBRQKR w HEhe - 0 9", 5, 14284338 }, + { "bn1brqkr/pppp2p1/3npp2/7p/PPP5/8/3PPPPP/BNNBRQKR w HEhe - 0 9", 6, 434008567 }, + { "bn1rqbkr/ppp1ppp1/1n6/2p4p/7P/3P4/PPP1PPP1/BN1RQBKR w HDhd - 0 9", 1, 25 }, + { "bn1rqbkr/ppp1ppp1/1n6/2p4p/7P/3P4/PPP1PPP1/BN1RQBKR w HDhd - 0 9", 2, 776 }, + { "bn1rqbkr/ppp1ppp1/1n6/2p4p/7P/3P4/PPP1PPP1/BN1RQBKR w HDhd - 0 9", 3, 20562 }, + { "bn1rqbkr/ppp1ppp1/1n6/2p4p/7P/3P4/PPP1PPP1/BN1RQBKR w HDhd - 0 9", 4, 660217 }, + { "bn1rqbkr/ppp1ppp1/1n6/2p4p/7P/3P4/PPP1PPP1/BN1RQBKR w HDhd - 0 9", 5, 18486027 }, + { "bn1rqbkr/ppp1ppp1/1n6/2p4p/7P/3P4/PPP1PPP1/BN1RQBKR w HDhd - 0 9", 6, 616653869 }, + { "bnnr1krb/ppp2ppp/3p4/3Bp3/q1P3PP/8/PP1PPP2/BNNRQKR1 w GDgd - 0 9", 1, 29 }, + { "bnnr1krb/ppp2ppp/3p4/3Bp3/q1P3PP/8/PP1PPP2/BNNRQKR1 w GDgd - 0 9", 2, 1040 }, + { "bnnr1krb/ppp2ppp/3p4/3Bp3/q1P3PP/8/PP1PPP2/BNNRQKR1 w GDgd - 0 9", 3, 30772 }, + { "bnnr1krb/ppp2ppp/3p4/3Bp3/q1P3PP/8/PP1PPP2/BNNRQKR1 w GDgd - 0 9", 4, 1053113 }, + { "bnnr1krb/ppp2ppp/3p4/3Bp3/q1P3PP/8/PP1PPP2/BNNRQKR1 w GDgd - 0 9", 5, 31801525 }, + { "bnnr1krb/ppp2ppp/3p4/3Bp3/q1P3PP/8/PP1PPP2/BNNRQKR1 w GDgd - 0 9", 6, 1075147725 }, + { "1bbnrqkr/pp1ppppp/8/2p5/n7/3PNPP1/PPP1P2P/NBB1RQKR w HEhe - 1 9", 1, 24 }, + { "1bbnrqkr/pp1ppppp/8/2p5/n7/3PNPP1/PPP1P2P/NBB1RQKR w HEhe - 1 9", 2, 598 }, + { "1bbnrqkr/pp1ppppp/8/2p5/n7/3PNPP1/PPP1P2P/NBB1RQKR w HEhe - 1 9", 3, 15673 }, + { "1bbnrqkr/pp1ppppp/8/2p5/n7/3PNPP1/PPP1P2P/NBB1RQKR w HEhe - 1 9", 4, 409766 }, + { "1bbnrqkr/pp1ppppp/8/2p5/n7/3PNPP1/PPP1P2P/NBB1RQKR w HEhe - 1 9", 5, 11394778 }, + { "1bbnrqkr/pp1ppppp/8/2p5/n7/3PNPP1/PPP1P2P/NBB1RQKR w HEhe - 1 9", 6, 310589129 }, + { "nnbbrqkr/p2ppp1p/1pp5/8/6p1/N1P5/PPBPPPPP/N1B1RQKR w HEhe - 0 9", 1, 26 }, + { "nnbbrqkr/p2ppp1p/1pp5/8/6p1/N1P5/PPBPPPPP/N1B1RQKR w HEhe - 0 9", 2, 530 }, + { "nnbbrqkr/p2ppp1p/1pp5/8/6p1/N1P5/PPBPPPPP/N1B1RQKR w HEhe - 0 9", 3, 14031 }, + { "nnbbrqkr/p2ppp1p/1pp5/8/6p1/N1P5/PPBPPPPP/N1B1RQKR w HEhe - 0 9", 4, 326312 }, + { "nnbbrqkr/p2ppp1p/1pp5/8/6p1/N1P5/PPBPPPPP/N1B1RQKR w HEhe - 0 9", 5, 8846766 }, + { "nnbbrqkr/p2ppp1p/1pp5/8/6p1/N1P5/PPBPPPPP/N1B1RQKR w HEhe - 0 9", 6, 229270702 }, + { "nnbrqbkr/2p1p1pp/p4p2/1p1p4/8/NP6/P1PPPPPP/N1BRQBKR w HDhd - 0 9", 1, 17 }, + { "nnbrqbkr/2p1p1pp/p4p2/1p1p4/8/NP6/P1PPPPPP/N1BRQBKR w HDhd - 0 9", 2, 496 }, + { "nnbrqbkr/2p1p1pp/p4p2/1p1p4/8/NP6/P1PPPPPP/N1BRQBKR w HDhd - 0 9", 3, 10220 }, + { "nnbrqbkr/2p1p1pp/p4p2/1p1p4/8/NP6/P1PPPPPP/N1BRQBKR w HDhd - 0 9", 4, 303310 }, + { "nnbrqbkr/2p1p1pp/p4p2/1p1p4/8/NP6/P1PPPPPP/N1BRQBKR w HDhd - 0 9", 5, 7103549 }, + { "nnbrqbkr/2p1p1pp/p4p2/1p1p4/8/NP6/P1PPPPPP/N1BRQBKR w HDhd - 0 9", 6, 217108001 }, + { "nnbrqk1b/pp2pprp/2pp2p1/8/3PP1P1/8/PPP2P1P/NNBRQRKB w d - 1 9", 1, 33 }, + { "nnbrqk1b/pp2pprp/2pp2p1/8/3PP1P1/8/PPP2P1P/NNBRQRKB w d - 1 9", 2, 820 }, + { "nnbrqk1b/pp2pprp/2pp2p1/8/3PP1P1/8/PPP2P1P/NNBRQRKB w d - 1 9", 3, 27856 }, + { "nnbrqk1b/pp2pprp/2pp2p1/8/3PP1P1/8/PPP2P1P/NNBRQRKB w d - 1 9", 4, 706784 }, + { "nnbrqk1b/pp2pprp/2pp2p1/8/3PP1P1/8/PPP2P1P/NNBRQRKB w d - 1 9", 5, 24714401 }, + { "nnbrqk1b/pp2pprp/2pp2p1/8/3PP1P1/8/PPP2P1P/NNBRQRKB w d - 1 9", 6, 645835197 }, + { "1bnrbqkr/ppnpp1p1/2p2p1p/8/1P6/4PPP1/P1PP3P/NBNRBQKR w HDhd - 0 9", 1, 27 }, + { "1bnrbqkr/ppnpp1p1/2p2p1p/8/1P6/4PPP1/P1PP3P/NBNRBQKR w HDhd - 0 9", 2, 705 }, + { "1bnrbqkr/ppnpp1p1/2p2p1p/8/1P6/4PPP1/P1PP3P/NBNRBQKR w HDhd - 0 9", 3, 19760 }, + { "1bnrbqkr/ppnpp1p1/2p2p1p/8/1P6/4PPP1/P1PP3P/NBNRBQKR w HDhd - 0 9", 4, 548680 }, + { "1bnrbqkr/ppnpp1p1/2p2p1p/8/1P6/4PPP1/P1PP3P/NBNRBQKR w HDhd - 0 9", 5, 15964771 }, + { "1bnrbqkr/ppnpp1p1/2p2p1p/8/1P6/4PPP1/P1PP3P/NBNRBQKR w HDhd - 0 9", 6, 464662032 }, + { "n1rbbqkr/pp1pppp1/7p/P1p5/1n6/2PP4/1P2PPPP/NNRBBQKR w HChc - 0 9", 1, 22 }, + { "n1rbbqkr/pp1pppp1/7p/P1p5/1n6/2PP4/1P2PPPP/NNRBBQKR w HChc - 0 9", 2, 631 }, + { "n1rbbqkr/pp1pppp1/7p/P1p5/1n6/2PP4/1P2PPPP/NNRBBQKR w HChc - 0 9", 3, 14978 }, + { "n1rbbqkr/pp1pppp1/7p/P1p5/1n6/2PP4/1P2PPPP/NNRBBQKR w HChc - 0 9", 4, 431801 }, + { "n1rbbqkr/pp1pppp1/7p/P1p5/1n6/2PP4/1P2PPPP/NNRBBQKR w HChc - 0 9", 5, 10911545 }, + { "n1rbbqkr/pp1pppp1/7p/P1p5/1n6/2PP4/1P2PPPP/NNRBBQKR w HChc - 0 9", 6, 320838556 }, + { "n1rqb1kr/p1pppp1p/1pn4b/3P2p1/P7/1P6/2P1PPPP/NNRQBBKR w HChc - 0 9", 1, 24 }, + { "n1rqb1kr/p1pppp1p/1pn4b/3P2p1/P7/1P6/2P1PPPP/NNRQBBKR w HChc - 0 9", 2, 477 }, + { "n1rqb1kr/p1pppp1p/1pn4b/3P2p1/P7/1P6/2P1PPPP/NNRQBBKR w HChc - 0 9", 3, 12506 }, + { "n1rqb1kr/p1pppp1p/1pn4b/3P2p1/P7/1P6/2P1PPPP/NNRQBBKR w HChc - 0 9", 4, 263189 }, + { "n1rqb1kr/p1pppp1p/1pn4b/3P2p1/P7/1P6/2P1PPPP/NNRQBBKR w HChc - 0 9", 5, 7419372 }, + { "n1rqb1kr/p1pppp1p/1pn4b/3P2p1/P7/1P6/2P1PPPP/NNRQBBKR w HChc - 0 9", 6, 165945904 }, + { "nnrqbkrb/pppp1pp1/7p/4p3/6P1/2N2B2/PPPPPP1P/NR1QBKR1 w Ggc - 2 9", 1, 29 }, + { "nnrqbkrb/pppp1pp1/7p/4p3/6P1/2N2B2/PPPPPP1P/NR1QBKR1 w Ggc - 2 9", 2, 658 }, + { "nnrqbkrb/pppp1pp1/7p/4p3/6P1/2N2B2/PPPPPP1P/NR1QBKR1 w Ggc - 2 9", 3, 19364 }, + { "nnrqbkrb/pppp1pp1/7p/4p3/6P1/2N2B2/PPPPPP1P/NR1QBKR1 w Ggc - 2 9", 4, 476620 }, + { "nnrqbkrb/pppp1pp1/7p/4p3/6P1/2N2B2/PPPPPP1P/NR1QBKR1 w Ggc - 2 9", 5, 14233587 }, + { "nnrqbkrb/pppp1pp1/7p/4p3/6P1/2N2B2/PPPPPP1P/NR1QBKR1 w Ggc - 2 9", 6, 373744834 }, + { "n1nrqkbr/ppb2ppp/3pp3/2p5/2P3P1/5P2/PP1PPB1P/NBNRQK1R w HDhd - 1 9", 1, 32 }, + { "n1nrqkbr/ppb2ppp/3pp3/2p5/2P3P1/5P2/PP1PPB1P/NBNRQK1R w HDhd - 1 9", 2, 801 }, + { "n1nrqkbr/ppb2ppp/3pp3/2p5/2P3P1/5P2/PP1PPB1P/NBNRQK1R w HDhd - 1 9", 3, 25861 }, + { "n1nrqkbr/ppb2ppp/3pp3/2p5/2P3P1/5P2/PP1PPB1P/NBNRQK1R w HDhd - 1 9", 4, 681428 }, + { "n1nrqkbr/ppb2ppp/3pp3/2p5/2P3P1/5P2/PP1PPB1P/NBNRQK1R w HDhd - 1 9", 5, 22318948 }, + { "n1nrqkbr/ppb2ppp/3pp3/2p5/2P3P1/5P2/PP1PPB1P/NBNRQK1R w HDhd - 1 9", 6, 619857455 }, + { "2rbqkbr/p1pppppp/1nn5/1p6/7P/P4P2/1PPPP1PB/NNRBQK1R w HChc - 2 9", 1, 27 }, + { "2rbqkbr/p1pppppp/1nn5/1p6/7P/P4P2/1PPPP1PB/NNRBQK1R w HChc - 2 9", 2, 647 }, + { "2rbqkbr/p1pppppp/1nn5/1p6/7P/P4P2/1PPPP1PB/NNRBQK1R w HChc - 2 9", 3, 18030 }, + { "2rbqkbr/p1pppppp/1nn5/1p6/7P/P4P2/1PPPP1PB/NNRBQK1R w HChc - 2 9", 4, 458057 }, + { "2rbqkbr/p1pppppp/1nn5/1p6/7P/P4P2/1PPPP1PB/NNRBQK1R w HChc - 2 9", 5, 13189156 }, + { "2rbqkbr/p1pppppp/1nn5/1p6/7P/P4P2/1PPPP1PB/NNRBQK1R w HChc - 2 9", 6, 354689323 }, + { "nn1qkbbr/pp2ppp1/2rp4/2p4p/P2P4/1N5P/1PP1PPP1/1NRQKBBR w HCh - 1 9", 1, 24 }, + { "nn1qkbbr/pp2ppp1/2rp4/2p4p/P2P4/1N5P/1PP1PPP1/1NRQKBBR w HCh - 1 9", 2, 738 }, + { "nn1qkbbr/pp2ppp1/2rp4/2p4p/P2P4/1N5P/1PP1PPP1/1NRQKBBR w HCh - 1 9", 3, 18916 }, + { "nn1qkbbr/pp2ppp1/2rp4/2p4p/P2P4/1N5P/1PP1PPP1/1NRQKBBR w HCh - 1 9", 4, 586009 }, + { "nn1qkbbr/pp2ppp1/2rp4/2p4p/P2P4/1N5P/1PP1PPP1/1NRQKBBR w HCh - 1 9", 5, 16420659 }, + { "nn1qkbbr/pp2ppp1/2rp4/2p4p/P2P4/1N5P/1PP1PPP1/1NRQKBBR w HCh - 1 9", 6, 519075930 }, + { "nnrqk1bb/p1ppp2p/5rp1/1p3p2/1P4P1/5P1P/P1PPP3/NNRQKRBB w FCc - 1 9", 1, 25 }, + { "nnrqk1bb/p1ppp2p/5rp1/1p3p2/1P4P1/5P1P/P1PPP3/NNRQKRBB w FCc - 1 9", 2, 795 }, + { "nnrqk1bb/p1ppp2p/5rp1/1p3p2/1P4P1/5P1P/P1PPP3/NNRQKRBB w FCc - 1 9", 3, 20510 }, + { "nnrqk1bb/p1ppp2p/5rp1/1p3p2/1P4P1/5P1P/P1PPP3/NNRQKRBB w FCc - 1 9", 4, 648945 }, + { "nnrqk1bb/p1ppp2p/5rp1/1p3p2/1P4P1/5P1P/P1PPP3/NNRQKRBB w FCc - 1 9", 5, 17342527 }, + { "nnrqk1bb/p1ppp2p/5rp1/1p3p2/1P4P1/5P1P/P1PPP3/NNRQKRBB w FCc - 1 9", 6, 556144017 }, + { "bb1nrkqr/ppppn2p/4ppp1/8/1P4P1/4P3/P1PPKP1P/BBNNR1QR w he - 0 9", 1, 29 }, + { "bb1nrkqr/ppppn2p/4ppp1/8/1P4P1/4P3/P1PPKP1P/BBNNR1QR w he - 0 9", 2, 664 }, + { "bb1nrkqr/ppppn2p/4ppp1/8/1P4P1/4P3/P1PPKP1P/BBNNR1QR w he - 0 9", 3, 20024 }, + { "bb1nrkqr/ppppn2p/4ppp1/8/1P4P1/4P3/P1PPKP1P/BBNNR1QR w he - 0 9", 4, 498376 }, + { "bb1nrkqr/ppppn2p/4ppp1/8/1P4P1/4P3/P1PPKP1P/BBNNR1QR w he - 0 9", 5, 15373803 }, + { "bb1nrkqr/ppppn2p/4ppp1/8/1P4P1/4P3/P1PPKP1P/BBNNR1QR w he - 0 9", 6, 406016364 }, + { "bnnbrkqr/1p1ppp2/8/p1p3pp/1P6/N4P2/PBPPP1PP/2NBRKQR w HEhe - 0 9", 1, 31 }, + { "bnnbrkqr/1p1ppp2/8/p1p3pp/1P6/N4P2/PBPPP1PP/2NBRKQR w HEhe - 0 9", 2, 770 }, + { "bnnbrkqr/1p1ppp2/8/p1p3pp/1P6/N4P2/PBPPP1PP/2NBRKQR w HEhe - 0 9", 3, 24850 }, + { "bnnbrkqr/1p1ppp2/8/p1p3pp/1P6/N4P2/PBPPP1PP/2NBRKQR w HEhe - 0 9", 4, 677212 }, + { "bnnbrkqr/1p1ppp2/8/p1p3pp/1P6/N4P2/PBPPP1PP/2NBRKQR w HEhe - 0 9", 5, 22562080 }, + { "bnnbrkqr/1p1ppp2/8/p1p3pp/1P6/N4P2/PBPPP1PP/2NBRKQR w HEhe - 0 9", 6, 662029574 }, + { "1nnrkbqr/p1pp1ppp/4p3/1p6/1Pb1P3/6PB/P1PP1P1P/BNNRK1QR w HDhd - 0 9", 1, 27 }, + { "1nnrkbqr/p1pp1ppp/4p3/1p6/1Pb1P3/6PB/P1PP1P1P/BNNRK1QR w HDhd - 0 9", 2, 776 }, + { "1nnrkbqr/p1pp1ppp/4p3/1p6/1Pb1P3/6PB/P1PP1P1P/BNNRK1QR w HDhd - 0 9", 3, 22133 }, + { "1nnrkbqr/p1pp1ppp/4p3/1p6/1Pb1P3/6PB/P1PP1P1P/BNNRK1QR w HDhd - 0 9", 4, 641002 }, + { "1nnrkbqr/p1pp1ppp/4p3/1p6/1Pb1P3/6PB/P1PP1P1P/BNNRK1QR w HDhd - 0 9", 5, 19153245 }, + { "1nnrkbqr/p1pp1ppp/4p3/1p6/1Pb1P3/6PB/P1PP1P1P/BNNRK1QR w HDhd - 0 9", 6, 562738257 }, + { "bnr1kqrb/pppp1pp1/1n5p/4p3/P3P3/3P2P1/1PP2P1P/BNNRKQRB w GDg - 0 9", 1, 26 }, + { "bnr1kqrb/pppp1pp1/1n5p/4p3/P3P3/3P2P1/1PP2P1P/BNNRKQRB w GDg - 0 9", 2, 624 }, + { "bnr1kqrb/pppp1pp1/1n5p/4p3/P3P3/3P2P1/1PP2P1P/BNNRKQRB w GDg - 0 9", 3, 16411 }, + { "bnr1kqrb/pppp1pp1/1n5p/4p3/P3P3/3P2P1/1PP2P1P/BNNRKQRB w GDg - 0 9", 4, 435426 }, + { "bnr1kqrb/pppp1pp1/1n5p/4p3/P3P3/3P2P1/1PP2P1P/BNNRKQRB w GDg - 0 9", 5, 11906515 }, + { "bnr1kqrb/pppp1pp1/1n5p/4p3/P3P3/3P2P1/1PP2P1P/BNNRKQRB w GDg - 0 9", 6, 338092952 }, + { "nbbnrkqr/p1ppp1pp/1p3p2/8/2P5/4P3/PP1P1PPP/NBBNRKQR w HEhe - 1 9", 1, 25 }, + { "nbbnrkqr/p1ppp1pp/1p3p2/8/2P5/4P3/PP1P1PPP/NBBNRKQR w HEhe - 1 9", 2, 624 }, + { "nbbnrkqr/p1ppp1pp/1p3p2/8/2P5/4P3/PP1P1PPP/NBBNRKQR w HEhe - 1 9", 3, 15561 }, + { "nbbnrkqr/p1ppp1pp/1p3p2/8/2P5/4P3/PP1P1PPP/NBBNRKQR w HEhe - 1 9", 4, 419635 }, + { "nbbnrkqr/p1ppp1pp/1p3p2/8/2P5/4P3/PP1P1PPP/NBBNRKQR w HEhe - 1 9", 5, 10817378 }, + { "nbbnrkqr/p1ppp1pp/1p3p2/8/2P5/4P3/PP1P1PPP/NBBNRKQR w HEhe - 1 9", 6, 311138112 }, + { "nn1brkqr/pp1bpppp/8/2pp4/P4P2/1PN5/2PPP1PP/N1BBRKQR w HEhe - 1 9", 1, 23 }, + { "nn1brkqr/pp1bpppp/8/2pp4/P4P2/1PN5/2PPP1PP/N1BBRKQR w HEhe - 1 9", 2, 659 }, + { "nn1brkqr/pp1bpppp/8/2pp4/P4P2/1PN5/2PPP1PP/N1BBRKQR w HEhe - 1 9", 3, 16958 }, + { "nn1brkqr/pp1bpppp/8/2pp4/P4P2/1PN5/2PPP1PP/N1BBRKQR w HEhe - 1 9", 4, 476567 }, + { "nn1brkqr/pp1bpppp/8/2pp4/P4P2/1PN5/2PPP1PP/N1BBRKQR w HEhe - 1 9", 5, 13242252 }, + { "nn1brkqr/pp1bpppp/8/2pp4/P4P2/1PN5/2PPP1PP/N1BBRKQR w HEhe - 1 9", 6, 373557073 }, + { "n1brkbqr/ppp1pp1p/6pB/3p4/2Pn4/8/PP2PPPP/NN1RKBQR w HDhd - 0 9", 1, 32 }, + { "n1brkbqr/ppp1pp1p/6pB/3p4/2Pn4/8/PP2PPPP/NN1RKBQR w HDhd - 0 9", 2, 1026 }, + { "n1brkbqr/ppp1pp1p/6pB/3p4/2Pn4/8/PP2PPPP/NN1RKBQR w HDhd - 0 9", 3, 30360 }, + { "n1brkbqr/ppp1pp1p/6pB/3p4/2Pn4/8/PP2PPPP/NN1RKBQR w HDhd - 0 9", 4, 978278 }, + { "n1brkbqr/ppp1pp1p/6pB/3p4/2Pn4/8/PP2PPPP/NN1RKBQR w HDhd - 0 9", 5, 29436320 }, + { "n1brkbqr/ppp1pp1p/6pB/3p4/2Pn4/8/PP2PPPP/NN1RKBQR w HDhd - 0 9", 6, 957904151 }, + { "nnbrkqrb/p2ppp2/Q5pp/1pp5/4PP2/2N5/PPPP2PP/N1BRK1RB w GDgd - 0 9", 1, 36 }, + { "nnbrkqrb/p2ppp2/Q5pp/1pp5/4PP2/2N5/PPPP2PP/N1BRK1RB w GDgd - 0 9", 2, 843 }, + { "nnbrkqrb/p2ppp2/Q5pp/1pp5/4PP2/2N5/PPPP2PP/N1BRK1RB w GDgd - 0 9", 3, 29017 }, + { "nnbrkqrb/p2ppp2/Q5pp/1pp5/4PP2/2N5/PPPP2PP/N1BRK1RB w GDgd - 0 9", 4, 715537 }, + { "nnbrkqrb/p2ppp2/Q5pp/1pp5/4PP2/2N5/PPPP2PP/N1BRK1RB w GDgd - 0 9", 5, 24321197 }, + { "nnbrkqrb/p2ppp2/Q5pp/1pp5/4PP2/2N5/PPPP2PP/N1BRK1RB w GDgd - 0 9", 6, 630396940 }, + { "nbnrbk1r/pppppppq/8/7p/8/1N2QPP1/PPPPP2P/NB1RBK1R w HDhd - 2 9", 1, 36 }, + { "nbnrbk1r/pppppppq/8/7p/8/1N2QPP1/PPPPP2P/NB1RBK1R w HDhd - 2 9", 2, 973 }, + { "nbnrbk1r/pppppppq/8/7p/8/1N2QPP1/PPPPP2P/NB1RBK1R w HDhd - 2 9", 3, 35403 }, + { "nbnrbk1r/pppppppq/8/7p/8/1N2QPP1/PPPPP2P/NB1RBK1R w HDhd - 2 9", 4, 1018054 }, + { "nbnrbk1r/pppppppq/8/7p/8/1N2QPP1/PPPPP2P/NB1RBK1R w HDhd - 2 9", 5, 37143354 }, + { "nbnrbk1r/pppppppq/8/7p/8/1N2QPP1/PPPPP2P/NB1RBK1R w HDhd - 2 9", 6, 1124883780 }, + { "nnrbbkqr/2pppp1p/p7/6p1/1p2P3/4QPP1/PPPP3P/NNRBBK1R w HChc - 0 9", 1, 36 }, + { "nnrbbkqr/2pppp1p/p7/6p1/1p2P3/4QPP1/PPPP3P/NNRBBK1R w HChc - 0 9", 2, 649 }, + { "nnrbbkqr/2pppp1p/p7/6p1/1p2P3/4QPP1/PPPP3P/NNRBBK1R w HChc - 0 9", 3, 22524 }, + { "nnrbbkqr/2pppp1p/p7/6p1/1p2P3/4QPP1/PPPP3P/NNRBBK1R w HChc - 0 9", 4, 489526 }, + { "nnrbbkqr/2pppp1p/p7/6p1/1p2P3/4QPP1/PPPP3P/NNRBBK1R w HChc - 0 9", 5, 16836636 }, + { "nnrbbkqr/2pppp1p/p7/6p1/1p2P3/4QPP1/PPPP3P/NNRBBK1R w HChc - 0 9", 6, 416139320 }, + { "nnrkbbqr/1p2pppp/p2p4/2p5/8/1N2P1P1/PPPP1P1P/1NKRBBQR w hc - 0 9", 1, 26 }, + { "nnrkbbqr/1p2pppp/p2p4/2p5/8/1N2P1P1/PPPP1P1P/1NKRBBQR w hc - 0 9", 2, 672 }, + { "nnrkbbqr/1p2pppp/p2p4/2p5/8/1N2P1P1/PPPP1P1P/1NKRBBQR w hc - 0 9", 3, 18136 }, + { "nnrkbbqr/1p2pppp/p2p4/2p5/8/1N2P1P1/PPPP1P1P/1NKRBBQR w hc - 0 9", 4, 477801 }, + { "nnrkbbqr/1p2pppp/p2p4/2p5/8/1N2P1P1/PPPP1P1P/1NKRBBQR w hc - 0 9", 5, 13342771 }, + { "nnrkbbqr/1p2pppp/p2p4/2p5/8/1N2P1P1/PPPP1P1P/1NKRBBQR w hc - 0 9", 6, 363074681 }, + { "n1rkbqrb/pp1ppp2/2n3p1/2p4p/P5PP/1P6/2PPPP2/NNRKBQRB w GCgc - 0 9", 1, 24 }, + { "n1rkbqrb/pp1ppp2/2n3p1/2p4p/P5PP/1P6/2PPPP2/NNRKBQRB w GCgc - 0 9", 2, 804 }, + { "n1rkbqrb/pp1ppp2/2n3p1/2p4p/P5PP/1P6/2PPPP2/NNRKBQRB w GCgc - 0 9", 3, 20712 }, + { "n1rkbqrb/pp1ppp2/2n3p1/2p4p/P5PP/1P6/2PPPP2/NNRKBQRB w GCgc - 0 9", 4, 684001 }, + { "n1rkbqrb/pp1ppp2/2n3p1/2p4p/P5PP/1P6/2PPPP2/NNRKBQRB w GCgc - 0 9", 5, 18761475 }, + { "n1rkbqrb/pp1ppp2/2n3p1/2p4p/P5PP/1P6/2PPPP2/NNRKBQRB w GCgc - 0 9", 6, 617932151 }, + { "nbkr1qbr/1pp1pppp/pn1p4/8/3P2P1/5R2/PPP1PP1P/NBN1KQBR w H - 2 9", 1, 30 }, + { "nbkr1qbr/1pp1pppp/pn1p4/8/3P2P1/5R2/PPP1PP1P/NBN1KQBR w H - 2 9", 2, 627 }, + { "nbkr1qbr/1pp1pppp/pn1p4/8/3P2P1/5R2/PPP1PP1P/NBN1KQBR w H - 2 9", 3, 18669 }, + { "nbkr1qbr/1pp1pppp/pn1p4/8/3P2P1/5R2/PPP1PP1P/NBN1KQBR w H - 2 9", 4, 423329 }, + { "nbkr1qbr/1pp1pppp/pn1p4/8/3P2P1/5R2/PPP1PP1P/NBN1KQBR w H - 2 9", 5, 12815016 }, + { "nbkr1qbr/1pp1pppp/pn1p4/8/3P2P1/5R2/PPP1PP1P/NBN1KQBR w H - 2 9", 6, 312798696 }, + { "nnr1kqbr/pp1pp1p1/2p5/b4p1p/P7/1PNP4/2P1PPPP/N1RBKQBR w HChc - 1 9", 1, 12 }, + { "nnr1kqbr/pp1pp1p1/2p5/b4p1p/P7/1PNP4/2P1PPPP/N1RBKQBR w HChc - 1 9", 2, 421 }, + { "nnr1kqbr/pp1pp1p1/2p5/b4p1p/P7/1PNP4/2P1PPPP/N1RBKQBR w HChc - 1 9", 3, 6530 }, + { "nnr1kqbr/pp1pp1p1/2p5/b4p1p/P7/1PNP4/2P1PPPP/N1RBKQBR w HChc - 1 9", 4, 227044 }, + { "nnr1kqbr/pp1pp1p1/2p5/b4p1p/P7/1PNP4/2P1PPPP/N1RBKQBR w HChc - 1 9", 5, 4266410 }, + { "nnr1kqbr/pp1pp1p1/2p5/b4p1p/P7/1PNP4/2P1PPPP/N1RBKQBR w HChc - 1 9", 6, 149176979 }, + { "n1rkqbbr/p1pp1pp1/np2p2p/8/8/N4PP1/PPPPP1BP/N1RKQ1BR w HChc - 0 9", 1, 27 }, + { "n1rkqbbr/p1pp1pp1/np2p2p/8/8/N4PP1/PPPPP1BP/N1RKQ1BR w HChc - 0 9", 2, 670 }, + { "n1rkqbbr/p1pp1pp1/np2p2p/8/8/N4PP1/PPPPP1BP/N1RKQ1BR w HChc - 0 9", 3, 19119 }, + { "n1rkqbbr/p1pp1pp1/np2p2p/8/8/N4PP1/PPPPP1BP/N1RKQ1BR w HChc - 0 9", 4, 494690 }, + { "n1rkqbbr/p1pp1pp1/np2p2p/8/8/N4PP1/PPPPP1BP/N1RKQ1BR w HChc - 0 9", 5, 14708490 }, + { "n1rkqbbr/p1pp1pp1/np2p2p/8/8/N4PP1/PPPPP1BP/N1RKQ1BR w HChc - 0 9", 6, 397268628 }, + { "nnr1qrbb/p2kpppp/1p1p4/2p5/6P1/PP1P4/2P1PP1P/NNRKQRBB w FC - 0 9", 1, 27 }, + { "nnr1qrbb/p2kpppp/1p1p4/2p5/6P1/PP1P4/2P1PP1P/NNRKQRBB w FC - 0 9", 2, 604 }, + { "nnr1qrbb/p2kpppp/1p1p4/2p5/6P1/PP1P4/2P1PP1P/NNRKQRBB w FC - 0 9", 3, 17043 }, + { "nnr1qrbb/p2kpppp/1p1p4/2p5/6P1/PP1P4/2P1PP1P/NNRKQRBB w FC - 0 9", 4, 409665 }, + { "nnr1qrbb/p2kpppp/1p1p4/2p5/6P1/PP1P4/2P1PP1P/NNRKQRBB w FC - 0 9", 5, 11993332 }, + { "nnr1qrbb/p2kpppp/1p1p4/2p5/6P1/PP1P4/2P1PP1P/NNRKQRBB w FC - 0 9", 6, 308518181 }, + { "bbnnrkrq/ppp1pp2/6p1/3p4/7p/7P/PPPPPPP1/BBNNRRKQ w ge - 0 9", 1, 20 }, + { "bbnnrkrq/ppp1pp2/6p1/3p4/7p/7P/PPPPPPP1/BBNNRRKQ w ge - 0 9", 2, 559 }, + { "bbnnrkrq/ppp1pp2/6p1/3p4/7p/7P/PPPPPPP1/BBNNRRKQ w ge - 0 9", 3, 12242 }, + { "bbnnrkrq/ppp1pp2/6p1/3p4/7p/7P/PPPPPPP1/BBNNRRKQ w ge - 0 9", 4, 355326 }, + { "bbnnrkrq/ppp1pp2/6p1/3p4/7p/7P/PPPPPPP1/BBNNRRKQ w ge - 0 9", 5, 8427161 }, + { "bbnnrkrq/ppp1pp2/6p1/3p4/7p/7P/PPPPPPP1/BBNNRRKQ w ge - 0 9", 6, 252274233 }, + { "bnnbrkr1/ppp2p1p/5q2/3pp1p1/4P3/1N4P1/PPPPRP1P/BN1B1KRQ w Gge - 0 9", 1, 26 }, + { "bnnbrkr1/ppp2p1p/5q2/3pp1p1/4P3/1N4P1/PPPPRP1P/BN1B1KRQ w Gge - 0 9", 2, 1036 }, + { "bnnbrkr1/ppp2p1p/5q2/3pp1p1/4P3/1N4P1/PPPPRP1P/BN1B1KRQ w Gge - 0 9", 3, 27228 }, + { "bnnbrkr1/ppp2p1p/5q2/3pp1p1/4P3/1N4P1/PPPPRP1P/BN1B1KRQ w Gge - 0 9", 4, 1028084 }, + { "bnnbrkr1/ppp2p1p/5q2/3pp1p1/4P3/1N4P1/PPPPRP1P/BN1B1KRQ w Gge - 0 9", 5, 28286576 }, + { "bnnbrkr1/ppp2p1p/5q2/3pp1p1/4P3/1N4P1/PPPPRP1P/BN1B1KRQ w Gge - 0 9", 6, 1042120495 }, + { "bn1rkbrq/1pppppp1/p6p/1n6/3P4/6PP/PPPRPP2/BNN1KBRQ w Ggd - 2 9", 1, 29 }, + { "bn1rkbrq/1pppppp1/p6p/1n6/3P4/6PP/PPPRPP2/BNN1KBRQ w Ggd - 2 9", 2, 633 }, + { "bn1rkbrq/1pppppp1/p6p/1n6/3P4/6PP/PPPRPP2/BNN1KBRQ w Ggd - 2 9", 3, 19278 }, + { "bn1rkbrq/1pppppp1/p6p/1n6/3P4/6PP/PPPRPP2/BNN1KBRQ w Ggd - 2 9", 4, 455476 }, + { "bn1rkbrq/1pppppp1/p6p/1n6/3P4/6PP/PPPRPP2/BNN1KBRQ w Ggd - 2 9", 5, 14333034 }, + { "bn1rkbrq/1pppppp1/p6p/1n6/3P4/6PP/PPPRPP2/BNN1KBRQ w Ggd - 2 9", 6, 361900466 }, + { "b1nrkrqb/1p1npppp/p2p4/2p5/5P2/4P2P/PPPP1RP1/BNNRK1QB w Dfd - 1 9", 1, 25 }, + { "b1nrkrqb/1p1npppp/p2p4/2p5/5P2/4P2P/PPPP1RP1/BNNRK1QB w Dfd - 1 9", 2, 475 }, + { "b1nrkrqb/1p1npppp/p2p4/2p5/5P2/4P2P/PPPP1RP1/BNNRK1QB w Dfd - 1 9", 3, 12603 }, + { "b1nrkrqb/1p1npppp/p2p4/2p5/5P2/4P2P/PPPP1RP1/BNNRK1QB w Dfd - 1 9", 4, 270909 }, + { "b1nrkrqb/1p1npppp/p2p4/2p5/5P2/4P2P/PPPP1RP1/BNNRK1QB w Dfd - 1 9", 5, 7545536 }, + { "b1nrkrqb/1p1npppp/p2p4/2p5/5P2/4P2P/PPPP1RP1/BNNRK1QB w Dfd - 1 9", 6, 179579818 }, + { "1bbnrkrq/ppppppp1/8/7p/1n4P1/1PN5/P1PPPP1P/NBBR1KRQ w Gge - 0 9", 1, 30 }, + { "1bbnrkrq/ppppppp1/8/7p/1n4P1/1PN5/P1PPPP1P/NBBR1KRQ w Gge - 0 9", 2, 803 }, + { "1bbnrkrq/ppppppp1/8/7p/1n4P1/1PN5/P1PPPP1P/NBBR1KRQ w Gge - 0 9", 3, 25473 }, + { "1bbnrkrq/ppppppp1/8/7p/1n4P1/1PN5/P1PPPP1P/NBBR1KRQ w Gge - 0 9", 4, 709716 }, + { "1bbnrkrq/ppppppp1/8/7p/1n4P1/1PN5/P1PPPP1P/NBBR1KRQ w Gge - 0 9", 5, 23443854 }, + { "1bbnrkrq/ppppppp1/8/7p/1n4P1/1PN5/P1PPPP1P/NBBR1KRQ w Gge - 0 9", 6, 686365049 }, + { "nnbbrkrq/2pp1pp1/1p5p/pP2p3/7P/N7/P1PPPPP1/N1BBRKRQ w GEge - 0 9", 1, 18 }, + { "nnbbrkrq/2pp1pp1/1p5p/pP2p3/7P/N7/P1PPPPP1/N1BBRKRQ w GEge - 0 9", 2, 432 }, + { "nnbbrkrq/2pp1pp1/1p5p/pP2p3/7P/N7/P1PPPPP1/N1BBRKRQ w GEge - 0 9", 3, 9638 }, + { "nnbbrkrq/2pp1pp1/1p5p/pP2p3/7P/N7/P1PPPPP1/N1BBRKRQ w GEge - 0 9", 4, 242350 }, + { "nnbbrkrq/2pp1pp1/1p5p/pP2p3/7P/N7/P1PPPPP1/N1BBRKRQ w GEge - 0 9", 5, 6131124 }, + { "nnbbrkrq/2pp1pp1/1p5p/pP2p3/7P/N7/P1PPPPP1/N1BBRKRQ w GEge - 0 9", 6, 160393505 }, + { "nnbrkbrq/1pppp1p1/p7/7p/1P2Pp2/BN6/P1PP1PPP/1N1RKBRQ w GDgd - 0 9", 1, 27 }, + { "nnbrkbrq/1pppp1p1/p7/7p/1P2Pp2/BN6/P1PP1PPP/1N1RKBRQ w GDgd - 0 9", 2, 482 }, + { "nnbrkbrq/1pppp1p1/p7/7p/1P2Pp2/BN6/P1PP1PPP/1N1RKBRQ w GDgd - 0 9", 3, 13441 }, + { "nnbrkbrq/1pppp1p1/p7/7p/1P2Pp2/BN6/P1PP1PPP/1N1RKBRQ w GDgd - 0 9", 4, 282259 }, + { "nnbrkbrq/1pppp1p1/p7/7p/1P2Pp2/BN6/P1PP1PPP/1N1RKBRQ w GDgd - 0 9", 5, 8084701 }, + { "nnbrkbrq/1pppp1p1/p7/7p/1P2Pp2/BN6/P1PP1PPP/1N1RKBRQ w GDgd - 0 9", 6, 193484216 }, + { "n1brkrqb/pppp3p/n3pp2/6p1/3P1P2/N1P5/PP2P1PP/N1BRKRQB w FDfd - 0 9", 1, 28 }, + { "n1brkrqb/pppp3p/n3pp2/6p1/3P1P2/N1P5/PP2P1PP/N1BRKRQB w FDfd - 0 9", 2, 642 }, + { "n1brkrqb/pppp3p/n3pp2/6p1/3P1P2/N1P5/PP2P1PP/N1BRKRQB w FDfd - 0 9", 3, 19005 }, + { "n1brkrqb/pppp3p/n3pp2/6p1/3P1P2/N1P5/PP2P1PP/N1BRKRQB w FDfd - 0 9", 4, 471729 }, + { "n1brkrqb/pppp3p/n3pp2/6p1/3P1P2/N1P5/PP2P1PP/N1BRKRQB w FDfd - 0 9", 5, 14529434 }, + { "n1brkrqb/pppp3p/n3pp2/6p1/3P1P2/N1P5/PP2P1PP/N1BRKRQB w FDfd - 0 9", 6, 384837696 }, + { "nbnrbk2/p1pppp1p/1p3qr1/6p1/1B1P4/1N6/PPP1PPPP/1BNR1RKQ w d - 2 9", 1, 30 }, + { "nbnrbk2/p1pppp1p/1p3qr1/6p1/1B1P4/1N6/PPP1PPPP/1BNR1RKQ w d - 2 9", 2, 796 }, + { "nbnrbk2/p1pppp1p/1p3qr1/6p1/1B1P4/1N6/PPP1PPPP/1BNR1RKQ w d - 2 9", 3, 22780 }, + { "nbnrbk2/p1pppp1p/1p3qr1/6p1/1B1P4/1N6/PPP1PPPP/1BNR1RKQ w d - 2 9", 4, 687302 }, + { "nbnrbk2/p1pppp1p/1p3qr1/6p1/1B1P4/1N6/PPP1PPPP/1BNR1RKQ w d - 2 9", 5, 20120565 }, + { "nbnrbk2/p1pppp1p/1p3qr1/6p1/1B1P4/1N6/PPP1PPPP/1BNR1RKQ w d - 2 9", 6, 641832725 }, + { "nnrbbrkq/1pp2ppp/3p4/p3p3/3P1P2/1P2P3/P1P3PP/NNRBBKRQ w GC - 1 9", 1, 31 }, + { "nnrbbrkq/1pp2ppp/3p4/p3p3/3P1P2/1P2P3/P1P3PP/NNRBBKRQ w GC - 1 9", 2, 827 }, + { "nnrbbrkq/1pp2ppp/3p4/p3p3/3P1P2/1P2P3/P1P3PP/NNRBBKRQ w GC - 1 9", 3, 24538 }, + { "nnrbbrkq/1pp2ppp/3p4/p3p3/3P1P2/1P2P3/P1P3PP/NNRBBKRQ w GC - 1 9", 4, 663082 }, + { "nnrbbrkq/1pp2ppp/3p4/p3p3/3P1P2/1P2P3/P1P3PP/NNRBBKRQ w GC - 1 9", 5, 19979594 }, + { "nnrbbrkq/1pp2ppp/3p4/p3p3/3P1P2/1P2P3/P1P3PP/NNRBBKRQ w GC - 1 9", 6, 549437308 }, + { "nnrkbbrq/1pp2p1p/p2pp1p1/2P5/8/8/PP1PPPPP/NNRKBBRQ w Ggc - 0 9", 1, 24 }, + { "nnrkbbrq/1pp2p1p/p2pp1p1/2P5/8/8/PP1PPPPP/NNRKBBRQ w Ggc - 0 9", 2, 762 }, + { "nnrkbbrq/1pp2p1p/p2pp1p1/2P5/8/8/PP1PPPPP/NNRKBBRQ w Ggc - 0 9", 3, 19283 }, + { "nnrkbbrq/1pp2p1p/p2pp1p1/2P5/8/8/PP1PPPPP/NNRKBBRQ w Ggc - 0 9", 4, 624598 }, + { "nnrkbbrq/1pp2p1p/p2pp1p1/2P5/8/8/PP1PPPPP/NNRKBBRQ w Ggc - 0 9", 5, 16838099 }, + { "nnrkbbrq/1pp2p1p/p2pp1p1/2P5/8/8/PP1PPPPP/NNRKBBRQ w Ggc - 0 9", 6, 555230555 }, + { "nnr1brqb/1ppkp1pp/8/p2p1p2/1P1P4/N1P5/P3PPPP/N1RKBRQB w FC - 1 9", 1, 23 }, + { "nnr1brqb/1ppkp1pp/8/p2p1p2/1P1P4/N1P5/P3PPPP/N1RKBRQB w FC - 1 9", 2, 640 }, + { "nnr1brqb/1ppkp1pp/8/p2p1p2/1P1P4/N1P5/P3PPPP/N1RKBRQB w FC - 1 9", 3, 15471 }, + { "nnr1brqb/1ppkp1pp/8/p2p1p2/1P1P4/N1P5/P3PPPP/N1RKBRQB w FC - 1 9", 4, 444905 }, + { "nnr1brqb/1ppkp1pp/8/p2p1p2/1P1P4/N1P5/P3PPPP/N1RKBRQB w FC - 1 9", 5, 11343507 }, + { "nnr1brqb/1ppkp1pp/8/p2p1p2/1P1P4/N1P5/P3PPPP/N1RKBRQB w FC - 1 9", 6, 334123513 }, + { "nbnrkrbq/2ppp2p/p4p2/1P4p1/4PP2/8/1PPP2PP/NBNRKRBQ w FDfd - 0 9", 1, 31 }, + { "nbnrkrbq/2ppp2p/p4p2/1P4p1/4PP2/8/1PPP2PP/NBNRKRBQ w FDfd - 0 9", 2, 826 }, + { "nbnrkrbq/2ppp2p/p4p2/1P4p1/4PP2/8/1PPP2PP/NBNRKRBQ w FDfd - 0 9", 3, 26137 }, + { "nbnrkrbq/2ppp2p/p4p2/1P4p1/4PP2/8/1PPP2PP/NBNRKRBQ w FDfd - 0 9", 4, 732175 }, + { "nbnrkrbq/2ppp2p/p4p2/1P4p1/4PP2/8/1PPP2PP/NBNRKRBQ w FDfd - 0 9", 5, 23555139 }, + { "nbnrkrbq/2ppp2p/p4p2/1P4p1/4PP2/8/1PPP2PP/NBNRKRBQ w FDfd - 0 9", 6, 686250413 }, + { "1nrbkr1q/1pppp1pp/1n6/p4p2/N1b4P/8/PPPPPPPB/N1RBKR1Q w FCfc - 2 9", 1, 27 }, + { "1nrbkr1q/1pppp1pp/1n6/p4p2/N1b4P/8/PPPPPPPB/N1RBKR1Q w FCfc - 2 9", 2, 862 }, + { "1nrbkr1q/1pppp1pp/1n6/p4p2/N1b4P/8/PPPPPPPB/N1RBKR1Q w FCfc - 2 9", 3, 24141 }, + { "1nrbkr1q/1pppp1pp/1n6/p4p2/N1b4P/8/PPPPPPPB/N1RBKR1Q w FCfc - 2 9", 4, 755171 }, + { "1nrbkr1q/1pppp1pp/1n6/p4p2/N1b4P/8/PPPPPPPB/N1RBKR1Q w FCfc - 2 9", 5, 22027695 }, + { "1nrbkr1q/1pppp1pp/1n6/p4p2/N1b4P/8/PPPPPPPB/N1RBKR1Q w FCfc - 2 9", 6, 696353497 }, + { "nnrkrbbq/pppp2pp/8/4pp2/4P3/P7/1PPPBPPP/NNKRR1BQ w c - 0 9", 1, 25 }, + { "nnrkrbbq/pppp2pp/8/4pp2/4P3/P7/1PPPBPPP/NNKRR1BQ w c - 0 9", 2, 792 }, + { "nnrkrbbq/pppp2pp/8/4pp2/4P3/P7/1PPPBPPP/NNKRR1BQ w c - 0 9", 3, 19883 }, + { "nnrkrbbq/pppp2pp/8/4pp2/4P3/P7/1PPPBPPP/NNKRR1BQ w c - 0 9", 4, 636041 }, + { "nnrkrbbq/pppp2pp/8/4pp2/4P3/P7/1PPPBPPP/NNKRR1BQ w c - 0 9", 5, 16473376 }, + { "nnrkrbbq/pppp2pp/8/4pp2/4P3/P7/1PPPBPPP/NNKRR1BQ w c - 0 9", 6, 532214177 }, + { "n1rk1qbb/pppprpp1/2n4p/4p3/2PP3P/8/PP2PPP1/NNRKRQBB w ECc - 1 9", 1, 25 }, + { "n1rk1qbb/pppprpp1/2n4p/4p3/2PP3P/8/PP2PPP1/NNRKRQBB w ECc - 1 9", 2, 622 }, + { "n1rk1qbb/pppprpp1/2n4p/4p3/2PP3P/8/PP2PPP1/NNRKRQBB w ECc - 1 9", 3, 16031 }, + { "n1rk1qbb/pppprpp1/2n4p/4p3/2PP3P/8/PP2PPP1/NNRKRQBB w ECc - 1 9", 4, 425247 }, + { "n1rk1qbb/pppprpp1/2n4p/4p3/2PP3P/8/PP2PPP1/NNRKRQBB w ECc - 1 9", 5, 11420973 }, + { "n1rk1qbb/pppprpp1/2n4p/4p3/2PP3P/8/PP2PPP1/NNRKRQBB w ECc - 1 9", 6, 321855685 }, + { "bbq1rnkr/pnp1pp1p/1p1p4/6p1/2P5/2Q1P2P/PP1P1PP1/BB1NRNKR w HEhe - 2 9", 1, 36 }, + { "bbq1rnkr/pnp1pp1p/1p1p4/6p1/2P5/2Q1P2P/PP1P1PP1/BB1NRNKR w HEhe - 2 9", 2, 870 }, + { "bbq1rnkr/pnp1pp1p/1p1p4/6p1/2P5/2Q1P2P/PP1P1PP1/BB1NRNKR w HEhe - 2 9", 3, 30516 }, + { "bbq1rnkr/pnp1pp1p/1p1p4/6p1/2P5/2Q1P2P/PP1P1PP1/BB1NRNKR w HEhe - 2 9", 4, 811047 }, + { "bbq1rnkr/pnp1pp1p/1p1p4/6p1/2P5/2Q1P2P/PP1P1PP1/BB1NRNKR w HEhe - 2 9", 5, 28127620 }, + { "bbq1rnkr/pnp1pp1p/1p1p4/6p1/2P5/2Q1P2P/PP1P1PP1/BB1NRNKR w HEhe - 2 9", 6, 799738334 }, + { "bq1brnkr/1p1ppp1p/1np5/p5p1/8/1N5P/PPPPPPP1/BQ1BRNKR w HEhe - 0 9", 1, 22 }, + { "bq1brnkr/1p1ppp1p/1np5/p5p1/8/1N5P/PPPPPPP1/BQ1BRNKR w HEhe - 0 9", 2, 588 }, + { "bq1brnkr/1p1ppp1p/1np5/p5p1/8/1N5P/PPPPPPP1/BQ1BRNKR w HEhe - 0 9", 3, 13524 }, + { "bq1brnkr/1p1ppp1p/1np5/p5p1/8/1N5P/PPPPPPP1/BQ1BRNKR w HEhe - 0 9", 4, 380068 }, + { "bq1brnkr/1p1ppp1p/1np5/p5p1/8/1N5P/PPPPPPP1/BQ1BRNKR w HEhe - 0 9", 5, 9359618 }, + { "bq1brnkr/1p1ppp1p/1np5/p5p1/8/1N5P/PPPPPPP1/BQ1BRNKR w HEhe - 0 9", 6, 273795898 }, + { "bq1rn1kr/1pppppbp/Nn4p1/8/8/P7/1PPPPPPP/BQ1RNBKR w HDhd - 1 9", 1, 24 }, + { "bq1rn1kr/1pppppbp/Nn4p1/8/8/P7/1PPPPPPP/BQ1RNBKR w HDhd - 1 9", 2, 711 }, + { "bq1rn1kr/1pppppbp/Nn4p1/8/8/P7/1PPPPPPP/BQ1RNBKR w HDhd - 1 9", 3, 18197 }, + { "bq1rn1kr/1pppppbp/Nn4p1/8/8/P7/1PPPPPPP/BQ1RNBKR w HDhd - 1 9", 4, 542570 }, + { "bq1rn1kr/1pppppbp/Nn4p1/8/8/P7/1PPPPPPP/BQ1RNBKR w HDhd - 1 9", 5, 14692779 }, + { "bq1rn1kr/1pppppbp/Nn4p1/8/8/P7/1PPPPPPP/BQ1RNBKR w HDhd - 1 9", 6, 445827351 }, + { "bqnr1kr1/pppppp1p/6p1/5n2/4B3/3N2PP/PbPPPP2/BQNR1KR1 w GDgd - 2 9", 1, 31 }, + { "bqnr1kr1/pppppp1p/6p1/5n2/4B3/3N2PP/PbPPPP2/BQNR1KR1 w GDgd - 2 9", 2, 1132 }, + { "bqnr1kr1/pppppp1p/6p1/5n2/4B3/3N2PP/PbPPPP2/BQNR1KR1 w GDgd - 2 9", 3, 36559 }, + { "bqnr1kr1/pppppp1p/6p1/5n2/4B3/3N2PP/PbPPPP2/BQNR1KR1 w GDgd - 2 9", 4, 1261476 }, + { "bqnr1kr1/pppppp1p/6p1/5n2/4B3/3N2PP/PbPPPP2/BQNR1KR1 w GDgd - 2 9", 5, 43256823 }, + { "bqnr1kr1/pppppp1p/6p1/5n2/4B3/3N2PP/PbPPPP2/BQNR1KR1 w GDgd - 2 9", 6, 1456721391 }, + { "qbb1rnkr/ppp3pp/4n3/3ppp2/1P3PP1/8/P1PPPN1P/QBB1RNKR w HEhe - 0 9", 1, 28 }, + { "qbb1rnkr/ppp3pp/4n3/3ppp2/1P3PP1/8/P1PPPN1P/QBB1RNKR w HEhe - 0 9", 2, 696 }, + { "qbb1rnkr/ppp3pp/4n3/3ppp2/1P3PP1/8/P1PPPN1P/QBB1RNKR w HEhe - 0 9", 3, 20502 }, + { "qbb1rnkr/ppp3pp/4n3/3ppp2/1P3PP1/8/P1PPPN1P/QBB1RNKR w HEhe - 0 9", 4, 541886 }, + { "qbb1rnkr/ppp3pp/4n3/3ppp2/1P3PP1/8/P1PPPN1P/QBB1RNKR w HEhe - 0 9", 5, 16492398 }, + { "qbb1rnkr/ppp3pp/4n3/3ppp2/1P3PP1/8/P1PPPN1P/QBB1RNKR w HEhe - 0 9", 6, 456983120 }, + { "qnbbr1kr/pp1ppp1p/4n3/6p1/2p3P1/2PP1P2/PP2P2P/QNBBRNKR w HEhe - 0 9", 1, 25 }, + { "qnbbr1kr/pp1ppp1p/4n3/6p1/2p3P1/2PP1P2/PP2P2P/QNBBRNKR w HEhe - 0 9", 2, 655 }, + { "qnbbr1kr/pp1ppp1p/4n3/6p1/2p3P1/2PP1P2/PP2P2P/QNBBRNKR w HEhe - 0 9", 3, 16520 }, + { "qnbbr1kr/pp1ppp1p/4n3/6p1/2p3P1/2PP1P2/PP2P2P/QNBBRNKR w HEhe - 0 9", 4, 450189 }, + { "qnbbr1kr/pp1ppp1p/4n3/6p1/2p3P1/2PP1P2/PP2P2P/QNBBRNKR w HEhe - 0 9", 5, 11767038 }, + { "qnbbr1kr/pp1ppp1p/4n3/6p1/2p3P1/2PP1P2/PP2P2P/QNBBRNKR w HEhe - 0 9", 6, 335414976 }, + { "1nbrnbkr/p1ppp1pp/1p6/5p2/4q1PP/3P4/PPP1PP2/QNBRNBKR w HDhd - 1 9", 1, 30 }, + { "1nbrnbkr/p1ppp1pp/1p6/5p2/4q1PP/3P4/PPP1PP2/QNBRNBKR w HDhd - 1 9", 2, 1162 }, + { "1nbrnbkr/p1ppp1pp/1p6/5p2/4q1PP/3P4/PPP1PP2/QNBRNBKR w HDhd - 1 9", 3, 33199 }, + { "1nbrnbkr/p1ppp1pp/1p6/5p2/4q1PP/3P4/PPP1PP2/QNBRNBKR w HDhd - 1 9", 4, 1217278 }, + { "1nbrnbkr/p1ppp1pp/1p6/5p2/4q1PP/3P4/PPP1PP2/QNBRNBKR w HDhd - 1 9", 5, 36048727 }, + { "1nbrnbkr/p1ppp1pp/1p6/5p2/4q1PP/3P4/PPP1PP2/QNBRNBKR w HDhd - 1 9", 6, 1290346802 }, + { "q1brnkrb/p1pppppp/n7/1p6/P7/3P1P2/QPP1P1PP/1NBRNKRB w GDgd - 0 9", 1, 32 }, + { "q1brnkrb/p1pppppp/n7/1p6/P7/3P1P2/QPP1P1PP/1NBRNKRB w GDgd - 0 9", 2, 827 }, + { "q1brnkrb/p1pppppp/n7/1p6/P7/3P1P2/QPP1P1PP/1NBRNKRB w GDgd - 0 9", 3, 26106 }, + { "q1brnkrb/p1pppppp/n7/1p6/P7/3P1P2/QPP1P1PP/1NBRNKRB w GDgd - 0 9", 4, 718243 }, + { "q1brnkrb/p1pppppp/n7/1p6/P7/3P1P2/QPP1P1PP/1NBRNKRB w GDgd - 0 9", 5, 23143989 }, + { "q1brnkrb/p1pppppp/n7/1p6/P7/3P1P2/QPP1P1PP/1NBRNKRB w GDgd - 0 9", 6, 673147648 }, + { "qbnrb1kr/ppp1pp1p/3p4/2n3p1/1P6/6N1/P1PPPPPP/QBNRB1KR w HDhd - 2 9", 1, 29 }, + { "qbnrb1kr/ppp1pp1p/3p4/2n3p1/1P6/6N1/P1PPPPPP/QBNRB1KR w HDhd - 2 9", 2, 751 }, + { "qbnrb1kr/ppp1pp1p/3p4/2n3p1/1P6/6N1/P1PPPPPP/QBNRB1KR w HDhd - 2 9", 3, 23132 }, + { "qbnrb1kr/ppp1pp1p/3p4/2n3p1/1P6/6N1/P1PPPPPP/QBNRB1KR w HDhd - 2 9", 4, 610397 }, + { "qbnrb1kr/ppp1pp1p/3p4/2n3p1/1P6/6N1/P1PPPPPP/QBNRB1KR w HDhd - 2 9", 5, 19555214 }, + { "qbnrb1kr/ppp1pp1p/3p4/2n3p1/1P6/6N1/P1PPPPPP/QBNRB1KR w HDhd - 2 9", 6, 530475036 }, + { "q1rbbnkr/pppp1p2/2n3pp/2P1p3/3P4/8/PP1NPPPP/Q1RBBNKR w HChc - 2 9", 1, 29 }, + { "q1rbbnkr/pppp1p2/2n3pp/2P1p3/3P4/8/PP1NPPPP/Q1RBBNKR w HChc - 2 9", 2, 806 }, + { "q1rbbnkr/pppp1p2/2n3pp/2P1p3/3P4/8/PP1NPPPP/Q1RBBNKR w HChc - 2 9", 3, 24540 }, + { "q1rbbnkr/pppp1p2/2n3pp/2P1p3/3P4/8/PP1NPPPP/Q1RBBNKR w HChc - 2 9", 4, 687251 }, + { "q1rbbnkr/pppp1p2/2n3pp/2P1p3/3P4/8/PP1NPPPP/Q1RBBNKR w HChc - 2 9", 5, 21694330 }, + { "q1rbbnkr/pppp1p2/2n3pp/2P1p3/3P4/8/PP1NPPPP/Q1RBBNKR w HChc - 2 9", 6, 619907316 }, + { "q1r1bbkr/pnpp1ppp/2n1p3/1p6/2P2P2/2N1N3/PP1PP1PP/Q1R1BBKR w HChc - 2 9", 1, 32 }, + { "q1r1bbkr/pnpp1ppp/2n1p3/1p6/2P2P2/2N1N3/PP1PP1PP/Q1R1BBKR w HChc - 2 9", 2, 1017 }, + { "q1r1bbkr/pnpp1ppp/2n1p3/1p6/2P2P2/2N1N3/PP1PP1PP/Q1R1BBKR w HChc - 2 9", 3, 32098 }, + { "q1r1bbkr/pnpp1ppp/2n1p3/1p6/2P2P2/2N1N3/PP1PP1PP/Q1R1BBKR w HChc - 2 9", 4, 986028 }, + { "q1r1bbkr/pnpp1ppp/2n1p3/1p6/2P2P2/2N1N3/PP1PP1PP/Q1R1BBKR w HChc - 2 9", 5, 31204371 }, + { "q1r1bbkr/pnpp1ppp/2n1p3/1p6/2P2P2/2N1N3/PP1PP1PP/Q1R1BBKR w HChc - 2 9", 6, 958455898 }, + { "2rnbkrb/pqppppp1/1pn5/7p/2P5/P1R5/QP1PPPPP/1N1NBKRB w Ggc - 4 9", 1, 26 }, + { "2rnbkrb/pqppppp1/1pn5/7p/2P5/P1R5/QP1PPPPP/1N1NBKRB w Ggc - 4 9", 2, 625 }, + { "2rnbkrb/pqppppp1/1pn5/7p/2P5/P1R5/QP1PPPPP/1N1NBKRB w Ggc - 4 9", 3, 16506 }, + { "2rnbkrb/pqppppp1/1pn5/7p/2P5/P1R5/QP1PPPPP/1N1NBKRB w Ggc - 4 9", 4, 434635 }, + { "2rnbkrb/pqppppp1/1pn5/7p/2P5/P1R5/QP1PPPPP/1N1NBKRB w Ggc - 4 9", 5, 11856964 }, + { "2rnbkrb/pqppppp1/1pn5/7p/2P5/P1R5/QP1PPPPP/1N1NBKRB w Ggc - 4 9", 6, 336672890 }, + { "qbnr1kbr/p2ppppp/2p5/1p6/4n2P/P4N2/1PPP1PP1/QBNR1KBR w HDhd - 0 9", 1, 27 }, + { "qbnr1kbr/p2ppppp/2p5/1p6/4n2P/P4N2/1PPP1PP1/QBNR1KBR w HDhd - 0 9", 2, 885 }, + { "qbnr1kbr/p2ppppp/2p5/1p6/4n2P/P4N2/1PPP1PP1/QBNR1KBR w HDhd - 0 9", 3, 23828 }, + { "qbnr1kbr/p2ppppp/2p5/1p6/4n2P/P4N2/1PPP1PP1/QBNR1KBR w HDhd - 0 9", 4, 767273 }, + { "qbnr1kbr/p2ppppp/2p5/1p6/4n2P/P4N2/1PPP1PP1/QBNR1KBR w HDhd - 0 9", 5, 21855658 }, + { "qbnr1kbr/p2ppppp/2p5/1p6/4n2P/P4N2/1PPP1PP1/QBNR1KBR w HDhd - 0 9", 6, 706272554 }, + { "qnrbnk1r/pp1pp2p/5p2/2pbP1p1/3P4/1P6/P1P2PPP/QNRBNKBR w HChc - 0 9", 1, 26 }, + { "qnrbnk1r/pp1pp2p/5p2/2pbP1p1/3P4/1P6/P1P2PPP/QNRBNKBR w HChc - 0 9", 2, 954 }, + { "qnrbnk1r/pp1pp2p/5p2/2pbP1p1/3P4/1P6/P1P2PPP/QNRBNKBR w HChc - 0 9", 3, 24832 }, + { "qnrbnk1r/pp1pp2p/5p2/2pbP1p1/3P4/1P6/P1P2PPP/QNRBNKBR w HChc - 0 9", 4, 892456 }, + { "qnrbnk1r/pp1pp2p/5p2/2pbP1p1/3P4/1P6/P1P2PPP/QNRBNKBR w HChc - 0 9", 5, 24415089 }, + { "qnrbnk1r/pp1pp2p/5p2/2pbP1p1/3P4/1P6/P1P2PPP/QNRBNKBR w HChc - 0 9", 6, 866744329 }, + { "qnrnk1br/p1p2ppp/8/1pbpp3/8/PP2N3/1QPPPPPP/1NR1KBBR w HChc - 0 9", 1, 26 }, + { "qnrnk1br/p1p2ppp/8/1pbpp3/8/PP2N3/1QPPPPPP/1NR1KBBR w HChc - 0 9", 2, 783 }, + { "qnrnk1br/p1p2ppp/8/1pbpp3/8/PP2N3/1QPPPPPP/1NR1KBBR w HChc - 0 9", 3, 20828 }, + { "qnrnk1br/p1p2ppp/8/1pbpp3/8/PP2N3/1QPPPPPP/1NR1KBBR w HChc - 0 9", 4, 634267 }, + { "qnrnk1br/p1p2ppp/8/1pbpp3/8/PP2N3/1QPPPPPP/1NR1KBBR w HChc - 0 9", 5, 17477825 }, + { "qnrnk1br/p1p2ppp/8/1pbpp3/8/PP2N3/1QPPPPPP/1NR1KBBR w HChc - 0 9", 6, 539674275 }, + { "qnrnkrbb/Bpppp2p/6p1/5p2/5P2/3PP3/PPP3PP/QNRNKR1B w FCfc - 1 9", 1, 28 }, + { "qnrnkrbb/Bpppp2p/6p1/5p2/5P2/3PP3/PPP3PP/QNRNKR1B w FCfc - 1 9", 2, 908 }, + { "qnrnkrbb/Bpppp2p/6p1/5p2/5P2/3PP3/PPP3PP/QNRNKR1B w FCfc - 1 9", 3, 25730 }, + { "qnrnkrbb/Bpppp2p/6p1/5p2/5P2/3PP3/PPP3PP/QNRNKR1B w FCfc - 1 9", 4, 861240 }, + { "qnrnkrbb/Bpppp2p/6p1/5p2/5P2/3PP3/PPP3PP/QNRNKR1B w FCfc - 1 9", 5, 25251641 }, + { "qnrnkrbb/Bpppp2p/6p1/5p2/5P2/3PP3/PPP3PP/QNRNKR1B w FCfc - 1 9", 6, 869525254 }, + { "bbnqrn1r/ppppp2k/5p2/6pp/7P/1QP5/PP1PPPP1/B1N1RNKR w HE - 0 9", 1, 33 }, + { "bbnqrn1r/ppppp2k/5p2/6pp/7P/1QP5/PP1PPPP1/B1N1RNKR w HE - 0 9", 2, 643 }, + { "bbnqrn1r/ppppp2k/5p2/6pp/7P/1QP5/PP1PPPP1/B1N1RNKR w HE - 0 9", 3, 21790 }, + { "bbnqrn1r/ppppp2k/5p2/6pp/7P/1QP5/PP1PPPP1/B1N1RNKR w HE - 0 9", 4, 487109 }, + { "bbnqrn1r/ppppp2k/5p2/6pp/7P/1QP5/PP1PPPP1/B1N1RNKR w HE - 0 9", 5, 16693640 }, + { "bbnqrn1r/ppppp2k/5p2/6pp/7P/1QP5/PP1PPPP1/B1N1RNKR w HE - 0 9", 6, 410115900 }, + { "b1qbrnkr/ppp1pp2/2np4/6pp/4P3/2N4P/PPPP1PP1/BQ1BRNKR w HEhe - 0 9", 1, 28 }, + { "b1qbrnkr/ppp1pp2/2np4/6pp/4P3/2N4P/PPPP1PP1/BQ1BRNKR w HEhe - 0 9", 2, 837 }, + { "b1qbrnkr/ppp1pp2/2np4/6pp/4P3/2N4P/PPPP1PP1/BQ1BRNKR w HEhe - 0 9", 3, 24253 }, + { "b1qbrnkr/ppp1pp2/2np4/6pp/4P3/2N4P/PPPP1PP1/BQ1BRNKR w HEhe - 0 9", 4, 745617 }, + { "b1qbrnkr/ppp1pp2/2np4/6pp/4P3/2N4P/PPPP1PP1/BQ1BRNKR w HEhe - 0 9", 5, 22197063 }, + { "b1qbrnkr/ppp1pp2/2np4/6pp/4P3/2N4P/PPPP1PP1/BQ1BRNKR w HEhe - 0 9", 6, 696399065 }, + { "bnqr1bkr/pp1ppppp/2p5/4N3/5P2/P7/1PPPPnPP/BNQR1BKR w HDhd - 3 9", 1, 25 }, + { "bnqr1bkr/pp1ppppp/2p5/4N3/5P2/P7/1PPPPnPP/BNQR1BKR w HDhd - 3 9", 2, 579 }, + { "bnqr1bkr/pp1ppppp/2p5/4N3/5P2/P7/1PPPPnPP/BNQR1BKR w HDhd - 3 9", 3, 13909 }, + { "bnqr1bkr/pp1ppppp/2p5/4N3/5P2/P7/1PPPPnPP/BNQR1BKR w HDhd - 3 9", 4, 341444 }, + { "bnqr1bkr/pp1ppppp/2p5/4N3/5P2/P7/1PPPPnPP/BNQR1BKR w HDhd - 3 9", 5, 8601011 }, + { "bnqr1bkr/pp1ppppp/2p5/4N3/5P2/P7/1PPPPnPP/BNQR1BKR w HDhd - 3 9", 6, 225530258 }, + { "b1qr1krb/pp1ppppp/n2n4/8/2p5/2P3P1/PP1PPP1P/BNQRNKRB w GDgd - 0 9", 1, 28 }, + { "b1qr1krb/pp1ppppp/n2n4/8/2p5/2P3P1/PP1PPP1P/BNQRNKRB w GDgd - 0 9", 2, 707 }, + { "b1qr1krb/pp1ppppp/n2n4/8/2p5/2P3P1/PP1PPP1P/BNQRNKRB w GDgd - 0 9", 3, 19721 }, + { "b1qr1krb/pp1ppppp/n2n4/8/2p5/2P3P1/PP1PPP1P/BNQRNKRB w GDgd - 0 9", 4, 549506 }, + { "b1qr1krb/pp1ppppp/n2n4/8/2p5/2P3P1/PP1PPP1P/BNQRNKRB w GDgd - 0 9", 5, 15583376 }, + { "b1qr1krb/pp1ppppp/n2n4/8/2p5/2P3P1/PP1PPP1P/BNQRNKRB w GDgd - 0 9", 6, 468399900 }, + { "nbbqr1kr/1pppp1pp/8/p1n2p2/4P3/PN6/1PPPQPPP/1BB1RNKR w HEhe - 0 9", 1, 30 }, + { "nbbqr1kr/1pppp1pp/8/p1n2p2/4P3/PN6/1PPPQPPP/1BB1RNKR w HEhe - 0 9", 2, 745 }, + { "nbbqr1kr/1pppp1pp/8/p1n2p2/4P3/PN6/1PPPQPPP/1BB1RNKR w HEhe - 0 9", 3, 23416 }, + { "nbbqr1kr/1pppp1pp/8/p1n2p2/4P3/PN6/1PPPQPPP/1BB1RNKR w HEhe - 0 9", 4, 597858 }, + { "nbbqr1kr/1pppp1pp/8/p1n2p2/4P3/PN6/1PPPQPPP/1BB1RNKR w HEhe - 0 9", 5, 19478789 }, + { "nbbqr1kr/1pppp1pp/8/p1n2p2/4P3/PN6/1PPPQPPP/1BB1RNKR w HEhe - 0 9", 6, 515473678 }, + { "nqbbrn1r/p1pppp1k/1p4p1/7p/4P3/1R3B2/PPPP1PPP/NQB2NKR w H - 0 9", 1, 24 }, + { "nqbbrn1r/p1pppp1k/1p4p1/7p/4P3/1R3B2/PPPP1PPP/NQB2NKR w H - 0 9", 2, 504 }, + { "nqbbrn1r/p1pppp1k/1p4p1/7p/4P3/1R3B2/PPPP1PPP/NQB2NKR w H - 0 9", 3, 13512 }, + { "nqbbrn1r/p1pppp1k/1p4p1/7p/4P3/1R3B2/PPPP1PPP/NQB2NKR w H - 0 9", 4, 317355 }, + { "nqbbrn1r/p1pppp1k/1p4p1/7p/4P3/1R3B2/PPPP1PPP/NQB2NKR w H - 0 9", 5, 9002073 }, + { "nqbbrn1r/p1pppp1k/1p4p1/7p/4P3/1R3B2/PPPP1PPP/NQB2NKR w H - 0 9", 6, 228726497 }, + { "nqbr1bkr/p1p1ppp1/1p1n4/3pN2p/1P6/8/P1PPPPPP/NQBR1BKR w HDhd - 0 9", 1, 29 }, + { "nqbr1bkr/p1p1ppp1/1p1n4/3pN2p/1P6/8/P1PPPPPP/NQBR1BKR w HDhd - 0 9", 2, 898 }, + { "nqbr1bkr/p1p1ppp1/1p1n4/3pN2p/1P6/8/P1PPPPPP/NQBR1BKR w HDhd - 0 9", 3, 26532 }, + { "nqbr1bkr/p1p1ppp1/1p1n4/3pN2p/1P6/8/P1PPPPPP/NQBR1BKR w HDhd - 0 9", 4, 809605 }, + { "nqbr1bkr/p1p1ppp1/1p1n4/3pN2p/1P6/8/P1PPPPPP/NQBR1BKR w HDhd - 0 9", 5, 24703467 }, + { "nqbr1bkr/p1p1ppp1/1p1n4/3pN2p/1P6/8/P1PPPPPP/NQBR1BKR w HDhd - 0 9", 6, 757166494 }, + { "nqbrn1rb/pppp1kp1/5p1p/4p3/P4B2/3P2P1/1PP1PP1P/NQ1RNKRB w GD - 0 9", 1, 34 }, + { "nqbrn1rb/pppp1kp1/5p1p/4p3/P4B2/3P2P1/1PP1PP1P/NQ1RNKRB w GD - 0 9", 2, 671 }, + { "nqbrn1rb/pppp1kp1/5p1p/4p3/P4B2/3P2P1/1PP1PP1P/NQ1RNKRB w GD - 0 9", 3, 22332 }, + { "nqbrn1rb/pppp1kp1/5p1p/4p3/P4B2/3P2P1/1PP1PP1P/NQ1RNKRB w GD - 0 9", 4, 473110 }, + { "nqbrn1rb/pppp1kp1/5p1p/4p3/P4B2/3P2P1/1PP1PP1P/NQ1RNKRB w GD - 0 9", 5, 15556806 }, + { "nqbrn1rb/pppp1kp1/5p1p/4p3/P4B2/3P2P1/1PP1PP1P/NQ1RNKRB w GD - 0 9", 6, 353235120 }, + { "nb1r1nkr/ppp1ppp1/2bp4/7p/3P2qP/P6R/1PP1PPP1/NBQRBNK1 w Dhd - 1 9", 1, 38 }, + { "nb1r1nkr/ppp1ppp1/2bp4/7p/3P2qP/P6R/1PP1PPP1/NBQRBNK1 w Dhd - 1 9", 2, 1691 }, + { "nb1r1nkr/ppp1ppp1/2bp4/7p/3P2qP/P6R/1PP1PPP1/NBQRBNK1 w Dhd - 1 9", 3, 60060 }, + { "nb1r1nkr/ppp1ppp1/2bp4/7p/3P2qP/P6R/1PP1PPP1/NBQRBNK1 w Dhd - 1 9", 4, 2526992 }, + { "nb1r1nkr/ppp1ppp1/2bp4/7p/3P2qP/P6R/1PP1PPP1/NBQRBNK1 w Dhd - 1 9", 5, 88557078 }, + { "nb1r1nkr/ppp1ppp1/2bp4/7p/3P2qP/P6R/1PP1PPP1/NBQRBNK1 w Dhd - 1 9", 6, 3589649998 }, + { "n1rbbnkr/1p1pp1pp/p7/2p1qp2/1B3P2/3P4/PPP1P1PP/NQRB1NKR w HChc - 0 9", 1, 24 }, + { "n1rbbnkr/1p1pp1pp/p7/2p1qp2/1B3P2/3P4/PPP1P1PP/NQRB1NKR w HChc - 0 9", 2, 913 }, + { "n1rbbnkr/1p1pp1pp/p7/2p1qp2/1B3P2/3P4/PPP1P1PP/NQRB1NKR w HChc - 0 9", 3, 21595 }, + { "n1rbbnkr/1p1pp1pp/p7/2p1qp2/1B3P2/3P4/PPP1P1PP/NQRB1NKR w HChc - 0 9", 4, 807544 }, + { "n1rbbnkr/1p1pp1pp/p7/2p1qp2/1B3P2/3P4/PPP1P1PP/NQRB1NKR w HChc - 0 9", 5, 19866918 }, + { "n1rbbnkr/1p1pp1pp/p7/2p1qp2/1B3P2/3P4/PPP1P1PP/NQRB1NKR w HChc - 0 9", 6, 737239330 }, + { "nqrnbbkr/p2p1p1p/1pp5/1B2p1p1/1P3P2/4P3/P1PP2PP/NQRNB1KR w HChc - 0 9", 1, 33 }, + { "nqrnbbkr/p2p1p1p/1pp5/1B2p1p1/1P3P2/4P3/P1PP2PP/NQRNB1KR w HChc - 0 9", 2, 913 }, + { "nqrnbbkr/p2p1p1p/1pp5/1B2p1p1/1P3P2/4P3/P1PP2PP/NQRNB1KR w HChc - 0 9", 3, 30159 }, + { "nqrnbbkr/p2p1p1p/1pp5/1B2p1p1/1P3P2/4P3/P1PP2PP/NQRNB1KR w HChc - 0 9", 4, 843874 }, + { "nqrnbbkr/p2p1p1p/1pp5/1B2p1p1/1P3P2/4P3/P1PP2PP/NQRNB1KR w HChc - 0 9", 5, 28053260 }, + { "nqrnbbkr/p2p1p1p/1pp5/1B2p1p1/1P3P2/4P3/P1PP2PP/NQRNB1KR w HChc - 0 9", 6, 804687975 }, + { "nqr1bkrb/ppp1pp2/2np2p1/P6p/8/2P4P/1P1PPPP1/NQRNBKRB w GCgc - 0 9", 1, 24 }, + { "nqr1bkrb/ppp1pp2/2np2p1/P6p/8/2P4P/1P1PPPP1/NQRNBKRB w GCgc - 0 9", 2, 623 }, + { "nqr1bkrb/ppp1pp2/2np2p1/P6p/8/2P4P/1P1PPPP1/NQRNBKRB w GCgc - 0 9", 3, 16569 }, + { "nqr1bkrb/ppp1pp2/2np2p1/P6p/8/2P4P/1P1PPPP1/NQRNBKRB w GCgc - 0 9", 4, 442531 }, + { "nqr1bkrb/ppp1pp2/2np2p1/P6p/8/2P4P/1P1PPPP1/NQRNBKRB w GCgc - 0 9", 5, 12681936 }, + { "nqr1bkrb/ppp1pp2/2np2p1/P6p/8/2P4P/1P1PPPP1/NQRNBKRB w GCgc - 0 9", 6, 351623879 }, + { "nb1rnkbr/pqppppp1/1p5p/8/1PP4P/8/P2PPPP1/NBQRNKBR w HDhd - 1 9", 1, 31 }, + { "nb1rnkbr/pqppppp1/1p5p/8/1PP4P/8/P2PPPP1/NBQRNKBR w HDhd - 1 9", 2, 798 }, + { "nb1rnkbr/pqppppp1/1p5p/8/1PP4P/8/P2PPPP1/NBQRNKBR w HDhd - 1 9", 3, 24862 }, + { "nb1rnkbr/pqppppp1/1p5p/8/1PP4P/8/P2PPPP1/NBQRNKBR w HDhd - 1 9", 4, 694386 }, + { "nb1rnkbr/pqppppp1/1p5p/8/1PP4P/8/P2PPPP1/NBQRNKBR w HDhd - 1 9", 5, 22616076 }, + { "nb1rnkbr/pqppppp1/1p5p/8/1PP4P/8/P2PPPP1/NBQRNKBR w HDhd - 1 9", 6, 666227466 }, + { "nqrbnkbr/2p1p1pp/3p4/pp3p2/6PP/3P1N2/PPP1PP2/NQRB1KBR w HChc - 0 9", 1, 24 }, + { "nqrbnkbr/2p1p1pp/3p4/pp3p2/6PP/3P1N2/PPP1PP2/NQRB1KBR w HChc - 0 9", 2, 590 }, + { "nqrbnkbr/2p1p1pp/3p4/pp3p2/6PP/3P1N2/PPP1PP2/NQRB1KBR w HChc - 0 9", 3, 14409 }, + { "nqrbnkbr/2p1p1pp/3p4/pp3p2/6PP/3P1N2/PPP1PP2/NQRB1KBR w HChc - 0 9", 4, 383690 }, + { "nqrbnkbr/2p1p1pp/3p4/pp3p2/6PP/3P1N2/PPP1PP2/NQRB1KBR w HChc - 0 9", 5, 9698432 }, + { "nqrbnkbr/2p1p1pp/3p4/pp3p2/6PP/3P1N2/PPP1PP2/NQRB1KBR w HChc - 0 9", 6, 274064911 }, + { "nqrnkbbr/pp1p1p1p/4p1p1/1p6/8/5P1P/P1PPP1P1/NQRNKBBR w HChc - 0 9", 1, 30 }, + { "nqrnkbbr/pp1p1p1p/4p1p1/1p6/8/5P1P/P1PPP1P1/NQRNKBBR w HChc - 0 9", 2, 1032 }, + { "nqrnkbbr/pp1p1p1p/4p1p1/1p6/8/5P1P/P1PPP1P1/NQRNKBBR w HChc - 0 9", 3, 31481 }, + { "nqrnkbbr/pp1p1p1p/4p1p1/1p6/8/5P1P/P1PPP1P1/NQRNKBBR w HChc - 0 9", 4, 1098116 }, + { "nqrnkbbr/pp1p1p1p/4p1p1/1p6/8/5P1P/P1PPP1P1/NQRNKBBR w HChc - 0 9", 5, 34914919 }, + { "nqrnkbbr/pp1p1p1p/4p1p1/1p6/8/5P1P/P1PPP1P1/NQRNKBBR w HChc - 0 9", 6, 1233362066 }, + { "nqrnkrbb/p2ppppp/1p6/2p5/2P3P1/5P2/PP1PPN1P/NQR1KRBB w FCfc - 1 9", 1, 30 }, + { "nqrnkrbb/p2ppppp/1p6/2p5/2P3P1/5P2/PP1PPN1P/NQR1KRBB w FCfc - 1 9", 2, 775 }, + { "nqrnkrbb/p2ppppp/1p6/2p5/2P3P1/5P2/PP1PPN1P/NQR1KRBB w FCfc - 1 9", 3, 23958 }, + { "nqrnkrbb/p2ppppp/1p6/2p5/2P3P1/5P2/PP1PPN1P/NQR1KRBB w FCfc - 1 9", 4, 668000 }, + { "nqrnkrbb/p2ppppp/1p6/2p5/2P3P1/5P2/PP1PPN1P/NQR1KRBB w FCfc - 1 9", 5, 21141738 }, + { "nqrnkrbb/p2ppppp/1p6/2p5/2P3P1/5P2/PP1PPN1P/NQR1KRBB w FCfc - 1 9", 6, 621142773 }, + { "bbnrqrk1/pp2pppp/4n3/2pp4/P7/1N5P/BPPPPPP1/B2RQNKR w HD - 2 9", 1, 23 }, + { "bbnrqrk1/pp2pppp/4n3/2pp4/P7/1N5P/BPPPPPP1/B2RQNKR w HD - 2 9", 2, 708 }, + { "bbnrqrk1/pp2pppp/4n3/2pp4/P7/1N5P/BPPPPPP1/B2RQNKR w HD - 2 9", 3, 17164 }, + { "bbnrqrk1/pp2pppp/4n3/2pp4/P7/1N5P/BPPPPPP1/B2RQNKR w HD - 2 9", 4, 554089 }, + { "bbnrqrk1/pp2pppp/4n3/2pp4/P7/1N5P/BPPPPPP1/B2RQNKR w HD - 2 9", 5, 14343443 }, + { "bbnrqrk1/pp2pppp/4n3/2pp4/P7/1N5P/BPPPPPP1/B2RQNKR w HD - 2 9", 6, 481405144 }, + { "bnr1qnkr/p1pp1p1p/1p4p1/4p1b1/2P1P3/1P6/PB1P1PPP/1NRBQNKR w HChc - 1 9", 1, 30 }, + { "bnr1qnkr/p1pp1p1p/1p4p1/4p1b1/2P1P3/1P6/PB1P1PPP/1NRBQNKR w HChc - 1 9", 2, 931 }, + { "bnr1qnkr/p1pp1p1p/1p4p1/4p1b1/2P1P3/1P6/PB1P1PPP/1NRBQNKR w HChc - 1 9", 3, 29249 }, + { "bnr1qnkr/p1pp1p1p/1p4p1/4p1b1/2P1P3/1P6/PB1P1PPP/1NRBQNKR w HChc - 1 9", 4, 921746 }, + { "bnr1qnkr/p1pp1p1p/1p4p1/4p1b1/2P1P3/1P6/PB1P1PPP/1NRBQNKR w HChc - 1 9", 5, 30026687 }, + { "bnr1qnkr/p1pp1p1p/1p4p1/4p1b1/2P1P3/1P6/PB1P1PPP/1NRBQNKR w HChc - 1 9", 6, 968109774 }, + { "b1rqnbkr/ppp1ppp1/3p3p/2n5/P3P3/2NP4/1PP2PPP/B1RQNBKR w HChc - 0 9", 1, 24 }, + { "b1rqnbkr/ppp1ppp1/3p3p/2n5/P3P3/2NP4/1PP2PPP/B1RQNBKR w HChc - 0 9", 2, 596 }, + { "b1rqnbkr/ppp1ppp1/3p3p/2n5/P3P3/2NP4/1PP2PPP/B1RQNBKR w HChc - 0 9", 3, 15533 }, + { "b1rqnbkr/ppp1ppp1/3p3p/2n5/P3P3/2NP4/1PP2PPP/B1RQNBKR w HChc - 0 9", 4, 396123 }, + { "b1rqnbkr/ppp1ppp1/3p3p/2n5/P3P3/2NP4/1PP2PPP/B1RQNBKR w HChc - 0 9", 5, 11099382 }, + { "b1rqnbkr/ppp1ppp1/3p3p/2n5/P3P3/2NP4/1PP2PPP/B1RQNBKR w HChc - 0 9", 6, 294180723 }, + { "bnrqnr1b/pp1pkppp/2p1p3/P7/2P5/7P/1P1PPPP1/BNRQNKRB w GC - 0 9", 1, 24 }, + { "bnrqnr1b/pp1pkppp/2p1p3/P7/2P5/7P/1P1PPPP1/BNRQNKRB w GC - 0 9", 2, 572 }, + { "bnrqnr1b/pp1pkppp/2p1p3/P7/2P5/7P/1P1PPPP1/BNRQNKRB w GC - 0 9", 3, 15293 }, + { "bnrqnr1b/pp1pkppp/2p1p3/P7/2P5/7P/1P1PPPP1/BNRQNKRB w GC - 0 9", 4, 390903 }, + { "bnrqnr1b/pp1pkppp/2p1p3/P7/2P5/7P/1P1PPPP1/BNRQNKRB w GC - 0 9", 5, 11208688 }, + { "bnrqnr1b/pp1pkppp/2p1p3/P7/2P5/7P/1P1PPPP1/BNRQNKRB w GC - 0 9", 6, 302955778 }, + { "n1brq1kr/bppppppp/p7/8/4P1Pn/8/PPPP1P2/NBBRQNKR w HDhd - 0 9", 1, 20 }, + { "n1brq1kr/bppppppp/p7/8/4P1Pn/8/PPPP1P2/NBBRQNKR w HDhd - 0 9", 2, 570 }, + { "n1brq1kr/bppppppp/p7/8/4P1Pn/8/PPPP1P2/NBBRQNKR w HDhd - 0 9", 3, 13139 }, + { "n1brq1kr/bppppppp/p7/8/4P1Pn/8/PPPP1P2/NBBRQNKR w HDhd - 0 9", 4, 371247 }, + { "n1brq1kr/bppppppp/p7/8/4P1Pn/8/PPPP1P2/NBBRQNKR w HDhd - 0 9", 5, 9919113 }, + { "n1brq1kr/bppppppp/p7/8/4P1Pn/8/PPPP1P2/NBBRQNKR w HDhd - 0 9", 6, 284592289 }, + { "1rbbqnkr/ppn1ppp1/3p3p/2p5/3P4/1N4P1/PPPBPP1P/1R1BQNKR w HBhb - 0 9", 1, 29 }, + { "1rbbqnkr/ppn1ppp1/3p3p/2p5/3P4/1N4P1/PPPBPP1P/1R1BQNKR w HBhb - 0 9", 2, 1009 }, + { "1rbbqnkr/ppn1ppp1/3p3p/2p5/3P4/1N4P1/PPPBPP1P/1R1BQNKR w HBhb - 0 9", 3, 29547 }, + { "1rbbqnkr/ppn1ppp1/3p3p/2p5/3P4/1N4P1/PPPBPP1P/1R1BQNKR w HBhb - 0 9", 4, 1040816 }, + { "1rbbqnkr/ppn1ppp1/3p3p/2p5/3P4/1N4P1/PPPBPP1P/1R1BQNKR w HBhb - 0 9", 5, 31059587 }, + { "1rbbqnkr/ppn1ppp1/3p3p/2p5/3P4/1N4P1/PPPBPP1P/1R1BQNKR w HBhb - 0 9", 6, 1111986835 }, + { "nrbq2kr/ppppppb1/5n1p/5Pp1/8/P5P1/1PPPP2P/NRBQNBKR w HBhb - 1 9", 1, 20 }, + { "nrbq2kr/ppppppb1/5n1p/5Pp1/8/P5P1/1PPPP2P/NRBQNBKR w HBhb - 1 9", 2, 520 }, + { "nrbq2kr/ppppppb1/5n1p/5Pp1/8/P5P1/1PPPP2P/NRBQNBKR w HBhb - 1 9", 3, 11745 }, + { "nrbq2kr/ppppppb1/5n1p/5Pp1/8/P5P1/1PPPP2P/NRBQNBKR w HBhb - 1 9", 4, 316332 }, + { "nrbq2kr/ppppppb1/5n1p/5Pp1/8/P5P1/1PPPP2P/NRBQNBKR w HBhb - 1 9", 5, 7809837 }, + { "nrbq2kr/ppppppb1/5n1p/5Pp1/8/P5P1/1PPPP2P/NRBQNBKR w HBhb - 1 9", 6, 216997152 }, + { "nrb1nkrb/pp3ppp/1qBpp3/2p5/8/P5P1/1PPPPP1P/NRBQNKR1 w GBgb - 2 9", 1, 32 }, + { "nrb1nkrb/pp3ppp/1qBpp3/2p5/8/P5P1/1PPPPP1P/NRBQNKR1 w GBgb - 2 9", 2, 850 }, + { "nrb1nkrb/pp3ppp/1qBpp3/2p5/8/P5P1/1PPPPP1P/NRBQNKR1 w GBgb - 2 9", 3, 25642 }, + { "nrb1nkrb/pp3ppp/1qBpp3/2p5/8/P5P1/1PPPPP1P/NRBQNKR1 w GBgb - 2 9", 4, 734088 }, + { "nrb1nkrb/pp3ppp/1qBpp3/2p5/8/P5P1/1PPPPP1P/NRBQNKR1 w GBgb - 2 9", 5, 21981567 }, + { "nrb1nkrb/pp3ppp/1qBpp3/2p5/8/P5P1/1PPPPP1P/NRBQNKR1 w GBgb - 2 9", 6, 664886187 }, + { "1br1bnkr/ppqppp1p/1np3p1/8/1PP4P/4N3/P2PPPP1/NBRQB1KR w HChc - 1 9", 1, 32 }, + { "1br1bnkr/ppqppp1p/1np3p1/8/1PP4P/4N3/P2PPPP1/NBRQB1KR w HChc - 1 9", 2, 798 }, + { "1br1bnkr/ppqppp1p/1np3p1/8/1PP4P/4N3/P2PPPP1/NBRQB1KR w HChc - 1 9", 3, 24765 }, + { "1br1bnkr/ppqppp1p/1np3p1/8/1PP4P/4N3/P2PPPP1/NBRQB1KR w HChc - 1 9", 4, 691488 }, + { "1br1bnkr/ppqppp1p/1np3p1/8/1PP4P/4N3/P2PPPP1/NBRQB1KR w HChc - 1 9", 5, 22076141 }, + { "1br1bnkr/ppqppp1p/1np3p1/8/1PP4P/4N3/P2PPPP1/NBRQB1KR w HChc - 1 9", 6, 670296871 }, + { "nrqbb1kr/1p1pp1pp/2p3n1/p4p2/3PP3/P5N1/1PP2PPP/NRQBB1KR w HBhb - 0 9", 1, 32 }, + { "nrqbb1kr/1p1pp1pp/2p3n1/p4p2/3PP3/P5N1/1PP2PPP/NRQBB1KR w HBhb - 0 9", 2, 791 }, + { "nrqbb1kr/1p1pp1pp/2p3n1/p4p2/3PP3/P5N1/1PP2PPP/NRQBB1KR w HBhb - 0 9", 3, 26213 }, + { "nrqbb1kr/1p1pp1pp/2p3n1/p4p2/3PP3/P5N1/1PP2PPP/NRQBB1KR w HBhb - 0 9", 4, 684890 }, + { "nrqbb1kr/1p1pp1pp/2p3n1/p4p2/3PP3/P5N1/1PP2PPP/NRQBB1KR w HBhb - 0 9", 5, 23239122 }, + { "nrqbb1kr/1p1pp1pp/2p3n1/p4p2/3PP3/P5N1/1PP2PPP/NRQBB1KR w HBhb - 0 9", 6, 634260266 }, + { "nrqn1bkr/ppppp1pp/4b3/8/4P1p1/5P2/PPPP3P/NRQNBBKR w HBhb - 0 9", 1, 29 }, + { "nrqn1bkr/ppppp1pp/4b3/8/4P1p1/5P2/PPPP3P/NRQNBBKR w HBhb - 0 9", 2, 687 }, + { "nrqn1bkr/ppppp1pp/4b3/8/4P1p1/5P2/PPPP3P/NRQNBBKR w HBhb - 0 9", 3, 20223 }, + { "nrqn1bkr/ppppp1pp/4b3/8/4P1p1/5P2/PPPP3P/NRQNBBKR w HBhb - 0 9", 4, 506088 }, + { "nrqn1bkr/ppppp1pp/4b3/8/4P1p1/5P2/PPPP3P/NRQNBBKR w HBhb - 0 9", 5, 15236287 }, + { "nrqn1bkr/ppppp1pp/4b3/8/4P1p1/5P2/PPPP3P/NRQNBBKR w HBhb - 0 9", 6, 398759980 }, + { "nrqnbrkb/pppp1p2/4p2p/3B2p1/8/1P4P1/PQPPPP1P/NR1NBKR1 w GB - 0 9", 1, 37 }, + { "nrqnbrkb/pppp1p2/4p2p/3B2p1/8/1P4P1/PQPPPP1P/NR1NBKR1 w GB - 0 9", 2, 764 }, + { "nrqnbrkb/pppp1p2/4p2p/3B2p1/8/1P4P1/PQPPPP1P/NR1NBKR1 w GB - 0 9", 3, 27073 }, + { "nrqnbrkb/pppp1p2/4p2p/3B2p1/8/1P4P1/PQPPPP1P/NR1NBKR1 w GB - 0 9", 4, 610950 }, + { "nrqnbrkb/pppp1p2/4p2p/3B2p1/8/1P4P1/PQPPPP1P/NR1NBKR1 w GB - 0 9", 5, 21284835 }, + { "nrqnbrkb/pppp1p2/4p2p/3B2p1/8/1P4P1/PQPPPP1P/NR1NBKR1 w GB - 0 9", 6, 514864869 }, + { "nbrq1kbr/Bp3ppp/2pnp3/3p4/5P2/2P4P/PP1PP1P1/NBRQNK1R w HChc - 0 9", 1, 40 }, + { "nbrq1kbr/Bp3ppp/2pnp3/3p4/5P2/2P4P/PP1PP1P1/NBRQNK1R w HChc - 0 9", 2, 1271 }, + { "nbrq1kbr/Bp3ppp/2pnp3/3p4/5P2/2P4P/PP1PP1P1/NBRQNK1R w HChc - 0 9", 3, 48022 }, + { "nbrq1kbr/Bp3ppp/2pnp3/3p4/5P2/2P4P/PP1PP1P1/NBRQNK1R w HChc - 0 9", 4, 1547741 }, + { "nbrq1kbr/Bp3ppp/2pnp3/3p4/5P2/2P4P/PP1PP1P1/NBRQNK1R w HChc - 0 9", 5, 56588117 }, + { "nbrq1kbr/Bp3ppp/2pnp3/3p4/5P2/2P4P/PP1PP1P1/NBRQNK1R w HChc - 0 9", 6, 1850696281 }, + { "nrqbnkbr/1p2ppp1/p1p4p/3p4/1P6/8/PQPPPPPP/1RNBNKBR w HBhb - 0 9", 1, 28 }, + { "nrqbnkbr/1p2ppp1/p1p4p/3p4/1P6/8/PQPPPPPP/1RNBNKBR w HBhb - 0 9", 2, 757 }, + { "nrqbnkbr/1p2ppp1/p1p4p/3p4/1P6/8/PQPPPPPP/1RNBNKBR w HBhb - 0 9", 3, 23135 }, + { "nrqbnkbr/1p2ppp1/p1p4p/3p4/1P6/8/PQPPPPPP/1RNBNKBR w HBhb - 0 9", 4, 668025 }, + { "nrqbnkbr/1p2ppp1/p1p4p/3p4/1P6/8/PQPPPPPP/1RNBNKBR w HBhb - 0 9", 5, 21427496 }, + { "nrqbnkbr/1p2ppp1/p1p4p/3p4/1P6/8/PQPPPPPP/1RNBNKBR w HBhb - 0 9", 6, 650939962 }, + { "nrqn1bbr/2ppkppp/4p3/pB6/8/2P1P3/PP1P1PPP/NRQNK1BR w HB - 1 9", 1, 27 }, + { "nrqn1bbr/2ppkppp/4p3/pB6/8/2P1P3/PP1P1PPP/NRQNK1BR w HB - 1 9", 2, 642 }, + { "nrqn1bbr/2ppkppp/4p3/pB6/8/2P1P3/PP1P1PPP/NRQNK1BR w HB - 1 9", 3, 17096 }, + { "nrqn1bbr/2ppkppp/4p3/pB6/8/2P1P3/PP1P1PPP/NRQNK1BR w HB - 1 9", 4, 442653 }, + { "nrqn1bbr/2ppkppp/4p3/pB6/8/2P1P3/PP1P1PPP/NRQNK1BR w HB - 1 9", 5, 11872805 }, + { "nrqn1bbr/2ppkppp/4p3/pB6/8/2P1P3/PP1P1PPP/NRQNK1BR w HB - 1 9", 6, 327545120 }, + { "nrqnkrb1/p1ppp2p/1p4p1/4bp2/4PP1P/4N3/PPPP2P1/NRQ1KRBB w FBfb - 1 9", 1, 27 }, + { "nrqnkrb1/p1ppp2p/1p4p1/4bp2/4PP1P/4N3/PPPP2P1/NRQ1KRBB w FBfb - 1 9", 2, 958 }, + { "nrqnkrb1/p1ppp2p/1p4p1/4bp2/4PP1P/4N3/PPPP2P1/NRQ1KRBB w FBfb - 1 9", 3, 27397 }, + { "nrqnkrb1/p1ppp2p/1p4p1/4bp2/4PP1P/4N3/PPPP2P1/NRQ1KRBB w FBfb - 1 9", 4, 960350 }, + { "nrqnkrb1/p1ppp2p/1p4p1/4bp2/4PP1P/4N3/PPPP2P1/NRQ1KRBB w FBfb - 1 9", 5, 28520172 }, + { "nrqnkrb1/p1ppp2p/1p4p1/4bp2/4PP1P/4N3/PPPP2P1/NRQ1KRBB w FBfb - 1 9", 6, 995356563 }, + { "1bnrnqkr/pbpp2pp/8/1p2pp2/P6P/3P1N2/1PP1PPP1/BBNR1QKR w HDhd - 0 9", 1, 27 }, + { "1bnrnqkr/pbpp2pp/8/1p2pp2/P6P/3P1N2/1PP1PPP1/BBNR1QKR w HDhd - 0 9", 2, 859 }, + { "1bnrnqkr/pbpp2pp/8/1p2pp2/P6P/3P1N2/1PP1PPP1/BBNR1QKR w HDhd - 0 9", 3, 23475 }, + { "1bnrnqkr/pbpp2pp/8/1p2pp2/P6P/3P1N2/1PP1PPP1/BBNR1QKR w HDhd - 0 9", 4, 773232 }, + { "1bnrnqkr/pbpp2pp/8/1p2pp2/P6P/3P1N2/1PP1PPP1/BBNR1QKR w HDhd - 0 9", 5, 21581178 }, + { "1bnrnqkr/pbpp2pp/8/1p2pp2/P6P/3P1N2/1PP1PPP1/BBNR1QKR w HDhd - 0 9", 6, 732696327 }, + { "b1rbnqkr/1pp1ppp1/2n4p/p2p4/5P2/1PBP4/P1P1P1PP/1NRBNQKR w HChc - 0 9", 1, 26 }, + { "b1rbnqkr/1pp1ppp1/2n4p/p2p4/5P2/1PBP4/P1P1P1PP/1NRBNQKR w HChc - 0 9", 2, 545 }, + { "b1rbnqkr/1pp1ppp1/2n4p/p2p4/5P2/1PBP4/P1P1P1PP/1NRBNQKR w HChc - 0 9", 3, 14817 }, + { "b1rbnqkr/1pp1ppp1/2n4p/p2p4/5P2/1PBP4/P1P1P1PP/1NRBNQKR w HChc - 0 9", 4, 336470 }, + { "b1rbnqkr/1pp1ppp1/2n4p/p2p4/5P2/1PBP4/P1P1P1PP/1NRBNQKR w HChc - 0 9", 5, 9537260 }, + { "b1rbnqkr/1pp1ppp1/2n4p/p2p4/5P2/1PBP4/P1P1P1PP/1NRBNQKR w HChc - 0 9", 6, 233549184 }, + { "1nrnqbkr/p1pppppp/1p6/8/2b2P2/P1N5/1PP1P1PP/BNR1QBKR w HChc - 2 9", 1, 24 }, + { "1nrnqbkr/p1pppppp/1p6/8/2b2P2/P1N5/1PP1P1PP/BNR1QBKR w HChc - 2 9", 2, 668 }, + { "1nrnqbkr/p1pppppp/1p6/8/2b2P2/P1N5/1PP1P1PP/BNR1QBKR w HChc - 2 9", 3, 17716 }, + { "1nrnqbkr/p1pppppp/1p6/8/2b2P2/P1N5/1PP1P1PP/BNR1QBKR w HChc - 2 9", 4, 494866 }, + { "1nrnqbkr/p1pppppp/1p6/8/2b2P2/P1N5/1PP1P1PP/BNR1QBKR w HChc - 2 9", 5, 14216070 }, + { "1nrnqbkr/p1pppppp/1p6/8/2b2P2/P1N5/1PP1P1PP/BNR1QBKR w HChc - 2 9", 6, 406225409 }, + { "1nrnqkrb/2ppp1pp/p7/1p3p2/5P2/N5K1/PPPPP2P/B1RNQ1RB w gc - 0 9", 1, 33 }, + { "1nrnqkrb/2ppp1pp/p7/1p3p2/5P2/N5K1/PPPPP2P/B1RNQ1RB w gc - 0 9", 2, 725 }, + { "1nrnqkrb/2ppp1pp/p7/1p3p2/5P2/N5K1/PPPPP2P/B1RNQ1RB w gc - 0 9", 3, 23572 }, + { "1nrnqkrb/2ppp1pp/p7/1p3p2/5P2/N5K1/PPPPP2P/B1RNQ1RB w gc - 0 9", 4, 559823 }, + { "1nrnqkrb/2ppp1pp/p7/1p3p2/5P2/N5K1/PPPPP2P/B1RNQ1RB w gc - 0 9", 5, 18547476 }, + { "1nrnqkrb/2ppp1pp/p7/1p3p2/5P2/N5K1/PPPPP2P/B1RNQ1RB w gc - 0 9", 6, 471443091 }, + { "nbbr1qkr/p1pppppp/8/1p1n4/3P4/1N3PP1/PPP1P2P/1BBRNQKR w HDhd - 1 9", 1, 28 }, + { "nbbr1qkr/p1pppppp/8/1p1n4/3P4/1N3PP1/PPP1P2P/1BBRNQKR w HDhd - 1 9", 2, 698 }, + { "nbbr1qkr/p1pppppp/8/1p1n4/3P4/1N3PP1/PPP1P2P/1BBRNQKR w HDhd - 1 9", 3, 20527 }, + { "nbbr1qkr/p1pppppp/8/1p1n4/3P4/1N3PP1/PPP1P2P/1BBRNQKR w HDhd - 1 9", 4, 539625 }, + { "nbbr1qkr/p1pppppp/8/1p1n4/3P4/1N3PP1/PPP1P2P/1BBRNQKR w HDhd - 1 9", 5, 16555068 }, + { "nbbr1qkr/p1pppppp/8/1p1n4/3P4/1N3PP1/PPP1P2P/1BBRNQKR w HDhd - 1 9", 6, 458045505 }, + { "1rbbnqkr/1pnppp1p/p5p1/2p5/2P4P/5P2/PP1PP1PR/NRBBNQK1 w Bhb - 1 9", 1, 24 }, + { "1rbbnqkr/1pnppp1p/p5p1/2p5/2P4P/5P2/PP1PP1PR/NRBBNQK1 w Bhb - 1 9", 2, 554 }, + { "1rbbnqkr/1pnppp1p/p5p1/2p5/2P4P/5P2/PP1PP1PR/NRBBNQK1 w Bhb - 1 9", 3, 14221 }, + { "1rbbnqkr/1pnppp1p/p5p1/2p5/2P4P/5P2/PP1PP1PR/NRBBNQK1 w Bhb - 1 9", 4, 362516 }, + { "1rbbnqkr/1pnppp1p/p5p1/2p5/2P4P/5P2/PP1PP1PR/NRBBNQK1 w Bhb - 1 9", 5, 9863080 }, + { "1rbbnqkr/1pnppp1p/p5p1/2p5/2P4P/5P2/PP1PP1PR/NRBBNQK1 w Bhb - 1 9", 6, 269284081 }, + { "nrb1qbkr/2pppppp/2n5/p7/2p5/4P3/PPNP1PPP/1RBNQBKR w HBhb - 0 9", 1, 23 }, + { "nrb1qbkr/2pppppp/2n5/p7/2p5/4P3/PPNP1PPP/1RBNQBKR w HBhb - 0 9", 2, 618 }, + { "nrb1qbkr/2pppppp/2n5/p7/2p5/4P3/PPNP1PPP/1RBNQBKR w HBhb - 0 9", 3, 15572 }, + { "nrb1qbkr/2pppppp/2n5/p7/2p5/4P3/PPNP1PPP/1RBNQBKR w HBhb - 0 9", 4, 443718 }, + { "nrb1qbkr/2pppppp/2n5/p7/2p5/4P3/PPNP1PPP/1RBNQBKR w HBhb - 0 9", 5, 12044358 }, + { "nrb1qbkr/2pppppp/2n5/p7/2p5/4P3/PPNP1PPP/1RBNQBKR w HBhb - 0 9", 6, 360311412 }, + { "nrb1qkrb/2ppppp1/p3n3/1p1B3p/2P5/6P1/PP1PPPRP/NRBNQK2 w Bgb - 2 9", 1, 27 }, + { "nrb1qkrb/2ppppp1/p3n3/1p1B3p/2P5/6P1/PP1PPPRP/NRBNQK2 w Bgb - 2 9", 2, 593 }, + { "nrb1qkrb/2ppppp1/p3n3/1p1B3p/2P5/6P1/PP1PPPRP/NRBNQK2 w Bgb - 2 9", 3, 16770 }, + { "nrb1qkrb/2ppppp1/p3n3/1p1B3p/2P5/6P1/PP1PPPRP/NRBNQK2 w Bgb - 2 9", 4, 401967 }, + { "nrb1qkrb/2ppppp1/p3n3/1p1B3p/2P5/6P1/PP1PPPRP/NRBNQK2 w Bgb - 2 9", 5, 11806808 }, + { "nrb1qkrb/2ppppp1/p3n3/1p1B3p/2P5/6P1/PP1PPPRP/NRBNQK2 w Bgb - 2 9", 6, 303338935 }, + { "nbrn1qkr/ppp1pp2/3p2p1/3Q3P/b7/8/PPPPPP1P/NBRNB1KR w HChc - 2 9", 1, 39 }, + { "nbrn1qkr/ppp1pp2/3p2p1/3Q3P/b7/8/PPPPPP1P/NBRNB1KR w HChc - 2 9", 2, 1056 }, + { "nbrn1qkr/ppp1pp2/3p2p1/3Q3P/b7/8/PPPPPP1P/NBRNB1KR w HChc - 2 9", 3, 40157 }, + { "nbrn1qkr/ppp1pp2/3p2p1/3Q3P/b7/8/PPPPPP1P/NBRNB1KR w HChc - 2 9", 4, 1133446 }, + { "nbrn1qkr/ppp1pp2/3p2p1/3Q3P/b7/8/PPPPPP1P/NBRNB1KR w HChc - 2 9", 5, 42201531 }, + { "nbrn1qkr/ppp1pp2/3p2p1/3Q3P/b7/8/PPPPPP1P/NBRNB1KR w HChc - 2 9", 6, 1239888683 }, + { "nr1bbqkr/pp1pp2p/1n3pp1/2p5/8/1P4P1/P1PPPPQP/NRNBBK1R w hb - 0 9", 1, 25 }, + { "nr1bbqkr/pp1pp2p/1n3pp1/2p5/8/1P4P1/P1PPPPQP/NRNBBK1R w hb - 0 9", 2, 585 }, + { "nr1bbqkr/pp1pp2p/1n3pp1/2p5/8/1P4P1/P1PPPPQP/NRNBBK1R w hb - 0 9", 3, 15719 }, + { "nr1bbqkr/pp1pp2p/1n3pp1/2p5/8/1P4P1/P1PPPPQP/NRNBBK1R w hb - 0 9", 4, 406544 }, + { "nr1bbqkr/pp1pp2p/1n3pp1/2p5/8/1P4P1/P1PPPPQP/NRNBBK1R w hb - 0 9", 5, 11582539 }, + { "nr1bbqkr/pp1pp2p/1n3pp1/2p5/8/1P4P1/P1PPPPQP/NRNBBK1R w hb - 0 9", 6, 320997679 }, + { "nr2bbkr/ppp1pppp/1n1p4/8/6PP/1NP4q/PP1PPP2/1RNQBBKR w HBhb - 1 9", 1, 22 }, + { "nr2bbkr/ppp1pppp/1n1p4/8/6PP/1NP4q/PP1PPP2/1RNQBBKR w HBhb - 1 9", 2, 742 }, + { "nr2bbkr/ppp1pppp/1n1p4/8/6PP/1NP4q/PP1PPP2/1RNQBBKR w HBhb - 1 9", 3, 15984 }, + { "nr2bbkr/ppp1pppp/1n1p4/8/6PP/1NP4q/PP1PPP2/1RNQBBKR w HBhb - 1 9", 4, 545231 }, + { "nr2bbkr/ppp1pppp/1n1p4/8/6PP/1NP4q/PP1PPP2/1RNQBBKR w HBhb - 1 9", 5, 13287051 }, + { "nr2bbkr/ppp1pppp/1n1p4/8/6PP/1NP4q/PP1PPP2/1RNQBBKR w HBhb - 1 9", 6, 457010195 }, + { "1rnqbkrb/ppp1p1p1/1n3p2/3p3p/P6P/4P3/1PPP1PP1/NRNQBRKB w gb - 0 9", 1, 22 }, + { "1rnqbkrb/ppp1p1p1/1n3p2/3p3p/P6P/4P3/1PPP1PP1/NRNQBRKB w gb - 0 9", 2, 574 }, + { "1rnqbkrb/ppp1p1p1/1n3p2/3p3p/P6P/4P3/1PPP1PP1/NRNQBRKB w gb - 0 9", 3, 14044 }, + { "1rnqbkrb/ppp1p1p1/1n3p2/3p3p/P6P/4P3/1PPP1PP1/NRNQBRKB w gb - 0 9", 4, 379648 }, + { "1rnqbkrb/ppp1p1p1/1n3p2/3p3p/P6P/4P3/1PPP1PP1/NRNQBRKB w gb - 0 9", 5, 9968830 }, + { "1rnqbkrb/ppp1p1p1/1n3p2/3p3p/P6P/4P3/1PPP1PP1/NRNQBRKB w gb - 0 9", 6, 281344367 }, + { "nb1rqkbr/1pppp1pp/4n3/p4p2/6PP/5P2/PPPPPN2/NBR1QKBR w HCh - 0 9", 1, 25 }, + { "nb1rqkbr/1pppp1pp/4n3/p4p2/6PP/5P2/PPPPPN2/NBR1QKBR w HCh - 0 9", 2, 621 }, + { "nb1rqkbr/1pppp1pp/4n3/p4p2/6PP/5P2/PPPPPN2/NBR1QKBR w HCh - 0 9", 3, 16789 }, + { "nb1rqkbr/1pppp1pp/4n3/p4p2/6PP/5P2/PPPPPN2/NBR1QKBR w HCh - 0 9", 4, 462600 }, + { "nb1rqkbr/1pppp1pp/4n3/p4p2/6PP/5P2/PPPPPN2/NBR1QKBR w HCh - 0 9", 5, 13378840 }, + { "nb1rqkbr/1pppp1pp/4n3/p4p2/6PP/5P2/PPPPPN2/NBR1QKBR w HCh - 0 9", 6, 396575613 }, + { "nrnbqkbr/2pp2pp/4pp2/pp6/8/1P3P2/P1PPPBPP/NRNBQ1KR w hb - 0 9", 1, 25 }, + { "nrnbqkbr/2pp2pp/4pp2/pp6/8/1P3P2/P1PPPBPP/NRNBQ1KR w hb - 0 9", 2, 656 }, + { "nrnbqkbr/2pp2pp/4pp2/pp6/8/1P3P2/P1PPPBPP/NRNBQ1KR w hb - 0 9", 3, 16951 }, + { "nrnbqkbr/2pp2pp/4pp2/pp6/8/1P3P2/P1PPPBPP/NRNBQ1KR w hb - 0 9", 4, 466493 }, + { "nrnbqkbr/2pp2pp/4pp2/pp6/8/1P3P2/P1PPPBPP/NRNBQ1KR w hb - 0 9", 5, 12525939 }, + { "nrnbqkbr/2pp2pp/4pp2/pp6/8/1P3P2/P1PPPBPP/NRNBQ1KR w hb - 0 9", 6, 358763789 }, + { "nrnqkbbr/ppppp1p1/7p/5p2/8/P4PP1/NPPPP2P/NR1QKBBR w HBhb - 0 9", 1, 28 }, + { "nrnqkbbr/ppppp1p1/7p/5p2/8/P4PP1/NPPPP2P/NR1QKBBR w HBhb - 0 9", 2, 723 }, + { "nrnqkbbr/ppppp1p1/7p/5p2/8/P4PP1/NPPPP2P/NR1QKBBR w HBhb - 0 9", 3, 20621 }, + { "nrnqkbbr/ppppp1p1/7p/5p2/8/P4PP1/NPPPP2P/NR1QKBBR w HBhb - 0 9", 4, 547522 }, + { "nrnqkbbr/ppppp1p1/7p/5p2/8/P4PP1/NPPPP2P/NR1QKBBR w HBhb - 0 9", 5, 15952533 }, + { "nrnqkbbr/ppppp1p1/7p/5p2/8/P4PP1/NPPPP2P/NR1QKBBR w HBhb - 0 9", 6, 439046803 }, + { "1rnqkr1b/ppppp2p/1n3pp1/8/2P3P1/Pb1N4/1P1PPP1P/NR1QKRBB w FBfb - 0 9", 1, 26 }, + { "1rnqkr1b/ppppp2p/1n3pp1/8/2P3P1/Pb1N4/1P1PPP1P/NR1QKRBB w FBfb - 0 9", 2, 713 }, + { "1rnqkr1b/ppppp2p/1n3pp1/8/2P3P1/Pb1N4/1P1PPP1P/NR1QKRBB w FBfb - 0 9", 3, 19671 }, + { "1rnqkr1b/ppppp2p/1n3pp1/8/2P3P1/Pb1N4/1P1PPP1P/NR1QKRBB w FBfb - 0 9", 4, 548875 }, + { "1rnqkr1b/ppppp2p/1n3pp1/8/2P3P1/Pb1N4/1P1PPP1P/NR1QKRBB w FBfb - 0 9", 5, 15865528 }, + { "1rnqkr1b/ppppp2p/1n3pp1/8/2P3P1/Pb1N4/1P1PPP1P/NR1QKRBB w FBfb - 0 9", 6, 454532806 }, + { "bbnrnkqr/1pppp1pp/5p2/p7/7P/1P6/PBPPPPPR/1BNRNKQ1 w D - 2 9", 1, 26 }, + { "bbnrnkqr/1pppp1pp/5p2/p7/7P/1P6/PBPPPPPR/1BNRNKQ1 w D - 2 9", 2, 649 }, + { "bbnrnkqr/1pppp1pp/5p2/p7/7P/1P6/PBPPPPPR/1BNRNKQ1 w D - 2 9", 3, 17834 }, + { "bbnrnkqr/1pppp1pp/5p2/p7/7P/1P6/PBPPPPPR/1BNRNKQ1 w D - 2 9", 4, 502279 }, + { "bbnrnkqr/1pppp1pp/5p2/p7/7P/1P6/PBPPPPPR/1BNRNKQ1 w D - 2 9", 5, 14375839 }, + { "bbnrnkqr/1pppp1pp/5p2/p7/7P/1P6/PBPPPPPR/1BNRNKQ1 w D - 2 9", 6, 435585252 }, + { "bnrbk1qr/1ppp1ppp/p2np3/8/P7/2N2P2/1PPPP1PP/B1RBNKQR w HC - 0 9", 1, 26 }, + { "bnrbk1qr/1ppp1ppp/p2np3/8/P7/2N2P2/1PPPP1PP/B1RBNKQR w HC - 0 9", 2, 621 }, + { "bnrbk1qr/1ppp1ppp/p2np3/8/P7/2N2P2/1PPPP1PP/B1RBNKQR w HC - 0 9", 3, 17569 }, + { "bnrbk1qr/1ppp1ppp/p2np3/8/P7/2N2P2/1PPPP1PP/B1RBNKQR w HC - 0 9", 4, 451452 }, + { "bnrbk1qr/1ppp1ppp/p2np3/8/P7/2N2P2/1PPPP1PP/B1RBNKQR w HC - 0 9", 5, 13514201 }, + { "bnrbk1qr/1ppp1ppp/p2np3/8/P7/2N2P2/1PPPP1PP/B1RBNKQR w HC - 0 9", 6, 364421088 }, + { "br1nkbqr/ppppppp1/8/n6p/8/N1P2PP1/PP1PP2P/B1RNKBQR w HCh - 1 9", 1, 29 }, + { "br1nkbqr/ppppppp1/8/n6p/8/N1P2PP1/PP1PP2P/B1RNKBQR w HCh - 1 9", 2, 664 }, + { "br1nkbqr/ppppppp1/8/n6p/8/N1P2PP1/PP1PP2P/B1RNKBQR w HCh - 1 9", 3, 20182 }, + { "br1nkbqr/ppppppp1/8/n6p/8/N1P2PP1/PP1PP2P/B1RNKBQR w HCh - 1 9", 4, 512316 }, + { "br1nkbqr/ppppppp1/8/n6p/8/N1P2PP1/PP1PP2P/B1RNKBQR w HCh - 1 9", 5, 16125924 }, + { "br1nkbqr/ppppppp1/8/n6p/8/N1P2PP1/PP1PP2P/B1RNKBQR w HCh - 1 9", 6, 442508159 }, + { "bnr1kqrb/pp1pppp1/2n5/2p5/1P4Pp/4N3/P1PPPP1P/BNKR1QRB w gc - 0 9", 1, 36 }, + { "bnr1kqrb/pp1pppp1/2n5/2p5/1P4Pp/4N3/P1PPPP1P/BNKR1QRB w gc - 0 9", 2, 888 }, + { "bnr1kqrb/pp1pppp1/2n5/2p5/1P4Pp/4N3/P1PPPP1P/BNKR1QRB w gc - 0 9", 3, 31630 }, + { "bnr1kqrb/pp1pppp1/2n5/2p5/1P4Pp/4N3/P1PPPP1P/BNKR1QRB w gc - 0 9", 4, 789863 }, + { "bnr1kqrb/pp1pppp1/2n5/2p5/1P4Pp/4N3/P1PPPP1P/BNKR1QRB w gc - 0 9", 5, 27792175 }, + { "bnr1kqrb/pp1pppp1/2n5/2p5/1P4Pp/4N3/P1PPPP1P/BNKR1QRB w gc - 0 9", 6, 719015345 }, + { "1bbrnkqr/pp1p1ppp/2p1p3/1n6/5P2/3Q4/PPPPP1PP/NBBRNK1R w HDhd - 2 9", 1, 36 }, + { "1bbrnkqr/pp1p1ppp/2p1p3/1n6/5P2/3Q4/PPPPP1PP/NBBRNK1R w HDhd - 2 9", 2, 891 }, + { "1bbrnkqr/pp1p1ppp/2p1p3/1n6/5P2/3Q4/PPPPP1PP/NBBRNK1R w HDhd - 2 9", 3, 31075 }, + { "1bbrnkqr/pp1p1ppp/2p1p3/1n6/5P2/3Q4/PPPPP1PP/NBBRNK1R w HDhd - 2 9", 4, 781792 }, + { "1bbrnkqr/pp1p1ppp/2p1p3/1n6/5P2/3Q4/PPPPP1PP/NBBRNK1R w HDhd - 2 9", 5, 26998966 }, + { "1bbrnkqr/pp1p1ppp/2p1p3/1n6/5P2/3Q4/PPPPP1PP/NBBRNK1R w HDhd - 2 9", 6, 702903862 }, + { "nrbbnk1r/pp2pppq/8/2pp3p/3P2P1/1N6/PPP1PP1P/1RBBNKQR w HBhb - 0 9", 1, 29 }, + { "nrbbnk1r/pp2pppq/8/2pp3p/3P2P1/1N6/PPP1PP1P/1RBBNKQR w HBhb - 0 9", 2, 1036 }, + { "nrbbnk1r/pp2pppq/8/2pp3p/3P2P1/1N6/PPP1PP1P/1RBBNKQR w HBhb - 0 9", 3, 31344 }, + { "nrbbnk1r/pp2pppq/8/2pp3p/3P2P1/1N6/PPP1PP1P/1RBBNKQR w HBhb - 0 9", 4, 1139166 }, + { "nrbbnk1r/pp2pppq/8/2pp3p/3P2P1/1N6/PPP1PP1P/1RBBNKQR w HBhb - 0 9", 5, 35627310 }, + { "nrbbnk1r/pp2pppq/8/2pp3p/3P2P1/1N6/PPP1PP1P/1RBBNKQR w HBhb - 0 9", 6, 1310683359 }, + { "nr1nkbqr/ppp3pp/5p2/3pp3/6b1/3PP3/PPP2PPP/NRBNKBQR w hb - 0 9", 1, 18 }, + { "nr1nkbqr/ppp3pp/5p2/3pp3/6b1/3PP3/PPP2PPP/NRBNKBQR w hb - 0 9", 2, 664 }, + { "nr1nkbqr/ppp3pp/5p2/3pp3/6b1/3PP3/PPP2PPP/NRBNKBQR w hb - 0 9", 3, 13306 }, + { "nr1nkbqr/ppp3pp/5p2/3pp3/6b1/3PP3/PPP2PPP/NRBNKBQR w hb - 0 9", 4, 483892 }, + { "nr1nkbqr/ppp3pp/5p2/3pp3/6b1/3PP3/PPP2PPP/NRBNKBQR w hb - 0 9", 5, 10658989 }, + { "nr1nkbqr/ppp3pp/5p2/3pp3/6b1/3PP3/PPP2PPP/NRBNKBQR w hb - 0 9", 6, 386307449 }, + { "nrbnk1rb/ppp1pq1p/3p4/5pp1/2P1P3/1N6/PP1PKPPP/1RBN1QRB w gb - 2 9", 1, 25 }, + { "nrbnk1rb/ppp1pq1p/3p4/5pp1/2P1P3/1N6/PP1PKPPP/1RBN1QRB w gb - 2 9", 2, 966 }, + { "nrbnk1rb/ppp1pq1p/3p4/5pp1/2P1P3/1N6/PP1PKPPP/1RBN1QRB w gb - 2 9", 3, 24026 }, + { "nrbnk1rb/ppp1pq1p/3p4/5pp1/2P1P3/1N6/PP1PKPPP/1RBN1QRB w gb - 2 9", 4, 920345 }, + { "nrbnk1rb/ppp1pq1p/3p4/5pp1/2P1P3/1N6/PP1PKPPP/1RBN1QRB w gb - 2 9", 5, 23957242 }, + { "nrbnk1rb/ppp1pq1p/3p4/5pp1/2P1P3/1N6/PP1PKPPP/1RBN1QRB w gb - 2 9", 6, 913710194 }, + { "1brnbkqr/pppppp2/6p1/7p/1Pn5/P1NP4/2P1PPPP/NBR1BKQR w HChc - 0 9", 1, 22 }, + { "1brnbkqr/pppppp2/6p1/7p/1Pn5/P1NP4/2P1PPPP/NBR1BKQR w HChc - 0 9", 2, 627 }, + { "1brnbkqr/pppppp2/6p1/7p/1Pn5/P1NP4/2P1PPPP/NBR1BKQR w HChc - 0 9", 3, 13760 }, + { "1brnbkqr/pppppp2/6p1/7p/1Pn5/P1NP4/2P1PPPP/NBR1BKQR w HChc - 0 9", 4, 395829 }, + { "1brnbkqr/pppppp2/6p1/7p/1Pn5/P1NP4/2P1PPPP/NBR1BKQR w HChc - 0 9", 5, 9627826 }, + { "1brnbkqr/pppppp2/6p1/7p/1Pn5/P1NP4/2P1PPPP/NBR1BKQR w HChc - 0 9", 6, 285900573 }, + { "nrnbbk1r/p1pppppq/8/7p/1p6/P5PP/1PPPPPQ1/NRNBBK1R w HBhb - 2 9", 1, 29 }, + { "nrnbbk1r/p1pppppq/8/7p/1p6/P5PP/1PPPPPQ1/NRNBBK1R w HBhb - 2 9", 2, 888 }, + { "nrnbbk1r/p1pppppq/8/7p/1p6/P5PP/1PPPPPQ1/NRNBBK1R w HBhb - 2 9", 3, 26742 }, + { "nrnbbk1r/p1pppppq/8/7p/1p6/P5PP/1PPPPPQ1/NRNBBK1R w HBhb - 2 9", 4, 874270 }, + { "nrnbbk1r/p1pppppq/8/7p/1p6/P5PP/1PPPPPQ1/NRNBBK1R w HBhb - 2 9", 5, 27229468 }, + { "nrnbbk1r/p1pppppq/8/7p/1p6/P5PP/1PPPPPQ1/NRNBBK1R w HBhb - 2 9", 6, 930799376 }, + { "n1nkb1qr/prppppbp/6p1/1p6/2P2P2/P7/1P1PP1PP/NRNKBBQR w HBh - 1 9", 1, 29 }, + { "n1nkb1qr/prppppbp/6p1/1p6/2P2P2/P7/1P1PP1PP/NRNKBBQR w HBh - 1 9", 2, 804 }, + { "n1nkb1qr/prppppbp/6p1/1p6/2P2P2/P7/1P1PP1PP/NRNKBBQR w HBh - 1 9", 3, 24701 }, + { "n1nkb1qr/prppppbp/6p1/1p6/2P2P2/P7/1P1PP1PP/NRNKBBQR w HBh - 1 9", 4, 688520 }, + { "n1nkb1qr/prppppbp/6p1/1p6/2P2P2/P7/1P1PP1PP/NRNKBBQR w HBh - 1 9", 5, 21952444 }, + { "n1nkb1qr/prppppbp/6p1/1p6/2P2P2/P7/1P1PP1PP/NRNKBBQR w HBh - 1 9", 6, 623156747 }, + { "nr2bqrb/ppkpp1pp/1np5/5p1P/5P2/2P5/PP1PP1P1/NRNKBQRB w GB - 0 9", 1, 22 }, + { "nr2bqrb/ppkpp1pp/1np5/5p1P/5P2/2P5/PP1PP1P1/NRNKBQRB w GB - 0 9", 2, 530 }, + { "nr2bqrb/ppkpp1pp/1np5/5p1P/5P2/2P5/PP1PP1P1/NRNKBQRB w GB - 0 9", 3, 13055 }, + { "nr2bqrb/ppkpp1pp/1np5/5p1P/5P2/2P5/PP1PP1P1/NRNKBQRB w GB - 0 9", 4, 347657 }, + { "nr2bqrb/ppkpp1pp/1np5/5p1P/5P2/2P5/PP1PP1P1/NRNKBQRB w GB - 0 9", 5, 9244693 }, + { "nr2bqrb/ppkpp1pp/1np5/5p1P/5P2/2P5/PP1PP1P1/NRNKBQRB w GB - 0 9", 6, 264088392 }, + { "nbr1kqbr/p3pppp/2ppn3/1p4P1/4P3/1P6/P1PP1P1P/NBRNKQBR w HChc - 1 9", 1, 23 }, + { "nbr1kqbr/p3pppp/2ppn3/1p4P1/4P3/1P6/P1PP1P1P/NBRNKQBR w HChc - 1 9", 2, 555 }, + { "nbr1kqbr/p3pppp/2ppn3/1p4P1/4P3/1P6/P1PP1P1P/NBRNKQBR w HChc - 1 9", 3, 14291 }, + { "nbr1kqbr/p3pppp/2ppn3/1p4P1/4P3/1P6/P1PP1P1P/NBRNKQBR w HChc - 1 9", 4, 350917 }, + { "nbr1kqbr/p3pppp/2ppn3/1p4P1/4P3/1P6/P1PP1P1P/NBRNKQBR w HChc - 1 9", 5, 9692630 }, + { "nbr1kqbr/p3pppp/2ppn3/1p4P1/4P3/1P6/P1PP1P1P/NBRNKQBR w HChc - 1 9", 6, 247479180 }, + { "nr1bkqbr/1p1pp1pp/pnp2p2/8/6P1/P1PP4/1P2PP1P/NRNBKQBR w HBhb - 0 9", 1, 22 }, + { "nr1bkqbr/1p1pp1pp/pnp2p2/8/6P1/P1PP4/1P2PP1P/NRNBKQBR w HBhb - 0 9", 2, 565 }, + { "nr1bkqbr/1p1pp1pp/pnp2p2/8/6P1/P1PP4/1P2PP1P/NRNBKQBR w HBhb - 0 9", 3, 13343 }, + { "nr1bkqbr/1p1pp1pp/pnp2p2/8/6P1/P1PP4/1P2PP1P/NRNBKQBR w HBhb - 0 9", 4, 365663 }, + { "nr1bkqbr/1p1pp1pp/pnp2p2/8/6P1/P1PP4/1P2PP1P/NRNBKQBR w HBhb - 0 9", 5, 9305533 }, + { "nr1bkqbr/1p1pp1pp/pnp2p2/8/6P1/P1PP4/1P2PP1P/NRNBKQBR w HBhb - 0 9", 6, 268612479 }, + { "nr1kqbbr/np2pppp/p1p5/1B1p1P2/8/4P3/PPPP2PP/NRNKQ1BR w HBhb - 0 9", 1, 32 }, + { "nr1kqbbr/np2pppp/p1p5/1B1p1P2/8/4P3/PPPP2PP/NRNKQ1BR w HBhb - 0 9", 2, 730 }, + { "nr1kqbbr/np2pppp/p1p5/1B1p1P2/8/4P3/PPPP2PP/NRNKQ1BR w HBhb - 0 9", 3, 23391 }, + { "nr1kqbbr/np2pppp/p1p5/1B1p1P2/8/4P3/PPPP2PP/NRNKQ1BR w HBhb - 0 9", 4, 556995 }, + { "nr1kqbbr/np2pppp/p1p5/1B1p1P2/8/4P3/PPPP2PP/NRNKQ1BR w HBhb - 0 9", 5, 18103280 }, + { "nr1kqbbr/np2pppp/p1p5/1B1p1P2/8/4P3/PPPP2PP/NRNKQ1BR w HBhb - 0 9", 6, 454569900 }, + { "nrnk1rbb/p1p2ppp/3pq3/Qp2p3/1P1P4/8/P1P1PPPP/NRN1KRBB w fb - 2 9", 1, 28 }, + { "nrnk1rbb/p1p2ppp/3pq3/Qp2p3/1P1P4/8/P1P1PPPP/NRN1KRBB w fb - 2 9", 2, 873 }, + { "nrnk1rbb/p1p2ppp/3pq3/Qp2p3/1P1P4/8/P1P1PPPP/NRN1KRBB w fb - 2 9", 3, 25683 }, + { "nrnk1rbb/p1p2ppp/3pq3/Qp2p3/1P1P4/8/P1P1PPPP/NRN1KRBB w fb - 2 9", 4, 791823 }, + { "nrnk1rbb/p1p2ppp/3pq3/Qp2p3/1P1P4/8/P1P1PPPP/NRN1KRBB w fb - 2 9", 5, 23868737 }, + { "nrnk1rbb/p1p2ppp/3pq3/Qp2p3/1P1P4/8/P1P1PPPP/NRN1KRBB w fb - 2 9", 6, 747991356 }, + { "bbnrnkrq/pp1ppp1p/6p1/2p5/6P1/P5RP/1PPPPP2/BBNRNK1Q w Dgd - 3 9", 1, 37 }, + { "bbnrnkrq/pp1ppp1p/6p1/2p5/6P1/P5RP/1PPPPP2/BBNRNK1Q w Dgd - 3 9", 2, 1260 }, + { "bbnrnkrq/pp1ppp1p/6p1/2p5/6P1/P5RP/1PPPPP2/BBNRNK1Q w Dgd - 3 9", 3, 45060 }, + { "bbnrnkrq/pp1ppp1p/6p1/2p5/6P1/P5RP/1PPPPP2/BBNRNK1Q w Dgd - 3 9", 4, 1542086 }, + { "bbnrnkrq/pp1ppp1p/6p1/2p5/6P1/P5RP/1PPPPP2/BBNRNK1Q w Dgd - 3 9", 5, 54843403 }, + { "bbnrnkrq/pp1ppp1p/6p1/2p5/6P1/P5RP/1PPPPP2/BBNRNK1Q w Dgd - 3 9", 6, 1898432768 }, + { "bnrb1rkq/ppnpppp1/3Q4/2p4p/7P/N7/PPPPPPP1/B1RBNKR1 w GC - 2 9", 1, 38 }, + { "bnrb1rkq/ppnpppp1/3Q4/2p4p/7P/N7/PPPPPPP1/B1RBNKR1 w GC - 2 9", 2, 878 }, + { "bnrb1rkq/ppnpppp1/3Q4/2p4p/7P/N7/PPPPPPP1/B1RBNKR1 w GC - 2 9", 3, 31944 }, + { "bnrb1rkq/ppnpppp1/3Q4/2p4p/7P/N7/PPPPPPP1/B1RBNKR1 w GC - 2 9", 4, 800440 }, + { "bnrb1rkq/ppnpppp1/3Q4/2p4p/7P/N7/PPPPPPP1/B1RBNKR1 w GC - 2 9", 5, 28784300 }, + { "bnrb1rkq/ppnpppp1/3Q4/2p4p/7P/N7/PPPPPPP1/B1RBNKR1 w GC - 2 9", 6, 784569826 }, + { "bnrnkbrq/p1ppppp1/1p5p/8/P2PP3/5P2/1PP3PP/BNRNKBRQ w GCgc - 1 9", 1, 26 }, + { "bnrnkbrq/p1ppppp1/1p5p/8/P2PP3/5P2/1PP3PP/BNRNKBRQ w GCgc - 1 9", 2, 617 }, + { "bnrnkbrq/p1ppppp1/1p5p/8/P2PP3/5P2/1PP3PP/BNRNKBRQ w GCgc - 1 9", 3, 16992 }, + { "bnrnkbrq/p1ppppp1/1p5p/8/P2PP3/5P2/1PP3PP/BNRNKBRQ w GCgc - 1 9", 4, 419099 }, + { "bnrnkbrq/p1ppppp1/1p5p/8/P2PP3/5P2/1PP3PP/BNRNKBRQ w GCgc - 1 9", 5, 11965544 }, + { "bnrnkbrq/p1ppppp1/1p5p/8/P2PP3/5P2/1PP3PP/BNRNKBRQ w GCgc - 1 9", 6, 311309576 }, + { "bnrnkrqb/pp2p2p/2pp1pp1/8/P7/2PP1P2/1P2P1PP/BNRNKRQB w FCfc - 0 9", 1, 26 }, + { "bnrnkrqb/pp2p2p/2pp1pp1/8/P7/2PP1P2/1P2P1PP/BNRNKRQB w FCfc - 0 9", 2, 721 }, + { "bnrnkrqb/pp2p2p/2pp1pp1/8/P7/2PP1P2/1P2P1PP/BNRNKRQB w FCfc - 0 9", 3, 19726 }, + { "bnrnkrqb/pp2p2p/2pp1pp1/8/P7/2PP1P2/1P2P1PP/BNRNKRQB w FCfc - 0 9", 4, 560824 }, + { "bnrnkrqb/pp2p2p/2pp1pp1/8/P7/2PP1P2/1P2P1PP/BNRNKRQB w FCfc - 0 9", 5, 15966934 }, + { "bnrnkrqb/pp2p2p/2pp1pp1/8/P7/2PP1P2/1P2P1PP/BNRNKRQB w FCfc - 0 9", 6, 467132503 }, + { "nbbrnkr1/1pppp1p1/p6q/P4p1p/8/5P2/1PPPP1PP/NBBRNRKQ w gd - 2 9", 1, 18 }, + { "nbbrnkr1/1pppp1p1/p6q/P4p1p/8/5P2/1PPPP1PP/NBBRNRKQ w gd - 2 9", 2, 556 }, + { "nbbrnkr1/1pppp1p1/p6q/P4p1p/8/5P2/1PPPP1PP/NBBRNRKQ w gd - 2 9", 3, 10484 }, + { "nbbrnkr1/1pppp1p1/p6q/P4p1p/8/5P2/1PPPP1PP/NBBRNRKQ w gd - 2 9", 4, 316634 }, + { "nbbrnkr1/1pppp1p1/p6q/P4p1p/8/5P2/1PPPP1PP/NBBRNRKQ w gd - 2 9", 5, 6629293 }, + { "nbbrnkr1/1pppp1p1/p6q/P4p1p/8/5P2/1PPPP1PP/NBBRNRKQ w gd - 2 9", 6, 202528241 }, + { "nrb1nkrq/2pp1ppp/p4b2/1p2p3/P4B2/3P4/1PP1PPPP/NR1BNRKQ w gb - 0 9", 1, 24 }, + { "nrb1nkrq/2pp1ppp/p4b2/1p2p3/P4B2/3P4/1PP1PPPP/NR1BNRKQ w gb - 0 9", 2, 562 }, + { "nrb1nkrq/2pp1ppp/p4b2/1p2p3/P4B2/3P4/1PP1PPPP/NR1BNRKQ w gb - 0 9", 3, 14017 }, + { "nrb1nkrq/2pp1ppp/p4b2/1p2p3/P4B2/3P4/1PP1PPPP/NR1BNRKQ w gb - 0 9", 4, 355433 }, + { "nrb1nkrq/2pp1ppp/p4b2/1p2p3/P4B2/3P4/1PP1PPPP/NR1BNRKQ w gb - 0 9", 5, 9227883 }, + { "nrb1nkrq/2pp1ppp/p4b2/1p2p3/P4B2/3P4/1PP1PPPP/NR1BNRKQ w gb - 0 9", 6, 247634489 }, + { "nrbnkbrq/p3p1pp/1p6/2pp1P2/8/3PP3/PPP2P1P/NRBNKBRQ w GBgb - 0 9", 1, 31 }, + { "nrbnkbrq/p3p1pp/1p6/2pp1P2/8/3PP3/PPP2P1P/NRBNKBRQ w GBgb - 0 9", 2, 746 }, + { "nrbnkbrq/p3p1pp/1p6/2pp1P2/8/3PP3/PPP2P1P/NRBNKBRQ w GBgb - 0 9", 3, 24819 }, + { "nrbnkbrq/p3p1pp/1p6/2pp1P2/8/3PP3/PPP2P1P/NRBNKBRQ w GBgb - 0 9", 4, 608523 }, + { "nrbnkbrq/p3p1pp/1p6/2pp1P2/8/3PP3/PPP2P1P/NRBNKBRQ w GBgb - 0 9", 5, 21019301 }, + { "nrbnkbrq/p3p1pp/1p6/2pp1P2/8/3PP3/PPP2P1P/NRBNKBRQ w GBgb - 0 9", 6, 542954168 }, + { "nrbnkrqb/pppp1p1p/4p1p1/8/7P/2P1P3/PPNP1PP1/1RBNKRQB w FBfb - 0 9", 1, 20 }, + { "nrbnkrqb/pppp1p1p/4p1p1/8/7P/2P1P3/PPNP1PP1/1RBNKRQB w FBfb - 0 9", 2, 459 }, + { "nrbnkrqb/pppp1p1p/4p1p1/8/7P/2P1P3/PPNP1PP1/1RBNKRQB w FBfb - 0 9", 3, 9998 }, + { "nrbnkrqb/pppp1p1p/4p1p1/8/7P/2P1P3/PPNP1PP1/1RBNKRQB w FBfb - 0 9", 4, 242762 }, + { "nrbnkrqb/pppp1p1p/4p1p1/8/7P/2P1P3/PPNP1PP1/1RBNKRQB w FBfb - 0 9", 5, 5760165 }, + { "nrbnkrqb/pppp1p1p/4p1p1/8/7P/2P1P3/PPNP1PP1/1RBNKRQB w FBfb - 0 9", 6, 146614723 }, + { "nbrn1krq/ppp1p2p/6b1/3p1pp1/8/4N1PP/PPPPPP2/NBR1BRKQ w gc - 1 9", 1, 27 }, + { "nbrn1krq/ppp1p2p/6b1/3p1pp1/8/4N1PP/PPPPPP2/NBR1BRKQ w gc - 1 9", 2, 835 }, + { "nbrn1krq/ppp1p2p/6b1/3p1pp1/8/4N1PP/PPPPPP2/NBR1BRKQ w gc - 1 9", 3, 23632 }, + { "nbrn1krq/ppp1p2p/6b1/3p1pp1/8/4N1PP/PPPPPP2/NBR1BRKQ w gc - 1 9", 4, 766397 }, + { "nbrn1krq/ppp1p2p/6b1/3p1pp1/8/4N1PP/PPPPPP2/NBR1BRKQ w gc - 1 9", 5, 22667987 }, + { "nbrn1krq/ppp1p2p/6b1/3p1pp1/8/4N1PP/PPPPPP2/NBR1BRKQ w gc - 1 9", 6, 760795567 }, + { "nrnbbkrq/p1pp2pp/5p2/1p6/2P1pP1B/1P6/P2PP1PP/NRNB1KRQ w GBgb - 0 9", 1, 24 }, + { "nrnbbkrq/p1pp2pp/5p2/1p6/2P1pP1B/1P6/P2PP1PP/NRNB1KRQ w GBgb - 0 9", 2, 646 }, + { "nrnbbkrq/p1pp2pp/5p2/1p6/2P1pP1B/1P6/P2PP1PP/NRNB1KRQ w GBgb - 0 9", 3, 16102 }, + { "nrnbbkrq/p1pp2pp/5p2/1p6/2P1pP1B/1P6/P2PP1PP/NRNB1KRQ w GBgb - 0 9", 4, 444472 }, + { "nrnbbkrq/p1pp2pp/5p2/1p6/2P1pP1B/1P6/P2PP1PP/NRNB1KRQ w GBgb - 0 9", 5, 11489727 }, + { "nrnbbkrq/p1pp2pp/5p2/1p6/2P1pP1B/1P6/P2PP1PP/NRNB1KRQ w GBgb - 0 9", 6, 324948755 }, + { "nrn1bbrq/1ppkppp1/p2p3p/8/1P3N2/4P3/P1PP1PPP/NR1KBBRQ w GB - 2 9", 1, 32 }, + { "nrn1bbrq/1ppkppp1/p2p3p/8/1P3N2/4P3/P1PP1PPP/NR1KBBRQ w GB - 2 9", 2, 591 }, + { "nrn1bbrq/1ppkppp1/p2p3p/8/1P3N2/4P3/P1PP1PPP/NR1KBBRQ w GB - 2 9", 3, 18722 }, + { "nrn1bbrq/1ppkppp1/p2p3p/8/1P3N2/4P3/P1PP1PPP/NR1KBBRQ w GB - 2 9", 4, 381683 }, + { "nrn1bbrq/1ppkppp1/p2p3p/8/1P3N2/4P3/P1PP1PPP/NR1KBBRQ w GB - 2 9", 5, 12069159 }, + { "nrn1bbrq/1ppkppp1/p2p3p/8/1P3N2/4P3/P1PP1PPP/NR1KBBRQ w GB - 2 9", 6, 269922838 }, + { "n1krbrqb/1ppppppp/p7/8/4n3/P4P1P/1PPPPQP1/NRNKBR1B w FB - 2 9", 1, 26 }, + { "n1krbrqb/1ppppppp/p7/8/4n3/P4P1P/1PPPPQP1/NRNKBR1B w FB - 2 9", 2, 639 }, + { "n1krbrqb/1ppppppp/p7/8/4n3/P4P1P/1PPPPQP1/NRNKBR1B w FB - 2 9", 3, 16988 }, + { "n1krbrqb/1ppppppp/p7/8/4n3/P4P1P/1PPPPQP1/NRNKBR1B w FB - 2 9", 4, 417190 }, + { "n1krbrqb/1ppppppp/p7/8/4n3/P4P1P/1PPPPQP1/NRNKBR1B w FB - 2 9", 5, 12167153 }, + { "n1krbrqb/1ppppppp/p7/8/4n3/P4P1P/1PPPPQP1/NRNKBR1B w FB - 2 9", 6, 312633873 }, + { "n1rnkrbq/1p1ppp1p/8/p1p1b1p1/3PQ1P1/4N3/PPP1PP1P/NBR1KRB1 w FCfc - 0 9", 1, 35 }, + { "n1rnkrbq/1p1ppp1p/8/p1p1b1p1/3PQ1P1/4N3/PPP1PP1P/NBR1KRB1 w FCfc - 0 9", 2, 1027 }, + { "n1rnkrbq/1p1ppp1p/8/p1p1b1p1/3PQ1P1/4N3/PPP1PP1P/NBR1KRB1 w FCfc - 0 9", 3, 35731 }, + { "n1rnkrbq/1p1ppp1p/8/p1p1b1p1/3PQ1P1/4N3/PPP1PP1P/NBR1KRB1 w FCfc - 0 9", 4, 1040417 }, + { "n1rnkrbq/1p1ppp1p/8/p1p1b1p1/3PQ1P1/4N3/PPP1PP1P/NBR1KRB1 w FCfc - 0 9", 5, 35738410 }, + { "n1rnkrbq/1p1ppp1p/8/p1p1b1p1/3PQ1P1/4N3/PPP1PP1P/NBR1KRB1 w FCfc - 0 9", 6, 1060661628 }, + { "nrnbkrbq/2pp1pp1/pp6/4p2p/P7/5PPP/1PPPP3/NRNBKRBQ w FBfb - 0 9", 1, 26 }, + { "nrnbkrbq/2pp1pp1/pp6/4p2p/P7/5PPP/1PPPP3/NRNBKRBQ w FBfb - 0 9", 2, 628 }, + { "nrnbkrbq/2pp1pp1/pp6/4p2p/P7/5PPP/1PPPP3/NRNBKRBQ w FBfb - 0 9", 3, 16731 }, + { "nrnbkrbq/2pp1pp1/pp6/4p2p/P7/5PPP/1PPPP3/NRNBKRBQ w FBfb - 0 9", 4, 436075 }, + { "nrnbkrbq/2pp1pp1/pp6/4p2p/P7/5PPP/1PPPP3/NRNBKRBQ w FBfb - 0 9", 5, 11920087 }, + { "nrnbkrbq/2pp1pp1/pp6/4p2p/P7/5PPP/1PPPP3/NRNBKRBQ w FBfb - 0 9", 6, 331498921 }, + { "1rnkrbbq/pp1p2pp/1n3p2/1Bp1p3/1P6/1N2P3/P1PP1PPP/1RNKR1BQ w EBeb - 0 9", 1, 33 }, + { "1rnkrbbq/pp1p2pp/1n3p2/1Bp1p3/1P6/1N2P3/P1PP1PPP/1RNKR1BQ w EBeb - 0 9", 2, 992 }, + { "1rnkrbbq/pp1p2pp/1n3p2/1Bp1p3/1P6/1N2P3/P1PP1PPP/1RNKR1BQ w EBeb - 0 9", 3, 32244 }, + { "1rnkrbbq/pp1p2pp/1n3p2/1Bp1p3/1P6/1N2P3/P1PP1PPP/1RNKR1BQ w EBeb - 0 9", 4, 983481 }, + { "1rnkrbbq/pp1p2pp/1n3p2/1Bp1p3/1P6/1N2P3/P1PP1PPP/1RNKR1BQ w EBeb - 0 9", 5, 31703749 }, + { "1rnkrbbq/pp1p2pp/1n3p2/1Bp1p3/1P6/1N2P3/P1PP1PPP/1RNKR1BQ w EBeb - 0 9", 6, 980306735 }, + { "nr1krqbb/p1ppppp1/8/1p5p/1Pn5/5P2/P1PPP1PP/NRNKRQBB w EBeb - 0 9", 1, 24 }, + { "nr1krqbb/p1ppppp1/8/1p5p/1Pn5/5P2/P1PPP1PP/NRNKRQBB w EBeb - 0 9", 2, 670 }, + { "nr1krqbb/p1ppppp1/8/1p5p/1Pn5/5P2/P1PPP1PP/NRNKRQBB w EBeb - 0 9", 3, 15985 }, + { "nr1krqbb/p1ppppp1/8/1p5p/1Pn5/5P2/P1PPP1PP/NRNKRQBB w EBeb - 0 9", 4, 445492 }, + { "nr1krqbb/p1ppppp1/8/1p5p/1Pn5/5P2/P1PPP1PP/NRNKRQBB w EBeb - 0 9", 5, 11371067 }, + { "nr1krqbb/p1ppppp1/8/1p5p/1Pn5/5P2/P1PPP1PP/NRNKRQBB w EBeb - 0 9", 6, 325556465 }, + { "bbq1rkr1/1ppppppp/p1n2n2/8/2P2P2/1P6/PQ1PP1PP/BB1NRKNR w HEe - 3 9", 1, 32 }, + { "bbq1rkr1/1ppppppp/p1n2n2/8/2P2P2/1P6/PQ1PP1PP/BB1NRKNR w HEe - 3 9", 2, 794 }, + { "bbq1rkr1/1ppppppp/p1n2n2/8/2P2P2/1P6/PQ1PP1PP/BB1NRKNR w HEe - 3 9", 3, 26846 }, + { "bbq1rkr1/1ppppppp/p1n2n2/8/2P2P2/1P6/PQ1PP1PP/BB1NRKNR w HEe - 3 9", 4, 689334 }, + { "bbq1rkr1/1ppppppp/p1n2n2/8/2P2P2/1P6/PQ1PP1PP/BB1NRKNR w HEe - 3 9", 5, 24085223 }, + { "bbq1rkr1/1ppppppp/p1n2n2/8/2P2P2/1P6/PQ1PP1PP/BB1NRKNR w HEe - 3 9", 6, 645633370 }, + { "b1nbrknr/1qppp1pp/p4p2/1p6/6P1/P2NP3/1PPP1P1P/BQ1BRKNR w HEhe - 1 9", 1, 25 }, + { "b1nbrknr/1qppp1pp/p4p2/1p6/6P1/P2NP3/1PPP1P1P/BQ1BRKNR w HEhe - 1 9", 2, 663 }, + { "b1nbrknr/1qppp1pp/p4p2/1p6/6P1/P2NP3/1PPP1P1P/BQ1BRKNR w HEhe - 1 9", 3, 17138 }, + { "b1nbrknr/1qppp1pp/p4p2/1p6/6P1/P2NP3/1PPP1P1P/BQ1BRKNR w HEhe - 1 9", 4, 482994 }, + { "b1nbrknr/1qppp1pp/p4p2/1p6/6P1/P2NP3/1PPP1P1P/BQ1BRKNR w HEhe - 1 9", 5, 13157826 }, + { "b1nbrknr/1qppp1pp/p4p2/1p6/6P1/P2NP3/1PPP1P1P/BQ1BRKNR w HEhe - 1 9", 6, 389603029 }, + { "bqnrk1nr/pp2ppbp/6p1/2pp4/2P5/5P2/PPQPP1PP/B1NRKBNR w HDhd - 0 9", 1, 26 }, + { "bqnrk1nr/pp2ppbp/6p1/2pp4/2P5/5P2/PPQPP1PP/B1NRKBNR w HDhd - 0 9", 2, 850 }, + { "bqnrk1nr/pp2ppbp/6p1/2pp4/2P5/5P2/PPQPP1PP/B1NRKBNR w HDhd - 0 9", 3, 22876 }, + { "bqnrk1nr/pp2ppbp/6p1/2pp4/2P5/5P2/PPQPP1PP/B1NRKBNR w HDhd - 0 9", 4, 759768 }, + { "bqnrk1nr/pp2ppbp/6p1/2pp4/2P5/5P2/PPQPP1PP/B1NRKBNR w HDhd - 0 9", 5, 21341087 }, + { "bqnrk1nr/pp2ppbp/6p1/2pp4/2P5/5P2/PPQPP1PP/B1NRKBNR w HDhd - 0 9", 6, 719712622 }, + { "bqnrknrb/1ppp1p1p/p7/6p1/1P2p3/P1PN4/3PPPPP/BQ1RKNRB w GDgd - 0 9", 1, 25 }, + { "bqnrknrb/1ppp1p1p/p7/6p1/1P2p3/P1PN4/3PPPPP/BQ1RKNRB w GDgd - 0 9", 2, 721 }, + { "bqnrknrb/1ppp1p1p/p7/6p1/1P2p3/P1PN4/3PPPPP/BQ1RKNRB w GDgd - 0 9", 3, 19290 }, + { "bqnrknrb/1ppp1p1p/p7/6p1/1P2p3/P1PN4/3PPPPP/BQ1RKNRB w GDgd - 0 9", 4, 581913 }, + { "bqnrknrb/1ppp1p1p/p7/6p1/1P2p3/P1PN4/3PPPPP/BQ1RKNRB w GDgd - 0 9", 5, 16391601 }, + { "bqnrknrb/1ppp1p1p/p7/6p1/1P2p3/P1PN4/3PPPPP/BQ1RKNRB w GDgd - 0 9", 6, 511725087 }, + { "q1b1rknr/pp1pppp1/4n2p/2p1b3/1PP5/4P3/PQ1P1PPP/1BBNRKNR w HEhe - 1 9", 1, 32 }, + { "q1b1rknr/pp1pppp1/4n2p/2p1b3/1PP5/4P3/PQ1P1PPP/1BBNRKNR w HEhe - 1 9", 2, 975 }, + { "q1b1rknr/pp1pppp1/4n2p/2p1b3/1PP5/4P3/PQ1P1PPP/1BBNRKNR w HEhe - 1 9", 3, 32566 }, + { "q1b1rknr/pp1pppp1/4n2p/2p1b3/1PP5/4P3/PQ1P1PPP/1BBNRKNR w HEhe - 1 9", 4, 955493 }, + { "q1b1rknr/pp1pppp1/4n2p/2p1b3/1PP5/4P3/PQ1P1PPP/1BBNRKNR w HEhe - 1 9", 5, 32649943 }, + { "q1b1rknr/pp1pppp1/4n2p/2p1b3/1PP5/4P3/PQ1P1PPP/1BBNRKNR w HEhe - 1 9", 6, 962536105 }, + { "qnbbrknr/1p1ppppp/8/p1p5/5P2/PP1P4/2P1P1PP/QNBBRKNR w HEhe - 0 9", 1, 27 }, + { "qnbbrknr/1p1ppppp/8/p1p5/5P2/PP1P4/2P1P1PP/QNBBRKNR w HEhe - 0 9", 2, 573 }, + { "qnbbrknr/1p1ppppp/8/p1p5/5P2/PP1P4/2P1P1PP/QNBBRKNR w HEhe - 0 9", 3, 16331 }, + { "qnbbrknr/1p1ppppp/8/p1p5/5P2/PP1P4/2P1P1PP/QNBBRKNR w HEhe - 0 9", 4, 391656 }, + { "qnbbrknr/1p1ppppp/8/p1p5/5P2/PP1P4/2P1P1PP/QNBBRKNR w HEhe - 0 9", 5, 11562434 }, + { "qnbbrknr/1p1ppppp/8/p1p5/5P2/PP1P4/2P1P1PP/QNBBRKNR w HEhe - 0 9", 6, 301166330 }, + { "q1brkb1r/p1pppppp/np3B2/8/6n1/1P5N/P1PPPPPP/QN1RKB1R w HDhd - 0 9", 1, 32 }, + { "q1brkb1r/p1pppppp/np3B2/8/6n1/1P5N/P1PPPPPP/QN1RKB1R w HDhd - 0 9", 2, 984 }, + { "q1brkb1r/p1pppppp/np3B2/8/6n1/1P5N/P1PPPPPP/QN1RKB1R w HDhd - 0 9", 3, 31549 }, + { "q1brkb1r/p1pppppp/np3B2/8/6n1/1P5N/P1PPPPPP/QN1RKB1R w HDhd - 0 9", 4, 1007217 }, + { "q1brkb1r/p1pppppp/np3B2/8/6n1/1P5N/P1PPPPPP/QN1RKB1R w HDhd - 0 9", 5, 32597704 }, + { "q1brkb1r/p1pppppp/np3B2/8/6n1/1P5N/P1PPPPPP/QN1RKB1R w HDhd - 0 9", 6, 1075429389 }, + { "qn1rk1rb/p1pppppp/1p2n3/8/2b5/4NPP1/PPPPP1RP/QNBRK2B w Dgd - 4 9", 1, 22 }, + { "qn1rk1rb/p1pppppp/1p2n3/8/2b5/4NPP1/PPPPP1RP/QNBRK2B w Dgd - 4 9", 2, 802 }, + { "qn1rk1rb/p1pppppp/1p2n3/8/2b5/4NPP1/PPPPP1RP/QNBRK2B w Dgd - 4 9", 3, 19156 }, + { "qn1rk1rb/p1pppppp/1p2n3/8/2b5/4NPP1/PPPPP1RP/QNBRK2B w Dgd - 4 9", 4, 697722 }, + { "qn1rk1rb/p1pppppp/1p2n3/8/2b5/4NPP1/PPPPP1RP/QNBRK2B w Dgd - 4 9", 5, 17761431 }, + { "qn1rk1rb/p1pppppp/1p2n3/8/2b5/4NPP1/PPPPP1RP/QNBRK2B w Dgd - 4 9", 6, 650603534 }, + { "qbnrbknr/ppp2p1p/8/3pp1p1/1PP1B3/5N2/P2PPPPP/Q1NRBK1R w HDhd - 0 9", 1, 34 }, + { "qbnrbknr/ppp2p1p/8/3pp1p1/1PP1B3/5N2/P2PPPPP/Q1NRBK1R w HDhd - 0 9", 2, 943 }, + { "qbnrbknr/ppp2p1p/8/3pp1p1/1PP1B3/5N2/P2PPPPP/Q1NRBK1R w HDhd - 0 9", 3, 32506 }, + { "qbnrbknr/ppp2p1p/8/3pp1p1/1PP1B3/5N2/P2PPPPP/Q1NRBK1R w HDhd - 0 9", 4, 930619 }, + { "qbnrbknr/ppp2p1p/8/3pp1p1/1PP1B3/5N2/P2PPPPP/Q1NRBK1R w HDhd - 0 9", 5, 32523099 }, + { "qbnrbknr/ppp2p1p/8/3pp1p1/1PP1B3/5N2/P2PPPPP/Q1NRBK1R w HDhd - 0 9", 6, 955802240 }, + { "qnrbb1nr/pp1p1ppp/2p2k2/4p3/4P3/5PPP/PPPP4/QNRBBKNR w HC - 0 9", 1, 20 }, + { "qnrbb1nr/pp1p1ppp/2p2k2/4p3/4P3/5PPP/PPPP4/QNRBBKNR w HC - 0 9", 2, 460 }, + { "qnrbb1nr/pp1p1ppp/2p2k2/4p3/4P3/5PPP/PPPP4/QNRBBKNR w HC - 0 9", 3, 10287 }, + { "qnrbb1nr/pp1p1ppp/2p2k2/4p3/4P3/5PPP/PPPP4/QNRBBKNR w HC - 0 9", 4, 241640 }, + { "qnrbb1nr/pp1p1ppp/2p2k2/4p3/4P3/5PPP/PPPP4/QNRBBKNR w HC - 0 9", 5, 5846781 }, + { "qnrbb1nr/pp1p1ppp/2p2k2/4p3/4P3/5PPP/PPPP4/QNRBBKNR w HC - 0 9", 6, 140714047 }, + { "qnr1bbnr/ppk1p1pp/3p4/2p2p2/8/2P5/PP1PPPPP/QNKRBBNR w - - 1 9", 1, 19 }, + { "qnr1bbnr/ppk1p1pp/3p4/2p2p2/8/2P5/PP1PPPPP/QNKRBBNR w - - 1 9", 2, 572 }, + { "qnr1bbnr/ppk1p1pp/3p4/2p2p2/8/2P5/PP1PPPPP/QNKRBBNR w - - 1 9", 3, 11834 }, + { "qnr1bbnr/ppk1p1pp/3p4/2p2p2/8/2P5/PP1PPPPP/QNKRBBNR w - - 1 9", 4, 357340 }, + { "qnr1bbnr/ppk1p1pp/3p4/2p2p2/8/2P5/PP1PPPPP/QNKRBBNR w - - 1 9", 5, 7994547 }, + { "qnr1bbnr/ppk1p1pp/3p4/2p2p2/8/2P5/PP1PPPPP/QNKRBBNR w - - 1 9", 6, 243724815 }, + { "qnrkbnrb/1p1p1ppp/2p5/4p3/p7/N1BP4/PPP1PPPP/Q1R1KNRB w gc - 0 9", 1, 27 }, + { "qnrkbnrb/1p1p1ppp/2p5/4p3/p7/N1BP4/PPP1PPPP/Q1R1KNRB w gc - 0 9", 2, 579 }, + { "qnrkbnrb/1p1p1ppp/2p5/4p3/p7/N1BP4/PPP1PPPP/Q1R1KNRB w gc - 0 9", 3, 16233 }, + { "qnrkbnrb/1p1p1ppp/2p5/4p3/p7/N1BP4/PPP1PPPP/Q1R1KNRB w gc - 0 9", 4, 375168 }, + { "qnrkbnrb/1p1p1ppp/2p5/4p3/p7/N1BP4/PPP1PPPP/Q1R1KNRB w gc - 0 9", 5, 10845146 }, + { "qnrkbnrb/1p1p1ppp/2p5/4p3/p7/N1BP4/PPP1PPPP/Q1R1KNRB w gc - 0 9", 6, 268229097 }, + { "qbnrkn1r/1pppp1p1/p3bp2/2BN3p/8/5P2/PPPPP1PP/QBNRK2R w HDhd - 0 9", 1, 40 }, + { "qbnrkn1r/1pppp1p1/p3bp2/2BN3p/8/5P2/PPPPP1PP/QBNRK2R w HDhd - 0 9", 2, 1027 }, + { "qbnrkn1r/1pppp1p1/p3bp2/2BN3p/8/5P2/PPPPP1PP/QBNRK2R w HDhd - 0 9", 3, 38728 }, + { "qbnrkn1r/1pppp1p1/p3bp2/2BN3p/8/5P2/PPPPP1PP/QBNRK2R w HDhd - 0 9", 4, 1059229 }, + { "qbnrkn1r/1pppp1p1/p3bp2/2BN3p/8/5P2/PPPPP1PP/QBNRK2R w HDhd - 0 9", 5, 38511307 }, + { "qbnrkn1r/1pppp1p1/p3bp2/2BN3p/8/5P2/PPPPP1PP/QBNRK2R w HDhd - 0 9", 6, 1104094381 }, + { "qnrbknbr/1pp2ppp/4p3/p6N/2p5/8/PPPPPPPP/Q1RBK1BR w HChc - 0 9", 1, 22 }, + { "qnrbknbr/1pp2ppp/4p3/p6N/2p5/8/PPPPPPPP/Q1RBK1BR w HChc - 0 9", 2, 510 }, + { "qnrbknbr/1pp2ppp/4p3/p6N/2p5/8/PPPPPPPP/Q1RBK1BR w HChc - 0 9", 3, 11844 }, + { "qnrbknbr/1pp2ppp/4p3/p6N/2p5/8/PPPPPPPP/Q1RBK1BR w HChc - 0 9", 4, 300180 }, + { "qnrbknbr/1pp2ppp/4p3/p6N/2p5/8/PPPPPPPP/Q1RBK1BR w HChc - 0 9", 5, 7403327 }, + { "qnrbknbr/1pp2ppp/4p3/p6N/2p5/8/PPPPPPPP/Q1RBK1BR w HChc - 0 9", 6, 200581103 }, + { "1qkrnbbr/p1pppppp/2n5/1p6/8/5NP1/PPPPPP1P/QNRK1BBR w HC - 4 9", 1, 24 }, + { "1qkrnbbr/p1pppppp/2n5/1p6/8/5NP1/PPPPPP1P/QNRK1BBR w HC - 4 9", 2, 549 }, + { "1qkrnbbr/p1pppppp/2n5/1p6/8/5NP1/PPPPPP1P/QNRK1BBR w HC - 4 9", 3, 13987 }, + { "1qkrnbbr/p1pppppp/2n5/1p6/8/5NP1/PPPPPP1P/QNRK1BBR w HC - 4 9", 4, 352037 }, + { "1qkrnbbr/p1pppppp/2n5/1p6/8/5NP1/PPPPPP1P/QNRK1BBR w HC - 4 9", 5, 9396521 }, + { "1qkrnbbr/p1pppppp/2n5/1p6/8/5NP1/PPPPPP1P/QNRK1BBR w HC - 4 9", 6, 255676649 }, + { "q1rknr1b/1ppppppb/2n5/p2B3p/8/1PN3P1/P1PPPP1P/Q1RKNRB1 w FCfc - 3 9", 1, 31 }, + { "q1rknr1b/1ppppppb/2n5/p2B3p/8/1PN3P1/P1PPPP1P/Q1RKNRB1 w FCfc - 3 9", 2, 924 }, + { "q1rknr1b/1ppppppb/2n5/p2B3p/8/1PN3P1/P1PPPP1P/Q1RKNRB1 w FCfc - 3 9", 3, 28520 }, + { "q1rknr1b/1ppppppb/2n5/p2B3p/8/1PN3P1/P1PPPP1P/Q1RKNRB1 w FCfc - 3 9", 4, 861944 }, + { "q1rknr1b/1ppppppb/2n5/p2B3p/8/1PN3P1/P1PPPP1P/Q1RKNRB1 w FCfc - 3 9", 5, 27463479 }, + { "q1rknr1b/1ppppppb/2n5/p2B3p/8/1PN3P1/P1PPPP1P/Q1RKNRB1 w FCfc - 3 9", 6, 847726572 }, + { "bbnqrk1r/pp1pppp1/2p4p/8/6n1/1N1P1P2/PPP1P1PP/BBQ1RKNR w HEhe - 4 9", 1, 24 }, + { "bbnqrk1r/pp1pppp1/2p4p/8/6n1/1N1P1P2/PPP1P1PP/BBQ1RKNR w HEhe - 4 9", 2, 804 }, + { "bbnqrk1r/pp1pppp1/2p4p/8/6n1/1N1P1P2/PPP1P1PP/BBQ1RKNR w HEhe - 4 9", 3, 20147 }, + { "bbnqrk1r/pp1pppp1/2p4p/8/6n1/1N1P1P2/PPP1P1PP/BBQ1RKNR w HEhe - 4 9", 4, 666341 }, + { "bbnqrk1r/pp1pppp1/2p4p/8/6n1/1N1P1P2/PPP1P1PP/BBQ1RKNR w HEhe - 4 9", 5, 18024195 }, + { "bbnqrk1r/pp1pppp1/2p4p/8/6n1/1N1P1P2/PPP1P1PP/BBQ1RKNR w HEhe - 4 9", 6, 595947631 }, + { "bn1brknr/ppp1p1pp/5p2/3p4/6qQ/3P3P/PPP1PPP1/BN1BRKNR w HEhe - 4 9", 1, 25 }, + { "bn1brknr/ppp1p1pp/5p2/3p4/6qQ/3P3P/PPP1PPP1/BN1BRKNR w HEhe - 4 9", 2, 854 }, + { "bn1brknr/ppp1p1pp/5p2/3p4/6qQ/3P3P/PPP1PPP1/BN1BRKNR w HEhe - 4 9", 3, 22991 }, + { "bn1brknr/ppp1p1pp/5p2/3p4/6qQ/3P3P/PPP1PPP1/BN1BRKNR w HEhe - 4 9", 4, 704173 }, + { "bn1brknr/ppp1p1pp/5p2/3p4/6qQ/3P3P/PPP1PPP1/BN1BRKNR w HEhe - 4 9", 5, 20290974 }, + { "bn1brknr/ppp1p1pp/5p2/3p4/6qQ/3P3P/PPP1PPP1/BN1BRKNR w HEhe - 4 9", 6, 600195008 }, + { "1nqrkbnr/2pp1ppp/pp2p3/3b4/2P5/N7/PP1PPPPP/B1QRKBNR w HDhd - 0 9", 1, 22 }, + { "1nqrkbnr/2pp1ppp/pp2p3/3b4/2P5/N7/PP1PPPPP/B1QRKBNR w HDhd - 0 9", 2, 651 }, + { "1nqrkbnr/2pp1ppp/pp2p3/3b4/2P5/N7/PP1PPPPP/B1QRKBNR w HDhd - 0 9", 3, 16173 }, + { "1nqrkbnr/2pp1ppp/pp2p3/3b4/2P5/N7/PP1PPPPP/B1QRKBNR w HDhd - 0 9", 4, 479152 }, + { "1nqrkbnr/2pp1ppp/pp2p3/3b4/2P5/N7/PP1PPPPP/B1QRKBNR w HDhd - 0 9", 5, 13133439 }, + { "1nqrkbnr/2pp1ppp/pp2p3/3b4/2P5/N7/PP1PPPPP/B1QRKBNR w HDhd - 0 9", 6, 390886040 }, + { "bnqrk1rb/1pp1pppp/p2p4/4n3/2PPP3/8/PP3PPP/BNQRKNRB w GDgd - 1 9", 1, 30 }, + { "bnqrk1rb/1pp1pppp/p2p4/4n3/2PPP3/8/PP3PPP/BNQRKNRB w GDgd - 1 9", 2, 950 }, + { "bnqrk1rb/1pp1pppp/p2p4/4n3/2PPP3/8/PP3PPP/BNQRKNRB w GDgd - 1 9", 3, 28169 }, + { "bnqrk1rb/1pp1pppp/p2p4/4n3/2PPP3/8/PP3PPP/BNQRKNRB w GDgd - 1 9", 4, 889687 }, + { "bnqrk1rb/1pp1pppp/p2p4/4n3/2PPP3/8/PP3PPP/BNQRKNRB w GDgd - 1 9", 5, 27610213 }, + { "bnqrk1rb/1pp1pppp/p2p4/4n3/2PPP3/8/PP3PPP/BNQRKNRB w GDgd - 1 9", 6, 880739164 }, + { "nbb1rknr/1ppq1ppp/3p4/p3p3/4P3/1N2R3/PPPP1PPP/1BBQ1KNR w Hhe - 2 9", 1, 33 }, + { "nbb1rknr/1ppq1ppp/3p4/p3p3/4P3/1N2R3/PPPP1PPP/1BBQ1KNR w Hhe - 2 9", 2, 988 }, + { "nbb1rknr/1ppq1ppp/3p4/p3p3/4P3/1N2R3/PPPP1PPP/1BBQ1KNR w Hhe - 2 9", 3, 31293 }, + { "nbb1rknr/1ppq1ppp/3p4/p3p3/4P3/1N2R3/PPPP1PPP/1BBQ1KNR w Hhe - 2 9", 4, 967575 }, + { "nbb1rknr/1ppq1ppp/3p4/p3p3/4P3/1N2R3/PPPP1PPP/1BBQ1KNR w Hhe - 2 9", 5, 30894863 }, + { "nbb1rknr/1ppq1ppp/3p4/p3p3/4P3/1N2R3/PPPP1PPP/1BBQ1KNR w Hhe - 2 9", 6, 985384035 }, + { "nqbbrknr/2ppp2p/pp4p1/5p2/7P/3P1P2/PPPBP1P1/NQ1BRKNR w HEhe - 0 9", 1, 27 }, + { "nqbbrknr/2ppp2p/pp4p1/5p2/7P/3P1P2/PPPBP1P1/NQ1BRKNR w HEhe - 0 9", 2, 492 }, + { "nqbbrknr/2ppp2p/pp4p1/5p2/7P/3P1P2/PPPBP1P1/NQ1BRKNR w HEhe - 0 9", 3, 13266 }, + { "nqbbrknr/2ppp2p/pp4p1/5p2/7P/3P1P2/PPPBP1P1/NQ1BRKNR w HEhe - 0 9", 4, 276569 }, + { "nqbbrknr/2ppp2p/pp4p1/5p2/7P/3P1P2/PPPBP1P1/NQ1BRKNR w HEhe - 0 9", 5, 7583292 }, + { "nqbbrknr/2ppp2p/pp4p1/5p2/7P/3P1P2/PPPBP1P1/NQ1BRKNR w HEhe - 0 9", 6, 175376176 }, + { "1qbrkb1r/pppppppp/8/3n4/4P1n1/PN6/1PPP1P1P/1QBRKBNR w HDhd - 3 9", 1, 28 }, + { "1qbrkb1r/pppppppp/8/3n4/4P1n1/PN6/1PPP1P1P/1QBRKBNR w HDhd - 3 9", 2, 800 }, + { "1qbrkb1r/pppppppp/8/3n4/4P1n1/PN6/1PPP1P1P/1QBRKBNR w HDhd - 3 9", 3, 21982 }, + { "1qbrkb1r/pppppppp/8/3n4/4P1n1/PN6/1PPP1P1P/1QBRKBNR w HDhd - 3 9", 4, 630374 }, + { "1qbrkb1r/pppppppp/8/3n4/4P1n1/PN6/1PPP1P1P/1QBRKBNR w HDhd - 3 9", 5, 17313279 }, + { "1qbrkb1r/pppppppp/8/3n4/4P1n1/PN6/1PPP1P1P/1QBRKBNR w HDhd - 3 9", 6, 507140861 }, + { "1qbrknrb/1p1ppppp/1np5/8/p4P1P/4P1N1/PPPP2P1/NQBRK1RB w GDgd - 0 9", 1, 21 }, + { "1qbrknrb/1p1ppppp/1np5/8/p4P1P/4P1N1/PPPP2P1/NQBRK1RB w GDgd - 0 9", 2, 482 }, + { "1qbrknrb/1p1ppppp/1np5/8/p4P1P/4P1N1/PPPP2P1/NQBRK1RB w GDgd - 0 9", 3, 10581 }, + { "1qbrknrb/1p1ppppp/1np5/8/p4P1P/4P1N1/PPPP2P1/NQBRK1RB w GDgd - 0 9", 4, 267935 }, + { "1qbrknrb/1p1ppppp/1np5/8/p4P1P/4P1N1/PPPP2P1/NQBRK1RB w GDgd - 0 9", 5, 6218644 }, + { "1qbrknrb/1p1ppppp/1np5/8/p4P1P/4P1N1/PPPP2P1/NQBRK1RB w GDgd - 0 9", 6, 168704845 }, + { "nbqrbkr1/ppp1pppp/8/3p4/6n1/2P2PPN/PP1PP2P/NBQRBK1R w HDd - 1 9", 1, 29 }, + { "nbqrbkr1/ppp1pppp/8/3p4/6n1/2P2PPN/PP1PP2P/NBQRBK1R w HDd - 1 9", 2, 921 }, + { "nbqrbkr1/ppp1pppp/8/3p4/6n1/2P2PPN/PP1PP2P/NBQRBK1R w HDd - 1 9", 3, 25748 }, + { "nbqrbkr1/ppp1pppp/8/3p4/6n1/2P2PPN/PP1PP2P/NBQRBK1R w HDd - 1 9", 4, 840262 }, + { "nbqrbkr1/ppp1pppp/8/3p4/6n1/2P2PPN/PP1PP2P/NBQRBK1R w HDd - 1 9", 5, 24138518 }, + { "nbqrbkr1/ppp1pppp/8/3p4/6n1/2P2PPN/PP1PP2P/NBQRBK1R w HDd - 1 9", 6, 806554650 }, + { "nqrb1knr/1ppbpp1p/p7/3p2p1/2P3P1/5P1P/PP1PP3/NQRBBKNR w HChc - 1 9", 1, 31 }, + { "nqrb1knr/1ppbpp1p/p7/3p2p1/2P3P1/5P1P/PP1PP3/NQRBBKNR w HChc - 1 9", 2, 803 }, + { "nqrb1knr/1ppbpp1p/p7/3p2p1/2P3P1/5P1P/PP1PP3/NQRBBKNR w HChc - 1 9", 3, 25857 }, + { "nqrb1knr/1ppbpp1p/p7/3p2p1/2P3P1/5P1P/PP1PP3/NQRBBKNR w HChc - 1 9", 4, 665799 }, + { "nqrb1knr/1ppbpp1p/p7/3p2p1/2P3P1/5P1P/PP1PP3/NQRBBKNR w HChc - 1 9", 5, 21998733 }, + { "nqrb1knr/1ppbpp1p/p7/3p2p1/2P3P1/5P1P/PP1PP3/NQRBBKNR w HChc - 1 9", 6, 583349773 }, + { "1qrkbbr1/pppp1ppp/1n3n2/4p3/5P2/1N6/PPPPP1PP/1QRKBBNR w HCc - 0 9", 1, 25 }, + { "1qrkbbr1/pppp1ppp/1n3n2/4p3/5P2/1N6/PPPPP1PP/1QRKBBNR w HCc - 0 9", 2, 715 }, + { "1qrkbbr1/pppp1ppp/1n3n2/4p3/5P2/1N6/PPPPP1PP/1QRKBBNR w HCc - 0 9", 3, 19118 }, + { "1qrkbbr1/pppp1ppp/1n3n2/4p3/5P2/1N6/PPPPP1PP/1QRKBBNR w HCc - 0 9", 4, 556325 }, + { "1qrkbbr1/pppp1ppp/1n3n2/4p3/5P2/1N6/PPPPP1PP/1QRKBBNR w HCc - 0 9", 5, 15514933 }, + { "1qrkbbr1/pppp1ppp/1n3n2/4p3/5P2/1N6/PPPPP1PP/1QRKBBNR w HCc - 0 9", 6, 459533767 }, + { "nqrkb1rb/pp2pppp/2p1n3/3p4/3PP1N1/8/PPP2PPP/NQRKB1RB w GCgc - 0 9", 1, 26 }, + { "nqrkb1rb/pp2pppp/2p1n3/3p4/3PP1N1/8/PPP2PPP/NQRKB1RB w GCgc - 0 9", 2, 795 }, + { "nqrkb1rb/pp2pppp/2p1n3/3p4/3PP1N1/8/PPP2PPP/NQRKB1RB w GCgc - 0 9", 3, 21752 }, + { "nqrkb1rb/pp2pppp/2p1n3/3p4/3PP1N1/8/PPP2PPP/NQRKB1RB w GCgc - 0 9", 4, 679387 }, + { "nqrkb1rb/pp2pppp/2p1n3/3p4/3PP1N1/8/PPP2PPP/NQRKB1RB w GCgc - 0 9", 5, 19185851 }, + { "nqrkb1rb/pp2pppp/2p1n3/3p4/3PP1N1/8/PPP2PPP/NQRKB1RB w GCgc - 0 9", 6, 616508881 }, + { "nb1rknbr/pp2ppp1/8/2Bp3p/6P1/2P2P1q/PP1PP2P/NBQRKN1R w HDhd - 0 9", 1, 35 }, + { "nb1rknbr/pp2ppp1/8/2Bp3p/6P1/2P2P1q/PP1PP2P/NBQRKN1R w HDhd - 0 9", 2, 1391 }, + { "nb1rknbr/pp2ppp1/8/2Bp3p/6P1/2P2P1q/PP1PP2P/NBQRKN1R w HDhd - 0 9", 3, 43025 }, + { "nb1rknbr/pp2ppp1/8/2Bp3p/6P1/2P2P1q/PP1PP2P/NBQRKN1R w HDhd - 0 9", 4, 1726888 }, + { "nb1rknbr/pp2ppp1/8/2Bp3p/6P1/2P2P1q/PP1PP2P/NBQRKN1R w HDhd - 0 9", 5, 53033675 }, + { "nb1rknbr/pp2ppp1/8/2Bp3p/6P1/2P2P1q/PP1PP2P/NBQRKN1R w HDhd - 0 9", 6, 2139267832 }, + { "nqrbkn1r/pp1pp1pp/8/2p2p2/5P2/P3B2P/1PbPP1P1/NQRBKN1R w HChc - 0 9", 1, 23 }, + { "nqrbkn1r/pp1pp1pp/8/2p2p2/5P2/P3B2P/1PbPP1P1/NQRBKN1R w HChc - 0 9", 2, 758 }, + { "nqrbkn1r/pp1pp1pp/8/2p2p2/5P2/P3B2P/1PbPP1P1/NQRBKN1R w HChc - 0 9", 3, 19439 }, + { "nqrbkn1r/pp1pp1pp/8/2p2p2/5P2/P3B2P/1PbPP1P1/NQRBKN1R w HChc - 0 9", 4, 653854 }, + { "nqrbkn1r/pp1pp1pp/8/2p2p2/5P2/P3B2P/1PbPP1P1/NQRBKN1R w HChc - 0 9", 5, 18296195 }, + { "nqrbkn1r/pp1pp1pp/8/2p2p2/5P2/P3B2P/1PbPP1P1/NQRBKN1R w HChc - 0 9", 6, 628403401 }, + { "nqrknbbr/pp1pppp1/7p/2p5/7P/1P1N4/P1PPPPPB/NQRK1B1R w HChc - 2 9", 1, 29 }, + { "nqrknbbr/pp1pppp1/7p/2p5/7P/1P1N4/P1PPPPPB/NQRK1B1R w HChc - 2 9", 2, 824 }, + { "nqrknbbr/pp1pppp1/7p/2p5/7P/1P1N4/P1PPPPPB/NQRK1B1R w HChc - 2 9", 3, 23137 }, + { "nqrknbbr/pp1pppp1/7p/2p5/7P/1P1N4/P1PPPPPB/NQRK1B1R w HChc - 2 9", 4, 683686 }, + { "nqrknbbr/pp1pppp1/7p/2p5/7P/1P1N4/P1PPPPPB/NQRK1B1R w HChc - 2 9", 5, 19429491 }, + { "nqrknbbr/pp1pppp1/7p/2p5/7P/1P1N4/P1PPPPPB/NQRK1B1R w HChc - 2 9", 6, 595493802 }, + { "1qrknrbb/B1p1pppp/8/1p1p4/2n2P2/1P6/P1PPP1PP/NQRKNR1B w FCfc - 0 9", 1, 28 }, + { "1qrknrbb/B1p1pppp/8/1p1p4/2n2P2/1P6/P1PPP1PP/NQRKNR1B w FCfc - 0 9", 2, 771 }, + { "1qrknrbb/B1p1pppp/8/1p1p4/2n2P2/1P6/P1PPP1PP/NQRKNR1B w FCfc - 0 9", 3, 20237 }, + { "1qrknrbb/B1p1pppp/8/1p1p4/2n2P2/1P6/P1PPP1PP/NQRKNR1B w FCfc - 0 9", 4, 581721 }, + { "1qrknrbb/B1p1pppp/8/1p1p4/2n2P2/1P6/P1PPP1PP/NQRKNR1B w FCfc - 0 9", 5, 16065378 }, + { "1qrknrbb/B1p1pppp/8/1p1p4/2n2P2/1P6/P1PPP1PP/NQRKNR1B w FCfc - 0 9", 6, 483037840 }, + { "bbnrqk1r/1ppppppp/8/7n/1p6/P6P/1BPPPPP1/1BNRQKNR w HDhd - 0 9", 1, 25 }, + { "bbnrqk1r/1ppppppp/8/7n/1p6/P6P/1BPPPPP1/1BNRQKNR w HDhd - 0 9", 2, 601 }, + { "bbnrqk1r/1ppppppp/8/7n/1p6/P6P/1BPPPPP1/1BNRQKNR w HDhd - 0 9", 3, 15471 }, + { "bbnrqk1r/1ppppppp/8/7n/1p6/P6P/1BPPPPP1/1BNRQKNR w HDhd - 0 9", 4, 396661 }, + { "bbnrqk1r/1ppppppp/8/7n/1p6/P6P/1BPPPPP1/1BNRQKNR w HDhd - 0 9", 5, 10697065 }, + { "bbnrqk1r/1ppppppp/8/7n/1p6/P6P/1BPPPPP1/1BNRQKNR w HDhd - 0 9", 6, 289472497 }, + { "bnrbqknr/ppp3p1/3ppp1Q/7p/3P4/1P6/P1P1PPPP/BNRB1KNR w HChc - 0 9", 1, 32 }, + { "bnrbqknr/ppp3p1/3ppp1Q/7p/3P4/1P6/P1P1PPPP/BNRB1KNR w HChc - 0 9", 2, 845 }, + { "bnrbqknr/ppp3p1/3ppp1Q/7p/3P4/1P6/P1P1PPPP/BNRB1KNR w HChc - 0 9", 3, 26876 }, + { "bnrbqknr/ppp3p1/3ppp1Q/7p/3P4/1P6/P1P1PPPP/BNRB1KNR w HChc - 0 9", 4, 742888 }, + { "bnrbqknr/ppp3p1/3ppp1Q/7p/3P4/1P6/P1P1PPPP/BNRB1KNR w HChc - 0 9", 5, 23717883 }, + { "bnrbqknr/ppp3p1/3ppp1Q/7p/3P4/1P6/P1P1PPPP/BNRB1KNR w HChc - 0 9", 6, 682154649 }, + { "bn1qkb1r/pprppppp/8/2p5/2PPP1n1/8/PPR2PPP/BN1QKBNR w Hh - 1 9", 1, 32 }, + { "bn1qkb1r/pprppppp/8/2p5/2PPP1n1/8/PPR2PPP/BN1QKBNR w Hh - 1 9", 2, 856 }, + { "bn1qkb1r/pprppppp/8/2p5/2PPP1n1/8/PPR2PPP/BN1QKBNR w Hh - 1 9", 3, 27829 }, + { "bn1qkb1r/pprppppp/8/2p5/2PPP1n1/8/PPR2PPP/BN1QKBNR w Hh - 1 9", 4, 768595 }, + { "bn1qkb1r/pprppppp/8/2p5/2PPP1n1/8/PPR2PPP/BN1QKBNR w Hh - 1 9", 5, 25245957 }, + { "bn1qkb1r/pprppppp/8/2p5/2PPP1n1/8/PPR2PPP/BN1QKBNR w Hh - 1 9", 6, 727424329 }, + { "1nrqknrb/p1pp1ppp/1p2p3/3N4/5P1P/5b2/PPPPP3/B1RQKNRB w GCgc - 2 9", 1, 33 }, + { "1nrqknrb/p1pp1ppp/1p2p3/3N4/5P1P/5b2/PPPPP3/B1RQKNRB w GCgc - 2 9", 2, 873 }, + { "1nrqknrb/p1pp1ppp/1p2p3/3N4/5P1P/5b2/PPPPP3/B1RQKNRB w GCgc - 2 9", 3, 27685 }, + { "1nrqknrb/p1pp1ppp/1p2p3/3N4/5P1P/5b2/PPPPP3/B1RQKNRB w GCgc - 2 9", 4, 779473 }, + { "1nrqknrb/p1pp1ppp/1p2p3/3N4/5P1P/5b2/PPPPP3/B1RQKNRB w GCgc - 2 9", 5, 25128076 }, + { "1nrqknrb/p1pp1ppp/1p2p3/3N4/5P1P/5b2/PPPPP3/B1RQKNRB w GCgc - 2 9", 6, 745401024 }, + { "nbbrqrk1/pppppppp/8/2N1n3/P7/6P1/1PPPPP1P/1BBRQKNR w HD - 3 9", 1, 25 }, + { "nbbrqrk1/pppppppp/8/2N1n3/P7/6P1/1PPPPP1P/1BBRQKNR w HD - 3 9", 2, 555 }, + { "nbbrqrk1/pppppppp/8/2N1n3/P7/6P1/1PPPPP1P/1BBRQKNR w HD - 3 9", 3, 14339 }, + { "nbbrqrk1/pppppppp/8/2N1n3/P7/6P1/1PPPPP1P/1BBRQKNR w HD - 3 9", 4, 342296 }, + { "nbbrqrk1/pppppppp/8/2N1n3/P7/6P1/1PPPPP1P/1BBRQKNR w HD - 3 9", 5, 9153089 }, + { "nbbrqrk1/pppppppp/8/2N1n3/P7/6P1/1PPPPP1P/1BBRQKNR w HD - 3 9", 6, 234841945 }, + { "1rbbqknr/1ppp1pp1/1n2p3/p6p/4P1P1/P6N/1PPP1P1P/NRBBQK1R w HBhb - 0 9", 1, 25 }, + { "1rbbqknr/1ppp1pp1/1n2p3/p6p/4P1P1/P6N/1PPP1P1P/NRBBQK1R w HBhb - 0 9", 2, 693 }, + { "1rbbqknr/1ppp1pp1/1n2p3/p6p/4P1P1/P6N/1PPP1P1P/NRBBQK1R w HBhb - 0 9", 3, 18652 }, + { "1rbbqknr/1ppp1pp1/1n2p3/p6p/4P1P1/P6N/1PPP1P1P/NRBBQK1R w HBhb - 0 9", 4, 528070 }, + { "1rbbqknr/1ppp1pp1/1n2p3/p6p/4P1P1/P6N/1PPP1P1P/NRBBQK1R w HBhb - 0 9", 5, 15133381 }, + { "1rbbqknr/1ppp1pp1/1n2p3/p6p/4P1P1/P6N/1PPP1P1P/NRBBQK1R w HBhb - 0 9", 6, 439344945 }, + { "nrq1kbnr/p1pbpppp/3p4/1p6/6P1/1N3N2/PPPPPP1P/1RBQKB1R w HBhb - 4 9", 1, 24 }, + { "nrq1kbnr/p1pbpppp/3p4/1p6/6P1/1N3N2/PPPPPP1P/1RBQKB1R w HBhb - 4 9", 2, 648 }, + { "nrq1kbnr/p1pbpppp/3p4/1p6/6P1/1N3N2/PPPPPP1P/1RBQKB1R w HBhb - 4 9", 3, 16640 }, + { "nrq1kbnr/p1pbpppp/3p4/1p6/6P1/1N3N2/PPPPPP1P/1RBQKB1R w HBhb - 4 9", 4, 471192 }, + { "nrq1kbnr/p1pbpppp/3p4/1p6/6P1/1N3N2/PPPPPP1P/1RBQKB1R w HBhb - 4 9", 5, 12871967 }, + { "nrq1kbnr/p1pbpppp/3p4/1p6/6P1/1N3N2/PPPPPP1P/1RBQKB1R w HBhb - 4 9", 6, 380436777 }, + { "nr1qknr1/p1pppp1p/b5p1/1p6/8/P4PP1/1bPPP1RP/NRBQKN1B w Bgb - 0 9", 1, 18 }, + { "nr1qknr1/p1pppp1p/b5p1/1p6/8/P4PP1/1bPPP1RP/NRBQKN1B w Bgb - 0 9", 2, 533 }, + { "nr1qknr1/p1pppp1p/b5p1/1p6/8/P4PP1/1bPPP1RP/NRBQKN1B w Bgb - 0 9", 3, 11215 }, + { "nr1qknr1/p1pppp1p/b5p1/1p6/8/P4PP1/1bPPP1RP/NRBQKN1B w Bgb - 0 9", 4, 331243 }, + { "nr1qknr1/p1pppp1p/b5p1/1p6/8/P4PP1/1bPPP1RP/NRBQKN1B w Bgb - 0 9", 5, 7777833 }, + { "nr1qknr1/p1pppp1p/b5p1/1p6/8/P4PP1/1bPPP1RP/NRBQKN1B w Bgb - 0 9", 6, 234905172 }, + { "nbrqbknr/1ppp2pp/8/4pp2/p2PP1P1/7N/PPP2P1P/NBRQBK1R w HChc - 0 9", 1, 29 }, + { "nbrqbknr/1ppp2pp/8/4pp2/p2PP1P1/7N/PPP2P1P/NBRQBK1R w HChc - 0 9", 2, 803 }, + { "nbrqbknr/1ppp2pp/8/4pp2/p2PP1P1/7N/PPP2P1P/NBRQBK1R w HChc - 0 9", 3, 24416 }, + { "nbrqbknr/1ppp2pp/8/4pp2/p2PP1P1/7N/PPP2P1P/NBRQBK1R w HChc - 0 9", 4, 706648 }, + { "nbrqbknr/1ppp2pp/8/4pp2/p2PP1P1/7N/PPP2P1P/NBRQBK1R w HChc - 0 9", 5, 22305910 }, + { "nbrqbknr/1ppp2pp/8/4pp2/p2PP1P1/7N/PPP2P1P/NBRQBK1R w HChc - 0 9", 6, 672322762 }, + { "nr1b1k1r/ppp1pppp/2bp1n2/6P1/2P3q1/5P2/PP1PP2P/NRQBBKNR w HBhb - 1 9", 1, 27 }, + { "nr1b1k1r/ppp1pppp/2bp1n2/6P1/2P3q1/5P2/PP1PP2P/NRQBBKNR w HBhb - 1 9", 2, 1199 }, + { "nr1b1k1r/ppp1pppp/2bp1n2/6P1/2P3q1/5P2/PP1PP2P/NRQBBKNR w HBhb - 1 9", 3, 30908 }, + { "nr1b1k1r/ppp1pppp/2bp1n2/6P1/2P3q1/5P2/PP1PP2P/NRQBBKNR w HBhb - 1 9", 4, 1296241 }, + { "nr1b1k1r/ppp1pppp/2bp1n2/6P1/2P3q1/5P2/PP1PP2P/NRQBBKNR w HBhb - 1 9", 5, 35121759 }, + { "nr1b1k1r/ppp1pppp/2bp1n2/6P1/2P3q1/5P2/PP1PP2P/NRQBBKNR w HBhb - 1 9", 6, 1418677099 }, + { "nrqkbbnr/2pppp1p/p7/1p6/2P1Pp2/8/PPNP2PP/1RQKBBNR w HBhb - 0 9", 1, 28 }, + { "nrqkbbnr/2pppp1p/p7/1p6/2P1Pp2/8/PPNP2PP/1RQKBBNR w HBhb - 0 9", 2, 613 }, + { "nrqkbbnr/2pppp1p/p7/1p6/2P1Pp2/8/PPNP2PP/1RQKBBNR w HBhb - 0 9", 3, 17874 }, + { "nrqkbbnr/2pppp1p/p7/1p6/2P1Pp2/8/PPNP2PP/1RQKBBNR w HBhb - 0 9", 4, 432750 }, + { "nrqkbbnr/2pppp1p/p7/1p6/2P1Pp2/8/PPNP2PP/1RQKBBNR w HBhb - 0 9", 5, 13097064 }, + { "nrqkbbnr/2pppp1p/p7/1p6/2P1Pp2/8/PPNP2PP/1RQKBBNR w HBhb - 0 9", 6, 345294379 }, + { "1rqkbnrb/pp1ppp1p/1n4p1/B1p5/3PP3/4N3/PPP2PPP/NRQK2RB w GBgb - 0 9", 1, 33 }, + { "1rqkbnrb/pp1ppp1p/1n4p1/B1p5/3PP3/4N3/PPP2PPP/NRQK2RB w GBgb - 0 9", 2, 723 }, + { "1rqkbnrb/pp1ppp1p/1n4p1/B1p5/3PP3/4N3/PPP2PPP/NRQK2RB w GBgb - 0 9", 3, 23991 }, + { "1rqkbnrb/pp1ppp1p/1n4p1/B1p5/3PP3/4N3/PPP2PPP/NRQK2RB w GBgb - 0 9", 4, 590970 }, + { "1rqkbnrb/pp1ppp1p/1n4p1/B1p5/3PP3/4N3/PPP2PPP/NRQK2RB w GBgb - 0 9", 5, 19715083 }, + { "1rqkbnrb/pp1ppp1p/1n4p1/B1p5/3PP3/4N3/PPP2PPP/NRQK2RB w GBgb - 0 9", 6, 535650233 }, + { "nbrqkn1r/1pppp2p/5pp1/p2b4/5P2/P2PN3/1PP1P1PP/NBRQK1BR w HChc - 2 9", 1, 23 }, + { "nbrqkn1r/1pppp2p/5pp1/p2b4/5P2/P2PN3/1PP1P1PP/NBRQK1BR w HChc - 2 9", 2, 607 }, + { "nbrqkn1r/1pppp2p/5pp1/p2b4/5P2/P2PN3/1PP1P1PP/NBRQK1BR w HChc - 2 9", 3, 15482 }, + { "nbrqkn1r/1pppp2p/5pp1/p2b4/5P2/P2PN3/1PP1P1PP/NBRQK1BR w HChc - 2 9", 4, 400970 }, + { "nbrqkn1r/1pppp2p/5pp1/p2b4/5P2/P2PN3/1PP1P1PP/NBRQK1BR w HChc - 2 9", 5, 11026383 }, + { "nbrqkn1r/1pppp2p/5pp1/p2b4/5P2/P2PN3/1PP1P1PP/NBRQK1BR w HChc - 2 9", 6, 290708878 }, + { "nrqbknbr/pp1pppp1/8/2p4p/P3PP2/8/1PPP2PP/NRQBKNBR w HBhb - 1 9", 1, 26 }, + { "nrqbknbr/pp1pppp1/8/2p4p/P3PP2/8/1PPP2PP/NRQBKNBR w HBhb - 1 9", 2, 700 }, + { "nrqbknbr/pp1pppp1/8/2p4p/P3PP2/8/1PPP2PP/NRQBKNBR w HBhb - 1 9", 3, 19371 }, + { "nrqbknbr/pp1pppp1/8/2p4p/P3PP2/8/1PPP2PP/NRQBKNBR w HBhb - 1 9", 4, 556026 }, + { "nrqbknbr/pp1pppp1/8/2p4p/P3PP2/8/1PPP2PP/NRQBKNBR w HBhb - 1 9", 5, 16058815 }, + { "nrqbknbr/pp1pppp1/8/2p4p/P3PP2/8/1PPP2PP/NRQBKNBR w HBhb - 1 9", 6, 485460242 }, + { "nrqknbbr/p2pppp1/1pp5/6Qp/3P4/1P3P2/P1P1P1PP/NR1KNBBR w HBhb - 0 9", 1, 40 }, + { "nrqknbbr/p2pppp1/1pp5/6Qp/3P4/1P3P2/P1P1P1PP/NR1KNBBR w HBhb - 0 9", 2, 905 }, + { "nrqknbbr/p2pppp1/1pp5/6Qp/3P4/1P3P2/P1P1P1PP/NR1KNBBR w HBhb - 0 9", 3, 32932 }, + { "nrqknbbr/p2pppp1/1pp5/6Qp/3P4/1P3P2/P1P1P1PP/NR1KNBBR w HBhb - 0 9", 4, 829746 }, + { "nrqknbbr/p2pppp1/1pp5/6Qp/3P4/1P3P2/P1P1P1PP/NR1KNBBR w HBhb - 0 9", 5, 29263502 }, + { "nrqknbbr/p2pppp1/1pp5/6Qp/3P4/1P3P2/P1P1P1PP/NR1KNBBR w HBhb - 0 9", 6, 791963709 }, + { "nrqknrbb/1p3ppp/p2p4/2p1p3/1P6/3PP1P1/P1P2P1P/NRQKNRBB w FBfb - 0 9", 1, 29 }, + { "nrqknrbb/1p3ppp/p2p4/2p1p3/1P6/3PP1P1/P1P2P1P/NRQKNRBB w FBfb - 0 9", 2, 780 }, + { "nrqknrbb/1p3ppp/p2p4/2p1p3/1P6/3PP1P1/P1P2P1P/NRQKNRBB w FBfb - 0 9", 3, 22643 }, + { "nrqknrbb/1p3ppp/p2p4/2p1p3/1P6/3PP1P1/P1P2P1P/NRQKNRBB w FBfb - 0 9", 4, 654495 }, + { "nrqknrbb/1p3ppp/p2p4/2p1p3/1P6/3PP1P1/P1P2P1P/NRQKNRBB w FBfb - 0 9", 5, 19532077 }, + { "nrqknrbb/1p3ppp/p2p4/2p1p3/1P6/3PP1P1/P1P2P1P/NRQKNRBB w FBfb - 0 9", 6, 593181101 }, + { "1bnrkqnr/p1pppp2/7p/1p4p1/4b3/7N/PPPP1PPP/BBNRKQ1R w HDhd - 0 9", 1, 25 }, + { "1bnrkqnr/p1pppp2/7p/1p4p1/4b3/7N/PPPP1PPP/BBNRKQ1R w HDhd - 0 9", 2, 725 }, + { "1bnrkqnr/p1pppp2/7p/1p4p1/4b3/7N/PPPP1PPP/BBNRKQ1R w HDhd - 0 9", 3, 19808 }, + { "1bnrkqnr/p1pppp2/7p/1p4p1/4b3/7N/PPPP1PPP/BBNRKQ1R w HDhd - 0 9", 4, 565006 }, + { "1bnrkqnr/p1pppp2/7p/1p4p1/4b3/7N/PPPP1PPP/BBNRKQ1R w HDhd - 0 9", 5, 16661676 }, + { "1bnrkqnr/p1pppp2/7p/1p4p1/4b3/7N/PPPP1PPP/BBNRKQ1R w HDhd - 0 9", 6, 487354613 }, + { "bnrbkq1r/pp2p1pp/5n2/2pp1p2/P7/N1PP4/1P2PPPP/B1RBKQNR w HChc - 1 9", 1, 24 }, + { "bnrbkq1r/pp2p1pp/5n2/2pp1p2/P7/N1PP4/1P2PPPP/B1RBKQNR w HChc - 1 9", 2, 745 }, + { "bnrbkq1r/pp2p1pp/5n2/2pp1p2/P7/N1PP4/1P2PPPP/B1RBKQNR w HChc - 1 9", 3, 18494 }, + { "bnrbkq1r/pp2p1pp/5n2/2pp1p2/P7/N1PP4/1P2PPPP/B1RBKQNR w HChc - 1 9", 4, 584015 }, + { "bnrbkq1r/pp2p1pp/5n2/2pp1p2/P7/N1PP4/1P2PPPP/B1RBKQNR w HChc - 1 9", 5, 15079602 }, + { "bnrbkq1r/pp2p1pp/5n2/2pp1p2/P7/N1PP4/1P2PPPP/B1RBKQNR w HChc - 1 9", 6, 488924040 }, + { "2rkqbnr/p1pppppp/2b5/1pn5/1P3P1Q/2B5/P1PPP1PP/1NRK1BNR w HChc - 3 9", 1, 33 }, + { "2rkqbnr/p1pppppp/2b5/1pn5/1P3P1Q/2B5/P1PPP1PP/1NRK1BNR w HChc - 3 9", 2, 904 }, + { "2rkqbnr/p1pppppp/2b5/1pn5/1P3P1Q/2B5/P1PPP1PP/1NRK1BNR w HChc - 3 9", 3, 30111 }, + { "2rkqbnr/p1pppppp/2b5/1pn5/1P3P1Q/2B5/P1PPP1PP/1NRK1BNR w HChc - 3 9", 4, 840025 }, + { "2rkqbnr/p1pppppp/2b5/1pn5/1P3P1Q/2B5/P1PPP1PP/1NRK1BNR w HChc - 3 9", 5, 28194726 }, + { "2rkqbnr/p1pppppp/2b5/1pn5/1P3P1Q/2B5/P1PPP1PP/1NRK1BNR w HChc - 3 9", 6, 801757709 }, + { "bnrkqnrb/2pppp2/8/pp4pp/1P5P/6P1/P1PPPPB1/BNRKQNR1 w GCgc - 0 9", 1, 34 }, + { "bnrkqnrb/2pppp2/8/pp4pp/1P5P/6P1/P1PPPPB1/BNRKQNR1 w GCgc - 0 9", 2, 1059 }, + { "bnrkqnrb/2pppp2/8/pp4pp/1P5P/6P1/P1PPPPB1/BNRKQNR1 w GCgc - 0 9", 3, 34090 }, + { "bnrkqnrb/2pppp2/8/pp4pp/1P5P/6P1/P1PPPPB1/BNRKQNR1 w GCgc - 0 9", 4, 1054311 }, + { "bnrkqnrb/2pppp2/8/pp4pp/1P5P/6P1/P1PPPPB1/BNRKQNR1 w GCgc - 0 9", 5, 33195397 }, + { "bnrkqnrb/2pppp2/8/pp4pp/1P5P/6P1/P1PPPPB1/BNRKQNR1 w GCgc - 0 9", 6, 1036498304 }, + { "1bbrkq1r/pppp2pp/1n2pp1n/8/2PP4/1N4P1/PP2PP1P/1BBRKQNR w HDhd - 1 9", 1, 33 }, + { "1bbrkq1r/pppp2pp/1n2pp1n/8/2PP4/1N4P1/PP2PP1P/1BBRKQNR w HDhd - 1 9", 2, 891 }, + { "1bbrkq1r/pppp2pp/1n2pp1n/8/2PP4/1N4P1/PP2PP1P/1BBRKQNR w HDhd - 1 9", 3, 28907 }, + { "1bbrkq1r/pppp2pp/1n2pp1n/8/2PP4/1N4P1/PP2PP1P/1BBRKQNR w HDhd - 1 9", 4, 814247 }, + { "1bbrkq1r/pppp2pp/1n2pp1n/8/2PP4/1N4P1/PP2PP1P/1BBRKQNR w HDhd - 1 9", 5, 26970098 }, + { "1bbrkq1r/pppp2pp/1n2pp1n/8/2PP4/1N4P1/PP2PP1P/1BBRKQNR w HDhd - 1 9", 6, 788040469 }, + { "nrbbkqnr/1p2pp1p/p1p3p1/3p4/8/1PP5/P2PPPPP/NRBBKQNR w HBhb - 0 9", 1, 21 }, + { "nrbbkqnr/1p2pp1p/p1p3p1/3p4/8/1PP5/P2PPPPP/NRBBKQNR w HBhb - 0 9", 2, 567 }, + { "nrbbkqnr/1p2pp1p/p1p3p1/3p4/8/1PP5/P2PPPPP/NRBBKQNR w HBhb - 0 9", 3, 13212 }, + { "nrbbkqnr/1p2pp1p/p1p3p1/3p4/8/1PP5/P2PPPPP/NRBBKQNR w HBhb - 0 9", 4, 376487 }, + { "nrbbkqnr/1p2pp1p/p1p3p1/3p4/8/1PP5/P2PPPPP/NRBBKQNR w HBhb - 0 9", 5, 9539687 }, + { "nrbbkqnr/1p2pp1p/p1p3p1/3p4/8/1PP5/P2PPPPP/NRBBKQNR w HBhb - 0 9", 6, 284426039 }, + { "1rbkqbr1/ppp1pppp/1n5n/3p4/3P4/1PP3P1/P3PP1P/NRBKQBNR w HBb - 1 9", 1, 27 }, + { "1rbkqbr1/ppp1pppp/1n5n/3p4/3P4/1PP3P1/P3PP1P/NRBKQBNR w HBb - 1 9", 2, 752 }, + { "1rbkqbr1/ppp1pppp/1n5n/3p4/3P4/1PP3P1/P3PP1P/NRBKQBNR w HBb - 1 9", 3, 20686 }, + { "1rbkqbr1/ppp1pppp/1n5n/3p4/3P4/1PP3P1/P3PP1P/NRBKQBNR w HBb - 1 9", 4, 606783 }, + { "1rbkqbr1/ppp1pppp/1n5n/3p4/3P4/1PP3P1/P3PP1P/NRBKQBNR w HBb - 1 9", 5, 16986290 }, + { "1rbkqbr1/ppp1pppp/1n5n/3p4/3P4/1PP3P1/P3PP1P/NRBKQBNR w HBb - 1 9", 6, 521817800 }, + { "nrbkq1rb/1ppp1pp1/4p1n1/p6p/2PP4/5P2/PPK1P1PP/NRB1QNRB w gb - 0 9", 1, 35 }, + { "nrbkq1rb/1ppp1pp1/4p1n1/p6p/2PP4/5P2/PPK1P1PP/NRB1QNRB w gb - 0 9", 2, 697 }, + { "nrbkq1rb/1ppp1pp1/4p1n1/p6p/2PP4/5P2/PPK1P1PP/NRB1QNRB w gb - 0 9", 3, 23678 }, + { "nrbkq1rb/1ppp1pp1/4p1n1/p6p/2PP4/5P2/PPK1P1PP/NRB1QNRB w gb - 0 9", 4, 505836 }, + { "nrbkq1rb/1ppp1pp1/4p1n1/p6p/2PP4/5P2/PPK1P1PP/NRB1QNRB w gb - 0 9", 5, 16906409 }, + { "nrbkq1rb/1ppp1pp1/4p1n1/p6p/2PP4/5P2/PPK1P1PP/NRB1QNRB w gb - 0 9", 6, 390324794 }, + { "nbrkbqnr/p2pp1p1/5p2/1pp4p/7P/3P2P1/PPP1PP2/NBKRBQNR w hc - 0 9", 1, 25 }, + { "nbrkbqnr/p2pp1p1/5p2/1pp4p/7P/3P2P1/PPP1PP2/NBKRBQNR w hc - 0 9", 2, 679 }, + { "nbrkbqnr/p2pp1p1/5p2/1pp4p/7P/3P2P1/PPP1PP2/NBKRBQNR w hc - 0 9", 3, 17223 }, + { "nbrkbqnr/p2pp1p1/5p2/1pp4p/7P/3P2P1/PPP1PP2/NBKRBQNR w hc - 0 9", 4, 484921 }, + { "nbrkbqnr/p2pp1p1/5p2/1pp4p/7P/3P2P1/PPP1PP2/NBKRBQNR w hc - 0 9", 5, 12879258 }, + { "nbrkbqnr/p2pp1p1/5p2/1pp4p/7P/3P2P1/PPP1PP2/NBKRBQNR w hc - 0 9", 6, 376652259 }, + { "nrkb1qnr/ppppp1p1/6bp/5p2/1PP1P1P1/8/P2P1P1P/NRKBBQNR w HBhb - 1 9", 1, 32 }, + { "nrkb1qnr/ppppp1p1/6bp/5p2/1PP1P1P1/8/P2P1P1P/NRKBBQNR w HBhb - 1 9", 2, 761 }, + { "nrkb1qnr/ppppp1p1/6bp/5p2/1PP1P1P1/8/P2P1P1P/NRKBBQNR w HBhb - 1 9", 3, 24586 }, + { "nrkb1qnr/ppppp1p1/6bp/5p2/1PP1P1P1/8/P2P1P1P/NRKBBQNR w HBhb - 1 9", 4, 632916 }, + { "nrkb1qnr/ppppp1p1/6bp/5p2/1PP1P1P1/8/P2P1P1P/NRKBBQNR w HBhb - 1 9", 5, 20671433 }, + { "nrkb1qnr/ppppp1p1/6bp/5p2/1PP1P1P1/8/P2P1P1P/NRKBBQNR w HBhb - 1 9", 6, 568524724 }, + { "nrk1bbnr/p1q1pppp/1ppp4/8/3P3P/4K3/PPP1PPP1/NR1QBBNR w hb - 0 9", 1, 30 }, + { "nrk1bbnr/p1q1pppp/1ppp4/8/3P3P/4K3/PPP1PPP1/NR1QBBNR w hb - 0 9", 2, 719 }, + { "nrk1bbnr/p1q1pppp/1ppp4/8/3P3P/4K3/PPP1PPP1/NR1QBBNR w hb - 0 9", 3, 21683 }, + { "nrk1bbnr/p1q1pppp/1ppp4/8/3P3P/4K3/PPP1PPP1/NR1QBBNR w hb - 0 9", 4, 541389 }, + { "nrk1bbnr/p1q1pppp/1ppp4/8/3P3P/4K3/PPP1PPP1/NR1QBBNR w hb - 0 9", 5, 16278120 }, + { "nrk1bbnr/p1q1pppp/1ppp4/8/3P3P/4K3/PPP1PPP1/NR1QBBNR w hb - 0 9", 6, 423649784 }, + { "nrkqbr1b/1pppp1pp/5pn1/p6N/1P3P2/8/P1PPP1PP/NRKQB1RB w GBb - 0 9", 1, 26 }, + { "nrkqbr1b/1pppp1pp/5pn1/p6N/1P3P2/8/P1PPP1PP/NRKQB1RB w GBb - 0 9", 2, 494 }, + { "nrkqbr1b/1pppp1pp/5pn1/p6N/1P3P2/8/P1PPP1PP/NRKQB1RB w GBb - 0 9", 3, 13815 }, + { "nrkqbr1b/1pppp1pp/5pn1/p6N/1P3P2/8/P1PPP1PP/NRKQB1RB w GBb - 0 9", 4, 296170 }, + { "nrkqbr1b/1pppp1pp/5pn1/p6N/1P3P2/8/P1PPP1PP/NRKQB1RB w GBb - 0 9", 5, 8763742 }, + { "nrkqbr1b/1pppp1pp/5pn1/p6N/1P3P2/8/P1PPP1PP/NRKQB1RB w GBb - 0 9", 6, 206993496 }, + { "nbrkq2r/pppp1bpp/4p1n1/5p2/7P/2P3N1/PP1PPPP1/NBKRQ1BR w hc - 0 9", 1, 27 }, + { "nbrkq2r/pppp1bpp/4p1n1/5p2/7P/2P3N1/PP1PPPP1/NBKRQ1BR w hc - 0 9", 2, 701 }, + { "nbrkq2r/pppp1bpp/4p1n1/5p2/7P/2P3N1/PP1PPPP1/NBKRQ1BR w hc - 0 9", 3, 19536 }, + { "nbrkq2r/pppp1bpp/4p1n1/5p2/7P/2P3N1/PP1PPPP1/NBKRQ1BR w hc - 0 9", 4, 535052 }, + { "nbrkq2r/pppp1bpp/4p1n1/5p2/7P/2P3N1/PP1PPPP1/NBKRQ1BR w hc - 0 9", 5, 15394667 }, + { "nbrkq2r/pppp1bpp/4p1n1/5p2/7P/2P3N1/PP1PPPP1/NBKRQ1BR w hc - 0 9", 6, 443506342 }, + { "nrkbqnbr/2ppp2p/pp6/5pp1/P1P5/8/1P1PPPPP/NRKBQNBR w HBhb - 0 9", 1, 21 }, + { "nrkbqnbr/2ppp2p/pp6/5pp1/P1P5/8/1P1PPPPP/NRKBQNBR w HBhb - 0 9", 2, 487 }, + { "nrkbqnbr/2ppp2p/pp6/5pp1/P1P5/8/1P1PPPPP/NRKBQNBR w HBhb - 0 9", 3, 11341 }, + { "nrkbqnbr/2ppp2p/pp6/5pp1/P1P5/8/1P1PPPPP/NRKBQNBR w HBhb - 0 9", 4, 285387 }, + { "nrkbqnbr/2ppp2p/pp6/5pp1/P1P5/8/1P1PPPPP/NRKBQNBR w HBhb - 0 9", 5, 7218486 }, + { "nrkbqnbr/2ppp2p/pp6/5pp1/P1P5/8/1P1PPPPP/NRKBQNBR w HBhb - 0 9", 6, 193586674 }, + { "nr1qnbbr/pk1pppp1/1pp4p/8/3P4/5P1P/PPP1P1P1/NRKQNBBR w HB - 0 9", 1, 22 }, + { "nr1qnbbr/pk1pppp1/1pp4p/8/3P4/5P1P/PPP1P1P1/NRKQNBBR w HB - 0 9", 2, 546 }, + { "nr1qnbbr/pk1pppp1/1pp4p/8/3P4/5P1P/PPP1P1P1/NRKQNBBR w HB - 0 9", 3, 13615 }, + { "nr1qnbbr/pk1pppp1/1pp4p/8/3P4/5P1P/PPP1P1P1/NRKQNBBR w HB - 0 9", 4, 352855 }, + { "nr1qnbbr/pk1pppp1/1pp4p/8/3P4/5P1P/PPP1P1P1/NRKQNBBR w HB - 0 9", 5, 9587439 }, + { "nr1qnbbr/pk1pppp1/1pp4p/8/3P4/5P1P/PPP1P1P1/NRKQNBBR w HB - 0 9", 6, 259830255 }, + { "nrkq1rbb/pp1ppp1p/2pn4/8/PP3Pp1/7P/2PPP1P1/NRKQNRBB w FBfb - 0 9", 1, 26 }, + { "nrkq1rbb/pp1ppp1p/2pn4/8/PP3Pp1/7P/2PPP1P1/NRKQNRBB w FBfb - 0 9", 2, 839 }, + { "nrkq1rbb/pp1ppp1p/2pn4/8/PP3Pp1/7P/2PPP1P1/NRKQNRBB w FBfb - 0 9", 3, 22075 }, + { "nrkq1rbb/pp1ppp1p/2pn4/8/PP3Pp1/7P/2PPP1P1/NRKQNRBB w FBfb - 0 9", 4, 723845 }, + { "nrkq1rbb/pp1ppp1p/2pn4/8/PP3Pp1/7P/2PPP1P1/NRKQNRBB w FBfb - 0 9", 5, 19867117 }, + { "nrkq1rbb/pp1ppp1p/2pn4/8/PP3Pp1/7P/2PPP1P1/NRKQNRBB w FBfb - 0 9", 6, 658535326 }, + { "b2rknqr/pp1ppppp/8/2P5/n7/P7/1PPNPPPb/BBNRK1QR w HDhd - 2 9", 1, 24 }, + { "b2rknqr/pp1ppppp/8/2P5/n7/P7/1PPNPPPb/BBNRK1QR w HDhd - 2 9", 2, 699 }, + { "b2rknqr/pp1ppppp/8/2P5/n7/P7/1PPNPPPb/BBNRK1QR w HDhd - 2 9", 3, 19523 }, + { "b2rknqr/pp1ppppp/8/2P5/n7/P7/1PPNPPPb/BBNRK1QR w HDhd - 2 9", 4, 575172 }, + { "b2rknqr/pp1ppppp/8/2P5/n7/P7/1PPNPPPb/BBNRK1QR w HDhd - 2 9", 5, 17734818 }, + { "b2rknqr/pp1ppppp/8/2P5/n7/P7/1PPNPPPb/BBNRK1QR w HDhd - 2 9", 6, 535094237 }, + { "bnrbknqr/pp2p2p/2p3p1/3p1p2/8/3P4/PPPNPPPP/B1RBKNQR w HChc - 0 9", 1, 23 }, + { "bnrbknqr/pp2p2p/2p3p1/3p1p2/8/3P4/PPPNPPPP/B1RBKNQR w HChc - 0 9", 2, 580 }, + { "bnrbknqr/pp2p2p/2p3p1/3p1p2/8/3P4/PPPNPPPP/B1RBKNQR w HChc - 0 9", 3, 14320 }, + { "bnrbknqr/pp2p2p/2p3p1/3p1p2/8/3P4/PPPNPPPP/B1RBKNQR w HChc - 0 9", 4, 385917 }, + { "bnrbknqr/pp2p2p/2p3p1/3p1p2/8/3P4/PPPNPPPP/B1RBKNQR w HChc - 0 9", 5, 10133092 }, + { "bnrbknqr/pp2p2p/2p3p1/3p1p2/8/3P4/PPPNPPPP/B1RBKNQR w HChc - 0 9", 6, 288041554 }, + { "bnrknb1r/pppp2pp/8/4pp2/6P1/3P3P/qPP1PPQ1/BNRKNB1R w HChc - 0 9", 1, 28 }, + { "bnrknb1r/pppp2pp/8/4pp2/6P1/3P3P/qPP1PPQ1/BNRKNB1R w HChc - 0 9", 2, 1100 }, + { "bnrknb1r/pppp2pp/8/4pp2/6P1/3P3P/qPP1PPQ1/BNRKNB1R w HChc - 0 9", 3, 31813 }, + { "bnrknb1r/pppp2pp/8/4pp2/6P1/3P3P/qPP1PPQ1/BNRKNB1R w HChc - 0 9", 4, 1217514 }, + { "bnrknb1r/pppp2pp/8/4pp2/6P1/3P3P/qPP1PPQ1/BNRKNB1R w HChc - 0 9", 5, 36142423 }, + { "bnrknb1r/pppp2pp/8/4pp2/6P1/3P3P/qPP1PPQ1/BNRKNB1R w HChc - 0 9", 6, 1361341249 }, + { "b1rknqrb/ppp1p1p1/2np1p1p/8/4N3/6PQ/PPPPPP1P/B1RKN1RB w GCgc - 0 9", 1, 36 }, + { "b1rknqrb/ppp1p1p1/2np1p1p/8/4N3/6PQ/PPPPPP1P/B1RKN1RB w GCgc - 0 9", 2, 629 }, + { "b1rknqrb/ppp1p1p1/2np1p1p/8/4N3/6PQ/PPPPPP1P/B1RKN1RB w GCgc - 0 9", 3, 23082 }, + { "b1rknqrb/ppp1p1p1/2np1p1p/8/4N3/6PQ/PPPPPP1P/B1RKN1RB w GCgc - 0 9", 4, 453064 }, + { "b1rknqrb/ppp1p1p1/2np1p1p/8/4N3/6PQ/PPPPPP1P/B1RKN1RB w GCgc - 0 9", 5, 16897544 }, + { "b1rknqrb/ppp1p1p1/2np1p1p/8/4N3/6PQ/PPPPPP1P/B1RKN1RB w GCgc - 0 9", 6, 367503974 }, + { "nb1rknqr/pbppp2p/6p1/1p3p2/5P2/3KP3/PPPP2PP/NBBR1NQR w hd - 2 9", 1, 18 }, + { "nb1rknqr/pbppp2p/6p1/1p3p2/5P2/3KP3/PPPP2PP/NBBR1NQR w hd - 2 9", 2, 557 }, + { "nb1rknqr/pbppp2p/6p1/1p3p2/5P2/3KP3/PPPP2PP/NBBR1NQR w hd - 2 9", 3, 9779 }, + { "nb1rknqr/pbppp2p/6p1/1p3p2/5P2/3KP3/PPPP2PP/NBBR1NQR w hd - 2 9", 4, 300744 }, + { "nb1rknqr/pbppp2p/6p1/1p3p2/5P2/3KP3/PPPP2PP/NBBR1NQR w hd - 2 9", 5, 5822387 }, + { "nb1rknqr/pbppp2p/6p1/1p3p2/5P2/3KP3/PPPP2PP/NBBR1NQR w hd - 2 9", 6, 180936551 }, + { "nr1bknqr/1ppb1ppp/p7/3pp3/B7/2P3NP/PP1PPPP1/NRB1K1QR w HBhb - 2 9", 1, 28 }, + { "nr1bknqr/1ppb1ppp/p7/3pp3/B7/2P3NP/PP1PPPP1/NRB1K1QR w HBhb - 2 9", 2, 688 }, + { "nr1bknqr/1ppb1ppp/p7/3pp3/B7/2P3NP/PP1PPPP1/NRB1K1QR w HBhb - 2 9", 3, 19541 }, + { "nr1bknqr/1ppb1ppp/p7/3pp3/B7/2P3NP/PP1PPPP1/NRB1K1QR w HBhb - 2 9", 4, 519785 }, + { "nr1bknqr/1ppb1ppp/p7/3pp3/B7/2P3NP/PP1PPPP1/NRB1K1QR w HBhb - 2 9", 5, 15153092 }, + { "nr1bknqr/1ppb1ppp/p7/3pp3/B7/2P3NP/PP1PPPP1/NRB1K1QR w HBhb - 2 9", 6, 425149249 }, + { "nrbkn2r/pppp1pqp/4p1p1/8/3P2P1/P3B3/P1P1PP1P/NR1KNBQR w HBhb - 1 9", 1, 32 }, + { "nrbkn2r/pppp1pqp/4p1p1/8/3P2P1/P3B3/P1P1PP1P/NR1KNBQR w HBhb - 1 9", 2, 808 }, + { "nrbkn2r/pppp1pqp/4p1p1/8/3P2P1/P3B3/P1P1PP1P/NR1KNBQR w HBhb - 1 9", 3, 25578 }, + { "nrbkn2r/pppp1pqp/4p1p1/8/3P2P1/P3B3/P1P1PP1P/NR1KNBQR w HBhb - 1 9", 4, 676525 }, + { "nrbkn2r/pppp1pqp/4p1p1/8/3P2P1/P3B3/P1P1PP1P/NR1KNBQR w HBhb - 1 9", 5, 22094260 }, + { "nrbkn2r/pppp1pqp/4p1p1/8/3P2P1/P3B3/P1P1PP1P/NR1KNBQR w HBhb - 1 9", 6, 609377239 }, + { "nrbknqrb/2p1ppp1/1p6/p2p2Bp/1P6/3P1P2/P1P1P1PP/NR1KNQRB w GBgb - 0 9", 1, 30 }, + { "nrbknqrb/2p1ppp1/1p6/p2p2Bp/1P6/3P1P2/P1P1P1PP/NR1KNQRB w GBgb - 0 9", 2, 625 }, + { "nrbknqrb/2p1ppp1/1p6/p2p2Bp/1P6/3P1P2/P1P1P1PP/NR1KNQRB w GBgb - 0 9", 3, 18288 }, + { "nrbknqrb/2p1ppp1/1p6/p2p2Bp/1P6/3P1P2/P1P1P1PP/NR1KNQRB w GBgb - 0 9", 4, 418895 }, + { "nrbknqrb/2p1ppp1/1p6/p2p2Bp/1P6/3P1P2/P1P1P1PP/NR1KNQRB w GBgb - 0 9", 5, 12225742 }, + { "nrbknqrb/2p1ppp1/1p6/p2p2Bp/1P6/3P1P2/P1P1P1PP/NR1KNQRB w GBgb - 0 9", 6, 301834282 }, + { "nbr1knqr/1pp1p1pp/3p1pb1/8/7P/5P2/PPPPPQP1/NBRKBN1R w HC - 2 9", 1, 29 }, + { "nbr1knqr/1pp1p1pp/3p1pb1/8/7P/5P2/PPPPPQP1/NBRKBN1R w HC - 2 9", 2, 863 }, + { "nbr1knqr/1pp1p1pp/3p1pb1/8/7P/5P2/PPPPPQP1/NBRKBN1R w HC - 2 9", 3, 25767 }, + { "nbr1knqr/1pp1p1pp/3p1pb1/8/7P/5P2/PPPPPQP1/NBRKBN1R w HC - 2 9", 4, 800239 }, + { "nbr1knqr/1pp1p1pp/3p1pb1/8/7P/5P2/PPPPPQP1/NBRKBN1R w HC - 2 9", 5, 24965592 }, + { "nbr1knqr/1pp1p1pp/3p1pb1/8/7P/5P2/PPPPPQP1/NBRKBN1R w HC - 2 9", 6, 799182442 }, + { "n1kbbnqr/prp2ppp/1p1p4/4p3/1P2P3/3P1B2/P1P2PPP/NRK1BNQR w HBh - 2 9", 1, 26 }, + { "n1kbbnqr/prp2ppp/1p1p4/4p3/1P2P3/3P1B2/P1P2PPP/NRK1BNQR w HBh - 2 9", 2, 653 }, + { "n1kbbnqr/prp2ppp/1p1p4/4p3/1P2P3/3P1B2/P1P2PPP/NRK1BNQR w HBh - 2 9", 3, 17020 }, + { "n1kbbnqr/prp2ppp/1p1p4/4p3/1P2P3/3P1B2/P1P2PPP/NRK1BNQR w HBh - 2 9", 4, 449719 }, + { "n1kbbnqr/prp2ppp/1p1p4/4p3/1P2P3/3P1B2/P1P2PPP/NRK1BNQR w HBh - 2 9", 5, 12187583 }, + { "n1kbbnqr/prp2ppp/1p1p4/4p3/1P2P3/3P1B2/P1P2PPP/NRK1BNQR w HBh - 2 9", 6, 336872952 }, + { "nrknbbqr/pp3p1p/B3p1p1/2pp4/4P3/2N3P1/PPPP1P1P/NRK1B1QR w HBhb - 0 9", 1, 29 }, + { "nrknbbqr/pp3p1p/B3p1p1/2pp4/4P3/2N3P1/PPPP1P1P/NRK1B1QR w HBhb - 0 9", 2, 683 }, + { "nrknbbqr/pp3p1p/B3p1p1/2pp4/4P3/2N3P1/PPPP1P1P/NRK1B1QR w HBhb - 0 9", 3, 19755 }, + { "nrknbbqr/pp3p1p/B3p1p1/2pp4/4P3/2N3P1/PPPP1P1P/NRK1B1QR w HBhb - 0 9", 4, 501807 }, + { "nrknbbqr/pp3p1p/B3p1p1/2pp4/4P3/2N3P1/PPPP1P1P/NRK1B1QR w HBhb - 0 9", 5, 14684565 }, + { "nrknbbqr/pp3p1p/B3p1p1/2pp4/4P3/2N3P1/PPPP1P1P/NRK1B1QR w HBhb - 0 9", 6, 394951291 }, + { "n1knbqrb/pr1p1ppp/Qp6/2p1p3/4P3/6P1/PPPP1P1P/NRKNB1RB w GBg - 2 9", 1, 31 }, + { "n1knbqrb/pr1p1ppp/Qp6/2p1p3/4P3/6P1/PPPP1P1P/NRKNB1RB w GBg - 2 9", 2, 552 }, + { "n1knbqrb/pr1p1ppp/Qp6/2p1p3/4P3/6P1/PPPP1P1P/NRKNB1RB w GBg - 2 9", 3, 17197 }, + { "n1knbqrb/pr1p1ppp/Qp6/2p1p3/4P3/6P1/PPPP1P1P/NRKNB1RB w GBg - 2 9", 4, 371343 }, + { "n1knbqrb/pr1p1ppp/Qp6/2p1p3/4P3/6P1/PPPP1P1P/NRKNB1RB w GBg - 2 9", 5, 11663330 }, + { "n1knbqrb/pr1p1ppp/Qp6/2p1p3/4P3/6P1/PPPP1P1P/NRKNB1RB w GBg - 2 9", 6, 283583340 }, + { "nbrknqbr/p3p1pp/1p1p1p2/2p5/2Q1PP2/8/PPPP2PP/NBRKN1BR w HChc - 0 9", 1, 37 }, + { "nbrknqbr/p3p1pp/1p1p1p2/2p5/2Q1PP2/8/PPPP2PP/NBRKN1BR w HChc - 0 9", 2, 913 }, + { "nbrknqbr/p3p1pp/1p1p1p2/2p5/2Q1PP2/8/PPPP2PP/NBRKN1BR w HChc - 0 9", 3, 32470 }, + { "nbrknqbr/p3p1pp/1p1p1p2/2p5/2Q1PP2/8/PPPP2PP/NBRKN1BR w HChc - 0 9", 4, 825748 }, + { "nbrknqbr/p3p1pp/1p1p1p2/2p5/2Q1PP2/8/PPPP2PP/NBRKN1BR w HChc - 0 9", 5, 28899548 }, + { "nbrknqbr/p3p1pp/1p1p1p2/2p5/2Q1PP2/8/PPPP2PP/NBRKN1BR w HChc - 0 9", 6, 759875563 }, + { "nrkb1qbr/pp1pppp1/5n2/7p/2p5/1N1NPP2/PPPP2PP/1RKB1QBR w HBhb - 0 9", 1, 25 }, + { "nrkb1qbr/pp1pppp1/5n2/7p/2p5/1N1NPP2/PPPP2PP/1RKB1QBR w HBhb - 0 9", 2, 712 }, + { "nrkb1qbr/pp1pppp1/5n2/7p/2p5/1N1NPP2/PPPP2PP/1RKB1QBR w HBhb - 0 9", 3, 18813 }, + { "nrkb1qbr/pp1pppp1/5n2/7p/2p5/1N1NPP2/PPPP2PP/1RKB1QBR w HBhb - 0 9", 4, 543870 }, + { "nrkb1qbr/pp1pppp1/5n2/7p/2p5/1N1NPP2/PPPP2PP/1RKB1QBR w HBhb - 0 9", 5, 15045589 }, + { "nrkb1qbr/pp1pppp1/5n2/7p/2p5/1N1NPP2/PPPP2PP/1RKB1QBR w HBhb - 0 9", 6, 445074372 }, + { "nrk2bbr/pppqpppp/3p4/8/1P3nP1/3P4/P1P1PP1P/NRKNQBBR w HBhb - 1 9", 1, 24 }, + { "nrk2bbr/pppqpppp/3p4/8/1P3nP1/3P4/P1P1PP1P/NRKNQBBR w HBhb - 1 9", 2, 814 }, + { "nrk2bbr/pppqpppp/3p4/8/1P3nP1/3P4/P1P1PP1P/NRKNQBBR w HBhb - 1 9", 3, 19954 }, + { "nrk2bbr/pppqpppp/3p4/8/1P3nP1/3P4/P1P1PP1P/NRKNQBBR w HBhb - 1 9", 4, 670162 }, + { "nrk2bbr/pppqpppp/3p4/8/1P3nP1/3P4/P1P1PP1P/NRKNQBBR w HBhb - 1 9", 5, 17603960 }, + { "nrk2bbr/pppqpppp/3p4/8/1P3nP1/3P4/P1P1PP1P/NRKNQBBR w HBhb - 1 9", 6, 592121050 }, + { "nrknqrbb/1p2ppp1/2pp4/Q6p/P2P3P/8/1PP1PPP1/NRKN1RBB w FBfb - 0 9", 1, 34 }, + { "nrknqrbb/1p2ppp1/2pp4/Q6p/P2P3P/8/1PP1PPP1/NRKN1RBB w FBfb - 0 9", 2, 513 }, + { "nrknqrbb/1p2ppp1/2pp4/Q6p/P2P3P/8/1PP1PPP1/NRKN1RBB w FBfb - 0 9", 3, 16111 }, + { "nrknqrbb/1p2ppp1/2pp4/Q6p/P2P3P/8/1PP1PPP1/NRKN1RBB w FBfb - 0 9", 4, 303908 }, + { "nrknqrbb/1p2ppp1/2pp4/Q6p/P2P3P/8/1PP1PPP1/NRKN1RBB w FBfb - 0 9", 5, 9569590 }, + { "nrknqrbb/1p2ppp1/2pp4/Q6p/P2P3P/8/1PP1PPP1/NRKN1RBB w FBfb - 0 9", 6, 206509331 }, + { "bbnrk1rq/pp2p1pp/2ppn3/5p2/8/3NNP1P/PPPPP1P1/BB1RK1RQ w GDgd - 1 9", 1, 28 }, + { "bbnrk1rq/pp2p1pp/2ppn3/5p2/8/3NNP1P/PPPPP1P1/BB1RK1RQ w GDgd - 1 9", 2, 697 }, + { "bbnrk1rq/pp2p1pp/2ppn3/5p2/8/3NNP1P/PPPPP1P1/BB1RK1RQ w GDgd - 1 9", 3, 20141 }, + { "bbnrk1rq/pp2p1pp/2ppn3/5p2/8/3NNP1P/PPPPP1P1/BB1RK1RQ w GDgd - 1 9", 4, 517917 }, + { "bbnrk1rq/pp2p1pp/2ppn3/5p2/8/3NNP1P/PPPPP1P1/BB1RK1RQ w GDgd - 1 9", 5, 15301879 }, + { "bbnrk1rq/pp2p1pp/2ppn3/5p2/8/3NNP1P/PPPPP1P1/BB1RK1RQ w GDgd - 1 9", 6, 410843713 }, + { "bnrbknrq/ppppp2p/6p1/5p2/4QPP1/8/PPPPP2P/BNRBKNR1 w GCgc - 0 9", 1, 37 }, + { "bnrbknrq/ppppp2p/6p1/5p2/4QPP1/8/PPPPP2P/BNRBKNR1 w GCgc - 0 9", 2, 901 }, + { "bnrbknrq/ppppp2p/6p1/5p2/4QPP1/8/PPPPP2P/BNRBKNR1 w GCgc - 0 9", 3, 32612 }, + { "bnrbknrq/ppppp2p/6p1/5p2/4QPP1/8/PPPPP2P/BNRBKNR1 w GCgc - 0 9", 4, 877372 }, + { "bnrbknrq/ppppp2p/6p1/5p2/4QPP1/8/PPPPP2P/BNRBKNR1 w GCgc - 0 9", 5, 31385912 }, + { "bnrbknrq/ppppp2p/6p1/5p2/4QPP1/8/PPPPP2P/BNRBKNR1 w GCgc - 0 9", 6, 903831981 }, + { "bnkrnbrq/ppppp1p1/B6p/5p2/8/4P3/PPPP1PPP/BNKRN1RQ w - - 0 9", 1, 26 }, + { "bnkrnbrq/ppppp1p1/B6p/5p2/8/4P3/PPPP1PPP/BNKRN1RQ w - - 0 9", 2, 417 }, + { "bnkrnbrq/ppppp1p1/B6p/5p2/8/4P3/PPPP1PPP/BNKRN1RQ w - - 0 9", 3, 11124 }, + { "bnkrnbrq/ppppp1p1/B6p/5p2/8/4P3/PPPP1PPP/BNKRN1RQ w - - 0 9", 4, 217095 }, + { "bnkrnbrq/ppppp1p1/B6p/5p2/8/4P3/PPPP1PPP/BNKRN1RQ w - - 0 9", 5, 5980981 }, + { "bnkrnbrq/ppppp1p1/B6p/5p2/8/4P3/PPPP1PPP/BNKRN1RQ w - - 0 9", 6, 133080499 }, + { "bnrk1rqb/2pppp1p/3n4/pp4p1/3Q1P2/2N3P1/PPPPP2P/B1RKNR1B w FCfc - 0 9", 1, 49 }, + { "bnrk1rqb/2pppp1p/3n4/pp4p1/3Q1P2/2N3P1/PPPPP2P/B1RKNR1B w FCfc - 0 9", 2, 1655 }, + { "bnrk1rqb/2pppp1p/3n4/pp4p1/3Q1P2/2N3P1/PPPPP2P/B1RKNR1B w FCfc - 0 9", 3, 74590 }, + { "bnrk1rqb/2pppp1p/3n4/pp4p1/3Q1P2/2N3P1/PPPPP2P/B1RKNR1B w FCfc - 0 9", 4, 2512003 }, + { "bnrk1rqb/2pppp1p/3n4/pp4p1/3Q1P2/2N3P1/PPPPP2P/B1RKNR1B w FCfc - 0 9", 5, 107234294 }, + { "bnrk1rqb/2pppp1p/3n4/pp4p1/3Q1P2/2N3P1/PPPPP2P/B1RKNR1B w FCfc - 0 9", 6, 3651608327 }, + { "nbbrk1rq/pp2pppp/2pp4/8/2P2n2/6N1/PP1PP1PP/NBBRKR1Q w Dgd - 0 9", 1, 28 }, + { "nbbrk1rq/pp2pppp/2pp4/8/2P2n2/6N1/PP1PP1PP/NBBRKR1Q w Dgd - 0 9", 2, 960 }, + { "nbbrk1rq/pp2pppp/2pp4/8/2P2n2/6N1/PP1PP1PP/NBBRKR1Q w Dgd - 0 9", 3, 26841 }, + { "nbbrk1rq/pp2pppp/2pp4/8/2P2n2/6N1/PP1PP1PP/NBBRKR1Q w Dgd - 0 9", 4, 884237 }, + { "nbbrk1rq/pp2pppp/2pp4/8/2P2n2/6N1/PP1PP1PP/NBBRKR1Q w Dgd - 0 9", 5, 26083252 }, + { "nbbrk1rq/pp2pppp/2pp4/8/2P2n2/6N1/PP1PP1PP/NBBRKR1Q w Dgd - 0 9", 6, 846682836 }, + { "nrbb2rq/pppk1ppp/4p1n1/3p4/6P1/1BP5/PP1PPPQP/NRB1KNR1 w GB - 0 9", 1, 28 }, + { "nrbb2rq/pppk1ppp/4p1n1/3p4/6P1/1BP5/PP1PPPQP/NRB1KNR1 w GB - 0 9", 2, 735 }, + { "nrbb2rq/pppk1ppp/4p1n1/3p4/6P1/1BP5/PP1PPPQP/NRB1KNR1 w GB - 0 9", 3, 22048 }, + { "nrbb2rq/pppk1ppp/4p1n1/3p4/6P1/1BP5/PP1PPPQP/NRB1KNR1 w GB - 0 9", 4, 593839 }, + { "nrbb2rq/pppk1ppp/4p1n1/3p4/6P1/1BP5/PP1PPPQP/NRB1KNR1 w GB - 0 9", 5, 18588316 }, + { "nrbb2rq/pppk1ppp/4p1n1/3p4/6P1/1BP5/PP1PPPQP/NRB1KNR1 w GB - 0 9", 6, 512048946 }, + { "nrbk1brq/p1ppppp1/7p/1p6/4P1nP/P7/1PPP1PP1/NRBKNBRQ w GBgb - 0 9", 1, 22 }, + { "nrbk1brq/p1ppppp1/7p/1p6/4P1nP/P7/1PPP1PP1/NRBKNBRQ w GBgb - 0 9", 2, 572 }, + { "nrbk1brq/p1ppppp1/7p/1p6/4P1nP/P7/1PPP1PP1/NRBKNBRQ w GBgb - 0 9", 3, 12739 }, + { "nrbk1brq/p1ppppp1/7p/1p6/4P1nP/P7/1PPP1PP1/NRBKNBRQ w GBgb - 0 9", 4, 351494 }, + { "nrbk1brq/p1ppppp1/7p/1p6/4P1nP/P7/1PPP1PP1/NRBKNBRQ w GBgb - 0 9", 5, 8525056 }, + { "nrbk1brq/p1ppppp1/7p/1p6/4P1nP/P7/1PPP1PP1/NRBKNBRQ w GBgb - 0 9", 6, 247615348 }, + { "nrbk1rqb/1pp2ppp/5n2/p2pp3/5B2/1N1P2P1/PPP1PP1P/1R1KNRQB w FBfb - 0 9", 1, 35 }, + { "nrbk1rqb/1pp2ppp/5n2/p2pp3/5B2/1N1P2P1/PPP1PP1P/1R1KNRQB w FBfb - 0 9", 2, 927 }, + { "nrbk1rqb/1pp2ppp/5n2/p2pp3/5B2/1N1P2P1/PPP1PP1P/1R1KNRQB w FBfb - 0 9", 3, 31559 }, + { "nrbk1rqb/1pp2ppp/5n2/p2pp3/5B2/1N1P2P1/PPP1PP1P/1R1KNRQB w FBfb - 0 9", 4, 849932 }, + { "nrbk1rqb/1pp2ppp/5n2/p2pp3/5B2/1N1P2P1/PPP1PP1P/1R1KNRQB w FBfb - 0 9", 5, 28465693 }, + { "nrbk1rqb/1pp2ppp/5n2/p2pp3/5B2/1N1P2P1/PPP1PP1P/1R1KNRQB w FBfb - 0 9", 6, 783048748 }, + { "nbrkb1rq/p1pp1ppp/4n3/4p3/Pp6/6N1/1PPPPPPP/NBRKBRQ1 w Cgc - 0 9", 1, 20 }, + { "nbrkb1rq/p1pp1ppp/4n3/4p3/Pp6/6N1/1PPPPPPP/NBRKBRQ1 w Cgc - 0 9", 2, 456 }, + { "nbrkb1rq/p1pp1ppp/4n3/4p3/Pp6/6N1/1PPPPPPP/NBRKBRQ1 w Cgc - 0 9", 3, 10271 }, + { "nbrkb1rq/p1pp1ppp/4n3/4p3/Pp6/6N1/1PPPPPPP/NBRKBRQ1 w Cgc - 0 9", 4, 247733 }, + { "nbrkb1rq/p1pp1ppp/4n3/4p3/Pp6/6N1/1PPPPPPP/NBRKBRQ1 w Cgc - 0 9", 5, 6124625 }, + { "nbrkb1rq/p1pp1ppp/4n3/4p3/Pp6/6N1/1PPPPPPP/NBRKBRQ1 w Cgc - 0 9", 6, 154766108 }, + { "nrkb1nrq/p2pp1pp/1pp2p2/7b/6PP/5P2/PPPPP2N/NRKBB1RQ w GBgb - 0 9", 1, 21 }, + { "nrkb1nrq/p2pp1pp/1pp2p2/7b/6PP/5P2/PPPPP2N/NRKBB1RQ w GBgb - 0 9", 2, 479 }, + { "nrkb1nrq/p2pp1pp/1pp2p2/7b/6PP/5P2/PPPPP2N/NRKBB1RQ w GBgb - 0 9", 3, 11152 }, + { "nrkb1nrq/p2pp1pp/1pp2p2/7b/6PP/5P2/PPPPP2N/NRKBB1RQ w GBgb - 0 9", 4, 264493 }, + { "nrkb1nrq/p2pp1pp/1pp2p2/7b/6PP/5P2/PPPPP2N/NRKBB1RQ w GBgb - 0 9", 5, 6696458 }, + { "nrkb1nrq/p2pp1pp/1pp2p2/7b/6PP/5P2/PPPPP2N/NRKBB1RQ w GBgb - 0 9", 6, 165253524 }, + { "nr1nbbr1/pppkpp1p/6p1/3p4/P6P/1P6/1RPPPPP1/N1KNBBRQ w G - 1 9", 1, 20 }, + { "nr1nbbr1/pppkpp1p/6p1/3p4/P6P/1P6/1RPPPPP1/N1KNBBRQ w G - 1 9", 2, 498 }, + { "nr1nbbr1/pppkpp1p/6p1/3p4/P6P/1P6/1RPPPPP1/N1KNBBRQ w G - 1 9", 3, 11304 }, + { "nr1nbbr1/pppkpp1p/6p1/3p4/P6P/1P6/1RPPPPP1/N1KNBBRQ w G - 1 9", 4, 288813 }, + { "nr1nbbr1/pppkpp1p/6p1/3p4/P6P/1P6/1RPPPPP1/N1KNBBRQ w G - 1 9", 5, 7197322 }, + { "nr1nbbr1/pppkpp1p/6p1/3p4/P6P/1P6/1RPPPPP1/N1KNBBRQ w G - 1 9", 6, 188021682 }, + { "nrknbrqb/3p1ppp/ppN1p3/8/6P1/8/PPPPPP1P/1RKNBRQB w FBfb - 0 9", 1, 32 }, + { "nrknbrqb/3p1ppp/ppN1p3/8/6P1/8/PPPPPP1P/1RKNBRQB w FBfb - 0 9", 2, 526 }, + { "nrknbrqb/3p1ppp/ppN1p3/8/6P1/8/PPPPPP1P/1RKNBRQB w FBfb - 0 9", 3, 17267 }, + { "nrknbrqb/3p1ppp/ppN1p3/8/6P1/8/PPPPPP1P/1RKNBRQB w FBfb - 0 9", 4, 319836 }, + { "nrknbrqb/3p1ppp/ppN1p3/8/6P1/8/PPPPPP1P/1RKNBRQB w FBfb - 0 9", 5, 10755190 }, + { "nrknbrqb/3p1ppp/ppN1p3/8/6P1/8/PPPPPP1P/1RKNBRQB w FBfb - 0 9", 6, 220058991 }, + { "nbrkn1bq/p1pppr1p/1p6/5pp1/8/1N2PP2/PPPP2PP/1BKRNRBQ w c - 1 9", 1, 19 }, + { "nbrkn1bq/p1pppr1p/1p6/5pp1/8/1N2PP2/PPPP2PP/1BKRNRBQ w c - 1 9", 2, 491 }, + { "nbrkn1bq/p1pppr1p/1p6/5pp1/8/1N2PP2/PPPP2PP/1BKRNRBQ w c - 1 9", 3, 10090 }, + { "nbrkn1bq/p1pppr1p/1p6/5pp1/8/1N2PP2/PPPP2PP/1BKRNRBQ w c - 1 9", 4, 277313 }, + { "nbrkn1bq/p1pppr1p/1p6/5pp1/8/1N2PP2/PPPP2PP/1BKRNRBQ w c - 1 9", 5, 6230616 }, + { "nbrkn1bq/p1pppr1p/1p6/5pp1/8/1N2PP2/PPPP2PP/1BKRNRBQ w c - 1 9", 6, 180748649 }, + { "nrkbnrbq/ppppppp1/8/8/7p/PP3P2/2PPPRPP/NRKBN1BQ w Bfb - 0 9", 1, 16 }, + { "nrkbnrbq/ppppppp1/8/8/7p/PP3P2/2PPPRPP/NRKBN1BQ w Bfb - 0 9", 2, 353 }, + { "nrkbnrbq/ppppppp1/8/8/7p/PP3P2/2PPPRPP/NRKBN1BQ w Bfb - 0 9", 3, 6189 }, + { "nrkbnrbq/ppppppp1/8/8/7p/PP3P2/2PPPRPP/NRKBN1BQ w Bfb - 0 9", 4, 156002 }, + { "nrkbnrbq/ppppppp1/8/8/7p/PP3P2/2PPPRPP/NRKBN1BQ w Bfb - 0 9", 5, 3008668 }, + { "nrkbnrbq/ppppppp1/8/8/7p/PP3P2/2PPPRPP/NRKBN1BQ w Bfb - 0 9", 6, 82706705 }, + { "nrknrbbq/p4ppp/2p1p3/1p1p4/1P2P3/2P5/P1NP1PPP/1RKNRBBQ w EBeb - 0 9", 1, 29 }, + { "nrknrbbq/p4ppp/2p1p3/1p1p4/1P2P3/2P5/P1NP1PPP/1RKNRBBQ w EBeb - 0 9", 2, 728 }, + { "nrknrbbq/p4ppp/2p1p3/1p1p4/1P2P3/2P5/P1NP1PPP/1RKNRBBQ w EBeb - 0 9", 3, 21915 }, + { "nrknrbbq/p4ppp/2p1p3/1p1p4/1P2P3/2P5/P1NP1PPP/1RKNRBBQ w EBeb - 0 9", 4, 587668 }, + { "nrknrbbq/p4ppp/2p1p3/1p1p4/1P2P3/2P5/P1NP1PPP/1RKNRBBQ w EBeb - 0 9", 5, 18231199 }, + { "nrknrbbq/p4ppp/2p1p3/1p1p4/1P2P3/2P5/P1NP1PPP/1RKNRBBQ w EBeb - 0 9", 6, 511686397 }, + { "nrknr1bb/pppp1p2/7p/2qPp1p1/8/1P5P/P1P1PPP1/NRKNRQBB w EBeb - 0 9", 1, 20 }, + { "nrknr1bb/pppp1p2/7p/2qPp1p1/8/1P5P/P1P1PPP1/NRKNRQBB w EBeb - 0 9", 2, 714 }, + { "nrknr1bb/pppp1p2/7p/2qPp1p1/8/1P5P/P1P1PPP1/NRKNRQBB w EBeb - 0 9", 3, 14336 }, + { "nrknr1bb/pppp1p2/7p/2qPp1p1/8/1P5P/P1P1PPP1/NRKNRQBB w EBeb - 0 9", 4, 500458 }, + { "nrknr1bb/pppp1p2/7p/2qPp1p1/8/1P5P/P1P1PPP1/NRKNRQBB w EBeb - 0 9", 5, 11132758 }, + { "nrknr1bb/pppp1p2/7p/2qPp1p1/8/1P5P/P1P1PPP1/NRKNRQBB w EBeb - 0 9", 6, 386064577 }, + { "bbqnrrkn/ppp2p1p/3pp1p1/8/1PP5/2Q5/P1BPPPPP/B2NRKRN w GE - 0 9", 1, 39 }, + { "bbqnrrkn/ppp2p1p/3pp1p1/8/1PP5/2Q5/P1BPPPPP/B2NRKRN w GE - 0 9", 2, 593 }, + { "bbqnrrkn/ppp2p1p/3pp1p1/8/1PP5/2Q5/P1BPPPPP/B2NRKRN w GE - 0 9", 3, 23446 }, + { "bbqnrrkn/ppp2p1p/3pp1p1/8/1PP5/2Q5/P1BPPPPP/B2NRKRN w GE - 0 9", 4, 424799 }, + { "bbqnrrkn/ppp2p1p/3pp1p1/8/1PP5/2Q5/P1BPPPPP/B2NRKRN w GE - 0 9", 5, 16764576 }, + { "bbqnrrkn/ppp2p1p/3pp1p1/8/1PP5/2Q5/P1BPPPPP/B2NRKRN w GE - 0 9", 6, 346185058 }, + { "bqn1rkrn/p1p2ppp/1p1p4/4p3/3PP2b/8/PPP2PPP/BQNBRKRN w GEge - 2 9", 1, 25 }, + { "bqn1rkrn/p1p2ppp/1p1p4/4p3/3PP2b/8/PPP2PPP/BQNBRKRN w GEge - 2 9", 2, 773 }, + { "bqn1rkrn/p1p2ppp/1p1p4/4p3/3PP2b/8/PPP2PPP/BQNBRKRN w GEge - 2 9", 3, 20042 }, + { "bqn1rkrn/p1p2ppp/1p1p4/4p3/3PP2b/8/PPP2PPP/BQNBRKRN w GEge - 2 9", 4, 616817 }, + { "bqn1rkrn/p1p2ppp/1p1p4/4p3/3PP2b/8/PPP2PPP/BQNBRKRN w GEge - 2 9", 5, 16632403 }, + { "bqn1rkrn/p1p2ppp/1p1p4/4p3/3PP2b/8/PPP2PPP/BQNBRKRN w GEge - 2 9", 6, 515838333 }, + { "bqnrkb1n/p1p1pprp/3p4/1p2P1p1/2PP4/8/PP3PPP/BQNRKBRN w GDd - 1 9", 1, 31 }, + { "bqnrkb1n/p1p1pprp/3p4/1p2P1p1/2PP4/8/PP3PPP/BQNRKBRN w GDd - 1 9", 2, 860 }, + { "bqnrkb1n/p1p1pprp/3p4/1p2P1p1/2PP4/8/PP3PPP/BQNRKBRN w GDd - 1 9", 3, 28102 }, + { "bqnrkb1n/p1p1pprp/3p4/1p2P1p1/2PP4/8/PP3PPP/BQNRKBRN w GDd - 1 9", 4, 810379 }, + { "bqnrkb1n/p1p1pprp/3p4/1p2P1p1/2PP4/8/PP3PPP/BQNRKBRN w GDd - 1 9", 5, 27233018 }, + { "bqnrkb1n/p1p1pprp/3p4/1p2P1p1/2PP4/8/PP3PPP/BQNRKBRN w GDd - 1 9", 6, 813751250 }, + { "bqr1krnb/ppppppp1/7p/3n4/1P4P1/P4N2/2PPPP1P/BQNRKR1B w FDf - 3 9", 1, 31 }, + { "bqr1krnb/ppppppp1/7p/3n4/1P4P1/P4N2/2PPPP1P/BQNRKR1B w FDf - 3 9", 2, 709 }, + { "bqr1krnb/ppppppp1/7p/3n4/1P4P1/P4N2/2PPPP1P/BQNRKR1B w FDf - 3 9", 3, 22936 }, + { "bqr1krnb/ppppppp1/7p/3n4/1P4P1/P4N2/2PPPP1P/BQNRKR1B w FDf - 3 9", 4, 559830 }, + { "bqr1krnb/ppppppp1/7p/3n4/1P4P1/P4N2/2PPPP1P/BQNRKR1B w FDf - 3 9", 5, 18608857 }, + { "bqr1krnb/ppppppp1/7p/3n4/1P4P1/P4N2/2PPPP1P/BQNRKR1B w FDf - 3 9", 6, 480498340 }, + { "qbbn1krn/pp3ppp/4r3/2ppp3/P1P4P/8/1P1PPPP1/QBBNRKRN w GEg - 1 9", 1, 26 }, + { "qbbn1krn/pp3ppp/4r3/2ppp3/P1P4P/8/1P1PPPP1/QBBNRKRN w GEg - 1 9", 2, 775 }, + { "qbbn1krn/pp3ppp/4r3/2ppp3/P1P4P/8/1P1PPPP1/QBBNRKRN w GEg - 1 9", 3, 21100 }, + { "qbbn1krn/pp3ppp/4r3/2ppp3/P1P4P/8/1P1PPPP1/QBBNRKRN w GEg - 1 9", 4, 649673 }, + { "qbbn1krn/pp3ppp/4r3/2ppp3/P1P4P/8/1P1PPPP1/QBBNRKRN w GEg - 1 9", 5, 18476807 }, + { "qbbn1krn/pp3ppp/4r3/2ppp3/P1P4P/8/1P1PPPP1/QBBNRKRN w GEg - 1 9", 6, 582542257 }, + { "qnbbrkrn/1p1pp2p/p7/2p2pp1/8/4P2P/PPPP1PPK/QNBBRR1N w ge - 0 9", 1, 25 }, + { "qnbbrkrn/1p1pp2p/p7/2p2pp1/8/4P2P/PPPP1PPK/QNBBRR1N w ge - 0 9", 2, 599 }, + { "qnbbrkrn/1p1pp2p/p7/2p2pp1/8/4P2P/PPPP1PPK/QNBBRR1N w ge - 0 9", 3, 15139 }, + { "qnbbrkrn/1p1pp2p/p7/2p2pp1/8/4P2P/PPPP1PPK/QNBBRR1N w ge - 0 9", 4, 389104 }, + { "qnbbrkrn/1p1pp2p/p7/2p2pp1/8/4P2P/PPPP1PPK/QNBBRR1N w ge - 0 9", 5, 10260500 }, + { "qnbbrkrn/1p1pp2p/p7/2p2pp1/8/4P2P/PPPP1PPK/QNBBRR1N w ge - 0 9", 6, 279222412 }, + { "qnbrkbrn/1ppp2p1/p3p2p/5p2/P4P2/1P6/2PPP1PP/QNBRKBRN w GDgd - 0 9", 1, 27 }, + { "qnbrkbrn/1ppp2p1/p3p2p/5p2/P4P2/1P6/2PPP1PP/QNBRKBRN w GDgd - 0 9", 2, 588 }, + { "qnbrkbrn/1ppp2p1/p3p2p/5p2/P4P2/1P6/2PPP1PP/QNBRKBRN w GDgd - 0 9", 3, 16735 }, + { "qnbrkbrn/1ppp2p1/p3p2p/5p2/P4P2/1P6/2PPP1PP/QNBRKBRN w GDgd - 0 9", 4, 394829 }, + { "qnbrkbrn/1ppp2p1/p3p2p/5p2/P4P2/1P6/2PPP1PP/QNBRKBRN w GDgd - 0 9", 5, 11640416 }, + { "qnbrkbrn/1ppp2p1/p3p2p/5p2/P4P2/1P6/2PPP1PP/QNBRKBRN w GDgd - 0 9", 6, 293541380 }, + { "1nbrkrnb/p1pppp1p/1pq3p1/8/4P3/P1P4N/1P1P1PPP/QNBRKR1B w FDfd - 1 9", 1, 18 }, + { "1nbrkrnb/p1pppp1p/1pq3p1/8/4P3/P1P4N/1P1P1PPP/QNBRKR1B w FDfd - 1 9", 2, 609 }, + { "1nbrkrnb/p1pppp1p/1pq3p1/8/4P3/P1P4N/1P1P1PPP/QNBRKR1B w FDfd - 1 9", 3, 11789 }, + { "1nbrkrnb/p1pppp1p/1pq3p1/8/4P3/P1P4N/1P1P1PPP/QNBRKR1B w FDfd - 1 9", 4, 406831 }, + { "1nbrkrnb/p1pppp1p/1pq3p1/8/4P3/P1P4N/1P1P1PPP/QNBRKR1B w FDfd - 1 9", 5, 8604788 }, + { "1nbrkrnb/p1pppp1p/1pq3p1/8/4P3/P1P4N/1P1P1PPP/QNBRKR1B w FDfd - 1 9", 6, 299491047 }, + { "qb1r1krn/pppp2pp/1n2ppb1/4P3/7P/8/PPPP1PP1/QBNRBKRN w GDgd - 0 9", 1, 20 }, + { "qb1r1krn/pppp2pp/1n2ppb1/4P3/7P/8/PPPP1PP1/QBNRBKRN w GDgd - 0 9", 2, 578 }, + { "qb1r1krn/pppp2pp/1n2ppb1/4P3/7P/8/PPPP1PP1/QBNRBKRN w GDgd - 0 9", 3, 12205 }, + { "qb1r1krn/pppp2pp/1n2ppb1/4P3/7P/8/PPPP1PP1/QBNRBKRN w GDgd - 0 9", 4, 349453 }, + { "qb1r1krn/pppp2pp/1n2ppb1/4P3/7P/8/PPPP1PP1/QBNRBKRN w GDgd - 0 9", 5, 7939483 }, + { "qb1r1krn/pppp2pp/1n2ppb1/4P3/7P/8/PPPP1PP1/QBNRBKRN w GDgd - 0 9", 6, 229142178 }, + { "qnr1bkrn/p3pppp/1bpp4/1p6/2P2PP1/8/PP1PPN1P/QNRBBKR1 w GCgc - 0 9", 1, 30 }, + { "qnr1bkrn/p3pppp/1bpp4/1p6/2P2PP1/8/PP1PPN1P/QNRBBKR1 w GCgc - 0 9", 2, 865 }, + { "qnr1bkrn/p3pppp/1bpp4/1p6/2P2PP1/8/PP1PPN1P/QNRBBKR1 w GCgc - 0 9", 3, 26617 }, + { "qnr1bkrn/p3pppp/1bpp4/1p6/2P2PP1/8/PP1PPN1P/QNRBBKR1 w GCgc - 0 9", 4, 771705 }, + { "qnr1bkrn/p3pppp/1bpp4/1p6/2P2PP1/8/PP1PPN1P/QNRBBKR1 w GCgc - 0 9", 5, 24475596 }, + { "qnr1bkrn/p3pppp/1bpp4/1p6/2P2PP1/8/PP1PPN1P/QNRBBKR1 w GCgc - 0 9", 6, 719842237 }, + { "1nkrbbrn/qppppppp/8/8/p2P4/1P5P/P1P1PPP1/QNKRBBRN w - - 0 9", 1, 27 }, + { "1nkrbbrn/qppppppp/8/8/p2P4/1P5P/P1P1PPP1/QNKRBBRN w - - 0 9", 2, 672 }, + { "1nkrbbrn/qppppppp/8/8/p2P4/1P5P/P1P1PPP1/QNKRBBRN w - - 0 9", 3, 18371 }, + { "1nkrbbrn/qppppppp/8/8/p2P4/1P5P/P1P1PPP1/QNKRBBRN w - - 0 9", 4, 505278 }, + { "1nkrbbrn/qppppppp/8/8/p2P4/1P5P/P1P1PPP1/QNKRBBRN w - - 0 9", 5, 14065717 }, + { "1nkrbbrn/qppppppp/8/8/p2P4/1P5P/P1P1PPP1/QNKRBBRN w - - 0 9", 6, 410130412 }, + { "1qrkbrnb/ppp1p1pp/n2p4/5p2/4N3/8/PPPPPPPP/Q1RKBRNB w Ffc - 2 9", 1, 25 }, + { "1qrkbrnb/ppp1p1pp/n2p4/5p2/4N3/8/PPPPPPPP/Q1RKBRNB w Ffc - 2 9", 2, 718 }, + { "1qrkbrnb/ppp1p1pp/n2p4/5p2/4N3/8/PPPPPPPP/Q1RKBRNB w Ffc - 2 9", 3, 18573 }, + { "1qrkbrnb/ppp1p1pp/n2p4/5p2/4N3/8/PPPPPPPP/Q1RKBRNB w Ffc - 2 9", 4, 536771 }, + { "1qrkbrnb/ppp1p1pp/n2p4/5p2/4N3/8/PPPPPPPP/Q1RKBRNB w Ffc - 2 9", 5, 14404324 }, + { "1qrkbrnb/ppp1p1pp/n2p4/5p2/4N3/8/PPPPPPPP/Q1RKBRNB w Ffc - 2 9", 6, 424279467 }, + { "q1nrkrbn/pp1pppp1/2p4p/8/P7/5Pb1/BPPPPNPP/Q1NRKRB1 w FDfd - 0 9", 1, 22 }, + { "q1nrkrbn/pp1pppp1/2p4p/8/P7/5Pb1/BPPPPNPP/Q1NRKRB1 w FDfd - 0 9", 2, 558 }, + { "q1nrkrbn/pp1pppp1/2p4p/8/P7/5Pb1/BPPPPNPP/Q1NRKRB1 w FDfd - 0 9", 3, 12911 }, + { "q1nrkrbn/pp1pppp1/2p4p/8/P7/5Pb1/BPPPPNPP/Q1NRKRB1 w FDfd - 0 9", 4, 336042 }, + { "q1nrkrbn/pp1pppp1/2p4p/8/P7/5Pb1/BPPPPNPP/Q1NRKRB1 w FDfd - 0 9", 5, 8516966 }, + { "q1nrkrbn/pp1pppp1/2p4p/8/P7/5Pb1/BPPPPNPP/Q1NRKRB1 w FDfd - 0 9", 6, 228074630 }, + { "qnrbkrbn/1p1p1pp1/p1p5/4p2p/8/3P1P2/PPP1P1PP/QNRBKRBN w FCfc - 0 9", 1, 28 }, + { "qnrbkrbn/1p1p1pp1/p1p5/4p2p/8/3P1P2/PPP1P1PP/QNRBKRBN w FCfc - 0 9", 2, 669 }, + { "qnrbkrbn/1p1p1pp1/p1p5/4p2p/8/3P1P2/PPP1P1PP/QNRBKRBN w FCfc - 0 9", 3, 17713 }, + { "qnrbkrbn/1p1p1pp1/p1p5/4p2p/8/3P1P2/PPP1P1PP/QNRBKRBN w FCfc - 0 9", 4, 440930 }, + { "qnrbkrbn/1p1p1pp1/p1p5/4p2p/8/3P1P2/PPP1P1PP/QNRBKRBN w FCfc - 0 9", 5, 12055174 }, + { "qnrbkrbn/1p1p1pp1/p1p5/4p2p/8/3P1P2/PPP1P1PP/QNRBKRBN w FCfc - 0 9", 6, 313276304 }, + { "qnrkr1bn/p1pp1ppp/8/1p2p3/3P1P2/bP4P1/P1P1P2P/QNRKRBBN w ECec - 1 9", 1, 23 }, + { "qnrkr1bn/p1pp1ppp/8/1p2p3/3P1P2/bP4P1/P1P1P2P/QNRKRBBN w ECec - 1 9", 2, 845 }, + { "qnrkr1bn/p1pp1ppp/8/1p2p3/3P1P2/bP4P1/P1P1P2P/QNRKRBBN w ECec - 1 9", 3, 20973 }, + { "qnrkr1bn/p1pp1ppp/8/1p2p3/3P1P2/bP4P1/P1P1P2P/QNRKRBBN w ECec - 1 9", 4, 759778 }, + { "qnrkr1bn/p1pp1ppp/8/1p2p3/3P1P2/bP4P1/P1P1P2P/QNRKRBBN w ECec - 1 9", 5, 19939053 }, + { "qnrkr1bn/p1pp1ppp/8/1p2p3/3P1P2/bP4P1/P1P1P2P/QNRKRBBN w ECec - 1 9", 6, 718075943 }, + { "q1krrnbb/p1p1pppp/2np4/1pB5/5P2/8/PPPPP1PP/QNRKRN1B w EC - 0 9", 1, 29 }, + { "q1krrnbb/p1p1pppp/2np4/1pB5/5P2/8/PPPPP1PP/QNRKRN1B w EC - 0 9", 2, 776 }, + { "q1krrnbb/p1p1pppp/2np4/1pB5/5P2/8/PPPPP1PP/QNRKRN1B w EC - 0 9", 3, 21966 }, + { "q1krrnbb/p1p1pppp/2np4/1pB5/5P2/8/PPPPP1PP/QNRKRN1B w EC - 0 9", 4, 631941 }, + { "q1krrnbb/p1p1pppp/2np4/1pB5/5P2/8/PPPPP1PP/QNRKRN1B w EC - 0 9", 5, 18110831 }, + { "q1krrnbb/p1p1pppp/2np4/1pB5/5P2/8/PPPPP1PP/QNRKRN1B w EC - 0 9", 6, 549019739 }, + { "bbn1rkrn/pp1p1ppp/8/2p1p1q1/6P1/P7/BPPPPP1P/B1NQRKRN w GEge - 0 9", 1, 26 }, + { "bbn1rkrn/pp1p1ppp/8/2p1p1q1/6P1/P7/BPPPPP1P/B1NQRKRN w GEge - 0 9", 2, 936 }, + { "bbn1rkrn/pp1p1ppp/8/2p1p1q1/6P1/P7/BPPPPP1P/B1NQRKRN w GEge - 0 9", 3, 25177 }, + { "bbn1rkrn/pp1p1ppp/8/2p1p1q1/6P1/P7/BPPPPP1P/B1NQRKRN w GEge - 0 9", 4, 906801 }, + { "bbn1rkrn/pp1p1ppp/8/2p1p1q1/6P1/P7/BPPPPP1P/B1NQRKRN w GEge - 0 9", 5, 24984621 }, + { "bbn1rkrn/pp1p1ppp/8/2p1p1q1/6P1/P7/BPPPPP1P/B1NQRKRN w GEge - 0 9", 6, 901444251 }, + { "bn1brkrn/pp1qpp1p/2p3p1/3p4/1PPP4/P7/4PPPP/BNQBRKRN w GEge - 1 9", 1, 29 }, + { "bn1brkrn/pp1qpp1p/2p3p1/3p4/1PPP4/P7/4PPPP/BNQBRKRN w GEge - 1 9", 2, 755 }, + { "bn1brkrn/pp1qpp1p/2p3p1/3p4/1PPP4/P7/4PPPP/BNQBRKRN w GEge - 1 9", 3, 22858 }, + { "bn1brkrn/pp1qpp1p/2p3p1/3p4/1PPP4/P7/4PPPP/BNQBRKRN w GEge - 1 9", 4, 645963 }, + { "bn1brkrn/pp1qpp1p/2p3p1/3p4/1PPP4/P7/4PPPP/BNQBRKRN w GEge - 1 9", 5, 20128587 }, + { "bn1brkrn/pp1qpp1p/2p3p1/3p4/1PPP4/P7/4PPPP/BNQBRKRN w GEge - 1 9", 6, 600207069 }, + { "b2rkbrn/p1pppppp/qp6/8/1n6/2B2P2/P1PPP1PP/1NQRKBRN w GDgd - 0 9", 1, 24 }, + { "b2rkbrn/p1pppppp/qp6/8/1n6/2B2P2/P1PPP1PP/1NQRKBRN w GDgd - 0 9", 2, 878 }, + { "b2rkbrn/p1pppppp/qp6/8/1n6/2B2P2/P1PPP1PP/1NQRKBRN w GDgd - 0 9", 3, 21440 }, + { "b2rkbrn/p1pppppp/qp6/8/1n6/2B2P2/P1PPP1PP/1NQRKBRN w GDgd - 0 9", 4, 791007 }, + { "b2rkbrn/p1pppppp/qp6/8/1n6/2B2P2/P1PPP1PP/1NQRKBRN w GDgd - 0 9", 5, 20840078 }, + { "b2rkbrn/p1pppppp/qp6/8/1n6/2B2P2/P1PPP1PP/1NQRKBRN w GDgd - 0 9", 6, 775795187 }, + { "b2rkrnb/pqp1pppp/n7/1p1p4/P7/N1P2N2/1P1PPPPP/B1QRKR1B w FDfd - 4 9", 1, 26 }, + { "b2rkrnb/pqp1pppp/n7/1p1p4/P7/N1P2N2/1P1PPPPP/B1QRKR1B w FDfd - 4 9", 2, 724 }, + { "b2rkrnb/pqp1pppp/n7/1p1p4/P7/N1P2N2/1P1PPPPP/B1QRKR1B w FDfd - 4 9", 3, 19558 }, + { "b2rkrnb/pqp1pppp/n7/1p1p4/P7/N1P2N2/1P1PPPPP/B1QRKR1B w FDfd - 4 9", 4, 571891 }, + { "b2rkrnb/pqp1pppp/n7/1p1p4/P7/N1P2N2/1P1PPPPP/B1QRKR1B w FDfd - 4 9", 5, 16109522 }, + { "b2rkrnb/pqp1pppp/n7/1p1p4/P7/N1P2N2/1P1PPPPP/B1QRKR1B w FDfd - 4 9", 6, 492933398 }, + { "1bbqrkrn/ppppp1p1/8/5p1p/P1n3P1/3P4/1PP1PP1P/NBBQRRKN w ge - 1 9", 1, 25 }, + { "1bbqrkrn/ppppp1p1/8/5p1p/P1n3P1/3P4/1PP1PP1P/NBBQRRKN w ge - 1 9", 2, 678 }, + { "1bbqrkrn/ppppp1p1/8/5p1p/P1n3P1/3P4/1PP1PP1P/NBBQRRKN w ge - 1 9", 3, 17351 }, + { "1bbqrkrn/ppppp1p1/8/5p1p/P1n3P1/3P4/1PP1PP1P/NBBQRRKN w ge - 1 9", 4, 461211 }, + { "1bbqrkrn/ppppp1p1/8/5p1p/P1n3P1/3P4/1PP1PP1P/NBBQRRKN w ge - 1 9", 5, 12173245 }, + { "1bbqrkrn/ppppp1p1/8/5p1p/P1n3P1/3P4/1PP1PP1P/NBBQRRKN w ge - 1 9", 6, 329661421 }, + { "nqb1rrkn/ppp1bppp/3pp3/8/3P4/1P6/PQP1PPPP/N1BBRRKN w - - 1 9", 1, 23 }, + { "nqb1rrkn/ppp1bppp/3pp3/8/3P4/1P6/PQP1PPPP/N1BBRRKN w - - 1 9", 2, 503 }, + { "nqb1rrkn/ppp1bppp/3pp3/8/3P4/1P6/PQP1PPPP/N1BBRRKN w - - 1 9", 3, 12465 }, + { "nqb1rrkn/ppp1bppp/3pp3/8/3P4/1P6/PQP1PPPP/N1BBRRKN w - - 1 9", 4, 290341 }, + { "nqb1rrkn/ppp1bppp/3pp3/8/3P4/1P6/PQP1PPPP/N1BBRRKN w - - 1 9", 5, 7626054 }, + { "nqb1rrkn/ppp1bppp/3pp3/8/3P4/1P6/PQP1PPPP/N1BBRRKN w - - 1 9", 6, 188215608 }, + { "nqbrkbr1/p1pppppp/1p6/2N2n2/2P5/5P2/PP1PP1PP/1QBRKBRN w GDgd - 1 9", 1, 29 }, + { "nqbrkbr1/p1pppppp/1p6/2N2n2/2P5/5P2/PP1PP1PP/1QBRKBRN w GDgd - 1 9", 2, 688 }, + { "nqbrkbr1/p1pppppp/1p6/2N2n2/2P5/5P2/PP1PP1PP/1QBRKBRN w GDgd - 1 9", 3, 20289 }, + { "nqbrkbr1/p1pppppp/1p6/2N2n2/2P5/5P2/PP1PP1PP/1QBRKBRN w GDgd - 1 9", 4, 506302 }, + { "nqbrkbr1/p1pppppp/1p6/2N2n2/2P5/5P2/PP1PP1PP/1QBRKBRN w GDgd - 1 9", 5, 15167248 }, + { "nqbrkbr1/p1pppppp/1p6/2N2n2/2P5/5P2/PP1PP1PP/1QBRKBRN w GDgd - 1 9", 6, 399015237 }, + { "nqbrkrn1/1ppppp2/6pp/p7/1P6/2Q5/P1PPPPPP/N1BRKRNB w FDfd - 0 9", 1, 36 }, + { "nqbrkrn1/1ppppp2/6pp/p7/1P6/2Q5/P1PPPPPP/N1BRKRNB w FDfd - 0 9", 2, 602 }, + { "nqbrkrn1/1ppppp2/6pp/p7/1P6/2Q5/P1PPPPPP/N1BRKRNB w FDfd - 0 9", 3, 20985 }, + { "nqbrkrn1/1ppppp2/6pp/p7/1P6/2Q5/P1PPPPPP/N1BRKRNB w FDfd - 0 9", 4, 397340 }, + { "nqbrkrn1/1ppppp2/6pp/p7/1P6/2Q5/P1PPPPPP/N1BRKRNB w FDfd - 0 9", 5, 13706856 }, + { "nqbrkrn1/1ppppp2/6pp/p7/1P6/2Q5/P1PPPPPP/N1BRKRNB w FDfd - 0 9", 6, 291708797 }, + { "nbqrbrkn/pp1p1pp1/2p5/4p2p/2P3P1/1P3P2/P2PP2P/NBQRBKRN w GD - 0 9", 1, 34 }, + { "nbqrbrkn/pp1p1pp1/2p5/4p2p/2P3P1/1P3P2/P2PP2P/NBQRBKRN w GD - 0 9", 2, 655 }, + { "nbqrbrkn/pp1p1pp1/2p5/4p2p/2P3P1/1P3P2/P2PP2P/NBQRBKRN w GD - 0 9", 3, 22581 }, + { "nbqrbrkn/pp1p1pp1/2p5/4p2p/2P3P1/1P3P2/P2PP2P/NBQRBKRN w GD - 0 9", 4, 474396 }, + { "nbqrbrkn/pp1p1pp1/2p5/4p2p/2P3P1/1P3P2/P2PP2P/NBQRBKRN w GD - 0 9", 5, 16613630 }, + { "nbqrbrkn/pp1p1pp1/2p5/4p2p/2P3P1/1P3P2/P2PP2P/NBQRBKRN w GD - 0 9", 6, 379344541 }, + { "nqrbbrkn/1p1pppp1/8/p1p4p/4P2P/1N4P1/PPPP1P2/1QRBBKRN w GC - 0 9", 1, 23 }, + { "nqrbbrkn/1p1pppp1/8/p1p4p/4P2P/1N4P1/PPPP1P2/1QRBBKRN w GC - 0 9", 2, 597 }, + { "nqrbbrkn/1p1pppp1/8/p1p4p/4P2P/1N4P1/PPPP1P2/1QRBBKRN w GC - 0 9", 3, 14468 }, + { "nqrbbrkn/1p1pppp1/8/p1p4p/4P2P/1N4P1/PPPP1P2/1QRBBKRN w GC - 0 9", 4, 400357 }, + { "nqrbbrkn/1p1pppp1/8/p1p4p/4P2P/1N4P1/PPPP1P2/1QRBBKRN w GC - 0 9", 5, 10096863 }, + { "nqrbbrkn/1p1pppp1/8/p1p4p/4P2P/1N4P1/PPPP1P2/1QRBBKRN w GC - 0 9", 6, 294900903 }, + { "nqrkbbrn/2p1p1pp/pp1p1p2/8/P2N4/2P5/1P1PPPPP/1QRKBBRN w GCgc - 0 9", 1, 32 }, + { "nqrkbbrn/2p1p1pp/pp1p1p2/8/P2N4/2P5/1P1PPPPP/1QRKBBRN w GCgc - 0 9", 2, 744 }, + { "nqrkbbrn/2p1p1pp/pp1p1p2/8/P2N4/2P5/1P1PPPPP/1QRKBBRN w GCgc - 0 9", 3, 23310 }, + { "nqrkbbrn/2p1p1pp/pp1p1p2/8/P2N4/2P5/1P1PPPPP/1QRKBBRN w GCgc - 0 9", 4, 550728 }, + { "nqrkbbrn/2p1p1pp/pp1p1p2/8/P2N4/2P5/1P1PPPPP/1QRKBBRN w GCgc - 0 9", 5, 17597164 }, + { "nqrkbbrn/2p1p1pp/pp1p1p2/8/P2N4/2P5/1P1PPPPP/1QRKBBRN w GCgc - 0 9", 6, 428786656 }, + { "n1krbrnb/q1pppppp/p7/1p6/3Q4/2P2P2/PP1PP1PP/N1RKBRNB w FC - 1 9", 1, 43 }, + { "n1krbrnb/q1pppppp/p7/1p6/3Q4/2P2P2/PP1PP1PP/N1RKBRNB w FC - 1 9", 2, 1038 }, + { "n1krbrnb/q1pppppp/p7/1p6/3Q4/2P2P2/PP1PP1PP/N1RKBRNB w FC - 1 9", 3, 41327 }, + { "n1krbrnb/q1pppppp/p7/1p6/3Q4/2P2P2/PP1PP1PP/N1RKBRNB w FC - 1 9", 4, 1074450 }, + { "n1krbrnb/q1pppppp/p7/1p6/3Q4/2P2P2/PP1PP1PP/N1RKBRNB w FC - 1 9", 5, 40918952 }, + { "n1krbrnb/q1pppppp/p7/1p6/3Q4/2P2P2/PP1PP1PP/N1RKBRNB w FC - 1 9", 6, 1126603824 }, + { "nb1rkrbn/p1pp1p1p/qp6/4p1p1/5PP1/P7/1PPPPB1P/NBQRKR1N w FDfd - 2 9", 1, 26 }, + { "nb1rkrbn/p1pp1p1p/qp6/4p1p1/5PP1/P7/1PPPPB1P/NBQRKR1N w FDfd - 2 9", 2, 645 }, + { "nb1rkrbn/p1pp1p1p/qp6/4p1p1/5PP1/P7/1PPPPB1P/NBQRKR1N w FDfd - 2 9", 3, 16463 }, + { "nb1rkrbn/p1pp1p1p/qp6/4p1p1/5PP1/P7/1PPPPB1P/NBQRKR1N w FDfd - 2 9", 4, 445464 }, + { "nb1rkrbn/p1pp1p1p/qp6/4p1p1/5PP1/P7/1PPPPB1P/NBQRKR1N w FDfd - 2 9", 5, 11911314 }, + { "nb1rkrbn/p1pp1p1p/qp6/4p1p1/5PP1/P7/1PPPPB1P/NBQRKR1N w FDfd - 2 9", 6, 342563372 }, + { "nqr1krbn/pppp1ppp/8/8/3pP3/5P2/PPPb1NPP/NQRBKRB1 w FCfc - 3 9", 1, 2 }, + { "nqr1krbn/pppp1ppp/8/8/3pP3/5P2/PPPb1NPP/NQRBKRB1 w FCfc - 3 9", 2, 51 }, + { "nqr1krbn/pppp1ppp/8/8/3pP3/5P2/PPPb1NPP/NQRBKRB1 w FCfc - 3 9", 3, 1047 }, + { "nqr1krbn/pppp1ppp/8/8/3pP3/5P2/PPPb1NPP/NQRBKRB1 w FCfc - 3 9", 4, 27743 }, + { "nqr1krbn/pppp1ppp/8/8/3pP3/5P2/PPPb1NPP/NQRBKRB1 w FCfc - 3 9", 5, 612305 }, + { "nqr1krbn/pppp1ppp/8/8/3pP3/5P2/PPPb1NPP/NQRBKRB1 w FCfc - 3 9", 6, 17040200 }, + { "n1rkrbbn/pqppppp1/7p/1p6/8/1NPP4/PP1KPPPP/1QR1RBBN w ec - 0 9", 1, 25 }, + { "n1rkrbbn/pqppppp1/7p/1p6/8/1NPP4/PP1KPPPP/1QR1RBBN w ec - 0 9", 2, 674 }, + { "n1rkrbbn/pqppppp1/7p/1p6/8/1NPP4/PP1KPPPP/1QR1RBBN w ec - 0 9", 3, 17553 }, + { "n1rkrbbn/pqppppp1/7p/1p6/8/1NPP4/PP1KPPPP/1QR1RBBN w ec - 0 9", 4, 505337 }, + { "n1rkrbbn/pqppppp1/7p/1p6/8/1NPP4/PP1KPPPP/1QR1RBBN w ec - 0 9", 5, 13421727 }, + { "n1rkrbbn/pqppppp1/7p/1p6/8/1NPP4/PP1KPPPP/1QR1RBBN w ec - 0 9", 6, 403551903 }, + { "1qrkrnbb/1p1p1ppp/pnp1p3/8/3PP3/P6P/1PP2PP1/NQRKRNBB w ECec - 0 9", 1, 24 }, + { "1qrkrnbb/1p1p1ppp/pnp1p3/8/3PP3/P6P/1PP2PP1/NQRKRNBB w ECec - 0 9", 2, 688 }, + { "1qrkrnbb/1p1p1ppp/pnp1p3/8/3PP3/P6P/1PP2PP1/NQRKRNBB w ECec - 0 9", 3, 17342 }, + { "1qrkrnbb/1p1p1ppp/pnp1p3/8/3PP3/P6P/1PP2PP1/NQRKRNBB w ECec - 0 9", 4, 511444 }, + { "1qrkrnbb/1p1p1ppp/pnp1p3/8/3PP3/P6P/1PP2PP1/NQRKRNBB w ECec - 0 9", 5, 13322502 }, + { "1qrkrnbb/1p1p1ppp/pnp1p3/8/3PP3/P6P/1PP2PP1/NQRKRNBB w ECec - 0 9", 6, 403441498 }, + { "1bnrqkrn/2ppppp1/p7/1p1b3p/3PP1P1/8/PPPQ1P1P/BBNR1KRN w GDgd - 1 9", 1, 35 }, + { "1bnrqkrn/2ppppp1/p7/1p1b3p/3PP1P1/8/PPPQ1P1P/BBNR1KRN w GDgd - 1 9", 2, 925 }, + { "1bnrqkrn/2ppppp1/p7/1p1b3p/3PP1P1/8/PPPQ1P1P/BBNR1KRN w GDgd - 1 9", 3, 32238 }, + { "1bnrqkrn/2ppppp1/p7/1p1b3p/3PP1P1/8/PPPQ1P1P/BBNR1KRN w GDgd - 1 9", 4, 857060 }, + { "1bnrqkrn/2ppppp1/p7/1p1b3p/3PP1P1/8/PPPQ1P1P/BBNR1KRN w GDgd - 1 9", 5, 30458921 }, + { "1bnrqkrn/2ppppp1/p7/1p1b3p/3PP1P1/8/PPPQ1P1P/BBNR1KRN w GDgd - 1 9", 6, 824344087 }, + { "bnrbqkr1/ppp2pp1/6n1/3pp2p/1P6/2N3N1/P1PPPPPP/B1RBQRK1 w gc - 0 9", 1, 23 }, + { "bnrbqkr1/ppp2pp1/6n1/3pp2p/1P6/2N3N1/P1PPPPPP/B1RBQRK1 w gc - 0 9", 2, 704 }, + { "bnrbqkr1/ppp2pp1/6n1/3pp2p/1P6/2N3N1/P1PPPPPP/B1RBQRK1 w gc - 0 9", 3, 17345 }, + { "bnrbqkr1/ppp2pp1/6n1/3pp2p/1P6/2N3N1/P1PPPPPP/B1RBQRK1 w gc - 0 9", 4, 539587 }, + { "bnrbqkr1/ppp2pp1/6n1/3pp2p/1P6/2N3N1/P1PPPPPP/B1RBQRK1 w gc - 0 9", 5, 14154852 }, + { "bnrbqkr1/ppp2pp1/6n1/3pp2p/1P6/2N3N1/P1PPPPPP/B1RBQRK1 w gc - 0 9", 6, 450893738 }, + { "1nrqkbrn/p1pppppp/8/1p1b4/P6P/5P2/1PPPP1P1/BNRQKBRN w GCgc - 1 9", 1, 19 }, + { "1nrqkbrn/p1pppppp/8/1p1b4/P6P/5P2/1PPPP1P1/BNRQKBRN w GCgc - 1 9", 2, 505 }, + { "1nrqkbrn/p1pppppp/8/1p1b4/P6P/5P2/1PPPP1P1/BNRQKBRN w GCgc - 1 9", 3, 10619 }, + { "1nrqkbrn/p1pppppp/8/1p1b4/P6P/5P2/1PPPP1P1/BNRQKBRN w GCgc - 1 9", 4, 281422 }, + { "1nrqkbrn/p1pppppp/8/1p1b4/P6P/5P2/1PPPP1P1/BNRQKBRN w GCgc - 1 9", 5, 6450025 }, + { "1nrqkbrn/p1pppppp/8/1p1b4/P6P/5P2/1PPPP1P1/BNRQKBRN w GCgc - 1 9", 6, 175593967 }, + { "b1rqkrnb/ppppppp1/8/6p1/3n4/NP6/P1PPPP1P/B1RQKRNB w FCfc - 0 9", 1, 25 }, + { "b1rqkrnb/ppppppp1/8/6p1/3n4/NP6/P1PPPP1P/B1RQKRNB w FCfc - 0 9", 2, 614 }, + { "b1rqkrnb/ppppppp1/8/6p1/3n4/NP6/P1PPPP1P/B1RQKRNB w FCfc - 0 9", 3, 15578 }, + { "b1rqkrnb/ppppppp1/8/6p1/3n4/NP6/P1PPPP1P/B1RQKRNB w FCfc - 0 9", 4, 377660 }, + { "b1rqkrnb/ppppppp1/8/6p1/3n4/NP6/P1PPPP1P/B1RQKRNB w FCfc - 0 9", 5, 10391021 }, + { "b1rqkrnb/ppppppp1/8/6p1/3n4/NP6/P1PPPP1P/B1RQKRNB w FCfc - 0 9", 6, 259629603 }, + { "nbbrqkrn/ppp3p1/3pp3/5p1p/1P2P3/P7/2PPQPPP/NBBR1KRN w GDgd - 0 9", 1, 30 }, + { "nbbrqkrn/ppp3p1/3pp3/5p1p/1P2P3/P7/2PPQPPP/NBBR1KRN w GDgd - 0 9", 2, 833 }, + { "nbbrqkrn/ppp3p1/3pp3/5p1p/1P2P3/P7/2PPQPPP/NBBR1KRN w GDgd - 0 9", 3, 25719 }, + { "nbbrqkrn/ppp3p1/3pp3/5p1p/1P2P3/P7/2PPQPPP/NBBR1KRN w GDgd - 0 9", 4, 717713 }, + { "nbbrqkrn/ppp3p1/3pp3/5p1p/1P2P3/P7/2PPQPPP/NBBR1KRN w GDgd - 0 9", 5, 22873901 }, + { "nbbrqkrn/ppp3p1/3pp3/5p1p/1P2P3/P7/2PPQPPP/NBBR1KRN w GDgd - 0 9", 6, 649556666 }, + { "nr1bqrk1/ppp1pppp/6n1/3pP3/8/5PQb/PPPP2PP/NRBB1KRN w GB - 3 9", 1, 26 }, + { "nr1bqrk1/ppp1pppp/6n1/3pP3/8/5PQb/PPPP2PP/NRBB1KRN w GB - 3 9", 2, 734 }, + { "nr1bqrk1/ppp1pppp/6n1/3pP3/8/5PQb/PPPP2PP/NRBB1KRN w GB - 3 9", 3, 20161 }, + { "nr1bqrk1/ppp1pppp/6n1/3pP3/8/5PQb/PPPP2PP/NRBB1KRN w GB - 3 9", 4, 582591 }, + { "nr1bqrk1/ppp1pppp/6n1/3pP3/8/5PQb/PPPP2PP/NRBB1KRN w GB - 3 9", 5, 17199594 }, + { "nr1bqrk1/ppp1pppp/6n1/3pP3/8/5PQb/PPPP2PP/NRBB1KRN w GB - 3 9", 6, 512134836 }, + { "1rbqkbr1/ppppp1pp/1n6/4np2/3P1P2/6P1/PPPQP2P/NRB1KBRN w GBgb - 1 9", 1, 27 }, + { "1rbqkbr1/ppppp1pp/1n6/4np2/3P1P2/6P1/PPPQP2P/NRB1KBRN w GBgb - 1 9", 2, 662 }, + { "1rbqkbr1/ppppp1pp/1n6/4np2/3P1P2/6P1/PPPQP2P/NRB1KBRN w GBgb - 1 9", 3, 17897 }, + { "1rbqkbr1/ppppp1pp/1n6/4np2/3P1P2/6P1/PPPQP2P/NRB1KBRN w GBgb - 1 9", 4, 447464 }, + { "1rbqkbr1/ppppp1pp/1n6/4np2/3P1P2/6P1/PPPQP2P/NRB1KBRN w GBgb - 1 9", 5, 13038519 }, + { "1rbqkbr1/ppppp1pp/1n6/4np2/3P1P2/6P1/PPPQP2P/NRB1KBRN w GBgb - 1 9", 6, 338365642 }, + { "nr1qkr1b/ppp1pp1p/4bn2/3p2p1/4P3/1Q6/PPPP1PPP/NRB1KRNB w FBfb - 4 9", 1, 33 }, + { "nr1qkr1b/ppp1pp1p/4bn2/3p2p1/4P3/1Q6/PPPP1PPP/NRB1KRNB w FBfb - 4 9", 2, 939 }, + { "nr1qkr1b/ppp1pp1p/4bn2/3p2p1/4P3/1Q6/PPPP1PPP/NRB1KRNB w FBfb - 4 9", 3, 30923 }, + { "nr1qkr1b/ppp1pp1p/4bn2/3p2p1/4P3/1Q6/PPPP1PPP/NRB1KRNB w FBfb - 4 9", 4, 942138 }, + { "nr1qkr1b/ppp1pp1p/4bn2/3p2p1/4P3/1Q6/PPPP1PPP/NRB1KRNB w FBfb - 4 9", 5, 30995969 }, + { "nr1qkr1b/ppp1pp1p/4bn2/3p2p1/4P3/1Q6/PPPP1PPP/NRB1KRNB w FBfb - 4 9", 6, 991509814 }, + { "nb1qbkrn/pprp1pp1/7p/2p1pB2/Q1PP4/8/PP2PPPP/N1R1BKRN w GCg - 2 9", 1, 47 }, + { "nb1qbkrn/pprp1pp1/7p/2p1pB2/Q1PP4/8/PP2PPPP/N1R1BKRN w GCg - 2 9", 2, 1128 }, + { "nb1qbkrn/pprp1pp1/7p/2p1pB2/Q1PP4/8/PP2PPPP/N1R1BKRN w GCg - 2 9", 3, 50723 }, + { "nb1qbkrn/pprp1pp1/7p/2p1pB2/Q1PP4/8/PP2PPPP/N1R1BKRN w GCg - 2 9", 4, 1306753 }, + { "nb1qbkrn/pprp1pp1/7p/2p1pB2/Q1PP4/8/PP2PPPP/N1R1BKRN w GCg - 2 9", 5, 56747878 }, + { "nb1qbkrn/pprp1pp1/7p/2p1pB2/Q1PP4/8/PP2PPPP/N1R1BKRN w GCg - 2 9", 6, 1560584212 }, + { "nrqb1rkn/pp2pppp/2bp4/2p5/6P1/2P3N1/PP1PPP1P/NRQBBRK1 w - - 3 9", 1, 24 }, + { "nrqb1rkn/pp2pppp/2bp4/2p5/6P1/2P3N1/PP1PPP1P/NRQBBRK1 w - - 3 9", 2, 828 }, + { "nrqb1rkn/pp2pppp/2bp4/2p5/6P1/2P3N1/PP1PPP1P/NRQBBRK1 w - - 3 9", 3, 21148 }, + { "nrqb1rkn/pp2pppp/2bp4/2p5/6P1/2P3N1/PP1PPP1P/NRQBBRK1 w - - 3 9", 4, 723705 }, + { "nrqb1rkn/pp2pppp/2bp4/2p5/6P1/2P3N1/PP1PPP1P/NRQBBRK1 w - - 3 9", 5, 19506135 }, + { "nrqb1rkn/pp2pppp/2bp4/2p5/6P1/2P3N1/PP1PPP1P/NRQBBRK1 w - - 3 9", 6, 668969549 }, + { "nrq1bbrn/ppkpp2p/2p3p1/P4p2/8/4P1N1/1PPP1PPP/NRQKBBR1 w GB - 0 9", 1, 25 }, + { "nrq1bbrn/ppkpp2p/2p3p1/P4p2/8/4P1N1/1PPP1PPP/NRQKBBR1 w GB - 0 9", 2, 525 }, + { "nrq1bbrn/ppkpp2p/2p3p1/P4p2/8/4P1N1/1PPP1PPP/NRQKBBR1 w GB - 0 9", 3, 13533 }, + { "nrq1bbrn/ppkpp2p/2p3p1/P4p2/8/4P1N1/1PPP1PPP/NRQKBBR1 w GB - 0 9", 4, 309994 }, + { "nrq1bbrn/ppkpp2p/2p3p1/P4p2/8/4P1N1/1PPP1PPP/NRQKBBR1 w GB - 0 9", 5, 8250997 }, + { "nrq1bbrn/ppkpp2p/2p3p1/P4p2/8/4P1N1/1PPP1PPP/NRQKBBR1 w GB - 0 9", 6, 201795680 }, + { "Br1kbrn1/pqpppp2/8/6pp/3b2P1/1N6/PPPPPP1P/1RQKBRN1 w FBfb - 3 9", 1, 20 }, + { "Br1kbrn1/pqpppp2/8/6pp/3b2P1/1N6/PPPPPP1P/1RQKBRN1 w FBfb - 3 9", 2, 790 }, + { "Br1kbrn1/pqpppp2/8/6pp/3b2P1/1N6/PPPPPP1P/1RQKBRN1 w FBfb - 3 9", 3, 18175 }, + { "Br1kbrn1/pqpppp2/8/6pp/3b2P1/1N6/PPPPPP1P/1RQKBRN1 w FBfb - 3 9", 4, 695905 }, + { "Br1kbrn1/pqpppp2/8/6pp/3b2P1/1N6/PPPPPP1P/1RQKBRN1 w FBfb - 3 9", 5, 17735648 }, + { "Br1kbrn1/pqpppp2/8/6pp/3b2P1/1N6/PPPPPP1P/1RQKBRN1 w FBfb - 3 9", 6, 669854148 }, + { "nbrqkrbn/2p1p1pp/p7/1p1p1p2/4P1P1/5P2/PPPP3P/NBRQKRBN w FCfc - 0 9", 1, 29 }, + { "nbrqkrbn/2p1p1pp/p7/1p1p1p2/4P1P1/5P2/PPPP3P/NBRQKRBN w FCfc - 0 9", 2, 771 }, + { "nbrqkrbn/2p1p1pp/p7/1p1p1p2/4P1P1/5P2/PPPP3P/NBRQKRBN w FCfc - 0 9", 3, 22489 }, + { "nbrqkrbn/2p1p1pp/p7/1p1p1p2/4P1P1/5P2/PPPP3P/NBRQKRBN w FCfc - 0 9", 4, 647106 }, + { "nbrqkrbn/2p1p1pp/p7/1p1p1p2/4P1P1/5P2/PPPP3P/NBRQKRBN w FCfc - 0 9", 5, 19192982 }, + { "nbrqkrbn/2p1p1pp/p7/1p1p1p2/4P1P1/5P2/PPPP3P/NBRQKRBN w FCfc - 0 9", 6, 591335970 }, + { "1rqbkrbn/1ppppp1p/1n6/p1N3p1/8/2P4P/PP1PPPP1/1RQBKRBN w FBfb - 0 9", 1, 29 }, + { "1rqbkrbn/1ppppp1p/1n6/p1N3p1/8/2P4P/PP1PPPP1/1RQBKRBN w FBfb - 0 9", 2, 502 }, + { "1rqbkrbn/1ppppp1p/1n6/p1N3p1/8/2P4P/PP1PPPP1/1RQBKRBN w FBfb - 0 9", 3, 14569 }, + { "1rqbkrbn/1ppppp1p/1n6/p1N3p1/8/2P4P/PP1PPPP1/1RQBKRBN w FBfb - 0 9", 4, 287739 }, + { "1rqbkrbn/1ppppp1p/1n6/p1N3p1/8/2P4P/PP1PPPP1/1RQBKRBN w FBfb - 0 9", 5, 8652810 }, + { "1rqbkrbn/1ppppp1p/1n6/p1N3p1/8/2P4P/PP1PPPP1/1RQBKRBN w FBfb - 0 9", 6, 191762235 }, + { "1rqkrbbn/ppnpp1pp/8/2p5/6p1/3P4/PPP1PPPP/NRK1RBBN w eb - 0 9", 1, 19 }, + { "1rqkrbbn/ppnpp1pp/8/2p5/6p1/3P4/PPP1PPPP/NRK1RBBN w eb - 0 9", 2, 531 }, + { "1rqkrbbn/ppnpp1pp/8/2p5/6p1/3P4/PPP1PPPP/NRK1RBBN w eb - 0 9", 3, 10812 }, + { "1rqkrbbn/ppnpp1pp/8/2p5/6p1/3P4/PPP1PPPP/NRK1RBBN w eb - 0 9", 4, 300384 }, + { "1rqkrbbn/ppnpp1pp/8/2p5/6p1/3P4/PPP1PPPP/NRK1RBBN w eb - 0 9", 5, 6506674 }, + { "1rqkrbbn/ppnpp1pp/8/2p5/6p1/3P4/PPP1PPPP/NRK1RBBN w eb - 0 9", 6, 184309316 }, + { "nrqkrnbb/p1pp2pp/5p2/4P3/2p5/4N3/PP1PP1PP/NRQKR1BB w EBeb - 0 9", 1, 26 }, + { "nrqkrnbb/p1pp2pp/5p2/4P3/2p5/4N3/PP1PP1PP/NRQKR1BB w EBeb - 0 9", 2, 800 }, + { "nrqkrnbb/p1pp2pp/5p2/4P3/2p5/4N3/PP1PP1PP/NRQKR1BB w EBeb - 0 9", 3, 23256 }, + { "nrqkrnbb/p1pp2pp/5p2/4P3/2p5/4N3/PP1PP1PP/NRQKR1BB w EBeb - 0 9", 4, 756695 }, + { "nrqkrnbb/p1pp2pp/5p2/4P3/2p5/4N3/PP1PP1PP/NRQKR1BB w EBeb - 0 9", 5, 23952941 }, + { "nrqkrnbb/p1pp2pp/5p2/4P3/2p5/4N3/PP1PP1PP/NRQKR1BB w EBeb - 0 9", 6, 809841274 }, + { "bbnrkqrn/pp3pp1/4p2p/2pp4/4P1P1/1PB5/P1PP1P1P/1BNRKQRN w GDgd - 0 9", 1, 33 }, + { "bbnrkqrn/pp3pp1/4p2p/2pp4/4P1P1/1PB5/P1PP1P1P/1BNRKQRN w GDgd - 0 9", 2, 915 }, + { "bbnrkqrn/pp3pp1/4p2p/2pp4/4P1P1/1PB5/P1PP1P1P/1BNRKQRN w GDgd - 0 9", 3, 30536 }, + { "bbnrkqrn/pp3pp1/4p2p/2pp4/4P1P1/1PB5/P1PP1P1P/1BNRKQRN w GDgd - 0 9", 4, 878648 }, + { "bbnrkqrn/pp3pp1/4p2p/2pp4/4P1P1/1PB5/P1PP1P1P/1BNRKQRN w GDgd - 0 9", 5, 29602610 }, + { "bbnrkqrn/pp3pp1/4p2p/2pp4/4P1P1/1PB5/P1PP1P1P/1BNRKQRN w GDgd - 0 9", 6, 881898159 }, + { "bnrbkqr1/1p2pppp/6n1/p1pp4/7P/P3P3/1PPPKPP1/BNRB1QRN w gc - 0 9", 1, 19 }, + { "bnrbkqr1/1p2pppp/6n1/p1pp4/7P/P3P3/1PPPKPP1/BNRB1QRN w gc - 0 9", 2, 457 }, + { "bnrbkqr1/1p2pppp/6n1/p1pp4/7P/P3P3/1PPPKPP1/BNRB1QRN w gc - 0 9", 3, 9332 }, + { "bnrbkqr1/1p2pppp/6n1/p1pp4/7P/P3P3/1PPPKPP1/BNRB1QRN w gc - 0 9", 4, 238944 }, + { "bnrbkqr1/1p2pppp/6n1/p1pp4/7P/P3P3/1PPPKPP1/BNRB1QRN w gc - 0 9", 5, 5356253 }, + { "bnrbkqr1/1p2pppp/6n1/p1pp4/7P/P3P3/1PPPKPP1/BNRB1QRN w gc - 0 9", 6, 144653627 }, + { "b1rkqbrn/pp1p2pp/2n1p3/2p2p2/3P2PP/8/PPP1PP2/BNKRQBRN w gc - 0 9", 1, 30 }, + { "b1rkqbrn/pp1p2pp/2n1p3/2p2p2/3P2PP/8/PPP1PP2/BNKRQBRN w gc - 0 9", 2, 985 }, + { "b1rkqbrn/pp1p2pp/2n1p3/2p2p2/3P2PP/8/PPP1PP2/BNKRQBRN w gc - 0 9", 3, 30831 }, + { "b1rkqbrn/pp1p2pp/2n1p3/2p2p2/3P2PP/8/PPP1PP2/BNKRQBRN w gc - 0 9", 4, 1011700 }, + { "b1rkqbrn/pp1p2pp/2n1p3/2p2p2/3P2PP/8/PPP1PP2/BNKRQBRN w gc - 0 9", 5, 32684185 }, + { "b1rkqbrn/pp1p2pp/2n1p3/2p2p2/3P2PP/8/PPP1PP2/BNKRQBRN w gc - 0 9", 6, 1080607773 }, + { "b1rkqrnb/2ppppp1/np6/p6p/1P6/P2P3P/2P1PPP1/BNRKQRNB w FCfc - 0 9", 1, 26 }, + { "b1rkqrnb/2ppppp1/np6/p6p/1P6/P2P3P/2P1PPP1/BNRKQRNB w FCfc - 0 9", 2, 692 }, + { "b1rkqrnb/2ppppp1/np6/p6p/1P6/P2P3P/2P1PPP1/BNRKQRNB w FCfc - 0 9", 3, 18732 }, + { "b1rkqrnb/2ppppp1/np6/p6p/1P6/P2P3P/2P1PPP1/BNRKQRNB w FCfc - 0 9", 4, 517703 }, + { "b1rkqrnb/2ppppp1/np6/p6p/1P6/P2P3P/2P1PPP1/BNRKQRNB w FCfc - 0 9", 5, 14561181 }, + { "b1rkqrnb/2ppppp1/np6/p6p/1P6/P2P3P/2P1PPP1/BNRKQRNB w FCfc - 0 9", 6, 413226841 }, + { "nbbrkqrn/1ppp1p2/p6p/4p1p1/5P2/1P5P/P1PPPNP1/NBBRKQR1 w GDgd - 0 9", 1, 22 }, + { "nbbrkqrn/1ppp1p2/p6p/4p1p1/5P2/1P5P/P1PPPNP1/NBBRKQR1 w GDgd - 0 9", 2, 561 }, + { "nbbrkqrn/1ppp1p2/p6p/4p1p1/5P2/1P5P/P1PPPNP1/NBBRKQR1 w GDgd - 0 9", 3, 13222 }, + { "nbbrkqrn/1ppp1p2/p6p/4p1p1/5P2/1P5P/P1PPPNP1/NBBRKQR1 w GDgd - 0 9", 4, 367487 }, + { "nbbrkqrn/1ppp1p2/p6p/4p1p1/5P2/1P5P/P1PPPNP1/NBBRKQR1 w GDgd - 0 9", 5, 9307003 }, + { "nbbrkqrn/1ppp1p2/p6p/4p1p1/5P2/1P5P/P1PPPNP1/NBBRKQR1 w GDgd - 0 9", 6, 273928315 }, + { "nrbbkqrn/p1pppppp/8/1p6/4P3/7Q/PPPP1PPP/NRBBK1RN w GBgb - 0 9", 1, 38 }, + { "nrbbkqrn/p1pppppp/8/1p6/4P3/7Q/PPPP1PPP/NRBBK1RN w GBgb - 0 9", 2, 769 }, + { "nrbbkqrn/p1pppppp/8/1p6/4P3/7Q/PPPP1PPP/NRBBK1RN w GBgb - 0 9", 3, 28418 }, + { "nrbbkqrn/p1pppppp/8/1p6/4P3/7Q/PPPP1PPP/NRBBK1RN w GBgb - 0 9", 4, 632310 }, + { "nrbbkqrn/p1pppppp/8/1p6/4P3/7Q/PPPP1PPP/NRBBK1RN w GBgb - 0 9", 5, 23091070 }, + { "nrbbkqrn/p1pppppp/8/1p6/4P3/7Q/PPPP1PPP/NRBBK1RN w GBgb - 0 9", 6, 560139600 }, + { "nrbkqbrn/1pppp2p/8/p4pp1/P4PQ1/8/1PPPP1PP/NRBK1BRN w GBgb - 0 9", 1, 23 }, + { "nrbkqbrn/1pppp2p/8/p4pp1/P4PQ1/8/1PPPP1PP/NRBK1BRN w GBgb - 0 9", 2, 507 }, + { "nrbkqbrn/1pppp2p/8/p4pp1/P4PQ1/8/1PPPP1PP/NRBK1BRN w GBgb - 0 9", 3, 13067 }, + { "nrbkqbrn/1pppp2p/8/p4pp1/P4PQ1/8/1PPPP1PP/NRBK1BRN w GBgb - 0 9", 4, 321423 }, + { "nrbkqbrn/1pppp2p/8/p4pp1/P4PQ1/8/1PPPP1PP/NRBK1BRN w GBgb - 0 9", 5, 8887567 }, + { "nrbkqbrn/1pppp2p/8/p4pp1/P4PQ1/8/1PPPP1PP/NRBK1BRN w GBgb - 0 9", 6, 237475184 }, + { "nr1kqr1b/pp2pppp/5n2/2pp4/P5b1/5P2/1PPPPRPP/NRBK1QNB w Bfb - 2 9", 1, 18 }, + { "nr1kqr1b/pp2pppp/5n2/2pp4/P5b1/5P2/1PPPPRPP/NRBK1QNB w Bfb - 2 9", 2, 626 }, + { "nr1kqr1b/pp2pppp/5n2/2pp4/P5b1/5P2/1PPPPRPP/NRBK1QNB w Bfb - 2 9", 3, 12386 }, + { "nr1kqr1b/pp2pppp/5n2/2pp4/P5b1/5P2/1PPPPRPP/NRBK1QNB w Bfb - 2 9", 4, 434138 }, + { "nr1kqr1b/pp2pppp/5n2/2pp4/P5b1/5P2/1PPPPRPP/NRBK1QNB w Bfb - 2 9", 5, 9465555 }, + { "nr1kqr1b/pp2pppp/5n2/2pp4/P5b1/5P2/1PPPPRPP/NRBK1QNB w Bfb - 2 9", 6, 335004239 }, + { "nbkrbqrn/1pppppp1/8/4P2p/pP6/P7/2PP1PPP/NBRKBQRN w GC - 0 9", 1, 22 }, + { "nbkrbqrn/1pppppp1/8/4P2p/pP6/P7/2PP1PPP/NBRKBQRN w GC - 0 9", 2, 329 }, + { "nbkrbqrn/1pppppp1/8/4P2p/pP6/P7/2PP1PPP/NBRKBQRN w GC - 0 9", 3, 8475 }, + { "nbkrbqrn/1pppppp1/8/4P2p/pP6/P7/2PP1PPP/NBRKBQRN w GC - 0 9", 4, 148351 }, + { "nbkrbqrn/1pppppp1/8/4P2p/pP6/P7/2PP1PPP/NBRKBQRN w GC - 0 9", 5, 4160034 }, + { "nbkrbqrn/1pppppp1/8/4P2p/pP6/P7/2PP1PPP/NBRKBQRN w GC - 0 9", 6, 82875306 }, + { "nrkb1qrn/pp1pp1pp/8/5p1b/P1p4P/6N1/1PPPPPP1/NRKBBQR1 w GBgb - 2 9", 1, 16 }, + { "nrkb1qrn/pp1pp1pp/8/5p1b/P1p4P/6N1/1PPPPPP1/NRKBBQR1 w GBgb - 2 9", 2, 479 }, + { "nrkb1qrn/pp1pp1pp/8/5p1b/P1p4P/6N1/1PPPPPP1/NRKBBQR1 w GBgb - 2 9", 3, 9037 }, + { "nrkb1qrn/pp1pp1pp/8/5p1b/P1p4P/6N1/1PPPPPP1/NRKBBQR1 w GBgb - 2 9", 4, 275354 }, + { "nrkb1qrn/pp1pp1pp/8/5p1b/P1p4P/6N1/1PPPPPP1/NRKBBQR1 w GBgb - 2 9", 5, 5862341 }, + { "nrkb1qrn/pp1pp1pp/8/5p1b/P1p4P/6N1/1PPPPPP1/NRKBBQR1 w GBgb - 2 9", 6, 184959796 }, + { "1rkq1brn/ppppp1pp/1n6/3b1p2/3N3P/5P2/PPPPP1P1/1RKQBBRN w GBgb - 3 9", 1, 23 }, + { "1rkq1brn/ppppp1pp/1n6/3b1p2/3N3P/5P2/PPPPP1P1/1RKQBBRN w GBgb - 3 9", 2, 614 }, + { "1rkq1brn/ppppp1pp/1n6/3b1p2/3N3P/5P2/PPPPP1P1/1RKQBBRN w GBgb - 3 9", 3, 15324 }, + { "1rkq1brn/ppppp1pp/1n6/3b1p2/3N3P/5P2/PPPPP1P1/1RKQBBRN w GBgb - 3 9", 4, 418395 }, + { "1rkq1brn/ppppp1pp/1n6/3b1p2/3N3P/5P2/PPPPP1P1/1RKQBBRN w GBgb - 3 9", 5, 11090645 }, + { "1rkq1brn/ppppp1pp/1n6/3b1p2/3N3P/5P2/PPPPP1P1/1RKQBBRN w GBgb - 3 9", 6, 313526088 }, + { "nrk1brnb/pp1ppppp/2p5/3q4/5P2/PP6/1KPPP1PP/NR1QBRNB w fb - 1 9", 1, 25 }, + { "nrk1brnb/pp1ppppp/2p5/3q4/5P2/PP6/1KPPP1PP/NR1QBRNB w fb - 1 9", 2, 942 }, + { "nrk1brnb/pp1ppppp/2p5/3q4/5P2/PP6/1KPPP1PP/NR1QBRNB w fb - 1 9", 3, 21765 }, + { "nrk1brnb/pp1ppppp/2p5/3q4/5P2/PP6/1KPPP1PP/NR1QBRNB w fb - 1 9", 4, 792179 }, + { "nrk1brnb/pp1ppppp/2p5/3q4/5P2/PP6/1KPPP1PP/NR1QBRNB w fb - 1 9", 5, 19318837 }, + { "nrk1brnb/pp1ppppp/2p5/3q4/5P2/PP6/1KPPP1PP/NR1QBRNB w fb - 1 9", 6, 685549171 }, + { "nbrkqr1n/1pppp2p/p4pp1/2Bb4/5P2/6P1/PPPPP2P/NBRKQ1RN w Cfc - 2 9", 1, 30 }, + { "nbrkqr1n/1pppp2p/p4pp1/2Bb4/5P2/6P1/PPPPP2P/NBRKQ1RN w Cfc - 2 9", 2, 841 }, + { "nbrkqr1n/1pppp2p/p4pp1/2Bb4/5P2/6P1/PPPPP2P/NBRKQ1RN w Cfc - 2 9", 3, 24775 }, + { "nbrkqr1n/1pppp2p/p4pp1/2Bb4/5P2/6P1/PPPPP2P/NBRKQ1RN w Cfc - 2 9", 4, 677876 }, + { "nbrkqr1n/1pppp2p/p4pp1/2Bb4/5P2/6P1/PPPPP2P/NBRKQ1RN w Cfc - 2 9", 5, 20145765 }, + { "nbrkqr1n/1pppp2p/p4pp1/2Bb4/5P2/6P1/PPPPP2P/NBRKQ1RN w Cfc - 2 9", 6, 557578726 }, + { "n1kbqrbn/2p1pppp/1r6/pp1p4/P7/3P4/1PP1PPPP/NRKBQRBN w FBf - 2 9", 1, 21 }, + { "n1kbqrbn/2p1pppp/1r6/pp1p4/P7/3P4/1PP1PPPP/NRKBQRBN w FBf - 2 9", 2, 591 }, + { "n1kbqrbn/2p1pppp/1r6/pp1p4/P7/3P4/1PP1PPPP/NRKBQRBN w FBf - 2 9", 3, 14101 }, + { "n1kbqrbn/2p1pppp/1r6/pp1p4/P7/3P4/1PP1PPPP/NRKBQRBN w FBf - 2 9", 4, 394289 }, + { "n1kbqrbn/2p1pppp/1r6/pp1p4/P7/3P4/1PP1PPPP/NRKBQRBN w FBf - 2 9", 5, 10295086 }, + { "n1kbqrbn/2p1pppp/1r6/pp1p4/P7/3P4/1PP1PPPP/NRKBQRBN w FBf - 2 9", 6, 292131422 }, + { "nrkqrbb1/ppp1pppp/3p4/8/4P3/2Pn1P2/PP4PP/NRKQRBBN w EBeb - 0 9", 1, 4 }, + { "nrkqrbb1/ppp1pppp/3p4/8/4P3/2Pn1P2/PP4PP/NRKQRBBN w EBeb - 0 9", 2, 88 }, + { "nrkqrbb1/ppp1pppp/3p4/8/4P3/2Pn1P2/PP4PP/NRKQRBBN w EBeb - 0 9", 3, 3090 }, + { "nrkqrbb1/ppp1pppp/3p4/8/4P3/2Pn1P2/PP4PP/NRKQRBBN w EBeb - 0 9", 4, 73414 }, + { "nrkqrbb1/ppp1pppp/3p4/8/4P3/2Pn1P2/PP4PP/NRKQRBBN w EBeb - 0 9", 5, 2640555 }, + { "nrkqrbb1/ppp1pppp/3p4/8/4P3/2Pn1P2/PP4PP/NRKQRBBN w EBeb - 0 9", 6, 66958031 }, + { "nrkqrnbb/ppppp1p1/7p/1P3p2/3P4/2P5/P3PPPP/NRKQRNBB w EBeb - 0 9", 1, 29 }, + { "nrkqrnbb/ppppp1p1/7p/1P3p2/3P4/2P5/P3PPPP/NRKQRNBB w EBeb - 0 9", 2, 689 }, + { "nrkqrnbb/ppppp1p1/7p/1P3p2/3P4/2P5/P3PPPP/NRKQRNBB w EBeb - 0 9", 3, 21091 }, + { "nrkqrnbb/ppppp1p1/7p/1P3p2/3P4/2P5/P3PPPP/NRKQRNBB w EBeb - 0 9", 4, 508789 }, + { "nrkqrnbb/ppppp1p1/7p/1P3p2/3P4/2P5/P3PPPP/NRKQRNBB w EBeb - 0 9", 5, 16226660 }, + { "nrkqrnbb/ppppp1p1/7p/1P3p2/3P4/2P5/P3PPPP/NRKQRNBB w EBeb - 0 9", 6, 408570219 }, + { "bbnr1rqn/pp2pkpp/2pp1p2/8/4P1P1/8/PPPP1P1P/BBNRKRQN w FD - 0 9", 1, 21 }, + { "bbnr1rqn/pp2pkpp/2pp1p2/8/4P1P1/8/PPPP1P1P/BBNRKRQN w FD - 0 9", 2, 463 }, + { "bbnr1rqn/pp2pkpp/2pp1p2/8/4P1P1/8/PPPP1P1P/BBNRKRQN w FD - 0 9", 3, 11135 }, + { "bbnr1rqn/pp2pkpp/2pp1p2/8/4P1P1/8/PPPP1P1P/BBNRKRQN w FD - 0 9", 4, 256244 }, + { "bbnr1rqn/pp2pkpp/2pp1p2/8/4P1P1/8/PPPP1P1P/BBNRKRQN w FD - 0 9", 5, 6826249 }, + { "bbnr1rqn/pp2pkpp/2pp1p2/8/4P1P1/8/PPPP1P1P/BBNRKRQN w FD - 0 9", 6, 165025370 }, + { "bnrbk1qn/1pppprpp/8/p4p1P/6P1/3P4/PPP1PP2/BNRBKRQN w FCc - 0 9", 1, 22 }, + { "bnrbk1qn/1pppprpp/8/p4p1P/6P1/3P4/PPP1PP2/BNRBKRQN w FCc - 0 9", 2, 459 }, + { "bnrbk1qn/1pppprpp/8/p4p1P/6P1/3P4/PPP1PP2/BNRBKRQN w FCc - 0 9", 3, 11447 }, + { "bnrbk1qn/1pppprpp/8/p4p1P/6P1/3P4/PPP1PP2/BNRBKRQN w FCc - 0 9", 4, 268157 }, + { "bnrbk1qn/1pppprpp/8/p4p1P/6P1/3P4/PPP1PP2/BNRBKRQN w FCc - 0 9", 5, 7371098 }, + { "bnrbk1qn/1pppprpp/8/p4p1P/6P1/3P4/PPP1PP2/BNRBKRQN w FCc - 0 9", 6, 190583454 }, + { "1nrkrbqn/p1pp1ppp/4p3/1p6/1PP5/6PB/P2PPPbP/BNRKR1QN w ECec - 0 9", 1, 30 }, + { "1nrkrbqn/p1pp1ppp/4p3/1p6/1PP5/6PB/P2PPPbP/BNRKR1QN w ECec - 0 9", 2, 931 }, + { "1nrkrbqn/p1pp1ppp/4p3/1p6/1PP5/6PB/P2PPPbP/BNRKR1QN w ECec - 0 9", 3, 29012 }, + { "1nrkrbqn/p1pp1ppp/4p3/1p6/1PP5/6PB/P2PPPbP/BNRKR1QN w ECec - 0 9", 4, 887414 }, + { "1nrkrbqn/p1pp1ppp/4p3/1p6/1PP5/6PB/P2PPPbP/BNRKR1QN w ECec - 0 9", 5, 28412902 }, + { "1nrkrbqn/p1pp1ppp/4p3/1p6/1PP5/6PB/P2PPPbP/BNRKR1QN w ECec - 0 9", 6, 869228014 }, + { "b1rkr1nb/pppppqp1/n4B2/7p/8/1P4P1/P1PPPP1P/1NKRRQNB w ec - 1 9", 1, 36 }, + { "b1rkr1nb/pppppqp1/n4B2/7p/8/1P4P1/P1PPPP1P/1NKRRQNB w ec - 1 9", 2, 934 }, + { "b1rkr1nb/pppppqp1/n4B2/7p/8/1P4P1/P1PPPP1P/1NKRRQNB w ec - 1 9", 3, 31790 }, + { "b1rkr1nb/pppppqp1/n4B2/7p/8/1P4P1/P1PPPP1P/1NKRRQNB w ec - 1 9", 4, 930926 }, + { "b1rkr1nb/pppppqp1/n4B2/7p/8/1P4P1/P1PPPP1P/1NKRRQNB w ec - 1 9", 5, 30392925 }, + { "b1rkr1nb/pppppqp1/n4B2/7p/8/1P4P1/P1PPPP1P/1NKRRQNB w ec - 1 9", 6, 952871799 }, + { "nbbrkrqn/p1ppp1p1/8/1p3p1p/2P3PP/8/PP1PPPQ1/NBBRKR1N w FDfd - 0 9", 1, 34 }, + { "nbbrkrqn/p1ppp1p1/8/1p3p1p/2P3PP/8/PP1PPPQ1/NBBRKR1N w FDfd - 0 9", 2, 938 }, + { "nbbrkrqn/p1ppp1p1/8/1p3p1p/2P3PP/8/PP1PPPQ1/NBBRKR1N w FDfd - 0 9", 3, 31848 }, + { "nbbrkrqn/p1ppp1p1/8/1p3p1p/2P3PP/8/PP1PPPQ1/NBBRKR1N w FDfd - 0 9", 4, 921716 }, + { "nbbrkrqn/p1ppp1p1/8/1p3p1p/2P3PP/8/PP1PPPQ1/NBBRKR1N w FDfd - 0 9", 5, 31185844 }, + { "nbbrkrqn/p1ppp1p1/8/1p3p1p/2P3PP/8/PP1PPPQ1/NBBRKR1N w FDfd - 0 9", 6, 944483246 }, + { "1rbbkrqn/ppp1pp2/1n1p2p1/7p/P3P1P1/3P4/1PP2P1P/NRBBKRQN w FBfb - 0 9", 1, 26 }, + { "1rbbkrqn/ppp1pp2/1n1p2p1/7p/P3P1P1/3P4/1PP2P1P/NRBBKRQN w FBfb - 0 9", 2, 646 }, + { "1rbbkrqn/ppp1pp2/1n1p2p1/7p/P3P1P1/3P4/1PP2P1P/NRBBKRQN w FBfb - 0 9", 3, 18083 }, + { "1rbbkrqn/ppp1pp2/1n1p2p1/7p/P3P1P1/3P4/1PP2P1P/NRBBKRQN w FBfb - 0 9", 4, 472744 }, + { "1rbbkrqn/ppp1pp2/1n1p2p1/7p/P3P1P1/3P4/1PP2P1P/NRBBKRQN w FBfb - 0 9", 5, 14006203 }, + { "1rbbkrqn/ppp1pp2/1n1p2p1/7p/P3P1P1/3P4/1PP2P1P/NRBBKRQN w FBfb - 0 9", 6, 384101783 }, + { "nrbkrbq1/Qpppp1pp/2n5/5p2/P4P2/6N1/1PPPP1PP/NRBKRB2 w EBeb - 1 9", 1, 27 }, + { "nrbkrbq1/Qpppp1pp/2n5/5p2/P4P2/6N1/1PPPP1PP/NRBKRB2 w EBeb - 1 9", 2, 619 }, + { "nrbkrbq1/Qpppp1pp/2n5/5p2/P4P2/6N1/1PPPP1PP/NRBKRB2 w EBeb - 1 9", 3, 16713 }, + { "nrbkrbq1/Qpppp1pp/2n5/5p2/P4P2/6N1/1PPPP1PP/NRBKRB2 w EBeb - 1 9", 4, 421845 }, + { "nrbkrbq1/Qpppp1pp/2n5/5p2/P4P2/6N1/1PPPP1PP/NRBKRB2 w EBeb - 1 9", 5, 11718463 }, + { "nrbkrbq1/Qpppp1pp/2n5/5p2/P4P2/6N1/1PPPP1PP/NRBKRB2 w EBeb - 1 9", 6, 313794027 }, + { "1rbkr1nb/pppp1qpp/1n6/4pp2/1PP1P3/8/PB1P1PPP/NR1KRQNB w EBeb - 1 9", 1, 32 }, + { "1rbkr1nb/pppp1qpp/1n6/4pp2/1PP1P3/8/PB1P1PPP/NR1KRQNB w EBeb - 1 9", 2, 1029 }, + { "1rbkr1nb/pppp1qpp/1n6/4pp2/1PP1P3/8/PB1P1PPP/NR1KRQNB w EBeb - 1 9", 3, 32970 }, + { "1rbkr1nb/pppp1qpp/1n6/4pp2/1PP1P3/8/PB1P1PPP/NR1KRQNB w EBeb - 1 9", 4, 1080977 }, + { "1rbkr1nb/pppp1qpp/1n6/4pp2/1PP1P3/8/PB1P1PPP/NR1KRQNB w EBeb - 1 9", 5, 35483796 }, + { "1rbkr1nb/pppp1qpp/1n6/4pp2/1PP1P3/8/PB1P1PPP/NR1KRQNB w EBeb - 1 9", 6, 1181835398 }, + { "nbrk1rqn/p1ppp2p/1p6/5ppb/8/1N2P2P/PPPP1PP1/1BKRBRQN w fc - 0 9", 1, 18 }, + { "nbrk1rqn/p1ppp2p/1p6/5ppb/8/1N2P2P/PPPP1PP1/1BKRBRQN w fc - 0 9", 2, 594 }, + { "nbrk1rqn/p1ppp2p/1p6/5ppb/8/1N2P2P/PPPP1PP1/1BKRBRQN w fc - 0 9", 3, 12350 }, + { "nbrk1rqn/p1ppp2p/1p6/5ppb/8/1N2P2P/PPPP1PP1/1BKRBRQN w fc - 0 9", 4, 408544 }, + { "nbrk1rqn/p1ppp2p/1p6/5ppb/8/1N2P2P/PPPP1PP1/1BKRBRQN w fc - 0 9", 5, 9329122 }, + { "nbrk1rqn/p1ppp2p/1p6/5ppb/8/1N2P2P/PPPP1PP1/1BKRBRQN w fc - 0 9", 6, 315021712 }, + { "nrkbbrqn/3pppp1/7p/ppp5/P7/1N5P/1PPPPPP1/1RKBBRQN w FBfb - 0 9", 1, 19 }, + { "nrkbbrqn/3pppp1/7p/ppp5/P7/1N5P/1PPPPPP1/1RKBBRQN w FBfb - 0 9", 2, 417 }, + { "nrkbbrqn/3pppp1/7p/ppp5/P7/1N5P/1PPPPPP1/1RKBBRQN w FBfb - 0 9", 3, 9026 }, + { "nrkbbrqn/3pppp1/7p/ppp5/P7/1N5P/1PPPPPP1/1RKBBRQN w FBfb - 0 9", 4, 218513 }, + { "nrkbbrqn/3pppp1/7p/ppp5/P7/1N5P/1PPPPPP1/1RKBBRQN w FBfb - 0 9", 5, 5236331 }, + { "nrkbbrqn/3pppp1/7p/ppp5/P7/1N5P/1PPPPPP1/1RKBBRQN w FBfb - 0 9", 6, 137024458 }, + { "nrkr1bqn/ppp1pppp/3p4/1b6/7P/P7/1PPPPPP1/NRKRBBQN w DBdb - 1 9", 1, 17 }, + { "nrkr1bqn/ppp1pppp/3p4/1b6/7P/P7/1PPPPPP1/NRKRBBQN w DBdb - 1 9", 2, 457 }, + { "nrkr1bqn/ppp1pppp/3p4/1b6/7P/P7/1PPPPPP1/NRKRBBQN w DBdb - 1 9", 3, 9083 }, + { "nrkr1bqn/ppp1pppp/3p4/1b6/7P/P7/1PPPPPP1/NRKRBBQN w DBdb - 1 9", 4, 243872 }, + { "nrkr1bqn/ppp1pppp/3p4/1b6/7P/P7/1PPPPPP1/NRKRBBQN w DBdb - 1 9", 5, 5503579 }, + { "nrkr1bqn/ppp1pppp/3p4/1b6/7P/P7/1PPPPPP1/NRKRBBQN w DBdb - 1 9", 6, 150091997 }, + { "nrkrbqnb/p4ppp/1p2p3/2pp4/6P1/2P2N2/PPNPPP1P/1RKRBQ1B w DBdb - 0 9", 1, 27 }, + { "nrkrbqnb/p4ppp/1p2p3/2pp4/6P1/2P2N2/PPNPPP1P/1RKRBQ1B w DBdb - 0 9", 2, 755 }, + { "nrkrbqnb/p4ppp/1p2p3/2pp4/6P1/2P2N2/PPNPPP1P/1RKRBQ1B w DBdb - 0 9", 3, 21012 }, + { "nrkrbqnb/p4ppp/1p2p3/2pp4/6P1/2P2N2/PPNPPP1P/1RKRBQ1B w DBdb - 0 9", 4, 620093 }, + { "nrkrbqnb/p4ppp/1p2p3/2pp4/6P1/2P2N2/PPNPPP1P/1RKRBQ1B w DBdb - 0 9", 5, 17883987 }, + { "nrkrbqnb/p4ppp/1p2p3/2pp4/6P1/2P2N2/PPNPPP1P/1RKRBQ1B w DBdb - 0 9", 6, 547233320 }, + { "nbkrr1bn/ppB2ppp/4p3/2qp4/4P3/5P2/PPPP2PP/NBRKRQ1N w EC - 1 9", 1, 37 }, + { "nbkrr1bn/ppB2ppp/4p3/2qp4/4P3/5P2/PPPP2PP/NBRKRQ1N w EC - 1 9", 2, 1473 }, + { "nbkrr1bn/ppB2ppp/4p3/2qp4/4P3/5P2/PPPP2PP/NBRKRQ1N w EC - 1 9", 3, 51939 }, + { "nbkrr1bn/ppB2ppp/4p3/2qp4/4P3/5P2/PPPP2PP/NBRKRQ1N w EC - 1 9", 4, 1956521 }, + { "nbkrr1bn/ppB2ppp/4p3/2qp4/4P3/5P2/PPPP2PP/NBRKRQ1N w EC - 1 9", 5, 68070015 }, + { "nbkrr1bn/ppB2ppp/4p3/2qp4/4P3/5P2/PPPP2PP/NBRKRQ1N w EC - 1 9", 6, 2490912491 }, + { "n1kbrqbn/p1pp1pp1/4p2p/2B5/1r3P2/8/PPPPP1PP/NRKBRQ1N w EBe - 2 9", 1, 30 }, + { "n1kbrqbn/p1pp1pp1/4p2p/2B5/1r3P2/8/PPPPP1PP/NRKBRQ1N w EBe - 2 9", 2, 1029 }, + { "n1kbrqbn/p1pp1pp1/4p2p/2B5/1r3P2/8/PPPPP1PP/NRKBRQ1N w EBe - 2 9", 3, 30874 }, + { "n1kbrqbn/p1pp1pp1/4p2p/2B5/1r3P2/8/PPPPP1PP/NRKBRQ1N w EBe - 2 9", 4, 1053163 }, + { "n1kbrqbn/p1pp1pp1/4p2p/2B5/1r3P2/8/PPPPP1PP/NRKBRQ1N w EBe - 2 9", 5, 32318550 }, + { "n1kbrqbn/p1pp1pp1/4p2p/2B5/1r3P2/8/PPPPP1PP/NRKBRQ1N w EBe - 2 9", 6, 1106487743 }, + { "nrkrqbbn/2pppp1p/8/pp6/1P1P2p1/P5P1/2P1PP1P/NRKRQBBN w DBdb - 0 9", 1, 22 }, + { "nrkrqbbn/2pppp1p/8/pp6/1P1P2p1/P5P1/2P1PP1P/NRKRQBBN w DBdb - 0 9", 2, 421 }, + { "nrkrqbbn/2pppp1p/8/pp6/1P1P2p1/P5P1/2P1PP1P/NRKRQBBN w DBdb - 0 9", 3, 10034 }, + { "nrkrqbbn/2pppp1p/8/pp6/1P1P2p1/P5P1/2P1PP1P/NRKRQBBN w DBdb - 0 9", 4, 221927 }, + { "nrkrqbbn/2pppp1p/8/pp6/1P1P2p1/P5P1/2P1PP1P/NRKRQBBN w DBdb - 0 9", 5, 5754555 }, + { "nrkrqbbn/2pppp1p/8/pp6/1P1P2p1/P5P1/2P1PP1P/NRKRQBBN w DBdb - 0 9", 6, 141245633 }, + { "nrkr1nbb/1ppp2pp/p3q3/4pp2/2P5/P3P3/1PKP1PPP/NR1RQNBB w db - 0 9", 1, 22 }, + { "nrkr1nbb/1ppp2pp/p3q3/4pp2/2P5/P3P3/1PKP1PPP/NR1RQNBB w db - 0 9", 2, 619 }, + { "nrkr1nbb/1ppp2pp/p3q3/4pp2/2P5/P3P3/1PKP1PPP/NR1RQNBB w db - 0 9", 3, 13953 }, + { "nrkr1nbb/1ppp2pp/p3q3/4pp2/2P5/P3P3/1PKP1PPP/NR1RQNBB w db - 0 9", 4, 411392 }, + { "nrkr1nbb/1ppp2pp/p3q3/4pp2/2P5/P3P3/1PKP1PPP/NR1RQNBB w db - 0 9", 5, 9905109 }, + { "nrkr1nbb/1ppp2pp/p3q3/4pp2/2P5/P3P3/1PKP1PPP/NR1RQNBB w db - 0 9", 6, 301403003 }, + { "bbnrkrnq/1pp1p2p/6p1/p2p1p2/8/1P2P3/P1PP1PPP/BBNRKRNQ w FDfd - 0 9", 1, 27 }, + { "bbnrkrnq/1pp1p2p/6p1/p2p1p2/8/1P2P3/P1PP1PPP/BBNRKRNQ w FDfd - 0 9", 2, 805 }, + { "bbnrkrnq/1pp1p2p/6p1/p2p1p2/8/1P2P3/P1PP1PPP/BBNRKRNQ w FDfd - 0 9", 3, 21915 }, + { "bbnrkrnq/1pp1p2p/6p1/p2p1p2/8/1P2P3/P1PP1PPP/BBNRKRNQ w FDfd - 0 9", 4, 688224 }, + { "bbnrkrnq/1pp1p2p/6p1/p2p1p2/8/1P2P3/P1PP1PPP/BBNRKRNQ w FDfd - 0 9", 5, 19133881 }, + { "bbnrkrnq/1pp1p2p/6p1/p2p1p2/8/1P2P3/P1PP1PPP/BBNRKRNQ w FDfd - 0 9", 6, 620749189 }, + { "bnrbkrn1/pp1ppp2/2p3pp/8/2Pq4/P4PP1/1P1PP2P/BNRBKRNQ w FCfc - 1 9", 1, 20 }, + { "bnrbkrn1/pp1ppp2/2p3pp/8/2Pq4/P4PP1/1P1PP2P/BNRBKRNQ w FCfc - 1 9", 2, 770 }, + { "bnrbkrn1/pp1ppp2/2p3pp/8/2Pq4/P4PP1/1P1PP2P/BNRBKRNQ w FCfc - 1 9", 3, 16593 }, + { "bnrbkrn1/pp1ppp2/2p3pp/8/2Pq4/P4PP1/1P1PP2P/BNRBKRNQ w FCfc - 1 9", 4, 577980 }, + { "bnrbkrn1/pp1ppp2/2p3pp/8/2Pq4/P4PP1/1P1PP2P/BNRBKRNQ w FCfc - 1 9", 5, 13581691 }, + { "bnrbkrn1/pp1ppp2/2p3pp/8/2Pq4/P4PP1/1P1PP2P/BNRBKRNQ w FCfc - 1 9", 6, 456736500 }, + { "b1rkrbnq/1pp1pppp/2np4/p5N1/8/1P2P3/P1PP1PPP/BNRKRB1Q w ECec - 0 9", 1, 37 }, + { "b1rkrbnq/1pp1pppp/2np4/p5N1/8/1P2P3/P1PP1PPP/BNRKRB1Q w ECec - 0 9", 2, 740 }, + { "b1rkrbnq/1pp1pppp/2np4/p5N1/8/1P2P3/P1PP1PPP/BNRKRB1Q w ECec - 0 9", 3, 27073 }, + { "b1rkrbnq/1pp1pppp/2np4/p5N1/8/1P2P3/P1PP1PPP/BNRKRB1Q w ECec - 0 9", 4, 581744 }, + { "b1rkrbnq/1pp1pppp/2np4/p5N1/8/1P2P3/P1PP1PPP/BNRKRB1Q w ECec - 0 9", 5, 21156664 }, + { "b1rkrbnq/1pp1pppp/2np4/p5N1/8/1P2P3/P1PP1PPP/BNRKRB1Q w ECec - 0 9", 6, 485803600 }, + { "b1krrnqb/pp1ppp1p/n1p3p1/2N5/6P1/8/PPPPPP1P/B1RKRNQB w EC - 0 9", 1, 34 }, + { "b1krrnqb/pp1ppp1p/n1p3p1/2N5/6P1/8/PPPPPP1P/B1RKRNQB w EC - 0 9", 2, 850 }, + { "b1krrnqb/pp1ppp1p/n1p3p1/2N5/6P1/8/PPPPPP1P/B1RKRNQB w EC - 0 9", 3, 28494 }, + { "b1krrnqb/pp1ppp1p/n1p3p1/2N5/6P1/8/PPPPPP1P/B1RKRNQB w EC - 0 9", 4, 752350 }, + { "b1krrnqb/pp1ppp1p/n1p3p1/2N5/6P1/8/PPPPPP1P/B1RKRNQB w EC - 0 9", 5, 25360295 }, + { "b1krrnqb/pp1ppp1p/n1p3p1/2N5/6P1/8/PPPPPP1P/B1RKRNQB w EC - 0 9", 6, 698159474 }, + { "1bbr1rnq/ppppkppp/8/3np3/4P3/3P4/PPP1KPPP/NBBRR1NQ w - - 1 9", 1, 27 }, + { "1bbr1rnq/ppppkppp/8/3np3/4P3/3P4/PPP1KPPP/NBBRR1NQ w - - 1 9", 2, 704 }, + { "1bbr1rnq/ppppkppp/8/3np3/4P3/3P4/PPP1KPPP/NBBRR1NQ w - - 1 9", 3, 18290 }, + { "1bbr1rnq/ppppkppp/8/3np3/4P3/3P4/PPP1KPPP/NBBRR1NQ w - - 1 9", 4, 480474 }, + { "1bbr1rnq/ppppkppp/8/3np3/4P3/3P4/PPP1KPPP/NBBRR1NQ w - - 1 9", 5, 12817011 }, + { "1bbr1rnq/ppppkppp/8/3np3/4P3/3P4/PPP1KPPP/NBBRR1NQ w - - 1 9", 6, 341026662 }, + { "nrbbk1nq/p1p1prpp/1p6/N2p1p2/P7/8/1PPPPPPP/R1BBKRNQ w Fb - 2 9", 1, 23 }, + { "nrbbk1nq/p1p1prpp/1p6/N2p1p2/P7/8/1PPPPPPP/R1BBKRNQ w Fb - 2 9", 2, 552 }, + { "nrbbk1nq/p1p1prpp/1p6/N2p1p2/P7/8/1PPPPPPP/R1BBKRNQ w Fb - 2 9", 3, 13710 }, + { "nrbbk1nq/p1p1prpp/1p6/N2p1p2/P7/8/1PPPPPPP/R1BBKRNQ w Fb - 2 9", 4, 348593 }, + { "nrbbk1nq/p1p1prpp/1p6/N2p1p2/P7/8/1PPPPPPP/R1BBKRNQ w Fb - 2 9", 5, 9236564 }, + { "nrbbk1nq/p1p1prpp/1p6/N2p1p2/P7/8/1PPPPPPP/R1BBKRNQ w Fb - 2 9", 6, 248469879 }, + { "1rbkrb1q/1pppp1pp/1n5n/p4p2/P3P3/1P6/2PPNPPP/NRBKRB1Q w EBeb - 1 9", 1, 22 }, + { "1rbkrb1q/1pppp1pp/1n5n/p4p2/P3P3/1P6/2PPNPPP/NRBKRB1Q w EBeb - 1 9", 2, 415 }, + { "1rbkrb1q/1pppp1pp/1n5n/p4p2/P3P3/1P6/2PPNPPP/NRBKRB1Q w EBeb - 1 9", 3, 10198 }, + { "1rbkrb1q/1pppp1pp/1n5n/p4p2/P3P3/1P6/2PPNPPP/NRBKRB1Q w EBeb - 1 9", 4, 217224 }, + { "1rbkrb1q/1pppp1pp/1n5n/p4p2/P3P3/1P6/2PPNPPP/NRBKRB1Q w EBeb - 1 9", 5, 5735644 }, + { "1rbkrb1q/1pppp1pp/1n5n/p4p2/P3P3/1P6/2PPNPPP/NRBKRB1Q w EBeb - 1 9", 6, 135295774 }, + { "nrbkr1qb/1pp1pppp/6n1/p2p4/2P1P3/1N4N1/PP1P1PPP/1RBKR1QB w EBeb - 0 9", 1, 27 }, + { "nrbkr1qb/1pp1pppp/6n1/p2p4/2P1P3/1N4N1/PP1P1PPP/1RBKR1QB w EBeb - 0 9", 2, 709 }, + { "nrbkr1qb/1pp1pppp/6n1/p2p4/2P1P3/1N4N1/PP1P1PPP/1RBKR1QB w EBeb - 0 9", 3, 19126 }, + { "nrbkr1qb/1pp1pppp/6n1/p2p4/2P1P3/1N4N1/PP1P1PPP/1RBKR1QB w EBeb - 0 9", 4, 506214 }, + { "nrbkr1qb/1pp1pppp/6n1/p2p4/2P1P3/1N4N1/PP1P1PPP/1RBKR1QB w EBeb - 0 9", 5, 14192779 }, + { "nrbkr1qb/1pp1pppp/6n1/p2p4/2P1P3/1N4N1/PP1P1PPP/1RBKR1QB w EBeb - 0 9", 6, 380516508 }, + { "nbrkbrnq/p3p1pp/1pp2p2/3p4/1PP5/4P3/P1KP1PPP/NBR1BRNQ w fc - 0 9", 1, 24 }, + { "nbrkbrnq/p3p1pp/1pp2p2/3p4/1PP5/4P3/P1KP1PPP/NBR1BRNQ w fc - 0 9", 2, 715 }, + { "nbrkbrnq/p3p1pp/1pp2p2/3p4/1PP5/4P3/P1KP1PPP/NBR1BRNQ w fc - 0 9", 3, 18009 }, + { "nbrkbrnq/p3p1pp/1pp2p2/3p4/1PP5/4P3/P1KP1PPP/NBR1BRNQ w fc - 0 9", 4, 535054 }, + { "nbrkbrnq/p3p1pp/1pp2p2/3p4/1PP5/4P3/P1KP1PPP/NBR1BRNQ w fc - 0 9", 5, 14322279 }, + { "nbrkbrnq/p3p1pp/1pp2p2/3p4/1PP5/4P3/P1KP1PPP/NBR1BRNQ w fc - 0 9", 6, 427269976 }, + { "nrk1brnq/pp1p1pp1/7p/b1p1p3/1P6/6P1/P1PPPPQP/NRKBBRN1 w FBfb - 2 9", 1, 29 }, + { "nrk1brnq/pp1p1pp1/7p/b1p1p3/1P6/6P1/P1PPPPQP/NRKBBRN1 w FBfb - 2 9", 2, 675 }, + { "nrk1brnq/pp1p1pp1/7p/b1p1p3/1P6/6P1/P1PPPPQP/NRKBBRN1 w FBfb - 2 9", 3, 20352 }, + { "nrk1brnq/pp1p1pp1/7p/b1p1p3/1P6/6P1/P1PPPPQP/NRKBBRN1 w FBfb - 2 9", 4, 492124 }, + { "nrk1brnq/pp1p1pp1/7p/b1p1p3/1P6/6P1/P1PPPPQP/NRKBBRN1 w FBfb - 2 9", 5, 15316285 }, + { "nrk1brnq/pp1p1pp1/7p/b1p1p3/1P6/6P1/P1PPPPQP/NRKBBRN1 w FBfb - 2 9", 6, 389051744 }, + { "nrkr1bnq/1p2pppp/p2p4/1bp5/PP6/1R5N/2PPPPPP/N1KRBB1Q w Ddb - 2 9", 1, 27 }, + { "nrkr1bnq/1p2pppp/p2p4/1bp5/PP6/1R5N/2PPPPPP/N1KRBB1Q w Ddb - 2 9", 2, 744 }, + { "nrkr1bnq/1p2pppp/p2p4/1bp5/PP6/1R5N/2PPPPPP/N1KRBB1Q w Ddb - 2 9", 3, 20494 }, + { "nrkr1bnq/1p2pppp/p2p4/1bp5/PP6/1R5N/2PPPPPP/N1KRBB1Q w Ddb - 2 9", 4, 571209 }, + { "nrkr1bnq/1p2pppp/p2p4/1bp5/PP6/1R5N/2PPPPPP/N1KRBB1Q w Ddb - 2 9", 5, 16188945 }, + { "nrkr1bnq/1p2pppp/p2p4/1bp5/PP6/1R5N/2PPPPPP/N1KRBB1Q w Ddb - 2 9", 6, 458900901 }, + { "nrk1b1qb/pppn1ppp/3rp3/3p4/2P3P1/3P4/PPN1PP1P/1RKRBNQB w DBb - 3 9", 1, 35 }, + { "nrk1b1qb/pppn1ppp/3rp3/3p4/2P3P1/3P4/PPN1PP1P/1RKRBNQB w DBb - 3 9", 2, 941 }, + { "nrk1b1qb/pppn1ppp/3rp3/3p4/2P3P1/3P4/PPN1PP1P/1RKRBNQB w DBb - 3 9", 3, 33203 }, + { "nrk1b1qb/pppn1ppp/3rp3/3p4/2P3P1/3P4/PPN1PP1P/1RKRBNQB w DBb - 3 9", 4, 935791 }, + { "nrk1b1qb/pppn1ppp/3rp3/3p4/2P3P1/3P4/PPN1PP1P/1RKRBNQB w DBb - 3 9", 5, 33150360 }, + { "nrk1b1qb/pppn1ppp/3rp3/3p4/2P3P1/3P4/PPN1PP1P/1RKRBNQB w DBb - 3 9", 6, 968024386 }, + { "nb1rrnbq/ppkp1ppp/8/2p1p3/P7/1N2P3/1PPP1PPP/1BKRRNBQ w - - 1 9", 1, 19 }, + { "nb1rrnbq/ppkp1ppp/8/2p1p3/P7/1N2P3/1PPP1PPP/1BKRRNBQ w - - 1 9", 2, 451 }, + { "nb1rrnbq/ppkp1ppp/8/2p1p3/P7/1N2P3/1PPP1PPP/1BKRRNBQ w - - 1 9", 3, 9655 }, + { "nb1rrnbq/ppkp1ppp/8/2p1p3/P7/1N2P3/1PPP1PPP/1BKRRNBQ w - - 1 9", 4, 235472 }, + { "nb1rrnbq/ppkp1ppp/8/2p1p3/P7/1N2P3/1PPP1PPP/1BKRRNBQ w - - 1 9", 5, 5506897 }, + { "nb1rrnbq/ppkp1ppp/8/2p1p3/P7/1N2P3/1PPP1PPP/1BKRRNBQ w - - 1 9", 6, 139436165 }, + { "nrkbrnbq/4pppp/1ppp4/p7/2P1P3/3P2N1/PP3PPP/NRKBR1BQ w EBeb - 0 9", 1, 29 }, + { "nrkbrnbq/4pppp/1ppp4/p7/2P1P3/3P2N1/PP3PPP/NRKBR1BQ w EBeb - 0 9", 2, 591 }, + { "nrkbrnbq/4pppp/1ppp4/p7/2P1P3/3P2N1/PP3PPP/NRKBR1BQ w EBeb - 0 9", 3, 17132 }, + { "nrkbrnbq/4pppp/1ppp4/p7/2P1P3/3P2N1/PP3PPP/NRKBR1BQ w EBeb - 0 9", 4, 384358 }, + { "nrkbrnbq/4pppp/1ppp4/p7/2P1P3/3P2N1/PP3PPP/NRKBR1BQ w EBeb - 0 9", 5, 11245508 }, + { "nrkbrnbq/4pppp/1ppp4/p7/2P1P3/3P2N1/PP3PPP/NRKBR1BQ w EBeb - 0 9", 6, 270967202 }, + { "nrkrnbbq/3p1ppp/1p6/p1p1p3/3P2P1/P4Q2/1PP1PP1P/NRKRNBB1 w DBdb - 0 9", 1, 38 }, + { "nrkrnbbq/3p1ppp/1p6/p1p1p3/3P2P1/P4Q2/1PP1PP1P/NRKRNBB1 w DBdb - 0 9", 2, 792 }, + { "nrkrnbbq/3p1ppp/1p6/p1p1p3/3P2P1/P4Q2/1PP1PP1P/NRKRNBB1 w DBdb - 0 9", 3, 28597 }, + { "nrkrnbbq/3p1ppp/1p6/p1p1p3/3P2P1/P4Q2/1PP1PP1P/NRKRNBB1 w DBdb - 0 9", 4, 640961 }, + { "nrkrnbbq/3p1ppp/1p6/p1p1p3/3P2P1/P4Q2/1PP1PP1P/NRKRNBB1 w DBdb - 0 9", 5, 22654797 }, + { "nrkrnbbq/3p1ppp/1p6/p1p1p3/3P2P1/P4Q2/1PP1PP1P/NRKRNBB1 w DBdb - 0 9", 6, 540864616 }, + { "nr1rnqbb/ppp1pp1p/3k2p1/3p4/1P5P/3P1N2/P1P1PPP1/NRKR1QBB w DB - 1 9", 1, 25 }, + { "nr1rnqbb/ppp1pp1p/3k2p1/3p4/1P5P/3P1N2/P1P1PPP1/NRKR1QBB w DB - 1 9", 2, 758 }, + { "nr1rnqbb/ppp1pp1p/3k2p1/3p4/1P5P/3P1N2/P1P1PPP1/NRKR1QBB w DB - 1 9", 3, 18547 }, + { "nr1rnqbb/ppp1pp1p/3k2p1/3p4/1P5P/3P1N2/P1P1PPP1/NRKR1QBB w DB - 1 9", 4, 543643 }, + { "nr1rnqbb/ppp1pp1p/3k2p1/3p4/1P5P/3P1N2/P1P1PPP1/NRKR1QBB w DB - 1 9", 5, 13890077 }, + { "nr1rnqbb/ppp1pp1p/3k2p1/3p4/1P5P/3P1N2/P1P1PPP1/NRKR1QBB w DB - 1 9", 6, 402109399 }, + { "bbqrnnkr/1ppp1p1p/5p2/p5p1/P7/1P4P1/2PPPP1P/1BQRNNKR w HDhd - 0 9", 1, 20 }, + { "bbqrnnkr/1ppp1p1p/5p2/p5p1/P7/1P4P1/2PPPP1P/1BQRNNKR w HDhd - 0 9", 2, 322 }, + { "bbqrnnkr/1ppp1p1p/5p2/p5p1/P7/1P4P1/2PPPP1P/1BQRNNKR w HDhd - 0 9", 3, 7224 }, + { "bbqrnnkr/1ppp1p1p/5p2/p5p1/P7/1P4P1/2PPPP1P/1BQRNNKR w HDhd - 0 9", 4, 145818 }, + { "bbqrnnkr/1ppp1p1p/5p2/p5p1/P7/1P4P1/2PPPP1P/1BQRNNKR w HDhd - 0 9", 5, 3588435 }, + { "bbqrnnkr/1ppp1p1p/5p2/p5p1/P7/1P4P1/2PPPP1P/1BQRNNKR w HDhd - 0 9", 6, 82754650 }, + { "bqrb2k1/pppppppr/5nnp/8/3P1P2/4P1N1/PPP3PP/BQRBN1KR w HCc - 1 9", 1, 25 }, + { "bqrb2k1/pppppppr/5nnp/8/3P1P2/4P1N1/PPP3PP/BQRBN1KR w HCc - 1 9", 2, 597 }, + { "bqrb2k1/pppppppr/5nnp/8/3P1P2/4P1N1/PPP3PP/BQRBN1KR w HCc - 1 9", 3, 15872 }, + { "bqrb2k1/pppppppr/5nnp/8/3P1P2/4P1N1/PPP3PP/BQRBN1KR w HCc - 1 9", 4, 397970 }, + { "bqrb2k1/pppppppr/5nnp/8/3P1P2/4P1N1/PPP3PP/BQRBN1KR w HCc - 1 9", 5, 11162476 }, + { "bqrb2k1/pppppppr/5nnp/8/3P1P2/4P1N1/PPP3PP/BQRBN1KR w HCc - 1 9", 6, 295682250 }, + { "bqrnn1kr/1pppbppp/8/4p3/1p6/2P1N2P/P2PPPP1/BQR1NBKR w HChc - 1 9", 1, 34 }, + { "bqrnn1kr/1pppbppp/8/4p3/1p6/2P1N2P/P2PPPP1/BQR1NBKR w HChc - 1 9", 2, 921 }, + { "bqrnn1kr/1pppbppp/8/4p3/1p6/2P1N2P/P2PPPP1/BQR1NBKR w HChc - 1 9", 3, 31695 }, + { "bqrnn1kr/1pppbppp/8/4p3/1p6/2P1N2P/P2PPPP1/BQR1NBKR w HChc - 1 9", 4, 864023 }, + { "bqrnn1kr/1pppbppp/8/4p3/1p6/2P1N2P/P2PPPP1/BQR1NBKR w HChc - 1 9", 5, 30126510 }, + { "bqrnn1kr/1pppbppp/8/4p3/1p6/2P1N2P/P2PPPP1/BQR1NBKR w HChc - 1 9", 6, 850296236 }, + { "bqr1nkr1/pppppp2/2n3p1/7p/1P1b1P2/8/PQP1P1PP/B1RNNKRB w GCgc - 0 9", 1, 23 }, + { "bqr1nkr1/pppppp2/2n3p1/7p/1P1b1P2/8/PQP1P1PP/B1RNNKRB w GCgc - 0 9", 2, 788 }, + { "bqr1nkr1/pppppp2/2n3p1/7p/1P1b1P2/8/PQP1P1PP/B1RNNKRB w GCgc - 0 9", 3, 21539 }, + { "bqr1nkr1/pppppp2/2n3p1/7p/1P1b1P2/8/PQP1P1PP/B1RNNKRB w GCgc - 0 9", 4, 686795 }, + { "bqr1nkr1/pppppp2/2n3p1/7p/1P1b1P2/8/PQP1P1PP/B1RNNKRB w GCgc - 0 9", 5, 20849374 }, + { "bqr1nkr1/pppppp2/2n3p1/7p/1P1b1P2/8/PQP1P1PP/B1RNNKRB w GCgc - 0 9", 6, 645694580 }, + { "qbbrnn1r/1pppp1pk/p7/5p1p/P2P3P/3N4/1PP1PPP1/QBBR1NKR w HD - 0 9", 1, 34 }, + { "qbbrnn1r/1pppp1pk/p7/5p1p/P2P3P/3N4/1PP1PPP1/QBBR1NKR w HD - 0 9", 2, 713 }, + { "qbbrnn1r/1pppp1pk/p7/5p1p/P2P3P/3N4/1PP1PPP1/QBBR1NKR w HD - 0 9", 3, 24475 }, + { "qbbrnn1r/1pppp1pk/p7/5p1p/P2P3P/3N4/1PP1PPP1/QBBR1NKR w HD - 0 9", 4, 562189 }, + { "qbbrnn1r/1pppp1pk/p7/5p1p/P2P3P/3N4/1PP1PPP1/QBBR1NKR w HD - 0 9", 5, 19494094 }, + { "qbbrnn1r/1pppp1pk/p7/5p1p/P2P3P/3N4/1PP1PPP1/QBBR1NKR w HD - 0 9", 6, 482645160 }, + { "qrbb2kr/p1pppppp/1p1n4/8/1P3n2/P7/Q1PPP1PP/1RBBNNKR w HBhb - 0 9", 1, 28 }, + { "qrbb2kr/p1pppppp/1p1n4/8/1P3n2/P7/Q1PPP1PP/1RBBNNKR w HBhb - 0 9", 2, 977 }, + { "qrbb2kr/p1pppppp/1p1n4/8/1P3n2/P7/Q1PPP1PP/1RBBNNKR w HBhb - 0 9", 3, 26955 }, + { "qrbb2kr/p1pppppp/1p1n4/8/1P3n2/P7/Q1PPP1PP/1RBBNNKR w HBhb - 0 9", 4, 949925 }, + { "qrbb2kr/p1pppppp/1p1n4/8/1P3n2/P7/Q1PPP1PP/1RBBNNKR w HBhb - 0 9", 5, 27802999 }, + { "qrbb2kr/p1pppppp/1p1n4/8/1P3n2/P7/Q1PPP1PP/1RBBNNKR w HBhb - 0 9", 6, 992109168 }, + { "qrb2bkr/1pp1pppp/2np1n2/pN6/3P4/4B3/PPP1PPPP/QR2NBKR w HBhb - 0 9", 1, 27 }, + { "qrb2bkr/1pp1pppp/2np1n2/pN6/3P4/4B3/PPP1PPPP/QR2NBKR w HBhb - 0 9", 2, 730 }, + { "qrb2bkr/1pp1pppp/2np1n2/pN6/3P4/4B3/PPP1PPPP/QR2NBKR w HBhb - 0 9", 3, 20534 }, + { "qrb2bkr/1pp1pppp/2np1n2/pN6/3P4/4B3/PPP1PPPP/QR2NBKR w HBhb - 0 9", 4, 585091 }, + { "qrb2bkr/1pp1pppp/2np1n2/pN6/3P4/4B3/PPP1PPPP/QR2NBKR w HBhb - 0 9", 5, 17005916 }, + { "qrb2bkr/1pp1pppp/2np1n2/pN6/3P4/4B3/PPP1PPPP/QR2NBKR w HBhb - 0 9", 6, 507008968 }, + { "qrbnnkrb/pp2pp1p/8/2pp2p1/7P/P1P5/QP1PPPP1/1RBNNKRB w GBgb - 0 9", 1, 24 }, + { "qrbnnkrb/pp2pp1p/8/2pp2p1/7P/P1P5/QP1PPPP1/1RBNNKRB w GBgb - 0 9", 2, 813 }, + { "qrbnnkrb/pp2pp1p/8/2pp2p1/7P/P1P5/QP1PPPP1/1RBNNKRB w GBgb - 0 9", 3, 21142 }, + { "qrbnnkrb/pp2pp1p/8/2pp2p1/7P/P1P5/QP1PPPP1/1RBNNKRB w GBgb - 0 9", 4, 707925 }, + { "qrbnnkrb/pp2pp1p/8/2pp2p1/7P/P1P5/QP1PPPP1/1RBNNKRB w GBgb - 0 9", 5, 19615756 }, + { "qrbnnkrb/pp2pp1p/8/2pp2p1/7P/P1P5/QP1PPPP1/1RBNNKRB w GBgb - 0 9", 6, 655850285 }, + { "1brnb1kr/p1pppppp/1p6/8/4q2n/1P2P1P1/PNPP1P1P/QBR1BNKR w HChc - 3 9", 1, 17 }, + { "1brnb1kr/p1pppppp/1p6/8/4q2n/1P2P1P1/PNPP1P1P/QBR1BNKR w HChc - 3 9", 2, 734 }, + { "1brnb1kr/p1pppppp/1p6/8/4q2n/1P2P1P1/PNPP1P1P/QBR1BNKR w HChc - 3 9", 3, 13462 }, + { "1brnb1kr/p1pppppp/1p6/8/4q2n/1P2P1P1/PNPP1P1P/QBR1BNKR w HChc - 3 9", 4, 530809 }, + { "1brnb1kr/p1pppppp/1p6/8/4q2n/1P2P1P1/PNPP1P1P/QBR1BNKR w HChc - 3 9", 5, 11032633 }, + { "1brnb1kr/p1pppppp/1p6/8/4q2n/1P2P1P1/PNPP1P1P/QBR1BNKR w HChc - 3 9", 6, 416356876 }, + { "1rnbbnkr/1pp1pppp/1q1p4/p7/4P3/5PN1/PPPP1BPP/QRNB2KR w HBhb - 1 9", 1, 26 }, + { "1rnbbnkr/1pp1pppp/1q1p4/p7/4P3/5PN1/PPPP1BPP/QRNB2KR w HBhb - 1 9", 2, 809 }, + { "1rnbbnkr/1pp1pppp/1q1p4/p7/4P3/5PN1/PPPP1BPP/QRNB2KR w HBhb - 1 9", 3, 21764 }, + { "1rnbbnkr/1pp1pppp/1q1p4/p7/4P3/5PN1/PPPP1BPP/QRNB2KR w HBhb - 1 9", 4, 706677 }, + { "1rnbbnkr/1pp1pppp/1q1p4/p7/4P3/5PN1/PPPP1BPP/QRNB2KR w HBhb - 1 9", 5, 20292750 }, + { "1rnbbnkr/1pp1pppp/1q1p4/p7/4P3/5PN1/PPPP1BPP/QRNB2KR w HBhb - 1 9", 6, 675408811 }, + { "qrnnbb1Q/ppp1pk1p/3p2p1/5p2/PP6/5P2/2PPP1PP/1RNNBBKR w HB - 0 9", 1, 37 }, + { "qrnnbb1Q/ppp1pk1p/3p2p1/5p2/PP6/5P2/2PPP1PP/1RNNBBKR w HB - 0 9", 2, 751 }, + { "qrnnbb1Q/ppp1pk1p/3p2p1/5p2/PP6/5P2/2PPP1PP/1RNNBBKR w HB - 0 9", 3, 27902 }, + { "qrnnbb1Q/ppp1pk1p/3p2p1/5p2/PP6/5P2/2PPP1PP/1RNNBBKR w HB - 0 9", 4, 603931 }, + { "qrnnbb1Q/ppp1pk1p/3p2p1/5p2/PP6/5P2/2PPP1PP/1RNNBBKR w HB - 0 9", 5, 22443036 }, + { "qrnnbb1Q/ppp1pk1p/3p2p1/5p2/PP6/5P2/2PPP1PP/1RNNBBKR w HB - 0 9", 6, 515122176 }, + { "qrnnbkrb/p3p1pp/3p1p2/1pp5/PP2P3/8/2PP1PPP/QRNNBRKB w gb - 0 9", 1, 30 }, + { "qrnnbkrb/p3p1pp/3p1p2/1pp5/PP2P3/8/2PP1PPP/QRNNBRKB w gb - 0 9", 2, 906 }, + { "qrnnbkrb/p3p1pp/3p1p2/1pp5/PP2P3/8/2PP1PPP/QRNNBRKB w gb - 0 9", 3, 27955 }, + { "qrnnbkrb/p3p1pp/3p1p2/1pp5/PP2P3/8/2PP1PPP/QRNNBRKB w gb - 0 9", 4, 872526 }, + { "qrnnbkrb/p3p1pp/3p1p2/1pp5/PP2P3/8/2PP1PPP/QRNNBRKB w gb - 0 9", 5, 27658191 }, + { "qrnnbkrb/p3p1pp/3p1p2/1pp5/PP2P3/8/2PP1PPP/QRNNBRKB w gb - 0 9", 6, 890966633 }, + { "qbrnnkbr/1p2pp1p/p1p3p1/3p4/6P1/P1N4P/1PPPPP2/QBR1NKBR w HChc - 0 9", 1, 26 }, + { "qbrnnkbr/1p2pp1p/p1p3p1/3p4/6P1/P1N4P/1PPPPP2/QBR1NKBR w HChc - 0 9", 2, 701 }, + { "qbrnnkbr/1p2pp1p/p1p3p1/3p4/6P1/P1N4P/1PPPPP2/QBR1NKBR w HChc - 0 9", 3, 18930 }, + { "qbrnnkbr/1p2pp1p/p1p3p1/3p4/6P1/P1N4P/1PPPPP2/QBR1NKBR w HChc - 0 9", 4, 521377 }, + { "qbrnnkbr/1p2pp1p/p1p3p1/3p4/6P1/P1N4P/1PPPPP2/QBR1NKBR w HChc - 0 9", 5, 14733245 }, + { "qbrnnkbr/1p2pp1p/p1p3p1/3p4/6P1/P1N4P/1PPPPP2/QBR1NKBR w HChc - 0 9", 6, 416881799 }, + { "qr1b1kbr/1p1ppppp/1n1n4/p1p5/4P3/5NPP/PPPP1P2/QRNB1KBR w HBhb - 1 9", 1, 26 }, + { "qr1b1kbr/1p1ppppp/1n1n4/p1p5/4P3/5NPP/PPPP1P2/QRNB1KBR w HBhb - 1 9", 2, 649 }, + { "qr1b1kbr/1p1ppppp/1n1n4/p1p5/4P3/5NPP/PPPP1P2/QRNB1KBR w HBhb - 1 9", 3, 17235 }, + { "qr1b1kbr/1p1ppppp/1n1n4/p1p5/4P3/5NPP/PPPP1P2/QRNB1KBR w HBhb - 1 9", 4, 451997 }, + { "qr1b1kbr/1p1ppppp/1n1n4/p1p5/4P3/5NPP/PPPP1P2/QRNB1KBR w HBhb - 1 9", 5, 12367604 }, + { "qr1b1kbr/1p1ppppp/1n1n4/p1p5/4P3/5NPP/PPPP1P2/QRNB1KBR w HBhb - 1 9", 6, 342165821 }, + { "qrnnkb1r/1pppppp1/7p/p4b2/4P3/5P1P/PPPP2PR/QRNNKBB1 w Bhb - 1 9", 1, 34 }, + { "qrnnkb1r/1pppppp1/7p/p4b2/4P3/5P1P/PPPP2PR/QRNNKBB1 w Bhb - 1 9", 2, 941 }, + { "qrnnkb1r/1pppppp1/7p/p4b2/4P3/5P1P/PPPP2PR/QRNNKBB1 w Bhb - 1 9", 3, 31720 }, + { "qrnnkb1r/1pppppp1/7p/p4b2/4P3/5P1P/PPPP2PR/QRNNKBB1 w Bhb - 1 9", 4, 901240 }, + { "qrnnkb1r/1pppppp1/7p/p4b2/4P3/5P1P/PPPP2PR/QRNNKBB1 w Bhb - 1 9", 5, 30307554 }, + { "qrnnkb1r/1pppppp1/7p/p4b2/4P3/5P1P/PPPP2PR/QRNNKBB1 w Bhb - 1 9", 6, 888709821 }, + { "qr1nkrbb/p2ppppp/1pp5/8/3Pn3/1NP3P1/PP2PP1P/QR1NKRBB w FBfb - 1 9", 1, 19 }, + { "qr1nkrbb/p2ppppp/1pp5/8/3Pn3/1NP3P1/PP2PP1P/QR1NKRBB w FBfb - 1 9", 2, 505 }, + { "qr1nkrbb/p2ppppp/1pp5/8/3Pn3/1NP3P1/PP2PP1P/QR1NKRBB w FBfb - 1 9", 3, 11107 }, + { "qr1nkrbb/p2ppppp/1pp5/8/3Pn3/1NP3P1/PP2PP1P/QR1NKRBB w FBfb - 1 9", 4, 294251 }, + { "qr1nkrbb/p2ppppp/1pp5/8/3Pn3/1NP3P1/PP2PP1P/QR1NKRBB w FBfb - 1 9", 5, 7046501 }, + { "qr1nkrbb/p2ppppp/1pp5/8/3Pn3/1NP3P1/PP2PP1P/QR1NKRBB w FBfb - 1 9", 6, 190414579 }, + { "bbrqn1kr/1pppp1pp/4n3/5p2/p5P1/3P4/PPP1PPKP/BBRQNN1R w hc - 0 9", 1, 24 }, + { "bbrqn1kr/1pppp1pp/4n3/5p2/p5P1/3P4/PPP1PPKP/BBRQNN1R w hc - 0 9", 2, 573 }, + { "bbrqn1kr/1pppp1pp/4n3/5p2/p5P1/3P4/PPP1PPKP/BBRQNN1R w hc - 0 9", 3, 12963 }, + { "bbrqn1kr/1pppp1pp/4n3/5p2/p5P1/3P4/PPP1PPKP/BBRQNN1R w hc - 0 9", 4, 335845 }, + { "bbrqn1kr/1pppp1pp/4n3/5p2/p5P1/3P4/PPP1PPKP/BBRQNN1R w hc - 0 9", 5, 8191054 }, + { "bbrqn1kr/1pppp1pp/4n3/5p2/p5P1/3P4/PPP1PPKP/BBRQNN1R w hc - 0 9", 6, 227555387 }, + { "brqb1nkr/pppppp1p/8/4N1pn/5P2/6P1/PPPPP2P/BRQB1NKR w HBhb - 0 9", 1, 26 }, + { "brqb1nkr/pppppp1p/8/4N1pn/5P2/6P1/PPPPP2P/BRQB1NKR w HBhb - 0 9", 2, 550 }, + { "brqb1nkr/pppppp1p/8/4N1pn/5P2/6P1/PPPPP2P/BRQB1NKR w HBhb - 0 9", 3, 14338 }, + { "brqb1nkr/pppppp1p/8/4N1pn/5P2/6P1/PPPPP2P/BRQB1NKR w HBhb - 0 9", 4, 331666 }, + { "brqb1nkr/pppppp1p/8/4N1pn/5P2/6P1/PPPPP2P/BRQB1NKR w HBhb - 0 9", 5, 8903754 }, + { "brqb1nkr/pppppp1p/8/4N1pn/5P2/6P1/PPPPP2P/BRQB1NKR w HBhb - 0 9", 6, 223437427 }, + { "brqnn1kr/pp3ppp/2pbp3/3p4/8/2NPP3/PPP1BPPP/BRQ1N1KR w HBhb - 0 9", 1, 27 }, + { "brqnn1kr/pp3ppp/2pbp3/3p4/8/2NPP3/PPP1BPPP/BRQ1N1KR w HBhb - 0 9", 2, 780 }, + { "brqnn1kr/pp3ppp/2pbp3/3p4/8/2NPP3/PPP1BPPP/BRQ1N1KR w HBhb - 0 9", 3, 20760 }, + { "brqnn1kr/pp3ppp/2pbp3/3p4/8/2NPP3/PPP1BPPP/BRQ1N1KR w HBhb - 0 9", 4, 589328 }, + { "brqnn1kr/pp3ppp/2pbp3/3p4/8/2NPP3/PPP1BPPP/BRQ1N1KR w HBhb - 0 9", 5, 16243731 }, + { "brqnn1kr/pp3ppp/2pbp3/3p4/8/2NPP3/PPP1BPPP/BRQ1N1KR w HBhb - 0 9", 6, 463883447 }, + { "brq1nkrb/ppp2ppp/8/n2pp2P/P7/4P3/1PPP1PP1/BRQNNKRB w GBgb - 1 9", 1, 17 }, + { "brq1nkrb/ppp2ppp/8/n2pp2P/P7/4P3/1PPP1PP1/BRQNNKRB w GBgb - 1 9", 2, 426 }, + { "brq1nkrb/ppp2ppp/8/n2pp2P/P7/4P3/1PPP1PP1/BRQNNKRB w GBgb - 1 9", 3, 8295 }, + { "brq1nkrb/ppp2ppp/8/n2pp2P/P7/4P3/1PPP1PP1/BRQNNKRB w GBgb - 1 9", 4, 235162 }, + { "brq1nkrb/ppp2ppp/8/n2pp2P/P7/4P3/1PPP1PP1/BRQNNKRB w GBgb - 1 9", 5, 5048497 }, + { "brq1nkrb/ppp2ppp/8/n2pp2P/P7/4P3/1PPP1PP1/BRQNNKRB w GBgb - 1 9", 6, 153986034 }, + { "rbbqn1kr/pp2p1pp/6n1/2pp1p2/2P4P/P7/BP1PPPP1/R1BQNNKR w HAha - 0 9", 1, 27 }, + { "rbbqn1kr/pp2p1pp/6n1/2pp1p2/2P4P/P7/BP1PPPP1/R1BQNNKR w HAha - 0 9", 2, 916 }, + { "rbbqn1kr/pp2p1pp/6n1/2pp1p2/2P4P/P7/BP1PPPP1/R1BQNNKR w HAha - 0 9", 3, 25798 }, + { "rbbqn1kr/pp2p1pp/6n1/2pp1p2/2P4P/P7/BP1PPPP1/R1BQNNKR w HAha - 0 9", 4, 890435 }, + { "rbbqn1kr/pp2p1pp/6n1/2pp1p2/2P4P/P7/BP1PPPP1/R1BQNNKR w HAha - 0 9", 5, 26302461 }, + { "rbbqn1kr/pp2p1pp/6n1/2pp1p2/2P4P/P7/BP1PPPP1/R1BQNNKR w HAha - 0 9", 6, 924181432 }, + { "1qbbn1kr/1ppppppp/r3n3/8/p1P5/P7/1P1PPPPP/RQBBNNKR w HAh - 1 9", 1, 29 }, + { "1qbbn1kr/1ppppppp/r3n3/8/p1P5/P7/1P1PPPPP/RQBBNNKR w HAh - 1 9", 2, 817 }, + { "1qbbn1kr/1ppppppp/r3n3/8/p1P5/P7/1P1PPPPP/RQBBNNKR w HAh - 1 9", 3, 24530 }, + { "1qbbn1kr/1ppppppp/r3n3/8/p1P5/P7/1P1PPPPP/RQBBNNKR w HAh - 1 9", 4, 720277 }, + { "1qbbn1kr/1ppppppp/r3n3/8/p1P5/P7/1P1PPPPP/RQBBNNKR w HAh - 1 9", 5, 22147642 }, + { "1qbbn1kr/1ppppppp/r3n3/8/p1P5/P7/1P1PPPPP/RQBBNNKR w HAh - 1 9", 6, 670707652 }, + { "rqbnnbkr/ppp1ppp1/7p/3p4/PP6/7P/1NPPPPP1/RQB1NBKR w HAa - 1 9", 1, 23 }, + { "rqbnnbkr/ppp1ppp1/7p/3p4/PP6/7P/1NPPPPP1/RQB1NBKR w HAa - 1 9", 2, 572 }, + { "rqbnnbkr/ppp1ppp1/7p/3p4/PP6/7P/1NPPPPP1/RQB1NBKR w HAa - 1 9", 3, 14509 }, + { "rqbnnbkr/ppp1ppp1/7p/3p4/PP6/7P/1NPPPPP1/RQB1NBKR w HAa - 1 9", 4, 381474 }, + { "rqbnnbkr/ppp1ppp1/7p/3p4/PP6/7P/1NPPPPP1/RQB1NBKR w HAa - 1 9", 5, 10416981 }, + { "rqbnnbkr/ppp1ppp1/7p/3p4/PP6/7P/1NPPPPP1/RQB1NBKR w HAa - 1 9", 6, 288064942 }, + { "r1bnnkrb/q1ppp1pp/p7/1p3pB1/2P1P3/3P4/PP3PPP/RQ1NNKRB w GAga - 2 9", 1, 31 }, + { "r1bnnkrb/q1ppp1pp/p7/1p3pB1/2P1P3/3P4/PP3PPP/RQ1NNKRB w GAga - 2 9", 2, 925 }, + { "r1bnnkrb/q1ppp1pp/p7/1p3pB1/2P1P3/3P4/PP3PPP/RQ1NNKRB w GAga - 2 9", 3, 27776 }, + { "r1bnnkrb/q1ppp1pp/p7/1p3pB1/2P1P3/3P4/PP3PPP/RQ1NNKRB w GAga - 2 9", 4, 860969 }, + { "r1bnnkrb/q1ppp1pp/p7/1p3pB1/2P1P3/3P4/PP3PPP/RQ1NNKRB w GAga - 2 9", 5, 26316355 }, + { "r1bnnkrb/q1ppp1pp/p7/1p3pB1/2P1P3/3P4/PP3PPP/RQ1NNKRB w GAga - 2 9", 6, 843078864 }, + { "rbqnb1kr/ppppp1pp/5p2/5N2/7P/1n3P2/PPPPP1P1/RBQNB1KR w HAha - 1 9", 1, 32 }, + { "rbqnb1kr/ppppp1pp/5p2/5N2/7P/1n3P2/PPPPP1P1/RBQNB1KR w HAha - 1 9", 2, 864 }, + { "rbqnb1kr/ppppp1pp/5p2/5N2/7P/1n3P2/PPPPP1P1/RBQNB1KR w HAha - 1 9", 3, 27633 }, + { "rbqnb1kr/ppppp1pp/5p2/5N2/7P/1n3P2/PPPPP1P1/RBQNB1KR w HAha - 1 9", 4, 766551 }, + { "rbqnb1kr/ppppp1pp/5p2/5N2/7P/1n3P2/PPPPP1P1/RBQNB1KR w HAha - 1 9", 5, 24738875 }, + { "rbqnb1kr/ppppp1pp/5p2/5N2/7P/1n3P2/PPPPP1P1/RBQNB1KR w HAha - 1 9", 6, 707188107 }, + { "rqnbbn1r/ppppppp1/6k1/8/6Pp/2PN4/PP1PPPKP/RQ1BBN1R w - - 0 9", 1, 27 }, + { "rqnbbn1r/ppppppp1/6k1/8/6Pp/2PN4/PP1PPPKP/RQ1BBN1R w - - 0 9", 2, 566 }, + { "rqnbbn1r/ppppppp1/6k1/8/6Pp/2PN4/PP1PPPKP/RQ1BBN1R w - - 0 9", 3, 15367 }, + { "rqnbbn1r/ppppppp1/6k1/8/6Pp/2PN4/PP1PPPKP/RQ1BBN1R w - - 0 9", 4, 347059 }, + { "rqnbbn1r/ppppppp1/6k1/8/6Pp/2PN4/PP1PPPKP/RQ1BBN1R w - - 0 9", 5, 9714509 }, + { "rqnbbn1r/ppppppp1/6k1/8/6Pp/2PN4/PP1PPPKP/RQ1BBN1R w - - 0 9", 6, 234622128 }, + { "rqnnbbkr/p1p2pp1/1p1p3p/4p3/4NP2/6P1/PPPPP2P/RQN1BBKR w HAha - 0 9", 1, 27 }, + { "rqnnbbkr/p1p2pp1/1p1p3p/4p3/4NP2/6P1/PPPPP2P/RQN1BBKR w HAha - 0 9", 2, 631 }, + { "rqnnbbkr/p1p2pp1/1p1p3p/4p3/4NP2/6P1/PPPPP2P/RQN1BBKR w HAha - 0 9", 3, 17923 }, + { "rqnnbbkr/p1p2pp1/1p1p3p/4p3/4NP2/6P1/PPPPP2P/RQN1BBKR w HAha - 0 9", 4, 452734 }, + { "rqnnbbkr/p1p2pp1/1p1p3p/4p3/4NP2/6P1/PPPPP2P/RQN1BBKR w HAha - 0 9", 5, 13307890 }, + { "rqnnbbkr/p1p2pp1/1p1p3p/4p3/4NP2/6P1/PPPPP2P/RQN1BBKR w HAha - 0 9", 6, 356279813 }, + { "1qnnbrkb/rppp1ppp/p3p3/8/4P3/2PP1P2/PP4PP/RQNNBKRB w GA - 1 9", 1, 24 }, + { "1qnnbrkb/rppp1ppp/p3p3/8/4P3/2PP1P2/PP4PP/RQNNBKRB w GA - 1 9", 2, 479 }, + { "1qnnbrkb/rppp1ppp/p3p3/8/4P3/2PP1P2/PP4PP/RQNNBKRB w GA - 1 9", 3, 12135 }, + { "1qnnbrkb/rppp1ppp/p3p3/8/4P3/2PP1P2/PP4PP/RQNNBKRB w GA - 1 9", 4, 271469 }, + { "1qnnbrkb/rppp1ppp/p3p3/8/4P3/2PP1P2/PP4PP/RQNNBKRB w GA - 1 9", 5, 7204345 }, + { "1qnnbrkb/rppp1ppp/p3p3/8/4P3/2PP1P2/PP4PP/RQNNBKRB w GA - 1 9", 6, 175460841 }, + { "rbqnn1br/p1pppk1p/1p4p1/5p2/8/P1P2P2/1PBPP1PP/R1QNNKBR w HA - 0 9", 1, 31 }, + { "rbqnn1br/p1pppk1p/1p4p1/5p2/8/P1P2P2/1PBPP1PP/R1QNNKBR w HA - 0 9", 2, 756 }, + { "rbqnn1br/p1pppk1p/1p4p1/5p2/8/P1P2P2/1PBPP1PP/R1QNNKBR w HA - 0 9", 3, 23877 }, + { "rbqnn1br/p1pppk1p/1p4p1/5p2/8/P1P2P2/1PBPP1PP/R1QNNKBR w HA - 0 9", 4, 625194 }, + { "rbqnn1br/p1pppk1p/1p4p1/5p2/8/P1P2P2/1PBPP1PP/R1QNNKBR w HA - 0 9", 5, 20036784 }, + { "rbqnn1br/p1pppk1p/1p4p1/5p2/8/P1P2P2/1PBPP1PP/R1QNNKBR w HA - 0 9", 6, 554292502 }, + { "rqnbnkbr/1ppppp2/p5p1/8/1P4p1/4PP2/P1PP3P/RQNBNKBR w HAha - 0 9", 1, 24 }, + { "rqnbnkbr/1ppppp2/p5p1/8/1P4p1/4PP2/P1PP3P/RQNBNKBR w HAha - 0 9", 2, 715 }, + { "rqnbnkbr/1ppppp2/p5p1/8/1P4p1/4PP2/P1PP3P/RQNBNKBR w HAha - 0 9", 3, 18536 }, + { "rqnbnkbr/1ppppp2/p5p1/8/1P4p1/4PP2/P1PP3P/RQNBNKBR w HAha - 0 9", 4, 575589 }, + { "rqnbnkbr/1ppppp2/p5p1/8/1P4p1/4PP2/P1PP3P/RQNBNKBR w HAha - 0 9", 5, 16013189 }, + { "rqnbnkbr/1ppppp2/p5p1/8/1P4p1/4PP2/P1PP3P/RQNBNKBR w HAha - 0 9", 6, 515078271 }, + { "rq1nkbbr/1p2pppp/p2n4/2pp4/1P4P1/P2N4/2PPPP1P/RQ1NKBBR w HAha - 1 9", 1, 27 }, + { "rq1nkbbr/1p2pppp/p2n4/2pp4/1P4P1/P2N4/2PPPP1P/RQ1NKBBR w HAha - 1 9", 2, 694 }, + { "rq1nkbbr/1p2pppp/p2n4/2pp4/1P4P1/P2N4/2PPPP1P/RQ1NKBBR w HAha - 1 9", 3, 19840 }, + { "rq1nkbbr/1p2pppp/p2n4/2pp4/1P4P1/P2N4/2PPPP1P/RQ1NKBBR w HAha - 1 9", 4, 552904 }, + { "rq1nkbbr/1p2pppp/p2n4/2pp4/1P4P1/P2N4/2PPPP1P/RQ1NKBBR w HAha - 1 9", 5, 16685687 }, + { "rq1nkbbr/1p2pppp/p2n4/2pp4/1P4P1/P2N4/2PPPP1P/RQ1NKBBR w HAha - 1 9", 6, 494574415 }, + { "r1nnkrbb/pp1pppp1/2p3q1/7p/8/1PPP3P/P3PPP1/RQNNKRBB w FAfa - 1 9", 1, 18 }, + { "r1nnkrbb/pp1pppp1/2p3q1/7p/8/1PPP3P/P3PPP1/RQNNKRBB w FAfa - 1 9", 2, 520 }, + { "r1nnkrbb/pp1pppp1/2p3q1/7p/8/1PPP3P/P3PPP1/RQNNKRBB w FAfa - 1 9", 3, 10808 }, + { "r1nnkrbb/pp1pppp1/2p3q1/7p/8/1PPP3P/P3PPP1/RQNNKRBB w FAfa - 1 9", 4, 329085 }, + { "r1nnkrbb/pp1pppp1/2p3q1/7p/8/1PPP3P/P3PPP1/RQNNKRBB w FAfa - 1 9", 5, 7508201 }, + { "r1nnkrbb/pp1pppp1/2p3q1/7p/8/1PPP3P/P3PPP1/RQNNKRBB w FAfa - 1 9", 6, 235103697 }, + { "bbrnqk1r/pppp3p/6p1/4pp2/3P2P1/8/PPP1PP1P/BBRN1NKR w HC - 0 9", 1, 22 }, + { "bbrnqk1r/pppp3p/6p1/4pp2/3P2P1/8/PPP1PP1P/BBRN1NKR w HC - 0 9", 2, 566 }, + { "bbrnqk1r/pppp3p/6p1/4pp2/3P2P1/8/PPP1PP1P/BBRN1NKR w HC - 0 9", 3, 12965 }, + { "bbrnqk1r/pppp3p/6p1/4pp2/3P2P1/8/PPP1PP1P/BBRN1NKR w HC - 0 9", 4, 362624 }, + { "bbrnqk1r/pppp3p/6p1/4pp2/3P2P1/8/PPP1PP1P/BBRN1NKR w HC - 0 9", 5, 8721079 }, + { "bbrnqk1r/pppp3p/6p1/4pp2/3P2P1/8/PPP1PP1P/BBRN1NKR w HC - 0 9", 6, 259069471 }, + { "brnb1nkr/pppqpp2/3p2pp/8/3PP3/1P6/PBP2PPP/1RNBQNKR w HBhb - 0 9", 1, 32 }, + { "brnb1nkr/pppqpp2/3p2pp/8/3PP3/1P6/PBP2PPP/1RNBQNKR w HBhb - 0 9", 2, 859 }, + { "brnb1nkr/pppqpp2/3p2pp/8/3PP3/1P6/PBP2PPP/1RNBQNKR w HBhb - 0 9", 3, 28517 }, + { "brnb1nkr/pppqpp2/3p2pp/8/3PP3/1P6/PBP2PPP/1RNBQNKR w HBhb - 0 9", 4, 817464 }, + { "brnb1nkr/pppqpp2/3p2pp/8/3PP3/1P6/PBP2PPP/1RNBQNKR w HBhb - 0 9", 5, 27734108 }, + { "brnb1nkr/pppqpp2/3p2pp/8/3PP3/1P6/PBP2PPP/1RNBQNKR w HBhb - 0 9", 6, 829785474 }, + { "brnq1b1r/ppp1ppkp/3p1np1/8/8/5P1P/PPPPPKPR/BRNQNB2 w - - 0 9", 1, 21 }, + { "brnq1b1r/ppp1ppkp/3p1np1/8/8/5P1P/PPPPPKPR/BRNQNB2 w - - 0 9", 2, 511 }, + { "brnq1b1r/ppp1ppkp/3p1np1/8/8/5P1P/PPPPPKPR/BRNQNB2 w - - 0 9", 3, 10951 }, + { "brnq1b1r/ppp1ppkp/3p1np1/8/8/5P1P/PPPPPKPR/BRNQNB2 w - - 0 9", 4, 273756 }, + { "brnq1b1r/ppp1ppkp/3p1np1/8/8/5P1P/PPPPPKPR/BRNQNB2 w - - 0 9", 5, 6372681 }, + { "brnq1b1r/ppp1ppkp/3p1np1/8/8/5P1P/PPPPPKPR/BRNQNB2 w - - 0 9", 6, 167139732 }, + { "brnq1rkb/1pppppp1/3n3p/p7/8/P4NP1/1PPPPPRP/BRNQ1K1B w B - 0 9", 1, 25 }, + { "brnq1rkb/1pppppp1/3n3p/p7/8/P4NP1/1PPPPPRP/BRNQ1K1B w B - 0 9", 2, 548 }, + { "brnq1rkb/1pppppp1/3n3p/p7/8/P4NP1/1PPPPPRP/BRNQ1K1B w B - 0 9", 3, 14049 }, + { "brnq1rkb/1pppppp1/3n3p/p7/8/P4NP1/1PPPPPRP/BRNQ1K1B w B - 0 9", 4, 341208 }, + { "brnq1rkb/1pppppp1/3n3p/p7/8/P4NP1/1PPPPPRP/BRNQ1K1B w B - 0 9", 5, 9015901 }, + { "brnq1rkb/1pppppp1/3n3p/p7/8/P4NP1/1PPPPPRP/BRNQ1K1B w B - 0 9", 6, 235249649 }, + { "rbb1qnkr/p1ppp1pp/1p3p2/6n1/8/1PN1P2P/P1PP1PP1/RBB1QNKR w HAha - 0 9", 1, 25 }, + { "rbb1qnkr/p1ppp1pp/1p3p2/6n1/8/1PN1P2P/P1PP1PP1/RBB1QNKR w HAha - 0 9", 2, 673 }, + { "rbb1qnkr/p1ppp1pp/1p3p2/6n1/8/1PN1P2P/P1PP1PP1/RBB1QNKR w HAha - 0 9", 3, 16412 }, + { "rbb1qnkr/p1ppp1pp/1p3p2/6n1/8/1PN1P2P/P1PP1PP1/RBB1QNKR w HAha - 0 9", 4, 467660 }, + { "rbb1qnkr/p1ppp1pp/1p3p2/6n1/8/1PN1P2P/P1PP1PP1/RBB1QNKR w HAha - 0 9", 5, 12099119 }, + { "rbb1qnkr/p1ppp1pp/1p3p2/6n1/8/1PN1P2P/P1PP1PP1/RBB1QNKR w HAha - 0 9", 6, 361714466 }, + { "rnbb1nkr/1ppp1ppp/4p3/p5q1/6P1/1PP5/PB1PPP1P/RN1BQNKR w HAha - 1 9", 1, 19 }, + { "rnbb1nkr/1ppp1ppp/4p3/p5q1/6P1/1PP5/PB1PPP1P/RN1BQNKR w HAha - 1 9", 2, 663 }, + { "rnbb1nkr/1ppp1ppp/4p3/p5q1/6P1/1PP5/PB1PPP1P/RN1BQNKR w HAha - 1 9", 3, 14149 }, + { "rnbb1nkr/1ppp1ppp/4p3/p5q1/6P1/1PP5/PB1PPP1P/RN1BQNKR w HAha - 1 9", 4, 489653 }, + { "rnbb1nkr/1ppp1ppp/4p3/p5q1/6P1/1PP5/PB1PPP1P/RN1BQNKR w HAha - 1 9", 5, 11491355 }, + { "rnbb1nkr/1ppp1ppp/4p3/p5q1/6P1/1PP5/PB1PPP1P/RN1BQNKR w HAha - 1 9", 6, 399135495 }, + { "rnbqnbkr/1pp1p2p/3p1p2/p5p1/5PP1/2P5/PPNPP2P/RNBQ1BKR w HAha - 0 9", 1, 24 }, + { "rnbqnbkr/1pp1p2p/3p1p2/p5p1/5PP1/2P5/PPNPP2P/RNBQ1BKR w HAha - 0 9", 2, 647 }, + { "rnbqnbkr/1pp1p2p/3p1p2/p5p1/5PP1/2P5/PPNPP2P/RNBQ1BKR w HAha - 0 9", 3, 16679 }, + { "rnbqnbkr/1pp1p2p/3p1p2/p5p1/5PP1/2P5/PPNPP2P/RNBQ1BKR w HAha - 0 9", 4, 461931 }, + { "rnbqnbkr/1pp1p2p/3p1p2/p5p1/5PP1/2P5/PPNPP2P/RNBQ1BKR w HAha - 0 9", 5, 12649636 }, + { "rnbqnbkr/1pp1p2p/3p1p2/p5p1/5PP1/2P5/PPNPP2P/RNBQ1BKR w HAha - 0 9", 6, 361157611 }, + { "rnb2krb/pppqppnp/8/3p2p1/1P4P1/7P/P1PPPPB1/RNBQNKR1 w GAga - 1 9", 1, 24 }, + { "rnb2krb/pppqppnp/8/3p2p1/1P4P1/7P/P1PPPPB1/RNBQNKR1 w GAga - 1 9", 2, 722 }, + { "rnb2krb/pppqppnp/8/3p2p1/1P4P1/7P/P1PPPPB1/RNBQNKR1 w GAga - 1 9", 3, 18749 }, + { "rnb2krb/pppqppnp/8/3p2p1/1P4P1/7P/P1PPPPB1/RNBQNKR1 w GAga - 1 9", 4, 605229 }, + { "rnb2krb/pppqppnp/8/3p2p1/1P4P1/7P/P1PPPPB1/RNBQNKR1 w GAga - 1 9", 5, 16609220 }, + { "rnb2krb/pppqppnp/8/3p2p1/1P4P1/7P/P1PPPPB1/RNBQNKR1 w GAga - 1 9", 6, 563558512 }, + { "rbnqb1kr/pppn1pp1/3p3p/4p3/1P6/P7/R1PPPPPP/1BNQBNKR w Hha - 1 9", 1, 20 }, + { "rbnqb1kr/pppn1pp1/3p3p/4p3/1P6/P7/R1PPPPPP/1BNQBNKR w Hha - 1 9", 2, 538 }, + { "rbnqb1kr/pppn1pp1/3p3p/4p3/1P6/P7/R1PPPPPP/1BNQBNKR w Hha - 1 9", 3, 12277 }, + { "rbnqb1kr/pppn1pp1/3p3p/4p3/1P6/P7/R1PPPPPP/1BNQBNKR w Hha - 1 9", 4, 345704 }, + { "rbnqb1kr/pppn1pp1/3p3p/4p3/1P6/P7/R1PPPPPP/1BNQBNKR w Hha - 1 9", 5, 8687621 }, + { "rbnqb1kr/pppn1pp1/3p3p/4p3/1P6/P7/R1PPPPPP/1BNQBNKR w Hha - 1 9", 6, 255304141 }, + { "rnqb1nkr/p1pbp1pp/8/1pPp1p2/P2P4/8/1P2PPPP/RNQBBNKR w HAha - 1 9", 1, 35 }, + { "rnqb1nkr/p1pbp1pp/8/1pPp1p2/P2P4/8/1P2PPPP/RNQBBNKR w HAha - 1 9", 2, 764 }, + { "rnqb1nkr/p1pbp1pp/8/1pPp1p2/P2P4/8/1P2PPPP/RNQBBNKR w HAha - 1 9", 3, 26952 }, + { "rnqb1nkr/p1pbp1pp/8/1pPp1p2/P2P4/8/1P2PPPP/RNQBBNKR w HAha - 1 9", 4, 632796 }, + { "rnqb1nkr/p1pbp1pp/8/1pPp1p2/P2P4/8/1P2PPPP/RNQBBNKR w HAha - 1 9", 5, 22592380 }, + { "rnqb1nkr/p1pbp1pp/8/1pPp1p2/P2P4/8/1P2PPPP/RNQBBNKR w HAha - 1 9", 6, 564255328 }, + { "rnq1bbkr/1p1ppp1p/4n3/p1p3p1/P1PP4/8/RP2PPPP/1NQNBBKR w Hha - 0 9", 1, 29 }, + { "rnq1bbkr/1p1ppp1p/4n3/p1p3p1/P1PP4/8/RP2PPPP/1NQNBBKR w Hha - 0 9", 2, 709 }, + { "rnq1bbkr/1p1ppp1p/4n3/p1p3p1/P1PP4/8/RP2PPPP/1NQNBBKR w Hha - 0 9", 3, 21296 }, + { "rnq1bbkr/1p1ppp1p/4n3/p1p3p1/P1PP4/8/RP2PPPP/1NQNBBKR w Hha - 0 9", 4, 570580 }, + { "rnq1bbkr/1p1ppp1p/4n3/p1p3p1/P1PP4/8/RP2PPPP/1NQNBBKR w Hha - 0 9", 5, 17597398 }, + { "rnq1bbkr/1p1ppp1p/4n3/p1p3p1/P1PP4/8/RP2PPPP/1NQNBBKR w Hha - 0 9", 6, 506140370 }, + { "1nqnbkrb/1pppp2p/r7/p4pp1/3P4/8/PPPBPPPP/RNQNK1RB w g - 0 9", 1, 27 }, + { "1nqnbkrb/1pppp2p/r7/p4pp1/3P4/8/PPPBPPPP/RNQNK1RB w g - 0 9", 2, 1028 }, + { "1nqnbkrb/1pppp2p/r7/p4pp1/3P4/8/PPPBPPPP/RNQNK1RB w g - 0 9", 3, 28534 }, + { "1nqnbkrb/1pppp2p/r7/p4pp1/3P4/8/PPPBPPPP/RNQNK1RB w g - 0 9", 4, 1050834 }, + { "1nqnbkrb/1pppp2p/r7/p4pp1/3P4/8/PPPBPPPP/RNQNK1RB w g - 0 9", 5, 30251988 }, + { "1nqnbkrb/1pppp2p/r7/p4pp1/3P4/8/PPPBPPPP/RNQNK1RB w g - 0 9", 6, 1096869832 }, + { "rbnqnkbr/p1pp1p1p/8/1p2p3/3P2pP/2P5/PP2PPP1/RBNQNKBR w HAha - 0 9", 1, 32 }, + { "rbnqnkbr/p1pp1p1p/8/1p2p3/3P2pP/2P5/PP2PPP1/RBNQNKBR w HAha - 0 9", 2, 832 }, + { "rbnqnkbr/p1pp1p1p/8/1p2p3/3P2pP/2P5/PP2PPP1/RBNQNKBR w HAha - 0 9", 3, 27120 }, + { "rbnqnkbr/p1pp1p1p/8/1p2p3/3P2pP/2P5/PP2PPP1/RBNQNKBR w HAha - 0 9", 4, 750336 }, + { "rbnqnkbr/p1pp1p1p/8/1p2p3/3P2pP/2P5/PP2PPP1/RBNQNKBR w HAha - 0 9", 5, 24945574 }, + { "rbnqnkbr/p1pp1p1p/8/1p2p3/3P2pP/2P5/PP2PPP1/RBNQNKBR w HAha - 0 9", 6, 724171581 }, + { "rnq1nkbr/1p1p1ppp/2p1pb2/p7/7P/2P5/PPNPPPPB/RNQB1K1R w HAha - 2 9", 1, 31 }, + { "rnq1nkbr/1p1p1ppp/2p1pb2/p7/7P/2P5/PPNPPPPB/RNQB1K1R w HAha - 2 9", 2, 779 }, + { "rnq1nkbr/1p1p1ppp/2p1pb2/p7/7P/2P5/PPNPPPPB/RNQB1K1R w HAha - 2 9", 3, 24010 }, + { "rnq1nkbr/1p1p1ppp/2p1pb2/p7/7P/2P5/PPNPPPPB/RNQB1K1R w HAha - 2 9", 4, 638640 }, + { "rnq1nkbr/1p1p1ppp/2p1pb2/p7/7P/2P5/PPNPPPPB/RNQB1K1R w HAha - 2 9", 5, 19919434 }, + { "rnq1nkbr/1p1p1ppp/2p1pb2/p7/7P/2P5/PPNPPPPB/RNQB1K1R w HAha - 2 9", 6, 551494771 }, + { "rnqnk1br/p1ppp1bp/1p3p2/6p1/4N3/P5P1/1PPPPP1P/R1QNKBBR w HAha - 2 9", 1, 25 }, + { "rnqnk1br/p1ppp1bp/1p3p2/6p1/4N3/P5P1/1PPPPP1P/R1QNKBBR w HAha - 2 9", 2, 717 }, + { "rnqnk1br/p1ppp1bp/1p3p2/6p1/4N3/P5P1/1PPPPP1P/R1QNKBBR w HAha - 2 9", 3, 19396 }, + { "rnqnk1br/p1ppp1bp/1p3p2/6p1/4N3/P5P1/1PPPPP1P/R1QNKBBR w HAha - 2 9", 4, 576577 }, + { "rnqnk1br/p1ppp1bp/1p3p2/6p1/4N3/P5P1/1PPPPP1P/R1QNKBBR w HAha - 2 9", 5, 16525239 }, + { "rnqnk1br/p1ppp1bp/1p3p2/6p1/4N3/P5P1/1PPPPP1P/R1QNKBBR w HAha - 2 9", 6, 507175842 }, + { "rnq1krbb/p1p1pppp/8/1p1p4/1n5B/2N2P2/PPPPP1PP/RNQ1KR1B w FAfa - 0 9", 1, 28 }, + { "rnq1krbb/p1p1pppp/8/1p1p4/1n5B/2N2P2/PPPPP1PP/RNQ1KR1B w FAfa - 0 9", 2, 867 }, + { "rnq1krbb/p1p1pppp/8/1p1p4/1n5B/2N2P2/PPPPP1PP/RNQ1KR1B w FAfa - 0 9", 3, 24029 }, + { "rnq1krbb/p1p1pppp/8/1p1p4/1n5B/2N2P2/PPPPP1PP/RNQ1KR1B w FAfa - 0 9", 4, 735686 }, + { "rnq1krbb/p1p1pppp/8/1p1p4/1n5B/2N2P2/PPPPP1PP/RNQ1KR1B w FAfa - 0 9", 5, 21112751 }, + { "rnq1krbb/p1p1pppp/8/1p1p4/1n5B/2N2P2/PPPPP1PP/RNQ1KR1B w FAfa - 0 9", 6, 654808184 }, + { "bbrnnqkr/1pp1pppp/3p4/p7/P3P3/7P/1PPP1PP1/BBRNNQKR w HChc - 0 9", 1, 24 }, + { "bbrnnqkr/1pp1pppp/3p4/p7/P3P3/7P/1PPP1PP1/BBRNNQKR w HChc - 0 9", 2, 405 }, + { "bbrnnqkr/1pp1pppp/3p4/p7/P3P3/7P/1PPP1PP1/BBRNNQKR w HChc - 0 9", 3, 11025 }, + { "bbrnnqkr/1pp1pppp/3p4/p7/P3P3/7P/1PPP1PP1/BBRNNQKR w HChc - 0 9", 4, 210557 }, + { "bbrnnqkr/1pp1pppp/3p4/p7/P3P3/7P/1PPP1PP1/BBRNNQKR w HChc - 0 9", 5, 6196438 }, + { "bbrnnqkr/1pp1pppp/3p4/p7/P3P3/7P/1PPP1PP1/BBRNNQKR w HChc - 0 9", 6, 131401224 }, + { "brnbnqkr/p1ppp3/1p5p/5Pp1/5P2/3N4/PPPPP2P/BRNB1QKR w HBhb g6 0 9", 1, 25 }, + { "brnbnqkr/p1ppp3/1p5p/5Pp1/5P2/3N4/PPPPP2P/BRNB1QKR w HBhb g6 0 9", 2, 785 }, + { "brnbnqkr/p1ppp3/1p5p/5Pp1/5P2/3N4/PPPPP2P/BRNB1QKR w HBhb g6 0 9", 3, 21402 }, + { "brnbnqkr/p1ppp3/1p5p/5Pp1/5P2/3N4/PPPPP2P/BRNB1QKR w HBhb g6 0 9", 4, 698331 }, + { "brnbnqkr/p1ppp3/1p5p/5Pp1/5P2/3N4/PPPPP2P/BRNB1QKR w HBhb g6 0 9", 5, 20687969 }, + { "brnbnqkr/p1ppp3/1p5p/5Pp1/5P2/3N4/PPPPP2P/BRNB1QKR w HBhb g6 0 9", 6, 695850727 }, + { "br1nqbkr/1ppppp2/pn6/6pp/2PP4/1N4P1/PP2PP1P/BR1NQBKR w HBhb - 0 9", 1, 25 }, + { "br1nqbkr/1ppppp2/pn6/6pp/2PP4/1N4P1/PP2PP1P/BR1NQBKR w HBhb - 0 9", 2, 596 }, + { "br1nqbkr/1ppppp2/pn6/6pp/2PP4/1N4P1/PP2PP1P/BR1NQBKR w HBhb - 0 9", 3, 16220 }, + { "br1nqbkr/1ppppp2/pn6/6pp/2PP4/1N4P1/PP2PP1P/BR1NQBKR w HBhb - 0 9", 4, 421882 }, + { "br1nqbkr/1ppppp2/pn6/6pp/2PP4/1N4P1/PP2PP1P/BR1NQBKR w HBhb - 0 9", 5, 12185361 }, + { "br1nqbkr/1ppppp2/pn6/6pp/2PP4/1N4P1/PP2PP1P/BR1NQBKR w HBhb - 0 9", 6, 337805606 }, + { "1rnnqkrb/p2ppp1p/1pp5/2N3p1/8/1P6/P1PPPPKP/BR1NQ1RB w gb - 0 9", 1, 38 }, + { "1rnnqkrb/p2ppp1p/1pp5/2N3p1/8/1P6/P1PPPPKP/BR1NQ1RB w gb - 0 9", 2, 960 }, + { "1rnnqkrb/p2ppp1p/1pp5/2N3p1/8/1P6/P1PPPPKP/BR1NQ1RB w gb - 0 9", 3, 34831 }, + { "1rnnqkrb/p2ppp1p/1pp5/2N3p1/8/1P6/P1PPPPKP/BR1NQ1RB w gb - 0 9", 4, 913665 }, + { "1rnnqkrb/p2ppp1p/1pp5/2N3p1/8/1P6/P1PPPPKP/BR1NQ1RB w gb - 0 9", 5, 32490040 }, + { "1rnnqkrb/p2ppp1p/1pp5/2N3p1/8/1P6/P1PPPPKP/BR1NQ1RB w gb - 0 9", 6, 880403591 }, + { "rbbnnqkr/pp3pp1/2p1p3/3p3p/3P3P/1PP5/P3PPP1/RBBNNQKR w HAha - 0 9", 1, 30 }, + { "rbbnnqkr/pp3pp1/2p1p3/3p3p/3P3P/1PP5/P3PPP1/RBBNNQKR w HAha - 0 9", 2, 785 }, + { "rbbnnqkr/pp3pp1/2p1p3/3p3p/3P3P/1PP5/P3PPP1/RBBNNQKR w HAha - 0 9", 3, 23079 }, + { "rbbnnqkr/pp3pp1/2p1p3/3p3p/3P3P/1PP5/P3PPP1/RBBNNQKR w HAha - 0 9", 4, 656618 }, + { "rbbnnqkr/pp3pp1/2p1p3/3p3p/3P3P/1PP5/P3PPP1/RBBNNQKR w HAha - 0 9", 5, 19885037 }, + { "rbbnnqkr/pp3pp1/2p1p3/3p3p/3P3P/1PP5/P3PPP1/RBBNNQKR w HAha - 0 9", 6, 599219582 }, + { "rn1bnqkr/p1ppppp1/8/1p5p/P4P1P/3N4/1PPPP1b1/RNBB1QKR w HAha - 0 9", 1, 27 }, + { "rn1bnqkr/p1ppppp1/8/1p5p/P4P1P/3N4/1PPPP1b1/RNBB1QKR w HAha - 0 9", 2, 752 }, + { "rn1bnqkr/p1ppppp1/8/1p5p/P4P1P/3N4/1PPPP1b1/RNBB1QKR w HAha - 0 9", 3, 21735 }, + { "rn1bnqkr/p1ppppp1/8/1p5p/P4P1P/3N4/1PPPP1b1/RNBB1QKR w HAha - 0 9", 4, 613194 }, + { "rn1bnqkr/p1ppppp1/8/1p5p/P4P1P/3N4/1PPPP1b1/RNBB1QKR w HAha - 0 9", 5, 18862234 }, + { "rn1bnqkr/p1ppppp1/8/1p5p/P4P1P/3N4/1PPPP1b1/RNBB1QKR w HAha - 0 9", 6, 547415271 }, + { "1nbnqbkr/1p1p1ppp/r3p3/p1p5/P3P3/3Q4/1PPP1PPP/RNBN1BKR w HAh - 2 9", 1, 33 }, + { "1nbnqbkr/1p1p1ppp/r3p3/p1p5/P3P3/3Q4/1PPP1PPP/RNBN1BKR w HAh - 2 9", 2, 721 }, + { "1nbnqbkr/1p1p1ppp/r3p3/p1p5/P3P3/3Q4/1PPP1PPP/RNBN1BKR w HAh - 2 9", 3, 24278 }, + { "1nbnqbkr/1p1p1ppp/r3p3/p1p5/P3P3/3Q4/1PPP1PPP/RNBN1BKR w HAh - 2 9", 4, 572535 }, + { "1nbnqbkr/1p1p1ppp/r3p3/p1p5/P3P3/3Q4/1PPP1PPP/RNBN1BKR w HAh - 2 9", 5, 19648535 }, + { "1nbnqbkr/1p1p1ppp/r3p3/p1p5/P3P3/3Q4/1PPP1PPP/RNBN1BKR w HAh - 2 9", 6, 496023732 }, + { "rnbnqkrb/2pppppp/1p6/p7/1PP5/4N2P/P2PPPP1/RNB1QKRB w GAg - 0 9", 1, 23 }, + { "rnbnqkrb/2pppppp/1p6/p7/1PP5/4N2P/P2PPPP1/RNB1QKRB w GAg - 0 9", 2, 570 }, + { "rnbnqkrb/2pppppp/1p6/p7/1PP5/4N2P/P2PPPP1/RNB1QKRB w GAg - 0 9", 3, 14225 }, + { "rnbnqkrb/2pppppp/1p6/p7/1PP5/4N2P/P2PPPP1/RNB1QKRB w GAg - 0 9", 4, 374196 }, + { "rnbnqkrb/2pppppp/1p6/p7/1PP5/4N2P/P2PPPP1/RNB1QKRB w GAg - 0 9", 5, 10022614 }, + { "rnbnqkrb/2pppppp/1p6/p7/1PP5/4N2P/P2PPPP1/RNB1QKRB w GAg - 0 9", 6, 279545007 }, + { "rbnnbq1r/ppppppkp/6p1/N7/4P3/P7/1PPP1PPP/RB1NBQKR w HA - 5 9", 1, 27 }, + { "rbnnbq1r/ppppppkp/6p1/N7/4P3/P7/1PPP1PPP/RB1NBQKR w HA - 5 9", 2, 620 }, + { "rbnnbq1r/ppppppkp/6p1/N7/4P3/P7/1PPP1PPP/RB1NBQKR w HA - 5 9", 3, 18371 }, + { "rbnnbq1r/ppppppkp/6p1/N7/4P3/P7/1PPP1PPP/RB1NBQKR w HA - 5 9", 4, 440594 }, + { "rbnnbq1r/ppppppkp/6p1/N7/4P3/P7/1PPP1PPP/RB1NBQKR w HA - 5 9", 5, 13909432 }, + { "rbnnbq1r/ppppppkp/6p1/N7/4P3/P7/1PPP1PPP/RB1NBQKR w HA - 5 9", 6, 349478320 }, + { "r1nbbqkr/pppppp1p/8/8/1n3Pp1/3N1QP1/PPPPP2P/RN1BB1KR w HAha - 0 9", 1, 31 }, + { "r1nbbqkr/pppppp1p/8/8/1n3Pp1/3N1QP1/PPPPP2P/RN1BB1KR w HAha - 0 9", 2, 791 }, + { "r1nbbqkr/pppppp1p/8/8/1n3Pp1/3N1QP1/PPPPP2P/RN1BB1KR w HAha - 0 9", 3, 25431 }, + { "r1nbbqkr/pppppp1p/8/8/1n3Pp1/3N1QP1/PPPPP2P/RN1BB1KR w HAha - 0 9", 4, 682579 }, + { "r1nbbqkr/pppppp1p/8/8/1n3Pp1/3N1QP1/PPPPP2P/RN1BB1KR w HAha - 0 9", 5, 22408813 }, + { "r1nbbqkr/pppppp1p/8/8/1n3Pp1/3N1QP1/PPPPP2P/RN1BB1KR w HAha - 0 9", 6, 636779732 }, + { "rnq1bbkr/pp1p1ppp/2pnp3/8/7P/1QP5/PP1PPPPR/RNN1BBK1 w Aha - 2 9", 1, 28 }, + { "rnq1bbkr/pp1p1ppp/2pnp3/8/7P/1QP5/PP1PPPPR/RNN1BBK1 w Aha - 2 9", 2, 559 }, + { "rnq1bbkr/pp1p1ppp/2pnp3/8/7P/1QP5/PP1PPPPR/RNN1BBK1 w Aha - 2 9", 3, 16838 }, + { "rnq1bbkr/pp1p1ppp/2pnp3/8/7P/1QP5/PP1PPPPR/RNN1BBK1 w Aha - 2 9", 4, 390887 }, + { "rnq1bbkr/pp1p1ppp/2pnp3/8/7P/1QP5/PP1PPPPR/RNN1BBK1 w Aha - 2 9", 5, 12242780 }, + { "rnq1bbkr/pp1p1ppp/2pnp3/8/7P/1QP5/PP1PPPPR/RNN1BBK1 w Aha - 2 9", 6, 315431511 }, + { "rnnqbrkb/2ppppp1/1p1N4/p6p/4P3/8/PPPP1PPP/R1NQBKRB w GA - 0 9", 1, 32 }, + { "rnnqbrkb/2ppppp1/1p1N4/p6p/4P3/8/PPPP1PPP/R1NQBKRB w GA - 0 9", 2, 638 }, + { "rnnqbrkb/2ppppp1/1p1N4/p6p/4P3/8/PPPP1PPP/R1NQBKRB w GA - 0 9", 3, 20591 }, + { "rnnqbrkb/2ppppp1/1p1N4/p6p/4P3/8/PPPP1PPP/R1NQBKRB w GA - 0 9", 4, 438792 }, + { "rnnqbrkb/2ppppp1/1p1N4/p6p/4P3/8/PPPP1PPP/R1NQBKRB w GA - 0 9", 5, 14395828 }, + { "rnnqbrkb/2ppppp1/1p1N4/p6p/4P3/8/PPPP1PPP/R1NQBKRB w GA - 0 9", 6, 331782223 }, + { "rbnnq1br/pppp1kp1/4pp2/7p/PP6/2PP4/4PPPP/RBNNQKBR w HA - 0 9", 1, 21 }, + { "rbnnq1br/pppp1kp1/4pp2/7p/PP6/2PP4/4PPPP/RBNNQKBR w HA - 0 9", 2, 521 }, + { "rbnnq1br/pppp1kp1/4pp2/7p/PP6/2PP4/4PPPP/RBNNQKBR w HA - 0 9", 3, 12201 }, + { "rbnnq1br/pppp1kp1/4pp2/7p/PP6/2PP4/4PPPP/RBNNQKBR w HA - 0 9", 4, 320429 }, + { "rbnnq1br/pppp1kp1/4pp2/7p/PP6/2PP4/4PPPP/RBNNQKBR w HA - 0 9", 5, 8239159 }, + { "rbnnq1br/pppp1kp1/4pp2/7p/PP6/2PP4/4PPPP/RBNNQKBR w HA - 0 9", 6, 227346638 }, + { "rnnbqkbr/p2ppp2/7p/1pp3p1/2P2N2/8/PP1PPPPP/RN1BQKBR w HAha - 0 9", 1, 25 }, + { "rnnbqkbr/p2ppp2/7p/1pp3p1/2P2N2/8/PP1PPPPP/RN1BQKBR w HAha - 0 9", 2, 528 }, + { "rnnbqkbr/p2ppp2/7p/1pp3p1/2P2N2/8/PP1PPPPP/RN1BQKBR w HAha - 0 9", 3, 13896 }, + { "rnnbqkbr/p2ppp2/7p/1pp3p1/2P2N2/8/PP1PPPPP/RN1BQKBR w HAha - 0 9", 4, 326094 }, + { "rnnbqkbr/p2ppp2/7p/1pp3p1/2P2N2/8/PP1PPPPP/RN1BQKBR w HAha - 0 9", 5, 9079829 }, + { "rnnbqkbr/p2ppp2/7p/1pp3p1/2P2N2/8/PP1PPPPP/RN1BQKBR w HAha - 0 9", 6, 232750602 }, + { "rnn1kbbr/ppppqp2/6p1/2N1p2p/P7/2P5/1P1PPPPP/RN1QKBBR w HAha - 2 9", 1, 27 }, + { "rnn1kbbr/ppppqp2/6p1/2N1p2p/P7/2P5/1P1PPPPP/RN1QKBBR w HAha - 2 9", 2, 801 }, + { "rnn1kbbr/ppppqp2/6p1/2N1p2p/P7/2P5/1P1PPPPP/RN1QKBBR w HAha - 2 9", 3, 22088 }, + { "rnn1kbbr/ppppqp2/6p1/2N1p2p/P7/2P5/1P1PPPPP/RN1QKBBR w HAha - 2 9", 4, 707078 }, + { "rnn1kbbr/ppppqp2/6p1/2N1p2p/P7/2P5/1P1PPPPP/RN1QKBBR w HAha - 2 9", 5, 20334071 }, + { "rnn1kbbr/ppppqp2/6p1/2N1p2p/P7/2P5/1P1PPPPP/RN1QKBBR w HAha - 2 9", 6, 682580976 }, + { "rnnqkrbb/p1p1p1pp/1p3p2/8/3p2Q1/P1P1P3/1P1P1PPP/RNN1KRBB w FAfa - 0 9", 1, 37 }, + { "rnnqkrbb/p1p1p1pp/1p3p2/8/3p2Q1/P1P1P3/1P1P1PPP/RNN1KRBB w FAfa - 0 9", 2, 1014 }, + { "rnnqkrbb/p1p1p1pp/1p3p2/8/3p2Q1/P1P1P3/1P1P1PPP/RNN1KRBB w FAfa - 0 9", 3, 34735 }, + { "rnnqkrbb/p1p1p1pp/1p3p2/8/3p2Q1/P1P1P3/1P1P1PPP/RNN1KRBB w FAfa - 0 9", 4, 998999 }, + { "rnnqkrbb/p1p1p1pp/1p3p2/8/3p2Q1/P1P1P3/1P1P1PPP/RNN1KRBB w FAfa - 0 9", 5, 32921537 }, + { "rnnqkrbb/p1p1p1pp/1p3p2/8/3p2Q1/P1P1P3/1P1P1PPP/RNN1KRBB w FAfa - 0 9", 6, 988770109 }, + { "bbrnk1qr/1pppppp1/p4n1p/8/P2P2N1/8/1PP1PPPP/BBR1NKQR w HC - 1 9", 1, 21 }, + { "bbrnk1qr/1pppppp1/p4n1p/8/P2P2N1/8/1PP1PPPP/BBR1NKQR w HC - 1 9", 2, 481 }, + { "bbrnk1qr/1pppppp1/p4n1p/8/P2P2N1/8/1PP1PPPP/BBR1NKQR w HC - 1 9", 3, 11213 }, + { "bbrnk1qr/1pppppp1/p4n1p/8/P2P2N1/8/1PP1PPPP/BBR1NKQR w HC - 1 9", 4, 279993 }, + { "bbrnk1qr/1pppppp1/p4n1p/8/P2P2N1/8/1PP1PPPP/BBR1NKQR w HC - 1 9", 5, 7015419 }, + { "bbrnk1qr/1pppppp1/p4n1p/8/P2P2N1/8/1PP1PPPP/BBR1NKQR w HC - 1 9", 6, 187564853 }, + { "brnbnkqr/1pp1p1p1/p2p1p2/7p/1P4PP/8/PBPPPP2/1RNBNKQR w HBhb - 0 9", 1, 31 }, + { "brnbnkqr/1pp1p1p1/p2p1p2/7p/1P4PP/8/PBPPPP2/1RNBNKQR w HBhb - 0 9", 2, 743 }, + { "brnbnkqr/1pp1p1p1/p2p1p2/7p/1P4PP/8/PBPPPP2/1RNBNKQR w HBhb - 0 9", 3, 24260 }, + { "brnbnkqr/1pp1p1p1/p2p1p2/7p/1P4PP/8/PBPPPP2/1RNBNKQR w HBhb - 0 9", 4, 660177 }, + { "brnbnkqr/1pp1p1p1/p2p1p2/7p/1P4PP/8/PBPPPP2/1RNBNKQR w HBhb - 0 9", 5, 22391185 }, + { "brnbnkqr/1pp1p1p1/p2p1p2/7p/1P4PP/8/PBPPPP2/1RNBNKQR w HBhb - 0 9", 6, 653721389 }, + { "br2kbqr/ppppp1pp/3n1p2/3P4/3n3P/3N4/PPP1PPP1/BR1NKBQR w HBhb - 3 9", 1, 25 }, + { "br2kbqr/ppppp1pp/3n1p2/3P4/3n3P/3N4/PPP1PPP1/BR1NKBQR w HBhb - 3 9", 2, 872 }, + { "br2kbqr/ppppp1pp/3n1p2/3P4/3n3P/3N4/PPP1PPP1/BR1NKBQR w HBhb - 3 9", 3, 22039 }, + { "br2kbqr/ppppp1pp/3n1p2/3P4/3n3P/3N4/PPP1PPP1/BR1NKBQR w HBhb - 3 9", 4, 748726 }, + { "br2kbqr/ppppp1pp/3n1p2/3P4/3n3P/3N4/PPP1PPP1/BR1NKBQR w HBhb - 3 9", 5, 20281962 }, + { "br2kbqr/ppppp1pp/3n1p2/3P4/3n3P/3N4/PPP1PPP1/BR1NKBQR w HBhb - 3 9", 6, 685749952 }, + { "br1nkqrb/ppppppp1/8/7p/4P3/n1P2PP1/PP1P3P/BRNNKQRB w GBgb - 0 9", 1, 28 }, + { "br1nkqrb/ppppppp1/8/7p/4P3/n1P2PP1/PP1P3P/BRNNKQRB w GBgb - 0 9", 2, 607 }, + { "br1nkqrb/ppppppp1/8/7p/4P3/n1P2PP1/PP1P3P/BRNNKQRB w GBgb - 0 9", 3, 16934 }, + { "br1nkqrb/ppppppp1/8/7p/4P3/n1P2PP1/PP1P3P/BRNNKQRB w GBgb - 0 9", 4, 396483 }, + { "br1nkqrb/ppppppp1/8/7p/4P3/n1P2PP1/PP1P3P/BRNNKQRB w GBgb - 0 9", 5, 11607818 }, + { "br1nkqrb/ppppppp1/8/7p/4P3/n1P2PP1/PP1P3P/BRNNKQRB w GBgb - 0 9", 6, 294181806 }, + { "rbbn1kqr/pp1pp1p1/2pn3p/5p2/5P2/1P1N4/PNPPP1PP/RBB2KQR w HAha - 1 9", 1, 27 }, + { "rbbn1kqr/pp1pp1p1/2pn3p/5p2/5P2/1P1N4/PNPPP1PP/RBB2KQR w HAha - 1 9", 2, 725 }, + { "rbbn1kqr/pp1pp1p1/2pn3p/5p2/5P2/1P1N4/PNPPP1PP/RBB2KQR w HAha - 1 9", 3, 21543 }, + { "rbbn1kqr/pp1pp1p1/2pn3p/5p2/5P2/1P1N4/PNPPP1PP/RBB2KQR w HAha - 1 9", 4, 616082 }, + { "rbbn1kqr/pp1pp1p1/2pn3p/5p2/5P2/1P1N4/PNPPP1PP/RBB2KQR w HAha - 1 9", 5, 19239812 }, + { "rbbn1kqr/pp1pp1p1/2pn3p/5p2/5P2/1P1N4/PNPPP1PP/RBB2KQR w HAha - 1 9", 6, 581716972 }, + { "rnbbnk1r/pp1ppp1p/6q1/2p5/PP4p1/4P3/2PP1PPP/RNBBNKQR w HAha - 1 9", 1, 25 }, + { "rnbbnk1r/pp1ppp1p/6q1/2p5/PP4p1/4P3/2PP1PPP/RNBBNKQR w HAha - 1 9", 2, 1072 }, + { "rnbbnk1r/pp1ppp1p/6q1/2p5/PP4p1/4P3/2PP1PPP/RNBBNKQR w HAha - 1 9", 3, 26898 }, + { "rnbbnk1r/pp1ppp1p/6q1/2p5/PP4p1/4P3/2PP1PPP/RNBBNKQR w HAha - 1 9", 4, 1088978 }, + { "rnbbnk1r/pp1ppp1p/6q1/2p5/PP4p1/4P3/2PP1PPP/RNBBNKQR w HAha - 1 9", 5, 28469879 }, + { "rnbbnk1r/pp1ppp1p/6q1/2p5/PP4p1/4P3/2PP1PPP/RNBBNKQR w HAha - 1 9", 6, 1122703887 }, + { "rnbnkbqr/1pp3pp/3p4/p3pp2/3P2P1/2N1N3/PPP1PP1P/R1B1KBQR w HAha - 0 9", 1, 31 }, + { "rnbnkbqr/1pp3pp/3p4/p3pp2/3P2P1/2N1N3/PPP1PP1P/R1B1KBQR w HAha - 0 9", 2, 1028 }, + { "rnbnkbqr/1pp3pp/3p4/p3pp2/3P2P1/2N1N3/PPP1PP1P/R1B1KBQR w HAha - 0 9", 3, 32907 }, + { "rnbnkbqr/1pp3pp/3p4/p3pp2/3P2P1/2N1N3/PPP1PP1P/R1B1KBQR w HAha - 0 9", 4, 1095472 }, + { "rnbnkbqr/1pp3pp/3p4/p3pp2/3P2P1/2N1N3/PPP1PP1P/R1B1KBQR w HAha - 0 9", 5, 36025223 }, + { "rnbnkbqr/1pp3pp/3p4/p3pp2/3P2P1/2N1N3/PPP1PP1P/R1B1KBQR w HAha - 0 9", 6, 1211187800 }, + { "r1bnkqrb/1ppppppp/p3n3/8/6P1/4N3/PPPPPPRP/RNB1KQ1B w Aga - 1 9", 1, 23 }, + { "r1bnkqrb/1ppppppp/p3n3/8/6P1/4N3/PPPPPPRP/RNB1KQ1B w Aga - 1 9", 2, 457 }, + { "r1bnkqrb/1ppppppp/p3n3/8/6P1/4N3/PPPPPPRP/RNB1KQ1B w Aga - 1 9", 3, 11416 }, + { "r1bnkqrb/1ppppppp/p3n3/8/6P1/4N3/PPPPPPRP/RNB1KQ1B w Aga - 1 9", 4, 250551 }, + { "r1bnkqrb/1ppppppp/p3n3/8/6P1/4N3/PPPPPPRP/RNB1KQ1B w Aga - 1 9", 5, 6666787 }, + { "r1bnkqrb/1ppppppp/p3n3/8/6P1/4N3/PPPPPPRP/RNB1KQ1B w Aga - 1 9", 6, 159759052 }, + { "rbn1bkqr/p1pp1pp1/1pn5/4p2p/7P/1PBP4/P1P1PPP1/RBNN1KQR w HAha - 0 9", 1, 23 }, + { "rbn1bkqr/p1pp1pp1/1pn5/4p2p/7P/1PBP4/P1P1PPP1/RBNN1KQR w HAha - 0 9", 2, 470 }, + { "rbn1bkqr/p1pp1pp1/1pn5/4p2p/7P/1PBP4/P1P1PPP1/RBNN1KQR w HAha - 0 9", 3, 11649 }, + { "rbn1bkqr/p1pp1pp1/1pn5/4p2p/7P/1PBP4/P1P1PPP1/RBNN1KQR w HAha - 0 9", 4, 264274 }, + { "rbn1bkqr/p1pp1pp1/1pn5/4p2p/7P/1PBP4/P1P1PPP1/RBNN1KQR w HAha - 0 9", 5, 6963287 }, + { "rbn1bkqr/p1pp1pp1/1pn5/4p2p/7P/1PBP4/P1P1PPP1/RBNN1KQR w HAha - 0 9", 6, 172833738 }, + { "rnnbbkqr/3ppppp/p7/1pp5/P6P/6P1/1PPPPP2/RNNBBKQR w HAha - 0 9", 1, 26 }, + { "rnnbbkqr/3ppppp/p7/1pp5/P6P/6P1/1PPPPP2/RNNBBKQR w HAha - 0 9", 2, 569 }, + { "rnnbbkqr/3ppppp/p7/1pp5/P6P/6P1/1PPPPP2/RNNBBKQR w HAha - 0 9", 3, 15733 }, + { "rnnbbkqr/3ppppp/p7/1pp5/P6P/6P1/1PPPPP2/RNNBBKQR w HAha - 0 9", 4, 375556 }, + { "rnnbbkqr/3ppppp/p7/1pp5/P6P/6P1/1PPPPP2/RNNBBKQR w HAha - 0 9", 5, 11008114 }, + { "rnnbbkqr/3ppppp/p7/1pp5/P6P/6P1/1PPPPP2/RNNBBKQR w HAha - 0 9", 6, 284485303 }, + { "r1nk1bqr/1pppp1pp/2n5/p4p1b/5P2/1N4B1/PPPPP1PP/RN1K1BQR w HAha - 2 9", 1, 25 }, + { "r1nk1bqr/1pppp1pp/2n5/p4p1b/5P2/1N4B1/PPPPP1PP/RN1K1BQR w HAha - 2 9", 2, 824 }, + { "r1nk1bqr/1pppp1pp/2n5/p4p1b/5P2/1N4B1/PPPPP1PP/RN1K1BQR w HAha - 2 9", 3, 21983 }, + { "r1nk1bqr/1pppp1pp/2n5/p4p1b/5P2/1N4B1/PPPPP1PP/RN1K1BQR w HAha - 2 9", 4, 738366 }, + { "r1nk1bqr/1pppp1pp/2n5/p4p1b/5P2/1N4B1/PPPPP1PP/RN1K1BQR w HAha - 2 9", 5, 20904119 }, + { "r1nk1bqr/1pppp1pp/2n5/p4p1b/5P2/1N4B1/PPPPP1PP/RN1K1BQR w HAha - 2 9", 6, 716170771 }, + { "r1nkbqrb/p2pppp1/npp4p/8/4PP2/2N4P/PPPP2P1/R1NKBQRB w GAga - 0 9", 1, 31 }, + { "r1nkbqrb/p2pppp1/npp4p/8/4PP2/2N4P/PPPP2P1/R1NKBQRB w GAga - 0 9", 2, 548 }, + { "r1nkbqrb/p2pppp1/npp4p/8/4PP2/2N4P/PPPP2P1/R1NKBQRB w GAga - 0 9", 3, 17480 }, + { "r1nkbqrb/p2pppp1/npp4p/8/4PP2/2N4P/PPPP2P1/R1NKBQRB w GAga - 0 9", 4, 349633 }, + { "r1nkbqrb/p2pppp1/npp4p/8/4PP2/2N4P/PPPP2P1/R1NKBQRB w GAga - 0 9", 5, 11469548 }, + { "r1nkbqrb/p2pppp1/npp4p/8/4PP2/2N4P/PPPP2P1/R1NKBQRB w GAga - 0 9", 6, 255067638 }, + { "rbnnkqbr/ppppp2p/5p2/6p1/2P1B3/P6P/1P1PPPP1/R1NNKQBR w HAha - 1 9", 1, 31 }, + { "rbnnkqbr/ppppp2p/5p2/6p1/2P1B3/P6P/1P1PPPP1/R1NNKQBR w HAha - 1 9", 2, 809 }, + { "rbnnkqbr/ppppp2p/5p2/6p1/2P1B3/P6P/1P1PPPP1/R1NNKQBR w HAha - 1 9", 3, 24956 }, + { "rbnnkqbr/ppppp2p/5p2/6p1/2P1B3/P6P/1P1PPPP1/R1NNKQBR w HAha - 1 9", 4, 680747 }, + { "rbnnkqbr/ppppp2p/5p2/6p1/2P1B3/P6P/1P1PPPP1/R1NNKQBR w HAha - 1 9", 5, 21247414 }, + { "rbnnkqbr/ppppp2p/5p2/6p1/2P1B3/P6P/1P1PPPP1/R1NNKQBR w HAha - 1 9", 6, 606221516 }, + { "1r1bkqbr/pppp1ppp/2nnp3/8/2P5/N4P2/PP1PP1PP/1RNBKQBR w Hh - 0 9", 1, 28 }, + { "1r1bkqbr/pppp1ppp/2nnp3/8/2P5/N4P2/PP1PP1PP/1RNBKQBR w Hh - 0 9", 2, 810 }, + { "1r1bkqbr/pppp1ppp/2nnp3/8/2P5/N4P2/PP1PP1PP/1RNBKQBR w Hh - 0 9", 3, 22844 }, + { "1r1bkqbr/pppp1ppp/2nnp3/8/2P5/N4P2/PP1PP1PP/1RNBKQBR w Hh - 0 9", 4, 694599 }, + { "1r1bkqbr/pppp1ppp/2nnp3/8/2P5/N4P2/PP1PP1PP/1RNBKQBR w Hh - 0 9", 5, 20188622 }, + { "1r1bkqbr/pppp1ppp/2nnp3/8/2P5/N4P2/PP1PP1PP/1RNBKQBR w Hh - 0 9", 6, 636748147 }, + { "rn1kqbbr/p1pppp1p/1p4p1/1n6/1P2P3/4Q2P/P1PP1PP1/RNNK1BBR w HAha - 1 9", 1, 39 }, + { "rn1kqbbr/p1pppp1p/1p4p1/1n6/1P2P3/4Q2P/P1PP1PP1/RNNK1BBR w HAha - 1 9", 2, 848 }, + { "rn1kqbbr/p1pppp1p/1p4p1/1n6/1P2P3/4Q2P/P1PP1PP1/RNNK1BBR w HAha - 1 9", 3, 30100 }, + { "rn1kqbbr/p1pppp1p/1p4p1/1n6/1P2P3/4Q2P/P1PP1PP1/RNNK1BBR w HAha - 1 9", 4, 724426 }, + { "rn1kqbbr/p1pppp1p/1p4p1/1n6/1P2P3/4Q2P/P1PP1PP1/RNNK1BBR w HAha - 1 9", 5, 25594662 }, + { "rn1kqbbr/p1pppp1p/1p4p1/1n6/1P2P3/4Q2P/P1PP1PP1/RNNK1BBR w HAha - 1 9", 6, 659615710 }, + { "rn1kqrbb/pppppppp/8/8/2nP2P1/1P2P3/P1P2P1P/RNNKQRBB w FAfa - 1 9", 1, 29 }, + { "rn1kqrbb/pppppppp/8/8/2nP2P1/1P2P3/P1P2P1P/RNNKQRBB w FAfa - 1 9", 2, 766 }, + { "rn1kqrbb/pppppppp/8/8/2nP2P1/1P2P3/P1P2P1P/RNNKQRBB w FAfa - 1 9", 3, 21701 }, + { "rn1kqrbb/pppppppp/8/8/2nP2P1/1P2P3/P1P2P1P/RNNKQRBB w FAfa - 1 9", 4, 567971 }, + { "rn1kqrbb/pppppppp/8/8/2nP2P1/1P2P3/P1P2P1P/RNNKQRBB w FAfa - 1 9", 5, 16944425 }, + { "rn1kqrbb/pppppppp/8/8/2nP2P1/1P2P3/P1P2P1P/RNNKQRBB w FAfa - 1 9", 6, 456898648 }, + { "b1rnnkrq/bpppppp1/7p/8/1p6/2B5/PNPPPPPP/1BR1NKRQ w GCgc - 2 9", 1, 25 }, + { "b1rnnkrq/bpppppp1/7p/8/1p6/2B5/PNPPPPPP/1BR1NKRQ w GCgc - 2 9", 2, 667 }, + { "b1rnnkrq/bpppppp1/7p/8/1p6/2B5/PNPPPPPP/1BR1NKRQ w GCgc - 2 9", 3, 17253 }, + { "b1rnnkrq/bpppppp1/7p/8/1p6/2B5/PNPPPPPP/1BR1NKRQ w GCgc - 2 9", 4, 472678 }, + { "b1rnnkrq/bpppppp1/7p/8/1p6/2B5/PNPPPPPP/1BR1NKRQ w GCgc - 2 9", 5, 12865247 }, + { "b1rnnkrq/bpppppp1/7p/8/1p6/2B5/PNPPPPPP/1BR1NKRQ w GCgc - 2 9", 6, 365621294 }, + { "brnb1krq/pppppppp/8/5P2/2P1n2P/8/PP1PP1P1/BRNBNKRQ w GBgb - 1 9", 1, 23 }, + { "brnb1krq/pppppppp/8/5P2/2P1n2P/8/PP1PP1P1/BRNBNKRQ w GBgb - 1 9", 2, 620 }, + { "brnb1krq/pppppppp/8/5P2/2P1n2P/8/PP1PP1P1/BRNBNKRQ w GBgb - 1 9", 3, 14882 }, + { "brnb1krq/pppppppp/8/5P2/2P1n2P/8/PP1PP1P1/BRNBNKRQ w GBgb - 1 9", 4, 402561 }, + { "brnb1krq/pppppppp/8/5P2/2P1n2P/8/PP1PP1P1/BRNBNKRQ w GBgb - 1 9", 5, 10776855 }, + { "brnb1krq/pppppppp/8/5P2/2P1n2P/8/PP1PP1P1/BRNBNKRQ w GBgb - 1 9", 6, 300125003 }, + { "b1nnkbrq/pr1pppp1/1p5p/2p5/P2N1P2/8/1PPPP1PP/BR1NKBRQ w GBg - 0 9", 1, 24 }, + { "b1nnkbrq/pr1pppp1/1p5p/2p5/P2N1P2/8/1PPPP1PP/BR1NKBRQ w GBg - 0 9", 2, 472 }, + { "b1nnkbrq/pr1pppp1/1p5p/2p5/P2N1P2/8/1PPPP1PP/BR1NKBRQ w GBg - 0 9", 3, 12181 }, + { "b1nnkbrq/pr1pppp1/1p5p/2p5/P2N1P2/8/1PPPP1PP/BR1NKBRQ w GBg - 0 9", 4, 267398 }, + { "b1nnkbrq/pr1pppp1/1p5p/2p5/P2N1P2/8/1PPPP1PP/BR1NKBRQ w GBg - 0 9", 5, 7370758 }, + { "b1nnkbrq/pr1pppp1/1p5p/2p5/P2N1P2/8/1PPPP1PP/BR1NKBRQ w GBg - 0 9", 6, 178605165 }, + { "br1nkrqb/p1p1p1pp/3n4/1p1p1p2/5N1P/4P3/PPPP1PP1/BR1NKRQB w FBfb - 0 9", 1, 24 }, + { "br1nkrqb/p1p1p1pp/3n4/1p1p1p2/5N1P/4P3/PPPP1PP1/BR1NKRQB w FBfb - 0 9", 2, 775 }, + { "br1nkrqb/p1p1p1pp/3n4/1p1p1p2/5N1P/4P3/PPPP1PP1/BR1NKRQB w FBfb - 0 9", 3, 19398 }, + { "br1nkrqb/p1p1p1pp/3n4/1p1p1p2/5N1P/4P3/PPPP1PP1/BR1NKRQB w FBfb - 0 9", 4, 624309 }, + { "br1nkrqb/p1p1p1pp/3n4/1p1p1p2/5N1P/4P3/PPPP1PP1/BR1NKRQB w FBfb - 0 9", 5, 16429837 }, + { "br1nkrqb/p1p1p1pp/3n4/1p1p1p2/5N1P/4P3/PPPP1PP1/BR1NKRQB w FBfb - 0 9", 6, 539767605 }, + { "rbbnnkrq/p2pp1pp/2p5/5p2/1pPP1B2/P7/1P2PPPP/RB1NNKRQ w GAga - 0 9", 1, 34 }, + { "rbbnnkrq/p2pp1pp/2p5/5p2/1pPP1B2/P7/1P2PPPP/RB1NNKRQ w GAga - 0 9", 2, 921 }, + { "rbbnnkrq/p2pp1pp/2p5/5p2/1pPP1B2/P7/1P2PPPP/RB1NNKRQ w GAga - 0 9", 3, 30474 }, + { "rbbnnkrq/p2pp1pp/2p5/5p2/1pPP1B2/P7/1P2PPPP/RB1NNKRQ w GAga - 0 9", 4, 849933 }, + { "rbbnnkrq/p2pp1pp/2p5/5p2/1pPP1B2/P7/1P2PPPP/RB1NNKRQ w GAga - 0 9", 5, 28095833 }, + { "rbbnnkrq/p2pp1pp/2p5/5p2/1pPP1B2/P7/1P2PPPP/RB1NNKRQ w GAga - 0 9", 6, 806446436 }, + { "rnbbnkr1/1p1ppp1p/2p3p1/p7/2Pq4/1P1P4/P2BPPPP/RN1BNKRQ w GAga - 2 9", 1, 26 }, + { "rnbbnkr1/1p1ppp1p/2p3p1/p7/2Pq4/1P1P4/P2BPPPP/RN1BNKRQ w GAga - 2 9", 2, 1139 }, + { "rnbbnkr1/1p1ppp1p/2p3p1/p7/2Pq4/1P1P4/P2BPPPP/RN1BNKRQ w GAga - 2 9", 3, 29847 }, + { "rnbbnkr1/1p1ppp1p/2p3p1/p7/2Pq4/1P1P4/P2BPPPP/RN1BNKRQ w GAga - 2 9", 4, 1204863 }, + { "rnbbnkr1/1p1ppp1p/2p3p1/p7/2Pq4/1P1P4/P2BPPPP/RN1BNKRQ w GAga - 2 9", 5, 32825932 }, + { "rnbbnkr1/1p1ppp1p/2p3p1/p7/2Pq4/1P1P4/P2BPPPP/RN1BNKRQ w GAga - 2 9", 6, 1281760240 }, + { "1rbnkbrq/pppppp2/n5pp/2P5/P7/4N3/1P1PPPPP/RNB1KBRQ w GAg - 2 9", 1, 23 }, + { "1rbnkbrq/pppppp2/n5pp/2P5/P7/4N3/1P1PPPPP/RNB1KBRQ w GAg - 2 9", 2, 574 }, + { "1rbnkbrq/pppppp2/n5pp/2P5/P7/4N3/1P1PPPPP/RNB1KBRQ w GAg - 2 9", 3, 14146 }, + { "1rbnkbrq/pppppp2/n5pp/2P5/P7/4N3/1P1PPPPP/RNB1KBRQ w GAg - 2 9", 4, 391413 }, + { "1rbnkbrq/pppppp2/n5pp/2P5/P7/4N3/1P1PPPPP/RNB1KBRQ w GAg - 2 9", 5, 10203438 }, + { "1rbnkbrq/pppppp2/n5pp/2P5/P7/4N3/1P1PPPPP/RNB1KBRQ w GAg - 2 9", 6, 301874034 }, + { "1nbnkr1b/rppppppq/p7/7p/1P5P/3P2P1/P1P1PP2/RNBNKRQB w FAf - 1 9", 1, 33 }, + { "1nbnkr1b/rppppppq/p7/7p/1P5P/3P2P1/P1P1PP2/RNBNKRQB w FAf - 1 9", 2, 823 }, + { "1nbnkr1b/rppppppq/p7/7p/1P5P/3P2P1/P1P1PP2/RNBNKRQB w FAf - 1 9", 3, 26696 }, + { "1nbnkr1b/rppppppq/p7/7p/1P5P/3P2P1/P1P1PP2/RNBNKRQB w FAf - 1 9", 4, 724828 }, + { "1nbnkr1b/rppppppq/p7/7p/1P5P/3P2P1/P1P1PP2/RNBNKRQB w FAf - 1 9", 5, 23266182 }, + { "1nbnkr1b/rppppppq/p7/7p/1P5P/3P2P1/P1P1PP2/RNBNKRQB w FAf - 1 9", 6, 672294132 }, + { "rbn1bkrq/ppppp3/4n2p/5pp1/1PN5/2P5/P2PPPPP/RBN1BKRQ w GAga - 0 9", 1, 27 }, + { "rbn1bkrq/ppppp3/4n2p/5pp1/1PN5/2P5/P2PPPPP/RBN1BKRQ w GAga - 0 9", 2, 859 }, + { "rbn1bkrq/ppppp3/4n2p/5pp1/1PN5/2P5/P2PPPPP/RBN1BKRQ w GAga - 0 9", 3, 24090 }, + { "rbn1bkrq/ppppp3/4n2p/5pp1/1PN5/2P5/P2PPPPP/RBN1BKRQ w GAga - 0 9", 4, 796482 }, + { "rbn1bkrq/ppppp3/4n2p/5pp1/1PN5/2P5/P2PPPPP/RBN1BKRQ w GAga - 0 9", 5, 23075785 }, + { "rbn1bkrq/ppppp3/4n2p/5pp1/1PN5/2P5/P2PPPPP/RBN1BKRQ w GAga - 0 9", 6, 789152120 }, + { "r1nbbkrq/1ppp2pp/2n2p2/p3p3/5P2/1N4BP/PPPPP1P1/RN1B1KRQ w GAga - 0 9", 1, 25 }, + { "r1nbbkrq/1ppp2pp/2n2p2/p3p3/5P2/1N4BP/PPPPP1P1/RN1B1KRQ w GAga - 0 9", 2, 774 }, + { "r1nbbkrq/1ppp2pp/2n2p2/p3p3/5P2/1N4BP/PPPPP1P1/RN1B1KRQ w GAga - 0 9", 3, 20141 }, + { "r1nbbkrq/1ppp2pp/2n2p2/p3p3/5P2/1N4BP/PPPPP1P1/RN1B1KRQ w GAga - 0 9", 4, 618805 }, + { "r1nbbkrq/1ppp2pp/2n2p2/p3p3/5P2/1N4BP/PPPPP1P1/RN1B1KRQ w GAga - 0 9", 5, 16718577 }, + { "r1nbbkrq/1ppp2pp/2n2p2/p3p3/5P2/1N4BP/PPPPP1P1/RN1B1KRQ w GAga - 0 9", 6, 515864053 }, + { "rnnkbbrq/1pppp1p1/5p2/7p/p6P/3N1P2/PPPPP1PQ/RN1KBBR1 w GAga - 0 9", 1, 29 }, + { "rnnkbbrq/1pppp1p1/5p2/7p/p6P/3N1P2/PPPPP1PQ/RN1KBBR1 w GAga - 0 9", 2, 673 }, + { "rnnkbbrq/1pppp1p1/5p2/7p/p6P/3N1P2/PPPPP1PQ/RN1KBBR1 w GAga - 0 9", 3, 20098 }, + { "rnnkbbrq/1pppp1p1/5p2/7p/p6P/3N1P2/PPPPP1PQ/RN1KBBR1 w GAga - 0 9", 4, 504715 }, + { "rnnkbbrq/1pppp1p1/5p2/7p/p6P/3N1P2/PPPPP1PQ/RN1KBBR1 w GAga - 0 9", 5, 15545590 }, + { "rnnkbbrq/1pppp1p1/5p2/7p/p6P/3N1P2/PPPPP1PQ/RN1KBBR1 w GAga - 0 9", 6, 416359581 }, + { "r1nkbrqb/pppp1p2/n3p1p1/7p/2P2P2/1P6/P2PPQPP/RNNKBR1B w FAfa - 0 9", 1, 27 }, + { "r1nkbrqb/pppp1p2/n3p1p1/7p/2P2P2/1P6/P2PPQPP/RNNKBR1B w FAfa - 0 9", 2, 722 }, + { "r1nkbrqb/pppp1p2/n3p1p1/7p/2P2P2/1P6/P2PPQPP/RNNKBR1B w FAfa - 0 9", 3, 21397 }, + { "r1nkbrqb/pppp1p2/n3p1p1/7p/2P2P2/1P6/P2PPQPP/RNNKBR1B w FAfa - 0 9", 4, 593762 }, + { "r1nkbrqb/pppp1p2/n3p1p1/7p/2P2P2/1P6/P2PPQPP/RNNKBR1B w FAfa - 0 9", 5, 18742426 }, + { "r1nkbrqb/pppp1p2/n3p1p1/7p/2P2P2/1P6/P2PPQPP/RNNKBR1B w FAfa - 0 9", 6, 537750982 }, + { "rbnnkr1q/1ppp2pp/p4p2/P2bp3/4P2P/8/1PPP1PP1/RBNNKRBQ w FAfa - 1 9", 1, 26 }, + { "rbnnkr1q/1ppp2pp/p4p2/P2bp3/4P2P/8/1PPP1PP1/RBNNKRBQ w FAfa - 1 9", 2, 848 }, + { "rbnnkr1q/1ppp2pp/p4p2/P2bp3/4P2P/8/1PPP1PP1/RBNNKRBQ w FAfa - 1 9", 3, 23387 }, + { "rbnnkr1q/1ppp2pp/p4p2/P2bp3/4P2P/8/1PPP1PP1/RBNNKRBQ w FAfa - 1 9", 4, 741674 }, + { "rbnnkr1q/1ppp2pp/p4p2/P2bp3/4P2P/8/1PPP1PP1/RBNNKRBQ w FAfa - 1 9", 5, 21591790 }, + { "rbnnkr1q/1ppp2pp/p4p2/P2bp3/4P2P/8/1PPP1PP1/RBNNKRBQ w FAfa - 1 9", 6, 675163653 }, + { "rn1bkrb1/1ppppp1p/pn4p1/8/P2q3P/3P4/NPP1PPP1/RN1BKRBQ w FAfa - 1 9", 1, 22 }, + { "rn1bkrb1/1ppppp1p/pn4p1/8/P2q3P/3P4/NPP1PPP1/RN1BKRBQ w FAfa - 1 9", 2, 803 }, + { "rn1bkrb1/1ppppp1p/pn4p1/8/P2q3P/3P4/NPP1PPP1/RN1BKRBQ w FAfa - 1 9", 3, 18322 }, + { "rn1bkrb1/1ppppp1p/pn4p1/8/P2q3P/3P4/NPP1PPP1/RN1BKRBQ w FAfa - 1 9", 4, 632920 }, + { "rn1bkrb1/1ppppp1p/pn4p1/8/P2q3P/3P4/NPP1PPP1/RN1BKRBQ w FAfa - 1 9", 5, 15847763 }, + { "rn1bkrb1/1ppppp1p/pn4p1/8/P2q3P/3P4/NPP1PPP1/RN1BKRBQ w FAfa - 1 9", 6, 536419559 }, + { "rn1krbbq/pppp1npp/4pp2/8/4P2P/3P2P1/PPP2P2/RNNKRBBQ w EAea - 1 9", 1, 29 }, + { "rn1krbbq/pppp1npp/4pp2/8/4P2P/3P2P1/PPP2P2/RNNKRBBQ w EAea - 1 9", 2, 810 }, + { "rn1krbbq/pppp1npp/4pp2/8/4P2P/3P2P1/PPP2P2/RNNKRBBQ w EAea - 1 9", 3, 23968 }, + { "rn1krbbq/pppp1npp/4pp2/8/4P2P/3P2P1/PPP2P2/RNNKRBBQ w EAea - 1 9", 4, 670500 }, + { "rn1krbbq/pppp1npp/4pp2/8/4P2P/3P2P1/PPP2P2/RNNKRBBQ w EAea - 1 9", 5, 20361517 }, + { "rn1krbbq/pppp1npp/4pp2/8/4P2P/3P2P1/PPP2P2/RNNKRBBQ w EAea - 1 9", 6, 575069358 }, + { "rnn1rqbb/ppkp1pp1/2p1p2p/2P5/8/3P1P2/PP2P1PP/RNNKRQBB w EA - 0 9", 1, 22 }, + { "rnn1rqbb/ppkp1pp1/2p1p2p/2P5/8/3P1P2/PP2P1PP/RNNKRQBB w EA - 0 9", 2, 506 }, + { "rnn1rqbb/ppkp1pp1/2p1p2p/2P5/8/3P1P2/PP2P1PP/RNNKRQBB w EA - 0 9", 3, 11973 }, + { "rnn1rqbb/ppkp1pp1/2p1p2p/2P5/8/3P1P2/PP2P1PP/RNNKRQBB w EA - 0 9", 4, 292344 }, + { "rnn1rqbb/ppkp1pp1/2p1p2p/2P5/8/3P1P2/PP2P1PP/RNNKRQBB w EA - 0 9", 5, 7287368 }, + { "rnn1rqbb/ppkp1pp1/2p1p2p/2P5/8/3P1P2/PP2P1PP/RNNKRQBB w EA - 0 9", 6, 189865944 }, + { "bbqr1knr/pppppp1p/8/4n1p1/2P1P3/6P1/PPQP1P1P/BB1RNKNR w HDhd - 0 9", 1, 26 }, + { "bbqr1knr/pppppp1p/8/4n1p1/2P1P3/6P1/PPQP1P1P/BB1RNKNR w HDhd - 0 9", 2, 650 }, + { "bbqr1knr/pppppp1p/8/4n1p1/2P1P3/6P1/PPQP1P1P/BB1RNKNR w HDhd - 0 9", 3, 18253 }, + { "bbqr1knr/pppppp1p/8/4n1p1/2P1P3/6P1/PPQP1P1P/BB1RNKNR w HDhd - 0 9", 4, 481200 }, + { "bbqr1knr/pppppp1p/8/4n1p1/2P1P3/6P1/PPQP1P1P/BB1RNKNR w HDhd - 0 9", 5, 14301029 }, + { "bbqr1knr/pppppp1p/8/4n1p1/2P1P3/6P1/PPQP1P1P/BB1RNKNR w HDhd - 0 9", 6, 394943978 }, + { "bq1bnknr/pprppp1p/8/2p3p1/4PPP1/8/PPPP3P/BQRBNKNR w HCh - 0 9", 1, 24 }, + { "bq1bnknr/pprppp1p/8/2p3p1/4PPP1/8/PPPP3P/BQRBNKNR w HCh - 0 9", 2, 548 }, + { "bq1bnknr/pprppp1p/8/2p3p1/4PPP1/8/PPPP3P/BQRBNKNR w HCh - 0 9", 3, 14021 }, + { "bq1bnknr/pprppp1p/8/2p3p1/4PPP1/8/PPPP3P/BQRBNKNR w HCh - 0 9", 4, 347611 }, + { "bq1bnknr/pprppp1p/8/2p3p1/4PPP1/8/PPPP3P/BQRBNKNR w HCh - 0 9", 5, 9374021 }, + { "bq1bnknr/pprppp1p/8/2p3p1/4PPP1/8/PPPP3P/BQRBNKNR w HCh - 0 9", 6, 250988458 }, + { "bqrnkb1r/1p2pppp/p1pp3n/5Q2/2P4P/5N2/PP1PPPP1/B1RNKB1R w HChc - 0 9", 1, 46 }, + { "bqrnkb1r/1p2pppp/p1pp3n/5Q2/2P4P/5N2/PP1PPPP1/B1RNKB1R w HChc - 0 9", 2, 823 }, + { "bqrnkb1r/1p2pppp/p1pp3n/5Q2/2P4P/5N2/PP1PPPP1/B1RNKB1R w HChc - 0 9", 3, 33347 }, + { "bqrnkb1r/1p2pppp/p1pp3n/5Q2/2P4P/5N2/PP1PPPP1/B1RNKB1R w HChc - 0 9", 4, 673905 }, + { "bqrnkb1r/1p2pppp/p1pp3n/5Q2/2P4P/5N2/PP1PPPP1/B1RNKB1R w HChc - 0 9", 5, 26130444 }, + { "bqrnkb1r/1p2pppp/p1pp3n/5Q2/2P4P/5N2/PP1PPPP1/B1RNKB1R w HChc - 0 9", 6, 582880996 }, + { "bq1rknrb/pppppp1p/4n3/6p1/4P1P1/3P1P2/PPP4P/BQRNKNRB w GCg - 0 9", 1, 23 }, + { "bq1rknrb/pppppp1p/4n3/6p1/4P1P1/3P1P2/PPP4P/BQRNKNRB w GCg - 0 9", 2, 618 }, + { "bq1rknrb/pppppp1p/4n3/6p1/4P1P1/3P1P2/PPP4P/BQRNKNRB w GCg - 0 9", 3, 14815 }, + { "bq1rknrb/pppppp1p/4n3/6p1/4P1P1/3P1P2/PPP4P/BQRNKNRB w GCg - 0 9", 4, 419474 }, + { "bq1rknrb/pppppp1p/4n3/6p1/4P1P1/3P1P2/PPP4P/BQRNKNRB w GCg - 0 9", 5, 10606831 }, + { "bq1rknrb/pppppp1p/4n3/6p1/4P1P1/3P1P2/PPP4P/BQRNKNRB w GCg - 0 9", 6, 315124518 }, + { "q1brnknr/pp1pp1p1/8/2p2p1p/5b2/P4N2/1PPPP1PP/QBBRK1NR w hd - 0 9", 1, 22 }, + { "q1brnknr/pp1pp1p1/8/2p2p1p/5b2/P4N2/1PPPP1PP/QBBRK1NR w hd - 0 9", 2, 675 }, + { "q1brnknr/pp1pp1p1/8/2p2p1p/5b2/P4N2/1PPPP1PP/QBBRK1NR w hd - 0 9", 3, 15778 }, + { "q1brnknr/pp1pp1p1/8/2p2p1p/5b2/P4N2/1PPPP1PP/QBBRK1NR w hd - 0 9", 4, 473994 }, + { "q1brnknr/pp1pp1p1/8/2p2p1p/5b2/P4N2/1PPPP1PP/QBBRK1NR w hd - 0 9", 5, 12077228 }, + { "q1brnknr/pp1pp1p1/8/2p2p1p/5b2/P4N2/1PPPP1PP/QBBRK1NR w hd - 0 9", 6, 368479752 }, + { "qrbbnknr/1p1ppp1p/p1p5/8/1P2P1p1/3P1B2/P1P2PPP/QRB1NKNR w HBhb - 0 9", 1, 32 }, + { "qrbbnknr/1p1ppp1p/p1p5/8/1P2P1p1/3P1B2/P1P2PPP/QRB1NKNR w HBhb - 0 9", 2, 722 }, + { "qrbbnknr/1p1ppp1p/p1p5/8/1P2P1p1/3P1B2/P1P2PPP/QRB1NKNR w HBhb - 0 9", 3, 24049 }, + { "qrbbnknr/1p1ppp1p/p1p5/8/1P2P1p1/3P1B2/P1P2PPP/QRB1NKNR w HBhb - 0 9", 4, 569905 }, + { "qrbbnknr/1p1ppp1p/p1p5/8/1P2P1p1/3P1B2/P1P2PPP/QRB1NKNR w HBhb - 0 9", 5, 19584539 }, + { "qrbbnknr/1p1ppp1p/p1p5/8/1P2P1p1/3P1B2/P1P2PPP/QRB1NKNR w HBhb - 0 9", 6, 484814878 }, + { "qrb1kbnr/p3pppp/2n5/1ppp4/7P/3P1P2/PPP1P1PR/QRBNKBN1 w Bhb - 0 9", 1, 26 }, + { "qrb1kbnr/p3pppp/2n5/1ppp4/7P/3P1P2/PPP1P1PR/QRBNKBN1 w Bhb - 0 9", 2, 831 }, + { "qrb1kbnr/p3pppp/2n5/1ppp4/7P/3P1P2/PPP1P1PR/QRBNKBN1 w Bhb - 0 9", 3, 22606 }, + { "qrb1kbnr/p3pppp/2n5/1ppp4/7P/3P1P2/PPP1P1PR/QRBNKBN1 w Bhb - 0 9", 4, 724505 }, + { "qrb1kbnr/p3pppp/2n5/1ppp4/7P/3P1P2/PPP1P1PR/QRBNKBN1 w Bhb - 0 9", 5, 20500804 }, + { "qrb1kbnr/p3pppp/2n5/1ppp4/7P/3P1P2/PPP1P1PR/QRBNKBN1 w Bhb - 0 9", 6, 662608969 }, + { "qrbnknrb/ppp1pp2/6p1/7p/PPNp4/8/2PPPPPP/QRB1KNRB w GBgb - 0 9", 1, 31 }, + { "qrbnknrb/ppp1pp2/6p1/7p/PPNp4/8/2PPPPPP/QRB1KNRB w GBgb - 0 9", 2, 840 }, + { "qrbnknrb/ppp1pp2/6p1/7p/PPNp4/8/2PPPPPP/QRB1KNRB w GBgb - 0 9", 3, 26762 }, + { "qrbnknrb/ppp1pp2/6p1/7p/PPNp4/8/2PPPPPP/QRB1KNRB w GBgb - 0 9", 4, 742772 }, + { "qrbnknrb/ppp1pp2/6p1/7p/PPNp4/8/2PPPPPP/QRB1KNRB w GBgb - 0 9", 5, 24422614 }, + { "qrbnknrb/ppp1pp2/6p1/7p/PPNp4/8/2PPPPPP/QRB1KNRB w GBgb - 0 9", 6, 701363800 }, + { "qbrnbknr/pp1pp1pp/8/2p2p2/3Q4/PP6/2PPPPPP/1BRNBKNR w HChc - 0 9", 1, 38 }, + { "qbrnbknr/pp1pp1pp/8/2p2p2/3Q4/PP6/2PPPPPP/1BRNBKNR w HChc - 0 9", 2, 1121 }, + { "qbrnbknr/pp1pp1pp/8/2p2p2/3Q4/PP6/2PPPPPP/1BRNBKNR w HChc - 0 9", 3, 39472 }, + { "qbrnbknr/pp1pp1pp/8/2p2p2/3Q4/PP6/2PPPPPP/1BRNBKNR w HChc - 0 9", 4, 1198438 }, + { "qbrnbknr/pp1pp1pp/8/2p2p2/3Q4/PP6/2PPPPPP/1BRNBKNR w HChc - 0 9", 5, 41108769 }, + { "qbrnbknr/pp1pp1pp/8/2p2p2/3Q4/PP6/2PPPPPP/1BRNBKNR w HChc - 0 9", 6, 1285503872 }, + { "qr1bbk1r/pppppp1p/1n6/5np1/4B3/1PP5/P2PPPPP/QRN1BKNR w HBhb - 0 9", 1, 25 }, + { "qr1bbk1r/pppppp1p/1n6/5np1/4B3/1PP5/P2PPPPP/QRN1BKNR w HBhb - 0 9", 2, 694 }, + { "qr1bbk1r/pppppp1p/1n6/5np1/4B3/1PP5/P2PPPPP/QRN1BKNR w HBhb - 0 9", 3, 16938 }, + { "qr1bbk1r/pppppp1p/1n6/5np1/4B3/1PP5/P2PPPPP/QRN1BKNR w HBhb - 0 9", 4, 472950 }, + { "qr1bbk1r/pppppp1p/1n6/5np1/4B3/1PP5/P2PPPPP/QRN1BKNR w HBhb - 0 9", 5, 12164609 }, + { "qr1bbk1r/pppppp1p/1n6/5np1/4B3/1PP5/P2PPPPP/QRN1BKNR w HBhb - 0 9", 6, 345122090 }, + { "qrnkbbnr/1p1pp2p/p7/2p1Npp1/6P1/7P/PPPPPP2/QR1KBBNR w HBhb - 0 9", 1, 27 }, + { "qrnkbbnr/1p1pp2p/p7/2p1Npp1/6P1/7P/PPPPPP2/QR1KBBNR w HBhb - 0 9", 2, 586 }, + { "qrnkbbnr/1p1pp2p/p7/2p1Npp1/6P1/7P/PPPPPP2/QR1KBBNR w HBhb - 0 9", 3, 16348 }, + { "qrnkbbnr/1p1pp2p/p7/2p1Npp1/6P1/7P/PPPPPP2/QR1KBBNR w HBhb - 0 9", 4, 393391 }, + { "qrnkbbnr/1p1pp2p/p7/2p1Npp1/6P1/7P/PPPPPP2/QR1KBBNR w HBhb - 0 9", 5, 11409633 }, + { "qrnkbbnr/1p1pp2p/p7/2p1Npp1/6P1/7P/PPPPPP2/QR1KBBNR w HBhb - 0 9", 6, 298054792 }, + { "qrnkbnrb/pp1p1p2/2p1p1pp/4N3/P4P2/8/1PPPP1PP/QR1KBNRB w GBgb - 0 9", 1, 32 }, + { "qrnkbnrb/pp1p1p2/2p1p1pp/4N3/P4P2/8/1PPPP1PP/QR1KBNRB w GBgb - 0 9", 2, 645 }, + { "qrnkbnrb/pp1p1p2/2p1p1pp/4N3/P4P2/8/1PPPP1PP/QR1KBNRB w GBgb - 0 9", 3, 20737 }, + { "qrnkbnrb/pp1p1p2/2p1p1pp/4N3/P4P2/8/1PPPP1PP/QR1KBNRB w GBgb - 0 9", 4, 460319 }, + { "qrnkbnrb/pp1p1p2/2p1p1pp/4N3/P4P2/8/1PPPP1PP/QR1KBNRB w GBgb - 0 9", 5, 15037464 }, + { "qrnkbnrb/pp1p1p2/2p1p1pp/4N3/P4P2/8/1PPPP1PP/QR1KBNRB w GBgb - 0 9", 6, 358531599 }, + { "qbrnknbr/1pppppp1/p6p/8/1P6/3PP3/PQP2PPP/1BRNKNBR w HChc - 3 9", 1, 26 }, + { "qbrnknbr/1pppppp1/p6p/8/1P6/3PP3/PQP2PPP/1BRNKNBR w HChc - 3 9", 2, 595 }, + { "qbrnknbr/1pppppp1/p6p/8/1P6/3PP3/PQP2PPP/1BRNKNBR w HChc - 3 9", 3, 16755 }, + { "qbrnknbr/1pppppp1/p6p/8/1P6/3PP3/PQP2PPP/1BRNKNBR w HChc - 3 9", 4, 415022 }, + { "qbrnknbr/1pppppp1/p6p/8/1P6/3PP3/PQP2PPP/1BRNKNBR w HChc - 3 9", 5, 12214768 }, + { "qbrnknbr/1pppppp1/p6p/8/1P6/3PP3/PQP2PPP/1BRNKNBR w HChc - 3 9", 6, 323518628 }, + { "qrnbk1br/1ppppp1p/p5p1/8/4Pn2/4K1P1/PPPP1P1P/QRNB1NBR w hb - 0 9", 1, 24 }, + { "qrnbk1br/1ppppp1p/p5p1/8/4Pn2/4K1P1/PPPP1P1P/QRNB1NBR w hb - 0 9", 2, 609 }, + { "qrnbk1br/1ppppp1p/p5p1/8/4Pn2/4K1P1/PPPP1P1P/QRNB1NBR w hb - 0 9", 3, 13776 }, + { "qrnbk1br/1ppppp1p/p5p1/8/4Pn2/4K1P1/PPPP1P1P/QRNB1NBR w hb - 0 9", 4, 359415 }, + { "qrnbk1br/1ppppp1p/p5p1/8/4Pn2/4K1P1/PPPP1P1P/QRNB1NBR w hb - 0 9", 5, 8538539 }, + { "qrnbk1br/1ppppp1p/p5p1/8/4Pn2/4K1P1/PPPP1P1P/QRNB1NBR w hb - 0 9", 6, 230364479 }, + { "qrnk1bbr/1pnp1ppp/p1p1p3/8/3Q4/1P1N3P/P1PPPPP1/1RNK1BBR w HBhb - 0 9", 1, 43 }, + { "qrnk1bbr/1pnp1ppp/p1p1p3/8/3Q4/1P1N3P/P1PPPPP1/1RNK1BBR w HBhb - 0 9", 2, 1106 }, + { "qrnk1bbr/1pnp1ppp/p1p1p3/8/3Q4/1P1N3P/P1PPPPP1/1RNK1BBR w HBhb - 0 9", 3, 42898 }, + { "qrnk1bbr/1pnp1ppp/p1p1p3/8/3Q4/1P1N3P/P1PPPPP1/1RNK1BBR w HBhb - 0 9", 4, 1123080 }, + { "qrnk1bbr/1pnp1ppp/p1p1p3/8/3Q4/1P1N3P/P1PPPPP1/1RNK1BBR w HBhb - 0 9", 5, 41695761 }, + { "qrnk1bbr/1pnp1ppp/p1p1p3/8/3Q4/1P1N3P/P1PPPPP1/1RNK1BBR w HBhb - 0 9", 6, 1113836402 }, + { "qrnknrb1/pppppp2/8/6pp/4P2P/3P1P2/PbP3P1/QRNKNRBB w FBfb - 0 9", 1, 24 }, + { "qrnknrb1/pppppp2/8/6pp/4P2P/3P1P2/PbP3P1/QRNKNRBB w FBfb - 0 9", 2, 658 }, + { "qrnknrb1/pppppp2/8/6pp/4P2P/3P1P2/PbP3P1/QRNKNRBB w FBfb - 0 9", 3, 17965 }, + { "qrnknrb1/pppppp2/8/6pp/4P2P/3P1P2/PbP3P1/QRNKNRBB w FBfb - 0 9", 4, 488373 }, + { "qrnknrb1/pppppp2/8/6pp/4P2P/3P1P2/PbP3P1/QRNKNRBB w FBfb - 0 9", 5, 14457245 }, + { "qrnknrb1/pppppp2/8/6pp/4P2P/3P1P2/PbP3P1/QRNKNRBB w FBfb - 0 9", 6, 400971226 }, + { "bbrqnrk1/ppp2ppp/7n/3pp3/8/P4N1N/1PPPPPPP/BBRQ1RK1 w - - 1 9", 1, 22 }, + { "bbrqnrk1/ppp2ppp/7n/3pp3/8/P4N1N/1PPPPPPP/BBRQ1RK1 w - - 1 9", 2, 503 }, + { "bbrqnrk1/ppp2ppp/7n/3pp3/8/P4N1N/1PPPPPPP/BBRQ1RK1 w - - 1 9", 3, 12078 }, + { "bbrqnrk1/ppp2ppp/7n/3pp3/8/P4N1N/1PPPPPPP/BBRQ1RK1 w - - 1 9", 4, 310760 }, + { "bbrqnrk1/ppp2ppp/7n/3pp3/8/P4N1N/1PPPPPPP/BBRQ1RK1 w - - 1 9", 5, 8080951 }, + { "bbrqnrk1/ppp2ppp/7n/3pp3/8/P4N1N/1PPPPPPP/BBRQ1RK1 w - - 1 9", 6, 224960353 }, + { "brqbnk1r/1ppp1ppp/8/p3pn2/8/2PP1P2/PP2PKPP/BRQBN1NR w hb - 1 9", 1, 25 }, + { "brqbnk1r/1ppp1ppp/8/p3pn2/8/2PP1P2/PP2PKPP/BRQBN1NR w hb - 1 9", 2, 745 }, + { "brqbnk1r/1ppp1ppp/8/p3pn2/8/2PP1P2/PP2PKPP/BRQBN1NR w hb - 1 9", 3, 19387 }, + { "brqbnk1r/1ppp1ppp/8/p3pn2/8/2PP1P2/PP2PKPP/BRQBN1NR w hb - 1 9", 4, 570459 }, + { "brqbnk1r/1ppp1ppp/8/p3pn2/8/2PP1P2/PP2PKPP/BRQBN1NR w hb - 1 9", 5, 15520298 }, + { "brqbnk1r/1ppp1ppp/8/p3pn2/8/2PP1P2/PP2PKPP/BRQBN1NR w hb - 1 9", 6, 460840861 }, + { "brqnkbnr/pp2pp1p/3p4/2p5/5p2/3P3P/PPP1PPP1/B1RNKBNR w Hhb - 0 9", 1, 19 }, + { "brqnkbnr/pp2pp1p/3p4/2p5/5p2/3P3P/PPP1PPP1/B1RNKBNR w Hhb - 0 9", 2, 516 }, + { "brqnkbnr/pp2pp1p/3p4/2p5/5p2/3P3P/PPP1PPP1/B1RNKBNR w Hhb - 0 9", 3, 10755 }, + { "brqnkbnr/pp2pp1p/3p4/2p5/5p2/3P3P/PPP1PPP1/B1RNKBNR w Hhb - 0 9", 4, 312996 }, + { "brqnkbnr/pp2pp1p/3p4/2p5/5p2/3P3P/PPP1PPP1/B1RNKBNR w Hhb - 0 9", 5, 6995034 }, + { "brqnkbnr/pp2pp1p/3p4/2p5/5p2/3P3P/PPP1PPP1/B1RNKBNR w Hhb - 0 9", 6, 214340699 }, + { "brq1kn1b/1ppppprp/2n3p1/p7/P1N5/6P1/1PPPPP1P/BRQNK1RB w GBb - 2 9", 1, 29 }, + { "brq1kn1b/1ppppprp/2n3p1/p7/P1N5/6P1/1PPPPP1P/BRQNK1RB w GBb - 2 9", 2, 557 }, + { "brq1kn1b/1ppppprp/2n3p1/p7/P1N5/6P1/1PPPPP1P/BRQNK1RB w GBb - 2 9", 3, 16739 }, + { "brq1kn1b/1ppppprp/2n3p1/p7/P1N5/6P1/1PPPPP1P/BRQNK1RB w GBb - 2 9", 4, 352277 }, + { "brq1kn1b/1ppppprp/2n3p1/p7/P1N5/6P1/1PPPPP1P/BRQNK1RB w GBb - 2 9", 5, 10840256 }, + { "brq1kn1b/1ppppprp/2n3p1/p7/P1N5/6P1/1PPPPP1P/BRQNK1RB w GBb - 2 9", 6, 249999654 }, + { "rbbq1k1r/ppp1pppp/7n/1n1p4/5P2/P2P4/1PPBP1PP/RB1QNKNR w HAha - 1 9", 1, 25 }, + { "rbbq1k1r/ppp1pppp/7n/1n1p4/5P2/P2P4/1PPBP1PP/RB1QNKNR w HAha - 1 9", 2, 769 }, + { "rbbq1k1r/ppp1pppp/7n/1n1p4/5P2/P2P4/1PPBP1PP/RB1QNKNR w HAha - 1 9", 3, 20110 }, + { "rbbq1k1r/ppp1pppp/7n/1n1p4/5P2/P2P4/1PPBP1PP/RB1QNKNR w HAha - 1 9", 4, 638340 }, + { "rbbq1k1r/ppp1pppp/7n/1n1p4/5P2/P2P4/1PPBP1PP/RB1QNKNR w HAha - 1 9", 5, 17438715 }, + { "rbbq1k1r/ppp1pppp/7n/1n1p4/5P2/P2P4/1PPBP1PP/RB1QNKNR w HAha - 1 9", 6, 570893953 }, + { "r1bbnk1r/qpp1pppp/p6n/3p4/1P6/5N1P/P1PPPPP1/RQBBK1NR w ha - 0 9", 1, 23 }, + { "r1bbnk1r/qpp1pppp/p6n/3p4/1P6/5N1P/P1PPPPP1/RQBBK1NR w ha - 0 9", 2, 728 }, + { "r1bbnk1r/qpp1pppp/p6n/3p4/1P6/5N1P/P1PPPPP1/RQBBK1NR w ha - 0 9", 3, 18209 }, + { "r1bbnk1r/qpp1pppp/p6n/3p4/1P6/5N1P/P1PPPPP1/RQBBK1NR w ha - 0 9", 4, 587364 }, + { "r1bbnk1r/qpp1pppp/p6n/3p4/1P6/5N1P/P1PPPPP1/RQBBK1NR w ha - 0 9", 5, 16053564 }, + { "r1bbnk1r/qpp1pppp/p6n/3p4/1P6/5N1P/P1PPPPP1/RQBBK1NR w ha - 0 9", 6, 529082811 }, + { "rqbnkbnr/1pp2p1p/3p4/p3p1p1/8/2P2P2/PP1PPNPP/RQBNKB1R w HAha - 0 9", 1, 26 }, + { "rqbnkbnr/1pp2p1p/3p4/p3p1p1/8/2P2P2/PP1PPNPP/RQBNKB1R w HAha - 0 9", 2, 772 }, + { "rqbnkbnr/1pp2p1p/3p4/p3p1p1/8/2P2P2/PP1PPNPP/RQBNKB1R w HAha - 0 9", 3, 21903 }, + { "rqbnkbnr/1pp2p1p/3p4/p3p1p1/8/2P2P2/PP1PPNPP/RQBNKB1R w HAha - 0 9", 4, 653704 }, + { "rqbnkbnr/1pp2p1p/3p4/p3p1p1/8/2P2P2/PP1PPNPP/RQBNKB1R w HAha - 0 9", 5, 19571559 }, + { "rqbnkbnr/1pp2p1p/3p4/p3p1p1/8/2P2P2/PP1PPNPP/RQBNKB1R w HAha - 0 9", 6, 593915677 }, + { "r1bnknrb/pqppp1p1/1p5p/5p2/7P/3P2N1/PPP1PPP1/RQBNK1RB w GAga - 2 9", 1, 27 }, + { "r1bnknrb/pqppp1p1/1p5p/5p2/7P/3P2N1/PPP1PPP1/RQBNK1RB w GAga - 2 9", 2, 748 }, + { "r1bnknrb/pqppp1p1/1p5p/5p2/7P/3P2N1/PPP1PPP1/RQBNK1RB w GAga - 2 9", 3, 20291 }, + { "r1bnknrb/pqppp1p1/1p5p/5p2/7P/3P2N1/PPP1PPP1/RQBNK1RB w GAga - 2 9", 4, 597105 }, + { "r1bnknrb/pqppp1p1/1p5p/5p2/7P/3P2N1/PPP1PPP1/RQBNK1RB w GAga - 2 9", 5, 16324542 }, + { "r1bnknrb/pqppp1p1/1p5p/5p2/7P/3P2N1/PPP1PPP1/RQBNK1RB w GAga - 2 9", 6, 506453626 }, + { "rbqnbknr/pp1pppp1/8/2p5/3P3p/5N1P/PPP1PPPR/RBQNBK2 w Aha - 0 9", 1, 30 }, + { "rbqnbknr/pp1pppp1/8/2p5/3P3p/5N1P/PPP1PPPR/RBQNBK2 w Aha - 0 9", 2, 859 }, + { "rbqnbknr/pp1pppp1/8/2p5/3P3p/5N1P/PPP1PPPR/RBQNBK2 w Aha - 0 9", 3, 26785 }, + { "rbqnbknr/pp1pppp1/8/2p5/3P3p/5N1P/PPP1PPPR/RBQNBK2 w Aha - 0 9", 4, 819631 }, + { "rbqnbknr/pp1pppp1/8/2p5/3P3p/5N1P/PPP1PPPR/RBQNBK2 w Aha - 0 9", 5, 26363334 }, + { "rbqnbknr/pp1pppp1/8/2p5/3P3p/5N1P/PPP1PPPR/RBQNBK2 w Aha - 0 9", 6, 842796987 }, + { "rqnbbrk1/ppppppp1/8/5n1p/3P3P/2B3P1/PPP1PP2/RQNB1KNR w HA - 0 9", 1, 22 }, + { "rqnbbrk1/ppppppp1/8/5n1p/3P3P/2B3P1/PPP1PP2/RQNB1KNR w HA - 0 9", 2, 505 }, + { "rqnbbrk1/ppppppp1/8/5n1p/3P3P/2B3P1/PPP1PP2/RQNB1KNR w HA - 0 9", 3, 11452 }, + { "rqnbbrk1/ppppppp1/8/5n1p/3P3P/2B3P1/PPP1PP2/RQNB1KNR w HA - 0 9", 4, 283464 }, + { "rqnbbrk1/ppppppp1/8/5n1p/3P3P/2B3P1/PPP1PP2/RQNB1KNR w HA - 0 9", 5, 7055215 }, + { "rqnbbrk1/ppppppp1/8/5n1p/3P3P/2B3P1/PPP1PP2/RQNB1KNR w HA - 0 9", 6, 186760784 }, + { "rqnkbbnr/pp2p1p1/8/2pp1p1p/3PPP2/8/PPP1N1PP/RQNKBB1R w HAha - 0 9", 1, 28 }, + { "rqnkbbnr/pp2p1p1/8/2pp1p1p/3PPP2/8/PPP1N1PP/RQNKBB1R w HAha - 0 9", 2, 832 }, + { "rqnkbbnr/pp2p1p1/8/2pp1p1p/3PPP2/8/PPP1N1PP/RQNKBB1R w HAha - 0 9", 3, 23142 }, + { "rqnkbbnr/pp2p1p1/8/2pp1p1p/3PPP2/8/PPP1N1PP/RQNKBB1R w HAha - 0 9", 4, 722857 }, + { "rqnkbbnr/pp2p1p1/8/2pp1p1p/3PPP2/8/PPP1N1PP/RQNKBB1R w HAha - 0 9", 5, 20429246 }, + { "rqnkbbnr/pp2p1p1/8/2pp1p1p/3PPP2/8/PPP1N1PP/RQNKBB1R w HAha - 0 9", 6, 663183060 }, + { "rqnkbnr1/pppp2bp/6p1/4pp2/1P2P3/3NN3/P1PP1PPP/RQ1KB1RB w GAga - 0 9", 1, 28 }, + { "rqnkbnr1/pppp2bp/6p1/4pp2/1P2P3/3NN3/P1PP1PPP/RQ1KB1RB w GAga - 0 9", 2, 641 }, + { "rqnkbnr1/pppp2bp/6p1/4pp2/1P2P3/3NN3/P1PP1PPP/RQ1KB1RB w GAga - 0 9", 3, 18835 }, + { "rqnkbnr1/pppp2bp/6p1/4pp2/1P2P3/3NN3/P1PP1PPP/RQ1KB1RB w GAga - 0 9", 4, 459993 }, + { "rqnkbnr1/pppp2bp/6p1/4pp2/1P2P3/3NN3/P1PP1PPP/RQ1KB1RB w GAga - 0 9", 5, 14038570 }, + { "rqnkbnr1/pppp2bp/6p1/4pp2/1P2P3/3NN3/P1PP1PPP/RQ1KB1RB w GAga - 0 9", 6, 364210162 }, + { "rbq2kbr/pppppppp/2n5/P7/3P1n2/2P5/1P2PPPP/RBQNKNBR w HA - 1 9", 1, 31 }, + { "rbq2kbr/pppppppp/2n5/P7/3P1n2/2P5/1P2PPPP/RBQNKNBR w HA - 1 9", 2, 889 }, + { "rbq2kbr/pppppppp/2n5/P7/3P1n2/2P5/1P2PPPP/RBQNKNBR w HA - 1 9", 3, 27028 }, + { "rbq2kbr/pppppppp/2n5/P7/3P1n2/2P5/1P2PPPP/RBQNKNBR w HA - 1 9", 4, 766181 }, + { "rbq2kbr/pppppppp/2n5/P7/3P1n2/2P5/1P2PPPP/RBQNKNBR w HA - 1 9", 5, 24299415 }, + { "rbq2kbr/pppppppp/2n5/P7/3P1n2/2P5/1P2PPPP/RBQNKNBR w HA - 1 9", 6, 692180754 }, + { "rq1bkn1r/ppppp2p/3n4/5pp1/2b3P1/1N1P1P2/PPP1P2P/RQ1BKNBR w HAha - 1 9", 1, 28 }, + { "rq1bkn1r/ppppp2p/3n4/5pp1/2b3P1/1N1P1P2/PPP1P2P/RQ1BKNBR w HAha - 1 9", 2, 810 }, + { "rq1bkn1r/ppppp2p/3n4/5pp1/2b3P1/1N1P1P2/PPP1P2P/RQ1BKNBR w HAha - 1 9", 3, 22667 }, + { "rq1bkn1r/ppppp2p/3n4/5pp1/2b3P1/1N1P1P2/PPP1P2P/RQ1BKNBR w HAha - 1 9", 4, 657520 }, + { "rq1bkn1r/ppppp2p/3n4/5pp1/2b3P1/1N1P1P2/PPP1P2P/RQ1BKNBR w HAha - 1 9", 5, 18719949 }, + { "rq1bkn1r/ppppp2p/3n4/5pp1/2b3P1/1N1P1P2/PPP1P2P/RQ1BKNBR w HAha - 1 9", 6, 556282676 }, + { "r1nknbbr/p2ppp1p/1pp3p1/8/1P6/4P3/P1PPNPPq/R1QKNBBR w HAha - 0 9", 1, 24 }, + { "r1nknbbr/p2ppp1p/1pp3p1/8/1P6/4P3/P1PPNPPq/R1QKNBBR w HAha - 0 9", 2, 797 }, + { "r1nknbbr/p2ppp1p/1pp3p1/8/1P6/4P3/P1PPNPPq/R1QKNBBR w HAha - 0 9", 3, 22144 }, + { "r1nknbbr/p2ppp1p/1pp3p1/8/1P6/4P3/P1PPNPPq/R1QKNBBR w HAha - 0 9", 4, 719069 }, + { "r1nknbbr/p2ppp1p/1pp3p1/8/1P6/4P3/P1PPNPPq/R1QKNBBR w HAha - 0 9", 5, 21862776 }, + { "r1nknbbr/p2ppp1p/1pp3p1/8/1P6/4P3/P1PPNPPq/R1QKNBBR w HAha - 0 9", 6, 716521139 }, + { "rqnknrbb/ppp1p3/5ppp/2Np4/2P5/4P3/PP1P1PPP/RQNK1RBB w FAfa - 0 9", 1, 34 }, + { "rqnknrbb/ppp1p3/5ppp/2Np4/2P5/4P3/PP1P1PPP/RQNK1RBB w FAfa - 0 9", 2, 686 }, + { "rqnknrbb/ppp1p3/5ppp/2Np4/2P5/4P3/PP1P1PPP/RQNK1RBB w FAfa - 0 9", 3, 23277 }, + { "rqnknrbb/ppp1p3/5ppp/2Np4/2P5/4P3/PP1P1PPP/RQNK1RBB w FAfa - 0 9", 4, 515541 }, + { "rqnknrbb/ppp1p3/5ppp/2Np4/2P5/4P3/PP1P1PPP/RQNK1RBB w FAfa - 0 9", 5, 17664543 }, + { "rqnknrbb/ppp1p3/5ppp/2Np4/2P5/4P3/PP1P1PPP/RQNK1RBB w FAfa - 0 9", 6, 423574794 }, + { "1brnqknr/2p1pppp/p2p4/1P6/6P1/4Nb2/PP1PPP1P/BBR1QKNR w HChc - 1 9", 1, 34 }, + { "1brnqknr/2p1pppp/p2p4/1P6/6P1/4Nb2/PP1PPP1P/BBR1QKNR w HChc - 1 9", 2, 1019 }, + { "1brnqknr/2p1pppp/p2p4/1P6/6P1/4Nb2/PP1PPP1P/BBR1QKNR w HChc - 1 9", 3, 32982 }, + { "1brnqknr/2p1pppp/p2p4/1P6/6P1/4Nb2/PP1PPP1P/BBR1QKNR w HChc - 1 9", 4, 1003103 }, + { "1brnqknr/2p1pppp/p2p4/1P6/6P1/4Nb2/PP1PPP1P/BBR1QKNR w HChc - 1 9", 5, 33322477 }, + { "1brnqknr/2p1pppp/p2p4/1P6/6P1/4Nb2/PP1PPP1P/BBR1QKNR w HChc - 1 9", 6, 1043293394 }, + { "brn1qknr/1p1pppp1/pb5p/Q1p5/3P3P/8/PPP1PPPR/BRNB1KN1 w Bhb - 2 9", 1, 32 }, + { "brn1qknr/1p1pppp1/pb5p/Q1p5/3P3P/8/PPP1PPPR/BRNB1KN1 w Bhb - 2 9", 2, 642 }, + { "brn1qknr/1p1pppp1/pb5p/Q1p5/3P3P/8/PPP1PPPR/BRNB1KN1 w Bhb - 2 9", 3, 20952 }, + { "brn1qknr/1p1pppp1/pb5p/Q1p5/3P3P/8/PPP1PPPR/BRNB1KN1 w Bhb - 2 9", 4, 464895 }, + { "brn1qknr/1p1pppp1/pb5p/Q1p5/3P3P/8/PPP1PPPR/BRNB1KN1 w Bhb - 2 9", 5, 15454749 }, + { "brn1qknr/1p1pppp1/pb5p/Q1p5/3P3P/8/PPP1PPPR/BRNB1KN1 w Bhb - 2 9", 6, 371861782 }, + { "brnqkbnr/pppppp2/8/6pp/6P1/P2P1P2/1PP1P2P/BRNQKBNR w HBhb - 0 9", 1, 20 }, + { "brnqkbnr/pppppp2/8/6pp/6P1/P2P1P2/1PP1P2P/BRNQKBNR w HBhb - 0 9", 2, 441 }, + { "brnqkbnr/pppppp2/8/6pp/6P1/P2P1P2/1PP1P2P/BRNQKBNR w HBhb - 0 9", 3, 9782 }, + { "brnqkbnr/pppppp2/8/6pp/6P1/P2P1P2/1PP1P2P/BRNQKBNR w HBhb - 0 9", 4, 240220 }, + { "brnqkbnr/pppppp2/8/6pp/6P1/P2P1P2/1PP1P2P/BRNQKBNR w HBhb - 0 9", 5, 5770284 }, + { "brnqkbnr/pppppp2/8/6pp/6P1/P2P1P2/1PP1P2P/BRNQKBNR w HBhb - 0 9", 6, 153051835 }, + { "2nqknrb/1rpppppp/5B2/pp6/1PP1b3/3P4/P3PPPP/1RNQKNRB w GBg - 1 9", 1, 35 }, + { "2nqknrb/1rpppppp/5B2/pp6/1PP1b3/3P4/P3PPPP/1RNQKNRB w GBg - 1 9", 2, 1042 }, + { "2nqknrb/1rpppppp/5B2/pp6/1PP1b3/3P4/P3PPPP/1RNQKNRB w GBg - 1 9", 3, 36238 }, + { "2nqknrb/1rpppppp/5B2/pp6/1PP1b3/3P4/P3PPPP/1RNQKNRB w GBg - 1 9", 4, 1101159 }, + { "2nqknrb/1rpppppp/5B2/pp6/1PP1b3/3P4/P3PPPP/1RNQKNRB w GBg - 1 9", 5, 38505058 }, + { "2nqknrb/1rpppppp/5B2/pp6/1PP1b3/3P4/P3PPPP/1RNQKNRB w GBg - 1 9", 6, 1202668717 }, + { "rb1nqknr/1pp1pppp/8/3p4/p2P4/6PN/PPPQPP1P/RBBN1K1R w HAha - 0 9", 1, 29 }, + { "rb1nqknr/1pp1pppp/8/3p4/p2P4/6PN/PPPQPP1P/RBBN1K1R w HAha - 0 9", 2, 692 }, + { "rb1nqknr/1pp1pppp/8/3p4/p2P4/6PN/PPPQPP1P/RBBN1K1R w HAha - 0 9", 3, 21237 }, + { "rb1nqknr/1pp1pppp/8/3p4/p2P4/6PN/PPPQPP1P/RBBN1K1R w HAha - 0 9", 4, 555018 }, + { "rb1nqknr/1pp1pppp/8/3p4/p2P4/6PN/PPPQPP1P/RBBN1K1R w HAha - 0 9", 5, 17820605 }, + { "rb1nqknr/1pp1pppp/8/3p4/p2P4/6PN/PPPQPP1P/RBBN1K1R w HAha - 0 9", 6, 497251206 }, + { "rnbbqknr/pppp4/5p2/4p1pp/P7/2N2PP1/1PPPP2P/R1BBQKNR w HAha - 0 9", 1, 23 }, + { "rnbbqknr/pppp4/5p2/4p1pp/P7/2N2PP1/1PPPP2P/R1BBQKNR w HAha - 0 9", 2, 595 }, + { "rnbbqknr/pppp4/5p2/4p1pp/P7/2N2PP1/1PPPP2P/R1BBQKNR w HAha - 0 9", 3, 14651 }, + { "rnbbqknr/pppp4/5p2/4p1pp/P7/2N2PP1/1PPPP2P/R1BBQKNR w HAha - 0 9", 4, 415772 }, + { "rnbbqknr/pppp4/5p2/4p1pp/P7/2N2PP1/1PPPP2P/R1BBQKNR w HAha - 0 9", 5, 10881112 }, + { "rnbbqknr/pppp4/5p2/4p1pp/P7/2N2PP1/1PPPP2P/R1BBQKNR w HAha - 0 9", 6, 329010121 }, + { "rn1qkbnr/p1p1pp1p/bp4p1/3p4/1P6/4P3/P1PP1PPP/RNBQKBNR w HAha - 0 9", 1, 30 }, + { "rn1qkbnr/p1p1pp1p/bp4p1/3p4/1P6/4P3/P1PP1PPP/RNBQKBNR w HAha - 0 9", 2, 794 }, + { "rn1qkbnr/p1p1pp1p/bp4p1/3p4/1P6/4P3/P1PP1PPP/RNBQKBNR w HAha - 0 9", 3, 24319 }, + { "rn1qkbnr/p1p1pp1p/bp4p1/3p4/1P6/4P3/P1PP1PPP/RNBQKBNR w HAha - 0 9", 4, 690811 }, + { "rn1qkbnr/p1p1pp1p/bp4p1/3p4/1P6/4P3/P1PP1PPP/RNBQKBNR w HAha - 0 9", 5, 21657601 }, + { "rn1qkbnr/p1p1pp1p/bp4p1/3p4/1P6/4P3/P1PP1PPP/RNBQKBNR w HAha - 0 9", 6, 647745807 }, + { "r1bqk1rb/pppnpppp/5n2/3p4/2P3PP/2N5/PP1PPP2/R1BQKNRB w GAga - 1 9", 1, 32 }, + { "r1bqk1rb/pppnpppp/5n2/3p4/2P3PP/2N5/PP1PPP2/R1BQKNRB w GAga - 1 9", 2, 821 }, + { "r1bqk1rb/pppnpppp/5n2/3p4/2P3PP/2N5/PP1PPP2/R1BQKNRB w GAga - 1 9", 3, 27121 }, + { "r1bqk1rb/pppnpppp/5n2/3p4/2P3PP/2N5/PP1PPP2/R1BQKNRB w GAga - 1 9", 4, 733155 }, + { "r1bqk1rb/pppnpppp/5n2/3p4/2P3PP/2N5/PP1PPP2/R1BQKNRB w GAga - 1 9", 5, 24923473 }, + { "r1bqk1rb/pppnpppp/5n2/3p4/2P3PP/2N5/PP1PPP2/R1BQKNRB w GAga - 1 9", 6, 710765657 }, + { "rbnqbknr/1p1ppp1p/6p1/p1p5/7P/3P4/PPP1PPP1/RBNQBKNR w HAha - 0 9", 1, 24 }, + { "rbnqbknr/1p1ppp1p/6p1/p1p5/7P/3P4/PPP1PPP1/RBNQBKNR w HAha - 0 9", 2, 720 }, + { "rbnqbknr/1p1ppp1p/6p1/p1p5/7P/3P4/PPP1PPP1/RBNQBKNR w HAha - 0 9", 3, 18842 }, + { "rbnqbknr/1p1ppp1p/6p1/p1p5/7P/3P4/PPP1PPP1/RBNQBKNR w HAha - 0 9", 4, 575027 }, + { "rbnqbknr/1p1ppp1p/6p1/p1p5/7P/3P4/PPP1PPP1/RBNQBKNR w HAha - 0 9", 5, 15992882 }, + { "rbnqbknr/1p1ppp1p/6p1/p1p5/7P/3P4/PPP1PPP1/RBNQBKNR w HAha - 0 9", 6, 501093456 }, + { "r1qbbk1r/pp1ppppp/n1p5/5n2/B1P3P1/8/PP1PPP1P/RNQ1BKNR w HAha - 0 9", 1, 27 }, + { "r1qbbk1r/pp1ppppp/n1p5/5n2/B1P3P1/8/PP1PPP1P/RNQ1BKNR w HAha - 0 9", 2, 831 }, + { "r1qbbk1r/pp1ppppp/n1p5/5n2/B1P3P1/8/PP1PPP1P/RNQ1BKNR w HAha - 0 9", 3, 22293 }, + { "r1qbbk1r/pp1ppppp/n1p5/5n2/B1P3P1/8/PP1PPP1P/RNQ1BKNR w HAha - 0 9", 4, 698986 }, + { "r1qbbk1r/pp1ppppp/n1p5/5n2/B1P3P1/8/PP1PPP1P/RNQ1BKNR w HAha - 0 9", 5, 19948650 }, + { "r1qbbk1r/pp1ppppp/n1p5/5n2/B1P3P1/8/PP1PPP1P/RNQ1BKNR w HAha - 0 9", 6, 637973209 }, + { "rnqkbb1r/p1pppppp/8/8/1p4n1/PP4PP/2PPPP2/RNQKBBNR w HAha - 0 9", 1, 18 }, + { "rnqkbb1r/p1pppppp/8/8/1p4n1/PP4PP/2PPPP2/RNQKBBNR w HAha - 0 9", 2, 463 }, + { "rnqkbb1r/p1pppppp/8/8/1p4n1/PP4PP/2PPPP2/RNQKBBNR w HAha - 0 9", 3, 9519 }, + { "rnqkbb1r/p1pppppp/8/8/1p4n1/PP4PP/2PPPP2/RNQKBBNR w HAha - 0 9", 4, 256152 }, + { "rnqkbb1r/p1pppppp/8/8/1p4n1/PP4PP/2PPPP2/RNQKBBNR w HAha - 0 9", 5, 6065231 }, + { "rnqkbb1r/p1pppppp/8/8/1p4n1/PP4PP/2PPPP2/RNQKBBNR w HAha - 0 9", 6, 172734380 }, + { "rnqk1nrb/pppbpp2/7p/3p2p1/4B3/2N1N1P1/PPPPPP1P/R1QKB1R1 w GAga - 0 9", 1, 34 }, + { "rnqk1nrb/pppbpp2/7p/3p2p1/4B3/2N1N1P1/PPPPPP1P/R1QKB1R1 w GAga - 0 9", 2, 1171 }, + { "rnqk1nrb/pppbpp2/7p/3p2p1/4B3/2N1N1P1/PPPPPP1P/R1QKB1R1 w GAga - 0 9", 3, 38128 }, + { "rnqk1nrb/pppbpp2/7p/3p2p1/4B3/2N1N1P1/PPPPPP1P/R1QKB1R1 w GAga - 0 9", 4, 1318217 }, + { "rnqk1nrb/pppbpp2/7p/3p2p1/4B3/2N1N1P1/PPPPPP1P/R1QKB1R1 w GAga - 0 9", 5, 42109356 }, + { "rnqk1nrb/pppbpp2/7p/3p2p1/4B3/2N1N1P1/PPPPPP1P/R1QKB1R1 w GAga - 0 9", 6, 1465473753 }, + { "rbnqknbr/1pp1ppp1/3p4/7p/p2P2PP/2P5/PP2PP2/RBNQKNBR w HAha - 0 9", 1, 32 }, + { "rbnqknbr/1pp1ppp1/3p4/7p/p2P2PP/2P5/PP2PP2/RBNQKNBR w HAha - 0 9", 2, 867 }, + { "rbnqknbr/1pp1ppp1/3p4/7p/p2P2PP/2P5/PP2PP2/RBNQKNBR w HAha - 0 9", 3, 28342 }, + { "rbnqknbr/1pp1ppp1/3p4/7p/p2P2PP/2P5/PP2PP2/RBNQKNBR w HAha - 0 9", 4, 798722 }, + { "rbnqknbr/1pp1ppp1/3p4/7p/p2P2PP/2P5/PP2PP2/RBNQKNBR w HAha - 0 9", 5, 26632459 }, + { "rbnqknbr/1pp1ppp1/3p4/7p/p2P2PP/2P5/PP2PP2/RBNQKNBR w HAha - 0 9", 6, 781067145 }, + { "rn1bknbr/pq2pppp/1p6/2pp4/P7/1P1P4/2PNPPPP/RNQBK1BR w HAha - 0 9", 1, 24 }, + { "rn1bknbr/pq2pppp/1p6/2pp4/P7/1P1P4/2PNPPPP/RNQBK1BR w HAha - 0 9", 2, 627 }, + { "rn1bknbr/pq2pppp/1p6/2pp4/P7/1P1P4/2PNPPPP/RNQBK1BR w HAha - 0 9", 3, 16652 }, + { "rn1bknbr/pq2pppp/1p6/2pp4/P7/1P1P4/2PNPPPP/RNQBK1BR w HAha - 0 9", 4, 462942 }, + { "rn1bknbr/pq2pppp/1p6/2pp4/P7/1P1P4/2PNPPPP/RNQBK1BR w HAha - 0 9", 5, 13200921 }, + { "rn1bknbr/pq2pppp/1p6/2pp4/P7/1P1P4/2PNPPPP/RNQBK1BR w HAha - 0 9", 6, 385193532 }, + { "r1qk1bbr/ppp1pp1p/2np1n2/6p1/2PP4/3BP3/PP3PPP/RNQKN1BR w HAha - 2 9", 1, 31 }, + { "r1qk1bbr/ppp1pp1p/2np1n2/6p1/2PP4/3BP3/PP3PPP/RNQKN1BR w HAha - 2 9", 2, 992 }, + { "r1qk1bbr/ppp1pp1p/2np1n2/6p1/2PP4/3BP3/PP3PPP/RNQKN1BR w HAha - 2 9", 3, 30213 }, + { "r1qk1bbr/ppp1pp1p/2np1n2/6p1/2PP4/3BP3/PP3PPP/RNQKN1BR w HAha - 2 9", 4, 986631 }, + { "r1qk1bbr/ppp1pp1p/2np1n2/6p1/2PP4/3BP3/PP3PPP/RNQKN1BR w HAha - 2 9", 5, 30397368 }, + { "r1qk1bbr/ppp1pp1p/2np1n2/6p1/2PP4/3BP3/PP3PPP/RNQKN1BR w HAha - 2 9", 6, 1011631987 }, + { "r1qknrbb/pppp1p2/2n3p1/4p2p/8/QPP5/P1NPPPPP/RN1K1RBB w FAfa - 2 9", 1, 30 }, + { "r1qknrbb/pppp1p2/2n3p1/4p2p/8/QPP5/P1NPPPPP/RN1K1RBB w FAfa - 2 9", 2, 702 }, + { "r1qknrbb/pppp1p2/2n3p1/4p2p/8/QPP5/P1NPPPPP/RN1K1RBB w FAfa - 2 9", 3, 21563 }, + { "r1qknrbb/pppp1p2/2n3p1/4p2p/8/QPP5/P1NPPPPP/RN1K1RBB w FAfa - 2 9", 4, 532939 }, + { "r1qknrbb/pppp1p2/2n3p1/4p2p/8/QPP5/P1NPPPPP/RN1K1RBB w FAfa - 2 9", 5, 16813114 }, + { "r1qknrbb/pppp1p2/2n3p1/4p2p/8/QPP5/P1NPPPPP/RN1K1RBB w FAfa - 2 9", 6, 438096194 }, + { "bbkr1qnr/2pppppp/2n5/pp6/8/PPN5/1BPPPPPP/1BR1KQNR w HC - 2 9", 1, 25 }, + { "bbkr1qnr/2pppppp/2n5/pp6/8/PPN5/1BPPPPPP/1BR1KQNR w HC - 2 9", 2, 573 }, + { "bbkr1qnr/2pppppp/2n5/pp6/8/PPN5/1BPPPPPP/1BR1KQNR w HC - 2 9", 3, 15183 }, + { "bbkr1qnr/2pppppp/2n5/pp6/8/PPN5/1BPPPPPP/1BR1KQNR w HC - 2 9", 4, 380910 }, + { "bbkr1qnr/2pppppp/2n5/pp6/8/PPN5/1BPPPPPP/1BR1KQNR w HC - 2 9", 5, 10554668 }, + { "bbkr1qnr/2pppppp/2n5/pp6/8/PPN5/1BPPPPPP/1BR1KQNR w HC - 2 9", 6, 283975400 }, + { "1rnbkqnr/1bpppppp/1p6/7P/p2P4/5P2/PPP1P1P1/BRNBKQNR w HBhb - 0 9", 1, 21 }, + { "1rnbkqnr/1bpppppp/1p6/7P/p2P4/5P2/PPP1P1P1/BRNBKQNR w HBhb - 0 9", 2, 503 }, + { "1rnbkqnr/1bpppppp/1p6/7P/p2P4/5P2/PPP1P1P1/BRNBKQNR w HBhb - 0 9", 3, 11790 }, + { "1rnbkqnr/1bpppppp/1p6/7P/p2P4/5P2/PPP1P1P1/BRNBKQNR w HBhb - 0 9", 4, 301084 }, + { "1rnbkqnr/1bpppppp/1p6/7P/p2P4/5P2/PPP1P1P1/BRNBKQNR w HBhb - 0 9", 5, 7679979 }, + { "1rnbkqnr/1bpppppp/1p6/7P/p2P4/5P2/PPP1P1P1/BRNBKQNR w HBhb - 0 9", 6, 207799378 }, + { "brnkqbnr/2p1pppp/1p6/3p4/1pP5/P6P/3PPPP1/BRNKQBNR w HBhb - 0 9", 1, 28 }, + { "brnkqbnr/2p1pppp/1p6/3p4/1pP5/P6P/3PPPP1/BRNKQBNR w HBhb - 0 9", 2, 743 }, + { "brnkqbnr/2p1pppp/1p6/3p4/1pP5/P6P/3PPPP1/BRNKQBNR w HBhb - 0 9", 3, 21054 }, + { "brnkqbnr/2p1pppp/1p6/3p4/1pP5/P6P/3PPPP1/BRNKQBNR w HBhb - 0 9", 4, 587192 }, + { "brnkqbnr/2p1pppp/1p6/3p4/1pP5/P6P/3PPPP1/BRNKQBNR w HBhb - 0 9", 5, 17354516 }, + { "brnkqbnr/2p1pppp/1p6/3p4/1pP5/P6P/3PPPP1/BRNKQBNR w HBhb - 0 9", 6, 507176753 }, + { "br1kqnrb/npp1pppp/8/3p4/p4N2/PP6/2PPPPPP/BR1KQNRB w GBgb - 0 9", 1, 31 }, + { "br1kqnrb/npp1pppp/8/3p4/p4N2/PP6/2PPPPPP/BR1KQNRB w GBgb - 0 9", 2, 808 }, + { "br1kqnrb/npp1pppp/8/3p4/p4N2/PP6/2PPPPPP/BR1KQNRB w GBgb - 0 9", 3, 25585 }, + { "br1kqnrb/npp1pppp/8/3p4/p4N2/PP6/2PPPPPP/BR1KQNRB w GBgb - 0 9", 4, 698475 }, + { "br1kqnrb/npp1pppp/8/3p4/p4N2/PP6/2PPPPPP/BR1KQNRB w GBgb - 0 9", 5, 22376575 }, + { "br1kqnrb/npp1pppp/8/3p4/p4N2/PP6/2PPPPPP/BR1KQNRB w GBgb - 0 9", 6, 640362920 }, + { "rbbnkq1r/pppppp1p/7n/6p1/P5P1/2P2N2/1P1PPP1P/RBBNKQ1R w HAha - 1 9", 1, 29 }, + { "rbbnkq1r/pppppp1p/7n/6p1/P5P1/2P2N2/1P1PPP1P/RBBNKQ1R w HAha - 1 9", 2, 580 }, + { "rbbnkq1r/pppppp1p/7n/6p1/P5P1/2P2N2/1P1PPP1P/RBBNKQ1R w HAha - 1 9", 3, 17585 }, + { "rbbnkq1r/pppppp1p/7n/6p1/P5P1/2P2N2/1P1PPP1P/RBBNKQ1R w HAha - 1 9", 4, 404831 }, + { "rbbnkq1r/pppppp1p/7n/6p1/P5P1/2P2N2/1P1PPP1P/RBBNKQ1R w HAha - 1 9", 5, 12730970 }, + { "rbbnkq1r/pppppp1p/7n/6p1/P5P1/2P2N2/1P1PPP1P/RBBNKQ1R w HAha - 1 9", 6, 325226128 }, + { "rnbbk1nr/pp2qppp/2ppp3/8/3P4/P1N4N/1PP1PPPP/R1BBKQ1R w HAha - 0 9", 1, 29 }, + { "rnbbk1nr/pp2qppp/2ppp3/8/3P4/P1N4N/1PP1PPPP/R1BBKQ1R w HAha - 0 9", 2, 838 }, + { "rnbbk1nr/pp2qppp/2ppp3/8/3P4/P1N4N/1PP1PPPP/R1BBKQ1R w HAha - 0 9", 3, 24197 }, + { "rnbbk1nr/pp2qppp/2ppp3/8/3P4/P1N4N/1PP1PPPP/R1BBKQ1R w HAha - 0 9", 4, 721884 }, + { "rnbbk1nr/pp2qppp/2ppp3/8/3P4/P1N4N/1PP1PPPP/R1BBKQ1R w HAha - 0 9", 5, 21100580 }, + { "rnbbk1nr/pp2qppp/2ppp3/8/3P4/P1N4N/1PP1PPPP/R1BBKQ1R w HAha - 0 9", 6, 646624429 }, + { "rnbk1b1r/ppppn1pp/4pp2/7q/7P/P5PB/1PPPPP2/RNBKQ1NR w HAha - 3 9", 1, 20 }, + { "rnbk1b1r/ppppn1pp/4pp2/7q/7P/P5PB/1PPPPP2/RNBKQ1NR w HAha - 3 9", 2, 729 }, + { "rnbk1b1r/ppppn1pp/4pp2/7q/7P/P5PB/1PPPPP2/RNBKQ1NR w HAha - 3 9", 3, 16633 }, + { "rnbk1b1r/ppppn1pp/4pp2/7q/7P/P5PB/1PPPPP2/RNBKQ1NR w HAha - 3 9", 4, 576199 }, + { "rnbk1b1r/ppppn1pp/4pp2/7q/7P/P5PB/1PPPPP2/RNBKQ1NR w HAha - 3 9", 5, 14507076 }, + { "rnbk1b1r/ppppn1pp/4pp2/7q/7P/P5PB/1PPPPP2/RNBKQ1NR w HAha - 3 9", 6, 498621813 }, + { "r2kqnrb/pbppppp1/np5p/8/4Q1P1/3P4/PPP1PP1P/RNBK1NRB w GAga - 2 9", 1, 47 }, + { "r2kqnrb/pbppppp1/np5p/8/4Q1P1/3P4/PPP1PP1P/RNBK1NRB w GAga - 2 9", 2, 1219 }, + { "r2kqnrb/pbppppp1/np5p/8/4Q1P1/3P4/PPP1PP1P/RNBK1NRB w GAga - 2 9", 3, 55009 }, + { "r2kqnrb/pbppppp1/np5p/8/4Q1P1/3P4/PPP1PP1P/RNBK1NRB w GAga - 2 9", 4, 1486353 }, + { "r2kqnrb/pbppppp1/np5p/8/4Q1P1/3P4/PPP1PP1P/RNBK1NRB w GAga - 2 9", 5, 65239153 }, + { "r2kqnrb/pbppppp1/np5p/8/4Q1P1/3P4/PPP1PP1P/RNBK1NRB w GAga - 2 9", 6, 1834391369 }, + { "rbnkbq1r/p1p2ppp/1p2pn2/3p4/P3P3/3P4/1PP1KPPP/RBN1BQNR w ha - 2 9", 1, 29 }, + { "rbnkbq1r/p1p2ppp/1p2pn2/3p4/P3P3/3P4/1PP1KPPP/RBN1BQNR w ha - 2 9", 2, 923 }, + { "rbnkbq1r/p1p2ppp/1p2pn2/3p4/P3P3/3P4/1PP1KPPP/RBN1BQNR w ha - 2 9", 3, 27179 }, + { "rbnkbq1r/p1p2ppp/1p2pn2/3p4/P3P3/3P4/1PP1KPPP/RBN1BQNR w ha - 2 9", 4, 883866 }, + { "rbnkbq1r/p1p2ppp/1p2pn2/3p4/P3P3/3P4/1PP1KPPP/RBN1BQNR w ha - 2 9", 5, 26202752 }, + { "rbnkbq1r/p1p2ppp/1p2pn2/3p4/P3P3/3P4/1PP1KPPP/RBN1BQNR w ha - 2 9", 6, 868565895 }, + { "rk1bb1nr/ppppqppp/n7/1N2p3/6P1/7N/PPPPPP1P/R1KBBQ1R w HA - 6 9", 1, 27 }, + { "rk1bb1nr/ppppqppp/n7/1N2p3/6P1/7N/PPPPPP1P/R1KBBQ1R w HA - 6 9", 2, 703 }, + { "rk1bb1nr/ppppqppp/n7/1N2p3/6P1/7N/PPPPPP1P/R1KBBQ1R w HA - 6 9", 3, 19478 }, + { "rk1bb1nr/ppppqppp/n7/1N2p3/6P1/7N/PPPPPP1P/R1KBBQ1R w HA - 6 9", 4, 559525 }, + { "rk1bb1nr/ppppqppp/n7/1N2p3/6P1/7N/PPPPPP1P/R1KBBQ1R w HA - 6 9", 5, 16049807 }, + { "rk1bb1nr/ppppqppp/n7/1N2p3/6P1/7N/PPPPPP1P/R1KBBQ1R w HA - 6 9", 6, 492966455 }, + { "rnkqbbnr/p1ppp2p/1p4p1/8/1B3p1P/2NP4/PPP1PPP1/R1KQ1BNR w HAha - 0 9", 1, 29 }, + { "rnkqbbnr/p1ppp2p/1p4p1/8/1B3p1P/2NP4/PPP1PPP1/R1KQ1BNR w HAha - 0 9", 2, 610 }, + { "rnkqbbnr/p1ppp2p/1p4p1/8/1B3p1P/2NP4/PPP1PPP1/R1KQ1BNR w HAha - 0 9", 3, 18855 }, + { "rnkqbbnr/p1ppp2p/1p4p1/8/1B3p1P/2NP4/PPP1PPP1/R1KQ1BNR w HAha - 0 9", 4, 438277 }, + { "rnkqbbnr/p1ppp2p/1p4p1/8/1B3p1P/2NP4/PPP1PPP1/R1KQ1BNR w HAha - 0 9", 5, 14020041 }, + { "rnkqbbnr/p1ppp2p/1p4p1/8/1B3p1P/2NP4/PPP1PPP1/R1KQ1BNR w HAha - 0 9", 6, 355083962 }, + { "rnkqb1rb/pp1p1ppp/4p3/2P3n1/8/1PP5/P3PPPP/RNKQBNRB w GAga - 0 9", 1, 29 }, + { "rnkqb1rb/pp1p1ppp/4p3/2P3n1/8/1PP5/P3PPPP/RNKQBNRB w GAga - 0 9", 2, 675 }, + { "rnkqb1rb/pp1p1ppp/4p3/2P3n1/8/1PP5/P3PPPP/RNKQBNRB w GAga - 0 9", 3, 20699 }, + { "rnkqb1rb/pp1p1ppp/4p3/2P3n1/8/1PP5/P3PPPP/RNKQBNRB w GAga - 0 9", 4, 535821 }, + { "rnkqb1rb/pp1p1ppp/4p3/2P3n1/8/1PP5/P3PPPP/RNKQBNRB w GAga - 0 9", 5, 17000613 }, + { "rnkqb1rb/pp1p1ppp/4p3/2P3n1/8/1PP5/P3PPPP/RNKQBNRB w GAga - 0 9", 6, 476598337 }, + { "rb1kqnbr/pp1pp1p1/1np2p2/7p/P1P3PP/8/1P1PPP2/RBNKQNBR w HAha - 0 9", 1, 31 }, + { "rb1kqnbr/pp1pp1p1/1np2p2/7p/P1P3PP/8/1P1PPP2/RBNKQNBR w HAha - 0 9", 2, 1077 }, + { "rb1kqnbr/pp1pp1p1/1np2p2/7p/P1P3PP/8/1P1PPP2/RBNKQNBR w HAha - 0 9", 3, 33661 }, + { "rb1kqnbr/pp1pp1p1/1np2p2/7p/P1P3PP/8/1P1PPP2/RBNKQNBR w HAha - 0 9", 4, 1183381 }, + { "rb1kqnbr/pp1pp1p1/1np2p2/7p/P1P3PP/8/1P1PPP2/RBNKQNBR w HAha - 0 9", 5, 37415304 }, + { "rb1kqnbr/pp1pp1p1/1np2p2/7p/P1P3PP/8/1P1PPP2/RBNKQNBR w HAha - 0 9", 6, 1328374620 }, + { "rnkbq1br/ppp2ppp/3p4/Q3p1n1/5P2/3P2P1/PPP1P2P/RNKB1NBR w HAha - 0 9", 1, 41 }, + { "rnkbq1br/ppp2ppp/3p4/Q3p1n1/5P2/3P2P1/PPP1P2P/RNKB1NBR w HAha - 0 9", 2, 1201 }, + { "rnkbq1br/ppp2ppp/3p4/Q3p1n1/5P2/3P2P1/PPP1P2P/RNKB1NBR w HAha - 0 9", 3, 46472 }, + { "rnkbq1br/ppp2ppp/3p4/Q3p1n1/5P2/3P2P1/PPP1P2P/RNKB1NBR w HAha - 0 9", 4, 1420367 }, + { "rnkbq1br/ppp2ppp/3p4/Q3p1n1/5P2/3P2P1/PPP1P2P/RNKB1NBR w HAha - 0 9", 5, 52991625 }, + { "rnkbq1br/ppp2ppp/3p4/Q3p1n1/5P2/3P2P1/PPP1P2P/RNKB1NBR w HAha - 0 9", 6, 1675608008 }, + { "rn1qnbbr/pp2pppp/2ppk3/8/2PP4/3Q1N2/PP2PPPP/RNK2BBR w HA - 1 9", 1, 34 }, + { "rn1qnbbr/pp2pppp/2ppk3/8/2PP4/3Q1N2/PP2PPPP/RNK2BBR w HA - 1 9", 2, 666 }, + { "rn1qnbbr/pp2pppp/2ppk3/8/2PP4/3Q1N2/PP2PPPP/RNK2BBR w HA - 1 9", 3, 22474 }, + { "rn1qnbbr/pp2pppp/2ppk3/8/2PP4/3Q1N2/PP2PPPP/RNK2BBR w HA - 1 9", 4, 472299 }, + { "rn1qnbbr/pp2pppp/2ppk3/8/2PP4/3Q1N2/PP2PPPP/RNK2BBR w HA - 1 9", 5, 15860369 }, + { "rn1qnbbr/pp2pppp/2ppk3/8/2PP4/3Q1N2/PP2PPPP/RNK2BBR w HA - 1 9", 6, 353831792 }, + { "rnkqnr1b/ppppp1pp/5p2/8/Q1P2P2/8/PP1P2PP/RbK1NRBB w FAfa - 0 9", 1, 36 }, + { "rnkqnr1b/ppppp1pp/5p2/8/Q1P2P2/8/PP1P2PP/RbK1NRBB w FAfa - 0 9", 2, 876 }, + { "rnkqnr1b/ppppp1pp/5p2/8/Q1P2P2/8/PP1P2PP/RbK1NRBB w FAfa - 0 9", 3, 31987 }, + { "rnkqnr1b/ppppp1pp/5p2/8/Q1P2P2/8/PP1P2PP/RbK1NRBB w FAfa - 0 9", 4, 788580 }, + { "rnkqnr1b/ppppp1pp/5p2/8/Q1P2P2/8/PP1P2PP/RbK1NRBB w FAfa - 0 9", 5, 29022529 }, + { "rnkqnr1b/ppppp1pp/5p2/8/Q1P2P2/8/PP1P2PP/RbK1NRBB w FAfa - 0 9", 6, 736717252 }, + { "bbrn1nqr/ppp1k1pp/5p2/3pp3/7P/3PN3/PPP1PPP1/BBRK1NQR w - - 1 9", 1, 24 }, + { "bbrn1nqr/ppp1k1pp/5p2/3pp3/7P/3PN3/PPP1PPP1/BBRK1NQR w - - 1 9", 2, 583 }, + { "bbrn1nqr/ppp1k1pp/5p2/3pp3/7P/3PN3/PPP1PPP1/BBRK1NQR w - - 1 9", 3, 15063 }, + { "bbrn1nqr/ppp1k1pp/5p2/3pp3/7P/3PN3/PPP1PPP1/BBRK1NQR w - - 1 9", 4, 383532 }, + { "bbrn1nqr/ppp1k1pp/5p2/3pp3/7P/3PN3/PPP1PPP1/BBRK1NQR w - - 1 9", 5, 10522064 }, + { "bbrn1nqr/ppp1k1pp/5p2/3pp3/7P/3PN3/PPP1PPP1/BBRK1NQR w - - 1 9", 6, 280707118 }, + { "brnbkn1r/1pppp1p1/4q3/p4p1p/7P/1N3P2/PPPPP1PQ/BR1BKN1R w HBhb - 2 9", 1, 27 }, + { "brnbkn1r/1pppp1p1/4q3/p4p1p/7P/1N3P2/PPPPP1PQ/BR1BKN1R w HBhb - 2 9", 2, 935 }, + { "brnbkn1r/1pppp1p1/4q3/p4p1p/7P/1N3P2/PPPPP1PQ/BR1BKN1R w HBhb - 2 9", 3, 26120 }, + { "brnbkn1r/1pppp1p1/4q3/p4p1p/7P/1N3P2/PPPPP1PQ/BR1BKN1R w HBhb - 2 9", 4, 885699 }, + { "brnbkn1r/1pppp1p1/4q3/p4p1p/7P/1N3P2/PPPPP1PQ/BR1BKN1R w HBhb - 2 9", 5, 26000648 }, + { "brnbkn1r/1pppp1p1/4q3/p4p1p/7P/1N3P2/PPPPP1PQ/BR1BKN1R w HBhb - 2 9", 6, 873063158 }, + { "br1knbqr/pp2p1pp/1n6/2pp1p2/6P1/2P4B/PP1PPPQP/BRNKN2R w HBhb - 0 9", 1, 27 }, + { "br1knbqr/pp2p1pp/1n6/2pp1p2/6P1/2P4B/PP1PPPQP/BRNKN2R w HBhb - 0 9", 2, 681 }, + { "br1knbqr/pp2p1pp/1n6/2pp1p2/6P1/2P4B/PP1PPPQP/BRNKN2R w HBhb - 0 9", 3, 19202 }, + { "br1knbqr/pp2p1pp/1n6/2pp1p2/6P1/2P4B/PP1PPPQP/BRNKN2R w HBhb - 0 9", 4, 510687 }, + { "br1knbqr/pp2p1pp/1n6/2pp1p2/6P1/2P4B/PP1PPPQP/BRNKN2R w HBhb - 0 9", 5, 14954779 }, + { "br1knbqr/pp2p1pp/1n6/2pp1p2/6P1/2P4B/PP1PPPQP/BRNKN2R w HBhb - 0 9", 6, 415624943 }, + { "brnk1qrb/p1ppppp1/1p5p/8/P3n3/1N4P1/1PPPPPRP/BR1KNQ1B w Bgb - 0 9", 1, 22 }, + { "brnk1qrb/p1ppppp1/1p5p/8/P3n3/1N4P1/1PPPPPRP/BR1KNQ1B w Bgb - 0 9", 2, 638 }, + { "brnk1qrb/p1ppppp1/1p5p/8/P3n3/1N4P1/1PPPPPRP/BR1KNQ1B w Bgb - 0 9", 3, 13991 }, + { "brnk1qrb/p1ppppp1/1p5p/8/P3n3/1N4P1/1PPPPPRP/BR1KNQ1B w Bgb - 0 9", 4, 412346 }, + { "brnk1qrb/p1ppppp1/1p5p/8/P3n3/1N4P1/1PPPPPRP/BR1KNQ1B w Bgb - 0 9", 5, 9760752 }, + { "brnk1qrb/p1ppppp1/1p5p/8/P3n3/1N4P1/1PPPPPRP/BR1KNQ1B w Bgb - 0 9", 6, 293499724 }, + { "rbbnknqr/pppp3p/5pp1/8/1P1pP3/7P/P1P2PP1/RBBNKNQR w HAha - 0 9", 1, 29 }, + { "rbbnknqr/pppp3p/5pp1/8/1P1pP3/7P/P1P2PP1/RBBNKNQR w HAha - 0 9", 2, 756 }, + { "rbbnknqr/pppp3p/5pp1/8/1P1pP3/7P/P1P2PP1/RBBNKNQR w HAha - 0 9", 3, 21616 }, + { "rbbnknqr/pppp3p/5pp1/8/1P1pP3/7P/P1P2PP1/RBBNKNQR w HAha - 0 9", 4, 614074 }, + { "rbbnknqr/pppp3p/5pp1/8/1P1pP3/7P/P1P2PP1/RBBNKNQR w HAha - 0 9", 5, 17602252 }, + { "rbbnknqr/pppp3p/5pp1/8/1P1pP3/7P/P1P2PP1/RBBNKNQR w HAha - 0 9", 6, 528140595 }, + { "1nbbknqr/rpp1ppp1/1Q1p3p/p7/2P2PP1/8/PP1PP2P/RNBBKN1R w HAh - 2 9", 1, 37 }, + { "1nbbknqr/rpp1ppp1/1Q1p3p/p7/2P2PP1/8/PP1PP2P/RNBBKN1R w HAh - 2 9", 2, 977 }, + { "1nbbknqr/rpp1ppp1/1Q1p3p/p7/2P2PP1/8/PP1PP2P/RNBBKN1R w HAh - 2 9", 3, 34977 }, + { "1nbbknqr/rpp1ppp1/1Q1p3p/p7/2P2PP1/8/PP1PP2P/RNBBKN1R w HAh - 2 9", 4, 944867 }, + { "1nbbknqr/rpp1ppp1/1Q1p3p/p7/2P2PP1/8/PP1PP2P/RNBBKN1R w HAh - 2 9", 5, 33695089 }, + { "1nbbknqr/rpp1ppp1/1Q1p3p/p7/2P2PP1/8/PP1PP2P/RNBBKN1R w HAh - 2 9", 6, 940198007 }, + { "rnb2bqr/ppkpppp1/3n3p/2p5/6PP/2N2P2/PPPPP3/R1BKNBQR w HA - 2 9", 1, 30 }, + { "rnb2bqr/ppkpppp1/3n3p/2p5/6PP/2N2P2/PPPPP3/R1BKNBQR w HA - 2 9", 2, 647 }, + { "rnb2bqr/ppkpppp1/3n3p/2p5/6PP/2N2P2/PPPPP3/R1BKNBQR w HA - 2 9", 3, 20365 }, + { "rnb2bqr/ppkpppp1/3n3p/2p5/6PP/2N2P2/PPPPP3/R1BKNBQR w HA - 2 9", 4, 467780 }, + { "rnb2bqr/ppkpppp1/3n3p/2p5/6PP/2N2P2/PPPPP3/R1BKNBQR w HA - 2 9", 5, 15115531 }, + { "rnb2bqr/ppkpppp1/3n3p/2p5/6PP/2N2P2/PPPPP3/R1BKNBQR w HA - 2 9", 6, 369257622 }, + { "rn1k1qrb/p1pppppp/bp6/8/4n3/P4BPP/1PPPPP2/RNBKNQR1 w GAga - 2 9", 1, 22 }, + { "rn1k1qrb/p1pppppp/bp6/8/4n3/P4BPP/1PPPPP2/RNBKNQR1 w GAga - 2 9", 2, 670 }, + { "rn1k1qrb/p1pppppp/bp6/8/4n3/P4BPP/1PPPPP2/RNBKNQR1 w GAga - 2 9", 3, 14998 }, + { "rn1k1qrb/p1pppppp/bp6/8/4n3/P4BPP/1PPPPP2/RNBKNQR1 w GAga - 2 9", 4, 451517 }, + { "rn1k1qrb/p1pppppp/bp6/8/4n3/P4BPP/1PPPPP2/RNBKNQR1 w GAga - 2 9", 5, 11199653 }, + { "rn1k1qrb/p1pppppp/bp6/8/4n3/P4BPP/1PPPPP2/RNBKNQR1 w GAga - 2 9", 6, 339919682 }, + { "rb2bnqr/nppkpppp/3p4/p7/1P6/P2N2P1/2PPPP1P/RB1KBNQR w HA - 3 9", 1, 22 }, + { "rb2bnqr/nppkpppp/3p4/p7/1P6/P2N2P1/2PPPP1P/RB1KBNQR w HA - 3 9", 2, 479 }, + { "rb2bnqr/nppkpppp/3p4/p7/1P6/P2N2P1/2PPPP1P/RB1KBNQR w HA - 3 9", 3, 11475 }, + { "rb2bnqr/nppkpppp/3p4/p7/1P6/P2N2P1/2PPPP1P/RB1KBNQR w HA - 3 9", 4, 264739 }, + { "rb2bnqr/nppkpppp/3p4/p7/1P6/P2N2P1/2PPPP1P/RB1KBNQR w HA - 3 9", 5, 6831555 }, + { "rb2bnqr/nppkpppp/3p4/p7/1P6/P2N2P1/2PPPP1P/RB1KBNQR w HA - 3 9", 6, 167329117 }, + { "r1kbb1qr/2pppppp/np2n3/p7/2P3P1/8/PP1PPPQP/RNKBBN1R w HAha - 1 9", 1, 32 }, + { "r1kbb1qr/2pppppp/np2n3/p7/2P3P1/8/PP1PPPQP/RNKBBN1R w HAha - 1 9", 2, 723 }, + { "r1kbb1qr/2pppppp/np2n3/p7/2P3P1/8/PP1PPPQP/RNKBBN1R w HAha - 1 9", 3, 23953 }, + { "r1kbb1qr/2pppppp/np2n3/p7/2P3P1/8/PP1PPPQP/RNKBBN1R w HAha - 1 9", 4, 581832 }, + { "r1kbb1qr/2pppppp/np2n3/p7/2P3P1/8/PP1PPPQP/RNKBBN1R w HAha - 1 9", 5, 19472074 }, + { "r1kbb1qr/2pppppp/np2n3/p7/2P3P1/8/PP1PPPQP/RNKBBN1R w HAha - 1 9", 6, 504622114 }, + { "rnknbb1r/p1ppp1pp/8/1p1P1p1q/8/P1P5/1P2PPPP/RNKNBBQR w HAha - 1 9", 1, 19 }, + { "rnknbb1r/p1ppp1pp/8/1p1P1p1q/8/P1P5/1P2PPPP/RNKNBBQR w HAha - 1 9", 2, 607 }, + { "rnknbb1r/p1ppp1pp/8/1p1P1p1q/8/P1P5/1P2PPPP/RNKNBBQR w HAha - 1 9", 3, 12733 }, + { "rnknbb1r/p1ppp1pp/8/1p1P1p1q/8/P1P5/1P2PPPP/RNKNBBQR w HAha - 1 9", 4, 417451 }, + { "rnknbb1r/p1ppp1pp/8/1p1P1p1q/8/P1P5/1P2PPPP/RNKNBBQR w HAha - 1 9", 5, 9753617 }, + { "rnknbb1r/p1ppp1pp/8/1p1P1p1q/8/P1P5/1P2PPPP/RNKNBBQR w HAha - 1 9", 6, 325177085 }, + { "rnkn1qrb/pp1bp1pp/2p5/1N1p1p2/8/2P5/PPKPPPPP/R2NBQRB w ga - 2 9", 1, 27 }, + { "rnkn1qrb/pp1bp1pp/2p5/1N1p1p2/8/2P5/PPKPPPPP/R2NBQRB w ga - 2 9", 2, 533 }, + { "rnkn1qrb/pp1bp1pp/2p5/1N1p1p2/8/2P5/PPKPPPPP/R2NBQRB w ga - 2 9", 3, 14549 }, + { "rnkn1qrb/pp1bp1pp/2p5/1N1p1p2/8/2P5/PPKPPPPP/R2NBQRB w ga - 2 9", 4, 330747 }, + { "rnkn1qrb/pp1bp1pp/2p5/1N1p1p2/8/2P5/PPKPPPPP/R2NBQRB w ga - 2 9", 5, 9206957 }, + { "rnkn1qrb/pp1bp1pp/2p5/1N1p1p2/8/2P5/PPKPPPPP/R2NBQRB w ga - 2 9", 6, 232664675 }, + { "r1nknqbr/pp2p1pp/2p2p2/3p4/6P1/PP1P4/2P1PP1b/RBNKNQBR w HAha - 0 9", 1, 20 }, + { "r1nknqbr/pp2p1pp/2p2p2/3p4/6P1/PP1P4/2P1PP1b/RBNKNQBR w HAha - 0 9", 2, 582 }, + { "r1nknqbr/pp2p1pp/2p2p2/3p4/6P1/PP1P4/2P1PP1b/RBNKNQBR w HAha - 0 9", 3, 13777 }, + { "r1nknqbr/pp2p1pp/2p2p2/3p4/6P1/PP1P4/2P1PP1b/RBNKNQBR w HAha - 0 9", 4, 409166 }, + { "r1nknqbr/pp2p1pp/2p2p2/3p4/6P1/PP1P4/2P1PP1b/RBNKNQBR w HAha - 0 9", 5, 10708639 }, + { "r1nknqbr/pp2p1pp/2p2p2/3p4/6P1/PP1P4/2P1PP1b/RBNKNQBR w HAha - 0 9", 6, 326565393 }, + { "rnkb1qbr/p1pp1p1p/1p2pn2/1Q4p1/4P3/N4P2/PPPP2PP/R1KBN1BR w HAha - 0 9", 1, 40 }, + { "rnkb1qbr/p1pp1p1p/1p2pn2/1Q4p1/4P3/N4P2/PPPP2PP/R1KBN1BR w HAha - 0 9", 2, 1038 }, + { "rnkb1qbr/p1pp1p1p/1p2pn2/1Q4p1/4P3/N4P2/PPPP2PP/R1KBN1BR w HAha - 0 9", 3, 39356 }, + { "rnkb1qbr/p1pp1p1p/1p2pn2/1Q4p1/4P3/N4P2/PPPP2PP/R1KBN1BR w HAha - 0 9", 4, 1051441 }, + { "rnkb1qbr/p1pp1p1p/1p2pn2/1Q4p1/4P3/N4P2/PPPP2PP/R1KBN1BR w HAha - 0 9", 5, 39145902 }, + { "rnkb1qbr/p1pp1p1p/1p2pn2/1Q4p1/4P3/N4P2/PPPP2PP/R1KBN1BR w HAha - 0 9", 6, 1079612614 }, + { "rn2qbbr/1pkppp1p/p3n1p1/8/8/2P2P2/PP1PP1PP/RNKN1BBR w HA - 0 9", 1, 24 }, + { "rn2qbbr/1pkppp1p/p3n1p1/8/8/2P2P2/PP1PP1PP/RNKN1BBR w HA - 0 9", 2, 605 }, + { "rn2qbbr/1pkppp1p/p3n1p1/8/8/2P2P2/PP1PP1PP/RNKN1BBR w HA - 0 9", 3, 14888 }, + { "rn2qbbr/1pkppp1p/p3n1p1/8/8/2P2P2/PP1PP1PP/RNKN1BBR w HA - 0 9", 4, 385964 }, + { "rn2qbbr/1pkppp1p/p3n1p1/8/8/2P2P2/PP1PP1PP/RNKN1BBR w HA - 0 9", 5, 9687507 }, + { "rn2qbbr/1pkppp1p/p3n1p1/8/8/2P2P2/PP1PP1PP/RNKN1BBR w HA - 0 9", 6, 260874068 }, + { "rn1nqrbb/p1kppp1p/8/1pp3p1/1P6/2N1P3/P1PP1PPP/RK1NQRBB w - - 0 9", 1, 21 }, + { "rn1nqrbb/p1kppp1p/8/1pp3p1/1P6/2N1P3/P1PP1PPP/RK1NQRBB w - - 0 9", 2, 540 }, + { "rn1nqrbb/p1kppp1p/8/1pp3p1/1P6/2N1P3/P1PP1PPP/RK1NQRBB w - - 0 9", 3, 12489 }, + { "rn1nqrbb/p1kppp1p/8/1pp3p1/1P6/2N1P3/P1PP1PPP/RK1NQRBB w - - 0 9", 4, 337997 }, + { "rn1nqrbb/p1kppp1p/8/1pp3p1/1P6/2N1P3/P1PP1PPP/RK1NQRBB w - - 0 9", 5, 8436136 }, + { "rn1nqrbb/p1kppp1p/8/1pp3p1/1P6/2N1P3/P1PP1PPP/RK1NQRBB w - - 0 9", 6, 237525904 }, + { "bbrnknrq/1pp3pp/p2p1p2/4p3/P7/1P2N3/2PPPPPP/BBRN1RKQ w gc - 0 9", 1, 24 }, + { "bbrnknrq/1pp3pp/p2p1p2/4p3/P7/1P2N3/2PPPPPP/BBRN1RKQ w gc - 0 9", 2, 527 }, + { "bbrnknrq/1pp3pp/p2p1p2/4p3/P7/1P2N3/2PPPPPP/BBRN1RKQ w gc - 0 9", 3, 13900 }, + { "bbrnknrq/1pp3pp/p2p1p2/4p3/P7/1P2N3/2PPPPPP/BBRN1RKQ w gc - 0 9", 4, 326175 }, + { "bbrnknrq/1pp3pp/p2p1p2/4p3/P7/1P2N3/2PPPPPP/BBRN1RKQ w gc - 0 9", 5, 9139962 }, + { "bbrnknrq/1pp3pp/p2p1p2/4p3/P7/1P2N3/2PPPPPP/BBRN1RKQ w gc - 0 9", 6, 226253685 }, + { "brnb1nrq/pppp1kpp/4p3/8/5p1P/P1P3P1/1P1PPP2/BRNBKNRQ w GB - 1 9", 1, 29 }, + { "brnb1nrq/pppp1kpp/4p3/8/5p1P/P1P3P1/1P1PPP2/BRNBKNRQ w GB - 1 9", 2, 773 }, + { "brnb1nrq/pppp1kpp/4p3/8/5p1P/P1P3P1/1P1PPP2/BRNBKNRQ w GB - 1 9", 3, 23904 }, + { "brnb1nrq/pppp1kpp/4p3/8/5p1P/P1P3P1/1P1PPP2/BRNBKNRQ w GB - 1 9", 4, 638768 }, + { "brnb1nrq/pppp1kpp/4p3/8/5p1P/P1P3P1/1P1PPP2/BRNBKNRQ w GB - 1 9", 5, 20503775 }, + { "brnb1nrq/pppp1kpp/4p3/8/5p1P/P1P3P1/1P1PPP2/BRNBKNRQ w GB - 1 9", 6, 560338709 }, + { "br1k1brq/ppppp2p/1n1n1pp1/8/P1P5/3P2P1/1P2PP1P/BRNKNBRQ w GBgb - 0 9", 1, 28 }, + { "br1k1brq/ppppp2p/1n1n1pp1/8/P1P5/3P2P1/1P2PP1P/BRNKNBRQ w GBgb - 0 9", 2, 811 }, + { "br1k1brq/ppppp2p/1n1n1pp1/8/P1P5/3P2P1/1P2PP1P/BRNKNBRQ w GBgb - 0 9", 3, 23550 }, + { "br1k1brq/ppppp2p/1n1n1pp1/8/P1P5/3P2P1/1P2PP1P/BRNKNBRQ w GBgb - 0 9", 4, 664880 }, + { "br1k1brq/ppppp2p/1n1n1pp1/8/P1P5/3P2P1/1P2PP1P/BRNKNBRQ w GBgb - 0 9", 5, 19913758 }, + { "br1k1brq/ppppp2p/1n1n1pp1/8/P1P5/3P2P1/1P2PP1P/BRNKNBRQ w GBgb - 0 9", 6, 565143976 }, + { "1r1knrqb/n1pppppp/p1b5/1p6/8/3N1P2/PPPPP1PP/BRNK1RQB w fb - 3 9", 1, 29 }, + { "1r1knrqb/n1pppppp/p1b5/1p6/8/3N1P2/PPPPP1PP/BRNK1RQB w fb - 3 9", 2, 753 }, + { "1r1knrqb/n1pppppp/p1b5/1p6/8/3N1P2/PPPPP1PP/BRNK1RQB w fb - 3 9", 3, 23210 }, + { "1r1knrqb/n1pppppp/p1b5/1p6/8/3N1P2/PPPPP1PP/BRNK1RQB w fb - 3 9", 4, 620019 }, + { "1r1knrqb/n1pppppp/p1b5/1p6/8/3N1P2/PPPPP1PP/BRNK1RQB w fb - 3 9", 5, 20044474 }, + { "1r1knrqb/n1pppppp/p1b5/1p6/8/3N1P2/PPPPP1PP/BRNK1RQB w fb - 3 9", 6, 558383603 }, + { "rbbnk1rq/pppppppp/8/3Pn3/8/4P1P1/PPP2P1P/RBBNKNRQ w GAga - 1 9", 1, 22 }, + { "rbbnk1rq/pppppppp/8/3Pn3/8/4P1P1/PPP2P1P/RBBNKNRQ w GAga - 1 9", 2, 551 }, + { "rbbnk1rq/pppppppp/8/3Pn3/8/4P1P1/PPP2P1P/RBBNKNRQ w GAga - 1 9", 3, 12619 }, + { "rbbnk1rq/pppppppp/8/3Pn3/8/4P1P1/PPP2P1P/RBBNKNRQ w GAga - 1 9", 4, 324608 }, + { "rbbnk1rq/pppppppp/8/3Pn3/8/4P1P1/PPP2P1P/RBBNKNRQ w GAga - 1 9", 5, 8204171 }, + { "rbbnk1rq/pppppppp/8/3Pn3/8/4P1P1/PPP2P1P/RBBNKNRQ w GAga - 1 9", 6, 217689974 }, + { "rnbbk1rq/2pppp1p/p3n1p1/1p6/P3N3/8/1PPPPPPP/RNBB1KRQ w ga - 0 9", 1, 26 }, + { "rnbbk1rq/2pppp1p/p3n1p1/1p6/P3N3/8/1PPPPPPP/RNBB1KRQ w ga - 0 9", 2, 742 }, + { "rnbbk1rq/2pppp1p/p3n1p1/1p6/P3N3/8/1PPPPPPP/RNBB1KRQ w ga - 0 9", 3, 20061 }, + { "rnbbk1rq/2pppp1p/p3n1p1/1p6/P3N3/8/1PPPPPPP/RNBB1KRQ w ga - 0 9", 4, 599527 }, + { "rnbbk1rq/2pppp1p/p3n1p1/1p6/P3N3/8/1PPPPPPP/RNBB1KRQ w ga - 0 9", 5, 16787080 }, + { "rnbbk1rq/2pppp1p/p3n1p1/1p6/P3N3/8/1PPPPPPP/RNBB1KRQ w ga - 0 9", 6, 525678162 }, + { "rnbkn1rq/ppppppb1/6p1/7p/2B2P2/1P2P3/P1PP2PP/RNBKN1RQ w GAga - 1 9", 1, 28 }, + { "rnbkn1rq/ppppppb1/6p1/7p/2B2P2/1P2P3/P1PP2PP/RNBKN1RQ w GAga - 1 9", 2, 799 }, + { "rnbkn1rq/ppppppb1/6p1/7p/2B2P2/1P2P3/P1PP2PP/RNBKN1RQ w GAga - 1 9", 3, 23210 }, + { "rnbkn1rq/ppppppb1/6p1/7p/2B2P2/1P2P3/P1PP2PP/RNBKN1RQ w GAga - 1 9", 4, 689436 }, + { "rnbkn1rq/ppppppb1/6p1/7p/2B2P2/1P2P3/P1PP2PP/RNBKN1RQ w GAga - 1 9", 5, 20755098 }, + { "rnbkn1rq/ppppppb1/6p1/7p/2B2P2/1P2P3/P1PP2PP/RNBKN1RQ w GAga - 1 9", 6, 639632905 }, + { "rn1knrqb/p2pppp1/b1p5/1p5p/2P2P2/1P6/P2PP1PP/RNBKNRQB w FAfa - 1 9", 1, 30 }, + { "rn1knrqb/p2pppp1/b1p5/1p5p/2P2P2/1P6/P2PP1PP/RNBKNRQB w FAfa - 1 9", 2, 579 }, + { "rn1knrqb/p2pppp1/b1p5/1p5p/2P2P2/1P6/P2PP1PP/RNBKNRQB w FAfa - 1 9", 3, 18481 }, + { "rn1knrqb/p2pppp1/b1p5/1p5p/2P2P2/1P6/P2PP1PP/RNBKNRQB w FAfa - 1 9", 4, 397545 }, + { "rn1knrqb/p2pppp1/b1p5/1p5p/2P2P2/1P6/P2PP1PP/RNBKNRQB w FAfa - 1 9", 5, 13257198 }, + { "rn1knrqb/p2pppp1/b1p5/1p5p/2P2P2/1P6/P2PP1PP/RNBKNRQB w FAfa - 1 9", 6, 311282465 }, + { "rbnkbnrq/pp2p1Np/2p2p2/8/3p4/8/PPPPPPPP/RBNKBR1Q w Aga - 0 9", 1, 23 }, + { "rbnkbnrq/pp2p1Np/2p2p2/8/3p4/8/PPPPPPPP/RBNKBR1Q w Aga - 0 9", 2, 670 }, + { "rbnkbnrq/pp2p1Np/2p2p2/8/3p4/8/PPPPPPPP/RBNKBR1Q w Aga - 0 9", 3, 16435 }, + { "rbnkbnrq/pp2p1Np/2p2p2/8/3p4/8/PPPPPPPP/RBNKBR1Q w Aga - 0 9", 4, 501883 }, + { "rbnkbnrq/pp2p1Np/2p2p2/8/3p4/8/PPPPPPPP/RBNKBR1Q w Aga - 0 9", 5, 13012378 }, + { "rbnkbnrq/pp2p1Np/2p2p2/8/3p4/8/PPPPPPPP/RBNKBR1Q w Aga - 0 9", 6, 411860744 }, + { "rk1bbnrq/ppp1pppp/n7/3p4/5P2/3P2NP/PPP1P1P1/RNKBB1RQ w GA - 0 9", 1, 26 }, + { "rk1bbnrq/ppp1pppp/n7/3p4/5P2/3P2NP/PPP1P1P1/RNKBB1RQ w GA - 0 9", 2, 597 }, + { "rk1bbnrq/ppp1pppp/n7/3p4/5P2/3P2NP/PPP1P1P1/RNKBB1RQ w GA - 0 9", 3, 16238 }, + { "rk1bbnrq/ppp1pppp/n7/3p4/5P2/3P2NP/PPP1P1P1/RNKBB1RQ w GA - 0 9", 4, 402506 }, + { "rk1bbnrq/ppp1pppp/n7/3p4/5P2/3P2NP/PPP1P1P1/RNKBB1RQ w GA - 0 9", 5, 11269462 }, + { "rk1bbnrq/ppp1pppp/n7/3p4/5P2/3P2NP/PPP1P1P1/RNKBB1RQ w GA - 0 9", 6, 296701249 }, + { "r1knbbrq/pppp2p1/2n1p2p/5p2/4P3/P1PP4/1P3PPP/RNKNBBRQ w GAga - 1 9", 1, 20 }, + { "r1knbbrq/pppp2p1/2n1p2p/5p2/4P3/P1PP4/1P3PPP/RNKNBBRQ w GAga - 1 9", 2, 596 }, + { "r1knbbrq/pppp2p1/2n1p2p/5p2/4P3/P1PP4/1P3PPP/RNKNBBRQ w GAga - 1 9", 3, 13091 }, + { "r1knbbrq/pppp2p1/2n1p2p/5p2/4P3/P1PP4/1P3PPP/RNKNBBRQ w GAga - 1 9", 4, 399069 }, + { "r1knbbrq/pppp2p1/2n1p2p/5p2/4P3/P1PP4/1P3PPP/RNKNBBRQ w GAga - 1 9", 5, 9416862 }, + { "r1knbbrq/pppp2p1/2n1p2p/5p2/4P3/P1PP4/1P3PPP/RNKNBBRQ w GAga - 1 9", 6, 293659781 }, + { "rnknbrqb/p1p1pp1p/3p4/1p1N2p1/8/N7/PPPPPPPP/1RK1BRQB w Ffa - 0 9", 1, 26 }, + { "rnknbrqb/p1p1pp1p/3p4/1p1N2p1/8/N7/PPPPPPPP/1RK1BRQB w Ffa - 0 9", 2, 724 }, + { "rnknbrqb/p1p1pp1p/3p4/1p1N2p1/8/N7/PPPPPPPP/1RK1BRQB w Ffa - 0 9", 3, 18942 }, + { "rnknbrqb/p1p1pp1p/3p4/1p1N2p1/8/N7/PPPPPPPP/1RK1BRQB w Ffa - 0 9", 4, 552040 }, + { "rnknbrqb/p1p1pp1p/3p4/1p1N2p1/8/N7/PPPPPPPP/1RK1BRQB w Ffa - 0 9", 5, 15257204 }, + { "rnknbrqb/p1p1pp1p/3p4/1p1N2p1/8/N7/PPPPPPPP/1RK1BRQB w Ffa - 0 9", 6, 461293885 }, + { "rbnknrb1/1p1ppp1p/p1p3p1/8/1P3P2/1R6/PqPPP1PP/RBNKN1BQ w Afa - 0 9", 1, 31 }, + { "rbnknrb1/1p1ppp1p/p1p3p1/8/1P3P2/1R6/PqPPP1PP/RBNKN1BQ w Afa - 0 9", 2, 1183 }, + { "rbnknrb1/1p1ppp1p/p1p3p1/8/1P3P2/1R6/PqPPP1PP/RBNKN1BQ w Afa - 0 9", 3, 34723 }, + { "rbnknrb1/1p1ppp1p/p1p3p1/8/1P3P2/1R6/PqPPP1PP/RBNKN1BQ w Afa - 0 9", 4, 1289502 }, + { "rbnknrb1/1p1ppp1p/p1p3p1/8/1P3P2/1R6/PqPPP1PP/RBNKN1BQ w Afa - 0 9", 5, 38722152 }, + { "rbnknrb1/1p1ppp1p/p1p3p1/8/1P3P2/1R6/PqPPP1PP/RBNKN1BQ w Afa - 0 9", 6, 1421492227 }, + { "rnkbnrbq/2p1ppp1/p7/1p1p3p/3P4/1P4P1/P1P1PP1P/RNKBNRBQ w FAfa - 0 9", 1, 24 }, + { "rnkbnrbq/2p1ppp1/p7/1p1p3p/3P4/1P4P1/P1P1PP1P/RNKBNRBQ w FAfa - 0 9", 2, 506 }, + { "rnkbnrbq/2p1ppp1/p7/1p1p3p/3P4/1P4P1/P1P1PP1P/RNKBNRBQ w FAfa - 0 9", 3, 12748 }, + { "rnkbnrbq/2p1ppp1/p7/1p1p3p/3P4/1P4P1/P1P1PP1P/RNKBNRBQ w FAfa - 0 9", 4, 301464 }, + { "rnkbnrbq/2p1ppp1/p7/1p1p3p/3P4/1P4P1/P1P1PP1P/RNKBNRBQ w FAfa - 0 9", 5, 8086100 }, + { "rnkbnrbq/2p1ppp1/p7/1p1p3p/3P4/1P4P1/P1P1PP1P/RNKBNRBQ w FAfa - 0 9", 6, 207129256 }, + { "r1knrbbq/pp1ppppp/2p1n3/8/2P3P1/P7/1PKPPP1P/RN1NRBBQ w ea - 0 9", 1, 28 }, + { "r1knrbbq/pp1ppppp/2p1n3/8/2P3P1/P7/1PKPPP1P/RN1NRBBQ w ea - 0 9", 2, 570 }, + { "r1knrbbq/pp1ppppp/2p1n3/8/2P3P1/P7/1PKPPP1P/RN1NRBBQ w ea - 0 9", 3, 16037 }, + { "r1knrbbq/pp1ppppp/2p1n3/8/2P3P1/P7/1PKPPP1P/RN1NRBBQ w ea - 0 9", 4, 352471 }, + { "r1knrbbq/pp1ppppp/2p1n3/8/2P3P1/P7/1PKPPP1P/RN1NRBBQ w ea - 0 9", 5, 10278695 }, + { "r1knrbbq/pp1ppppp/2p1n3/8/2P3P1/P7/1PKPPP1P/RN1NRBBQ w ea - 0 9", 6, 242592363 }, + { "rnknrq1b/ppp1p1p1/4b3/3p1p1p/6P1/P4P2/1PPPPQ1P/RNKNR1BB w EAea - 2 9", 1, 30 }, + { "rnknrq1b/ppp1p1p1/4b3/3p1p1p/6P1/P4P2/1PPPPQ1P/RNKNR1BB w EAea - 2 9", 2, 739 }, + { "rnknrq1b/ppp1p1p1/4b3/3p1p1p/6P1/P4P2/1PPPPQ1P/RNKNR1BB w EAea - 2 9", 3, 23124 }, + { "rnknrq1b/ppp1p1p1/4b3/3p1p1p/6P1/P4P2/1PPPPQ1P/RNKNR1BB w EAea - 2 9", 4, 594962 }, + { "rnknrq1b/ppp1p1p1/4b3/3p1p1p/6P1/P4P2/1PPPPQ1P/RNKNR1BB w EAea - 2 9", 5, 19252739 }, + { "rnknrq1b/ppp1p1p1/4b3/3p1p1p/6P1/P4P2/1PPPPQ1P/RNKNR1BB w EAea - 2 9", 6, 521629794 }, + { "bbqr1krn/pppp1p1p/5n2/4p1p1/3P4/P3QP2/1PP1P1PP/BB1RNKRN w GDgd - 0 9", 1, 31 }, + { "bbqr1krn/pppp1p1p/5n2/4p1p1/3P4/P3QP2/1PP1P1PP/BB1RNKRN w GDgd - 0 9", 2, 799 }, + { "bbqr1krn/pppp1p1p/5n2/4p1p1/3P4/P3QP2/1PP1P1PP/BB1RNKRN w GDgd - 0 9", 3, 25627 }, + { "bbqr1krn/pppp1p1p/5n2/4p1p1/3P4/P3QP2/1PP1P1PP/BB1RNKRN w GDgd - 0 9", 4, 674913 }, + { "bbqr1krn/pppp1p1p/5n2/4p1p1/3P4/P3QP2/1PP1P1PP/BB1RNKRN w GDgd - 0 9", 5, 22172123 }, + { "bbqr1krn/pppp1p1p/5n2/4p1p1/3P4/P3QP2/1PP1P1PP/BB1RNKRN w GDgd - 0 9", 6, 609277274 }, + { "bq1b1krn/pp1ppppp/3n4/2r5/3p3N/6N1/PPP1PPPP/BQRB1KR1 w GCg - 2 9", 1, 21 }, + { "bq1b1krn/pp1ppppp/3n4/2r5/3p3N/6N1/PPP1PPPP/BQRB1KR1 w GCg - 2 9", 2, 798 }, + { "bq1b1krn/pp1ppppp/3n4/2r5/3p3N/6N1/PPP1PPPP/BQRB1KR1 w GCg - 2 9", 3, 18571 }, + { "bq1b1krn/pp1ppppp/3n4/2r5/3p3N/6N1/PPP1PPPP/BQRB1KR1 w GCg - 2 9", 4, 688429 }, + { "bq1b1krn/pp1ppppp/3n4/2r5/3p3N/6N1/PPP1PPPP/BQRB1KR1 w GCg - 2 9", 5, 17546069 }, + { "bq1b1krn/pp1ppppp/3n4/2r5/3p3N/6N1/PPP1PPPP/BQRB1KR1 w GCg - 2 9", 6, 647165916 }, + { "bqrnkbrn/2pp1pp1/p7/1p2p2p/1P6/4N3/P1PPPPPP/BQR1KBRN w GCgc - 0 9", 1, 27 }, + { "bqrnkbrn/2pp1pp1/p7/1p2p2p/1P6/4N3/P1PPPPPP/BQR1KBRN w GCgc - 0 9", 2, 783 }, + { "bqrnkbrn/2pp1pp1/p7/1p2p2p/1P6/4N3/P1PPPPPP/BQR1KBRN w GCgc - 0 9", 3, 22327 }, + { "bqrnkbrn/2pp1pp1/p7/1p2p2p/1P6/4N3/P1PPPPPP/BQR1KBRN w GCgc - 0 9", 4, 670798 }, + { "bqrnkbrn/2pp1pp1/p7/1p2p2p/1P6/4N3/P1PPPPPP/BQR1KBRN w GCgc - 0 9", 5, 20059741 }, + { "bqrnkbrn/2pp1pp1/p7/1p2p2p/1P6/4N3/P1PPPPPP/BQR1KBRN w GCgc - 0 9", 6, 624462073 }, + { "bqr1krnb/1np1pppp/8/pp1p4/8/2P2N2/PP1PPPPP/BQRNKR1B w FCfc - 0 9", 1, 28 }, + { "bqr1krnb/1np1pppp/8/pp1p4/8/2P2N2/PP1PPPPP/BQRNKR1B w FCfc - 0 9", 2, 636 }, + { "bqr1krnb/1np1pppp/8/pp1p4/8/2P2N2/PP1PPPPP/BQRNKR1B w FCfc - 0 9", 3, 18874 }, + { "bqr1krnb/1np1pppp/8/pp1p4/8/2P2N2/PP1PPPPP/BQRNKR1B w FCfc - 0 9", 4, 461104 }, + { "bqr1krnb/1np1pppp/8/pp1p4/8/2P2N2/PP1PPPPP/BQRNKR1B w FCfc - 0 9", 5, 14237097 }, + { "bqr1krnb/1np1pppp/8/pp1p4/8/2P2N2/PP1PPPPP/BQRNKR1B w FCfc - 0 9", 6, 372181570 }, + { "qbb1rkrn/1ppppppp/p7/7n/8/P2P4/1PP1PPPP/QBBRNKRN w Gg - 0 9", 1, 25 }, + { "qbb1rkrn/1ppppppp/p7/7n/8/P2P4/1PP1PPPP/QBBRNKRN w Gg - 0 9", 2, 547 }, + { "qbb1rkrn/1ppppppp/p7/7n/8/P2P4/1PP1PPPP/QBBRNKRN w Gg - 0 9", 3, 13837 }, + { "qbb1rkrn/1ppppppp/p7/7n/8/P2P4/1PP1PPPP/QBBRNKRN w Gg - 0 9", 4, 332918 }, + { "qbb1rkrn/1ppppppp/p7/7n/8/P2P4/1PP1PPPP/QBBRNKRN w Gg - 0 9", 5, 8849383 }, + { "qbb1rkrn/1ppppppp/p7/7n/8/P2P4/1PP1PPPP/QBBRNKRN w Gg - 0 9", 6, 229112926 }, + { "1rbbnkrn/p1p1pp1p/2q5/1p1p2p1/8/2P3P1/PP1PPP1P/QRBBNKRN w GBgb - 2 9", 1, 24 }, + { "1rbbnkrn/p1p1pp1p/2q5/1p1p2p1/8/2P3P1/PP1PPP1P/QRBBNKRN w GBgb - 2 9", 2, 1010 }, + { "1rbbnkrn/p1p1pp1p/2q5/1p1p2p1/8/2P3P1/PP1PPP1P/QRBBNKRN w GBgb - 2 9", 3, 24370 }, + { "1rbbnkrn/p1p1pp1p/2q5/1p1p2p1/8/2P3P1/PP1PPP1P/QRBBNKRN w GBgb - 2 9", 4, 983770 }, + { "1rbbnkrn/p1p1pp1p/2q5/1p1p2p1/8/2P3P1/PP1PPP1P/QRBBNKRN w GBgb - 2 9", 5, 24328258 }, + { "1rbbnkrn/p1p1pp1p/2q5/1p1p2p1/8/2P3P1/PP1PPP1P/QRBBNKRN w GBgb - 2 9", 6, 961371180 }, + { "qrb1kbrn/ppp1p2p/4npp1/3p4/8/1PP4P/PR1PPPP1/Q1BNKBRN w Ggb - 1 9", 1, 18 }, + { "qrb1kbrn/ppp1p2p/4npp1/3p4/8/1PP4P/PR1PPPP1/Q1BNKBRN w Ggb - 1 9", 2, 451 }, + { "qrb1kbrn/ppp1p2p/4npp1/3p4/8/1PP4P/PR1PPPP1/Q1BNKBRN w Ggb - 1 9", 3, 9291 }, + { "qrb1kbrn/ppp1p2p/4npp1/3p4/8/1PP4P/PR1PPPP1/Q1BNKBRN w Ggb - 1 9", 4, 247310 }, + { "qrb1kbrn/ppp1p2p/4npp1/3p4/8/1PP4P/PR1PPPP1/Q1BNKBRN w Ggb - 1 9", 5, 5568106 }, + { "qrb1kbrn/ppp1p2p/4npp1/3p4/8/1PP4P/PR1PPPP1/Q1BNKBRN w Ggb - 1 9", 6, 155744022 }, + { "qr2krnb/p1p1pppp/b1np4/1p6/3NP3/7P/PPPP1PP1/QRBNKR1B w FBfb - 2 9", 1, 25 }, + { "qr2krnb/p1p1pppp/b1np4/1p6/3NP3/7P/PPPP1PP1/QRBNKR1B w FBfb - 2 9", 2, 667 }, + { "qr2krnb/p1p1pppp/b1np4/1p6/3NP3/7P/PPPP1PP1/QRBNKR1B w FBfb - 2 9", 3, 17081 }, + { "qr2krnb/p1p1pppp/b1np4/1p6/3NP3/7P/PPPP1PP1/QRBNKR1B w FBfb - 2 9", 4, 476030 }, + { "qr2krnb/p1p1pppp/b1np4/1p6/3NP3/7P/PPPP1PP1/QRBNKR1B w FBfb - 2 9", 5, 12458875 }, + { "qr2krnb/p1p1pppp/b1np4/1p6/3NP3/7P/PPPP1PP1/QRBNKR1B w FBfb - 2 9", 6, 361495148 }, + { "qbrnbkrn/ppp3pp/3p4/5p2/2P1pP2/6PP/PP1PP3/QBRNBKRN w GCgc - 0 9", 1, 24 }, + { "qbrnbkrn/ppp3pp/3p4/5p2/2P1pP2/6PP/PP1PP3/QBRNBKRN w GCgc - 0 9", 2, 650 }, + { "qbrnbkrn/ppp3pp/3p4/5p2/2P1pP2/6PP/PP1PP3/QBRNBKRN w GCgc - 0 9", 3, 16835 }, + { "qbrnbkrn/ppp3pp/3p4/5p2/2P1pP2/6PP/PP1PP3/QBRNBKRN w GCgc - 0 9", 4, 445263 }, + { "qbrnbkrn/ppp3pp/3p4/5p2/2P1pP2/6PP/PP1PP3/QBRNBKRN w GCgc - 0 9", 5, 12187382 }, + { "qbrnbkrn/ppp3pp/3p4/5p2/2P1pP2/6PP/PP1PP3/QBRNBKRN w GCgc - 0 9", 6, 326834539 }, + { "qrnb1krn/ppp1p1pp/5p2/2Np4/b2P4/2P5/PP2PPPP/QR1BBKRN w GBgb - 0 9", 1, 27 }, + { "qrnb1krn/ppp1p1pp/5p2/2Np4/b2P4/2P5/PP2PPPP/QR1BBKRN w GBgb - 0 9", 2, 641 }, + { "qrnb1krn/ppp1p1pp/5p2/2Np4/b2P4/2P5/PP2PPPP/QR1BBKRN w GBgb - 0 9", 3, 17490 }, + { "qrnb1krn/ppp1p1pp/5p2/2Np4/b2P4/2P5/PP2PPPP/QR1BBKRN w GBgb - 0 9", 4, 432041 }, + { "qrnb1krn/ppp1p1pp/5p2/2Np4/b2P4/2P5/PP2PPPP/QR1BBKRN w GBgb - 0 9", 5, 12103076 }, + { "qrnb1krn/ppp1p1pp/5p2/2Np4/b2P4/2P5/PP2PPPP/QR1BBKRN w GBgb - 0 9", 6, 310695797 }, + { "qrnkbbrn/pp2pp2/8/2pp2pp/6PP/3P4/PPPKPP2/QRN1BBRN w gb - 0 9", 1, 22 }, + { "qrnkbbrn/pp2pp2/8/2pp2pp/6PP/3P4/PPPKPP2/QRN1BBRN w gb - 0 9", 2, 554 }, + { "qrnkbbrn/pp2pp2/8/2pp2pp/6PP/3P4/PPPKPP2/QRN1BBRN w gb - 0 9", 3, 13116 }, + { "qrnkbbrn/pp2pp2/8/2pp2pp/6PP/3P4/PPPKPP2/QRN1BBRN w gb - 0 9", 4, 357404 }, + { "qrnkbbrn/pp2pp2/8/2pp2pp/6PP/3P4/PPPKPP2/QRN1BBRN w gb - 0 9", 5, 9014737 }, + { "qrnkbbrn/pp2pp2/8/2pp2pp/6PP/3P4/PPPKPP2/QRN1BBRN w gb - 0 9", 6, 258925091 }, + { "qrnkbrnb/p1p1ppp1/1p6/3p4/3P3p/5N1P/PPP1PPP1/QRNKBR1B w FBfb - 0 9", 1, 24 }, + { "qrnkbrnb/p1p1ppp1/1p6/3p4/3P3p/5N1P/PPP1PPP1/QRNKBR1B w FBfb - 0 9", 2, 529 }, + { "qrnkbrnb/p1p1ppp1/1p6/3p4/3P3p/5N1P/PPP1PPP1/QRNKBR1B w FBfb - 0 9", 3, 13205 }, + { "qrnkbrnb/p1p1ppp1/1p6/3p4/3P3p/5N1P/PPP1PPP1/QRNKBR1B w FBfb - 0 9", 4, 318722 }, + { "qrnkbrnb/p1p1ppp1/1p6/3p4/3P3p/5N1P/PPP1PPP1/QRNKBR1B w FBfb - 0 9", 5, 8295874 }, + { "qrnkbrnb/p1p1ppp1/1p6/3p4/3P3p/5N1P/PPP1PPP1/QRNKBR1B w FBfb - 0 9", 6, 213856651 }, + { "qbr1krbn/1pppp1pp/p7/5pn1/2PP4/8/PPB1PPPP/Q1RNKRBN w FCfc - 0 9", 1, 26 }, + { "qbr1krbn/1pppp1pp/p7/5pn1/2PP4/8/PPB1PPPP/Q1RNKRBN w FCfc - 0 9", 2, 831 }, + { "qbr1krbn/1pppp1pp/p7/5pn1/2PP4/8/PPB1PPPP/Q1RNKRBN w FCfc - 0 9", 3, 21651 }, + { "qbr1krbn/1pppp1pp/p7/5pn1/2PP4/8/PPB1PPPP/Q1RNKRBN w FCfc - 0 9", 4, 696830 }, + { "qbr1krbn/1pppp1pp/p7/5pn1/2PP4/8/PPB1PPPP/Q1RNKRBN w FCfc - 0 9", 5, 18961456 }, + { "qbr1krbn/1pppp1pp/p7/5pn1/2PP4/8/PPB1PPPP/Q1RNKRBN w FCfc - 0 9", 6, 621884383 }, + { "1rnbkrbn/1qp1pppp/3p4/pp6/4P3/1NP4P/PP1P1PP1/QR1BKRBN w FBfb - 0 9", 1, 24 }, + { "1rnbkrbn/1qp1pppp/3p4/pp6/4P3/1NP4P/PP1P1PP1/QR1BKRBN w FBfb - 0 9", 2, 597 }, + { "1rnbkrbn/1qp1pppp/3p4/pp6/4P3/1NP4P/PP1P1PP1/QR1BKRBN w FBfb - 0 9", 3, 15089 }, + { "1rnbkrbn/1qp1pppp/3p4/pp6/4P3/1NP4P/PP1P1PP1/QR1BKRBN w FBfb - 0 9", 4, 404761 }, + { "1rnbkrbn/1qp1pppp/3p4/pp6/4P3/1NP4P/PP1P1PP1/QR1BKRBN w FBfb - 0 9", 5, 10832084 }, + { "1rnbkrbn/1qp1pppp/3p4/pp6/4P3/1NP4P/PP1P1PP1/QR1BKRBN w FBfb - 0 9", 6, 307793179 }, + { "q1rkrbbn/ppp1pppp/8/3p4/1PnP4/P7/1RP1PPPP/Q1NKRBBN w Ee - 1 9", 1, 20 }, + { "q1rkrbbn/ppp1pppp/8/3p4/1PnP4/P7/1RP1PPPP/Q1NKRBBN w Ee - 1 9", 2, 520 }, + { "q1rkrbbn/ppp1pppp/8/3p4/1PnP4/P7/1RP1PPPP/Q1NKRBBN w Ee - 1 9", 3, 10769 }, + { "q1rkrbbn/ppp1pppp/8/3p4/1PnP4/P7/1RP1PPPP/Q1NKRBBN w Ee - 1 9", 4, 278067 }, + { "q1rkrbbn/ppp1pppp/8/3p4/1PnP4/P7/1RP1PPPP/Q1NKRBBN w Ee - 1 9", 5, 6452205 }, + { "q1rkrbbn/ppp1pppp/8/3p4/1PnP4/P7/1RP1PPPP/Q1NKRBBN w Ee - 1 9", 6, 170268300 }, + { "qrnkrn1b/ppppp1pp/4b3/7P/6p1/P7/1PPPPP2/QRNKRNBB w EBeb - 0 9", 1, 26 }, + { "qrnkrn1b/ppppp1pp/4b3/7P/6p1/P7/1PPPPP2/QRNKRNBB w EBeb - 0 9", 2, 566 }, + { "qrnkrn1b/ppppp1pp/4b3/7P/6p1/P7/1PPPPP2/QRNKRNBB w EBeb - 0 9", 3, 15623 }, + { "qrnkrn1b/ppppp1pp/4b3/7P/6p1/P7/1PPPPP2/QRNKRNBB w EBeb - 0 9", 4, 381312 }, + { "qrnkrn1b/ppppp1pp/4b3/7P/6p1/P7/1PPPPP2/QRNKRNBB w EBeb - 0 9", 5, 10940750 }, + { "qrnkrn1b/ppppp1pp/4b3/7P/6p1/P7/1PPPPP2/QRNKRNBB w EBeb - 0 9", 6, 287987207 }, + { "bbr1nkrn/ppp1pppp/3q4/3p4/8/P7/1PPPPPPP/BBRQNRKN w gc - 5 9", 1, 19 }, + { "bbr1nkrn/ppp1pppp/3q4/3p4/8/P7/1PPPPPPP/BBRQNRKN w gc - 5 9", 2, 661 }, + { "bbr1nkrn/ppp1pppp/3q4/3p4/8/P7/1PPPPPPP/BBRQNRKN w gc - 5 9", 3, 13895 }, + { "bbr1nkrn/ppp1pppp/3q4/3p4/8/P7/1PPPPPPP/BBRQNRKN w gc - 5 9", 4, 460396 }, + { "bbr1nkrn/ppp1pppp/3q4/3p4/8/P7/1PPPPPPP/BBRQNRKN w gc - 5 9", 5, 10870247 }, + { "bbr1nkrn/ppp1pppp/3q4/3p4/8/P7/1PPPPPPP/BBRQNRKN w gc - 5 9", 6, 356399665 }, + { "brqbnkrn/pp1pp2p/5pp1/2p5/4P3/P2P1N2/1PP2PPP/BRQB1KRN w GBgb - 0 9", 1, 27 }, + { "brqbnkrn/pp1pp2p/5pp1/2p5/4P3/P2P1N2/1PP2PPP/BRQB1KRN w GBgb - 0 9", 2, 679 }, + { "brqbnkrn/pp1pp2p/5pp1/2p5/4P3/P2P1N2/1PP2PPP/BRQB1KRN w GBgb - 0 9", 3, 19916 }, + { "brqbnkrn/pp1pp2p/5pp1/2p5/4P3/P2P1N2/1PP2PPP/BRQB1KRN w GBgb - 0 9", 4, 527306 }, + { "brqbnkrn/pp1pp2p/5pp1/2p5/4P3/P2P1N2/1PP2PPP/BRQB1KRN w GBgb - 0 9", 5, 16391730 }, + { "brqbnkrn/pp1pp2p/5pp1/2p5/4P3/P2P1N2/1PP2PPP/BRQB1KRN w GBgb - 0 9", 6, 455940859 }, + { "2qnkbrn/p1pppppp/8/1r6/1p2bP2/7N/PPPPP1PP/BR1QKBRN w GBg - 4 9", 1, 18 }, + { "2qnkbrn/p1pppppp/8/1r6/1p2bP2/7N/PPPPP1PP/BR1QKBRN w GBg - 4 9", 2, 774 }, + { "2qnkbrn/p1pppppp/8/1r6/1p2bP2/7N/PPPPP1PP/BR1QKBRN w GBg - 4 9", 3, 15713 }, + { "2qnkbrn/p1pppppp/8/1r6/1p2bP2/7N/PPPPP1PP/BR1QKBRN w GBg - 4 9", 4, 635461 }, + { "2qnkbrn/p1pppppp/8/1r6/1p2bP2/7N/PPPPP1PP/BR1QKBRN w GBg - 4 9", 5, 14371755 }, + { "2qnkbrn/p1pppppp/8/1r6/1p2bP2/7N/PPPPP1PP/BR1QKBRN w GBg - 4 9", 6, 559579332 }, + { "r1qnkr1b/p1pppppp/7n/1p6/8/1P3b1N/PRPPPPPP/B1QNK1RB w f - 5 9", 1, 21 }, + { "r1qnkr1b/p1pppppp/7n/1p6/8/1P3b1N/PRPPPPPP/B1QNK1RB w f - 5 9", 2, 677 }, + { "r1qnkr1b/p1pppppp/7n/1p6/8/1P3b1N/PRPPPPPP/B1QNK1RB w f - 5 9", 3, 15437 }, + { "r1qnkr1b/p1pppppp/7n/1p6/8/1P3b1N/PRPPPPPP/B1QNK1RB w f - 5 9", 4, 501520 }, + { "r1qnkr1b/p1pppppp/7n/1p6/8/1P3b1N/PRPPPPPP/B1QNK1RB w f - 5 9", 5, 12463801 }, + { "r1qnkr1b/p1pppppp/7n/1p6/8/1P3b1N/PRPPPPPP/B1QNK1RB w f - 5 9", 6, 410795298 }, + { "rbbqn1rn/pppp1pp1/3k4/4p2Q/2PPP3/8/PP3PPP/RBB1NKRN w GA - 1 9", 1, 40 }, + { "rbbqn1rn/pppp1pp1/3k4/4p2Q/2PPP3/8/PP3PPP/RBB1NKRN w GA - 1 9", 2, 742 }, + { "rbbqn1rn/pppp1pp1/3k4/4p2Q/2PPP3/8/PP3PPP/RBB1NKRN w GA - 1 9", 3, 28757 }, + { "rbbqn1rn/pppp1pp1/3k4/4p2Q/2PPP3/8/PP3PPP/RBB1NKRN w GA - 1 9", 4, 579833 }, + { "rbbqn1rn/pppp1pp1/3k4/4p2Q/2PPP3/8/PP3PPP/RBB1NKRN w GA - 1 9", 5, 21852196 }, + { "rbbqn1rn/pppp1pp1/3k4/4p2Q/2PPP3/8/PP3PPP/RBB1NKRN w GA - 1 9", 6, 471452088 }, + { "rqbbnkrn/3pppp1/p1p4p/1p6/5P2/P2N4/1PPPP1PP/RQBBK1RN w ga - 0 9", 1, 23 }, + { "rqbbnkrn/3pppp1/p1p4p/1p6/5P2/P2N4/1PPPP1PP/RQBBK1RN w ga - 0 9", 2, 665 }, + { "rqbbnkrn/3pppp1/p1p4p/1p6/5P2/P2N4/1PPPP1PP/RQBBK1RN w ga - 0 9", 3, 16400 }, + { "rqbbnkrn/3pppp1/p1p4p/1p6/5P2/P2N4/1PPPP1PP/RQBBK1RN w ga - 0 9", 4, 492544 }, + { "rqbbnkrn/3pppp1/p1p4p/1p6/5P2/P2N4/1PPPP1PP/RQBBK1RN w ga - 0 9", 5, 12794736 }, + { "rqbbnkrn/3pppp1/p1p4p/1p6/5P2/P2N4/1PPPP1PP/RQBBK1RN w ga - 0 9", 6, 396640086 }, + { "r2nkbrn/pp2pppp/8/2ppqb2/2P3P1/5P2/PP1PPN1P/RQB1KBRN w GAga - 3 9", 1, 28 }, + { "r2nkbrn/pp2pppp/8/2ppqb2/2P3P1/5P2/PP1PPN1P/RQB1KBRN w GAga - 3 9", 2, 1108 }, + { "r2nkbrn/pp2pppp/8/2ppqb2/2P3P1/5P2/PP1PPN1P/RQB1KBRN w GAga - 3 9", 3, 31164 }, + { "r2nkbrn/pp2pppp/8/2ppqb2/2P3P1/5P2/PP1PPN1P/RQB1KBRN w GAga - 3 9", 4, 1194581 }, + { "r2nkbrn/pp2pppp/8/2ppqb2/2P3P1/5P2/PP1PPN1P/RQB1KBRN w GAga - 3 9", 5, 34780853 }, + { "r2nkbrn/pp2pppp/8/2ppqb2/2P3P1/5P2/PP1PPN1P/RQB1KBRN w GAga - 3 9", 6, 1292405738 }, + { "rqbnk1nb/p1pppr1p/5p2/1p4p1/1PP1P3/8/P2P1PPP/RQBNKRNB w FAa - 1 9", 1, 26 }, + { "rqbnk1nb/p1pppr1p/5p2/1p4p1/1PP1P3/8/P2P1PPP/RQBNKRNB w FAa - 1 9", 2, 650 }, + { "rqbnk1nb/p1pppr1p/5p2/1p4p1/1PP1P3/8/P2P1PPP/RQBNKRNB w FAa - 1 9", 3, 18208 }, + { "rqbnk1nb/p1pppr1p/5p2/1p4p1/1PP1P3/8/P2P1PPP/RQBNKRNB w FAa - 1 9", 4, 491403 }, + { "rqbnk1nb/p1pppr1p/5p2/1p4p1/1PP1P3/8/P2P1PPP/RQBNKRNB w FAa - 1 9", 5, 14565370 }, + { "rqbnk1nb/p1pppr1p/5p2/1p4p1/1PP1P3/8/P2P1PPP/RQBNKRNB w FAa - 1 9", 6, 416833400 }, + { "rbqnb1rn/p1pp1kpp/1p2pp2/8/4P2P/P5P1/1PPP1P2/RBQNBKRN w GA - 0 9", 1, 20 }, + { "rbqnb1rn/p1pp1kpp/1p2pp2/8/4P2P/P5P1/1PPP1P2/RBQNBKRN w GA - 0 9", 2, 437 }, + { "rbqnb1rn/p1pp1kpp/1p2pp2/8/4P2P/P5P1/1PPP1P2/RBQNBKRN w GA - 0 9", 3, 9423 }, + { "rbqnb1rn/p1pp1kpp/1p2pp2/8/4P2P/P5P1/1PPP1P2/RBQNBKRN w GA - 0 9", 4, 222154 }, + { "rbqnb1rn/p1pp1kpp/1p2pp2/8/4P2P/P5P1/1PPP1P2/RBQNBKRN w GA - 0 9", 5, 5282124 }, + { "rbqnb1rn/p1pp1kpp/1p2pp2/8/4P2P/P5P1/1PPP1P2/RBQNBKRN w GA - 0 9", 6, 132309824 }, + { "rqnbbkrn/p1p1pppp/3p4/1p5B/8/1P1NP3/P1PP1PPP/RQ2BKRN w GAga - 0 9", 1, 30 }, + { "rqnbbkrn/p1p1pppp/3p4/1p5B/8/1P1NP3/P1PP1PPP/RQ2BKRN w GAga - 0 9", 2, 606 }, + { "rqnbbkrn/p1p1pppp/3p4/1p5B/8/1P1NP3/P1PP1PPP/RQ2BKRN w GAga - 0 9", 3, 18382 }, + { "rqnbbkrn/p1p1pppp/3p4/1p5B/8/1P1NP3/P1PP1PPP/RQ2BKRN w GAga - 0 9", 4, 422491 }, + { "rqnbbkrn/p1p1pppp/3p4/1p5B/8/1P1NP3/P1PP1PPP/RQ2BKRN w GAga - 0 9", 5, 12989786 }, + { "rqnbbkrn/p1p1pppp/3p4/1p5B/8/1P1NP3/P1PP1PPP/RQ2BKRN w GAga - 0 9", 6, 326601372 }, + { "rqnkbbr1/ppppp1pp/5p2/7n/8/2PNP2P/PP1P1PP1/RQ1KBBRN w GAga - 1 9", 1, 23 }, + { "rqnkbbr1/ppppp1pp/5p2/7n/8/2PNP2P/PP1P1PP1/RQ1KBBRN w GAga - 1 9", 2, 482 }, + { "rqnkbbr1/ppppp1pp/5p2/7n/8/2PNP2P/PP1P1PP1/RQ1KBBRN w GAga - 1 9", 3, 12506 }, + { "rqnkbbr1/ppppp1pp/5p2/7n/8/2PNP2P/PP1P1PP1/RQ1KBBRN w GAga - 1 9", 4, 297869 }, + { "rqnkbbr1/ppppp1pp/5p2/7n/8/2PNP2P/PP1P1PP1/RQ1KBBRN w GAga - 1 9", 5, 8430874 }, + { "rqnkbbr1/ppppp1pp/5p2/7n/8/2PNP2P/PP1P1PP1/RQ1KBBRN w GAga - 1 9", 6, 217797292 }, + { "r1nkbrnb/2ppppp1/1q6/pp5p/1P6/P3P3/2PPKPPP/RQN1BRNB w fa - 2 9", 1, 25 }, + { "r1nkbrnb/2ppppp1/1q6/pp5p/1P6/P3P3/2PPKPPP/RQN1BRNB w fa - 2 9", 2, 827 }, + { "r1nkbrnb/2ppppp1/1q6/pp5p/1P6/P3P3/2PPKPPP/RQN1BRNB w fa - 2 9", 3, 21518 }, + { "r1nkbrnb/2ppppp1/1q6/pp5p/1P6/P3P3/2PPKPPP/RQN1BRNB w fa - 2 9", 4, 701071 }, + { "r1nkbrnb/2ppppp1/1q6/pp5p/1P6/P3P3/2PPKPPP/RQN1BRNB w fa - 2 9", 5, 19290675 }, + { "r1nkbrnb/2ppppp1/1q6/pp5p/1P6/P3P3/2PPKPPP/RQN1BRNB w fa - 2 9", 6, 632892337 }, + { "rbqnkrbn/p1ppppp1/7p/1p6/7P/2N1P3/PPPP1PPB/RBQ1KR1N w FAfa - 1 9", 1, 30 }, + { "rbqnkrbn/p1ppppp1/7p/1p6/7P/2N1P3/PPPP1PPB/RBQ1KR1N w FAfa - 1 9", 2, 627 }, + { "rbqnkrbn/p1ppppp1/7p/1p6/7P/2N1P3/PPPP1PPB/RBQ1KR1N w FAfa - 1 9", 3, 18566 }, + { "rbqnkrbn/p1ppppp1/7p/1p6/7P/2N1P3/PPPP1PPB/RBQ1KR1N w FAfa - 1 9", 4, 440217 }, + { "rbqnkrbn/p1ppppp1/7p/1p6/7P/2N1P3/PPPP1PPB/RBQ1KR1N w FAfa - 1 9", 5, 12976682 }, + { "rbqnkrbn/p1ppppp1/7p/1p6/7P/2N1P3/PPPP1PPB/RBQ1KR1N w FAfa - 1 9", 6, 337377291 }, + { "r1nbkrbn/p1qp1ppp/8/1pp1p3/2P1P3/6P1/PP1PBP1P/RQN1KRBN w FAfa - 2 9", 1, 22 }, + { "r1nbkrbn/p1qp1ppp/8/1pp1p3/2P1P3/6P1/PP1PBP1P/RQN1KRBN w FAfa - 2 9", 2, 616 }, + { "r1nbkrbn/p1qp1ppp/8/1pp1p3/2P1P3/6P1/PP1PBP1P/RQN1KRBN w FAfa - 2 9", 3, 14503 }, + { "r1nbkrbn/p1qp1ppp/8/1pp1p3/2P1P3/6P1/PP1PBP1P/RQN1KRBN w FAfa - 2 9", 4, 431199 }, + { "r1nbkrbn/p1qp1ppp/8/1pp1p3/2P1P3/6P1/PP1PBP1P/RQN1KRBN w FAfa - 2 9", 5, 10850952 }, + { "r1nbkrbn/p1qp1ppp/8/1pp1p3/2P1P3/6P1/PP1PBP1P/RQN1KRBN w FAfa - 2 9", 6, 335943324 }, + { "rqnkr1bn/ppp1ppb1/3p2pp/8/P7/2P2P2/1PKPP1PP/RQN1RBBN w ea - 1 9", 1, 31 }, + { "rqnkr1bn/ppp1ppb1/3p2pp/8/P7/2P2P2/1PKPP1PP/RQN1RBBN w ea - 1 9", 2, 679 }, + { "rqnkr1bn/ppp1ppb1/3p2pp/8/P7/2P2P2/1PKPP1PP/RQN1RBBN w ea - 1 9", 3, 21365 }, + { "rqnkr1bn/ppp1ppb1/3p2pp/8/P7/2P2P2/1PKPP1PP/RQN1RBBN w ea - 1 9", 4, 493500 }, + { "rqnkr1bn/ppp1ppb1/3p2pp/8/P7/2P2P2/1PKPP1PP/RQN1RBBN w ea - 1 9", 5, 15661072 }, + { "rqnkr1bn/ppp1ppb1/3p2pp/8/P7/2P2P2/1PKPP1PP/RQN1RBBN w ea - 1 9", 6, 379844460 }, + { "r2krnbb/qppp1ppp/1n6/p3p3/PP6/4N3/N1PPPPPP/RQ1KR1BB w EAea - 4 9", 1, 24 }, + { "r2krnbb/qppp1ppp/1n6/p3p3/PP6/4N3/N1PPPPPP/RQ1KR1BB w EAea - 4 9", 2, 645 }, + { "r2krnbb/qppp1ppp/1n6/p3p3/PP6/4N3/N1PPPPPP/RQ1KR1BB w EAea - 4 9", 3, 17054 }, + { "r2krnbb/qppp1ppp/1n6/p3p3/PP6/4N3/N1PPPPPP/RQ1KR1BB w EAea - 4 9", 4, 487028 }, + { "r2krnbb/qppp1ppp/1n6/p3p3/PP6/4N3/N1PPPPPP/RQ1KR1BB w EAea - 4 9", 5, 13837270 }, + { "r2krnbb/qppp1ppp/1n6/p3p3/PP6/4N3/N1PPPPPP/RQ1KR1BB w EAea - 4 9", 6, 416239106 }, + { "bbr1qk1n/1ppppp1p/2n5/p7/P7/1P2P3/2PP1PrP/1BRNQKRN w GCc - 0 9", 1, 18 }, + { "bbr1qk1n/1ppppp1p/2n5/p7/P7/1P2P3/2PP1PrP/1BRNQKRN w GCc - 0 9", 2, 520 }, + { "bbr1qk1n/1ppppp1p/2n5/p7/P7/1P2P3/2PP1PrP/1BRNQKRN w GCc - 0 9", 3, 10680 }, + { "bbr1qk1n/1ppppp1p/2n5/p7/P7/1P2P3/2PP1PrP/1BRNQKRN w GCc - 0 9", 4, 304462 }, + { "bbr1qk1n/1ppppp1p/2n5/p7/P7/1P2P3/2PP1PrP/1BRNQKRN w GCc - 0 9", 5, 7215306 }, + { "bbr1qk1n/1ppppp1p/2n5/p7/P7/1P2P3/2PP1PrP/1BRNQKRN w GCc - 0 9", 6, 207612575 }, + { "brnbq1rn/2ppppkp/p5p1/1p6/8/1BP3P1/PP1PPP1P/BRN1QRKN w - - 0 9", 1, 21 }, + { "brnbq1rn/2ppppkp/p5p1/1p6/8/1BP3P1/PP1PPP1P/BRN1QRKN w - - 0 9", 2, 625 }, + { "brnbq1rn/2ppppkp/p5p1/1p6/8/1BP3P1/PP1PPP1P/BRN1QRKN w - - 0 9", 3, 13989 }, + { "brnbq1rn/2ppppkp/p5p1/1p6/8/1BP3P1/PP1PPP1P/BRN1QRKN w - - 0 9", 4, 419667 }, + { "brnbq1rn/2ppppkp/p5p1/1p6/8/1BP3P1/PP1PPP1P/BRN1QRKN w - - 0 9", 5, 9929336 }, + { "brnbq1rn/2ppppkp/p5p1/1p6/8/1BP3P1/PP1PPP1P/BRN1QRKN w - - 0 9", 6, 300902534 }, + { "brn1kbrn/pp2p1pp/3p4/q1p2p2/2P4P/6P1/PP1PPP2/BRNQKBRN w GBgb - 1 9", 1, 18 }, + { "brn1kbrn/pp2p1pp/3p4/q1p2p2/2P4P/6P1/PP1PPP2/BRNQKBRN w GBgb - 1 9", 2, 477 }, + { "brn1kbrn/pp2p1pp/3p4/q1p2p2/2P4P/6P1/PP1PPP2/BRNQKBRN w GBgb - 1 9", 3, 10205 }, + { "brn1kbrn/pp2p1pp/3p4/q1p2p2/2P4P/6P1/PP1PPP2/BRNQKBRN w GBgb - 1 9", 4, 273925 }, + { "brn1kbrn/pp2p1pp/3p4/q1p2p2/2P4P/6P1/PP1PPP2/BRNQKBRN w GBgb - 1 9", 5, 6720181 }, + { "brn1kbrn/pp2p1pp/3p4/q1p2p2/2P4P/6P1/PP1PPP2/BRNQKBRN w GBgb - 1 9", 6, 187205941 }, + { "brn1krnb/p3pppp/1qpp4/1p6/2P3P1/1P6/P2PPP1P/BRNQKRNB w FBfb - 1 9", 1, 30 }, + { "brn1krnb/p3pppp/1qpp4/1p6/2P3P1/1P6/P2PPP1P/BRNQKRNB w FBfb - 1 9", 2, 835 }, + { "brn1krnb/p3pppp/1qpp4/1p6/2P3P1/1P6/P2PPP1P/BRNQKRNB w FBfb - 1 9", 3, 24761 }, + { "brn1krnb/p3pppp/1qpp4/1p6/2P3P1/1P6/P2PPP1P/BRNQKRNB w FBfb - 1 9", 4, 716151 }, + { "brn1krnb/p3pppp/1qpp4/1p6/2P3P1/1P6/P2PPP1P/BRNQKRNB w FBfb - 1 9", 5, 21806428 }, + { "brn1krnb/p3pppp/1qpp4/1p6/2P3P1/1P6/P2PPP1P/BRNQKRNB w FBfb - 1 9", 6, 654487872 }, + { "r1b1qkrn/1p1ppppp/p1p1n3/8/4P3/1PN5/P1PPQPPb/RBB2KRN w GAga - 0 9", 1, 28 }, + { "r1b1qkrn/1p1ppppp/p1p1n3/8/4P3/1PN5/P1PPQPPb/RBB2KRN w GAga - 0 9", 2, 825 }, + { "r1b1qkrn/1p1ppppp/p1p1n3/8/4P3/1PN5/P1PPQPPb/RBB2KRN w GAga - 0 9", 3, 24536 }, + { "r1b1qkrn/1p1ppppp/p1p1n3/8/4P3/1PN5/P1PPQPPb/RBB2KRN w GAga - 0 9", 4, 716585 }, + { "r1b1qkrn/1p1ppppp/p1p1n3/8/4P3/1PN5/P1PPQPPb/RBB2KRN w GAga - 0 9", 5, 22079005 }, + { "r1b1qkrn/1p1ppppp/p1p1n3/8/4P3/1PN5/P1PPQPPb/RBB2KRN w GAga - 0 9", 6, 647939781 }, + { "r1bbqk1n/p1pppprp/n7/1p4p1/5P2/2N3N1/PPPPP1PP/1RBBQKR1 w Ga - 4 9", 1, 25 }, + { "r1bbqk1n/p1pppprp/n7/1p4p1/5P2/2N3N1/PPPPP1PP/1RBBQKR1 w Ga - 4 9", 2, 545 }, + { "r1bbqk1n/p1pppprp/n7/1p4p1/5P2/2N3N1/PPPPP1PP/1RBBQKR1 w Ga - 4 9", 3, 14657 }, + { "r1bbqk1n/p1pppprp/n7/1p4p1/5P2/2N3N1/PPPPP1PP/1RBBQKR1 w Ga - 4 9", 4, 358854 }, + { "r1bbqk1n/p1pppprp/n7/1p4p1/5P2/2N3N1/PPPPP1PP/1RBBQKR1 w Ga - 4 9", 5, 10271111 }, + { "r1bbqk1n/p1pppprp/n7/1p4p1/5P2/2N3N1/PPPPP1PP/1RBBQKR1 w Ga - 4 9", 6, 273864588 }, + { "rnbqkbrn/p1pp1pp1/4p3/7p/2p4P/2P5/PP1PPPP1/R1BQKBRN w GAga - 0 9", 1, 17 }, + { "rnbqkbrn/p1pp1pp1/4p3/7p/2p4P/2P5/PP1PPPP1/R1BQKBRN w GAga - 0 9", 2, 445 }, + { "rnbqkbrn/p1pp1pp1/4p3/7p/2p4P/2P5/PP1PPPP1/R1BQKBRN w GAga - 0 9", 3, 9076 }, + { "rnbqkbrn/p1pp1pp1/4p3/7p/2p4P/2P5/PP1PPPP1/R1BQKBRN w GAga - 0 9", 4, 255098 }, + { "rnbqkbrn/p1pp1pp1/4p3/7p/2p4P/2P5/PP1PPPP1/R1BQKBRN w GAga - 0 9", 5, 5918310 }, + { "rnbqkbrn/p1pp1pp1/4p3/7p/2p4P/2P5/PP1PPPP1/R1BQKBRN w GAga - 0 9", 6, 174733195 }, + { "rnbqkrnb/1p1pp1p1/2p4p/p4p2/3P2P1/7N/PPPBPP1P/RN1QKR1B w FAfa - 0 9", 1, 34 }, + { "rnbqkrnb/1p1pp1p1/2p4p/p4p2/3P2P1/7N/PPPBPP1P/RN1QKR1B w FAfa - 0 9", 2, 746 }, + { "rnbqkrnb/1p1pp1p1/2p4p/p4p2/3P2P1/7N/PPPBPP1P/RN1QKR1B w FAfa - 0 9", 3, 25319 }, + { "rnbqkrnb/1p1pp1p1/2p4p/p4p2/3P2P1/7N/PPPBPP1P/RN1QKR1B w FAfa - 0 9", 4, 623133 }, + { "rnbqkrnb/1p1pp1p1/2p4p/p4p2/3P2P1/7N/PPPBPP1P/RN1QKR1B w FAfa - 0 9", 5, 21285553 }, + { "rnbqkrnb/1p1pp1p1/2p4p/p4p2/3P2P1/7N/PPPBPP1P/RN1QKR1B w FAfa - 0 9", 6, 569141201 }, + { "rbnqbkr1/1ppppp2/p5n1/6pp/4P3/1N6/PPPP1PPP/RBQ1BRKN w ga - 2 9", 1, 18 }, + { "rbnqbkr1/1ppppp2/p5n1/6pp/4P3/1N6/PPPP1PPP/RBQ1BRKN w ga - 2 9", 2, 466 }, + { "rbnqbkr1/1ppppp2/p5n1/6pp/4P3/1N6/PPPP1PPP/RBQ1BRKN w ga - 2 9", 3, 9683 }, + { "rbnqbkr1/1ppppp2/p5n1/6pp/4P3/1N6/PPPP1PPP/RBQ1BRKN w ga - 2 9", 4, 260864 }, + { "rbnqbkr1/1ppppp2/p5n1/6pp/4P3/1N6/PPPP1PPP/RBQ1BRKN w ga - 2 9", 5, 6051500 }, + { "rbnqbkr1/1ppppp2/p5n1/6pp/4P3/1N6/PPPP1PPP/RBQ1BRKN w ga - 2 9", 6, 170135726 }, + { "rnqb1krn/ppppp1p1/7p/7b/P1P2pPP/8/1P1PPP2/RNQBBKRN w GAga - 0 9", 1, 24 }, + { "rnqb1krn/ppppp1p1/7p/7b/P1P2pPP/8/1P1PPP2/RNQBBKRN w GAga - 0 9", 2, 575 }, + { "rnqb1krn/ppppp1p1/7p/7b/P1P2pPP/8/1P1PPP2/RNQBBKRN w GAga - 0 9", 3, 15400 }, + { "rnqb1krn/ppppp1p1/7p/7b/P1P2pPP/8/1P1PPP2/RNQBBKRN w GAga - 0 9", 4, 385825 }, + { "rnqb1krn/ppppp1p1/7p/7b/P1P2pPP/8/1P1PPP2/RNQBBKRN w GAga - 0 9", 5, 11039042 }, + { "rnqb1krn/ppppp1p1/7p/7b/P1P2pPP/8/1P1PPP2/RNQBBKRN w GAga - 0 9", 6, 291243811 }, + { "rnqkbbr1/p1pp1ppp/4p3/1p6/P3P2n/5P2/1PPP1NPP/RNQKBBR1 w GAga - 2 9", 1, 27 }, + { "rnqkbbr1/p1pp1ppp/4p3/1p6/P3P2n/5P2/1PPP1NPP/RNQKBBR1 w GAga - 2 9", 2, 803 }, + { "rnqkbbr1/p1pp1ppp/4p3/1p6/P3P2n/5P2/1PPP1NPP/RNQKBBR1 w GAga - 2 9", 3, 22883 }, + { "rnqkbbr1/p1pp1ppp/4p3/1p6/P3P2n/5P2/1PPP1NPP/RNQKBBR1 w GAga - 2 9", 4, 694449 }, + { "rnqkbbr1/p1pp1ppp/4p3/1p6/P3P2n/5P2/1PPP1NPP/RNQKBBR1 w GAga - 2 9", 5, 20666099 }, + { "rnqkbbr1/p1pp1ppp/4p3/1p6/P3P2n/5P2/1PPP1NPP/RNQKBBR1 w GAga - 2 9", 6, 638696065 }, + { "rn1kbrnb/1qppp1pp/1p6/p4p2/1B1P4/1P5N/P1P1PPPP/RNQK1R1B w FAfa - 0 9", 1, 37 }, + { "rn1kbrnb/1qppp1pp/1p6/p4p2/1B1P4/1P5N/P1P1PPPP/RNQK1R1B w FAfa - 0 9", 2, 1209 }, + { "rn1kbrnb/1qppp1pp/1p6/p4p2/1B1P4/1P5N/P1P1PPPP/RNQK1R1B w FAfa - 0 9", 3, 43015 }, + { "rn1kbrnb/1qppp1pp/1p6/p4p2/1B1P4/1P5N/P1P1PPPP/RNQK1R1B w FAfa - 0 9", 4, 1425600 }, + { "rn1kbrnb/1qppp1pp/1p6/p4p2/1B1P4/1P5N/P1P1PPPP/RNQK1R1B w FAfa - 0 9", 5, 49748034 }, + { "rn1kbrnb/1qppp1pp/1p6/p4p2/1B1P4/1P5N/P1P1PPPP/RNQK1R1B w FAfa - 0 9", 6, 1671593862 }, + { "rbnqkrbn/Bppp1p2/p5pp/4p3/5P2/6PP/PPPPP3/RBNQKR1N w FAfa - 0 9", 1, 29 }, + { "rbnqkrbn/Bppp1p2/p5pp/4p3/5P2/6PP/PPPPP3/RBNQKR1N w FAfa - 0 9", 2, 720 }, + { "rbnqkrbn/Bppp1p2/p5pp/4p3/5P2/6PP/PPPPP3/RBNQKR1N w FAfa - 0 9", 3, 20434 }, + { "rbnqkrbn/Bppp1p2/p5pp/4p3/5P2/6PP/PPPPP3/RBNQKR1N w FAfa - 0 9", 4, 534148 }, + { "rbnqkrbn/Bppp1p2/p5pp/4p3/5P2/6PP/PPPPP3/RBNQKR1N w FAfa - 0 9", 5, 15384362 }, + { "rbnqkrbn/Bppp1p2/p5pp/4p3/5P2/6PP/PPPPP3/RBNQKR1N w FAfa - 0 9", 6, 421343249 }, + { "rnqbkr1n/1p1ppbpp/3p1p2/p7/8/1P6/P1PPPPPP/R1QBKRBN w FAfa - 0 9", 1, 20 }, + { "rnqbkr1n/1p1ppbpp/3p1p2/p7/8/1P6/P1PPPPPP/R1QBKRBN w FAfa - 0 9", 2, 657 }, + { "rnqbkr1n/1p1ppbpp/3p1p2/p7/8/1P6/P1PPPPPP/R1QBKRBN w FAfa - 0 9", 3, 14424 }, + { "rnqbkr1n/1p1ppbpp/3p1p2/p7/8/1P6/P1PPPPPP/R1QBKRBN w FAfa - 0 9", 4, 492678 }, + { "rnqbkr1n/1p1ppbpp/3p1p2/p7/8/1P6/P1PPPPPP/R1QBKRBN w FAfa - 0 9", 5, 11843134 }, + { "rnqbkr1n/1p1ppbpp/3p1p2/p7/8/1P6/P1PPPPPP/R1QBKRBN w FAfa - 0 9", 6, 413965054 }, + { "rnqkrb1n/ppppp3/6p1/5p1p/2b2P2/P1N5/1PPPP1PP/RQ1KRBBN w EAea - 1 9", 1, 28 }, + { "rnqkrb1n/ppppp3/6p1/5p1p/2b2P2/P1N5/1PPPP1PP/RQ1KRBBN w EAea - 1 9", 2, 749 }, + { "rnqkrb1n/ppppp3/6p1/5p1p/2b2P2/P1N5/1PPPP1PP/RQ1KRBBN w EAea - 1 9", 3, 20684 }, + { "rnqkrb1n/ppppp3/6p1/5p1p/2b2P2/P1N5/1PPPP1PP/RQ1KRBBN w EAea - 1 9", 4, 543151 }, + { "rnqkrb1n/ppppp3/6p1/5p1p/2b2P2/P1N5/1PPPP1PP/RQ1KRBBN w EAea - 1 9", 5, 15379233 }, + { "rnqkrb1n/ppppp3/6p1/5p1p/2b2P2/P1N5/1PPPP1PP/RQ1KRBBN w EAea - 1 9", 6, 417191461 }, + { "rnqk1nbb/1pp2ppp/3pr3/p3p3/3P1P2/2N3N1/PPP1P1PP/R1QKR1BB w EAa - 1 9", 1, 29 }, + { "rnqk1nbb/1pp2ppp/3pr3/p3p3/3P1P2/2N3N1/PPP1P1PP/R1QKR1BB w EAa - 1 9", 2, 883 }, + { "rnqk1nbb/1pp2ppp/3pr3/p3p3/3P1P2/2N3N1/PPP1P1PP/R1QKR1BB w EAa - 1 9", 3, 26412 }, + { "rnqk1nbb/1pp2ppp/3pr3/p3p3/3P1P2/2N3N1/PPP1P1PP/R1QKR1BB w EAa - 1 9", 4, 815098 }, + { "rnqk1nbb/1pp2ppp/3pr3/p3p3/3P1P2/2N3N1/PPP1P1PP/R1QKR1BB w EAa - 1 9", 5, 25144295 }, + { "rnqk1nbb/1pp2ppp/3pr3/p3p3/3P1P2/2N3N1/PPP1P1PP/R1QKR1BB w EAa - 1 9", 6, 789705382 }, + { "bbr1kqrn/p1p1ppp1/1p2n2p/3p4/1P1P4/2N5/P1P1PPPP/BBR1KQRN w GCgc - 0 9", 1, 22 }, + { "bbr1kqrn/p1p1ppp1/1p2n2p/3p4/1P1P4/2N5/P1P1PPPP/BBR1KQRN w GCgc - 0 9", 2, 485 }, + { "bbr1kqrn/p1p1ppp1/1p2n2p/3p4/1P1P4/2N5/P1P1PPPP/BBR1KQRN w GCgc - 0 9", 3, 11475 }, + { "bbr1kqrn/p1p1ppp1/1p2n2p/3p4/1P1P4/2N5/P1P1PPPP/BBR1KQRN w GCgc - 0 9", 4, 271271 }, + { "bbr1kqrn/p1p1ppp1/1p2n2p/3p4/1P1P4/2N5/P1P1PPPP/BBR1KQRN w GCgc - 0 9", 5, 6825123 }, + { "bbr1kqrn/p1p1ppp1/1p2n2p/3p4/1P1P4/2N5/P1P1PPPP/BBR1KQRN w GCgc - 0 9", 6, 171793012 }, + { "brnbkq1n/ppp1ppr1/7p/3p2p1/2P3PP/8/PPBPPP2/BRN1KQRN w GBb - 2 9", 1, 30 }, + { "brnbkq1n/ppp1ppr1/7p/3p2p1/2P3PP/8/PPBPPP2/BRN1KQRN w GBb - 2 9", 2, 634 }, + { "brnbkq1n/ppp1ppr1/7p/3p2p1/2P3PP/8/PPBPPP2/BRN1KQRN w GBb - 2 9", 3, 19017 }, + { "brnbkq1n/ppp1ppr1/7p/3p2p1/2P3PP/8/PPBPPP2/BRN1KQRN w GBb - 2 9", 4, 442537 }, + { "brnbkq1n/ppp1ppr1/7p/3p2p1/2P3PP/8/PPBPPP2/BRN1KQRN w GBb - 2 9", 5, 13674310 }, + { "brnbkq1n/ppp1ppr1/7p/3p2p1/2P3PP/8/PPBPPP2/BRN1KQRN w GBb - 2 9", 6, 345386924 }, + { "brnkqbr1/1pppp1pp/5p2/p7/P1P1P2n/8/1P1P1PP1/BRNKQBRN w GBgb - 0 9", 1, 21 }, + { "brnkqbr1/1pppp1pp/5p2/p7/P1P1P2n/8/1P1P1PP1/BRNKQBRN w GBgb - 0 9", 2, 504 }, + { "brnkqbr1/1pppp1pp/5p2/p7/P1P1P2n/8/1P1P1PP1/BRNKQBRN w GBgb - 0 9", 3, 11672 }, + { "brnkqbr1/1pppp1pp/5p2/p7/P1P1P2n/8/1P1P1PP1/BRNKQBRN w GBgb - 0 9", 4, 305184 }, + { "brnkqbr1/1pppp1pp/5p2/p7/P1P1P2n/8/1P1P1PP1/BRNKQBRN w GBgb - 0 9", 5, 7778289 }, + { "brnkqbr1/1pppp1pp/5p2/p7/P1P1P2n/8/1P1P1PP1/BRNKQBRN w GBgb - 0 9", 6, 217596497 }, + { "b1rkqrnb/p1ppp1pp/1p1n4/5p2/5P2/PN5P/1PPPP1P1/BR1KQRNB w FBf - 0 9", 1, 23 }, + { "b1rkqrnb/p1ppp1pp/1p1n4/5p2/5P2/PN5P/1PPPP1P1/BR1KQRNB w FBf - 0 9", 2, 688 }, + { "b1rkqrnb/p1ppp1pp/1p1n4/5p2/5P2/PN5P/1PPPP1P1/BR1KQRNB w FBf - 0 9", 3, 17259 }, + { "b1rkqrnb/p1ppp1pp/1p1n4/5p2/5P2/PN5P/1PPPP1P1/BR1KQRNB w FBf - 0 9", 4, 531592 }, + { "b1rkqrnb/p1ppp1pp/1p1n4/5p2/5P2/PN5P/1PPPP1P1/BR1KQRNB w FBf - 0 9", 5, 14228372 }, + { "b1rkqrnb/p1ppp1pp/1p1n4/5p2/5P2/PN5P/1PPPP1P1/BR1KQRNB w FBf - 0 9", 6, 451842354 }, + { "1bbnkqrn/rppppp2/p5p1/7p/7P/P1P1P3/1P1P1PP1/RBBNKQRN w GAg - 1 9", 1, 25 }, + { "1bbnkqrn/rppppp2/p5p1/7p/7P/P1P1P3/1P1P1PP1/RBBNKQRN w GAg - 1 9", 2, 450 }, + { "1bbnkqrn/rppppp2/p5p1/7p/7P/P1P1P3/1P1P1PP1/RBBNKQRN w GAg - 1 9", 3, 12391 }, + { "1bbnkqrn/rppppp2/p5p1/7p/7P/P1P1P3/1P1P1PP1/RBBNKQRN w GAg - 1 9", 4, 263946 }, + { "1bbnkqrn/rppppp2/p5p1/7p/7P/P1P1P3/1P1P1PP1/RBBNKQRN w GAg - 1 9", 5, 7752404 }, + { "1bbnkqrn/rppppp2/p5p1/7p/7P/P1P1P3/1P1P1PP1/RBBNKQRN w GAg - 1 9", 6, 185393913 }, + { "rnbbkqr1/1pppppp1/7p/p3n3/PP5P/8/1BPPPPP1/RN1BKQRN w GAga - 0 9", 1, 23 }, + { "rnbbkqr1/1pppppp1/7p/p3n3/PP5P/8/1BPPPPP1/RN1BKQRN w GAga - 0 9", 2, 543 }, + { "rnbbkqr1/1pppppp1/7p/p3n3/PP5P/8/1BPPPPP1/RN1BKQRN w GAga - 0 9", 3, 12224 }, + { "rnbbkqr1/1pppppp1/7p/p3n3/PP5P/8/1BPPPPP1/RN1BKQRN w GAga - 0 9", 4, 305812 }, + { "rnbbkqr1/1pppppp1/7p/p3n3/PP5P/8/1BPPPPP1/RN1BKQRN w GAga - 0 9", 5, 7549008 }, + { "rnbbkqr1/1pppppp1/7p/p3n3/PP5P/8/1BPPPPP1/RN1BKQRN w GAga - 0 9", 6, 199883770 }, + { "r1bkqbrn/ppppp1pp/8/5p2/3nPP2/1P4N1/P1PP2PP/RNBKQBR1 w GAga - 1 9", 1, 27 }, + { "r1bkqbrn/ppppp1pp/8/5p2/3nPP2/1P4N1/P1PP2PP/RNBKQBR1 w GAga - 1 9", 2, 751 }, + { "r1bkqbrn/ppppp1pp/8/5p2/3nPP2/1P4N1/P1PP2PP/RNBKQBR1 w GAga - 1 9", 3, 21158 }, + { "r1bkqbrn/ppppp1pp/8/5p2/3nPP2/1P4N1/P1PP2PP/RNBKQBR1 w GAga - 1 9", 4, 600417 }, + { "r1bkqbrn/ppppp1pp/8/5p2/3nPP2/1P4N1/P1PP2PP/RNBKQBR1 w GAga - 1 9", 5, 17989920 }, + { "r1bkqbrn/ppppp1pp/8/5p2/3nPP2/1P4N1/P1PP2PP/RNBKQBR1 w GAga - 1 9", 6, 527273615 }, + { "rnbkqr1b/1p1pp1pp/p4p1n/2p5/1P5P/N4P2/P1PPP1P1/R1BKQRNB w FAfa - 0 9", 1, 21 }, + { "rnbkqr1b/1p1pp1pp/p4p1n/2p5/1P5P/N4P2/P1PPP1P1/R1BKQRNB w FAfa - 0 9", 2, 498 }, + { "rnbkqr1b/1p1pp1pp/p4p1n/2p5/1P5P/N4P2/P1PPP1P1/R1BKQRNB w FAfa - 0 9", 3, 11738 }, + { "rnbkqr1b/1p1pp1pp/p4p1n/2p5/1P5P/N4P2/P1PPP1P1/R1BKQRNB w FAfa - 0 9", 4, 302278 }, + { "rnbkqr1b/1p1pp1pp/p4p1n/2p5/1P5P/N4P2/P1PPP1P1/R1BKQRNB w FAfa - 0 9", 5, 7808375 }, + { "rnbkqr1b/1p1pp1pp/p4p1n/2p5/1P5P/N4P2/P1PPP1P1/R1BKQRNB w FAfa - 0 9", 6, 216224115 }, + { "rbnkbqrn/p1p3pp/1p1p4/B3pp2/3P2P1/6N1/PPP1PP1P/RBNK1QR1 w GAga - 0 9", 1, 34 }, + { "rbnkbqrn/p1p3pp/1p1p4/B3pp2/3P2P1/6N1/PPP1PP1P/RBNK1QR1 w GAga - 0 9", 2, 977 }, + { "rbnkbqrn/p1p3pp/1p1p4/B3pp2/3P2P1/6N1/PPP1PP1P/RBNK1QR1 w GAga - 0 9", 3, 33464 }, + { "rbnkbqrn/p1p3pp/1p1p4/B3pp2/3P2P1/6N1/PPP1PP1P/RBNK1QR1 w GAga - 0 9", 4, 961128 }, + { "rbnkbqrn/p1p3pp/1p1p4/B3pp2/3P2P1/6N1/PPP1PP1P/RBNK1QR1 w GAga - 0 9", 5, 33318567 }, + { "rbnkbqrn/p1p3pp/1p1p4/B3pp2/3P2P1/6N1/PPP1PP1P/RBNK1QR1 w GAga - 0 9", 6, 978991050 }, + { "r1kbbqrn/ppp3pp/2np1p2/1P2p3/3P1P2/8/P1P1P1PP/RNKBBQRN w GAga - 0 9", 1, 32 }, + { "r1kbbqrn/ppp3pp/2np1p2/1P2p3/3P1P2/8/P1P1P1PP/RNKBBQRN w GAga - 0 9", 2, 920 }, + { "r1kbbqrn/ppp3pp/2np1p2/1P2p3/3P1P2/8/P1P1P1PP/RNKBBQRN w GAga - 0 9", 3, 28916 }, + { "r1kbbqrn/ppp3pp/2np1p2/1P2p3/3P1P2/8/P1P1P1PP/RNKBBQRN w GAga - 0 9", 4, 844881 }, + { "r1kbbqrn/ppp3pp/2np1p2/1P2p3/3P1P2/8/P1P1P1PP/RNKBBQRN w GAga - 0 9", 5, 26763259 }, + { "r1kbbqrn/ppp3pp/2np1p2/1P2p3/3P1P2/8/P1P1P1PP/RNKBBQRN w GAga - 0 9", 6, 797524786 }, + { "rk1qbbrn/p2npppp/1p6/2p4Q/8/4P3/PPPP1PPP/RNK1B1RN w GA - 2 9", 1, 35 }, + { "rk1qbbrn/p2npppp/1p6/2p4Q/8/4P3/PPPP1PPP/RNK1B1RN w GA - 2 9", 2, 657 }, + { "rk1qbbrn/p2npppp/1p6/2p4Q/8/4P3/PPPP1PPP/RNK1B1RN w GA - 2 9", 3, 22359 }, + { "rk1qbbrn/p2npppp/1p6/2p4Q/8/4P3/PPPP1PPP/RNK1B1RN w GA - 2 9", 4, 495406 }, + { "rk1qbbrn/p2npppp/1p6/2p4Q/8/4P3/PPPP1PPP/RNK1B1RN w GA - 2 9", 5, 16662477 }, + { "rk1qbbrn/p2npppp/1p6/2p4Q/8/4P3/PPPP1PPP/RNK1B1RN w GA - 2 9", 6, 419496845 }, + { "rnk1brnb/pp1p1pp1/8/q1p1p2p/5P2/NP6/P1PPP1PP/R1KQBRNB w FAfa - 1 9", 1, 26 }, + { "rnk1brnb/pp1p1pp1/8/q1p1p2p/5P2/NP6/P1PPP1PP/R1KQBRNB w FAfa - 1 9", 2, 774 }, + { "rnk1brnb/pp1p1pp1/8/q1p1p2p/5P2/NP6/P1PPP1PP/R1KQBRNB w FAfa - 1 9", 3, 20215 }, + { "rnk1brnb/pp1p1pp1/8/q1p1p2p/5P2/NP6/P1PPP1PP/R1KQBRNB w FAfa - 1 9", 4, 610661 }, + { "rnk1brnb/pp1p1pp1/8/q1p1p2p/5P2/NP6/P1PPP1PP/R1KQBRNB w FAfa - 1 9", 5, 16987110 }, + { "rnk1brnb/pp1p1pp1/8/q1p1p2p/5P2/NP6/P1PPP1PP/R1KQBRNB w FAfa - 1 9", 6, 523437649 }, + { "rb1kqrbn/npp1ppp1/p7/3P3p/2PP4/8/PP3PPP/RBNKQRBN w FAfa - 0 9", 1, 35 }, + { "rb1kqrbn/npp1ppp1/p7/3P3p/2PP4/8/PP3PPP/RBNKQRBN w FAfa - 0 9", 2, 775 }, + { "rb1kqrbn/npp1ppp1/p7/3P3p/2PP4/8/PP3PPP/RBNKQRBN w FAfa - 0 9", 3, 27395 }, + { "rb1kqrbn/npp1ppp1/p7/3P3p/2PP4/8/PP3PPP/RBNKQRBN w FAfa - 0 9", 4, 661118 }, + { "rb1kqrbn/npp1ppp1/p7/3P3p/2PP4/8/PP3PPP/RBNKQRBN w FAfa - 0 9", 5, 23983464 }, + { "rb1kqrbn/npp1ppp1/p7/3P3p/2PP4/8/PP3PPP/RBNKQRBN w FAfa - 0 9", 6, 625669222 }, + { "rnkb1rbn/pp1p2pp/8/2p1pp1q/P6P/1PN5/2PPPPP1/R1KBQRBN w FAfa - 1 9", 1, 22 }, + { "rnkb1rbn/pp1p2pp/8/2p1pp1q/P6P/1PN5/2PPPPP1/R1KBQRBN w FAfa - 1 9", 2, 899 }, + { "rnkb1rbn/pp1p2pp/8/2p1pp1q/P6P/1PN5/2PPPPP1/R1KBQRBN w FAfa - 1 9", 3, 21188 }, + { "rnkb1rbn/pp1p2pp/8/2p1pp1q/P6P/1PN5/2PPPPP1/R1KBQRBN w FAfa - 1 9", 4, 850597 }, + { "rnkb1rbn/pp1p2pp/8/2p1pp1q/P6P/1PN5/2PPPPP1/R1KBQRBN w FAfa - 1 9", 5, 21518343 }, + { "rnkb1rbn/pp1p2pp/8/2p1pp1q/P6P/1PN5/2PPPPP1/R1KBQRBN w FAfa - 1 9", 6, 857951339 }, + { "rnkqrbbn/1pppp1p1/8/p2N1p1p/2P4P/8/PP1PPPP1/R1KQRBBN w EAea - 0 9", 1, 29 }, + { "rnkqrbbn/1pppp1p1/8/p2N1p1p/2P4P/8/PP1PPPP1/R1KQRBBN w EAea - 0 9", 2, 585 }, + { "rnkqrbbn/1pppp1p1/8/p2N1p1p/2P4P/8/PP1PPPP1/R1KQRBBN w EAea - 0 9", 3, 17571 }, + { "rnkqrbbn/1pppp1p1/8/p2N1p1p/2P4P/8/PP1PPPP1/R1KQRBBN w EAea - 0 9", 4, 393221 }, + { "rnkqrbbn/1pppp1p1/8/p2N1p1p/2P4P/8/PP1PPPP1/R1KQRBBN w EAea - 0 9", 5, 12238776 }, + { "rnkqrbbn/1pppp1p1/8/p2N1p1p/2P4P/8/PP1PPPP1/R1KQRBBN w EAea - 0 9", 6, 299752383 }, + { "rnk1r1bb/pp1ppppp/1q4n1/2p5/5P1P/3PP3/PPP3P1/RNKQRNBB w EAea - 1 9", 1, 27 }, + { "rnk1r1bb/pp1ppppp/1q4n1/2p5/5P1P/3PP3/PPP3P1/RNKQRNBB w EAea - 1 9", 2, 884 }, + { "rnk1r1bb/pp1ppppp/1q4n1/2p5/5P1P/3PP3/PPP3P1/RNKQRNBB w EAea - 1 9", 3, 24613 }, + { "rnk1r1bb/pp1ppppp/1q4n1/2p5/5P1P/3PP3/PPP3P1/RNKQRNBB w EAea - 1 9", 4, 811915 }, + { "rnk1r1bb/pp1ppppp/1q4n1/2p5/5P1P/3PP3/PPP3P1/RNKQRNBB w EAea - 1 9", 5, 23698701 }, + { "rnk1r1bb/pp1ppppp/1q4n1/2p5/5P1P/3PP3/PPP3P1/RNKQRNBB w EAea - 1 9", 6, 790239502 }, + { "bbrnkrqn/1ppp1p2/6pp/p3p3/5PP1/2PB4/PP1PP2P/B1RNKRQN w FCfc - 0 9", 1, 37 }, + { "bbrnkrqn/1ppp1p2/6pp/p3p3/5PP1/2PB4/PP1PP2P/B1RNKRQN w FCfc - 0 9", 2, 693 }, + { "bbrnkrqn/1ppp1p2/6pp/p3p3/5PP1/2PB4/PP1PP2P/B1RNKRQN w FCfc - 0 9", 3, 25425 }, + { "bbrnkrqn/1ppp1p2/6pp/p3p3/5PP1/2PB4/PP1PP2P/B1RNKRQN w FCfc - 0 9", 4, 550527 }, + { "bbrnkrqn/1ppp1p2/6pp/p3p3/5PP1/2PB4/PP1PP2P/B1RNKRQN w FCfc - 0 9", 5, 20138432 }, + { "bbrnkrqn/1ppp1p2/6pp/p3p3/5PP1/2PB4/PP1PP2P/B1RNKRQN w FCfc - 0 9", 6, 481498664 }, + { "b1rbkrqn/ppp2ppp/1n2p3/3p4/6P1/2PP4/PP2PP1P/BRNBKRQN w FBf - 1 9", 1, 21 }, + { "b1rbkrqn/ppp2ppp/1n2p3/3p4/6P1/2PP4/PP2PP1P/BRNBKRQN w FBf - 1 9", 2, 463 }, + { "b1rbkrqn/ppp2ppp/1n2p3/3p4/6P1/2PP4/PP2PP1P/BRNBKRQN w FBf - 1 9", 3, 10610 }, + { "b1rbkrqn/ppp2ppp/1n2p3/3p4/6P1/2PP4/PP2PP1P/BRNBKRQN w FBf - 1 9", 4, 253204 }, + { "b1rbkrqn/ppp2ppp/1n2p3/3p4/6P1/2PP4/PP2PP1P/BRNBKRQN w FBf - 1 9", 5, 6307276 }, + { "b1rbkrqn/ppp2ppp/1n2p3/3p4/6P1/2PP4/PP2PP1P/BRNBKRQN w FBf - 1 9", 6, 159025909 }, + { "brnkrb1n/1pp1p1pp/3p4/p1Nq1p2/2P5/8/PP1PPPPP/BRK1RBQN w eb - 2 9", 1, 27 }, + { "brnkrb1n/1pp1p1pp/3p4/p1Nq1p2/2P5/8/PP1PPPPP/BRK1RBQN w eb - 2 9", 2, 725 }, + { "brnkrb1n/1pp1p1pp/3p4/p1Nq1p2/2P5/8/PP1PPPPP/BRK1RBQN w eb - 2 9", 3, 17842 }, + { "brnkrb1n/1pp1p1pp/3p4/p1Nq1p2/2P5/8/PP1PPPPP/BRK1RBQN w eb - 2 9", 4, 496072 }, + { "brnkrb1n/1pp1p1pp/3p4/p1Nq1p2/2P5/8/PP1PPPPP/BRK1RBQN w eb - 2 9", 5, 12604078 }, + { "brnkrb1n/1pp1p1pp/3p4/p1Nq1p2/2P5/8/PP1PPPPP/BRK1RBQN w eb - 2 9", 6, 362747791 }, + { "brn1r1nb/ppppkppp/4p3/8/2PP1P2/8/PP1KP1PP/BRN1RQNB w - - 1 9", 1, 25 }, + { "brn1r1nb/ppppkppp/4p3/8/2PP1P2/8/PP1KP1PP/BRN1RQNB w - - 1 9", 2, 623 }, + { "brn1r1nb/ppppkppp/4p3/8/2PP1P2/8/PP1KP1PP/BRN1RQNB w - - 1 9", 3, 16874 }, + { "brn1r1nb/ppppkppp/4p3/8/2PP1P2/8/PP1KP1PP/BRN1RQNB w - - 1 9", 4, 426659 }, + { "brn1r1nb/ppppkppp/4p3/8/2PP1P2/8/PP1KP1PP/BRN1RQNB w - - 1 9", 5, 12290985 }, + { "brn1r1nb/ppppkppp/4p3/8/2PP1P2/8/PP1KP1PP/BRN1RQNB w - - 1 9", 6, 317097424 }, + { "rbb1krqn/1pp1pp1p/p3n1p1/3pP3/8/1PN5/P1PP1PPP/RBB1KRQN w FAfa d6 0 9", 1, 23 }, + { "rbb1krqn/1pp1pp1p/p3n1p1/3pP3/8/1PN5/P1PP1PPP/RBB1KRQN w FAfa d6 0 9", 2, 529 }, + { "rbb1krqn/1pp1pp1p/p3n1p1/3pP3/8/1PN5/P1PP1PPP/RBB1KRQN w FAfa d6 0 9", 3, 12641 }, + { "rbb1krqn/1pp1pp1p/p3n1p1/3pP3/8/1PN5/P1PP1PPP/RBB1KRQN w FAfa d6 0 9", 4, 310277 }, + { "rbb1krqn/1pp1pp1p/p3n1p1/3pP3/8/1PN5/P1PP1PPP/RBB1KRQN w FAfa d6 0 9", 5, 7861413 }, + { "rbb1krqn/1pp1pp1p/p3n1p1/3pP3/8/1PN5/P1PP1PPP/RBB1KRQN w FAfa d6 0 9", 6, 202594556 }, + { "r1bbkrqn/p1pppppp/8/4n3/1p5P/P2P2P1/1PP1PP2/RNBBKRQN w FAfa - 0 9", 1, 23 }, + { "r1bbkrqn/p1pppppp/8/4n3/1p5P/P2P2P1/1PP1PP2/RNBBKRQN w FAfa - 0 9", 2, 571 }, + { "r1bbkrqn/p1pppppp/8/4n3/1p5P/P2P2P1/1PP1PP2/RNBBKRQN w FAfa - 0 9", 3, 13133 }, + { "r1bbkrqn/p1pppppp/8/4n3/1p5P/P2P2P1/1PP1PP2/RNBBKRQN w FAfa - 0 9", 4, 346793 }, + { "r1bbkrqn/p1pppppp/8/4n3/1p5P/P2P2P1/1PP1PP2/RNBBKRQN w FAfa - 0 9", 5, 8699448 }, + { "r1bbkrqn/p1pppppp/8/4n3/1p5P/P2P2P1/1PP1PP2/RNBBKRQN w FAfa - 0 9", 6, 243460643 }, + { "rnbkrbqn/p1pp1ppp/4p3/1p6/8/BPN3P1/P1PPPP1P/R2KRBQN w EAea - 2 9", 1, 29 }, + { "rnbkrbqn/p1pp1ppp/4p3/1p6/8/BPN3P1/P1PPPP1P/R2KRBQN w EAea - 2 9", 2, 692 }, + { "rnbkrbqn/p1pp1ppp/4p3/1p6/8/BPN3P1/P1PPPP1P/R2KRBQN w EAea - 2 9", 3, 20014 }, + { "rnbkrbqn/p1pp1ppp/4p3/1p6/8/BPN3P1/P1PPPP1P/R2KRBQN w EAea - 2 9", 4, 500375 }, + { "rnbkrbqn/p1pp1ppp/4p3/1p6/8/BPN3P1/P1PPPP1P/R2KRBQN w EAea - 2 9", 5, 14904192 }, + { "rnbkrbqn/p1pp1ppp/4p3/1p6/8/BPN3P1/P1PPPP1P/R2KRBQN w EAea - 2 9", 6, 386694739 }, + { "rnbkrqn1/pppppp2/8/1Q2b1pp/P3P3/5P2/1PPP2PP/RNBKR1NB w EAea - 0 9", 1, 37 }, + { "rnbkrqn1/pppppp2/8/1Q2b1pp/P3P3/5P2/1PPP2PP/RNBKR1NB w EAea - 0 9", 2, 1001 }, + { "rnbkrqn1/pppppp2/8/1Q2b1pp/P3P3/5P2/1PPP2PP/RNBKR1NB w EAea - 0 9", 3, 36440 }, + { "rnbkrqn1/pppppp2/8/1Q2b1pp/P3P3/5P2/1PPP2PP/RNBKR1NB w EAea - 0 9", 4, 987842 }, + { "rnbkrqn1/pppppp2/8/1Q2b1pp/P3P3/5P2/1PPP2PP/RNBKR1NB w EAea - 0 9", 5, 35626426 }, + { "rnbkrqn1/pppppp2/8/1Q2b1pp/P3P3/5P2/1PPP2PP/RNBKR1NB w EAea - 0 9", 6, 993747544 }, + { "rbnkbrqn/p1pppp2/7p/1p4pP/3P1P2/8/PPP1P1P1/RBNKBRQN w FAfa - 0 9", 1, 30 }, + { "rbnkbrqn/p1pppp2/7p/1p4pP/3P1P2/8/PPP1P1P1/RBNKBRQN w FAfa - 0 9", 2, 564 }, + { "rbnkbrqn/p1pppp2/7p/1p4pP/3P1P2/8/PPP1P1P1/RBNKBRQN w FAfa - 0 9", 3, 17143 }, + { "rbnkbrqn/p1pppp2/7p/1p4pP/3P1P2/8/PPP1P1P1/RBNKBRQN w FAfa - 0 9", 4, 381364 }, + { "rbnkbrqn/p1pppp2/7p/1p4pP/3P1P2/8/PPP1P1P1/RBNKBRQN w FAfa - 0 9", 5, 11859538 }, + { "rbnkbrqn/p1pppp2/7p/1p4pP/3P1P2/8/PPP1P1P1/RBNKBRQN w FAfa - 0 9", 6, 293703269 }, + { "1nkbbrqn/3ppppp/r1p5/pp6/8/4PP2/PPPPN1PP/RNKBBRQ1 w FAf - 2 9", 1, 26 }, + { "1nkbbrqn/3ppppp/r1p5/pp6/8/4PP2/PPPPN1PP/RNKBBRQ1 w FAf - 2 9", 2, 546 }, + { "1nkbbrqn/3ppppp/r1p5/pp6/8/4PP2/PPPPN1PP/RNKBBRQ1 w FAf - 2 9", 3, 14641 }, + { "1nkbbrqn/3ppppp/r1p5/pp6/8/4PP2/PPPPN1PP/RNKBBRQ1 w FAf - 2 9", 4, 344592 }, + { "1nkbbrqn/3ppppp/r1p5/pp6/8/4PP2/PPPPN1PP/RNKBBRQ1 w FAf - 2 9", 5, 9556962 }, + { "1nkbbrqn/3ppppp/r1p5/pp6/8/4PP2/PPPPN1PP/RNKBBRQ1 w FAf - 2 9", 6, 245137199 }, + { "rnkrbbq1/pppppnp1/7p/8/1B1Q1p2/3P1P2/PPP1P1PP/RNKR1B1N w DAda - 2 9", 1, 43 }, + { "rnkrbbq1/pppppnp1/7p/8/1B1Q1p2/3P1P2/PPP1P1PP/RNKR1B1N w DAda - 2 9", 2, 887 }, + { "rnkrbbq1/pppppnp1/7p/8/1B1Q1p2/3P1P2/PPP1P1PP/RNKR1B1N w DAda - 2 9", 3, 36240 }, + { "rnkrbbq1/pppppnp1/7p/8/1B1Q1p2/3P1P2/PPP1P1PP/RNKR1B1N w DAda - 2 9", 4, 846858 }, + { "rnkrbbq1/pppppnp1/7p/8/1B1Q1p2/3P1P2/PPP1P1PP/RNKR1B1N w DAda - 2 9", 5, 33185346 }, + { "rnkrbbq1/pppppnp1/7p/8/1B1Q1p2/3P1P2/PPP1P1PP/RNKR1B1N w DAda - 2 9", 6, 851927292 }, + { "1rkrbqnb/pppppp2/2n3p1/7p/3P3P/P4N2/1PP1PPP1/RNKRBQ1B w DAd - 0 9", 1, 26 }, + { "1rkrbqnb/pppppp2/2n3p1/7p/3P3P/P4N2/1PP1PPP1/RNKRBQ1B w DAd - 0 9", 2, 622 }, + { "1rkrbqnb/pppppp2/2n3p1/7p/3P3P/P4N2/1PP1PPP1/RNKRBQ1B w DAd - 0 9", 3, 16049 }, + { "1rkrbqnb/pppppp2/2n3p1/7p/3P3P/P4N2/1PP1PPP1/RNKRBQ1B w DAd - 0 9", 4, 403921 }, + { "1rkrbqnb/pppppp2/2n3p1/7p/3P3P/P4N2/1PP1PPP1/RNKRBQ1B w DAd - 0 9", 5, 10786140 }, + { "1rkrbqnb/pppppp2/2n3p1/7p/3P3P/P4N2/1PP1PPP1/RNKRBQ1B w DAd - 0 9", 6, 285233838 }, + { "rbnkr1bn/pp1pqp1p/2p1p3/6p1/3P4/7P/PPP1PPP1/RBNKRQBN w EAea - 0 9", 1, 19 }, + { "rbnkr1bn/pp1pqp1p/2p1p3/6p1/3P4/7P/PPP1PPP1/RBNKRQBN w EAea - 0 9", 2, 566 }, + { "rbnkr1bn/pp1pqp1p/2p1p3/6p1/3P4/7P/PPP1PPP1/RBNKRQBN w EAea - 0 9", 3, 12257 }, + { "rbnkr1bn/pp1pqp1p/2p1p3/6p1/3P4/7P/PPP1PPP1/RBNKRQBN w EAea - 0 9", 4, 381197 }, + { "rbnkr1bn/pp1pqp1p/2p1p3/6p1/3P4/7P/PPP1PPP1/RBNKRQBN w EAea - 0 9", 5, 9107175 }, + { "rbnkr1bn/pp1pqp1p/2p1p3/6p1/3P4/7P/PPP1PPP1/RBNKRQBN w EAea - 0 9", 6, 293397389 }, + { "r1kbrqb1/pppp2pp/2n1p1n1/5p1B/4PP2/P7/1PPP2PP/RNK1RQBN w EAea - 2 9", 1, 39 }, + { "r1kbrqb1/pppp2pp/2n1p1n1/5p1B/4PP2/P7/1PPP2PP/RNK1RQBN w EAea - 2 9", 2, 1359 }, + { "r1kbrqb1/pppp2pp/2n1p1n1/5p1B/4PP2/P7/1PPP2PP/RNK1RQBN w EAea - 2 9", 3, 53626 }, + { "r1kbrqb1/pppp2pp/2n1p1n1/5p1B/4PP2/P7/1PPP2PP/RNK1RQBN w EAea - 2 9", 4, 1876028 }, + { "r1kbrqb1/pppp2pp/2n1p1n1/5p1B/4PP2/P7/1PPP2PP/RNK1RQBN w EAea - 2 9", 5, 73871486 }, + { "r1kbrqb1/pppp2pp/2n1p1n1/5p1B/4PP2/P7/1PPP2PP/RNK1RQBN w EAea - 2 9", 6, 2633945690 }, + { "rnkrqbbn/p1p3pp/1p1ppp2/8/1P6/3P2P1/PKP1PP1P/RN1RQBBN w da - 0 9", 1, 26 }, + { "rnkrqbbn/p1p3pp/1p1ppp2/8/1P6/3P2P1/PKP1PP1P/RN1RQBBN w da - 0 9", 2, 776 }, + { "rnkrqbbn/p1p3pp/1p1ppp2/8/1P6/3P2P1/PKP1PP1P/RN1RQBBN w da - 0 9", 3, 20735 }, + { "rnkrqbbn/p1p3pp/1p1ppp2/8/1P6/3P2P1/PKP1PP1P/RN1RQBBN w da - 0 9", 4, 611907 }, + { "rnkrqbbn/p1p3pp/1p1ppp2/8/1P6/3P2P1/PKP1PP1P/RN1RQBBN w da - 0 9", 5, 16884013 }, + { "rnkrqbbn/p1p3pp/1p1ppp2/8/1P6/3P2P1/PKP1PP1P/RN1RQBBN w da - 0 9", 6, 503561996 }, + { "rnkrqnbb/ppp2p1p/3p4/4p1p1/3P3P/N1Q5/PPP1PPP1/R1KR1NBB w DAda - 0 9", 1, 40 }, + { "rnkrqnbb/ppp2p1p/3p4/4p1p1/3P3P/N1Q5/PPP1PPP1/R1KR1NBB w DAda - 0 9", 2, 1175 }, + { "rnkrqnbb/ppp2p1p/3p4/4p1p1/3P3P/N1Q5/PPP1PPP1/R1KR1NBB w DAda - 0 9", 3, 45637 }, + { "rnkrqnbb/ppp2p1p/3p4/4p1p1/3P3P/N1Q5/PPP1PPP1/R1KR1NBB w DAda - 0 9", 4, 1375884 }, + { "rnkrqnbb/ppp2p1p/3p4/4p1p1/3P3P/N1Q5/PPP1PPP1/R1KR1NBB w DAda - 0 9", 5, 52620163 }, + { "rnkrqnbb/ppp2p1p/3p4/4p1p1/3P3P/N1Q5/PPP1PPP1/R1KR1NBB w DAda - 0 9", 6, 1633655838 }, + { "bbrnkrn1/p1pppp2/1p6/6pp/3q4/1P3QP1/P1PPPP1P/BBRNKRN1 w FCfc - 0 9", 1, 34 }, + { "bbrnkrn1/p1pppp2/1p6/6pp/3q4/1P3QP1/P1PPPP1P/BBRNKRN1 w FCfc - 0 9", 2, 1398 }, + { "bbrnkrn1/p1pppp2/1p6/6pp/3q4/1P3QP1/P1PPPP1P/BBRNKRN1 w FCfc - 0 9", 3, 45749 }, + { "bbrnkrn1/p1pppp2/1p6/6pp/3q4/1P3QP1/P1PPPP1P/BBRNKRN1 w FCfc - 0 9", 4, 1712950 }, + { "bbrnkrn1/p1pppp2/1p6/6pp/3q4/1P3QP1/P1PPPP1P/BBRNKRN1 w FCfc - 0 9", 5, 57268492 }, + { "bbrnkrn1/p1pppp2/1p6/6pp/3q4/1P3QP1/P1PPPP1P/BBRNKRN1 w FCfc - 0 9", 6, 2059942014 }, + { "br1bkrnq/1p2pppp/pnp5/3p4/P1P5/5P2/1P1PPKPP/BRNB1RNQ w fb - 2 9", 1, 24 }, + { "br1bkrnq/1p2pppp/pnp5/3p4/P1P5/5P2/1P1PPKPP/BRNB1RNQ w fb - 2 9", 2, 501 }, + { "br1bkrnq/1p2pppp/pnp5/3p4/P1P5/5P2/1P1PPKPP/BRNB1RNQ w fb - 2 9", 3, 12237 }, + { "br1bkrnq/1p2pppp/pnp5/3p4/P1P5/5P2/1P1PPKPP/BRNB1RNQ w fb - 2 9", 4, 284936 }, + { "br1bkrnq/1p2pppp/pnp5/3p4/P1P5/5P2/1P1PPKPP/BRNB1RNQ w fb - 2 9", 5, 7049659 }, + { "br1bkrnq/1p2pppp/pnp5/3p4/P1P5/5P2/1P1PPKPP/BRNB1RNQ w fb - 2 9", 6, 177940764 }, + { "brnkrbn1/pppppp1q/B6p/6p1/8/1P2PP2/P1PP2PP/BRNKR1NQ w EBeb - 0 9", 1, 34 }, + { "brnkrbn1/pppppp1q/B6p/6p1/8/1P2PP2/P1PP2PP/BRNKR1NQ w EBeb - 0 9", 2, 815 }, + { "brnkrbn1/pppppp1q/B6p/6p1/8/1P2PP2/P1PP2PP/BRNKR1NQ w EBeb - 0 9", 3, 25868 }, + { "brnkrbn1/pppppp1q/B6p/6p1/8/1P2PP2/P1PP2PP/BRNKR1NQ w EBeb - 0 9", 4, 700970 }, + { "brnkrbn1/pppppp1q/B6p/6p1/8/1P2PP2/P1PP2PP/BRNKR1NQ w EBeb - 0 9", 5, 22006883 }, + { "brnkrbn1/pppppp1q/B6p/6p1/8/1P2PP2/P1PP2PP/BRNKR1NQ w EBeb - 0 9", 6, 639803952 }, + { "br1krnqb/pppppp1p/1n4p1/8/8/P2NN3/2PPPPPP/BR1K1RQB w Beb - 2 9", 1, 37 }, + { "br1krnqb/pppppp1p/1n4p1/8/8/P2NN3/2PPPPPP/BR1K1RQB w Beb - 2 9", 2, 1029 }, + { "br1krnqb/pppppp1p/1n4p1/8/8/P2NN3/2PPPPPP/BR1K1RQB w Beb - 2 9", 3, 36748 }, + { "br1krnqb/pppppp1p/1n4p1/8/8/P2NN3/2PPPPPP/BR1K1RQB w Beb - 2 9", 4, 1025712 }, + { "br1krnqb/pppppp1p/1n4p1/8/8/P2NN3/2PPPPPP/BR1K1RQB w Beb - 2 9", 5, 36214583 }, + { "br1krnqb/pppppp1p/1n4p1/8/8/P2NN3/2PPPPPP/BR1K1RQB w Beb - 2 9", 6, 1026195877 }, + { "rbbnkr1q/p1p2ppp/1p1ppn2/8/1PP4P/8/P2PPPP1/RBBNKRNQ w FAfa - 0 9", 1, 28 }, + { "rbbnkr1q/p1p2ppp/1p1ppn2/8/1PP4P/8/P2PPPP1/RBBNKRNQ w FAfa - 0 9", 2, 755 }, + { "rbbnkr1q/p1p2ppp/1p1ppn2/8/1PP4P/8/P2PPPP1/RBBNKRNQ w FAfa - 0 9", 3, 22623 }, + { "rbbnkr1q/p1p2ppp/1p1ppn2/8/1PP4P/8/P2PPPP1/RBBNKRNQ w FAfa - 0 9", 4, 605106 }, + { "rbbnkr1q/p1p2ppp/1p1ppn2/8/1PP4P/8/P2PPPP1/RBBNKRNQ w FAfa - 0 9", 5, 18972778 }, + { "rbbnkr1q/p1p2ppp/1p1ppn2/8/1PP4P/8/P2PPPP1/RBBNKRNQ w FAfa - 0 9", 6, 513486101 }, + { "r1b1krnq/pp2pppp/1bn5/2pp4/4N3/5P2/PPPPPRPP/R1BBK1NQ w Afa - 0 9", 1, 24 }, + { "r1b1krnq/pp2pppp/1bn5/2pp4/4N3/5P2/PPPPPRPP/R1BBK1NQ w Afa - 0 9", 2, 705 }, + { "r1b1krnq/pp2pppp/1bn5/2pp4/4N3/5P2/PPPPPRPP/R1BBK1NQ w Afa - 0 9", 3, 17427 }, + { "r1b1krnq/pp2pppp/1bn5/2pp4/4N3/5P2/PPPPPRPP/R1BBK1NQ w Afa - 0 9", 4, 532521 }, + { "r1b1krnq/pp2pppp/1bn5/2pp4/4N3/5P2/PPPPPRPP/R1BBK1NQ w Afa - 0 9", 5, 13532966 }, + { "r1b1krnq/pp2pppp/1bn5/2pp4/4N3/5P2/PPPPPRPP/R1BBK1NQ w Afa - 0 9", 6, 426443376 }, + { "1nbkrbn1/rpppppqp/p7/6p1/4P3/3P2P1/PPP1KP1P/RNB1RBNQ w e - 1 9", 1, 31 }, + { "1nbkrbn1/rpppppqp/p7/6p1/4P3/3P2P1/PPP1KP1P/RNB1RBNQ w e - 1 9", 2, 800 }, + { "1nbkrbn1/rpppppqp/p7/6p1/4P3/3P2P1/PPP1KP1P/RNB1RBNQ w e - 1 9", 3, 24748 }, + { "1nbkrbn1/rpppppqp/p7/6p1/4P3/3P2P1/PPP1KP1P/RNB1RBNQ w e - 1 9", 4, 693366 }, + { "1nbkrbn1/rpppppqp/p7/6p1/4P3/3P2P1/PPP1KP1P/RNB1RBNQ w e - 1 9", 5, 21193292 }, + { "1nbkrbn1/rpppppqp/p7/6p1/4P3/3P2P1/PPP1KP1P/RNB1RBNQ w e - 1 9", 6, 625757852 }, + { "r1bkrnqb/pp3ppp/n1ppp3/8/1P5P/P7/R1PPPPP1/1NBKRNQB w Eea - 0 9", 1, 21 }, + { "r1bkrnqb/pp3ppp/n1ppp3/8/1P5P/P7/R1PPPPP1/1NBKRNQB w Eea - 0 9", 2, 482 }, + { "r1bkrnqb/pp3ppp/n1ppp3/8/1P5P/P7/R1PPPPP1/1NBKRNQB w Eea - 0 9", 3, 11417 }, + { "r1bkrnqb/pp3ppp/n1ppp3/8/1P5P/P7/R1PPPPP1/1NBKRNQB w Eea - 0 9", 4, 275339 }, + { "r1bkrnqb/pp3ppp/n1ppp3/8/1P5P/P7/R1PPPPP1/1NBKRNQB w Eea - 0 9", 5, 7112890 }, + { "r1bkrnqb/pp3ppp/n1ppp3/8/1P5P/P7/R1PPPPP1/1NBKRNQB w Eea - 0 9", 6, 180378139 }, + { "rbnkbrnq/ppp1p2p/5p2/3p2p1/1B1P4/1N4P1/PPP1PP1P/RB1K1RNQ w FAfa - 0 9", 1, 33 }, + { "rbnkbrnq/ppp1p2p/5p2/3p2p1/1B1P4/1N4P1/PPP1PP1P/RB1K1RNQ w FAfa - 0 9", 2, 780 }, + { "rbnkbrnq/ppp1p2p/5p2/3p2p1/1B1P4/1N4P1/PPP1PP1P/RB1K1RNQ w FAfa - 0 9", 3, 25532 }, + { "rbnkbrnq/ppp1p2p/5p2/3p2p1/1B1P4/1N4P1/PPP1PP1P/RB1K1RNQ w FAfa - 0 9", 4, 628945 }, + { "rbnkbrnq/ppp1p2p/5p2/3p2p1/1B1P4/1N4P1/PPP1PP1P/RB1K1RNQ w FAfa - 0 9", 5, 20756770 }, + { "rbnkbrnq/ppp1p2p/5p2/3p2p1/1B1P4/1N4P1/PPP1PP1P/RB1K1RNQ w FAfa - 0 9", 6, 535497008 }, + { "rnk1brnq/pp1ppppp/2p5/b7/8/1P2P2P/P1PP1PPQ/RNKBBRN1 w FAfa - 3 9", 1, 29 }, + { "rnk1brnq/pp1ppppp/2p5/b7/8/1P2P2P/P1PP1PPQ/RNKBBRN1 w FAfa - 3 9", 2, 648 }, + { "rnk1brnq/pp1ppppp/2p5/b7/8/1P2P2P/P1PP1PPQ/RNKBBRN1 w FAfa - 3 9", 3, 19043 }, + { "rnk1brnq/pp1ppppp/2p5/b7/8/1P2P2P/P1PP1PPQ/RNKBBRN1 w FAfa - 3 9", 4, 449637 }, + { "rnk1brnq/pp1ppppp/2p5/b7/8/1P2P2P/P1PP1PPQ/RNKBBRN1 w FAfa - 3 9", 5, 13722785 }, + { "rnk1brnq/pp1ppppp/2p5/b7/8/1P2P2P/P1PP1PPQ/RNKBBRN1 w FAfa - 3 9", 6, 341389148 }, + { "rnkrbbnq/p1p3pp/5p2/1p1pp3/P7/1PN2P2/2PPP1PP/R1KRBBNQ w DAda - 0 9", 1, 26 }, + { "rnkrbbnq/p1p3pp/5p2/1p1pp3/P7/1PN2P2/2PPP1PP/R1KRBBNQ w DAda - 0 9", 2, 827 }, + { "rnkrbbnq/p1p3pp/5p2/1p1pp3/P7/1PN2P2/2PPP1PP/R1KRBBNQ w DAda - 0 9", 3, 21865 }, + { "rnkrbbnq/p1p3pp/5p2/1p1pp3/P7/1PN2P2/2PPP1PP/R1KRBBNQ w DAda - 0 9", 4, 683167 }, + { "rnkrbbnq/p1p3pp/5p2/1p1pp3/P7/1PN2P2/2PPP1PP/R1KRBBNQ w DAda - 0 9", 5, 18916370 }, + { "rnkrbbnq/p1p3pp/5p2/1p1pp3/P7/1PN2P2/2PPP1PP/R1KRBBNQ w DAda - 0 9", 6, 589161126 }, + { "r1krbnqb/p1pp1ppp/2n1p3/8/1p4P1/PPP5/3PPP1P/RNKRBNQB w DAda - 1 9", 1, 25 }, + { "r1krbnqb/p1pp1ppp/2n1p3/8/1p4P1/PPP5/3PPP1P/RNKRBNQB w DAda - 1 9", 2, 540 }, + { "r1krbnqb/p1pp1ppp/2n1p3/8/1p4P1/PPP5/3PPP1P/RNKRBNQB w DAda - 1 9", 3, 14709 }, + { "r1krbnqb/p1pp1ppp/2n1p3/8/1p4P1/PPP5/3PPP1P/RNKRBNQB w DAda - 1 9", 4, 331332 }, + { "r1krbnqb/p1pp1ppp/2n1p3/8/1p4P1/PPP5/3PPP1P/RNKRBNQB w DAda - 1 9", 5, 9491817 }, + { "r1krbnqb/p1pp1ppp/2n1p3/8/1p4P1/PPP5/3PPP1P/RNKRBNQB w DAda - 1 9", 6, 225389422 }, + { "rbnkrnbq/ppp1pp2/3p2p1/2N5/P6p/2P5/1P1PPPPP/RB1KRNBQ w EAea - 0 9", 1, 32 }, + { "rbnkrnbq/ppp1pp2/3p2p1/2N5/P6p/2P5/1P1PPPPP/RB1KRNBQ w EAea - 0 9", 2, 790 }, + { "rbnkrnbq/ppp1pp2/3p2p1/2N5/P6p/2P5/1P1PPPPP/RB1KRNBQ w EAea - 0 9", 3, 25107 }, + { "rbnkrnbq/ppp1pp2/3p2p1/2N5/P6p/2P5/1P1PPPPP/RB1KRNBQ w EAea - 0 9", 4, 661207 }, + { "rbnkrnbq/ppp1pp2/3p2p1/2N5/P6p/2P5/1P1PPPPP/RB1KRNBQ w EAea - 0 9", 5, 20906017 }, + { "rbnkrnbq/ppp1pp2/3p2p1/2N5/P6p/2P5/1P1PPPPP/RB1KRNBQ w EAea - 0 9", 6, 578332225 }, + { "rnkbrn1q/1ppppppb/8/p4N1p/8/P1N5/1PPPPPPP/R1KBR1BQ w EAea - 0 9", 1, 31 }, + { "rnkbrn1q/1ppppppb/8/p4N1p/8/P1N5/1PPPPPPP/R1KBR1BQ w EAea - 0 9", 2, 691 }, + { "rnkbrn1q/1ppppppb/8/p4N1p/8/P1N5/1PPPPPPP/R1KBR1BQ w EAea - 0 9", 3, 20813 }, + { "rnkbrn1q/1ppppppb/8/p4N1p/8/P1N5/1PPPPPPP/R1KBR1BQ w EAea - 0 9", 4, 510665 }, + { "rnkbrn1q/1ppppppb/8/p4N1p/8/P1N5/1PPPPPPP/R1KBR1BQ w EAea - 0 9", 5, 15308408 }, + { "rnkbrn1q/1ppppppb/8/p4N1p/8/P1N5/1PPPPPPP/R1KBR1BQ w EAea - 0 9", 6, 404129987 }, + { "rnkrnbbq/p1p2ppp/3pp3/1p6/6P1/4PQ1B/PPPP1P1P/RNKRN1B1 w DAda - 0 9", 1, 29 }, + { "rnkrnbbq/p1p2ppp/3pp3/1p6/6P1/4PQ1B/PPPP1P1P/RNKRN1B1 w DAda - 0 9", 2, 558 }, + { "rnkrnbbq/p1p2ppp/3pp3/1p6/6P1/4PQ1B/PPPP1P1P/RNKRN1B1 w DAda - 0 9", 3, 16800 }, + { "rnkrnbbq/p1p2ppp/3pp3/1p6/6P1/4PQ1B/PPPP1P1P/RNKRN1B1 w DAda - 0 9", 4, 352887 }, + { "rnkrnbbq/p1p2ppp/3pp3/1p6/6P1/4PQ1B/PPPP1P1P/RNKRN1B1 w DAda - 0 9", 5, 10825379 }, + { "rnkrnbbq/p1p2ppp/3pp3/1p6/6P1/4PQ1B/PPPP1P1P/RNKRN1B1 w DAda - 0 9", 6, 246965507 }, + { "rnkrnqbb/pp2p1p1/3p3p/2p2p2/5P2/1P1N4/P1PPPQPP/RNKR2BB w DAda - 0 9", 1, 29 }, + { "rnkrnqbb/pp2p1p1/3p3p/2p2p2/5P2/1P1N4/P1PPPQPP/RNKR2BB w DAda - 0 9", 2, 762 }, + { "rnkrnqbb/pp2p1p1/3p3p/2p2p2/5P2/1P1N4/P1PPPQPP/RNKR2BB w DAda - 0 9", 3, 23210 }, + { "rnkrnqbb/pp2p1p1/3p3p/2p2p2/5P2/1P1N4/P1PPPQPP/RNKR2BB w DAda - 0 9", 4, 644936 }, + { "rnkrnqbb/pp2p1p1/3p3p/2p2p2/5P2/1P1N4/P1PPPQPP/RNKR2BB w DAda - 0 9", 5, 20522675 }, + { "rnkrnqbb/pp2p1p1/3p3p/2p2p2/5P2/1P1N4/P1PPPQPP/RNKR2BB w DAda - 0 9", 6, 596067005 }, + { "bb1rknnr/ppqppppp/8/2p5/3P1N2/1P6/P1P1PPPP/BBQRKN1R w HDhd - 1 9", 1, 33 }, + { "bb1rknnr/ppqppppp/8/2p5/3P1N2/1P6/P1P1PPPP/BBQRKN1R w HDhd - 1 9", 2, 963 }, + { "bb1rknnr/ppqppppp/8/2p5/3P1N2/1P6/P1P1PPPP/BBQRKN1R w HDhd - 1 9", 3, 32279 }, + { "bb1rknnr/ppqppppp/8/2p5/3P1N2/1P6/P1P1PPPP/BBQRKN1R w HDhd - 1 9", 4, 1000890 }, + { "bb1rknnr/ppqppppp/8/2p5/3P1N2/1P6/P1P1PPPP/BBQRKN1R w HDhd - 1 9", 5, 34552118 }, + { "bb1rknnr/ppqppppp/8/2p5/3P1N2/1P6/P1P1PPPP/BBQRKN1R w HDhd - 1 9", 6, 1124738493 }, + { "bqrbknnr/ppp1p2p/8/3p1p2/5p2/P3N2P/1PPPP1P1/BQRBK1NR w HChc - 0 9", 1, 20 }, + { "bqrbknnr/ppp1p2p/8/3p1p2/5p2/P3N2P/1PPPP1P1/BQRBK1NR w HChc - 0 9", 2, 398 }, + { "bqrbknnr/ppp1p2p/8/3p1p2/5p2/P3N2P/1PPPP1P1/BQRBK1NR w HChc - 0 9", 3, 9009 }, + { "bqrbknnr/ppp1p2p/8/3p1p2/5p2/P3N2P/1PPPP1P1/BQRBK1NR w HChc - 0 9", 4, 194859 }, + { "bqrbknnr/ppp1p2p/8/3p1p2/5p2/P3N2P/1PPPP1P1/BQRBK1NR w HChc - 0 9", 5, 4834319 }, + { "bqrbknnr/ppp1p2p/8/3p1p2/5p2/P3N2P/1PPPP1P1/BQRBK1NR w HChc - 0 9", 6, 113660536 }, + { "b1rk1bnr/qpp1pppp/p4n2/3p4/3PPP2/7N/PPP3PP/BQRKNB1R w HChc - 1 9", 1, 25 }, + { "b1rk1bnr/qpp1pppp/p4n2/3p4/3PPP2/7N/PPP3PP/BQRKNB1R w HChc - 1 9", 2, 648 }, + { "b1rk1bnr/qpp1pppp/p4n2/3p4/3PPP2/7N/PPP3PP/BQRKNB1R w HChc - 1 9", 3, 16587 }, + { "b1rk1bnr/qpp1pppp/p4n2/3p4/3PPP2/7N/PPP3PP/BQRKNB1R w HChc - 1 9", 4, 455720 }, + { "b1rk1bnr/qpp1pppp/p4n2/3p4/3PPP2/7N/PPP3PP/BQRKNB1R w HChc - 1 9", 5, 12200870 }, + { "b1rk1bnr/qpp1pppp/p4n2/3p4/3PPP2/7N/PPP3PP/BQRKNB1R w HChc - 1 9", 6, 351766307 }, + { "bqkrnnrb/pppp2p1/4pp2/4P2p/6P1/7P/PPPP1P2/BQRKNNRB w GC - 1 9", 1, 30 }, + { "bqkrnnrb/pppp2p1/4pp2/4P2p/6P1/7P/PPPP1P2/BQRKNNRB w GC - 1 9", 2, 493 }, + { "bqkrnnrb/pppp2p1/4pp2/4P2p/6P1/7P/PPPP1P2/BQRKNNRB w GC - 1 9", 3, 15118 }, + { "bqkrnnrb/pppp2p1/4pp2/4P2p/6P1/7P/PPPP1P2/BQRKNNRB w GC - 1 9", 4, 280726 }, + { "bqkrnnrb/pppp2p1/4pp2/4P2p/6P1/7P/PPPP1P2/BQRKNNRB w GC - 1 9", 5, 8786998 }, + { "bqkrnnrb/pppp2p1/4pp2/4P2p/6P1/7P/PPPP1P2/BQRKNNRB w GC - 1 9", 6, 181492621 }, + { "q1brknnr/1p1ppppp/p7/2p5/8/1PPP4/P2RPPPP/QBB1KNNR w Hhd - 0 9", 1, 25 }, + { "q1brknnr/1p1ppppp/p7/2p5/8/1PPP4/P2RPPPP/QBB1KNNR w Hhd - 0 9", 2, 501 }, + { "q1brknnr/1p1ppppp/p7/2p5/8/1PPP4/P2RPPPP/QBB1KNNR w Hhd - 0 9", 3, 13206 }, + { "q1brknnr/1p1ppppp/p7/2p5/8/1PPP4/P2RPPPP/QBB1KNNR w Hhd - 0 9", 4, 290463 }, + { "q1brknnr/1p1ppppp/p7/2p5/8/1PPP4/P2RPPPP/QBB1KNNR w Hhd - 0 9", 5, 7982978 }, + { "q1brknnr/1p1ppppp/p7/2p5/8/1PPP4/P2RPPPP/QBB1KNNR w Hhd - 0 9", 6, 192717198 }, + { "qrb1k1nr/ppppb1pp/6n1/4ppN1/3P4/4N3/PPP1PPPP/QRBBK2R w HBhb - 2 9", 1, 31 }, + { "qrb1k1nr/ppppb1pp/6n1/4ppN1/3P4/4N3/PPP1PPPP/QRBBK2R w HBhb - 2 9", 2, 872 }, + { "qrb1k1nr/ppppb1pp/6n1/4ppN1/3P4/4N3/PPP1PPPP/QRBBK2R w HBhb - 2 9", 3, 26191 }, + { "qrb1k1nr/ppppb1pp/6n1/4ppN1/3P4/4N3/PPP1PPPP/QRBBK2R w HBhb - 2 9", 4, 739276 }, + { "qrb1k1nr/ppppb1pp/6n1/4ppN1/3P4/4N3/PPP1PPPP/QRBBK2R w HBhb - 2 9", 5, 22493014 }, + { "qrb1k1nr/ppppb1pp/6n1/4ppN1/3P4/4N3/PPP1PPPP/QRBBK2R w HBhb - 2 9", 6, 646855304 }, + { "1rbknbnr/1ppp1pp1/q6p/p3p3/5P2/2PPB3/PP2P1PP/QR1KNBNR w HBhb - 0 9", 1, 28 }, + { "1rbknbnr/1ppp1pp1/q6p/p3p3/5P2/2PPB3/PP2P1PP/QR1KNBNR w HBhb - 0 9", 2, 1020 }, + { "1rbknbnr/1ppp1pp1/q6p/p3p3/5P2/2PPB3/PP2P1PP/QR1KNBNR w HBhb - 0 9", 3, 28147 }, + { "1rbknbnr/1ppp1pp1/q6p/p3p3/5P2/2PPB3/PP2P1PP/QR1KNBNR w HBhb - 0 9", 4, 984000 }, + { "1rbknbnr/1ppp1pp1/q6p/p3p3/5P2/2PPB3/PP2P1PP/QR1KNBNR w HBhb - 0 9", 5, 27484692 }, + { "1rbknbnr/1ppp1pp1/q6p/p3p3/5P2/2PPB3/PP2P1PP/QR1KNBNR w HBhb - 0 9", 6, 947786800 }, + { "qrbk2rb/1ppp1ppp/5nn1/p3p3/1N6/P7/1PPPPPPP/QRB1KNRB w gb - 0 9", 1, 23 }, + { "qrbk2rb/1ppp1ppp/5nn1/p3p3/1N6/P7/1PPPPPPP/QRB1KNRB w gb - 0 9", 2, 592 }, + { "qrbk2rb/1ppp1ppp/5nn1/p3p3/1N6/P7/1PPPPPPP/QRB1KNRB w gb - 0 9", 3, 14398 }, + { "qrbk2rb/1ppp1ppp/5nn1/p3p3/1N6/P7/1PPPPPPP/QRB1KNRB w gb - 0 9", 4, 395716 }, + { "qrbk2rb/1ppp1ppp/5nn1/p3p3/1N6/P7/1PPPPPPP/QRB1KNRB w gb - 0 9", 5, 10098215 }, + { "qrbk2rb/1ppp1ppp/5nn1/p3p3/1N6/P7/1PPPPPPP/QRB1KNRB w gb - 0 9", 6, 293988585 }, + { "qbrk1nnr/1pp1pppp/2b5/p2p4/P2P2P1/8/1PP1PP1P/QBKRBNNR w hc - 1 9", 1, 26 }, + { "qbrk1nnr/1pp1pppp/2b5/p2p4/P2P2P1/8/1PP1PP1P/QBKRBNNR w hc - 1 9", 2, 654 }, + { "qbrk1nnr/1pp1pppp/2b5/p2p4/P2P2P1/8/1PP1PP1P/QBKRBNNR w hc - 1 9", 3, 18103 }, + { "qbrk1nnr/1pp1pppp/2b5/p2p4/P2P2P1/8/1PP1PP1P/QBKRBNNR w hc - 1 9", 4, 471653 }, + { "qbrk1nnr/1pp1pppp/2b5/p2p4/P2P2P1/8/1PP1PP1P/QBKRBNNR w hc - 1 9", 5, 13740891 }, + { "qbrk1nnr/1pp1pppp/2b5/p2p4/P2P2P1/8/1PP1PP1P/QBKRBNNR w hc - 1 9", 6, 373081138 }, + { "qrkbbnnr/ppp2p1p/4p3/3p2p1/P7/2PP4/1P2PPPP/QRKBBNNR w HBhb - 0 9", 1, 25 }, + { "qrkbbnnr/ppp2p1p/4p3/3p2p1/P7/2PP4/1P2PPPP/QRKBBNNR w HBhb - 0 9", 2, 626 }, + { "qrkbbnnr/ppp2p1p/4p3/3p2p1/P7/2PP4/1P2PPPP/QRKBBNNR w HBhb - 0 9", 3, 16616 }, + { "qrkbbnnr/ppp2p1p/4p3/3p2p1/P7/2PP4/1P2PPPP/QRKBBNNR w HBhb - 0 9", 4, 431634 }, + { "qrkbbnnr/ppp2p1p/4p3/3p2p1/P7/2PP4/1P2PPPP/QRKBBNNR w HBhb - 0 9", 5, 12079406 }, + { "qrkbbnnr/ppp2p1p/4p3/3p2p1/P7/2PP4/1P2PPPP/QRKBBNNR w HBhb - 0 9", 6, 324006164 }, + { "qr1kbbnr/ppp1pp1p/4n1p1/2Pp4/6P1/4N3/PP1PPP1P/QRK1BBNR w HB d6 0 9", 1, 26 }, + { "qr1kbbnr/ppp1pp1p/4n1p1/2Pp4/6P1/4N3/PP1PPP1P/QRK1BBNR w HB d6 0 9", 2, 699 }, + { "qr1kbbnr/ppp1pp1p/4n1p1/2Pp4/6P1/4N3/PP1PPP1P/QRK1BBNR w HB d6 0 9", 3, 18068 }, + { "qr1kbbnr/ppp1pp1p/4n1p1/2Pp4/6P1/4N3/PP1PPP1P/QRK1BBNR w HB d6 0 9", 4, 497152 }, + { "qr1kbbnr/ppp1pp1p/4n1p1/2Pp4/6P1/4N3/PP1PPP1P/QRK1BBNR w HB d6 0 9", 5, 13353359 }, + { "qr1kbbnr/ppp1pp1p/4n1p1/2Pp4/6P1/4N3/PP1PPP1P/QRK1BBNR w HB d6 0 9", 6, 375702908 }, + { "qrk1b1rb/p1pppppp/3nnQ2/1p6/1P3P2/3P4/P1P1P1PP/1RKNBNRB w GBgb - 3 9", 1, 43 }, + { "qrk1b1rb/p1pppppp/3nnQ2/1p6/1P3P2/3P4/P1P1P1PP/1RKNBNRB w GBgb - 3 9", 2, 1369 }, + { "qrk1b1rb/p1pppppp/3nnQ2/1p6/1P3P2/3P4/P1P1P1PP/1RKNBNRB w GBgb - 3 9", 3, 55463 }, + { "qrk1b1rb/p1pppppp/3nnQ2/1p6/1P3P2/3P4/P1P1P1PP/1RKNBNRB w GBgb - 3 9", 4, 1831200 }, + { "qrk1b1rb/p1pppppp/3nnQ2/1p6/1P3P2/3P4/P1P1P1PP/1RKNBNRB w GBgb - 3 9", 5, 71514365 }, + { "qrk1b1rb/p1pppppp/3nnQ2/1p6/1P3P2/3P4/P1P1P1PP/1RKNBNRB w GBgb - 3 9", 6, 2427477375 }, + { "qbrk1nbr/pppp3p/5n2/4ppp1/3P1P2/4N3/PPP1P1PP/QBKRN1BR w hc - 0 9", 1, 25 }, + { "qbrk1nbr/pppp3p/5n2/4ppp1/3P1P2/4N3/PPP1P1PP/QBKRN1BR w hc - 0 9", 2, 752 }, + { "qbrk1nbr/pppp3p/5n2/4ppp1/3P1P2/4N3/PPP1P1PP/QBKRN1BR w hc - 0 9", 3, 20165 }, + { "qbrk1nbr/pppp3p/5n2/4ppp1/3P1P2/4N3/PPP1P1PP/QBKRN1BR w hc - 0 9", 4, 615263 }, + { "qbrk1nbr/pppp3p/5n2/4ppp1/3P1P2/4N3/PPP1P1PP/QBKRN1BR w hc - 0 9", 5, 17493373 }, + { "qbrk1nbr/pppp3p/5n2/4ppp1/3P1P2/4N3/PPP1P1PP/QBKRN1BR w hc - 0 9", 6, 543180234 }, + { "qrkb1nbr/1pppppQp/3n4/p7/5p2/1P1N4/P1PPP1PP/1RKB1NBR w HBhb - 0 9", 1, 45 }, + { "qrkb1nbr/1pppppQp/3n4/p7/5p2/1P1N4/P1PPP1PP/1RKB1NBR w HBhb - 0 9", 2, 946 }, + { "qrkb1nbr/1pppppQp/3n4/p7/5p2/1P1N4/P1PPP1PP/1RKB1NBR w HBhb - 0 9", 3, 40100 }, + { "qrkb1nbr/1pppppQp/3n4/p7/5p2/1P1N4/P1PPP1PP/1RKB1NBR w HBhb - 0 9", 4, 966903 }, + { "qrkb1nbr/1pppppQp/3n4/p7/5p2/1P1N4/P1PPP1PP/1RKB1NBR w HBhb - 0 9", 5, 39736157 }, + { "qrkb1nbr/1pppppQp/3n4/p7/5p2/1P1N4/P1PPP1PP/1RKB1NBR w HBhb - 0 9", 6, 1051910977 }, + { "qrk1nbbr/ppp1p1p1/4n2p/3p1p2/1P5P/3P2P1/P1P1PP2/QRKNNBBR w HBhb - 1 9", 1, 32 }, + { "qrk1nbbr/ppp1p1p1/4n2p/3p1p2/1P5P/3P2P1/P1P1PP2/QRKNNBBR w HBhb - 1 9", 2, 770 }, + { "qrk1nbbr/ppp1p1p1/4n2p/3p1p2/1P5P/3P2P1/P1P1PP2/QRKNNBBR w HBhb - 1 9", 3, 25367 }, + { "qrk1nbbr/ppp1p1p1/4n2p/3p1p2/1P5P/3P2P1/P1P1PP2/QRKNNBBR w HBhb - 1 9", 4, 646977 }, + { "qrk1nbbr/ppp1p1p1/4n2p/3p1p2/1P5P/3P2P1/P1P1PP2/QRKNNBBR w HBhb - 1 9", 5, 21717615 }, + { "qrk1nbbr/ppp1p1p1/4n2p/3p1p2/1P5P/3P2P1/P1P1PP2/QRKNNBBR w HBhb - 1 9", 6, 577979364 }, + { "qrkn1rbb/pp2pppp/2p5/3p4/P2Qn1P1/1P6/2PPPP1P/1RKNNRBB w FBfb - 0 9", 1, 38 }, + { "qrkn1rbb/pp2pppp/2p5/3p4/P2Qn1P1/1P6/2PPPP1P/1RKNNRBB w FBfb - 0 9", 2, 943 }, + { "qrkn1rbb/pp2pppp/2p5/3p4/P2Qn1P1/1P6/2PPPP1P/1RKNNRBB w FBfb - 0 9", 3, 35335 }, + { "qrkn1rbb/pp2pppp/2p5/3p4/P2Qn1P1/1P6/2PPPP1P/1RKNNRBB w FBfb - 0 9", 4, 868165 }, + { "qrkn1rbb/pp2pppp/2p5/3p4/P2Qn1P1/1P6/2PPPP1P/1RKNNRBB w FBfb - 0 9", 5, 31909835 }, + { "qrkn1rbb/pp2pppp/2p5/3p4/P2Qn1P1/1P6/2PPPP1P/1RKNNRBB w FBfb - 0 9", 6, 798405123 }, + { "bbrqknnr/ppp4p/3pp3/5pp1/4PP2/5Q2/PPPP2PP/BBR1KNNR w HChc - 0 9", 1, 36 }, + { "bbrqknnr/ppp4p/3pp3/5pp1/4PP2/5Q2/PPPP2PP/BBR1KNNR w HChc - 0 9", 2, 843 }, + { "bbrqknnr/ppp4p/3pp3/5pp1/4PP2/5Q2/PPPP2PP/BBR1KNNR w HChc - 0 9", 3, 29974 }, + { "bbrqknnr/ppp4p/3pp3/5pp1/4PP2/5Q2/PPPP2PP/BBR1KNNR w HChc - 0 9", 4, 758528 }, + { "bbrqknnr/ppp4p/3pp3/5pp1/4PP2/5Q2/PPPP2PP/BBR1KNNR w HChc - 0 9", 5, 26828059 }, + { "bbrqknnr/ppp4p/3pp3/5pp1/4PP2/5Q2/PPPP2PP/BBR1KNNR w HChc - 0 9", 6, 723306114 }, + { "1rqbkn1r/p1p1pppp/1p5n/P2p4/3Pb1P1/8/1PP1PP1P/BRQBKNNR w HBhb - 0 9", 1, 23 }, + { "1rqbkn1r/p1p1pppp/1p5n/P2p4/3Pb1P1/8/1PP1PP1P/BRQBKNNR w HBhb - 0 9", 2, 778 }, + { "1rqbkn1r/p1p1pppp/1p5n/P2p4/3Pb1P1/8/1PP1PP1P/BRQBKNNR w HBhb - 0 9", 3, 19482 }, + { "1rqbkn1r/p1p1pppp/1p5n/P2p4/3Pb1P1/8/1PP1PP1P/BRQBKNNR w HBhb - 0 9", 4, 649789 }, + { "1rqbkn1r/p1p1pppp/1p5n/P2p4/3Pb1P1/8/1PP1PP1P/BRQBKNNR w HBhb - 0 9", 5, 17337683 }, + { "1rqbkn1r/p1p1pppp/1p5n/P2p4/3Pb1P1/8/1PP1PP1P/BRQBKNNR w HBhb - 0 9", 6, 579112676 }, + { "br1knbnr/1qp1pppp/pp1p4/8/8/PP6/2PPPPPP/BRQKNBNR w HBhb - 2 9", 1, 26 }, + { "br1knbnr/1qp1pppp/pp1p4/8/8/PP6/2PPPPPP/BRQKNBNR w HBhb - 2 9", 2, 697 }, + { "br1knbnr/1qp1pppp/pp1p4/8/8/PP6/2PPPPPP/BRQKNBNR w HBhb - 2 9", 3, 18835 }, + { "br1knbnr/1qp1pppp/pp1p4/8/8/PP6/2PPPPPP/BRQKNBNR w HBhb - 2 9", 4, 546622 }, + { "br1knbnr/1qp1pppp/pp1p4/8/8/PP6/2PPPPPP/BRQKNBNR w HBhb - 2 9", 5, 15280079 }, + { "br1knbnr/1qp1pppp/pp1p4/8/8/PP6/2PPPPPP/BRQKNBNR w HBhb - 2 9", 6, 473071890 }, + { "brqk2rb/ppppp1pp/4np2/8/2n5/3P1Q2/PP2PPPP/BR1KNNRB w GBgb - 0 9", 1, 32 }, + { "brqk2rb/ppppp1pp/4np2/8/2n5/3P1Q2/PP2PPPP/BR1KNNRB w GBgb - 0 9", 2, 948 }, + { "brqk2rb/ppppp1pp/4np2/8/2n5/3P1Q2/PP2PPPP/BR1KNNRB w GBgb - 0 9", 3, 30434 }, + { "brqk2rb/ppppp1pp/4np2/8/2n5/3P1Q2/PP2PPPP/BR1KNNRB w GBgb - 0 9", 4, 885713 }, + { "brqk2rb/ppppp1pp/4np2/8/2n5/3P1Q2/PP2PPPP/BR1KNNRB w GBgb - 0 9", 5, 29821322 }, + { "brqk2rb/ppppp1pp/4np2/8/2n5/3P1Q2/PP2PPPP/BR1KNNRB w GBgb - 0 9", 6, 874251866 }, + { "r1bqknnr/pp1pp1p1/5p1p/2p1b2N/2P5/8/PPQPPPPP/RBB1K1NR w HAha - 0 9", 1, 31 }, + { "r1bqknnr/pp1pp1p1/5p1p/2p1b2N/2P5/8/PPQPPPPP/RBB1K1NR w HAha - 0 9", 2, 785 }, + { "r1bqknnr/pp1pp1p1/5p1p/2p1b2N/2P5/8/PPQPPPPP/RBB1K1NR w HAha - 0 9", 3, 25549 }, + { "r1bqknnr/pp1pp1p1/5p1p/2p1b2N/2P5/8/PPQPPPPP/RBB1K1NR w HAha - 0 9", 4, 659952 }, + { "r1bqknnr/pp1pp1p1/5p1p/2p1b2N/2P5/8/PPQPPPPP/RBB1K1NR w HAha - 0 9", 5, 22244193 }, + { "r1bqknnr/pp1pp1p1/5p1p/2p1b2N/2P5/8/PPQPPPPP/RBB1K1NR w HAha - 0 9", 6, 592797491 }, + { "rqbbknnr/ppppp2p/5pp1/8/8/1P3PP1/PQPPP2P/R1BBKNNR w HAha - 0 9", 1, 23 }, + { "rqbbknnr/ppppp2p/5pp1/8/8/1P3PP1/PQPPP2P/R1BBKNNR w HAha - 0 9", 2, 391 }, + { "rqbbknnr/ppppp2p/5pp1/8/8/1P3PP1/PQPPP2P/R1BBKNNR w HAha - 0 9", 3, 10163 }, + { "rqbbknnr/ppppp2p/5pp1/8/8/1P3PP1/PQPPP2P/R1BBKNNR w HAha - 0 9", 4, 198450 }, + { "rqbbknnr/ppppp2p/5pp1/8/8/1P3PP1/PQPPP2P/R1BBKNNR w HAha - 0 9", 5, 5576671 }, + { "rqbbknnr/ppppp2p/5pp1/8/8/1P3PP1/PQPPP2P/R1BBKNNR w HAha - 0 9", 6, 121267576 }, + { "rqbknbnr/1pp1p2p/p7/3p1pp1/7N/1PP5/P2PPPPP/RQBK1BNR w HAha - 0 9", 1, 27 }, + { "rqbknbnr/1pp1p2p/p7/3p1pp1/7N/1PP5/P2PPPPP/RQBK1BNR w HAha - 0 9", 2, 676 }, + { "rqbknbnr/1pp1p2p/p7/3p1pp1/7N/1PP5/P2PPPPP/RQBK1BNR w HAha - 0 9", 3, 19606 }, + { "rqbknbnr/1pp1p2p/p7/3p1pp1/7N/1PP5/P2PPPPP/RQBK1BNR w HAha - 0 9", 4, 522428 }, + { "rqbknbnr/1pp1p2p/p7/3p1pp1/7N/1PP5/P2PPPPP/RQBK1BNR w HAha - 0 9", 5, 15955388 }, + { "rqbknbnr/1pp1p2p/p7/3p1pp1/7N/1PP5/P2PPPPP/RQBK1BNR w HAha - 0 9", 6, 448477218 }, + { "rqb1nnrb/2ppkppp/1p2p3/p7/2PPP3/1P6/P4PPP/RQBKNNRB w GA - 1 9", 1, 31 }, + { "rqb1nnrb/2ppkppp/1p2p3/p7/2PPP3/1P6/P4PPP/RQBKNNRB w GA - 1 9", 2, 727 }, + { "rqb1nnrb/2ppkppp/1p2p3/p7/2PPP3/1P6/P4PPP/RQBKNNRB w GA - 1 9", 3, 22895 }, + { "rqb1nnrb/2ppkppp/1p2p3/p7/2PPP3/1P6/P4PPP/RQBKNNRB w GA - 1 9", 4, 570647 }, + { "rqb1nnrb/2ppkppp/1p2p3/p7/2PPP3/1P6/P4PPP/RQBKNNRB w GA - 1 9", 5, 18361051 }, + { "rqb1nnrb/2ppkppp/1p2p3/p7/2PPP3/1P6/P4PPP/RQBKNNRB w GA - 1 9", 6, 483248153 }, + { "rb1kbn1r/p1ppppp1/qp5n/7p/P7/RPP5/3PPPPP/1BQKBNNR w Hha - 2 9", 1, 29 }, + { "rb1kbn1r/p1ppppp1/qp5n/7p/P7/RPP5/3PPPPP/1BQKBNNR w Hha - 2 9", 2, 837 }, + { "rb1kbn1r/p1ppppp1/qp5n/7p/P7/RPP5/3PPPPP/1BQKBNNR w Hha - 2 9", 3, 23815 }, + { "rb1kbn1r/p1ppppp1/qp5n/7p/P7/RPP5/3PPPPP/1BQKBNNR w Hha - 2 9", 4, 730083 }, + { "rb1kbn1r/p1ppppp1/qp5n/7p/P7/RPP5/3PPPPP/1BQKBNNR w Hha - 2 9", 5, 21279560 }, + { "rb1kbn1r/p1ppppp1/qp5n/7p/P7/RPP5/3PPPPP/1BQKBNNR w Hha - 2 9", 6, 682863811 }, + { "rqkbb1nr/p1p2ppp/1p1p2n1/3Np3/4P3/5N2/PPPP1PPP/RQKBB2R w HAha - 0 9", 1, 28 }, + { "rqkbb1nr/p1p2ppp/1p1p2n1/3Np3/4P3/5N2/PPPP1PPP/RQKBB2R w HAha - 0 9", 2, 717 }, + { "rqkbb1nr/p1p2ppp/1p1p2n1/3Np3/4P3/5N2/PPPP1PPP/RQKBB2R w HAha - 0 9", 3, 20663 }, + { "rqkbb1nr/p1p2ppp/1p1p2n1/3Np3/4P3/5N2/PPPP1PPP/RQKBB2R w HAha - 0 9", 4, 550987 }, + { "rqkbb1nr/p1p2ppp/1p1p2n1/3Np3/4P3/5N2/PPPP1PPP/RQKBB2R w HAha - 0 9", 5, 16347343 }, + { "rqkbb1nr/p1p2ppp/1p1p2n1/3Np3/4P3/5N2/PPPP1PPP/RQKBB2R w HAha - 0 9", 6, 453153783 }, + { "rqknbbr1/p1pppp1p/1p3np1/8/4P3/2P2P1P/PP1P2P1/RQKNBBNR w HAa - 0 9", 1, 27 }, + { "rqknbbr1/p1pppp1p/1p3np1/8/4P3/2P2P1P/PP1P2P1/RQKNBBNR w HAa - 0 9", 2, 650 }, + { "rqknbbr1/p1pppp1p/1p3np1/8/4P3/2P2P1P/PP1P2P1/RQKNBBNR w HAa - 0 9", 3, 18231 }, + { "rqknbbr1/p1pppp1p/1p3np1/8/4P3/2P2P1P/PP1P2P1/RQKNBBNR w HAa - 0 9", 4, 475303 }, + { "rqknbbr1/p1pppp1p/1p3np1/8/4P3/2P2P1P/PP1P2P1/RQKNBBNR w HAa - 0 9", 5, 13847463 }, + { "rqknbbr1/p1pppp1p/1p3np1/8/4P3/2P2P1P/PP1P2P1/RQKNBBNR w HAa - 0 9", 6, 383256006 }, + { "r1k1bnrb/1qpppppp/1p2n3/p7/1P5P/6P1/P1PPPP2/RQKNBNR1 w GAga - 1 9", 1, 24 }, + { "r1k1bnrb/1qpppppp/1p2n3/p7/1P5P/6P1/P1PPPP2/RQKNBNR1 w GAga - 1 9", 2, 806 }, + { "r1k1bnrb/1qpppppp/1p2n3/p7/1P5P/6P1/P1PPPP2/RQKNBNR1 w GAga - 1 9", 3, 20693 }, + { "r1k1bnrb/1qpppppp/1p2n3/p7/1P5P/6P1/P1PPPP2/RQKNBNR1 w GAga - 1 9", 4, 713220 }, + { "r1k1bnrb/1qpppppp/1p2n3/p7/1P5P/6P1/P1PPPP2/RQKNBNR1 w GAga - 1 9", 5, 19382263 }, + { "r1k1bnrb/1qpppppp/1p2n3/p7/1P5P/6P1/P1PPPP2/RQKNBNR1 w GAga - 1 9", 6, 686009788 }, + { "rb1knnbr/1pp1ppp1/p2p3p/5q2/3B2P1/3P1P2/PPP1P2P/RBQKNN1R w HAha - 0 9", 1, 34 }, + { "rb1knnbr/1pp1ppp1/p2p3p/5q2/3B2P1/3P1P2/PPP1P2P/RBQKNN1R w HAha - 0 9", 2, 1360 }, + { "rb1knnbr/1pp1ppp1/p2p3p/5q2/3B2P1/3P1P2/PPP1P2P/RBQKNN1R w HAha - 0 9", 3, 44096 }, + { "rb1knnbr/1pp1ppp1/p2p3p/5q2/3B2P1/3P1P2/PPP1P2P/RBQKNN1R w HAha - 0 9", 4, 1605706 }, + { "rb1knnbr/1pp1ppp1/p2p3p/5q2/3B2P1/3P1P2/PPP1P2P/RBQKNN1R w HAha - 0 9", 5, 51973672 }, + { "rb1knnbr/1pp1ppp1/p2p3p/5q2/3B2P1/3P1P2/PPP1P2P/RBQKNN1R w HAha - 0 9", 6, 1837704407 }, + { "rqkb1nbr/p1p1ppp1/1p3n1p/2Qp4/8/2P5/PP1PPPPP/R1KBNNBR w HAha - 2 9", 1, 39 }, + { "rqkb1nbr/p1p1ppp1/1p3n1p/2Qp4/8/2P5/PP1PPPPP/R1KBNNBR w HAha - 2 9", 2, 983 }, + { "rqkb1nbr/p1p1ppp1/1p3n1p/2Qp4/8/2P5/PP1PPPPP/R1KBNNBR w HAha - 2 9", 3, 38218 }, + { "rqkb1nbr/p1p1ppp1/1p3n1p/2Qp4/8/2P5/PP1PPPPP/R1KBNNBR w HAha - 2 9", 4, 940989 }, + { "rqkb1nbr/p1p1ppp1/1p3n1p/2Qp4/8/2P5/PP1PPPPP/R1KBNNBR w HAha - 2 9", 5, 36347815 }, + { "rqkb1nbr/p1p1ppp1/1p3n1p/2Qp4/8/2P5/PP1PPPPP/R1KBNNBR w HAha - 2 9", 6, 918801645 }, + { "rqknnbbr/2pppp2/pp5p/6p1/1P1P4/4PP2/P1P3PP/RQKNNBBR w HAha - 0 9", 1, 26 }, + { "rqknnbbr/2pppp2/pp5p/6p1/1P1P4/4PP2/P1P3PP/RQKNNBBR w HAha - 0 9", 2, 628 }, + { "rqknnbbr/2pppp2/pp5p/6p1/1P1P4/4PP2/P1P3PP/RQKNNBBR w HAha - 0 9", 3, 17638 }, + { "rqknnbbr/2pppp2/pp5p/6p1/1P1P4/4PP2/P1P3PP/RQKNNBBR w HAha - 0 9", 4, 464924 }, + { "rqknnbbr/2pppp2/pp5p/6p1/1P1P4/4PP2/P1P3PP/RQKNNBBR w HAha - 0 9", 5, 13787303 }, + { "rqknnbbr/2pppp2/pp5p/6p1/1P1P4/4PP2/P1P3PP/RQKNNBBR w HAha - 0 9", 6, 386125234 }, + { "rqkn1rbb/1pp1pppp/p7/3p4/3Pn3/2P1PP2/PP4PP/RQKNNRBB w FAfa - 1 9", 1, 20 }, + { "rqkn1rbb/1pp1pppp/p7/3p4/3Pn3/2P1PP2/PP4PP/RQKNNRBB w FAfa - 1 9", 2, 527 }, + { "rqkn1rbb/1pp1pppp/p7/3p4/3Pn3/2P1PP2/PP4PP/RQKNNRBB w FAfa - 1 9", 3, 12216 }, + { "rqkn1rbb/1pp1pppp/p7/3p4/3Pn3/2P1PP2/PP4PP/RQKNNRBB w FAfa - 1 9", 4, 321533 }, + { "rqkn1rbb/1pp1pppp/p7/3p4/3Pn3/2P1PP2/PP4PP/RQKNNRBB w FAfa - 1 9", 5, 8082183 }, + { "rqkn1rbb/1pp1pppp/p7/3p4/3Pn3/2P1PP2/PP4PP/RQKNNRBB w FAfa - 1 9", 6, 219311659 }, + { "bbrkqn1r/1pppppp1/5n2/p7/1PP2P1p/7N/P2PP1PP/BBRKQN1R w HChc - 1 9", 1, 36 }, + { "bbrkqn1r/1pppppp1/5n2/p7/1PP2P1p/7N/P2PP1PP/BBRKQN1R w HChc - 1 9", 2, 963 }, + { "bbrkqn1r/1pppppp1/5n2/p7/1PP2P1p/7N/P2PP1PP/BBRKQN1R w HChc - 1 9", 3, 35291 }, + { "bbrkqn1r/1pppppp1/5n2/p7/1PP2P1p/7N/P2PP1PP/BBRKQN1R w HChc - 1 9", 4, 973839 }, + { "bbrkqn1r/1pppppp1/5n2/p7/1PP2P1p/7N/P2PP1PP/BBRKQN1R w HChc - 1 9", 5, 35907489 }, + { "bbrkqn1r/1pppppp1/5n2/p7/1PP2P1p/7N/P2PP1PP/BBRKQN1R w HChc - 1 9", 6, 1034223364 }, + { "brkbqn1r/p2ppppp/7n/1p6/P1p3PP/8/1PPPPP1N/BRKBQ1NR w HBhb - 0 9", 1, 18 }, + { "brkbqn1r/p2ppppp/7n/1p6/P1p3PP/8/1PPPPP1N/BRKBQ1NR w HBhb - 0 9", 2, 583 }, + { "brkbqn1r/p2ppppp/7n/1p6/P1p3PP/8/1PPPPP1N/BRKBQ1NR w HBhb - 0 9", 3, 11790 }, + { "brkbqn1r/p2ppppp/7n/1p6/P1p3PP/8/1PPPPP1N/BRKBQ1NR w HBhb - 0 9", 4, 394603 }, + { "brkbqn1r/p2ppppp/7n/1p6/P1p3PP/8/1PPPPP1N/BRKBQ1NR w HBhb - 0 9", 5, 8858385 }, + { "brkbqn1r/p2ppppp/7n/1p6/P1p3PP/8/1PPPPP1N/BRKBQ1NR w HBhb - 0 9", 6, 304339862 }, + { "brkq1bnr/pp1ppp1p/8/2p2np1/P7/8/1PPPPPPP/BRKQNBNR w HBhb - 0 9", 1, 19 }, + { "brkq1bnr/pp1ppp1p/8/2p2np1/P7/8/1PPPPPPP/BRKQNBNR w HBhb - 0 9", 2, 552 }, + { "brkq1bnr/pp1ppp1p/8/2p2np1/P7/8/1PPPPPPP/BRKQNBNR w HBhb - 0 9", 3, 11811 }, + { "brkq1bnr/pp1ppp1p/8/2p2np1/P7/8/1PPPPPPP/BRKQNBNR w HBhb - 0 9", 4, 354260 }, + { "brkq1bnr/pp1ppp1p/8/2p2np1/P7/8/1PPPPPPP/BRKQNBNR w HBhb - 0 9", 5, 8432183 }, + { "brkq1bnr/pp1ppp1p/8/2p2np1/P7/8/1PPPPPPP/BRKQNBNR w HBhb - 0 9", 6, 262293169 }, + { "brkqnnrb/1ppppppp/8/8/p3P3/5N2/PPPP1PPP/BRKQ1NRB w GBgb - 3 9", 1, 21 }, + { "brkqnnrb/1ppppppp/8/8/p3P3/5N2/PPPP1PPP/BRKQ1NRB w GBgb - 3 9", 2, 397 }, + { "brkqnnrb/1ppppppp/8/8/p3P3/5N2/PPPP1PPP/BRKQ1NRB w GBgb - 3 9", 3, 9653 }, + { "brkqnnrb/1ppppppp/8/8/p3P3/5N2/PPPP1PPP/BRKQ1NRB w GBgb - 3 9", 4, 204350 }, + { "brkqnnrb/1ppppppp/8/8/p3P3/5N2/PPPP1PPP/BRKQ1NRB w GBgb - 3 9", 5, 5489836 }, + { "brkqnnrb/1ppppppp/8/8/p3P3/5N2/PPPP1PPP/BRKQ1NRB w GBgb - 3 9", 6, 128389738 }, + { "rbbkq1nr/1p2pppp/p1p3nB/3p4/1Q1P4/6N1/PPP1PPPP/RB1K2NR w HAha - 0 9", 1, 40 }, + { "rbbkq1nr/1p2pppp/p1p3nB/3p4/1Q1P4/6N1/PPP1PPPP/RB1K2NR w HAha - 0 9", 2, 1132 }, + { "rbbkq1nr/1p2pppp/p1p3nB/3p4/1Q1P4/6N1/PPP1PPPP/RB1K2NR w HAha - 0 9", 3, 43404 }, + { "rbbkq1nr/1p2pppp/p1p3nB/3p4/1Q1P4/6N1/PPP1PPPP/RB1K2NR w HAha - 0 9", 4, 1260470 }, + { "rbbkq1nr/1p2pppp/p1p3nB/3p4/1Q1P4/6N1/PPP1PPPP/RB1K2NR w HAha - 0 9", 5, 47425783 }, + { "rbbkq1nr/1p2pppp/p1p3nB/3p4/1Q1P4/6N1/PPP1PPPP/RB1K2NR w HAha - 0 9", 6, 1415578783 }, + { "rkbbq1nr/1pppp1p1/4np2/p6p/8/PP3P2/1KPPP1PP/R1BBQNNR w ha - 0 9", 1, 24 }, + { "rkbbq1nr/1pppp1p1/4np2/p6p/8/PP3P2/1KPPP1PP/R1BBQNNR w ha - 0 9", 2, 596 }, + { "rkbbq1nr/1pppp1p1/4np2/p6p/8/PP3P2/1KPPP1PP/R1BBQNNR w ha - 0 9", 3, 15220 }, + { "rkbbq1nr/1pppp1p1/4np2/p6p/8/PP3P2/1KPPP1PP/R1BBQNNR w ha - 0 9", 4, 402121 }, + { "rkbbq1nr/1pppp1p1/4np2/p6p/8/PP3P2/1KPPP1PP/R1BBQNNR w ha - 0 9", 5, 10822049 }, + { "rkbbq1nr/1pppp1p1/4np2/p6p/8/PP3P2/1KPPP1PP/R1BBQNNR w ha - 0 9", 6, 302056813 }, + { "r1bqn1nr/pkpppp1p/1p4pb/8/PN6/R7/1PPPPPPP/1KBQ1BNR w H - 2 9", 1, 33 }, + { "r1bqn1nr/pkpppp1p/1p4pb/8/PN6/R7/1PPPPPPP/1KBQ1BNR w H - 2 9", 2, 794 }, + { "r1bqn1nr/pkpppp1p/1p4pb/8/PN6/R7/1PPPPPPP/1KBQ1BNR w H - 2 9", 3, 25450 }, + { "r1bqn1nr/pkpppp1p/1p4pb/8/PN6/R7/1PPPPPPP/1KBQ1BNR w H - 2 9", 4, 649150 }, + { "r1bqn1nr/pkpppp1p/1p4pb/8/PN6/R7/1PPPPPPP/1KBQ1BNR w H - 2 9", 5, 20919309 }, + { "r1bqn1nr/pkpppp1p/1p4pb/8/PN6/R7/1PPPPPPP/1KBQ1BNR w H - 2 9", 6, 561073410 }, + { "rkb1nnrb/1pppq1pp/p4p2/4p3/5P2/1P1PB3/P1P1P1PP/RK1QNNRB w GAga - 0 9", 1, 26 }, + { "rkb1nnrb/1pppq1pp/p4p2/4p3/5P2/1P1PB3/P1P1P1PP/RK1QNNRB w GAga - 0 9", 2, 625 }, + { "rkb1nnrb/1pppq1pp/p4p2/4p3/5P2/1P1PB3/P1P1P1PP/RK1QNNRB w GAga - 0 9", 3, 17050 }, + { "rkb1nnrb/1pppq1pp/p4p2/4p3/5P2/1P1PB3/P1P1P1PP/RK1QNNRB w GAga - 0 9", 4, 442036 }, + { "rkb1nnrb/1pppq1pp/p4p2/4p3/5P2/1P1PB3/P1P1P1PP/RK1QNNRB w GAga - 0 9", 5, 12515042 }, + { "rkb1nnrb/1pppq1pp/p4p2/4p3/5P2/1P1PB3/P1P1P1PP/RK1QNNRB w GAga - 0 9", 6, 342967558 }, + { "rbkqbn1r/pppp1p1p/2n1p1p1/8/8/1P1PP1N1/P1P2PPP/RBKQB1NR w HAha - 1 9", 1, 30 }, + { "rbkqbn1r/pppp1p1p/2n1p1p1/8/8/1P1PP1N1/P1P2PPP/RBKQB1NR w HAha - 1 9", 2, 660 }, + { "rbkqbn1r/pppp1p1p/2n1p1p1/8/8/1P1PP1N1/P1P2PPP/RBKQB1NR w HAha - 1 9", 3, 20308 }, + { "rbkqbn1r/pppp1p1p/2n1p1p1/8/8/1P1PP1N1/P1P2PPP/RBKQB1NR w HAha - 1 9", 4, 492714 }, + { "rbkqbn1r/pppp1p1p/2n1p1p1/8/8/1P1PP1N1/P1P2PPP/RBKQB1NR w HAha - 1 9", 5, 15348335 }, + { "rbkqbn1r/pppp1p1p/2n1p1p1/8/8/1P1PP1N1/P1P2PPP/RBKQB1NR w HAha - 1 9", 6, 403323883 }, + { "rkqbb1n1/pppppppr/8/6np/5P2/8/PPPPP1PP/RKQBBNNR w HAa - 6 9", 1, 23 }, + { "rkqbb1n1/pppppppr/8/6np/5P2/8/PPPPP1PP/RKQBBNNR w HAa - 6 9", 2, 500 }, + { "rkqbb1n1/pppppppr/8/6np/5P2/8/PPPPP1PP/RKQBBNNR w HAa - 6 9", 3, 12154 }, + { "rkqbb1n1/pppppppr/8/6np/5P2/8/PPPPP1PP/RKQBBNNR w HAa - 6 9", 4, 292936 }, + { "rkqbb1n1/pppppppr/8/6np/5P2/8/PPPPP1PP/RKQBBNNR w HAa - 6 9", 5, 7519117 }, + { "rkqbb1n1/pppppppr/8/6np/5P2/8/PPPPP1PP/RKQBBNNR w HAa - 6 9", 6, 196524441 }, + { "rkqnbbnr/ppppppp1/8/7p/3N4/6PP/PPPPPP2/RKQNBB1R w HAa - 0 9", 1, 24 }, + { "rkqnbbnr/ppppppp1/8/7p/3N4/6PP/PPPPPP2/RKQNBB1R w HAa - 0 9", 2, 484 }, + { "rkqnbbnr/ppppppp1/8/7p/3N4/6PP/PPPPPP2/RKQNBB1R w HAa - 0 9", 3, 12495 }, + { "rkqnbbnr/ppppppp1/8/7p/3N4/6PP/PPPPPP2/RKQNBB1R w HAa - 0 9", 4, 284570 }, + { "rkqnbbnr/ppppppp1/8/7p/3N4/6PP/PPPPPP2/RKQNBB1R w HAa - 0 9", 5, 7775173 }, + { "rkqnbbnr/ppppppp1/8/7p/3N4/6PP/PPPPPP2/RKQNBB1R w HAa - 0 9", 6, 193947530 }, + { "rkqnb1rb/p1p1pppp/1p1p4/2n5/3P4/2P1N1N1/PP2PPPP/RKQ1B1RB w GAga - 0 9", 1, 28 }, + { "rkqnb1rb/p1p1pppp/1p1p4/2n5/3P4/2P1N1N1/PP2PPPP/RKQ1B1RB w GAga - 0 9", 2, 1020 }, + { "rkqnb1rb/p1p1pppp/1p1p4/2n5/3P4/2P1N1N1/PP2PPPP/RKQ1B1RB w GAga - 0 9", 3, 29124 }, + { "rkqnb1rb/p1p1pppp/1p1p4/2n5/3P4/2P1N1N1/PP2PPPP/RKQ1B1RB w GAga - 0 9", 4, 1027904 }, + { "rkqnb1rb/p1p1pppp/1p1p4/2n5/3P4/2P1N1N1/PP2PPPP/RKQ1B1RB w GAga - 0 9", 5, 30515456 }, + { "rkqnb1rb/p1p1pppp/1p1p4/2n5/3P4/2P1N1N1/PP2PPPP/RKQ1B1RB w GAga - 0 9", 6, 1073711823 }, + { "rbk1nnbr/1ppq1ppp/p2p4/4p3/P3B2P/2P5/1P1PPPP1/R1KQNNBR w HAha - 2 9", 1, 38 }, + { "rbk1nnbr/1ppq1ppp/p2p4/4p3/P3B2P/2P5/1P1PPPP1/R1KQNNBR w HAha - 2 9", 2, 998 }, + { "rbk1nnbr/1ppq1ppp/p2p4/4p3/P3B2P/2P5/1P1PPPP1/R1KQNNBR w HAha - 2 9", 3, 37265 }, + { "rbk1nnbr/1ppq1ppp/p2p4/4p3/P3B2P/2P5/1P1PPPP1/R1KQNNBR w HAha - 2 9", 4, 1047592 }, + { "rbk1nnbr/1ppq1ppp/p2p4/4p3/P3B2P/2P5/1P1PPPP1/R1KQNNBR w HAha - 2 9", 5, 38552638 }, + { "rbk1nnbr/1ppq1ppp/p2p4/4p3/P3B2P/2P5/1P1PPPP1/R1KQNNBR w HAha - 2 9", 6, 1139322479 }, + { "r1qbn1br/k1pppppp/6n1/pp6/5P1P/P7/1PPPP1PB/RKQBNN1R w HA - 1 9", 1, 22 }, + { "r1qbn1br/k1pppppp/6n1/pp6/5P1P/P7/1PPPP1PB/RKQBNN1R w HA - 1 9", 2, 549 }, + { "r1qbn1br/k1pppppp/6n1/pp6/5P1P/P7/1PPPP1PB/RKQBNN1R w HA - 1 9", 3, 12867 }, + { "r1qbn1br/k1pppppp/6n1/pp6/5P1P/P7/1PPPP1PB/RKQBNN1R w HA - 1 9", 4, 348574 }, + { "r1qbn1br/k1pppppp/6n1/pp6/5P1P/P7/1PPPP1PB/RKQBNN1R w HA - 1 9", 5, 8725809 }, + { "r1qbn1br/k1pppppp/6n1/pp6/5P1P/P7/1PPPP1PB/RKQBNN1R w HA - 1 9", 6, 251613569 }, + { "rkqnn1br/pppp3p/4p1pb/5p2/P2P4/7P/1PP1PPPB/RKQNNB1R w HAha - 1 9", 1, 32 }, + { "rkqnn1br/pppp3p/4p1pb/5p2/P2P4/7P/1PP1PPPB/RKQNNB1R w HAha - 1 9", 2, 659 }, + { "rkqnn1br/pppp3p/4p1pb/5p2/P2P4/7P/1PP1PPPB/RKQNNB1R w HAha - 1 9", 3, 21249 }, + { "rkqnn1br/pppp3p/4p1pb/5p2/P2P4/7P/1PP1PPPB/RKQNNB1R w HAha - 1 9", 4, 469701 }, + { "rkqnn1br/pppp3p/4p1pb/5p2/P2P4/7P/1PP1PPPB/RKQNNB1R w HAha - 1 9", 5, 15434721 }, + { "rkqnn1br/pppp3p/4p1pb/5p2/P2P4/7P/1PP1PPPB/RKQNNB1R w HAha - 1 9", 6, 365761521 }, + { "rk1nnrbb/p1p1pppp/1p6/3p1q2/P3P3/2NN4/1PPP1PPP/RKQ2RBB w FAfa - 3 9", 1, 29 }, + { "rk1nnrbb/p1p1pppp/1p6/3p1q2/P3P3/2NN4/1PPP1PPP/RKQ2RBB w FAfa - 3 9", 2, 989 }, + { "rk1nnrbb/p1p1pppp/1p6/3p1q2/P3P3/2NN4/1PPP1PPP/RKQ2RBB w FAfa - 3 9", 3, 29087 }, + { "rk1nnrbb/p1p1pppp/1p6/3p1q2/P3P3/2NN4/1PPP1PPP/RKQ2RBB w FAfa - 3 9", 4, 980477 }, + { "rk1nnrbb/p1p1pppp/1p6/3p1q2/P3P3/2NN4/1PPP1PPP/RKQ2RBB w FAfa - 3 9", 5, 29643404 }, + { "rk1nnrbb/p1p1pppp/1p6/3p1q2/P3P3/2NN4/1PPP1PPP/RKQ2RBB w FAfa - 3 9", 6, 998848556 }, + { "bbrk1q1r/ppppppp1/3n4/7p/3Pn3/6PN/PPP1PPNP/BBRK1Q1R w HChc - 2 9", 1, 23 }, + { "bbrk1q1r/ppppppp1/3n4/7p/3Pn3/6PN/PPP1PPNP/BBRK1Q1R w HChc - 2 9", 2, 712 }, + { "bbrk1q1r/ppppppp1/3n4/7p/3Pn3/6PN/PPP1PPNP/BBRK1Q1R w HChc - 2 9", 3, 16551 }, + { "bbrk1q1r/ppppppp1/3n4/7p/3Pn3/6PN/PPP1PPNP/BBRK1Q1R w HChc - 2 9", 4, 516177 }, + { "bbrk1q1r/ppppppp1/3n4/7p/3Pn3/6PN/PPP1PPNP/BBRK1Q1R w HChc - 2 9", 5, 12995202 }, + { "bbrk1q1r/ppppppp1/3n4/7p/3Pn3/6PN/PPP1PPNP/BBRK1Q1R w HChc - 2 9", 6, 411077508 }, + { "brkbnq1r/p1ppp2p/5ppn/1p6/5P2/1P1P2P1/P1P1P2P/BRKBNQNR w HBhb - 0 9", 1, 28 }, + { "brkbnq1r/p1ppp2p/5ppn/1p6/5P2/1P1P2P1/P1P1P2P/BRKBNQNR w HBhb - 0 9", 2, 856 }, + { "brkbnq1r/p1ppp2p/5ppn/1p6/5P2/1P1P2P1/P1P1P2P/BRKBNQNR w HBhb - 0 9", 3, 24984 }, + { "brkbnq1r/p1ppp2p/5ppn/1p6/5P2/1P1P2P1/P1P1P2P/BRKBNQNR w HBhb - 0 9", 4, 780503 }, + { "brkbnq1r/p1ppp2p/5ppn/1p6/5P2/1P1P2P1/P1P1P2P/BRKBNQNR w HBhb - 0 9", 5, 23529352 }, + { "brkbnq1r/p1ppp2p/5ppn/1p6/5P2/1P1P2P1/P1P1P2P/BRKBNQNR w HBhb - 0 9", 6, 754501112 }, + { "br1k1bnr/ppppp1pp/4np2/1B2P2q/3P4/8/PPP2PPP/BRKNQ1NR w HB - 3 9", 1, 36 }, + { "br1k1bnr/ppppp1pp/4np2/1B2P2q/3P4/8/PPP2PPP/BRKNQ1NR w HB - 3 9", 2, 1214 }, + { "br1k1bnr/ppppp1pp/4np2/1B2P2q/3P4/8/PPP2PPP/BRKNQ1NR w HB - 3 9", 3, 40615 }, + { "br1k1bnr/ppppp1pp/4np2/1B2P2q/3P4/8/PPP2PPP/BRKNQ1NR w HB - 3 9", 4, 1328331 }, + { "br1k1bnr/ppppp1pp/4np2/1B2P2q/3P4/8/PPP2PPP/BRKNQ1NR w HB - 3 9", 5, 45096834 }, + { "br1k1bnr/ppppp1pp/4np2/1B2P2q/3P4/8/PPP2PPP/BRKNQ1NR w HB - 3 9", 6, 1470987023 }, + { "brk1qnrb/pnppp1p1/1p6/5p1p/8/5PPP/PPPPP1R1/BRKNQN1B w Bgb - 0 9", 1, 22 }, + { "brk1qnrb/pnppp1p1/1p6/5p1p/8/5PPP/PPPPP1R1/BRKNQN1B w Bgb - 0 9", 2, 551 }, + { "brk1qnrb/pnppp1p1/1p6/5p1p/8/5PPP/PPPPP1R1/BRKNQN1B w Bgb - 0 9", 3, 13111 }, + { "brk1qnrb/pnppp1p1/1p6/5p1p/8/5PPP/PPPPP1R1/BRKNQN1B w Bgb - 0 9", 4, 353317 }, + { "brk1qnrb/pnppp1p1/1p6/5p1p/8/5PPP/PPPPP1R1/BRKNQN1B w Bgb - 0 9", 5, 9040545 }, + { "brk1qnrb/pnppp1p1/1p6/5p1p/8/5PPP/PPPPP1R1/BRKNQN1B w Bgb - 0 9", 6, 259643605 }, + { "rbbkn1nr/1ppp2pp/p3p3/2q2p2/3P4/6P1/PPPBPP1P/RB1KNQNR w HAha - 0 9", 1, 31 }, + { "rbbkn1nr/1ppp2pp/p3p3/2q2p2/3P4/6P1/PPPBPP1P/RB1KNQNR w HAha - 0 9", 2, 1060 }, + { "rbbkn1nr/1ppp2pp/p3p3/2q2p2/3P4/6P1/PPPBPP1P/RB1KNQNR w HAha - 0 9", 3, 31332 }, + { "rbbkn1nr/1ppp2pp/p3p3/2q2p2/3P4/6P1/PPPBPP1P/RB1KNQNR w HAha - 0 9", 4, 1015099 }, + { "rbbkn1nr/1ppp2pp/p3p3/2q2p2/3P4/6P1/PPPBPP1P/RB1KNQNR w HAha - 0 9", 5, 30314172 }, + { "rbbkn1nr/1ppp2pp/p3p3/2q2p2/3P4/6P1/PPPBPP1P/RB1KNQNR w HAha - 0 9", 6, 976268967 }, + { "rkbbn1nr/ppppp1pp/8/6N1/5p2/1q6/P1PPPPPP/RKBBN1QR w HAha - 0 9", 1, 3 }, + { "rkbbn1nr/ppppp1pp/8/6N1/5p2/1q6/P1PPPPPP/RKBBN1QR w HAha - 0 9", 2, 72 }, + { "rkbbn1nr/ppppp1pp/8/6N1/5p2/1q6/P1PPPPPP/RKBBN1QR w HAha - 0 9", 3, 1919 }, + { "rkbbn1nr/ppppp1pp/8/6N1/5p2/1q6/P1PPPPPP/RKBBN1QR w HAha - 0 9", 4, 50827 }, + { "rkbbn1nr/ppppp1pp/8/6N1/5p2/1q6/P1PPPPPP/RKBBN1QR w HAha - 0 9", 5, 1400832 }, + { "rkbbn1nr/ppppp1pp/8/6N1/5p2/1q6/P1PPPPPP/RKBBN1QR w HAha - 0 9", 6, 39654253 }, + { "rkb2bnr/pp2pppp/2p1n3/3p4/q2P4/5NP1/PPP1PP1P/RKBNQBR1 w Aha - 0 9", 1, 29 }, + { "rkb2bnr/pp2pppp/2p1n3/3p4/q2P4/5NP1/PPP1PP1P/RKBNQBR1 w Aha - 0 9", 2, 861 }, + { "rkb2bnr/pp2pppp/2p1n3/3p4/q2P4/5NP1/PPP1PP1P/RKBNQBR1 w Aha - 0 9", 3, 24504 }, + { "rkb2bnr/pp2pppp/2p1n3/3p4/q2P4/5NP1/PPP1PP1P/RKBNQBR1 w Aha - 0 9", 4, 763454 }, + { "rkb2bnr/pp2pppp/2p1n3/3p4/q2P4/5NP1/PPP1PP1P/RKBNQBR1 w Aha - 0 9", 5, 22763215 }, + { "rkb2bnr/pp2pppp/2p1n3/3p4/q2P4/5NP1/PPP1PP1P/RKBNQBR1 w Aha - 0 9", 6, 731511256 }, + { "rkbq1nrb/ppppppp1/7p/8/1P1n4/P4P1P/2PPP1P1/RKBNQNRB w GAga - 0 9", 1, 25 }, + { "rkbq1nrb/ppppppp1/7p/8/1P1n4/P4P1P/2PPP1P1/RKBNQNRB w GAga - 0 9", 2, 672 }, + { "rkbq1nrb/ppppppp1/7p/8/1P1n4/P4P1P/2PPP1P1/RKBNQNRB w GAga - 0 9", 3, 17631 }, + { "rkbq1nrb/ppppppp1/7p/8/1P1n4/P4P1P/2PPP1P1/RKBNQNRB w GAga - 0 9", 4, 473864 }, + { "rkbq1nrb/ppppppp1/7p/8/1P1n4/P4P1P/2PPP1P1/RKBNQNRB w GAga - 0 9", 5, 12954224 }, + { "rkbq1nrb/ppppppp1/7p/8/1P1n4/P4P1P/2PPP1P1/RKBNQNRB w GAga - 0 9", 6, 361237536 }, + { "rbknb1nr/ppp1qp1p/6p1/3pp3/3P3P/2B1P3/PPP2PP1/RBKN1QNR w HAha - 1 9", 1, 27 }, + { "rbknb1nr/ppp1qp1p/6p1/3pp3/3P3P/2B1P3/PPP2PP1/RBKN1QNR w HAha - 1 9", 2, 857 }, + { "rbknb1nr/ppp1qp1p/6p1/3pp3/3P3P/2B1P3/PPP2PP1/RBKN1QNR w HAha - 1 9", 3, 24688 }, + { "rbknb1nr/ppp1qp1p/6p1/3pp3/3P3P/2B1P3/PPP2PP1/RBKN1QNR w HAha - 1 9", 4, 792538 }, + { "rbknb1nr/ppp1qp1p/6p1/3pp3/3P3P/2B1P3/PPP2PP1/RBKN1QNR w HAha - 1 9", 5, 23790033 }, + { "rbknb1nr/ppp1qp1p/6p1/3pp3/3P3P/2B1P3/PPP2PP1/RBKN1QNR w HAha - 1 9", 6, 768247869 }, + { "rknbbq1r/p1pppppp/1p2N3/8/3n4/2P5/PP1PPPPP/RK1BBQNR w HAha - 4 9", 1, 29 }, + { "rknbbq1r/p1pppppp/1p2N3/8/3n4/2P5/PP1PPPPP/RK1BBQNR w HAha - 4 9", 2, 763 }, + { "rknbbq1r/p1pppppp/1p2N3/8/3n4/2P5/PP1PPPPP/RK1BBQNR w HAha - 4 9", 3, 22138 }, + { "rknbbq1r/p1pppppp/1p2N3/8/3n4/2P5/PP1PPPPP/RK1BBQNR w HAha - 4 9", 4, 574054 }, + { "rknbbq1r/p1pppppp/1p2N3/8/3n4/2P5/PP1PPPPP/RK1BBQNR w HAha - 4 9", 5, 16926075 }, + { "rknbbq1r/p1pppppp/1p2N3/8/3n4/2P5/PP1PPPPP/RK1BBQNR w HAha - 4 9", 6, 447896703 }, + { "r1nqbbnr/1pppp1pp/1k6/p4p2/8/4P3/PPPP1PPP/RKN1BBNR w HA - 0 9", 1, 26 }, + { "r1nqbbnr/1pppp1pp/1k6/p4p2/8/4P3/PPPP1PPP/RKN1BBNR w HA - 0 9", 2, 658 }, + { "r1nqbbnr/1pppp1pp/1k6/p4p2/8/4P3/PPPP1PPP/RKN1BBNR w HA - 0 9", 3, 17302 }, + { "r1nqbbnr/1pppp1pp/1k6/p4p2/8/4P3/PPPP1PPP/RKN1BBNR w HA - 0 9", 4, 464039 }, + { "r1nqbbnr/1pppp1pp/1k6/p4p2/8/4P3/PPPP1PPP/RKN1BBNR w HA - 0 9", 5, 12380488 }, + { "r1nqbbnr/1pppp1pp/1k6/p4p2/8/4P3/PPPP1PPP/RKN1BBNR w HA - 0 9", 6, 349047256 }, + { "rkn2qrb/ppp1pppp/6n1/1b1p4/1P6/4PPB1/P1PP2PP/RKNQ1NRB w GAga - 3 9", 1, 23 }, + { "rkn2qrb/ppp1pppp/6n1/1b1p4/1P6/4PPB1/P1PP2PP/RKNQ1NRB w GAga - 3 9", 2, 574 }, + { "rkn2qrb/ppp1pppp/6n1/1b1p4/1P6/4PPB1/P1PP2PP/RKNQ1NRB w GAga - 3 9", 3, 14070 }, + { "rkn2qrb/ppp1pppp/6n1/1b1p4/1P6/4PPB1/P1PP2PP/RKNQ1NRB w GAga - 3 9", 4, 370324 }, + { "rkn2qrb/ppp1pppp/6n1/1b1p4/1P6/4PPB1/P1PP2PP/RKNQ1NRB w GAga - 3 9", 5, 9501401 }, + { "rkn2qrb/ppp1pppp/6n1/1b1p4/1P6/4PPB1/P1PP2PP/RKNQ1NRB w GAga - 3 9", 6, 263870337 }, + { "rbkn2br/ppppp1p1/4np1p/1P5q/8/2P1N3/P2PPPPP/RBK1QNBR w HAha - 1 9", 1, 29 }, + { "rbkn2br/ppppp1p1/4np1p/1P5q/8/2P1N3/P2PPPPP/RBK1QNBR w HAha - 1 9", 2, 992 }, + { "rbkn2br/ppppp1p1/4np1p/1P5q/8/2P1N3/P2PPPPP/RBK1QNBR w HAha - 1 9", 3, 29506 }, + { "rbkn2br/ppppp1p1/4np1p/1P5q/8/2P1N3/P2PPPPP/RBK1QNBR w HAha - 1 9", 4, 999564 }, + { "rbkn2br/ppppp1p1/4np1p/1P5q/8/2P1N3/P2PPPPP/RBK1QNBR w HAha - 1 9", 5, 30148787 }, + { "rbkn2br/ppppp1p1/4np1p/1P5q/8/2P1N3/P2PPPPP/RBK1QNBR w HAha - 1 9", 6, 1045942540 }, + { "1knbqnbr/1ppppp1p/r5p1/p7/7P/2PN2P1/PP1PPP2/RK1BQNBR w HAh - 2 9", 1, 26 }, + { "1knbqnbr/1ppppp1p/r5p1/p7/7P/2PN2P1/PP1PPP2/RK1BQNBR w HAh - 2 9", 2, 698 }, + { "1knbqnbr/1ppppp1p/r5p1/p7/7P/2PN2P1/PP1PPP2/RK1BQNBR w HAh - 2 9", 3, 19395 }, + { "1knbqnbr/1ppppp1p/r5p1/p7/7P/2PN2P1/PP1PPP2/RK1BQNBR w HAh - 2 9", 4, 512023 }, + { "1knbqnbr/1ppppp1p/r5p1/p7/7P/2PN2P1/PP1PPP2/RK1BQNBR w HAh - 2 9", 5, 14848229 }, + { "1knbqnbr/1ppppp1p/r5p1/p7/7P/2PN2P1/PP1PPP2/RK1BQNBR w HAh - 2 9", 6, 402599313 }, + { "rk1qnbbr/pnpppp1p/6p1/1p6/3P4/1P6/P1P1PPPP/RKNQNBBR w HAha - 1 9", 1, 20 }, + { "rk1qnbbr/pnpppp1p/6p1/1p6/3P4/1P6/P1P1PPPP/RKNQNBBR w HAha - 1 9", 2, 480 }, + { "rk1qnbbr/pnpppp1p/6p1/1p6/3P4/1P6/P1P1PPPP/RKNQNBBR w HAha - 1 9", 3, 11159 }, + { "rk1qnbbr/pnpppp1p/6p1/1p6/3P4/1P6/P1P1PPPP/RKNQNBBR w HAha - 1 9", 4, 287539 }, + { "rk1qnbbr/pnpppp1p/6p1/1p6/3P4/1P6/P1P1PPPP/RKNQNBBR w HAha - 1 9", 5, 7425917 }, + { "rk1qnbbr/pnpppp1p/6p1/1p6/3P4/1P6/P1P1PPPP/RKNQNBBR w HAha - 1 9", 6, 203194521 }, + { "rknqnrbb/pp1p2p1/5p1p/2p1p3/2P1P3/P2P4/1P3PPP/RKNQNRBB w FAfa - 0 9", 1, 26 }, + { "rknqnrbb/pp1p2p1/5p1p/2p1p3/2P1P3/P2P4/1P3PPP/RKNQNRBB w FAfa - 0 9", 2, 679 }, + { "rknqnrbb/pp1p2p1/5p1p/2p1p3/2P1P3/P2P4/1P3PPP/RKNQNRBB w FAfa - 0 9", 3, 18116 }, + { "rknqnrbb/pp1p2p1/5p1p/2p1p3/2P1P3/P2P4/1P3PPP/RKNQNRBB w FAfa - 0 9", 4, 494953 }, + { "rknqnrbb/pp1p2p1/5p1p/2p1p3/2P1P3/P2P4/1P3PPP/RKNQNRBB w FAfa - 0 9", 5, 13790137 }, + { "rknqnrbb/pp1p2p1/5p1p/2p1p3/2P1P3/P2P4/1P3PPP/RKNQNRBB w FAfa - 0 9", 6, 392629571 }, + { "bbrk2qr/pp1p1ppp/3n2n1/2p1p3/3P1P2/6N1/PPP1P1PP/BBRKN1QR w HChc - 0 9", 1, 26 }, + { "bbrk2qr/pp1p1ppp/3n2n1/2p1p3/3P1P2/6N1/PPP1P1PP/BBRKN1QR w HChc - 0 9", 2, 790 }, + { "bbrk2qr/pp1p1ppp/3n2n1/2p1p3/3P1P2/6N1/PPP1P1PP/BBRKN1QR w HChc - 0 9", 3, 21521 }, + { "bbrk2qr/pp1p1ppp/3n2n1/2p1p3/3P1P2/6N1/PPP1P1PP/BBRKN1QR w HChc - 0 9", 4, 673269 }, + { "bbrk2qr/pp1p1ppp/3n2n1/2p1p3/3P1P2/6N1/PPP1P1PP/BBRKN1QR w HChc - 0 9", 5, 19259490 }, + { "bbrk2qr/pp1p1ppp/3n2n1/2p1p3/3P1P2/6N1/PPP1P1PP/BBRKN1QR w HChc - 0 9", 6, 617563700 }, + { "b1krnnqr/1p1ppppp/p1p5/b6B/P7/4P1N1/1PPP1PPP/BRK1N1QR w HB - 2 9", 1, 26 }, + { "b1krnnqr/1p1ppppp/p1p5/b6B/P7/4P1N1/1PPP1PPP/BRK1N1QR w HB - 2 9", 2, 625 }, + { "b1krnnqr/1p1ppppp/p1p5/b6B/P7/4P1N1/1PPP1PPP/BRK1N1QR w HB - 2 9", 3, 16451 }, + { "b1krnnqr/1p1ppppp/p1p5/b6B/P7/4P1N1/1PPP1PPP/BRK1N1QR w HB - 2 9", 4, 415452 }, + { "b1krnnqr/1p1ppppp/p1p5/b6B/P7/4P1N1/1PPP1PPP/BRK1N1QR w HB - 2 9", 5, 11490615 }, + { "b1krnnqr/1p1ppppp/p1p5/b6B/P7/4P1N1/1PPP1PPP/BRK1N1QR w HB - 2 9", 6, 304805107 }, + { "1rknnbqr/3ppppp/p7/1pp5/4b2P/P4P2/1PPPP1PR/BRKNNBQ1 w Bhb - 1 9", 1, 24 }, + { "1rknnbqr/3ppppp/p7/1pp5/4b2P/P4P2/1PPPP1PR/BRKNNBQ1 w Bhb - 1 9", 2, 757 }, + { "1rknnbqr/3ppppp/p7/1pp5/4b2P/P4P2/1PPPP1PR/BRKNNBQ1 w Bhb - 1 9", 3, 19746 }, + { "1rknnbqr/3ppppp/p7/1pp5/4b2P/P4P2/1PPPP1PR/BRKNNBQ1 w Bhb - 1 9", 4, 618777 }, + { "1rknnbqr/3ppppp/p7/1pp5/4b2P/P4P2/1PPPP1PR/BRKNNBQ1 w Bhb - 1 9", 5, 17275100 }, + { "1rknnbqr/3ppppp/p7/1pp5/4b2P/P4P2/1PPPP1PR/BRKNNBQ1 w Bhb - 1 9", 6, 544309489 }, + { "br1nn1rb/pppkpqpp/3p1p2/8/PP6/4N3/1KPPPPPP/BR2NQRB w - - 3 9", 1, 24 }, + { "br1nn1rb/pppkpqpp/3p1p2/8/PP6/4N3/1KPPPPPP/BR2NQRB w - - 3 9", 2, 682 }, + { "br1nn1rb/pppkpqpp/3p1p2/8/PP6/4N3/1KPPPPPP/BR2NQRB w - - 3 9", 3, 17129 }, + { "br1nn1rb/pppkpqpp/3p1p2/8/PP6/4N3/1KPPPPPP/BR2NQRB w - - 3 9", 4, 482711 }, + { "br1nn1rb/pppkpqpp/3p1p2/8/PP6/4N3/1KPPPPPP/BR2NQRB w - - 3 9", 5, 13057308 }, + { "br1nn1rb/pppkpqpp/3p1p2/8/PP6/4N3/1KPPPPPP/BR2NQRB w - - 3 9", 6, 375033550 }, + { "rbbkn1qr/pppp2p1/6np/4pp2/7N/7P/PPPPPPPR/RBBK1NQ1 w Aha - 0 9", 1, 22 }, + { "rbbkn1qr/pppp2p1/6np/4pp2/7N/7P/PPPPPPPR/RBBK1NQ1 w Aha - 0 9", 2, 586 }, + { "rbbkn1qr/pppp2p1/6np/4pp2/7N/7P/PPPPPPPR/RBBK1NQ1 w Aha - 0 9", 3, 14158 }, + { "rbbkn1qr/pppp2p1/6np/4pp2/7N/7P/PPPPPPPR/RBBK1NQ1 w Aha - 0 9", 4, 409891 }, + { "rbbkn1qr/pppp2p1/6np/4pp2/7N/7P/PPPPPPPR/RBBK1NQ1 w Aha - 0 9", 5, 10607781 }, + { "rbbkn1qr/pppp2p1/6np/4pp2/7N/7P/PPPPPPPR/RBBK1NQ1 w Aha - 0 9", 6, 324452612 }, + { "rk1bn1qr/pppbpppp/4n3/4p3/4P3/5P2/PPPP2PP/RKBB1NQR w HAha - 1 9", 1, 22 }, + { "rk1bn1qr/pppbpppp/4n3/4p3/4P3/5P2/PPPP2PP/RKBB1NQR w HAha - 1 9", 2, 530 }, + { "rk1bn1qr/pppbpppp/4n3/4p3/4P3/5P2/PPPP2PP/RKBB1NQR w HAha - 1 9", 3, 13440 }, + { "rk1bn1qr/pppbpppp/4n3/4p3/4P3/5P2/PPPP2PP/RKBB1NQR w HAha - 1 9", 4, 348004 }, + { "rk1bn1qr/pppbpppp/4n3/4p3/4P3/5P2/PPPP2PP/RKBB1NQR w HAha - 1 9", 5, 9514787 }, + { "rk1bn1qr/pppbpppp/4n3/4p3/4P3/5P2/PPPP2PP/RKBB1NQR w HAha - 1 9", 6, 259898748 }, + { "rkbnnbqr/1ppp1ppp/p7/4p3/8/QP3P2/P1PPP1PP/RKBNNB1R w HAha - 0 9", 1, 29 }, + { "rkbnnbqr/1ppp1ppp/p7/4p3/8/QP3P2/P1PPP1PP/RKBNNB1R w HAha - 0 9", 2, 705 }, + { "rkbnnbqr/1ppp1ppp/p7/4p3/8/QP3P2/P1PPP1PP/RKBNNB1R w HAha - 0 9", 3, 21511 }, + { "rkbnnbqr/1ppp1ppp/p7/4p3/8/QP3P2/P1PPP1PP/RKBNNB1R w HAha - 0 9", 4, 551042 }, + { "rkbnnbqr/1ppp1ppp/p7/4p3/8/QP3P2/P1PPP1PP/RKBNNB1R w HAha - 0 9", 5, 17524731 }, + { "rkbnnbqr/1ppp1ppp/p7/4p3/8/QP3P2/P1PPP1PP/RKBNNB1R w HAha - 0 9", 6, 472356665 }, + { "1kbnnqrb/1pp1p1pp/r4p2/p2p4/N4P2/3P4/PPP1P1PP/RKB1NQRB w GAg - 2 9", 1, 21 }, + { "1kbnnqrb/1pp1p1pp/r4p2/p2p4/N4P2/3P4/PPP1P1PP/RKB1NQRB w GAg - 2 9", 2, 623 }, + { "1kbnnqrb/1pp1p1pp/r4p2/p2p4/N4P2/3P4/PPP1P1PP/RKB1NQRB w GAg - 2 9", 3, 14979 }, + { "1kbnnqrb/1pp1p1pp/r4p2/p2p4/N4P2/3P4/PPP1P1PP/RKB1NQRB w GAg - 2 9", 4, 437554 }, + { "1kbnnqrb/1pp1p1pp/r4p2/p2p4/N4P2/3P4/PPP1P1PP/RKB1NQRB w GAg - 2 9", 5, 11601134 }, + { "1kbnnqrb/1pp1p1pp/r4p2/p2p4/N4P2/3P4/PPP1P1PP/RKB1NQRB w GAg - 2 9", 6, 343214006 }, + { "rbknbn1r/pppp1p1p/4p1q1/8/P1P3Pp/8/1P1PPP2/RBKNBNQR w HAha - 0 9", 1, 30 }, + { "rbknbn1r/pppp1p1p/4p1q1/8/P1P3Pp/8/1P1PPP2/RBKNBNQR w HAha - 0 9", 2, 813 }, + { "rbknbn1r/pppp1p1p/4p1q1/8/P1P3Pp/8/1P1PPP2/RBKNBNQR w HAha - 0 9", 3, 24959 }, + { "rbknbn1r/pppp1p1p/4p1q1/8/P1P3Pp/8/1P1PPP2/RBKNBNQR w HAha - 0 9", 4, 708454 }, + { "rbknbn1r/pppp1p1p/4p1q1/8/P1P3Pp/8/1P1PPP2/RBKNBNQR w HAha - 0 9", 5, 23379040 }, + { "rbknbn1r/pppp1p1p/4p1q1/8/P1P3Pp/8/1P1PPP2/RBKNBNQR w HAha - 0 9", 6, 692576573 }, + { "rk1bb1qr/2pppppp/p2nn3/1p4P1/6QP/8/PPPPPP2/RKNBBN1R w HAha - 2 9", 1, 36 }, + { "rk1bb1qr/2pppppp/p2nn3/1p4P1/6QP/8/PPPPPP2/RKNBBN1R w HAha - 2 9", 2, 857 }, + { "rk1bb1qr/2pppppp/p2nn3/1p4P1/6QP/8/PPPPPP2/RKNBBN1R w HAha - 2 9", 3, 30124 }, + { "rk1bb1qr/2pppppp/p2nn3/1p4P1/6QP/8/PPPPPP2/RKNBBN1R w HAha - 2 9", 4, 757524 }, + { "rk1bb1qr/2pppppp/p2nn3/1p4P1/6QP/8/PPPPPP2/RKNBBN1R w HAha - 2 9", 5, 26485812 }, + { "rk1bb1qr/2pppppp/p2nn3/1p4P1/6QP/8/PPPPPP2/RKNBBN1R w HAha - 2 9", 6, 696999449 }, + { "rkn1bbqr/p2ppppp/2p1n3/1p6/4PP2/6PP/PPPP4/RKNNBBQR w HAha - 0 9", 1, 33 }, + { "rkn1bbqr/p2ppppp/2p1n3/1p6/4PP2/6PP/PPPP4/RKNNBBQR w HAha - 0 9", 2, 687 }, + { "rkn1bbqr/p2ppppp/2p1n3/1p6/4PP2/6PP/PPPP4/RKNNBBQR w HAha - 0 9", 3, 22744 }, + { "rkn1bbqr/p2ppppp/2p1n3/1p6/4PP2/6PP/PPPP4/RKNNBBQR w HAha - 0 9", 4, 511018 }, + { "rkn1bbqr/p2ppppp/2p1n3/1p6/4PP2/6PP/PPPP4/RKNNBBQR w HAha - 0 9", 5, 17101732 }, + { "rkn1bbqr/p2ppppp/2p1n3/1p6/4PP2/6PP/PPPP4/RKNNBBQR w HAha - 0 9", 6, 412778368 }, + { "rkn1bqrb/pnp1pppp/3p4/8/Pp6/1N2NP2/1PPPP1PP/RK2BQRB w GAga - 0 9", 1, 28 }, + { "rkn1bqrb/pnp1pppp/3p4/8/Pp6/1N2NP2/1PPPP1PP/RK2BQRB w GAga - 0 9", 2, 591 }, + { "rkn1bqrb/pnp1pppp/3p4/8/Pp6/1N2NP2/1PPPP1PP/RK2BQRB w GAga - 0 9", 3, 17174 }, + { "rkn1bqrb/pnp1pppp/3p4/8/Pp6/1N2NP2/1PPPP1PP/RK2BQRB w GAga - 0 9", 4, 406025 }, + { "rkn1bqrb/pnp1pppp/3p4/8/Pp6/1N2NP2/1PPPP1PP/RK2BQRB w GAga - 0 9", 5, 12182448 }, + { "rkn1bqrb/pnp1pppp/3p4/8/Pp6/1N2NP2/1PPPP1PP/RK2BQRB w GAga - 0 9", 6, 312575205 }, + { "rbk1n1br/ppp1ppqp/2n5/2Np2p1/8/2P5/PPBPPPPP/R1KN1QBR w HAha - 4 9", 1, 35 }, + { "rbk1n1br/ppp1ppqp/2n5/2Np2p1/8/2P5/PPBPPPPP/R1KN1QBR w HAha - 4 9", 2, 930 }, + { "rbk1n1br/ppp1ppqp/2n5/2Np2p1/8/2P5/PPBPPPPP/R1KN1QBR w HAha - 4 9", 3, 30663 }, + { "rbk1n1br/ppp1ppqp/2n5/2Np2p1/8/2P5/PPBPPPPP/R1KN1QBR w HAha - 4 9", 4, 844433 }, + { "rbk1n1br/ppp1ppqp/2n5/2Np2p1/8/2P5/PPBPPPPP/R1KN1QBR w HAha - 4 9", 5, 27160490 }, + { "rbk1n1br/ppp1ppqp/2n5/2Np2p1/8/2P5/PPBPPPPP/R1KN1QBR w HAha - 4 9", 6, 780616047 }, + { "rknbn1br/1ppp1ppp/p3p3/8/1q6/2P2N1P/P2PPPP1/RKNB1QBR w HAha - 0 9", 1, 4 }, + { "rknbn1br/1ppp1ppp/p3p3/8/1q6/2P2N1P/P2PPPP1/RKNB1QBR w HAha - 0 9", 2, 157 }, + { "rknbn1br/1ppp1ppp/p3p3/8/1q6/2P2N1P/P2PPPP1/RKNB1QBR w HAha - 0 9", 3, 3697 }, + { "rknbn1br/1ppp1ppp/p3p3/8/1q6/2P2N1P/P2PPPP1/RKNB1QBR w HAha - 0 9", 4, 138102 }, + { "rknbn1br/1ppp1ppp/p3p3/8/1q6/2P2N1P/P2PPPP1/RKNB1QBR w HAha - 0 9", 5, 3454704 }, + { "rknbn1br/1ppp1ppp/p3p3/8/1q6/2P2N1P/P2PPPP1/RKNB1QBR w HAha - 0 9", 6, 125373395 }, + { "rkn1qbbr/pp3ppp/4n3/2ppp3/4P1P1/P2P4/1PP2P1P/RKNNQBBR w HAha - 0 9", 1, 28 }, + { "rkn1qbbr/pp3ppp/4n3/2ppp3/4P1P1/P2P4/1PP2P1P/RKNNQBBR w HAha - 0 9", 2, 840 }, + { "rkn1qbbr/pp3ppp/4n3/2ppp3/4P1P1/P2P4/1PP2P1P/RKNNQBBR w HAha - 0 9", 3, 24437 }, + { "rkn1qbbr/pp3ppp/4n3/2ppp3/4P1P1/P2P4/1PP2P1P/RKNNQBBR w HAha - 0 9", 4, 771328 }, + { "rkn1qbbr/pp3ppp/4n3/2ppp3/4P1P1/P2P4/1PP2P1P/RKNNQBBR w HAha - 0 9", 5, 23200961 }, + { "rkn1qbbr/pp3ppp/4n3/2ppp3/4P1P1/P2P4/1PP2P1P/RKNNQBBR w HAha - 0 9", 6, 756489357 }, + { "rkn1qrbb/pp1ppp2/2p1n1p1/7p/2P2P1P/6P1/PP1PP3/RKNNQRBB w FAfa - 1 9", 1, 32 }, + { "rkn1qrbb/pp1ppp2/2p1n1p1/7p/2P2P1P/6P1/PP1PP3/RKNNQRBB w FAfa - 1 9", 2, 867 }, + { "rkn1qrbb/pp1ppp2/2p1n1p1/7p/2P2P1P/6P1/PP1PP3/RKNNQRBB w FAfa - 1 9", 3, 27595 }, + { "rkn1qrbb/pp1ppp2/2p1n1p1/7p/2P2P1P/6P1/PP1PP3/RKNNQRBB w FAfa - 1 9", 4, 757836 }, + { "rkn1qrbb/pp1ppp2/2p1n1p1/7p/2P2P1P/6P1/PP1PP3/RKNNQRBB w FAfa - 1 9", 5, 24485663 }, + { "rkn1qrbb/pp1ppp2/2p1n1p1/7p/2P2P1P/6P1/PP1PP3/RKNNQRBB w FAfa - 1 9", 6, 688115847 }, + { "b1rknnrq/bpppp1p1/p6p/5p1P/6P1/4N3/PPPPPP2/BBRKN1RQ w GCgc - 1 9", 1, 33 }, + { "b1rknnrq/bpppp1p1/p6p/5p1P/6P1/4N3/PPPPPP2/BBRKN1RQ w GCgc - 1 9", 2, 851 }, + { "b1rknnrq/bpppp1p1/p6p/5p1P/6P1/4N3/PPPPPP2/BBRKN1RQ w GCgc - 1 9", 3, 28888 }, + { "b1rknnrq/bpppp1p1/p6p/5p1P/6P1/4N3/PPPPPP2/BBRKN1RQ w GCgc - 1 9", 4, 763967 }, + { "b1rknnrq/bpppp1p1/p6p/5p1P/6P1/4N3/PPPPPP2/BBRKN1RQ w GCgc - 1 9", 5, 26686205 }, + { "b1rknnrq/bpppp1p1/p6p/5p1P/6P1/4N3/PPPPPP2/BBRKN1RQ w GCgc - 1 9", 6, 731944177 }, + { "brkb1nr1/pppppp2/3n2pp/3B4/1P6/4P3/PqPP1PPP/BRK1NNRQ w GBgb - 2 9", 1, 4 }, + { "brkb1nr1/pppppp2/3n2pp/3B4/1P6/4P3/PqPP1PPP/BRK1NNRQ w GBgb - 2 9", 2, 98 }, + { "brkb1nr1/pppppp2/3n2pp/3B4/1P6/4P3/PqPP1PPP/BRK1NNRQ w GBgb - 2 9", 3, 2965 }, + { "brkb1nr1/pppppp2/3n2pp/3B4/1P6/4P3/PqPP1PPP/BRK1NNRQ w GBgb - 2 9", 4, 76143 }, + { "brkb1nr1/pppppp2/3n2pp/3B4/1P6/4P3/PqPP1PPP/BRK1NNRQ w GBgb - 2 9", 5, 2352530 }, + { "brkb1nr1/pppppp2/3n2pp/3B4/1P6/4P3/PqPP1PPP/BRK1NNRQ w GBgb - 2 9", 6, 64251468 }, + { "brk1nbrq/1ppppn1p/6p1/p4p2/P5P1/5R2/1PPPPP1P/BRKNNB1Q w Bgb - 0 9", 1, 29 }, + { "brk1nbrq/1ppppn1p/6p1/p4p2/P5P1/5R2/1PPPPP1P/BRKNNB1Q w Bgb - 0 9", 2, 922 }, + { "brk1nbrq/1ppppn1p/6p1/p4p2/P5P1/5R2/1PPPPP1P/BRKNNB1Q w Bgb - 0 9", 3, 27709 }, + { "brk1nbrq/1ppppn1p/6p1/p4p2/P5P1/5R2/1PPPPP1P/BRKNNB1Q w Bgb - 0 9", 4, 879527 }, + { "brk1nbrq/1ppppn1p/6p1/p4p2/P5P1/5R2/1PPPPP1P/BRKNNB1Q w Bgb - 0 9", 5, 27463717 }, + { "brk1nbrq/1ppppn1p/6p1/p4p2/P5P1/5R2/1PPPPP1P/BRKNNB1Q w Bgb - 0 9", 6, 888881062 }, + { "brkn1rqb/1p1ppppp/3n4/p1p5/1P3P2/8/PNPPP1PP/BR1KNRQB w fb - 1 9", 1, 29 }, + { "brkn1rqb/1p1ppppp/3n4/p1p5/1P3P2/8/PNPPP1PP/BR1KNRQB w fb - 1 9", 2, 633 }, + { "brkn1rqb/1p1ppppp/3n4/p1p5/1P3P2/8/PNPPP1PP/BR1KNRQB w fb - 1 9", 3, 19399 }, + { "brkn1rqb/1p1ppppp/3n4/p1p5/1P3P2/8/PNPPP1PP/BR1KNRQB w fb - 1 9", 4, 469818 }, + { "brkn1rqb/1p1ppppp/3n4/p1p5/1P3P2/8/PNPPP1PP/BR1KNRQB w fb - 1 9", 5, 15076198 }, + { "brkn1rqb/1p1ppppp/3n4/p1p5/1P3P2/8/PNPPP1PP/BR1KNRQB w fb - 1 9", 6, 396737074 }, + { "rb1k1nrq/pbp1pppp/1p1p1n2/8/5P2/4NN1P/PPPPP1P1/RBBK2RQ w GAga - 2 9", 1, 28 }, + { "rb1k1nrq/pbp1pppp/1p1p1n2/8/5P2/4NN1P/PPPPP1P1/RBBK2RQ w GAga - 2 9", 2, 841 }, + { "rb1k1nrq/pbp1pppp/1p1p1n2/8/5P2/4NN1P/PPPPP1P1/RBBK2RQ w GAga - 2 9", 3, 24056 }, + { "rb1k1nrq/pbp1pppp/1p1p1n2/8/5P2/4NN1P/PPPPP1P1/RBBK2RQ w GAga - 2 9", 4, 710751 }, + { "rb1k1nrq/pbp1pppp/1p1p1n2/8/5P2/4NN1P/PPPPP1P1/RBBK2RQ w GAga - 2 9", 5, 20772996 }, + { "rb1k1nrq/pbp1pppp/1p1p1n2/8/5P2/4NN1P/PPPPP1P1/RBBK2RQ w GAga - 2 9", 6, 613798447 }, + { "rkbbnnrq/p1pp3p/4p1p1/1p3p2/P6P/1P6/1BPPPPP1/RK1BNNRQ w GAga - 0 9", 1, 33 }, + { "rkbbnnrq/p1pp3p/4p1p1/1p3p2/P6P/1P6/1BPPPPP1/RK1BNNRQ w GAga - 0 9", 2, 957 }, + { "rkbbnnrq/p1pp3p/4p1p1/1p3p2/P6P/1P6/1BPPPPP1/RK1BNNRQ w GAga - 0 9", 3, 30668 }, + { "rkbbnnrq/p1pp3p/4p1p1/1p3p2/P6P/1P6/1BPPPPP1/RK1BNNRQ w GAga - 0 9", 4, 907217 }, + { "rkbbnnrq/p1pp3p/4p1p1/1p3p2/P6P/1P6/1BPPPPP1/RK1BNNRQ w GAga - 0 9", 5, 29735654 }, + { "rkbbnnrq/p1pp3p/4p1p1/1p3p2/P6P/1P6/1BPPPPP1/RK1BNNRQ w GAga - 0 9", 6, 903933626 }, + { "rk2nbrq/p1ppppp1/bpn5/7p/6P1/2N2P2/PPPPP1QP/RKB1NBR1 w GAga - 2 9", 1, 24 }, + { "rk2nbrq/p1ppppp1/bpn5/7p/6P1/2N2P2/PPPPP1QP/RKB1NBR1 w GAga - 2 9", 2, 687 }, + { "rk2nbrq/p1ppppp1/bpn5/7p/6P1/2N2P2/PPPPP1QP/RKB1NBR1 w GAga - 2 9", 3, 18206 }, + { "rk2nbrq/p1ppppp1/bpn5/7p/6P1/2N2P2/PPPPP1QP/RKB1NBR1 w GAga - 2 9", 4, 544627 }, + { "rk2nbrq/p1ppppp1/bpn5/7p/6P1/2N2P2/PPPPP1QP/RKB1NBR1 w GAga - 2 9", 5, 15518417 }, + { "rk2nbrq/p1ppppp1/bpn5/7p/6P1/2N2P2/PPPPP1QP/RKB1NBR1 w GAga - 2 9", 6, 484217179 }, + { "rkbn1r1b/pp1pppnp/6q1/2p3p1/5P1P/4N3/PPPPP1P1/RKB1NRQB w FAfa - 1 9", 1, 23 }, + { "rkbn1r1b/pp1pppnp/6q1/2p3p1/5P1P/4N3/PPPPP1P1/RKB1NRQB w FAfa - 1 9", 2, 831 }, + { "rkbn1r1b/pp1pppnp/6q1/2p3p1/5P1P/4N3/PPPPP1P1/RKB1NRQB w FAfa - 1 9", 3, 21254 }, + { "rkbn1r1b/pp1pppnp/6q1/2p3p1/5P1P/4N3/PPPPP1P1/RKB1NRQB w FAfa - 1 9", 4, 754622 }, + { "rkbn1r1b/pp1pppnp/6q1/2p3p1/5P1P/4N3/PPPPP1P1/RKB1NRQB w FAfa - 1 9", 5, 21126103 }, + { "rkbn1r1b/pp1pppnp/6q1/2p3p1/5P1P/4N3/PPPPP1P1/RKB1NRQB w FAfa - 1 9", 6, 744755212 }, + { "rbknb1rq/ppp1p1p1/3pnp1p/8/6PP/2PP4/PP2PP2/RBKNBNRQ w GAga - 0 9", 1, 31 }, + { "rbknb1rq/ppp1p1p1/3pnp1p/8/6PP/2PP4/PP2PP2/RBKNBNRQ w GAga - 0 9", 2, 838 }, + { "rbknb1rq/ppp1p1p1/3pnp1p/8/6PP/2PP4/PP2PP2/RBKNBNRQ w GAga - 0 9", 3, 26800 }, + { "rbknb1rq/ppp1p1p1/3pnp1p/8/6PP/2PP4/PP2PP2/RBKNBNRQ w GAga - 0 9", 4, 736910 }, + { "rbknb1rq/ppp1p1p1/3pnp1p/8/6PP/2PP4/PP2PP2/RBKNBNRQ w GAga - 0 9", 5, 24008129 }, + { "rbknb1rq/ppp1p1p1/3pnp1p/8/6PP/2PP4/PP2PP2/RBKNBNRQ w GAga - 0 9", 6, 677776408 }, + { "rknbb1rq/p1pn1ppp/4p3/1p1p4/2P5/1P2N1P1/P2PPP1P/RKNBB1RQ w GAga - 1 9", 1, 29 }, + { "rknbb1rq/p1pn1ppp/4p3/1p1p4/2P5/1P2N1P1/P2PPP1P/RKNBB1RQ w GAga - 1 9", 2, 830 }, + { "rknbb1rq/p1pn1ppp/4p3/1p1p4/2P5/1P2N1P1/P2PPP1P/RKNBB1RQ w GAga - 1 9", 3, 24798 }, + { "rknbb1rq/p1pn1ppp/4p3/1p1p4/2P5/1P2N1P1/P2PPP1P/RKNBB1RQ w GAga - 1 9", 4, 721630 }, + { "rknbb1rq/p1pn1ppp/4p3/1p1p4/2P5/1P2N1P1/P2PPP1P/RKNBB1RQ w GAga - 1 9", 5, 22243832 }, + { "rknbb1rq/p1pn1ppp/4p3/1p1p4/2P5/1P2N1P1/P2PPP1P/RKNBB1RQ w GAga - 1 9", 6, 660040360 }, + { "rk1nbbrq/pp1p1ppp/3n4/P3p3/2p4P/8/1PPPPPP1/RKNNBBRQ w GAga - 1 9", 1, 24 }, + { "rk1nbbrq/pp1p1ppp/3n4/P3p3/2p4P/8/1PPPPPP1/RKNNBBRQ w GAga - 1 9", 2, 484 }, + { "rk1nbbrq/pp1p1ppp/3n4/P3p3/2p4P/8/1PPPPPP1/RKNNBBRQ w GAga - 1 9", 3, 12776 }, + { "rk1nbbrq/pp1p1ppp/3n4/P3p3/2p4P/8/1PPPPPP1/RKNNBBRQ w GAga - 1 9", 4, 297419 }, + { "rk1nbbrq/pp1p1ppp/3n4/P3p3/2p4P/8/1PPPPPP1/RKNNBBRQ w GAga - 1 9", 5, 8379748 }, + { "rk1nbbrq/pp1p1ppp/3n4/P3p3/2p4P/8/1PPPPPP1/RKNNBBRQ w GAga - 1 9", 6, 214004367 }, + { "rknnbr1b/ppp2pqp/3p4/4p1p1/7P/3P1P2/PPP1P1P1/RKNNBRQB w FAfa - 0 9", 1, 32 }, + { "rknnbr1b/ppp2pqp/3p4/4p1p1/7P/3P1P2/PPP1P1P1/RKNNBRQB w FAfa - 0 9", 2, 838 }, + { "rknnbr1b/ppp2pqp/3p4/4p1p1/7P/3P1P2/PPP1P1P1/RKNNBRQB w FAfa - 0 9", 3, 26408 }, + { "rknnbr1b/ppp2pqp/3p4/4p1p1/7P/3P1P2/PPP1P1P1/RKNNBRQB w FAfa - 0 9", 4, 740701 }, + { "rknnbr1b/ppp2pqp/3p4/4p1p1/7P/3P1P2/PPP1P1P1/RKNNBRQB w FAfa - 0 9", 5, 23472124 }, + { "rknnbr1b/ppp2pqp/3p4/4p1p1/7P/3P1P2/PPP1P1P1/RKNNBRQB w FAfa - 0 9", 6, 699211365 }, + { "rb1k1rbq/ppppN1pp/2nn4/5p2/7P/8/PPPPPPP1/RBK1NRBQ w FA - 1 9", 1, 27 }, + { "rb1k1rbq/ppppN1pp/2nn4/5p2/7P/8/PPPPPPP1/RBK1NRBQ w FA - 1 9", 2, 800 }, + { "rb1k1rbq/ppppN1pp/2nn4/5p2/7P/8/PPPPPPP1/RBK1NRBQ w FA - 1 9", 3, 22785 }, + { "rb1k1rbq/ppppN1pp/2nn4/5p2/7P/8/PPPPPPP1/RBK1NRBQ w FA - 1 9", 4, 701742 }, + { "rb1k1rbq/ppppN1pp/2nn4/5p2/7P/8/PPPPPPP1/RBK1NRBQ w FA - 1 9", 5, 20804424 }, + { "rb1k1rbq/ppppN1pp/2nn4/5p2/7P/8/PPPPPPP1/RBK1NRBQ w FA - 1 9", 6, 660917073 }, + { "r1nbnrbq/kppppp1p/6p1/8/p1PP1P2/4P3/PP4PP/RKNBNRBQ w FA - 1 9", 1, 28 }, + { "r1nbnrbq/kppppp1p/6p1/8/p1PP1P2/4P3/PP4PP/RKNBNRBQ w FA - 1 9", 2, 757 }, + { "r1nbnrbq/kppppp1p/6p1/8/p1PP1P2/4P3/PP4PP/RKNBNRBQ w FA - 1 9", 3, 21198 }, + { "r1nbnrbq/kppppp1p/6p1/8/p1PP1P2/4P3/PP4PP/RKNBNRBQ w FA - 1 9", 4, 602699 }, + { "r1nbnrbq/kppppp1p/6p1/8/p1PP1P2/4P3/PP4PP/RKNBNRBQ w FA - 1 9", 5, 17180857 }, + { "r1nbnrbq/kppppp1p/6p1/8/p1PP1P2/4P3/PP4PP/RKNBNRBQ w FA - 1 9", 6, 507618340 }, + { "rkn1rbbq/p1pppppp/2n5/1pP5/8/1N2P3/PP1P1PPP/RK1NRBBQ w EAea - 1 9", 1, 22 }, + { "rkn1rbbq/p1pppppp/2n5/1pP5/8/1N2P3/PP1P1PPP/RK1NRBBQ w EAea - 1 9", 2, 483 }, + { "rkn1rbbq/p1pppppp/2n5/1pP5/8/1N2P3/PP1P1PPP/RK1NRBBQ w EAea - 1 9", 3, 11890 }, + { "rkn1rbbq/p1pppppp/2n5/1pP5/8/1N2P3/PP1P1PPP/RK1NRBBQ w EAea - 1 9", 4, 283679 }, + { "rkn1rbbq/p1pppppp/2n5/1pP5/8/1N2P3/PP1P1PPP/RK1NRBBQ w EAea - 1 9", 5, 7497674 }, + { "rkn1rbbq/p1pppppp/2n5/1pP5/8/1N2P3/PP1P1PPP/RK1NRBBQ w EAea - 1 9", 6, 191130942 }, + { "rknnrqbb/2pppppp/8/p7/Np3P2/3P4/PPP1P1PP/RKN1RQBB w EAea - 0 9", 1, 25 }, + { "rknnrqbb/2pppppp/8/p7/Np3P2/3P4/PPP1P1PP/RKN1RQBB w EAea - 0 9", 2, 536 }, + { "rknnrqbb/2pppppp/8/p7/Np3P2/3P4/PPP1P1PP/RKN1RQBB w EAea - 0 9", 3, 14456 }, + { "rknnrqbb/2pppppp/8/p7/Np3P2/3P4/PPP1P1PP/RKN1RQBB w EAea - 0 9", 4, 339180 }, + { "rknnrqbb/2pppppp/8/p7/Np3P2/3P4/PPP1P1PP/RKN1RQBB w EAea - 0 9", 5, 9694947 }, + { "rknnrqbb/2pppppp/8/p7/Np3P2/3P4/PPP1P1PP/RKN1RQBB w EAea - 0 9", 6, 245669668 }, + { "bb1rknrn/1qppppp1/1p4B1/p6N/8/2P5/PP1PPPPP/B1QRK1RN w GDgd - 1 9", 1, 32 }, + { "bb1rknrn/1qppppp1/1p4B1/p6N/8/2P5/PP1PPPPP/B1QRK1RN w GDgd - 1 9", 2, 715 }, + { "bb1rknrn/1qppppp1/1p4B1/p6N/8/2P5/PP1PPPPP/B1QRK1RN w GDgd - 1 9", 3, 22421 }, + { "bb1rknrn/1qppppp1/1p4B1/p6N/8/2P5/PP1PPPPP/B1QRK1RN w GDgd - 1 9", 4, 575008 }, + { "bb1rknrn/1qppppp1/1p4B1/p6N/8/2P5/PP1PPPPP/B1QRK1RN w GDgd - 1 9", 5, 17860156 }, + { "bb1rknrn/1qppppp1/1p4B1/p6N/8/2P5/PP1PPPPP/B1QRK1RN w GDgd - 1 9", 6, 502410909 }, + { "b1rbknrn/qpp1ppp1/p6p/3p4/2P5/1P1P1P2/P3P1PP/BQRBKNRN w GCgc - 0 9", 1, 30 }, + { "b1rbknrn/qpp1ppp1/p6p/3p4/2P5/1P1P1P2/P3P1PP/BQRBKNRN w GCgc - 0 9", 2, 818 }, + { "b1rbknrn/qpp1ppp1/p6p/3p4/2P5/1P1P1P2/P3P1PP/BQRBKNRN w GCgc - 0 9", 3, 24421 }, + { "b1rbknrn/qpp1ppp1/p6p/3p4/2P5/1P1P1P2/P3P1PP/BQRBKNRN w GCgc - 0 9", 4, 688711 }, + { "b1rbknrn/qpp1ppp1/p6p/3p4/2P5/1P1P1P2/P3P1PP/BQRBKNRN w GCgc - 0 9", 5, 20981488 }, + { "b1rbknrn/qpp1ppp1/p6p/3p4/2P5/1P1P1P2/P3P1PP/BQRBKNRN w GCgc - 0 9", 6, 611986786 }, + { "bqkrnbrn/1pp1pp1p/p7/1B1p2p1/4P3/7P/PPPP1PP1/BQKRN1RN w - - 0 9", 1, 28 }, + { "bqkrnbrn/1pp1pp1p/p7/1B1p2p1/4P3/7P/PPPP1PP1/BQKRN1RN w - - 0 9", 2, 676 }, + { "bqkrnbrn/1pp1pp1p/p7/1B1p2p1/4P3/7P/PPPP1PP1/BQKRN1RN w - - 0 9", 3, 18366 }, + { "bqkrnbrn/1pp1pp1p/p7/1B1p2p1/4P3/7P/PPPP1PP1/BQKRN1RN w - - 0 9", 4, 478054 }, + { "bqkrnbrn/1pp1pp1p/p7/1B1p2p1/4P3/7P/PPPP1PP1/BQKRN1RN w - - 0 9", 5, 13126287 }, + { "bqkrnbrn/1pp1pp1p/p7/1B1p2p1/4P3/7P/PPPP1PP1/BQKRN1RN w - - 0 9", 6, 363765666 }, + { "bqrknrnb/1p2ppp1/p1pp3p/8/3P1P2/1PP5/P3P1PP/BQRKNRNB w FCfc - 0 9", 1, 31 }, + { "bqrknrnb/1p2ppp1/p1pp3p/8/3P1P2/1PP5/P3P1PP/BQRKNRNB w FCfc - 0 9", 2, 646 }, + { "bqrknrnb/1p2ppp1/p1pp3p/8/3P1P2/1PP5/P3P1PP/BQRKNRNB w FCfc - 0 9", 3, 20686 }, + { "bqrknrnb/1p2ppp1/p1pp3p/8/3P1P2/1PP5/P3P1PP/BQRKNRNB w FCfc - 0 9", 4, 455607 }, + { "bqrknrnb/1p2ppp1/p1pp3p/8/3P1P2/1PP5/P3P1PP/BQRKNRNB w FCfc - 0 9", 5, 14984618 }, + { "bqrknrnb/1p2ppp1/p1pp3p/8/3P1P2/1PP5/P3P1PP/BQRKNRNB w FCfc - 0 9", 6, 349082278 }, + { "qbbrkn1r/pppppp1p/8/6p1/2P1Pn1P/6N1/PP1P1PP1/QBBRKNR1 w GDd - 3 9", 1, 20 }, + { "qbbrkn1r/pppppp1p/8/6p1/2P1Pn1P/6N1/PP1P1PP1/QBBRKNR1 w GDd - 3 9", 2, 532 }, + { "qbbrkn1r/pppppp1p/8/6p1/2P1Pn1P/6N1/PP1P1PP1/QBBRKNR1 w GDd - 3 9", 3, 11581 }, + { "qbbrkn1r/pppppp1p/8/6p1/2P1Pn1P/6N1/PP1P1PP1/QBBRKNR1 w GDd - 3 9", 4, 303586 }, + { "qbbrkn1r/pppppp1p/8/6p1/2P1Pn1P/6N1/PP1P1PP1/QBBRKNR1 w GDd - 3 9", 5, 7512432 }, + { "qbbrkn1r/pppppp1p/8/6p1/2P1Pn1P/6N1/PP1P1PP1/QBBRKNR1 w GDd - 3 9", 6, 202967948 }, + { "1rbbknr1/p1ppp1pp/1pq2pn1/8/3P4/P3P3/QPP2PPP/1RBBKNRN w GBgb - 3 9", 1, 31 }, + { "1rbbknr1/p1ppp1pp/1pq2pn1/8/3P4/P3P3/QPP2PPP/1RBBKNRN w GBgb - 3 9", 2, 1002 }, + { "1rbbknr1/p1ppp1pp/1pq2pn1/8/3P4/P3P3/QPP2PPP/1RBBKNRN w GBgb - 3 9", 3, 30581 }, + { "1rbbknr1/p1ppp1pp/1pq2pn1/8/3P4/P3P3/QPP2PPP/1RBBKNRN w GBgb - 3 9", 4, 999607 }, + { "1rbbknr1/p1ppp1pp/1pq2pn1/8/3P4/P3P3/QPP2PPP/1RBBKNRN w GBgb - 3 9", 5, 30642468 }, + { "1rbbknr1/p1ppp1pp/1pq2pn1/8/3P4/P3P3/QPP2PPP/1RBBKNRN w GBgb - 3 9", 6, 1009228283 }, + { "qrbkn1rn/pppp1ppp/8/6b1/P1P1Pp2/8/1P1P2PP/QRBKNBRN w GBgb - 0 9", 1, 22 }, + { "qrbkn1rn/pppp1ppp/8/6b1/P1P1Pp2/8/1P1P2PP/QRBKNBRN w GBgb - 0 9", 2, 505 }, + { "qrbkn1rn/pppp1ppp/8/6b1/P1P1Pp2/8/1P1P2PP/QRBKNBRN w GBgb - 0 9", 3, 12447 }, + { "qrbkn1rn/pppp1ppp/8/6b1/P1P1Pp2/8/1P1P2PP/QRBKNBRN w GBgb - 0 9", 4, 304863 }, + { "qrbkn1rn/pppp1ppp/8/6b1/P1P1Pp2/8/1P1P2PP/QRBKNBRN w GBgb - 0 9", 5, 8192621 }, + { "qrbkn1rn/pppp1ppp/8/6b1/P1P1Pp2/8/1P1P2PP/QRBKNBRN w GBgb - 0 9", 6, 214730959 }, + { "qrbk1rnb/p2ppp1p/5n2/1pp3p1/8/7P/PPPPPPPN/QRBKR1NB w Bfb - 0 9", 1, 20 }, + { "qrbk1rnb/p2ppp1p/5n2/1pp3p1/8/7P/PPPPPPPN/QRBKR1NB w Bfb - 0 9", 2, 619 }, + { "qrbk1rnb/p2ppp1p/5n2/1pp3p1/8/7P/PPPPPPPN/QRBKR1NB w Bfb - 0 9", 3, 13448 }, + { "qrbk1rnb/p2ppp1p/5n2/1pp3p1/8/7P/PPPPPPPN/QRBKR1NB w Bfb - 0 9", 4, 449630 }, + { "qrbk1rnb/p2ppp1p/5n2/1pp3p1/8/7P/PPPPPPPN/QRBKR1NB w Bfb - 0 9", 5, 10571176 }, + { "qrbk1rnb/p2ppp1p/5n2/1pp3p1/8/7P/PPPPPPPN/QRBKR1NB w Bfb - 0 9", 6, 369603424 }, + { "qbrkb1r1/ppp2ppp/3pn1n1/P3p3/4P3/3P4/1PP2PPP/QBRKBNRN w GCgc - 1 9", 1, 26 }, + { "qbrkb1r1/ppp2ppp/3pn1n1/P3p3/4P3/3P4/1PP2PPP/QBRKBNRN w GCgc - 1 9", 2, 755 }, + { "qbrkb1r1/ppp2ppp/3pn1n1/P3p3/4P3/3P4/1PP2PPP/QBRKBNRN w GCgc - 1 9", 3, 20596 }, + { "qbrkb1r1/ppp2ppp/3pn1n1/P3p3/4P3/3P4/1PP2PPP/QBRKBNRN w GCgc - 1 9", 4, 604483 }, + { "qbrkb1r1/ppp2ppp/3pn1n1/P3p3/4P3/3P4/1PP2PPP/QBRKBNRN w GCgc - 1 9", 5, 17164382 }, + { "qbrkb1r1/ppp2ppp/3pn1n1/P3p3/4P3/3P4/1PP2PPP/QBRKBNRN w GCgc - 1 9", 6, 510878835 }, + { "qrkbb1r1/ppp1pnpp/3p2n1/5p2/1P3P2/2Q3N1/P1PPP1PP/1RKBB1RN w GBgb - 0 9", 1, 35 }, + { "qrkbb1r1/ppp1pnpp/3p2n1/5p2/1P3P2/2Q3N1/P1PPP1PP/1RKBB1RN w GBgb - 0 9", 2, 918 }, + { "qrkbb1r1/ppp1pnpp/3p2n1/5p2/1P3P2/2Q3N1/P1PPP1PP/1RKBB1RN w GBgb - 0 9", 3, 32244 }, + { "qrkbb1r1/ppp1pnpp/3p2n1/5p2/1P3P2/2Q3N1/P1PPP1PP/1RKBB1RN w GBgb - 0 9", 4, 870888 }, + { "qrkbb1r1/ppp1pnpp/3p2n1/5p2/1P3P2/2Q3N1/P1PPP1PP/1RKBB1RN w GBgb - 0 9", 5, 30933394 }, + { "qrkbb1r1/ppp1pnpp/3p2n1/5p2/1P3P2/2Q3N1/P1PPP1PP/1RKBB1RN w GBgb - 0 9", 6, 867833733 }, + { "qrknbbrn/ppp1ppp1/8/7p/2Bp4/4PPP1/PPPP3P/QRKNB1RN w GBgb - 0 9", 1, 27 }, + { "qrknbbrn/ppp1ppp1/8/7p/2Bp4/4PPP1/PPPP3P/QRKNB1RN w GBgb - 0 9", 2, 593 }, + { "qrknbbrn/ppp1ppp1/8/7p/2Bp4/4PPP1/PPPP3P/QRKNB1RN w GBgb - 0 9", 3, 16168 }, + { "qrknbbrn/ppp1ppp1/8/7p/2Bp4/4PPP1/PPPP3P/QRKNB1RN w GBgb - 0 9", 4, 376808 }, + { "qrknbbrn/ppp1ppp1/8/7p/2Bp4/4PPP1/PPPP3P/QRKNB1RN w GBgb - 0 9", 5, 10422676 }, + { "qrknbbrn/ppp1ppp1/8/7p/2Bp4/4PPP1/PPPP3P/QRKNB1RN w GBgb - 0 9", 6, 258348640 }, + { "qrk1brnb/ppppp3/4n2p/5pp1/2PP4/2N4P/PP2PPP1/QRK1BRNB w FBfb - 2 9", 1, 24 }, + { "qrk1brnb/ppppp3/4n2p/5pp1/2PP4/2N4P/PP2PPP1/QRK1BRNB w FBfb - 2 9", 2, 672 }, + { "qrk1brnb/ppppp3/4n2p/5pp1/2PP4/2N4P/PP2PPP1/QRK1BRNB w FBfb - 2 9", 3, 17447 }, + { "qrk1brnb/ppppp3/4n2p/5pp1/2PP4/2N4P/PP2PPP1/QRK1BRNB w FBfb - 2 9", 4, 506189 }, + { "qrk1brnb/ppppp3/4n2p/5pp1/2PP4/2N4P/PP2PPP1/QRK1BRNB w FBfb - 2 9", 5, 13765777 }, + { "qrk1brnb/ppppp3/4n2p/5pp1/2PP4/2N4P/PP2PPP1/QRK1BRNB w FBfb - 2 9", 6, 414930519 }, + { "qbrknrb1/p2ppppp/2p3n1/8/p4P2/6PP/1PPPP3/QBRKNRBN w FCfc - 0 9", 1, 29 }, + { "qbrknrb1/p2ppppp/2p3n1/8/p4P2/6PP/1PPPP3/QBRKNRBN w FCfc - 0 9", 2, 759 }, + { "qbrknrb1/p2ppppp/2p3n1/8/p4P2/6PP/1PPPP3/QBRKNRBN w FCfc - 0 9", 3, 23235 }, + { "qbrknrb1/p2ppppp/2p3n1/8/p4P2/6PP/1PPPP3/QBRKNRBN w FCfc - 0 9", 4, 634493 }, + { "qbrknrb1/p2ppppp/2p3n1/8/p4P2/6PP/1PPPP3/QBRKNRBN w FCfc - 0 9", 5, 20416668 }, + { "qbrknrb1/p2ppppp/2p3n1/8/p4P2/6PP/1PPPP3/QBRKNRBN w FCfc - 0 9", 6, 584870558 }, + { "1rkb1rbn/p1pp1ppp/3np3/1p6/4qP2/3NB3/PPPPPRPP/QRKB3N w Bfb - 0 9", 1, 22 }, + { "1rkb1rbn/p1pp1ppp/3np3/1p6/4qP2/3NB3/PPPPPRPP/QRKB3N w Bfb - 0 9", 2, 923 }, + { "1rkb1rbn/p1pp1ppp/3np3/1p6/4qP2/3NB3/PPPPPRPP/QRKB3N w Bfb - 0 9", 3, 22585 }, + { "1rkb1rbn/p1pp1ppp/3np3/1p6/4qP2/3NB3/PPPPPRPP/QRKB3N w Bfb - 0 9", 4, 914106 }, + { "1rkb1rbn/p1pp1ppp/3np3/1p6/4qP2/3NB3/PPPPPRPP/QRKB3N w Bfb - 0 9", 5, 24049880 }, + { "1rkb1rbn/p1pp1ppp/3np3/1p6/4qP2/3NB3/PPPPPRPP/QRKB3N w Bfb - 0 9", 6, 957218571 }, + { "1rknrbbn/p1pp1p1p/8/1p2p1p1/4qPP1/2P5/PP1PP1BP/QRKNR1BN w EBeb - 0 9", 1, 28 }, + { "1rknrbbn/p1pp1p1p/8/1p2p1p1/4qPP1/2P5/PP1PP1BP/QRKNR1BN w EBeb - 0 9", 2, 1309 }, + { "1rknrbbn/p1pp1p1p/8/1p2p1p1/4qPP1/2P5/PP1PP1BP/QRKNR1BN w EBeb - 0 9", 3, 36355 }, + { "1rknrbbn/p1pp1p1p/8/1p2p1p1/4qPP1/2P5/PP1PP1BP/QRKNR1BN w EBeb - 0 9", 4, 1568968 }, + { "1rknrbbn/p1pp1p1p/8/1p2p1p1/4qPP1/2P5/PP1PP1BP/QRKNR1BN w EBeb - 0 9", 5, 44576409 }, + { "1rknrbbn/p1pp1p1p/8/1p2p1p1/4qPP1/2P5/PP1PP1BP/QRKNR1BN w EBeb - 0 9", 6, 1846382333 }, + { "qrk1rn1b/ppppp2p/4n3/3b1pp1/4P2P/5BP1/PPPP1P2/QRKNRNB1 w EBeb - 3 9", 1, 26 }, + { "qrk1rn1b/ppppp2p/4n3/3b1pp1/4P2P/5BP1/PPPP1P2/QRKNRNB1 w EBeb - 3 9", 2, 839 }, + { "qrk1rn1b/ppppp2p/4n3/3b1pp1/4P2P/5BP1/PPPP1P2/QRKNRNB1 w EBeb - 3 9", 3, 22189 }, + { "qrk1rn1b/ppppp2p/4n3/3b1pp1/4P2P/5BP1/PPPP1P2/QRKNRNB1 w EBeb - 3 9", 4, 726354 }, + { "qrk1rn1b/ppppp2p/4n3/3b1pp1/4P2P/5BP1/PPPP1P2/QRKNRNB1 w EBeb - 3 9", 5, 19978260 }, + { "qrk1rn1b/ppppp2p/4n3/3b1pp1/4P2P/5BP1/PPPP1P2/QRKNRNB1 w EBeb - 3 9", 6, 661207281 }, + { "bbrqk1rn/pp1ppppp/8/2p5/2P1P3/5n1P/PPBP1PP1/B1RQKNRN w GCgc - 1 9", 1, 3 }, + { "bbrqk1rn/pp1ppppp/8/2p5/2P1P3/5n1P/PPBP1PP1/B1RQKNRN w GCgc - 1 9", 2, 95 }, + { "bbrqk1rn/pp1ppppp/8/2p5/2P1P3/5n1P/PPBP1PP1/B1RQKNRN w GCgc - 1 9", 3, 2690 }, + { "bbrqk1rn/pp1ppppp/8/2p5/2P1P3/5n1P/PPBP1PP1/B1RQKNRN w GCgc - 1 9", 4, 85038 }, + { "bbrqk1rn/pp1ppppp/8/2p5/2P1P3/5n1P/PPBP1PP1/B1RQKNRN w GCgc - 1 9", 5, 2518864 }, + { "bbrqk1rn/pp1ppppp/8/2p5/2P1P3/5n1P/PPBP1PP1/B1RQKNRN w GCgc - 1 9", 6, 80775549 }, + { "brqbk2n/pppppprp/8/6p1/1P3n2/5P2/P1PPP1PP/R1QBKNRN w Gb - 2 9", 1, 22 }, + { "brqbk2n/pppppprp/8/6p1/1P3n2/5P2/P1PPP1PP/R1QBKNRN w Gb - 2 9", 2, 593 }, + { "brqbk2n/pppppprp/8/6p1/1P3n2/5P2/P1PPP1PP/R1QBKNRN w Gb - 2 9", 3, 13255 }, + { "brqbk2n/pppppprp/8/6p1/1P3n2/5P2/P1PPP1PP/R1QBKNRN w Gb - 2 9", 4, 362760 }, + { "brqbk2n/pppppprp/8/6p1/1P3n2/5P2/P1PPP1PP/R1QBKNRN w Gb - 2 9", 5, 8922397 }, + { "brqbk2n/pppppprp/8/6p1/1P3n2/5P2/P1PPP1PP/R1QBKNRN w Gb - 2 9", 6, 253271592 }, + { "brqknbr1/pp3ppp/3p2n1/2p1p3/2P5/5P2/PPKPP1PP/BRQ1NBRN w gb - 0 9", 1, 21 }, + { "brqknbr1/pp3ppp/3p2n1/2p1p3/2P5/5P2/PPKPP1PP/BRQ1NBRN w gb - 0 9", 2, 590 }, + { "brqknbr1/pp3ppp/3p2n1/2p1p3/2P5/5P2/PPKPP1PP/BRQ1NBRN w gb - 0 9", 3, 13190 }, + { "brqknbr1/pp3ppp/3p2n1/2p1p3/2P5/5P2/PPKPP1PP/BRQ1NBRN w gb - 0 9", 4, 397355 }, + { "brqknbr1/pp3ppp/3p2n1/2p1p3/2P5/5P2/PPKPP1PP/BRQ1NBRN w gb - 0 9", 5, 9581695 }, + { "brqknbr1/pp3ppp/3p2n1/2p1p3/2P5/5P2/PPKPP1PP/BRQ1NBRN w gb - 0 9", 6, 304103516 }, + { "1rqknrnb/2pp1ppp/p3p3/1p6/P2P4/5bP1/1PP1PP1P/BRQKNRNB w FBfb - 0 9", 1, 24 }, + { "1rqknrnb/2pp1ppp/p3p3/1p6/P2P4/5bP1/1PP1PP1P/BRQKNRNB w FBfb - 0 9", 2, 737 }, + { "1rqknrnb/2pp1ppp/p3p3/1p6/P2P4/5bP1/1PP1PP1P/BRQKNRNB w FBfb - 0 9", 3, 20052 }, + { "1rqknrnb/2pp1ppp/p3p3/1p6/P2P4/5bP1/1PP1PP1P/BRQKNRNB w FBfb - 0 9", 4, 598439 }, + { "1rqknrnb/2pp1ppp/p3p3/1p6/P2P4/5bP1/1PP1PP1P/BRQKNRNB w FBfb - 0 9", 5, 17948681 }, + { "1rqknrnb/2pp1ppp/p3p3/1p6/P2P4/5bP1/1PP1PP1P/BRQKNRNB w FBfb - 0 9", 6, 536330341 }, + { "rbb1k1rn/p1pqpppp/6n1/1p1p4/5P2/3PP3/PPP1K1PP/RBBQ1NRN w ga - 3 9", 1, 24 }, + { "rbb1k1rn/p1pqpppp/6n1/1p1p4/5P2/3PP3/PPP1K1PP/RBBQ1NRN w ga - 3 9", 2, 694 }, + { "rbb1k1rn/p1pqpppp/6n1/1p1p4/5P2/3PP3/PPP1K1PP/RBBQ1NRN w ga - 3 9", 3, 16773 }, + { "rbb1k1rn/p1pqpppp/6n1/1p1p4/5P2/3PP3/PPP1K1PP/RBBQ1NRN w ga - 3 9", 4, 513782 }, + { "rbb1k1rn/p1pqpppp/6n1/1p1p4/5P2/3PP3/PPP1K1PP/RBBQ1NRN w ga - 3 9", 5, 13094823 }, + { "rbb1k1rn/p1pqpppp/6n1/1p1p4/5P2/3PP3/PPP1K1PP/RBBQ1NRN w ga - 3 9", 6, 419402704 }, + { "rqbbknr1/1ppp2pp/p5n1/4pp2/P7/1PP5/1Q1PPPPP/R1BBKNRN w GAga - 0 9", 1, 24 }, + { "rqbbknr1/1ppp2pp/p5n1/4pp2/P7/1PP5/1Q1PPPPP/R1BBKNRN w GAga - 0 9", 2, 600 }, + { "rqbbknr1/1ppp2pp/p5n1/4pp2/P7/1PP5/1Q1PPPPP/R1BBKNRN w GAga - 0 9", 3, 15347 }, + { "rqbbknr1/1ppp2pp/p5n1/4pp2/P7/1PP5/1Q1PPPPP/R1BBKNRN w GAga - 0 9", 4, 408207 }, + { "rqbbknr1/1ppp2pp/p5n1/4pp2/P7/1PP5/1Q1PPPPP/R1BBKNRN w GAga - 0 9", 5, 11029596 }, + { "rqbbknr1/1ppp2pp/p5n1/4pp2/P7/1PP5/1Q1PPPPP/R1BBKNRN w GAga - 0 9", 6, 308553169 }, + { "rqbknbrn/2pppppp/6Q1/pp6/8/2P5/PP1PPPPP/R1BKNBRN w GAga - 2 9", 1, 40 }, + { "rqbknbrn/2pppppp/6Q1/pp6/8/2P5/PP1PPPPP/R1BKNBRN w GAga - 2 9", 2, 949 }, + { "rqbknbrn/2pppppp/6Q1/pp6/8/2P5/PP1PPPPP/R1BKNBRN w GAga - 2 9", 3, 34100 }, + { "rqbknbrn/2pppppp/6Q1/pp6/8/2P5/PP1PPPPP/R1BKNBRN w GAga - 2 9", 4, 889887 }, + { "rqbknbrn/2pppppp/6Q1/pp6/8/2P5/PP1PPPPP/R1BKNBRN w GAga - 2 9", 5, 31296485 }, + { "rqbknbrn/2pppppp/6Q1/pp6/8/2P5/PP1PPPPP/R1BKNBRN w GAga - 2 9", 6, 881529007 }, + { "rqbknr1b/pp1ppp2/2p2n1p/6p1/8/3P1PPP/PPP1P3/RQBKNRNB w FAfa - 0 9", 1, 20 }, + { "rqbknr1b/pp1ppp2/2p2n1p/6p1/8/3P1PPP/PPP1P3/RQBKNRNB w FAfa - 0 9", 2, 560 }, + { "rqbknr1b/pp1ppp2/2p2n1p/6p1/8/3P1PPP/PPP1P3/RQBKNRNB w FAfa - 0 9", 3, 12275 }, + { "rqbknr1b/pp1ppp2/2p2n1p/6p1/8/3P1PPP/PPP1P3/RQBKNRNB w FAfa - 0 9", 4, 373921 }, + { "rqbknr1b/pp1ppp2/2p2n1p/6p1/8/3P1PPP/PPP1P3/RQBKNRNB w FAfa - 0 9", 5, 8687544 }, + { "rqbknr1b/pp1ppp2/2p2n1p/6p1/8/3P1PPP/PPP1P3/RQBKNRNB w FAfa - 0 9", 6, 277906201 }, + { "rbqkbnrn/p3pppp/1p6/3p4/P1p3P1/1P6/1QPPPP1P/RB1KBNRN w GAga - 0 9", 1, 30 }, + { "rbqkbnrn/p3pppp/1p6/3p4/P1p3P1/1P6/1QPPPP1P/RB1KBNRN w GAga - 0 9", 2, 1155 }, + { "rbqkbnrn/p3pppp/1p6/3p4/P1p3P1/1P6/1QPPPP1P/RB1KBNRN w GAga - 0 9", 3, 35865 }, + { "rbqkbnrn/p3pppp/1p6/3p4/P1p3P1/1P6/1QPPPP1P/RB1KBNRN w GAga - 0 9", 4, 1351455 }, + { "rbqkbnrn/p3pppp/1p6/3p4/P1p3P1/1P6/1QPPPP1P/RB1KBNRN w GAga - 0 9", 5, 43092716 }, + { "rbqkbnrn/p3pppp/1p6/3p4/P1p3P1/1P6/1QPPPP1P/RB1KBNRN w GAga - 0 9", 6, 1614019629 }, + { "rqkbb1rn/p1p1pppn/1p1p4/7p/4PP2/7P/PPPPB1P1/RQK1BNRN w GAga - 1 9", 1, 30 }, + { "rqkbb1rn/p1p1pppn/1p1p4/7p/4PP2/7P/PPPPB1P1/RQK1BNRN w GAga - 1 9", 2, 701 }, + { "rqkbb1rn/p1p1pppn/1p1p4/7p/4PP2/7P/PPPPB1P1/RQK1BNRN w GAga - 1 9", 3, 20804 }, + { "rqkbb1rn/p1p1pppn/1p1p4/7p/4PP2/7P/PPPPB1P1/RQK1BNRN w GAga - 1 9", 4, 515942 }, + { "rqkbb1rn/p1p1pppn/1p1p4/7p/4PP2/7P/PPPPB1P1/RQK1BNRN w GAga - 1 9", 5, 15450970 }, + { "rqkbb1rn/p1p1pppn/1p1p4/7p/4PP2/7P/PPPPB1P1/RQK1BNRN w GAga - 1 9", 6, 401499189 }, + { "rqknbbrn/1p2pp1p/3p2p1/p1p5/P2P4/1P6/1KP1PPPP/RQ1NBBRN w ga - 0 9", 1, 28 }, + { "rqknbbrn/1p2pp1p/3p2p1/p1p5/P2P4/1P6/1KP1PPPP/RQ1NBBRN w ga - 0 9", 2, 756 }, + { "rqknbbrn/1p2pp1p/3p2p1/p1p5/P2P4/1P6/1KP1PPPP/RQ1NBBRN w ga - 0 9", 3, 21655 }, + { "rqknbbrn/1p2pp1p/3p2p1/p1p5/P2P4/1P6/1KP1PPPP/RQ1NBBRN w ga - 0 9", 4, 610320 }, + { "rqknbbrn/1p2pp1p/3p2p1/p1p5/P2P4/1P6/1KP1PPPP/RQ1NBBRN w ga - 0 9", 5, 17989811 }, + { "rqknbbrn/1p2pp1p/3p2p1/p1p5/P2P4/1P6/1KP1PPPP/RQ1NBBRN w ga - 0 9", 6, 525585996 }, + { "rqknbrnb/1pp3pp/5p2/p2pp3/P7/3PPN2/1PP2PPP/RQKNBR1B w FAfa - 0 9", 1, 26 }, + { "rqknbrnb/1pp3pp/5p2/p2pp3/P7/3PPN2/1PP2PPP/RQKNBR1B w FAfa - 0 9", 2, 731 }, + { "rqknbrnb/1pp3pp/5p2/p2pp3/P7/3PPN2/1PP2PPP/RQKNBR1B w FAfa - 0 9", 3, 19509 }, + { "rqknbrnb/1pp3pp/5p2/p2pp3/P7/3PPN2/1PP2PPP/RQKNBR1B w FAfa - 0 9", 4, 550395 }, + { "rqknbrnb/1pp3pp/5p2/p2pp3/P7/3PPN2/1PP2PPP/RQKNBR1B w FAfa - 0 9", 5, 15209404 }, + { "rqknbrnb/1pp3pp/5p2/p2pp3/P7/3PPN2/1PP2PPP/RQKNBR1B w FAfa - 0 9", 6, 439767476 }, + { "rbqkr1bn/p1pppp1p/1p1n4/6p1/7P/3P1PP1/PPP1P3/RBQKNRBN w FAa - 0 9", 1, 27 }, + { "rbqkr1bn/p1pppp1p/1p1n4/6p1/7P/3P1PP1/PPP1P3/RBQKNRBN w FAa - 0 9", 2, 586 }, + { "rbqkr1bn/p1pppp1p/1p1n4/6p1/7P/3P1PP1/PPP1P3/RBQKNRBN w FAa - 0 9", 3, 16282 }, + { "rbqkr1bn/p1pppp1p/1p1n4/6p1/7P/3P1PP1/PPP1P3/RBQKNRBN w FAa - 0 9", 4, 381604 }, + { "rbqkr1bn/p1pppp1p/1p1n4/6p1/7P/3P1PP1/PPP1P3/RBQKNRBN w FAa - 0 9", 5, 10905865 }, + { "rbqkr1bn/p1pppp1p/1p1n4/6p1/7P/3P1PP1/PPP1P3/RBQKNRBN w FAa - 0 9", 6, 274364342 }, + { "rqk1nrb1/ppbp1ppp/4p1n1/2p5/7P/1PP5/P2PPPP1/RQKBNRBN w FAfa - 1 9", 1, 27 }, + { "rqk1nrb1/ppbp1ppp/4p1n1/2p5/7P/1PP5/P2PPPP1/RQKBNRBN w FAfa - 1 9", 2, 749 }, + { "rqk1nrb1/ppbp1ppp/4p1n1/2p5/7P/1PP5/P2PPPP1/RQKBNRBN w FAfa - 1 9", 3, 21480 }, + { "rqk1nrb1/ppbp1ppp/4p1n1/2p5/7P/1PP5/P2PPPP1/RQKBNRBN w FAfa - 1 9", 4, 602318 }, + { "rqk1nrb1/ppbp1ppp/4p1n1/2p5/7P/1PP5/P2PPPP1/RQKBNRBN w FAfa - 1 9", 5, 18084787 }, + { "rqk1nrb1/ppbp1ppp/4p1n1/2p5/7P/1PP5/P2PPPP1/RQKBNRBN w FAfa - 1 9", 6, 520547029 }, + { "rqknrbbn/pp1p1ppp/4p3/2p5/3P2P1/7P/PPP1PP2/RQKNRBBN w EAa - 0 9", 1, 20 }, + { "rqknrbbn/pp1p1ppp/4p3/2p5/3P2P1/7P/PPP1PP2/RQKNRBBN w EAa - 0 9", 2, 533 }, + { "rqknrbbn/pp1p1ppp/4p3/2p5/3P2P1/7P/PPP1PP2/RQKNRBBN w EAa - 0 9", 3, 11829 }, + { "rqknrbbn/pp1p1ppp/4p3/2p5/3P2P1/7P/PPP1PP2/RQKNRBBN w EAa - 0 9", 4, 336248 }, + { "rqknrbbn/pp1p1ppp/4p3/2p5/3P2P1/7P/PPP1PP2/RQKNRBBN w EAa - 0 9", 5, 8230417 }, + { "rqknrbbn/pp1p1ppp/4p3/2p5/3P2P1/7P/PPP1PP2/RQKNRBBN w EAa - 0 9", 6, 245871540 }, + { "rqknrnbb/pp1ppp1p/2p3p1/8/8/1P2P1NP/P1PP1PP1/RQKNR1BB w EAea - 0 9", 1, 22 }, + { "rqknrnbb/pp1ppp1p/2p3p1/8/8/1P2P1NP/P1PP1PP1/RQKNR1BB w EAea - 0 9", 2, 633 }, + { "rqknrnbb/pp1ppp1p/2p3p1/8/8/1P2P1NP/P1PP1PP1/RQKNR1BB w EAea - 0 9", 3, 14480 }, + { "rqknrnbb/pp1ppp1p/2p3p1/8/8/1P2P1NP/P1PP1PP1/RQKNR1BB w EAea - 0 9", 4, 441877 }, + { "rqknrnbb/pp1ppp1p/2p3p1/8/8/1P2P1NP/P1PP1PP1/RQKNR1BB w EAea - 0 9", 5, 10827868 }, + { "rqknrnbb/pp1ppp1p/2p3p1/8/8/1P2P1NP/P1PP1PP1/RQKNR1BB w EAea - 0 9", 6, 343525739 }, + { "1brkq1rn/2pppppp/1p2n3/p2bN3/8/7P/PPPPPPP1/BBRKQ1RN w GCgc - 2 9", 1, 27 }, + { "1brkq1rn/2pppppp/1p2n3/p2bN3/8/7P/PPPPPPP1/BBRKQ1RN w GCgc - 2 9", 2, 748 }, + { "1brkq1rn/2pppppp/1p2n3/p2bN3/8/7P/PPPPPPP1/BBRKQ1RN w GCgc - 2 9", 3, 20134 }, + { "1brkq1rn/2pppppp/1p2n3/p2bN3/8/7P/PPPPPPP1/BBRKQ1RN w GCgc - 2 9", 4, 580054 }, + { "1brkq1rn/2pppppp/1p2n3/p2bN3/8/7P/PPPPPPP1/BBRKQ1RN w GCgc - 2 9", 5, 16010135 }, + { "1brkq1rn/2pppppp/1p2n3/p2bN3/8/7P/PPPPPPP1/BBRKQ1RN w GCgc - 2 9", 6, 475206624 }, + { "brkbqnrn/2pp1ppp/8/1p2p3/Pp2N3/8/2PPPPPP/BRKBQNR1 w GBgb - 0 9", 1, 30 }, + { "brkbqnrn/2pp1ppp/8/1p2p3/Pp2N3/8/2PPPPPP/BRKBQNR1 w GBgb - 0 9", 2, 827 }, + { "brkbqnrn/2pp1ppp/8/1p2p3/Pp2N3/8/2PPPPPP/BRKBQNR1 w GBgb - 0 9", 3, 25308 }, + { "brkbqnrn/2pp1ppp/8/1p2p3/Pp2N3/8/2PPPPPP/BRKBQNR1 w GBgb - 0 9", 4, 757837 }, + { "brkbqnrn/2pp1ppp/8/1p2p3/Pp2N3/8/2PPPPPP/BRKBQNR1 w GBgb - 0 9", 5, 23746165 }, + { "brkbqnrn/2pp1ppp/8/1p2p3/Pp2N3/8/2PPPPPP/BRKBQNR1 w GBgb - 0 9", 6, 751690068 }, + { "brk1nbrn/pp1ppppp/2p5/7P/5P2/q2P4/PPP1P1P1/BRKQNBRN w GBgb - 1 9", 1, 15 }, + { "brk1nbrn/pp1ppppp/2p5/7P/5P2/q2P4/PPP1P1P1/BRKQNBRN w GBgb - 1 9", 2, 471 }, + { "brk1nbrn/pp1ppppp/2p5/7P/5P2/q2P4/PPP1P1P1/BRKQNBRN w GBgb - 1 9", 3, 8716 }, + { "brk1nbrn/pp1ppppp/2p5/7P/5P2/q2P4/PPP1P1P1/BRKQNBRN w GBgb - 1 9", 4, 276424 }, + { "brk1nbrn/pp1ppppp/2p5/7P/5P2/q2P4/PPP1P1P1/BRKQNBRN w GBgb - 1 9", 5, 5960901 }, + { "brk1nbrn/pp1ppppp/2p5/7P/5P2/q2P4/PPP1P1P1/BRKQNBRN w GBgb - 1 9", 6, 190316951 }, + { "brkqnrnb/1p1pp1p1/p4p2/2p4p/8/P2PP3/1PP1QPPP/BRK1NRNB w FBfb - 0 9", 1, 24 }, + { "brkqnrnb/1p1pp1p1/p4p2/2p4p/8/P2PP3/1PP1QPPP/BRK1NRNB w FBfb - 0 9", 2, 479 }, + { "brkqnrnb/1p1pp1p1/p4p2/2p4p/8/P2PP3/1PP1QPPP/BRK1NRNB w FBfb - 0 9", 3, 12584 }, + { "brkqnrnb/1p1pp1p1/p4p2/2p4p/8/P2PP3/1PP1QPPP/BRK1NRNB w FBfb - 0 9", 4, 280081 }, + { "brkqnrnb/1p1pp1p1/p4p2/2p4p/8/P2PP3/1PP1QPPP/BRK1NRNB w FBfb - 0 9", 5, 7830230 }, + { "brkqnrnb/1p1pp1p1/p4p2/2p4p/8/P2PP3/1PP1QPPP/BRK1NRNB w FBfb - 0 9", 6, 190419716 }, + { "rbbkqnrn/2ppp2p/pp3p2/6p1/P6P/8/RPPPPPP1/1BBKQNRN w Gga - 0 9", 1, 21 }, + { "rbbkqnrn/2ppp2p/pp3p2/6p1/P6P/8/RPPPPPP1/1BBKQNRN w Gga - 0 9", 2, 523 }, + { "rbbkqnrn/2ppp2p/pp3p2/6p1/P6P/8/RPPPPPP1/1BBKQNRN w Gga - 0 9", 3, 12125 }, + { "rbbkqnrn/2ppp2p/pp3p2/6p1/P6P/8/RPPPPPP1/1BBKQNRN w Gga - 0 9", 4, 328733 }, + { "rbbkqnrn/2ppp2p/pp3p2/6p1/P6P/8/RPPPPPP1/1BBKQNRN w Gga - 0 9", 5, 8322614 }, + { "rbbkqnrn/2ppp2p/pp3p2/6p1/P6P/8/RPPPPPP1/1BBKQNRN w Gga - 0 9", 6, 242240658 }, + { "rkbbqr1n/1ppppppn/7p/p7/4P3/2P2P2/PP1PB1PP/RKB1QNRN w GAa - 3 9", 1, 27 }, + { "rkbbqr1n/1ppppppn/7p/p7/4P3/2P2P2/PP1PB1PP/RKB1QNRN w GAa - 3 9", 2, 563 }, + { "rkbbqr1n/1ppppppn/7p/p7/4P3/2P2P2/PP1PB1PP/RKB1QNRN w GAa - 3 9", 3, 16026 }, + { "rkbbqr1n/1ppppppn/7p/p7/4P3/2P2P2/PP1PB1PP/RKB1QNRN w GAa - 3 9", 4, 372148 }, + { "rkbbqr1n/1ppppppn/7p/p7/4P3/2P2P2/PP1PB1PP/RKB1QNRN w GAa - 3 9", 5, 11105151 }, + { "rkbbqr1n/1ppppppn/7p/p7/4P3/2P2P2/PP1PB1PP/RKB1QNRN w GAa - 3 9", 6, 283211800 }, + { "rkbqnbrn/ppppp3/8/5ppp/2P3P1/7P/PPQPPP2/RKB1NBRN w GAga - 0 9", 1, 28 }, + { "rkbqnbrn/ppppp3/8/5ppp/2P3P1/7P/PPQPPP2/RKB1NBRN w GAga - 0 9", 2, 639 }, + { "rkbqnbrn/ppppp3/8/5ppp/2P3P1/7P/PPQPPP2/RKB1NBRN w GAga - 0 9", 3, 19250 }, + { "rkbqnbrn/ppppp3/8/5ppp/2P3P1/7P/PPQPPP2/RKB1NBRN w GAga - 0 9", 4, 469250 }, + { "rkbqnbrn/ppppp3/8/5ppp/2P3P1/7P/PPQPPP2/RKB1NBRN w GAga - 0 9", 5, 14872172 }, + { "rkbqnbrn/ppppp3/8/5ppp/2P3P1/7P/PPQPPP2/RKB1NBRN w GAga - 0 9", 6, 384663405 }, + { "rkb1nrnb/pppp1pp1/5q1p/8/P3p3/4R1P1/1PPPPP1P/1KBQNRNB w Ffa - 0 9", 1, 28 }, + { "rkb1nrnb/pppp1pp1/5q1p/8/P3p3/4R1P1/1PPPPP1P/1KBQNRNB w Ffa - 0 9", 2, 873 }, + { "rkb1nrnb/pppp1pp1/5q1p/8/P3p3/4R1P1/1PPPPP1P/1KBQNRNB w Ffa - 0 9", 3, 23690 }, + { "rkb1nrnb/pppp1pp1/5q1p/8/P3p3/4R1P1/1PPPPP1P/1KBQNRNB w Ffa - 0 9", 4, 720814 }, + { "rkb1nrnb/pppp1pp1/5q1p/8/P3p3/4R1P1/1PPPPP1P/1KBQNRNB w Ffa - 0 9", 5, 20209424 }, + { "rkb1nrnb/pppp1pp1/5q1p/8/P3p3/4R1P1/1PPPPP1P/1KBQNRNB w Ffa - 0 9", 6, 625281937 }, + { "rbkqb1rn/1p1ppppp/4n3/p1p5/8/3PBP2/PPP1P1PP/RBKQ1NRN w GAga - 0 9", 1, 26 }, + { "rbkqb1rn/1p1ppppp/4n3/p1p5/8/3PBP2/PPP1P1PP/RBKQ1NRN w GAga - 0 9", 2, 798 }, + { "rbkqb1rn/1p1ppppp/4n3/p1p5/8/3PBP2/PPP1P1PP/RBKQ1NRN w GAga - 0 9", 3, 21416 }, + { "rbkqb1rn/1p1ppppp/4n3/p1p5/8/3PBP2/PPP1P1PP/RBKQ1NRN w GAga - 0 9", 4, 667496 }, + { "rbkqb1rn/1p1ppppp/4n3/p1p5/8/3PBP2/PPP1P1PP/RBKQ1NRN w GAga - 0 9", 5, 18475618 }, + { "rbkqb1rn/1p1ppppp/4n3/p1p5/8/3PBP2/PPP1P1PP/RBKQ1NRN w GAga - 0 9", 6, 591681956 }, + { "rk1qbnrn/1p1ppppp/1b6/p1p5/P7/2P3NP/1P1PPPP1/RKQBB1RN w GAga - 0 9", 1, 22 }, + { "rk1qbnrn/1p1ppppp/1b6/p1p5/P7/2P3NP/1P1PPPP1/RKQBB1RN w GAga - 0 9", 2, 506 }, + { "rk1qbnrn/1p1ppppp/1b6/p1p5/P7/2P3NP/1P1PPPP1/RKQBB1RN w GAga - 0 9", 3, 12313 }, + { "rk1qbnrn/1p1ppppp/1b6/p1p5/P7/2P3NP/1P1PPPP1/RKQBB1RN w GAga - 0 9", 4, 301029 }, + { "rk1qbnrn/1p1ppppp/1b6/p1p5/P7/2P3NP/1P1PPPP1/RKQBB1RN w GAga - 0 9", 5, 7891676 }, + { "rk1qbnrn/1p1ppppp/1b6/p1p5/P7/2P3NP/1P1PPPP1/RKQBB1RN w GAga - 0 9", 6, 205739580 }, + { "rk1nbbrn/ppp1ppp1/8/3p3p/1P1P2q1/5PB1/P1P1P1PP/RKQN1BRN w GAga - 1 9", 1, 31 }, + { "rk1nbbrn/ppp1ppp1/8/3p3p/1P1P2q1/5PB1/P1P1P1PP/RKQN1BRN w GAga - 1 9", 2, 956 }, + { "rk1nbbrn/ppp1ppp1/8/3p3p/1P1P2q1/5PB1/P1P1P1PP/RKQN1BRN w GAga - 1 9", 3, 29219 }, + { "rk1nbbrn/ppp1ppp1/8/3p3p/1P1P2q1/5PB1/P1P1P1PP/RKQN1BRN w GAga - 1 9", 4, 903799 }, + { "rk1nbbrn/ppp1ppp1/8/3p3p/1P1P2q1/5PB1/P1P1P1PP/RKQN1BRN w GAga - 1 9", 5, 27827461 }, + { "rk1nbbrn/ppp1ppp1/8/3p3p/1P1P2q1/5PB1/P1P1P1PP/RKQN1BRN w GAga - 1 9", 6, 876341492 }, + { "rkqnbr1b/pp1pppp1/7p/2p2n2/P2P4/7N/RPP1PPPP/1KQNBR1B w Ffa - 0 9", 1, 31 }, + { "rkqnbr1b/pp1pppp1/7p/2p2n2/P2P4/7N/RPP1PPPP/1KQNBR1B w Ffa - 0 9", 2, 750 }, + { "rkqnbr1b/pp1pppp1/7p/2p2n2/P2P4/7N/RPP1PPPP/1KQNBR1B w Ffa - 0 9", 3, 24267 }, + { "rkqnbr1b/pp1pppp1/7p/2p2n2/P2P4/7N/RPP1PPPP/1KQNBR1B w Ffa - 0 9", 4, 646252 }, + { "rkqnbr1b/pp1pppp1/7p/2p2n2/P2P4/7N/RPP1PPPP/1KQNBR1B w Ffa - 0 9", 5, 21639104 }, + { "rkqnbr1b/pp1pppp1/7p/2p2n2/P2P4/7N/RPP1PPPP/1KQNBR1B w Ffa - 0 9", 6, 617064197 }, + { "rbkq1rbn/2p1pppp/pp3n2/3p4/5P2/3N2N1/PPPPP1PP/RBKQR1B1 w Afa - 2 9", 1, 26 }, + { "rbkq1rbn/2p1pppp/pp3n2/3p4/5P2/3N2N1/PPPPP1PP/RBKQR1B1 w Afa - 2 9", 2, 647 }, + { "rbkq1rbn/2p1pppp/pp3n2/3p4/5P2/3N2N1/PPPPP1PP/RBKQR1B1 w Afa - 2 9", 3, 18027 }, + { "rbkq1rbn/2p1pppp/pp3n2/3p4/5P2/3N2N1/PPPPP1PP/RBKQR1B1 w Afa - 2 9", 4, 465119 }, + { "rbkq1rbn/2p1pppp/pp3n2/3p4/5P2/3N2N1/PPPPP1PP/RBKQR1B1 w Afa - 2 9", 5, 13643783 }, + { "rbkq1rbn/2p1pppp/pp3n2/3p4/5P2/3N2N1/PPPPP1PP/RBKQR1B1 w Afa - 2 9", 6, 369702807 }, + { "rkqbr1bn/p2ppppp/1pp2n2/8/5P2/3P1N2/PPP1PRPP/RKQB2BN w Aa - 3 9", 1, 24 }, + { "rkqbr1bn/p2ppppp/1pp2n2/8/5P2/3P1N2/PPP1PRPP/RKQB2BN w Aa - 3 9", 2, 574 }, + { "rkqbr1bn/p2ppppp/1pp2n2/8/5P2/3P1N2/PPP1PRPP/RKQB2BN w Aa - 3 9", 3, 14593 }, + { "rkqbr1bn/p2ppppp/1pp2n2/8/5P2/3P1N2/PPP1PRPP/RKQB2BN w Aa - 3 9", 4, 371597 }, + { "rkqbr1bn/p2ppppp/1pp2n2/8/5P2/3P1N2/PPP1PRPP/RKQB2BN w Aa - 3 9", 5, 10066892 }, + { "rkqbr1bn/p2ppppp/1pp2n2/8/5P2/3P1N2/PPP1PRPP/RKQB2BN w Aa - 3 9", 6, 271121237 }, + { "rk1qrbbn/p1ppp1pp/1p2n3/5p2/1P6/K3N3/P1PPPPPP/R1Q1RBBN w ea - 0 9", 1, 25 }, + { "rk1qrbbn/p1ppp1pp/1p2n3/5p2/1P6/K3N3/P1PPPPPP/R1Q1RBBN w ea - 0 9", 2, 548 }, + { "rk1qrbbn/p1ppp1pp/1p2n3/5p2/1P6/K3N3/P1PPPPPP/R1Q1RBBN w ea - 0 9", 3, 14069 }, + { "rk1qrbbn/p1ppp1pp/1p2n3/5p2/1P6/K3N3/P1PPPPPP/R1Q1RBBN w ea - 0 9", 4, 340734 }, + { "rk1qrbbn/p1ppp1pp/1p2n3/5p2/1P6/K3N3/P1PPPPPP/R1Q1RBBN w ea - 0 9", 5, 9043111 }, + { "rk1qrbbn/p1ppp1pp/1p2n3/5p2/1P6/K3N3/P1PPPPPP/R1Q1RBBN w ea - 0 9", 6, 235545764 }, + { "rkqnrnbb/pp1pp3/2p5/5ppp/8/PP4NP/2PPPPP1/RKQNR1BB w EAea - 0 9", 1, 23 }, + { "rkqnrnbb/pp1pp3/2p5/5ppp/8/PP4NP/2PPPPP1/RKQNR1BB w EAea - 0 9", 2, 727 }, + { "rkqnrnbb/pp1pp3/2p5/5ppp/8/PP4NP/2PPPPP1/RKQNR1BB w EAea - 0 9", 3, 18228 }, + { "rkqnrnbb/pp1pp3/2p5/5ppp/8/PP4NP/2PPPPP1/RKQNR1BB w EAea - 0 9", 4, 566572 }, + { "rkqnrnbb/pp1pp3/2p5/5ppp/8/PP4NP/2PPPPP1/RKQNR1BB w EAea - 0 9", 5, 15078056 }, + { "rkqnrnbb/pp1pp3/2p5/5ppp/8/PP4NP/2PPPPP1/RKQNR1BB w EAea - 0 9", 6, 471296844 }, + { "bbrknq1r/ppppppp1/8/7p/5n2/3P4/PPP1PNPP/BBKRNQR1 w c - 0 9", 1, 21 }, + { "bbrknq1r/ppppppp1/8/7p/5n2/3P4/PPP1PNPP/BBKRNQR1 w c - 0 9", 2, 610 }, + { "bbrknq1r/ppppppp1/8/7p/5n2/3P4/PPP1PNPP/BBKRNQR1 w c - 0 9", 3, 13300 }, + { "bbrknq1r/ppppppp1/8/7p/5n2/3P4/PPP1PNPP/BBKRNQR1 w c - 0 9", 4, 394705 }, + { "bbrknq1r/ppppppp1/8/7p/5n2/3P4/PPP1PNPP/BBKRNQR1 w c - 0 9", 5, 9605845 }, + { "bbrknq1r/ppppppp1/8/7p/5n2/3P4/PPP1PNPP/BBKRNQR1 w c - 0 9", 6, 293532398 }, + { "brkbnqr1/2pppnpp/pp3p2/8/4PPPP/8/PPPP4/BRKBNQRN w GBgb - 1 9", 1, 30 }, + { "brkbnqr1/2pppnpp/pp3p2/8/4PPPP/8/PPPP4/BRKBNQRN w GBgb - 1 9", 2, 757 }, + { "brkbnqr1/2pppnpp/pp3p2/8/4PPPP/8/PPPP4/BRKBNQRN w GBgb - 1 9", 3, 23908 }, + { "brkbnqr1/2pppnpp/pp3p2/8/4PPPP/8/PPPP4/BRKBNQRN w GBgb - 1 9", 4, 621332 }, + { "brkbnqr1/2pppnpp/pp3p2/8/4PPPP/8/PPPP4/BRKBNQRN w GBgb - 1 9", 5, 20360394 }, + { "brkbnqr1/2pppnpp/pp3p2/8/4PPPP/8/PPPP4/BRKBNQRN w GBgb - 1 9", 6, 548380577 }, + { "brk1qb1n/ppppppr1/2n3pp/8/2P3P1/2N5/PP1PPP1P/BR1KQBRN w b - 1 9", 1, 26 }, + { "brk1qb1n/ppppppr1/2n3pp/8/2P3P1/2N5/PP1PPP1P/BR1KQBRN w b - 1 9", 2, 570 }, + { "brk1qb1n/ppppppr1/2n3pp/8/2P3P1/2N5/PP1PPP1P/BR1KQBRN w b - 1 9", 3, 15537 }, + { "brk1qb1n/ppppppr1/2n3pp/8/2P3P1/2N5/PP1PPP1P/BR1KQBRN w b - 1 9", 4, 352883 }, + { "brk1qb1n/ppppppr1/2n3pp/8/2P3P1/2N5/PP1PPP1P/BR1KQBRN w b - 1 9", 5, 10081351 }, + { "brk1qb1n/ppppppr1/2n3pp/8/2P3P1/2N5/PP1PPP1P/BR1KQBRN w b - 1 9", 6, 242864559 }, + { "brknq1nb/pp2prpp/8/2pP1p2/6P1/2N5/PPPP1P1P/BRK1QRNB w FBb - 1 9", 1, 33 }, + { "brknq1nb/pp2prpp/8/2pP1p2/6P1/2N5/PPPP1P1P/BRK1QRNB w FBb - 1 9", 2, 830 }, + { "brknq1nb/pp2prpp/8/2pP1p2/6P1/2N5/PPPP1P1P/BRK1QRNB w FBb - 1 9", 3, 27897 }, + { "brknq1nb/pp2prpp/8/2pP1p2/6P1/2N5/PPPP1P1P/BRK1QRNB w FBb - 1 9", 4, 764915 }, + { "brknq1nb/pp2prpp/8/2pP1p2/6P1/2N5/PPPP1P1P/BRK1QRNB w FBb - 1 9", 5, 26262884 }, + { "brknq1nb/pp2prpp/8/2pP1p2/6P1/2N5/PPPP1P1P/BRK1QRNB w FBb - 1 9", 6, 765831403 }, + { "rbbk1qrn/ppp1p1pp/5p2/3p1n2/7N/P7/1PPPPPPP/RBB1KQRN w ga - 0 9", 1, 21 }, + { "rbbk1qrn/ppp1p1pp/5p2/3p1n2/7N/P7/1PPPPPPP/RBB1KQRN w ga - 0 9", 2, 562 }, + { "rbbk1qrn/ppp1p1pp/5p2/3p1n2/7N/P7/1PPPPPPP/RBB1KQRN w ga - 0 9", 3, 13060 }, + { "rbbk1qrn/ppp1p1pp/5p2/3p1n2/7N/P7/1PPPPPPP/RBB1KQRN w ga - 0 9", 4, 378883 }, + { "rbbk1qrn/ppp1p1pp/5p2/3p1n2/7N/P7/1PPPPPPP/RBB1KQRN w ga - 0 9", 5, 9520963 }, + { "rbbk1qrn/ppp1p1pp/5p2/3p1n2/7N/P7/1PPPPPPP/RBB1KQRN w ga - 0 9", 6, 290579255 }, + { "rk1b1qrn/ppp1pppp/5n2/3pN3/P6P/7b/1PPPPPP1/RKBB1QRN w GAga - 4 9", 1, 28 }, + { "rk1b1qrn/ppp1pppp/5n2/3pN3/P6P/7b/1PPPPPP1/RKBB1QRN w GAga - 4 9", 2, 677 }, + { "rk1b1qrn/ppp1pppp/5n2/3pN3/P6P/7b/1PPPPPP1/RKBB1QRN w GAga - 4 9", 3, 19235 }, + { "rk1b1qrn/ppp1pppp/5n2/3pN3/P6P/7b/1PPPPPP1/RKBB1QRN w GAga - 4 9", 4, 488740 }, + { "rk1b1qrn/ppp1pppp/5n2/3pN3/P6P/7b/1PPPPPP1/RKBB1QRN w GAga - 4 9", 5, 14354779 }, + { "rk1b1qrn/ppp1pppp/5n2/3pN3/P6P/7b/1PPPPPP1/RKBB1QRN w GAga - 4 9", 6, 383207197 }, + { "rkbnqbrn/pp1ppp1p/2p5/6p1/P7/4P3/KPPPQPPP/R1BN1BRN w - - 3 9", 1, 28 }, + { "rkbnqbrn/pp1ppp1p/2p5/6p1/P7/4P3/KPPPQPPP/R1BN1BRN w - - 3 9", 2, 585 }, + { "rkbnqbrn/pp1ppp1p/2p5/6p1/P7/4P3/KPPPQPPP/R1BN1BRN w - - 3 9", 3, 17443 }, + { "rkbnqbrn/pp1ppp1p/2p5/6p1/P7/4P3/KPPPQPPP/R1BN1BRN w - - 3 9", 4, 401483 }, + { "rkbnqbrn/pp1ppp1p/2p5/6p1/P7/4P3/KPPPQPPP/R1BN1BRN w - - 3 9", 5, 12574541 }, + { "rkbnqbrn/pp1ppp1p/2p5/6p1/P7/4P3/KPPPQPPP/R1BN1BRN w - - 3 9", 6, 310495538 }, + { "rk1nqrnb/pbpppp2/1p4p1/7p/P7/5NP1/1PPPPPBP/RKBNQR2 w FAfa - 2 9", 1, 26 }, + { "rk1nqrnb/pbpppp2/1p4p1/7p/P7/5NP1/1PPPPPBP/RKBNQR2 w FAfa - 2 9", 2, 774 }, + { "rk1nqrnb/pbpppp2/1p4p1/7p/P7/5NP1/1PPPPPBP/RKBNQR2 w FAfa - 2 9", 3, 21626 }, + { "rk1nqrnb/pbpppp2/1p4p1/7p/P7/5NP1/1PPPPPBP/RKBNQR2 w FAfa - 2 9", 4, 645200 }, + { "rk1nqrnb/pbpppp2/1p4p1/7p/P7/5NP1/1PPPPPBP/RKBNQR2 w FAfa - 2 9", 5, 19093408 }, + { "rk1nqrnb/pbpppp2/1p4p1/7p/P7/5NP1/1PPPPPBP/RKBNQR2 w FAfa - 2 9", 6, 576325868 }, + { "rbknb1rn/p1pp2pp/1p6/4pp2/1q3P1B/2N5/PPPPPNPP/RBK2QR1 w GAga - 2 9", 1, 31 }, + { "rbknb1rn/p1pp2pp/1p6/4pp2/1q3P1B/2N5/PPPPPNPP/RBK2QR1 w GAga - 2 9", 2, 1206 }, + { "rbknb1rn/p1pp2pp/1p6/4pp2/1q3P1B/2N5/PPPPPNPP/RBK2QR1 w GAga - 2 9", 3, 36940 }, + { "rbknb1rn/p1pp2pp/1p6/4pp2/1q3P1B/2N5/PPPPPNPP/RBK2QR1 w GAga - 2 9", 4, 1374158 }, + { "rbknb1rn/p1pp2pp/1p6/4pp2/1q3P1B/2N5/PPPPPNPP/RBK2QR1 w GAga - 2 9", 5, 42849564 }, + { "rbknb1rn/p1pp2pp/1p6/4pp2/1q3P1B/2N5/PPPPPNPP/RBK2QR1 w GAga - 2 9", 6, 1555711209 }, + { "rk1bbqrn/pp1pp1pp/3n4/5p2/3p4/1PP5/PK2PPPP/R1NBBQRN w ga - 0 9", 1, 21 }, + { "rk1bbqrn/pp1pp1pp/3n4/5p2/3p4/1PP5/PK2PPPP/R1NBBQRN w ga - 0 9", 2, 629 }, + { "rk1bbqrn/pp1pp1pp/3n4/5p2/3p4/1PP5/PK2PPPP/R1NBBQRN w ga - 0 9", 3, 14059 }, + { "rk1bbqrn/pp1pp1pp/3n4/5p2/3p4/1PP5/PK2PPPP/R1NBBQRN w ga - 0 9", 4, 429667 }, + { "rk1bbqrn/pp1pp1pp/3n4/5p2/3p4/1PP5/PK2PPPP/R1NBBQRN w ga - 0 9", 5, 10587910 }, + { "rk1bbqrn/pp1pp1pp/3n4/5p2/3p4/1PP5/PK2PPPP/R1NBBQRN w ga - 0 9", 6, 332632033 }, + { "rknqbbr1/p1pp1pp1/1p4n1/4p2p/4P1P1/6RB/PPPP1P1P/RKNQB2N w Aga - 0 9", 1, 27 }, + { "rknqbbr1/p1pp1pp1/1p4n1/4p2p/4P1P1/6RB/PPPP1P1P/RKNQB2N w Aga - 0 9", 2, 753 }, + { "rknqbbr1/p1pp1pp1/1p4n1/4p2p/4P1P1/6RB/PPPP1P1P/RKNQB2N w Aga - 0 9", 3, 20918 }, + { "rknqbbr1/p1pp1pp1/1p4n1/4p2p/4P1P1/6RB/PPPP1P1P/RKNQB2N w Aga - 0 9", 4, 593155 }, + { "rknqbbr1/p1pp1pp1/1p4n1/4p2p/4P1P1/6RB/PPPP1P1P/RKNQB2N w Aga - 0 9", 5, 17318772 }, + { "rknqbbr1/p1pp1pp1/1p4n1/4p2p/4P1P1/6RB/PPPP1P1P/RKNQB2N w Aga - 0 9", 6, 507563675 }, + { "rknqbr1b/pppp1ppp/4p2n/8/1P3P2/4P3/P1PPN1PP/RKNQBR1B w FAfa - 2 9", 1, 26 }, + { "rknqbr1b/pppp1ppp/4p2n/8/1P3P2/4P3/P1PPN1PP/RKNQBR1B w FAfa - 2 9", 2, 623 }, + { "rknqbr1b/pppp1ppp/4p2n/8/1P3P2/4P3/P1PPN1PP/RKNQBR1B w FAfa - 2 9", 3, 17177 }, + { "rknqbr1b/pppp1ppp/4p2n/8/1P3P2/4P3/P1PPN1PP/RKNQBR1B w FAfa - 2 9", 4, 460663 }, + { "rknqbr1b/pppp1ppp/4p2n/8/1P3P2/4P3/P1PPN1PP/RKNQBR1B w FAfa - 2 9", 5, 13389799 }, + { "rknqbr1b/pppp1ppp/4p2n/8/1P3P2/4P3/P1PPN1PP/RKNQBR1B w FAfa - 2 9", 6, 383508368 }, + { "r2kqrbn/bppppppp/2n5/p4B2/5P2/2P5/PP1PP1PP/1RKNQRBN w F - 2 9", 1, 39 }, + { "r2kqrbn/bppppppp/2n5/p4B2/5P2/2P5/PP1PP1PP/1RKNQRBN w F - 2 9", 2, 1026 }, + { "r2kqrbn/bppppppp/2n5/p4B2/5P2/2P5/PP1PP1PP/1RKNQRBN w F - 2 9", 3, 37800 }, + { "r2kqrbn/bppppppp/2n5/p4B2/5P2/2P5/PP1PP1PP/1RKNQRBN w F - 2 9", 4, 1011922 }, + { "r2kqrbn/bppppppp/2n5/p4B2/5P2/2P5/PP1PP1PP/1RKNQRBN w F - 2 9", 5, 35946987 }, + { "r2kqrbn/bppppppp/2n5/p4B2/5P2/2P5/PP1PP1PP/1RKNQRBN w F - 2 9", 6, 992756232 }, + { "rk1bqrb1/ppppppp1/1n6/7p/2P2P1n/4P1Q1/PP1P2PP/RKNB1RBN w FAfa - 0 9", 1, 35 }, + { "rk1bqrb1/ppppppp1/1n6/7p/2P2P1n/4P1Q1/PP1P2PP/RKNB1RBN w FAfa - 0 9", 2, 760 }, + { "rk1bqrb1/ppppppp1/1n6/7p/2P2P1n/4P1Q1/PP1P2PP/RKNB1RBN w FAfa - 0 9", 3, 25817 }, + { "rk1bqrb1/ppppppp1/1n6/7p/2P2P1n/4P1Q1/PP1P2PP/RKNB1RBN w FAfa - 0 9", 4, 610557 }, + { "rk1bqrb1/ppppppp1/1n6/7p/2P2P1n/4P1Q1/PP1P2PP/RKNB1RBN w FAfa - 0 9", 5, 21014787 }, + { "rk1bqrb1/ppppppp1/1n6/7p/2P2P1n/4P1Q1/PP1P2PP/RKNB1RBN w FAfa - 0 9", 6, 536852043 }, + { "rkq1rb1n/ppppp1pp/1n6/5p2/PPb2P2/8/1KPPP1PP/R1NQRBBN w ea - 1 9", 1, 27 }, + { "rkq1rb1n/ppppp1pp/1n6/5p2/PPb2P2/8/1KPPP1PP/R1NQRBBN w ea - 1 9", 2, 754 }, + { "rkq1rb1n/ppppp1pp/1n6/5p2/PPb2P2/8/1KPPP1PP/R1NQRBBN w ea - 1 9", 3, 21009 }, + { "rkq1rb1n/ppppp1pp/1n6/5p2/PPb2P2/8/1KPPP1PP/R1NQRBBN w ea - 1 9", 4, 568788 }, + { "rkq1rb1n/ppppp1pp/1n6/5p2/PPb2P2/8/1KPPP1PP/R1NQRBBN w ea - 1 9", 5, 16461795 }, + { "rkq1rb1n/ppppp1pp/1n6/5p2/PPb2P2/8/1KPPP1PP/R1NQRBBN w ea - 1 9", 6, 448313956 }, + { "rknqr2b/pppnp1pp/3p4/3b1p2/8/1N1P2N1/PPP1PPPP/RKQ1R1BB w EAea - 1 9", 1, 27 }, + { "rknqr2b/pppnp1pp/3p4/3b1p2/8/1N1P2N1/PPP1PPPP/RKQ1R1BB w EAea - 1 9", 2, 803 }, + { "rknqr2b/pppnp1pp/3p4/3b1p2/8/1N1P2N1/PPP1PPPP/RKQ1R1BB w EAea - 1 9", 3, 23708 }, + { "rknqr2b/pppnp1pp/3p4/3b1p2/8/1N1P2N1/PPP1PPPP/RKQ1R1BB w EAea - 1 9", 4, 700453 }, + { "rknqr2b/pppnp1pp/3p4/3b1p2/8/1N1P2N1/PPP1PPPP/RKQ1R1BB w EAea - 1 9", 5, 21875031 }, + { "rknqr2b/pppnp1pp/3p4/3b1p2/8/1N1P2N1/PPP1PPPP/RKQ1R1BB w EAea - 1 9", 6, 654754840 }, + { "bbrknrqn/ppppp1pB/8/2P2p1p/8/5N2/PP1PPPPP/B1RK1RQN w FCfc - 0 9", 1, 30 }, + { "bbrknrqn/ppppp1pB/8/2P2p1p/8/5N2/PP1PPPPP/B1RK1RQN w FCfc - 0 9", 2, 799 }, + { "bbrknrqn/ppppp1pB/8/2P2p1p/8/5N2/PP1PPPPP/B1RK1RQN w FCfc - 0 9", 3, 23923 }, + { "bbrknrqn/ppppp1pB/8/2P2p1p/8/5N2/PP1PPPPP/B1RK1RQN w FCfc - 0 9", 4, 671112 }, + { "bbrknrqn/ppppp1pB/8/2P2p1p/8/5N2/PP1PPPPP/B1RK1RQN w FCfc - 0 9", 5, 20532790 }, + { "bbrknrqn/ppppp1pB/8/2P2p1p/8/5N2/PP1PPPPP/B1RK1RQN w FCfc - 0 9", 6, 603059376 }, + { "brkbnrq1/1pppp1p1/6np/p4p2/4P3/1PP5/P1KP1PPP/BR1BNRQN w fb - 1 9", 1, 27 }, + { "brkbnrq1/1pppp1p1/6np/p4p2/4P3/1PP5/P1KP1PPP/BR1BNRQN w fb - 1 9", 2, 726 }, + { "brkbnrq1/1pppp1p1/6np/p4p2/4P3/1PP5/P1KP1PPP/BR1BNRQN w fb - 1 9", 3, 19329 }, + { "brkbnrq1/1pppp1p1/6np/p4p2/4P3/1PP5/P1KP1PPP/BR1BNRQN w fb - 1 9", 4, 555622 }, + { "brkbnrq1/1pppp1p1/6np/p4p2/4P3/1PP5/P1KP1PPP/BR1BNRQN w fb - 1 9", 5, 15156662 }, + { "brkbnrq1/1pppp1p1/6np/p4p2/4P3/1PP5/P1KP1PPP/BR1BNRQN w fb - 1 9", 6, 457601127 }, + { "brknrbq1/1p1p1ppp/p3p1n1/2p5/8/1P1BPP2/P1PP2PP/BRKNR1QN w EBeb - 0 9", 1, 36 }, + { "brknrbq1/1p1p1ppp/p3p1n1/2p5/8/1P1BPP2/P1PP2PP/BRKNR1QN w EBeb - 0 9", 2, 786 }, + { "brknrbq1/1p1p1ppp/p3p1n1/2p5/8/1P1BPP2/P1PP2PP/BRKNR1QN w EBeb - 0 9", 3, 27868 }, + { "brknrbq1/1p1p1ppp/p3p1n1/2p5/8/1P1BPP2/P1PP2PP/BRKNR1QN w EBeb - 0 9", 4, 655019 }, + { "brknrbq1/1p1p1ppp/p3p1n1/2p5/8/1P1BPP2/P1PP2PP/BRKNR1QN w EBeb - 0 9", 5, 22852433 }, + { "brknrbq1/1p1p1ppp/p3p1n1/2p5/8/1P1BPP2/P1PP2PP/BRKNR1QN w EBeb - 0 9", 6, 577223409 }, + { "brknrqnb/p2ppp1p/2p5/1p6/3P2p1/P1P1N3/1P2PPPP/BRK1RQNB w EBeb - 0 9", 1, 23 }, + { "brknrqnb/p2ppp1p/2p5/1p6/3P2p1/P1P1N3/1P2PPPP/BRK1RQNB w EBeb - 0 9", 2, 649 }, + { "brknrqnb/p2ppp1p/2p5/1p6/3P2p1/P1P1N3/1P2PPPP/BRK1RQNB w EBeb - 0 9", 3, 15169 }, + { "brknrqnb/p2ppp1p/2p5/1p6/3P2p1/P1P1N3/1P2PPPP/BRK1RQNB w EBeb - 0 9", 4, 440504 }, + { "brknrqnb/p2ppp1p/2p5/1p6/3P2p1/P1P1N3/1P2PPPP/BRK1RQNB w EBeb - 0 9", 5, 10687843 }, + { "brknrqnb/p2ppp1p/2p5/1p6/3P2p1/P1P1N3/1P2PPPP/BRK1RQNB w EBeb - 0 9", 6, 320881984 }, + { "rbbk1rqn/1ppppppp/3n4/p7/2P5/3N4/PP1PPPPP/RBB1KRQN w fa - 1 9", 1, 20 }, + { "rbbk1rqn/1ppppppp/3n4/p7/2P5/3N4/PP1PPPPP/RBB1KRQN w fa - 1 9", 2, 478 }, + { "rbbk1rqn/1ppppppp/3n4/p7/2P5/3N4/PP1PPPPP/RBB1KRQN w fa - 1 9", 3, 11094 }, + { "rbbk1rqn/1ppppppp/3n4/p7/2P5/3N4/PP1PPPPP/RBB1KRQN w fa - 1 9", 4, 275250 }, + { "rbbk1rqn/1ppppppp/3n4/p7/2P5/3N4/PP1PPPPP/RBB1KRQN w fa - 1 9", 5, 7094988 }, + { "rbbk1rqn/1ppppppp/3n4/p7/2P5/3N4/PP1PPPPP/RBB1KRQN w fa - 1 9", 6, 185488058 }, + { "rkbbnrqn/p2p1ppp/1p2p3/8/P1p1P3/1BP5/1P1P1PPP/RKB1NRQN w FAfa - 0 9", 1, 22 }, + { "rkbbnrqn/p2p1ppp/1p2p3/8/P1p1P3/1BP5/1P1P1PPP/RKB1NRQN w FAfa - 0 9", 2, 570 }, + { "rkbbnrqn/p2p1ppp/1p2p3/8/P1p1P3/1BP5/1P1P1PPP/RKB1NRQN w FAfa - 0 9", 3, 13295 }, + { "rkbbnrqn/p2p1ppp/1p2p3/8/P1p1P3/1BP5/1P1P1PPP/RKB1NRQN w FAfa - 0 9", 4, 346811 }, + { "rkbbnrqn/p2p1ppp/1p2p3/8/P1p1P3/1BP5/1P1P1PPP/RKB1NRQN w FAfa - 0 9", 5, 8671852 }, + { "rkbbnrqn/p2p1ppp/1p2p3/8/P1p1P3/1BP5/1P1P1PPP/RKB1NRQN w FAfa - 0 9", 6, 229898448 }, + { "rkb1rb1n/ppppppqp/8/2n3p1/2P1P1P1/8/PP1P1P1P/RKBNRBQN w EAea - 1 9", 1, 23 }, + { "rkb1rb1n/ppppppqp/8/2n3p1/2P1P1P1/8/PP1P1P1P/RKBNRBQN w EAea - 1 9", 2, 663 }, + { "rkb1rb1n/ppppppqp/8/2n3p1/2P1P1P1/8/PP1P1P1P/RKBNRBQN w EAea - 1 9", 3, 16212 }, + { "rkb1rb1n/ppppppqp/8/2n3p1/2P1P1P1/8/PP1P1P1P/RKBNRBQN w EAea - 1 9", 4, 490748 }, + { "rkb1rb1n/ppppppqp/8/2n3p1/2P1P1P1/8/PP1P1P1P/RKBNRBQN w EAea - 1 9", 5, 12900485 }, + { "rkb1rb1n/ppppppqp/8/2n3p1/2P1P1P1/8/PP1P1P1P/RKBNRBQN w EAea - 1 9", 6, 404944553 }, + { "rkb1rqnb/pppp3p/2n3p1/4pp2/P2P3P/2P5/1P2PPP1/RKBNRQNB w EAea - 0 9", 1, 25 }, + { "rkb1rqnb/pppp3p/2n3p1/4pp2/P2P3P/2P5/1P2PPP1/RKBNRQNB w EAea - 0 9", 2, 845 }, + { "rkb1rqnb/pppp3p/2n3p1/4pp2/P2P3P/2P5/1P2PPP1/RKBNRQNB w EAea - 0 9", 3, 22188 }, + { "rkb1rqnb/pppp3p/2n3p1/4pp2/P2P3P/2P5/1P2PPP1/RKBNRQNB w EAea - 0 9", 4, 741972 }, + { "rkb1rqnb/pppp3p/2n3p1/4pp2/P2P3P/2P5/1P2PPP1/RKBNRQNB w EAea - 0 9", 5, 20276176 }, + { "rkb1rqnb/pppp3p/2n3p1/4pp2/P2P3P/2P5/1P2PPP1/RKBNRQNB w EAea - 0 9", 6, 683290790 }, + { "rbk1brqn/ppp1pppp/8/3p4/7P/1P4P1/2PPPP2/RBKNBRQN w FAfa - 0 9", 1, 24 }, + { "rbk1brqn/ppp1pppp/8/3p4/7P/1P4P1/2PPPP2/RBKNBRQN w FAfa - 0 9", 2, 526 }, + { "rbk1brqn/ppp1pppp/8/3p4/7P/1P4P1/2PPPP2/RBKNBRQN w FAfa - 0 9", 3, 13862 }, + { "rbk1brqn/ppp1pppp/8/3p4/7P/1P4P1/2PPPP2/RBKNBRQN w FAfa - 0 9", 4, 322175 }, + { "rbk1brqn/ppp1pppp/8/3p4/7P/1P4P1/2PPPP2/RBKNBRQN w FAfa - 0 9", 5, 9054028 }, + { "rbk1brqn/ppp1pppp/8/3p4/7P/1P4P1/2PPPP2/RBKNBRQN w FAfa - 0 9", 6, 222704171 }, + { "rknbbrqn/pp3pp1/4p3/2pp3p/2P5/8/PPBPPPPP/RKN1BRQN w FAfa - 0 9", 1, 26 }, + { "rknbbrqn/pp3pp1/4p3/2pp3p/2P5/8/PPBPPPPP/RKN1BRQN w FAfa - 0 9", 2, 756 }, + { "rknbbrqn/pp3pp1/4p3/2pp3p/2P5/8/PPBPPPPP/RKN1BRQN w FAfa - 0 9", 3, 19280 }, + { "rknbbrqn/pp3pp1/4p3/2pp3p/2P5/8/PPBPPPPP/RKN1BRQN w FAfa - 0 9", 4, 559186 }, + { "rknbbrqn/pp3pp1/4p3/2pp3p/2P5/8/PPBPPPPP/RKN1BRQN w FAfa - 0 9", 5, 14697705 }, + { "rknbbrqn/pp3pp1/4p3/2pp3p/2P5/8/PPBPPPPP/RKN1BRQN w FAfa - 0 9", 6, 433719427 }, + { "1knrbbqn/rp1p1ppp/p3p3/2p5/8/5P1P/PPPPP1P1/RKNRBBQN w DAd - 0 9", 1, 26 }, + { "1knrbbqn/rp1p1ppp/p3p3/2p5/8/5P1P/PPPPP1P1/RKNRBBQN w DAd - 0 9", 2, 539 }, + { "1knrbbqn/rp1p1ppp/p3p3/2p5/8/5P1P/PPPPP1P1/RKNRBBQN w DAd - 0 9", 3, 15194 }, + { "1knrbbqn/rp1p1ppp/p3p3/2p5/8/5P1P/PPPPP1P1/RKNRBBQN w DAd - 0 9", 4, 345070 }, + { "1knrbbqn/rp1p1ppp/p3p3/2p5/8/5P1P/PPPPP1P1/RKNRBBQN w DAd - 0 9", 5, 10223443 }, + { "1knrbbqn/rp1p1ppp/p3p3/2p5/8/5P1P/PPPPP1P1/RKNRBBQN w DAd - 0 9", 6, 248715580 }, + { "rknr1qnb/ppp1p1pp/3p2b1/8/4p3/1P3P1P/P1PP2P1/RKNRBQNB w DAda - 0 9", 1, 25 }, + { "rknr1qnb/ppp1p1pp/3p2b1/8/4p3/1P3P1P/P1PP2P1/RKNRBQNB w DAda - 0 9", 2, 701 }, + { "rknr1qnb/ppp1p1pp/3p2b1/8/4p3/1P3P1P/P1PP2P1/RKNRBQNB w DAda - 0 9", 3, 18969 }, + { "rknr1qnb/ppp1p1pp/3p2b1/8/4p3/1P3P1P/P1PP2P1/RKNRBQNB w DAda - 0 9", 4, 561369 }, + { "rknr1qnb/ppp1p1pp/3p2b1/8/4p3/1P3P1P/P1PP2P1/RKNRBQNB w DAda - 0 9", 5, 16047041 }, + { "rknr1qnb/ppp1p1pp/3p2b1/8/4p3/1P3P1P/P1PP2P1/RKNRBQNB w DAda - 0 9", 6, 496340789 }, + { "rbk1r1bn/ppppp1pp/4n3/5p2/1P3P2/4N2P/PqPPP1P1/RBK1RQBN w EAea - 1 9", 1, 2 }, + { "rbk1r1bn/ppppp1pp/4n3/5p2/1P3P2/4N2P/PqPPP1P1/RBK1RQBN w EAea - 1 9", 2, 60 }, + { "rbk1r1bn/ppppp1pp/4n3/5p2/1P3P2/4N2P/PqPPP1P1/RBK1RQBN w EAea - 1 9", 3, 1319 }, + { "rbk1r1bn/ppppp1pp/4n3/5p2/1P3P2/4N2P/PqPPP1P1/RBK1RQBN w EAea - 1 9", 4, 41765 }, + { "rbk1r1bn/ppppp1pp/4n3/5p2/1P3P2/4N2P/PqPPP1P1/RBK1RQBN w EAea - 1 9", 5, 1017864 }, + { "rbk1r1bn/ppppp1pp/4n3/5p2/1P3P2/4N2P/PqPPP1P1/RBK1RQBN w EAea - 1 9", 6, 33183408 }, + { "r1nbrqbn/k1ppp1pp/1p6/p4p2/2P5/6PQ/PP1PPP1P/RKNBR1BN w EA - 0 9", 1, 27 }, + { "r1nbrqbn/k1ppp1pp/1p6/p4p2/2P5/6PQ/PP1PPP1P/RKNBR1BN w EA - 0 9", 2, 699 }, + { "r1nbrqbn/k1ppp1pp/1p6/p4p2/2P5/6PQ/PP1PPP1P/RKNBR1BN w EA - 0 9", 3, 20436 }, + { "r1nbrqbn/k1ppp1pp/1p6/p4p2/2P5/6PQ/PP1PPP1P/RKNBR1BN w EA - 0 9", 4, 561765 }, + { "r1nbrqbn/k1ppp1pp/1p6/p4p2/2P5/6PQ/PP1PPP1P/RKNBR1BN w EA - 0 9", 5, 17192121 }, + { "r1nbrqbn/k1ppp1pp/1p6/p4p2/2P5/6PQ/PP1PPP1P/RKNBR1BN w EA - 0 9", 6, 499247248 }, + { "rknrqbbn/1pp1pp2/p5p1/3p3p/6P1/PN5P/1PPPPP2/RK1RQBBN w DAda - 0 9", 1, 23 }, + { "rknrqbbn/1pp1pp2/p5p1/3p3p/6P1/PN5P/1PPPPP2/RK1RQBBN w DAda - 0 9", 2, 611 }, + { "rknrqbbn/1pp1pp2/p5p1/3p3p/6P1/PN5P/1PPPPP2/RK1RQBBN w DAda - 0 9", 3, 15515 }, + { "rknrqbbn/1pp1pp2/p5p1/3p3p/6P1/PN5P/1PPPPP2/RK1RQBBN w DAda - 0 9", 4, 435927 }, + { "rknrqbbn/1pp1pp2/p5p1/3p3p/6P1/PN5P/1PPPPP2/RK1RQBBN w DAda - 0 9", 5, 11917036 }, + { "rknrqbbn/1pp1pp2/p5p1/3p3p/6P1/PN5P/1PPPPP2/RK1RQBBN w DAda - 0 9", 6, 352885930 }, + { "rknrqn1b/p1pp1ppb/8/1p2p1Qp/3P4/3N4/PPP1PPPP/RK1R1NBB w DAda - 0 9", 1, 45 }, + { "rknrqn1b/p1pp1ppb/8/1p2p1Qp/3P4/3N4/PPP1PPPP/RK1R1NBB w DAda - 0 9", 2, 1170 }, + { "rknrqn1b/p1pp1ppb/8/1p2p1Qp/3P4/3N4/PPP1PPPP/RK1R1NBB w DAda - 0 9", 3, 48283 }, + { "rknrqn1b/p1pp1ppb/8/1p2p1Qp/3P4/3N4/PPP1PPPP/RK1R1NBB w DAda - 0 9", 4, 1320341 }, + { "rknrqn1b/p1pp1ppb/8/1p2p1Qp/3P4/3N4/PPP1PPPP/RK1R1NBB w DAda - 0 9", 5, 52213677 }, + { "rknrqn1b/p1pp1ppb/8/1p2p1Qp/3P4/3N4/PPP1PPPP/RK1R1NBB w DAda - 0 9", 6, 1500007485 }, + { "bbkrnrnq/p2p1ppp/2p1p3/1p6/1P2Q3/6P1/P1PPPP1P/BBKRNRN1 w - - 0 9", 1, 41 }, + { "bbkrnrnq/p2p1ppp/2p1p3/1p6/1P2Q3/6P1/P1PPPP1P/BBKRNRN1 w - - 0 9", 2, 1035 }, + { "bbkrnrnq/p2p1ppp/2p1p3/1p6/1P2Q3/6P1/P1PPPP1P/BBKRNRN1 w - - 0 9", 3, 39895 }, + { "bbkrnrnq/p2p1ppp/2p1p3/1p6/1P2Q3/6P1/P1PPPP1P/BBKRNRN1 w - - 0 9", 4, 1035610 }, + { "bbkrnrnq/p2p1ppp/2p1p3/1p6/1P2Q3/6P1/P1PPPP1P/BBKRNRN1 w - - 0 9", 5, 38555608 }, + { "bbkrnrnq/p2p1ppp/2p1p3/1p6/1P2Q3/6P1/P1PPPP1P/BBKRNRN1 w - - 0 9", 6, 1037686769 }, + { "brkbnr2/1ppppp1p/7n/p5N1/P2q4/8/1PPPPPPP/BRKBNRQ1 w FBfb - 1 9", 1, 22 }, + { "brkbnr2/1ppppp1p/7n/p5N1/P2q4/8/1PPPPPPP/BRKBNRQ1 w FBfb - 1 9", 2, 869 }, + { "brkbnr2/1ppppp1p/7n/p5N1/P2q4/8/1PPPPPPP/BRKBNRQ1 w FBfb - 1 9", 3, 19234 }, + { "brkbnr2/1ppppp1p/7n/p5N1/P2q4/8/1PPPPPPP/BRKBNRQ1 w FBfb - 1 9", 4, 679754 }, + { "brkbnr2/1ppppp1p/7n/p5N1/P2q4/8/1PPPPPPP/BRKBNRQ1 w FBfb - 1 9", 5, 16453359 }, + { "brkbnr2/1ppppp1p/7n/p5N1/P2q4/8/1PPPPPPP/BRKBNRQ1 w FBfb - 1 9", 6, 567287944 }, + { "brknrbnq/p1ppppp1/1p6/7p/2PP4/5P2/PPK1P1PP/BR1NRBNQ w eb - 1 9", 1, 23 }, + { "brknrbnq/p1ppppp1/1p6/7p/2PP4/5P2/PPK1P1PP/BR1NRBNQ w eb - 1 9", 2, 641 }, + { "brknrbnq/p1ppppp1/1p6/7p/2PP4/5P2/PPK1P1PP/BR1NRBNQ w eb - 1 9", 3, 14748 }, + { "brknrbnq/p1ppppp1/1p6/7p/2PP4/5P2/PPK1P1PP/BR1NRBNQ w eb - 1 9", 4, 422240 }, + { "brknrbnq/p1ppppp1/1p6/7p/2PP4/5P2/PPK1P1PP/BR1NRBNQ w eb - 1 9", 5, 10192718 }, + { "brknrbnq/p1ppppp1/1p6/7p/2PP4/5P2/PPK1P1PP/BR1NRBNQ w eb - 1 9", 6, 302864305 }, + { "brk1r1qb/pp1ppnpp/2p2pn1/8/6N1/2N3P1/PPPPPP1P/BRK1R1QB w EBeb - 3 9", 1, 32 }, + { "brk1r1qb/pp1ppnpp/2p2pn1/8/6N1/2N3P1/PPPPPP1P/BRK1R1QB w EBeb - 3 9", 2, 863 }, + { "brk1r1qb/pp1ppnpp/2p2pn1/8/6N1/2N3P1/PPPPPP1P/BRK1R1QB w EBeb - 3 9", 3, 28379 }, + { "brk1r1qb/pp1ppnpp/2p2pn1/8/6N1/2N3P1/PPPPPP1P/BRK1R1QB w EBeb - 3 9", 4, 773191 }, + { "brk1r1qb/pp1ppnpp/2p2pn1/8/6N1/2N3P1/PPPPPP1P/BRK1R1QB w EBeb - 3 9", 5, 25848794 }, + { "brk1r1qb/pp1ppnpp/2p2pn1/8/6N1/2N3P1/PPPPPP1P/BRK1R1QB w EBeb - 3 9", 6, 720443112 }, + { "rbbk1rnq/pppp1pp1/4p2p/8/3P2n1/4BN1P/PPP1PPP1/RB1K1RNQ w FAfa - 3 9", 1, 26 }, + { "rbbk1rnq/pppp1pp1/4p2p/8/3P2n1/4BN1P/PPP1PPP1/RB1K1RNQ w FAfa - 3 9", 2, 628 }, + { "rbbk1rnq/pppp1pp1/4p2p/8/3P2n1/4BN1P/PPP1PPP1/RB1K1RNQ w FAfa - 3 9", 3, 16151 }, + { "rbbk1rnq/pppp1pp1/4p2p/8/3P2n1/4BN1P/PPP1PPP1/RB1K1RNQ w FAfa - 3 9", 4, 411995 }, + { "rbbk1rnq/pppp1pp1/4p2p/8/3P2n1/4BN1P/PPP1PPP1/RB1K1RNQ w FAfa - 3 9", 5, 11237919 }, + { "rbbk1rnq/pppp1pp1/4p2p/8/3P2n1/4BN1P/PPP1PPP1/RB1K1RNQ w FAfa - 3 9", 6, 300314373 }, + { "rkbbnr1q/p1pppppp/5n2/1p5B/PP6/4P3/2PP1PPP/RKB1NRNQ w FAfa - 0 9", 1, 30 }, + { "rkbbnr1q/p1pppppp/5n2/1p5B/PP6/4P3/2PP1PPP/RKB1NRNQ w FAfa - 0 9", 2, 692 }, + { "rkbbnr1q/p1pppppp/5n2/1p5B/PP6/4P3/2PP1PPP/RKB1NRNQ w FAfa - 0 9", 3, 21036 }, + { "rkbbnr1q/p1pppppp/5n2/1p5B/PP6/4P3/2PP1PPP/RKB1NRNQ w FAfa - 0 9", 4, 519283 }, + { "rkbbnr1q/p1pppppp/5n2/1p5B/PP6/4P3/2PP1PPP/RKB1NRNQ w FAfa - 0 9", 5, 16025428 }, + { "rkbbnr1q/p1pppppp/5n2/1p5B/PP6/4P3/2PP1PPP/RKB1NRNQ w FAfa - 0 9", 6, 420887328 }, + { "rkb1rbnq/1pppp1pp/5p2/p7/5n1P/1PN3P1/P1PPPP2/RKB1RBNQ w EAea - 0 9", 1, 32 }, + { "rkb1rbnq/1pppp1pp/5p2/p7/5n1P/1PN3P1/P1PPPP2/RKB1RBNQ w EAea - 0 9", 2, 825 }, + { "rkb1rbnq/1pppp1pp/5p2/p7/5n1P/1PN3P1/P1PPPP2/RKB1RBNQ w EAea - 0 9", 3, 27130 }, + { "rkb1rbnq/1pppp1pp/5p2/p7/5n1P/1PN3P1/P1PPPP2/RKB1RBNQ w EAea - 0 9", 4, 697251 }, + { "rkb1rbnq/1pppp1pp/5p2/p7/5n1P/1PN3P1/P1PPPP2/RKB1RBNQ w EAea - 0 9", 5, 23593363 }, + { "rkb1rbnq/1pppp1pp/5p2/p7/5n1P/1PN3P1/P1PPPP2/RKB1RBNQ w EAea - 0 9", 6, 622249676 }, + { "rkbnrnqb/1ppp1p1p/p5p1/4p3/4P3/2N2P2/PPPP2PP/RKBR1NQB w Aea - 0 9", 1, 24 }, + { "rkbnrnqb/1ppp1p1p/p5p1/4p3/4P3/2N2P2/PPPP2PP/RKBR1NQB w Aea - 0 9", 2, 487 }, + { "rkbnrnqb/1ppp1p1p/p5p1/4p3/4P3/2N2P2/PPPP2PP/RKBR1NQB w Aea - 0 9", 3, 13300 }, + { "rkbnrnqb/1ppp1p1p/p5p1/4p3/4P3/2N2P2/PPPP2PP/RKBR1NQB w Aea - 0 9", 4, 301989 }, + { "rkbnrnqb/1ppp1p1p/p5p1/4p3/4P3/2N2P2/PPPP2PP/RKBR1NQB w Aea - 0 9", 5, 8782713 }, + { "rkbnrnqb/1ppp1p1p/p5p1/4p3/4P3/2N2P2/PPPP2PP/RKBR1NQB w Aea - 0 9", 6, 215787079 }, + { "rbknbr1q/pppp2pp/4p3/5p1n/1P2P2N/8/P1PP1PPP/RBKNBR1Q w FAfa - 0 9", 1, 23 }, + { "rbknbr1q/pppp2pp/4p3/5p1n/1P2P2N/8/P1PP1PPP/RBKNBR1Q w FAfa - 0 9", 2, 571 }, + { "rbknbr1q/pppp2pp/4p3/5p1n/1P2P2N/8/P1PP1PPP/RBKNBR1Q w FAfa - 0 9", 3, 13799 }, + { "rbknbr1q/pppp2pp/4p3/5p1n/1P2P2N/8/P1PP1PPP/RBKNBR1Q w FAfa - 0 9", 4, 365272 }, + { "rbknbr1q/pppp2pp/4p3/5p1n/1P2P2N/8/P1PP1PPP/RBKNBR1Q w FAfa - 0 9", 5, 9224232 }, + { "rbknbr1q/pppp2pp/4p3/5p1n/1P2P2N/8/P1PP1PPP/RBKNBR1Q w FAfa - 0 9", 6, 257288920 }, + { "rknbb1nq/pppppr2/5pp1/7p/8/1N4P1/PPPPPP1P/RK1BBRNQ w FAa - 2 9", 1, 26 }, + { "rknbb1nq/pppppr2/5pp1/7p/8/1N4P1/PPPPPP1P/RK1BBRNQ w FAa - 2 9", 2, 548 }, + { "rknbb1nq/pppppr2/5pp1/7p/8/1N4P1/PPPPPP1P/RK1BBRNQ w FAa - 2 9", 3, 15618 }, + { "rknbb1nq/pppppr2/5pp1/7p/8/1N4P1/PPPPPP1P/RK1BBRNQ w FAa - 2 9", 4, 350173 }, + { "rknbb1nq/pppppr2/5pp1/7p/8/1N4P1/PPPPPP1P/RK1BBRNQ w FAa - 2 9", 5, 10587626 }, + { "rknbb1nq/pppppr2/5pp1/7p/8/1N4P1/PPPPPP1P/RK1BBRNQ w FAa - 2 9", 6, 253006082 }, + { "rknr1bnq/p2pp1pp/1p3p2/2p4b/6PP/2P2N2/PP1PPP2/RKNRBB1Q w DAda - 1 9", 1, 25 }, + { "rknr1bnq/p2pp1pp/1p3p2/2p4b/6PP/2P2N2/PP1PPP2/RKNRBB1Q w DAda - 1 9", 2, 502 }, + { "rknr1bnq/p2pp1pp/1p3p2/2p4b/6PP/2P2N2/PP1PPP2/RKNRBB1Q w DAda - 1 9", 3, 13150 }, + { "rknr1bnq/p2pp1pp/1p3p2/2p4b/6PP/2P2N2/PP1PPP2/RKNRBB1Q w DAda - 1 9", 4, 279098 }, + { "rknr1bnq/p2pp1pp/1p3p2/2p4b/6PP/2P2N2/PP1PPP2/RKNRBB1Q w DAda - 1 9", 5, 7824941 }, + { "rknr1bnq/p2pp1pp/1p3p2/2p4b/6PP/2P2N2/PP1PPP2/RKNRBB1Q w DAda - 1 9", 6, 175766730 }, + { "rknrb1qb/ppp1pppp/3p4/8/4P1nP/2P5/PPKP1PP1/R1NRBNQB w da - 1 9", 1, 23 }, + { "rknrb1qb/ppp1pppp/3p4/8/4P1nP/2P5/PPKP1PP1/R1NRBNQB w da - 1 9", 2, 643 }, + { "rknrb1qb/ppp1pppp/3p4/8/4P1nP/2P5/PPKP1PP1/R1NRBNQB w da - 1 9", 3, 14849 }, + { "rknrb1qb/ppp1pppp/3p4/8/4P1nP/2P5/PPKP1PP1/R1NRBNQB w da - 1 9", 4, 426616 }, + { "rknrb1qb/ppp1pppp/3p4/8/4P1nP/2P5/PPKP1PP1/R1NRBNQB w da - 1 9", 5, 10507328 }, + { "rknrb1qb/ppp1pppp/3p4/8/4P1nP/2P5/PPKP1PP1/R1NRBNQB w da - 1 9", 6, 312096061 }, + { "rbk1rnbq/pppp1npp/4p3/5p2/4P1P1/7P/PPPP1P1N/RBKNR1BQ w EAea - 1 9", 1, 24 }, + { "rbk1rnbq/pppp1npp/4p3/5p2/4P1P1/7P/PPPP1P1N/RBKNR1BQ w EAea - 1 9", 2, 591 }, + { "rbk1rnbq/pppp1npp/4p3/5p2/4P1P1/7P/PPPP1P1N/RBKNR1BQ w EAea - 1 9", 3, 15178 }, + { "rbk1rnbq/pppp1npp/4p3/5p2/4P1P1/7P/PPPP1P1N/RBKNR1BQ w EAea - 1 9", 4, 376988 }, + { "rbk1rnbq/pppp1npp/4p3/5p2/4P1P1/7P/PPPP1P1N/RBKNR1BQ w EAea - 1 9", 5, 10251465 }, + { "rbk1rnbq/pppp1npp/4p3/5p2/4P1P1/7P/PPPP1P1N/RBKNR1BQ w EAea - 1 9", 6, 263574861 }, + { "rknbrnb1/p1pppp1p/1p6/3N2p1/P3q1P1/8/1PPPPP1P/RKNBR1BQ w EAea - 1 9", 1, 28 }, + { "rknbrnb1/p1pppp1p/1p6/3N2p1/P3q1P1/8/1PPPPP1P/RKNBR1BQ w EAea - 1 9", 2, 948 }, + { "rknbrnb1/p1pppp1p/1p6/3N2p1/P3q1P1/8/1PPPPP1P/RKNBR1BQ w EAea - 1 9", 3, 27343 }, + { "rknbrnb1/p1pppp1p/1p6/3N2p1/P3q1P1/8/1PPPPP1P/RKNBR1BQ w EAea - 1 9", 4, 864588 }, + { "rknbrnb1/p1pppp1p/1p6/3N2p1/P3q1P1/8/1PPPPP1P/RKNBR1BQ w EAea - 1 9", 5, 26241141 }, + { "rknbrnb1/p1pppp1p/1p6/3N2p1/P3q1P1/8/1PPPPP1P/RKNBR1BQ w EAea - 1 9", 6, 812343987 }, + { "rknrn1b1/ppppppqp/8/6p1/2P5/2P1BP2/PP2P1PP/RKNRNB1Q w DAda - 1 9", 1, 31 }, + { "rknrn1b1/ppppppqp/8/6p1/2P5/2P1BP2/PP2P1PP/RKNRNB1Q w DAda - 1 9", 2, 807 }, + { "rknrn1b1/ppppppqp/8/6p1/2P5/2P1BP2/PP2P1PP/RKNRNB1Q w DAda - 1 9", 3, 24360 }, + { "rknrn1b1/ppppppqp/8/6p1/2P5/2P1BP2/PP2P1PP/RKNRNB1Q w DAda - 1 9", 4, 672973 }, + { "rknrn1b1/ppppppqp/8/6p1/2P5/2P1BP2/PP2P1PP/RKNRNB1Q w DAda - 1 9", 5, 20455205 }, + { "rknrn1b1/ppppppqp/8/6p1/2P5/2P1BP2/PP2P1PP/RKNRNB1Q w DAda - 1 9", 6, 588518645 }, + { "1k1rnqbb/npppppp1/r7/p2B3p/5P2/1N4P1/PPPPP2P/RK1RNQB1 w DAd - 0 9", 1, 40 }, + { "1k1rnqbb/npppppp1/r7/p2B3p/5P2/1N4P1/PPPPP2P/RK1RNQB1 w DAd - 0 9", 2, 1122 }, + { "1k1rnqbb/npppppp1/r7/p2B3p/5P2/1N4P1/PPPPP2P/RK1RNQB1 w DAd - 0 9", 3, 44297 }, + { "1k1rnqbb/npppppp1/r7/p2B3p/5P2/1N4P1/PPPPP2P/RK1RNQB1 w DAd - 0 9", 4, 1249989 }, + { "1k1rnqbb/npppppp1/r7/p2B3p/5P2/1N4P1/PPPPP2P/RK1RNQB1 w DAd - 0 9", 5, 48711073 }, + { "1k1rnqbb/npppppp1/r7/p2B3p/5P2/1N4P1/PPPPP2P/RK1RNQB1 w DAd - 0 9", 6, 1412437357 }, + { "bbqr1rkn/pp1ppppp/8/2p5/1P2P1n1/7N/P1PP1P1P/BBQRKR1N w FD - 0 9", 1, 26 }, + { "bbqr1rkn/pp1ppppp/8/2p5/1P2P1n1/7N/P1PP1P1P/BBQRKR1N w FD - 0 9", 2, 841 }, + { "bbqr1rkn/pp1ppppp/8/2p5/1P2P1n1/7N/P1PP1P1P/BBQRKR1N w FD - 0 9", 3, 22986 }, + { "bbqr1rkn/pp1ppppp/8/2p5/1P2P1n1/7N/P1PP1P1P/BBQRKR1N w FD - 0 9", 4, 746711 }, + { "bbqr1rkn/pp1ppppp/8/2p5/1P2P1n1/7N/P1PP1P1P/BBQRKR1N w FD - 0 9", 5, 21328001 }, + { "bbqr1rkn/pp1ppppp/8/2p5/1P2P1n1/7N/P1PP1P1P/BBQRKR1N w FD - 0 9", 6, 705170410 }, + { "bqkr1rnn/1ppp1ppp/p4b2/4p3/P7/3PP2N/1PP2PPP/BQRBKR1N w FC - 3 9", 1, 24 }, + { "bqkr1rnn/1ppp1ppp/p4b2/4p3/P7/3PP2N/1PP2PPP/BQRBKR1N w FC - 3 9", 2, 500 }, + { "bqkr1rnn/1ppp1ppp/p4b2/4p3/P7/3PP2N/1PP2PPP/BQRBKR1N w FC - 3 9", 3, 12802 }, + { "bqkr1rnn/1ppp1ppp/p4b2/4p3/P7/3PP2N/1PP2PPP/BQRBKR1N w FC - 3 9", 4, 293824 }, + { "bqkr1rnn/1ppp1ppp/p4b2/4p3/P7/3PP2N/1PP2PPP/BQRBKR1N w FC - 3 9", 5, 7928916 }, + { "bqkr1rnn/1ppp1ppp/p4b2/4p3/P7/3PP2N/1PP2PPP/BQRBKR1N w FC - 3 9", 6, 197806842 }, + { "bqrkrbnn/1pp1ppp1/8/p6p/3p4/P3P2P/QPPP1PP1/B1RKRBNN w ECec - 0 9", 1, 31 }, + { "bqrkrbnn/1pp1ppp1/8/p6p/3p4/P3P2P/QPPP1PP1/B1RKRBNN w ECec - 0 9", 2, 592 }, + { "bqrkrbnn/1pp1ppp1/8/p6p/3p4/P3P2P/QPPP1PP1/B1RKRBNN w ECec - 0 9", 3, 18585 }, + { "bqrkrbnn/1pp1ppp1/8/p6p/3p4/P3P2P/QPPP1PP1/B1RKRBNN w ECec - 0 9", 4, 396423 }, + { "bqrkrbnn/1pp1ppp1/8/p6p/3p4/P3P2P/QPPP1PP1/B1RKRBNN w ECec - 0 9", 5, 12607528 }, + { "bqrkrbnn/1pp1ppp1/8/p6p/3p4/P3P2P/QPPP1PP1/B1RKRBNN w ECec - 0 9", 6, 298629240 }, + { "bqkrrnnb/2p1pppp/p7/1P1p4/8/2R3P1/PP1PPP1P/BQ1KRNNB w E - 0 9", 1, 42 }, + { "bqkrrnnb/2p1pppp/p7/1P1p4/8/2R3P1/PP1PPP1P/BQ1KRNNB w E - 0 9", 2, 1124 }, + { "bqkrrnnb/2p1pppp/p7/1P1p4/8/2R3P1/PP1PPP1P/BQ1KRNNB w E - 0 9", 3, 45187 }, + { "bqkrrnnb/2p1pppp/p7/1P1p4/8/2R3P1/PP1PPP1P/BQ1KRNNB w E - 0 9", 4, 1276664 }, + { "bqkrrnnb/2p1pppp/p7/1P1p4/8/2R3P1/PP1PPP1P/BQ1KRNNB w E - 0 9", 5, 50052573 }, + { "bqkrrnnb/2p1pppp/p7/1P1p4/8/2R3P1/PP1PPP1P/BQ1KRNNB w E - 0 9", 6, 1483524894 }, + { "qbbrkrn1/p1pppn1p/8/1p3Pp1/2P5/8/PP1PPP1P/QBBRKRNN w FDfd - 0 9", 1, 21 }, + { "qbbrkrn1/p1pppn1p/8/1p3Pp1/2P5/8/PP1PPP1P/QBBRKRNN w FDfd - 0 9", 2, 577 }, + { "qbbrkrn1/p1pppn1p/8/1p3Pp1/2P5/8/PP1PPP1P/QBBRKRNN w FDfd - 0 9", 3, 13244 }, + { "qbbrkrn1/p1pppn1p/8/1p3Pp1/2P5/8/PP1PPP1P/QBBRKRNN w FDfd - 0 9", 4, 392131 }, + { "qbbrkrn1/p1pppn1p/8/1p3Pp1/2P5/8/PP1PPP1P/QBBRKRNN w FDfd - 0 9", 5, 9683808 }, + { "qbbrkrn1/p1pppn1p/8/1p3Pp1/2P5/8/PP1PPP1P/QBBRKRNN w FDfd - 0 9", 6, 300294295 }, + { "qrbbkrnn/pp1p2pp/4p3/5p2/2p2P1P/2P5/PP1PP1P1/QRBBKRNN w FBfb - 0 9", 1, 21 }, + { "qrbbkrnn/pp1p2pp/4p3/5p2/2p2P1P/2P5/PP1PP1P1/QRBBKRNN w FBfb - 0 9", 2, 571 }, + { "qrbbkrnn/pp1p2pp/4p3/5p2/2p2P1P/2P5/PP1PP1P1/QRBBKRNN w FBfb - 0 9", 3, 12736 }, + { "qrbbkrnn/pp1p2pp/4p3/5p2/2p2P1P/2P5/PP1PP1P1/QRBBKRNN w FBfb - 0 9", 4, 345681 }, + { "qrbbkrnn/pp1p2pp/4p3/5p2/2p2P1P/2P5/PP1PP1P1/QRBBKRNN w FBfb - 0 9", 5, 8239872 }, + { "qrbbkrnn/pp1p2pp/4p3/5p2/2p2P1P/2P5/PP1PP1P1/QRBBKRNN w FBfb - 0 9", 6, 228837930 }, + { "qrbkrbn1/1pp1pppp/p2p4/8/5PPn/2P5/PP1PP3/QRBKRBNN w EBeb - 0 9", 1, 18 }, + { "qrbkrbn1/1pp1pppp/p2p4/8/5PPn/2P5/PP1PP3/QRBKRBNN w EBeb - 0 9", 2, 466 }, + { "qrbkrbn1/1pp1pppp/p2p4/8/5PPn/2P5/PP1PP3/QRBKRBNN w EBeb - 0 9", 3, 9443 }, + { "qrbkrbn1/1pp1pppp/p2p4/8/5PPn/2P5/PP1PP3/QRBKRBNN w EBeb - 0 9", 4, 257776 }, + { "qrbkrbn1/1pp1pppp/p2p4/8/5PPn/2P5/PP1PP3/QRBKRBNN w EBeb - 0 9", 5, 5679073 }, + { "qrbkrbn1/1pp1pppp/p2p4/8/5PPn/2P5/PP1PP3/QRBKRBNN w EBeb - 0 9", 6, 162883949 }, + { "qrb1rnnb/pp1p1ppp/2pk4/4p3/1P2P3/1R6/P1PP1PPP/Q1BKRNNB w E - 4 9", 1, 37 }, + { "qrb1rnnb/pp1p1ppp/2pk4/4p3/1P2P3/1R6/P1PP1PPP/Q1BKRNNB w E - 4 9", 2, 760 }, + { "qrb1rnnb/pp1p1ppp/2pk4/4p3/1P2P3/1R6/P1PP1PPP/Q1BKRNNB w E - 4 9", 3, 26863 }, + { "qrb1rnnb/pp1p1ppp/2pk4/4p3/1P2P3/1R6/P1PP1PPP/Q1BKRNNB w E - 4 9", 4, 562201 }, + { "qrb1rnnb/pp1p1ppp/2pk4/4p3/1P2P3/1R6/P1PP1PPP/Q1BKRNNB w E - 4 9", 5, 19486022 }, + { "qrb1rnnb/pp1p1ppp/2pk4/4p3/1P2P3/1R6/P1PP1PPP/Q1BKRNNB w E - 4 9", 6, 421740856 }, + { "qbrkbrn1/p1pppp1p/6n1/1p4p1/1P6/5P2/P1PPPBPP/QBRK1RNN w FCfc - 1 9", 1, 33 }, + { "qbrkbrn1/p1pppp1p/6n1/1p4p1/1P6/5P2/P1PPPBPP/QBRK1RNN w FCfc - 1 9", 2, 824 }, + { "qbrkbrn1/p1pppp1p/6n1/1p4p1/1P6/5P2/P1PPPBPP/QBRK1RNN w FCfc - 1 9", 3, 27385 }, + { "qbrkbrn1/p1pppp1p/6n1/1p4p1/1P6/5P2/P1PPPBPP/QBRK1RNN w FCfc - 1 9", 4, 750924 }, + { "qbrkbrn1/p1pppp1p/6n1/1p4p1/1P6/5P2/P1PPPBPP/QBRK1RNN w FCfc - 1 9", 5, 25176664 }, + { "qbrkbrn1/p1pppp1p/6n1/1p4p1/1P6/5P2/P1PPPBPP/QBRK1RNN w FCfc - 1 9", 6, 734656217 }, + { "qrkbbr2/2pppppp/5nn1/pp1Q4/P7/3P4/1PP1PPPP/1RKBBRNN w FBfb - 0 9", 1, 42 }, + { "qrkbbr2/2pppppp/5nn1/pp1Q4/P7/3P4/1PP1PPPP/1RKBBRNN w FBfb - 0 9", 2, 1147 }, + { "qrkbbr2/2pppppp/5nn1/pp1Q4/P7/3P4/1PP1PPPP/1RKBBRNN w FBfb - 0 9", 3, 44012 }, + { "qrkbbr2/2pppppp/5nn1/pp1Q4/P7/3P4/1PP1PPPP/1RKBBRNN w FBfb - 0 9", 4, 1311247 }, + { "qrkbbr2/2pppppp/5nn1/pp1Q4/P7/3P4/1PP1PPPP/1RKBBRNN w FBfb - 0 9", 5, 48216013 }, + { "qrkbbr2/2pppppp/5nn1/pp1Q4/P7/3P4/1PP1PPPP/1RKBBRNN w FBfb - 0 9", 6, 1522548864 }, + { "qrkrbbnn/pp2pp2/2pp2pp/1B6/P7/4P3/1PPP1PPP/QRKRB1NN w DBdb - 0 9", 1, 26 }, + { "qrkrbbnn/pp2pp2/2pp2pp/1B6/P7/4P3/1PPP1PPP/QRKRB1NN w DBdb - 0 9", 2, 464 }, + { "qrkrbbnn/pp2pp2/2pp2pp/1B6/P7/4P3/1PPP1PPP/QRKRB1NN w DBdb - 0 9", 3, 12653 }, + { "qrkrbbnn/pp2pp2/2pp2pp/1B6/P7/4P3/1PPP1PPP/QRKRB1NN w DBdb - 0 9", 4, 242892 }, + { "qrkrbbnn/pp2pp2/2pp2pp/1B6/P7/4P3/1PPP1PPP/QRKRB1NN w DBdb - 0 9", 5, 6928220 }, + { "qrkrbbnn/pp2pp2/2pp2pp/1B6/P7/4P3/1PPP1PPP/QRKRB1NN w DBdb - 0 9", 6, 142507795 }, + { "qrkrbnnb/p1pp1pp1/1p5p/4p3/1P6/6PN/PKPPPP1P/QR1RBN1B w db - 0 9", 1, 29 }, + { "qrkrbnnb/p1pp1pp1/1p5p/4p3/1P6/6PN/PKPPPP1P/QR1RBN1B w db - 0 9", 2, 705 }, + { "qrkrbnnb/p1pp1pp1/1p5p/4p3/1P6/6PN/PKPPPP1P/QR1RBN1B w db - 0 9", 3, 20000 }, + { "qrkrbnnb/p1pp1pp1/1p5p/4p3/1P6/6PN/PKPPPP1P/QR1RBN1B w db - 0 9", 4, 529810 }, + { "qrkrbnnb/p1pp1pp1/1p5p/4p3/1P6/6PN/PKPPPP1P/QR1RBN1B w db - 0 9", 5, 15055365 }, + { "qrkrbnnb/p1pp1pp1/1p5p/4p3/1P6/6PN/PKPPPP1P/QR1RBN1B w db - 0 9", 6, 419552571 }, + { "qbrkr1bn/p1p1pp1p/1p1p2n1/6p1/3P1P2/4P3/PPP3PP/QBKRRNBN w ec - 2 9", 1, 23 }, + { "qbrkr1bn/p1p1pp1p/1p1p2n1/6p1/3P1P2/4P3/PPP3PP/QBKRRNBN w ec - 2 9", 2, 613 }, + { "qbrkr1bn/p1p1pp1p/1p1p2n1/6p1/3P1P2/4P3/PPP3PP/QBKRRNBN w ec - 2 9", 3, 14835 }, + { "qbrkr1bn/p1p1pp1p/1p1p2n1/6p1/3P1P2/4P3/PPP3PP/QBKRRNBN w ec - 2 9", 4, 426484 }, + { "qbrkr1bn/p1p1pp1p/1p1p2n1/6p1/3P1P2/4P3/PPP3PP/QBKRRNBN w ec - 2 9", 5, 10747407 }, + { "qbrkr1bn/p1p1pp1p/1p1p2n1/6p1/3P1P2/4P3/PPP3PP/QBKRRNBN w ec - 2 9", 6, 323905533 }, + { "qrk1rnb1/p1pp1ppp/1p2Bbn1/8/4P3/6P1/PPPP1P1P/QRK1RNBN w EBeb - 1 9", 1, 28 }, + { "qrk1rnb1/p1pp1ppp/1p2Bbn1/8/4P3/6P1/PPPP1P1P/QRK1RNBN w EBeb - 1 9", 2, 927 }, + { "qrk1rnb1/p1pp1ppp/1p2Bbn1/8/4P3/6P1/PPPP1P1P/QRK1RNBN w EBeb - 1 9", 3, 24887 }, + { "qrk1rnb1/p1pp1ppp/1p2Bbn1/8/4P3/6P1/PPPP1P1P/QRK1RNBN w EBeb - 1 9", 4, 846839 }, + { "qrk1rnb1/p1pp1ppp/1p2Bbn1/8/4P3/6P1/PPPP1P1P/QRK1RNBN w EBeb - 1 9", 5, 23063284 }, + { "qrk1rnb1/p1pp1ppp/1p2Bbn1/8/4P3/6P1/PPPP1P1P/QRK1RNBN w EBeb - 1 9", 6, 807913585 }, + { "1qkrnbbn/1rpppppp/pp6/5N2/P4P2/8/1PPPP1PP/QRKRNBB1 w DBd - 3 9", 1, 30 }, + { "1qkrnbbn/1rpppppp/pp6/5N2/P4P2/8/1PPPP1PP/QRKRNBB1 w DBd - 3 9", 2, 542 }, + { "1qkrnbbn/1rpppppp/pp6/5N2/P4P2/8/1PPPP1PP/QRKRNBB1 w DBd - 3 9", 3, 16646 }, + { "1qkrnbbn/1rpppppp/pp6/5N2/P4P2/8/1PPPP1PP/QRKRNBB1 w DBd - 3 9", 4, 345172 }, + { "1qkrnbbn/1rpppppp/pp6/5N2/P4P2/8/1PPPP1PP/QRKRNBB1 w DBd - 3 9", 5, 10976745 }, + { "1qkrnbbn/1rpppppp/pp6/5N2/P4P2/8/1PPPP1PP/QRKRNBB1 w DBd - 3 9", 6, 251694423 }, + { "qrkr2bb/pppppppp/8/1n2n3/1N5P/1P6/P1PPPPP1/QRKR1NBB w DBdb - 1 9", 1, 28 }, + { "qrkr2bb/pppppppp/8/1n2n3/1N5P/1P6/P1PPPPP1/QRKR1NBB w DBdb - 1 9", 2, 719 }, + { "qrkr2bb/pppppppp/8/1n2n3/1N5P/1P6/P1PPPPP1/QRKR1NBB w DBdb - 1 9", 3, 21048 }, + { "qrkr2bb/pppppppp/8/1n2n3/1N5P/1P6/P1PPPPP1/QRKR1NBB w DBdb - 1 9", 4, 562015 }, + { "qrkr2bb/pppppppp/8/1n2n3/1N5P/1P6/P1PPPPP1/QRKR1NBB w DBdb - 1 9", 5, 17351761 }, + { "qrkr2bb/pppppppp/8/1n2n3/1N5P/1P6/P1PPPPP1/QRKR1NBB w DBdb - 1 9", 6, 479400272 }, + { "bbrqkrnn/3ppppp/8/ppp5/6P1/4P2N/PPPPKP1P/BBRQ1R1N w fc - 0 9", 1, 21 }, + { "bbrqkrnn/3ppppp/8/ppp5/6P1/4P2N/PPPPKP1P/BBRQ1R1N w fc - 0 9", 2, 704 }, + { "bbrqkrnn/3ppppp/8/ppp5/6P1/4P2N/PPPPKP1P/BBRQ1R1N w fc - 0 9", 3, 16119 }, + { "bbrqkrnn/3ppppp/8/ppp5/6P1/4P2N/PPPPKP1P/BBRQ1R1N w fc - 0 9", 4, 546215 }, + { "bbrqkrnn/3ppppp/8/ppp5/6P1/4P2N/PPPPKP1P/BBRQ1R1N w fc - 0 9", 5, 13676371 }, + { "bbrqkrnn/3ppppp/8/ppp5/6P1/4P2N/PPPPKP1P/BBRQ1R1N w fc - 0 9", 6, 470796854 }, + { "brqbkrnn/1pp2p1p/3pp1p1/p5N1/8/1P6/P1PPPPPP/BRQBK1RN w Bfb - 0 9", 1, 34 }, + { "brqbkrnn/1pp2p1p/3pp1p1/p5N1/8/1P6/P1PPPPPP/BRQBK1RN w Bfb - 0 9", 2, 688 }, + { "brqbkrnn/1pp2p1p/3pp1p1/p5N1/8/1P6/P1PPPPPP/BRQBK1RN w Bfb - 0 9", 3, 22827 }, + { "brqbkrnn/1pp2p1p/3pp1p1/p5N1/8/1P6/P1PPPPPP/BRQBK1RN w Bfb - 0 9", 4, 505618 }, + { "brqbkrnn/1pp2p1p/3pp1p1/p5N1/8/1P6/P1PPPPPP/BRQBK1RN w Bfb - 0 9", 5, 16639723 }, + { "brqbkrnn/1pp2p1p/3pp1p1/p5N1/8/1P6/P1PPPPPP/BRQBK1RN w Bfb - 0 9", 6, 402140795 }, + { "br1krb1n/2qppppp/pp3n2/8/1P4P1/8/P1PPPP1P/1RQKRBNN w EBeb - 0 9", 1, 24 }, + { "br1krb1n/2qppppp/pp3n2/8/1P4P1/8/P1PPPP1P/1RQKRBNN w EBeb - 0 9", 2, 945 }, + { "br1krb1n/2qppppp/pp3n2/8/1P4P1/8/P1PPPP1P/1RQKRBNN w EBeb - 0 9", 3, 23943 }, + { "br1krb1n/2qppppp/pp3n2/8/1P4P1/8/P1PPPP1P/1RQKRBNN w EBeb - 0 9", 4, 926427 }, + { "br1krb1n/2qppppp/pp3n2/8/1P4P1/8/P1PPPP1P/1RQKRBNN w EBeb - 0 9", 5, 25019636 }, + { "br1krb1n/2qppppp/pp3n2/8/1P4P1/8/P1PPPP1P/1RQKRBNN w EBeb - 0 9", 6, 959651619 }, + { "brqkr1nb/2ppp1pp/1p2np2/p7/2P1PN2/8/PP1P1PPP/BRQKRN1B w EBeb - 0 9", 1, 28 }, + { "brqkr1nb/2ppp1pp/1p2np2/p7/2P1PN2/8/PP1P1PPP/BRQKRN1B w EBeb - 0 9", 2, 675 }, + { "brqkr1nb/2ppp1pp/1p2np2/p7/2P1PN2/8/PP1P1PPP/BRQKRN1B w EBeb - 0 9", 3, 19728 }, + { "brqkr1nb/2ppp1pp/1p2np2/p7/2P1PN2/8/PP1P1PPP/BRQKRN1B w EBeb - 0 9", 4, 504128 }, + { "brqkr1nb/2ppp1pp/1p2np2/p7/2P1PN2/8/PP1P1PPP/BRQKRN1B w EBeb - 0 9", 5, 15516491 }, + { "brqkr1nb/2ppp1pp/1p2np2/p7/2P1PN2/8/PP1P1PPP/BRQKRN1B w EBeb - 0 9", 6, 417396563 }, + { "rbbqkrnn/3pppp1/p7/1pp4p/2P1P2P/8/PP1P1PP1/RBBQKRNN w FAfa - 0 9", 1, 26 }, + { "rbbqkrnn/3pppp1/p7/1pp4p/2P1P2P/8/PP1P1PP1/RBBQKRNN w FAfa - 0 9", 2, 671 }, + { "rbbqkrnn/3pppp1/p7/1pp4p/2P1P2P/8/PP1P1PP1/RBBQKRNN w FAfa - 0 9", 3, 18164 }, + { "rbbqkrnn/3pppp1/p7/1pp4p/2P1P2P/8/PP1P1PP1/RBBQKRNN w FAfa - 0 9", 4, 496806 }, + { "rbbqkrnn/3pppp1/p7/1pp4p/2P1P2P/8/PP1P1PP1/RBBQKRNN w FAfa - 0 9", 5, 14072641 }, + { "rbbqkrnn/3pppp1/p7/1pp4p/2P1P2P/8/PP1P1PP1/RBBQKRNN w FAfa - 0 9", 6, 404960259 }, + { "rqbbkr1n/pp1p1p1p/4pn2/2p3p1/4P1P1/3P3P/PPP2P2/RQBBKRNN w FAfa - 0 9", 1, 22 }, + { "rqbbkr1n/pp1p1p1p/4pn2/2p3p1/4P1P1/3P3P/PPP2P2/RQBBKRNN w FAfa - 0 9", 2, 633 }, + { "rqbbkr1n/pp1p1p1p/4pn2/2p3p1/4P1P1/3P3P/PPP2P2/RQBBKRNN w FAfa - 0 9", 3, 14629 }, + { "rqbbkr1n/pp1p1p1p/4pn2/2p3p1/4P1P1/3P3P/PPP2P2/RQBBKRNN w FAfa - 0 9", 4, 441809 }, + { "rqbbkr1n/pp1p1p1p/4pn2/2p3p1/4P1P1/3P3P/PPP2P2/RQBBKRNN w FAfa - 0 9", 5, 10776416 }, + { "rqbbkr1n/pp1p1p1p/4pn2/2p3p1/4P1P1/3P3P/PPP2P2/RQBBKRNN w FAfa - 0 9", 6, 335689685 }, + { "rqbkrbnn/p1ppp3/1p3pp1/7p/3P4/P1P5/1PQ1PPPP/R1BKRBNN w EAea - 0 9", 1, 32 }, + { "rqbkrbnn/p1ppp3/1p3pp1/7p/3P4/P1P5/1PQ1PPPP/R1BKRBNN w EAea - 0 9", 2, 607 }, + { "rqbkrbnn/p1ppp3/1p3pp1/7p/3P4/P1P5/1PQ1PPPP/R1BKRBNN w EAea - 0 9", 3, 20339 }, + { "rqbkrbnn/p1ppp3/1p3pp1/7p/3P4/P1P5/1PQ1PPPP/R1BKRBNN w EAea - 0 9", 4, 454319 }, + { "rqbkrbnn/p1ppp3/1p3pp1/7p/3P4/P1P5/1PQ1PPPP/R1BKRBNN w EAea - 0 9", 5, 15586203 }, + { "rqbkrbnn/p1ppp3/1p3pp1/7p/3P4/P1P5/1PQ1PPPP/R1BKRBNN w EAea - 0 9", 6, 383515709 }, + { "rqbkrnn1/pp2ppbp/3p4/2p3p1/2P5/1P3N1P/P2PPPP1/RQBKRN1B w EAea - 1 9", 1, 29 }, + { "rqbkrnn1/pp2ppbp/3p4/2p3p1/2P5/1P3N1P/P2PPPP1/RQBKRN1B w EAea - 1 9", 2, 943 }, + { "rqbkrnn1/pp2ppbp/3p4/2p3p1/2P5/1P3N1P/P2PPPP1/RQBKRN1B w EAea - 1 9", 3, 28732 }, + { "rqbkrnn1/pp2ppbp/3p4/2p3p1/2P5/1P3N1P/P2PPPP1/RQBKRN1B w EAea - 1 9", 4, 908740 }, + { "rqbkrnn1/pp2ppbp/3p4/2p3p1/2P5/1P3N1P/P2PPPP1/RQBKRN1B w EAea - 1 9", 5, 28761841 }, + { "rqbkrnn1/pp2ppbp/3p4/2p3p1/2P5/1P3N1P/P2PPPP1/RQBKRN1B w EAea - 1 9", 6, 907579129 }, + { "rbqkb1nn/1ppppr1p/p5p1/5p2/1P6/2P4P/P1KPPPP1/RBQ1BRNN w a - 1 9", 1, 22 }, + { "rbqkb1nn/1ppppr1p/p5p1/5p2/1P6/2P4P/P1KPPPP1/RBQ1BRNN w a - 1 9", 2, 441 }, + { "rbqkb1nn/1ppppr1p/p5p1/5p2/1P6/2P4P/P1KPPPP1/RBQ1BRNN w a - 1 9", 3, 10403 }, + { "rbqkb1nn/1ppppr1p/p5p1/5p2/1P6/2P4P/P1KPPPP1/RBQ1BRNN w a - 1 9", 4, 231273 }, + { "rbqkb1nn/1ppppr1p/p5p1/5p2/1P6/2P4P/P1KPPPP1/RBQ1BRNN w a - 1 9", 5, 5784206 }, + { "rbqkb1nn/1ppppr1p/p5p1/5p2/1P6/2P4P/P1KPPPP1/RBQ1BRNN w a - 1 9", 6, 140934555 }, + { "rqkb1rnn/1pp1pp1p/p5p1/1b1p4/3P4/P5P1/RPP1PP1P/1QKBBRNN w Ffa - 1 9", 1, 21 }, + { "rqkb1rnn/1pp1pp1p/p5p1/1b1p4/3P4/P5P1/RPP1PP1P/1QKBBRNN w Ffa - 1 9", 2, 505 }, + { "rqkb1rnn/1pp1pp1p/p5p1/1b1p4/3P4/P5P1/RPP1PP1P/1QKBBRNN w Ffa - 1 9", 3, 11592 }, + { "rqkb1rnn/1pp1pp1p/p5p1/1b1p4/3P4/P5P1/RPP1PP1P/1QKBBRNN w Ffa - 1 9", 4, 290897 }, + { "rqkb1rnn/1pp1pp1p/p5p1/1b1p4/3P4/P5P1/RPP1PP1P/1QKBBRNN w Ffa - 1 9", 5, 7147063 }, + { "rqkb1rnn/1pp1pp1p/p5p1/1b1p4/3P4/P5P1/RPP1PP1P/1QKBBRNN w Ffa - 1 9", 6, 188559137 }, + { "rq1rbbnn/pkp1ppp1/3p3p/1p2N1P1/8/8/PPPPPP1P/RQKRBB1N w DA - 0 9", 1, 27 }, + { "rq1rbbnn/pkp1ppp1/3p3p/1p2N1P1/8/8/PPPPPP1P/RQKRBB1N w DA - 0 9", 2, 608 }, + { "rq1rbbnn/pkp1ppp1/3p3p/1p2N1P1/8/8/PPPPPP1P/RQKRBB1N w DA - 0 9", 3, 16419 }, + { "rq1rbbnn/pkp1ppp1/3p3p/1p2N1P1/8/8/PPPPPP1P/RQKRBB1N w DA - 0 9", 4, 387751 }, + { "rq1rbbnn/pkp1ppp1/3p3p/1p2N1P1/8/8/PPPPPP1P/RQKRBB1N w DA - 0 9", 5, 10808908 }, + { "rq1rbbnn/pkp1ppp1/3p3p/1p2N1P1/8/8/PPPPPP1P/RQKRBB1N w DA - 0 9", 6, 268393274 }, + { "rqkrb2b/p2ppppp/2p3nn/1p6/5P2/PP1P4/2P1P1PP/RQKRBNNB w DAda - 1 9", 1, 30 }, + { "rqkrb2b/p2ppppp/2p3nn/1p6/5P2/PP1P4/2P1P1PP/RQKRBNNB w DAda - 1 9", 2, 749 }, + { "rqkrb2b/p2ppppp/2p3nn/1p6/5P2/PP1P4/2P1P1PP/RQKRBNNB w DAda - 1 9", 3, 21563 }, + { "rqkrb2b/p2ppppp/2p3nn/1p6/5P2/PP1P4/2P1P1PP/RQKRBNNB w DAda - 1 9", 4, 581531 }, + { "rqkrb2b/p2ppppp/2p3nn/1p6/5P2/PP1P4/2P1P1PP/RQKRBNNB w DAda - 1 9", 5, 16916813 }, + { "rqkrb2b/p2ppppp/2p3nn/1p6/5P2/PP1P4/2P1P1PP/RQKRBNNB w DAda - 1 9", 6, 485406712 }, + { "rbqkr1bn/pp1ppp2/2p1n2p/6p1/8/4BPNP/PPPPP1P1/RBQKRN2 w EAea - 0 9", 1, 23 }, + { "rbqkr1bn/pp1ppp2/2p1n2p/6p1/8/4BPNP/PPPPP1P1/RBQKRN2 w EAea - 0 9", 2, 600 }, + { "rbqkr1bn/pp1ppp2/2p1n2p/6p1/8/4BPNP/PPPPP1P1/RBQKRN2 w EAea - 0 9", 3, 15082 }, + { "rbqkr1bn/pp1ppp2/2p1n2p/6p1/8/4BPNP/PPPPP1P1/RBQKRN2 w EAea - 0 9", 4, 410057 }, + { "rbqkr1bn/pp1ppp2/2p1n2p/6p1/8/4BPNP/PPPPP1P1/RBQKRN2 w EAea - 0 9", 5, 11041820 }, + { "rbqkr1bn/pp1ppp2/2p1n2p/6p1/8/4BPNP/PPPPP1P1/RBQKRN2 w EAea - 0 9", 6, 314327867 }, + { "rqkbrnb1/2ppp1pp/pp3pn1/8/5P2/B2P4/PPP1P1PP/RQKBRN1N w EAea - 2 9", 1, 22 }, + { "rqkbrnb1/2ppp1pp/pp3pn1/8/5P2/B2P4/PPP1P1PP/RQKBRN1N w EAea - 2 9", 2, 569 }, + { "rqkbrnb1/2ppp1pp/pp3pn1/8/5P2/B2P4/PPP1P1PP/RQKBRN1N w EAea - 2 9", 3, 13541 }, + { "rqkbrnb1/2ppp1pp/pp3pn1/8/5P2/B2P4/PPP1P1PP/RQKBRN1N w EAea - 2 9", 4, 371471 }, + { "rqkbrnb1/2ppp1pp/pp3pn1/8/5P2/B2P4/PPP1P1PP/RQKBRN1N w EAea - 2 9", 5, 9395816 }, + { "rqkbrnb1/2ppp1pp/pp3pn1/8/5P2/B2P4/PPP1P1PP/RQKBRN1N w EAea - 2 9", 6, 269460607 }, + { "rqkrnbb1/p1p1pppp/1p4n1/3p4/7P/P3P3/1PPPBPP1/RQKRN1BN w DAda - 0 9", 1, 27 }, + { "rqkrnbb1/p1p1pppp/1p4n1/3p4/7P/P3P3/1PPPBPP1/RQKRN1BN w DAda - 0 9", 2, 579 }, + { "rqkrnbb1/p1p1pppp/1p4n1/3p4/7P/P3P3/1PPPBPP1/RQKRN1BN w DAda - 0 9", 3, 15565 }, + { "rqkrnbb1/p1p1pppp/1p4n1/3p4/7P/P3P3/1PPPBPP1/RQKRN1BN w DAda - 0 9", 4, 373079 }, + { "rqkrnbb1/p1p1pppp/1p4n1/3p4/7P/P3P3/1PPPBPP1/RQKRN1BN w DAda - 0 9", 5, 10238486 }, + { "rqkrnbb1/p1p1pppp/1p4n1/3p4/7P/P3P3/1PPPBPP1/RQKRN1BN w DAda - 0 9", 6, 266047417 }, + { "rqkrn1bb/p1ppp1pp/4n3/1p6/6p1/4N3/PPPPPPPP/RQKR2BB w DAda - 0 9", 1, 20 }, + { "rqkrn1bb/p1ppp1pp/4n3/1p6/6p1/4N3/PPPPPPPP/RQKR2BB w DAda - 0 9", 2, 462 }, + { "rqkrn1bb/p1ppp1pp/4n3/1p6/6p1/4N3/PPPPPPPP/RQKR2BB w DAda - 0 9", 3, 10234 }, + { "rqkrn1bb/p1ppp1pp/4n3/1p6/6p1/4N3/PPPPPPPP/RQKR2BB w DAda - 0 9", 4, 274162 }, + { "rqkrn1bb/p1ppp1pp/4n3/1p6/6p1/4N3/PPPPPPPP/RQKR2BB w DAda - 0 9", 5, 6563859 }, + { "rqkrn1bb/p1ppp1pp/4n3/1p6/6p1/4N3/PPPPPPPP/RQKR2BB w DAda - 0 9", 6, 193376359 }, + { "bbrkqr2/pppp1ppp/6nn/8/2P1p3/3PP2N/PP3PPP/BBRKQR1N w FCfc - 0 9", 1, 28 }, + { "bbrkqr2/pppp1ppp/6nn/8/2P1p3/3PP2N/PP3PPP/BBRKQR1N w FCfc - 0 9", 2, 724 }, + { "bbrkqr2/pppp1ppp/6nn/8/2P1p3/3PP2N/PP3PPP/BBRKQR1N w FCfc - 0 9", 3, 21688 }, + { "bbrkqr2/pppp1ppp/6nn/8/2P1p3/3PP2N/PP3PPP/BBRKQR1N w FCfc - 0 9", 4, 619064 }, + { "bbrkqr2/pppp1ppp/6nn/8/2P1p3/3PP2N/PP3PPP/BBRKQR1N w FCfc - 0 9", 5, 19318355 }, + { "bbrkqr2/pppp1ppp/6nn/8/2P1p3/3PP2N/PP3PPP/BBRKQR1N w FCfc - 0 9", 6, 593204629 }, + { "brk1qrnn/1pppbppp/4p3/8/1p6/P1P4P/3PPPP1/BRKBQRNN w FBfb - 1 9", 1, 24 }, + { "brk1qrnn/1pppbppp/4p3/8/1p6/P1P4P/3PPPP1/BRKBQRNN w FBfb - 1 9", 2, 662 }, + { "brk1qrnn/1pppbppp/4p3/8/1p6/P1P4P/3PPPP1/BRKBQRNN w FBfb - 1 9", 3, 16920 }, + { "brk1qrnn/1pppbppp/4p3/8/1p6/P1P4P/3PPPP1/BRKBQRNN w FBfb - 1 9", 4, 468215 }, + { "brk1qrnn/1pppbppp/4p3/8/1p6/P1P4P/3PPPP1/BRKBQRNN w FBfb - 1 9", 5, 12610387 }, + { "brk1qrnn/1pppbppp/4p3/8/1p6/P1P4P/3PPPP1/BRKBQRNN w FBfb - 1 9", 6, 355969349 }, + { "1r1qrbnn/p1pkpppp/1p1p4/8/3P1PP1/P4b2/1PP1P2P/BRKQRBNN w EB - 1 9", 1, 22 }, + { "1r1qrbnn/p1pkpppp/1p1p4/8/3P1PP1/P4b2/1PP1P2P/BRKQRBNN w EB - 1 9", 2, 696 }, + { "1r1qrbnn/p1pkpppp/1p1p4/8/3P1PP1/P4b2/1PP1P2P/BRKQRBNN w EB - 1 9", 3, 17021 }, + { "1r1qrbnn/p1pkpppp/1p1p4/8/3P1PP1/P4b2/1PP1P2P/BRKQRBNN w EB - 1 9", 4, 510247 }, + { "1r1qrbnn/p1pkpppp/1p1p4/8/3P1PP1/P4b2/1PP1P2P/BRKQRBNN w EB - 1 9", 5, 13697382 }, + { "1r1qrbnn/p1pkpppp/1p1p4/8/3P1PP1/P4b2/1PP1P2P/BRKQRBNN w EB - 1 9", 6, 401903030 }, + { "1rkqrnnb/p1p1p1pp/1p1p4/3b1p1N/4P3/5N2/PPPP1PPP/BRKQR2B w EBeb - 1 9", 1, 29 }, + { "1rkqrnnb/p1p1p1pp/1p1p4/3b1p1N/4P3/5N2/PPPP1PPP/BRKQR2B w EBeb - 1 9", 2, 887 }, + { "1rkqrnnb/p1p1p1pp/1p1p4/3b1p1N/4P3/5N2/PPPP1PPP/BRKQR2B w EBeb - 1 9", 3, 27035 }, + { "1rkqrnnb/p1p1p1pp/1p1p4/3b1p1N/4P3/5N2/PPPP1PPP/BRKQR2B w EBeb - 1 9", 4, 816176 }, + { "1rkqrnnb/p1p1p1pp/1p1p4/3b1p1N/4P3/5N2/PPPP1PPP/BRKQR2B w EBeb - 1 9", 5, 26051242 }, + { "1rkqrnnb/p1p1p1pp/1p1p4/3b1p1N/4P3/5N2/PPPP1PPP/BRKQR2B w EBeb - 1 9", 6, 791718847 }, + { "rbbkq1rn/pppppppp/7n/8/P7/3P3P/1PPKPPP1/RBB1QRNN w a - 3 9", 1, 22 }, + { "rbbkq1rn/pppppppp/7n/8/P7/3P3P/1PPKPPP1/RBB1QRNN w a - 3 9", 2, 417 }, + { "rbbkq1rn/pppppppp/7n/8/P7/3P3P/1PPKPPP1/RBB1QRNN w a - 3 9", 3, 9900 }, + { "rbbkq1rn/pppppppp/7n/8/P7/3P3P/1PPKPPP1/RBB1QRNN w a - 3 9", 4, 216855 }, + { "rbbkq1rn/pppppppp/7n/8/P7/3P3P/1PPKPPP1/RBB1QRNN w a - 3 9", 5, 5505063 }, + { "rbbkq1rn/pppppppp/7n/8/P7/3P3P/1PPKPPP1/RBB1QRNN w a - 3 9", 6, 134818483 }, + { "rkbbqr1n/1p1pppp1/2p2n2/p4NBp/8/3P4/PPP1PPPP/RK1BQRN1 w FAfa - 0 9", 1, 37 }, + { "rkbbqr1n/1p1pppp1/2p2n2/p4NBp/8/3P4/PPP1PPPP/RK1BQRN1 w FAfa - 0 9", 2, 832 }, + { "rkbbqr1n/1p1pppp1/2p2n2/p4NBp/8/3P4/PPP1PPPP/RK1BQRN1 w FAfa - 0 9", 3, 30533 }, + { "rkbbqr1n/1p1pppp1/2p2n2/p4NBp/8/3P4/PPP1PPPP/RK1BQRN1 w FAfa - 0 9", 4, 728154 }, + { "rkbbqr1n/1p1pppp1/2p2n2/p4NBp/8/3P4/PPP1PPPP/RK1BQRN1 w FAfa - 0 9", 5, 26676373 }, + { "rkbbqr1n/1p1pppp1/2p2n2/p4NBp/8/3P4/PPP1PPPP/RK1BQRN1 w FAfa - 0 9", 6, 673756141 }, + { "rkbqrb1n/3pBppp/ppp2n2/8/8/P2P4/1PP1PPPP/RK1QRBNN w EAea - 0 9", 1, 28 }, + { "rkbqrb1n/3pBppp/ppp2n2/8/8/P2P4/1PP1PPPP/RK1QRBNN w EAea - 0 9", 2, 685 }, + { "rkbqrb1n/3pBppp/ppp2n2/8/8/P2P4/1PP1PPPP/RK1QRBNN w EAea - 0 9", 3, 19718 }, + { "rkbqrb1n/3pBppp/ppp2n2/8/8/P2P4/1PP1PPPP/RK1QRBNN w EAea - 0 9", 4, 543069 }, + { "rkbqrb1n/3pBppp/ppp2n2/8/8/P2P4/1PP1PPPP/RK1QRBNN w EAea - 0 9", 5, 16033316 }, + { "rkbqrb1n/3pBppp/ppp2n2/8/8/P2P4/1PP1PPPP/RK1QRBNN w EAea - 0 9", 6, 482288814 }, + { "rkb1rn1b/ppppqppp/4p3/8/1P2n1P1/5Q2/P1PP1P1P/RKB1RNNB w EAea - 2 9", 1, 37 }, + { "rkb1rn1b/ppppqppp/4p3/8/1P2n1P1/5Q2/P1PP1P1P/RKB1RNNB w EAea - 2 9", 2, 1158 }, + { "rkb1rn1b/ppppqppp/4p3/8/1P2n1P1/5Q2/P1PP1P1P/RKB1RNNB w EAea - 2 9", 3, 40114 }, + { "rkb1rn1b/ppppqppp/4p3/8/1P2n1P1/5Q2/P1PP1P1P/RKB1RNNB w EAea - 2 9", 4, 1234768 }, + { "rkb1rn1b/ppppqppp/4p3/8/1P2n1P1/5Q2/P1PP1P1P/RKB1RNNB w EAea - 2 9", 5, 44672979 }, + { "rkb1rn1b/ppppqppp/4p3/8/1P2n1P1/5Q2/P1PP1P1P/RKB1RNNB w EAea - 2 9", 6, 1389312729 }, + { "r1kqbrnn/pp1pp1p1/7p/2P2p2/5b2/3P4/P1P1P1PP/RBKQBRNN w FAfa - 0 9", 1, 5 }, + { "r1kqbrnn/pp1pp1p1/7p/2P2p2/5b2/3P4/P1P1P1PP/RBKQBRNN w FAfa - 0 9", 2, 161 }, + { "r1kqbrnn/pp1pp1p1/7p/2P2p2/5b2/3P4/P1P1P1PP/RBKQBRNN w FAfa - 0 9", 3, 4745 }, + { "r1kqbrnn/pp1pp1p1/7p/2P2p2/5b2/3P4/P1P1P1PP/RBKQBRNN w FAfa - 0 9", 4, 154885 }, + { "r1kqbrnn/pp1pp1p1/7p/2P2p2/5b2/3P4/P1P1P1PP/RBKQBRNN w FAfa - 0 9", 5, 4734999 }, + { "r1kqbrnn/pp1pp1p1/7p/2P2p2/5b2/3P4/P1P1P1PP/RBKQBRNN w FAfa - 0 9", 6, 157499039 }, + { "rkqbbr1n/ppp1ppp1/8/Q2p3p/4n3/3P1P2/PPP1P1PP/RK1BBRNN w FAfa - 2 9", 1, 38 }, + { "rkqbbr1n/ppp1ppp1/8/Q2p3p/4n3/3P1P2/PPP1P1PP/RK1BBRNN w FAfa - 2 9", 2, 1144 }, + { "rkqbbr1n/ppp1ppp1/8/Q2p3p/4n3/3P1P2/PPP1P1PP/RK1BBRNN w FAfa - 2 9", 3, 40433 }, + { "rkqbbr1n/ppp1ppp1/8/Q2p3p/4n3/3P1P2/PPP1P1PP/RK1BBRNN w FAfa - 2 9", 4, 1236877 }, + { "rkqbbr1n/ppp1ppp1/8/Q2p3p/4n3/3P1P2/PPP1P1PP/RK1BBRNN w FAfa - 2 9", 5, 43832975 }, + { "rkqbbr1n/ppp1ppp1/8/Q2p3p/4n3/3P1P2/PPP1P1PP/RK1BBRNN w FAfa - 2 9", 6, 1366087771 }, + { "rkqrbbn1/p1ppppp1/Bp5p/8/P6n/2P1P3/1P1P1PPP/RKQRB1NN w DAda - 0 9", 1, 28 }, + { "rkqrbbn1/p1ppppp1/Bp5p/8/P6n/2P1P3/1P1P1PPP/RKQRB1NN w DAda - 0 9", 2, 551 }, + { "rkqrbbn1/p1ppppp1/Bp5p/8/P6n/2P1P3/1P1P1PPP/RKQRB1NN w DAda - 0 9", 3, 15488 }, + { "rkqrbbn1/p1ppppp1/Bp5p/8/P6n/2P1P3/1P1P1PPP/RKQRB1NN w DAda - 0 9", 4, 350861 }, + { "rkqrbbn1/p1ppppp1/Bp5p/8/P6n/2P1P3/1P1P1PPP/RKQRB1NN w DAda - 0 9", 5, 9944107 }, + { "rkqrbbn1/p1ppppp1/Bp5p/8/P6n/2P1P3/1P1P1PPP/RKQRB1NN w DAda - 0 9", 6, 251179183 }, + { "rkqrb1nb/1ppp1ppp/p7/4p3/5n2/3P2N1/PPPQPPPP/RK1RB1NB w DAda - 0 9", 1, 26 }, + { "rkqrb1nb/1ppp1ppp/p7/4p3/5n2/3P2N1/PPPQPPPP/RK1RB1NB w DAda - 0 9", 2, 690 }, + { "rkqrb1nb/1ppp1ppp/p7/4p3/5n2/3P2N1/PPPQPPPP/RK1RB1NB w DAda - 0 9", 3, 19877 }, + { "rkqrb1nb/1ppp1ppp/p7/4p3/5n2/3P2N1/PPPQPPPP/RK1RB1NB w DAda - 0 9", 4, 513628 }, + { "rkqrb1nb/1ppp1ppp/p7/4p3/5n2/3P2N1/PPPQPPPP/RK1RB1NB w DAda - 0 9", 5, 15965907 }, + { "rkqrb1nb/1ppp1ppp/p7/4p3/5n2/3P2N1/PPPQPPPP/RK1RB1NB w DAda - 0 9", 6, 418191735 }, + { "rbkqrnbn/pppp1p2/4p1p1/7p/7P/P2P4/BPP1PPP1/R1KQRNBN w EAea - 0 9", 1, 27 }, + { "rbkqrnbn/pppp1p2/4p1p1/7p/7P/P2P4/BPP1PPP1/R1KQRNBN w EAea - 0 9", 2, 515 }, + { "rbkqrnbn/pppp1p2/4p1p1/7p/7P/P2P4/BPP1PPP1/R1KQRNBN w EAea - 0 9", 3, 13992 }, + { "rbkqrnbn/pppp1p2/4p1p1/7p/7P/P2P4/BPP1PPP1/R1KQRNBN w EAea - 0 9", 4, 309727 }, + { "rbkqrnbn/pppp1p2/4p1p1/7p/7P/P2P4/BPP1PPP1/R1KQRNBN w EAea - 0 9", 5, 8792550 }, + { "rbkqrnbn/pppp1p2/4p1p1/7p/7P/P2P4/BPP1PPP1/R1KQRNBN w EAea - 0 9", 6, 218658292 }, + { "rkqbrnbn/pp1ppp2/8/2p3p1/P1P4p/5P2/1PKPP1PP/R1QBRNBN w ea - 0 9", 1, 27 }, + { "rkqbrnbn/pp1ppp2/8/2p3p1/P1P4p/5P2/1PKPP1PP/R1QBRNBN w ea - 0 9", 2, 627 }, + { "rkqbrnbn/pp1ppp2/8/2p3p1/P1P4p/5P2/1PKPP1PP/R1QBRNBN w ea - 0 9", 3, 16843 }, + { "rkqbrnbn/pp1ppp2/8/2p3p1/P1P4p/5P2/1PKPP1PP/R1QBRNBN w ea - 0 9", 4, 431101 }, + { "rkqbrnbn/pp1ppp2/8/2p3p1/P1P4p/5P2/1PKPP1PP/R1QBRNBN w ea - 0 9", 5, 11978698 }, + { "rkqbrnbn/pp1ppp2/8/2p3p1/P1P4p/5P2/1PKPP1PP/R1QBRNBN w ea - 0 9", 6, 328434174 }, + { "rkqrnbbn/1p2pp1p/3p2p1/p1p5/P5PP/3N4/1PPPPP2/RKQR1BBN w DAda - 0 9", 1, 23 }, + { "rkqrnbbn/1p2pp1p/3p2p1/p1p5/P5PP/3N4/1PPPPP2/RKQR1BBN w DAda - 0 9", 2, 624 }, + { "rkqrnbbn/1p2pp1p/3p2p1/p1p5/P5PP/3N4/1PPPPP2/RKQR1BBN w DAda - 0 9", 3, 15512 }, + { "rkqrnbbn/1p2pp1p/3p2p1/p1p5/P5PP/3N4/1PPPPP2/RKQR1BBN w DAda - 0 9", 4, 451860 }, + { "rkqrnbbn/1p2pp1p/3p2p1/p1p5/P5PP/3N4/1PPPPP2/RKQR1BBN w DAda - 0 9", 5, 11960861 }, + { "rkqrnbbn/1p2pp1p/3p2p1/p1p5/P5PP/3N4/1PPPPP2/RKQR1BBN w DAda - 0 9", 6, 367311176 }, + { "rk2rnbb/ppqppppp/2pn4/8/1P3P2/6P1/P1PPP1NP/RKQR1NBB w DAa - 1 9", 1, 27 }, + { "rk2rnbb/ppqppppp/2pn4/8/1P3P2/6P1/P1PPP1NP/RKQR1NBB w DAa - 1 9", 2, 727 }, + { "rk2rnbb/ppqppppp/2pn4/8/1P3P2/6P1/P1PPP1NP/RKQR1NBB w DAa - 1 9", 3, 20206 }, + { "rk2rnbb/ppqppppp/2pn4/8/1P3P2/6P1/P1PPP1NP/RKQR1NBB w DAa - 1 9", 4, 581003 }, + { "rk2rnbb/ppqppppp/2pn4/8/1P3P2/6P1/P1PPP1NP/RKQR1NBB w DAa - 1 9", 5, 16633696 }, + { "rk2rnbb/ppqppppp/2pn4/8/1P3P2/6P1/P1PPP1NP/RKQR1NBB w DAa - 1 9", 6, 505212747 }, + { "b1krrqnn/pp1ppp1p/2p3p1/8/P3Pb1P/1P6/2PP1PP1/BBRKRQNN w EC - 0 9", 1, 32 }, + { "b1krrqnn/pp1ppp1p/2p3p1/8/P3Pb1P/1P6/2PP1PP1/BBRKRQNN w EC - 0 9", 2, 943 }, + { "b1krrqnn/pp1ppp1p/2p3p1/8/P3Pb1P/1P6/2PP1PP1/BBRKRQNN w EC - 0 9", 3, 30759 }, + { "b1krrqnn/pp1ppp1p/2p3p1/8/P3Pb1P/1P6/2PP1PP1/BBRKRQNN w EC - 0 9", 4, 865229 }, + { "b1krrqnn/pp1ppp1p/2p3p1/8/P3Pb1P/1P6/2PP1PP1/BBRKRQNN w EC - 0 9", 5, 28672582 }, + { "b1krrqnn/pp1ppp1p/2p3p1/8/P3Pb1P/1P6/2PP1PP1/BBRKRQNN w EC - 0 9", 6, 800922511 }, + { "1rkbrqnn/p1pp1ppp/1p6/8/P2Pp3/8/1PPKPPQP/BR1BR1NN w eb - 0 9", 1, 28 }, + { "1rkbrqnn/p1pp1ppp/1p6/8/P2Pp3/8/1PPKPPQP/BR1BR1NN w eb - 0 9", 2, 916 }, + { "1rkbrqnn/p1pp1ppp/1p6/8/P2Pp3/8/1PPKPPQP/BR1BR1NN w eb - 0 9", 3, 24892 }, + { "1rkbrqnn/p1pp1ppp/1p6/8/P2Pp3/8/1PPKPPQP/BR1BR1NN w eb - 0 9", 4, 817624 }, + { "1rkbrqnn/p1pp1ppp/1p6/8/P2Pp3/8/1PPKPPQP/BR1BR1NN w eb - 0 9", 5, 22840279 }, + { "1rkbrqnn/p1pp1ppp/1p6/8/P2Pp3/8/1PPKPPQP/BR1BR1NN w eb - 0 9", 6, 759318058 }, + { "brkrqb1n/1pppp1pp/p7/3n1p2/P5P1/3PP3/1PP2P1P/BRKRQBNN w DBdb - 0 9", 1, 27 }, + { "brkrqb1n/1pppp1pp/p7/3n1p2/P5P1/3PP3/1PP2P1P/BRKRQBNN w DBdb - 0 9", 2, 669 }, + { "brkrqb1n/1pppp1pp/p7/3n1p2/P5P1/3PP3/1PP2P1P/BRKRQBNN w DBdb - 0 9", 3, 18682 }, + { "brkrqb1n/1pppp1pp/p7/3n1p2/P5P1/3PP3/1PP2P1P/BRKRQBNN w DBdb - 0 9", 4, 484259 }, + { "brkrqb1n/1pppp1pp/p7/3n1p2/P5P1/3PP3/1PP2P1P/BRKRQBNN w DBdb - 0 9", 5, 13956472 }, + { "brkrqb1n/1pppp1pp/p7/3n1p2/P5P1/3PP3/1PP2P1P/BRKRQBNN w DBdb - 0 9", 6, 380267099 }, + { "brkrqnnb/3pppp1/1p6/p1p4p/2P3P1/6N1/PP1PPP1P/BRKRQ1NB w DBdb - 0 9", 1, 29 }, + { "brkrqnnb/3pppp1/1p6/p1p4p/2P3P1/6N1/PP1PPP1P/BRKRQ1NB w DBdb - 0 9", 2, 699 }, + { "brkrqnnb/3pppp1/1p6/p1p4p/2P3P1/6N1/PP1PPP1P/BRKRQ1NB w DBdb - 0 9", 3, 20042 }, + { "brkrqnnb/3pppp1/1p6/p1p4p/2P3P1/6N1/PP1PPP1P/BRKRQ1NB w DBdb - 0 9", 4, 512639 }, + { "brkrqnnb/3pppp1/1p6/p1p4p/2P3P1/6N1/PP1PPP1P/BRKRQ1NB w DBdb - 0 9", 5, 15093909 }, + { "brkrqnnb/3pppp1/1p6/p1p4p/2P3P1/6N1/PP1PPP1P/BRKRQ1NB w DBdb - 0 9", 6, 406594531 }, + { "r1bkrq1n/pp2pppp/3b1n2/2pp2B1/6P1/3P1P2/PPP1P2P/RB1KRQNN w EAea - 2 9", 1, 27 }, + { "r1bkrq1n/pp2pppp/3b1n2/2pp2B1/6P1/3P1P2/PPP1P2P/RB1KRQNN w EAea - 2 9", 2, 835 }, + { "r1bkrq1n/pp2pppp/3b1n2/2pp2B1/6P1/3P1P2/PPP1P2P/RB1KRQNN w EAea - 2 9", 3, 22848 }, + { "r1bkrq1n/pp2pppp/3b1n2/2pp2B1/6P1/3P1P2/PPP1P2P/RB1KRQNN w EAea - 2 9", 4, 713550 }, + { "r1bkrq1n/pp2pppp/3b1n2/2pp2B1/6P1/3P1P2/PPP1P2P/RB1KRQNN w EAea - 2 9", 5, 19867800 }, + { "r1bkrq1n/pp2pppp/3b1n2/2pp2B1/6P1/3P1P2/PPP1P2P/RB1KRQNN w EAea - 2 9", 6, 631209313 }, + { "rk1brq1n/p1p1pppp/3p1n2/1p3b2/4P3/2NQ4/PPPP1PPP/RKBBR2N w EAea - 4 9", 1, 36 }, + { "rk1brq1n/p1p1pppp/3p1n2/1p3b2/4P3/2NQ4/PPPP1PPP/RKBBR2N w EAea - 4 9", 2, 1004 }, + { "rk1brq1n/p1p1pppp/3p1n2/1p3b2/4P3/2NQ4/PPPP1PPP/RKBBR2N w EAea - 4 9", 3, 35774 }, + { "rk1brq1n/p1p1pppp/3p1n2/1p3b2/4P3/2NQ4/PPPP1PPP/RKBBR2N w EAea - 4 9", 4, 979608 }, + { "rk1brq1n/p1p1pppp/3p1n2/1p3b2/4P3/2NQ4/PPPP1PPP/RKBBR2N w EAea - 4 9", 5, 35143142 }, + { "rk1brq1n/p1p1pppp/3p1n2/1p3b2/4P3/2NQ4/PPPP1PPP/RKBBR2N w EAea - 4 9", 6, 966310885 }, + { "rkbrqbnn/1p2ppp1/B1p5/p2p3p/4P2P/8/PPPP1PP1/RKBRQ1NN w DAda - 0 9", 1, 27 }, + { "rkbrqbnn/1p2ppp1/B1p5/p2p3p/4P2P/8/PPPP1PP1/RKBRQ1NN w DAda - 0 9", 2, 748 }, + { "rkbrqbnn/1p2ppp1/B1p5/p2p3p/4P2P/8/PPPP1PP1/RKBRQ1NN w DAda - 0 9", 3, 21005 }, + { "rkbrqbnn/1p2ppp1/B1p5/p2p3p/4P2P/8/PPPP1PP1/RKBRQ1NN w DAda - 0 9", 4, 597819 }, + { "rkbrqbnn/1p2ppp1/B1p5/p2p3p/4P2P/8/PPPP1PP1/RKBRQ1NN w DAda - 0 9", 5, 17597073 }, + { "rkbrqbnn/1p2ppp1/B1p5/p2p3p/4P2P/8/PPPP1PP1/RKBRQ1NN w DAda - 0 9", 6, 515304215 }, + { "rkbrqn1b/pp1pp1pp/2p2p2/5n2/8/2P2P2/PP1PP1PP/RKBRQ1NB w DAda - 0 9", 1, 20 }, + { "rkbrqn1b/pp1pp1pp/2p2p2/5n2/8/2P2P2/PP1PP1PP/RKBRQ1NB w DAda - 0 9", 2, 479 }, + { "rkbrqn1b/pp1pp1pp/2p2p2/5n2/8/2P2P2/PP1PP1PP/RKBRQ1NB w DAda - 0 9", 3, 10485 }, + { "rkbrqn1b/pp1pp1pp/2p2p2/5n2/8/2P2P2/PP1PP1PP/RKBRQ1NB w DAda - 0 9", 4, 266446 }, + { "rkbrqn1b/pp1pp1pp/2p2p2/5n2/8/2P2P2/PP1PP1PP/RKBRQ1NB w DAda - 0 9", 5, 6253775 }, + { "rkbrqn1b/pp1pp1pp/2p2p2/5n2/8/2P2P2/PP1PP1PP/RKBRQ1NB w DAda - 0 9", 6, 167767913 }, + { "rbkrbnn1/ppppp1pp/5q2/5p2/5P2/P3P2N/1PPP2PP/RBKRBQ1N w DAda - 3 9", 1, 28 }, + { "rbkrbnn1/ppppp1pp/5q2/5p2/5P2/P3P2N/1PPP2PP/RBKRBQ1N w DAda - 3 9", 2, 947 }, + { "rbkrbnn1/ppppp1pp/5q2/5p2/5P2/P3P2N/1PPP2PP/RBKRBQ1N w DAda - 3 9", 3, 26900 }, + { "rbkrbnn1/ppppp1pp/5q2/5p2/5P2/P3P2N/1PPP2PP/RBKRBQ1N w DAda - 3 9", 4, 876068 }, + { "rbkrbnn1/ppppp1pp/5q2/5p2/5P2/P3P2N/1PPP2PP/RBKRBQ1N w DAda - 3 9", 5, 26007841 }, + { "rbkrbnn1/ppppp1pp/5q2/5p2/5P2/P3P2N/1PPP2PP/RBKRBQ1N w DAda - 3 9", 6, 838704143 }, + { "rkr1bqnn/1ppp1p1p/p5p1/4p3/3PP2b/2P2P2/PP4PP/RKRBBQNN w CAca - 0 9", 1, 31 }, + { "rkr1bqnn/1ppp1p1p/p5p1/4p3/3PP2b/2P2P2/PP4PP/RKRBBQNN w CAca - 0 9", 2, 1004 }, + { "rkr1bqnn/1ppp1p1p/p5p1/4p3/3PP2b/2P2P2/PP4PP/RKRBBQNN w CAca - 0 9", 3, 32006 }, + { "rkr1bqnn/1ppp1p1p/p5p1/4p3/3PP2b/2P2P2/PP4PP/RKRBBQNN w CAca - 0 9", 4, 1006830 }, + { "rkr1bqnn/1ppp1p1p/p5p1/4p3/3PP2b/2P2P2/PP4PP/RKRBBQNN w CAca - 0 9", 5, 32688124 }, + { "rkr1bqnn/1ppp1p1p/p5p1/4p3/3PP2b/2P2P2/PP4PP/RKRBBQNN w CAca - 0 9", 6, 1024529879 }, + { "rkrqbbnn/pppp3p/8/4ppp1/1PP4P/8/P2PPPP1/RKRQBBNN w CAca - 0 9", 1, 24 }, + { "rkrqbbnn/pppp3p/8/4ppp1/1PP4P/8/P2PPPP1/RKRQBBNN w CAca - 0 9", 2, 717 }, + { "rkrqbbnn/pppp3p/8/4ppp1/1PP4P/8/P2PPPP1/RKRQBBNN w CAca - 0 9", 3, 18834 }, + { "rkrqbbnn/pppp3p/8/4ppp1/1PP4P/8/P2PPPP1/RKRQBBNN w CAca - 0 9", 4, 564137 }, + { "rkrqbbnn/pppp3p/8/4ppp1/1PP4P/8/P2PPPP1/RKRQBBNN w CAca - 0 9", 5, 15844525 }, + { "rkrqbbnn/pppp3p/8/4ppp1/1PP4P/8/P2PPPP1/RKRQBBNN w CAca - 0 9", 6, 484884485 }, + { "rkrqbn1b/pppp2pp/8/4pp2/1P1P2n1/5N2/P1P1PP1P/RKRQBN1B w CAca - 0 9", 1, 25 }, + { "rkrqbn1b/pppp2pp/8/4pp2/1P1P2n1/5N2/P1P1PP1P/RKRQBN1B w CAca - 0 9", 2, 718 }, + { "rkrqbn1b/pppp2pp/8/4pp2/1P1P2n1/5N2/P1P1PP1P/RKRQBN1B w CAca - 0 9", 3, 19654 }, + { "rkrqbn1b/pppp2pp/8/4pp2/1P1P2n1/5N2/P1P1PP1P/RKRQBN1B w CAca - 0 9", 4, 587666 }, + { "rkrqbn1b/pppp2pp/8/4pp2/1P1P2n1/5N2/P1P1PP1P/RKRQBN1B w CAca - 0 9", 5, 17257753 }, + { "rkrqbn1b/pppp2pp/8/4pp2/1P1P2n1/5N2/P1P1PP1P/RKRQBN1B w CAca - 0 9", 6, 537354146 }, + { "rbkrqnbn/p1p1ppp1/1p1p4/8/3PP2p/2PB4/PP3PPP/R1KRQNBN w DAda - 0 9", 1, 30 }, + { "rbkrqnbn/p1p1ppp1/1p1p4/8/3PP2p/2PB4/PP3PPP/R1KRQNBN w DAda - 0 9", 2, 754 }, + { "rbkrqnbn/p1p1ppp1/1p1p4/8/3PP2p/2PB4/PP3PPP/R1KRQNBN w DAda - 0 9", 3, 23298 }, + { "rbkrqnbn/p1p1ppp1/1p1p4/8/3PP2p/2PB4/PP3PPP/R1KRQNBN w DAda - 0 9", 4, 611322 }, + { "rbkrqnbn/p1p1ppp1/1p1p4/8/3PP2p/2PB4/PP3PPP/R1KRQNBN w DAda - 0 9", 5, 19338246 }, + { "rbkrqnbn/p1p1ppp1/1p1p4/8/3PP2p/2PB4/PP3PPP/R1KRQNBN w DAda - 0 9", 6, 532603566 }, + { "1krbqnbn/1p2pppp/r1pp4/p7/8/1P1P2PP/P1P1PP2/RKRBQNBN w CAc - 0 9", 1, 21 }, + { "1krbqnbn/1p2pppp/r1pp4/p7/8/1P1P2PP/P1P1PP2/RKRBQNBN w CAc - 0 9", 2, 566 }, + { "1krbqnbn/1p2pppp/r1pp4/p7/8/1P1P2PP/P1P1PP2/RKRBQNBN w CAc - 0 9", 3, 13519 }, + { "1krbqnbn/1p2pppp/r1pp4/p7/8/1P1P2PP/P1P1PP2/RKRBQNBN w CAc - 0 9", 4, 375128 }, + { "1krbqnbn/1p2pppp/r1pp4/p7/8/1P1P2PP/P1P1PP2/RKRBQNBN w CAc - 0 9", 5, 9700847 }, + { "1krbqnbn/1p2pppp/r1pp4/p7/8/1P1P2PP/P1P1PP2/RKRBQNBN w CAc - 0 9", 6, 279864836 }, + { "rkrq1b2/pppppppb/3n2np/2N5/4P3/7P/PPPP1PP1/RKRQ1BBN w CAca - 1 9", 1, 33 }, + { "rkrq1b2/pppppppb/3n2np/2N5/4P3/7P/PPPP1PP1/RKRQ1BBN w CAca - 1 9", 2, 654 }, + { "rkrq1b2/pppppppb/3n2np/2N5/4P3/7P/PPPP1PP1/RKRQ1BBN w CAca - 1 9", 3, 21708 }, + { "rkrq1b2/pppppppb/3n2np/2N5/4P3/7P/PPPP1PP1/RKRQ1BBN w CAca - 1 9", 4, 479678 }, + { "rkrq1b2/pppppppb/3n2np/2N5/4P3/7P/PPPP1PP1/RKRQ1BBN w CAca - 1 9", 5, 15990307 }, + { "rkrq1b2/pppppppb/3n2np/2N5/4P3/7P/PPPP1PP1/RKRQ1BBN w CAca - 1 9", 6, 382218272 }, + { "rkr1nnbb/ppp2p1p/3p1qp1/4p3/P5P1/3PN3/1PP1PP1P/RKRQN1BB w CAca - 1 9", 1, 28 }, + { "rkr1nnbb/ppp2p1p/3p1qp1/4p3/P5P1/3PN3/1PP1PP1P/RKRQN1BB w CAca - 1 9", 2, 715 }, + { "rkr1nnbb/ppp2p1p/3p1qp1/4p3/P5P1/3PN3/1PP1PP1P/RKRQN1BB w CAca - 1 9", 3, 20361 }, + { "rkr1nnbb/ppp2p1p/3p1qp1/4p3/P5P1/3PN3/1PP1PP1P/RKRQN1BB w CAca - 1 9", 4, 555328 }, + { "rkr1nnbb/ppp2p1p/3p1qp1/4p3/P5P1/3PN3/1PP1PP1P/RKRQN1BB w CAca - 1 9", 5, 16303092 }, + { "rkr1nnbb/ppp2p1p/3p1qp1/4p3/P5P1/3PN3/1PP1PP1P/RKRQN1BB w CAca - 1 9", 6, 468666425 }, + { "bbrkrnqn/1p1ppppp/8/8/p2pP3/PP6/2P2PPP/BBRKRNQN w ECec - 0 9", 1, 24 }, + { "bbrkrnqn/1p1ppppp/8/8/p2pP3/PP6/2P2PPP/BBRKRNQN w ECec - 0 9", 2, 757 }, + { "bbrkrnqn/1p1ppppp/8/8/p2pP3/PP6/2P2PPP/BBRKRNQN w ECec - 0 9", 3, 19067 }, + { "bbrkrnqn/1p1ppppp/8/8/p2pP3/PP6/2P2PPP/BBRKRNQN w ECec - 0 9", 4, 603231 }, + { "bbrkrnqn/1p1ppppp/8/8/p2pP3/PP6/2P2PPP/BBRKRNQN w ECec - 0 9", 5, 15957628 }, + { "bbrkrnqn/1p1ppppp/8/8/p2pP3/PP6/2P2PPP/BBRKRNQN w ECec - 0 9", 6, 509307623 }, + { "brkbrnqn/ppp2p2/4p3/P2p2pp/6P1/5P2/1PPPP2P/BRKBRNQN w EBeb - 0 9", 1, 25 }, + { "brkbrnqn/ppp2p2/4p3/P2p2pp/6P1/5P2/1PPPP2P/BRKBRNQN w EBeb - 0 9", 2, 548 }, + { "brkbrnqn/ppp2p2/4p3/P2p2pp/6P1/5P2/1PPPP2P/BRKBRNQN w EBeb - 0 9", 3, 14563 }, + { "brkbrnqn/ppp2p2/4p3/P2p2pp/6P1/5P2/1PPPP2P/BRKBRNQN w EBeb - 0 9", 4, 348259 }, + { "brkbrnqn/ppp2p2/4p3/P2p2pp/6P1/5P2/1PPPP2P/BRKBRNQN w EBeb - 0 9", 5, 9688526 }, + { "brkbrnqn/ppp2p2/4p3/P2p2pp/6P1/5P2/1PPPP2P/BRKBRNQN w EBeb - 0 9", 6, 247750144 }, + { "brkr1bqn/1pppppp1/3n3p/1p6/P7/4P1P1/1PPP1P1P/BRKRN1QN w DBdb - 0 9", 1, 19 }, + { "brkr1bqn/1pppppp1/3n3p/1p6/P7/4P1P1/1PPP1P1P/BRKRN1QN w DBdb - 0 9", 2, 359 }, + { "brkr1bqn/1pppppp1/3n3p/1p6/P7/4P1P1/1PPP1P1P/BRKRN1QN w DBdb - 0 9", 3, 7430 }, + { "brkr1bqn/1pppppp1/3n3p/1p6/P7/4P1P1/1PPP1P1P/BRKRN1QN w DBdb - 0 9", 4, 157099 }, + { "brkr1bqn/1pppppp1/3n3p/1p6/P7/4P1P1/1PPP1P1P/BRKRN1QN w DBdb - 0 9", 5, 3521652 }, + { "brkr1bqn/1pppppp1/3n3p/1p6/P7/4P1P1/1PPP1P1P/BRKRN1QN w DBdb - 0 9", 6, 81787718 }, + { "brkr1qnb/pppp2pp/2B1p3/5p2/2n5/6PP/PPPPPPN1/BRKR1QN1 w DBdb - 1 9", 1, 27 }, + { "brkr1qnb/pppp2pp/2B1p3/5p2/2n5/6PP/PPPPPPN1/BRKR1QN1 w DBdb - 1 9", 2, 854 }, + { "brkr1qnb/pppp2pp/2B1p3/5p2/2n5/6PP/PPPPPPN1/BRKR1QN1 w DBdb - 1 9", 3, 23303 }, + { "brkr1qnb/pppp2pp/2B1p3/5p2/2n5/6PP/PPPPPPN1/BRKR1QN1 w DBdb - 1 9", 4, 741626 }, + { "brkr1qnb/pppp2pp/2B1p3/5p2/2n5/6PP/PPPPPPN1/BRKR1QN1 w DBdb - 1 9", 5, 20558538 }, + { "brkr1qnb/pppp2pp/2B1p3/5p2/2n5/6PP/PPPPPPN1/BRKR1QN1 w DBdb - 1 9", 6, 667089231 }, + { "rbbkrnqn/p1p1p1pp/8/1p1p4/1P1Pp3/6N1/P1P2PPP/RBBKRNQ1 w EAea - 0 9", 1, 28 }, + { "rbbkrnqn/p1p1p1pp/8/1p1p4/1P1Pp3/6N1/P1P2PPP/RBBKRNQ1 w EAea - 0 9", 2, 723 }, + { "rbbkrnqn/p1p1p1pp/8/1p1p4/1P1Pp3/6N1/P1P2PPP/RBBKRNQ1 w EAea - 0 9", 3, 19844 }, + { "rbbkrnqn/p1p1p1pp/8/1p1p4/1P1Pp3/6N1/P1P2PPP/RBBKRNQ1 w EAea - 0 9", 4, 514440 }, + { "rbbkrnqn/p1p1p1pp/8/1p1p4/1P1Pp3/6N1/P1P2PPP/RBBKRNQ1 w EAea - 0 9", 5, 14621108 }, + { "rbbkrnqn/p1p1p1pp/8/1p1p4/1P1Pp3/6N1/P1P2PPP/RBBKRNQ1 w EAea - 0 9", 6, 397454100 }, + { "rkbbrn1n/pppppp2/5q1p/6p1/3P3P/4P3/PPP2PP1/RKBBRNQN w EAea - 1 9", 1, 25 }, + { "rkbbrn1n/pppppp2/5q1p/6p1/3P3P/4P3/PPP2PP1/RKBBRNQN w EAea - 1 9", 2, 741 }, + { "rkbbrn1n/pppppp2/5q1p/6p1/3P3P/4P3/PPP2PP1/RKBBRNQN w EAea - 1 9", 3, 19224 }, + { "rkbbrn1n/pppppp2/5q1p/6p1/3P3P/4P3/PPP2PP1/RKBBRNQN w EAea - 1 9", 4, 585198 }, + { "rkbbrn1n/pppppp2/5q1p/6p1/3P3P/4P3/PPP2PP1/RKBBRNQN w EAea - 1 9", 5, 15605840 }, + { "rkbbrn1n/pppppp2/5q1p/6p1/3P3P/4P3/PPP2PP1/RKBBRNQN w EAea - 1 9", 6, 485037906 }, + { "rkbr1bq1/ppnppppp/6n1/2p5/2P1N2P/8/PP1PPPP1/RKBRNBQ1 w DAda - 3 9", 1, 24 }, + { "rkbr1bq1/ppnppppp/6n1/2p5/2P1N2P/8/PP1PPPP1/RKBRNBQ1 w DAda - 3 9", 2, 547 }, + { "rkbr1bq1/ppnppppp/6n1/2p5/2P1N2P/8/PP1PPPP1/RKBRNBQ1 w DAda - 3 9", 3, 14359 }, + { "rkbr1bq1/ppnppppp/6n1/2p5/2P1N2P/8/PP1PPPP1/RKBRNBQ1 w DAda - 3 9", 4, 339497 }, + { "rkbr1bq1/ppnppppp/6n1/2p5/2P1N2P/8/PP1PPPP1/RKBRNBQ1 w DAda - 3 9", 5, 9410221 }, + { "rkbr1bq1/ppnppppp/6n1/2p5/2P1N2P/8/PP1PPPP1/RKBRNBQ1 w DAda - 3 9", 6, 234041078 }, + { "1kbrnqnb/r1ppppp1/8/pp5p/8/1P1NP3/P1PP1PPP/RKB1RQNB w Ad - 2 9", 1, 26 }, + { "1kbrnqnb/r1ppppp1/8/pp5p/8/1P1NP3/P1PP1PPP/RKB1RQNB w Ad - 2 9", 2, 618 }, + { "1kbrnqnb/r1ppppp1/8/pp5p/8/1P1NP3/P1PP1PPP/RKB1RQNB w Ad - 2 9", 3, 17305 }, + { "1kbrnqnb/r1ppppp1/8/pp5p/8/1P1NP3/P1PP1PPP/RKB1RQNB w Ad - 2 9", 4, 442643 }, + { "1kbrnqnb/r1ppppp1/8/pp5p/8/1P1NP3/P1PP1PPP/RKB1RQNB w Ad - 2 9", 5, 13112297 }, + { "1kbrnqnb/r1ppppp1/8/pp5p/8/1P1NP3/P1PP1PPP/RKB1RQNB w Ad - 2 9", 6, 357030697 }, + { "rbkrb1qn/1pp1ppp1/3pn2p/pP6/8/4N1P1/P1PPPP1P/RBKRB1QN w DAda - 0 9", 1, 21 }, + { "rbkrb1qn/1pp1ppp1/3pn2p/pP6/8/4N1P1/P1PPPP1P/RBKRB1QN w DAda - 0 9", 2, 544 }, + { "rbkrb1qn/1pp1ppp1/3pn2p/pP6/8/4N1P1/P1PPPP1P/RBKRB1QN w DAda - 0 9", 3, 12492 }, + { "rbkrb1qn/1pp1ppp1/3pn2p/pP6/8/4N1P1/P1PPPP1P/RBKRB1QN w DAda - 0 9", 4, 338832 }, + { "rbkrb1qn/1pp1ppp1/3pn2p/pP6/8/4N1P1/P1PPPP1P/RBKRB1QN w DAda - 0 9", 5, 8381483 }, + { "rbkrb1qn/1pp1ppp1/3pn2p/pP6/8/4N1P1/P1PPPP1P/RBKRB1QN w DAda - 0 9", 6, 236013157 }, + { "rkrbbnqn/ppppp3/5p2/6pp/5PBP/4P3/PPPP2P1/RKR1BNQN w CAca - 0 9", 1, 30 }, + { "rkrbbnqn/ppppp3/5p2/6pp/5PBP/4P3/PPPP2P1/RKR1BNQN w CAca - 0 9", 2, 891 }, + { "rkrbbnqn/ppppp3/5p2/6pp/5PBP/4P3/PPPP2P1/RKR1BNQN w CAca - 0 9", 3, 25435 }, + { "rkrbbnqn/ppppp3/5p2/6pp/5PBP/4P3/PPPP2P1/RKR1BNQN w CAca - 0 9", 4, 764356 }, + { "rkrbbnqn/ppppp3/5p2/6pp/5PBP/4P3/PPPP2P1/RKR1BNQN w CAca - 0 9", 5, 21894752 }, + { "rkrbbnqn/ppppp3/5p2/6pp/5PBP/4P3/PPPP2P1/RKR1BNQN w CAca - 0 9", 6, 669256602 }, + { "rkr1bb1n/ppppp1pp/5p2/4n3/3QP3/5P2/RPPP2PP/1KRNBB1N w Cca - 1 9", 1, 45 }, + { "rkr1bb1n/ppppp1pp/5p2/4n3/3QP3/5P2/RPPP2PP/1KRNBB1N w Cca - 1 9", 2, 1172 }, + { "rkr1bb1n/ppppp1pp/5p2/4n3/3QP3/5P2/RPPP2PP/1KRNBB1N w Cca - 1 9", 3, 51766 }, + { "rkr1bb1n/ppppp1pp/5p2/4n3/3QP3/5P2/RPPP2PP/1KRNBB1N w Cca - 1 9", 4, 1332060 }, + { "rkr1bb1n/ppppp1pp/5p2/4n3/3QP3/5P2/RPPP2PP/1KRNBB1N w Cca - 1 9", 5, 57856784 }, + { "rkr1bb1n/ppppp1pp/5p2/4n3/3QP3/5P2/RPPP2PP/1KRNBB1N w Cca - 1 9", 6, 1501852662 }, + { "rkr1bqnb/pp1ppppp/8/2pN4/1P6/5N2/P1PPnPPP/RKR1BQ1B w CAca - 0 9", 1, 28 }, + { "rkr1bqnb/pp1ppppp/8/2pN4/1P6/5N2/P1PPnPPP/RKR1BQ1B w CAca - 0 9", 2, 730 }, + { "rkr1bqnb/pp1ppppp/8/2pN4/1P6/5N2/P1PPnPPP/RKR1BQ1B w CAca - 0 9", 3, 20511 }, + { "rkr1bqnb/pp1ppppp/8/2pN4/1P6/5N2/P1PPnPPP/RKR1BQ1B w CAca - 0 9", 4, 559167 }, + { "rkr1bqnb/pp1ppppp/8/2pN4/1P6/5N2/P1PPnPPP/RKR1BQ1B w CAca - 0 9", 5, 16323242 }, + { "rkr1bqnb/pp1ppppp/8/2pN4/1P6/5N2/P1PPnPPP/RKR1BQ1B w CAca - 0 9", 6, 463032124 }, + { "rbkrnqb1/2ppppp1/p5np/1p6/8/3N4/PPPPPPPP/RBKRQNB1 w DAda - 2 9", 1, 20 }, + { "rbkrnqb1/2ppppp1/p5np/1p6/8/3N4/PPPPPPPP/RBKRQNB1 w DAda - 2 9", 2, 417 }, + { "rbkrnqb1/2ppppp1/p5np/1p6/8/3N4/PPPPPPPP/RBKRQNB1 w DAda - 2 9", 3, 9159 }, + { "rbkrnqb1/2ppppp1/p5np/1p6/8/3N4/PPPPPPPP/RBKRQNB1 w DAda - 2 9", 4, 217390 }, + { "rbkrnqb1/2ppppp1/p5np/1p6/8/3N4/PPPPPPPP/RBKRQNB1 w DAda - 2 9", 5, 5180716 }, + { "rbkrnqb1/2ppppp1/p5np/1p6/8/3N4/PPPPPPPP/RBKRQNB1 w DAda - 2 9", 6, 133936564 }, + { "rkrbnqb1/p1pppnpp/5p2/1p6/2P5/1P1P1N2/P3PPPP/RKRB1QBN w CAca - 0 9", 1, 25 }, + { "rkrbnqb1/p1pppnpp/5p2/1p6/2P5/1P1P1N2/P3PPPP/RKRB1QBN w CAca - 0 9", 2, 546 }, + { "rkrbnqb1/p1pppnpp/5p2/1p6/2P5/1P1P1N2/P3PPPP/RKRB1QBN w CAca - 0 9", 3, 14039 }, + { "rkrbnqb1/p1pppnpp/5p2/1p6/2P5/1P1P1N2/P3PPPP/RKRB1QBN w CAca - 0 9", 4, 330316 }, + { "rkrbnqb1/p1pppnpp/5p2/1p6/2P5/1P1P1N2/P3PPPP/RKRB1QBN w CAca - 0 9", 5, 8813781 }, + { "rkrbnqb1/p1pppnpp/5p2/1p6/2P5/1P1P1N2/P3PPPP/RKRB1QBN w CAca - 0 9", 6, 222026485 }, + { "rkr1qbbn/ppppppp1/4n3/7p/8/P7/KPPPPPPP/R1RNQBBN w ca - 0 9", 1, 22 }, + { "rkr1qbbn/ppppppp1/4n3/7p/8/P7/KPPPPPPP/R1RNQBBN w ca - 0 9", 2, 484 }, + { "rkr1qbbn/ppppppp1/4n3/7p/8/P7/KPPPPPPP/R1RNQBBN w ca - 0 9", 3, 11458 }, + { "rkr1qbbn/ppppppp1/4n3/7p/8/P7/KPPPPPPP/R1RNQBBN w ca - 0 9", 4, 267495 }, + { "rkr1qbbn/ppppppp1/4n3/7p/8/P7/KPPPPPPP/R1RNQBBN w ca - 0 9", 5, 6633319 }, + { "rkr1qbbn/ppppppp1/4n3/7p/8/P7/KPPPPPPP/R1RNQBBN w ca - 0 9", 6, 163291279 }, + { "rkrnqnb1/1ppppp2/p5p1/7p/8/P1bPP3/1PP1QPPP/RKRN1NBB w CAca - 0 9", 1, 22 }, + { "rkrnqnb1/1ppppp2/p5p1/7p/8/P1bPP3/1PP1QPPP/RKRN1NBB w CAca - 0 9", 2, 636 }, + { "rkrnqnb1/1ppppp2/p5p1/7p/8/P1bPP3/1PP1QPPP/RKRN1NBB w CAca - 0 9", 3, 15526 }, + { "rkrnqnb1/1ppppp2/p5p1/7p/8/P1bPP3/1PP1QPPP/RKRN1NBB w CAca - 0 9", 4, 441001 }, + { "rkrnqnb1/1ppppp2/p5p1/7p/8/P1bPP3/1PP1QPPP/RKRN1NBB w CAca - 0 9", 5, 11614241 }, + { "rkrnqnb1/1ppppp2/p5p1/7p/8/P1bPP3/1PP1QPPP/RKRN1NBB w CAca - 0 9", 6, 331083405 }, + { "b2krn1q/p1rppppp/1Q3n2/2p1b3/1P4P1/8/P1PPPP1P/BBRKRNN1 w ECe - 3 9", 1, 36 }, + { "b2krn1q/p1rppppp/1Q3n2/2p1b3/1P4P1/8/P1PPPP1P/BBRKRNN1 w ECe - 3 9", 2, 1192 }, + { "b2krn1q/p1rppppp/1Q3n2/2p1b3/1P4P1/8/P1PPPP1P/BBRKRNN1 w ECe - 3 9", 3, 42945 }, + { "b2krn1q/p1rppppp/1Q3n2/2p1b3/1P4P1/8/P1PPPP1P/BBRKRNN1 w ECe - 3 9", 4, 1406795 }, + { "b2krn1q/p1rppppp/1Q3n2/2p1b3/1P4P1/8/P1PPPP1P/BBRKRNN1 w ECe - 3 9", 5, 50382104 }, + { "b2krn1q/p1rppppp/1Q3n2/2p1b3/1P4P1/8/P1PPPP1P/BBRKRNN1 w ECe - 3 9", 6, 1650202838 }, + { "brkbrnn1/pp1pppp1/7q/2p5/6Pp/4P1NP/PPPP1P2/BRKBR1NQ w EBeb - 2 9", 1, 30 }, + { "brkbrnn1/pp1pppp1/7q/2p5/6Pp/4P1NP/PPPP1P2/BRKBR1NQ w EBeb - 2 9", 2, 978 }, + { "brkbrnn1/pp1pppp1/7q/2p5/6Pp/4P1NP/PPPP1P2/BRKBR1NQ w EBeb - 2 9", 3, 29593 }, + { "brkbrnn1/pp1pppp1/7q/2p5/6Pp/4P1NP/PPPP1P2/BRKBR1NQ w EBeb - 2 9", 4, 942398 }, + { "brkbrnn1/pp1pppp1/7q/2p5/6Pp/4P1NP/PPPP1P2/BRKBR1NQ w EBeb - 2 9", 5, 29205057 }, + { "brkbrnn1/pp1pppp1/7q/2p5/6Pp/4P1NP/PPPP1P2/BRKBR1NQ w EBeb - 2 9", 6, 936568065 }, + { "brkrnb1q/pp1p1ppp/2p1p3/5n2/1P6/5N1N/P1PPPPPP/BRKR1B1Q w DBdb - 1 9", 1, 31 }, + { "brkrnb1q/pp1p1ppp/2p1p3/5n2/1P6/5N1N/P1PPPPPP/BRKR1B1Q w DBdb - 1 9", 2, 897 }, + { "brkrnb1q/pp1p1ppp/2p1p3/5n2/1P6/5N1N/P1PPPPPP/BRKR1B1Q w DBdb - 1 9", 3, 27830 }, + { "brkrnb1q/pp1p1ppp/2p1p3/5n2/1P6/5N1N/P1PPPPPP/BRKR1B1Q w DBdb - 1 9", 4, 810187 }, + { "brkrnb1q/pp1p1ppp/2p1p3/5n2/1P6/5N1N/P1PPPPPP/BRKR1B1Q w DBdb - 1 9", 5, 25423729 }, + { "brkrnb1q/pp1p1ppp/2p1p3/5n2/1P6/5N1N/P1PPPPPP/BRKR1B1Q w DBdb - 1 9", 6, 755334868 }, + { "brkr1nqb/pp1p1pp1/2pn3p/P3p3/4P3/6P1/1PPP1P1P/BRKRNNQB w DBdb - 0 9", 1, 19 }, + { "brkr1nqb/pp1p1pp1/2pn3p/P3p3/4P3/6P1/1PPP1P1P/BRKRNNQB w DBdb - 0 9", 2, 382 }, + { "brkr1nqb/pp1p1pp1/2pn3p/P3p3/4P3/6P1/1PPP1P1P/BRKRNNQB w DBdb - 0 9", 3, 8052 }, + { "brkr1nqb/pp1p1pp1/2pn3p/P3p3/4P3/6P1/1PPP1P1P/BRKRNNQB w DBdb - 0 9", 4, 182292 }, + { "brkr1nqb/pp1p1pp1/2pn3p/P3p3/4P3/6P1/1PPP1P1P/BRKRNNQB w DBdb - 0 9", 5, 4232274 }, + { "brkr1nqb/pp1p1pp1/2pn3p/P3p3/4P3/6P1/1PPP1P1P/BRKRNNQB w DBdb - 0 9", 6, 103537333 }, + { "r1bkrn1q/ppbppppp/5n2/2p5/3P4/P6N/1PP1PPPP/RBBKRNQ1 w EAea - 3 9", 1, 27 }, + { "r1bkrn1q/ppbppppp/5n2/2p5/3P4/P6N/1PP1PPPP/RBBKRNQ1 w EAea - 3 9", 2, 822 }, + { "r1bkrn1q/ppbppppp/5n2/2p5/3P4/P6N/1PP1PPPP/RBBKRNQ1 w EAea - 3 9", 3, 22551 }, + { "r1bkrn1q/ppbppppp/5n2/2p5/3P4/P6N/1PP1PPPP/RBBKRNQ1 w EAea - 3 9", 4, 678880 }, + { "r1bkrn1q/ppbppppp/5n2/2p5/3P4/P6N/1PP1PPPP/RBBKRNQ1 w EAea - 3 9", 5, 19115128 }, + { "r1bkrn1q/ppbppppp/5n2/2p5/3P4/P6N/1PP1PPPP/RBBKRNQ1 w EAea - 3 9", 6, 578210135 }, + { "rkbbrnnq/pp2pppp/8/2pp4/P1P5/1P3P2/3PP1PP/RKBBRNNQ w EAea - 1 9", 1, 23 }, + { "rkbbrnnq/pp2pppp/8/2pp4/P1P5/1P3P2/3PP1PP/RKBBRNNQ w EAea - 1 9", 2, 643 }, + { "rkbbrnnq/pp2pppp/8/2pp4/P1P5/1P3P2/3PP1PP/RKBBRNNQ w EAea - 1 9", 3, 15410 }, + { "rkbbrnnq/pp2pppp/8/2pp4/P1P5/1P3P2/3PP1PP/RKBBRNNQ w EAea - 1 9", 4, 442070 }, + { "rkbbrnnq/pp2pppp/8/2pp4/P1P5/1P3P2/3PP1PP/RKBBRNNQ w EAea - 1 9", 5, 11170489 }, + { "rkbbrnnq/pp2pppp/8/2pp4/P1P5/1P3P2/3PP1PP/RKBBRNNQ w EAea - 1 9", 6, 329615708 }, + { "rkbr1b1q/p1pppppp/1p1n4/7n/5QP1/3N4/PPPPPP1P/RKBR1BN1 w DAda - 4 9", 1, 37 }, + { "rkbr1b1q/p1pppppp/1p1n4/7n/5QP1/3N4/PPPPPP1P/RKBR1BN1 w DAda - 4 9", 2, 943 }, + { "rkbr1b1q/p1pppppp/1p1n4/7n/5QP1/3N4/PPPPPP1P/RKBR1BN1 w DAda - 4 9", 3, 34382 }, + { "rkbr1b1q/p1pppppp/1p1n4/7n/5QP1/3N4/PPPPPP1P/RKBR1BN1 w DAda - 4 9", 4, 880474 }, + { "rkbr1b1q/p1pppppp/1p1n4/7n/5QP1/3N4/PPPPPP1P/RKBR1BN1 w DAda - 4 9", 5, 31568111 }, + { "rkbr1b1q/p1pppppp/1p1n4/7n/5QP1/3N4/PPPPPP1P/RKBR1BN1 w DAda - 4 9", 6, 842265141 }, + { "rkbr1nqb/pppp2np/8/4ppp1/1P6/6N1/P1PPPPPP/RKBRN1QB w DAda - 1 9", 1, 23 }, + { "rkbr1nqb/pppp2np/8/4ppp1/1P6/6N1/P1PPPPPP/RKBRN1QB w DAda - 1 9", 2, 574 }, + { "rkbr1nqb/pppp2np/8/4ppp1/1P6/6N1/P1PPPPPP/RKBRN1QB w DAda - 1 9", 3, 13260 }, + { "rkbr1nqb/pppp2np/8/4ppp1/1P6/6N1/P1PPPPPP/RKBRN1QB w DAda - 1 9", 4, 362306 }, + { "rkbr1nqb/pppp2np/8/4ppp1/1P6/6N1/P1PPPPPP/RKBRN1QB w DAda - 1 9", 5, 9020291 }, + { "rkbr1nqb/pppp2np/8/4ppp1/1P6/6N1/P1PPPPPP/RKBRN1QB w DAda - 1 9", 6, 261247606 }, + { "rbkr1nnq/p1p1pp1p/1p4p1/3p4/b3P3/4N3/PPPPNPPP/RBKRB1Q1 w DAda - 0 9", 1, 26 }, + { "rbkr1nnq/p1p1pp1p/1p4p1/3p4/b3P3/4N3/PPPPNPPP/RBKRB1Q1 w DAda - 0 9", 2, 900 }, + { "rbkr1nnq/p1p1pp1p/1p4p1/3p4/b3P3/4N3/PPPPNPPP/RBKRB1Q1 w DAda - 0 9", 3, 23414 }, + { "rbkr1nnq/p1p1pp1p/1p4p1/3p4/b3P3/4N3/PPPPNPPP/RBKRB1Q1 w DAda - 0 9", 4, 805006 }, + { "rbkr1nnq/p1p1pp1p/1p4p1/3p4/b3P3/4N3/PPPPNPPP/RBKRB1Q1 w DAda - 0 9", 5, 21653203 }, + { "rbkr1nnq/p1p1pp1p/1p4p1/3p4/b3P3/4N3/PPPPNPPP/RBKRB1Q1 w DAda - 0 9", 6, 745802405 }, + { "rkrbb1nq/p2pppp1/1p4n1/2p4p/3N4/4P1P1/PPPP1P1P/RKRBBN1Q w CAca - 0 9", 1, 32 }, + { "rkrbb1nq/p2pppp1/1p4n1/2p4p/3N4/4P1P1/PPPP1P1P/RKRBBN1Q w CAca - 0 9", 2, 697 }, + { "rkrbb1nq/p2pppp1/1p4n1/2p4p/3N4/4P1P1/PPPP1P1P/RKRBBN1Q w CAca - 0 9", 3, 22231 }, + { "rkrbb1nq/p2pppp1/1p4n1/2p4p/3N4/4P1P1/PPPP1P1P/RKRBBN1Q w CAca - 0 9", 4, 531121 }, + { "rkrbb1nq/p2pppp1/1p4n1/2p4p/3N4/4P1P1/PPPP1P1P/RKRBBN1Q w CAca - 0 9", 5, 17150175 }, + { "rkrbb1nq/p2pppp1/1p4n1/2p4p/3N4/4P1P1/PPPP1P1P/RKRBBN1Q w CAca - 0 9", 6, 441578567 }, + { "rkrnbb1q/pp2pp1p/6pn/2pp4/2B1P2P/8/PPPP1PP1/RKRNB1NQ w CAca - 0 9", 1, 28 }, + { "rkrnbb1q/pp2pp1p/6pn/2pp4/2B1P2P/8/PPPP1PP1/RKRNB1NQ w CAca - 0 9", 2, 854 }, + { "rkrnbb1q/pp2pp1p/6pn/2pp4/2B1P2P/8/PPPP1PP1/RKRNB1NQ w CAca - 0 9", 3, 23853 }, + { "rkrnbb1q/pp2pp1p/6pn/2pp4/2B1P2P/8/PPPP1PP1/RKRNB1NQ w CAca - 0 9", 4, 755990 }, + { "rkrnbb1q/pp2pp1p/6pn/2pp4/2B1P2P/8/PPPP1PP1/RKRNB1NQ w CAca - 0 9", 5, 21823412 }, + { "rkrnbb1q/pp2pp1p/6pn/2pp4/2B1P2P/8/PPPP1PP1/RKRNB1NQ w CAca - 0 9", 6, 712787248 }, + { "rk2bnqb/pprpppp1/4n2p/2p5/P7/3P2NP/1PP1PPP1/RKRNB1QB w CAa - 1 9", 1, 26 }, + { "rk2bnqb/pprpppp1/4n2p/2p5/P7/3P2NP/1PP1PPP1/RKRNB1QB w CAa - 1 9", 2, 596 }, + { "rk2bnqb/pprpppp1/4n2p/2p5/P7/3P2NP/1PP1PPP1/RKRNB1QB w CAa - 1 9", 3, 16251 }, + { "rk2bnqb/pprpppp1/4n2p/2p5/P7/3P2NP/1PP1PPP1/RKRNB1QB w CAa - 1 9", 4, 414862 }, + { "rk2bnqb/pprpppp1/4n2p/2p5/P7/3P2NP/1PP1PPP1/RKRNB1QB w CAa - 1 9", 5, 11758184 }, + { "rk2bnqb/pprpppp1/4n2p/2p5/P7/3P2NP/1PP1PPP1/RKRNB1QB w CAa - 1 9", 6, 323043654 }, + { "r1krnnbq/pp1ppp1p/6p1/2p5/2P5/P3P3/Rb1P1PPP/1BKRNNBQ w Dda - 0 9", 1, 2 }, + { "r1krnnbq/pp1ppp1p/6p1/2p5/2P5/P3P3/Rb1P1PPP/1BKRNNBQ w Dda - 0 9", 2, 61 }, + { "r1krnnbq/pp1ppp1p/6p1/2p5/2P5/P3P3/Rb1P1PPP/1BKRNNBQ w Dda - 0 9", 3, 1312 }, + { "r1krnnbq/pp1ppp1p/6p1/2p5/2P5/P3P3/Rb1P1PPP/1BKRNNBQ w Dda - 0 9", 4, 40072 }, + { "r1krnnbq/pp1ppp1p/6p1/2p5/2P5/P3P3/Rb1P1PPP/1BKRNNBQ w Dda - 0 9", 5, 937188 }, + { "r1krnnbq/pp1ppp1p/6p1/2p5/2P5/P3P3/Rb1P1PPP/1BKRNNBQ w Dda - 0 9", 6, 28753562 }, + { "1krbnnbq/1pp1p1pp/r7/p2p1p2/3PP3/2P3P1/PP3P1P/RKRBNNBQ w CAc - 0 9", 1, 30 }, + { "1krbnnbq/1pp1p1pp/r7/p2p1p2/3PP3/2P3P1/PP3P1P/RKRBNNBQ w CAc - 0 9", 2, 953 }, + { "1krbnnbq/1pp1p1pp/r7/p2p1p2/3PP3/2P3P1/PP3P1P/RKRBNNBQ w CAc - 0 9", 3, 28033 }, + { "1krbnnbq/1pp1p1pp/r7/p2p1p2/3PP3/2P3P1/PP3P1P/RKRBNNBQ w CAc - 0 9", 4, 860530 }, + { "1krbnnbq/1pp1p1pp/r7/p2p1p2/3PP3/2P3P1/PP3P1P/RKRBNNBQ w CAc - 0 9", 5, 25531358 }, + { "1krbnnbq/1pp1p1pp/r7/p2p1p2/3PP3/2P3P1/PP3P1P/RKRBNNBQ w CAc - 0 9", 6, 787205262 }, + { "rkr1nbbq/2ppp1pp/1pn5/p4p2/P6P/3P4/1PP1PPPB/RKRNNB1Q w CAca - 1 9", 1, 24 }, + { "rkr1nbbq/2ppp1pp/1pn5/p4p2/P6P/3P4/1PP1PPPB/RKRNNB1Q w CAca - 1 9", 2, 645 }, + { "rkr1nbbq/2ppp1pp/1pn5/p4p2/P6P/3P4/1PP1PPPB/RKRNNB1Q w CAca - 1 9", 3, 15689 }, + { "rkr1nbbq/2ppp1pp/1pn5/p4p2/P6P/3P4/1PP1PPPB/RKRNNB1Q w CAca - 1 9", 4, 446423 }, + { "rkr1nbbq/2ppp1pp/1pn5/p4p2/P6P/3P4/1PP1PPPB/RKRNNB1Q w CAca - 1 9", 5, 11484012 }, + { "rkr1nbbq/2ppp1pp/1pn5/p4p2/P6P/3P4/1PP1PPPB/RKRNNB1Q w CAca - 1 9", 6, 341262639 }, + { "rkrnnqbb/p1ppp2p/Qp6/4Pp2/5p2/8/PPPP2PP/RKRNN1BB w CAca - 0 9", 1, 35 }, + { "rkrnnqbb/p1ppp2p/Qp6/4Pp2/5p2/8/PPPP2PP/RKRNN1BB w CAca - 0 9", 2, 929 }, + { "rkrnnqbb/p1ppp2p/Qp6/4Pp2/5p2/8/PPPP2PP/RKRNN1BB w CAca - 0 9", 3, 32020 }, + { "rkrnnqbb/p1ppp2p/Qp6/4Pp2/5p2/8/PPPP2PP/RKRNN1BB w CAca - 0 9", 4, 896130 }, + { "rkrnnqbb/p1ppp2p/Qp6/4Pp2/5p2/8/PPPP2PP/RKRNN1BB w CAca - 0 9", 5, 31272517 }, + { "rkrnnqbb/p1ppp2p/Qp6/4Pp2/5p2/8/PPPP2PP/RKRNN1BB w CAca - 0 9", 6, 915268405 }, + { "bbq1nr1r/pppppk1p/2n2p2/6p1/P4P2/4P1P1/1PPP3P/BBQNNRKR w HF - 1 9", 1, 23 }, + { "bbq1nr1r/pppppk1p/2n2p2/6p1/P4P2/4P1P1/1PPP3P/BBQNNRKR w HF - 1 9", 2, 589 }, + { "bbq1nr1r/pppppk1p/2n2p2/6p1/P4P2/4P1P1/1PPP3P/BBQNNRKR w HF - 1 9", 3, 14744 }, + { "bbq1nr1r/pppppk1p/2n2p2/6p1/P4P2/4P1P1/1PPP3P/BBQNNRKR w HF - 1 9", 4, 387556 }, + { "bbq1nr1r/pppppk1p/2n2p2/6p1/P4P2/4P1P1/1PPP3P/BBQNNRKR w HF - 1 9", 5, 10316716 }, + { "bbq1nr1r/pppppk1p/2n2p2/6p1/P4P2/4P1P1/1PPP3P/BBQNNRKR w HF - 1 9", 6, 280056112 }, + }; + check_perfts(tests); +}*/ int main(int argc, char **argv) { doctest::Context ctx; ctx.setOption("success", true); From 7793a16350f954b2bdd9a802b10abe8c4b834dbc Mon Sep 17 00:00:00 2001 From: winapiadmin Date: Fri, 6 Feb 2026 12:20:51 +0700 Subject: [PATCH 2/7] convert crlf to lf and more --- .github/workflows/clang-format.yml | 14 +- .gitignore | 3 +- CMakeLists.txt | 115 +- attacks.h | 586 ++++++----- bitboard.h | 218 ++-- non_core_tests.cpp | 14 - position.cpp | 1568 ++++++++++++++-------------- position.h | 1351 ++++++++++++------------ printers.cpp | 21 +- printers.h | 9 +- tests.cpp | 8 +- types.h | 886 ++++++++-------- 12 files changed, 2454 insertions(+), 2339 deletions(-) diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml index d6f0949..6899404 100644 --- a/.github/workflows/clang-format.yml +++ b/.github/workflows/clang-format.yml @@ -3,11 +3,10 @@ name: clang-format on: pull_request: branches: [ "main" ] + push: + jobs: format: - if: > - github.event.workflow_run.conclusion == 'success' && - github.event.workflow_run.event == 'pull_request' runs-on: ubuntu-latest permissions: contents: write @@ -17,6 +16,10 @@ jobs: with: token: ${{ secrets.GITHUB_TOKEN }} + - name: Normalize line endings + run: | + git add --renormalize . + - name: Run clang-format run: | clang-format -i $(git ls-files '*.cpp' '*.hpp' '*.h' '*.c') @@ -25,8 +28,7 @@ jobs: run: | if ! git diff --quiet; then git config user.email "actions@github.com" - git.config user.name "GitHub Actions" - git add . - git commit -m "Apply clang-format" + git config user.name "GitHub Actions" + git commit -am "Normalize line endings and apply clang-format" git push fi diff --git a/.gitignore b/.gitignore index 1a01982..3824d88 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ build/ CMakePresets.json CMakeSettings.json *.s -.vscode \ No newline at end of file +.vscode +.cache \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b543ce..d5124e9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ project(chesslib LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) - +option(ENABLE_COVERAGE "Enable coverage reporting" OFF) # --- Compiler tuning --- if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") @@ -21,16 +21,21 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") -fconstexpr-steps=2000000000 -fconstexpr-depth=1024 -march=native -mtune=native - -ftemplate-backtrace-limit=0 + -ftemplate-backtrace-limit=0 -static ) endif() elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - add_compile_options(-fconstexpr-ops-limit=2000000000 -fconstexpr-depth=1024 -march=native -mtune=native -ftemplate-backtrace-limit=0) + add_compile_options(-fconstexpr-ops-limit=2000000000 -fconstexpr-depth=1024 -march=native -mtune=native -ftemplate-backtrace-limit=0 -static) + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set(ARCH_FLAG "/arch:AVX2" CACHE STRING "MSVC architecture flag (/arch:SSE2, /arch:AVX, /arch:AVX2, /arch:AVX512)") add_compile_options(/constexpr:steps2000000000 /constexpr:depth1024 ${ARCH_FLAG}) endif() +if(ENABLE_COVERAGE) + set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE) + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION OFF) +endif() add_compile_definitions(GENERATE_AT_RUNTIME) if(CMAKE_BUILD_TYPE MATCHES "Debug") add_compile_definitions(_DEBUG) @@ -63,4 +68,106 @@ target_include_directories(test_chess PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${doct target_link_libraries(NonImportantTests PRIVATE chesslib) target_include_directories(NonImportantTests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${doctest_SOURCE_DIR}) add_test(NAME test_core COMMAND test_chess) -add_test(NAME api_tests COMMAND NonImportantTests) \ No newline at end of file +add_test(NAME api_tests COMMAND NonImportantTests) +if(ENABLE_COVERAGE) + + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + foreach(t chesslib test_chess NonImportantTests) + target_compile_options(${t} PRIVATE + --coverage + -O0 + ) + target_link_options(${t} PRIVATE + --coverage + ) + endforeach() + + find_program(GCOVR gcovr REQUIRED) + + add_custom_target(coverage + COMMAND ${CMAKE_COMMAND} -E make_directory coverage + COMMAND ${CMAKE_CTEST_COMMAND} + COMMAND ${GCOVR} + -r ${CMAKE_SOURCE_DIR} + --html + --html-details + -o coverage/index.html + --exclude-directories tests + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Generating GCC coverage report" + ) + elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + foreach(t chesslib test_chess NonImportantTests) + target_compile_options(${t} PRIVATE + -fprofile-instr-generate + -fcoverage-mapping + -O0 + ) + target_link_options(${t} PRIVATE + -fprofile-instr-generate + ) + endforeach() + + if(WIN32) + + find_program(LLVM_PROFDATA llvm-profdata REQUIRED) + find_program(LLVM_COV llvm-cov REQUIRED) + + add_custom_target(coverage + COMMAND ${CMAKE_COMMAND} -E make_directory coverage + + COMMAND ${CMAKE_COMMAND} -E env + LLVM_PROFILE_FILE=coverage/coverage.profraw + CTEST_PARALLEL_LEVEL=1 + ${CMAKE_CTEST_COMMAND} + + COMMAND ${LLVM_PROFDATA} merge + -sparse + coverage/coverage.profraw + -o coverage/coverage.profdata + + COMMAND ${LLVM_COV} show + $ + $ + -instr-profile=coverage/coverage.profdata + -format=html + -output-dir=coverage + -ignore-filename-regex="tests|doctest" + -Xdemangler=llvm-cxxfilt + + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Generating Clang coverage report (Windows)" + ) + else() + + find_program(LLVM_PROFDATA llvm-profdata REQUIRED) + find_program(LLVM_COV llvm-cov REQUIRED) + + add_custom_target(coverage + COMMAND ${CMAKE_COMMAND} -E make_directory coverage + + COMMAND ${CMAKE_COMMAND} -E env + LLVM_PROFILE_FILE=coverage/%m.profraw + ${CMAKE_CTEST_COMMAND} + + COMMAND ${LLVM_PROFDATA} merge + -sparse + coverage + -o coverage/coverage.profdata + + COMMAND ${LLVM_COV} show + $ + $ + -instr-profile=coverage/coverage.profdata + -format=html + -output-dir=coverage + -ignore-filename-regex="tests|doctest" + -Xdemangler=c++filt + + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Generating Clang coverage report" + ) + endif() + endif() + +endif() \ No newline at end of file diff --git a/attacks.h b/attacks.h index 081b281..de5e176 100644 --- a/attacks.h +++ b/attacks.h @@ -1,294 +1,292 @@ -#pragma once -#include "fwd_decl.h" -#include "bitboard.h" -#include "types.h" -#include -#include -namespace chess::attacks { -// clang-format off - // pre-calculated lookup table for pawn attacks - constexpr Bitboard PawnAttacks[2][64] = { - // white pawn attacks - { 0x200, 0x500, 0xa00, 0x1400, - 0x2800, 0x5000, 0xa000, 0x4000, - 0x20000, 0x50000, 0xa0000, 0x140000, - 0x280000, 0x500000, 0xa00000, 0x400000, - 0x2000000, 0x5000000, 0xa000000, 0x14000000, - 0x28000000, 0x50000000, 0xa0000000, 0x40000000, - 0x200000000, 0x500000000, 0xa00000000, 0x1400000000, - 0x2800000000, 0x5000000000, 0xa000000000, 0x4000000000, - 0x20000000000, 0x50000000000, 0xa0000000000, 0x140000000000, - 0x280000000000, 0x500000000000, 0xa00000000000, 0x400000000000, - 0x2000000000000, 0x5000000000000, 0xa000000000000, 0x14000000000000, - 0x28000000000000, 0x50000000000000, 0xa0000000000000, 0x40000000000000, - 0x200000000000000, 0x500000000000000, 0xa00000000000000, 0x1400000000000000, - 0x2800000000000000, 0x5000000000000000, 0xa000000000000000, 0x4000000000000000, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0 }, - - // black pawn attacks - { 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x2, 0x5, 0xa, 0x14, - 0x28, 0x50, 0xa0, 0x40, - 0x200, 0x500, 0xa00, 0x1400, - 0x2800, 0x5000, 0xa000, 0x4000, - 0x20000, 0x50000, 0xa0000, 0x140000, - 0x280000, 0x500000, 0xa00000, 0x400000, - 0x2000000, 0x5000000, 0xa000000, 0x14000000, - 0x28000000, 0x50000000, 0xa0000000, 0x40000000, - 0x200000000, 0x500000000, 0xa00000000, 0x1400000000, - 0x2800000000, 0x5000000000, 0xa000000000, 0x4000000000, - 0x20000000000, 0x50000000000, 0xa0000000000, 0x140000000000, - 0x280000000000, 0x500000000000, 0xa00000000000, 0x400000000000, - 0x2000000000000, 0x5000000000000, 0xa000000000000, 0x14000000000000, - 0x28000000000000, 0x50000000000000, 0xa0000000000000, 0x40000000000000 - } - }; - - // pre-calculated lookup table for knight attacks - constexpr Bitboard KnightAttacks[64] = { - 0x0000000000020400, 0x0000000000050800, 0x00000000000A1100, 0x0000000000142200, - 0x0000000000284400, 0x0000000000508800, 0x0000000000A01000, 0x0000000000402000, - 0x0000000002040004, 0x0000000005080008, 0x000000000A110011, 0x0000000014220022, - 0x0000000028440044, 0x0000000050880088, 0x00000000A0100010, 0x0000000040200020, - 0x0000000204000402, 0x0000000508000805, 0x0000000A1100110A, 0x0000001422002214, - 0x0000002844004428, 0x0000005088008850, 0x000000A0100010A0, 0x0000004020002040, - 0x0000020400040200, 0x0000050800080500, 0x00000A1100110A00, 0x0000142200221400, - 0x0000284400442800, 0x0000508800885000, 0x0000A0100010A000, 0x0000402000204000, - 0x0002040004020000, 0x0005080008050000, 0x000A1100110A0000, 0x0014220022140000, - 0x0028440044280000, 0x0050880088500000, 0x00A0100010A00000, 0x0040200020400000, - 0x0204000402000000, 0x0508000805000000, 0x0A1100110A000000, 0x1422002214000000, - 0x2844004428000000, 0x5088008850000000, 0xA0100010A0000000, 0x4020002040000000, - 0x0400040200000000, 0x0800080500000000, 0x1100110A00000000, 0x2200221400000000, - 0x4400442800000000, 0x8800885000000000, 0x100010A000000000, 0x2000204000000000, - 0x0004020000000000, 0x0008050000000000, 0x00110A0000000000, 0x0022140000000000, - 0x0044280000000000, 0x0088500000000000, 0x0010A00000000000, 0x0020400000000000}; - - // pre-calculated lookup table for king attacks - constexpr Bitboard KingAttacks[64] = { - 0x0000000000000302, 0x0000000000000705, 0x0000000000000E0A, 0x0000000000001C14, - 0x0000000000003828, 0x0000000000007050, 0x000000000000E0A0, 0x000000000000C040, - 0x0000000000030203, 0x0000000000070507, 0x00000000000E0A0E, 0x00000000001C141C, - 0x0000000000382838, 0x0000000000705070, 0x0000000000E0A0E0, 0x0000000000C040C0, - 0x0000000003020300, 0x0000000007050700, 0x000000000E0A0E00, 0x000000001C141C00, - 0x0000000038283800, 0x0000000070507000, 0x00000000E0A0E000, 0x00000000C040C000, - 0x0000000302030000, 0x0000000705070000, 0x0000000E0A0E0000, 0x0000001C141C0000, - 0x0000003828380000, 0x0000007050700000, 0x000000E0A0E00000, 0x000000C040C00000, - 0x0000030203000000, 0x0000070507000000, 0x00000E0A0E000000, 0x00001C141C000000, - 0x0000382838000000, 0x0000705070000000, 0x0000E0A0E0000000, 0x0000C040C0000000, - 0x0003020300000000, 0x0007050700000000, 0x000E0A0E00000000, 0x001C141C00000000, - 0x0038283800000000, 0x0070507000000000, 0x00E0A0E000000000, 0x00C040C000000000, - 0x0302030000000000, 0x0705070000000000, 0x0E0A0E0000000000, 0x1C141C0000000000, - 0x3828380000000000, 0x7050700000000000, 0xE0A0E00000000000, 0xC040C00000000000, - 0x0203000000000000, 0x0507000000000000, 0x0A0E000000000000, 0x141C000000000000, - 0x2838000000000000, 0x5070000000000000, 0xA0E0000000000000, 0x40C0000000000000}; - constexpr Bitboard MASK_RANK[8] = { - 0xff, 0xff00, 0xff0000, 0xff000000, - 0xff00000000, 0xff0000000000, 0xff000000000000, 0xff00000000000000}; - - constexpr Bitboard MASK_FILE[8] = { - 0x101010101010101, 0x202020202020202, 0x404040404040404, 0x808080808080808, - 0x1010101010101010, 0x2020202020202020, 0x4040404040404040, 0x8080808080808080, - }; - extern const std::array BishopMagics; - extern const std::array RookMagics; -// clang-format on -#ifdef __BMI2__ -constexpr uint64_t software_pext_u64(uint64_t val, uint64_t mask) { - if (!is_constant_evaluated()) - return ~0ULL; - uint64_t result = 0; - uint64_t bit_position = 0; - - for (uint64_t bit = 1; bit != 0; bit <<= 1) { - if (mask & bit) { - if (val & bit) { - result |= 1ULL << bit_position; - } - ++bit_position; - } - } - return result; -} -struct Magic { - Bitboard mask; - int index; - constexpr Bitboard operator()(Bitboard b) const { - if (is_constant_evaluated()) { - return software_pext_u64(b, mask); - } else { - return _pext_u64(b, mask); - } - } -}; -#else -struct Magic { - Bitboard mask; - Bitboard magic; - int index; - Bitboard shift; - constexpr Bitboard operator()(Bitboard b) const { return (((b & mask)) * magic) >> shift; } -}; -#endif - -} // namespace chess::attacks -namespace chess::attacks { -extern const std::array RookTable; -extern const std::array RookAttacks; -extern const std::array BishopTable; -extern const std::array BishopAttacks; -/** - * @brief Shifts a bitboard in a given direction - * @tparam direction - * @param b - * @return - */ -template [[nodiscard]] static constexpr Bitboard shift(const Bitboard b) { - ASSUME(direction == NORTH || direction == EAST || direction == SOUTH || direction == WEST || direction == NORTH_EAST || - direction == SOUTH_EAST || direction == SOUTH_WEST || direction == NORTH_WEST); - switch (direction) { - case Direction::NORTH: - return b << 8; - case Direction::SOUTH: - return b >> 8; - case Direction::NORTH_WEST: - return (b & ~MASK_FILE[0]) << 7; - case Direction::WEST: - return (b & ~MASK_FILE[0]) >> 1; - case Direction::SOUTH_WEST: - return (b & ~MASK_FILE[0]) >> 9; - case Direction::NORTH_EAST: - return (b & ~MASK_FILE[7]) << 9; - case Direction::EAST: - return (b & ~MASK_FILE[7]) << 1; - case Direction::SOUTH_EAST: - return (b & ~MASK_FILE[7]) >> 7; - default: - UNREACHABLE(); - } -} - -/** - * @brief - * @tparam c - * @param pawns - * @return - */ -template [[nodiscard]] constexpr Bitboard pawnLeftAttacks(const Bitboard pawns) { - ASSUME(c == WHITE || c == BLACK); - return c == WHITE ? (pawns << 7) & ~MASK_FILE[7] : (pawns >> 7) & ~MASK_FILE[0]; -} - -/** - * @brief Generate the right side pawn attacks. - * @tparam c - * @param pawns - * @return - */ -template [[nodiscard]] constexpr Bitboard pawnRightAttacks(const Bitboard pawns) { - ASSUME(c == WHITE || c == BLACK); - return c == WHITE ? (pawns << 9) & ~MASK_FILE[0] : (pawns >> 9) & ~MASK_FILE[7]; -} - -/** - * @brief Generate the right side pawn attacks. - * @tparam c - * @param pawns - * @return - */ -template [[nodiscard]] constexpr Bitboard pawn(const Bitboard pawns) { - ASSUME(c == WHITE || c == BLACK); - if constexpr (c == WHITE) { - return ((pawns & ~MASK_FILE[FILE_A]) << 7) | // left captures - ((pawns & ~MASK_FILE[FILE_H]) << 9); // right captures - } else { - return ((pawns & ~MASK_FILE[FILE_H]) >> 7) | ((pawns & ~MASK_FILE[FILE_A]) >> 9); - } -} - -/** - * @brief Returns the pawn attacks for a given color and square - * @param c - * @param sq - * @return - */ -[[nodiscard]] constexpr Bitboard pawn(Color c, Square sq) { return PawnAttacks[(int)c][(int)sq]; } - -/** - * @brief Returns the knight attacks for a given square - * @param sq - * @return - */ -[[nodiscard]] constexpr Bitboard knight(Square sq) { return KnightAttacks[(int)sq]; } -/** - * @brief Returns the knight attacks for given knights - * @param sq - * @return - */ -[[nodiscard]] constexpr Bitboard knight(Bitboard knights) { - Bitboard l1 = (knights >> 1) & 0x7f7f7f7f7f7f7f7fULL; // shift left by 1, mask out file A - Bitboard l2 = (knights >> 2) & 0x3f3f3f3f3f3f3f3fULL; // shift left by 2, mask out files A+B - Bitboard r1 = (knights << 1) & 0xfefefefefefefefeULL; // shift right by 1, mask out file H - Bitboard r2 = (knights << 2) & 0xfcfcfcfcfcfcfcfcULL; // shift right by 2, mask out files G+H - Bitboard h1 = l1 | r1; // 1-square horizontal shifts - Bitboard h2 = l2 | r2; // 2-square horizontal shifts - return (h1 << 16) | (h1 >> 16) | (h2 << 8) | (h2 >> 8); // vertical shifts: +2,+1,-2,-1 -} - -/** - * @brief Returns the bishop attacks for a given square - * @param sq - * @param occupied - * @return - */ -[[nodiscard]] constexpr Bitboard bishop(Square sq, Bitboard occupied) { - return BishopAttacks[BishopTable[(int)sq].index + BishopTable[(int)sq](occupied)]; -} - -/** - * @brief Returns the rook attacks for a given square - * @param sq - * @param occupied - * @return - */ -[[nodiscard]] constexpr Bitboard rook(Square sq, Bitboard occupied) { - return RookAttacks[RookTable[(int)sq].index + RookTable[(int)sq](occupied)]; -} - -/** - * @brief Returns the queen attacks for a given square - * @param sq - * @param occupied - * @return - */ -[[nodiscard]] constexpr Bitboard queen(Square sq, Bitboard occupied) { return bishop(sq, occupied) | rook(sq, occupied); } - -/** - * @brief Returns the king attacks for a given square - * @param sq - * @return - */ -[[nodiscard]] constexpr Bitboard king(Square sq) { return KingAttacks[(int)sq]; } - -/** - * @brief Returns the slider attacks for a given square - * @param sq - * @param occupied - * @tparam pt - * @return - */ -template [[nodiscard]] constexpr Bitboard slider(Square sq, Bitboard occupied) { - static_assert(pt == PieceType::BISHOP || pt == PieceType::ROOK || pt == PieceType::QUEEN, "PieceType must be a slider!"); - - if constexpr (pt == PieceType::BISHOP) - return bishop(sq, occupied); - if constexpr (pt == PieceType::ROOK) - return rook(sq, occupied); - if constexpr (pt == PieceType::QUEEN) - return queen(sq, occupied); -} - - -} // namespace chess::attacks - +#pragma once +#include "bitboard.h" +#include "fwd_decl.h" +#include "types.h" +#include +#include +namespace chess::attacks { +// clang-format off + // pre-calculated lookup table for pawn attacks + constexpr Bitboard PawnAttacks[2][64] = { + // white pawn attacks + { 0x200, 0x500, 0xa00, 0x1400, + 0x2800, 0x5000, 0xa000, 0x4000, + 0x20000, 0x50000, 0xa0000, 0x140000, + 0x280000, 0x500000, 0xa00000, 0x400000, + 0x2000000, 0x5000000, 0xa000000, 0x14000000, + 0x28000000, 0x50000000, 0xa0000000, 0x40000000, + 0x200000000, 0x500000000, 0xa00000000, 0x1400000000, + 0x2800000000, 0x5000000000, 0xa000000000, 0x4000000000, + 0x20000000000, 0x50000000000, 0xa0000000000, 0x140000000000, + 0x280000000000, 0x500000000000, 0xa00000000000, 0x400000000000, + 0x2000000000000, 0x5000000000000, 0xa000000000000, 0x14000000000000, + 0x28000000000000, 0x50000000000000, 0xa0000000000000, 0x40000000000000, + 0x200000000000000, 0x500000000000000, 0xa00000000000000, 0x1400000000000000, + 0x2800000000000000, 0x5000000000000000, 0xa000000000000000, 0x4000000000000000, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0 }, + + // black pawn attacks + { 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x2, 0x5, 0xa, 0x14, + 0x28, 0x50, 0xa0, 0x40, + 0x200, 0x500, 0xa00, 0x1400, + 0x2800, 0x5000, 0xa000, 0x4000, + 0x20000, 0x50000, 0xa0000, 0x140000, + 0x280000, 0x500000, 0xa00000, 0x400000, + 0x2000000, 0x5000000, 0xa000000, 0x14000000, + 0x28000000, 0x50000000, 0xa0000000, 0x40000000, + 0x200000000, 0x500000000, 0xa00000000, 0x1400000000, + 0x2800000000, 0x5000000000, 0xa000000000, 0x4000000000, + 0x20000000000, 0x50000000000, 0xa0000000000, 0x140000000000, + 0x280000000000, 0x500000000000, 0xa00000000000, 0x400000000000, + 0x2000000000000, 0x5000000000000, 0xa000000000000, 0x14000000000000, + 0x28000000000000, 0x50000000000000, 0xa0000000000000, 0x40000000000000 + } + }; + + // pre-calculated lookup table for knight attacks + constexpr Bitboard KnightAttacks[64] = { + 0x0000000000020400, 0x0000000000050800, 0x00000000000A1100, 0x0000000000142200, + 0x0000000000284400, 0x0000000000508800, 0x0000000000A01000, 0x0000000000402000, + 0x0000000002040004, 0x0000000005080008, 0x000000000A110011, 0x0000000014220022, + 0x0000000028440044, 0x0000000050880088, 0x00000000A0100010, 0x0000000040200020, + 0x0000000204000402, 0x0000000508000805, 0x0000000A1100110A, 0x0000001422002214, + 0x0000002844004428, 0x0000005088008850, 0x000000A0100010A0, 0x0000004020002040, + 0x0000020400040200, 0x0000050800080500, 0x00000A1100110A00, 0x0000142200221400, + 0x0000284400442800, 0x0000508800885000, 0x0000A0100010A000, 0x0000402000204000, + 0x0002040004020000, 0x0005080008050000, 0x000A1100110A0000, 0x0014220022140000, + 0x0028440044280000, 0x0050880088500000, 0x00A0100010A00000, 0x0040200020400000, + 0x0204000402000000, 0x0508000805000000, 0x0A1100110A000000, 0x1422002214000000, + 0x2844004428000000, 0x5088008850000000, 0xA0100010A0000000, 0x4020002040000000, + 0x0400040200000000, 0x0800080500000000, 0x1100110A00000000, 0x2200221400000000, + 0x4400442800000000, 0x8800885000000000, 0x100010A000000000, 0x2000204000000000, + 0x0004020000000000, 0x0008050000000000, 0x00110A0000000000, 0x0022140000000000, + 0x0044280000000000, 0x0088500000000000, 0x0010A00000000000, 0x0020400000000000}; + + // pre-calculated lookup table for king attacks + constexpr Bitboard KingAttacks[64] = { + 0x0000000000000302, 0x0000000000000705, 0x0000000000000E0A, 0x0000000000001C14, + 0x0000000000003828, 0x0000000000007050, 0x000000000000E0A0, 0x000000000000C040, + 0x0000000000030203, 0x0000000000070507, 0x00000000000E0A0E, 0x00000000001C141C, + 0x0000000000382838, 0x0000000000705070, 0x0000000000E0A0E0, 0x0000000000C040C0, + 0x0000000003020300, 0x0000000007050700, 0x000000000E0A0E00, 0x000000001C141C00, + 0x0000000038283800, 0x0000000070507000, 0x00000000E0A0E000, 0x00000000C040C000, + 0x0000000302030000, 0x0000000705070000, 0x0000000E0A0E0000, 0x0000001C141C0000, + 0x0000003828380000, 0x0000007050700000, 0x000000E0A0E00000, 0x000000C040C00000, + 0x0000030203000000, 0x0000070507000000, 0x00000E0A0E000000, 0x00001C141C000000, + 0x0000382838000000, 0x0000705070000000, 0x0000E0A0E0000000, 0x0000C040C0000000, + 0x0003020300000000, 0x0007050700000000, 0x000E0A0E00000000, 0x001C141C00000000, + 0x0038283800000000, 0x0070507000000000, 0x00E0A0E000000000, 0x00C040C000000000, + 0x0302030000000000, 0x0705070000000000, 0x0E0A0E0000000000, 0x1C141C0000000000, + 0x3828380000000000, 0x7050700000000000, 0xE0A0E00000000000, 0xC040C00000000000, + 0x0203000000000000, 0x0507000000000000, 0x0A0E000000000000, 0x141C000000000000, + 0x2838000000000000, 0x5070000000000000, 0xA0E0000000000000, 0x40C0000000000000}; + constexpr Bitboard MASK_RANK[8] = { + 0xff, 0xff00, 0xff0000, 0xff000000, + 0xff00000000, 0xff0000000000, 0xff000000000000, 0xff00000000000000}; + + constexpr Bitboard MASK_FILE[8] = { + 0x101010101010101, 0x202020202020202, 0x404040404040404, 0x808080808080808, + 0x1010101010101010, 0x2020202020202020, 0x4040404040404040, 0x8080808080808080, + }; + extern const std::array BishopMagics; + extern const std::array RookMagics; +// clang-format on +#ifdef __BMI2__ +constexpr uint64_t software_pext_u64(uint64_t val, uint64_t mask) { + if (!is_constant_evaluated()) + return ~0ULL; + uint64_t result = 0; + uint64_t bit_position = 0; + + for (uint64_t bit = 1; bit != 0; bit <<= 1) { + if (mask & bit) { + if (val & bit) { + result |= 1ULL << bit_position; + } + ++bit_position; + } + } + return result; +} +struct Magic { + Bitboard mask; + int index; + constexpr Bitboard operator()(Bitboard b) const { + if (is_constant_evaluated()) { + return software_pext_u64(b, mask); + } else { + return _pext_u64(b, mask); + } + } +}; +#else +struct Magic { + Bitboard mask; + Bitboard magic; + int index; + Bitboard shift; + constexpr Bitboard operator()(Bitboard b) const { return (((b & mask)) * magic) >> shift; } +}; +#endif + +} // namespace chess::attacks +namespace chess::attacks { +extern const std::array RookTable; +extern const std::array RookAttacks; +extern const std::array BishopTable; +extern const std::array BishopAttacks; +/** + * @brief Shifts a bitboard in a given direction + * @tparam direction + * @param b + * @return + */ +template [[nodiscard]] static constexpr Bitboard shift(const Bitboard b) { + ASSUME(direction == NORTH || direction == EAST || direction == SOUTH || direction == WEST || direction == NORTH_EAST || + direction == SOUTH_EAST || direction == SOUTH_WEST || direction == NORTH_WEST); + switch (direction) { + case Direction::NORTH: + return b << 8; + case Direction::SOUTH: + return b >> 8; + case Direction::NORTH_WEST: + return (b & ~MASK_FILE[0]) << 7; + case Direction::WEST: + return (b & ~MASK_FILE[0]) >> 1; + case Direction::SOUTH_WEST: + return (b & ~MASK_FILE[0]) >> 9; + case Direction::NORTH_EAST: + return (b & ~MASK_FILE[7]) << 9; + case Direction::EAST: + return (b & ~MASK_FILE[7]) << 1; + case Direction::SOUTH_EAST: + return (b & ~MASK_FILE[7]) >> 7; + default: + UNREACHABLE(); + } +} + +/** + * @brief + * @tparam c + * @param pawns + * @return + */ +template [[nodiscard]] constexpr Bitboard pawnLeftAttacks(const Bitboard pawns) { + ASSUME(c == WHITE || c == BLACK); + return c == WHITE ? (pawns << 7) & ~MASK_FILE[7] : (pawns >> 7) & ~MASK_FILE[0]; +} + +/** + * @brief Generate the right side pawn attacks. + * @tparam c + * @param pawns + * @return + */ +template [[nodiscard]] constexpr Bitboard pawnRightAttacks(const Bitboard pawns) { + ASSUME(c == WHITE || c == BLACK); + return c == WHITE ? (pawns << 9) & ~MASK_FILE[0] : (pawns >> 9) & ~MASK_FILE[7]; +} + +/** + * @brief Generate the right side pawn attacks. + * @tparam c + * @param pawns + * @return + */ +template [[nodiscard]] constexpr Bitboard pawn(const Bitboard pawns) { + ASSUME(c == WHITE || c == BLACK); + if constexpr (c == WHITE) { + return ((pawns & ~MASK_FILE[FILE_A]) << 7) | // left captures + ((pawns & ~MASK_FILE[FILE_H]) << 9); // right captures + } else { + return ((pawns & ~MASK_FILE[FILE_H]) >> 7) | ((pawns & ~MASK_FILE[FILE_A]) >> 9); + } +} + +/** + * @brief Returns the pawn attacks for a given color and square + * @param c + * @param sq + * @return + */ +[[nodiscard]] constexpr Bitboard pawn(Color c, Square sq) { return PawnAttacks[(int)c][(int)sq]; } + +/** + * @brief Returns the knight attacks for a given square + * @param sq + * @return + */ +[[nodiscard]] constexpr Bitboard knight(Square sq) { return KnightAttacks[(int)sq]; } +/** + * @brief Returns the knight attacks for given knights + * @param sq + * @return + */ +[[nodiscard]] constexpr Bitboard knight(Bitboard knights) { + Bitboard l1 = (knights >> 1) & 0x7f7f7f7f7f7f7f7fULL; // shift left by 1, mask out file A + Bitboard l2 = (knights >> 2) & 0x3f3f3f3f3f3f3f3fULL; // shift left by 2, mask out files A+B + Bitboard r1 = (knights << 1) & 0xfefefefefefefefeULL; // shift right by 1, mask out file H + Bitboard r2 = (knights << 2) & 0xfcfcfcfcfcfcfcfcULL; // shift right by 2, mask out files G+H + Bitboard h1 = l1 | r1; // 1-square horizontal shifts + Bitboard h2 = l2 | r2; // 2-square horizontal shifts + return (h1 << 16) | (h1 >> 16) | (h2 << 8) | (h2 >> 8); // vertical shifts: +2,+1,-2,-1 +} + +/** + * @brief Returns the bishop attacks for a given square + * @param sq + * @param occupied + * @return + */ +[[nodiscard]] constexpr Bitboard bishop(Square sq, Bitboard occupied) { + return BishopAttacks[BishopTable[(int)sq].index + BishopTable[(int)sq](occupied)]; +} + +/** + * @brief Returns the rook attacks for a given square + * @param sq + * @param occupied + * @return + */ +[[nodiscard]] constexpr Bitboard rook(Square sq, Bitboard occupied) { + return RookAttacks[RookTable[(int)sq].index + RookTable[(int)sq](occupied)]; +} + +/** + * @brief Returns the queen attacks for a given square + * @param sq + * @param occupied + * @return + */ +[[nodiscard]] constexpr Bitboard queen(Square sq, Bitboard occupied) { return bishop(sq, occupied) | rook(sq, occupied); } + +/** + * @brief Returns the king attacks for a given square + * @param sq + * @return + */ +[[nodiscard]] constexpr Bitboard king(Square sq) { return KingAttacks[(int)sq]; } + +/** + * @brief Returns the slider attacks for a given square + * @param sq + * @param occupied + * @tparam pt + * @return + */ +template [[nodiscard]] constexpr Bitboard slider(Square sq, Bitboard occupied) { + static_assert(pt == PieceType::BISHOP || pt == PieceType::ROOK || pt == PieceType::QUEEN, "PieceType must be a slider!"); + + if constexpr (pt == PieceType::BISHOP) + return bishop(sq, occupied); + if constexpr (pt == PieceType::ROOK) + return rook(sq, occupied); + if constexpr (pt == PieceType::QUEEN) + return queen(sq, occupied); +} + +} // namespace chess::attacks diff --git a/bitboard.h b/bitboard.h index a324f4d..26b4a9e 100644 --- a/bitboard.h +++ b/bitboard.h @@ -1,109 +1,109 @@ -#pragma once -#include "types.h" - -#if defined(_MSC_VER) -#include -#endif -#include -namespace chess { -// ------------------------------- -// constexpr fallbacks -// ------------------------------- -constexpr int popcount_constexpr(Bitboard x) noexcept { - int count = 0; - while (x) { - x &= x - 1; - ++count; - } - return count; -} - -constexpr int lsb_constexpr(Bitboard x) noexcept { - int pos = 0; - while ((x & 1) == 0) { - x >>= 1; - ++pos; - } - return pos; -} - -constexpr int msb_constexpr(Bitboard x) noexcept { - int pos = 63; - Bitboard mask = 1ULL << 63; - while ((x & mask) == 0) { - mask >>= 1; - --pos; - } - return pos; -} - -// ------------------------------- -// runtime + constexpr aware -// ------------------------------- -#if defined(__GNUG__) || defined(__clang__) -[[gnu::const]] -#endif -__FORCEINLINE constexpr int popcount(Bitboard x) noexcept { -#if defined(__GNUG__) || defined(__clang__) - if (!is_constant_evaluated()) - return __builtin_popcountll(x); -#elif defined(_MSC_VER) - if (!is_constant_evaluated()) - return static_cast(_mm_popcnt_u64(x)); -#endif - return popcount_constexpr(x); -} - -#if defined(__GNUG__) || defined(__clang__) -[[gnu::const]] -#endif -__FORCEINLINE constexpr int lsb(Bitboard x) noexcept { -#if defined(__GNUG__) || defined(__clang__) - if (!is_constant_evaluated()) - return __builtin_ctzll(x); -#elif defined(_MSC_VER) - if (!is_constant_evaluated()) { - unsigned long index = 0; - _BitScanForward64(&index, x); - return static_cast(index); - } -#endif - return lsb_constexpr(x); -} - -#if defined(__GNUG__) || defined(__clang__) -[[gnu::const]] -#endif -__FORCEINLINE constexpr int msb(Bitboard x) noexcept { -#if defined(__GNUG__) || defined(__clang__) - if (!is_constant_evaluated()) - return 63 - __builtin_clzll(x); -#elif defined(_MSC_VER) - if (!is_constant_evaluated()) { - unsigned long index = 0; - _BitScanReverse64(&index, x); - return static_cast(index); - } -#endif - return msb_constexpr(x); -} - -// ------------------------------- -// destructive variants -// ------------------------------- -__FORCEINLINE int pop_lsb(Bitboard &b) noexcept { - int c = lsb(b); -#ifndef __BMI2__ - b &= b - 1; -#else - b = _blsr_u64(b); -#endif - return c; -} - -__FORCEINLINE int pop_msb(Bitboard &b) noexcept { - int c = msb(b); - b &= ~(1ULL << c); - return c; -} -} // namespace chess +#pragma once +#include "types.h" + +#if defined(_MSC_VER) +#include +#endif +#include +namespace chess { +// ------------------------------- +// constexpr fallbacks +// ------------------------------- +constexpr int popcount_constexpr(Bitboard x) noexcept { + int count = 0; + while (x) { + x &= x - 1; + ++count; + } + return count; +} + +constexpr int lsb_constexpr(Bitboard x) noexcept { + int pos = 0; + while ((x & 1) == 0) { + x >>= 1; + ++pos; + } + return pos; +} + +constexpr int msb_constexpr(Bitboard x) noexcept { + int pos = 63; + Bitboard mask = 1ULL << 63; + while ((x & mask) == 0) { + mask >>= 1; + --pos; + } + return pos; +} + +// ------------------------------- +// runtime + constexpr aware +// ------------------------------- +#if defined(__GNUG__) || defined(__clang__) +[[gnu::const]] +#endif +__FORCEINLINE constexpr int popcount(Bitboard x) noexcept { +#if defined(__GNUG__) || defined(__clang__) + if (!is_constant_evaluated()) + return __builtin_popcountll(x); +#elif defined(_MSC_VER) + if (!is_constant_evaluated()) + return static_cast(_mm_popcnt_u64(x)); +#endif + return popcount_constexpr(x); +} + +#if defined(__GNUG__) || defined(__clang__) +[[gnu::const]] +#endif +__FORCEINLINE constexpr int lsb(Bitboard x) noexcept { +#if defined(__GNUG__) || defined(__clang__) + if (!is_constant_evaluated()) + return __builtin_ctzll(x); +#elif defined(_MSC_VER) + if (!is_constant_evaluated()) { + unsigned long index = 0; + _BitScanForward64(&index, x); + return static_cast(index); + } +#endif + return lsb_constexpr(x); +} + +#if defined(__GNUG__) || defined(__clang__) +[[gnu::const]] +#endif +__FORCEINLINE constexpr int msb(Bitboard x) noexcept { +#if defined(__GNUG__) || defined(__clang__) + if (!is_constant_evaluated()) + return 63 - __builtin_clzll(x); +#elif defined(_MSC_VER) + if (!is_constant_evaluated()) { + unsigned long index = 0; + _BitScanReverse64(&index, x); + return static_cast(index); + } +#endif + return msb_constexpr(x); +} + +// ------------------------------- +// destructive variants +// ------------------------------- +__FORCEINLINE int pop_lsb(Bitboard &b) noexcept { + int c = lsb(b); +#ifndef __BMI2__ + b &= b - 1; +#else + b = _blsr_u64(b); +#endif + return c; +} + +__FORCEINLINE int pop_msb(Bitboard &b) noexcept { + int c = msb(b); + b &= ~(1ULL << c); + return c; +} +} // namespace chess diff --git a/non_core_tests.cpp b/non_core_tests.cpp index 965ce96..68f4669 100644 --- a/non_core_tests.cpp +++ b/non_core_tests.cpp @@ -891,20 +891,6 @@ TEST_SUITE("SAN Parser") { REQUIRE(uci::parseSan(b, "O-O+") == m); } } -TEST_CASE("Reconstruction of Position from history entry") { - { - Position p; - Position p2(p.state()); - REQUIRE(p.fen() == p2.fen()); - } - { - _Position p; - Position p2(p.state()); - _Position p3(p2.state()); - REQUIRE(p.fen() == p3.fen()); - REQUIRE(p.fen() == p2.fen()); - } -} int main(int argc, char **argv) { doctest::Context ctx; ctx.setOption("success", true); diff --git a/position.cpp b/position.cpp index beb79da..0d1a6f6 100644 --- a/position.cpp +++ b/position.cpp @@ -1,782 +1,786 @@ -#include "position.h" -#include "movegen.h" -#include "moves_io.h" -#include "position.h" -#include -#ifndef GENERATE_AT_RUNTIME -#define _POSSIBLY_CONSTEXPR constexpr -#else -#define _POSSIBLY_CONSTEXPR const -#endif - -#if defined(__EXCEPTIONS) -#define THROW_IF_EXCEPTIONS_ON(stuff) throw stuff -#else -#define THROW_IF_EXCEPTIONS_ON(stuff) ((void)0) -#endif -#if defined(_DEBUG) || !defined(NDEBUG) -#define INVALID_ARG_IF(c, s) assert(!(c) && s) -#elif defined(__EXCEPTIONS) -#define INVALID_ARG_IF(c, s) if (c) THROW_IF_EXCEPTIONS_ON(std::invalid_argument(s)) -#endif -namespace chess { - -template template void _Position::doMove(const Move &move) { - assert(move.is_ok() && "doMove called with invalid move"); - Square from_sq = move.from_sq(), to_sq = move.to_sq(); - Color us = side_to_move(), them = ~us; - MoveType move_type = move.type_of(); - PieceC moving_piece = piece_on(from_sq); - PieceC target_piece = piece_on(to_sq); - PieceType moving_piecetype = piece_of(moving_piece); - PieceType target_piecetype = piece_of(target_piece); - Color target_color = color_of(target_piece); - bool is_capture = isCapture(move); - history.push_back(current_state); - current_state.incr_sqs[0] = current_state.incr_sqs[1] = current_state.incr_sqs[2] = current_state.incr_sqs[3] = SQ_NONE; - current_state.incr_pc[0] = current_state.incr_pc[1] = current_state.incr_pc[2] = current_state.incr_pc[3] = - PieceC::NO_PIECE; - current_state.mv = move; // Update the move in the current state - INVALID_ARG_IF(target_piecetype != KING, "Capturing kings is illegal"); - INVALID_ARG_IF(moving_piecetype != NO_PIECE_TYPE, "Expected a piece to move."); - removePiece(moving_piecetype, from_sq, us); - { - switch (move_type) { - case NORMAL: - removePiece(target_piecetype, to_sq, target_color); - placePiece(moving_piecetype, to_sq, us); - current_state.incr_sqs[0] = from_sq; - current_state.incr_pc[0] = moving_piece; - current_state.incr_sqs[1] = to_sq; - current_state.incr_pc[1] = target_piece; - break; - case PROMOTION: - removePiece(target_piecetype, to_sq, target_color); - placePiece(move.promotion_type(), to_sq, us); - current_state.incr_sqs[0] = from_sq; - current_state.incr_pc[0] = moving_piece; - current_state.incr_sqs[1] = to_sq; - current_state.incr_pc[1] = target_piece; - break; - case EN_PASSANT: { - Square ep_capture_sq = to_sq + pawn_push(them); - removePiece(ep_capture_sq, them); - placePiece(to_sq, us); - current_state.incr_sqs[0] = from_sq; - current_state.incr_pc[0] = moving_piece; - current_state.incr_sqs[1] = ep_capture_sq; - current_state.incr_pc[1] = make_piece(PAWN, them); - current_state.incr_sqs[2] = to_sq; - current_state.incr_pc[2] = PieceC::NO_PIECE; - break; - } - case CASTLING: { - removePiece(target_piecetype, to_sq, target_color); - bool is_king_side = from_sq < to_sq; - Square rook_dest = castling_rook_square(us, is_king_side), - king_dest = castling_king_square(us, is_king_side); - placePiece(rook_dest, us); - placePiece(king_dest, us); - current_state.incr_sqs[0] = from_sq; - current_state.incr_pc[0] = moving_piece; - current_state.incr_sqs[1] = to_sq; - current_state.incr_pc[1] = target_piece; - current_state.incr_sqs[2] = king_dest; - current_state.incr_pc[2] = PieceC::NO_PIECE; - current_state.incr_sqs[3] = rook_dest; - current_state.incr_pc[3] = PieceC::NO_PIECE; - break; - } - } - } - { - // Detect a two-square pawn push. - bool isDoublePush = (moving_piecetype == PAWN) && (abs(to_sq - from_sq) == 16); - - // Remove old EP key if it was actually included. - bool _ir_1 = current_state.enPassant != SQ_NONE && current_state.epIncluded; - current_state.hash ^= _ir_1 ? zobrist::RandomEP[file_of(current_state.enPassant)] : 0; - - // Default: no EP square and not included. - current_state.epIncluded = false; - - // If the move creates a potential EP target: - current_state.enPassant = isDoublePush ? (from_sq + pawn_push(us)) : SQ_NONE; - if (isDoublePush) { - // Now side to move is the *opponent*. - Color stm = ~us; - File f = file_of(current_state.enPassant); - Bitboard ep_mask = (1ULL << current_state.enPassant); - - // Shift toward the side-to-move's capturing rank. - ep_mask = (stm == WHITE) ? (ep_mask >> 8) : (ep_mask << 8); - - // Keep adjacent files only. - ep_mask = ((ep_mask << 1) & ~attacks::MASK_FILE[0]) | ((ep_mask >> 1) & ~attacks::MASK_FILE[7]); - - // Include key if their pawns can attack it. - current_state.epIncluded = (ep_mask & pieces(stm)) != 0; - current_state.hash ^= current_state.epIncluded ? zobrist::RandomEP[f] : 0; - } - } - { - CastlingRights clear_mask = NO_CASTLING; - // Moving piece - if (moving_piecetype == KING && from_sq == current_state.castlingMetadata[us].king_start) { - clear_mask |= (us == WHITE ? WHITE_CASTLING : BLACK_CASTLING); - } else if (moving_piecetype == ROOK) { - if (from_sq == current_state.castlingMetadata[us].rook_start_ks) { - clear_mask |= (us == WHITE ? WHITE_OO : BLACK_OO); - } else if (from_sq == current_state.castlingMetadata[us].rook_start_qs) { - clear_mask |= (us == WHITE ? WHITE_OOO : BLACK_OOO); - } - } - // Captured piece - if (target_piecetype == ROOK) { - if (to_sq == current_state.castlingMetadata[target_color].rook_start_ks) - clear_mask |= (target_color == WHITE ? WHITE_OO : BLACK_OO); - else if (to_sq == current_state.castlingMetadata[target_color].rook_start_qs) - clear_mask |= (target_color == WHITE ? WHITE_OOO : BLACK_OOO); - } - CastlingRights prev = current_state.castlingRights; - current_state.castlingRights &= ~clear_mask; - current_state.hash ^= zobrist::RandomCastle[prev] ^ zobrist::RandomCastle[current_state.castlingRights]; - } - current_state.turn = ~current_state.turn; - // Update halfmoves, fullmoves and stm - current_state.fullMoveNumber += (current_state.turn == WHITE); - current_state.halfMoveClock = (is_capture || moving_piecetype == PAWN) ? 0 : (current_state.halfMoveClock + 1); - current_state.hash ^= zobrist::RandomTurn; - refresh_attacks(); - // DO NOT MIX REPETITIONS - if constexpr (Strict) { - current_state.pliesFromNull++; - // Calculate the repetition info. It is the ply distance from the previous - // occurrence of the same position, negative in the 3-fold case, or zero - // if the position was not repeated. - current_state.repetition = 0; - int end = std::min(rule50_count(), current_state.pliesFromNull); - if (end >= 4) { - auto *stp = &history[history.size_ - 1]; - stp -= 1; - for (int i = 4; i <= end; i += 2) { - stp -= 2; - if (stp->hash == hash()) { - current_state.repetition = stp->repetition ? -i : i; - break; - } - } - } - } -} - -template void _Position::setFEN(const std::string &str, bool chess960) { - current_state = HistoryEntry(); - history.clear(); - _chess960 = chess960; - std::istringstream ss(str); - std::string board_fen, active_color, castling, enpassant; - int halfmove = 0, fullmove = 1; - ss >> board_fen; - ss >> active_color; - ss >> castling; - ss >> enpassant; - ss >> halfmove; - ss >> fullmove; - - // 1. Parse board - { - File f = FILE_A; - Rank r = RANK_8; - int file_count = 0; - int rank_count = 0; - for (char c : board_fen) { - if (c == '/') { - INVALID_ARG_IF(file_count != 8, "Each rank must contain exactly 8 squares"); - f = FILE_A; - --r; - file_count = 0; - ++rank_count; - continue; - } - - if (c >= '1' && c <= '8') { - int empty_squares = c - '0'; - file_count += empty_squares; - f = static_cast(static_cast(f) + empty_squares); - } else { - INVALID_ARG_IF(file_count >= 8, "Too many pieces in one rank"); - INVALID_ARG_IF(!chess::is_valid(r, f), "Invalid file/rank position"); - switch (c) { - case 'p': - placePiece(make_sq(r, f), BLACK); - break; - case 'P': - placePiece(make_sq(r, f), WHITE); - break; - case 'n': - placePiece(make_sq(r, f), BLACK); - break; - case 'N': - placePiece(make_sq(r, f), WHITE); - break; - case 'b': - placePiece(make_sq(r, f), BLACK); - break; - case 'B': - placePiece(make_sq(r, f), WHITE); - break; - case 'r': - placePiece(make_sq(r, f), BLACK); - break; - case 'R': - placePiece(make_sq(r, f), WHITE); - break; - case 'q': - placePiece(make_sq(r, f), BLACK); - break; - case 'Q': - placePiece(make_sq(r, f), WHITE); - break; - case 'k': - placePiece(make_sq(r, f), BLACK); - break; - case 'K': - placePiece(make_sq(r, f), WHITE); - break; - default: - INVALID_ARG_IF(false, "Invalid FEN character"); - break; - } - - ++file_count; - f = static_cast(static_cast(f) + 1); - } - } - - // Final assertions after parsing - INVALID_ARG_IF(file_count != 8, "Last rank must have 8 squares"); - INVALID_ARG_IF(rank_count != 7, "FEN must contain exactly 8 ranks"); - } - - // 2. Turn - if (active_color == "w") { - current_state.turn = WHITE; - current_state.hash ^= zobrist::RandomTurn; - } else if (active_color == "b") { - current_state.turn = BLACK; - } else { - INVALID_ARG_IF(active_color != "w" && active_color != "b", "Expected white or black, got something else."); - } - - // 3. Castling rights - current_state.castlingRights = NO_CASTLING; - for (char c : castling) { - switch (c) { - case 'K': - INVALID_ARG_IF(chess960, "Chess960 needs specific file"); - current_state.castlingRights |= WHITE_OO; - current_state.hash ^= zobrist::RandomCastle[WHITE_OO]; - current_state.castlingMetadata[WHITE].king_start = kingSq(WHITE); - current_state.castlingMetadata[WHITE].rook_start_ks = SQ_H1; - break; - case 'Q': - INVALID_ARG_IF(chess960, "Chess960 needs specific file"); - current_state.castlingRights |= WHITE_OOO; - current_state.hash ^= zobrist::RandomCastle[WHITE_OOO]; - current_state.castlingMetadata[WHITE].king_start = kingSq(WHITE); - current_state.castlingMetadata[WHITE].rook_start_qs = SQ_A1; - break; - case 'k': - INVALID_ARG_IF(chess960, "Chess960 needs specific file"); - current_state.castlingRights |= BLACK_OO; - current_state.hash ^= zobrist::RandomCastle[BLACK_OO]; - current_state.castlingMetadata[BLACK].king_start = kingSq(BLACK); - current_state.castlingMetadata[BLACK].rook_start_ks = SQ_H8; - break; - case 'q': - INVALID_ARG_IF(chess960, "Chess960 needs specific file"); - current_state.castlingRights |= BLACK_OOO; - current_state.hash ^= zobrist::RandomCastle[BLACK_OOO]; - current_state.castlingMetadata[BLACK].king_start = kingSq(BLACK); - current_state.castlingMetadata[BLACK].rook_start_qs = SQ_A8; - break; - // some optional chess960? maybe not. - case '-': - break; - default: { - INVALID_ARG_IF(!chess960, "Invalid castling right for non-Chess960"); - if (c >= 'A' && c <= 'H') // white-castling - { - CastlingRights cr = (make_sq(RANK_1, static_cast(c - 'a')) > SQ_E1 ? WHITE_OO : WHITE_OOO); - current_state.castlingRights |= cr; - current_state.castlingMetadata[WHITE].king_start = kingSq(WHITE); - if (cr & KING_SIDE) - current_state.castlingMetadata[WHITE].rook_start_ks = make_sq(RANK_1, static_cast(c - 'A')); - else - current_state.castlingMetadata[WHITE].rook_start_qs = make_sq(RANK_1, static_cast(c - 'A')); - } else if (c >= 'a' && c <= 'h') // white-castling - { - CastlingRights cr = (make_sq(RANK_8, static_cast(c - 'a')) > SQ_E8 ? BLACK_OO : BLACK_OOO); - current_state.castlingRights |= cr; - current_state.castlingMetadata[BLACK].king_start = kingSq(BLACK); - if (cr & KING_SIDE) - current_state.castlingMetadata[BLACK].rook_start_ks = make_sq(RANK_8, static_cast(c - 'A')); - else - current_state.castlingMetadata[BLACK].rook_start_qs = make_sq(RANK_8, static_cast(c - 'A')); - } - break; - } - } - } - for (Color c : { WHITE, BLACK }) { - // king - { - const auto king_from = current_state.castlingMetadata[c].king_start; - const auto rook_from = make_sq(file_of(current_state.castlingMetadata[c].rook_start_ks), rank_of(king_from)); - const auto king_to = castling_king_square(c, true); - const auto rook_to = castling_rook_square(c, true); - current_state.castlingMetadata[c].castling_paths[true] = - (movegen::between(rook_from, rook_to) | movegen::between(king_from, king_to)) & - ~((1ULL<= 'a' && enpassant[0] <= 'h' && enpassant[1] >= '1' && - enpassant[1] <= '8') { - File f = static_cast(enpassant[0] - 'a'); - Rank r = static_cast(enpassant[1] - '1'); - Square ep_sq = make_sq(r, f); - current_state.enPassant = ep_sq; - Bitboard ep_mask = 1ULL << ep_sq; - if (sideToMove() == WHITE) { - ep_mask >>= 8; - } else - ep_mask <<= 8; - ep_mask = ((ep_mask << 1) & ~attacks::MASK_FILE[0]) | ((ep_mask >> 1) & ~attacks::MASK_FILE[7]); - if (ep_mask & pieces(sideToMove())) { - current_state.hash ^= zobrist::RandomEP[f]; - current_state.epIncluded = true; - } - } else { - INVALID_ARG_IF(enpassant != "-", "Invalid en passant FEN field"); - current_state.enPassant = SQ_NONE; - } - - // 5. Halfmove clock - current_state.halfMoveClock = static_cast(halfmove); - - // 6. Fullmove number - current_state.fullMoveNumber = fullmove; - refresh_attacks(); - current_state.repetition = current_state.pliesFromNull = 0; -} - -template std::string _Position::fen() const { - std::ostringstream ss; - - // 1) Piece placement - for (Rank rank = RANK_8; rank >= RANK_1; --rank) { - int emptyCount = 0; - for (File file = FILE_A; file <= FILE_H; ++file) { - Square sq = make_sq(rank, file); // Assuming 0..63 indexing - - PieceC piece = piece_on(sq); - if (piece == PieceC::NO_PIECE) { - emptyCount++; - } else { - if (emptyCount > 0) { - ss << std::to_string(emptyCount); - emptyCount = 0; - } - ss << piece; - } - } - if (emptyCount > 0) - ss << std::to_string(emptyCount); - if (rank > 0) - ss << '/'; - } - - // 2) Side to move - ss << ' ' << (sideToMove() == WHITE ? 'w' : 'b'); - - // 3) Castling availability - ss << ' '; - std::string castlingStr; - if (castlingRights() & WHITE_OO) - castlingStr += 'K'; - if (castlingRights() & WHITE_OOO) - castlingStr += 'Q'; - if (castlingRights() & BLACK_OO) - castlingStr += 'k'; - if (castlingRights() & BLACK_OOO) - castlingStr += 'q'; - ss << (castlingStr.empty() ? "-" : castlingStr); - - // 4) En passant target square or '-' - ss << ' '; - Square ep = ep_square(); - ss << (ep == SQ_NONE ? "-" : uci::squareToString(ep)); - - // 5) Halfmove clock - ss << ' ' << (int)halfmoveClock(); - - // 6) Fullmove number - ss << ' ' << (int)fullmoveNumber(); - - return ss.str(); -} -template template bool _Position::is_valid() const { - if (count() != 1) - return false; - if (count() != 1) - return false; - Color stm = sideToMove(); - // stm checking - bool whiteInCheck = isAttacked(kingSq(WHITE), BLACK); - bool blackInCheck = isAttacked(kingSq(BLACK), WHITE); - - // Both kings cannot be in check simultaneously - if (whiteInCheck && blackInCheck) - return false; - - // The side to move cannot have its king currently in check from itself (nonsense) - if (isAttacked(kingSq(~stm), stm)) - return false; - if (piece_on(SQ_A1) != PieceC::WROOK && (castlingRights() & WHITE_OOO) != 0) - return false; - // pawns not on backrank - if ((pieces(PAWN) & (attacks::MASK_RANK[RANK_1] | attacks::MASK_RANK[RANK_8])) != 0) - return false; - if constexpr (Strict) { - // pawns not > 8 - { - int pawns = count(); - int queens = count(); - int rooks = count(); - int bishops = count(); - int knights = count(); - - // Base set: 1 queen, 2 rooks, 2 bishops, 2 knights - int promotions = - std::max(0, (queens - 1)) + std::max(0, (rooks - 2)) + std::max(0, (bishops - 2)) + std::max(0, (knights - 2)); - - if (pawns + promotions > 8) - return false; // impossible - } - { - int pawns = count(); - int queens = count(); - int rooks = count(); - int bishops = count(); - int knights = count(); - - // Base set: 1 queen, 2 rooks, 2 bishops, 2 knights - int promotions = - std::max(0, (queens - 1)) + std::max(0, (rooks - 2)) + std::max(0, (bishops - 2)) + std::max(0, (knights - 2)); - - if (pawns + promotions > 8) - return false; // impossible - } - } - if (Square ep_sq = ep_square(); ep_sq != SQ_NONE) { - if ((stm == WHITE && rank_of(ep_sq) != RANK_6) || (stm == BLACK && rank_of(ep_sq) != RANK_3)) - return false; - Square behind = ep_sq + ((stm == WHITE) ? SOUTH : NORTH); - if (piece_at(behind) != make_piece(PAWN, ~stm)) - return false; - - if (!(attacks::pawn(~stm, ep_sq) & pieces(stm))) - return false; - } - // Too many checkers - if (popcount(checkers()) > 2) - return false; - return true; -} -template CheckType _Position::givesCheck(Move m) const { - const static auto getSniper = [](const _Position *p, Square ksq, Bitboard oc) { - const auto us_occ = p->us(p->sideToMove()); - const auto bishop = attacks::bishop(ksq, oc) & p->pieces(PieceType::BISHOP, PieceType::QUEEN) & us_occ; - const auto rook = attacks::rook(ksq, oc) & p->pieces(PieceType::ROOK, PieceType::QUEEN) & us_occ; - return (bishop | rook); - }; - - assert(color_of(at(m.from())) == sideToMove()); - - const Square from = m.from(); - const Square to = m.to(); - const Square ksq = kingSq(~sideToMove()); - const Bitboard toBB = 1ULL << (to); - const PieceType pt = piece_of(at(from)); - - Bitboard fromKing = 0ull; - - if (pt == PieceType::PAWN) { - fromKing = attacks::pawn(~side_to_move(), ksq); - } else if (pt == PieceType::KNIGHT) { - fromKing = attacks::knight(ksq); - } else if (pt == PieceType::BISHOP) { - fromKing = attacks::bishop(ksq, occ()); - } else if (pt == PieceType::ROOK) { - fromKing = attacks::rook(ksq, occ()); - } else if (pt == PieceType::QUEEN) { - fromKing = attacks::queen(ksq, occ()); - } - - if (fromKing & toBB) - return CheckType::DIRECT_CHECK; - - // Discovery check - const Bitboard fromBB = 1ULL << (from); - const Bitboard oc = occ() ^ fromBB; - - Bitboard sniper = getSniper(this, ksq, oc); - - if (sniper) { - Square sq = (Square)pop_lsb(sniper); - return (!(movegen::between(ksq, sq) & toBB) || m.typeOf() == Move::CASTLING) ? CheckType::DISCOVERY_CHECK - : CheckType::NO_CHECK; - } - - switch (m.typeOf()) { - case Move::NORMAL: - return CheckType::NO_CHECK; - - case Move::PROMOTION: { - Bitboard attacks = 0ull; - - switch (m.promotionType()) { - case KNIGHT: - attacks = attacks::knight(to); - break; - case BISHOP: - attacks = attacks::bishop(to, oc); - break; - case ROOK: - attacks = attacks::rook(to, oc); - break; - case QUEEN: - attacks = attacks::queen(to, oc); - break; - default: - break; - } - - return (attacks & pieces(PieceType::KING, ~sideToMove())) ? CheckType::DIRECT_CHECK : CheckType::NO_CHECK; - } - - case Move::ENPASSANT: { - Square capSq = make_sq(file_of(to), rank_of(from)); - return (getSniper(this, ksq, (oc ^ (1ULL << capSq)) | toBB)) ? CheckType::DISCOVERY_CHECK : CheckType::NO_CHECK; - } - - case Move::CASTLING: { - Square rookTo = relative_square(side_to_move(), to > from ? SQ_F1 : SQ_D1); - return (attacks::rook(ksq, occ()) & (1ULL << rookTo)) ? CheckType::DISCOVERY_CHECK : CheckType::NO_CHECK; - } - } - - assert(false); - return CheckType::NO_CHECK; // Prevent a compiler warning -} -template void _Position::refresh_attacks() { - Color c = sideToMove(); - - Square king_sq = kingSq(c); - _bishop_pin = pinMask(c, king_sq); - _rook_pin = pinMask(c, king_sq); - _pin_mask = _bishop_pin | _rook_pin; - - _checkers = attackers(~c, king_sq); - - int num_checks = popcount(_checkers); - - switch (num_checks) { - case 0: - _check_mask = ~0ULL; // no checks, full mask - break; - - case 1: { - Square sq = static_cast(lsb(_checkers)); - Bitboard mask = (1ULL << sq) | movegen::between(king_sq, sq); - _check_mask = mask; - break; - } - - default: - _check_mask = 0ULL; // multiple checks, no blocking mask - break; - } -} -template uint64_t _Position::zobrist() const { - uint64_t hash = 0; - for (int sq = 0; sq < 64; ++sq) { - auto p = piece_on((Square)sq); - hash ^= (p == PieceC::NO_PIECE) ? 0 : zobrist::RandomPiece[enum_idx()][(int)p][sq]; - } - hash ^= (current_state.turn == WHITE) ? zobrist::RandomTurn : 0; - hash ^= zobrist::RandomCastle[current_state.castlingRights]; - auto ep_sq = current_state.enPassant; - if (ep_sq == SQ_NONE) - return hash; - if (ep_sq != SQ_NONE) { - File f = file_of(ep_sq); - Bitboard ep_mask = (1ULL << ep_sq); - - // Shift to the rank where the opposing pawn sits - Color stm = sideToMove(); - // Color them = ~stm; - ep_mask = (stm == WHITE) ? (ep_mask >> 8) : (ep_mask << 8); - - // Pawns on adjacent files only - ep_mask = ((ep_mask << 1) & ~attacks::MASK_FILE[0]) | ((ep_mask >> 1) & ~attacks::MASK_FILE[7]); - - if (ep_mask & pieces(stm)) - hash ^= zobrist::RandomEP[f]; - } - return hash; -} - -template Move _Position::parse_uci(std::string uci) const { - return chess::uci::uciToMove(*this, uci); -} - -template Move _Position::push_uci(std::string uci) { - auto mv = parse_uci(uci); - doMove(mv); - return mv; -} -template Square _Position::_valid_ep_square() const { - if (ep_square() == SQ_NONE) - return SQ_NONE; - Rank ep_rank = sideToMove() == WHITE ? RANK_6 : RANK_3; - Bitboard mask = 1ULL << ep_square(); - Bitboard pawn_mask = mask << 8; - Bitboard org_pawn_mask = mask >> 8; - if (sideToMove() == BLACK) std::swap(pawn_mask, org_pawn_mask); - // rank 3 or rank 6, depending on color - if (rank_of(ep_square()) != ep_rank) - return SQ_NONE; - // a pawn in 2 ranks behind - if (!(pieces(PAWN) & occ(~sideToMove()) & pawn_mask)) - return SQ_NONE; - // ep_sq must be empty - if (occ() & mask) - return SQ_NONE; - // emptied second rank - if (occ() & org_pawn_mask) - return SQ_NONE; - return ep_square(); -} -template bool _Position::is_insufficient_material(Color c) const { - const auto count = popcount(occ()); - - // only kings, draw - if (count == 2) - return true; - - // only bishop + knight, can't mate - if (count == 3) { - if (pieces(PieceType::BISHOP, Color::WHITE) || pieces(PieceType::BISHOP, Color::BLACK)) - return true; - if (pieces(PieceType::KNIGHT, Color::WHITE) || pieces(PieceType::KNIGHT, Color::BLACK)) - return true; - } - - // same-colored bishops, can't mate - if (count == 4) { - // bishops on same color (one per side) - if (pieces(PieceType::BISHOP, Color::WHITE) && pieces(PieceType::BISHOP, Color::BLACK)) { - Square w = (Square)lsb(pieces(PieceType::BISHOP, Color::WHITE)); - Square b = (Square)lsb(pieces(PieceType::BISHOP, Color::BLACK)); - if (((9 * (w ^ b)) & 8) == 0) - return true; - } - - // one side with two bishops on same color - auto white_bishops = pieces(PieceType::BISHOP, Color::WHITE); - auto black_bishops = pieces(PieceType::BISHOP, Color::BLACK); - - if (popcount(white_bishops) == 2) { - Square b1 = (Square)lsb(white_bishops); - Square b2 = (Square)msb(white_bishops); - if (((9 * (b1 ^ b2)) & 8) == 0) - return true; - } else if (popcount(black_bishops) == 2) { - Square b1 = (Square)lsb(black_bishops); - Square b2 = (Square)msb(black_bishops); - if (((9 * (b1 ^ b2)) & 8) == 0) - return true; - } - } - - return false; -} -template CastlingRights _Position::clean_castling_rights() const { - constexpr Bitboard cr_WOO = 1ULL << SQ_H1; - constexpr Bitboard cr_WOOO = 1ULL << SQ_A1; - constexpr Bitboard cr_BOO = 1ULL << SQ_H8; - constexpr Bitboard cr_BOOO = 1ULL << SQ_A8; - if (history.size()) - return castlingRights(); - Bitboard castling = 0; - // mappings - castling |= (castlingRights() & WHITE_OO) ? cr_WOO : 0; - castling |= (castlingRights() & WHITE_OOO) ? cr_WOOO : 0; - - castling |= (castlingRights() & BLACK_OO) ? cr_BOO : 0; - castling |= (castlingRights() & BLACK_OOO) ? cr_BOOO : 0; - castling &= pieces(ROOK); - Bitboard white_castling = castling & attacks::MASK_RANK[RANK_1] & occ(WHITE); - Bitboard black_castling = castling & attacks::MASK_RANK[RANK_8] & occ(BLACK); - // rook exists in corresponding square - white_castling &= (cr_WOO | cr_WOOO); - black_castling &= (cr_BOO | cr_BOOO); - // king exists in e1/e8 depending on color - if (!(occ(WHITE) & pieces(KING) & (1ULL << SQ_E1))) - white_castling = 0; - if (!(occ(BLACK) & pieces(KING) & (1ULL << SQ_E8))) - black_castling = 0; - castling = white_castling | black_castling; - // Re-map - CastlingRights cr = NO_CASTLING; - cr |= (castling & cr_WOO) ? WHITE_OO : NO_CASTLING; - cr |= (castling & cr_WOOO) ? WHITE_OOO : NO_CASTLING; - cr |= (castling & cr_BOO) ? BLACK_OO : NO_CASTLING; - cr |= (castling & cr_BOOO) ? BLACK_OOO : NO_CASTLING; - return cr; -} -// clang-format off -#define INSTANTIATE(PieceC) \ -template void _Position::setFEN(const std::string &, bool); \ -template std::string _Position::fen() const; \ -template void _Position::doMove(const Move &move); \ -template void _Position::doMove(const Move &move); \ -template void _Position::refresh_attacks(); \ -template uint64_t _Position::zobrist() const; \ -template Move _Position::parse_uci(std::string) const; \ -template Move _Position::push_uci(std::string); \ -template bool _Position::is_valid() const; \ -template bool _Position::is_valid() const; \ -template CheckType _Position::givesCheck(Move) const; \ -template bool _Position::is_insufficient_material() const; -// clang-format off -INSTANTIATE(PolyglotPiece) -INSTANTIATE(EnginePiece) -INSTANTIATE(ContiguousMappingPiece) -#undef INSTANTIATE -} // namespace chess - - +#include "position.h" +#include "movegen.h" +#include "moves_io.h" +#include "position.h" +#include +#ifndef GENERATE_AT_RUNTIME +#define _POSSIBLY_CONSTEXPR constexpr +#else +#define _POSSIBLY_CONSTEXPR const +#endif + +#if defined(__EXCEPTIONS) +#define THROW_IF_EXCEPTIONS_ON(stuff) throw stuff +#else +#define THROW_IF_EXCEPTIONS_ON(stuff) ((void)0) +#endif +#if defined(_DEBUG) || !defined(NDEBUG) +#define INVALID_ARG_IF(c, s) assert(!(c) && s) +#elif defined(__EXCEPTIONS) +#define INVALID_ARG_IF(c, s) \ + if (c) \ + THROW_IF_EXCEPTIONS_ON(std::invalid_argument(s)) +#else +#define INVALID_ARG_IF(c, s) +#endif +namespace chess { + +template template void _Position::doMove(const Move &move) { + assert(move.is_ok() && "doMove called with invalid move"); + Square from_sq = move.from_sq(), to_sq = move.to_sq(); + Color us = side_to_move(), them = ~us; + MoveType move_type = move.type_of(); + PieceC moving_piece = piece_on(from_sq); + PieceC target_piece = piece_on(to_sq); + PieceType moving_piecetype = piece_of(moving_piece); + PieceType target_piecetype = piece_of(target_piece); + Color target_color = color_of(target_piece); + bool is_capture = isCapture(move); + history.push_back(current_state); + current_state.incr_sqs[0] = current_state.incr_sqs[1] = current_state.incr_sqs[2] = current_state.incr_sqs[3] = SQ_NONE; + current_state.incr_pc[0] = current_state.incr_pc[1] = current_state.incr_pc[2] = current_state.incr_pc[3] = + PieceC::NO_PIECE; + current_state.mv = move; // Update the move in the current state + INVALID_ARG_IF(target_piecetype == KING, "Capturing kings is illegal"); + INVALID_ARG_IF(moving_piecetype == NO_PIECE_TYPE, "Expected a piece to move."); + removePiece(moving_piecetype, from_sq, us); + { + switch (move_type) { + case NORMAL: + removePiece(target_piecetype, to_sq, target_color); + placePiece(moving_piecetype, to_sq, us); + current_state.incr_sqs[0] = from_sq; + current_state.incr_pc[0] = moving_piece; + current_state.incr_sqs[1] = to_sq; + current_state.incr_pc[1] = target_piece; + break; + case PROMOTION: + removePiece(target_piecetype, to_sq, target_color); + placePiece(move.promotion_type(), to_sq, us); + current_state.incr_sqs[0] = from_sq; + current_state.incr_pc[0] = moving_piece; + current_state.incr_sqs[1] = to_sq; + current_state.incr_pc[1] = target_piece; + break; + case EN_PASSANT: { + Square ep_capture_sq = to_sq + pawn_push(them); + removePiece(ep_capture_sq, them); + placePiece(to_sq, us); + current_state.incr_sqs[0] = from_sq; + current_state.incr_pc[0] = moving_piece; + current_state.incr_sqs[1] = ep_capture_sq; + current_state.incr_pc[1] = make_piece(PAWN, them); + current_state.incr_sqs[2] = to_sq; + current_state.incr_pc[2] = PieceC::NO_PIECE; + break; + } + case CASTLING: { + removePiece(target_piecetype, to_sq, target_color); + bool is_king_side = from_sq < to_sq; + Square rook_dest = castling_rook_square(us, is_king_side), king_dest = castling_king_square(us, is_king_side); + placePiece(rook_dest, us); + placePiece(king_dest, us); + current_state.incr_sqs[0] = from_sq; + current_state.incr_pc[0] = moving_piece; + current_state.incr_sqs[1] = to_sq; + current_state.incr_pc[1] = target_piece; + current_state.incr_sqs[2] = king_dest; + current_state.incr_pc[2] = PieceC::NO_PIECE; + current_state.incr_sqs[3] = rook_dest; + current_state.incr_pc[3] = PieceC::NO_PIECE; + break; + } + } + } + { + // Detect a two-square pawn push. + bool isDoublePush = (moving_piecetype == PAWN) && (abs(to_sq - from_sq) == 16); + + // Remove old EP key if it was actually included. + bool _ir_1 = current_state.enPassant != SQ_NONE && current_state.epIncluded; + current_state.hash ^= _ir_1 ? zobrist::RandomEP[file_of(current_state.enPassant)] : 0; + + // Default: no EP square and not included. + current_state.epIncluded = false; + + // If the move creates a potential EP target: + current_state.enPassant = isDoublePush ? (from_sq + pawn_push(us)) : SQ_NONE; + if (isDoublePush) { + // Now side to move is the *opponent*. + Color stm = ~us; + File f = file_of(current_state.enPassant); + Bitboard ep_mask = (1ULL << current_state.enPassant); + + // Shift toward the side-to-move's capturing rank. + ep_mask = (stm == WHITE) ? (ep_mask >> 8) : (ep_mask << 8); + + // Keep adjacent files only. + ep_mask = ((ep_mask << 1) & ~attacks::MASK_FILE[0]) | ((ep_mask >> 1) & ~attacks::MASK_FILE[7]); + + // Include key if their pawns can attack it. + current_state.epIncluded = (ep_mask & pieces(stm)) != 0; + current_state.hash ^= current_state.epIncluded ? zobrist::RandomEP[f] : 0; + } + } + { + CastlingRights clear_mask = NO_CASTLING; + // Moving piece + if (moving_piecetype == KING && from_sq == current_state.castlingMetadata[us].king_start) { + clear_mask |= (us == WHITE ? WHITE_CASTLING : BLACK_CASTLING); + } else if (moving_piecetype == ROOK) { + if (from_sq == current_state.castlingMetadata[us].rook_start_ks) { + clear_mask |= (us == WHITE ? WHITE_OO : BLACK_OO); + } else if (from_sq == current_state.castlingMetadata[us].rook_start_qs) { + clear_mask |= (us == WHITE ? WHITE_OOO : BLACK_OOO); + } + } + // Captured piece + if (target_piecetype == ROOK) { + if (to_sq == current_state.castlingMetadata[target_color].rook_start_ks) + clear_mask |= (target_color == WHITE ? WHITE_OO : BLACK_OO); + else if (to_sq == current_state.castlingMetadata[target_color].rook_start_qs) + clear_mask |= (target_color == WHITE ? WHITE_OOO : BLACK_OOO); + } + CastlingRights prev = current_state.castlingRights; + current_state.castlingRights &= ~clear_mask; + current_state.hash ^= zobrist::RandomCastle[prev] ^ zobrist::RandomCastle[current_state.castlingRights]; + } + current_state.turn = ~current_state.turn; + // Update halfmoves, fullmoves and stm + current_state.fullMoveNumber += (current_state.turn == WHITE); + current_state.halfMoveClock = (is_capture || moving_piecetype == PAWN) ? 0 : (current_state.halfMoveClock + 1); + current_state.hash ^= zobrist::RandomTurn; + refresh_attacks(); + // DO NOT MIX REPETITIONS + if constexpr (Strict) { + current_state.pliesFromNull++; + // Calculate the repetition info. It is the ply distance from the previous + // occurrence of the same position, negative in the 3-fold case, or zero + // if the position was not repeated. + current_state.repetition = 0; + int end = std::min(rule50_count(), current_state.pliesFromNull); + if (end >= 4) { + auto *stp = &history[history.size_ - 1]; + stp -= 1; + for (int i = 4; i <= end; i += 2) { + stp -= 2; + if (stp->hash == hash()) { + current_state.repetition = stp->repetition ? -i : i; + break; + } + } + } + } +} + +template void _Position::setFEN(const std::string &str, bool chess960) { + current_state = HistoryEntry(); + history.clear(); + _chess960 = chess960; + std::istringstream ss(str); + std::string board_fen, active_color, castling, enpassant; + int halfmove = 0, fullmove = 1; + ss >> board_fen; + ss >> active_color; + ss >> castling; + ss >> enpassant; + ss >> halfmove; + ss >> fullmove; + + // 1. Parse board + { + File f = FILE_A; + Rank r = RANK_8; + int file_count = 0; + int rank_count = 0; + for (char c : board_fen) { + if (c == '/') { + INVALID_ARG_IF(file_count != 8, "Each rank must contain exactly 8 squares"); + f = FILE_A; + --r; + file_count = 0; + ++rank_count; + continue; + } + + if (c >= '1' && c <= '8') { + int empty_squares = c - '0'; + file_count += empty_squares; + f = static_cast(static_cast(f) + empty_squares); + } else { + INVALID_ARG_IF(file_count >= 8, "Too many pieces in one rank"); + INVALID_ARG_IF(!chess::is_valid(r, f), "Invalid file/rank position"); + switch (c) { + case 'p': + placePiece(make_sq(r, f), BLACK); + break; + case 'P': + placePiece(make_sq(r, f), WHITE); + break; + case 'n': + placePiece(make_sq(r, f), BLACK); + break; + case 'N': + placePiece(make_sq(r, f), WHITE); + break; + case 'b': + placePiece(make_sq(r, f), BLACK); + break; + case 'B': + placePiece(make_sq(r, f), WHITE); + break; + case 'r': + placePiece(make_sq(r, f), BLACK); + break; + case 'R': + placePiece(make_sq(r, f), WHITE); + break; + case 'q': + placePiece(make_sq(r, f), BLACK); + break; + case 'Q': + placePiece(make_sq(r, f), WHITE); + break; + case 'k': + placePiece(make_sq(r, f), BLACK); + break; + case 'K': + placePiece(make_sq(r, f), WHITE); + break; + default: + INVALID_ARG_IF(false, "Invalid FEN character"); + break; + } + + ++file_count; + f = static_cast(static_cast(f) + 1); + } + } + + // Final assertions after parsing + INVALID_ARG_IF(file_count != 8, "Last rank must have 8 squares"); + INVALID_ARG_IF(rank_count != 7, "FEN must contain exactly 8 ranks"); + } + + // 2. Turn + if (active_color == "w") { + current_state.turn = WHITE; + current_state.hash ^= zobrist::RandomTurn; + } else if (active_color == "b") { + current_state.turn = BLACK; + } else { + INVALID_ARG_IF(active_color != "w" && active_color != "b", "Expected white or black, got something else."); + } + + // 3. Castling rights + current_state.castlingRights = NO_CASTLING; + for (char c : castling) { + switch (c) { + case 'K': + INVALID_ARG_IF(chess960, "Chess960 needs specific file"); + current_state.castlingRights |= WHITE_OO; + current_state.hash ^= zobrist::RandomCastle[WHITE_OO]; + current_state.castlingMetadata[WHITE].king_start = kingSq(WHITE); + current_state.castlingMetadata[WHITE].rook_start_ks = SQ_H1; + break; + case 'Q': + INVALID_ARG_IF(chess960, "Chess960 needs specific file"); + current_state.castlingRights |= WHITE_OOO; + current_state.hash ^= zobrist::RandomCastle[WHITE_OOO]; + current_state.castlingMetadata[WHITE].king_start = kingSq(WHITE); + current_state.castlingMetadata[WHITE].rook_start_qs = SQ_A1; + break; + case 'k': + INVALID_ARG_IF(chess960, "Chess960 needs specific file"); + current_state.castlingRights |= BLACK_OO; + current_state.hash ^= zobrist::RandomCastle[BLACK_OO]; + current_state.castlingMetadata[BLACK].king_start = kingSq(BLACK); + current_state.castlingMetadata[BLACK].rook_start_ks = SQ_H8; + break; + case 'q': + INVALID_ARG_IF(chess960, "Chess960 needs specific file"); + current_state.castlingRights |= BLACK_OOO; + current_state.hash ^= zobrist::RandomCastle[BLACK_OOO]; + current_state.castlingMetadata[BLACK].king_start = kingSq(BLACK); + current_state.castlingMetadata[BLACK].rook_start_qs = SQ_A8; + break; + // some optional chess960? maybe not. + case '-': + break; + default: { + INVALID_ARG_IF(!chess960, "Invalid castling right for non-Chess960"); + if (c >= 'A' && c <= 'H') // white-castling + { + CastlingRights cr = (make_sq(RANK_1, static_cast(c - 'A')) > SQ_E1 ? WHITE_OO : WHITE_OOO); + current_state.castlingRights |= cr; + current_state.castlingMetadata[WHITE].king_start = kingSq(WHITE); + if (cr & KING_SIDE) + current_state.castlingMetadata[WHITE].rook_start_ks = make_sq(RANK_1, static_cast(c - 'A')); + else + current_state.castlingMetadata[WHITE].rook_start_qs = make_sq(RANK_1, static_cast(c - 'A')); + } else if (c >= 'a' && c <= 'h') // white-castling + { + CastlingRights cr = (make_sq(RANK_8, static_cast(c - 'a')) > SQ_E8 ? BLACK_OO : BLACK_OOO); + current_state.castlingRights |= cr; + current_state.castlingMetadata[BLACK].king_start = kingSq(BLACK); + if (cr & KING_SIDE) + current_state.castlingMetadata[BLACK].rook_start_ks = make_sq(RANK_8, static_cast(c - 'a')); + else + current_state.castlingMetadata[BLACK].rook_start_qs = make_sq(RANK_8, static_cast(c - 'a')); + } + break; + } + } + } + for (Color c : { WHITE, BLACK }) { + // king + { + const auto king_from = current_state.castlingMetadata[c].king_start; + const auto rook_from = make_sq(file_of(current_state.castlingMetadata[c].rook_start_ks), rank_of(king_from)); + const auto king_to = castling_king_square(c, true); + const auto rook_to = castling_rook_square(c, true); + current_state.castlingMetadata[c].castling_paths[true] = + (movegen::between(rook_from, rook_to) | movegen::between(king_from, king_to)) & + ~((1ULL << king_from) | (1ULL << rook_from)); + } + // queen + { + const auto king_from = current_state.castlingMetadata[c].king_start; + const auto rook_from = make_sq(file_of(current_state.castlingMetadata[c].rook_start_qs), rank_of(king_from)); + const auto king_to = castling_king_square(c, false); + const auto rook_to = castling_rook_square(c, false); + current_state.castlingMetadata[c].castling_paths[false] = + (movegen::between(rook_from, rook_to) | movegen::between(king_from, king_to)) & + ~((1ULL << king_from) | (1ULL << rook_from)); + } + } + + if (enpassant != "-" && enpassant.length() == 2 && enpassant[0] >= 'a' && enpassant[0] <= 'h' && enpassant[1] >= '1' && + enpassant[1] <= '8') { + File f = static_cast(enpassant[0] - 'a'); + Rank r = static_cast(enpassant[1] - '1'); + Square ep_sq = make_sq(r, f); + current_state.enPassant = ep_sq; + Bitboard ep_mask = 1ULL << ep_sq; + if (sideToMove() == WHITE) { + ep_mask >>= 8; + } else + ep_mask <<= 8; + ep_mask = ((ep_mask << 1) & ~attacks::MASK_FILE[0]) | ((ep_mask >> 1) & ~attacks::MASK_FILE[7]); + if (ep_mask & pieces(sideToMove())) { + current_state.hash ^= zobrist::RandomEP[f]; + current_state.epIncluded = true; + } + } else { + INVALID_ARG_IF(enpassant != "-", "Invalid en passant FEN field"); + current_state.enPassant = SQ_NONE; + } + + // 5. Halfmove clock + current_state.halfMoveClock = static_cast(halfmove); + + // 6. Fullmove number + current_state.fullMoveNumber = fullmove; + refresh_attacks(); + current_state.repetition = current_state.pliesFromNull = 0; +} + +template std::string _Position::fen() const { + std::ostringstream ss; + + // 1) Piece placement + for (Rank rank = RANK_8; rank >= RANK_1; --rank) { + int emptyCount = 0; + for (File file = FILE_A; file <= FILE_H; ++file) { + Square sq = make_sq(rank, file); // Assuming 0..63 indexing + + PieceC piece = piece_on(sq); + if (piece == PieceC::NO_PIECE) { + emptyCount++; + } else { + if (emptyCount > 0) { + ss << std::to_string(emptyCount); + emptyCount = 0; + } + ss << piece; + } + } + if (emptyCount > 0) + ss << std::to_string(emptyCount); + if (rank > 0) + ss << '/'; + } + + // 2) Side to move + ss << ' ' << (sideToMove() == WHITE ? 'w' : 'b'); + + // 3) Castling availability + ss << ' '; + std::string castlingStr; + if (castlingRights() & WHITE_OO) + castlingStr += 'K'; + if (castlingRights() & WHITE_OOO) + castlingStr += 'Q'; + if (castlingRights() & BLACK_OO) + castlingStr += 'k'; + if (castlingRights() & BLACK_OOO) + castlingStr += 'q'; + ss << (castlingStr.empty() ? "-" : castlingStr); + + // 4) En passant target square or '-' + ss << ' '; + Square ep = ep_square(); + ss << (ep == SQ_NONE ? "-" : uci::squareToString(ep)); + + // 5) Halfmove clock + ss << ' ' << (int)halfmoveClock(); + + // 6) Fullmove number + ss << ' ' << (int)fullmoveNumber(); + + return ss.str(); +} +template template bool _Position::is_valid() const { + if (count() != 1) + return false; + if (count() != 1) + return false; + Color stm = sideToMove(); + // stm checking + bool whiteInCheck = isAttacked(kingSq(WHITE), BLACK); + bool blackInCheck = isAttacked(kingSq(BLACK), WHITE); + + // Both kings cannot be in check simultaneously + if (whiteInCheck && blackInCheck) + return false; + + // The side to move cannot have its king currently in check from itself (nonsense) + if (isAttacked(kingSq(~stm), stm)) + return false; + if (piece_on(SQ_A1) != PieceC::WROOK && (castlingRights() & WHITE_OOO) != 0) + return false; + // pawns not on backrank + if ((pieces(PAWN) & (attacks::MASK_RANK[RANK_1] | attacks::MASK_RANK[RANK_8])) != 0) + return false; + if constexpr (Strict) { + // pawns not > 8 + { + int pawns = count(); + int queens = count(); + int rooks = count(); + int bishops = count(); + int knights = count(); + + // Base set: 1 queen, 2 rooks, 2 bishops, 2 knights + int promotions = + std::max(0, (queens - 1)) + std::max(0, (rooks - 2)) + std::max(0, (bishops - 2)) + std::max(0, (knights - 2)); + + if (pawns + promotions > 8) + return false; // impossible + } + { + int pawns = count(); + int queens = count(); + int rooks = count(); + int bishops = count(); + int knights = count(); + + // Base set: 1 queen, 2 rooks, 2 bishops, 2 knights + int promotions = + std::max(0, (queens - 1)) + std::max(0, (rooks - 2)) + std::max(0, (bishops - 2)) + std::max(0, (knights - 2)); + + if (pawns + promotions > 8) + return false; // impossible + } + } + if (Square ep_sq = ep_square(); ep_sq != SQ_NONE) { + if ((stm == WHITE && rank_of(ep_sq) != RANK_6) || (stm == BLACK && rank_of(ep_sq) != RANK_3)) + return false; + Square behind = ep_sq + ((stm == WHITE) ? SOUTH : NORTH); + if (piece_at(behind) != make_piece(PAWN, ~stm)) + return false; + + if (!(attacks::pawn(~stm, ep_sq) & pieces(stm))) + return false; + } + // Too many checkers + if (popcount(checkers()) > 2) + return false; + return true; +} +template CheckType _Position::givesCheck(Move m) const { + const static auto getSniper = [](const _Position *p, Square ksq, Bitboard oc) { + const auto us_occ = p->us(p->sideToMove()); + const auto bishop = attacks::bishop(ksq, oc) & p->pieces(PieceType::BISHOP, PieceType::QUEEN) & us_occ; + const auto rook = attacks::rook(ksq, oc) & p->pieces(PieceType::ROOK, PieceType::QUEEN) & us_occ; + return (bishop | rook); + }; + + assert(color_of(at(m.from())) == sideToMove()); + + const Square from = m.from(); + const Square to = m.to(); + const Square ksq = kingSq(~sideToMove()); + const Bitboard toBB = 1ULL << (to); + const PieceType pt = piece_of(at(from)); + + Bitboard fromKing = 0ull; + + if (pt == PieceType::PAWN) { + fromKing = attacks::pawn(~side_to_move(), ksq); + } else if (pt == PieceType::KNIGHT) { + fromKing = attacks::knight(ksq); + } else if (pt == PieceType::BISHOP) { + fromKing = attacks::bishop(ksq, occ()); + } else if (pt == PieceType::ROOK) { + fromKing = attacks::rook(ksq, occ()); + } else if (pt == PieceType::QUEEN) { + fromKing = attacks::queen(ksq, occ()); + } + + if (fromKing & toBB) + return CheckType::DIRECT_CHECK; + + // Discovery check + const Bitboard fromBB = 1ULL << (from); + const Bitboard oc = occ() ^ fromBB; + + Bitboard sniper = getSniper(this, ksq, oc); + + if (sniper) { + Square sq = (Square)pop_lsb(sniper); + return (!(movegen::between(ksq, sq) & toBB) || m.typeOf() == Move::CASTLING) ? CheckType::DISCOVERY_CHECK + : CheckType::NO_CHECK; + } + + switch (m.typeOf()) { + case Move::NORMAL: + return CheckType::NO_CHECK; + + case Move::PROMOTION: { + Bitboard attacks = 0ull; + + switch (m.promotionType()) { + case KNIGHT: + attacks = attacks::knight(to); + break; + case BISHOP: + attacks = attacks::bishop(to, oc); + break; + case ROOK: + attacks = attacks::rook(to, oc); + break; + case QUEEN: + attacks = attacks::queen(to, oc); + break; + default: + break; + } + + return (attacks & pieces(PieceType::KING, ~sideToMove())) ? CheckType::DIRECT_CHECK : CheckType::NO_CHECK; + } + + case Move::ENPASSANT: { + Square capSq = make_sq(file_of(to), rank_of(from)); + return (getSniper(this, ksq, (oc ^ (1ULL << capSq)) | toBB)) ? CheckType::DISCOVERY_CHECK : CheckType::NO_CHECK; + } + + case Move::CASTLING: { + Square rookTo = relative_square(side_to_move(), to > from ? SQ_F1 : SQ_D1); + return (attacks::rook(ksq, occ()) & (1ULL << rookTo)) ? CheckType::DISCOVERY_CHECK : CheckType::NO_CHECK; + } + } + + assert(false); + return CheckType::NO_CHECK; // Prevent a compiler warning +} +template void _Position::refresh_attacks() { + Color c = sideToMove(); + + Square king_sq = kingSq(c); + _bishop_pin = pinMask(c, king_sq); + _rook_pin = pinMask(c, king_sq); + _pin_mask = _bishop_pin | _rook_pin; + + _checkers = attackers(~c, king_sq); + + int num_checks = popcount(_checkers); + + switch (num_checks) { + case 0: + _check_mask = ~0ULL; // no checks, full mask + break; + + case 1: { + Square sq = static_cast(lsb(_checkers)); + Bitboard mask = (1ULL << sq) | movegen::between(king_sq, sq); + _check_mask = mask; + break; + } + + default: + _check_mask = 0ULL; // multiple checks, no blocking mask + break; + } +} +template uint64_t _Position::zobrist() const { + uint64_t hash = 0; + for (int sq = 0; sq < 64; ++sq) { + auto p = piece_on((Square)sq); + hash ^= (p == PieceC::NO_PIECE) ? 0 : zobrist::RandomPiece[enum_idx()][(int)p][sq]; + } + hash ^= (current_state.turn == WHITE) ? zobrist::RandomTurn : 0; + hash ^= zobrist::RandomCastle[current_state.castlingRights]; + auto ep_sq = current_state.enPassant; + if (ep_sq == SQ_NONE) + return hash; + if (ep_sq != SQ_NONE) { + File f = file_of(ep_sq); + Bitboard ep_mask = (1ULL << ep_sq); + + // Shift to the rank where the opposing pawn sits + Color stm = sideToMove(); + // Color them = ~stm; + ep_mask = (stm == WHITE) ? (ep_mask >> 8) : (ep_mask << 8); + + // Pawns on adjacent files only + ep_mask = ((ep_mask << 1) & ~attacks::MASK_FILE[0]) | ((ep_mask >> 1) & ~attacks::MASK_FILE[7]); + + if (ep_mask & pieces(stm)) + hash ^= zobrist::RandomEP[f]; + } + return hash; +} + +template Move _Position::parse_uci(std::string uci) const { + return chess::uci::uciToMove(*this, uci); +} + +template Move _Position::push_uci(std::string uci) { + auto mv = parse_uci(uci); + doMove(mv); + return mv; +} +template Square _Position::_valid_ep_square() const { + if (ep_square() == SQ_NONE) + return SQ_NONE; + Rank ep_rank = sideToMove() == WHITE ? RANK_6 : RANK_3; + Bitboard mask = 1ULL << ep_square(); + Bitboard pawn_mask = mask << 8; + Bitboard org_pawn_mask = mask >> 8; + if (sideToMove() == BLACK) + std::swap(pawn_mask, org_pawn_mask); + // rank 3 or rank 6, depending on color + if (rank_of(ep_square()) != ep_rank) + return SQ_NONE; + // a pawn in 2 ranks behind + if (!(pieces(PAWN) & occ(~sideToMove()) & pawn_mask)) + return SQ_NONE; + // ep_sq must be empty + if (occ() & mask) + return SQ_NONE; + // emptied second rank + if (occ() & org_pawn_mask) + return SQ_NONE; + return ep_square(); +} +template bool _Position::is_insufficient_material(Color c) const { + const auto count = popcount(occ()); + + // only kings, draw + if (count == 2) + return true; + + // only bishop + knight, can't mate + if (count == 3) { + if (pieces(PieceType::BISHOP, Color::WHITE) || pieces(PieceType::BISHOP, Color::BLACK)) + return true; + if (pieces(PieceType::KNIGHT, Color::WHITE) || pieces(PieceType::KNIGHT, Color::BLACK)) + return true; + } + + // same-colored bishops, can't mate + if (count == 4) { + // bishops on same color (one per side) + if (pieces(PieceType::BISHOP, Color::WHITE) && pieces(PieceType::BISHOP, Color::BLACK)) { + Square w = (Square)lsb(pieces(PieceType::BISHOP, Color::WHITE)); + Square b = (Square)lsb(pieces(PieceType::BISHOP, Color::BLACK)); + if (((9 * (w ^ b)) & 8) == 0) + return true; + } + + // one side with two bishops on same color + auto white_bishops = pieces(PieceType::BISHOP, Color::WHITE); + auto black_bishops = pieces(PieceType::BISHOP, Color::BLACK); + + if (popcount(white_bishops) == 2) { + Square b1 = (Square)lsb(white_bishops); + Square b2 = (Square)msb(white_bishops); + if (((9 * (b1 ^ b2)) & 8) == 0) + return true; + } else if (popcount(black_bishops) == 2) { + Square b1 = (Square)lsb(black_bishops); + Square b2 = (Square)msb(black_bishops); + if (((9 * (b1 ^ b2)) & 8) == 0) + return true; + } + } + + return false; +} +template CastlingRights _Position::clean_castling_rights() const { + constexpr Bitboard cr_WOO = 1ULL << SQ_H1; + constexpr Bitboard cr_WOOO = 1ULL << SQ_A1; + constexpr Bitboard cr_BOO = 1ULL << SQ_H8; + constexpr Bitboard cr_BOOO = 1ULL << SQ_A8; + if (history.size()) + return castlingRights(); + Bitboard castling = 0; + // mappings + castling |= (castlingRights() & WHITE_OO) ? cr_WOO : 0; + castling |= (castlingRights() & WHITE_OOO) ? cr_WOOO : 0; + + castling |= (castlingRights() & BLACK_OO) ? cr_BOO : 0; + castling |= (castlingRights() & BLACK_OOO) ? cr_BOOO : 0; + castling &= pieces(ROOK); + Bitboard white_castling = castling & attacks::MASK_RANK[RANK_1] & occ(WHITE); + Bitboard black_castling = castling & attacks::MASK_RANK[RANK_8] & occ(BLACK); + // rook exists in corresponding square + white_castling &= (cr_WOO | cr_WOOO); + black_castling &= (cr_BOO | cr_BOOO); + // king exists in e1/e8 depending on color + if (!(occ(WHITE) & pieces(KING) & (1ULL << SQ_E1))) + white_castling = 0; + if (!(occ(BLACK) & pieces(KING) & (1ULL << SQ_E8))) + black_castling = 0; + castling = white_castling | black_castling; + // Re-map + CastlingRights cr = NO_CASTLING; + cr |= (castling & cr_WOO) ? WHITE_OO : NO_CASTLING; + cr |= (castling & cr_WOOO) ? WHITE_OOO : NO_CASTLING; + cr |= (castling & cr_BOO) ? BLACK_OO : NO_CASTLING; + cr |= (castling & cr_BOOO) ? BLACK_OOO : NO_CASTLING; + return cr; +} +// clang-format off +#define INSTANTIATE(PieceC) \ +template void _Position::setFEN(const std::string &, bool); \ +template std::string _Position::fen() const; \ +template void _Position::doMove(const Move &move); \ +template void _Position::doMove(const Move &move); \ +template void _Position::refresh_attacks(); \ +template uint64_t _Position::zobrist() const; \ +template Move _Position::parse_uci(std::string) const; \ +template Move _Position::push_uci(std::string); \ +template bool _Position::is_valid() const; \ +template bool _Position::is_valid() const; \ +template CheckType _Position::givesCheck(Move) const; \ +template bool _Position::is_insufficient_material() const; +// clang-format off +INSTANTIATE(PolyglotPiece) +INSTANTIATE(EnginePiece) +INSTANTIATE(ContiguousMappingPiece) +#undef INSTANTIATE +} // namespace chess + + diff --git a/position.h b/position.h index f311718..3c4047d 100644 --- a/position.h +++ b/position.h @@ -1,675 +1,676 @@ -#pragma once -#include "attacks.h" -#include "bitboard.h" -#include "movegen.h" -#include "printers.h" -#include "types.h" -#include "zobrist.h" -#include -#include -#include -#include -#include -namespace chess { - -template struct alignas(64) HistoryEntry { - // Bitboards for each piece type (white and black) - Bitboard pieces[7]; - Bitboard occ[COLOR_NB]; - Color turn; // true if white to move - Move mv; - Key hash; - uint8_t halfMoveClock; // Half-move clock for 50/75-move rule - uint16_t fullMoveNumber; // Full-move number (starts at 1) - bool epIncluded; - int8_t repetition = 0; - uint8_t pliesFromNull = 0; - Square enPassant = SQ_NONE; // En passant target square - Square kings[COLOR_NB] = { SQ_NONE }; - CastlingRights castlingRights; // Castling rights bitmask - Square incr_sqs[4] = { SQ_NONE, SQ_NONE, SQ_NONE, SQ_NONE }; - Piece incr_pc[4] = { Piece::NO_PIECE, Piece::NO_PIECE, Piece::NO_PIECE, Piece::NO_PIECE }; - struct { - Square king_start = SQ_NONE; - Square rook_start_ks = SQ_NONE; - Square rook_start_qs = SQ_NONE; - std::array castling_paths; - } castlingMetadata[2]; - // implementation-specific implementations goes here -}; - -template class HeapAllocatedValueList { - private: - constexpr static int ALIGNMENT = 64; - - public: - using size_type = std::size_t; - inline HeapAllocatedValueList() { - values_ = reinterpret_cast(::operator new(MaxSize * sizeof(T), std::align_val_t{ ALIGNMENT })); - assert(values_); - } - inline ~HeapAllocatedValueList() { ::operator delete(values_, std::align_val_t{ ALIGNMENT }); } - - HeapAllocatedValueList(const HeapAllocatedValueList &other) : size_(other.size_) { - if (values_) - ::operator delete(values_, std::align_val_t{ ALIGNMENT }); - values_ = reinterpret_cast(::operator new(MaxSize * sizeof(T), std::align_val_t{ ALIGNMENT })); - assert(values_); - std::copy(other.values_, other.values_ + size_, values_); - } - - HeapAllocatedValueList &operator=(const HeapAllocatedValueList &other) { - if (this != &other) { - ::operator delete(values_, std::align_val_t{ ALIGNMENT }); - // Allocate new memory and copy - T *new_values = reinterpret_cast(::operator new(MaxSize * sizeof(T), std::align_val_t{ ALIGNMENT })); - assert(new_values); - std::copy(other.values_, other.values_ + other.size_, new_values); - - // Free old memory - free(values_); - - // Assign new data - values_ = new_values; - size_ = other.size_; - } - return *this; - } - - HeapAllocatedValueList(HeapAllocatedValueList &&other) noexcept : size_(other.size_) { - ::operator delete(values_, std::align_val_t{ ALIGNMENT }); - values_ = reinterpret_cast(::operator new(MaxSize * sizeof(T), std::align_val_t{ ALIGNMENT })); - assert(values_); - std::copy(other.values_, other.values_ + size_, values_); - } - - HeapAllocatedValueList &operator=(HeapAllocatedValueList &&other) noexcept { - if (this != &other) { - ::operator delete(values_, std::align_val_t{ ALIGNMENT }); - values_ = reinterpret_cast(::operator new(MaxSize * sizeof(T), std::align_val_t{ ALIGNMENT })); - assert(values_); - std::copy(other.values_, other.values_ + size_, values_); - } - return *this; - } - inline size_type size() const { return size_; } - - inline void push_back(const T &value) { - assert(size_ < MaxSize); - - values_[size_++] = value; - } - inline void clear() { size_ = 0; } - inline const T &pop() { - assert(size_ > 0); - return values_[--size_]; // always safe due to mask - } - - inline void pop_back() { size_ -= (size_ > 0) ? 1 : 0; } - - inline const T &front() const { return (size_ > 0) ? values_[0] : T{}; } - - inline T &operator[](int index) { - assert(index < MaxSize); // relax the conditions, it's BRANCHLESS so forgive - size_type i = static_cast(index); - return values_[i]; - } - - inline T &operator[](int index) const { - assert(index < MaxSize); // relax the conditions, it's BRANCHLESS so forgive - size_type i = static_cast(index); - return values_[i]; - } - inline const T *begin() const { return values_; } - inline T *data() { return values_; } - inline const T *end() const { return values_ + size_; } - size_type size_ = 0; - - private: - T *values_ = nullptr; -}; - -enum class CheckType { NO_CHECK, DIRECT_CHECK, DISCOVERY_CHECK }; -enum class MoveGenType : uint16_t { - NONE = 0, - - // piece selectors - PAWN = 1 << 1, - KNIGHT = 1 << 2, - BISHOP = 1 << 3, - ROOK = 1 << 4, - QUEEN = 1 << 5, - KING = 1 << 6, - - PIECE_MASK = PAWN | KNIGHT | BISHOP | ROOK | QUEEN | KING, - - // move-type selectors - CAPTURE = 1 << 7, - QUIET = 1 << 8, - - ALL = PIECE_MASK | CAPTURE | QUIET -}; - -template constexpr MoveGenType operator&(MoveGenType a, MoveGenType b) { - using U = std::underlying_type_t; - return static_cast(static_cast(a) & static_cast(b)); -} -template constexpr MoveGenType operator|(MoveGenType a, MoveGenType b) { - using U = std::underlying_type_t; - return static_cast(static_cast(a) | static_cast(b)); -} -template ::value>> class _Position { - private: - HistoryEntry current_state; - - // Move history stack - HeapAllocatedValueList, 6144> - history; - Bitboard _rook_pin; - Bitboard _bishop_pin; - Bitboard _checkers; - Bitboard _check_mask; - Bitboard _pin_mask; - alignas(64) PieceC pieces_list[SQUARE_NB + 1] = { - PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, - PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, - PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, - PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, - PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, - PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, - PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, - PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, - PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, - PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, - PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE - }; - bool _chess960; - public: - // Legal move generation functions - template __FORCEINLINE void legals(Movelist &out) const { - - constexpr uint16_t raw = static_cast(type); - constexpr uint16_t pieceBits = raw & static_cast(MoveGenType::PIECE_MASK); - constexpr uint16_t modeBits = - raw & (static_cast(MoveGenType::CAPTURE) | static_cast(MoveGenType::QUIET)); - - // ---------------------------------------- - // Resolve default piece selection - // ---------------------------------------- - constexpr uint16_t effectivePieces = - pieceBits ? pieceBits - : (raw == static_cast(MoveGenType::NONE) ? 0 : static_cast(MoveGenType::PIECE_MASK)); - - // ---------------------------------------- - // Resolve default mode selection - // ---------------------------------------- - constexpr bool includeCaps = modeBits == 0 || (modeBits & static_cast(MoveGenType::CAPTURE)); - constexpr bool includeQuiet = modeBits == 0 || (modeBits & static_cast(MoveGenType::QUIET)); - constexpr bool captureOnly = includeCaps && !includeQuiet; - - // Early-out for NONE - if constexpr (effectivePieces == 0 && modeBits != 0) - return; - - // Now your existing piece dispatch logic stays the same: - if constexpr (effectivePieces & static_cast(MoveGenType::PAWN)) { - movegen::genPawnSingleMoves(*this, out, _rook_pin, _bishop_pin, _check_mask); - if constexpr (includeQuiet) - movegen::genPawnDoubleMoves(*this, out, _pin_mask, _check_mask); - if constexpr (includeCaps) - movegen::genEP(*this, out); - } - - if constexpr (effectivePieces & static_cast(MoveGenType::KNIGHT)) { - movegen::genKnightMoves(*this, out, _pin_mask, _check_mask); - } - - if constexpr (effectivePieces & static_cast(MoveGenType::KING)) { - movegen::genKingMoves(*this, out); - } - - if constexpr (effectivePieces & static_cast(MoveGenType::BISHOP)) { - movegen::genSlidingMoves(*this, out, _rook_pin, _bishop_pin, _check_mask); - } - - if constexpr (effectivePieces & static_cast(MoveGenType::ROOK)) { - movegen::genSlidingMoves(*this, out, _rook_pin, _bishop_pin, _check_mask); - } - - if constexpr (effectivePieces & static_cast(MoveGenType::QUEEN)) { - movegen::genSlidingMoves(*this, out, _rook_pin, _bishop_pin, _check_mask); - } - } - - // Legal move generation functions - template __FORCEINLINE void legals(Movelist &out) const { - const Color stm = sideToMove(); // Cache it - ASSUME(stm == WHITE || stm == BLACK); // Now clearly no side effects - - switch (stm) { - case WHITE: - legals(out); - return; - case BLACK: - legals(out); - return; - default: - UNREACHABLE(); - return; - } - } - template void doMove(const Move &move); - template inline auto undoMove() -> std::conditional_t &, void> { - assert(history.size_ > 0 && "undoMove called with empty history"); - - // Restore previous state from history - assert(current_state.mv.is_ok() && "Corrupted history entry"); - assert(current_state.incr_pc[0] != at(current_state.mv.from()) && "Corrupted history entry"); - pieces_list[current_state.incr_sqs[0]] = current_state.incr_pc[0]; - pieces_list[current_state.incr_sqs[1]] = current_state.incr_pc[1]; - pieces_list[current_state.incr_sqs[2]] = current_state.incr_pc[2]; - pieces_list[current_state.incr_sqs[3]] = current_state.incr_pc[3]; - current_state = history.pop(); - if constexpr (RetAll) { - return current_state; - } - } - - __FORCEINLINE void doNullMove() { - history.push_back(current_state); - current_state.turn = ~current_state.turn; - current_state.hash ^= zobrist::RandomTurn; - current_state.fullMoveNumber += (current_state.turn == WHITE); - current_state.pliesFromNull = current_state.repetition = 0; - current_state.mv = Move::null(); - } - - __FORCEINLINE Bitboard pieces() const { return occ(); } - template __FORCEINLINE Bitboard pieces(Color c) const { - ASSUME(c == WHITE || c == BLACK); - if constexpr (pt == PIECE_TYPE_NB || pt == ALL_PIECES) - return occ(c); - return current_state.pieces[pt] & current_state.occ[c]; - } - template __FORCEINLINE Bitboard pieces(PieceType pt) const { - ASSUME(c == WHITE || c == BLACK); - if (pt == PIECE_TYPE_NB || pt == ALL_PIECES) - return occ(c); - return current_state.pieces[pt] & current_state.occ[c]; - } - template inline Bitboard pieces() const { - ASSUME(c == WHITE || c == BLACK); - if constexpr (pt == PIECE_TYPE_NB || pt == ALL_PIECES) - return occ(c); - return current_state.pieces[pt] & current_state.occ[c]; - } - __FORCEINLINE Bitboard pieces(PieceType pt, Color c) const { - ASSUME(c == WHITE || c == BLACK); - // still branchless - switch (pt) { - case PIECE_TYPE_NB: - case ALL_PIECES: - return occ(c); - default: - return current_state.pieces[pt] & current_state.occ[c]; - } - } - __FORCEINLINE Bitboard pieces(PieceType pt) const { - switch (int(pt)) { - case PIECE_TYPE_NB: - case ALL_PIECES: - return occ(); - default: - return current_state.pieces[pt]; - } - } - template && ...)>> - [[nodiscard]] __FORCEINLINE Bitboard pieces(PTypes... ptypes) const { - return (current_state.pieces[static_cast(ptypes)] | ...); - } - - template && ...)>> - [[nodiscard]] __FORCEINLINE Bitboard pieces(Color c, PTypes... ptypes) const { - return (pieces(ptypes, c) | ...); - } - - /** - * @brief Returns the origin squares of pieces of a given color attacking a target square - * - * Sample code to not make myself (and others) confused: - ```c++ - if (attackers(BLACK, E4)) { - std::cout << "E4 is under attack by black!"; - } - ``` - * - * @param color Attacker Color - * @param square Attacked Square - * @param occupied Board occupation - * @return Attackers to the bitboard - */ - [[nodiscard]] __FORCEINLINE Bitboard attackers(Color color, Square square, Bitboard occupied) const { - auto queens = pieces(color); - - // using the fact that if we can attack PieceType from square, they can attack us back - auto atks = (attacks::pawn(~color, square) & pieces(color)); - atks |= (attacks::knight(square) & pieces(color)); - atks |= (attacks::bishop(square, occupied) & (pieces(color) | queens)); - atks |= (attacks::rook(square, occupied) & (pieces(color) | queens)); - atks |= (attacks::king(square) & pieces(color)); - - return atks & occupied; - } - - /** - * @brief Checks if a square is attacked by the given color. - * @param square - * @param color - * @return - */ - [[nodiscard]] __FORCEINLINE bool isAttacked(Square sq, Color by) const noexcept { - const Bitboard occ_bb = occ(); - const Bitboard us_bb = occ(by); - - Bitboard diag_attackers = pieces(PieceType::BISHOP, by) | pieces(PieceType::QUEEN, by); - Bitboard ortho_attackers = pieces(PieceType::ROOK, by) | pieces(PieceType::QUEEN, by); - - return (attacks::pawn(~by, sq) & pieces(PieceType::PAWN, by)) || - (attacks::knight(sq) & pieces(PieceType::KNIGHT, by)) || (attacks::king(sq) & pieces(PieceType::KING, by)) || - (attacks::bishop(sq, occ_bb) & diag_attackers & us_bb) || (attacks::rook(sq, occ_bb) & ortho_attackers & us_bb); - } - /** - * @brief Checks if a square is attacked by the given color. - * @param square - * @param color - * @param occupied - * @return - */ - [[nodiscard]] __FORCEINLINE bool isAttacked(Square sq, Color by, Bitboard occupied) const noexcept { - const Bitboard diag_attackers = pieces(PieceType::BISHOP, by) | pieces(PieceType::QUEEN, by); - const Bitboard ortho_attackers = pieces(PieceType::ROOK, by) | pieces(PieceType::QUEEN, by); - - return (attacks::pawn(~by, sq) & pieces(PieceType::PAWN, by)) || - (attacks::knight(sq) & pieces(PieceType::KNIGHT, by)) || (attacks::king(sq) & pieces(PieceType::KING, by)) || - (attacks::bishop(sq, occupied) & diag_attackers) || (attacks::rook(sq, occupied) & ortho_attackers); - } - - [[nodiscard]] __FORCEINLINE Bitboard attackers(Color color, Square square) const { return attackers(color, square, occ()); } - - template __FORCEINLINE void placePiece(Square sq, Color c) { - if constexpr (pt != NO_PIECE_TYPE) { - Bitboard v = 1ULL << sq; - current_state.pieces[pt] |= v; - current_state.occ[c] |= v; - pieces_list[sq] = make_piece(pt, c); - current_state.hash ^= zobrist::RandomPiece[enum_idx()][(int)pieces_list[sq]][sq]; - if constexpr (pt == KING) - current_state.kings[c] = sq; - } - } - - template __FORCEINLINE void removePiece(Square sq, Color c) { - if constexpr (pt != NO_PIECE_TYPE) { - Bitboard v = ~(1ULL << sq); - current_state.pieces[pt] &= v; - current_state.occ[c] &= v; - pieces_list[sq] = PieceC::NO_PIECE; - current_state.hash ^= zobrist::RandomPiece[enum_idx()][static_cast(make_piece(pt, c))][sq]; - if constexpr (pt == KING) - current_state.kings[c] = SQ_NONE; - } - } - - __FORCEINLINE void placePiece(PieceType pt, Square sq, Color c) { - bool a = pt == KING; - // if (pt == NO_PIECE_TYPE) - // return; - Bitboard v = 1ULL << sq; - current_state.pieces[pt] |= v; - current_state.occ[c] |= v; - pieces_list[sq] = make_piece(pt, c); - current_state.hash ^= zobrist::RandomPiece[enum_idx()][(int)pieces_list[sq]][sq]; - current_state.kings[c] = a ? sq : current_state.kings[c]; - } - - __FORCEINLINE void removePiece(PieceType pt, Square sq, Color c) { - bool a = pt == KING; - if (pt != NO_PIECE_TYPE) { - Bitboard v = ~(1ULL << sq); - current_state.pieces[pt] &= v; - current_state.occ[c] &= v; - pieces_list[sq] = PieceC::NO_PIECE; - current_state.hash ^= zobrist::RandomPiece[enum_idx()][static_cast(make_piece(pt, c))][sq]; - current_state.kings[c] = a ? SQ_NONE : current_state.kings[c]; - } - } - - __FORCEINLINE Bitboard occ(Color c) const { - ASSUME(c != COLOR_NB); - return current_state.occ[c]; - } - __FORCEINLINE Bitboard occ() const { return current_state.occ[0] | current_state.occ[1]; } - PieceC piece_on(Square s) const { - assert(chess::is_valid(s)); -#if !defined(_DEBUG) || defined(NDEBUG) - return pieces_list[s]; -#else - PieceC _p2; - Bitboard mask = (1ULL << s); - if (((current_state.occ[WHITE] | current_state.occ[BLACK]) & mask) == 0) { - _p2 = PieceC::NO_PIECE; - } else { - bool c = (current_state.occ[WHITE] & mask) != 0; - for (PieceType pt : { PAWN, KNIGHT, BISHOP, ROOK, QUEEN, KING }) { - bool is_p = (current_state.pieces[(int)pt] & mask) != 0; - if (is_p) { - _p2 = make_piece(pt, c ? WHITE : BLACK); - break; - } - } - } - auto p = pieces_list[s]; -#ifndef __EXCEPTIONS - assert(p == _p2 && "Inconsistient piece map"); -#else - if (p != _p2) - throw std::invalid_argument("Inconsistient piece map"); -#endif - return p; -#endif - } - __FORCEINLINE Bitboard us(Color c) const { return occ(c); } - __FORCEINLINE Color sideToMove() const { return current_state.turn; } - __FORCEINLINE uint64_t hash() const { return current_state.hash; } - __FORCEINLINE uint64_t key() const { return current_state.hash; } - __FORCEINLINE Color side_to_move() const { return current_state.turn; } - __FORCEINLINE Square ep_square() const { return current_state.enPassant; } - template __FORCEINLINE Square square(Color c) const { return Square(lsb(pieces(c))); } - __FORCEINLINE Square kingSq(Color c) const { return current_state.kings[c]; } - __FORCEINLINE Bitboard checkers() const { return _checkers; } - __FORCEINLINE Bitboard pin_mask() const { return _pin_mask; } - __FORCEINLINE _Position(std::string fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", bool chess960 = false) { - setFEN(fen, chess960); - } - __FORCEINLINE bool isCapture(Move mv) const { - return mv.type_of() == EN_PASSANT || (mv.type_of() != CASTLING && piece_on(mv.to_sq()) != PieceC::NO_PIECE); - } - __FORCEINLINE bool is_capture(Move mv) const { return isCapture(mv); } - __FORCEINLINE bool is_zeroing(Move mv) const { return isCapture(mv) || type_of(at(mv.from_sq())) == PAWN; } - std::string fen() const; - __FORCEINLINE uint8_t halfmoveClock() const { return current_state.halfMoveClock; } - __FORCEINLINE uint16_t fullmoveNumber() const { return current_state.fullMoveNumber; } - __FORCEINLINE uint8_t rule50_count() const { return current_state.halfMoveClock; } - __FORCEINLINE CastlingRights castlingRights(Color c) const { - return current_state.castlingRights & (c == WHITE ? WHITE_CASTLING : BLACK_CASTLING); - } - __FORCEINLINE CastlingRights castlingRights() const { return current_state.castlingRights; } - __FORCEINLINE bool is_castling(Move mv) const { return mv.type_of() == CASTLING; } - __FORCEINLINE const HistoryEntry &state() const { return current_state; } - uint64_t zobrist() const; - __FORCEINLINE PieceC piece_at(Square sq) const { return piece_on(sq); } - template - __FORCEINLINE PieceC at(Square sq) const { - assert(chess::is_valid(sq)); - if constexpr (std::is_same_v) return piece_of(piece_at(sq)); - else return piece_at(sq); - } - __FORCEINLINE Square enpassantSq() const { return ep_square(); } - CastlingRights clean_castling_rights() const; - void setFEN(const std::string &str, bool chess960); - __FORCEINLINE void set_fen(const std::string &str, bool chess960) { setFEN(str, chess960); } - Move parse_uci(std::string) const; - Move push_uci(std::string); - Square _valid_ep_square() const; - template __FORCEINLINE int count() const { return popcount(pieces(pt)); } - template __FORCEINLINE int count() const { return popcount(pieces()); } - template __FORCEINLINE int count(Color c) const { return popcount(pieces(c)); } - __FORCEINLINE int count(PieceType pt, Color c) const { return popcount(pieces(pt, c)); } - __FORCEINLINE int ply() const { return 2 * (current_state.fullMoveNumber - 1) + (sideToMove() == BLACK); } - bool is_insufficient_material(Color c) const; - __FORCEINLINE bool isInsufficientMaterial(Color c) const { return is_insufficient_material(c); } - __FORCEINLINE bool hasInsufficientMaterial(Color c) const { return is_insufficient_material(c); } - __FORCEINLINE bool has_insufficient_material(Color c) const { return is_insufficient_material(c); } - __FORCEINLINE bool is_insufficient_material() const { - return has_insufficient_material(WHITE) && has_insufficient_material(BLACK); - } - __FORCEINLINE bool isInsufficientMaterial() const { return is_insufficient_material(); } - __FORCEINLINE bool hasNonPawnMaterial(Color c) const { return bool(us(c) ^ (pieces(PAWN, KING) & us(c))); } - __FORCEINLINE bool inCheck() const { return checkers() != 0; } - __FORCEINLINE bool is_check() const { return checkers() != 0; } - __FORCEINLINE bool has_castling_rights(Color c) const { return castlingRights(c) != 0; } - __FORCEINLINE bool has_kingside_castling_rights(Color c) const { return (castlingRights(c) & KING_SIDE) != 0; } - __FORCEINLINE bool has_queenside_castling_rights(Color c) const { return (castlingRights(c) & QUEEN_SIDE) != 0; } - // Return true if a position repeats once earlier but strictly - // after the root, or repeats twice before or at the root. - __FORCEINLINE bool is_repetition(int ply) const { return current_state.repetition && current_state.repetition < ply; } - // Test if it's draw of 75 move rule (that forces everyone to draw). Excludes checkmates, of course! - __FORCEINLINE bool is_draw(int ply) const { return rule50_count() > 99 || is_repetition(ply); } - // Tests whether there has been at least one repetition - // of positions since the last capture or pawn move. - __FORCEINLINE bool has_repeated() const { - auto idx = history.size() - 1; - int end = std::min(rule50_count(), current_state.pliesFromNull); - while (end-- >= 4) { - if (history[idx].repetition) - return true; - - idx--; - } - return false; - } - __FORCEINLINE bool _is_halfmoves(int n) const { return rule50_count() >= n; } - __FORCEINLINE bool chess960() const { return _chess960; } - __FORCEINLINE bool is_seventyfive_moves(int n) const { return _is_halfmoves(150); } - __FORCEINLINE bool is_fifty_moves(int n) const { return _is_halfmoves(150); } - __FORCEINLINE bool is_fivefold_repetition() const { return is_repetition(5); } - __FORCEINLINE bool is_attacked_by(Color color, Square sq, Bitboard occupied = 0) const { - Bitboard occ_bb = occupied ? occupied : this->occ(); - return attackers_mask(color, sq, occ_bb) != 0; - } - - __FORCEINLINE bool was_into_check() const { - bool atk = false; - Bitboard bb = pieces(~sideToMove()); - while (!atk && bb) { - atk |= isAttacked((Square)pop_lsb(bb), sideToMove()); - } - return atk != 0; - } - __FORCEINLINE Bitboard attackers_mask(Color color, Square square, Bitboard occupied) const { - auto queens = pieces(color); - - // using the fact that if we can attack PieceType from square, they can attack us back - auto atks = (attacks::pawn(~color, square) & pieces(color)); - atks |= (attacks::knight(square) & pieces(color)); - atks |= (attacks::bishop(square, occupied) & (pieces(color) | queens)); - atks |= (attacks::rook(square, occupied) & (pieces(color) | queens)); - atks |= (attacks::king(square) & pieces(color)); - - return atks & occ(color); - } - __FORCEINLINE bool _attacked_for_king(Bitboard path, Bitboard occupied) const { - Bitboard b = 0; - while (!b && path) { - b |= attackers_mask(~sideToMove(), static_cast(pop_lsb(path)), occupied); - } - return b != 0; - } - __FORCEINLINE bool is_checkmate() const { - Movelist moves; - legals(moves); - return inCheck() && !moves.size(); - } - __FORCEINLINE bool is_stalemate() const { - Movelist moves; - legals(moves); - return !inCheck() && !moves.size(); - } - // Material-only key (note: Zobrist=Zpieces^Zep^Zcastling^Zturn, we just XORs the remaining, it's trivial) - __FORCEINLINE Key material_key() const { - return hash() ^ (zobrist::RandomTurn * ~sideToMove()) ^ (zobrist::RandomCastle[castlingRights()]) ^ - (zobrist::RandomEP[ep_square() == SQ_NONE ? file_of(ep_square()) : FILE_NB]); - } - template bool is_valid() const; - CheckType givesCheck(Move move) const; - /** - * @brief Checks if the current position is a draw by 50 move rule. - * Keep in mind that by the rules of chess, if the position has 50 half - * moves it's not necessarily a draw, since checkmate has higher priority, - * call getHalfMoveDrawType, - * to determine whether the position is a draw or checkmate. - * @return - */ - [[nodiscard]] __FORCEINLINE bool isHalfMoveDraw() const noexcept { return halfmoveClock() >= 100; } - [[nodiscard]] __FORCEINLINE Bitboard getCastlingPath(Color c, bool isKingSide) const { return current_state.castlingMetadata[c].castling_paths[isKingSide]; } - private: - template [[nodiscard]] __FORCEINLINE Bitboard pinMask(Color c, Square sq) const { - static_assert(pt == BISHOP || pt == ROOK, "Only bishop or rook allowed!"); - Bitboard occ_opp = occ(~sideToMove()); - Bitboard occ_us = occ(sideToMove()); - Bitboard opp_sliders; - opp_sliders = (pieces(~c) | pieces(QUEEN, ~c)) & occ_opp; - - auto pt_attacks = attacks::slider(sq, occ_opp) & opp_sliders; - - Bitboard pin = 0ull; - - while (pt_attacks) { - const auto possible_pin = movegen::between(sq, Square(pop_lsb(pt_attacks))); - Bitboard tmp = possible_pin & occ_us; - bool v = popcount(tmp) == 1; - pin |= v ? possible_pin : 0; - } - - return pin; - } - void refresh_attacks(); - - public: - __FORCEINLINE _Position(const _Position &other) - : current_state(other.current_state), history(other.history), _chess960(other._chess960) - { - std::copy(std::begin(other.pieces_list), std::end(other.pieces_list), std::begin(pieces_list)); - refresh_attacks(); - } -}; -namespace attacks{ -/** - * @brief Returns the attacks for a given piece on a given square - * @param board - * @param color - * @param square - * @return - */ -template ::value>> -[[nodiscard]] __FORCEINLINE Bitboard attackers(const _Position &board, Color color, Square square) noexcept { - return board.attackers(color, square); -} -} -// Aliases -using Position = _Position; -using Board = _Position; -}; // namespace chess - - - +#pragma once +#include "attacks.h" +#include "bitboard.h" +#include "movegen.h" +#include "printers.h" +#include "types.h" +#include "zobrist.h" +#include +#include +#include +#include +#include +namespace chess { + +template struct alignas(64) HistoryEntry { + // Bitboards for each piece type (white and black) + Bitboard pieces[7]; + Bitboard occ[COLOR_NB]; + Color turn; // true if white to move + Move mv; + Key hash; + uint8_t halfMoveClock; // Half-move clock for 50/75-move rule + uint16_t fullMoveNumber; // Full-move number (starts at 1) + bool epIncluded; + int8_t repetition = 0; + uint8_t pliesFromNull = 0; + Square enPassant = SQ_NONE; // En passant target square + Square kings[COLOR_NB] = { SQ_NONE }; + CastlingRights castlingRights; // Castling rights bitmask + Square incr_sqs[4] = { SQ_NONE, SQ_NONE, SQ_NONE, SQ_NONE }; + Piece incr_pc[4] = { Piece::NO_PIECE, Piece::NO_PIECE, Piece::NO_PIECE, Piece::NO_PIECE }; + struct { + Square king_start = SQ_NONE; + Square rook_start_ks = SQ_NONE; + Square rook_start_qs = SQ_NONE; + std::array castling_paths; + } castlingMetadata[2]; + // implementation-specific implementations goes here +}; + +template class HeapAllocatedValueList { + private: + constexpr static int ALIGNMENT = 64; + + public: + using size_type = std::size_t; + inline HeapAllocatedValueList() { + values_ = reinterpret_cast(::operator new(MaxSize * sizeof(T), std::align_val_t{ ALIGNMENT })); + assert(values_); + } + inline ~HeapAllocatedValueList() { ::operator delete(values_, std::align_val_t{ ALIGNMENT }); } + + HeapAllocatedValueList(const HeapAllocatedValueList &other) : size_(other.size_) { + if (values_) + ::operator delete(values_, std::align_val_t{ ALIGNMENT }); + values_ = reinterpret_cast(::operator new(MaxSize * sizeof(T), std::align_val_t{ ALIGNMENT })); + assert(values_); + std::copy(other.values_, other.values_ + size_, values_); + } + + HeapAllocatedValueList &operator=(const HeapAllocatedValueList &other) { + if (this != &other) { + ::operator delete(values_, std::align_val_t{ ALIGNMENT }); + // Allocate new memory and copy + T *new_values = reinterpret_cast(::operator new(MaxSize * sizeof(T), std::align_val_t{ ALIGNMENT })); + assert(new_values); + std::copy(other.values_, other.values_ + other.size_, new_values); + + // Free old memory + free(values_); + + // Assign new data + values_ = new_values; + size_ = other.size_; + } + return *this; + } + + HeapAllocatedValueList(HeapAllocatedValueList &&other) noexcept : size_(other.size_) { + ::operator delete(values_, std::align_val_t{ ALIGNMENT }); + values_ = reinterpret_cast(::operator new(MaxSize * sizeof(T), std::align_val_t{ ALIGNMENT })); + assert(values_); + std::copy(other.values_, other.values_ + size_, values_); + } + + HeapAllocatedValueList &operator=(HeapAllocatedValueList &&other) noexcept { + if (this != &other) { + ::operator delete(values_, std::align_val_t{ ALIGNMENT }); + values_ = reinterpret_cast(::operator new(MaxSize * sizeof(T), std::align_val_t{ ALIGNMENT })); + assert(values_); + std::copy(other.values_, other.values_ + size_, values_); + } + return *this; + } + inline size_type size() const { return size_; } + + inline void push_back(const T &value) { + assert(size_ < MaxSize); + + values_[size_++] = value; + } + inline void clear() { size_ = 0; } + inline const T &pop() { + assert(size_ > 0); + return values_[--size_]; // always safe due to mask + } + + inline void pop_back() { size_ -= (size_ > 0) ? 1 : 0; } + + inline const T &front() const { return (size_ > 0) ? values_[0] : T{}; } + + inline T &operator[](int index) { + assert(index < MaxSize); // relax the conditions, it's BRANCHLESS so forgive + size_type i = static_cast(index); + return values_[i]; + } + + inline T &operator[](int index) const { + assert(index < MaxSize); // relax the conditions, it's BRANCHLESS so forgive + size_type i = static_cast(index); + return values_[i]; + } + inline const T *begin() const { return values_; } + inline T *data() { return values_; } + inline const T *end() const { return values_ + size_; } + size_type size_ = 0; + + private: + T *values_ = nullptr; +}; + +enum class CheckType { NO_CHECK, DIRECT_CHECK, DISCOVERY_CHECK }; +enum class MoveGenType : uint16_t { + NONE = 0, + + // piece selectors + PAWN = 1 << 1, + KNIGHT = 1 << 2, + BISHOP = 1 << 3, + ROOK = 1 << 4, + QUEEN = 1 << 5, + KING = 1 << 6, + + PIECE_MASK = PAWN | KNIGHT | BISHOP | ROOK | QUEEN | KING, + + // move-type selectors + CAPTURE = 1 << 7, + QUIET = 1 << 8, + + ALL = PIECE_MASK | CAPTURE | QUIET +}; + +template constexpr MoveGenType operator&(MoveGenType a, MoveGenType b) { + using U = std::underlying_type_t; + return static_cast(static_cast(a) & static_cast(b)); +} +template constexpr MoveGenType operator|(MoveGenType a, MoveGenType b) { + using U = std::underlying_type_t; + return static_cast(static_cast(a) | static_cast(b)); +} +template ::value>> class _Position { + private: + HistoryEntry current_state; + + // Move history stack + HeapAllocatedValueList, 6144> history; + Bitboard _rook_pin; + Bitboard _bishop_pin; + Bitboard _checkers; + Bitboard _check_mask; + Bitboard _pin_mask; + alignas(64) PieceC pieces_list[SQUARE_NB + 1] = { + PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, + PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, + PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, + PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, + PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, + PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, + PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, + PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, + PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, + PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, + PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE, PieceC::NO_PIECE + }; + bool _chess960; + + public: + // Legal move generation functions + template __FORCEINLINE void legals(Movelist &out) const { + + constexpr uint16_t raw = static_cast(type); + constexpr uint16_t pieceBits = raw & static_cast(MoveGenType::PIECE_MASK); + constexpr uint16_t modeBits = + raw & (static_cast(MoveGenType::CAPTURE) | static_cast(MoveGenType::QUIET)); + + // ---------------------------------------- + // Resolve default piece selection + // ---------------------------------------- + constexpr uint16_t effectivePieces = + pieceBits ? pieceBits + : (raw == static_cast(MoveGenType::NONE) ? 0 : static_cast(MoveGenType::PIECE_MASK)); + + // ---------------------------------------- + // Resolve default mode selection + // ---------------------------------------- + constexpr bool includeCaps = modeBits == 0 || (modeBits & static_cast(MoveGenType::CAPTURE)); + constexpr bool includeQuiet = modeBits == 0 || (modeBits & static_cast(MoveGenType::QUIET)); + constexpr bool captureOnly = includeCaps && !includeQuiet; + + // Early-out for NONE + if constexpr (effectivePieces == 0 && modeBits != 0) + return; + + // Now your existing piece dispatch logic stays the same: + if constexpr (effectivePieces & static_cast(MoveGenType::PAWN)) { + movegen::genPawnSingleMoves(*this, out, _rook_pin, _bishop_pin, _check_mask); + if constexpr (includeQuiet) + movegen::genPawnDoubleMoves(*this, out, _pin_mask, _check_mask); + if constexpr (includeCaps) + movegen::genEP(*this, out); + } + + if constexpr (effectivePieces & static_cast(MoveGenType::KNIGHT)) { + movegen::genKnightMoves(*this, out, _pin_mask, _check_mask); + } + + if constexpr (effectivePieces & static_cast(MoveGenType::KING)) { + movegen::genKingMoves(*this, out); + } + + if constexpr (effectivePieces & static_cast(MoveGenType::BISHOP)) { + movegen::genSlidingMoves(*this, out, _rook_pin, _bishop_pin, _check_mask); + } + + if constexpr (effectivePieces & static_cast(MoveGenType::ROOK)) { + movegen::genSlidingMoves(*this, out, _rook_pin, _bishop_pin, _check_mask); + } + + if constexpr (effectivePieces & static_cast(MoveGenType::QUEEN)) { + movegen::genSlidingMoves(*this, out, _rook_pin, _bishop_pin, _check_mask); + } + } + + // Legal move generation functions + template __FORCEINLINE void legals(Movelist &out) const { + const Color stm = sideToMove(); // Cache it + ASSUME(stm == WHITE || stm == BLACK); // Now clearly no side effects + + switch (stm) { + case WHITE: + legals(out); + return; + case BLACK: + legals(out); + return; + default: + UNREACHABLE(); + return; + } + } + template void doMove(const Move &move); + template inline auto undoMove() -> std::conditional_t &, void> { + assert(history.size_ > 0 && "undoMove called with empty history"); + + // Restore previous state from history + assert(current_state.mv.is_ok() && "Corrupted history entry"); + assert(current_state.incr_pc[0] != at(current_state.mv.from()) && "Corrupted history entry"); + pieces_list[current_state.incr_sqs[0]] = current_state.incr_pc[0]; + pieces_list[current_state.incr_sqs[1]] = current_state.incr_pc[1]; + pieces_list[current_state.incr_sqs[2]] = current_state.incr_pc[2]; + pieces_list[current_state.incr_sqs[3]] = current_state.incr_pc[3]; + current_state = history.pop(); + if constexpr (RetAll) { + return current_state; + } + } + + __FORCEINLINE void doNullMove() { + history.push_back(current_state); + current_state.turn = ~current_state.turn; + current_state.hash ^= zobrist::RandomTurn; + current_state.fullMoveNumber += (current_state.turn == WHITE); + current_state.pliesFromNull = current_state.repetition = 0; + current_state.mv = Move::null(); + } + + __FORCEINLINE Bitboard pieces() const { return occ(); } + template __FORCEINLINE Bitboard pieces(Color c) const { + ASSUME(c == WHITE || c == BLACK); + if constexpr (pt == PIECE_TYPE_NB || pt == ALL_PIECES) + return occ(c); + return current_state.pieces[pt] & current_state.occ[c]; + } + template __FORCEINLINE Bitboard pieces(PieceType pt) const { + ASSUME(c == WHITE || c == BLACK); + if (pt == PIECE_TYPE_NB || pt == ALL_PIECES) + return occ(c); + return current_state.pieces[pt] & current_state.occ[c]; + } + template inline Bitboard pieces() const { + ASSUME(c == WHITE || c == BLACK); + if constexpr (pt == PIECE_TYPE_NB || pt == ALL_PIECES) + return occ(c); + return current_state.pieces[pt] & current_state.occ[c]; + } + __FORCEINLINE Bitboard pieces(PieceType pt, Color c) const { + ASSUME(c == WHITE || c == BLACK); + // still branchless + switch (pt) { + case PIECE_TYPE_NB: + case ALL_PIECES: + return occ(c); + default: + return current_state.pieces[pt] & current_state.occ[c]; + } + } + __FORCEINLINE Bitboard pieces(PieceType pt) const { + switch (int(pt)) { + case PIECE_TYPE_NB: + case ALL_PIECES: + return occ(); + default: + return current_state.pieces[pt]; + } + } + template && ...)>> + [[nodiscard]] __FORCEINLINE Bitboard pieces(PTypes... ptypes) const { + return (current_state.pieces[static_cast(ptypes)] | ...); + } + + template && ...)>> + [[nodiscard]] __FORCEINLINE Bitboard pieces(Color c, PTypes... ptypes) const { + return (pieces(ptypes, c) | ...); + } + + /** + * @brief Returns the origin squares of pieces of a given color attacking a target square + * + * Sample code to not make myself (and others) confused: + ```c++ + if (attackers(BLACK, E4)) { + std::cout << "E4 is under attack by black!"; + } + ``` + * + * @param color Attacker Color + * @param square Attacked Square + * @param occupied Board occupation + * @return Attackers to the bitboard + */ + [[nodiscard]] __FORCEINLINE Bitboard attackers(Color color, Square square, Bitboard occupied) const { + auto queens = pieces(color); + + // using the fact that if we can attack PieceType from square, they can attack us back + auto atks = (attacks::pawn(~color, square) & pieces(color)); + atks |= (attacks::knight(square) & pieces(color)); + atks |= (attacks::bishop(square, occupied) & (pieces(color) | queens)); + atks |= (attacks::rook(square, occupied) & (pieces(color) | queens)); + atks |= (attacks::king(square) & pieces(color)); + + return atks & occupied; + } + + /** + * @brief Checks if a square is attacked by the given color. + * @param square + * @param color + * @return + */ + [[nodiscard]] __FORCEINLINE bool isAttacked(Square sq, Color by) const noexcept { + const Bitboard occ_bb = occ(); + const Bitboard us_bb = occ(by); + + Bitboard diag_attackers = pieces(PieceType::BISHOP, by) | pieces(PieceType::QUEEN, by); + Bitboard ortho_attackers = pieces(PieceType::ROOK, by) | pieces(PieceType::QUEEN, by); + + return (attacks::pawn(~by, sq) & pieces(PieceType::PAWN, by)) || + (attacks::knight(sq) & pieces(PieceType::KNIGHT, by)) || (attacks::king(sq) & pieces(PieceType::KING, by)) || + (attacks::bishop(sq, occ_bb) & diag_attackers & us_bb) || (attacks::rook(sq, occ_bb) & ortho_attackers & us_bb); + } + /** + * @brief Checks if a square is attacked by the given color. + * @param square + * @param color + * @param occupied + * @return + */ + [[nodiscard]] __FORCEINLINE bool isAttacked(Square sq, Color by, Bitboard occupied) const noexcept { + const Bitboard diag_attackers = pieces(PieceType::BISHOP, by) | pieces(PieceType::QUEEN, by); + const Bitboard ortho_attackers = pieces(PieceType::ROOK, by) | pieces(PieceType::QUEEN, by); + + return (attacks::pawn(~by, sq) & pieces(PieceType::PAWN, by)) || + (attacks::knight(sq) & pieces(PieceType::KNIGHT, by)) || (attacks::king(sq) & pieces(PieceType::KING, by)) || + (attacks::bishop(sq, occupied) & diag_attackers) || (attacks::rook(sq, occupied) & ortho_attackers); + } + + [[nodiscard]] __FORCEINLINE Bitboard attackers(Color color, Square square) const { return attackers(color, square, occ()); } + + template __FORCEINLINE void placePiece(Square sq, Color c) { + if constexpr (pt != NO_PIECE_TYPE) { + Bitboard v = 1ULL << sq; + current_state.pieces[pt] |= v; + current_state.occ[c] |= v; + pieces_list[sq] = make_piece(pt, c); + current_state.hash ^= zobrist::RandomPiece[enum_idx()][(int)pieces_list[sq]][sq]; + if constexpr (pt == KING) + current_state.kings[c] = sq; + } + } + + template __FORCEINLINE void removePiece(Square sq, Color c) { + if constexpr (pt != NO_PIECE_TYPE) { + Bitboard v = ~(1ULL << sq); + current_state.pieces[pt] &= v; + current_state.occ[c] &= v; + pieces_list[sq] = PieceC::NO_PIECE; + current_state.hash ^= zobrist::RandomPiece[enum_idx()][static_cast(make_piece(pt, c))][sq]; + if constexpr (pt == KING) + current_state.kings[c] = SQ_NONE; + } + } + + __FORCEINLINE void placePiece(PieceType pt, Square sq, Color c) { + bool a = pt == KING; + // if (pt == NO_PIECE_TYPE) + // return; + Bitboard v = 1ULL << sq; + current_state.pieces[pt] |= v; + current_state.occ[c] |= v; + pieces_list[sq] = make_piece(pt, c); + current_state.hash ^= zobrist::RandomPiece[enum_idx()][(int)pieces_list[sq]][sq]; + current_state.kings[c] = a ? sq : current_state.kings[c]; + } + + __FORCEINLINE void removePiece(PieceType pt, Square sq, Color c) { + bool a = pt == KING; + if (pt != NO_PIECE_TYPE) { + Bitboard v = ~(1ULL << sq); + current_state.pieces[pt] &= v; + current_state.occ[c] &= v; + pieces_list[sq] = PieceC::NO_PIECE; + current_state.hash ^= zobrist::RandomPiece[enum_idx()][static_cast(make_piece(pt, c))][sq]; + current_state.kings[c] = a ? SQ_NONE : current_state.kings[c]; + } + } + + __FORCEINLINE Bitboard occ(Color c) const { + ASSUME(c != COLOR_NB); + return current_state.occ[c]; + } + __FORCEINLINE Bitboard occ() const { return current_state.occ[0] | current_state.occ[1]; } + PieceC piece_on(Square s) const { + assert(chess::is_valid(s)); +#if !defined(_DEBUG) || defined(NDEBUG) + return pieces_list[s]; +#else + PieceC _p2; + Bitboard mask = (1ULL << s); + if (((current_state.occ[WHITE] | current_state.occ[BLACK]) & mask) == 0) { + _p2 = PieceC::NO_PIECE; + } else { + bool c = (current_state.occ[WHITE] & mask) != 0; + for (PieceType pt : { PAWN, KNIGHT, BISHOP, ROOK, QUEEN, KING }) { + bool is_p = (current_state.pieces[(int)pt] & mask) != 0; + if (is_p) { + _p2 = make_piece(pt, c ? WHITE : BLACK); + break; + } + } + } + auto p = pieces_list[s]; +#ifndef __EXCEPTIONS + assert(p == _p2 && "Inconsistient piece map"); +#else + if (p != _p2) + throw std::invalid_argument("Inconsistient piece map"); +#endif + return p; +#endif + } + __FORCEINLINE Bitboard us(Color c) const { return occ(c); } + __FORCEINLINE Color sideToMove() const { return current_state.turn; } + __FORCEINLINE uint64_t hash() const { return current_state.hash; } + __FORCEINLINE uint64_t key() const { return current_state.hash; } + __FORCEINLINE Color side_to_move() const { return current_state.turn; } + __FORCEINLINE Square ep_square() const { return current_state.enPassant; } + template __FORCEINLINE Square square(Color c) const { return Square(lsb(pieces(c))); } + __FORCEINLINE Square kingSq(Color c) const { return current_state.kings[c]; } + __FORCEINLINE Bitboard checkers() const { return _checkers; } + __FORCEINLINE Bitboard pin_mask() const { return _pin_mask; } + __FORCEINLINE _Position(std::string fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", + bool chess960 = false) { + setFEN(fen, chess960); + } + __FORCEINLINE bool isCapture(Move mv) const { + return mv.type_of() == EN_PASSANT || (mv.type_of() != CASTLING && piece_on(mv.to_sq()) != PieceC::NO_PIECE); + } + __FORCEINLINE bool is_capture(Move mv) const { return isCapture(mv); } + __FORCEINLINE bool is_zeroing(Move mv) const { return isCapture(mv) || type_of(at(mv.from_sq())) == PAWN; } + std::string fen() const; + __FORCEINLINE uint8_t halfmoveClock() const { return current_state.halfMoveClock; } + __FORCEINLINE uint16_t fullmoveNumber() const { return current_state.fullMoveNumber; } + __FORCEINLINE uint8_t rule50_count() const { return current_state.halfMoveClock; } + __FORCEINLINE CastlingRights castlingRights(Color c) const { + return current_state.castlingRights & (c == WHITE ? WHITE_CASTLING : BLACK_CASTLING); + } + __FORCEINLINE CastlingRights castlingRights() const { return current_state.castlingRights; } + __FORCEINLINE bool is_castling(Move mv) const { return mv.type_of() == CASTLING; } + __FORCEINLINE const HistoryEntry &state() const { return current_state; } + uint64_t zobrist() const; + __FORCEINLINE PieceC piece_at(Square sq) const { return piece_on(sq); } + template __FORCEINLINE PieceC at(Square sq) const { + assert(chess::is_valid(sq)); + if constexpr (std::is_same_v) + return piece_of(piece_at(sq)); + else + return piece_at(sq); + } + __FORCEINLINE Square enpassantSq() const { return ep_square(); } + CastlingRights clean_castling_rights() const; + void setFEN(const std::string &str, bool chess960 = false); + __FORCEINLINE void set_fen(const std::string &str, bool chess960) { setFEN(str, chess960); } + Move parse_uci(std::string) const; + Move push_uci(std::string); + Square _valid_ep_square() const; + template __FORCEINLINE int count() const { return popcount(pieces(pt)); } + template __FORCEINLINE int count() const { return popcount(pieces()); } + template __FORCEINLINE int count(Color c) const { return popcount(pieces(c)); } + __FORCEINLINE int count(PieceType pt, Color c) const { return popcount(pieces(pt, c)); } + __FORCEINLINE int ply() const { return 2 * (current_state.fullMoveNumber - 1) + (sideToMove() == BLACK); } + bool is_insufficient_material(Color c) const; + __FORCEINLINE bool isInsufficientMaterial(Color c) const { return is_insufficient_material(c); } + __FORCEINLINE bool hasInsufficientMaterial(Color c) const { return is_insufficient_material(c); } + __FORCEINLINE bool has_insufficient_material(Color c) const { return is_insufficient_material(c); } + __FORCEINLINE bool is_insufficient_material() const { + return has_insufficient_material(WHITE) && has_insufficient_material(BLACK); + } + __FORCEINLINE bool isInsufficientMaterial() const { return is_insufficient_material(); } + __FORCEINLINE bool hasNonPawnMaterial(Color c) const { return bool(us(c) ^ (pieces(PAWN, KING) & us(c))); } + __FORCEINLINE bool inCheck() const { return checkers() != 0; } + __FORCEINLINE bool is_check() const { return checkers() != 0; } + __FORCEINLINE bool has_castling_rights(Color c) const { return castlingRights(c) != 0; } + __FORCEINLINE bool has_kingside_castling_rights(Color c) const { return (castlingRights(c) & KING_SIDE) != 0; } + __FORCEINLINE bool has_queenside_castling_rights(Color c) const { return (castlingRights(c) & QUEEN_SIDE) != 0; } + // Return true if a position repeats once earlier but strictly + // after the root, or repeats twice before or at the root. + __FORCEINLINE bool is_repetition(int ply) const { return current_state.repetition && current_state.repetition < ply; } + // Test if it's draw of 75 move rule (that forces everyone to draw). Excludes checkmates, of course! + __FORCEINLINE bool is_draw(int ply) const { return rule50_count() > 99 || is_repetition(ply); } + // Tests whether there has been at least one repetition + // of positions since the last capture or pawn move. + __FORCEINLINE bool has_repeated() const { + auto idx = history.size() - 1; + int end = std::min(rule50_count(), current_state.pliesFromNull); + while (end-- >= 4) { + if (history[idx].repetition) + return true; + + idx--; + } + return false; + } + __FORCEINLINE bool _is_halfmoves(int n) const { return rule50_count() >= n; } + __FORCEINLINE bool chess960() const { return _chess960; } + __FORCEINLINE bool is_seventyfive_moves(int n) const { return _is_halfmoves(150); } + __FORCEINLINE bool is_fifty_moves(int n) const { return _is_halfmoves(150); } + __FORCEINLINE bool is_fivefold_repetition() const { return is_repetition(5); } + __FORCEINLINE bool is_attacked_by(Color color, Square sq, Bitboard occupied = 0) const { + Bitboard occ_bb = occupied ? occupied : this->occ(); + return attackers_mask(color, sq, occ_bb) != 0; + } + + __FORCEINLINE bool was_into_check() const { + bool atk = false; + Bitboard bb = pieces(~sideToMove()); + while (!atk && bb) { + atk |= isAttacked((Square)pop_lsb(bb), sideToMove()); + } + return atk != 0; + } + __FORCEINLINE Bitboard attackers_mask(Color color, Square square, Bitboard occupied) const { + auto queens = pieces(color); + + // using the fact that if we can attack PieceType from square, they can attack us back + auto atks = (attacks::pawn(~color, square) & pieces(color)); + atks |= (attacks::knight(square) & pieces(color)); + atks |= (attacks::bishop(square, occupied) & (pieces(color) | queens)); + atks |= (attacks::rook(square, occupied) & (pieces(color) | queens)); + atks |= (attacks::king(square) & pieces(color)); + + return atks & occ(color); + } + __FORCEINLINE bool _attacked_for_king(Bitboard path, Bitboard occupied) const { + Bitboard b = 0; + while (!b && path) { + b |= attackers_mask(~sideToMove(), static_cast(pop_lsb(path)), occupied); + } + return b != 0; + } + __FORCEINLINE bool is_checkmate() const { + Movelist moves; + legals(moves); + return inCheck() && !moves.size(); + } + __FORCEINLINE bool is_stalemate() const { + Movelist moves; + legals(moves); + return !inCheck() && !moves.size(); + } + // Material-only key (note: Zobrist=Zpieces^Zep^Zcastling^Zturn, we just XORs the remaining, it's trivial) + __FORCEINLINE Key material_key() const { + return hash() ^ (zobrist::RandomTurn * ~sideToMove()) ^ (zobrist::RandomCastle[castlingRights()]) ^ + (zobrist::RandomEP[ep_square() == SQ_NONE ? file_of(ep_square()) : FILE_NB]); + } + template bool is_valid() const; + CheckType givesCheck(Move move) const; + /** + * @brief Checks if the current position is a draw by 50 move rule. + * Keep in mind that by the rules of chess, if the position has 50 half + * moves it's not necessarily a draw, since checkmate has higher priority, + * call getHalfMoveDrawType, + * to determine whether the position is a draw or checkmate. + * @return + */ + [[nodiscard]] __FORCEINLINE bool isHalfMoveDraw() const noexcept { return halfmoveClock() >= 100; } + [[nodiscard]] __FORCEINLINE Bitboard getCastlingPath(Color c, bool isKingSide) const { + return current_state.castlingMetadata[c].castling_paths[isKingSide]; + } + + private: + template [[nodiscard]] __FORCEINLINE Bitboard pinMask(Color c, Square sq) const { + static_assert(pt == BISHOP || pt == ROOK, "Only bishop or rook allowed!"); + Bitboard occ_opp = occ(~sideToMove()); + Bitboard occ_us = occ(sideToMove()); + Bitboard opp_sliders; + opp_sliders = (pieces(~c) | pieces(QUEEN, ~c)) & occ_opp; + + auto pt_attacks = attacks::slider(sq, occ_opp) & opp_sliders; + + Bitboard pin = 0ull; + + while (pt_attacks) { + const auto possible_pin = movegen::between(sq, Square(pop_lsb(pt_attacks))); + Bitboard tmp = possible_pin & occ_us; + bool v = popcount(tmp) == 1; + pin |= v ? possible_pin : 0; + } + + return pin; + } + void refresh_attacks(); + + public: + __FORCEINLINE _Position(const _Position &other) + : current_state(other.current_state), history(other.history), _chess960(other._chess960) { + std::copy(std::begin(other.pieces_list), std::end(other.pieces_list), std::begin(pieces_list)); + refresh_attacks(); + } +}; +namespace attacks { +/** + * @brief Returns the attacks for a given piece on a given square + * @param board + * @param color + * @param square + * @return + */ +template ::value>> +[[nodiscard]] __FORCEINLINE Bitboard attackers(const _Position &board, Color color, Square square) noexcept { + return board.attackers(color, square); +} +} // namespace attacks +// Aliases +using Position = _Position; +using Board = _Position; +}; // namespace chess diff --git a/printers.cpp b/printers.cpp index 41dc3e7..74e69cc 100644 --- a/printers.cpp +++ b/printers.cpp @@ -39,11 +39,11 @@ template std::ostream &operator<<(std::ostream &os, return os; } -std::ostream &operator<<(std::ostream &os, const Move &mv) { +std::ostream &operator<<(std::ostream &os, const Move mv) { os << uci::moveToUci(mv); return os; } -std::ostream &operator<<(std::ostream &os, const Color &c) { +std::ostream &operator<<(std::ostream &os, const Color c) { DescriptiveNameNotation colors = { { WHITE, "WHITE" }, { BLACK, "BLACK" }, @@ -51,7 +51,20 @@ std::ostream &operator<<(std::ostream &os, const Color &c) { }; return os << colors[c]; } -std::ostream &operator<<(std::ostream &os, const CastlingRights &cr) { +std::ostream &operator<<(std::ostream &os, const PieceType c) { + DescriptiveNameNotation pieces = { + { NO_PIECE_TYPE, "NO_PIECE_TYPE/ALL_PIECES" }, + { PAWN, "PAWN" }, + { KNIGHT, "KNIGHT" }, + { BISHOP, "BISHOP" }, + { ROOK, "ROOK" }, + { QUEEN, "QUEEN" }, + { KING, "KING" }, + { PIECE_TYPE_NB, "PIECE_TYPE_NB" }, + }; + return os << pieces[c]; +} +std::ostream &operator<<(std::ostream &os, const CastlingRights cr) { DescriptiveNameNotation castlingFlags = { { NO_CASTLING, "NO_CASTLING" }, { WHITE_OO, "WHITE_OO" }, @@ -77,7 +90,7 @@ static std::string str_toupper(std::string s) { std::transform(s.begin(), s.end(), s.begin(), [](unsigned char c) { return std::toupper(c); }); return s; } -std::ostream &operator<<(std::ostream &os, const Square &sq) { +std::ostream &operator<<(std::ostream &os, const Square sq) { os << "SQ_" << str_toupper(chess::uci::squareToString(sq)); return os; } diff --git a/printers.h b/printers.h index b1dec11..6563af0 100644 --- a/printers.h +++ b/printers.h @@ -4,12 +4,13 @@ #include #include namespace chess { -std::ostream &operator<<(std::ostream &os, const Move &mv); -std::ostream &operator<<(std::ostream &os, const Color &c); -std::ostream &operator<<(std::ostream &os, const CastlingRights &cr); +std::ostream &operator<<(std::ostream &os, const Move mv); +std::ostream &operator<<(std::ostream &os, const Color c); +std::ostream &operator<<(std::ostream &os, const CastlingRights cr); template ::value>> std::ostream &operator<<(std::ostream &os, PieceC p); -std::ostream &operator<<(std::ostream &os, const Square &sq); +std::ostream &operator<<(std::ostream &os, const Square sq); +std::ostream &operator<<(std::ostream &os, const PieceType pt); template class _Position; template ::value>> diff --git a/tests.cpp b/tests.cpp index 74f21a4..96a930f 100644 --- a/tests.cpp +++ b/tests.cpp @@ -215,14 +215,14 @@ void check_perfts(const std::vector> &entries) { double elapsed = 0; using namespace std::chrono; for (auto &entry : entries) { - std::cerr << entry.input << ' '< 5e7) { std::cerr << "(skipped)"; continue; } - #endif - std::cerr<<'\n'; +#endif + std::cerr << '\n'; { _Position pos(entry.input); auto start_time = high_resolution_clock::now(); diff --git a/types.h b/types.h index 9ff1230..78464a1 100644 --- a/types.h +++ b/types.h @@ -1,442 +1,444 @@ -#pragma once - -#include "fwd_decl.h" -#include -#include -#include -#if defined(_MSC_VER) -#define UNREACHABLE() __assume(false) -#elif defined(__clang__) || defined(__GNUC__) -#define UNREACHABLE() __builtin_unreachable() -#elif defined(__cpp_lib_unreachable) -#define UNREACHABLE() std::unreachable() -#else -#define UNREACHABLE() assert(0) -#endif -#if defined(_MSC_VER) -#define ASSUME(expr) __assume(expr) -#elif defined(__clang__) -#define ASSUME(expr) __builtin_assume(expr) -#elif defined(__GNUC__) -#if __has_cpp_attribute(assume) -#define ASSUME(expr) [[assume(expr)]] -#elif __GNUC__ >= 13 -#define ASSUME(cond) __attribute__((assume(cond))) -#else -#define ASSUME(cond) \ - do { \ - if (!(cond)) \ - UNREACHABLE(); \ - } while (0) -#endif -#else -#define ASSUME(cond) \ - do { \ - if (!(cond)) \ - UNREACHABLE(); \ - } while (0) -#endif - -#ifdef _MSC_VER -#define __FORCEINLINE inline __forceinline -#elif defined(__GNUC__) || defined(__clang__) -#define __FORCEINLINE inline __attribute__((always_inline)) -#else -#define __FORCEINLINE inline -#endif -constexpr bool is_constant_evaluated() { -#if __cpp_if_consteval >= 202106L - if consteval { - return true; - } - // both MSVC (non-comformant __cplusplus) and by-default _MSVC_LANG and other compiles with - // conformant __cplusplus -#elif __cplusplus >= 202002L || _MSVC_LANG >= 202002L - if (std::is_constant_evaluated()) - return true; -#elif defined(__GNUC__) // defined for both GCC and clang - if (__builtin_is_constant_evaluated()) - return true; -#elif _MSC_VER >= 1925 - if (__builtin_is_constant_evaluated()) - return true; -#else -#error "NAWH we don't think we can detect compile time in this compiler"; -#endif - return false; -} -namespace chess { -using Bitboard = uint64_t; -using Key = uint64_t; -// clang-format off -enum Square : int8_t { - SQ_A1, SQ_B1, SQ_C1, SQ_D1, SQ_E1, SQ_F1, SQ_G1, SQ_H1, - SQ_A2, SQ_B2, SQ_C2, SQ_D2, SQ_E2, SQ_F2, SQ_G2, SQ_H2, - SQ_A3, SQ_B3, SQ_C3, SQ_D3, SQ_E3, SQ_F3, SQ_G3, SQ_H3, - SQ_A4, SQ_B4, SQ_C4, SQ_D4, SQ_E4, SQ_F4, SQ_G4, SQ_H4, - SQ_A5, SQ_B5, SQ_C5, SQ_D5, SQ_E5, SQ_F5, SQ_G5, SQ_H5, - SQ_A6, SQ_B6, SQ_C6, SQ_D6, SQ_E6, SQ_F6, SQ_G6, SQ_H6, - SQ_A7, SQ_B7, SQ_C7, SQ_D7, SQ_E7, SQ_F7, SQ_G7, SQ_H7, - SQ_A8, SQ_B8, SQ_C8, SQ_D8, SQ_E8, SQ_F8, SQ_G8, SQ_H8, - SQ_NONE, - - SQUARE_ZERO = 0, - SQUARE_NB = 64 -}; -enum File : int8_t { FILE_A, FILE_B, FILE_C, FILE_D, FILE_E, FILE_F, FILE_G, FILE_H, FILE_NB }; - -enum Rank : int8_t { RANK_1, RANK_2, RANK_3, RANK_4, RANK_5, RANK_6, RANK_7, RANK_8, RANK_NB }; -constexpr bool is_valid(const Rank r, const File f) { return 0 <= r && r <= 7 && 0 <= f && f <= 7; } // unsigned already fix signedness -constexpr bool is_valid(const Square s) { return 0 <= s && s < 64; } -constexpr File file_of(Square s) { - ASSUME(0 <= s && s < 64); - return File(s & 7); -} - -constexpr Rank rank_of(Square s) { - ASSUME(0 <= s && s < 64); - return Rank(s >> 3); -} -constexpr Square make_sq(Rank r, File f) { - ASSUME(0 <= r && r <= 7 && 0 <= f && f <= 7); - return static_cast(static_cast(r * 8 + f)); -} -constexpr Square make_sq(File f, Rank r) { - ASSUME(0 <= r && r <= 7 && 0 <= f && f <= 7); - return static_cast(static_cast(r * 8 + f)); -} -enum Color : uint8_t { WHITE = 0, BLACK = 1, COLOR_NB = 2 }; -// Toggle color -constexpr Color operator~(Color c) { return Color(c ^ BLACK); } -enum PieceType : std::int8_t { NO_PIECE_TYPE = 0, PAWN, KNIGHT, BISHOP, ROOK, QUEEN, KING, ALL_PIECES = 0, PIECE_TYPE_NB = 8 }; -enum Direction : int8_t { - NORTH = 8, - EAST = 1, - SOUTH = -NORTH, - WEST = -EAST, - - NORTH_EAST = NORTH + EAST, - SOUTH_EAST = SOUTH + EAST, - SOUTH_WEST = SOUTH + WEST, - NORTH_WEST = NORTH + WEST, - DIR_NONE = 0 -}; -// clang-format on -inline constexpr Square relative_square(Color c, Square s) { return Square(s ^ (c * 56)); } -inline constexpr Square castling_rook_square(Color c, bool is_king_side) { return relative_square(c, is_king_side ? SQ_F1 : Square::SQ_D1); } -inline constexpr Square castling_king_square(Color c, bool is_king_side) { return relative_square(c, is_king_side ? SQ_G1 : Square::SQ_C1); } - -inline constexpr Rank relative_rank(Color c, Rank r) { return Rank(r ^ (c * 7)); } - -inline constexpr Rank relative_rank(Color c, Square s) { return relative_rank(c, rank_of(s)); } - -inline constexpr Direction relative_direction(Color c, Direction d) { return static_cast(c == WHITE ? d : -d); } -inline constexpr Direction pawn_push(Color c) { return c == WHITE ? NORTH : SOUTH; } - -#define ENABLE_INCR_OPERATORS_ON(T) \ - constexpr T &operator++(T &d) { return d = T(int(d) + 1); } \ - constexpr T &operator--(T &d) { return d = T(int(d) - 1); } \ - constexpr T operator++(T &d, int) { \ - T old = d; \ - ++d; \ - return old; \ - } \ - constexpr T operator--(T &d, int) { \ - T old = d; \ - --d; \ - return old; \ - } - -ENABLE_INCR_OPERATORS_ON(PieceType) -ENABLE_INCR_OPERATORS_ON(Square) -ENABLE_INCR_OPERATORS_ON(File) -ENABLE_INCR_OPERATORS_ON(Rank) - -#undef ENABLE_INCR_OPERATORS_ON - -constexpr Direction operator+(Direction d1, Direction d2) { return Direction(int(d1) + int(d2)); } -constexpr Direction operator*(int i, Direction d) { return Direction(i * int(d)); } - -// Additional operators to add a Direction to a Square -constexpr Square operator+(Square s, Direction d) { return Square(int(s) + int(d)); } -constexpr Square operator-(Square s, Direction d) { return Square(int(s) - int(d)); } -constexpr Square &operator+=(Square &s, Direction d) { return s = s + d; } -constexpr Square &operator-=(Square &s, Direction d) { return s = s - d; } -// specifically for Polyglot (a.k.a zobrist hashing but use proper hash) -enum class PolyglotPiece : uint8_t { - WPAWN = 1, - WKNIGHT = 3, - WBISHOP = 5, - WROOK = 7, - WQUEEN = 9, - WKING = 11, - BPAWN = 0, - BKNIGHT = 2, - BBISHOP = 4, - BROOK = 6, - BQUEEN = 8, - BKING = 10, - NO_PIECE = 12, - PIECE_NB = 12 -}; -// Normal board, you can use ANY! (but comfortable for certain chess engines such as Stockfish) -enum class EnginePiece : uint8_t { - NO_PIECE, - WPAWN = PAWN + 0, - WKNIGHT, - WBISHOP, - WROOK, - WQUEEN, - WKING, - BPAWN = PAWN + 8, - BKNIGHT, - BBISHOP, - BROOK, - BQUEEN, - BKING, - PIECE_NB = 16 -}; -enum class ContiguousMappingPiece : uint8_t { - WPAWN = 0, - WKNIGHT = 1, - WBISHOP = 2, - WROOK = 3, - WQUEEN = 4, - WKING = 5, - BPAWN = 6, - BKNIGHT = 7, - BBISHOP = 8, - BROOK = 9, - BQUEEN = 10, - BKING = 11, - NO_PIECE = 12, - PIECE_NB = 12 -}; -template constexpr size_t enum_idx() { - if constexpr (std::is_same_v) - return 0; - else if constexpr (std::is_same_v) - return 1; - else if constexpr (std::is_same_v) - return 2; - return -1; -} -// clang-format on -constexpr PieceType piece_of(PolyglotPiece p) { - return p == decltype(p)::NO_PIECE ? NO_PIECE_TYPE : static_cast(static_cast(p) / 2 + 1); -} -constexpr PieceType piece_of(EnginePiece p) { - return p == decltype(p)::NO_PIECE ? NO_PIECE_TYPE : static_cast((static_cast(p) - 1) % 8 + 1); -} -constexpr PieceType piece_of(ContiguousMappingPiece p) { - return p == decltype(p)::NO_PIECE ? NO_PIECE_TYPE : static_cast(static_cast(p) % 6 + 1); -} -constexpr Color color_of(PolyglotPiece pt) { return static_cast((static_cast(pt) + 1) % 2); } -constexpr Color color_of(EnginePiece pt) { - return static_cast(static_cast(pt) / static_cast(EnginePiece::BPAWN)); -} -constexpr Color color_of(ContiguousMappingPiece pt) { return static_cast(static_cast(pt) / 6); } -template , bool> = 0> -constexpr EnginePiece make_piece(PieceType pt, Color c) { - return static_cast((c << 3) + pt); -} -template , bool> = 0> -constexpr PolyglotPiece make_piece(PieceType pt, Color c) { - return static_cast(~c + 2 * (pt - 1)); -} -template , bool> = 0> -constexpr ContiguousMappingPiece make_piece(PieceType pt, Color c) { - return static_cast((static_cast(pt) - 1) + 6 * static_cast(c)); -} -template ::value>> constexpr PieceType type_of(T p) { - return piece_of(p); -} - -enum CastlingRights : int8_t { - NO_CASTLING, - WHITE_OO, - WHITE_OOO = WHITE_OO << 1, - BLACK_OO = WHITE_OO << 2, - BLACK_OOO = WHITE_OO << 3, - - KING_SIDE = WHITE_OO | BLACK_OO, - QUEEN_SIDE = WHITE_OOO | BLACK_OOO, - WHITE_CASTLING = WHITE_OO | WHITE_OOO, - BLACK_CASTLING = BLACK_OO | BLACK_OOO, - ANY_CASTLING = WHITE_CASTLING | BLACK_CASTLING, - - CASTLING_RIGHT_NB = 16 -}; -constexpr CastlingRights operator&(Color c, CastlingRights cr) { - return CastlingRights((c == WHITE ? WHITE_CASTLING : BLACK_CASTLING) & cr); -} -// Bitwise OR assignment operator -inline CastlingRights &operator|=(CastlingRights &a, CastlingRights b) { - a = static_cast(static_cast(a) | static_cast(b)); - return a; -} -// Bitwise OR assignment operator -inline CastlingRights operator|(CastlingRights a, CastlingRights b) { - return static_cast(static_cast(a) | static_cast(b)); -} - -// Bitwise OR assignment operator -inline CastlingRights &operator&=(CastlingRights &a, CastlingRights b) { - a = static_cast(static_cast(a) & static_cast(b)); - return a; -} -inline CastlingRights operator~(CastlingRights a) { - return static_cast(static_cast(a) ^ ANY_CASTLING); -} - -enum MoveType : uint16_t { NORMAL, PROMOTION = 1 << 14, EN_PASSANT = 2 << 14, CASTLING = 3 << 14 }; -// A move needs 16 bits to be stored -// -// bit 0- 5: destination square (from 0 to 63) -// bit 6-11: origin square (from 0 to 63) -// bit 12-13: promotion piece type - 2 (from KNIGHT-2 to QUEEN-2) -// bit 14-15: special move flag: promotion (1), en passant (2), castling (3) -// NOTE: en passant bit is set only when a pawn can be captured -// -// Special cases are Move::none() and Move::null(). We can sneak these in because -// in any normal move the destination square and origin square are always different, -// but Move::none() and Move::null() have the same origin and destination square. -class Move { - public: - Move() = default; - constexpr Move(std::uint16_t d) : data(d) {} - - constexpr Move(Square from, Square to) : data((static_cast(from) << 6) | static_cast(to)) {} - - template static constexpr Move make(Square from, Square to, PieceType pt = PieceType::KNIGHT) { - return Move(static_cast(T) | static_cast((static_cast(pt) - static_cast(PieceType::KNIGHT)) << 12) | - (static_cast(from) << 6) | static_cast(to)); - } - - constexpr Square from_sq() const { - assert(is_ok()); - return Square((data >> 6) & 0x3F); - } - - constexpr Square to_sq() const { - assert(is_ok()); - return Square(data & 0x3F); - } - - constexpr Square from() const { return from_sq(); } - constexpr Square to() const { return to_sq(); } - constexpr int from_to() const { return data & 0xFFF; } - - constexpr MoveType type_of() const { return MoveType(data & (3 << 14)); } - constexpr MoveType typeOf() const { return type_of(); } - - constexpr PieceType promotion_type() const { - return static_cast(((data >> 12) & 3) + static_cast(PieceType::KNIGHT)); - } - constexpr PieceType promotionType() const { return promotion_type(); } - constexpr bool is_ok() const { return none().data != data && null().data != data; } - - static constexpr Move null() { return Move(65); } - static constexpr Move none() { return Move(0); } - - constexpr bool operator==(const Move &m) const { return data == m.data; } - constexpr bool operator!=(const Move &m) const { return data != m.data; } - - constexpr explicit operator bool() const { return data != 0; } - - constexpr std::uint16_t raw() const { return data; } - - struct MoveHash { - std::size_t operator()(const Move &m) const { return m.data; } - }; - std::string uci() const; - static constexpr std::uint16_t NO_MOVE = 0; - static constexpr std::uint16_t NULL_MOVE = 65; - static constexpr MoveType NORMAL = MoveType::NORMAL; - static constexpr MoveType PROMOTION = MoveType::PROMOTION; - static constexpr MoveType ENPASSANT = MoveType::EN_PASSANT; - static constexpr MoveType CASTLING = MoveType::CASTLING; - - protected: - std::uint16_t data; -}; - -template struct is_all_same { - static constexpr bool value = (std::is_same_v && ...); -}; - -template constexpr auto is_all_same_v = is_all_same::value; - -template class ValueList { - static_assert(MaxSize, "what are you doing with 0 items"); - - public: - using size_type = std::size_t; - ValueList() = default; - inline size_type size() const { return size_; } - - inline void push_back(const T &value) { - assert(size_ < MaxSize); - values_[size_++] = value; - } - - inline T pop() { - assert(size_ > 0); - return values_[--size_]; // always safe due to mask - } - - inline void pop_back() { - assert(size_ > 0); - size_--; - } - - inline T front() const { - assert(size_ > 0); - return values_[0]; - } - - inline T &operator[](int index) { - assert(index < MaxSize); // relax the conditions, it's BRANCHLESS so forgive - return values_[index]; - } - - inline const T *begin() const { return values_; } - inline T *data() { return values_; } - inline const T *end() const { return values_ + size_; } - size_type size_ = 0; - - private: - T values_[MaxSize]{}; -}; - -using Movelist = ValueList; -constexpr int square_distance(Square a, Square b) { - return std::max(std::abs(file_of(a) - file_of(b)), std::abs(rank_of(a) - rank_of(b))); -} -constexpr Square parse_square(std::string_view sv) { - if (sv.size() < 2) - return SQ_NONE; - - char f = sv[0]; - char r = sv[1]; - - if (f < 'a' || f > 'h' || r < '1' || r > '8') - return SQ_NONE; - - return make_sq(File(f - 'a'), Rank(r - '1')); -} - -constexpr PieceType parse_pt(unsigned char c) { - const char a[] = "pnbrqk"; - int p = -1; - (c >= 'A' && c <= 'Z') ? (c += 32) : (c); // tolower - for (size_t i = 0; i < sizeof(a); i++) { - if (c == a[i]) - p = i; - } - return static_cast(p + 1); -} - -} // namespace chess - - +#pragma once + +#include "fwd_decl.h" +#include +#include +#include +#if defined(_MSC_VER) +#define UNREACHABLE() __assume(false) +#elif defined(__clang__) || defined(__GNUC__) +#define UNREACHABLE() __builtin_unreachable() +#elif defined(__cpp_lib_unreachable) +#define UNREACHABLE() std::unreachable() +#else +#define UNREACHABLE() assert(0) +#endif +#if defined(_MSC_VER) +#define ASSUME(expr) __assume(expr) +#elif defined(__clang__) +#define ASSUME(expr) __builtin_assume(expr) +#elif defined(__GNUC__) +#if __has_cpp_attribute(assume) +#define ASSUME(expr) [[assume(expr)]] +#elif __GNUC__ >= 13 +#define ASSUME(cond) __attribute__((assume(cond))) +#else +#define ASSUME(cond) \ + do { \ + if (!(cond)) \ + UNREACHABLE(); \ + } while (0) +#endif +#else +#define ASSUME(cond) \ + do { \ + if (!(cond)) \ + UNREACHABLE(); \ + } while (0) +#endif + +#ifdef _MSC_VER +#define __FORCEINLINE inline __forceinline +#elif defined(__GNUC__) || defined(__clang__) +#define __FORCEINLINE inline __attribute__((always_inline)) +#else +#define __FORCEINLINE inline +#endif +constexpr bool is_constant_evaluated() { +#if __cpp_if_consteval >= 202106L + if consteval { + return true; + } + // both MSVC (non-comformant __cplusplus) and by-default _MSVC_LANG and other compiles with + // conformant __cplusplus +#elif __cplusplus >= 202002L || _MSVC_LANG >= 202002L + if (std::is_constant_evaluated()) + return true; +#elif defined(__GNUC__) // defined for both GCC and clang + if (__builtin_is_constant_evaluated()) + return true; +#elif _MSC_VER >= 1925 + if (__builtin_is_constant_evaluated()) + return true; +#else +#error "NAWH we don't think we can detect compile time in this compiler"; +#endif + return false; +} +namespace chess { +using Bitboard = uint64_t; +using Key = uint64_t; +// clang-format off +enum Square : int8_t { + SQ_A1, SQ_B1, SQ_C1, SQ_D1, SQ_E1, SQ_F1, SQ_G1, SQ_H1, + SQ_A2, SQ_B2, SQ_C2, SQ_D2, SQ_E2, SQ_F2, SQ_G2, SQ_H2, + SQ_A3, SQ_B3, SQ_C3, SQ_D3, SQ_E3, SQ_F3, SQ_G3, SQ_H3, + SQ_A4, SQ_B4, SQ_C4, SQ_D4, SQ_E4, SQ_F4, SQ_G4, SQ_H4, + SQ_A5, SQ_B5, SQ_C5, SQ_D5, SQ_E5, SQ_F5, SQ_G5, SQ_H5, + SQ_A6, SQ_B6, SQ_C6, SQ_D6, SQ_E6, SQ_F6, SQ_G6, SQ_H6, + SQ_A7, SQ_B7, SQ_C7, SQ_D7, SQ_E7, SQ_F7, SQ_G7, SQ_H7, + SQ_A8, SQ_B8, SQ_C8, SQ_D8, SQ_E8, SQ_F8, SQ_G8, SQ_H8, + SQ_NONE, + + SQUARE_ZERO = 0, + SQUARE_NB = 64 +}; +enum File : int8_t { FILE_A, FILE_B, FILE_C, FILE_D, FILE_E, FILE_F, FILE_G, FILE_H, FILE_NB }; + +enum Rank : int8_t { RANK_1, RANK_2, RANK_3, RANK_4, RANK_5, RANK_6, RANK_7, RANK_8, RANK_NB }; +constexpr bool is_valid(const Rank r, const File f) { return 0 <= r && r <= 7 && 0 <= f && f <= 7; } // unsigned already fix signedness +constexpr bool is_valid(const Square s) { return 0 <= s && s < 64; } +constexpr File file_of(Square s) { + ASSUME(0 <= s && s < 64); + return File(s & 7); +} + +constexpr Rank rank_of(Square s) { + ASSUME(0 <= s && s < 64); + return Rank(s >> 3); +} +constexpr Square make_sq(Rank r, File f) { + ASSUME(0 <= r && r <= 7 && 0 <= f && f <= 7); + return static_cast(static_cast(r * 8 + f)); +} +constexpr Square make_sq(File f, Rank r) { + ASSUME(0 <= r && r <= 7 && 0 <= f && f <= 7); + return static_cast(static_cast(r * 8 + f)); +} +enum Color : uint8_t { WHITE = 0, BLACK = 1, COLOR_NB = 2 }; +// Toggle color +constexpr Color operator~(Color c) { return Color(c ^ BLACK); } +enum PieceType : std::int8_t { NO_PIECE_TYPE = 0, PAWN, KNIGHT, BISHOP, ROOK, QUEEN, KING, ALL_PIECES = 0, PIECE_TYPE_NB = 8 }; +enum Direction : int8_t { + NORTH = 8, + EAST = 1, + SOUTH = -NORTH, + WEST = -EAST, + + NORTH_EAST = NORTH + EAST, + SOUTH_EAST = SOUTH + EAST, + SOUTH_WEST = SOUTH + WEST, + NORTH_WEST = NORTH + WEST, + DIR_NONE = 0 +}; +// clang-format on +inline constexpr Square relative_square(Color c, Square s) { return Square(s ^ (c * 56)); } +inline constexpr Square castling_rook_square(Color c, bool is_king_side) { + return relative_square(c, is_king_side ? SQ_F1 : Square::SQ_D1); +} +inline constexpr Square castling_king_square(Color c, bool is_king_side) { + return relative_square(c, is_king_side ? SQ_G1 : Square::SQ_C1); +} + +inline constexpr Rank relative_rank(Color c, Rank r) { return Rank(r ^ (c * 7)); } + +inline constexpr Rank relative_rank(Color c, Square s) { return relative_rank(c, rank_of(s)); } + +inline constexpr Direction relative_direction(Color c, Direction d) { return static_cast(c == WHITE ? d : -d); } +inline constexpr Direction pawn_push(Color c) { return c == WHITE ? NORTH : SOUTH; } + +#define ENABLE_INCR_OPERATORS_ON(T) \ + constexpr T &operator++(T &d) { return d = T(int(d) + 1); } \ + constexpr T &operator--(T &d) { return d = T(int(d) - 1); } \ + constexpr T operator++(T &d, int) { \ + T old = d; \ + ++d; \ + return old; \ + } \ + constexpr T operator--(T &d, int) { \ + T old = d; \ + --d; \ + return old; \ + } + +ENABLE_INCR_OPERATORS_ON(PieceType) +ENABLE_INCR_OPERATORS_ON(Square) +ENABLE_INCR_OPERATORS_ON(File) +ENABLE_INCR_OPERATORS_ON(Rank) + +#undef ENABLE_INCR_OPERATORS_ON + +constexpr Direction operator+(Direction d1, Direction d2) { return Direction(int(d1) + int(d2)); } +constexpr Direction operator*(int i, Direction d) { return Direction(i * int(d)); } + +// Additional operators to add a Direction to a Square +constexpr Square operator+(Square s, Direction d) { return Square(int(s) + int(d)); } +constexpr Square operator-(Square s, Direction d) { return Square(int(s) - int(d)); } +constexpr Square &operator+=(Square &s, Direction d) { return s = s + d; } +constexpr Square &operator-=(Square &s, Direction d) { return s = s - d; } +// specifically for Polyglot (a.k.a zobrist hashing but use proper hash) +enum class PolyglotPiece : uint8_t { + WPAWN = 1, + WKNIGHT = 3, + WBISHOP = 5, + WROOK = 7, + WQUEEN = 9, + WKING = 11, + BPAWN = 0, + BKNIGHT = 2, + BBISHOP = 4, + BROOK = 6, + BQUEEN = 8, + BKING = 10, + NO_PIECE = 12, + PIECE_NB = 12 +}; +// Normal board, you can use ANY! (but comfortable for certain chess engines such as Stockfish) +enum class EnginePiece : uint8_t { + NO_PIECE, + WPAWN = PAWN + 0, + WKNIGHT, + WBISHOP, + WROOK, + WQUEEN, + WKING, + BPAWN = PAWN + 8, + BKNIGHT, + BBISHOP, + BROOK, + BQUEEN, + BKING, + PIECE_NB = 16 +}; +enum class ContiguousMappingPiece : uint8_t { + WPAWN = 0, + WKNIGHT = 1, + WBISHOP = 2, + WROOK = 3, + WQUEEN = 4, + WKING = 5, + BPAWN = 6, + BKNIGHT = 7, + BBISHOP = 8, + BROOK = 9, + BQUEEN = 10, + BKING = 11, + NO_PIECE = 12, + PIECE_NB = 12 +}; +template constexpr size_t enum_idx() { + if constexpr (std::is_same_v) + return 0; + else if constexpr (std::is_same_v) + return 1; + else if constexpr (std::is_same_v) + return 2; + return -1; +} +// clang-format on +constexpr PieceType piece_of(PolyglotPiece p) { + return p == decltype(p)::NO_PIECE ? NO_PIECE_TYPE : static_cast(static_cast(p) / 2 + 1); +} +constexpr PieceType piece_of(EnginePiece p) { + return p == decltype(p)::NO_PIECE ? NO_PIECE_TYPE : static_cast((static_cast(p) - 1) % 8 + 1); +} +constexpr PieceType piece_of(ContiguousMappingPiece p) { + return p == decltype(p)::NO_PIECE ? NO_PIECE_TYPE : static_cast(static_cast(p) % 6 + 1); +} +constexpr Color color_of(PolyglotPiece pt) { return static_cast((static_cast(pt) + 1) % 2); } +constexpr Color color_of(EnginePiece pt) { + return static_cast(static_cast(pt) / static_cast(EnginePiece::BPAWN)); +} +constexpr Color color_of(ContiguousMappingPiece pt) { return static_cast(static_cast(pt) / 6); } +template , bool> = 0> +constexpr EnginePiece make_piece(PieceType pt, Color c) { + return static_cast((c << 3) + pt); +} +template , bool> = 0> +constexpr PolyglotPiece make_piece(PieceType pt, Color c) { + return static_cast(~c + 2 * (pt - 1)); +} +template , bool> = 0> +constexpr ContiguousMappingPiece make_piece(PieceType pt, Color c) { + return static_cast((static_cast(pt) - 1) + 6 * static_cast(c)); +} +template ::value>> constexpr PieceType type_of(T p) { + return piece_of(p); +} + +enum CastlingRights : int8_t { + NO_CASTLING, + WHITE_OO, + WHITE_OOO = WHITE_OO << 1, + BLACK_OO = WHITE_OO << 2, + BLACK_OOO = WHITE_OO << 3, + + KING_SIDE = WHITE_OO | BLACK_OO, + QUEEN_SIDE = WHITE_OOO | BLACK_OOO, + WHITE_CASTLING = WHITE_OO | WHITE_OOO, + BLACK_CASTLING = BLACK_OO | BLACK_OOO, + ANY_CASTLING = WHITE_CASTLING | BLACK_CASTLING, + + CASTLING_RIGHT_NB = 16 +}; +constexpr CastlingRights operator&(Color c, CastlingRights cr) { + return CastlingRights((c == WHITE ? WHITE_CASTLING : BLACK_CASTLING) & cr); +} +// Bitwise OR assignment operator +inline CastlingRights &operator|=(CastlingRights &a, CastlingRights b) { + a = static_cast(static_cast(a) | static_cast(b)); + return a; +} +// Bitwise OR assignment operator +inline CastlingRights operator|(CastlingRights a, CastlingRights b) { + return static_cast(static_cast(a) | static_cast(b)); +} + +// Bitwise OR assignment operator +inline CastlingRights &operator&=(CastlingRights &a, CastlingRights b) { + a = static_cast(static_cast(a) & static_cast(b)); + return a; +} +inline CastlingRights operator~(CastlingRights a) { + return static_cast(static_cast(a) ^ ANY_CASTLING); +} + +enum MoveType : uint16_t { NORMAL, PROMOTION = 1 << 14, EN_PASSANT = 2 << 14, CASTLING = 3 << 14 }; +// A move needs 16 bits to be stored +// +// bit 0- 5: destination square (from 0 to 63) +// bit 6-11: origin square (from 0 to 63) +// bit 12-13: promotion piece type - 2 (from KNIGHT-2 to QUEEN-2) +// bit 14-15: special move flag: promotion (1), en passant (2), castling (3) +// NOTE: en passant bit is set only when a pawn can be captured +// +// Special cases are Move::none() and Move::null(). We can sneak these in because +// in any normal move the destination square and origin square are always different, +// but Move::none() and Move::null() have the same origin and destination square. +class Move { + public: + Move() = default; + constexpr Move(std::uint16_t d) : data(d) {} + + constexpr Move(Square from, Square to) : data((static_cast(from) << 6) | static_cast(to)) {} + + template static constexpr Move make(Square from, Square to, PieceType pt = PieceType::KNIGHT) { + return Move(static_cast(T) | static_cast((static_cast(pt) - static_cast(PieceType::KNIGHT)) << 12) | + (static_cast(from) << 6) | static_cast(to)); + } + + constexpr Square from_sq() const { + assert(is_ok()); + return Square((data >> 6) & 0x3F); + } + + constexpr Square to_sq() const { + assert(is_ok()); + return Square(data & 0x3F); + } + + constexpr Square from() const { return from_sq(); } + constexpr Square to() const { return to_sq(); } + constexpr int from_to() const { return data & 0xFFF; } + + constexpr MoveType type_of() const { return MoveType(data & (3 << 14)); } + constexpr MoveType typeOf() const { return type_of(); } + + constexpr PieceType promotion_type() const { + return static_cast(((data >> 12) & 3) + static_cast(PieceType::KNIGHT)); + } + constexpr PieceType promotionType() const { return promotion_type(); } + constexpr bool is_ok() const { return none().data != data && null().data != data; } + + static constexpr Move null() { return Move(65); } + static constexpr Move none() { return Move(0); } + + constexpr bool operator==(const Move &m) const { return data == m.data; } + constexpr bool operator!=(const Move &m) const { return data != m.data; } + + constexpr explicit operator bool() const { return data != 0; } + + constexpr std::uint16_t raw() const { return data; } + + struct MoveHash { + std::size_t operator()(const Move &m) const { return m.data; } + }; + std::string uci() const; + static constexpr std::uint16_t NO_MOVE = 0; + static constexpr std::uint16_t NULL_MOVE = 65; + static constexpr MoveType NORMAL = MoveType::NORMAL; + static constexpr MoveType PROMOTION = MoveType::PROMOTION; + static constexpr MoveType ENPASSANT = MoveType::EN_PASSANT; + static constexpr MoveType CASTLING = MoveType::CASTLING; + + protected: + std::uint16_t data; +}; + +template struct is_all_same { + static constexpr bool value = (std::is_same_v && ...); +}; + +template constexpr auto is_all_same_v = is_all_same::value; + +template class ValueList { + static_assert(MaxSize, "what are you doing with 0 items"); + + public: + using size_type = std::size_t; + ValueList() = default; + inline size_type size() const { return size_; } + + inline void push_back(const T &value) { + assert(size_ < MaxSize); + values_[size_++] = value; + } + + inline T pop() { + assert(size_ > 0); + return values_[--size_]; // always safe due to mask + } + + inline void pop_back() { + assert(size_ > 0); + size_--; + } + + inline T front() const { + assert(size_ > 0); + return values_[0]; + } + + inline T &operator[](int index) { + assert(index < MaxSize); // relax the conditions, it's BRANCHLESS so forgive + return values_[index]; + } + + inline const T *begin() const { return values_; } + inline T *data() { return values_; } + inline const T *end() const { return values_ + size_; } + size_type size_ = 0; + + private: + T values_[MaxSize]{}; +}; + +using Movelist = ValueList; +constexpr int square_distance(Square a, Square b) { + return std::max(std::abs(file_of(a) - file_of(b)), std::abs(rank_of(a) - rank_of(b))); +} +constexpr Square parse_square(std::string_view sv) { + if (sv.size() < 2) + return SQ_NONE; + + char f = sv[0]; + char r = sv[1]; + + if (f < 'a' || f > 'h' || r < '1' || r > '8') + return SQ_NONE; + + return make_sq(File(f - 'a'), Rank(r - '1')); +} + +constexpr PieceType parse_pt(unsigned char c) { + const char a[] = "pnbrqk"; + int p = -1; + (c >= 'A' && c <= 'Z') ? (c += 32) : (c); // tolower + for (size_t i = 0; i < sizeof(a); i++) { + if (c == a[i]) + p = i; + } + return static_cast(p + 1); +} + +} // namespace chess From 09179ab334e874c419b00a2ebe81c6166d42f743 Mon Sep 17 00:00:00 2001 From: winapiadmin Date: Fri, 6 Feb 2026 14:56:04 +0700 Subject: [PATCH 3/7] WORK IN PROGRESS enabled test cases --- tests.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests.cpp b/tests.cpp index 96a930f..dbfe351 100644 --- a/tests.cpp +++ b/tests.cpp @@ -1307,7 +1307,7 @@ TEST_CASE("Captures only?") { }; check_perfts(tests); } -/*TEST_CASE("Chess960") { +TEST_CASE("Chess960") { std::vector> tests = { { "bqnb1rkr/pp3ppp/3ppn2/2p5/5P2/P2P4/NPP1P1PP/BQ1BNRKR w HFhf - 2 9", 1, 21 }, { "bqnb1rkr/pp3ppp/3ppn2/2p5/5P2/P2P4/NPP1P1PP/BQ1BNRKR w HFhf - 2 9", 2, 528 }, @@ -7071,7 +7071,7 @@ TEST_CASE("Captures only?") { { "bbq1nr1r/pppppk1p/2n2p2/6p1/P4P2/4P1P1/1PPP3P/BBQNNRKR w HF - 1 9", 6, 280056112 }, }; check_perfts(tests); -}*/ +} int main(int argc, char **argv) { doctest::Context ctx; ctx.setOption("success", true); From 87428017f0ddb0212a927e958a8f3c1c7d3ba437 Mon Sep 17 00:00:00 2001 From: winapiadmin Date: Fri, 6 Feb 2026 15:20:32 +0700 Subject: [PATCH 4/7] added doctest as submodule --- .gitmodules | 3 +++ deps/doctest | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 deps/doctest diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f0e51e3 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "deps/doctest"] + path = deps/doctest + url = https://github.com/doctest/doctest.git diff --git a/deps/doctest b/deps/doctest new file mode 160000 index 0000000..1da23a3 --- /dev/null +++ b/deps/doctest @@ -0,0 +1 @@ +Subproject commit 1da23a3e8119ec5cce4f9388e91b065e20bf06f5 From 2d829cdc17d1358c5cd716e95cd1acb11b28e4fa Mon Sep 17 00:00:00 2001 From: winapiadmin Date: Tue, 24 Feb 2026 11:32:20 +0700 Subject: [PATCH 5/7] added full support for chess960 BUT PLEASE don't use i/o for chess960 moves --- .gitignore | 6 +- .vscode/settings.json | 71 ----------------- README.md | 4 +- bitboard.h | 10 +-- deps/doctest | 1 - movegen.cpp | 49 +++++------- movegen.h | 2 +- moves_io.cpp | 17 +++-- moves_io.h | 2 +- position.cpp | 107 +++++++++++++++++--------- position.h | 172 +++++++++++++++++++++--------------------- printers.h | 1 + tests.cpp | 21 +++--- types.h | 7 -- 14 files changed, 214 insertions(+), 256 deletions(-) delete mode 100644 .vscode/settings.json delete mode 160000 deps/doctest diff --git a/.gitignore b/.gitignore index 3824d88..6ba49a4 100644 --- a/.gitignore +++ b/.gitignore @@ -7,8 +7,12 @@ build/ !LICENSE !CMakeLists.txt !.gitignore +!.gitattributes CMakePresets.json CMakeSettings.json *.s .vscode -.cache \ No newline at end of file +.cache +deps/* +!deps/ +* \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 04a7b94..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "files.associations": { - "chrono": "cpp", - "array": "cpp", - "atomic": "cpp", - "bit": "cpp", - "cctype": "cpp", - "charconv": "cpp", - "clocale": "cpp", - "cmath": "cpp", - "compare": "cpp", - "concepts": "cpp", - "condition_variable": "cpp", - "csignal": "cpp", - "cstdarg": "cpp", - "cstddef": "cpp", - "cstdint": "cpp", - "cstdio": "cpp", - "cstdlib": "cpp", - "cstring": "cpp", - "ctime": "cpp", - "cwchar": "cpp", - "cwctype": "cpp", - "deque": "cpp", - "list": "cpp", - "map": "cpp", - "set": "cpp", - "string": "cpp", - "unordered_map": "cpp", - "unordered_set": "cpp", - "vector": "cpp", - "exception": "cpp", - "algorithm": "cpp", - "functional": "cpp", - "iterator": "cpp", - "memory": "cpp", - "memory_resource": "cpp", - "numeric": "cpp", - "optional": "cpp", - "random": "cpp", - "ratio": "cpp", - "string_view": "cpp", - "system_error": "cpp", - "tuple": "cpp", - "type_traits": "cpp", - "utility": "cpp", - "format": "cpp", - "fstream": "cpp", - "initializer_list": "cpp", - "iomanip": "cpp", - "iosfwd": "cpp", - "iostream": "cpp", - "istream": "cpp", - "limits": "cpp", - "mutex": "cpp", - "new": "cpp", - "numbers": "cpp", - "ostream": "cpp", - "semaphore": "cpp", - "span": "cpp", - "sstream": "cpp", - "stdexcept": "cpp", - "stop_token": "cpp", - "streambuf": "cpp", - "thread": "cpp", - "cinttypes": "cpp", - "typeinfo": "cpp", - "variant": "cpp", - "bitset": "cpp" - } -} \ No newline at end of file diff --git a/README.md b/README.md index cebde48..650d24e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,2 @@ # chesslib -(formerly MultiTypeChess, but it was an absolutely bad name) - -This is now.... chesslib (it's super duplicated as I searched) a yet good chess library, as the name. \ No newline at end of file +A chess library that supports Chess960 and decently fast enough. \ No newline at end of file diff --git a/bitboard.h b/bitboard.h index 26b4a9e..cc635cb 100644 --- a/bitboard.h +++ b/bitboard.h @@ -43,7 +43,7 @@ constexpr int msb_constexpr(Bitboard x) noexcept { #if defined(__GNUG__) || defined(__clang__) [[gnu::const]] #endif -__FORCEINLINE constexpr int popcount(Bitboard x) noexcept { +inline constexpr int popcount(Bitboard x) noexcept { #if defined(__GNUG__) || defined(__clang__) if (!is_constant_evaluated()) return __builtin_popcountll(x); @@ -57,7 +57,7 @@ __FORCEINLINE constexpr int popcount(Bitboard x) noexcept { #if defined(__GNUG__) || defined(__clang__) [[gnu::const]] #endif -__FORCEINLINE constexpr int lsb(Bitboard x) noexcept { +inline constexpr int lsb(Bitboard x) noexcept { #if defined(__GNUG__) || defined(__clang__) if (!is_constant_evaluated()) return __builtin_ctzll(x); @@ -74,7 +74,7 @@ __FORCEINLINE constexpr int lsb(Bitboard x) noexcept { #if defined(__GNUG__) || defined(__clang__) [[gnu::const]] #endif -__FORCEINLINE constexpr int msb(Bitboard x) noexcept { +inline constexpr int msb(Bitboard x) noexcept { #if defined(__GNUG__) || defined(__clang__) if (!is_constant_evaluated()) return 63 - __builtin_clzll(x); @@ -91,7 +91,7 @@ __FORCEINLINE constexpr int msb(Bitboard x) noexcept { // ------------------------------- // destructive variants // ------------------------------- -__FORCEINLINE int pop_lsb(Bitboard &b) noexcept { +inline int pop_lsb(Bitboard &b) noexcept { int c = lsb(b); #ifndef __BMI2__ b &= b - 1; @@ -101,7 +101,7 @@ __FORCEINLINE int pop_lsb(Bitboard &b) noexcept { return c; } -__FORCEINLINE int pop_msb(Bitboard &b) noexcept { +inline int pop_msb(Bitboard &b) noexcept { int c = msb(b); b &= ~(1ULL << c); return c; diff --git a/deps/doctest b/deps/doctest deleted file mode 160000 index 1da23a3..0000000 --- a/deps/doctest +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1da23a3e8119ec5cce4f9388e91b065e20bf06f5 diff --git a/movegen.cpp b/movegen.cpp index d242da9..cf5aee6 100644 --- a/movegen.cpp +++ b/movegen.cpp @@ -229,7 +229,7 @@ void movegen::genKnightMoves(const _Position &pos, Movelist &list, Bitb list.size_ += popcount(moves); } } -template void movegen::genKingMoves(const _Position &pos, Movelist &out) { +template void movegen::genKingMoves(const _Position &pos, Movelist &out, Bitboard _pin_mask) { constexpr Color them = ~c; const Square kingSq = pos.kingSq(c); const Bitboard occAll = pos.occ(); @@ -269,31 +269,20 @@ template void movegen::genKingMoves(con Bitboard occupancy = pos.occ(); Bitboard enemy_attacks = enemyAttacks; - - if constexpr (c == WHITE) { - Bitboard WHITE_OO_EMPTY = pos.getCastlingPath(WHITE, true); - Bitboard WHITE_OO_SAFE = between(kingSq, castling_king_square(WHITE, true)); - Bitboard WHITE_OOO_EMPTY = pos.getCastlingPath(WHITE, false); - Bitboard WHITE_OOO_SAFE = between(kingSq, castling_king_square(WHITE, false)); - - if ((pos.castlingRights() & WHITE_OO) && !(occupancy & WHITE_OO_EMPTY) && !(enemy_attacks & WHITE_OO_SAFE)) { - out.push_back(Move::make(kingSq, SQ_H1)); - } - if ((pos.castlingRights() & WHITE_OOO) && !(occupancy & WHITE_OOO_EMPTY) && !(enemy_attacks & WHITE_OOO_SAFE)) { - out.push_back(Move::make(kingSq, SQ_A1)); - } - } else { - Bitboard BLACK_OO_EMPTY = pos.getCastlingPath(BLACK, true); - Bitboard BLACK_OO_SAFE = between(kingSq, castling_king_square(BLACK, true)); - Bitboard BLACK_OOO_EMPTY = pos.getCastlingPath(BLACK, false); - Bitboard BLACK_OOO_SAFE = between(kingSq, castling_king_square(BLACK, false)); - - if ((pos.castlingRights() & BLACK_OO) && !(occupancy & BLACK_OO_EMPTY) && !(enemy_attacks & BLACK_OO_SAFE)) { - out.push_back(Move::make(kingSq, SQ_H8)); - } - if ((pos.castlingRights() & BLACK_OOO) && !(occupancy & BLACK_OOO_EMPTY) && !(enemy_attacks & BLACK_OOO_SAFE)) { - out.push_back(Move::make(kingSq, SQ_A8)); - } + constexpr CastlingRights kingRights=KING_SIDE & (c==WHITE?WHITE_CASTLING:BLACK_CASTLING), + queenRights=QUEEN_SIDE & (c==WHITE?WHITE_CASTLING:BLACK_CASTLING); + Bitboard OO_EMPTY = pos.getCastlingPath(c, true); + Bitboard OO_SAFE = between(kingSq, castling_king_square(c, true)); + Bitboard OOO_EMPTY = pos.getCastlingPath(c, false); + Bitboard OOO_SAFE = between(kingSq, castling_king_square(c, false)); + Square rookKing=pos.getCastlingMetadata(c).rook_start_ks, + rookQueen=pos.getCastlingMetadata(c).rook_start_qs; + + if ((pos.castlingRights() & kingRights) && !((occupancy & OO_EMPTY)||(enemy_attacks & OO_SAFE) || (_pin_mask & (1ULL<(kingSq, rookKing)); + } + if ((pos.castlingRights() & queenRights) && !((occupancy & OOO_EMPTY) || (enemy_attacks & OOO_SAFE) || (_pin_mask & (1ULL<(kingSq, rookQueen)); } } } @@ -451,10 +440,10 @@ template Move *chess::_chess::splat_pawn_moves(Move *, Bitboard); Movelist &, \ Bitboard, \ Bitboard); \ - template void chess::movegen::genKingMoves(const _Position &, Movelist &); \ - template void chess::movegen::genKingMoves(const _Position &, Movelist &); \ - template void chess::movegen::genKingMoves(const _Position &, Movelist &); \ - template void chess::movegen::genKingMoves(const _Position &, Movelist &); + template void chess::movegen::genKingMoves(const _Position &, Movelist &,Bitboard); \ + template void chess::movegen::genKingMoves(const _Position &, Movelist &,Bitboard); \ + template void chess::movegen::genKingMoves(const _Position &, Movelist &,Bitboard); \ + template void chess::movegen::genKingMoves(const _Position &, Movelist &,Bitboard); INSTANTIATE(EnginePiece) INSTANTIATE(PolyglotPiece) INSTANTIATE(ContiguousMappingPiece) diff --git a/movegen.h b/movegen.h index ab79079..c85a347 100644 --- a/movegen.h +++ b/movegen.h @@ -13,7 +13,7 @@ template void genPawnSingleMoves(const _Position &, Movelist &, Bitboard, Bitboard, Bitboard); template void genKnightMoves(const _Position &, Movelist &, Bitboard, Bitboard); -template void genKingMoves(const _Position &, Movelist &); +template void genKingMoves(const _Position &, Movelist &,Bitboard); template void genSlidingMoves(const _Position &, Movelist &, Bitboard, Bitboard, Bitboard); extern std::array, 65> SQUARES_BETWEEN_BB; diff --git a/moves_io.cpp b/moves_io.cpp index 3462ae9..5b9fdca 100644 --- a/moves_io.cpp +++ b/moves_io.cpp @@ -21,7 +21,7 @@ std::string squareToString(Square sq) { }; return std::string{ fileChars[sq] }; } -std::string moveToUci(Move mv) { +std::string moveToUci(Move mv,bool chess960) { if (!mv.is_ok()) { // null move static const std::string nullMove = "0000"; @@ -49,12 +49,15 @@ std::string moveToUci(Move mv) { move += "c8"; // black queenside castling break; default: + if (chess960) move += squareToString(mv.to_sq()); + else{ #if defined(_DEBUG) || !defined(NDEBUG) assert(false && "this isn't chess960"); #else THROW_IF_EXCEPTIONS_ON(IllegalMoveException("this isn't chess960")); break; #endif + } } break; case PROMOTION: @@ -133,16 +136,20 @@ template Move parseSan(const _Position &pos, std: // 1) Castling shortcuts if (san == "O-O" || san == "0-0" || san == "O-O+" || san == "0-0+" || san == "O-O#" || san == "0-0#") { - Move km = chess::Move::make(relative_square(pos.side_to_move(), SQ_E1), - relative_square(pos.side_to_move(), SQ_H1)); + const auto from = pos.kingSq(pos.side_to_move()); + const auto to = pos.state().castlingMetadata[pos.side_to_move()].rook_start_ks; + Move km = chess::Move::make(from, to); + if (std::find(moves.begin(), moves.end(), km) != moves.end()) return km; THROW_IF_EXCEPTIONS_ON(IllegalMoveException("illegal san: '" + san + "' in " + pos.fen())); return Move::none(); } if (san == "O-O-O" || san == "0-0-0" || san == "O-O-O+" || san == "0-0-0+" || san == "O-O-O#" || san == "0-0-0#") { - Move qm = chess::Move::make(relative_square(pos.side_to_move(), SQ_E1), - relative_square(pos.side_to_move(), SQ_A1)); + const auto from = pos.kingSq(pos.side_to_move()); + const auto to = pos.state().castlingMetadata[pos.side_to_move()].rook_start_qs; + Move qm = chess::Move::make(from, to); + if (std::find(moves.begin(), moves.end(), qm) != moves.end()) return qm; THROW_IF_EXCEPTIONS_ON(IllegalMoveException("illegal san: '" + san + "' in " + pos.fen())); diff --git a/moves_io.h b/moves_io.h index 72094e7..e967223 100644 --- a/moves_io.h +++ b/moves_io.h @@ -8,7 +8,7 @@ class Move; enum Square : int8_t; template class _Position; namespace uci { -std::string moveToUci(Move move); +std::string moveToUci(Move move,bool chess960=false); std::string squareToString(Square sq); class IllegalMoveException : public std::exception { diff --git a/position.cpp b/position.cpp index 0d1a6f6..4b12db4 100644 --- a/position.cpp +++ b/position.cpp @@ -41,13 +41,23 @@ template template void _Position template void _Position template void _Position(ep_capture_sq, them); placePiece(to_sq, us); current_state.incr_sqs[0] = from_sq; @@ -75,21 +87,30 @@ template template void _Position(rook_dest, us); + const bool is_king_side = file_of(from_sq) < file_of(to_sq); + const Square rook_dest = castling_rook_square(us, is_king_side); + const Square king_dest = castling_king_square(us, is_king_side); + + const PieceC prev_king_dest = piece_on(king_dest); + const PieceC prev_rook_dest = piece_on(rook_dest); + + current_state.incr_sqs[0]=from_sq, current_state.incr_pc[0]=moving_piece; + current_state.incr_sqs[1]=to_sq, current_state.incr_pc[1]=target_piece; + current_state.incr_sqs[2]=king_dest, current_state.incr_pc[2]=prev_king_dest; + current_state.incr_sqs[3]=rook_dest, current_state.incr_pc[3]=prev_rook_dest; + + Square rook_start = is_king_side + ? current_state.castlingMetadata[us].rook_start_ks + : current_state.castlingMetadata[us].rook_start_qs; + + removePiece(from_sq, us); + removePiece(rook_start, us); + placePiece(king_dest, us); - current_state.incr_sqs[0] = from_sq; - current_state.incr_pc[0] = moving_piece; - current_state.incr_sqs[1] = to_sq; - current_state.incr_pc[1] = target_piece; - current_state.incr_sqs[2] = king_dest; - current_state.incr_pc[2] = PieceC::NO_PIECE; - current_state.incr_sqs[3] = rook_dest; - current_state.incr_pc[3] = PieceC::NO_PIECE; + placePiece(rook_dest, us); break; } + } } { @@ -152,8 +173,8 @@ template template void _Position void _Position::setFEN(const s case 'K': INVALID_ARG_IF(chess960, "Chess960 needs specific file"); current_state.castlingRights |= WHITE_OO; - current_state.hash ^= zobrist::RandomCastle[WHITE_OO]; current_state.castlingMetadata[WHITE].king_start = kingSq(WHITE); current_state.castlingMetadata[WHITE].rook_start_ks = SQ_H1; break; case 'Q': INVALID_ARG_IF(chess960, "Chess960 needs specific file"); current_state.castlingRights |= WHITE_OOO; - current_state.hash ^= zobrist::RandomCastle[WHITE_OOO]; current_state.castlingMetadata[WHITE].king_start = kingSq(WHITE); current_state.castlingMetadata[WHITE].rook_start_qs = SQ_A1; break; case 'k': INVALID_ARG_IF(chess960, "Chess960 needs specific file"); current_state.castlingRights |= BLACK_OO; - current_state.hash ^= zobrist::RandomCastle[BLACK_OO]; current_state.castlingMetadata[BLACK].king_start = kingSq(BLACK); current_state.castlingMetadata[BLACK].rook_start_ks = SQ_H8; break; case 'q': INVALID_ARG_IF(chess960, "Chess960 needs specific file"); current_state.castlingRights |= BLACK_OOO; - current_state.hash ^= zobrist::RandomCastle[BLACK_OOO]; current_state.castlingMetadata[BLACK].king_start = kingSq(BLACK); current_state.castlingMetadata[BLACK].rook_start_qs = SQ_A8; break; @@ -311,30 +328,38 @@ template void _Position::setFEN(const s INVALID_ARG_IF(!chess960, "Invalid castling right for non-Chess960"); if (c >= 'A' && c <= 'H') // white-castling { - CastlingRights cr = (make_sq(RANK_1, static_cast(c - 'A')) > SQ_E1 ? WHITE_OO : WHITE_OOO); + const auto king_start = kingSq(WHITE); + const auto rook_start = make_sq(RANK_1, static_cast(c - 'A')); + + CastlingRights cr = (file_of(rook_start) > file_of(king_start) ? WHITE_OO : WHITE_OOO); current_state.castlingRights |= cr; current_state.castlingMetadata[WHITE].king_start = kingSq(WHITE); if (cr & KING_SIDE) - current_state.castlingMetadata[WHITE].rook_start_ks = make_sq(RANK_1, static_cast(c - 'A')); + current_state.castlingMetadata[WHITE].rook_start_ks = rook_start; else - current_state.castlingMetadata[WHITE].rook_start_qs = make_sq(RANK_1, static_cast(c - 'A')); + current_state.castlingMetadata[WHITE].rook_start_qs = rook_start; } else if (c >= 'a' && c <= 'h') // white-castling { - CastlingRights cr = (make_sq(RANK_8, static_cast(c - 'a')) > SQ_E8 ? BLACK_OO : BLACK_OOO); + const auto king_start = kingSq(BLACK); + const auto rook_start = make_sq(RANK_8, static_cast(c - 'a')); + + CastlingRights cr = (file_of(rook_start) > file_of(king_start) ? BLACK_OO : BLACK_OOO); current_state.castlingRights |= cr; - current_state.castlingMetadata[BLACK].king_start = kingSq(BLACK); + current_state.castlingMetadata[BLACK].king_start = king_start; if (cr & KING_SIDE) - current_state.castlingMetadata[BLACK].rook_start_ks = make_sq(RANK_8, static_cast(c - 'a')); + current_state.castlingMetadata[BLACK].rook_start_ks = rook_start; else - current_state.castlingMetadata[BLACK].rook_start_qs = make_sq(RANK_8, static_cast(c - 'a')); + current_state.castlingMetadata[BLACK].rook_start_qs = rook_start; } break; } } } + current_state.hash ^= zobrist::RandomCastle[current_state.castlingRights]; + for (Color c : { WHITE, BLACK }) { // king - { + if (castlingRights() & (c & KING_SIDE)){ const auto king_from = current_state.castlingMetadata[c].king_start; const auto rook_from = make_sq(file_of(current_state.castlingMetadata[c].rook_start_ks), rank_of(king_from)); const auto king_to = castling_king_square(c, true); @@ -344,7 +369,7 @@ template void _Position::setFEN(const s ~((1ULL << king_from) | (1ULL << rook_from)); } // queen - { + if (castlingRights() & (c & QUEEN_SIDE)){ const auto king_from = current_state.castlingMetadata[c].king_start; const auto rook_from = make_sq(file_of(current_state.castlingMetadata[c].rook_start_qs), rank_of(king_from)); const auto king_to = castling_king_square(c, false); @@ -417,16 +442,28 @@ template std::string _Position::fen() c // 3) Castling availability ss << ' '; std::string castlingStr; - if (castlingRights() & WHITE_OO) - castlingStr += 'K'; - if (castlingRights() & WHITE_OOO) - castlingStr += 'Q'; - if (castlingRights() & BLACK_OO) - castlingStr += 'k'; - if (castlingRights() & BLACK_OOO) - castlingStr += 'q'; + if (chess960()) { + if (castlingRights() & WHITE_OO) + castlingStr += static_cast('A' + file_of(current_state.castlingMetadata[WHITE].rook_start_ks)); + if (castlingRights() & WHITE_OOO) + castlingStr += static_cast('A' + file_of(current_state.castlingMetadata[WHITE].rook_start_qs)); + if (castlingRights() & BLACK_OO) + castlingStr += static_cast('a' + file_of(current_state.castlingMetadata[BLACK].rook_start_ks)); + if (castlingRights() & BLACK_OOO) + castlingStr += static_cast('a' + file_of(current_state.castlingMetadata[BLACK].rook_start_qs)); + } else { + if (castlingRights() & WHITE_OO) + castlingStr += 'K'; + if (castlingRights() & WHITE_OOO) + castlingStr += 'Q'; + if (castlingRights() & BLACK_OO) + castlingStr += 'k'; + if (castlingRights() & BLACK_OOO) + castlingStr += 'q'; + } ss << (castlingStr.empty() ? "-" : castlingStr); + // 4) En passant target square or '-' ss << ' '; Square ep = ep_square(); diff --git a/position.h b/position.h index 3c4047d..12d12d4 100644 --- a/position.h +++ b/position.h @@ -169,7 +169,7 @@ template __FORCEINLINE void legals(Movelist &out) const { + template inline void legals(Movelist &out) const { constexpr uint16_t raw = static_cast(type); constexpr uint16_t pieceBits = raw & static_cast(MoveGenType::PIECE_MASK); @@ -225,7 +225,7 @@ template (MoveGenType::KING)) { - movegen::genKingMoves(*this, out); + movegen::genKingMoves(*this, out, _pin_mask); } if constexpr (effectivePieces & static_cast(MoveGenType::BISHOP)) { @@ -242,7 +242,7 @@ template __FORCEINLINE void legals(Movelist &out) const { + template inline void legals(Movelist &out) const { const Color stm = sideToMove(); // Cache it ASSUME(stm == WHITE || stm == BLACK); // Now clearly no side effects @@ -264,7 +264,6 @@ template __FORCEINLINE Bitboard pieces(Color c) const { + inline Bitboard pieces() const { return occ(); } + template inline Bitboard pieces(Color c) const { ASSUME(c == WHITE || c == BLACK); if constexpr (pt == PIECE_TYPE_NB || pt == ALL_PIECES) return occ(c); return current_state.pieces[pt] & current_state.occ[c]; } - template __FORCEINLINE Bitboard pieces(PieceType pt) const { + template inline Bitboard pieces(PieceType pt) const { ASSUME(c == WHITE || c == BLACK); if (pt == PIECE_TYPE_NB || pt == ALL_PIECES) return occ(c); @@ -303,7 +302,7 @@ template && ...)>> - [[nodiscard]] __FORCEINLINE Bitboard pieces(PTypes... ptypes) const { + [[nodiscard]] inline Bitboard pieces(PTypes... ptypes) const { return (current_state.pieces[static_cast(ptypes)] | ...); } template && ...)>> - [[nodiscard]] __FORCEINLINE Bitboard pieces(Color c, PTypes... ptypes) const { + [[nodiscard]] inline Bitboard pieces(Color c, PTypes... ptypes) const { return (pieces(ptypes, c) | ...); } @@ -348,7 +347,7 @@ template (color); // using the fact that if we can attack PieceType from square, they can attack us back @@ -367,7 +366,7 @@ template __FORCEINLINE void placePiece(Square sq, Color c) { + template inline void placePiece(Square sq, Color c) { if constexpr (pt != NO_PIECE_TYPE) { Bitboard v = 1ULL << sq; current_state.pieces[pt] |= v; @@ -408,7 +407,7 @@ template __FORCEINLINE void removePiece(Square sq, Color c) { + template inline void removePiece(Square sq, Color c) { if constexpr (pt != NO_PIECE_TYPE) { Bitboard v = ~(1ULL << sq); current_state.pieces[pt] &= v; @@ -420,7 +419,7 @@ template __FORCEINLINE Square square(Color c) const { return Square(lsb(pieces(c))); } - __FORCEINLINE Square kingSq(Color c) const { return current_state.kings[c]; } - __FORCEINLINE Bitboard checkers() const { return _checkers; } - __FORCEINLINE Bitboard pin_mask() const { return _pin_mask; } - __FORCEINLINE _Position(std::string fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", + inline Bitboard us(Color c) const { return occ(c); } + inline Color sideToMove() const { return current_state.turn; } + inline uint64_t hash() const { return current_state.hash; } + inline uint64_t key() const { return current_state.hash; } + inline Color side_to_move() const { return current_state.turn; } + inline Square ep_square() const { return current_state.enPassant; } + template inline Square square(Color c) const { return Square(lsb(pieces(c))); } + inline Square kingSq(Color c) const { return current_state.kings[c]; } + inline Bitboard checkers() const { return _checkers; } + inline Bitboard pin_mask() const { return _pin_mask; } + inline _Position(std::string fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", bool chess960 = false) { setFEN(fen, chess960); } - __FORCEINLINE bool isCapture(Move mv) const { + inline bool isCapture(Move mv) const { return mv.type_of() == EN_PASSANT || (mv.type_of() != CASTLING && piece_on(mv.to_sq()) != PieceC::NO_PIECE); } - __FORCEINLINE bool is_capture(Move mv) const { return isCapture(mv); } - __FORCEINLINE bool is_zeroing(Move mv) const { return isCapture(mv) || type_of(at(mv.from_sq())) == PAWN; } + inline bool is_capture(Move mv) const { return isCapture(mv); } + inline bool is_zeroing(Move mv) const { return isCapture(mv) || type_of(at(mv.from_sq())) == PAWN; } std::string fen() const; - __FORCEINLINE uint8_t halfmoveClock() const { return current_state.halfMoveClock; } - __FORCEINLINE uint16_t fullmoveNumber() const { return current_state.fullMoveNumber; } - __FORCEINLINE uint8_t rule50_count() const { return current_state.halfMoveClock; } - __FORCEINLINE CastlingRights castlingRights(Color c) const { + inline uint8_t halfmoveClock() const { return current_state.halfMoveClock; } + inline uint16_t fullmoveNumber() const { return current_state.fullMoveNumber; } + inline uint8_t rule50_count() const { return current_state.halfMoveClock; } + inline CastlingRights castlingRights(Color c) const { return current_state.castlingRights & (c == WHITE ? WHITE_CASTLING : BLACK_CASTLING); } - __FORCEINLINE CastlingRights castlingRights() const { return current_state.castlingRights; } - __FORCEINLINE bool is_castling(Move mv) const { return mv.type_of() == CASTLING; } - __FORCEINLINE const HistoryEntry &state() const { return current_state; } + inline CastlingRights castlingRights() const { return current_state.castlingRights; } + inline bool is_castling(Move mv) const { return mv.type_of() == CASTLING; } + inline const HistoryEntry &state() const { return current_state; } uint64_t zobrist() const; - __FORCEINLINE PieceC piece_at(Square sq) const { return piece_on(sq); } - template __FORCEINLINE PieceC at(Square sq) const { + inline PieceC piece_at(Square sq) const { return piece_on(sq); } + template inline PieceC at(Square sq) const { assert(chess::is_valid(sq)); if constexpr (std::is_same_v) return piece_of(piece_at(sq)); else return piece_at(sq); } - __FORCEINLINE Square enpassantSq() const { return ep_square(); } + inline Square enpassantSq() const { return ep_square(); } CastlingRights clean_castling_rights() const; void setFEN(const std::string &str, bool chess960 = false); - __FORCEINLINE void set_fen(const std::string &str, bool chess960) { setFEN(str, chess960); } + inline void set_fen(const std::string &str, bool chess960) { setFEN(str, chess960); } Move parse_uci(std::string) const; Move push_uci(std::string); Square _valid_ep_square() const; - template __FORCEINLINE int count() const { return popcount(pieces(pt)); } - template __FORCEINLINE int count() const { return popcount(pieces()); } - template __FORCEINLINE int count(Color c) const { return popcount(pieces(c)); } - __FORCEINLINE int count(PieceType pt, Color c) const { return popcount(pieces(pt, c)); } - __FORCEINLINE int ply() const { return 2 * (current_state.fullMoveNumber - 1) + (sideToMove() == BLACK); } + template inline int count() const { return popcount(pieces(pt)); } + template inline int count() const { return popcount(pieces()); } + template inline int count(Color c) const { return popcount(pieces(c)); } + inline int count(PieceType pt, Color c) const { return popcount(pieces(pt, c)); } + inline int ply() const { return 2 * (current_state.fullMoveNumber - 1) + (sideToMove() == BLACK); } bool is_insufficient_material(Color c) const; - __FORCEINLINE bool isInsufficientMaterial(Color c) const { return is_insufficient_material(c); } - __FORCEINLINE bool hasInsufficientMaterial(Color c) const { return is_insufficient_material(c); } - __FORCEINLINE bool has_insufficient_material(Color c) const { return is_insufficient_material(c); } - __FORCEINLINE bool is_insufficient_material() const { + inline bool isInsufficientMaterial(Color c) const { return is_insufficient_material(c); } + inline bool hasInsufficientMaterial(Color c) const { return is_insufficient_material(c); } + inline bool has_insufficient_material(Color c) const { return is_insufficient_material(c); } + inline bool is_insufficient_material() const { return has_insufficient_material(WHITE) && has_insufficient_material(BLACK); } - __FORCEINLINE bool isInsufficientMaterial() const { return is_insufficient_material(); } - __FORCEINLINE bool hasNonPawnMaterial(Color c) const { return bool(us(c) ^ (pieces(PAWN, KING) & us(c))); } - __FORCEINLINE bool inCheck() const { return checkers() != 0; } - __FORCEINLINE bool is_check() const { return checkers() != 0; } - __FORCEINLINE bool has_castling_rights(Color c) const { return castlingRights(c) != 0; } - __FORCEINLINE bool has_kingside_castling_rights(Color c) const { return (castlingRights(c) & KING_SIDE) != 0; } - __FORCEINLINE bool has_queenside_castling_rights(Color c) const { return (castlingRights(c) & QUEEN_SIDE) != 0; } + inline bool isInsufficientMaterial() const { return is_insufficient_material(); } + inline bool hasNonPawnMaterial(Color c) const { return bool(us(c) ^ (pieces(PAWN, KING) & us(c))); } + inline bool inCheck() const { return checkers() != 0; } + inline bool is_check() const { return checkers() != 0; } + inline bool has_castling_rights(Color c) const { return castlingRights(c) != 0; } + inline bool has_kingside_castling_rights(Color c) const { return (castlingRights(c) & KING_SIDE) != 0; } + inline bool has_queenside_castling_rights(Color c) const { return (castlingRights(c) & QUEEN_SIDE) != 0; } // Return true if a position repeats once earlier but strictly // after the root, or repeats twice before or at the root. - __FORCEINLINE bool is_repetition(int ply) const { return current_state.repetition && current_state.repetition < ply; } + inline bool is_repetition(int ply) const { return current_state.repetition && current_state.repetition < ply; } // Test if it's draw of 75 move rule (that forces everyone to draw). Excludes checkmates, of course! - __FORCEINLINE bool is_draw(int ply) const { return rule50_count() > 99 || is_repetition(ply); } + inline bool is_draw(int ply) const { return rule50_count() > 99 || is_repetition(ply); } // Tests whether there has been at least one repetition // of positions since the last capture or pawn move. - __FORCEINLINE bool has_repeated() const { + inline bool has_repeated() const { auto idx = history.size() - 1; int end = std::min(rule50_count(), current_state.pliesFromNull); while (end-- >= 4) { @@ -560,17 +559,17 @@ template = n; } - __FORCEINLINE bool chess960() const { return _chess960; } - __FORCEINLINE bool is_seventyfive_moves(int n) const { return _is_halfmoves(150); } - __FORCEINLINE bool is_fifty_moves(int n) const { return _is_halfmoves(150); } - __FORCEINLINE bool is_fivefold_repetition() const { return is_repetition(5); } - __FORCEINLINE bool is_attacked_by(Color color, Square sq, Bitboard occupied = 0) const { + inline bool _is_halfmoves(int n) const { return rule50_count() >= n; } + inline bool chess960() const { return _chess960; } + inline bool is_seventyfive_moves(int n) const { return _is_halfmoves(150); } + inline bool is_fifty_moves(int n) const { return _is_halfmoves(150); } + inline bool is_fivefold_repetition() const { return is_repetition(5); } + inline bool is_attacked_by(Color color, Square sq, Bitboard occupied = 0) const { Bitboard occ_bb = occupied ? occupied : this->occ(); return attackers_mask(color, sq, occ_bb) != 0; } - __FORCEINLINE bool was_into_check() const { + inline bool was_into_check() const { bool atk = false; Bitboard bb = pieces(~sideToMove()); while (!atk && bb) { @@ -578,7 +577,7 @@ template (color); // using the fact that if we can attack PieceType from square, they can attack us back @@ -590,25 +589,25 @@ template (pop_lsb(path)), occupied); } return b != 0; } - __FORCEINLINE bool is_checkmate() const { + inline bool is_checkmate() const { Movelist moves; legals(moves); return inCheck() && !moves.size(); } - __FORCEINLINE bool is_stalemate() const { + inline bool is_stalemate() const { Movelist moves; legals(moves); return !inCheck() && !moves.size(); } // Material-only key (note: Zobrist=Zpieces^Zep^Zcastling^Zturn, we just XORs the remaining, it's trivial) - __FORCEINLINE Key material_key() const { + inline Key material_key() const { return hash() ^ (zobrist::RandomTurn * ~sideToMove()) ^ (zobrist::RandomCastle[castlingRights()]) ^ (zobrist::RandomEP[ep_square() == SQ_NONE ? file_of(ep_square()) : FILE_NB]); } @@ -622,13 +621,16 @@ template * @return */ - [[nodiscard]] __FORCEINLINE bool isHalfMoveDraw() const noexcept { return halfmoveClock() >= 100; } - [[nodiscard]] __FORCEINLINE Bitboard getCastlingPath(Color c, bool isKingSide) const { + [[nodiscard]] inline bool isHalfMoveDraw() const noexcept { return halfmoveClock() >= 100; } + [[nodiscard]] inline Bitboard getCastlingPath(Color c, bool isKingSide) const { return current_state.castlingMetadata[c].castling_paths[isKingSide]; } + [[nodiscard]] inline auto getCastlingMetadata(Color c) const { + return current_state.castlingMetadata[c]; + } private: - template [[nodiscard]] __FORCEINLINE Bitboard pinMask(Color c, Square sq) const { + template [[nodiscard]] inline Bitboard pinMask(Color c, Square sq) const { static_assert(pt == BISHOP || pt == ROOK, "Only bishop or rook allowed!"); Bitboard occ_opp = occ(~sideToMove()); Bitboard occ_us = occ(sideToMove()); @@ -651,7 +653,7 @@ template ::value>> -[[nodiscard]] __FORCEINLINE Bitboard attackers(const _Position &board, Color color, Square square) noexcept { +[[nodiscard]] inline Bitboard attackers(const _Position &board, Color color, Square square) noexcept { return board.attackers(color, square); } } // namespace attacks diff --git a/printers.h b/printers.h index 6563af0..93034e5 100644 --- a/printers.h +++ b/printers.h @@ -4,6 +4,7 @@ #include #include namespace chess { +// disclaimer: please don't pass Chess960 moves std::ostream &operator<<(std::ostream &os, const Move mv); std::ostream &operator<<(std::ostream &os, const Color c); std::ostream &operator<<(std::ostream &os, const CastlingRights cr); diff --git a/tests.cpp b/tests.cpp index dbfe351..12f310e 100644 --- a/tests.cpp +++ b/tests.cpp @@ -1,12 +1,11 @@ #define DOCTEST_CONFIG_IMPLEMENT -#ifndef __EXCEPTIONS #define DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS -#endif #include "moves_io.h" #include "position.h" #include "printers.h" #include #include +#include using namespace chess; // --------- Color assertions ---------- static_assert(color_of(PolyglotPiece::BPAWN) == BLACK, "BPAWN should be BLACK"); @@ -209,22 +208,22 @@ template uint64_t perft(_Po return total; } } -template +template void check_perfts(const std::vector> &entries) { uint64_t nodes = 0; double elapsed = 0; using namespace std::chrono; for (auto &entry : entries) { - std::cerr << entry.input << ' ' << entry.info.depth; + std::cerr << entry.input << " (chess960="< 5e7) { - std::cerr << "(skipped)"; + if (entry.info.nodes > 2e7) { + std::cerr << "(skipped)\n"; continue; } #endif std::cerr << '\n'; { - _Position pos(entry.input); + _Position pos(entry.input, chess960); auto start_time = high_resolution_clock::now(); REQUIRE(perft(pos, entry.info.depth) == entry.info.nodes); auto end_time = high_resolution_clock::now(); @@ -232,7 +231,7 @@ void check_perfts(const std::vector> &entries) { nodes += entry.info.nodes; } { - _Position pos(entry.input); + _Position pos(entry.input, chess960); auto start_time = high_resolution_clock::now(); REQUIRE(perft(pos, entry.info.depth) == entry.info.nodes); auto end_time = high_resolution_clock::now(); @@ -240,7 +239,7 @@ void check_perfts(const std::vector> &entries) { nodes += entry.info.nodes; } { - _Position pos(entry.input); + _Position pos(entry.input, chess960); auto start_time = high_resolution_clock::now(); REQUIRE(perft(pos, entry.info.depth) == entry.info.nodes); auto end_time = high_resolution_clock::now(); @@ -1305,7 +1304,7 @@ TEST_CASE("Captures only?") { { "rn1qkbnr/ppp1pppp/3p4/6B1/6b1/3P4/PPP1PPPP/RN1QKBNR w KQkq - 2 3", 30, 360 }, { "2b5/2p5/8/8/5B1k/q7/2K5/8 w - - 0 1", 1, 1 } }; - check_perfts(tests); + check_perfts(tests); } TEST_CASE("Chess960") { std::vector> tests = { @@ -7070,7 +7069,7 @@ TEST_CASE("Chess960") { { "bbq1nr1r/pppppk1p/2n2p2/6p1/P4P2/4P1P1/1PPP3P/BBQNNRKR w HF - 1 9", 5, 10316716 }, { "bbq1nr1r/pppppk1p/2n2p2/6p1/P4P2/4P1P1/1PPP3P/BBQNNRKR w HF - 1 9", 6, 280056112 }, }; - check_perfts(tests); + check_perfts(tests); } int main(int argc, char **argv) { doctest::Context ctx; diff --git a/types.h b/types.h index 78464a1..e5e2ee1 100644 --- a/types.h +++ b/types.h @@ -37,13 +37,6 @@ } while (0) #endif -#ifdef _MSC_VER -#define __FORCEINLINE inline __forceinline -#elif defined(__GNUC__) || defined(__clang__) -#define __FORCEINLINE inline __attribute__((always_inline)) -#else -#define __FORCEINLINE inline -#endif constexpr bool is_constant_evaluated() { #if __cpp_if_consteval >= 202106L if consteval { From b3abc1472e9879febe0ac40d9078cf872495ba39 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Tue, 24 Feb 2026 04:32:38 +0000 Subject: [PATCH 6/7] Normalize line endings and apply clang-format --- movegen.cpp | 32 +++++++++++++++++++++----------- movegen.h | 2 +- moves_io.cpp | 13 +++++++------ moves_io.h | 2 +- position.cpp | 23 ++++++++++------------- position.h | 7 ++----- tests.cpp | 4 ++-- 7 files changed, 44 insertions(+), 39 deletions(-) diff --git a/movegen.cpp b/movegen.cpp index cf5aee6..666d6b1 100644 --- a/movegen.cpp +++ b/movegen.cpp @@ -229,7 +229,8 @@ void movegen::genKnightMoves(const _Position &pos, Movelist &list, Bitb list.size_ += popcount(moves); } } -template void movegen::genKingMoves(const _Position &pos, Movelist &out, Bitboard _pin_mask) { +template +void movegen::genKingMoves(const _Position &pos, Movelist &out, Bitboard _pin_mask) { constexpr Color them = ~c; const Square kingSq = pos.kingSq(c); const Bitboard occAll = pos.occ(); @@ -269,19 +270,20 @@ template void movegen::genKingMoves(con Bitboard occupancy = pos.occ(); Bitboard enemy_attacks = enemyAttacks; - constexpr CastlingRights kingRights=KING_SIDE & (c==WHITE?WHITE_CASTLING:BLACK_CASTLING), - queenRights=QUEEN_SIDE & (c==WHITE?WHITE_CASTLING:BLACK_CASTLING); + constexpr CastlingRights kingRights = KING_SIDE & (c == WHITE ? WHITE_CASTLING : BLACK_CASTLING), + queenRights = QUEEN_SIDE & (c == WHITE ? WHITE_CASTLING : BLACK_CASTLING); Bitboard OO_EMPTY = pos.getCastlingPath(c, true); Bitboard OO_SAFE = between(kingSq, castling_king_square(c, true)); Bitboard OOO_EMPTY = pos.getCastlingPath(c, false); Bitboard OOO_SAFE = between(kingSq, castling_king_square(c, false)); - Square rookKing=pos.getCastlingMetadata(c).rook_start_ks, - rookQueen=pos.getCastlingMetadata(c).rook_start_qs; + Square rookKing = pos.getCastlingMetadata(c).rook_start_ks, rookQueen = pos.getCastlingMetadata(c).rook_start_qs; - if ((pos.castlingRights() & kingRights) && !((occupancy & OO_EMPTY)||(enemy_attacks & OO_SAFE) || (_pin_mask & (1ULL<(kingSq, rookKing)); } - if ((pos.castlingRights() & queenRights) && !((occupancy & OOO_EMPTY) || (enemy_attacks & OOO_SAFE) || (_pin_mask & (1ULL<(kingSq, rookQueen)); } } @@ -440,10 +442,18 @@ template Move *chess::_chess::splat_pawn_moves(Move *, Bitboard); Movelist &, \ Bitboard, \ Bitboard); \ - template void chess::movegen::genKingMoves(const _Position &, Movelist &,Bitboard); \ - template void chess::movegen::genKingMoves(const _Position &, Movelist &,Bitboard); \ - template void chess::movegen::genKingMoves(const _Position &, Movelist &,Bitboard); \ - template void chess::movegen::genKingMoves(const _Position &, Movelist &,Bitboard); + template void chess::movegen::genKingMoves(const _Position &, \ + Movelist &, \ + Bitboard); \ + template void chess::movegen::genKingMoves(const _Position &, \ + Movelist &, \ + Bitboard); \ + template void chess::movegen::genKingMoves(const _Position &, \ + Movelist &, \ + Bitboard); \ + template void chess::movegen::genKingMoves(const _Position &, \ + Movelist &, \ + Bitboard); INSTANTIATE(EnginePiece) INSTANTIATE(PolyglotPiece) INSTANTIATE(ContiguousMappingPiece) diff --git a/movegen.h b/movegen.h index c85a347..6e4eb2b 100644 --- a/movegen.h +++ b/movegen.h @@ -13,7 +13,7 @@ template void genPawnSingleMoves(const _Position &, Movelist &, Bitboard, Bitboard, Bitboard); template void genKnightMoves(const _Position &, Movelist &, Bitboard, Bitboard); -template void genKingMoves(const _Position &, Movelist &,Bitboard); +template void genKingMoves(const _Position &, Movelist &, Bitboard); template void genSlidingMoves(const _Position &, Movelist &, Bitboard, Bitboard, Bitboard); extern std::array, 65> SQUARES_BETWEEN_BB; diff --git a/moves_io.cpp b/moves_io.cpp index 5b9fdca..6a5cf7f 100644 --- a/moves_io.cpp +++ b/moves_io.cpp @@ -21,7 +21,7 @@ std::string squareToString(Square sq) { }; return std::string{ fileChars[sq] }; } -std::string moveToUci(Move mv,bool chess960) { +std::string moveToUci(Move mv, bool chess960) { if (!mv.is_ok()) { // null move static const std::string nullMove = "0000"; @@ -49,13 +49,14 @@ std::string moveToUci(Move mv,bool chess960) { move += "c8"; // black queenside castling break; default: - if (chess960) move += squareToString(mv.to_sq()); - else{ + if (chess960) + move += squareToString(mv.to_sq()); + else { #if defined(_DEBUG) || !defined(NDEBUG) - assert(false && "this isn't chess960"); + assert(false && "this isn't chess960"); #else - THROW_IF_EXCEPTIONS_ON(IllegalMoveException("this isn't chess960")); - break; + THROW_IF_EXCEPTIONS_ON(IllegalMoveException("this isn't chess960")); + break; #endif } } diff --git a/moves_io.h b/moves_io.h index e967223..e0b2435 100644 --- a/moves_io.h +++ b/moves_io.h @@ -8,7 +8,7 @@ class Move; enum Square : int8_t; template class _Position; namespace uci { -std::string moveToUci(Move move,bool chess960=false); +std::string moveToUci(Move move, bool chess960 = false); std::string squareToString(Square sq); class IllegalMoveException : public std::exception { diff --git a/position.cpp b/position.cpp index 4b12db4..eccf198 100644 --- a/position.cpp +++ b/position.cpp @@ -48,8 +48,8 @@ template template void _Position template void _Position(from_sq, us); removePiece(rook_start, us); @@ -110,7 +109,6 @@ template template void _Position(rook_dest, us); break; } - } } { @@ -359,7 +357,7 @@ template void _Position::setFEN(const s for (Color c : { WHITE, BLACK }) { // king - if (castlingRights() & (c & KING_SIDE)){ + if (castlingRights() & (c & KING_SIDE)) { const auto king_from = current_state.castlingMetadata[c].king_start; const auto rook_from = make_sq(file_of(current_state.castlingMetadata[c].rook_start_ks), rank_of(king_from)); const auto king_to = castling_king_square(c, true); @@ -369,7 +367,7 @@ template void _Position::setFEN(const s ~((1ULL << king_from) | (1ULL << rook_from)); } // queen - if (castlingRights() & (c & QUEEN_SIDE)){ + if (castlingRights() & (c & QUEEN_SIDE)) { const auto king_from = current_state.castlingMetadata[c].king_start; const auto rook_from = make_sq(file_of(current_state.castlingMetadata[c].rook_start_qs), rank_of(king_from)); const auto king_to = castling_king_square(c, false); @@ -463,7 +461,6 @@ template std::string _Position::fen() c } ss << (castlingStr.empty() ? "-" : castlingStr); - // 4) En passant target square or '-' ss << ' '; Square ep = ep_square(); diff --git a/position.h b/position.h index 12d12d4..841d8a2 100644 --- a/position.h +++ b/position.h @@ -487,8 +487,7 @@ template [[nodiscard]] inline Bitboard pinMask(Color c, Square sq) const { diff --git a/tests.cpp b/tests.cpp index 12f310e..906b7c3 100644 --- a/tests.cpp +++ b/tests.cpp @@ -208,13 +208,13 @@ template uint64_t perft(_Po return total; } } -template +template void check_perfts(const std::vector> &entries) { uint64_t nodes = 0; double elapsed = 0; using namespace std::chrono; for (auto &entry : entries) { - std::cerr << entry.input << " (chess960="< 2e7) { std::cerr << "(skipped)\n"; From 4c720e68dd292ae336750f1a8301a5fe2c1924fe Mon Sep 17 00:00:00 2001 From: winapiadmin Date: Tue, 24 Feb 2026 11:37:14 +0700 Subject: [PATCH 7/7] fix format --- .github/workflows/clang-format.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml index 6899404..82b3350 100644 --- a/.github/workflows/clang-format.yml +++ b/.github/workflows/clang-format.yml @@ -3,10 +3,10 @@ name: clang-format on: pull_request: branches: [ "main" ] - push: jobs: format: + if: github.actor != 'github-actions[bot]' runs-on: ubuntu-latest permissions: contents: write @@ -16,9 +16,8 @@ jobs: with: token: ${{ secrets.GITHUB_TOKEN }} - - name: Normalize line endings - run: | - git add --renormalize . + - name: Install clang-format + run: sudo apt-get update && sudo apt-get install -y clang-format - name: Run clang-format run: | @@ -29,6 +28,6 @@ jobs: if ! git diff --quiet; then git config user.email "actions@github.com" git config user.name "GitHub Actions" - git commit -am "Normalize line endings and apply clang-format" + git commit -am "Apply clang-format" git push - fi + fi \ No newline at end of file