@Override
 public void nextHashInTier() {
   if (dbh.getHash() < dbh.numHashes() - 1) dbh.next();
   else if (numPieces[BLACK] == 0) {
     numPieces[BLACK] = numPieces[WHITE];
     numPieces[WHITE] = 0;
     dbh.setNums(boardSize - getTier(), 0, getTier());
     if (turn != 0) throw new RuntimeException("Tier finished");
     else turn++;
   } else {
     dbh.setNums(boardSize - getTier(), ++numPieces[WHITE], --numPieces[BLACK]);
   }
   isChildrenValid = false;
 }
 @Override
 public boolean hasNextHashInTier() {
   long currentHash = dbh.getHash();
   return (currentHash != numHashesForTier(getTier()) - 1);
 }
 private long getHash() {
   return offsetTable[getTier()][turn][numPieces[WHITE]] + dbh.getHash();
 }