package main import ( "bufio" "fmt" "os" "strconv" ) var sc = bufio.NewScanner(os.Stdin) var wr = bufio.NewWriter(os.Stdout) func print(x ...interface{}) { fmt.Fprintln(wr, x...) } func nextString() string { sc.Scan() return sc.Text() } func nextInt() int { sc.Scan() i, err := strconv.Atoi(sc.Text()) if err != nil { panic(err) } return i } func nextFloat() float64 { sc.Scan() i, err := strconv.ParseFloat(sc.Text(), 64) if err != nil { panic(err) } return i } func chmax(a *int, b int) { if *a < b { *a = b } } func chmin(a *int, b int) { if *a > b { *a = b } } func reverse(s string) string { rs := []rune(s) for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { rs[i], rs[j] = rs[j], rs[i] } return string(rs) } var ( H, W int S []string ) func solve(dy, dx int) bool { used := make([][]bool, H) for i := range used { used[i] = make([]bool, W) } ok := false for i := range S { for j := range S[i] { if S[i][j] == '#' && !used[i][j] { if i+dy >= H || j+dx >= W { return false } if S[i+dy][j+dx] == '#' && !used[i+dy][j+dx] { used[i+dy][j+dx] = true } else { return false } ok = true } } } return ok } func main() { defer wr.Flush() sc.Split(bufio.ScanWords) H, W = nextInt(), nextInt() S = make([]string, H) for i := range S { S[i] = nextString() } for i := 0; i < 2; i++ { for i := range S { for j := range S[i] { if i == 0 && j == 0 { continue } if solve(i, j) { print("YES") return } } } for i := range S { S[i] = reverse(S[i]) } } print("NO") }