<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def make_mutant_tuples(example_protos, original_feature, index_to_mutate, viz_params):
 """Return a list of `MutantFeatureValue`s and a list of mutant Examples. Args: example_protos: The examples to mutate. original_feature: A `OriginalFeatureList` that encapsulates the feature to mutate. index_to_mutate: The index of the int64_list or float_list to mutate. viz_params: A `VizParams` object that contains the UI state of the request. Returns: A list of `MutantFeatureValue`s and a list of mutant examples. """

  mutant_features = make_mutant_features(original_feature, index_to_mutate,
                                         viz_params)
  mutant_examples = []
  for example_proto in example_protos:
    for mutant_feature in mutant_features:
      copied_example = copy.deepcopy(example_proto)
      feature_name = mutant_feature.original_feature.feature_name

      try:
        feature_list = proto_value_for_feature(copied_example, feature_name)
        if index_to_mutate is None:
          new_values = mutant_feature.mutant_value
        else:
          new_values = list(feature_list)
          new_values[index_to_mutate] = mutant_feature.mutant_value

        del feature_list[:]
        feature_list.extend(new_values)
        mutant_examples.append(copied_example)
      except (ValueError, IndexError):
        # If the mutant value can't be set, still add the example to the
        # mutant_example even though no change was made. This is necessary to
        # allow for computation of global PD plots when not all examples have
        # the same number of feature values for a feature.
        mutant_examples.append(copied_example)

  return mutant_features, mutant_examples