#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <numeric>

#define REP(i, a, b) for (int i = int(a); i < int(b); i++)
#ifdef _DEBUG_
#define dump(val) cerr << __LINE__ << ":\t" << #val << " = " << (val) << endl
#else
#define dump(val)
#endif

using namespace std;

typedef long long int ll;

template<typename T>
vector<T> make_v(size_t a, T b) {
    return vector<T>(a, b);
}
template<typename... Ts>
auto make_v(size_t a, Ts... ts) {
    return vector<decltype(make_v(ts...))>(a, make_v(ts...));
}

#include <utility>
using Histgram = pair<int, int>;

ll maxHist(vector<int> &hist) {
    vector<Histgram> st;
    ll ans = 0;
    hist.push_back(-1);
    REP(i, 0, hist.size()) {
        if (st.empty()) {
            st.emplace_back(hist[i], i);
        } else if (st.back().first == hist[i]) {
            // pass
        } else if (st.back().first < hist[i]) {
            st.emplace_back(hist[i], i);
        } else {
            ll lst = 0;
            while (st.size() && st.back().first > hist[i]) {
                lst = st.back().second;
                ans = max(ans, (i - lst) * st.back().first);
                st.pop_back();
            }
            st.emplace_back(hist[i], lst);
        }
    }
    return ans;
}

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int W, H;
    while (cin >> H >> W, W + H) {
        auto mp = make_v(H, W, '*');
        REP(i, 0, H) {
            REP(j, 0, W) {
                cin >> mp[i][j];
            }
        }
        vector<int> hist(W, 0);
        ll ans = 0;
        REP(i, 0, H) {
            REP(j, 0, W) {
                if (mp[i][j] == '.') {
                    hist[j]++;
                } else {
                    hist[j] = 0;
                }
            }
            ll res = maxHist(hist);
            ans = max(ans, res);
        }
        cout << ans << endl;
    }
    return 0;
}

