    #include <bits/stdc++.h>

    #define IO ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
    typedef long long ll;
    typedef long double ld;
    using namespace std;
    mt19937 rng((unsigned int) chrono::steady_clock::now().time_since_epoch().count());

    const int MOD = 998244353;

    template<typename T, typename U>
    pair<T, U> operator+(const std::pair<T, U> &l, const std::pair<T, U> &r) {
        return {l.first + r.first, l.second + r.second};
    }

    template<typename T, typename U>
    pair<T, U> operator-(const std::pair<T, U> &l, const std::pair<T, U> &r) {
        return {l.first - r.first, l.second - r.second};
    }

    class myComparator {
    public:
        bool operator()(const pair<int, char> &p1, const pair<int, char> &p2) {

            return p1.first > p2.first || (p1.first == p2.first && (p1.second < p2.second));

        }
    };

    vector<string> grid;

    int main() {
        IO;
        int n, m;
        cin >> n >> m;
        grid.resize(n);
        ll all = 0;
        for (int i = 0; i < n; i++) {
            cin >> grid[i];
            for (int j = 0; j < m; j++) {
                if (grid[i][j] == 'o') {
                    all++;
                }
            }
        }
        vector<int> vec(max(n, m) + 1);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                int len = 0;
                while (j < m && grid[i][j] == 'o') {
                    len++;
                    j++;
                }
                if (len) {
                    j--;
                }
                int add = 1;
                while (len){
                    vec[len]+=add;
                    add++;
                    len--;
                }
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                int len = 0;
                while (j < n && grid[j][i] == 'o') {
                    j++;
                    len++;
                }
                if (len) {
                    j--;
                }
                int add = 1;
                while (len){
                    vec[len]+=add;
                    add++;
                    len--;
                }
            }
        }

        
        vector<ll> power(all + 1);
        power[0] = 1;
        for (int i = 1; i <= all; i++) {
            power[i] = power[i - 1] * 2;
            power[i] %= MOD;
        }
        ll ans = 0;
        for (int i = 2; i <= max(n, m); i++) {
            if (all - i < 0)continue;
            ll temp = power[all - i] * vec[i];
            if (i % 2 == 1) {
                temp *= -1;
            }

            temp %= MOD;
            ans += temp;
            ans %= MOD;
        }
        ans+=MOD;
        ans%=MOD;
        cout << ans << endl;


    }