#include <bits/stdc++.h>
using namespace std;
const int Mod = 1e9 + 7;
int add(int a, int b) { return a + b >= Mod ? a + b - Mod : a + b; }
int dec(int a, int b) { return a - b < 0 ? a - b + Mod : a - b; }
int mul(int a, int b) { return 1ll * a * b % Mod; }
void Add(int &a, int b) { a = add(a, b); }
void Dec(int &a, int b) { a = dec(a, b); }
void Mul(int &a, int b) { a = mul(a, b); }
const int N = 1e5 + 50;
int n, a[N], pr[N], sf[N];
map<int, int> bin;
struct lll {
  int a, b, c, bc, ac;
};
lll operator+(const lll &x, const lll &y) {
  return (lll){add(x.a, y.a), add(x.b, y.b), add(x.c, y.c), add(x.bc, y.bc),
               add(x.ac, y.ac)};
}
namespace SGT {
const int N = ::N << 2;
lll t[N];
int tb[N];
int tc[N];
int tbc[N];
int len[N];
void up(int x) { t[x] = t[x << 1] + t[x << 1 | 1]; }
void build(int x, int l, int r) {
  len[x] = r - l + 1;
  if (l == r) return t[x].a = l - 1, void();
  build(x << 1, l, ((l + r) >> 1));
  build(x << 1 | 1, ((l + r) >> 1) + 1, r);
  up(x);
}
void B(int x, int v) {
  Add(tb[x], v);
  Add(t[x].b, mul(len[x], v));
  Add(t[x].bc, mul(v, t[x].c));
  Add(tbc[x], mul(v, tc[x]));
}
void C(int x, int v) {
  Add(tc[x], v);
  Add(t[x].c, mul(len[x], v));
  Add(t[x].bc, mul(v, t[x].b));
  Add(tbc[x], mul(v, tb[x]));
  Add(t[x].ac, mul(v, t[x].a));
}
void BC(int x, int v) {
  Add(t[x].bc, v);
  Add(tbc[x], v);
}
void down(int x) {
  if (tb[x]) B(x << 1, tb[x]), B(x << 1 | 1, tb[x]), tb[x] = 0;
  if (tc[x]) C(x << 1, tc[x]), C(x << 1 | 1, tc[x]), tc[x] = 0;
  if (tbc[x]) BC(x << 1, tbc[x]), BC(x << 1 | 1, tbc[x]), tbc[x] = 0;
}
void mdfb(int x, int l, int r, int L, int R, int v) {
  if (L <= l && r <= R) return B(x, v);
  down(x);
  if (L <= ((l + r) >> 1)) mdfb(x << 1, l, ((l + r) >> 1), L, R, v);
  if (R > ((l + r) >> 1)) mdfb(x << 1 | 1, ((l + r) >> 1) + 1, r, L, R, v);
  up(x);
}
void mdfc(int x, int l, int r, int L, int R, int v) {
  if (L <= l && r <= R) return C(x, v);
  down(x);
  if (L <= ((l + r) >> 1)) mdfc(x << 1, l, ((l + r) >> 1), L, R, v);
  if (R > ((l + r) >> 1)) mdfc(x << 1 | 1, ((l + r) >> 1) + 1, r, L, R, v);
  up(x);
}
lll ask(int x, int l, int r, int L, int R) {
  if (L > R) return (lll){0};
  if (L <= l && r <= R) return t[x];
  down(x);
  if (R <= ((l + r) >> 1)) return ask(x << 1, l, ((l + r) >> 1), L, R);
  if (L > ((l + r) >> 1)) return ask(x << 1 | 1, ((l + r) >> 1) + 1, r, L, R);
  return ask(x << 1, l, ((l + r) >> 1), L, R) +
         ask(x << 1 | 1, ((l + r) >> 1) + 1, r, L, R);
}
}  // namespace SGT
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= n; i++) {
    pr[i] = bin[a[i]];
    bin[a[i]] = i;
  }
  bin.clear();
  for (int i = n; i; i--) {
    sf[i] = bin[a[i]];
    bin[a[i]] = i;
    if (!sf[i]) sf[i] = n + 1;
  }
  SGT ::build(1, 1, n);
  static int s1[N], s2[N];
  int t1 = 0, t2 = 0, mx = 0, ans = 0;
  for (int i = 1; i <= n; i++) {
    mx = max(mx, pr[i]);
    while (t1 && pr[s1[t1]] <= pr[i]) {
      int h = dec(pr[i], pr[s1[t1]]);
      SGT ::mdfb(1, 1, n, s1[t1 - 1] + 1, s1[t1], h);
      --t1;
    }
    while (t2 && sf[s2[t2]] >= sf[i]) {
      int h = dec(sf[i], sf[s2[t2]]);
      SGT ::mdfc(1, 1, n, s2[t2 - 1] + 1, s2[t2], h);
      --t2;
    }
    s1[++t1] = i, s2[++t2] = i;
    SGT ::mdfb(1, 1, n, i, i, pr[i]);
    SGT ::mdfc(1, 1, n, i, i, sf[i]);
    lll z = SGT ::ask(1, 1, n, mx + 1, i);
    Dec(ans, z.bc);
    Dec(ans, mul(i + 1, z.a));
    Add(ans, mul(i + 1, z.b));
    Add(ans, z.ac);
  }
  cout << ans << '\n';
  return 0;
}
