/*
Though leaves are many , the root is one.
Through all the lying days of my youth
I swayed my leaves and flowers in the sun.
Now I may wither into the truth.
	  	  	- William Butler Yeats
*/
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx")
//#pragma GCC target("avx,tune=native")
#include<bits/stdc++.h>
//#pragma comment("-Wl,--stack=1024000000")
//#include<ext/pb_ds/assoc_container.hpp>
using namespace std;
namespace fastio{
    char in[100000];
    int itr=0,llen=0;
    char get(){
        if(itr==llen)llen=fread(in,1,100000,stdin),itr=0;
        if(llen==0)return EOF;
        return in[itr++];
    }
    char out[100000];
    int itr2=0;
    void put(char c){
        out[itr2++]=c;
        if(itr2==100000){
            fwrite(out,1,100000,stdout);
            itr2=0;
        }
    }
    int clear(){
        fwrite(out,1,itr2,stdout);
        itr2=0;
        return 0;
    }
    int getint(){
        int ret=0;char ch=get();
        if(ch=='-')return -getint();
        while (ch<'0'||ch>'9'){
            ch=get();if(ch=='-')return -getint();
        }
        while ('0'<=ch&&ch<='9'){
            ret=ret*10-48+ch;
            ch=get();
        }
        return ret;
    }
    string getstr(){
        string ret="";
        char ch=get();
        while(ch==' '||ch=='\n')ch=get();
        while(ch!=' '&&ch!='\n')ret.push_back(ch),ch=get();
        return ret;
    }
    void putstr(string s){
        for(int i=0;i<s.size();i++)put(s[i]);
    }
    void putint(int x){
        if(x<0){
            put('-');
            putint(-x);
            return;
        }
        if(x==0){
            put('0');put(' ');
            return;
        }
        char c[40];int pos=0;
        while(x){
            c[pos++]='0'+x%10;
            x/=10;
        }
        for(int i=pos-1;i>=0;i--)put(c[i]);
        put(' ');
    }
    void putln(int x){
        if(x<0){
            put('-');
            putln(-x);
            return;
        }
        if(x==0){
            put('0');put('\n');
            return;
        }
        char c[40];int pos=0;
        while(x){
            c[pos++]='0'+x%10;
            x/=10;
        }
        for(int i=pos-1;i>=0;i--)put(c[i]);
        put('\n');
    }
}
using namespace fastio;
//using namespace __gnu_pbds;
const int inf=0x3f3f3f3f;
const double eps=1e-6;
const int mod=1000000007;
typedef long long ll;
#ifndef LOCAL
#define cerr if(0)cout
#define eprintf(...) 0
#else
#define eprintf(...) fprintf(stderr, __VA_ARGS__)
#endif
inline string getstr(string &s,int l,int r){string ret="";for(int i=l;i<=r;i++)ret.push_back(s[i]);return ret;}
int modpow(int x,int y,int md=mod){int ret=1;do{if(y&1)ret=(ll)ret*x%md;x=(ll)x*x%md;}while(y>>=1);return ret;}
inline int Rand(){return rand()*32768+rand();}
int n,a[200005],b[200005],s[200005];
int C[4005][4005],fact[8888],inv[8888],ind[200005],c[200005],d[200005],pos[4444];
ll sum[6666];
int comb(int nn,int mm){
	return (ll)fact[nn]*inv[mm]%mod*inv[nn-mm]%mod;
}
bool cmp1(int x,int y){
	return a[x]<a[y];
}
int main(){
	fact[0]=1;
	for(int i=1;i<8888;i++)fact[i]=(ll)fact[i-1]*i%mod;
	for(int i=0;i<8888;i++)inv[i]=modpow(fact[i],mod-2);
	n=getint();
//  	n=2e5;
	for(int i=1;i<=n;i++){
//		a[i]=rand()%2000+1;b[i]=rand()%2000+1;
		a[i]=getint();b[i]=getint();
		s[i]=a[i]+b[i];
	}
	C[0][0]=1;
	for(int i=1;i<=4000;i++){
		C[i][0]=C[i][i]=1;
		for(int j=1;j<i;j++){
			C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=-a[i];j<=b[i];j++){
			sum[j+2222]+=C[s[i]][a[i]+j];
		}
	}
	for(int j=-2000;j<=2000;j++){
		sum[j+2222]%=mod;
	}
	/*
	for(int i=1;i<=n;i++)ind[i]=i;
	sort(ind+1,ind+n+1,cmp1);
	for(int i=1;i<=n;i++){
		c[i]=a[ind[i]];
		d[i]=b[ind[i]];
	}
	memcpy(a,c,sizeof a);
	memcpy(b,d,sizeof b);
	int ans=0;
	memset(pos,inf,sizeof pos);
	for(int i=n;i>=1;i--){
		pos[a[i]]=i;
		s[i]=a[i]+b[i];
	}
	for(int i=2000;i>=0;i--)pos[i]=min(pos[i],pos[i+1]);
	for(int delta=-2000;delta<=0;delta++){
      	register ll val=0;
		for(int j=pos[-delta];j<=n;j++){
			val+=C[s[j]][a[j]+delta];
		}
		sum[delta+2222]=val%mod;
	}
	for(int delta=1;delta<=2000;delta++){
      	register ll val=0;
		for(int j=1;j<=n;j++){
			val+=C[s[j]][a[j]+delta];
		}
		sum[delta+2222]=val%mod;
	}*/
	int ans=0;
	for(int i=-2000;i<=2000;i++){
		ans+=(ll)sum[i+2222]*sum[-i+2222]%mod;
		ans%=mod;
	}
	for(int i=1;i<=n;i++){
		ans-=comb(a[i]+a[i]+b[i]+b[i],a[i]+a[i]);
		if(ans<0)ans+=mod;
	}
	ans=((ll)ans*(mod+1)/2)%mod;
	cout<<ans<<endl;
	return 0;
}

Measured memory_bytes: 51420