#include <bits/stdc++.h>
using namespace std;
#define int long long
int read() {
int x = 0, f = 1; char ch = getchar();
while (!isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); }
while (isdigit(ch)) { x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
}
const int Max = 200033;
const int mod = 1000000007;
const int inf = 1100000000;
int n, b[Max], dp[Max];
int ans, mn[Max], mx[Max];
struct man {
int x, v;
friend bool operator< (man a, man b) {
return a.x < b.x;
}
} p[Max];
struct line {
int l, r;
friend bool operator< (line a, line b) {
return a.r == b.r ? a.l < b.l : a.r < b.r;
}
} q[Max];
#define ls x << 1
#define rs x << 1 | 1
struct SegmentTree {
int sum[Max * 8];
void update(int x, int l, int r, int pos, int v) {
if (l == r) {
sum[x] = (sum[x] + v) % mod;
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) update(ls, l, mid, pos, v);
else update(rs, mid + 1, r, pos, v);
sum[x] = (sum[ls] + sum[rs]) % mod;
}
int query(int x, int l, int r, int L, int R) {
if (L <= l && r <= R) {
return sum[x];
}
int re = 0, mid = (l + r) >> 1;
if (L <= mid) re = (re + query(ls, l, mid, L, R)) % mod;
if (R > mid) re = (re + query(rs, mid + 1, r, L, R)) % mod;
return re;
}
} sgt;
signed main() {
n = read();
for (int i = 1; i <= n; i++)
p[i].x = read(), b[i] = p[i].v = read();
sort(p + 1, p + n + 1);
sort(b + 1, b + n + 1);
for (int i = 1; i <= n; i++)
p[i].v = lower_bound(b + 1, b + n + 1, p[i].v) - b;
mn[n + 1] = inf;
for (int i = n; i >= 1; i--)
mn[i] = min(mn[i + 1], p[i].v);
for (int i = 1; i <= n; i++)
mx[i] = max(mx[i - 1], p[i].v);
for (int i = 1; i <= n; i++) {
q[i].l = mn[i], q[i].r = mx[i];
}
sort(q + 1, q + n + 1);
dp[1] = 1;
sgt.update(1, 1, n, q[1].r, dp[1]);
for (int i = 2; i <= n; i++) {
dp[i] = sgt.query(1, 1, n, max(1ll, q[i].l - 1), q[i].r);
if (q[i].l == 1) dp[i]++;
sgt.update(1, 1, n, q[i].r, dp[i]);
}
for (int i = n; i >= 1 && q[i].r == q[n].r; i--)
ans = (ans + dp[i]) % mod;
printf("%lld\n", ans);
return 0;
}