public GamePosition checkSeries(GameBoardMark playerMark, int depth) {
        int[] auxilliaryBoard = new int[GameBoard.TOTAL_SQUARES_PER_BOARD];
        GamePosition winningPosition;
        if (depth == GameBoard.MAX_DEPTH_FOR_TEMP_BOARD) return GamePosition.nonePosition();

        setc4c(playerMark);

        for (int k = 0; k < GameBoard.TOTAL_SQUARES_PER_BOARD; k++) {
            if (StagingBoard.isEmptyAtPosition(k) || auxilliaryBoard[k] != GameBoardMark.EMPTY.index) continue;
            copyStagingBoardIntoOddGroupOfBoardsAtDepth(depth);

            auxilliaryBoard[k] = playerMark.index;

            winningPosition = checkForWinOpportunity(switchPlayers(playerMark), 2);
            if (winningPosition.isNone()) return GamePosition.nonePosition();

            auxilliaryBoard[winningPosition.getRaw()] = switchPlayers(playerMark).index;
            if (blockSeriesOfFourOrMore(playerMark, 2, Mode.CHECK).isNotNone()) {
                return new GamePosition(k);
            }

            if (blockSeriesOfFourOrMore(switchPlayers(playerMark), 2, Mode.CHECK).isNotNone()) {
                auxilliaryBoard[k] = GameBoardMark.EMPTY.index;
                auxilliaryBoard[winningPosition.getRaw()] = GameBoardMark.EMPTY.index;
                copyIntoStagingBoardFromOddBoardGroupAtDepth(depth);
                continue;
            }

            if (checkSeries(playerMark, depth + 1) != GamePosition.nonePosition()) {
                return new GamePosition(k);
            }

            auxilliaryBoard[k] = GameBoardMark.EMPTY.index;
            auxilliaryBoard[winningPosition.getRaw()] = GameBoardMark.EMPTY.index;
            copyIntoStagingBoardFromOddBoardGroupAtDepth(depth);
        }
        return GamePosition.nonePosition();
    }