func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 255;   const int M = 16;   const int mod = (int)1e9 + 7;   char grid[N][N], ngrid[N][N];   long long dp[2][M][1 << M][2][2];   void add(long long& a, long long b) {     a += b;     while (a >= mod) {       a -= mod;     }   }   int main() {     int n, m;     scanf( %d %d , &n, &m);     for (int i = 0; i < n; i++) {       scanf( %s , grid[i]);     }     if (n < m) {       for (int i = 0; i < n; i++) {         for (int j = 0; j < m; j++) {           ngrid[j][i] = grid[i][j];         }       }       swap(n, m);       for (int i = 0; i < n; i++) {         for (int j = 0; j < m; j++) {           grid[i][j] = ngrid[i][j];         }       }     }     if (grid[0][0] ==  x ) {       dp[0][0][0][0][0] = 1;     } else {       dp[0][0][0][0][1] = 1;       dp[0][0][1][1][0] = 1;     }     for (int i = 0; i < n; i++) {       if (i > 0) {         for (int j = 0; j < m; j++) {           for (int mask = 0; mask < 1 << m; mask++) {             for (int a = 0; a < 2; a++) {               for (int b = 0; b < 2; b++) {                 dp[i & 1][j][mask][a][b] = 0;               }             }           }         }       }       for (int j = 0; j < m; j++) {         if (i == 0 && j == 0) continue;         for (int mask = 0; mask < 1 << m; mask++) {           for (int a = 0; a < 2; a++) {             for (int b = 0; b < 2; b++) {               if (grid[i][j] !=  x ) {                 if (a == 1) {                   if (mask & (1 << j)) {                     if (j == 0) {                       add(dp[i & 1][j][mask][0][b],                           dp[1 - (i & 1)][m - 1][mask][a][b]);                       add(dp[i & 1][j][mask][1][b],                           dp[1 - (i & 1)][m - 1][mask][a][b]);                     } else {                       add(dp[i & 1][j][mask][a][b],                           2 * dp[i & 1][j - 1][mask][a][b]);                     }                   } else {                     if (j == 0) {                       if (b == 0) {                         add(dp[i & 1][j][mask][0][b + 1],                             dp[1 - (i & 1)][m - 1][mask][a][b]);                       }                       add(dp[i & 1][j][mask | (1 << j)][a][b],                           dp[1 - (i & 1)][m - 1][mask][a][b]);                     } else {                       add(dp[i & 1][j][mask | (1 << j)][a][b],                           dp[i & 1][j - 1][mask][a][b]);                       add(dp[i & 1][j][mask][a][b], dp[i & 1][j - 1][mask][a][b]);                     }                   }                 } else {                   if (mask & (1 << j)) {                     if (j == 0) {                       add(dp[i & 1][j][mask][1][b],                           dp[1 - (i & 1)][m - 1][mask][a][b]);                       add(dp[i & 1][j][mask][a][b],                           dp[1 - (i & 1)][m - 1][mask][a][b]);                     } else {                       add(dp[i & 1][j][mask][1][b], dp[i & 1][j - 1][mask][a][b]);                       add(dp[i & 1][j][mask][a][b], dp[i & 1][j - 1][mask][a][b]);                     }                   } else {                     if (j == 0) {                       if (b == 0) {                         add(dp[i & 1][j][mask][a][b + 1],                             dp[1 - (i & 1)][m - 1][mask][a][b]);                       }                       add(dp[i & 1][j][mask | (1 << j)][1][b],                           dp[1 - (i & 1)][m - 1][mask][a][b]);                     } else {                       if (b == 0) {                         add(dp[i & 1][j][mask][a][b + 1],                             dp[i & 1][j - 1][mask][a][b]);                       }                       add(dp[i & 1][j][mask | (1 << j)][1][b],                           dp[i & 1][j - 1][mask][a][b]);                     }                   }                 }               } else {                 if (j == 0) {                   add(dp[i & 1][j][mask & (~(1 << j))][0][b],                       dp[1 - (i & 1)][m - 1][mask][a][b]);                 } else {                   add(dp[i & 1][j][mask & (~(1 << j))][0][b],                       dp[i & 1][j - 1][mask][a][b]);                 }               }             }           }         }       }     }     long long ans = 0;     for (int mask = 0; mask < 1 << m; mask++) {       for (int a = 0; a < 2; a++) {         for (int b = 0; b < 2; b++) {           add(ans, dp[(n - 1) & 1][m - 1][mask][a][b]);         }       }     }     printf( %lld n , ans);     return 0;   }   