#include <bits/stdc++.h>
#define lowbit(x) (x & (-x))
using namespace std;
const int P = 1e9 + 7;
int x, y, p, ans, pro[1 << 6][1 << 6], check[1 << 6][1 << 6], f[601][1 << 6][1 << 6], g[601][1 << 6][1 << 6];
inline int count(int x) {
int sum = 0;
while (x) {
++sum;
x -= lowbit(x);
}
return sum;
}
inline bool Ch1(int k1, int k2, bool I) {
int T = (~(((k1 >> 1) & k1) >> 1)), K;
K = (T & k2);
if ((k1 >> 2) & K)
return 0;
T = (~(((k1 << 1) & k1) << 1)) ;
K = (T & k2);
if ((k1 << 2) & K)
return 0;
if (I)
return 1;
else
return 1 & Ch1(k2, k1, 1);
}
inline bool Ch2(int k1, int k2, int k3, bool I) {
int T = (~((k1 & k2) >> 1)), K;
K = (T & k3);
if ((k1 >> 1) & K)
return 0;
T = (~((k1 & k2) << 1));
K = (T & k3);
if ((k1 << 1) & K)
return 0;
if (I)
return 1;
else
return 1 & Ch2(k3, k2, k1, 1);
}
int main() {
scanf("%d%d", &x, &y);
p = x * y;
for (int i = 0; i < 1 << y; i++)
for (int j = 0; j < 1 << y; j++)
g[count(i) + count(j)][i][j] = 1;
for (int i = 2; i <= x; i++) {
for (int j = 0; j < 1 << y; j++)
for (int k = 0; k < 1 << y; k++)
if(!(((j & (~(j >> 1))) & (k >> 2)) || ((j & (~(j << 1))) & (k << 2)) || (((k & (~(k >> 1))) & (j >> 2)))||((k & (~(k << 1))) & (j << 2))))
for (int l = 0; l < 1 << y; l++)
if (!(((j & (~k)) & (l >> 1)) || ((j & (~k)) & (l << 1)) || ((l & (~k)) & (j >> 1)) || ((l & (~k)) & (j << 1))))
for (int u = count(j); u <= p; u++)
f[u][j][k] = (f[u][j][k] % P + g[u - count(j)][k][l] % P) % P;
memcpy(f, g, p);
memset(f, 0, sizeof(f));
for (int i = 0; i < 1 << y; i++)
for(int j = 0; j < 1 << y; j++)
for(int k = count(i) + count(j); k <= p; k++)
ans = (ans + max(g[k][i][j], f[k][i][j])) % P;
}
printf("%d\n", ans);
return 0;
}