// Author: Pasindu Wijesena

#include <bits/stdc++.h>
using namespace std;

#define deb(x) cout<<#x<<": "<<x<<endl
#define rep(a,b) for(int a=0;a<b;a++)
#define rep2(a,b,c) for(int a=b;a<c;a++)
#define per2(a,b,c) for(int a=b;a>=c;a--)
#define gcd(a,b) __gcd(a,b) // gcd of two numbers
#define bitCount(a) __builtin_popcount(a) // number of ones in binary form
#define zeroCount(a) __builtin_clz(a) // number of zeros at the end in binary form

typedef long long ll;

template<typename... T>
void rd(T&... args){ ((cin>>args), ...); }
template<typename... T>
void wt(T&&... args) { ((cout<<args<<" "), ...); }

ll mod(ll V, ll N){
	return ((V % N) + N) % N;
}

const ll MOD = 1e9+7;

bool solve(){
	int N;
	rd(N);
	vector<int>A(N,0);
	for(auto &a:A) rd(a);
	
	sort(A.begin(), A.end());
	ll answer = A[0]+1;
	ll diff = 0;
	rep2(i,1,N){
		diff = A[i] - A[i-1];
		answer = mod(answer * (diff+1), MOD);
	}
	cout<<answer<<endl;
	return true;
}

int main(){
	ios_base::sync_with_stdio(false);
    cin.tie(NULL);

	int T=1;
	//~ rd(T);
	rep(i,T){
		//~ cout<<"Case #"<<i+1<<": ";
		solve();
		//~ bool result = solve();
		//~ if(result)cout<<"YES"<<endl;
		//~ else cout<<"NO"<<endl;
	}
	
	return 0;
}

/*
    written by Pankaj Kumar.
    country:-INDIA
    Institute: National Institute of Technology, Uttarakhand
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll ;
typedef unsigned long long ull;
typedef vector<ll> vl;
#define speed cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(0);
/*  Abbrevations  */
#define ff first
#define ss second
#define mp make_pair
#define line cout<<endl;
#define pb push_back
#define Endl "\n"
// loops
#define forin(arr,n) for(ll i=0;i<n;i++) cin>>arr[i];
// Some print
#define no cout<<"No"<<endl;
#define yes cout<<"Yes"<<endl;
// sort
#define all(V) (V).begin(),(V).end()
#define srt(V) sort(all(V))
#define srtGreat(V) sort(all(V),greater<ll>())
// some extra
#define printv(v) for(ll i=0;i<ll(v.size());i++){cout<<v[i]<<" ";} line;
#define precision(x) cout<<fixed<<setprecision(x);
#define sz(V) ll(V.size())
// template
template <typename T>
T mymax(T x,T y)
{
    return (x>y)?x:y;
}
// function
ll power(ll x,ll y,ll mod)
{
    ll res=1;
    // x=x%mod;
    while(y>0)
    {
        if(y%2==1)
        {
            res*=x;
            // res=res%mod;
        }
        y/=2; x*=x; // x=x%mod;
    }
    return res;
}
ll str_to_num(string s)
{
    return stoi(s);
}

string num_to_str(ll num)
{
    return to_string(num);
}
// datatype definination
#define ordered_set tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update>
class Point
{
    public:
        ll x;
        ll y;
        ll z;
        ll getsum()
        {
            return x+y+z;
        }
};
/* ascii value 
A=65,Z=90,a=97,z=122
*/
/*  --------------------MAIN PROGRAM----------------------------*/
// to run ctrl+b
const ll INF=LONG_MAX;
const ll mod1=1e9+7;
const ll mod2=998244353;


// Techniques
// divide into cases, brute force, pattern finding
// sort, greedy, binary search, two pointer
// transform into graph

ll solve()
{
    ll n;
    cin>>n;
    vl v(n);
    forin(v,n);
    srt(v);
    ll ans=1;
    ll pre=0;
    for(ll i=0;i<n;i++){
        ans*=(v[i]+1-pre);
        ans%=mod1;
        pre=v[i];
    }
    cout<<ans<<endl;
    return 0;
}

int main()
{
    speed;
    /* #ifndef ONLINE_JUDGE
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
    #endif */
    ll TestCase=1;
    // cin>>TestCase;
    while(TestCase--)
    {
        solve();
    }
}
/* -----------------END OF PROGRAM --------------------*/
/*
* stuff you should look before submission 
* constraint and time limit
* int overflow
* special test case (n=0||n=1||n=2)
* don't get stuck on one approach if you get wrong answer
*/