#include<bits/stdc++.h>
using namespace std;
#define r(i,n) for(int i=0;i<n;i++)
typedef double D;
typedef complex<D> P;
typedef pair<P,P>L;
typedef vector<L> VP;
const D EPS = 1e-9;
#define fi first
#define se second
#define mk make_pair
#define X real()
#define Y imag()
#define LE(n,m) ((n) < (m) + EPS)
#define GE(n,m) ((n) + EPS > (m))
#define EQ(n,m) (abs((n)-(m)) < EPS)
D dot(P a, P b) {return (conj(a)*b).X; }
D cross(P a, P b) {  return (conj(a)*b).Y;}
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 isecLP(P a1, P a2, P b) {
  return abs(ccw(a1, a2, b)) != 1;
}
bool isecLL(P a1, P a2, P b1, P b2) {
  return !isecLP(a2-a1, b2-b1, 0) || isecLP(a1, b1, b2);
}
bool isecLS(P a1, P a2, P b1, P b2) {
  return cross(a2-a1, b1-a1) * cross(a2-a1, b2-a1) < EPS;
}
bool isecSS(P a1, P a2, P b1, P b2) {
  return ccw(a1, a2, b1)*ccw(a1, a2, b2) <= 0 &&
         ccw(b1, b2, a1)*ccw(b1, b2, a2) <= 0;
}
bool isecSP(P a1, P a2, P b) {
  return !ccw(a1, a2, b);
  // return abs(a1 - b) + abs(a2 - b) - abs(a2 - a1) < EPS;  //Perfective
}
double x3,x4,y3,y4;
VP v,t,x,cv,ch;
int n,a[10];
bool ch_dfs(int p){
  r(i,v.size())if(i!=p){
    if(v[p].first==v[i].first)return 1;
    if(v[p].first==v[i].second)return 1;
    if(v[p].second==v[i].first)return 1;
    if(v[p].second==v[i].second)return 1;
  }
  return 0;
}
void dfs(int d){
  r(i,cv.size()){
    r(j,v.size()){
      if(v[j].first==cv[i].first||v[j].first==cv[i].second||
         v[j].second==cv[i].first||v[j].second==cv[i].second){
        cv.push_back(v[j]);
        v.erase(v.begin()+j);
        j--;
        dfs(d+1);
        return ;
      }
    }
  }
  if(d==2){
    r(i,t.size()){
      r(j,cv.size()){
        if(isecSS(cv[j].fi,cv[j].se,t[i].fi,t[i].se)){
          t.erase(t.begin()+i);
          i--;
        }
      }
    }
    a[4]++;
  }
  else if(d==3){
    int flag=0;
    r(i,t.size()){
      r(j,cv.size()){
        if(isecSS(cv[j].fi,cv[j].se,t[i].fi,t[i].se)){
          t.erase(t.begin()+i);
          flag++;
          i--;
        }
      }
    }
    if(flag)a[3]++;
    else a[7]++;
  }
  else if(d==4){
    int flag=0;
    r(i,cv.size()){
      r(j,cv.size()){
        if(cv[i].first==cv[j].first) flag++;
        else if(cv[i].first==cv[j].second) flag++;
        else if(cv[i].second==cv[j].first) flag++;
        else if(cv[i].second==cv[j].second) flag++;
      }
    }
    if(flag==12){
      flag=0;
      r(i,t.size()){
        r(j,cv.size()){
          if(isecSS(cv[j].fi,cv[j].se,t[i].fi,t[i].se)){
            t.erase(t.begin()+i);
            flag++;
            i--;
          }
        }
      }
      if(flag) a[8]++;
      else a[0]++;
    }
    else a[9]++;
  }
  else{
    ch.clear();
    r(i,cv.size()){
      int f=0;
      r(j,cv.size()){
        if(i!=j){
          if(cv[i].first==cv[j].first) f++;
          else if(cv[i].first==cv[j].second) f++;
          else if(cv[i].second==cv[j].first) f++;
          else if(cv[i].second==cv[j].second) f++; 
        }
      }
      if(f==1){
        ch.push_back(cv[i]);
        cv.erase(cv.begin()+i);
        break;
      }
    }
    r(i,4){
      r(j,cv.size()){
        if(ch[i].first==cv[j].first||ch[i].first==cv[j].second||
           ch[i].second==cv[j].first||ch[i].second==cv[j].second){
          ch.push_back(cv[j]);
          cv.erase(cv.begin()+j);
          break;
        }
      }
    }
    if(isecSS(ch[0].fi,ch[0].se,ch[3].fi,ch[3].se)||isecSS(ch[1].fi,ch[1].se,ch[4].fi,ch[4].se)){
      a[6]++;
      return ;
    }
    int fl=0;
    P p;
    if(ch[0].first==ch[1].first)p=ch[1].second,fl++;
    else if(ch[0].first==ch[1].second)p=ch[1].first,fl++;
    if(fl){
      if(ccw(ch[0].second,ch[0].first,p)==-1)a[2]++;
      else a[5]++;
      return;
    }
    if(ch[0].second==ch[1].first)p=ch[1].second;
    else if(ch[0].second==ch[1].second) p=ch[1].first;
    if(ccw(ch[0].first,ch[0].second,p)==-1)a[2]++;
    else a[5]++;
  }
}
int main(){
  while(cin>>n,n){
    t.clear();
    memset(a,0,sizeof(a));
    r(i,n){
      cin>>x3>>y3>>x4>>y4;
      v.push_back(mk(P(x3,y3),P(x4,y4)));
    }
    r(i,(int)v.size()){
      if(!ch_dfs(i)){
        t.push_back(v[i]);
        v.erase(v.begin()+i);
        i--;
      }
    }
    while(!v.empty()){
      cv.clear();
      cv.push_back(v[0]);
      v.erase(v.begin());
      dfs(1);
    }
    a[1]=t.size();
    r(i,10){
      if(i)cout<<' ';
      cout<<a[i];
    }
    cout<<endl;
  }
}

Measured memory_bytes: 3332