#include <bits/stdc++.h>
using namespace std;

const int N = 105;
char s[N][N];
int r[N][N], c[N][N];
int f[N * N >> 2][N * N >> 2];
int h, w, X, Y;

int encode(int l, int r, int M) {return r * M + l;}  // 编码

void chkmax(int& x, int v) {
    x = max(x, v);
}

int dfs(int lX, int rX, int lY, int rY) {
    int cX = encode(lX, rX, X), cY = encode(lY, rY, Y);
    if (f[cX][cY] >= 0) return f[cX][cY];
    f[cX][cY] = 0;
    if (lX < X - 1)
        chkmax(f[cX][cY], dfs(lX + 1, rX, lY, rY) + (rX + 1 <= X - lX - 1 ? max(0, r[X - lX - 1][min(Y + rY, w - lY)] - r[X - lX - 1][max(Y - lY, rY + 1) - 1]) : 0));
    if (rX < h - X)
        chkmax(f[cX][cY], dfs(lX, rX + 1, lY, rY) + (X + rX + 1 <= h - lX ? max(0, r[X + rX + 1][min(Y + rY, w - lY)] - r[X + rX + 1][max(Y - lY, rY + 1) - 1]) : 0));
    if (lY < Y - 1)
        chkmax(f[cX][cY], dfs(lX, rX, lY + 1, rY) + (rY + 1 <= Y - lY - 1 ? max(0, c[min(X + rX, h - lX)][Y - lY - 1] - c[max(X - lX, rX + 1) - 1][Y - lY - 1]) : 0));
    if (rY < w - Y)
        chkmax(f[cX][cY], dfs(lX, rX, lY, rY + 1) + (Y + rY + 1 <= w - lY ? max(0, c[min(X + rX, h - lX)][Y + rY + 1] - c[max(X - lX, rX + 1) - 1][Y + rY + 1]) : 0));
    return f[cX][cY];
}

int main() {
    scanf("%d%d", &h, &w);
    for (int i = 1; i <= h; i++) scanf("%s", s[i] + 1);
    for (int i = 1; i <= h; i++)
        for (int j = 1; j <= w; j++)
            if (s[i][j] == 'E') X = i, Y = j;
    for (int i = 1; i <= h; i++)
        for (int j = 1; j <= w; j++) {
            r[i][j] = r[i][j - 1] + (s[i][j] == 'o');
            c[i][j] = c[i - 1][j] + (s[i][j] == 'o');
        }
    memset(f, -1, sizeof(f));
    printf("%d\n", dfs(0, 0, 0, 0));
    return 0;
}
