#include <bits/stdc++.h>
#include <boost/algorithm/string.hpp>
using namespace std;
int puntos(vector<pair<int,int>> vec){
double cantidades[700];
vector<pair<double,double>> resultados;
//int l = 0;
memset(cantidades,0,sizeof cantidades);
for(int i = 0; i != vec.size(); i++){
double x1 = vec.at(i).first;
double y1 = vec.at(i).second;
for(int j = i + 1; j != vec.size(); j++){
if(i != j){
double x2 = vec.at(j).first;
double y2 = vec.at(j).second;
double pendiente = ((y2 - y1) / (x2 - x1));
double ordenada = (y1 - (pendiente * x1));
//cout << "p1:(" << x1 << "," << y1 << "), p2:(" << x2 << "," << y2 << "), pendiente: " << pendiente << " ,ordenada: " << ordenada << endl;
//pendientes[l] = pendiente;
resultados.push_back(pair<double,double> (pendiente,ordenada));
//l++;
}
}
}
for(int i = 0; i != vec.size(); i++){
for(int j = 0; j != vec.size(); j++){
if(i != j){
if((resultados.at(i).first == resultados.at(j).first) && (resultados.at(i).second == resultados.at(j).second)){
cantidades[i]++;
}
}
}
}
int max = -1;
for(int i = 0; i != resultados.size(); i++){
if(cantidades[i] > max){
max = cantidades[i];
}
}
return max + 1;
}
int main() {
int casos, x, y;
cin >> casos;
string linea;
getline(cin,linea);
getline(cin,linea);
while(getline(cin,linea) && linea != ""){
vector<string> linea1;
vector<pair<int,int>> vec;
boost::split(linea1, linea, [](char c){return c == ' ';});
int x = stoi(linea1[0]);
int y = stoi(linea1[1]);
vec.push_back(pair<int,int> (x,y));
while(getline(cin,linea) && linea != ""){
boost::split(linea1, linea, [](char c){return c == ' ';});
int x = stoi(linea1[0]);
int y = stoi(linea1[1]);
vec.push_back(pair<int,int> (x,y));
}
cout << puntos(vec) << endl << endl;
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBwdW50b3ModmVjdG9yPHBhaXI8aW50LGludD4+IHZlYyl7Cglkb3VibGUgY2FudGlkYWRlc1s3MDBdOwoJdmVjdG9yPHBhaXI8ZG91YmxlLGRvdWJsZT4+IHJlc3VsdGFkb3M7CgkvL2ludCBsID0gMDsKCW1lbXNldChjYW50aWRhZGVzLDAsc2l6ZW9mIGNhbnRpZGFkZXMpOwoJZm9yKGludCBpID0gMDsgaSAhPSB2ZWMuc2l6ZSgpOyBpKyspewoJCWRvdWJsZSB4MSA9IHZlYy5hdChpKS5maXJzdDsKCQlkb3VibGUgeTEgPSB2ZWMuYXQoaSkuc2Vjb25kOwoJCWZvcihpbnQgaiA9IGkgKyAxOyBqICE9IHZlYy5zaXplKCk7IGorKyl7CgkJCWlmKGkgIT0gail7CgkJCQlkb3VibGUgeDIgPSB2ZWMuYXQoaikuZmlyc3Q7CgkJCQlkb3VibGUgeTIgPSB2ZWMuYXQoaikuc2Vjb25kOwoJCQkJZG91YmxlIHBlbmRpZW50ZSA9ICgoeTIgLSB5MSkgLyAoeDIgLSB4MSkpOwoJCQkJZG91YmxlIG9yZGVuYWRhID0gKHkxIC0gKHBlbmRpZW50ZSAqIHgxKSk7CgkJCQkvL2NvdXQgPDwgInAxOigiIDw8IHgxIDw8ICIsIiA8PCB5MSA8PCAiKSwgcDI6KCIgPDwgeDIgPDwgIiwiIDw8IHkyIDw8ICIpLCBwZW5kaWVudGU6ICIgPDwgcGVuZGllbnRlIDw8ICIgLG9yZGVuYWRhOiAiIDw8IG9yZGVuYWRhIDw8IGVuZGw7CgkJCQkvL3BlbmRpZW50ZXNbbF0gPSBwZW5kaWVudGU7CgkJCQlyZXN1bHRhZG9zLnB1c2hfYmFjayhwYWlyPGRvdWJsZSxkb3VibGU+IChwZW5kaWVudGUsb3JkZW5hZGEpKTsKCQkJCS8vbCsrOwoJCQl9CgkJfQoJfQoJZm9yKGludCBpID0gMDsgaSAhPSB2ZWMuc2l6ZSgpOyBpKyspewoJCWZvcihpbnQgaiA9IDA7IGogIT0gdmVjLnNpemUoKTsgaisrKXsKCQkJaWYoaSAhPSBqKXsKCQkJCWlmKChyZXN1bHRhZG9zLmF0KGkpLmZpcnN0ID09IHJlc3VsdGFkb3MuYXQoaikuZmlyc3QpICYmIChyZXN1bHRhZG9zLmF0KGkpLnNlY29uZCA9PSByZXN1bHRhZG9zLmF0KGopLnNlY29uZCkpewoJCQkJCWNhbnRpZGFkZXNbaV0rKzsKCQkJCX0KCQkJfQoJCX0KCX0KCWludCBtYXggPSAtMTsKCWZvcihpbnQgaSA9IDA7IGkgIT0gcmVzdWx0YWRvcy5zaXplKCk7IGkrKyl7CgkJaWYoY2FudGlkYWRlc1tpXSA+IG1heCl7CgkJCW1heCA9IGNhbnRpZGFkZXNbaV07CgkJfQoJfQoJcmV0dXJuIG1heCArIDE7Cn0KCmludCBtYWluKCkgewoJaW50IGNhc29zLCB4LCB5OwoJY2luID4+IGNhc29zOwoJc3RyaW5nIGxpbmVhOwoJZ2V0bGluZShjaW4sbGluZWEpOwoJZ2V0bGluZShjaW4sbGluZWEpOwoJd2hpbGUoZ2V0bGluZShjaW4sbGluZWEpICYmIGxpbmVhICE9ICIiKXsKCQl2ZWN0b3I8c3RyaW5nPiBsaW5lYTE7CgkJdmVjdG9yPHBhaXI8aW50LGludD4+IHZlYzsKCQlib29zdDo6c3BsaXQobGluZWExLCBsaW5lYSwgW10oY2hhciBjKXtyZXR1cm4gYyA9PSAnICc7fSk7CgkJaW50IHggPSBzdG9pKGxpbmVhMVswXSk7CgkJaW50IHkgPSBzdG9pKGxpbmVhMVsxXSk7CgkJdmVjLnB1c2hfYmFjayhwYWlyPGludCxpbnQ+ICh4LHkpKTsKCQl3aGlsZShnZXRsaW5lKGNpbixsaW5lYSkgJiYgbGluZWEgIT0gIiIpewoJCQlib29zdDo6c3BsaXQobGluZWExLCBsaW5lYSwgW10oY2hhciBjKXtyZXR1cm4gYyA9PSAnICc7fSk7CgkJCWludCB4ID0gc3RvaShsaW5lYTFbMF0pOwoJCQlpbnQgeSA9IHN0b2kobGluZWExWzFdKTsKCQkJdmVjLnB1c2hfYmFjayhwYWlyPGludCxpbnQ+ICh4LHkpKTsKCQl9CgkJY291dCA8PCBwdW50b3ModmVjKSA8PCBlbmRsIDw8IGVuZGw7Cgl9CglyZXR1cm4gMDsKfQ==