anchor.diff:    }
   }
   
  +saveCamera(Camera next) {
  +  var state = "#x=${next.center.real}&y=${next.center.imag}&r=${next.radius}";
  +  window.location.hash = state;
  +}
  +
   render() {
     var camera = loadCamera();
     getRoot("#container")
  -    .mount(new MandelbrotApp(camera: camera, onCameraChange: onCameraChange));
  +    .mount(new MandelbrotApp(startCamera: camera, save: saveCamera));
   }
   
   main() {
  
positive.code: 
  const defaultCamera = const Camera(const Complex(0, 0), 2.0);
  
  typedef CameraHandler(Camera next);
  
  class MandelbrotApp extends TemplateTag {
    final Camera camera;
    final CameraHandler onCameraChange;
  
    const MandelbrotApp({
      this.camera: defaultCamera,
      this.onCameraChange
    });
  
    @override
    Tag render() {
      void setCamera(Camera next) {
        if (onCameraChange != null) {
          onCameraChange(next);
        }
      }
      void onClick(Complex newCenter) {
        setCamera(camera.pan(newCenter));
      }
      void zoom(num scaleAmount) {
        setCamera(camera.zoom(scaleAmount));
      }
      return $.Div(inner: [
        new MandelbrotView(center: camera.center, radius: camera.radius, onClick: onClick),
        $.Div(inner: [
  
negative.code:   return maxIterations;
  }
  
  Camera loadCamera() {
    var params = <String, double>{};
    if (window.location.hash.isNotEmpty) {
  