docs: public boolean copyChanges(final Tree tree, final boolean overwrite) {
      if (tree == null) {
        throw new IllegalArgumentException("Cannot copy a null tree");
      }
      if (tree_id != tree.tree_id) {
        throw new IllegalArgumentException("Tree IDs do not match");
      }
      
      if (overwrite || tree.changed.get("name")) {
        name = tree.name;
        changed.put("name", true);
      }
      if (overwrite || tree.changed.get("description")) {
        description = tree.description;
        changed.put("description", true);
      }
      if (overwrite || tree.changed.get("notes")) {
        notes = tree.notes;
        changed.put("notes", true);
      }
      if (overwrite || tree.changed.get("strict_match")) {
        strict_match = tree.strict_match;
        changed.put("strict_match", true);
      }
      if (overwrite || tree.changed.get("enabled")) {
        enabled = tree.enabled;
        changed.put("enabled", true);
      }
      if (overwrite || tree.changed.get("store_failures")) {
        store_failures = tree.store_failures;
        changed.put("store_failures", true);
      }
      for (boolean has_changes : changed.values()) {
        if (has_changes) {
          return true;
        }
      }
      return false;
    }