diff --git a/html/37.php b/html/37.php
new file mode 100644
index 0000000000000000000000000000000000000000..939826af1f16357fbdf1e15d66602f1c84afcd29
--- /dev/null
+++ b/html/37.php
@@ -0,0 +1,32 @@
+---
+layout: default
+saison: 37
+date: '2022-10-21'
+ligaspieltag: 8
+step: 1
+finals_step: 2
+finalteams: 8
+startliste:
+  -
+    - is
+    - es
+    - bw
+    - nl
+    - cm
+    - se
+    - co
+    - pl
+    - tz
+
+startliste_partien_pause:
+  - 2
+  - 2
+  - 2
+  - 2
+  - 2
+  - 2
+  - 2
+  - 2
+  - 2
+  - 0
+---
diff --git a/html/_data/global.yml b/html/_data/global.yml
index c2fd52e0bb7629912a30d232bf7081e8323e8117..3784f1df686e3930c2c39fb932778ceccdff9e13 100644
--- a/html/_data/global.yml
+++ b/html/_data/global.yml
@@ -1 +1 @@
-saison_now: 36
+saison_now: 37
diff --git a/html/_layouts/default.php b/html/_layouts/default.php
index 7bd9f1ea8729ec282ea90dde759e7fee0c8ec32b..fbc8083a38f1446fee9a1f580d958e4f80e7e899 100644
--- a/html/_layouts/default.php
+++ b/html/_layouts/default.php
@@ -43,10 +43,12 @@ if( !empty($csv) ){
         $w=preg_split('/,/',$v);
         if( !empty($TEAMS[$w[0]]) ){
           if( $TEAMS[$w[0]] == $w[1] ){
-            db_addSpieler($v,$secret);
+            //db_addSpieler($v,$secret);
           }
         }
       }
+    } else if( trim($C[0]) == 'SpielerID,Spieler,Alter,Nt,Saison,Liga,TeamID,Team,S,T,A,Z+,Z-,Zd,Bk,Bi+,Bi-,Attr,Face,Karriereende' ){
+      db_addSpieler(array_pop($C),$secret);
     }
   }
 
@@ -100,7 +102,7 @@ if( !empty($csv) ){
     STATISTIK_SAISON={};
     STAT_SAISON.forEach(
       function(v,i){
-        if( STATISTIK_SAISON[v.SpielerID] == undefined ) STATISTIK_SAISON[v.SpielerID]={ 'S' :0, 'T' : 0, 'A' : 0, 'Z' : 0, 'Zpos' : 0, 'Zneg' : 0, 'MID' : [] };
+        if( STATISTIK_SAISON[v.SpielerID] == undefined ) STATISTIK_SAISON[v.SpielerID]={ 'S' :0, 'T' : 0, 'A' : 0, 'Z' : 0, 'Zpos' : 0, 'Zneg' : 0, 'MID' : [], 'face' : '' };
         STATISTIK_SAISON[v.SpielerID].S++;
         STATISTIK_SAISON[v.SpielerID].T+=v.Tore*1;
         STATISTIK_SAISON[v.SpielerID].A+=v.Assists*1;
@@ -113,13 +115,14 @@ if( !empty($csv) ){
         STATISTIK_SAISON[v.SpielerID].age_saison=v.age_saison*1;
         STATISTIK_SAISON[v.SpielerID].nt=v.nt;
         STATISTIK_SAISON[v.SpielerID].attr=v.attr;
+        STATISTIK_SAISON[v.SpielerID].face=v.face;
       }
     );
 
     STATISTIK_ALL={};
     STAT_ALL.forEach(
       function(v,i){
-        if( STATISTIK_ALL[v.SpielerID] == undefined ) STATISTIK_ALL[v.SpielerID]={ 'S' :0, 'T' : 0, 'A' : 0, 'Z' : 0, 'Zpos' : 0, 'Zneg' : 0, 'MID' : [] };
+        if( STATISTIK_ALL[v.SpielerID] == undefined ) STATISTIK_ALL[v.SpielerID]={ 'S' :0, 'T' : 0, 'A' : 0, 'Z' : 0, 'Zpos' : 0, 'Zneg' : 0, 'MID' : [], 'face' : '' };
         STATISTIK_ALL[v.SpielerID].S++;
         STATISTIK_ALL[v.SpielerID].T+=v.Tore*1;
         STATISTIK_ALL[v.SpielerID].A+=v.Assists*1;
@@ -132,6 +135,7 @@ if( !empty($csv) ){
         STATISTIK_ALL[v.SpielerID].age_saison=v.age_saison*1;
         STATISTIK_ALL[v.SpielerID].nt=v.nt;
         STATISTIK_ALL[v.SpielerID].attr=v.attr;
+        STATISTIK_ALL[v.SpielerID].face=v.face;
       }
     );
 
@@ -153,16 +157,16 @@ if( !empty($csv) ){
           calculatePartien('{{ page.saison }}', '{{ page.date }}');
           calculatePunktestand('{{ page.saison }}', '7');
           //calculatePunktestand( 0, '7');
-          calculateTore('{{ page.saison }}');
-          calculateAssists('{{ page.saison }}');
-          calculateZwk('{{ page.saison }}');
+          calculateTabelle('{{ page.saison }}','T');
+          calculateTabelle('{{ page.saison }}','A');
+          calculateTabelle('{{ page.saison }}','Z');
 
           $('h4.tabelle button').on('click',
             function(){
               $('h4.tabelle button').toggleClass('active',false);
               $(this).toggleClass('active',true);
               $('table.tabelle').toggleClass('d-none',true);
-              $('#tabelle_'+$(this).text().toLowerCase()).toggleClass('d-none',false);
+              $('#tabelle_'+$(this).text()[0]).toggleClass('d-none',false);
             }
           );
           $('#news tbody').html('');
@@ -231,6 +235,33 @@ if( !empty($csv) ){
               $(td).text( st == 1 ? 'vor ' + st + ' Tag' : 'vor ' + st + ' Tagen' );
               $(tr).append(td);
 
+              var td = document.createElement('td');
+              var div = document.createElement('div');
+              div.classList='face';
+
+              var img = document.createElement('img');
+              img.src='images/facegenerator/fg_head_' + v.face.split(/_/g)[0] + '.png';
+              $(div).append(img);
+
+              var img = document.createElement('img');
+              img.src='images/facegenerator/fg_hair_' + v.face.split(/_/g)[1] + '.png';
+              $(div).append(img);
+
+              var img = document.createElement('img');
+              img.src='images/facegenerator/fg_beard_' + v.face.split(/_/g)[2] + '.png';
+              $(div).append(img);
+
+              var img = document.createElement('img');
+              img.src='images/facegenerator/fg_mouth_' + v.face.split(/_/g)[3] + '.png';
+              $(div).append(img);
+
+              var img = document.createElement('img');
+              img.src='images/facegenerator/fg_eyes_' + v.face.split(/_/g)[4] + '.png';
+              $(div).append(img);
+
+              $(td).append(div);
+              $(tr).append(td);
+
               var td = document.createElement('td');
               var img = document.createElement('img');
 
@@ -310,7 +341,7 @@ if( !empty($csv) ){
     </div>
     <h4 class="tabelle">Tabelle <button>Zweikampf</button><button>Assists</button><button>Tore</button><button class="punktestand active">Punktestand</button></h2>
 
-    <table id="tabelle_punktestand" class="tabelle">
+    <table id="tabelle_P" class="tabelle">
       <thead>
         <tr>
           <th>Pl.</th>
@@ -333,11 +364,12 @@ if( !empty($csv) ){
       </tbody>
     </table>
 
-    <table id="tabelle_tore" class="tabelle d-none">
+    <table id="tabelle_T" class="tabelle d-none">
       <thead>
         <tr>
           <th>Pl.</th>
           <th>Sp.</th>
+          <th></th>
           <th>Name</th>
           <th>Team</th>
           <th>T</th>
@@ -347,11 +379,12 @@ if( !empty($csv) ){
       </tbody>
     </table>
 
-    <table id="tabelle_assists" class="tabelle d-none">
+    <table id="tabelle_A" class="tabelle d-none">
       <thead>
         <tr>
           <th>Pl.</th>
           <th>Sp.</th>
+          <th></th>
           <th>Name</th>
           <th>Team</th>
           <th>A</th>
@@ -361,11 +394,12 @@ if( !empty($csv) ){
       </tbody>
     </table>
 
-    <table id="tabelle_zweikampf" class="tabelle d-none">
+    <table id="tabelle_Z" class="tabelle d-none">
       <thead>
         <tr>
           <th>Pl.</th>
           <th>Sp.</th>
+          <th></th>
           <th>Name</th>
           <th>Team</th>
           <th>Z</th>
@@ -401,6 +435,7 @@ if( !empty($csv) ){
     <table id="news">
       <thead>
         <th>Zeit</th>
+        <th></th>
         <th>Nt</th>
         <th>Spieler</th>
         <th>Team</th>
diff --git a/html/assets/css/custom.scss b/html/assets/css/custom.scss
index e97d47f02bebee0e9cfa87927287e68d22aa3005..350dea50c8e177056d03e4d1945cdc6f877aee29 100644
--- a/html/assets/css/custom.scss
+++ b/html/assets/css/custom.scss
@@ -177,6 +177,7 @@ tr.begegnungen {
 img.flags {
   width: 20px;
   border: 1px solid darkgrey;
+  /*margin-right: 10px; */
 }
 
 #copypaste {
@@ -239,7 +240,7 @@ tr.stats {
   }
 }
 
-#tabelle_tore, #tabelle_assists, #tabelle_zweikampf {
+#tabelle_T, #tabelle_A, #tabelle_Z {
   tr {
     td,th {
       &:last-child {
@@ -248,8 +249,17 @@ tr.stats {
       }
       &:nth-child(1) { width: 30px; text-align: right; }
       &:nth-child(2) { width: 30px; text-align: right; }
-      &:nth-child(3) { width: 280px; }
-      &:nth-child(4) { width: 200px; }
+      &:nth-child(3) { width: 30px; text-align: right; }
+      &:nth-child(4) { width: 280px; }
+      &:nth-child(5) { width: 200px; }
+    }
+  }
+}
+
+#tabelle_team {
+  tr {
+    td,th {
+      &:nth-child(1) { width: 350px; text-align: left; }
     }
   }
 }
@@ -346,21 +356,72 @@ td.n { color: firebrick; }
   thead { display: table; }
   tbody { display: block; max-height: 200px; overflow: auto; }
   tr > th,td {
-    &:nth-child(1) { width: 100px; }
-    &:nth-child(2) { width: 30px; }
-    &:nth-child(3) { width: 270px; }
-    &:nth-child(4) { width: 200px; }
+    &:nth-child(1) { width: 70px; }
+    &:nth-child(2) { width: 20px; }
+    &:nth-child(3) { width: 30px; }
+    &:nth-child(4) { width: 270px; }
+    &:nth-child(5) { width: 190px; }
   }
   tr > td:nth-child(1){ font-size: 0.7em; }
   tr:nth-child(odd){
     background: whitesmoke;
   }
-  i.fas {
-    padding-right:5px;
-  }
+
 }
 
 .mono {
   font-family: monospace;
   font-size: 1.2em;
 }
+
+.face {
+  position: fixed;
+  top: 100px;
+  right: 65%;
+  > img {
+    position: absolute;
+    &:nth-child(1){ z-index: 1 }
+    &:nth-child(2){ z-index: 5 }
+    &:nth-child(3){ z-index: 2 }
+    &:nth-child(4){ z-index: 3 }
+    &:nth-child(5){ z-index: 4; position: relative; }
+  }
+  span {
+    margin-left:10px;
+  }
+}
+
+#news div.face {
+  position: relative;
+  img {
+    width: 20px;
+    left: 12px;
+    top: -100px;
+  }
+}
+
+.tabelle td.face {
+  position: initial;
+  img {
+    width: 20px;
+  }
+}
+
+.tabelle span.face {
+  position: initial;
+  img {
+    width: 20px;
+    margin-right: 10px;
+  }
+}
+
+
+
+
+i.fas {
+  padding-right:5px;
+}
+
+.tabelle img.flags {
+  margin-right: 5px;
+}
diff --git a/html/assets/js/script.js b/html/assets/js/script.js
index 84c2ec780f757aa82fbbfbd5c19fc893b0734b80..d14b407eb8f8285819d01c3193bd5dd16e875597 100644
--- a/html/assets/js/script.js
+++ b/html/assets/js/script.js
@@ -429,7 +429,7 @@ function calculatePunktestand(saison,runde,show=true){
     return Tabelle;
   }
 
-  var tabelle='#tabelle_punktestand tbody';
+  var tabelle='#tabelle_P tbody';
   $(tabelle).html('');
 
   var TabelleLast= ( saison > 26 ) ? calculateAllPunktestand()[saison-27] : [];
@@ -451,7 +451,7 @@ function calculatePunktestand(saison,runde,show=true){
       var finalist=( calculateAllPunktestand().filter((a) => ( a[1].nt == v.nt.toLowerCase() ) ).length + ERGEBNISSE.filter((a) => ( a.runde=='F' && ( a.H.toLowerCase() == v.nt.toLowerCase() && a.TH < a.TA || a.A.toLowerCase() == v.nt.toLowerCase() && a.TH > a.TA ) ) ).length );
 
       tmp+='<td class="'+border+'">'+S+'</td>';
-      tmp+='<td class="'+border+'"><img class="flags" src="./images/flags/'+(( v.flag ) ? v.flag : v.nt.toLowerCase())+'.svg"> <a href="javascript:calculateTeam('+((saison == 0) ? SAISON_NOW : saison)+',\''+v.nt+'\')">'+v.name.replace(/\(NL\)/g,'<sup>'+v.nt.toUpperCase()+'</sup></a>')+' <a href="'+v.link+'" target="ultrasoccer"><i class="fas fa-link"></i></a>'+(( trophy.toLowerCase() == v.nt.toLowerCase() ) ? ' <i class="fas fa-trophy"></i>' : '') +
+      tmp+='<td class="'+border+'"><img class="flags" src="./images/flags/'+(( v.flag ) ? v.flag : v.nt.toLowerCase())+'.svg"> <a href="javascript:calculateTeam('+((saison == 0 && false) ? SAISON_NOW : saison)+',\''+v.nt+'\')">'+v.name.replace(/\(NL\)/g,'<sup>'+v.nt.toUpperCase()+'</sup></a>')+' <a href="'+v.link+'" target="ultrasoccer"><i class="fas fa-link"></i></a>'+(( trophy.toLowerCase() == v.nt.toLowerCase() ) ? ' <i class="fas fa-trophy"></i>' : '') +
       ' '+(( master.toLowerCase() == v.nt.toLowerCase() ) ? ' <i class="fas fa-crown"></i>' : '') +'</td>';
       tmp+='<td class="'+border+'">'+((pokal>0) ? pokal : '')+'</td>';
       tmp+='<td class="'+border+'">'+((meistertitel>0) ? meistertitel : '')+'</td>';
@@ -471,126 +471,257 @@ function calculatePunktestand(saison,runde,show=true){
 
 }
 
-function calculateTore(saison){
+function calculateTabelle(saison,param){
   var STATISTIK=saison == 0 ? STATISTIK_ALL : STATISTIK_SAISON;
-  var n=Object.entries( STATISTIK ).sort( function(a,b){ return ( ( a[1].T < b[1].T || ( a[1].T == b[1].T && a[1].S > b[1].S ) ) ? 1 : -1 ) } ).slice(0,10).map(
+  var n=Object.entries( STATISTIK ).sort( (a,b) => ( a[1][param] < b[1][param] || ( a[1][param] == b[1][param] && a[1].S > b[1].S ) ) ? 1 : -1 ).slice(0,10).map(
     function(v,i){
       var team=TEAMS.filter( (a) => ( a.nt == v[1].nt ) );
+
       if( team.length == 0 ){
-        var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">';
-        var team_name='';
+        var flag = document.createElement('img');
+        flag.classList='flags';
+        flag.src='./images/flags/xx.svg'
+        flag.title='n/a';
+        //var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">';
+        //var team_name='';
+        var span = document.createElement('span');
+        span.innerText='';
+
       } else {
-        var team_flag='<img class="flags" src="./images/flags/'+(( team[0].flag ) ? team[0].flag : team[0].nt.toLowerCase())+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">';
-        var team_name='<a href="javascript:calculateTeam('+saison+',\''+team[0].nt+'\')">'+team[0].name.replace(/\(NL\)/g,'<sup>'+team[0].nt.toUpperCase()+'</sup></a>')+' <a href="'+team[0].link+'" target="ultrasoccer"><i class="fas fa-link"></i></a>';
+
+        var face = document.createElement('td');
+        face.classList='face';
+
+        var img = document.createElement('img');
+        img.src='images/facegenerator/fg_head_' + v[1].face.split(/_/g)[0] + '.png';
+        $(face).append(img);
+
+        var img = document.createElement('img');
+        img.src='images/facegenerator/fg_hair_' + v[1].face.split(/_/g)[1] + '.png';
+        $(face).append(img);
+
+        var img = document.createElement('img');
+        img.src='images/facegenerator/fg_beard_' + v[1].face.split(/_/g)[2] + '.png';
+        $(face).append(img);
+
+        var img = document.createElement('img');
+        img.src='images/facegenerator/fg_mouth_' + v[1].face.split(/_/g)[3] + '.png';
+        $(face).append(img);
+
+        var img = document.createElement('img');
+        img.src='images/facegenerator/fg_eyes_' + v[1].face.split(/_/g)[4] + '.png';
+        $(face).append(img);
+
+        var flag = document.createElement('img');
+        flag.classList='flags';
+        flag.src='./images/flags/'+(( team[0].flag ) ? team[0].flag : team[0].nt.toLowerCase())+'.svg';
+        flag.title=team[0].name.split('(NL)')[0].trim();
+
+        var span = document.createElement('span');
+        var a_ = document.createElement('a');
+        a_.href='javascript:calculateTeam('+saison+',\''+team[0].nt+'\')';
+        a_.innerHTML=team[0].name.replace(/\(NL\)/g,'<sup>'+team[0].nt.toUpperCase()+'</sup> ');
+        span.append(a_);
+
+        var a_ = document.createElement('a');
+        a_.href=team[0].link;
+        a_.target='ultrasoccer';
+        var i_ = document.createElement('i');
+        i_.classList='fas fa-link';
+        a_.append(i_);
+        span.append(a_);
       }
 
-      var attr=((v[1].attr != undefined) ? v[1].attr : '').split(' ').map( (a) => ( a != '' ? '<i class="fas '+a+'"></i>' : '' ) ).join(' ');
+      var attr=document.createElement('span');
+      attr.innerHTML=((v[1].attr != undefined) ? v[1].attr : '').split(' ').map( (a) => ( a != '' && a != 'fas' ? '<i class="fas '+a+'"></i>' : '' ) ).join('');
+
+      var tr=document.createElement('tr');
+
+      var td=document.createElement('td');
+      td.innerText=(i+1);
+      tr.append(td);
+
+      var td=document.createElement('td');
+      td.innerText=(( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0);
+      tr.append(td);
+
+      tr.append(face);
+
+      var td=document.createElement('td');
+      td.append(flag);
+      td.append(attr);
+
+      var a_=document.createElement('a');
+      a_.href='https://ultrasoccer.de/playerprofile/?id='+v[0];
+      a_.target='ultrasoccer';
+      a_.innerText=(( v[1].name != null ) ? v[1].name+' ('+(v[1].age*1+((saison == 0 ) ? SAISON_NOW : saison )*1-v[1].age_saison)+')' : v[0] );
+      td.append(a_);
+      tr.append(td);
+
+      var td=document.createElement('td');
+      td.append(span)
+      tr.append(td);
+
+      var td=document.createElement('td');
+      td.innerText = ( param == 'Z' &&  v[1][param] > 0 ) ? '+' + v[1][param] :  v[1][param];
+      if( param == 'Z' ) td.classList = v[1][param] > 0 ? 'p' : ( v[1][param] == 0 ) ? 'u' : 'n';
+      tr.append(td);
+
+      return tr;
 
-      return '<td>'+
-      [
-        i+1,
-        (( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0),
-        team_flag+' '+attr+' '+(( v[1].name != null ) ? v[1].name+' ('+(v[1].age*1+((saison == 0 ) ? SAISON_NOW : saison )*1-v[1].age_saison)+')' : '<a href="https://ultrasoccer.de/playerprofile/?id='+v[0]+'" target="ultrasoccer">'+v[0]+'</a>' ),
-        team_name,
-        v[1].T
-      ].join('</td><td>')+'</td>';
     }
   );
-  $('#tabelle_tore tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' );
+
+  $('#tabelle_'+param+' tbody').html( n );
 }
-function calculateAssists(saison){
+
+function calculateTeam_old(saison,nt){
   var STATISTIK=saison == 0 ? STATISTIK_ALL : STATISTIK_SAISON;
-  var n=Object.entries( STATISTIK ).sort( (a,b) => ( a[1].A < b[1].A || ( a[1].A == b[1].A && a[1].S > b[1].S ) ) ? 1 : -1 ).slice(0,10).map(
-    function(v,i){
-      var team=TEAMS.filter( (a) => ( a.nt == v[1].nt ) );
+
+  var n=SPIELER.filter( (a) => ( a.nt == nt ) ).map( (b) => ( STATISTIK[b.id] ) ).filter( (c) => ( c !== undefined ) ).map(
+    function(v){
+
+      var team=TEAMS.filter( (a) => ( a.nt == v.nt ) );
       if( team.length == 0 ){
         var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">';
         var team_name='';
       } else {
         var team_flag='<img class="flags" src="./images/flags/'+(( team[0].flag ) ? team[0].flag : team[0].nt.toLowerCase())+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">';
-        var team_name='<a href="javascript:calculateTeam('+saison+',\''+team[0].nt+'\')">'+team[0].name.replace(/\(NL\)/g,'<sup>'+team[0].nt.toUpperCase()+'</sup></a>')+' <a href="'+team[0].link+'" target="ultrasoccer"><i class="fas fa-link"></i></a>';
+        var team_name='<a href="'+team[0].link+'" target="ultrasoccer">'+team[0].name+'</a>';
       }
 
-      var attr=((v[1].attr != undefined) ? v[1].attr : '').split(' ').map( (a) => ( a != '' ? '<i class="fas '+a+'"></i>' : '' ) ).join(' ');
+      var attr=((v.attr != undefined) ? v.attr : '').split(' ').map( (a) => ( a != '' ? '<i class="fas '+a+'"></i>' : '' ) ).join(' ');
 
-      return '<td>'+
-      [
-        i+1,
-        (( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0),
-        team_flag+' '+attr+' '+(( v[1].name != null ) ? v[1].name+' ('+(v[1].age*1+((saison == 0 ) ? SAISON_NOW : saison )*1-v[1].age_saison)+')' : '<a href="https://ultrasoccer.de/playerprofile/?id='+v[0]+'" target="ultrasoccer">'+v[0]+'</a>' ),
-        team_name,
-        v[1].A
-      ].join('</td><td>')+'</td>';
+      var tmp='';
+      tmp+='<td>'+team_flag+' '+attr+' '+v.name+'</td>';
+      tmp+='<td>'+(v.age*1+saison*1-v.age_saison)+'</td>';
+      tmp+='<td>'+v.S+'/'+v.T+'/'+v.A+'</td>';
+      tmp+='<td class="'+(( v.Z > 0 ) ? 'p' : (( v.Z < 0 ) ? 'n' : 'u' ) )+'">'+v.Zpos+'/'+v.Zneg+'</td>';
+      return tmp;
     }
   );
-  $('#tabelle_assists tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' );
+  $('table.tabelle').toggleClass('d-none',true);
+  $('#tabelle_team').toggleClass('d-none',false);
+  $('#tabelle_team tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' );
 }
-function calculateZwk(saison){
+function calculateTeam(saison,nt){
   var STATISTIK=saison == 0 ? STATISTIK_ALL : STATISTIK_SAISON;
-  var n=Object.entries( STATISTIK ).sort( (a,b) => ( a[1].Z < b[1].Z || ( a[1].Z == b[1].Z && a[1].S > b[1].S ) ) ? 1 : -1 ).slice(0,10).map(
+
+  var n=SPIELER.filter( (a) => ( a.nt == nt ) ).map( (b) => ( [ b.id, STATISTIK[b.id] ] ) ).filter( (c) => ( c[1] !== undefined ) ).map(
     function(v,i){
+
+      console.log(v,i);
       var team=TEAMS.filter( (a) => ( a.nt == v[1].nt ) );
       if( team.length == 0 ){
-        var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">';
-        var team_name='';
+        var flag = document.createElement('img');
+        flag.classList='flags';
+        flag.src='./images/flags/xx.svg'
+        flag.title='n/a';
+        //var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">';
+        //var team_name='';
+        var span = document.createElement('span');
+        span.innerText='';
+
       } else {
-        var team_flag='<img class="flags" src="./images/flags/'+(( team[0].flag ) ? team[0].flag : team[0].nt.toLowerCase())+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">';
-        var team_name='<a href="javascript:calculateTeam('+saison+',\''+team[0].nt+'\')">'+team[0].name.replace(/\(NL\)/g,'<sup>'+team[0].nt.toUpperCase()+'</sup></a>')+' <a href="'+team[0].link+'" target="ultrasoccer"><i class="fas fa-link"></i></a>';
+
+        var face = document.createElement('span');
+        face.classList='face';
+
+        var img = document.createElement('img');
+        img.src='images/facegenerator/fg_head_' + v[1].face.split(/_/g)[0] + '.png';
+        $(face).append(img);
+
+        var img = document.createElement('img');
+        img.src='images/facegenerator/fg_hair_' + v[1].face.split(/_/g)[1] + '.png';
+        $(face).append(img);
+
+        var img = document.createElement('img');
+        img.src='images/facegenerator/fg_beard_' + v[1].face.split(/_/g)[2] + '.png';
+        $(face).append(img);
+
+        var img = document.createElement('img');
+        img.src='images/facegenerator/fg_mouth_' + v[1].face.split(/_/g)[3] + '.png';
+        $(face).append(img);
+
+        var img = document.createElement('img');
+        img.src='images/facegenerator/fg_eyes_' + v[1].face.split(/_/g)[4] + '.png';
+        $(face).append(img);
+
+        var flag = document.createElement('img');
+        flag.classList='flags';
+        flag.src='./images/flags/'+(( team[0].flag ) ? team[0].flag : team[0].nt.toLowerCase())+'.svg';
+        flag.title=team[0].name.split('(NL)')[0].trim();
+
+        var span = document.createElement('span');
+        var a_ = document.createElement('a');
+        a_.href='javascript:calculateTeam('+saison+',\''+team[0].nt+'\')';
+        a_.innerHTML=team[0].name.replace(/\(NL\)/g,'<sup>'+team[0].nt.toUpperCase()+'</sup> ');
+        span.append(a_);
+
+        var a_ = document.createElement('a');
+        a_.href=team[0].link;
+        a_.target='ultrasoccer';
+        var i_ = document.createElement('i');
+        i_.classList='fas fa-link';
+        a_.append(i_);
+        span.append(a_);
       }
 
-      var attr=((v[1].attr != undefined) ? v[1].attr : '').split(' ').map( (a) => ( a != '' ? '<i class="fas '+a+'"></i>' : '' ) ).join(' ');
+      var attr=document.createElement('span');
+      attr.innerHTML=((v[1].attr != undefined) ? v[1].attr : '').split(' ').map( (a) => ( a != '' && a != 'fas' ? '<i class="fas '+a+'"></i>' : '' ) ).join('');
 
-      return '<td>'+
-      [
-        i+1,
-        (( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0),
-        team_flag+' '+attr+' '+(( v[1].name != null ) ? v[1].name+' ('+(v[1].age*1+((saison == 0 ) ? SAISON_NOW : saison )*1-v[1].age_saison)+')' : '<a href="https://ultrasoccer.de/playerprofile/?id='+v[0]+'" target="ultrasoccer">'+v[0]+'</a>' ),
-        team_name,
-        (( v[1].Z > 0 ) ? '+' : '' )+v[1].Z
-      ].join('</td><td>')+'</td>';
-    }
-  );
+      var tr=document.createElement('tr');
 
-  $('#tabelle_zweikampf tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' );
-}
-function calculateTeam(saison,nt){
-  var STATISTIK=saison == 0 ? STATISTIK_ALL : STATISTIK_SAISON;
+      var td=document.createElement('td');
+      td.append(face);
+      td.append(flag);
+      td.append(attr);
+      var a_=document.createElement('a');
+      a_.href='https://ultrasoccer.de/playerprofile/?id='+i;
+      a_.target='ultrasoccer';
+      a_.innerText=(( v[1].name != null ) ? v[1].name : v[0] );
+      td.append(a_);
+      tr.append(td);
 
-  var n=SPIELER.filter( (a) => ( a.nt == nt ) ).map( (b) => ( STATISTIK[b.id] ) ).filter( (c) => ( c !== undefined ) ).map(
-    function(v){
 
-      var team=TEAMS.filter( (a) => ( a.nt == v.nt ) );
-      if( team.length == 0 ){
-        var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">';
-        var team_name='';
-      } else {
-        var team_flag='<img class="flags" src="./images/flags/'+(( team[0].flag ) ? team[0].flag : team[0].nt.toLowerCase())+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">';
-        var team_name='<a href="'+team[0].link+'" target="ultrasoccer">'+team[0].name+'</a>';
-      }
+      var td=document.createElement('td');
+      td.innerText=(v[1].age*1+((saison == 0 ) ? SAISON_NOW : saison )*1-v[1].age_saison);
+      tr.append(td);
 
-      var attr=((v.attr != undefined) ? v.attr : '').split(' ').map( (a) => ( a != '' ? '<i class="fas '+a+'"></i>' : '' ) ).join(' ');
+      var td=document.createElement('td');
+      td.innerText=v[1].S+'/'+v[1].T+'/'+v[1].A;
+      tr.append(td);
 
+      var td=document.createElement('td');
+      td.innerText=v[1].Zpos+'/'+v[1].Zneg;
+      td.classList=(( v[1].Z > 0 ) ? 'p' : (( v[1].Z < 0 ) ? 'n' : 'u' ) )
+      tr.append(td);
+
+      /*
       var tmp='';
       tmp+='<td>'+team_flag+' '+attr+' '+v.name+'</td>';
       tmp+='<td>'+(v.age*1+saison*1-v.age_saison)+'</td>';
       tmp+='<td>'+v.S+'/'+v.T+'/'+v.A+'</td>';
       tmp+='<td class="'+(( v.Z > 0 ) ? 'p' : (( v.Z < 0 ) ? 'n' : 'u' ) )+'">'+v.Zpos+'/'+v.Zneg+'</td>';
       return tmp;
+      */
+
+      return tr;
     }
   );
   $('table.tabelle').toggleClass('d-none',true);
   $('#tabelle_team').toggleClass('d-none',false);
-  $('#tabelle_team tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' );
+  $('#tabelle_team tbody').html( n );
 }
 function calculateEwige(){
   calculatePunktestand(0,'7');
-  calculateTore(0);
-  calculateAssists(0);
-  calculateZwk(0);
+  calculateTabelle(0,'T');
+  calculateTabelle(0,'A');
+  calculateTabelle(0,'Z');
   $('button.active').toggleClass('active',false);
   $('#ewige').toggleClass('active',true);
   $('table.tabelle').toggleClass('d-none',true);
-  $('#tabelle_punktestand').toggleClass('d-none');
+  $('#tabelle_P').toggleClass('d-none');
   $('h4.tabelle > button.punktestand').toggleClass('active',true);
   $('h4.tabelle').toggleClass('d-none',false);
 }
diff --git a/html/functions/db_methods.php b/html/functions/db_methods.php
index c28d84194e3be2b46f72a9646820d04623c4fb67..9e4da9bcfc89a84adf137575a49e95e30e58e64f 100644
--- a/html/functions/db_methods.php
+++ b/html/functions/db_methods.php
@@ -1,50 +1,5 @@
 <?php
 
-function db_addPartie( $csv ){
-
-  echo $csv;
-  return;
-
-  $data=array(
-    'member:'.get_0($member),
-    'location:'.$location,
-    'tags:'.$tags,
-    'url:'.$url,
-    'orderlist:'.preg_replace('/\r\n/',PHP_EOL,$orderlist),
-    'price:'.number_format( $price,8,'.','' ),
-    'shipping:'.number_format( $shipping,8,'.','' ),
-    'currency:'.$currency
-  );
-  $datastring=implode(PHP_EOL,$data);
-  $m=db_getFromMembersById( $member );
-
-  $F=new FaircoinAddress($m['fair_address'],false);
-  if( !$F->verifymessage($datastring , $signature ) ){
-    // signature invalid
-    return array( 'success' => false, 'message' => 'signature could not be verified!', 'd' => [ $m['fair_address'], $datastring, $signature ] );
-  }
-
-  $db=new db;
-
-  $signature_hex=bin2hex( base64_decode($signature) );
-  $sql = "INSERT INTO stargate_list ( member, location, tags, url, orderlist, price, shipping, currency, signature ) VALUES ( ".$member.",'".$location."','".$tags."','".$url."','".$orderlist."',".$price.", ".$shipping.",'".$currency."', 0x".$signature_hex.")";
-
-  if ( $db->query($sql) === TRUE) {
-      // success
-      $result=array( 'success' => true, 'message' => 'order verified and added successfully!', 'data' => db_getFromListBySignature($signature));
-  } else {
-      // check if already exists
-      $row=db_getFromListBySignature($signature);
-      if($row){
-        $result=array( 'success' => true, 'message' => 'order already exists and successfully verified!', 'data' => $row );
-      } else {
-        $result=array( 'success' => false, 'message' => 'sql error!' );
-      }
-  }
-
-  unset($db);
-  return $result;
-}
 function db_addErgebnisse( $csv, $secret ){
 
   $C=preg_split('/,/',$csv);
@@ -77,7 +32,7 @@ function db_addErgebnisse( $csv, $secret ){
   unset($db);
   return $result;
 }
-function db_addSpieler( $csv, $secret ){
+function db_addSpieler_old( $csv, $secret ){
 
   $C=preg_split('/,/',$csv);
   $C[1]='"'.$C[1].'"';
@@ -114,7 +69,75 @@ function db_addSpieler( $csv, $secret ){
 
   if ( $db->query( $sql ) === TRUE) {
       // success
-      $result=array( 'success' => true, 'message' => 'Spieltag erfolgreich hinzugefügt!', 'data' => [] );
+      $result=array( 'success' => true, 'message' => 'Spieler erfolgreich hinzugefügt!', 'data' => [] );
+  } else {
+      echo 'SQL-Error: '.$sql.'<br>';
+  }
+
+  unset($db);
+  return $result;
+}
+function db_addSpieler( $csv, $secret ){
+
+  //CSV: SpielerID,Spieler,Alter,Nt,Saison,Liga,TeamID,Team,S,T,A,Z+,Z-,Zd,Bk,Bi+,Bi-,Attr,Face,Karriereende
+
+  // ba79796eb0452460503db15aefe3c332,Maximilian Koller,20,at,36,4-3,1496,Verein Bottrop,4,3,0,9,5,4,7,12,4,,6_9_7_1_5,0
+  // ba79796eb0452460503db15aefe3c332,Maximilian Koller,20,at,36,3-3,1613,SV Saint-Pierre,1,0,0,0,0,0,6,7,0,,6_9_7_1_5,1
+
+  //DB: teamID,nt,id,attr,name,age,age_saison,face,userID,zeitstempel
+
+  $C=preg_split('/,/',$csv);
+
+  $TEAMS=db_getIdNtFromTeams();
+  if( $TEAMS[$C[6]] != $C[3] ) return false;
+
+  $D=[];
+  $D[]=$C[6];  // teamID
+  $D[]='"'.$C[3].'"';  // nt
+  $D[]='0x'.$C[0];  // id
+  $D[]='"'.$C[17].'"'; // attr
+  $D[]='"'.$C[1].'"';  // name
+  $D[]=$C[2];  // age
+  $D[]=$C[4];  // age_saison
+  $D[]='"'.$C[18].'"'; // face
+
+
+  /*
+  $C[1]='"'.$C[1].'"';
+  $C[2]='0x'.$C[2];
+  $C[3]='"'.$C[3].'"';
+  $C[4]='"'.$C[4].'"';
+  unset($C[6]);
+  unset($C[7]);
+  unset($C[8]);
+  unset($C[9]);
+  unset($C[10]);
+  unset($C[11]);
+  unset($C[12]);
+  unset($C[13]);
+  */
+
+  //$C[]=SAISON_NOW;
+  $user=db_checkSecret($secret);
+  if( empty( $user ) ) return false;
+
+  $D[]=$user['id'];
+
+  if( $S=db_getFromSpielerById($D[2]) ){
+    $D[]='"'.$S['zeitstempel'].'"';
+  } else {
+    $D[]='NOW()';
+  }
+
+  $csv=implode($D,',');
+
+  $db=new db;
+
+  $sql = "REPLACE INTO Spieler VALUES ( ".$csv." )";
+
+  if ( $db->query( $sql ) === TRUE) {
+      // success
+      $result=array( 'success' => true, 'message' => 'Spieler erfolgreich hinzugefügt!', 'data' => [] );
   } else {
       echo 'SQL-Error: '.$sql.'<br>';
   }
@@ -350,7 +373,7 @@ function db_getFromStatistikBySaison($saison){
           WHERE Ergebnisse.saison = '.$saison.'
           GROUP BY SpielerID, MID';
   */
-  $sql='SELECT Statistik.MID, Statistik.SpielerID, Spieler.name, Spieler.nt, Spieler.attr, Spieler.age, Spieler.age_saison, Teams.id, Statistik.Tore, Statistik.Assists, Statistik.Zpos, Statistik.Zneg, Statistik.Zpos - Statistik.Zneg AS "Zwk" FROM Statistik
+  $sql='SELECT Statistik.MID, Statistik.SpielerID, Spieler.name, Spieler.nt, Spieler.attr, Spieler.age, Spieler.age_saison, Teams.id, Statistik.Tore, Statistik.Assists, Statistik.Zpos, Statistik.Zneg, Statistik.Zpos - Statistik.Zneg AS "Zwk", Spieler.face FROM Statistik
           INNER JOIN Ergebnisse ON Ergebnisse.MID = Statistik.MID
           LEFT JOIN Spieler     ON Spieler.id = Statistik.SpielerID
           LEFT JOIN Teams       ON Teams.id = Spieler.teamID
@@ -374,7 +397,7 @@ function db_getFromStatistikBySaison($saison){
 function db_getFromStatistik(){
 
   $db=new db;
-  $sql='SELECT Statistik.MID, Statistik.SpielerID, Spieler.name, Spieler.nt, Spieler.attr, Spieler.age, Spieler.age_saison, Teams.id, Statistik.Tore, Statistik.Assists, Statistik.Zpos, Statistik.Zneg, Statistik.Zpos - Statistik.Zneg AS "Zwk" FROM Statistik
+  $sql='SELECT Statistik.MID, Statistik.SpielerID, Spieler.name, Spieler.nt, Spieler.attr, Spieler.age, Spieler.age_saison, Teams.id, Statistik.Tore, Statistik.Assists, Statistik.Zpos, Statistik.Zneg, Statistik.Zpos - Statistik.Zneg AS "Zwk", Spieler.face FROM Statistik
           INNER JOIN Ergebnisse ON Ergebnisse.MID = Statistik.MID
           LEFT JOIN Spieler     ON Spieler.id = Statistik.SpielerID
           LEFT JOIN Teams       ON Teams.id = Spieler.teamID
diff --git a/html/images/facegenerator/fg_beard_0.png b/html/images/facegenerator/fg_beard_0.png
new file mode 100644
index 0000000000000000000000000000000000000000..77a36aebd6722ffea8fe9688a02697784dd6cf7c
Binary files /dev/null and b/html/images/facegenerator/fg_beard_0.png differ
diff --git a/html/images/facegenerator/fg_beard_1.png b/html/images/facegenerator/fg_beard_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff605757114a4a59b8b812130be90eb9d8f05f3b
Binary files /dev/null and b/html/images/facegenerator/fg_beard_1.png differ
diff --git a/html/images/facegenerator/fg_beard_2.png b/html/images/facegenerator/fg_beard_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d760759490fe3d06c7fb5151932178a6ec3934b
Binary files /dev/null and b/html/images/facegenerator/fg_beard_2.png differ
diff --git a/html/images/facegenerator/fg_beard_3.png b/html/images/facegenerator/fg_beard_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..c89b4e90a1242766a67d2ec377406a17939f1478
Binary files /dev/null and b/html/images/facegenerator/fg_beard_3.png differ
diff --git a/html/images/facegenerator/fg_beard_4.png b/html/images/facegenerator/fg_beard_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d30572273e695f0cf4f17b42816d8e88c9b8a8f
Binary files /dev/null and b/html/images/facegenerator/fg_beard_4.png differ
diff --git a/html/images/facegenerator/fg_beard_5.png b/html/images/facegenerator/fg_beard_5.png
new file mode 100644
index 0000000000000000000000000000000000000000..446a853d612617dc0361adb8c090acd57002b981
Binary files /dev/null and b/html/images/facegenerator/fg_beard_5.png differ
diff --git a/html/images/facegenerator/fg_beard_6.png b/html/images/facegenerator/fg_beard_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..2f1e2b6ec291def81e937b18e083bdd891e5db20
Binary files /dev/null and b/html/images/facegenerator/fg_beard_6.png differ
diff --git a/html/images/facegenerator/fg_beard_7.png b/html/images/facegenerator/fg_beard_7.png
new file mode 100644
index 0000000000000000000000000000000000000000..71eec17b0f724bb9e3072048b97ee988c1053f3c
Binary files /dev/null and b/html/images/facegenerator/fg_beard_7.png differ
diff --git a/html/images/facegenerator/fg_eyes_0.png b/html/images/facegenerator/fg_eyes_0.png
new file mode 100644
index 0000000000000000000000000000000000000000..41c7f620b35cad5b94ec726421ec5fa3a86ebe50
Binary files /dev/null and b/html/images/facegenerator/fg_eyes_0.png differ
diff --git a/html/images/facegenerator/fg_eyes_1.png b/html/images/facegenerator/fg_eyes_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..236ccbe446127f4ff0bd703e74ab7256fa780fc7
Binary files /dev/null and b/html/images/facegenerator/fg_eyes_1.png differ
diff --git a/html/images/facegenerator/fg_eyes_10.png b/html/images/facegenerator/fg_eyes_10.png
new file mode 100644
index 0000000000000000000000000000000000000000..1565b174e11c1098eb669a28e5bd0212cff8ff84
Binary files /dev/null and b/html/images/facegenerator/fg_eyes_10.png differ
diff --git a/html/images/facegenerator/fg_eyes_11.png b/html/images/facegenerator/fg_eyes_11.png
new file mode 100644
index 0000000000000000000000000000000000000000..af48b5db1a03a9e36629ffb48103b18b6c3ae05d
Binary files /dev/null and b/html/images/facegenerator/fg_eyes_11.png differ
diff --git a/html/images/facegenerator/fg_eyes_12.png b/html/images/facegenerator/fg_eyes_12.png
new file mode 100644
index 0000000000000000000000000000000000000000..528be71ef853ed094fff2981f23bff30cf0a105d
Binary files /dev/null and b/html/images/facegenerator/fg_eyes_12.png differ
diff --git a/html/images/facegenerator/fg_eyes_13.png b/html/images/facegenerator/fg_eyes_13.png
new file mode 100644
index 0000000000000000000000000000000000000000..40c28717045b5faa535eff78d3c3667042eb8c98
Binary files /dev/null and b/html/images/facegenerator/fg_eyes_13.png differ
diff --git a/html/images/facegenerator/fg_eyes_2.png b/html/images/facegenerator/fg_eyes_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..5efbab8c36b77426a699e5a263f796142e5faa36
Binary files /dev/null and b/html/images/facegenerator/fg_eyes_2.png differ
diff --git a/html/images/facegenerator/fg_eyes_3.png b/html/images/facegenerator/fg_eyes_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..8802a246ae3f41d402c02c5e0ca5355cdf1757f1
Binary files /dev/null and b/html/images/facegenerator/fg_eyes_3.png differ
diff --git a/html/images/facegenerator/fg_eyes_4.png b/html/images/facegenerator/fg_eyes_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..8f010ceeae5c208f5a9de466282a269201ad9a89
Binary files /dev/null and b/html/images/facegenerator/fg_eyes_4.png differ
diff --git a/html/images/facegenerator/fg_eyes_5.png b/html/images/facegenerator/fg_eyes_5.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ff1574e76dc74bf83f2d7f9a732513d20cded64
Binary files /dev/null and b/html/images/facegenerator/fg_eyes_5.png differ
diff --git a/html/images/facegenerator/fg_eyes_6.png b/html/images/facegenerator/fg_eyes_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..126f6df285d7ebe0d1f6049d586aa68f5d6f51f0
Binary files /dev/null and b/html/images/facegenerator/fg_eyes_6.png differ
diff --git a/html/images/facegenerator/fg_eyes_7.png b/html/images/facegenerator/fg_eyes_7.png
new file mode 100644
index 0000000000000000000000000000000000000000..95a18072e160053537dd5a995f51e2e9a1d50fec
Binary files /dev/null and b/html/images/facegenerator/fg_eyes_7.png differ
diff --git a/html/images/facegenerator/fg_eyes_8.png b/html/images/facegenerator/fg_eyes_8.png
new file mode 100644
index 0000000000000000000000000000000000000000..76a4203c82a042d81b80bb7004c8258df735b5fd
Binary files /dev/null and b/html/images/facegenerator/fg_eyes_8.png differ
diff --git a/html/images/facegenerator/fg_eyes_9.png b/html/images/facegenerator/fg_eyes_9.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e0686642b0de7b38fdedc033fc417509f40f106
Binary files /dev/null and b/html/images/facegenerator/fg_eyes_9.png differ
diff --git a/html/images/facegenerator/fg_hair_0.png b/html/images/facegenerator/fg_hair_0.png
new file mode 100644
index 0000000000000000000000000000000000000000..71b9a999a112faf12d15bd25912f67b1b4b43b78
Binary files /dev/null and b/html/images/facegenerator/fg_hair_0.png differ
diff --git a/html/images/facegenerator/fg_hair_1.png b/html/images/facegenerator/fg_hair_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff9fdad91415b07bcb7ef5bade9704ae6cae5819
Binary files /dev/null and b/html/images/facegenerator/fg_hair_1.png differ
diff --git a/html/images/facegenerator/fg_hair_10.png b/html/images/facegenerator/fg_hair_10.png
new file mode 100644
index 0000000000000000000000000000000000000000..fffa87703d64f51736aae5f9c9dfc5c034738495
Binary files /dev/null and b/html/images/facegenerator/fg_hair_10.png differ
diff --git a/html/images/facegenerator/fg_hair_11.png b/html/images/facegenerator/fg_hair_11.png
new file mode 100644
index 0000000000000000000000000000000000000000..796b54d77502878cae3bd2c0e28f1f452adb9660
Binary files /dev/null and b/html/images/facegenerator/fg_hair_11.png differ
diff --git a/html/images/facegenerator/fg_hair_12.png b/html/images/facegenerator/fg_hair_12.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa30db66a001d50fdc0a702b1b780ff88f9fc67f
Binary files /dev/null and b/html/images/facegenerator/fg_hair_12.png differ
diff --git a/html/images/facegenerator/fg_hair_13.png b/html/images/facegenerator/fg_hair_13.png
new file mode 100644
index 0000000000000000000000000000000000000000..cfeb350e3c6002463eae9588635d65bb69386d3a
Binary files /dev/null and b/html/images/facegenerator/fg_hair_13.png differ
diff --git a/html/images/facegenerator/fg_hair_14.png b/html/images/facegenerator/fg_hair_14.png
new file mode 100644
index 0000000000000000000000000000000000000000..77479294a72d7eac32f63d4f615efc63797eb32c
Binary files /dev/null and b/html/images/facegenerator/fg_hair_14.png differ
diff --git a/html/images/facegenerator/fg_hair_15.png b/html/images/facegenerator/fg_hair_15.png
new file mode 100644
index 0000000000000000000000000000000000000000..451a91f6d4991d800854db1a69dfd9d98ccf5bc2
Binary files /dev/null and b/html/images/facegenerator/fg_hair_15.png differ
diff --git a/html/images/facegenerator/fg_hair_2.png b/html/images/facegenerator/fg_hair_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f59e6c4787d5dbfd1dd2fcf86b32c495072faa4
Binary files /dev/null and b/html/images/facegenerator/fg_hair_2.png differ
diff --git a/html/images/facegenerator/fg_hair_3.png b/html/images/facegenerator/fg_hair_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..5acf3e09cc6360d18c8f1ea71471b8614c1d5ebd
Binary files /dev/null and b/html/images/facegenerator/fg_hair_3.png differ
diff --git a/html/images/facegenerator/fg_hair_4.png b/html/images/facegenerator/fg_hair_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..651a18aaae8654404e32f4faac4d7fab33ae9b42
Binary files /dev/null and b/html/images/facegenerator/fg_hair_4.png differ
diff --git a/html/images/facegenerator/fg_hair_5.png b/html/images/facegenerator/fg_hair_5.png
new file mode 100644
index 0000000000000000000000000000000000000000..18807bfab988ecee0d6db0574dcb179d679c6394
Binary files /dev/null and b/html/images/facegenerator/fg_hair_5.png differ
diff --git a/html/images/facegenerator/fg_hair_6.png b/html/images/facegenerator/fg_hair_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e2b168ff2b7a0dc97cd761043a5f1556205df37
Binary files /dev/null and b/html/images/facegenerator/fg_hair_6.png differ
diff --git a/html/images/facegenerator/fg_hair_7.png b/html/images/facegenerator/fg_hair_7.png
new file mode 100644
index 0000000000000000000000000000000000000000..d4da8eeb2cdb5284a9d1736df3a7302670c9c20b
Binary files /dev/null and b/html/images/facegenerator/fg_hair_7.png differ
diff --git a/html/images/facegenerator/fg_hair_8.png b/html/images/facegenerator/fg_hair_8.png
new file mode 100644
index 0000000000000000000000000000000000000000..e3010e73be6acda360632bf66309911119daa215
Binary files /dev/null and b/html/images/facegenerator/fg_hair_8.png differ
diff --git a/html/images/facegenerator/fg_hair_9.png b/html/images/facegenerator/fg_hair_9.png
new file mode 100644
index 0000000000000000000000000000000000000000..69fbb166b7784e6144f50a31482ab5daf610c638
Binary files /dev/null and b/html/images/facegenerator/fg_hair_9.png differ
diff --git a/html/images/facegenerator/fg_head_0.png b/html/images/facegenerator/fg_head_0.png
new file mode 100644
index 0000000000000000000000000000000000000000..f4ec985cc0266bb62c46c623e5ffae4c1e2d6988
Binary files /dev/null and b/html/images/facegenerator/fg_head_0.png differ
diff --git a/html/images/facegenerator/fg_head_1.png b/html/images/facegenerator/fg_head_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..d84610072fb8c16de0d0ad6aeb50a1db2db25dcb
Binary files /dev/null and b/html/images/facegenerator/fg_head_1.png differ
diff --git a/html/images/facegenerator/fg_head_2.png b/html/images/facegenerator/fg_head_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa7ca1b862ca52a5d80de9a60d4aa53e957d3f5d
Binary files /dev/null and b/html/images/facegenerator/fg_head_2.png differ
diff --git a/html/images/facegenerator/fg_head_3.png b/html/images/facegenerator/fg_head_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..61a4987ceb713316aff3995061dcb4056012d471
Binary files /dev/null and b/html/images/facegenerator/fg_head_3.png differ
diff --git a/html/images/facegenerator/fg_head_4.png b/html/images/facegenerator/fg_head_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..12c4420db671b0f6c4a989cea21b2e1cea37bd06
Binary files /dev/null and b/html/images/facegenerator/fg_head_4.png differ
diff --git a/html/images/facegenerator/fg_head_5.png b/html/images/facegenerator/fg_head_5.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f95020741e2eaabbb2f3c6fd26e55cf6c801bcc
Binary files /dev/null and b/html/images/facegenerator/fg_head_5.png differ
diff --git a/html/images/facegenerator/fg_head_6.png b/html/images/facegenerator/fg_head_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..46dd6ba992f8eab4dba78034cfd68bf2748e1489
Binary files /dev/null and b/html/images/facegenerator/fg_head_6.png differ
diff --git a/html/images/facegenerator/fg_head_7.png b/html/images/facegenerator/fg_head_7.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c16de64626a9a0f4da761586bf0345563b9d852
Binary files /dev/null and b/html/images/facegenerator/fg_head_7.png differ
diff --git a/html/images/facegenerator/fg_mouth_0.png b/html/images/facegenerator/fg_mouth_0.png
new file mode 100644
index 0000000000000000000000000000000000000000..114e20c3d5d1058f544e03b24b3d67b722df2875
Binary files /dev/null and b/html/images/facegenerator/fg_mouth_0.png differ
diff --git a/html/images/facegenerator/fg_mouth_1.png b/html/images/facegenerator/fg_mouth_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a4b0533e19685b4f10fd3ce58d14be2daecc7f0
Binary files /dev/null and b/html/images/facegenerator/fg_mouth_1.png differ
diff --git a/html/images/facegenerator/fg_mouth_2.png b/html/images/facegenerator/fg_mouth_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..cfbfe3281acc4c802baed7152e99b5c20867e71a
Binary files /dev/null and b/html/images/facegenerator/fg_mouth_2.png differ
diff --git a/html/images/facegenerator/fg_mouth_3.png b/html/images/facegenerator/fg_mouth_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..5088c7a7e815ee318cc11b5532ebb144601ce3bb
Binary files /dev/null and b/html/images/facegenerator/fg_mouth_3.png differ
diff --git a/html/images/facegenerator/fg_mouth_4.png b/html/images/facegenerator/fg_mouth_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..b7ea6f7bc15eea1de58e3558040e1e8123649a7c
Binary files /dev/null and b/html/images/facegenerator/fg_mouth_4.png differ
diff --git a/html/images/facegenerator/fg_mouth_5.png b/html/images/facegenerator/fg_mouth_5.png
new file mode 100644
index 0000000000000000000000000000000000000000..08e2546bbacd258cbea468afd558adcd36346353
Binary files /dev/null and b/html/images/facegenerator/fg_mouth_5.png differ
diff --git a/html/images/facegenerator/fg_mouth_6.png b/html/images/facegenerator/fg_mouth_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..263a9168bfaaed936d7391031d74f7446a2b33d4
Binary files /dev/null and b/html/images/facegenerator/fg_mouth_6.png differ
diff --git a/html/images/facegenerator/fg_mouth_7.png b/html/images/facegenerator/fg_mouth_7.png
new file mode 100644
index 0000000000000000000000000000000000000000..d070f187d7f5aac7f6a1596d7cf1463c2fa6ee9a
Binary files /dev/null and b/html/images/facegenerator/fg_mouth_7.png differ