#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:500000000")
using namespace std;
const int mod = 1000000007;
const int ppow = 1 << 20;
const long long default_value = 0;
struct SegmentTree {
  long long t[ppow * 2];
  SegmentTree() {
    for (int i = ppow * 2 - 1; i >= 0; i--) t[i] = default_value;
  }
  long long F(int L, int R) {
    L += ppow;
    R += ppow;
    long long res = default_value;
    while (L <= R) {
      if (L & 1) res = ((res + t[L++]) % mod);
      if (~R & 1) res = ((res + t[R--]) % mod);
      L /= 2;
      R /= 2;
    }
    return res;
  }
  void Add(int pos, long long value) {
    pos += ppow;
    t[pos] = ((value + t[pos]) % mod);
    pos /= 2;
    while (pos > 0) {
      t[pos] = ((t[pos * 2] + t[pos * 2 + 1]) % mod);
      pos /= 2;
    }
  }
};
long long Ans[1000009];
SegmentTree d;
int main() {
  int n, i, j;
  long long a;
  cin >> n;
  long long sum = 0;
  for (i = 0; i < n; i++) {
    scanf("%I64d", &a);
    long long v = (a + d.F(0, a) * a) % mod;
    v = (v + mod - Ans[a]) % mod;
    Ans[a] = (Ans[a] + v) % mod;
    sum = (sum + v) % mod;
    d.Add(a, v);
  }
  cout << sum << endl;
}
