#include <iostream>
#include <utility>
using namespace std;
const int MOD = 1000000007;
struct Seq {
long long len{0}, ns{0}, sL{0}, sR{0}, ans{0};
pair<long long, char> p1{-1, 0}, p2{-1, 0};
};
Seq concat(const Seq &A, const Seq &B) {
Seq S;
S.len = (A.len + B.len) % MOD;
S.ns = (A.ns + B.ns) % MOD;
S.p1 = A.p1.first >= 0 ? A.p1 : make_pair((B.p1.first + A.len) % MOD, B.p1.second);
S.p2 = B.p2.first >= 0 ? make_pair((B.p2.first + A.len) % MOD, B.p2.second) : A.p2;
S.sL = (A.sL + B.sL + B.ns*A.len) % MOD;
S.sR = (A.sR + B.sR + A.ns*B.len) % MOD;
S.ans = (A.ans + B.ans + A.sL*B.len + B.sR*A.len) % MOD;
// Check if there's a new switch.
if (A.p2.first >= 0 && B.p1.first >= 0 && A.p2.second != B.p1.second) {
S.ns++;
long long vL = A.p2.first + 1, vR = (B.len - B.p1.first + MOD) % MOD;
S.sL = (S.sL + vL) % MOD;
S.sR = (S.sR + vR) % MOD;
S.ans = (S.ans + vL*vR) % MOD;
}
return S;
}
int K;
string U;
int solve() {
cin >> K >> U;
Seq S;
for (int i = 0; i < K; i++) {
Seq S2;
if (U[i] == '.') {
S2 = S;
} else {
S2.len = 1;
if (U[i] != 'F') {
S2.p1 = S2.p2 = make_pair(0, U[i]);
}
}
S = concat(S, S2);
}
return S.ans;
}
int main() {
int T;
cin >> T;
for (int t = 1; t <= T; t++) {
cout << "Case #" << t << ": " << solve() << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBNT0QgPSAxMDAwMDAwMDA3OwoKc3RydWN0IFNlcSB7CiAgbG9uZyBsb25nIGxlbnswfSwgbnN7MH0sIHNMezB9LCBzUnswfSwgYW5zezB9OwogIHBhaXI8bG9uZyBsb25nLCBjaGFyPiBwMXstMSwgMH0sIHAyey0xLCAwfTsKfTsKClNlcSBjb25jYXQoY29uc3QgU2VxICZBLCBjb25zdCBTZXEgJkIpIHsKICBTZXEgUzsKICBTLmxlbiA9IChBLmxlbiArIEIubGVuKSAlIE1PRDsKICBTLm5zID0gKEEubnMgKyBCLm5zKSAlIE1PRDsKICBTLnAxID0gQS5wMS5maXJzdCA+PSAwID8gQS5wMSA6IG1ha2VfcGFpcigoQi5wMS5maXJzdCArIEEubGVuKSAlIE1PRCwgQi5wMS5zZWNvbmQpOwogIFMucDIgPSBCLnAyLmZpcnN0ID49IDAgPyBtYWtlX3BhaXIoKEIucDIuZmlyc3QgKyBBLmxlbikgJSBNT0QsIEIucDIuc2Vjb25kKSA6IEEucDI7CiAgUy5zTCA9IChBLnNMICsgQi5zTCArIEIubnMqQS5sZW4pICUgTU9EOwogIFMuc1IgPSAoQS5zUiArIEIuc1IgKyBBLm5zKkIubGVuKSAlIE1PRDsKICBTLmFucyA9IChBLmFucyArIEIuYW5zICsgQS5zTCpCLmxlbiArIEIuc1IqQS5sZW4pICUgTU9EOwogIC8vIENoZWNrIGlmIHRoZXJlJ3MgYSBuZXcgc3dpdGNoLgogIGlmIChBLnAyLmZpcnN0ID49IDAgJiYgQi5wMS5maXJzdCA+PSAwICYmIEEucDIuc2Vjb25kICE9IEIucDEuc2Vjb25kKSB7CiAgICBTLm5zKys7CiAgICBsb25nIGxvbmcgdkwgPSBBLnAyLmZpcnN0ICsgMSwgdlIgPSAoQi5sZW4gLSBCLnAxLmZpcnN0ICsgTU9EKSAlIE1PRDsKICAgIFMuc0wgPSAoUy5zTCArIHZMKSAlIE1PRDsKICAgIFMuc1IgPSAoUy5zUiArIHZSKSAlIE1PRDsKICAgIFMuYW5zID0gKFMuYW5zICsgdkwqdlIpICUgTU9EOwogIH0KICByZXR1cm4gUzsKfQoKaW50IEs7CnN0cmluZyBVOwoKaW50IHNvbHZlKCkgewogIGNpbiA+PiBLID4+IFU7CiAgU2VxIFM7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBLOyBpKyspIHsKICAgIFNlcSBTMjsKICAgIGlmIChVW2ldID09ICcuJykgewogICAgICBTMiA9IFM7CiAgICB9IGVsc2UgewogICAgICBTMi5sZW4gPSAxOwogICAgICBpZiAoVVtpXSAhPSAnRicpIHsKICAgICAgICBTMi5wMSA9IFMyLnAyID0gbWFrZV9wYWlyKDAsIFVbaV0pOwogICAgICB9CiAgICB9CiAgICBTID0gY29uY2F0KFMsIFMyKTsKICB9CiAgcmV0dXJuIFMuYW5zOwp9CgppbnQgbWFpbigpIHsKICBpbnQgVDsKICBjaW4gPj4gVDsKICBmb3IgKGludCB0ID0gMTsgdCA8PSBUOyB0KyspIHsKICAgIGNvdXQgPDwgIkNhc2UgIyIgPDwgdCA8PCAiOiAiIDw8IHNvbHZlKCkgPDwgZW5kbDsKICB9CiAgcmV0dXJuIDA7Cn0=