#include<bits/stdc++.h>
#define int long long
#define f1(i, n) for(int i=1;i<=n;++i)
#define all(x) x.begin(), x.end()
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define endl "\n"
using namespace std;
const int maxn = 1e5 + 5;
const int MOD = 1e9 + 7;
int dp1[1005], dp2[1005][2], dp3[1005];
int m, n;
// dp1: từ chùa Thiên Trù đến Động Hương Tích
// dp2: từ Động Hương Tích xuống lưng chừng núi Lão
// dp3: từ lưng chừng núi Lão lên chùa Thiên Trù
// dp3[i][j] = số cách đi đến bậc thứ i mà còn j lần nhảy 3 bước
// ans = dp1[m+n] * dp2[]
void solve(int m, int n) {
// Kích thước tối đa cần tính
int max_steps = max(m, n);
// ---- Tính dp1, dp3, và dp2[...][1] (vì dp3 và dp2[...][1] giống hệt nhau) ----
dp1[0] = 1; dp1[1] = 1; dp1[2] = 2; dp1[3] = 4;
dp3[0] = 1; dp3[1] = 1; dp3[2] = 2;
for (int i = 3; i <= max_steps; ++i) {
// dp1 (bước 1, 2, 3)
if (i <= max_steps) // Chỉ tính dp1 nếu cần
dp1[i] = (dp1[i - 1] + dp1[i - 2] + dp1[i - 3]) % MOD;
}
for (int i = 2; i <= max_steps; ++i) {
// dp3 (bước 1, 2)
if (i <= max_steps) // Chỉ tính dp3 nếu cần
dp3[i] = (dp3[i - 1] + dp3[i - 2]) % MOD;
}
// ---- Tính dp2[...][0] (Phần 2: N bậc, {1, 2} + 1x{3}) ----
// dp2[i][1] (chưa dùng bước 3) chính là dp3[i]
// dp2[i][0] (đã dùng 1 bước 3)
// Khởi tạo mảng dp2
for (int i = 0; i <= n; ++i) {
dp2[i][0] = 0;
dp2[i][1] = dp3[i]; // Tận dụng dp3 đã tính
}
// Cơ sở: dp2[0][1] = 1, dp2[0][0] = 0 (đã được gán từ dp3[0])
for (int i = 1; i <= n; ++i) {
// 1. Tính dp2[i][1] (đã được tính ở trên)
// 2. Tính dp2[i][0] (đã dùng 1 bước 3)
// a) Bước 1 từ (i-1) (vốn đã dùng bước 3)
if (i - 1 >= 0) dp2[i][0] = (dp2[i][0] + dp2[i - 1][0]) % MOD;
// b) Bước 2 từ (i-2) (vốn đã dùng bước 3)
if (i - 2 >= 0) dp2[i][0] = (dp2[i][0] + dp2[i - 2][0]) % MOD;
// c) Bước 3 từ (i-3) (vốn CHƯA dùng bước 3) -> dùng bước 3 tại đây
if (i - 3 >= 0) dp2[i][0] = (dp2[i][0] + dp2[i - 3][1]) % MOD;
}
// ---- Phần 3: 1 -> m (bước 1, 2) ----
// Đã được tính trong dp3[m]
// ---- Tính kết quả ----
// res1 = (Phần 1a: M bậc, {1,2,3}) * (Phần 1b: N bậc, {1,2,3})
int res1 = (dp1[m] * dp1[n]) % MOD;
// res2 = (Phần 2: N bậc, {1,2} + 1x{3})
int res2 = dp2[n][0];
// res3 = (Phần 3: M bậc, {1,2})
int res3 = dp3[m];
// Nhân và mod cẩn thận
int ans = (res1 * res2) % MOD;
ans = (ans * res3) % MOD;
cout << ans << endl;
}
main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
// freopen("ATRISET.INP", "r", stdin);
// freopen("ATRISET.OUT", "w", stdout);
while (cin >> m >> n) {
solve(m, n);
}
}