#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool Up(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
inline bool Down(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
inline int getus() {
  int tmp, c;
  while (tmp = fgetc(stdin), tmp < '0' || tmp > '9')
    ;
  tmp -= '0';
  while (c = fgetc(stdin), '0' <= c && c <= '9') tmp = tmp * 10 + c - '0';
  return tmp;
}
inline int getint() {
  int tmp, c, flag;
  while (flag = fgetc(stdin), flag != '-' && (flag < '0' || flag > '9'))
    ;
  if (flag == '-')
    tmp = 0;
  else
    tmp = flag - '0';
  while (c = fgetc(stdin), '0' <= c && c <= '9') tmp = tmp * 10 + c - '0';
  return flag == '-' ? -tmp : tmp;
}
int N, M;
struct pSum {
  int s[163][163];
  void init(int a[][163]) {
    memset(s, 0, sizeof(s));
    for (int i = (1); i <= (M); ++i)
      for (int j = (1); j <= (M); ++j) {
        long long t = a[i][j];
        t += s[i][j - 1] + s[i - 1][j];
        t += 1000000007 - s[i - 1][j - 1];
        s[i][j] = t % 1000000007;
      }
  }
  int sum(int x0, int x1, int y0, int y1) const {
    if (x0 > x1 || y0 > y1) return 0;
    long long t = s[x1][y1];
    t += 1000000007 - s[x0 - 1][y1];
    t += 1000000007 - s[x1][y0 - 1];
    t += s[x0 - 1][y0 - 1];
    return t % 1000000007;
  }
} sII, sDD, sID, sDI;
int II[163][163], DD[163][163], ID[163][163], DI[163][163];
int main() {
  memset(&sII, 0, sizeof(pSum));
  memset(&sDD, 0, sizeof(pSum));
  memset(&sID, 0, sizeof(pSum));
  memset(&sDI, 0, sizeof(pSum));
  memset(II, 0, sizeof(II));
  memset(DD, 0, sizeof(DD));
  memset(ID, 0, sizeof(ID));
  memset(DI, 0, sizeof(DI));
  int ans = 0;
  scanf("%d %d", &N, &M);
  for (int i = (1); i <= (N); ++i) {
    for (int L = (1); L <= (M); ++L)
      for (int R = (L); R <= (M); ++R) {
        {
          int &x = II[L][R] = sII.sum(L, R, L, R) + 1;
          if (x >= 1000000007) x -= 1000000007;
          ans += x;
          if (ans >= 1000000007) ans -= 1000000007;
        }
        {
          int &x = ID[L][R] = sII.sum(L, R, R + 1, M);
          x += sID.sum(L, R, R, M);
          if (x >= 1000000007) x -= 1000000007;
          ans += x;
          if (ans >= 1000000007) ans -= 1000000007;
        }
        {
          int &x = DI[L][R] = sDI.sum(1, L, L, R);
          x += sII.sum(1, L - 1, L, R);
          if (x >= 1000000007) x -= 1000000007;
          ans += x;
          if (ans >= 1000000007) ans -= 1000000007;
        }
        {
          int &x = DD[L][R] = sII.sum(1, L - 1, R + 1, M);
          x += sID.sum(1, L - 1, R, M);
          if (x >= 1000000007) x -= 1000000007;
          x += sDI.sum(1, L, R + 1, M);
          if (x >= 1000000007) x -= 1000000007;
          x += sDD.sum(1, L, R, M);
          if (x >= 1000000007) x -= 1000000007;
          ans += x;
          if (ans >= 1000000007) ans -= 1000000007;
        }
      }
    sII.init(II);
    sDD.init(DD);
    sID.init(ID);
    sDI.init(DI);
  }
  printf("%d\n", ans);
  return 0;
}
