rt
#include<bits/stdc++.h>
using namespace std;
#define int long long
int dp[10000100][5][2],n,cnt,ans;
char a[10000100];
int mod=1000000007;
inline bool isdigitt(char k){return (k>='0'&&k<='9');}
inline bool islowerr(char k){return (k>='a'&&k<='z');}
signed main()
{
scanf("%s",&a);
n=strlen(a);
for(int i=n-1;i>=0;--i)a[i+1]=a[i];
dp[0][1][0]=1;
for(int i=1;i<=n;++i)
{
cnt=0;
if(a[i]=='?')cnt=36;
else cnt=1;
dp[i][1][0]=(dp[i-1][1][0]+dp[i-1][3][0]+dp[i-1][4][0])*cnt%mod;
dp[i][1][1]=(dp[i-1][1][1]+dp[i-1][2][1])*cnt%mod;
cnt=0;
if(i>=3&&a[i-1]=='?')
{
cnt=0;
if(a[i]=='?'&&a[i-2]=='?')cnt=13*25+5*9;
else if(isdigitt(a[i-2])&&a[i]=='?')cnt='9'-a[i-2];
else if(isdigitt(a[i])&&a[i-2]=='?')cnt=a[i]-'0';
else if(islowerr(a[i-2])&&a[i]=='?')cnt='z'-a[i-2];
else if(islowerr(a[i])&&a[i-2]=='?')cnt=a[i]-'a';
else if((isdigitt(a[i])&&isdigitt(a[i-2])&&a[i]>a[i-2])
||(islowerr(a[i])&&islowerr(a[i])&&a[i]>a[i-2]))cnt=1;
}
dp[i][1][1]=(dp[i][1][1]+(dp[i-3][1][1]+dp[i-3][2][1])*cnt)%mod;
if(a[i]=='?')
{
dp[i][2][1]=(dp[i-1][1][0]+dp[i-1][4][0]+dp[i-1][3][0])%mod;
dp[i][3][0]=dp[i-1][1][1]%mod;
dp[i][4][0]=dp[i-1][3][0]*2%mod;
}
}
ans=(dp[n][1][0]+dp[n][3][0]+dp[n][4][0])%mod;
printf("%lld",ans);
return 0;
}