#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstring>
#include <math.h>
#include <numeric>
#define rep(i,s,n) for (int i = s; i < n; ++i)
#define drep(i,s,n) for (int i = n; i >= s; --i)
#define all(x) (x).begin(),(x).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define print(x) cout<<(x)<<endl
using namespace std;
typedef long long ll;

int gcd(int a, int b)
{
   if (a%b == 0) return(b);
   else          return(gcd(b, a%b));
}
int lcm(int a, int b)
{
   return a * b / gcd(a, b);
}
void printvv(vector<vector<auto>> vv, int n)
{
  cout << '[' << endl;
  rep(q, 0, n)
  {
    cout << '[';
    rep(p, 0, n)
    {
      cout << vv.at(q).at(p) << ',';
    }
    cout << ']' << endl;
  }
  cout << ']' << endl;
}

void solve();
int main(){cin.tie(0);ios::sync_with_stdio(0);solve();}

//------------------------------------------------------------
int dx[]={0,-1,1,0};
int dy[]={-1,0,0,1};

void solve() {
  bool flag=true, bl=false;
  int h,w,sum=0,k=0;
  cin >> h >> w;

  vector<string> v(h);
  rep(i,0,h) cin >> v.at(i);

  rep(i,0,h)
  {
    rep(j,0,w)
    {
      if(v.at(i).at(j)=='#')
      {
        bl=false; k=0;
        while(k<4)
        {
          if(dy[k]+i>=0 && dy[k]+i<h && dx[k]+j>=0 && dx[k]+j<w && v.at(dy[k]+i).at(dx[k]+j)=='#') bl=true;
          ++k;
        }
        if(!bl) flag=false;
      }
      if(!flag) break;
    }
    if(!flag) break;
  }

  if(flag) print("Yes");
  else print("NO");

  return;
}
