You are given two integers n and m. Calculate the number of pairs of arrays (a, b) such that:

  * the length of both arrays is equal to m; 
  * each element of each array is an integer between 1 and n (inclusive); 
  * a_i ≤ b_i for any index i from 1 to m; 
  * array a is sorted in non-descending order; 
  * array b is sorted in non-ascending order. 



As the result can be very large, you should print it modulo 10^9+7.

Input

The only line contains two integers n and m (1 ≤ n ≤ 1000, 1 ≤ m ≤ 10).

Output

Print one integer – the number of arrays a and b satisfying the conditions described above modulo 10^9+7.

Examples

Input


2 2


Output


5


Input


10 1


Output


55


Input


723 9


Output


157557417

Note

In the first test there are 5 suitable arrays: 

  * a = [1, 1], b = [2, 2]; 
  * a = [1, 2], b = [2, 2]; 
  * a = [2, 2], b = [2, 2]; 
  * a = [1, 1], b = [2, 1]; 
  * a = [1, 1], b = [1, 1]. 
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int, int>;
template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " +
         to_string(get<2>(p)) + ")";
}
string to_string(const string& s) { return '"' + s + '"'; }
string to_string(bool b) { return (b ? "true" : "false"); }
string to_string(char c) { return to_string(string(1, c)); }
template <typename A>
string to_string(A v) {
  bool first = true;
  string res = "{";
  for (const auto& a : v) {
    if (!first) res += ", ";
    first = false;
    res += to_string(a);
  }
  res += "}";
  return res;
}
void debug_out() { cerr << endl; }
template <typename A, typename... B>
void debug_out(A a, B... b) {
  cerr << to_string(a);
  if (sizeof...(b)) cerr << ", ";
  debug_out(b...);
}
const int N = 1005;
const int M = 15;
int dp[M][N];
const int MOD = 1e9 + 7;
int n, m;
int solve(int pos, int delta) {
  assert(delta >= 0);
  if (pos == m) return 1;
  if (dp[pos][delta] != -1) return dp[pos][delta];
  int ans = 0;
  for (int i = 0; i <= delta; i++) {
    ans += ((i + 1) * 1LL * solve(pos + 1, delta - i)) % MOD;
    if (ans >= MOD) ans -= MOD;
  }
  return dp[pos][delta] = ans;
}
int main() {
  cin.tie(0);
  cin.exceptions(cin.failbit);
  ios_base::sync_with_stdio(0);
  for (int i = 0; i < M; i++)
    for (int j = 0; j < N; j++) dp[i][j] = -1;
  cin >> n >> m;
  int ans = 0;
  for (int a = 1; a <= n; a++) {
    for (int b = a; b <= n; b++) {
      int cans = solve(1, b - a);
      ans += cans;
      if (ans >= MOD) ans -= MOD;
    }
  }
  cout << ans << '\n';
}
