Problem: There is a set consisting of N distinct integers. The i-th smallest element in this set is S_i. We want to divide this set into two sets, X and Y, such that:

* The absolute difference of any two distinct elements in X is A or greater.
* The absolute difference of any two distinct elements in Y is B or greater.



How many ways are there to perform such division, modulo 10^9 + 7? Note that one of X and Y may be empty.

Constraints

* All input values are integers.
* 1 ≦ N ≦ 10^5
* 1 ≦ A , B ≦ 10^{18}
* 0 ≦ S_i ≦ 10^{18}(1 ≦ i ≦ N)
* S_i < S_{i+1}(1 ≦ i ≦ N - 1)

Input

The input is given from Standard Input in the following format:


N A B
S_1
:
S_N


Output

Print the number of the different divisions under the conditions, modulo 10^9 + 7.

Examples

Input

5 3 7
1
3
6
9
12


Output

5


Input

7 5 3
0
2
4
7
8
11
15


Output

4


Input

8 2 9
3
4
5
13
15
22
26
32


Output

13


Input

3 3 4
5
6
7


Output

0

Solution (in CPP):

Solution:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>

#define For(i, j, k) for(int i = j; i <= k; i++)
#define Forr(i, j, k) for(int i = j; i >= k; i--)

using namespace std;

typedef long long LL;

const int N = 100010;
const int Mod = 1e9 + 7;
const LL oo = 2e18;

int n, pos[2], nxt[N][2];
LL lim[2], S[N], addv[2];
LL dp[N][2], delt[N][2];

int main(){
	scanf("%d%lld%lld", &n, &lim[0], &lim[1]);
	dp[0][0] = dp[0][1] = 1;
	For(i, 1, n) scanf("%lld", &S[i]);
	S[0] = -oo, S[n + 1] = oo;
	For(j, 0, 1){
		nxt[n][j] = n;
		Forr(i, n - 1, 0) nxt[i][j] = S[i + 1] - S[i] < lim[j] ? i : nxt[i + 1][j];
	}
	pos[0] = pos[1] = 1;
	For(i, 0, n) For(j, 0, 1){
		(addv[j] += delt[i][j]) %= Mod;
		if(i == n) continue;
		LL v = (dp[i][j] + addv[j]) % Mod;
		while(pos[j] <= n && S[pos[j]] - S[i] < lim[j]) ++pos[j];
		int r = nxt[i + 1][j ^ 1], l = max(i + 1, pos[j] - 1);
	//	printf("%d %d -> [%d, %d]\n", i, j, l, r);
		if(l <= r) (delt[l][j ^ 1] += v) %= Mod, (delt[r + 1][j ^ 1] += Mod - v) %= Mod;
	}
	printf("%lld\n", (addv[0] + addv[1]) % Mod);
	return 0;
}