#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>

using namespace std;


vector<string> vs;
bool used[1010][100];

int search(int x,int y){
  // 0->E,1->º,2->¶,3->ã
  int sit=0;
  int cx=x;
  int cy=y;
  int over=1;
  int under=1;

  int high=0;

  int dx=1;
  int dy=0;

  int miny=10000000;
  int maxy=-1000000;
  while(1){
    used[cy][cx]=true;
    int nx=cx+dx;
    int ny=cy+dy;
    if(nx>=0&&ny>=0&&ny<vs.size()&&nx<vs[ny].size()
       &&vs[ny][nx]=='*'){
      cx=nx;
      cy=ny;
      miny=min(miny,ny);
      maxy=max(maxy,ny);
      if(sit==0)
	over++;
      else if(sit==2)
	under++;
      if(sit==3&&ny==y&&nx==x)
	break;
    }
    // Ú®ûüÌÏX
    else{
      if(sit==0){
	for(int i = -1; i <=1; i++){
	  int nnx=cx+i;
	  int nny=cy+1;
	  int nnnx=nnx+i;
	  int nnny=nny+1;
	  if(nnx>=0&&nny<vs.size()&&nny>=0&&nnx<vs[nny].size()
	     &&vs[nny][nnx]=='*'
	     &&nnnx>=0&&nnny<vs.size()&&nnny>=0&&nnnx<vs[nnny].size()
	     &&vs[nnny][nnnx]=='*'
	     ){
	    dy=1;
	    dx=i;
	    break;
	  }
	}
	sit=1;
      }
      else if(sit==1){
	// ¶ÖÚ®
	dx=-1;
	dy=0;
	sit=2;
      }
      else if(sit==2){
	// ãÖÚ®
	for(int i = -1; i <=1; i++){
	  int nnx=cx+i;
	  int nny=cy-1;
	  int nnnx=nnx+i;
	  int nnny=nny-1;
	  if(nnx>=0&&nny<vs.size()&&nny>=0&&nnx<vs[nny].size()
	     &&vs[nny][nnx]=='*'
	     &&nnnx>=0&&nnny<vs.size()&&nnny>=0&&nnnx<vs[nnny].size()
	     &&vs[nnny][nnnx]=='*'
	     ){
	    dy=-1;
	    dx=i;
	    break;
	  }
	}
	sit=3;
      }
    }
    // if(sit==0){
    //   int nx=cx+dx;
    //   int ny=cy+dy;
    //   if(nx>=0&&ny>=0&&ny<vs.size()&&nx<vs[ny].size()
    // 	 &&vs[ny][nx]=='*'){
    // 	cx=nx;
    // 	cy=ny;
    // 	miny=min(miny,ny);
    // 	maxy=max(maxy,ny);
    // 	over++;
    //   }
    //   // ºÖÚ®·éBÚ®ûüàT·
    //   else{
    // 	for(int i = -1; i <=1; i++){
    // 	  int nnx=cx+i;
    // 	  int nny=cy+1;
    // 	  int nnnx=nnx+i;
    // 	  int nnny=nny+1;
    // 	  if(nnx>=0&&nny<vs.size()&&nny>=0&&nnx<vs[nny].size()
    // 	     &&vs[nny][nnx]=='*'
    // 	     &&nnnx>=0&&nnny<vs.size()&&nnny>=0&&nnnx<vs[nnny].size()
    // 	     &&vs[nnny][nnnx]=='*'
    // 	     ){
    // 	    dy=1;
    // 	    dx=i;
    // 	    break;
    // 	  }
    // 	}
    // 	sit=1;
    //   }
    // }
    // else if(sit==1){
    //   int nx=cx+dx;
    //   int ny=cy+dy;
    //   if(nx>=0&&ny<vs.size()&&ny>=0&&nx<vs[ny].size()
    // 	 &&vs[ny][nx]=='*'){
    // 	cx=nx;
    // 	cy=ny;
    // 	miny=min(miny,ny);
    // 	maxy=max(maxy,ny);
    //   }
    //   else{
    // 	// ¶ÖÚ®
    // 	dx=-1;
    // 	dy=0;
    // 	sit=2;
    //   }
    // }
    // else if(sit==2){
    //   int nx=cx+dx;
    //   int ny=cy+dy;
    //   if(nx>=0&&ny<vs.size()&&ny>=0&&nx<vs[ny].size()
    // 	 &&vs[ny][nx]=='*'){
    // 	under++;
    // 	cx=nx;
    // 	cy=ny;
    // 	miny=min(miny,ny);
    // 	maxy=max(maxy,ny);
    //   }
    //   else{
    // 	// ãÖÚ®
    // 	for(int i = -1; i <=1; i++){
    // 	  int nnx=cx+i;
    // 	  int nny=cy-1;
    // 	  int nnnx=nnx+i;
    // 	  int nnny=nny-1;
    // 	  if(nnx>=0&&nny<vs.size()&&nny>=0&&nnx<vs[nny].size()
    // 	     &&vs[nny][nnx]=='*'
    // 	     &&nnnx>=0&&nnny<vs.size()&&nnny>=0&&nnnx<vs[nnny].size()
    // 	     &&vs[nnny][nnnx]=='*'
    // 	     ){
    // 	    dy=-1;
    // 	    dx=i;
    // 	    break;
    // 	  }
    // 	}
    // 	sit=3;
    //   }
    // }
    // else{
    //   int nx=cx+dx;
    //   int ny=cy+dy;
    //   cx=nx;
    //   cy=ny;
    //   if(ny==y&&nx==x)
    // 	break;
    // }
  }
  int res=(over+under)*(abs(miny-maxy)+1)/2;
  return res;
}

int main(){

  int n;
  bool b=false;
  while(cin>>n&&n!=0){
    if(b){
      cout<<"----------"<<endl;
    }
    b=true;
    memset(used,0,sizeof(used));
    int maxLength=0;
    string str;
    getline(cin,str);
    for(int i = 0; i < n; i++){
      getline(cin,str);
      vs.push_back(str);
      maxLength=max(maxLength,(int)str.size());
    }
    for(int i = 0; i < n; i++){
      int diff=maxLength-vs[i].size();
      for(int j = 0; j < diff; j++){
	vs[i]+=' ';
      }
    }
    map<int,int> mii;
    int res=0;
    for(int i = 0; i < vs.size(); i++){
      for(int j= 0;j<vs[i].size();j++){
	if(vs[i][j]=='*'&&!used[i][j]){
	  //cout<<i<<" "<<j<<endl;
	  //cout<<search(j,i)<<endl;
	  mii[search(j,i)]++;
	}
      }
    }
    for(map<int,int>::iterator it=mii.begin();it!=mii.end();it++){
      cout<<it->first<<" "<<it->second<<endl;
    }
    vs.clear();
  }
  return 0;
}

Measured memory_bytes: 0