unittest
{
	assert( [ "3", "1 2 3" ].parse.expand.solve == 6 );
	assert( [ "10", "3 1 4 1 5 9 2 6 5 3" ].parse.expand.solve == 237 );
	assert( [ "10", "3 14 159 2653 58979 323846 2643383 27950288 419716939 9375105820" ].parse.expand.solve == 103715602 );
}



import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	input.popFront;
	auto as = input.front.split.to!( long[] );
	return tuple( as );
}

auto solve( long[] as )
{
	// 累積和代わりの合計を計算、ビットごとに立っている数を集計
	auto t  = 0L;
	auto bs = new long[ 60 ];
	foreach( a; as )
	{
		t = t.addMod( a );
		foreach( i, ref b; bs )
		{
			if( a & ( 1L << i ) ) b++;
		}
	}
	
	// 答えを計算
	auto ans = 0L;
	auto c = as.length.signed;
	foreach( a; as[ 0 .. $ - 1 ] )
	{
		// 累積和の範囲を縮める
		c--;
		t = t.subMod( a );
		foreach( i, ref b; bs )
		{
			if( a & ( 1L << i ) ) b--;
		}
		
		// 累積和を合計に加算
		ans = ans.addMod( t );
		
		// 合計にXORで増減する分を反映
		foreach( i, b; bs )
		{
			if( a & ( 1L << i ) )
			{
				ans = ans.subMod( ( 1L << i ).mulMod( b ) );
				ans = ans.addMod( ( 1L << i ).mulMod( c - b ) );
			}
		}
	}
	return ans;
}

// 足し算
auto addMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	return ( x + y ) % MOD;
}

// 引き算
auto subMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	return ( x + MOD - y ) % MOD;
}

// 掛け算
auto mulMod( long MOD = 10L ^^ 9 + 7 )( long x, long y )
{
	return x * y % MOD;
}
