#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
int a[8];
int U, ans[128], A[128][128];
inline bool bit(int s, int p) { return (s >> p) & 1; }
inline bool check(int p, int s1, int s2, int s3) {
  s3 <<= 1;
  s3 |= 1;
  s3 |= 1 << p;
  for (int i = 0; i < p; ++i)
    if (bit(s1, i) && bit(s2, i) && bit(s3, i) && bit(s3, i + 1)) return 0;
  return 1;
}
inline void add(int &x, int v) {
  x += v;
  if (x >= mod) x -= mod;
}
int tmp[128][128];
inline void mul(int a[][128], int b[][128]) {
  memset(tmp, 0, sizeof(tmp));
  for (int i = 0; i < U; ++i)
    for (int j = 0; j < U; ++j)
      for (int k = 0; k < U; ++k) add(tmp[i][j], 1LL * a[i][k] * b[k][j] % mod);
  memcpy(a, tmp, sizeof(tmp));
}
int res[128][128];
inline void Pow(int a[][128], int p) {
  memset(res, 0, sizeof(res));
  for (int i = 0; i < U; ++i) res[i][i] = 1;
  while (p) {
    if (p & 1) mul(res, a);
    p >>= 1;
    mul(a, a);
  }
  memcpy(a, res, sizeof(res));
}
int t[128];
void solve(int p) {
  memset(A, 0, sizeof(A));
  U = 1 << p;
  for (int i = 0; i < U; ++i)
    for (int j = 0; j < U; ++j)
      for (int k = (1 << (p - 1)) - 1; k >= 0; --k)
        A[j][i] += check(p, i, j, k);
  Pow(A, a[p]);
  for (int i = 0; i < U; ++i) {
    t[i] = 0;
    for (int j = 0; j < U; ++j) add(t[i], 1LL * A[i][j] * ans[j] % mod);
  }
  memcpy(ans, t, sizeof(t));
  for (int i = p + 1; i <= 7; ++i)
    if (a[i]) {
      memset(t, 0, sizeof(t));
      int add = (1 << i) - 1 - ((1 << p) - 1);
      for (int j = 127 - add; j >= 0; --j) t[j + add] = ans[j];
      memcpy(ans, t, sizeof(t));
      solve(i);
      break;
    }
}
int main() {
  for (int i = 1; i <= 7; ++i) scanf("%d", a + i);
  for (int i = 1; i <= 7; ++i)
    if (a[i]) {
      ans[(1 << i) - 1] = 1;
      solve(i);
      break;
    }
  for (int i = 7; i >= 1; --i)
    if (a[i]) {
      printf("%d\n", ans[(1 << i) - 1]);
      break;
    }
  return 0;
}
