message: no array copies
diff: @@ -79,17 +79,14 @@ const centroidHelper = new CentroidHelper();
  async function initialize(structure: Structure, props: ANVILProps, accessibleSurfaceArea: AccessibleSurfaceArea): Promise<ANVILContext> {
  const l = StructureElement.Location.create(structure);
  const { label_atom_id, label_comp_id, x, y, z } = StructureProperties.atom;
  - const elementCount = structure.polymerResidueCount;
  const asaCutoff = props.asaCutoff / 100;
  centroidHelper.reset();
  - let offsets = new Array<number>(elementCount);
  - let exposed = new Array<number>(elementCount);
  - let hydrophobic = new Array<boolean>(elementCount);
  + let offsets = new Array<number>();
  + let exposed = new Array<number>();
  + let hydrophobic = new Array<boolean>();
  const vec = v3zero();
  - let m = 0;
  - let n = 0;
  for (let i = 0, il = structure.units.length; i < il; ++i) {
  const unit = structure.units[i];
  const { elements } = unit;
  @@ -119,20 +116,14 @@ async function initialize(structure: Structure, props: ANVILProps, accessibleSur
  centroidHelper.includeStep(vec);
  // keep track of offsets and exposed state to reuse
  - offsets[m++] = structure.serialMapping.getSerialIndex(l.unit, l.element);
  + offsets.push(structure.serialMapping.getSerialIndex(l.unit, l.element));
  if (AccessibleSurfaceArea.getValue(l, accessibleSurfaceArea) / MaxAsa[label_comp_id(l)] > asaCutoff) {
  - exposed[n] = structure.serialMapping.getSerialIndex(l.unit, l.element);
  - hydrophobic[n] = isHydrophobic(label_comp_id(l));
  - n++;
  + exposed.push(structure.serialMapping.getSerialIndex(l.unit, l.element));
  + hydrophobic.push(isHydrophobic(label_comp_id(l)));
  }
  }
  }
  - // omit potentially empty tail
  - offsets = offsets.slice(0, m);
  - exposed = exposed.slice(0, n);
  - hydrophobic = hydrophobic.splice(0, n);
  -
  // calculate centroid and extent
  centroidHelper.finishedIncludeStep();
  const centroid = v3clone(centroidHelper.center);
  