#include <bits/stdc++.h>
using namespace std;
typedef long long llong;
#define rep(i, n) for (int i = 0; i < n; ++i)
char gf[1200][1200];
int main()
{
    int n;
    scanf("%d", &n);
    if (n < 3)
        printf("-1");
    else if (n == 3)
        printf("z..\nz..\n.zz");
    else if (n == 7)
        printf("a..bbaa\na...abb\n.az.a..\n.az..a.\n..azza.\nbba...a\naabb..a");
    else
    {
        int rn = n;
        if (n & 1)
            rn -= 5;
        for (int i = 0; i < rn; i += 2)
            gf[i][i] = gf[i + 1][i] = 'a',
            gf[i][i + 1] = gf[i + 1][i + 1] = 'b';
        for (int i = 2; i < rn; i += 2)
            gf[i][i - 2] = gf[i][i - 1] = 'c',
            gf[i + 1][i - 2] = gf[i + 1][i - 1] = 'd';
        gf[0][rn - 2] = gf[0][rn - 1] = 'c';
        gf[1][rn - 2] = gf[1][rn - 1] = 'd';
        if (n & 1)
            strcpy(&gf[rn][rn], "aabba"),
            strcpy(&gf[rn + 1][rn], "bz..a"),
            strcpy(&gf[rn + 2][rn], "bz..b"),
            strcpy(&gf[rn + 3][rn], "a.zzb"),
            strcpy(&gf[rn + 4][rn], "abbaa");
        for (int i = 0; i < n; ++i)
        {
            for (int j = 0; j < n; ++j)
                if (gf[i][j])
                    printf("%c", gf[i][j]);
                else
                    printf(".");
            printf("\n");
        }
    }
    return 0;
}
#include <bits/stdc++.h>
#define uint unsigned long long
#define ll long long
#define db long double
#define ls rt << 1
#define rs rt << 1 | 1
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define X first
#define Y second
#define pcc pair<char, char>
#define vi totor<int>
#define vl totor<ll>
#define rep(i, x, y) for(register int i = x; i <= y; i ++)
#define rrep(i, x, y) for(register int i = x; i >= y; i --)
#define eps 1e-15
#define lb(x) x & -x
#define sz(x) (x).size()
using namespace std;
inline int read()
{
	int x = 0, f = 1; char ch = getchar();
	while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
	while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
	return x * f;
}
inline ll read1()
{
	ll x = 0, f = 1; char ch = getchar();
	while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
	while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
	return x * f;
}
const int mod = 1e9 + 7;
char ch[300010];
int n;
ll k, dp[300010][5][3];
int main()
{
	scanf("%s", ch);
	n = strlen(ch);
	dp[0][2][0] = 1;
	rep(i, 0, n - 1)
	{
        if (ch[i] != '0')
        {
            (dp[i + 1][4][1] += dp[i][4][1]) %= mod;
            (dp[i + 1][4][1] += dp[i][3][1]) %= mod;
            (dp[i + 1][3][1] += dp[i][2][0]) %= mod;
            (dp[i + 1][3][1] += dp[i][2][1]) %= mod;
            (dp[i + 1][2][0] += dp[i][1][0]) %= mod;
            (dp[i + 1][2][1] += dp[i][1][1]) %= mod;
            (dp[i + 1][1][0] += dp[i][0][0]) %= mod;
        }
        if (ch[i] != '1')
        {
            (dp[i + 1][4][1] += dp[i][4][1]) %= mod;
            (dp[i + 1][2][1] += dp[i][3][1]) %= mod;
            (dp[i + 1][1][0] += dp[i][2][0]) %= mod;
            (dp[i + 1][1][1] += dp[i][2][1]) %= mod;
            (dp[i + 1][0][0] += dp[i][1][0]) %= mod;
            (dp[i + 1][2][1] += dp[i][1][1]) %= mod;
            (dp[i + 1][1][0] += dp[i][0][0]) %= mod;
        }
    }
    cout << (dp[n][3][1] + dp[n][4][1]) % mod << endl;
    return 0;
}
