code: def changes(self):
          
          report = {}
          for k, k_changes in self._changes.items():
              if len(k_changes) == 1:
                  report[k] = k_changes[0]
              else:
                  first = k_changes[0]
                  last = k_changes[-1]
                  if first.old_value != last.new_value or first.old_raw_str_value != last.new_raw_str_value:
                      report[k] = _Change(
                          first.old_value,
                          last.new_value,
                          first.old_raw_str_value,
                          last.new_raw_str_value,
                      )
          return report
docs: Returns a mapping of items to their effective change objects which include the old values
          and the new. The mapping includes only items whose value or raw string value has changed in the context.