code: function _VirtualDom_diffFacts(x, y, category) {
      var diff;
  
      // look for changes and removals
      for (var xKey in x) {
        if (xKey === "a1" || xKey === "a0" || xKey === "a3" || xKey === "a4") {
          var subDiff = _VirtualDom_diffFacts(x[xKey], y[xKey] || {}, xKey);
          if (subDiff) {
            diff = diff || {};
            diff[xKey] = subDiff;
          }
          continue;
        }
  
        // remove if not in the new facts
        if (!(xKey in y)) {
          diff = diff || {};
          diff[xKey] = !category
            ? typeof x[xKey] === "string"
              ? ""
              : null
            : category === "a1"
              ? ""
              : category === "a0" || category === "a3"
                ? undefined
                : { f: x[xKey].f, o: undefined };
  
          continue;
        }
  
        var xValue = x[xKey];
        var yValue = y[xKey];
  
        // reference equal, so don't worry about it
        if (
          (xValue === yValue && xKey !== "value" && xKey !== "checked") ||
          (category === "a0" && _VirtualDom_equalEvents(xValue, yValue))
        ) {
          continue;
        }
  
        diff = diff || {};
        diff[xKey] = yValue;
      }
  
      // add new stuff
      for (var yKey in y) {
        if (!(yKey in x)) {
          diff = diff || {};
          diff[yKey] = y[yKey];
        }
      }
  
      return diff;
    }
docs: TODO Instead of creating a new diff object, it's possible to just test if there *is* a diff. During the actual patch, do the diff again and make the modifications directly. This way, there's no new allocations. Worth it?