```python
from typing import List

def count_trails(rows: int, cols: int, blocked: List[List[int]]) -> int:
    if not (isinstance(rows, int) and isinstance(cols, int) and rows > 0 and cols > 0):
        raise ValueError("Rows and cols must be positive integers")
    if not all(isinstance(entry, list) and len(entry) == 2 for entry in blocked):
        raise ValueError("Blocked must be a list of two-item lists")
    if not all(0 <= entry[0] < rows and 0 <= entry[1] < cols for entry in blocked):
        raise ValueError("Blocked cells must be within the grid")
    if any(entry[0] == 0 or entry[0] == rows - 1 or entry[1] == 0 or entry[1] == cols - 1 for entry in blocked):
        raise ValueError("Rope must not cross the entrance or exit cell")
    
    def is_valid_cell(row: int, col: int) -> bool:
        return 0 <= row < rows and 0 <= col < cols
    
    def is_valid_move(row: int, col: int) -> bool:
        return is_valid_cell(row, col) and (row, col) not in blocked
    
    def count_routes(row: int, col: int) -> int:
        if row == rows - 1 and col == cols - 1:
            return 1
        if row == rows - 1:
            return count_routes(row, col + 1)
        if col == cols - 1:
            return count_routes(row + 1, col)
        return count_routes(row + 1, col) + count_routes(row, col + 1)
    
    return count_routes(0, 0)
```