#include <bits/stdc++.h>
#define int long long
using namespace std;
bool bit(int k, int n) {
if (k == -1) return 1;
return (n & (1 << k));
}
signed main() {
ifstream cin("domino-covering-2.in");
ofstream cout("domino-covering-2.out");
int n, m;
cin >> n >> m;
vector <vector <bool> > a(n + 1, vector <bool> (m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
char c;
cin >> c;
a[i][j] = (c == '.') ? 0 : 1;
}
}
vector <vector <int> > dp(m, vector <int> ((1 << m), 0ll));
vector <int> dp_temp(1 << m);
dp[0][(1 << m) - 1] = 1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int next_bit = (m + j + 1) % m;
for (int k = 0; k < (1 << m); k++) {
int bit_up = bit(j, k);
int bit_left = bit(j - 1, k);
int mask = k;
int temp = dp[j][k];
if (!a[i][j]) {
if (!bit_up) {
dp_temp[mask | (1 << j)] += temp;
} else {
if (!bit_left) {
dp_temp[mask | (1 << (j - 1))] += temp;
dp_temp[mask ^ (1 << j)] += temp;
} else {
dp_temp[mask ^ (1 << j)] += temp;
}
}
} else {
if (bit_up) {
dp_temp[mask] += temp;
}
}
}
for (int k = 0; k < (1 << m); k++) {
dp[next_bit][k] = dp_temp[k];
dp_temp[k] = 0;
}
}
}
cout << dp[0][(1 << m) - 1];
return 0;
}