#include<bits/stdc++.h>const int N=1000000;using namespace std;bool mp[2][N];int cnt=0;
int n;void dfs(int row,int col){cnt=cnt%1000000007;if(col==n && row==2){cnt++;return ;}if(row>=2){ //下一列 dfs(0,col+1);return;}if(mp[row][col]==1){ //下一行 dfs(row+1,col);return ;} //I型木块两种情况,平放和竖放//1.竖放 if(row==0 && mp[row][col]==0 && mp[row+1][col]==0){mp[row][col]=1,mp[row+1][col]=1;dfs(row+2,col); //直接下一列 mp[row][col]=0,mp[row+1][col]=0;}//2.横放if(col+1<=n &&mp[row][col]==0 && mp[row][col+1]==0){mp[row][col]=1 , mp[row][col+1]=1;dfs(row+1,col); mp[row][col]=0 , mp[row][col+1]=0;} //L型木块有四种可能//第一种if(row==0 && col+1<=n && mp[row][col]==0 && mp[row+1][col]==0 && mp[row+1][col+1]==0){mp[row][col]=1 , mp[row+1][col]=1 , mp[row+1][col+1]=1;dfs(row,col+1);mp[row][col]=0 , mp[row+1][col]=0 , mp[row+1][col+1]=0;} //第二种if(row==1 && col+1<=n && mp[row][col]==0 && mp[row][col+1]==0 && mp[row-1][col+1]==0) {mp[row][col]=1 , mp[row][col+1]=1 , mp[row-1][col+1]=1;dfs(row+1,col); //直接下一列 mp[row][col]=0 , mp[row][col+1]=0 , mp[row-1][col+1]=0;}//第三种if(row==0 && col+1<=n && mp[row][col]==0 && mp[row+1][col]==0 && mp[row][col+1]==0){mp[row][col]=1 , mp[row+1][col]=1 , mp[row][col+1]=1;dfs(row+1,col+1);mp[row][col]=0 , mp[row+1][col]=0 , mp[row][col+1]=0;} //第四种if(row==0 && col+1<=n && mp[row][col]==0 && mp[row][col+1]==0 && mp[row+1][col+1]==0){mp[row][col]=1 , mp[row][col+1]=1 , mp[row+1][col+1]=1;dfs(row+1,col);mp[row][col]=0 , mp[row][col+1]=0 , mp[row+1][col+1]=0;}
}int main(){cin>>n;//搜索方式从上到下从左到右 dfs(0,1);cout<<cnt%1000000007<<endl;return 0;
}