#include <bits/stdc++.h>
using namespace std;
string s;
int n;
int dp[1000005][5];
const long long mood = 1000000007;
long long func(int pos, int zadnji) {
  if (pos >= n) {
    if (zadnji == 2 || zadnji == 0)
      return 1;
    else
      return 0;
  }
  if (dp[pos][zadnji] != -1) return dp[pos][zadnji];
  int ret = 0;
  if (s[pos] != '?') {
    if (zadnji == 0) {
      if (s[pos] == '*') return dp[pos][zadnji] = 0;
      if (s[pos] == '0') return dp[pos][zadnji] = func(pos + 1, 0);
      if (s[pos] == '1') return dp[pos][zadnji] = func(pos + 1, 1);
      if (s[pos] == '2') return dp[pos][zadnji] = 0;
    }
    if (zadnji == 1) {
      if (s[pos] == '*') return dp[pos][zadnji] = func(pos + 1, 2);
      if (s[pos] == '0') return dp[pos][zadnji] = 0;
      if (s[pos] == '1') return dp[pos][zadnji] = 0;
      if (s[pos] == '2') return dp[pos][zadnji] = 0;
    }
    if (zadnji == 2) {
      if (s[pos] == '*') return dp[pos][zadnji] = func(pos + 1, 2);
      if (s[pos] == '0') return dp[pos][zadnji] = 0;
      if (s[pos] == '1') return dp[pos][zadnji] = func(pos + 1, 0);
      if (s[pos] == '2') return dp[pos][zadnji] = func(pos + 1, 1);
    }
    if (zadnji == 3) {
      if (s[pos] == '*') return dp[pos][zadnji] = func(pos + 1, 2);
      if (s[pos] == '0') return dp[pos][zadnji] = func(pos + 1, 0);
      if (s[pos] == '1') return dp[pos][zadnji] = func(pos + 1, 1);
      if (s[pos] == '2') return dp[pos][zadnji] = 0;
    }
  }
  if (zadnji == 0) {
    ret += func(pos + 1, 0);
    ret %= mood;
    ret += func(pos + 1, 1);
    ret %= mood;
  } else if (zadnji == 1) {
    ret += func(pos + 1, 2);
    ret %= mood;
  } else {
    ret += func(pos + 1, 2);
    ret %= mood;
    ret += func(pos + 1, 0);
    ret %= mood;
    ret += func(pos + 1, 1);
    ret %= mood;
  }
  return dp[pos][zadnji] = ret;
}
int main() {
  cin >> s;
  n = s.size();
  memset(dp, -1, sizeof dp);
  int res = func(0, 3);
  cout << res;
  return 0;
}
