import std.stdio;
import std.string;
import std.conv;
import std.typecons;
import std.algorithm;
import std.functional;
import std.bigint;
import std.numeric;
import std.array;
import std.math;
import std.range;
import std.container;
import std.ascii;

void main() {
    while(true) {
        int H, W;
        readf("%d %d\n", &H, &W);
        if (H==0 && W==0) break;
        bool[][] flag = H.iota.map!(_ => readln.chomp.map!(c=>c=='.').array).array;
        int[][] ary1 = new int[][](H, W);
        int[][] ary2 = new int[][](H, W);
        foreach(i; 0..H) {
            int s = 0;
            foreach_reverse(j; 0..W) {
                if (flag[i][j]) {
                    ary1[i][j] = ++s;
                } else {
                    s = 0;
                }
            }
        }
        foreach(j; 0..W) {
            int s = 0;
            foreach_reverse(i; 0..H) {
                if (flag[i][j]) {
                    ary2[i][j] = ++s;
                } else {
                    s = 0;
                }
            }
        }
        H.iota.map!(i => W.iota.map!(j => reduce!max(0, iota(i, min(H, i+ary2[i][j])).map!(a => (a-i+1)*iota(i, a+1).map!(b => ary1[b][j]).reduce!min))).reduce!max).reduce!max.writeln;
    }
}