#include <bits/stdc++.h>
using namespace std;
const int MOD = 1'000'000'007;
int addmod(int a, int b) {
int s = a + b;
if (s >= MOD) s -= MOD;
return s;
}
int submod(int a, int b) {
int s = a - b;
if (s < 0) s += MOD;
return s;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
if (!(cin >> n >> m)) return 0;
vector<string> g(n + 1);
for (int i = 1; i <= n; ++i) {
string s; cin >> s;
g[i] = " " + s; // 1‑based
}
if (n == 1 && m == 1) { // only the start cell
cout << 1 << '\n';
return 0;
}
/* rowRocks[i][j] = number of rocks in row i strictly to the right of column j
colRocks[i][j] = number of rocks in column j strictly below row i */
vector<vector<int>> rowRocks(n + 2, vector<int>(m + 2, 0));
vector<vector<int>> colRocks(n + 2, vector<int>(m + 2, 0));
for (int i = 1; i <= n; ++i) {
int cnt = 0;
for (int j = m; j >= 1; --j) {
rowRocks[i][j] = cnt;
if (g[i][j] == 'R') ++cnt;
}
}
for (int j = 1; j <= m; ++j) {
int cnt = 0;
for (int i = n; i >= 1; --i) {
colRocks[i][j] = cnt;
if (g[i][j] == 'R') ++cnt;
}
}
/* difference tables for range additions */
vector<vector<int>> diffR(n + 2, vector<int>(m + 2, 0));
vector<vector<int>> diffD(n + 2, vector<int>(m + 2, 0));
// virtual start state
int startRight = m - rowRocks[1][1];
if (startRight >= 2) {
diffR[1][2] = addmod(diffR[1][2], 1);
diffR[1][startRight + 1] = submod(diffR[1][startRight + 1], 1);
}
int startDown = n - colRocks[1][1];
if (startDown >= 2) {
diffD[2][1] = addmod(diffD[2][1], 1);
diffD[startDown + 1][1] = submod(diffD[startDown + 1][1], 1);
}
vector<int> dpDPrev(m + 2, 0), dpDCur(m + 2, 0);
int dpR_last = 0; // dpR[n][m]
for (int i = 1; i <= n; ++i) {
/* column prefix sum → dpD[i][*] */
for (int j = 1; j <= m; ++j) {
int val = dpDPrev[j] + diffD[i][j];
if (val >= MOD) val -= MOD;
dpDCur[j] = val;
}
int curR = 0; // row prefix sum → dpR[i][j]
for (int j = 1; j <= m; ++j) {
curR += diffR[i][j];
if (curR >= MOD) curR -= MOD;
if (curR < 0) curR += MOD; // safety, should not happen
/* transition from a horizontal state → vertical segment */
if (curR) {
int maxRow = n - colRocks[i][j]; // downLimit
if (maxRow >= i + 1) {
diffD[i + 1][j] = addmod(diffD[i + 1][j], curR);
diffD[maxRow + 1][j] = submod(diffD[maxRow + 1][j], curR);
}
}
/* transition from a vertical state → horizontal segment */
int valD = dpDCur[j];
if (valD) {
int maxCol = m - rowRocks[i][j]; // rightLimit
if (maxCol >= j + 1) {
diffR[i][j + 1] = addmod(diffR[i][j + 1], valD);
diffR[i][maxCol + 1] = submod(diffR[i][maxCol + 1], valD);
}
}
if (i == n && j == m) dpR_last = curR;
}
dpDPrev.swap(dpDCur); // next row
}
int answer = addmod(dpR_last, dpDPrev[m]); // dpD[n][m] is in dpDPrev[m]
cout << answer << '\n';
return 0;
}