Greg has a pad. The pad's screen is an n × m rectangle, each cell can be either black or white. We'll consider the pad rows to be numbered with integers from 1 to n from top to bottom. Similarly, the pad's columns are numbered with integers from 1 to m from left to right.

Greg thinks that the pad's screen displays a cave if the following conditions hold:

  * There is a segment [l, r] (1 ≤ l ≤ r ≤ n), such that each of the rows l, l + 1, ..., r has exactly two black cells and all other rows have only white cells. 
  * There is a row number t (l ≤ t ≤ r), such that for all pairs of rows with numbers i and j (l ≤ i ≤ j ≤ t) the set of columns between the black cells in row i (with the columns where is these black cells) is the subset of the set of columns between the black cells in row j (with the columns where is these black cells). Similarly, for all pairs of rows with numbers i and j (t ≤ i ≤ j ≤ r) the set of columns between the black cells in row j (with the columns where is these black cells) is the subset of the set of columns between the black cells in row i (with the columns where is these black cells). 



Greg wondered, how many ways there are to paint a cave on his pad. Two ways can be considered distinct if there is a cell that has distinct colors on the two pictures.

Help Greg.

Input

The first line contains two integers n, m — the pad's screen size (1 ≤ n, m ≤ 2000).

Output

In the single line print the remainder after dividing the answer to the problem by 1000000007 (109 + 7).

Examples

Input

1 1


Output

0


Input

4 4


Output

485


Input

3 5


Output

451
/* 2013-07-26 11:30:09.777584 */#include<cstdio>
using namespace std;

const int N = 2010;

typedef long long LL;
const LL MOD = 1e9 + 7;

LL dp[N][N], sp[N][N], pp[N][N], qp[N][N], qq[N][N], ss[N][N];
int n, m;

void F(LL &a) {
	if (a >= MOD) a %= MOD;
	while (a < 0) a += MOD;
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 2; i <= m; i++) dp[0][i] = 1;
	for (int nn = 1; nn <= n; nn++) {
		if (nn == 1) {
			for (int i = 2; i <= m; i++)
				dp[nn][i] = 1;
		}
		for (int i = 2; i <= m; i++) {
			dp[nn][i] += sp[nn - 1][i] * (i + 1) - pp[nn - 1][i];
//		for (int j = 2; j <  i; j++)
//			dp[nn][i] += dp[nn-1][j] * (i - j + 1);
			F(dp[nn][i]);
		}
		for (int i = 2; i <= m; i++) {
			sp[nn][i] = sp[nn][i - 1] + dp[nn][i];
			pp[nn][i] = pp[nn][i - 1] + dp[nn][i] * i;
			qp[nn][i] = sp[nn][i - 1] * (i + 1) - pp[nn][i - 1];
			F(sp[nn][i]); F(pp[nn][i]); F(qp[nn][i]);
			ss[nn][i] = ss[nn - 1][i] + qp[nn][i];
			qq[nn][i] = qq[nn - 1][i] + qp[nn][i] * nn;
			F(ss[nn][i]); F(qq[nn][i]);
		}
	}
	LL ans = 0;
	for (int h = 1; h <= n - 1; h++)
	for (int l = 2; l <= m; l++) {
		LL tmp = ss[n - h][l] * (n - h + 1) - qq[n - h][l];
		F(tmp);
		ans += dp[h][l] * tmp % MOD * (m - l + 1);
//		ans += dp[h][l] * (m - l + 1) % MOD * ((ss[n - h][l] * (n - h + 1) - qq[n - h][l]) % MOD);
		F(ans);
//		if(0)
//		for (int d = 1; d <= n - h; d++)
//		{
//			ans += dp[h][l] * qp[d][l] % MOD * (m - l + 1) * (n - d - h + 1);
//			F(ans);
//		}
	}

	for (int H = 1; H <= n; H++)
	for (int l = 2; l <= m; l++) {
		ans += dp[H][l] * (m - l + 1) * (n - H + 1);
		F(ans);
	}
	printf("%d\n", (int)ans);
}
