use std::io;

fn read_grid() -> Vec<Vec<char>> {
    let mut line = String::new();
    let mut inputs = Vec::<Vec<char>>::new();
    io::stdin().read_line(&mut line).unwrap();
    let hw: Vec<i32> = line
        .trim()
        .split_whitespace()
        .map(|x| x.parse::<i32>().unwrap())
        .collect();
    line.clear();
    for _ in 0..hw[0] {
        io::stdin().read_line(&mut line).unwrap();
        let line_chars: Vec<char> = line.trim().chars().collect();
        inputs.push(line_chars);
        line.clear();
    }
    inputs
}

fn check_sharp(grid: &Vec<Vec<char>>, x: i32, y: i32) -> bool {
    let max_w = (grid[0].len() - 1) as i32;
    let max_h = (grid.len() - 1) as i32;
    if x > max_w || x < 0 {
        return false;
    }
    if y > max_h || y < 0 {
        return false;
    }

    let neighbor = grid[y as usize][x as usize];
    if neighbor == '#' {
        return true;
    }
    return false;
}

fn solve(grid: Vec<Vec<char>>) -> &'static str {
    let h = grid.len();
    let w = grid[0].len();
    for i in 0..h {
        for j in 0..w {
            if grid[i][j] == '.' {
                continue;
            }
            let x = j as i32;
            let y = i as i32;
            println!("target {}", grid[i][j]);
            if check_sharp(&grid, x + 1, y)
                || check_sharp(&grid, x - 1, y)
                || check_sharp(&grid, x, y + 1)
                || check_sharp(&grid, x, y - 1)
            {
                continue;
            } else {
                return "No";
            }
        }
    }
    "Yes"
}

fn main() {
    let grid = read_grid();
    let res = solve(grid);
    println!("{}", res);
}
