#include <iostream>
//#include<algorithm>
//#include<cmath>
#include<iostream> 
using namespace std;

typedef long long ll;

ll p = 1000000007;

ll fast_pow_mod(ll base, ll exp, ll p) {
	if (base == 0) return 0;
	ll ans = 1;
	while (exp > 0) {
		if(exp & 1) ans = (ans * base) % p;
		base = (base * base) % p;
		exp >>= 1;
	}
	return ans;
}

int main() {
	int n, m;
//	string s;
	cin >> n >> m;
//	int p1 = 0, p2 = 0;
	ll ans = 0;
	int len = 0;
//	bool flag = false;
	int a[n + 1][m +1];
//	for (int i = 0; i < n; i++) {
//		for(int j = 0; j < m; j++) {
//			cin >> a[i][j];
//			if (j > 0 && a[i][j] != a[i][j - 1]) {
//				//结算
//				ans = (ans + len * (len + 1) / 2) % p;
//				len = 1; 
//			} else {
//				len++;
//			}
//		}
//		ans = (ans + len * (len + 1) / 2) % p;
//		len = 0; 
//	}
//	for (int j = 0; j < m; j++) {
//		for(int i = 0; i < n; i++) {
////			cin >> a[i][j]
//			if (i > 0 && a[i][j] != a[i - 1][j]) {
//				//结算
//				ans = (ans + len * (len + 1) / 2) % p;
//				len = 1; 
//			} else {
//				len++;
//			}
//		}
//		ans = (ans + len * (len + 1) / 2) % p;
//		len = 0; 
//	}
//	ll e = n * m;
//	ans = ans - e % p;
//	cout << (ans >= 0 ? ans : ans + p) << endl;

	for (int i = 0; i < n; i++) {
		for(int j = 0; j < m; j++) {
			cin >> a[i][j];
			len += a[i][j];
		}
		ll tmp = (ans + fast_pow_mod(2, len, p) + fast_pow_mod(2, m - len, p)) % p - 2;
		ans = tmp + (tmp >= 0 ? 0 : p);
		len = 0; 
	}
	for (int j = 0; j < m; j++) {
		for(int i = 0; i < n; i++) {
//			cin >> a[i][j];
			len += a[i][j];
		}
		ll tmp = (ans + fast_pow_mod(2, len, p) + fast_pow_mod(2, n - len, p)) % p - 2;
		ans = tmp + (tmp >= 0 ? 0 : p);
		len = 0; 
	}
	ans = ans - (n * m % p);
	cout << (ans >= 0 ? ans : ans + p) << endl;
}