#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <cstdio>
using namespace std;
int dp[3010][3010][2];
int main() {
string str;
cin>>str;
if(str[0] !='1') {
dp[0][1][0] = 1;
}
if(str[0] != '0') {
dp[0][1][1] = 1;
}
for(int i = 1; i < str.size(); i++) {
for(int j = 1; j <=str.size(); j++) {
if(str[i] != '1') {
dp[i][j][0] = dp[i-1][j-1][1] + dp[i-1][j][0];
if(dp[i][j][0] >= 1000000007) {
dp[i][j][0] -= 1000000007;
}
}
if(str[i] != '0') {
dp[i][j][1] = dp[i-1][j-1][0] + dp[i-1][j][1];
if(dp[i][j][1] >= 1000000007) {
dp[i][j][1] -= 1000000007;
}
}
//cerr<<dp[i][j][0]<<" "<<dp[i][j][1]<<endl;
}
}
if (str[str.size()-1] =='?') {
for(int i = 1; i <= str.size(); i++) {
cout<<(dp[str.size()-1][i][0] + dp[str.size()-1][i][1]) % 1000000007<<endl;
}
} else {
for(int i = 1; i <= str.size(); i++) {
cout<<dp[str.size()-1][i][str[str.size()-1]-'0']<<endl;
}
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHF1ZXVlPgojaW5jbHVkZSA8c3RhY2s+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxjc3RkaW8+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAppbnQgZHBbMzAxMF1bMzAxMF1bMl07CiAKaW50IG1haW4oKSB7CglzdHJpbmcgc3RyOwoJY2luPj5zdHI7CglpZihzdHJbMF0gIT0nMScpIHsKCQlkcFswXVsxXVswXSA9IDE7Cgl9CglpZihzdHJbMF0gIT0gJzAnKSB7CgkJZHBbMF1bMV1bMV0gPSAxOwoJfQoJZm9yKGludCBpID0gMTsgaSA8IHN0ci5zaXplKCk7IGkrKykgewoJCWZvcihpbnQgaiA9IDE7IGogPD1zdHIuc2l6ZSgpOyBqKyspIHsKCQkJaWYoc3RyW2ldICE9ICcxJykgewoJCQkJZHBbaV1bal1bMF0gPSBkcFtpLTFdW2otMV1bMV0gKyBkcFtpLTFdW2pdWzBdOwoJCQkJaWYoZHBbaV1bal1bMF0gPj0gMTAwMDAwMDAwNykgewoJCQkJCWRwW2ldW2pdWzBdIC09IDEwMDAwMDAwMDc7CgkJCQl9CgkJCX0KCQkJaWYoc3RyW2ldICE9ICcwJykgewoJCQkJZHBbaV1bal1bMV0gPSBkcFtpLTFdW2otMV1bMF0gKyBkcFtpLTFdW2pdWzFdOwoJCQkJaWYoZHBbaV1bal1bMV0gPj0gMTAwMDAwMDAwNykgewoJCQkJCWRwW2ldW2pdWzFdIC09IDEwMDAwMDAwMDc7CgkJCQl9CgkJCX0KCQkJLy9jZXJyPDxkcFtpXVtqXVswXTw8IiAiPDxkcFtpXVtqXVsxXTw8ZW5kbDsKCQl9Cgl9CglpZiAoc3RyW3N0ci5zaXplKCktMV0gPT0nPycpIHsKCQlmb3IoaW50IGkgPSAxOyBpIDw9IHN0ci5zaXplKCk7IGkrKykgewoJCQljb3V0PDwoZHBbc3RyLnNpemUoKS0xXVtpXVswXSArIGRwW3N0ci5zaXplKCktMV1baV1bMV0pICUgMTAwMDAwMDAwNzw8ZW5kbDsKCQl9Cgl9IGVsc2UgewoJCWZvcihpbnQgaSA9IDE7IGkgPD0gc3RyLnNpemUoKTsgaSsrKSB7CgkJCWNvdXQ8PGRwW3N0ci5zaXplKCktMV1baV1bc3RyW3N0ci5zaXplKCktMV0tJzAnXTw8ZW5kbDsKCQl9Cgl9CiAKfQog