There is a square grid with N rows and M columns. Each square contains an integer: 0 or 1. The square at the i-th row from the top and the j-th column from the left contains a_{ij}.

Among the 2^{N+M} possible pairs of a subset A of the rows and a subset B of the columns, find the number of the pairs that satisfy the following condition, modulo 998244353:

* The sum of the |A||B| numbers contained in the intersection of the rows belonging to A and the columns belonging to B, is odd.

Constraints

* 1 \leq N,M \leq 300
* 0 \leq a_{i,j} \leq 1(1\leq i\leq N,1\leq j\leq M)
* All values in input are integers.

Input

Input is given from Standard Input in the following format:


N M
a_{11} ... a_{1M}
:
a_{N1} ... a_{NM}


Output

Print the number of the pairs of a subset of the rows and a subset of the columns that satisfy the condition, modulo 998244353.

Examples

Input

2 2
0 1
1 0


Output

6


Input

2 3
0 0 0
0 1 0


Output

8
import java.util.Scanner;

public class Main {
	static Scanner sc = new Scanner(System.in);
	static final long MOD = 998244353;
	static int N, M;

	public static void main(String[] args) {
		N = sc.nextInt();
		M = sc.nextInt();
		int[][] mat = new int[N][M];
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				mat[i][j] = sc.nextInt();
			}
		}
		int dim = 0;
		int col = 0;
		boolean[] fix = new boolean[N];
		for (int i = 0; col < M; i++) {
			for (int j = 0; j < N; j++) {
				if (!fix[j] && mat[j][col] == 1) {
					for (int k = 0; k < N; k++) {
						if (k == j || mat[k][col] == 0) continue;
						for (int l = 0; l < M; l++) {
							mat[k][l] ^= mat[j][l];
						}
					}
					++dim;
					fix[j] = true;
					break;
				}
			}
			++col;
		}
//		for (int i = 0; i < N; i++) {
//			for (int j = 0; j < M; j++) {
//				System.err.print(mat[i][j] + " ");
//			}
//			System.err.println();
//		}

		long[] pow2 = new long[301];
		pow2[0] = 1;
		for (int i = 1; i < pow2.length; i++) {
			pow2[i] = pow2[i - 1] * 2 % MOD;
		}
		long[][] comb = new long[301][301];
		for (int i = 0; i < comb.length; i++) {
			comb[i][0] = comb[i][i] = 1;
		}
		for (int i = 0; i < comb.length; i++) {
			for (int j = 1; j < i; j++) {
				comb[i][j] = (comb[i - 1][j] + comb[i - 1][j - 1]) % MOD;
			}
		}
		long ans = 0;
		for (int i = 1; i <= dim; i++) {
			long here = 0;
			for (int j = 1; j <= i; j += 2) {
				here += comb[i][j];
				here %= MOD;
			}
			here *= comb[dim][i];
			here %= MOD;
			here *= pow2[M - i];
			here %= MOD;
			ans += here;
			ans %= MOD;
		}
		ans *= pow2[N - dim];
		ans %= MOD;
		System.out.println(ans);
	}

}
