#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
const double EPS = 1e-10;
typedef complex<double> P;
typedef pair<P,P> L;
namespace std {
  bool operator < (const P& a, const P& b) {
    return real(a)!=real(b)?real(a)<real(b):imag(a)<imag(b);
  }
}
int p[10001],r[10001];
void init(){for(int i=0;i<10001;i++)p[i]=i,r[i]=0;}
int find(int x){return (p[x]==x)?x:(p[x]=find(p[x]));}
void unite(int x,int y) {
  x=find(x),y=find(y);
  if(x==y)return;
  if(r[x]<r[y])p[x]=y;
  else{p[y]=x;if(r[x]==r[y])r[x]++;}
}
bool same(int x,int y){return find(x)==find(y);}
double cross(const P& a, const P& b) {return imag(conj(a)*b);}
double dot(const P& a, const P& b) {return real(conj(a)*b);}
int ccw(P a, P b, P c) {
  b-=a;c-=a;
  if(cross(b,c)>EPS)return +1;
  if(cross(b,c)<-EPS)return -1;
  if(dot(b,c)<-EPS)return +2;
  if(norm(b)<norm(c))return -2;
  return 0;
}
bool intersectSS(const L &s, const L &t) {
  return ccw(s.F,s.S,t.F)*ccw(s.F,s.S,t.S)<=0&&
         ccw(t.F,t.S,s.F)*ccw(t.F,t.S,s.S)<=0;
}
P crosspoint(const L &l, const L &m) {
  double A=cross(l.S-l.F,m.S-m.F);
  double B=cross(l.S-l.F,l.S-m.F);
  if(fabs(A)<EPS&&fabs(B)<EPS)return m.F;
  return m.F+B/A*(m.S-m.F);
}

int main() {
  int w[10][3]={{0,4,0},{2,0,0},{2,4,0},{3,2,1},{3,1,1},{2,4,0},{1,4,1},{2,2,0},{0,4,2},{1,3,1}};                
  int n;
  while(cin >> n && n) {
    L l[n];
    for(int i=0; i<n; i++) {
      double x1,y1,x2,y2;
      cin >> x1 >> y1 >> x2 >> y2;
      l[i]=L(P(x1,y1),P(x2,y2));
    }
    init();
    for(int i=0; i<n; i++) {
      for(int j=i+1; j<n; j++) {
        if(intersectSS(l[i],l[j])) unite(i,j);
      }
    }
    vector<int> v[n];
    map<P,int> m[n];
    set<P> s[n];
    vector<int> x;
    for(int i=0; i<n; i++) {
      x.push_back(find(i));
      m[x[i]][l[i].F]++;
      m[x[i]][l[i].S]++;
      for(int j=i+1; j<n; j++) {
        if(!intersectSS(l[i],l[j])) continue;
        P c=crosspoint(l[i],l[j]);
        s[x[i]].insert(c);
      }
    }
    sort(x.begin(),x.end());
    x.erase(unique(x.begin(),x.end()),x.end());
    int d[10];memset(d,0,sizeof(d));
    for(int i=0; i<x.size(); i++) {
      int y=x[i],c[3];memset(c,0,sizeof(c));
      for(map<P,int>::iterator it=m[y].begin(); it!=m[y].end(); it++) {
        if(it->S==2) c[1]++;
        else {
          if(s[y].count(it->F)) c[2]++;
          else c[0]++;
        }
      }
      for(int j=0; j<10; j++) {
        bool f=1;
        for(int k=0; k<3; k++) {
          if(w[j][k]!=c[k]) f=0;
        }
        if(f) {
          if(j!=2) d[j]++;
          else {
            for(int k=0; k<n; k++) {
              if(find(k)!=y) continue;
              if(!s[y].count(l[k].F)) {
                for(int kk=0; kk<n; kk++) {
                  if(k==kk) continue;
                  if(l[k].S==l[kk].F) {
                    if(ccw(l[k].F,l[k].S,l[kk].S)==-1) d[2]++;
                    else d[5]++;
                    goto end;
                  }
                  if(l[k].S==l[kk].S) {
                    if(ccw(l[k].F,l[k].S,l[kk].F)==-1) d[2]++;
                    else d[5]++;
                    goto end;
                  }
                }
              }
              if(!s[y].count(l[k].S)) {
                for(int kk=0; kk<n; kk++) {
                  if(k==kk) continue;
                  if(l[k].F==l[kk].F) {
                    if(ccw(l[k].S,l[k].F,l[kk].S)==-1) d[2]++;
                    else d[5]++;
                    goto end;
                  }
                  if(l[k].F==l[kk].S) {
                    if(ccw(l[k].S,l[k].F,l[kk].F)==-1) d[2]++;
                    else d[5]++;
                    goto end;
                  }
                }
              }
            }
          }
        end:;
          break;
        }
      }
    }
    for(int i=0; i<10; i++) {
      if(i)cout << " ";
      cout << d[i];
    }
    cout << endl;
  }
  return 0;
}


Measured memory_bytes: 1604