#include <bits/stdc++.h>
#define ll long long
#define el cout << '\n'
using namespace std;
const int maxn = 5e2;
const int MOD = 1e9 +7;
int n;
string s;
ll dp[maxn + 10][maxn + 10], C[maxn + 10][maxn + 10];
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
if (fopen("EMPTY_STRING.INP", "r"))
{
freopen("EMPTY_STRING.INP", "r", stdin);
freopen("EMPTY_STRING.OUT", "w", stdout);
}
cin >> s;
n = s.size();
s = ' ' + s;
for (int i = 0; i <= n + 1; i++)
{
C[0][i] = 1;
dp[i][i - 1] = 1;
}
for (int j = 1; j <= n; j++)
for (int i = 1; i <= n; i++)
C[i][j] = (C[i][j - 1] + C[i - 1][j - 1]) % MOD;
for (int i = n; i >= 1; i--)
for (int j = i; j <= n; j++)
{
int len = j - i + 1;
if (len & 1) continue;
for (int k = i; k <= j; k++)
{
int lenik = k - i + 1;
if (lenik & 1) continue;
if (s[i] == s[k])
{
dp[i][j] += C[lenik/2][len/2] * dp[i + 1][k - 1] % MOD * dp[k + 1][j];
dp[i][j] %= MOD;
}
}
}
cout << dp[1][n];
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiAKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBlbCBjb3V0IDw8ICdcbicKIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCmNvbnN0IGludCBtYXhuID0gNWUyOwpjb25zdCBpbnQgTU9EID0gMWU5ICs3OwogCmludCBuOwpzdHJpbmcgczsKbGwgZHBbbWF4biArIDEwXVttYXhuICsgMTBdLCBDW21heG4gKyAxMF1bbWF4biArIDEwXTsKIAppbnQgbWFpbigpCnsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogICAgaWYgKGZvcGVuKCJFTVBUWV9TVFJJTkcuSU5QIiwgInIiKSkKICAgIHsKICAgICAgICBmcmVvcGVuKCJFTVBUWV9TVFJJTkcuSU5QIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbigiRU1QVFlfU1RSSU5HLk9VVCIsICJ3Iiwgc3Rkb3V0KTsKICAgIH0KIAogICAgY2luID4+IHM7CiAgICBuID0gcy5zaXplKCk7CiAgICBzID0gJyAnICsgczsKICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IG4gKyAxOyBpKyspCiAgICB7CiAgICAgICAgQ1swXVtpXSA9IDE7CiAgICAgICAgZHBbaV1baSAtIDFdID0gMTsKICAgIH0KICAgIGZvciAoaW50IGogPSAxOyBqIDw9IG47IGorKykKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspCiAgICAgICAgICAgIENbaV1bal0gPSAoQ1tpXVtqIC0gMV0gKyBDW2kgLSAxXVtqIC0gMV0pICUgTU9EOwogICAgZm9yIChpbnQgaSA9IG47IGkgPj0gMTsgaS0tKQogICAgICAgIGZvciAoaW50IGogPSBpOyBqIDw9IG47IGorKykKICAgICAgICB7CiAgICAgICAgICAgIGludCBsZW4gPSBqIC0gaSArIDE7CiAgICAgICAgICAgIGlmIChsZW4gJiAxKSBjb250aW51ZTsKICAgICAgICAgICAgZm9yIChpbnQgayA9IGk7IGsgPD0gajsgaysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgbGVuaWsgPSBrIC0gaSArIDE7CiAgICAgICAgICAgICAgICBpZiAobGVuaWsgJiAxKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIGlmIChzW2ldID09IHNba10pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZHBbaV1bal0gKz0gQ1tsZW5pay8yXVtsZW4vMl0gKiBkcFtpICsgMV1bayAtIDFdICUgTU9EICogZHBbayArIDFdW2pdOwogICAgICAgICAgICAgICAgICAgIGRwW2ldW2pdICU9IE1PRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIGNvdXQgPDwgZHBbMV1bbl07Cn0K