#include <bits/stdc++.h>
using namespace std;
long long mod = 1000000007;
string s;
long long dp[1000001][7];
long long f(int idx, int la = 6) {
  if (idx == s.size()) {
    if (la == 2) return 0;
    if (la == 1) return 0;
    return 1;
  }
  if (dp[idx][la] != -1) return dp[idx][la];
  long long res = 0;
  if (s[idx] != '?') {
    char c = s[idx];
    if (la == 0) {
      if (c == '0')
        res = f(idx + 1, 0);
      else if (c == '1')
        res = f(idx + 1, 1);
    } else if (la == 1) {
      if (c == '*') res = f(idx + 1, 4);
    } else if (la == 2) {
      if (c == '*') res = f(idx + 1, 4);
    } else if (la == 3) {
      if (c == '0')
        res = f(idx + 1, 0);
      else if (c == '1')
        res = f(idx + 1, 1);
    } else if (la == 4) {
      if (c == '2')
        res = f(idx + 1, 2);
      else if (c == '1')
        res = f(idx + 1, 3);
      else if (c == '*')
        res = f(idx + 1, 4);
    } else {
      if (c == '1') res = f(idx + 1, 1);
      if (c == '0') res = f(idx + 1, 0);
      if (c == '*') res = f(idx + 1, 4);
    }
  } else if (la == 0) {
    res += f(idx + 1, 0);
    res %= mod;
    res += f(idx + 1, 1);
    res %= mod;
  } else if (la == 1 || la == 2) {
    res = f(idx + 1, 4);
  } else if (la == 3) {
    res += f(idx + 1, 0);
    res %= mod;
    res += f(idx + 1, 1);
    res %= mod;
  } else if (la == 4) {
    res = f(idx + 1, 2);
    res %= mod;
    res += f(idx + 1, 3);
    res %= mod;
    res += f(idx + 1, 4);
    res %= mod;
  } else {
    res += f(idx + 1, 0);
    res %= mod;
    res += f(idx + 1, 1);
    res %= mod;
    res += f(idx + 1, 4);
    res %= mod;
  }
  return dp[idx][la] = res;
}
int main() {
  memset(dp, -1, sizeof dp);
  ios::sync_with_stdio(false);
  cin >> s;
  cout << f(0);
}
