Problem: Let's define the transformation P of a sequence of integers a1, a2, ..., an as b1, b2, ..., bn, where bi = a1 | a2 | ... | ai for all i = 1, 2, ..., n, where | is the bitwise OR operation.

Vasya consequently applies the transformation P to all sequences of length n consisting of integers from 1 to 2k - 1 inclusive. He wants to know how many of these sequences have such property that their transformation is a strictly increasing sequence. Help him to calculate this number modulo 109 + 7.

Input

The only line of the input contains two integers n and k (1 ≤ n ≤ 1018, 1 ≤ k ≤ 30 000).

Output

Print a single integer — the answer to the problem modulo 109 + 7.

Examples

Input

1 2


Output

3


Input

2 3


Output

30


Input

3 3


Output

48

Solution (in CPP):

Solution:
#include<stdio.h>
#include<bits/stdc++.h>
#define db double
#define ll long long
#define maxn 1048577
#define mod 1000000007
using namespace std;
int ksm(int a,int b)
{
	int s=1;
	for(;b;b>>=1,a=1ll*a*a%mod)
		if(b&1) s=1ll*s*a%mod;
	return s;
}
complex<db> omega[maxn],iomega[maxn];
const db PI=acos((long double)-1.0);
void Init(int x)
{
	int len=1; while(len<=x) len<<=1;
	for(int i=0;i<len;i++)
	{
		omega[i]=complex<db>(cos(i*PI/len),sin(i*PI/len));
		iomega[i]=complex<db>(cos(i*PI/len),-sin(i*PI/len));
	}
}
void FFT(complex<db> *A,int n,int ty)
{
	complex<db> t0,t1;
	for(int i=0,j=0;i<n;i++)
	{
		if(i<j) swap(A[i],A[j]);
		for(int k=(n>>1);(j^=k)<k;k>>=1);
	}
	for(int m=1;m<n;m<<=1)
	{
		for(int k=0;k<n;k+=(m<<1))
		{
			for(int i=k;i<k+m;i++)
			{
				t0=A[i],t1=(ty==1?omega:iomega)[n/m*(i-k)]*A[i+m];
				A[i]=t0+t1,A[i+m]=t0-t1;
			}
		}
	}
	if(ty==1) return;
	for(int i=0;i<n;i++) A[i]/=n;
}
const int K=32000;
void ArbitraryMul(int n,int m,int *a,int *b,int *ans,int p)
{
	static complex<db> A[maxn],B[maxn],C[maxn],D[maxn],a0[maxn],a1[maxn],a2[maxn];
	for(int i=0;i<=n;i++) B[i]=a[i]%K,A[i]=a[i]/K;
	for(int i=0;i<=m;i++) D[i]=b[i]%K,C[i]=b[i]/K;
	int N=1; while(N<=n+m) N<<=1;
	for(int i=n+1;i<N;i++) B[i]=A[i]=0;
	for(int i=m+1;i<N;i++) D[i]=C[i]=0;
	FFT(A,N,1),FFT(B,N,1),FFT(C,N,1),FFT(D,N,1);
	for(int i=0;i<N;i++)
	{
		a2[i]=A[i]*C[i];
		a1[i]=A[i]*D[i]+B[i]*C[i];
		a0[i]=B[i]*D[i];
	}
	FFT(a2,N,-1),FFT(a1,N,-1),FFT(a0,N,-1);
	for(int i=0;i<=n+m;i++)
	{
		ll x2=floor(a2[i].real()+0.5),x1=floor(a1[i].real()+0.5),x0=floor(a0[i].real()+0.5);
		x2%=p,x1%=p,x0%=p;
		ans[i]=(x2*K%p*K%p+x1*K%p+x0)%p;
	}
}
ll n; int k;
void PolySolve(int n,int m,int *a,int *b,int *res)
{
	static int t0[maxn],t1[maxn];
	int p2=ksm(2,m);
	for(int i=0,nw=1;i<=k;i++) t1[i]=1ll*nw*a[i]%mod,nw=1ll*nw*p2%mod,t0[i]=b[i];
	ArbitraryMul(k,k,t0,t1,t0,mod);
	for(int i=0;i<=k;i++) res[i]=t0[i];
	for(int i=k+1;i<=2*k;i++) t0[i]=0;
}
int fac[maxn],inv[maxn];
int C(int n,int m){return 1ll*fac[n]%mod*inv[m]%mod*inv[n-m]%mod;}
void Pre()
{
	Init(2*k),fac[0]=1;
	for(int i=1;i<maxn;i++) fac[i]=1ll*fac[i-1]*i%mod;
	inv[maxn-1]=ksm(fac[maxn-1],mod-2);
	for(int i=maxn-2;i>=0;i--) inv[i]=1ll*inv[i+1]*(i+1)%mod;
}
int A[maxn],B[maxn];
int main()
{
	scanf("%lld%d",&n,&k),Pre(); 
	if(n>k) return puts("0"),0;
	A[0]=1;
	for(int i=1;i<=k;i++) B[i]=inv[i];
	for(int nw=1,ndeg=0;n;n>>=1,PolySolve(nw,nw,B,B,B),nw<<=1)
		if(n&1) PolySolve(ndeg,nw,A,B,A),ndeg+=nw;
	int sum=0;
	for(int i=n;i<=k;i++) sum=(sum+1ll*A[i]*fac[i]%mod*C(k,i)%mod)%mod;
	printf("%d\n",sum);
	return 0;
}