#include <cstdio>
#include <map>

struct fiver
{
	int a[5];
	int& operator[] (const int &ind) { return a[ind]; }
	int operator< (const fiver &b) const
	{
		for (int i = 0; i < 5; ++i)
		{
			if (a[i] < b.a[i]) return 1;
			if (a[i] > b.a[i]) return 0;
		}
		return 0;
	}
};

std::map <fiver, int> memo;

const int mod=1000000007;

int calc (fiver nums)
{
	//printf ("calc (%d, %d, %d, %d, %d)\n", nums[0], nums[1], nums[2], nums[3], nums[4]);
	if (nums[0] == 0 && nums[1] == 0 && nums[2] == 0 && nums[3] == 0 && nums[4] == 0)	return 1;
	std :: map <fiver, int> :: iterator mfi;
	if ((mfi = memo.find (nums)) != memo.end ()) { return mfi -> second; }
	int res = 0;
	int a, b;
	fiver t;
	for (a = 0; a < 5; ++a)
	{
		b = a + 1; if (b == 5) b = 0;
		if (nums[a] == 0 || nums[b] == 0) continue;
		//Rum
		t = nums; t[a] /= 2; t[b] /= 2;
		res += calc (t);
		if (res > mod) res -= mod;
		//Baileys
		if ( (nums[a] & 1) != 0 && (nums[b] & 1) != 0)
		{
			t = nums; --t[a]; --t[b];
			res += calc(t);
			if (res > mod) res -= mod;
		}
	}
	memo[nums] = res;
	return res;
}

int main ()
{
	fiver x;
	scanf ("%d%d%d%d%d", x.a, x.a+1, x.a+2, x.a+3, x.a+4);
	printf ("%d\n", calc (x));
	return 0;
}
