import java.util.Scanner;
/**
* @author supermejane
* @date 2025/10/12
* @description BGN86 牛妹的位运算
*/
//注释里面异或和指数都是用的符号 ^
public class Main {
//1.题目意思解析,首先对于a ^ b > a & b(假设a > b)肯定是看最高位的1,如果a, b最高位1相同a ^ b < a & b, 否则a的最高位1在b前面a ^ b > a & b
//所以就是对于每个b(i), 求对应的最高位1前于b的a(j > i)有多少个然后求和%1e9+7
//那么怎么求呢?可以看出2 ^ 0, 2 ^ 1, 2 ^ 2,......, 2 ^ n之间依次左移,所以可以得出为(2 ^ (k + 1) - 2 ^ k)* (2 ^ n - 2 ^ (k + 1)),化简之后
//(2 ^ k) * (2 ^ n - 2 ^ (k + 1))注意k属于0 ~ n - 2求和,同时还要加上对于0元素的额外处理(0不属于2 ^ x, x为自然数)
//2.题目意思理解完之后还有一个问题就是2 ^ 1e5太大了,没办法直接计算,由于是计算%1e9+7的结果,中间需要提前处理
//(a * b) % base = (a % base + b % base) % base
//(a - b) % base = (tmp = a % base - b % base) > 0 ? tmp : tmp + base
//上面两步a = x * base + a % base, 可以试着推一下
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//区间为[0, 2 ^ n)
int n = in.nextInt();
//mods[i]表示2 ^ i % base的结果
long base = (long) 1e9 + 7;
long[] mods = new long[n + 5];
for (int i = 0; i <= n; i++) {
mods[i] = i > 0 ? (2 * mods[i - 1]) % base : 1;
}
long result = 0, tmp;
//计算0 ~ n - 2部分
for (int i = 0; i <= n - 2; i++) {
result += (mods[i] * ((tmp = mods[n] - mods[i + 1]) > 0 ? tmp : base + tmp)) % base;
}
//对于b = 0额外处理
result += mods[n] - 1 > 0 ? mods[n] - 1 : base + mods[n] - 1;
System.out.println(result % base);
}
}