#include <bits/stdc++.h>
using namespace std;
const int inf = ~0U >> 1;
const long long INF = ~0ULL >> 1;
template <class T>
inline void read(T &n) {
  char c;
  for (c = getchar(); !(c >= '0' && c <= '9'); c = getchar())
    ;
  n = c - '0';
  for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) n = n * 10 + c - '0';
}
int Pow(int base, int n, int mo) {
  if (n == 0) return 1;
  if (n == 1) return base % mo;
  int tmp = Pow(base, n >> 1, mo);
  tmp = (long long)tmp * tmp % mo;
  if (n & 1) tmp = (long long)tmp * base % mo;
  return tmp;
}
const int mo = 1000000007;
int ans, tmp[130][130], w[10], f[130], lside[10], rside[10], bottom[10];
struct matrix {
  int a[130][130];
  inline void reset() { memset(a, 0, sizeof(a)); }
  inline void operator*=(const matrix &with) {
    memset(tmp, 0, sizeof(tmp));
    for (int i = (0); i <= (127); ++i)
      for (int j = (0); j <= (127); ++j) {
        long long t = 0;
        for (int k = (0); k <= (127); ++k) {
          t += (long long)a[i][k] * with.a[k][j];
          if (k % 10 == 0) t %= mo;
        }
        tmp[i][j] = t % mo;
      }
    memcpy(a, tmp, sizeof(a));
  }
} cur, trans;
inline matrix Pow(const matrix &base, int n) {
  if (n == 1) return base;
  matrix t = Pow(base, n >> 1);
  t *= t;
  if (n & 1) t *= base;
  return t;
}
inline void upd(int &x, int y) {
  x += y;
  if (x >= mo) x -= mo;
}
int main() {
  for (int k = (1); k <= (7); ++k) scanf("%d", &w[k]);
  int last = 0;
  f[0] = 1;
  for (int H = (1); H <= (7); ++H) {
    if (!w[H]) continue;
    cur.reset();
    trans.reset();
    for (int i = (0); i <= (127); ++i) {
      int tmp = i;
      for (int j = (last + 1); j <= (H); ++j) tmp |= 1 << j - 1;
      upd(cur.a[1][tmp], f[i]);
    }
    for (int state = (0); state < (1 << H); ++state) {
      for (int k = (1); k <= (7); ++k) lside[k] = (1 << k - 1) & state;
      for (int j = (0); j < (1 << H); ++j)
        for (int i = (0); i < (1 << H); ++i) {
          int flag = 1;
          for (int k = (1); k <= (7); ++k) bottom[k] = (1 << k - 1) & i;
          if (!bottom[1]) continue;
          bottom[H + 1] = 1;
          for (int k = (1); k <= (7); ++k)
            if (bottom[k] && ((1 << k - 1) & j) && bottom[k + 1] && lside[k]) {
              flag = 0;
              break;
            }
          if (!flag) continue;
          upd(trans.a[state][j], 1);
        }
    }
    trans = Pow(trans, w[H]);
    cur *= trans;
    for (int i = (0); i <= (127); ++i) f[i] = cur.a[1][i];
    last = H;
  }
  int state = 0;
  for (int k = (1); k <= (last); ++k) state |= 1 << k - 1;
  printf("%d\n", f[state]);
  return 0;
}
