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

//#include <ext/pb_ds/assoc_container.hpp> // Common file
//#include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update

#define rep(i,n) for(i=1;i<=n;i++)
#define Rep(i,n) for(i=0;i<n;i++)
#define For(i,a,b) for(i=a;i<=b;i++)

#define pb(x) push_back(x)
#define sz(x) (int)x.size()

#define mem(ara,val) memset(ara,val,sizeof(ara))
#define eps 1e-5

#define si(x) scanf("%d",&x)
#define sii(x,y) scanf("%d %d",&x,&y)
#define siii(x,y,z) scanf("%d %d %d",&x,&y,&z)
#define sl(x) scanf("%lld",&x)
#define sll(x,y) scanf("%lld %lld",&x,&y)
#define slll(x,y,z) scanf("%lld %lld %lld",&x,&y,&z)
#define ss(str) scanf("%s",str)
#define pi(x) printf("%d",x)
//#define pii(x,y) printf("%d %d",x,y)
#define piii(x,y,z) printf("%d %d %d",x,y,z)
#define pl(x) printf("%lld",x)
#define pll(x,y) printf("%lld %lld",x,y)
#define plll(x,y,z) printf("%lld %lld %lld",x,y,z)
#define NL printf("\n")
#define Max 100005
#define INF 1e18
#define un(x) x.erase(unique( x.begin() , x.end() ), x.end())
#define mod 1000000007

#define FI freopen("z.txt","r",stdin)

#define D(x) cout << #x << " = " << x << endl
#define DD(x,y) cout << #x << " = " << x << "   " << #y << " = " << y << endl
#define DDD(x,y,z) cout << #x << " = " << x << "   " << #y << " = " << y << "   " << #z << " = " << z << endl
#define all(x) x.begin(),x.end()
#define pc(x) __builtin_popcount(x)

typedef long long LL;
typedef unsigned long long ULL;

const double PI = acos(-1.0);

using namespace std;

int setb(int n,int pos)
{
    return n=n | (1 << pos);
}
int resb(int n,int pos)
{
    return n=n & ~(1 << pos);
}
bool checkb(int n,int pos)
{
    return (bool)(n & (1 << pos));
}

LL bigmod(LL b,LL p,LL m)
{
    if( p == 0 ) return 1;
    LL ret = bigmod(b,p/2,m);
    ret = ( ret * ret ) % m;
    if( p & 1 ) ret = ( ret * b ) % m;
    return ret;
}

struct info
{
    int x, y;
};
info ara[20];
int n;

map < pair<int,int> , int > mp;
int N;
int get_slope(int idx1, int idx2)
{
    int dy = ( ara[idx1].y - ara[idx2].y );
    int dx = ( ara[idx1].x - ara[idx2].x );
    if( dx == 0 )
    {
        dy = 1;
    }
    else if( dy == 0 )
    {
        dx = 1;
    }
    else
    {
        int sx = dx / abs(dx);
        int sy = dy / abs(dy);
        int s = sx * sy;
        dx = abs(dx);
        dy = abs(dy);
        int g = __gcd( dx , dy );
        dx /= g;
        dy /= g;
        dx *= s;
    }
    if( mp.find( make_pair(dy,dx) ) == mp.end() ) mp[ make_pair(dy,dx) ] = ++N;
    return mp[ make_pair(dy,dx) ];
}

int lol[20][20];
void build()
{
    int i,j;
    Rep(i,n)
    {
        Rep(j,n)
        {
            if( i == j ) continue;
            lol[i][j] = get_slope(i,j);
        }
    }
}


bool visit[ (1 << 16) + 10 ];
int cnt[505];
int solve(int mask)
{
    int p[15], act[15], k = 0, l = 0;
    for(int i = 0; i < n; i++)
    {
        if( checkb(mask,i) == 0 )
        {
            p[k++] = i;
        }
        else act[l++] = i;
    }

    int ret = 0;
    int keep[15];
    while( 1 )
    {
        int now = 0;
        for(int i = 0; i < k; i++)
        {
            int my = lol[ act[i] ][ p[i] ];
            now += cnt[my];
            cnt[my]++;
            keep[i] = my;
        }
        ret = max( ret , now );
        for(int i = 0; i < k; i++) cnt[ keep[i] ]--;

        bool f = next_permutation(p,p+k);
        if( !f ) break;
    }
    return ret;
}

int super_solve()
{
    int ret = 0;
    for(int mask = 0; mask < (1 << n); mask++)
    {
        if( 2 * pc(mask) == n )
        {
            int other = ( (1 << n) - 1 ) ^ mask;
            if( visit[ other ] ) continue;
            visit[ mask ] = 1;
            ret = max( ret , solve(mask) );
        }
    }
    return ret;
}

int main()
{
    //FI;
    int i;
    si(n);
    Rep(i,n)
    {
        sii(ara[i].x,ara[i].y);
    }
    build();
    int ret = super_solve();
    pi( ret ); NL;
    return 0;
}



Measured memory_bytes: 3264