#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 105;
const int forever = -1;
const int never = -2;
struct point
{
    ll x, y;
} p[maxn], v[maxn];
map <ll, ll> Map;
ll cti[maxn][maxn];
void initial(int n)
{
    int i, j, t;
    for(i=0; i<n; i++)
        for(j=i+1; j<n; j++)
        {
            if(p[i].x==p[j].x && p[i].y==p[j].y && v[i].x==v[j].x && v[i].y==v[j].y)
                cti[i][j]=cti[j][i]=forever;
            else
            {
                cti[i][j]=cti[j][i]=never;
                if(v[i].x != v[j].x)
                {
                    if((p[i].x-p[j].x)%(v[j].x-v[i].x) != 0)continue;
                    t=(p[i].x-p[j].x)/(v[j].x-v[i].x);
                    if(t<0 || (p[i].y+v[i].y*t != p[j].y+v[j].y*t))continue;
                }
                else if(v[i].y != v[j].y)
                {
                    if((p[i].y-p[j].y)%(v[j].y-v[i].y) != 0)continue;
                    t=(p[i].y-p[j].y)/(v[j].y-v[i].y);
                    if(t<0 || (p[i].x+v[i].x*t != p[j].x+v[j].x*t))continue;
                }
                else continue;
                cti[i][j]=cti[j][i]=t;
            }
        }
}
int main()
{
    int i, j, k, n, tmp, cnt, res, ans;
    ll a, b, c, t;
    while(~scanf("%d", &n) && n)
    {
        for(i = 0; i < n; i++)scanf("%I64d%I64d%I64d%I64d", &p[i].x, &p[i].y, &v[i].x, &v[i].y);
        if(n == 1 || n == 2)
        {
            printf("%d\n", n);
            continue;
        }
        initial(n);
        ans = 0;
        for(i = 0; i < n; i++)
            for(j = i+1; j < n; j++)
            {
                Map.clear();
                cnt = 0;
                res = 0;
                for(k = 0; k < n; k++)
                {
                    if(k==i || k==j)continue;
                    a = (v[i].x-v[j].x)*(v[i].y-v[k].y) - (v[i].x-v[k].x)*(v[i].y-v[j].y);
                    b = (p[i].x-p[j].x)*(v[i].y-v[k].y) + (v[i].x-v[j].x)*(p[i].y-p[k].y)
                        - (p[i].y-p[j].y)*(v[i].x-v[k].x) - (v[i].y-v[j].y)*(p[i].x-p[k].x);
                    c = (p[i].x-p[j].x)*(p[i].y-p[k].y) - (p[i].y-p[j].y)*(p[i].x-p[k].x);
                    if(a==0 && b==0 && c==0)cnt++;
                    else if(a==0)
                    {
                        if(c==0 || b==0)continue;
                        else if(c%b==0)
                        {
                            t=-c/b;
                            if(t>0 && t!=cti[i][j])
                            {
                                tmp = ++Map[t];
                                res = max(tmp, res);
                            }
                        }
                    }
                    else
                    {
                        ll d = b*b-4*a*c;
                        ll t1, t2;
                        if(d<0) continue;
                        else
                        {
                            ll sqd = sqrt(d+0.0);
                            if(sqd*sqd == d)
                            {
                                t1= -b+sqd;
                                if(t1%(2*a)==0)
                                {
                                    t1/=(2*a);
                                    if(t1>0 && t1!=cti[i][j])
                                    {
                                        tmp = ++Map[t1];
                                        res = max(tmp, res);
                                    }
                                }
                                if(sqd!=0)
                                {
                                    t2= -b-sqd;
                                    if(t2%(2*a)==0)
                                    {
                                        t2/=(2*a);
                                        if(t2>0 && t2!=cti[i][j])
                                        {
                                            tmp = ++Map[t2];
                                            res = max(tmp, res);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                ans = max(res+2+cnt, ans);
                if(cti[i][j]!=never && cti[i][j]!=0)
                {
                    res=0;
                    for(k=0; k<n; k++)
                    {
                        if(k==i || k==j)continue;
                        if(cti[i][j] == cti[i][k])res++;
                    }
                    ans=max(res+2, ans);
                }
            }
        printf("%d\n", ans);
    }
    return 0;
}