// fest
#include <bits/stdc++.h>	

#define pb push_back
#define F first
#define S second
#define y1 dasdasfasfas
#define x1 wqdadfasfasfas
#define All(c) c.begin(), c.end()
#define SZ(A) (int((A).size()))
#define umap unordered_map
#define __ fflush(stdout)
#define FILENAME ""

typedef long long ll;
typedef long double ld;    

using namespace std;

void FREOPEN() {
	#ifdef LOCAL
		freopen(".in", "r", stdin);
		freopen("1.out", "w", stdout);
	#else
		//freopen(FILENAME".in", "r", stdin);
		//freopen(FILENAME".out", "w", stdout);
	#endif
}

inline double Time() {return (clock() * 1.0) / CLOCKS_PER_SEC; }             

const int N = 201, inf = 1e9 * 2;

const ll MOD = 998244353, INF = 1e18;

const int dx[] = {1, -1, 0, 0, -1, 1, -1, 1};
const int dy[] = {0, 0, 1, -1, -1, 1, 1, -1};

struct Point {
	int x, y;
};

Point a[N];
Point root;

int tri[N][N], dp[N][N];

int on_line[N];

Point make(int _x, int _y) {
	Point ret;
	ret.x = _x;
	ret.y = _y;
	return ret;
}

Point vec(Point p1, Point p2) {
	return make(p2.x - p1.x, p2.y - p1.y);
}

int crossp(Point p1, Point p2) {
	return p1.x * p2.y - p1.y * p2.x; 
} 

int dist(Point p1, Point p2) {
	return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
}

bool canbe(int i, int j) {
	if (i == j) return 0;
	if (a[i].x > a[j].x) return 0;
	if (a[i].x < a[j].x) return 1;
	if (a[i].y > a[j].y) return 0;
	return 1;
}

bool cmp(Point p1, Point p2) {
	Point v1 = vec(root, p1);
	Point v2 = vec(root, p2);
	if (crossp(v1, v2) < 0) return 1;
	if (crossp(v1, v2) > 0) return 0;
	if (dist(root, p1) > dist(root, p2)) return 1;
	return 0;
}

int power(int x) {
	int ret = 1;
	int num = 2;
	while (x) {
		if (x & 1) {
			x--;
			ret = (ret * 1ll * num) % MOD;
		}
		else {
			x /= 2;
			num = (num * 1ll * num) % MOD;
		}
	}
	return ret;
}

void add(int &x, int y) {
	x += y;
	while (x >= MOD) x -= MOD;
}

void out (Point p) {
	cerr << "(" << p.x << " " << p.y << ") ";
}

int main() {
	FREOPEN();
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int _x, _y;
		scanf("%d %d", &_x, &_y);
		a[i] = make(_x, _y);
	}
	int ans = 0;
	for (int start = 1; start <= n; start++) {
		memset(dp, 0, sizeof(dp));
		memset(tri, 0, sizeof(tri));
		memset(on_line, 0, sizeof(on_line));
		root = a[start];
		vector<Point> ps;
		for (int i = 1; i <= n; i++) {
			if (canbe(start, i)) ps.pb(a[i]); 
		}
		sort(All(ps), cmp);
		int m = SZ(ps);
		for (int i = 0; i < m; i++) {
			for (int j = i + 1; j < m; j++) {
				for (int k = i + 1; k < m; k++) {
					if (j == k) continue;
					if (crossp(vec(root, ps[j]), vec(root, ps[k])) < 0) break;
					if (crossp(vec(ps[i], ps[j]), vec(ps[i], ps[k])) <= 0) tri[i][j]++;
				}
				if (crossp(vec(root, ps[i]), vec(root, ps[j])) == 0) on_line[i]++;
				//out(root), out(ps[i]), out(ps[j]), cerr << tri[i][j] << endl;
			}
		}
		for (int i = 0; i < m; i++) {
			for (int j = i + 1; j < m; j++) {
				assert(crossp(vec(root, ps[i]), vec(root, ps[j])) <= 0);
				if (crossp(vec(root, ps[i]), vec(root, ps[j])) == 0) continue;
				add(dp[i][j], power(tri[i][j]));
				for (int k = j + 1; k < m; k++) {
					if (crossp(vec(ps[i], ps[j]), vec(ps[i], ps[k])) >= 0) continue;
					if (crossp(vec(root, ps[j]), vec(root, ps[k])) >= 0) continue;
					//cerr << j << " " << k << " " << tri[j][k] << endl;
					add(dp[j][k], (power(tri[j][k] - on_line[j]) * 1ll * dp[i][j]) % MOD);
				}
				add(ans, dp[i][j]);
			}
		}
		//cerr << ans << endl;
	}
	printf("%d ", ans);
	return 0;
}


Measured memory_bytes: 512