#include<bits/stdc++.h>
using namespace std;
//组合数性质:
//(n,m)=(n-1,m-1)+(n-1,m);
//由题意可知求s(n,m)=sega(i=0-m)(n,i);
//s(n,m)=s(n,m-1)+(n,m);
//s(n,m)=2*s(n-1,m)-(n-1,m);
const int maxn=2e5;
struct query
{
long long l,r,id,pos;
bool operator <(const query &x) const{
if(pos==x.pos)
return r<x.r;
else
return pos<x.pos;
}
}q[maxn];
long long ans[maxn];
long long fac[maxn];//G++ long long
long long f[maxn];
const int MOD=1e9+7;
long long inv[maxn];
long long cal(long long a,long long b) //求组合数
{
if(b>a)
return 0;
return fac[a]*inv[b]%MOD*inv[a-b]%MOD;
}
void init()
{
fac[1]=1;
fac[0]=1;
inv[1]=1;
f[0]=1;
f[1]=1;
inv[0]=1;
for(int i=2; i<maxn-1; i++)
{
fac[i]=fac[i-1]*i%MOD;//阶乘
f[i]=(MOD-MOD/i)*f[MOD%i]%MOD;//逆元
inv[i]=inv[i-1]*f[i]%MOD;//逆元的阶乘
}
}
int main()
{
int t;
scanf("%d",&t);
init();
int siz=sqrt(1e5);
for(int i=1;i<=t;i++)
{
scanf("%lld%lld",&q[i].l,&q[i].r);
q[i].id=i;
q[i].pos=(q[i].l-1)/siz+1;
}
sort(q+1,q+1+t);
long long aans=1;
int l=1,r=0;
for(int i=1;i<=t;i++)
{
while(l<q[i].l)
aans=(long long)2*aans%MOD+MOD-cal(l,r),aans%=MOD,l++;
while(l>q[i].l)
aans+=cal(l-1,r),aans%=MOD,aans*=f[2],aans%=MOD,l--;
while(r<q[i].r)
r++,aans+=cal(l,r),aans%=MOD;
while(r>q[i].r)
aans+=MOD,aans-=cal(l,r),aans%=MOD,r--;
ans[q[i].id]=aans;
}
for(int i=1;i<=t;i++)
printf("%lld\n",ans[i]);
return 0;
}