#include <bits/stdc++.h>
#include <iomanip>
 
using namespace std;
 
typedef long long LL;
typedef long double LD;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
typedef pair<LD, LD> PLDLD;
typedef vector<int> VI;
typedef vector<char> VB;
 
#define FOR(i,a,b) for(int i=(a);i<(int)(b);++i)
#define REP(i,n)  FOR(i,0,n)
#define CLR(a) memset((a), 0 ,sizeof(a))
#define ALL(a) a.begin(),a.end()
 
const LD eps=1e-10;
const long long INFLL=(LL)(1e9)*(LL)(1e9);
const int INF=1e9;
 
template<class T>
void chmin(T& a, const T b)
{
	if(a>b)
		a=b;
}
template<class T>
void chmax(T& a, const T b)
{
	if(a<b)
		a=b;
}
 
const LL pow(const LL p, const LL q)
{
	LL t=1;
	for(int i=0;i<q;i++)
		t*=p;
	return t;
}

template <typename T>
struct has_iter
{
	private:
		template <typename U>
		static constexpr true_type check(typename U::iterator*);
		template <typename U>
		static constexpr false_type check(...);

	public:
		static constexpr bool value = decltype(check<T>(nullptr))::value;
};

template<typename T, typename U = typename T::iterator>
void print(const T& container)
{
		auto&& first=begin(container), last=end(container);
		auto&& back=prev(last);
		for(auto e=first; e!=last; e=next(e))
			cout<<*e<<" \n"[e==back];
}

extern void* enabler;
template<typename Head, typename enable_if<!has_iter<Head>::value>::type*& = enabler>
void print(const Head& head)
{
	cout<<head<<endl;
}

template<typename Head, typename... Tail>
void print(const Head& head, const Tail&... tail)
{
	cout<<head<<" ";
	print(tail...);
}

void io_speedup()
{
	cin.tie(0);
	ios::sync_with_stdio(false);
}

template<typename T>
istream& operator >> (istream& is, vector<T>& vec)
{
	for(T& x: vec) is >> x;
	return is;
}

template<typename T>
vector<T> read(int n)
{
	vector<T> t(n);
	cin>>t;
	return t;
}

template<typename T>
T read()
{
	T t;
	cin>>t;
	return t;
}

typedef complex<double> Point;
struct Line
{
	Point a,b;
	Line(Point a_, Point b_):a(a_),b(b_)
	{}
	Line():a(Point(0,0)),b(Point(0,0))
	{}
};
bool paralell(Line a,Line b)
{
	Point p=a.a-a.b;
	Point q=b.a-b.b;
	return abs(p.real()*q.imag()-q.real()*p.imag())<eps;
}
int main()
{
	int n;
	cin>>n;
	vector<Point> p(n);
	REP(i,n)
	{
		int x,y;
		cin>>x>>y;
		p[i]=Point(x,y);
	}
	auto pa=[&](int a,int b)
	{
		return a*n +b;
	};
	vector<set<PII>> para(n*n);
	REP(i,n)
	REP(j,n)
	{
		if(i==j) continue;
		Line ln(p[i],p[j]);
		set<PII> s;
		REP(k,n)
		FOR(l,k+1,n)
		{
			if(k==l) continue;
			if(i==k) continue;
			if(i==l) continue;
			if(j==k) continue;
			if(j==l) continue;
			if(paralell(ln, Line(p[k], p[l])))
				s.insert(PII(k,l));
		}
		//print(i,j,":");
		//for(auto&& e:s)
		//cout<<e.first<<" "<<e.second<<endl;
		para[pa(i,j)]=s;
	}

	VI memo(1<<n, -1);
	function<int(int)> dfs=[&](int p)
	{
		if(memo[p]!=-1) return memo[p];
		int a,b;
		REP(i,n)
		{
			if(((1<<i)&p)==0)
			{
				a=i;
				break;
			}
		}
		int ans=0;
		REP(i,n)
		{
			if(i==a)continue;
			if(((1<<i)&p)==0)
			{
				b=i;
				auto s=para[pa(a,b)];
				vector<PII> ok;
				for(auto&& e:s)
				{
					int c,d;
					tie(c,d)=e;
					if((p&(1<<c))>0) continue;
					if((p&(1<<d))>0) continue;
					ok.push_back(e);
				}
				int ssz=ok.size();
				REP(j,(1<<ssz))
				{
					int cnt=0;
					int q=(1<<a)+(1<<b);
					REP(k,ssz)
					{
						if((j&(1<<k))>0)
						{
							cnt++;
							int c,d;
							tie(c,d)=ok[k];
							q+=(1<<c);
							q+=(1<<d);
						}
					}
					chmax(ans, dfs(p|q) + (cnt+1)*cnt/2);
				}
			}
		}
		//print(p,ans);
		return memo[p]=ans;
	};

	print(dfs(0));
}

Measured memory_bytes: 3188