You are given a set of n points in a 2D plane. No three points are collinear.

A pentagram is a set of 5 points A,B,C,D,E that can be arranged as follows. <image> Note the length of the line segments don't matter, only that those particular intersections exist.

Count the number of ways to choose 5 points from the given set that form a pentagram.

Input

The first line contains an integer n (5 ≤ n ≤ 300) — the number of points.

Each of the next n lines contains two integers x_i, y_i (-10^6 ≤ x_i,y_i ≤ 10^6) — the coordinates of the i-th point. It is guaranteed that no three points are collinear.

Output

Print a single integer, the number of sets of 5 points that form a pentagram.

Examples

Input


5
0 0
0 2
2 0
2 2
1 3


Output


1


Input


5
0 0
4 0
0 4
4 4
2 3


Output


0


Input


10
841746 527518
595261 331297
-946901 129987
670374 -140388
-684770 309555
-302589 415564
-387435 613331
-624940 -95922
945847 -199224
24636 -565799


Output


85

Note

A picture of the first sample: <image> A picture of the second sample: <image> A picture of the third sample: <image>
#include <bits/stdc++.h>
using namespace std;
template <typename TH>
void _dbg(const char* sdbg, TH h) {
  cerr << sdbg << "=" << h << "\n";
}
template <typename TH, typename... TA>
void _dbg(const char* sdbg, TH h, TA... t) {
  while (*sdbg != ',') {
    cerr << *sdbg++;
  }
  cerr << "=" << h << ",";
  _dbg(sdbg + 1, t...);
}
template <class C>
void mini(C& a4, C b4) {
  a4 = min(a4, b4);
}
template <class C>
void maxi(C& a4, C b4) {
  a4 = max(a4, b4);
}
template <class T1, class T2>
ostream& operator<<(ostream& out, pair<T1, T2> pair) {
  return out << "(" << pair.first << ", " << pair.second << ")";
}
template <class A, class B, class C>
struct Triple {
  A first;
  B second;
  C third;
  bool operator<(const Triple& t) const {
    if (first != t.first) return first < t.first;
    if (second != t.second) return second < t.second;
    return third < t.third;
  }
};
template <class T>
void ResizeVec(T&, vector<long long>) {}
template <class T>
void ResizeVec(vector<T>& vec, vector<long long> sz) {
  vec.resize(sz[0]);
  sz.erase(sz.begin());
  if (sz.empty()) {
    return;
  }
  for (T& v : vec) {
    ResizeVec(v, sz);
  }
}
template <class A, class B, class C>
ostream& operator<<(ostream& out, Triple<A, B, C> t) {
  return out << "(" << t.first << ", " << t.second << ", " << t.third << ")";
}
template <class T>
ostream& operator<<(ostream& out, vector<T> vec) {
  out << "(";
  for (auto& v : vec) out << v << ", ";
  return out << ")";
}
template <class T>
ostream& operator<<(ostream& out, set<T> vec) {
  out << "(";
  for (auto& v : vec) out << v << ", ";
  return out << ")";
}
template <class L, class R>
ostream& operator<<(ostream& out, map<L, R> vec) {
  out << "(";
  for (auto& v : vec) out << v << ", ";
  return out << ")";
}
struct Point {
  long long x, y;
  Point operator-(Point p) { return {x - p.x, y - p.y}; }
};
long long CrossProd(Point A, Point B, Point C) {
  B = B - A;
  C = C - A;
  return B.x * C.y - B.y * C.x;
}
const long long N = 313;
Point pt[N];
bool IsUnder(Point A, Point B, Point C) {
  if (A.x > B.x) {
    swap(A, B);
  }
  return C.x >= A.x && C.x < B.x && CrossProd(A, C, B) > 0;
}
long long cnt[N][N];
int32_t main() {
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(10);
  if (0) cout << fixed << setprecision(10);
  cin.tie(0);
  long long n;
  cin >> n;
  for (long long i = (1); i <= (n); ++i) {
    long long x, y;
    cin >> x >> y;
    pt[i] = {x, y};
  }
  for (long long i = (1); i <= (n); ++i) {
    for (long long j = (1); j <= (n); ++j) {
      if (i == j) {
        continue;
      }
      Point A = pt[i];
      Point B = pt[j];
      long long sign = 1;
      if (A.x > B.x) {
        swap(A, B);
        sign = -1;
      }
      long long under = 0;
      for (long long k = (1); k <= (n); ++k) {
        if (k == i || k == j) {
          continue;
        }
        under += IsUnder(A, B, pt[k]);
      }
      cnt[i][j] = sign * under;
    }
  }
  long long T1 = 0, T2 = 0;
  for (long long i = (1); i <= (n); ++i) {
    for (long long j = (1); j <= (i - 1); ++j) {
      for (long long k = (1); k <= (j - 1); ++k) {
        long long hehs = cnt[i][j] + cnt[j][k] + cnt[k][i];
        if (hehs < 0) {
          assert(CrossProd(pt[i], pt[j], pt[k]) > 0);
        }
        hehs = abs(hehs);
        hehs -= IsUnder(pt[i], pt[j], pt[k]);
        hehs -= IsUnder(pt[j], pt[k], pt[i]);
        hehs -= IsUnder(pt[k], pt[i], pt[j]);
        T1 += hehs;
        T2 += hehs * (hehs - 1) / 2;
      }
    }
  }
  long long C = ((n - 4) * T1 - 4 * T2) / 2;
  (T1, T2, C);
  cout << n * (n - 1) * (n - 2) * (n - 3) * (n - 4) / 120 - T2 - C << endl;
  return 0;
}
