anchor.diff:    
     double get currentScale => atSCTransform.a;
   
  +  // ---------------------------------------------------------------
  +  // Tweenable implementation
  +  // ---------------------------------------------------------------
  +  int getTweenableValues(UTE.Tween tween, int tweenType, List<num> returnValues) {
  +    switch(tweenType) {
  +      case TWEEN_SCALE:
  +        returnValues[0] = currentScale;
  +        return 1;
  +    }
  +    
  +    return 0;
  +  }
  +  
  +  void setTweenableValues(UTE.Tween tween, int tweenType, List<num> newValues) {
  +    switch(tweenType) {
  +      case TWEEN_SCALE:
  +        currentScale = newValues[0];
  +        break;
  +    }
  +  }
  +
  +  // ---------------------------------------------------------------
  +  // Rendering
  +  // ---------------------------------------------------------------
     @override
     void draw(Ranger.DrawContext context) {
       super.draw(context);
  
positive.code: /**
   * This may be converted to a mixin.
   */
  class ZoomGroup extends Ranger.GroupNode {
  
    bool _zoomDirty = true;
    Vector2 scaleCenter = new Vector2.zero();
  
negative.code:       poolable.atSCTransform.toIdentity();
        poolable._updateMatrix();
        poolable.tag = 606;
        // Setting dirty=false is very important for this Node because this
        // Node manages its own matrix. Setting it to True will cause the
        // transform stack to overlay it--not good.
        poolable.dirty = false;
        return poolable;
      }
      return null;
  