#include <cstdio>
#include <cstring>

const int mod = 1e9 + 7;
const int MAXN = 3e5 + 5;

template<typename _T>
void read( _T &x )
{
	x = 0;char s = getchar();int f = 1;
	while( s > '9' || s < '0' ){if( s == '-' ) f = -1; s = getchar();}
	while( s >= '0' && s <= '9' ){x = ( x << 3 ) + ( x << 1 ) + ( s - '0' ), s = getchar();}
	x *= f;
}

template<typename _T>
void write( _T x )
{
	if( x < 0 ){ putchar( '-' ); x = ( ~ x ) + 1; }
	if( 9 < x ){ write( x / 10 ); }
	putchar( x % 10 + '0' );
}

template<typename _T>
_T MIN( const _T a, const _T b )
{
	return a < b ? a : b;
}

int f[MAXN][3][3];
char S[MAXN];
int N;

int add( int &x, const int y ) { return x = ( x + y >= mod ? x + y - mod : x + y ); }

int main()
{
	scanf( "%s", S + 1 );
	f[0][0][0] = 1, N = strlen( S + 1 );
	for( int i = 0 ; i < N ; i ++ )
		for( int j = 0 ; j < 3 ; j ++ )
			for( int k = 0 ; k < 3 ; k ++ )
				if( f[i][j][k] )
				{
					if( S[i + 1] ^ '1' ) add( f[i + 1][j][k == 2 ? 1 : k + 1], f[i][j][k] );
					if( S[i + 1] ^ '0' ) 
					{
						if( k ) add( f[i + 1][j][k - 1], f[i][j][k] );
						else add( f[i + 1][MIN( j + 1, 2 )][k], f[i][j][k] );
					}
				}
	write( add( f[N][1][0], add( f[N][2][0], add( f[N][2][1], f[N][2][2] ) ) ) ), putchar( '\n' );
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N=300005,M=1e9+7;
char s[N];
int t[8][2],f[N][8];
int main(){
	t[0][0]=2;t[0][1]=1;t[1][0]=3;t[1][1]=5;
	t[2][0]=4;t[2][1]=7;t[3][0]=6;t[3][1]=1;
	t[4][0]=2;t[4][1]=2;t[5][0]=5;t[5][1]=5;
	t[6][0]=3;t[6][1]=3;t[7][0]=2;t[7][1]=1;
	scanf("%s",s);
	int n=strlen(s);
	f[n][1]=1;
	f[n][5]=1;
	for (int i=n-1;i>=0;i--)
		for (int j=0;j<8;j++){
			if (s[i]!='1')f[i][j]+=f[i+1][t[j][0]];
			if (s[i]!='0')f[i][j]+=f[i+1][t[j][1]];
			f[i][j]%=M;
		}
	printf("%d\n",f[0][0]);
}