#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define SZ(a) (int)(a).size() #define FOR(i,a,b) for (int i=(a); i<=(b); ++i) #define REP(i,n) for (int i=0; i<(n); ++i) #define ALL(c) c.begin(), c.end() #define CLR(c,n) memset(c, n, sizeof(c)) #define MCPY(d, s) memcpy(d, s, sizeof(d)) #define TR(it, c) for (auto it = c.begin();it != c.end(); ++it) #define CONTAIN(it, c) (c.find(it) != c.end()) typedef vector VI; typedef pair PII; template void checkmin(T &a, T b) { if (b void checkmax(T &a, T b) { if (b>a) a=b; } typedef long long LL; const int INF=0x3F3F3F3F; PII x[2500]; int n; #define X first #define Y second PII operator+(PII p, PII q) { return PII(p.X+q.X, p.Y+q.Y); } PII operator-(PII p, PII q) { return PII(p.X-q.X, p.Y-q.Y); } struct PIIHash { size_t operator()(PII p) const { return hash()(p.X)^hash()(p.Y); } }; bool check(PII diff) { unordered_set s(x, x+n); while (!s.empty()) { PII b=*s.begin(); int cnt = 0; for (PII p = b; CONTAIN(p, s); p = p + diff) { s.erase(p); ++cnt; } for (PII p = b - diff; CONTAIN(p, s); p = p - diff) { s.erase(p); ++cnt; } if (cnt % 2 == 1) return false; } return true; } bool go() { if (n % 2 == 1) return false; for (int i = 1; i < n; ++i) { if (check(x[i]-x[0])) return true; } return false; } int main(int argc, char *argv[]) { int w, h; char s[64]; while (scanf("%d%d", &h, &w) == 2) { n = 0; REP(i, h) { scanf("%s", s); REP(j, w) if (s[j] == '#') x[n++] = PII(i, j); } printf("%s\n", go() ? "YES" : "NO"); } }