#include <bits/stdc++.h>
using namespace std;
template <class T>
int getBit(T x, int k) {
  return x >> k & 1;
}
template <class T>
T onBit(T x, int k) {
  return x(T(1) << k);
}
template <class T>
T offBit(T x, int k) {
  return x & (~(T(1) << k));
}
const int MOD = 1e9 + 7;
struct matrix {
  int m, n;
  long long a[1 << 8][1 << 8];
  matrix() {}
  matrix(int m, int n) : m(m), n(n) {
    for (int i = 0; i < m; ++i)
      for (int j = 0; j < n; ++j) a[i][j] = 0;
  }
  matrix operator*(const matrix &p) {
    matrix e;
    e.m = this->m;
    e.n = p.n;
    for (int i = 0; i < e.m; ++i)
      for (int j = 0; j < e.n; ++j) {
        e.a[i][j] = 0;
        for (int k = 0; k < p.m; ++k)
          e.a[i][j] = (e.a[i][j] + this->a[i][k] * p.a[k][j]) % MOD;
      }
    return e;
  }
  matrix operator^(int k) {
    matrix p = *this, e = p;
    for (int i = 0; i < e.m; ++i)
      for (int j = 0; j < e.n; ++j) e.a[i][j] = i == j;
    while (k) {
      if (k & 1) e = e * p;
      p = p * p;
      k >>= 1;
    }
    return e;
  }
} a, b;
matrix get_matrix(int n) {
  matrix A(1 << n, 1 << n);
  for (int i = 0; i < 1 << n; ++i)
    for (int j = 0; j < 1 << n; ++j)
      for (int k2 = 0; k2 < 1 << (n - 1); ++k2) {
        int k = k2 * 2 + 1 + (1 << n);
        if ((i & j & k & (k >> 1)) != 0) continue;
        A.a[i][j]++;
      }
  return A;
}
long long dp[1 << 7], dp2[1 << 7];
vector<pair<int, int> > v;
void load() {
  for (int i = 0; i < 7; ++i) {
    int w;
    scanf("%d", &w);
    if (w) v.push_back(make_pair(i + 1, w));
  }
}
void process() {
  int from = v[0].first, to = v.back().first;
  dp[(1 << from) - 1] = 1;
  for (int i = 0; i < (int)v.size(); ++i) {
    int n = v[i].first;
    b = get_matrix(n);
    a = b ^ (v[i].second);
    for (int j = 0; j < 1 << n; ++j) dp2[j] = 0;
    for (int j = 0; j < 1 << n; ++j)
      for (int k = 0; k < 1 << n; ++k)
        dp2[k] = (dp2[k] + dp[j] * a.a[j][k]) % MOD;
    if (i != (int)v.size() - 1) {
      int mask = 0;
      for (int j = v[i].first; j <= v[i + 1].first - 1; ++j) mask |= 1 << j;
      for (int j = 0; j < 1 << 7; ++j) dp[j] = 0;
      for (int j = 0; j < 1 << n; ++j) dp[j | mask] = dp2[j];
    }
  }
  printf("%lld\n", dp2[(1 << to) - 1]);
}
int main() {
  load();
  process();
  return 0;
}
