#include <bits/stdc++.h>
using namespace std;
const int maxi = 7;
const long long mod = 1e9 + 7;
int transitions(int mask1, int mask2, int l) {
  int ans = 0;
  for (int m = 0; m < (1 << (l + 1)); m++) {
    if (!(m & 1) || !(m & (1 << l))) continue;
    bool bad = false;
    for (int i = 0; i < l; i++) {
      if ((mask1 & (1 << i)) && (mask2 & (1 << i)) && (m & (1 << i)) &&
          (m & (1 << (i + 1)))) {
        bad = true;
        break;
      }
    }
    ans += !bad;
  }
  return ans;
}
vector<vector<int> > mul(vector<vector<int> >& m1, vector<vector<int> >& m2) {
  long long bigmod = mod * mod;
  int n = m1.size();
  vector<vector<int> > res(n, vector<int>(n, 0));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      long long num = 0;
      for (int k = 0; k < n; k++) {
        num += m1[i][k] * 1ll * m2[k][j];
        if (num >= bigmod) num -= bigmod;
      }
      res[i][j] = num % mod;
    }
  }
  return res;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  vector<int> w(maxi + 1);
  for (int i = 1; i <= maxi; i++) cin >> w[i];
  vector<vector<int> > res((1 << maxi), vector<int>((1 << maxi), 0));
  for (int i = 0; i < (1 << maxi); i++) res[i][i] = 1;
  int last = -1;
  for (int i = maxi; i >= 1; i--) {
    if (w[i]) {
      vector<vector<int> > nw((1 << maxi), vector<int>((1 << maxi), 0));
      int mask = 0;
      for (int j = maxi - 1; j >= i; j--) mask |= (1 << j);
      for (int m1 = 0; m1 < (1 << maxi); m1++) {
        if ((m1 & mask) != mask) continue;
        for (int m2 = 0; m2 < (1 << maxi); m2++) {
          if ((m2 & mask) != mask) continue;
          nw[m1][m2] = transitions(m1, m2, i);
        }
      }
      for (; w[i]; w[i] >>= 1, nw = mul(nw, nw)) {
        if (w[i] & 1) res = mul(res, nw);
      }
    }
  }
  cout << res[(1 << maxi) - 1][(1 << maxi) - 1] << "\n";
  return 0;
}
