anchor.diff:    void MaybeSetAttribute(String canonical, WEBGL.Buffer buffer,
         [bool normalized = false, int stride = 0, int offset = 0]) {
       if (!_program.HasAttribute(canonical)) return;
  -    _program.SetAttribute(_gl, canonical, buffer, normalized, stride, offset);
  +    _program.SetAttribute(canonical, buffer, normalized, stride, offset);
     }
   
     void SetElementArray(WEBGL.Buffer b) {
  -    _program.SetElementArray(_gl, b);
  +    _program.SetElementArray(b);
     }
   
     void MaybeSetUniform(String canonical) {
       if (_program.HasUniform(canonical)) {
  -      _program.SetUniform(_gl, canonical, inputs.GetUniformVal(canonical));
  +      _program.SetUniform(canonical, inputs.GetUniformVal(canonical));
       }
     }
   
  
positive.code:     }
  
      for (String v in _shaderObjectV.uniformVars.keys) {
        _uniformLocations[v] = gl.getUniformLocation(_program, v);
      }
  
      for (String v in _shaderObjectF.uniformVars.keys) {
        // This can happen! Example both shaders use uTime.
        // assert(!uniformLocations.containsKey(v));
        _uniformLocations[v] = gl.getUniformLocation(_program, v);
      }
    }
  
  
negative.code:     }
    }
  
    bool AllUniformsInitialized() {
      //LogInfo("program ${program.name}");
      //     LogInfo("want: ${program.uniformLocations}");
      //     LogInfo("have: ${program._uniformInitialized}");
      return _uniformInitialized.length == _uniformLocations.length;
    }
   
      List<String> UniformsUninitialized() {
        List<String> out = [];
        for (String u in _uniformLocations.keys) {
          if (!_uniformInitialized.contains(u)) out.add(u); 
        }
        return out;
      }
  
    void Begin(bool debug) {
      if (debug) print("[${name} setting attributes");
      _gl.useProgram(_program);
      for (String a in _attributeLocations.keys) {
        if (debug) print("[${name}] $a");
        final index = _attributeLocations[a];
        _gl.enableVertexAttribArray(index);
        if (a.startsWith("ia")) {
          _extInstancedArrays.vertexAttribDivisorAngle(index, 1);
        }
      }
    }
  
    void Draw(bool debug, int numInstances, int numItems, bool drawPoints,
        bool useArrayBuffer) {
      if (debug) print(
          "[${name}] draw points: ${drawPoints} instances${numInstances}");
      if (!AllUniformsInitialized()) {
        throw "uninitialized uniforms: ${UniformsUninitialized()}";
      }
      if (numInstances > 0) {
        if (drawPoints) {
  