<!-- RUBY-BACKUP · part 111 -->
me='upperarm';
      M(new THREE.SphereGeometry(0.2, 8, 6), darkSkin, sx+s*0.2, 4.25, 0).name='elbow';
      M(new THREE.CylinderGeometry(0.18, 0.15, 1.3, 10), skin, sx+s*0.22, 3.5, 0).name='forearm';
      M(new THREE.CylinderGeometry(0.14, 0.14, 0.25, 8), darkSkin, sx+s*0.23, 2.8, 0).name='wrist';
      var hand = M(new THREE.BoxGeometry(0.35, 0.5, 0.18), skin, sx+s*0.23, 2.45, 0);
      hand.name='hand';
      /* fingers — 4 + thumb */
      for(var f=0; f<4; f++){
        M(new THREE.CylinderGeometry(0.045, 0.04, 0.35, 6), skin, sx+s*0.23-0.12+f*0.08, 2.1, 0).name='finger';
      }
      var thumb = M(new THREE.CylinderGeometry(0.05, 0.045, 0.3, 6), skin, sx+s*0.23+s*0.2, 2.5, 0.05);
      thumb.rotation.z = s*0.6; thumb.name='thumb';
    });
    /* HIPS */
    M(new THREE.CylinderGeometry(0.6, 0.55, 0.8, 12), clothM, 0, 2.7, 0).name='hips';
    /* LEGS — thigh, knee, shin, ankle, foot, toes */
    [-1, 1].forEach(function(s){
      var lx = s*0.35;
      M(new THREE.CylinderGeometry(0.28, 0.24, 1.6, 10), skin, lx, 1.7, 0).name='thigh';
      M(new THREE.SphereGeometry(0.24, 8, 6), darkSkin, lx, 0.85, 0).name='knee';
      M(new THREE.CylinderGeometry(0.22, 0.18, 1.4, 10), skin, lx, 0.1, 0).name='shin';
      M(new THREE.CylinderGeometry(0.16, 0.16, 0.2, 8), darkSkin, lx, -0.65, 0).name='ankle';
      var foot = M(new THREE.BoxGeometry(0.35, 0.25, 0.8), darkSkin, lx, -0.8, 0.2);
      foot.name='foot';
      /* toes */
      for(var t=0; t<3; t++){
        M(new THREE.SphereGeometry(0.06, 6, 5), skin, lx-0.1+t*0.1, -0.85, 0.62).name='toe';
      }
    });
    g.position.set(-12, 0.9, -24);
    /* avatar size — we are avatars */
    g.scale.set(0.4, 0.4, 0.4);
    if(typeof scene!=='undefined') scene.add(g);
    window._humanBody = g;
    codeStatus('a body stands — avatar size');
  }catch(e){ codeStatus('body failed'); }
}
/* INTAGLIO — ultra-dense linework texture, engraved in 3D */
function makeIntaglioTexture(){
  try{
    var cv = document.createElement('canvas');
    cv.width = 512; cv.height = 512;
    var ctx = cv.getContext('2d');
    ctx.fillStyle = '#ffffff';
    ctx.fillRect(0, 0, 512, 512);
    /* dense hatch lines — the engraver's hand */
    ctx.strokeStyle = 'rgba(0,0,0,0.35)';
    ctx.lineWidth = 1;
    for(var y=0; y<512; y+=3){
      ctx.beginPath();
      ctx.moveTo(0, y);
      /* slight wave for organic feel */
      for(var x=0; x<=512; x+=16){
        ctx.lineTo(x, y + Math.sin(x*0.05+y*0.1)*2);
      }
      ctx.stroke();
    }
    /* cross-hatch for depth */
    ctx.strokeStyle = 'rgba(0,0,0,0.18)';
    for(var d=-512; d<512; d+=6){
      ctx.beginPath();
      ctx.moveTo(d, 0);
      ctx.lineTo(d+512, 512);
      ctx.stroke();
    }
    var tex = new THREE.CanvasTexture(cv);
    tex.wrapS = tex.wrapT = THREE.RepeatWrapping;
    return tex;
  }catch(e){ return null; }
}
/* EYES — the shape of eyes and eyelids, intaglio linework in 3D */
function buildIntaglioEyes(){
  try{
    var g = new THREE.Group();
    var intaglio = makeIntaglioTexture();
    var skinMat = new THREE.MeshStandardMaterial({color:0xc8966a, roughness:0.7, map:intaglio});
    var whiteMat = new THREE.MeshStandardMaterial({color:0xf5f0e8, roughness:0.25, map:intaglio});
    var irisMat = new THREE.MeshStandardMaterial({color:0x4a2a0a, roughness:0.3});
    var pupilMat = new THREE.MeshStandardMaterial({color:0x0a0a0a, roughness:0.2});
    var lashMat = new THREE.MeshStandardMaterial({color:0x1a0a0a, roughness:0.9});
    [-1, 1].forEach(function(s){
      var ex = s*1.6;
      /* eyeball */
      var ball = new THREE.Mesh(new THREE.SphereGeometry(0.55, 24, 18), whiteMat);
      ball.position.set(ex, 0, 0);
      ball.name = 'eyeball';
      g.add(ball);
      /* iris */
      var iris = new THREE.Mesh(new THREE.CircleGeometry(0.28, 20), irisMat);
      iris.position.set(ex, 0, 0.5);
      iris.name = 'iris';
      g.add(iris);
      /* intaglio rings in the iris */
      for(var r=1; r<=3; r++){
        var ring = new THREE.Mesh(new THREE.TorusGeometry(0.09*r, 0.012, 6, 24), pupilMat);
        ring.position.set(ex, 0, 0.51);
        g.add(ring);
      }
      /* pupil */
      var pup = new THREE.Mesh(new THREE.CircleGeometry(0.1, 16), pupilMat);
      pup.position.set(ex, 0, 0.52);
      pup.name = 'pupil';
      g.add(pup);
      /* UPPER EYELID — a curved shell over the top */
      var upperLid = new THREE.Mesh(new THREE.SphereGeometry(0.62, 24, 12, 0, Math.PI*2, 0, Math.PI/2.8), skinMat);
      upperLid.position.set(ex, 0.12, 0);
      upperLid.rotation.x = -0.25;
      upperLid.name = 'upper-lid';
      g.add(upperLid);
      /* LOWER EYELID — a curved shell under */
      var lowerLid = new THREE.Mesh(new THREE.SphereGeometry(0.6, 24, 12, 0, Math.PI*2, Math.PI/1.35, Math.PI/2.8), skinMat);
      lowerLid.position.set(ex, -0.1, 0.02);
      lowerLid.rotation.x = 0.2;
      lowerLid.name = 'lower-lid';
      g.add(lowerLid);
      /* eyelashes — upper lid edge */
      for(va