#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
string s;
long long ans;
long long mem[N][5];
int n;
long long dp(int i, int last) {
  if (i == n) {
    if (last == 2 || last == 4) return 0;
    return 1;
  }
  if (mem[i][last] != -1) return mem[i][last];
  long long p = 0;
  if (last == 0) {
    if (s[i] == '2' || s[i] == '*') return 0;
    if (s[i] == '1')
      p += dp(i + 1, 4);
    else if (s[i] == '0')
      p += dp(i + 1, 0);
    else {
      p += dp(i + 1, 4);
      p += dp(i + 1, 0);
    }
  } else if (last == 1) {
    if (s[i] == '2' || s[i] == '*') return 0;
    if (s[i] == '1')
      p += dp(i + 1, 4);
    else if (s[i] == '0')
      p += dp(i + 1, 0);
    else {
      p += dp(i + 1, 4);
      p += dp(i + 1, 0);
    }
  } else if (last == 4) {
    if (s[i] == '*' || s[i] == '?')
      p += dp(i + 1, 3);
    else
      return 0;
  } else if (last == 3) {
    if (s[i] == '0')
      return 0;
    else if (s[i] == '*')
      p += dp(i + 1, 3);
    else if (s[i] == '1')
      p += dp(i + 1, 1);
    else if (s[i] == '2')
      p += dp(i + 1, 2);
    else {
      p += dp(i + 1, 3);
      p += dp(i + 1, 1);
      p += dp(i + 1, 2);
    }
  } else {
    if (s[i] == '*' || s[i] == '?')
      p += dp(i + 1, 3);
    else
      return 0;
  }
  return mem[i][last] = p % 1000000007;
}
int main() {
  cin >> s;
  n = s.length();
  memset(mem, -1, sizeof mem);
  if (s[0] == '?') {
    ans += dp(1, 0);
    ans += dp(1, 4);
    ans += dp(1, 3);
  } else {
    if (s[0] == '1')
      ans += dp(1, 4);
    else if (s[0] == '0')
      ans += dp(1, 0);
    else if (s[0] == '*')
      ans += dp(1, 3);
    else
      ans = 0;
  }
  cout << ans % 1000000007;
}
