// 有几点要注意:
// 1、输入的点要去重
// 2、枚举三角形时要判断是否合法
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
struct Pos
{
int x, y;
}p[20];
struct Triangle
{
int a, b, c; // 三角形各边边长的平方
}t[1000];
bool vis[1000];
bool hash[210][210];
bool multi(Pos a, Pos b, Pos c) // 判断三点是否共线
{
int x1, y1, x2, y2;
x1 = b.x - a.x;
y1 = b.y - a.y;
x2 = c.x - b.x;
y2 = c.y - b.y;
if (x1*y2 - x2*y1 == 0)
return false;
return true;
}
bool similar(Triangle A, Triangle B)
{
if (A.a*B.b == A.b*B.a && A.b*B.c == A.c*B.b && A.a*B.c == A.c*B.a)
return true;
return false;
}
int main()
{
int n, px, py;
int pnum, tnum, cnt, ans; // pnum:点数 tnum:三角形数
int i, j, k;
int e[3];
while (scanf("%d", &n), n)
{
memset(vis, false, sizeof(vis));
memset(hash, false, sizeof(hash));
ans = 0, pnum = 0, tnum = 0;
for (i = 0; i < n; ++i)
{
scanf("%d %d", &px, &py);
if (hash[px+100][py+100]) // 去重
continue;
p[pnum].x = px;
p[pnum].y = py;
hash[px+100][py+100] = true;
pnum++;
}
for (i = 0; i < pnum; ++i)
{
for (j = 0; j < i; ++j)
{
for (k = 0; k < j; ++k)
{
if (!multi(p[i], p[j], p[k]))
continue;
int dx, dy;
dx = p[j].x - p[k].x;
dy = p[j].y - p[k].y;
e[0] = dx*dx + dy*dy;
dx = p[i].x - p[j].x;
dy = p[i].y - p[j].y;
e[1] = dx*dx + dy*dy;
dx = p[i].x - p[k].x;
dy = p[i].y - p[k].y;
e[2] = dx*dx + dy*dy;
sort(e, e + 3);
t[tnum].a = e[0];
t[tnum].b = e[1];
t[tnum].c = e[2];
tnum++;
}
}
}
for (i = 0; i < tnum; ++i)
{
if (!vis[i])
{
cnt = 1;
vis[i] = true;
for (j = i + 1; j < tnum; ++j)
{
if (vis[j]) continue;
if (similar(t[i], t[j]))
{
vis[j] = true;
cnt++;
}
}
if (cnt > ans) ans = cnt;
}
}
printf("%d\n", ans);
}
return 0;
}