Subversion Repositories Games.Chess Giants

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.     Texel - A UCI chess engine.
  3.     Copyright (C) 2012-2014  Peter Ă–sterlund, peterosterlund2@gmail.com
  4.  
  5.     This program is free software: you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by
  7.     the Free Software Foundation, either version 3 of the License, or
  8.     (at your option) any later version.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  17. */
  18.  
  19. /*
  20.  * position.cpp
  21.  *
  22.  *  Created on: Feb 25, 2012
  23.  *      Author: petero
  24.  */
  25.  
  26. #include "position.hpp"
  27. #include "evaluate.hpp"
  28. #include "textio.hpp"
  29.  
  30. #include <iostream>
  31. #include <cassert>
  32.  
  33. U64 Position::psHashKeys[Piece::nPieceTypes][64];
  34. U64 Position::whiteHashKey;
  35. U64 Position::castleHashKeys[16];
  36. U64 Position::epHashKeys[9];
  37. U64 Position::moveCntKeys[101];
  38.  
  39.  
  40. static StaticInitializer<Position> posInit;
  41.  
  42. void
  43. Position::staticInitialize() {
  44.     int rndNo = 0;
  45.     for (int p = 0; p < Piece::nPieceTypes; p++)
  46.         for (int sq = 0; sq < 64; sq++)
  47.             psHashKeys[p][sq] = getRandomHashVal(rndNo++);
  48.     whiteHashKey = getRandomHashVal(rndNo++);
  49.     for (size_t cm = 0; cm < COUNT_OF(castleHashKeys); cm++)
  50.         castleHashKeys[cm] = getRandomHashVal(rndNo++);
  51.     for (size_t f = 0; f < COUNT_OF(epHashKeys); f++)
  52.         epHashKeys[f] = getRandomHashVal(rndNo++);
  53.     for (size_t mc = 0; mc < COUNT_OF(moveCntKeys); mc++)
  54.         moveCntKeys[mc] = getRandomHashVal(rndNo++);
  55. }
  56.  
  57.  
  58. Position::Position() {
  59.     for (int i = 0; i < 64; i++)
  60.         squares[i] = Piece::EMPTY;
  61.     for (int i = 0; i < Piece::nPieceTypes; i++) {
  62.         psScore1_[i] = 0;
  63.         psScore2_[i] = 0;
  64.         pieceTypeBB_[i] = 0;
  65.     }
  66.     whiteBB_ = blackBB_ = 0;
  67.     whiteMove = true;
  68.     castleMask = 0;
  69.     epSquare = -1;
  70.     halfMoveClock = 0;
  71.     fullMoveCounter = 1;
  72.     computeZobristHash();
  73.     wKingSq_ = bKingSq_ = -1;
  74.     wMtrl_ = bMtrl_ = -::kV;
  75.     wMtrlPawns_ = bMtrlPawns_ = 0;
  76. }
  77.  
  78. void
  79. Position::setPiece(int square, int piece) {
  80.     int removedPiece = squares[square];
  81.     squares[square] = piece;
  82.  
  83.     // Update hash key
  84.     hashKey ^= psHashKeys[removedPiece][square];
  85.     hashKey ^= psHashKeys[piece][square];
  86.  
  87.     // Update material identifier
  88.     matId.removePiece(removedPiece);
  89.     matId.addPiece(piece);
  90.  
  91.     // Update bitboards
  92.     const U64 sqMask = 1ULL << square;
  93.     pieceTypeBB_[removedPiece] &= ~sqMask;
  94.     pieceTypeBB_[piece] |= sqMask;
  95.  
  96.     if (removedPiece != Piece::EMPTY) {
  97.         int pVal = ::pieceValue[removedPiece];
  98.         if (Piece::isWhite(removedPiece)) {
  99.             wMtrl_ -= pVal;
  100.             whiteBB_ &= ~sqMask;
  101.             if (removedPiece == Piece::WPAWN) {
  102.                 wMtrlPawns_ -= pVal;
  103.                 pHashKey ^= psHashKeys[Piece::WPAWN][square];
  104.             }
  105.         } else {
  106.             bMtrl_ -= pVal;
  107.             blackBB_ &= ~sqMask;
  108.             if (removedPiece == Piece::BPAWN) {
  109.                 bMtrlPawns_ -= pVal;
  110.                 pHashKey ^= psHashKeys[Piece::BPAWN][square];
  111.             }
  112.         }
  113.     }
  114.  
  115.     if (piece != Piece::EMPTY) {
  116.         int pVal = ::pieceValue[piece];
  117.         if (Piece::isWhite(piece)) {
  118.             wMtrl_ += pVal;
  119.             whiteBB_ |= sqMask;
  120.             if (piece == Piece::WPAWN) {
  121.                 wMtrlPawns_ += pVal;
  122.                 pHashKey ^= psHashKeys[Piece::WPAWN][square];
  123.             }
  124.             if (piece == Piece::WKING)
  125.                 wKingSq_ = square;
  126.         } else {
  127.             bMtrl_ += pVal;
  128.             blackBB_ |= sqMask;
  129.             if (piece == Piece::BPAWN) {
  130.                 bMtrlPawns_ += pVal;
  131.                 pHashKey ^= psHashKeys[Piece::BPAWN][square];
  132.             }
  133.             if (piece == Piece::BKING)
  134.                 bKingSq_ = square;
  135.         }
  136.     }
  137.  
  138.     // Update piece/square table scores
  139.     psScore1_[removedPiece] -= Evaluate::psTab1[removedPiece][square];
  140.     psScore2_[removedPiece] -= Evaluate::psTab2[removedPiece][square];
  141.     psScore1_[piece]        += Evaluate::psTab1[piece][square];
  142.     psScore2_[piece]        += Evaluate::psTab2[piece][square];
  143. }
  144.  
  145. U64
  146. Position::hashAfterMove(const Move& move) const {
  147.     int from = move.from();
  148.     int to = move.to();
  149.     int p = squares[from];
  150.     int capP = squares[to];
  151.  
  152.     U64 ret = hashKey ^ whiteHashKey;
  153.     ret ^= psHashKeys[capP][to];
  154.     ret ^= psHashKeys[p][to];
  155.     ret ^= psHashKeys[p][from];
  156.     ret ^= psHashKeys[Piece::EMPTY][from];
  157.  
  158.     return ret;
  159. }
  160.  
  161. void
  162. Position::makeMove(const Move& move, UndoInfo& ui) {
  163.     ui.capturedPiece = squares[move.to()];
  164.     ui.castleMask = castleMask;
  165.     ui.epSquare = epSquare;
  166.     ui.halfMoveClock = halfMoveClock;
  167.     bool wtm = whiteMove;
  168.  
  169.     hashKey ^= whiteHashKey;
  170.  
  171.     const int p = squares[move.from()];
  172.     int capP = squares[move.to()];
  173.     U64 fromMask = 1ULL << move.from();
  174.  
  175.     int prevEpSquare = epSquare;
  176.     setEpSquare(-1);
  177.  
  178.     if ((capP != Piece::EMPTY) || ((pieceTypeBB(Piece::WPAWN, Piece::BPAWN) & fromMask) != 0)) {
  179.         halfMoveClock = 0;
  180.  
  181.         // Handle en passant and epSquare
  182.         if (p == Piece::WPAWN) {
  183.             if (move.to() - move.from() == 2 * 8) {
  184.                 int x = getX(move.to());
  185.                 if (BitBoard::epMaskW[x] & pieceTypeBB(Piece::BPAWN))
  186.                     setEpSquare(move.from() + 8);
  187.             } else if (move.to() == prevEpSquare) {
  188.                 setPiece(move.to() - 8, Piece::EMPTY);
  189.             }
  190.         } else if (p == Piece::BPAWN) {
  191.             if (move.to() - move.from() == -2 * 8) {
  192.                 int x = getX(move.to());
  193.                 if (BitBoard::epMaskB[x] & pieceTypeBB(Piece::WPAWN))
  194.                     setEpSquare(move.from() - 8);
  195.             } else if (move.to() == prevEpSquare) {
  196.                 setPiece(move.to() + 8, Piece::EMPTY);
  197.             }
  198.         }
  199.  
  200.         if ((pieceTypeBB(Piece::WKING, Piece::BKING) & fromMask) != 0) {
  201.             if (wtm) {
  202.                 setCastleMask(castleMask & ~(1 << A1_CASTLE));
  203.                 setCastleMask(castleMask & ~(1 << H1_CASTLE));
  204.             } else {
  205.                 setCastleMask(castleMask & ~(1 << A8_CASTLE));
  206.                 setCastleMask(castleMask & ~(1 << H8_CASTLE));
  207.             }
  208.         }
  209.  
  210.         // Perform move
  211.         setPiece(move.from(), Piece::EMPTY);
  212.         // Handle promotion
  213.         if (move.promoteTo() != Piece::EMPTY) {
  214.             setPiece(move.to(), move.promoteTo());
  215.         } else {
  216.             setPiece(move.to(), p);
  217.         }
  218.     } else {
  219.         halfMoveClock++;
  220.  
  221.         // Handle castling
  222.         if ((pieceTypeBB(Piece::WKING, Piece::BKING) & fromMask) != 0) {
  223.             int k0 = move.from();
  224.             if (move.to() == k0 + 2) { // O-O
  225.                 movePieceNotPawn(k0 + 3, k0 + 1);
  226.             } else if (move.to() == k0 - 2) { // O-O-O
  227.                 movePieceNotPawn(k0 - 4, k0 - 1);
  228.             }
  229.             if (wtm) {
  230.                 setCastleMask(castleMask & ~(1 << A1_CASTLE));
  231.                 setCastleMask(castleMask & ~(1 << H1_CASTLE));
  232.             } else {
  233.                 setCastleMask(castleMask & ~(1 << A8_CASTLE));
  234.                 setCastleMask(castleMask & ~(1 << H8_CASTLE));
  235.             }
  236.         }
  237.  
  238.         // Perform move
  239.         movePieceNotPawn(move.from(), move.to());
  240.     }
  241.     if (wtm) {
  242.         // Update castling rights when rook moves
  243.         if ((BitBoard::maskCorners & fromMask) != 0) {
  244.             if (p == Piece::WROOK)
  245.                 removeCastleRights(move.from());
  246.         }
  247.         if ((BitBoard::maskCorners & (1ULL << move.to())) != 0) {
  248.             if (capP == Piece::BROOK)
  249.                 removeCastleRights(move.to());
  250.         }
  251.     } else {
  252.         fullMoveCounter++;
  253.         // Update castling rights when rook moves
  254.         if ((BitBoard::maskCorners & fromMask) != 0) {
  255.             if (p == Piece::BROOK)
  256.                 removeCastleRights(move.from());
  257.         }
  258.         if ((BitBoard::maskCorners & (1ULL << move.to())) != 0) {
  259.             if (capP == Piece::WROOK)
  260.                 removeCastleRights(move.to());
  261.         }
  262.     }
  263.  
  264.     whiteMove = !wtm;
  265. }
  266.  
  267. void
  268. Position::makeMoveB(const Move& move, UndoInfo& ui) {
  269.     ui.capturedPiece = squares[move.to()];
  270.     ui.castleMask = castleMask;
  271.  
  272.     const int p = squares[move.from()];
  273.     int capP = squares[move.to()];
  274.     U64 fromMask = 1ULL << move.from();
  275.  
  276.     int prevEpSquare = epSquare;
  277.  
  278.     if ((capP != Piece::EMPTY) || ((pieceTypeBB(Piece::WPAWN, Piece::BPAWN) & fromMask) != 0)) {
  279.         // Handle en passant
  280.         if (p == Piece::WPAWN) {
  281.             if (move.to() == prevEpSquare)
  282.                 setPieceB(move.to() - 8, Piece::EMPTY);
  283.         } else if (p == Piece::BPAWN) {
  284.             if (move.to() == prevEpSquare)
  285.                 setPieceB(move.to() + 8, Piece::EMPTY);
  286.         }
  287.  
  288.         // Perform move
  289.         setPieceB(move.from(), Piece::EMPTY);
  290.         // Handle promotion
  291.         if (move.promoteTo() != Piece::EMPTY) {
  292.             setPieceB(move.to(), move.promoteTo());
  293.         } else {
  294.             setPieceB(move.to(), p);
  295.         }
  296.     } else {
  297.         // Handle castling
  298.         if ((pieceTypeBB(Piece::WKING, Piece::BKING) & fromMask) != 0) {
  299.             int k0 = move.from();
  300.             if (move.to() == k0 + 2) { // O-O
  301.                 movePieceNotPawnB(k0 + 3, k0 + 1);
  302.             } else if (move.to() == k0 - 2) { // O-O-O
  303.                 movePieceNotPawnB(k0 - 4, k0 - 1);
  304.             }
  305.         }
  306.  
  307.         // Perform move
  308.         movePieceNotPawnB(move.from(), move.to());
  309.     }
  310. }
  311.  
  312. void
  313. Position::movePieceNotPawn(int from, int to) {
  314.     const int piece = squares[from];
  315.     hashKey ^= psHashKeys[piece][from];
  316.     hashKey ^= psHashKeys[piece][to];
  317.     hashKey ^= psHashKeys[Piece::EMPTY][from];
  318.     hashKey ^= psHashKeys[Piece::EMPTY][to];
  319.  
  320.     squares[from] = Piece::EMPTY;
  321.     squares[to] = piece;
  322.  
  323.     const U64 sqMaskF = 1ULL << from;
  324.     const U64 sqMaskT = 1ULL << to;
  325.     pieceTypeBB_[piece] &= ~sqMaskF;
  326.     pieceTypeBB_[piece] |= sqMaskT;
  327.     if (Piece::isWhite(piece)) {
  328.         whiteBB_ &= ~sqMaskF;
  329.         whiteBB_ |= sqMaskT;
  330.         if (piece == Piece::WKING)
  331.             wKingSq_ = to;
  332.     } else {
  333.         blackBB_ &= ~sqMaskF;
  334.         blackBB_ |= sqMaskT;
  335.         if (piece == Piece::BKING)
  336.             bKingSq_ = to;
  337.     }
  338.  
  339.     psScore1_[piece] += Evaluate::psTab1[piece][to] - Evaluate::psTab1[piece][from];
  340.     psScore2_[piece] += Evaluate::psTab2[piece][to] - Evaluate::psTab2[piece][from];
  341. }
  342.  
  343. // ----------------------------------------------------------------------------
  344.  
  345. void
  346. Position::serialize(SerializeData& data) const {
  347.     for (int i = 0; i < 4; i++) {
  348.         int sq0 = i * 16;
  349.         U64 v = 0;
  350.         for (int sq = 0; sq < 16; sq++)
  351.             v = (v << 4) | squares[sq0 + sq];
  352.         data.v[i] = v;
  353.     }
  354.     U64 flags = whiteMove;
  355.     flags = (flags << 4) | castleMask;
  356.     flags = (flags << 8) | (epSquare & 0xff);
  357.     flags = (flags << 8) | (halfMoveClock & 0xff);
  358.     flags = (flags << 16) | (fullMoveCounter & 0xffff);
  359.     data.v[4] = flags;
  360. }
  361.  
  362. void
  363. Position::deSerialize(const SerializeData& data) {
  364.     for (int i = 0; i < Piece::nPieceTypes; i++) {
  365.         psScore1_[i] = 0;
  366.         psScore2_[i] = 0;
  367.         pieceTypeBB_[i] = 0;
  368.     }
  369.     whiteBB_ = blackBB_ = 0;
  370.     wMtrl_ = bMtrl_ = -::kV;
  371.     wMtrlPawns_ = bMtrlPawns_ = 0;
  372.     for (int i = 0; i < 4; i++) {
  373.         int sq0 = i * 16;
  374.         U64 v = data.v[i];
  375.         for (int sq = 15; sq >= 0; sq--) {
  376.             int piece = v & 0xf;
  377.             v >>= 4;
  378.             int square = sq0 + sq;
  379.             squares[square] = piece;
  380.  
  381.             const U64 sqMask = 1ULL << square;
  382.             pieceTypeBB_[piece] |= sqMask;
  383.             if (piece != Piece::EMPTY) {
  384.                 int pVal = ::pieceValue[piece];
  385.                 if (Piece::isWhite(piece)) {
  386.                     wMtrl_ += pVal;
  387.                     whiteBB_ |= sqMask;
  388.                     if (piece == Piece::WPAWN)
  389.                         wMtrlPawns_ += pVal;
  390.                     if (piece == Piece::WKING)
  391.                         wKingSq_ = square;
  392.                 } else {
  393.                     bMtrl_ += pVal;
  394.                     blackBB_ |= sqMask;
  395.                     if (piece == Piece::BPAWN)
  396.                         bMtrlPawns_ += pVal;
  397.                     if (piece == Piece::BKING)
  398.                         bKingSq_ = square;
  399.                 }
  400.             }
  401.             psScore1_[piece] += Evaluate::psTab1[piece][square];
  402.             psScore2_[piece] += Evaluate::psTab2[piece][square];
  403.         }
  404.     }
  405.  
  406.     U64 flags = data.v[4];
  407.     fullMoveCounter = flags & 0xffff;
  408.     flags >>= 16;
  409.     halfMoveClock = flags & 0xff;
  410.     flags >>= 8;
  411.     int ep = flags & 0xff; if (ep == 0xff) ep = -1;
  412.     epSquare = ep;
  413.     flags >>= 8;
  414.     castleMask = flags & 0xf;
  415.     flags >>= 4;
  416.     whiteMove = (flags & 1) != 0;
  417.  
  418.     computeZobristHash();
  419. }
  420.  
  421. // ----------------------------------------------------------------------------
  422.  
  423. std::ostream&
  424. operator<<(std::ostream& os, const Position& pos) {
  425.     std::stringstream ss;
  426.     ss << std::hex << pos.zobristHash();
  427.     os << TextIO::asciiBoard(pos) << (pos.isWhiteMove() ? "white\n" : "black\n") << ss.str();
  428.     return os;
  429. }
  430.  
  431. U64
  432. Position::computeZobristHash() {
  433.     U64 hash = 0;
  434.     pHashKey = 0;
  435.     matId = {};
  436.     for (int sq = 0; sq < 64; sq++) {
  437.         int p = squares[sq];
  438.         matId.addPiece(p);
  439.         hash ^= psHashKeys[p][sq];
  440.         if ((p == Piece::WPAWN) || (p == Piece::BPAWN))
  441.             pHashKey ^= psHashKeys[p][sq];
  442.     }
  443.     if (whiteMove)
  444.         hash ^= whiteHashKey;
  445.     hash ^= castleHashKeys[castleMask];
  446.     hash ^= epHashKeys[(epSquare >= 0) ? getX(epSquare) + 1 : 0];
  447.     hashKey = hash;
  448.     return hash;
  449. }
  450.  
  451. const U64
  452. Position::zobristRndKeys[] = {
  453.     0xd7f5bae778359690ULL, 0x597a80e80456583cULL, 0xf41fc6250b89af0aULL, 0x60bbccb1c393eb8eULL,
  454.     0x609a7b63b265bad6ULL, 0x7c2203b2d50e50ddULL, 0x5cdb65b020e76780ULL, 0x3ada5f98c76f082fULL,
  455.     0xb8664a3b4835aba4ULL, 0xfd52e04af3634f9dULL, 0x19845bb0dc72bfebULL, 0x323f11923ad0ce94ULL,
  456.     0x840b643592625af3ULL, 0x08d0487ddf83e6b1ULL, 0xe102c4c56f3cbcf1ULL, 0x8796d332562f05aeULL,
  457.     0x8da8c0e4914f9754ULL, 0x8d33ff34f6348b49ULL, 0x9d19aea59af28996ULL, 0x9eb6168a4359a5feULL,
  458.     0x31663b93847b0fc7ULL, 0x90eba80ddb28d49aULL, 0xccee52c57542c041ULL, 0x0860882a3e8279cfULL,
  459.     0xde316bf1225afa4aULL, 0xc7b1c13ea1ba90c6ULL, 0x86dee889c37e993aULL, 0x84a546382686f7f9ULL,
  460.     0xf5279c7d250960a6ULL, 0x74c682f9a715318dULL, 0xe7df0efd43f4030aULL, 0xdc6746e82902823cULL,
  461.     0x166d42c650423d16ULL, 0xf0ec64304812b32dULL, 0x1332e60d6eec5b48ULL, 0xa6edf8bd55663265ULL,
  462.     0x9be3edd5fba6cfd3ULL, 0xea3c98aad8c558f1ULL, 0x577d05d0fcff765dULL, 0xf4dffef665484f9aULL,
  463.     0x80522262e9120108ULL, 0x47e9fa92bc64f2eeULL, 0x689ed873d813ba14ULL, 0xdbe14e4bad57221aULL,
  464.     0x27dde4dac822503bULL, 0xeb54f328a3ec06bbULL, 0x385875cea7e74a41ULL, 0x9939e2b74efb03ecULL,
  465.     0xe9dab3b1f89ac50eULL, 0x542e57cd136b4844ULL, 0xfd0d99e83d6b34b8ULL, 0x2ab51be0b039bdd7ULL,
  466.     0xa848485bf044dac6ULL, 0xfb8b9ccc055dda28ULL, 0x6bd5fcf11932c643ULL, 0x5562cc1783eafc90ULL,
  467.     0x84c2258075a4fc77ULL, 0xa3e2654a1b9ac399ULL, 0xa0d0b4498debbc94ULL, 0x7b5a612c9e7f4013ULL,
  468.     0x541ad1f5345860e9ULL, 0xe994fc3ad27d8421ULL, 0x7d004d11c8d81c45ULL, 0xdf060a0b1ba0a5d0ULL,
  469.     0xd7554261378a32ebULL, 0x3833239c3fe92c7dULL, 0xdf6f7a5e977113d5ULL, 0xe04fc2e2017aa5cdULL,
  470.     0x7670776c650e1507ULL, 0x2b7cbce40c6231ddULL, 0xda383fc3dd431843ULL, 0xe5b36397cf1ec05dULL,
  471.     0xdc984f60c622c2a9ULL, 0x51ef8d0af8fe2607ULL, 0x1511f2e39e554dffULL, 0x5f2c921d80f3be07ULL,
  472.     0x2015c1d1cc6b9e92ULL, 0x99f7e5a26196f13bULL, 0x7a93cc38310fb397ULL, 0xd11d2eba53c47047ULL,
  473.     0x070f46cdfa04dd80ULL, 0x0ebb465f6fea9c74ULL, 0xfb61452fb27308d9ULL, 0xa952f5d52c3eb97dULL,
  474.     0x95799379a4a515abULL, 0x06508b45a2745539ULL, 0xaf69d20bf29de152ULL, 0xb0ad19b1f4ee4eb8ULL,
  475.     0x2bd91aa7c8200e4dULL, 0xcecee5089679a9c2ULL, 0xc189667953231141ULL, 0x24f90ceadfd2ece5ULL,
  476.     0x3518487a931724d2ULL, 0x5244fe5f9e40057cULL, 0x366ce132f59078ffULL, 0xe63f79535cf61cdeULL,
  477.     0xefdfab636b84b733ULL, 0xe38c18fdb5bf9f22ULL, 0xa4064c6acad42a58ULL, 0xcce22e73ebafa83aULL,
  478.     0xa40b98bb7736c6e0ULL, 0xb75dd212bc092f4dULL, 0x41cb16cdede1750eULL, 0xc079f0fc98bb6a11ULL,
  479.     0xb6aa18d94d9b37baULL, 0x1647aa4c407d1244ULL, 0x8c705a13349e10c3ULL, 0xce30a5c3e1dabee9ULL,
  480.     0x2d6ca598c617b183ULL, 0xca21c9cddd1af110ULL, 0xb5e68f6381dacedaULL, 0xd9c61ec96684461fULL,
  481.     0x0b1fa1bcae112ee1ULL, 0x154042c24e0404c6ULL, 0xb4efbfbf8ea0e4f8ULL, 0xfd436a8b275b1c15ULL,
  482.     0x47dacd95f41bd571ULL, 0xf7714e0b7756278aULL, 0x559e24fc8d287691ULL, 0x91c041e4c56036f7ULL,
  483.     0x1f6578f865919a79ULL, 0xc8cdcdd242fab4d9ULL, 0x28302a7558bebb6bULL, 0xa6fbdd97c0895919ULL,
  484.     0xcbadb431be485173ULL, 0x703991cf429a8bbdULL, 0x9ec19ced4781bba6ULL, 0x94af792408408df7ULL,
  485.     0xabed4ed1677c86e1ULL, 0x0f6e9cbb41089de3ULL, 0x3c88eacbb947dc3bULL, 0x99b3fbd4c65fe1cfULL,
  486.     0x034cd4892067845cULL, 0xbcabc47135a8c209ULL, 0x8d553cd1b31bed9dULL, 0x0d8a566720267700ULL,
  487.     0x3bed637a9a370afdULL, 0x41494335f1d0adfbULL, 0x9f12bfff16b28edeULL, 0xce6453efe358988dULL,
  488.     0x2215954804510ab6ULL, 0x6b4394e84989f5f2ULL, 0xca8c91dd50847010ULL, 0xa947c7e59c35417aULL,
  489.     0x8f95c01ab298ec1eULL, 0xe95721786359e315ULL, 0xb4a2d874cec85136ULL, 0x7f1f7f8bce470897ULL,
  490.     0x7437e83c9fd5e424ULL, 0x6eeb30c64a162b8cULL, 0x23c1516503b4f507ULL, 0xcb321488c3757420ULL,
  491.     0xcebed99b362fd959ULL, 0x6c127ce789a52e6dULL, 0x980b79769c8813e0ULL, 0x26c25f71471c7e54ULL,
  492.     0x53934724e51cc126ULL, 0xd8680dabd6b9d852ULL, 0xd1bacb3c3b6f4daeULL, 0x2597310144a51aadULL,
  493.     0xdb11576656984ffcULL, 0xab667b46feae063cULL, 0x503558ac4b13be6fULL, 0x3a3e7d2c081594d7ULL,
  494.     0x4157037c0c54ea64ULL, 0xf6126e71ad203300ULL, 0xc3f04d0b97cad0fdULL, 0xbff96410f693d8b3ULL,
  495.     0xac6ae032fbaab91eULL, 0xc00eeb6a400bb962ULL, 0x2477bdbbcf3a2976ULL, 0x094c7b15ce23247cULL,
  496.     0x01e71a4167f69b90ULL, 0x6e29b4138facff1fULL, 0x565686f589cc4d65ULL, 0x73f81ca8ebee9fcbULL,
  497.     0x05a346d75398ffb3ULL, 0x4a69fb255d62ed90ULL, 0xccced0c1106d1c93ULL, 0x625916cfa21515e0ULL,
  498.     0x6f8ee1626c380dc1ULL, 0xf2e16898283cd0c3ULL, 0x727321be23832a2bULL, 0x43441f936eeb2d87ULL,
  499.     0x14b45b1ecb3f7714ULL, 0x7ddfc1f328929f1aULL, 0x2d55a0468e13ec26ULL, 0x21dd2c1f3057970fULL,
  500.     0xa6e1a5ce99fdd971ULL, 0x701c90f12059e247ULL, 0x1b7ae58e5c64ff4cULL, 0x05de117111a62053ULL,
  501.     0x137b6510a83e5ca8ULL, 0x07fc44272c5becf7ULL, 0x0f16dafab947f490ULL, 0x0895b0033e5e8900ULL,
  502.     0xeed683f7b95fd966ULL, 0x46506e5194dc9ccbULL, 0x408031d8bc251a31ULL, 0x26f999eeac14cfd6ULL,
  503.     0xc720d88aaede1459ULL, 0x1339ca054c720e1dULL, 0x70111e113ba72600ULL, 0xdb22a28a6dc25133ULL,
  504.     0x72e937c0bff13900ULL, 0x107808448080fbfaULL, 0x34f3338c200fdb4fULL, 0x4a0eadbe656dbc83ULL,
  505.     0x84dd6549f109d3bfULL, 0x746c4aecbae19826ULL, 0x513838a22e0cfe1cULL, 0x11b8f4b8fa368a3fULL,
  506.     0xdf6d5ae667795071ULL, 0xcf130962ae8c6607ULL, 0x82858c9a6b5d69e9ULL, 0x1da5a0a49b579480ULL,
  507.     0xd84db8c20e132aa6ULL, 0x0c3b0392ff2e1e63ULL, 0x912d3070ad153aa2ULL, 0x6d8ff71426c0d062ULL,
  508.     0xdbed3534b24e6bd3ULL, 0xa876821775929182ULL, 0xcdaa7d29acfa4a83ULL, 0x10333764a610f69fULL,
  509.     0x63e24d99bc37a324ULL, 0x8c25823bad7029f5ULL, 0x2ef28a1deece6115ULL, 0x32b90c23208a0008ULL,
  510.     0x723589f592ed6591ULL, 0x00c7516ed0d83959ULL, 0xe0fc684a298682e4ULL, 0x36fa668e47c35a84ULL,
  511.     0xe9b3118ed5043e35ULL, 0x75d8783d5a29f16aULL, 0x7c3c86fa947f09aeULL, 0x56f2a5e6daf19aaeULL,
  512.     0x00900521d0b38f6cULL, 0x26fa3cdcdd8cabc0ULL, 0x4a83b4473548d939ULL, 0x784f302daf6e022aULL,
  513.     0xe46c4deeeb312976ULL, 0xa9b98bd7ba7011adULL, 0x64c14cfea7abc8f5ULL, 0xc1497eb0406690faULL,
  514.     0x9511d4de569276efULL, 0xabf024a50a90b64aULL, 0x49b19b07c3e22da3ULL, 0x706bd69e20520907ULL,
  515.     0x894b149339d83ad9ULL, 0xbcf1438efca42924ULL, 0xdb560b04bef14919ULL, 0x9b7482cbecc444d6ULL,
  516.     0xed2bb01a83016742ULL, 0x71f684628505a4e1ULL, 0x670bcdc8f1042d61ULL, 0xa8f134df95b5d080ULL,
  517.     0xffb794a24165093fULL, 0x50d032fa1d662fb4ULL, 0x2810a6f28ffbb86fULL, 0xe67681ca3f1c85c7ULL,
  518.     0x03cb85ef8d956f64ULL, 0x1738ad2440ba2ca9ULL, 0xd0407f7f7463398fULL, 0x160b8d8af7dc2f9bULL,
  519.     0x0405a3e372380b98ULL, 0x6c7e379ee9d8b82dULL, 0xdc4fe04fd1875ffeULL, 0x7d644123159cfb27ULL,
  520.     0x49606435071bb986ULL, 0x90996d41b01eb18dULL, 0x5183897c42d1975eULL, 0xf56aeaa393372306ULL,
  521.     0x3e61ec92c30aaacfULL, 0x325b84d16be4df60ULL, 0x1e5bca8358d2da94ULL, 0x6b927e82bfa69929ULL,
  522.     0x085ad4d97f3dc0cfULL, 0x8cae40fec0c216aaULL, 0x764c17024ef6c979ULL, 0xc96b7917c5ab12b3ULL,
  523.     0xb1f58a09d022290fULL, 0x4549907a6ebf95f1ULL, 0x1d00457d45793c60ULL, 0x0d4301ba9f5832cbULL,
  524.     0xa2836b7853af8349ULL, 0xba9f1018ecdd2d0fULL, 0xf3f596aada6e690dULL, 0xc6649514b3e81409ULL,
  525.     0xb6d8a6c7ebfe4afcULL, 0x115175cfa1169485ULL, 0xe4a59f8ae8f01b9bULL, 0x05415ed13bb46446ULL,
  526.     0x8902f6711e2897a9ULL, 0x1ea71ce7028495e6ULL, 0x34fb7b46530d0bc3ULL, 0xb244f37d544d11b4ULL,
  527.     0x4b7706d4e0d4a2c8ULL, 0x28e623ef474904f5ULL, 0x961ebd4357a2a031ULL, 0xca8ddd9ea423647fULL,
  528.     0x3c3aea6f91215fbaULL, 0x2c89ecf10fe90db9ULL, 0x823e33b306ce8675ULL, 0x66dbe9c27aa0cbc8ULL,
  529.     0xa5393f1e6a80d339ULL, 0x68b115fc5b13af32ULL, 0x4a5a983409430b7cULL, 0x30b18f3cfdd3c98eULL,
  530.     0x929ddbbe3a82803eULL, 0x64ccccd7140f4a9bULL, 0xd7f803762450fec5ULL, 0x832e6ceca2780550ULL,
  531.     0x7c6840451f7a0143ULL, 0x02655066b6f784e9ULL, 0xee1659bae59fb670ULL, 0x4542a44ed14050fdULL,
  532.     0xe4f07584584e1e14ULL, 0x83dc19959c56dee9ULL, 0x8aeb3988a882c1c5ULL, 0xe19b46fed3c4f2bfULL,
  533.     0xce1258daee0a0946ULL, 0x247c26799366976aULL, 0x10acf6eca81488a3ULL, 0xa7ad75899d582d56ULL,
  534.     0xe315be1a51f538ffULL, 0xb5be8993675b7872ULL, 0x3db8d2d7608bbde8ULL, 0x9ff1c2c3ce3ceac1ULL,
  535.     0xeeecc280de870e1bULL, 0x5d77564297d99e2aULL, 0x4c3f25277aa1a701ULL, 0xff06a70466279913ULL,
  536.     0xc026377450f01f65ULL, 0x1b2494641bf91608ULL, 0x5f1b74fb08c332b9ULL, 0xea2c64e3db9f9057ULL,
  537.     0x9d4f807cbff85025ULL, 0xcee8670f094702b7ULL, 0xf340eef21642e7c3ULL, 0x19606d55ebe426beULL,
  538.     0xed97dc58e1711875ULL, 0xa417f28f24dea798ULL, 0x11cd6acb68c72546ULL, 0xf1921aac289d9dd6ULL,
  539.     0x6bd0fcfc448bc595ULL, 0x3e1f240d8fdc4618ULL, 0xa3828d7a1ff27fc8ULL, 0x46a4b0335abbf426ULL,
  540.     0xdf7115c761657e18ULL, 0x3d28f804775cffc4ULL, 0x30342adb438b9c69ULL, 0xb9937f6ce61ea1cdULL,
  541.     0xd4b5567c46873e35ULL, 0x940200555367edb0ULL, 0xb9d944f5f979e14fULL, 0x3b8bd9a0316d97b1ULL,
  542.     0x96798a6bc116783eULL, 0x39acfcb474f282e4ULL, 0xdb94a39f58a94510ULL, 0xaa7980b4175d122fULL,
  543.     0xc9efca1c00e61953ULL, 0x33de221d4b8295e7ULL, 0xf2c235e73e3b2542ULL, 0x83215ca5453dcb65ULL,
  544.     0xf58ff8a8df56fb2dULL, 0x09559195c7cb434eULL, 0x1161fe1c7f8f7187ULL, 0x148818fc6eaca639ULL,
  545.     0xd5298696e9d8cc30ULL, 0xfa6b53e9a9d6a4c7ULL, 0xb7cfd2c1d2ed429eULL, 0x33df557fb7aa966fULL,
  546.     0xe556777cddbba676ULL, 0x05c1c1887877a56eULL, 0x2e89de6e661bd34bULL, 0xa17a85d2b115f694ULL,
  547.     0xa807afd9ce6c2628ULL, 0xa555ddd592ebdf55ULL, 0xf1b79535a4a444e6ULL, 0x6778915e7b1823c8ULL,
  548.     0xd0bceed9f840f9c1ULL, 0x5760eb1fe0d2758bULL, 0x342d44714e3c65b9ULL, 0xed7a362bcbe6feb6ULL,
  549.     0x1705103c42821aedULL, 0xc501924ccd211bf5ULL, 0xcfe2ea8d5d1b6856ULL, 0x24ae2eb2f6bfc818ULL,
  550.     0x7fb97dbbee485d64ULL, 0xd64b84c4aeeb08d0ULL, 0xe2fd0cc4a47204a0ULL, 0xaf55b1facc3987a1ULL,
  551.     0x1dfd4be371d6f91aULL, 0x20fda8869c9263eeULL, 0x999bd21d8576298aULL, 0x1eb57256cbe60d94ULL,
  552.     0x4dceb0738230ace0ULL, 0x2dcc0846f5f39d84ULL, 0xbf22300cf9173002ULL, 0x5a1aa9b8743c632cULL,
  553.     0x9070299e5bbf03ebULL, 0xbfeb907c9407f326ULL, 0x190423598b0cbaf6ULL, 0x309e4bf71e4c443bULL,
  554.     0x79ec14272ad6eeccULL, 0xc80fc37f51135e15ULL, 0xe648d34336875121ULL, 0x773e4ab9e8b0acc0ULL,
  555.     0xfb44a070ffd3a52aULL, 0x10696674757da91bULL, 0x41a63ec5b12cede6ULL, 0x4028279f3697edc4ULL,
  556.     0xf968fbc2fabe7cc6ULL, 0x8d7f9f58b58c124cULL, 0xd8ea949dbab5a05dULL, 0x54bd7bbd38c9b3afULL,
  557.     0x474005f184ab67ddULL, 0x3d5607cf170fb906ULL, 0x7d5c3e449ecf9a7bULL, 0x64252034d8f92f53ULL,
  558.     0xbc687bb81f55f180ULL, 0x192de7c9da91f403ULL, 0xbeb7d9e0019a8b18ULL, 0x7db48efae4df737cULL,
  559.     0x175ec9517c5c4c0eULL, 0x717a7d0ebda47f15ULL, 0xa587e3e6f2b8e954ULL, 0xab2cd98817f315e2ULL,
  560.     0xcc0e745d179b1998ULL, 0x6649139d5d71f1d0ULL, 0xfcc5b6186974a8f5ULL, 0xa7059f06a374e713ULL,
  561.     0x213cef524ef7b75fULL, 0x281fda3316b40c85ULL, 0xeebd55e267534c75ULL, 0xcab02b62892df3b9ULL,
  562.     0x3b808869d5a722a5ULL, 0x4d97222b49abd9dfULL, 0x4ddc171d34629f30ULL, 0xd3752bcdc5ef181dULL,
  563.     0xab4d39c6aa8a5ca7ULL, 0x6ba8bd4d5cb06082ULL, 0x583d4de08802857dULL, 0x026c5618433aa7edULL,
  564.     0x1232c81cafbfd167ULL, 0x5a33e75840166131ULL, 0x3ea02e990724ef4dULL, 0x3951fad4b82928bcULL,
  565.     0xf1e92e7fb0846900ULL, 0x15fed7db76b1e8feULL, 0x5052710ed579d80eULL, 0xd783125e16b47e73ULL,
  566.     0x98d8b7da8bdc9c2bULL, 0x98ce50243f35581eULL, 0xb141d678f827a0d4ULL, 0xb0f8e3094f49fa61ULL,
  567.     0xab19151f7a7cdb52ULL, 0x6ba2c537f521a4f1ULL, 0x1ade518a3d9c178dULL, 0x8500515c23f51115ULL,
  568.     0xf3cc5c2fefd7a98dULL, 0xd8bbbb3e9ae20b79ULL, 0xf871825bb7ac5147ULL, 0xbb781a17cca93d0aULL,
  569.     0xf3575106b160c93cULL, 0xf844c703f58f2e1fULL, 0x2a5c72d4367ca657ULL, 0x99d7c01cf853ec21ULL,
  570.     0x1a6f335ad74dfff5ULL, 0x4fbdc8c120b994f2ULL, 0x408461eb155418cdULL, 0x157916359ffe2c1eULL,
  571.     0x525f1a7db4223dbfULL, 0x25c3000b1e90fb19ULL, 0x57bdd0c1d663fa2dULL, 0xfb802e7119bfbe24ULL,
  572.     0xaae1c35ec6eb14c4ULL, 0x652583024fcd306dULL, 0xe8be1108b58af685ULL, 0x77a89f20ae1f8a94ULL,
  573.     0xbc22aa4ab340e4bfULL, 0x78bfc970c96c221cULL, 0x1d3f7809a295ee76ULL, 0xda430da50a13a883ULL,
  574.     0xc1306bf82a441264ULL, 0xe31afb1e6fd6451cULL, 0x3a2d9759aa34eeb3ULL, 0xbf5ceaf7ab48104dULL,
  575.     0x3400ed26b9495770ULL, 0x3b296387eb154befULL, 0x1c93c216ecba4af5ULL, 0x5a34070cf1e792aaULL,
  576.     0x42c9d7c5a3609633ULL, 0x4379936a9a13d21fULL, 0x84e2a6c2f892c5d7ULL, 0xb23b8143286b71edULL,
  577.     0x7d2a12b06074cab3ULL, 0x8540d38e599343fbULL, 0x3b3b8f9db8e41f17ULL, 0x161e4e09e20ab0c6ULL,
  578.     0x162298b0f8723d99ULL, 0x9afbdb3f8b032893ULL, 0x5ec3f04936e0883aULL, 0xc50c2bce3a56ef64ULL,
  579.     0x4460c752721c55d4ULL, 0xf015b1f777a6afdcULL, 0x06f1e56f14c48c36ULL, 0x33e7235f85296282ULL,
  580.     0x06040eb1efdd11b9ULL, 0x346b7f7b751f66f3ULL, 0xbb4fa9a8e6d1d035ULL, 0xe1d3d700a82e48d5ULL,
  581.     0x8135cfd26c74b440ULL, 0x65d5d35b5696f10cULL, 0xbf9838f966bb07e8ULL, 0xebd2eb4bbcb43720ULL,
  582.     0xbbfeec86250e9350ULL, 0x66aba8170e00c52fULL, 0xabccc4a86f130675ULL, 0x2ca5716416ed7185ULL,
  583.     0x010b20c0e57bc195ULL, 0x2fe60878da02ad71ULL, 0x1b0fef55ed00184eULL, 0x1261c170eeb052b6ULL,
  584.     0x6a13113537136749ULL, 0x61c36852fc8ed2d0ULL, 0x3792d791924af876ULL, 0x5ec74fb3066e0ab6ULL,
  585.     0x08e5788888816a21ULL, 0x238b94c0003b284dULL, 0x7d712871cee92534ULL, 0x4848d5aa004ba38aULL,
  586.     0x1205c02c9b1ce8e5ULL, 0xba3aac58d085586eULL, 0xb0fa368bfeb857abULL, 0x29046208a0f9a5ecULL,
  587.     0x7e9cd0525a6a8cefULL, 0x205f2c43beab7fc5ULL, 0xd6a2d6213b8fd0f3ULL, 0x0897451e05d3e003ULL,
  588.     0x37df4af89203d875ULL, 0x103862149234cca6ULL, 0x19953ac4237d4439ULL, 0x4a089784e1bad7d8ULL,
  589.     0xfefa933f9266f384ULL, 0xd7153f3f27c9855cULL, 0x82dfe8503c066585ULL, 0xd1b163cce1e1794cULL,
  590.     0x50a0c5f3b4e0185aULL, 0xc1aa0810e07a4a11ULL, 0xf923c43f65456424ULL, 0x725076b178a0cec6ULL,
  591.     0x6a8ffed38d48e8c1ULL, 0x98c7d98b58632ce9ULL, 0x10d9eaa19eb6646dULL, 0x09d53df4e86ed7c1ULL,
  592.     0x351546a5962fd169ULL, 0x9a9e3300af4c96b3ULL, 0x2c0efad71fe68509ULL, 0x55465603290e4df8ULL,
  593.     0x3c6a5b9948795195ULL, 0xdec4cbaf18698cb6ULL, 0x22a7fc751a85732fULL, 0x237aca9e62b6ee42ULL,
  594.     0x3ec48c5a1a0eeadaULL, 0xdca8d6c1752a75b0ULL, 0x551d35ee59e8df71ULL, 0x6abcfa8e5bbce350ULL,
  595.     0xe572c1e3e84c1878ULL, 0x735166f77889b868ULL, 0x4fa1a3b5f083865fULL, 0x8e681cc7db9e5cc1ULL,
  596.     0xbdd3e56d0c286e7dULL, 0xb0a86df0d313440eULL, 0x1cf34137a8f0dd3dULL, 0x489c25283ca067b7ULL,
  597.     0x0c1ca8135db56e13ULL, 0xff7e6858fcd20f2fULL, 0x2a920c1a2fb1c744ULL, 0x49ade1415c0f4579ULL,
  598.     0xc87e5ccefb5965cfULL, 0x210c7df122a3a8d1ULL, 0x01ba3a70643d903fULL, 0xe07ccb713c01a278ULL,
  599.     0x62c4a7883e9408b6ULL, 0x5ee17e7a19fe78dcULL, 0x0ae510b98403b793ULL, 0x21557b4ba5db3c1dULL,
  600.     0xdb9583eb7765f872ULL, 0x1d81a84105cb6a78ULL, 0x8083f770c8a9ba2eULL, 0xc26d49a4d229f025ULL,
  601.     0x71296a23163a7939ULL, 0x3c5c70a50a4f78afULL, 0x0764005abc6939e0ULL, 0x8789dc959a95e3a7ULL,
  602.     0x3d33823ef2e4667dULL, 0xac0d4840351a939aULL, 0x3a1e288f96e7befcULL, 0x0b0acf1eeb03e0e6ULL,
  603.     0x5af734f93a1f45abULL, 0x26a757c07ebb8db1ULL, 0x213234b390a5ea73ULL, 0xde773d9c51af6f74ULL,
  604.     0xd49f3afe03115a77ULL, 0x5f633306505f406bULL, 0x02e449a05a0562c0ULL, 0x314666b3bc46b3dfULL,
  605.     0xece9fb5e19a2aa37ULL, 0xe6c59b7170283f22ULL, 0xb46eefb8b8a61f82ULL, 0x096a87d165af2088ULL,
  606.     0x39c222e996b6f76dULL, 0x6a36fa7cea8230f5ULL, 0xae8e037994cad44fULL, 0xbab83290685556c1ULL,
  607.     0x4647f6a1aee27fedULL, 0xf7555e9a540b8d18ULL, 0x40b059b1ceb14081ULL, 0x079823a46fccb19bULL,
  608.     0x52149b6c54c621a9ULL, 0x179d81ca92e38367ULL, 0xa4b7a879aeec1968ULL, 0x46bafea8e15407b4ULL,
  609.     0x7b82184063a31cb8ULL, 0xc2a7d35965bb02d9ULL, 0x20a1b2b01c93ecc3ULL, 0x9f20f598305af5eaULL,
  610.     0x0be76e68eabbfb22ULL, 0xe45c23075b6a5c1eULL, 0xa2804a249b3cf0c0ULL, 0x48afb9bef6c4e536ULL,
  611.     0xce14af50e72e33d6ULL, 0xb3b78d21e4c01949ULL, 0xda9c1933e182091eULL, 0x848482ce26352dcbULL,
  612.     0x800ff9ef2e1b00ddULL, 0x878c5d32481c244bULL, 0x1c6e9aa00137637cULL, 0xf872c37c83005a46ULL,
  613.     0x7fa48f34e9f56c13ULL, 0x2ace3766cddcc711ULL, 0xc17b1e2d4baf85abULL, 0x76ceade0c91a543aULL,
  614.     0x9056b0651be35aabULL, 0xd1782c9c5d85ef5eULL, 0x10200abecac6936dULL, 0xdc32c02478a5d493ULL,
  615.     0x312a8b39d2e30863ULL, 0xe90c092fb5e7fedeULL, 0x05a0a4173c2a42faULL, 0xa306c98b558ec17fULL,
  616.     0xa5c0b6af2641fe9dULL, 0xc0988090c5d6c130ULL, 0x83cf195ea8474febULL, 0x11d4ad1165868aa7ULL,
  617.     0xb7a6fc6bfe40f3f9ULL, 0x344debcb5d483760ULL, 0xb01627e1b014c80cULL, 0xee324b6baa3b32eaULL,
  618.     0xcdc83a3c452b5cb3ULL, 0xf491453b385a69abULL, 0x9c2c3555a589cd4cULL, 0x5aa3bc66d8cd5cf7ULL,
  619.     0x9b1f928b19ba6b0bULL, 0x8c84e00fd7f06d9bULL, 0x3fad17cbd0278447ULL, 0xeb7a41f56e2c5f2eULL,
  620.     0xfbc63c4d2c6c3965ULL, 0x9ab96ff21a641a28ULL, 0xa832bf87b363fdc4ULL, 0x2b812317410a4379ULL,
  621.     0x2bd1c5e152843155ULL, 0xcc24d8b28bc935b7ULL, 0x3fca0d25fdff806bULL, 0xefd4afea47bf0930ULL,
  622.     0xd16793374903e8c9ULL, 0x48af011da240633fULL, 0x9e3a22216c89b468ULL, 0x50689dc217481424ULL,
  623.     0x4b43c0dc7b5fbce2ULL, 0x30be1725b1412644ULL, 0x8ad173e150b56693ULL, 0x23ec5789dac251eaULL,
  624.     0x1ba4f07a78684deeULL, 0xe14d05d473a5f091ULL, 0x2e5646f0688fc5d4ULL, 0xcc6055f3bb092632ULL,
  625.     0x84c0232dfe2fa15bULL, 0x3a948cc8bca8f4d4ULL, 0xebbab53f8b2cd488ULL, 0x8e355721af8e4399ULL,
  626.     0x8bab9ede93d1efe6ULL, 0x6bd30d7339afa1faULL, 0x1dff66a347f8b750ULL, 0x820d0ac4c04a5431ULL,
  627.     0x00945bfeaa4da653ULL, 0xf65203cde1c67a14ULL, 0x64017b1f6d7660e6ULL, 0x4c23fe7c46272a2eULL,
  628.     0x610365dd8fa1e5b2ULL, 0x26e1842faf459b6aULL, 0x1f961aefb6770961ULL, 0x09c3397165c36f30ULL,
  629.     0xf2136ef9fbc45fc2ULL, 0xe88d6dd9adcce726ULL, 0x8d003d5edc84418cULL, 0x7c4d6b6c3d7304e9ULL,
  630.     0x88ae6ae8726245a6ULL, 0x3412f396edea2b07ULL, 0x2f65e37016e9a869ULL, 0x8df912cd07f489e3ULL,
  631.     0xe6af3fc7b992ac5cULL, 0x198b75fd3330c88cULL, 0x920edd264d30bab5ULL, 0x7f1fa0d7af191e17ULL,
  632.     0x395d8a980e403790ULL, 0x8a402b7b2acdca5eULL, 0xc030e6695e214c9cULL, 0x22e0dcf37ff4c145ULL,
  633.     0x2111f336bab565bfULL, 0x61a2770d697989e9ULL, 0xcba8f5b67005f6ceULL, 0x1a0a499cd71b0ef4ULL,
  634.     0xa9dcc2c35a4f3905ULL, 0xfca509f2c373804cULL, 0x82b2185d68a7d270ULL, 0xc90f71c6982e71dcULL,
  635.     0xa0fbe5e49cc20e03ULL, 0x8cbb93a5ee1bf578ULL, 0xab98e26c684fafb9ULL, 0xbcfc7f32ed9e9d0eULL,
  636.     0xd7c39e4893d23142ULL, 0x29367a1a9aaa1c65ULL, 0x5909c56f588f7685ULL, 0x65c3930d9faa698aULL,
  637.     0x802d369653fd8b5cULL, 0x2f890d4546b8f490ULL, 0x1346134080dd7835ULL, 0xe3eb6fbab330b08eULL,
  638.     0x77dbb5da01eb53f4ULL, 0x377171d4350c661eULL, 0xea1161836a59ae79ULL, 0xa6feebb40ae5f830ULL,
  639.     0xe6cc130af9337850ULL, 0x9c1120b73bb280aaULL, 0x2fed2c970fa8f45aULL, 0x80300f25880b1c84ULL,
  640.     0x9c2abb0207dce1afULL, 0x58569aac7cb10a43ULL, 0x0f7546be97cab5acULL, 0xf87857864a1061afULL,
  641.     0x4996455690b6293eULL, 0x8f35d2d6a5c426bbULL, 0x076f2bab8ffd52c6ULL, 0xbe48212ad0b9c51aULL,
  642.     0x80d0e7ba33bf2edfULL, 0xc30f0aa8957168f7ULL, 0x253729f26a5a53b1ULL, 0x503df089f39c8e42ULL,
  643.     0x88f857d06544265fULL, 0x3c61e1a5d4aea8a0ULL, 0x4fa7d9282963c1beULL, 0x03678fa2487bb947ULL,
  644.     0x5d2492f527aefb51ULL, 0xcf0a306c104d0364ULL, 0x5be920772cad0c02ULL, 0x37705f8902c5f913ULL,
  645.     0x6d1624633bd07072ULL, 0x4b5017f055f75d27ULL, 0x619a4b5f06babf49ULL, 0x53a53263a185b4c2ULL,
  646.     0xe808f04864e997ecULL, 0x3868f76efc5ee1e8ULL, 0xb6c4f39fe63c108bULL, 0x7910f9529f2a051eULL,
  647.     0x3a1e8bf70918df16ULL, 0x60ce2ad57e56893fULL, 0x8ffebebb87334674ULL, 0xf2d1e502e685f6f0ULL,
  648.     0x802c514db9b0ee0eULL, 0x266a15b5e189ac9aULL, 0x9654b4dd610a5ac7ULL, 0xa7e6a2acb6522521ULL,
  649.     0xe1452641949e3aedULL, 0xf852eb37d8292272ULL, 0x23440b894539e2dcULL, 0x3de3135d2480e2eaULL,
  650.     0xf35b2a0a2e456d6cULL, 0x457c0694aa06eab7ULL, 0x10f8f60e000d20c4ULL, 0x3ee2e03bfccde830ULL,
  651.     0x4bd6b8c76b8c2078ULL, 0x14a004df9b5c767dULL, 0x6465d9f58082ef7bULL, 0xacfef0a936ff1047ULL,
  652.     0xe5044ad195710642ULL, 0x773310d1465bdb40ULL, 0x98cd081351af90edULL, 0xbdd24a947f995f9eULL,
  653.     0x0b783c8add1fdcbfULL, 0x4c07f0d821ffe777ULL, 0xf9649e68057f1071ULL, 0x92b9fee00900c1dbULL,
  654.     0xc10cd24cf919e4fbULL, 0x430da99db7548368ULL, 0x9ffbc57261a9bf18ULL, 0x93fe31caceb19a49ULL,
  655.     0x3ff9497f33400965ULL, 0x355923fa7f6dfaa8ULL, 0x82b2de4000477a0fULL, 0x9f36510c4db52a2fULL,
  656.     0x35fe019be7ce0446ULL, 0x854b79c6cf45d796ULL, 0xc7a8669ed85eab29ULL, 0x0616cc03ef9f5883ULL,
  657.     0x05f32f21e7e08c08ULL, 0x3d7b96cc202021bdULL, 0x294d253dd6250389ULL, 0x396b20c1c40fbcd5ULL,
  658.     0x924d5b892e00f5aaULL, 0x46f663fd7afec7b9ULL, 0x2dcb4fed2f62cf54ULL, 0x867656fb399a763bULL,
  659.     0x6e645b42b0ed3df0ULL, 0xefbda0a959a82efaULL, 0x1e57f0d772fc387dULL, 0x0674d8a0f91d418fULL,
  660.     0x7d505da665fb9ed1ULL, 0xb92f926e73571550ULL, 0xca4afd00ae0f2651ULL, 0x4ebfad7e532820f1ULL,
  661.     0xc98143a7869aa213ULL, 0x659e2fb4bcff90a7ULL, 0x11ae0639334eee27ULL, 0x83e7533307ff2e6fULL,
  662.     0x60f5f716547d8cc3ULL, 0xc4bfead179135b68ULL, 0x08f766a9a3a8de62ULL, 0xb684258554ee0537ULL,
  663.     0x4891d873f8e3e0feULL, 0xf54572e5ac0b3a3cULL, 0x977a735beb8878cfULL, 0x4be958fbc1d86455ULL,
  664.     0x0d7de03cb6629efdULL, 0x7b2c68ae5c970120ULL, 0x5ed392cce09f00e4ULL, 0x7da97f4ab6824d5bULL,
  665.     0xa23b535e2b4a30c3ULL, 0xcbe9d4ab2a70eeccULL, 0x158896735f4e2fccULL, 0x83df96151a52fc84ULL,
  666.     0xa6a2844c5b1131c4ULL, 0xe4e63b91dbcf8115ULL, 0xc83c4b75bc1a5b80ULL, 0x09f3cd287f693d64ULL,
  667.     0xa366a3a824cec2f0ULL, 0x7e17190295ea7e8bULL, 0x65d4cb9fc6225bc2ULL, 0x29c5a0905e3c2736ULL,
  668.     0x68e90502619dbf85ULL, 0xc1c427d5896e405cULL, 0xfa4afc8f8de8ecefULL, 0x8e5301dd532114e7ULL,
  669.     0x933156b65ee4a918ULL, 0x76fd40da0354fd37ULL, 0x295d788895520e8aULL, 0x82d8f759909f819eULL,
  670.     0x6f8be0b29b366883ULL, 0x57192fcaf5eb578aULL, 0x86a3f9fa0fd932f0ULL, 0x3a9712777a36e539ULL,
  671.     0x4e9a81b491b610d4ULL, 0x112ab256f111f7b3ULL, 0xeb18a646723db641ULL, 0xf5df4391e176cfdfULL,
  672.     0x0988c3ae0a878c1eULL, 0x83eee968ca9994a3ULL, 0x2f87a0054d15a108ULL, 0x8e8f6ad28a52fb62ULL,
  673.     0x4506387e508b536eULL, 0xf4be16fd24b9def7ULL, 0xccdee07b69cfc3dcULL, 0x1d61f742a60333e8ULL,
  674.     0x2bf5dd9169aa7f01ULL, 0xc226cf16c071fa2eULL, 0x817f04841559b8a3ULL, 0xf6af48567c6e78c2ULL,
  675.     0xcd804be16811e77bULL, 0x6b397f055a9882efULL, 0x088fda249f941a3fULL, 0x6dbf67f07092c293ULL,
  676.     0x1645327035a2bd54ULL, 0xc39c205b04ec4e8dULL, 0xc01c17f1dbd0fc6aULL, 0xa28db4ab9710fa3aULL,
  677.     0x7d90dcc1fdbb11c3ULL, 0x103546bdb065c73eULL, 0x8141482edf322617ULL, 0x4a346c9c5f8d353bULL,
  678.     0xb383563ab40c28f6ULL, 0x02d49f9b654646e2ULL, 0x40cf6a1d632f905cULL, 0xc79b313acfb4b5f7ULL,
  679.     0xef662c62dca07ef1ULL, 0xcef5d422f7659834ULL, 0x8c73e6fb1b697f4eULL, 0x7231cadcef269eadULL,
  680.     0x9951b99f01fb70f1ULL, 0x536778b8e9f3b25bULL, 0xa75da0d5cb39c1beULL, 0xabcaba5e733f76a3ULL,
  681.     0x5a3b1f3f07d061f6ULL, 0xb96c2bd8a2f04332ULL, 0xb9205d72024398b9ULL, 0x7b3dee2a6799b3bdULL,
  682.     0xaa9c6adb7db1a38aULL, 0x08b635cdf28e5f5dULL, 0xc915c83f2ee319ebULL, 0xcd207081bbf6d18fULL,
  683.     0xd4fef1db4cd1fb0dULL, 0x481eda802b30c94aULL, 0x7b404bcd3fb72ca8ULL, 0xbedcddb701683d01ULL,
  684.     0x0d0e7d869fc2a5c9ULL, 0x9f32dc09ea332545ULL, 0x932528e46eff6c95ULL, 0x3e4c75e674bd93fbULL,
  685.     0x8c8391e4a1861342ULL, 0xe7ae7559f3c3c3adULL, 0x62c883f00d9e4d9fULL, 0x0bc550d471eac53eULL,
  686.     0xb6b944c871a8565dULL, 0x2a01cfb60b741f8eULL, 0x49db94bdff8b73b5ULL, 0x80b474d2d8fd36f6ULL,
  687.     0xa6c75296fb9f028aULL, 0xfc0f8bbf3ad79375ULL, 0xeaeb54285d08c14fULL, 0x0eef9a5fb0c3e2edULL,
  688.     0x54d588939fe544f6ULL, 0x17084509804201ffULL, 0x31b8372478d93e4dULL, 0x5885e4f1e37edfceULL,
  689.     0x4e1bdff27c17069aULL, 0x08a253bd9b9cb273ULL, 0x5435a8db7d2a894eULL, 0x975dafbadbaa58a0ULL,
  690.     0xfdc47ff3f5f9a594ULL, 0x4323e44de8a86bb3ULL, 0x2be02fa2a15f8860ULL, 0xa0f6d6b4378d111eULL,
  691.     0x628b1647a8f34039ULL, 0xb1ae42641adc6944ULL, 0xce22f3b15bbca65dULL, 0xff839edc88ee6833ULL,
  692.     0x9b944c8fbaffbe94ULL, 0x4dcf12e95dbf59d8ULL, 0xd4e8006c8265fa6dULL
  693. };
  694.  
  695. U64
  696. Position::getRandomHashVal(int rndNo) {
  697.     assert(rndNo >= 0);
  698.     assert(rndNo < (int)COUNT_OF(zobristRndKeys));
  699.     return zobristRndKeys[rndNo];
  700. }
  701.