#include <bits/stdc++.h>
using namespace std;
const long long MM = 1e9 + 7;
const int N = 160;
int n, m;
long long F[4][N][N], S[4][N][N];
long long mod(long long x) { return (x + MM) % MM; }
void add(long long &a, long long b) { a = mod(a + b); }
void prepare_pref(long long f[N][N], long long s[N][N]) {
  for (int i = 1; i <= m; i++)
    for (int j = 1; j <= m; j++)
      s[i][j] = mod(s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + f[i][j]);
}
long long sum(long long s[N][N], int x1, int x2, int y1, int y2) {
  if (x1 > x2 || y1 > y2) return 0;
  return mod(s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1]);
}
void prepare_row(void) {
  for (int k = 0; k < 4; k++) prepare_pref(F[k], S[k]);
}
void DP(void) {
  for (int i = 1; i <= m; i++)
    for (int j = i; j <= m; j++) {
      F[0][i][j] = 1;
      add(F[0][i][j], sum(S[0], i, j, i, j));
      F[1][i][j] = 0;
      add(F[1][i][j], sum(S[0], 1, i - 1, i, j));
      add(F[1][i][j], sum(S[1], 1, i, i, j));
      F[2][i][j] = 0;
      add(F[2][i][j], sum(S[0], i, j, j + 1, m));
      add(F[2][i][j], sum(S[2], i, j, j, m));
      F[3][i][j] = 0;
      add(F[3][i][j], sum(S[0], 1, i - 1, j + 1, m));
      add(F[3][i][j], sum(S[1], 1, i, j + 1, m));
      add(F[3][i][j], sum(S[2], 1, i - 1, j, m));
      add(F[3][i][j], sum(S[3], 1, i, j, m));
    }
}
int main() {
  scanf("%d%d", &n, &m);
  long long ans = 0;
  for (int i = 1; i <= n; i++) {
    DP();
    prepare_row();
    for (int k = 0; k < 4; k++) add(ans, S[k][m][m]);
  }
  printf("%d\n", (int)ans);
  return 0;
}
