#include<cstdio>#include<cctype>#include<algorithm>#include<cstring>#define rg registertypedeflonglong LL;
template <typename T>inline T max(const T a,const T b){return a>b?a:b;}
template <typename T>inline T min(const T a,const T b){return a<b?a:b;}
template <typename T>inlinevoidmind(T&a,const T b){a=a<b?a:b;}
template <typename T>inlinevoidmaxd(T&a,const T b){a=a>b?a:b;}
template <typename T>inline T abs(const T a){return a>0?a:-a;}
template <typename T>inlinevoidswap(T&a,T&b){T c=a;a=b;b=c;}
template <typename T>inline T gcd(const T a,const T b){if(!b)return a;returngcd(b,a%b);}
template <typename T>inline T lcm(const T a,const T b){return a/gcd(a,b)*b;}
template <typename T>inline T square(const T x){return x*x;};
template <typename T>inlinevoidread(T&x){char cu=getchar();x=0;bool fla=0;while(!isdigit(cu)){if(cu=='-')fla=1;cu=getchar();}while(isdigit(cu))x=x*10+cu-'0',cu=getchar();if(fla)x=-x;}
template <typename T>voidprinte(const T x){if(x>=10)printe(x/10);putchar(x%10+'0');}
template <typename T>inlinevoidprint(const T x){if(x<0)putchar('-'),printe(-x);elseprinte(x);}constint maxn=500003,maxm=1000003;int n,Stack[maxn],Top;
LL x[maxn],l[maxn],r[maxn];int head[maxn],nxt[maxm],tow[maxm],tmp;int belo[maxn],n_d,MIN[maxn],MAX[maxn];int stack[maxn],top;inlinevoidaddb(constint u,constint v){tmp++;nxt[tmp]=head[u];head[u]=tmp;tow[tmp]=v;}int tot,DFN[maxn],LOW[maxn];int beg;inlinevoidpush(constint x){stack[++top]=x;}inlineintpop(){return stack[top--];}voidDFS(int u){DFN[u]=LOW[u]=++tot;push(u);for(rg int i=head[u];i;i=nxt[i]){constint v=tow[i];if(!DFN[v])DFS(v),mind(LOW[u],LOW[v]);elseif(belo[v]==0)mind(LOW[u],DFN[v]);}if(LOW[u]==DFN[u]){n_d++;int cl=pop();MIN[n_d]=cl,MAX[n_d]=cl,belo[cl]=n_d;while(cl!=u)cl=pop(),mind(MIN[n_d],cl),maxd(MAX[n_d],cl),belo[cl]=n_d;}}int head_d[maxn],nxt_d[maxm],tow_d[maxm],tmp_d;inlinevoidaddb_d(constint u,constint v){if(u==v)return;tmp_d++;nxt_d[tmp_d]=head_d[u];head_d[u]=tmp_d;tow_d[tmp_d]=v;}int dp[maxn];int mini[maxn],maxi[maxn];voiddraw(){for(rg int i=1;i<=n;i++)for(rg int j=head[i];j;j=nxt[j])addb_d(belo[i],belo[tow[j]]);}const LL mod=1000000007;
LL res;LL ans[maxn];voidcalc(constint u){dp[u]=0;mini[u]=MIN[u],maxi[u]=MAX[u];for(rg int i=head_d[u];i;i=nxt_d[i]){constint v=tow_d[i];if(dp[v]==-1)calc(v);mind(mini[u],mini[v]),maxd(maxi[u],maxi[v]);}ans[u]=maxi[u]-mini[u]+1;}intmain(){read(n);for(rg int i=1;i<=n;i++)read(x[i]),read(r[i]);for(rg int i=1;i<=n;i++){l[i]=std::lower_bound(x+1,x+n+1,x[i]-r[i])-x;r[i]=std::upper_bound(x+1,x+n+1,x[i]+r[i])-x-1;}for(rg int i=1;i<=n;i++){while(Top&&r[Stack[Top]]<i)Top--;if(Top)addb(Stack[Top],i);Stack[++Top]=i;}Top=0;for(rg int i=n;i>=1;i--){while(Top&&l[Stack[Top]]>i)Top--;if(Top)addb(Stack[Top],i);Stack[++Top]=i;}for(beg=1;beg<=n;beg++)if(!DFN[beg])DFS(beg);draw();memset(dp,-1,sizeof(dp));for(rg int i=1;i<=n_d;i++)if(dp[i]==-1)calc(i);for(rg int i=1;i<=n;i++)res=(res+(LL)i*ans[belo[i]])%mod;print(res);return0;}