We have a grid with (2^N - 1) rows and (2^M-1) columns. You are asked to write 0 or 1 in each of these squares. Let a_{i,j} be the number written in the square at the i-th row from the top and the j-th column from the left.

For a quadruple of integers (i_1, i_2, j_1, j_2) such that 1\leq i_1 \leq i_2\leq 2^N-1, 1\leq j_1 \leq j_2\leq 2^M-1, let S(i_1, i_2, j_1, j_2) = \displaystyle \sum_{r=i_1}^{i_2}\sum_{c=j_1}^{j_2}a_{r,c}. Then, let the oddness of the grid be the number of quadruples (i_1, i_2, j_1, j_2) such that S(i_1, i_2, j_1, j_2) is odd.

Find a way to fill in the grid that maximizes its oddness.

Constraints

* N and M are integers between 1 and 10 (inclusive).

Input

Input is given from Standard Input in the following format:


N M


Output

Print numbers to write in the grid so that its oddness is maximized, in the following format:


a_{1,1}a_{1,2}\cdots a_{1,2^M-1}
a_{2,1}a_{2,2}\cdots a_{2,2^M-1}
\vdots
a_{2^N-1,1}a_{2^N-1,2}\cdots a_{2^N-1,2^M-1}


If there are multiple solutions, you can print any of them.

Example

Input

1 2


Output

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

typedef pair<int, int> pii;
typedef long long ll;
template<class T> using V = vector<T>;
template<class T> using VV = V<V<T>>;

#define pb push_back
#define eb emplace_back
#define mp make_pair
#define fi first
#define se second
#define rep(i,n) rep2(i,0,n)
#define rep2(i,m,n) for(int i=m;i<(n);i++)
#define ALL(c) (c).begin(),(c).end()

#ifdef LOCAL
#define dump(x) cerr << __LINE__ << " " << #x << " = " << (x) << endl
#else 
#define dump(x) true
#endif

constexpr ll TEN(int n) { return (n == 0) ? 1 : 10 * TEN(n-1); }

template<class T, class U> void chmin(T& t, const U& u) { if (t > u) t = u; }
template<class T, class U> void chmax(T& t, const U& u) { if (t < u) t = u; }

template<class T, class U>
ostream& operator<<(ostream& os, const pair<T, U>& p) {
	os<<"("<<p.first<<","<<p.second<<")";
	return os;
}

template<class T>
ostream& operator<<(ostream& os, const vector<T>& v) {
	os<<"{";
	rep(i, v.size()) {
		if (i) os<<",";
		os<<v[i];
	}
	os<<"}";
	return os;
}

int H, W;

bool f[1024][1024];
bool xo[10][10];

int calc() {
	rep(i, H) {
		rep(j, W) {
			xo[i+1][j+1] = xo[i+1][j]^xo[i][j+1]^xo[i][j]^f[i][j];
		}
	}

	int s = 0;

	rep(i, H) {
		rep(j, W) {
			rep(k,i+1) {
				rep(l,j+1) {
					if (xo[i+1][j+1]^xo[i+1][l]^xo[k][j+1]^xo[k][l]) {
						++s;
					}
				}
			}
		}
	}
	return s;
}

void out(V<int> vec) {
	for (int mask : vec) {
		cerr<<"Case!"<<endl;
		int now = 0;
		rep(i, H) {
			string t(W, ' ');
			rep(j, W) {
				f[i][j] = (mask >> now) & 1;
				t[j] = '0' + f[i][j];
				now++;
			}
			cout << t << "\n";
		}
	}
}

void solve(int h, int w) {
	int mh = h / 2, mw = w / 2;
	if (h == 1 && w == 1) {
		f[0][0] = 1;
		return ;
	}

	if (h == 1) {
		solve(h, w / 2);
		f[0][mw] = 1;
		for (int j = mw + 1; j < w; ++j) {
			f[0][j] = f[0][w-1-j];
		}
		return ;
	}
	if (w == 1) {
		solve(h / 2, w);

		f[mh][0] = 1;
		for (int i = mh + 1; i < h; ++i) {
			f[i][0] = f[h-1-i][0];
		}
		return ;		
	}
	solve(h / 2, w / 2);

	for (int i = mh + 1; i < h; ++i) {
		rep(j, mw) {
			f[i][j] = f[h-1-i][j];
		}
	}
	rep(i, h) {
		for (int j = mw + 1; j < w; ++j) {
			f[i][j] = f[i][w-1-j];
		}
	}
	f[mh][mw] = 1;
}

int main() {
	int N, M; cin >> N >> M;
	H = (1<<N)-1;
	W = (1<<M)-1;

/*
	int mx = -1;
	V<int> mask;
	rep(b, 1 << (H * W)) {
		int now = 0;
		rep(i, H) {
			rep(j, W) {
				f[i][j] = (b >> now) & 1;
				now++;
			}
		}
		int r = calc();
		if (r > mx) {
			mx = r;
			mask.clear();
			mask.pb(b);
		} else if (r == mx) {
			mask.pb(b);
		}
	}
	out(mask);*/
	solve(H, W);
	int now = 0;

	rep(i, H) {
		string t(W, ' ');
		rep(j, W) {
			t[j] = '0' + f[i][j];
			now++;
		}
		cout << t << "\n";
	}

	return 0;
}