#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define FOR(i,l,r) for(int i=(l);i<=(r);i++)
using namespace std;
const int MOD=1000000007;
const int rounds=251;

int n,t;
int q[1001],x[1001],sub[1001];

int tn;
int lb[1002];
int sum[250001],dp[250001][251]; int cnt;
inline void check(int &f) { f>=MOD ? f-=MOD : f<0?f+=MOD:f; }
int main() {
	freopen("kebab.in","r",stdin);
	freopen("kebab.out","w",stdout);

	for (;~scanf("%d%d",&n,&t);) {
		tn=0;
		for (int i=1;i<=n;i++) {
			scanf("%d%d",&q[i],&x[i]); sub[i]=q[i]-x[i];
			lb[i]=tn+1; tn+=q[i];
		}

		int ans=1;
		int id=0;
		memset(dp,0,sizeof(dp)); memset(sum,0,sizeof(sum));
		for (int i=1;i<=tn;i++) {
			if (lb[id+1]==i) ++id;
			for (int j=1;j<=sub[id];j++) {
				int &f=dp[i][j];
				if (j==1) {
					if (i-t-1>=lb[id]-1)
						check(f=1+sum[lb[id]-1]);
					else
						check(f=1+sum[max(0,i-t-1)]);
				}
				else {
					if (i-t-1>=lb[id])
						check(f+=dp[i-t-1][j-1]-dp[lb[id]-1][j-1]);  //只在本类中有效。所以第二维是对的！
					//else f=0;
				}
				check(sum[i]+=f); check(ans+=f);
				check(dp[i][j]+=dp[i-1][j]);
			}
			check(sum[i]+=sum[i-1]);
		}
		printf("%d\n",ans);
	}
	return 0;
}
