Problem: There is a grid with H rows and W columns, where each square is painted black or white.

You are given H strings S_1, S_2, ..., S_H, each of length W. If the square at the i-th row from the top and the j-th column from the left is painted black, the j-th character in the string S_i is `#`; if that square is painted white, the j-th character in the string S_i is `.`.

Find the number of pairs of a black square c_1 and a white square c_2 that satisfy the following condition:

* There is a path from the square c_1 to the square c_2 where we repeatedly move to a vertically or horizontally adjacent square through an alternating sequence of black and white squares: black, white, black, white...

Constraints

* 1 \leq H, W \leq 400
* |S_i| = W (1 \leq i \leq H)
* For each i (1 \leq i \leq H), the string S_i consists of characters `#` and `.`.

Input

Input is given from Standard Input in the following format:


H W
S_1
S_2
:
S_H


Output

Print the answer.

Examples

Input

3 3
.#.
..#
#..


Output

10


Input

3 3
.#.
..#
..


Output

10


Input

2 4
....
....


Output

0


Input

4 3


...


Output

6

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, -1, 1};
vector<string> vec;
int h, w;
vector<vector<bool> > visited;
long long white;
long long black;
void dfs(int i, int j, char cur){
	visited[i][j]=true;
	if(cur == '.')white++;
	if(cur == '#')black++;
	for(int k = 0; k < 4; ++k){
		int r = i + dx[k];
		int c = j + dy[k];
		if(r >= 0 && c >= 0 && r < h && c < w){
			if(vec[r][c] == '.' && cur == '#' && !visited[r][c]){
			    dfs(r, c, '.');
			}
			if(vec[r][c] == '#' && cur == '.' && !visited[r][c]){
				dfs(r, c, '#');
			}
		}
	}
}
int main(){
	cin>>h>>w;
	vec.resize(h);
	for(int i = 0; i < h; ++i){
		cin>>vec[i];
	}
	vector<bool> e(w, false);
	visited.resize(h, e);
	long long res = 0;
	for(int i = 0; i < h; ++i){
		for(int j = 0; j < w; ++j){
			if(vec[i][j]=='#' && !visited[i][j]){
				white=black=0;
				dfs(i, j, '#');
				res += white * black;
			}
		}
	}
	cout<<res<<endl;
	return 0;
}