#include<bits/stdc++.h>
#define N 110
using namespace std;
char s[N][N];
int sum[N][N],h,w,eh,ew;
int dp[N*N/4][N*N/4];
inline int rg(int l,int r,int d,int u){
	if(l>r||d>u) return 0;
	return sum[r][u]-sum[l-1][u]-sum[r][d-1]+sum[l-1][d-1];
}
int solve(int ch,int cw){
	if(!ch&&!cw) return 0;
	if(dp[ch][cw]>=0) return dp[ch][cw];
	int l=ch%eh,r=ch/eh,d=cw%ew,u=cw/ew;
	if(l){
		dp[ch][cw]=max(dp[ch][cw],solve(ch-1,cw)+ (eh-l>r?rg(eh-l,eh-l,max(1+u,ew-d),min(w-d,ew+u)):0) );
	}
	if(r){
		dp[ch][cw]=max(dp[ch][cw],solve(ch-eh,cw)+ (eh+r<=h-l?rg(eh+r,eh+r,max(1+u,ew-d),min(w-d,ew+u)):0) );
	}
	if(d){
		dp[ch][cw]=max(dp[ch][cw],solve(ch,cw-1)+ (ew-d>u?rg(max(1+r,eh-l),min(h-l,eh+r),ew-d,ew-d):0) );
	}
	if(u){
		dp[ch][cw]=max(dp[ch][cw],solve(ch,cw-ew)+ (ew+u<=w-d?rg(max(1+r,eh-l),min(h-l,eh+r),ew+u,ew+u):0) );
	}
	return dp[ch][cw];
}
int main(){
	scanf("%d%d",&h,&w);
	for(int i=1;i<=h;i++){
		scanf("%s",s[i]+1);
		for(int j=1;j<=w;j++){
			sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
			if(s[i][j]=='o') sum[i][j]++;
			else if(s[i][j]=='E') eh=i,ew=j;
		}
	}
	memset(dp,-1,sizeof(dp));
	printf("%d\n",solve(eh*(h-eh)+eh-1,ew*(w-ew)+ew-1));
	return 0;
}
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

int n,m,Ex,Ey,Ans,f[2][110][110][110];
int g[110][110],row[110][110],line[110][110];

inline int Row(int id,int L,int R) {return row[id][R]-row[id][L-1];}
inline int Line(int U,int D,int id) {return line[D][id]-line[U-1][id];}

int main()
{
//#ifdef h10
//	freopen("robots.in","r",stdin);
//	freopen("robots.out","w",stdout);
//#endif
	int i,j,U,D,L,R;
	char c;
	scanf("%d%d",&n,&m);
	for (i=1;i<=n;i++)
	for (j=1;j<=m;j++)
	{
		c=getchar();
		while (c!='.'&&c!='o'&&c!='E') c=getchar();
		if (c=='o') g[i][j]=1;
		if (c=='E') Ex=i,Ey=j;
		row[i][j]=row[i][j-1]+g[i][j];
		line[i][j]=line[i-1][j]+g[i][j];
	}
	for (U=0;U<Ex;U++)
	for (D=0;D<=n-Ex;D++)
	for (L=0;L<Ey;L++)
	for (R=0;R<=m-Ey;R++)
	{
		int X=U&1,Y=X^1,&val=f[X][D][L][R];
		int u=max(D+1,Ex-U),d=min(Ex+D,n-U);
		int l=max(R+1,Ey-L),r=min(Ey+R,m-L);
		if (U&&Ex-U-D>0) val=max(val,f[Y][D][L][R]+Row(Ex-U,l,r));
		if (D&&Ex+D+U<=n) val=max(val,f[X][D-1][L][R]+Row(Ex+D,l,r));
		if (L&&Ey-L-R>0) val=max(val,f[X][D][L-1][R]+Line(u,d,Ey-L));
		if (R&&Ey+R+L<=m) val=max(val,f[X][D][L][R-1]+Line(u,d,Ey+R));
		Ans=max(Ans,val);
	}
	printf("%d\n",Ans);
}
