#include <iostream>#include <cmath>#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int minint = 0x80808080;int n, m, msk[378], cntMask, mskMap[1 << 12 | 1];char mp[1111][13];int dp[2][378][378], size[378], tag[378];vector<int> trans[378];void dfs(int pos, int mask) {msk[++cntMask] = mask; mskMap[mask] = cntMask;int tmp = mask; size[cntMask] = 0;while (tmp) {if (tmp & 1) ++size[cntMask];tmp >>= 1;}tag[cntMask] = 0;for (int i = 1; i <= m - 2; ++i) {if (((mask >> (i - 1)) & 1) && ((mask >> (i + 1)) & 1)) tag[cntMask] |= 1 << i;}for (int i = pos + 2; i <= m; ++i) {dfs(i, mask | (1 << (i - 1)));}}void gen(int m) {cntMask = 1; mskMap[0] = 1;for (int i = 1; i <= m; ++i) dfs(i, 1 << (i - 1));for (int i = 1; i <= cntMask; ++i) trans[i].clear();for (int i = 1; i <= cntMask; ++i) {for (int j = 1; j <= cntMask; ++j) {if (msk[i] & msk[j]) continue;bool flag = true;int _i = msk[i], _j = msk[j];for (int k = 1; k <= m; ++k) {if (k != m) {if (((_i >> (k - 1)) & 1) && ((_j >> (k)) & 1)) flag = false;}if (k >= 2) {if (((_i >> (k - 1)) & 1) && ((_j >> (k - 2)) & 1)) flag = false;}}if (!flag) continue;trans[i].push_back(j);}}}bool legal(char ch) {return ch == 'X' || ch == '.';}int mpMask[1111];int main() {while (scanf("%d%d", &n, &m) != EOF) {if (n + m == 0) break;cntMask = 0; memset(mskMap, -1, sizeof(mskMap));gen(m);for (int i = 1; i <= n; ++i) {mpMask[i] = 0;for (int j = 1; j <= m; ++j) {char ch;while ((ch = getchar()) && !legal(ch));mp[i][j] = ch;if (ch == 'X') mpMask[i] |= (1 << (j - 1));}}memset(dp, 0x80, sizeof(dp));dp[0][1][1] = 0;int ans = 0;for (int i = 0; i < n; ++i) {memset(dp[~i & 1], 0x80, sizeof(dp[~i & 1]));for (int m1 = 1; m1 <= cntMask; ++m1) {for (vector<int>::iterator it = trans[m1].begin(); it != trans[m1].end(); ++it) {int m2 = *it;if (dp[i & 1][m1][m2] == minint) continue;for (vector<int>::iterator it2 = trans[m2].begin(); it2 != trans[m2].end(); ++it2) {int mk = *it2; int _mk = msk[mk]; int _i = msk[m1];if (_mk & _i & ~mpMask[i]) continue;if (_mk & mpMask[i + 1]) continue;if ((tag[mk] & mpMask[i + 1]) != tag[mk]) continue;if (_i & (_mk >> 2) & ~(mpMask[i] >> 1)) continue;if (_mk & (_i >> 2) & ~(mpMask[i] >> 1)) continue;int &v = dp[~i & 1][m2][mk];v = max(v, dp[i & 1][m1][m2] + size[mk]);if (i == n - 1) ans = max(ans, v);}}}}printf("%dn", ans);}return 0;}


