code: func parseTaints(spec []string) ([]corev1.Taint, []corev1.Taint, error) {
  	var taints, taintsToRemove []corev1.Taint
  	uniqueTaints := map[corev1.TaintEffect]sets.String{}
  
  	for _, taintSpec := range spec {
  		if strings.HasSuffix(taintSpec, "-") {
  			taintToRemove, err := parseTaint(strings.TrimSuffix(taintSpec, "-"))
  			if err != nil {
  				return nil, nil, err
  			}
  			taintsToRemove = append(taintsToRemove, corev1.Taint{Key: taintToRemove.Key, Effect: taintToRemove.Effect})
  		} else {
  			newTaint, err := parseTaint(taintSpec)
  			if err != nil {
  				return nil, nil, err
  			}
  			// validate that the taint has an effect, which is required to add the taint
  			if len(newTaint.Effect) == 0 {
  				return nil, nil, fmt.Errorf("invalid taint spec: %v", taintSpec)
  			}
  			// validate if taint is unique by <key, effect>
  			if len(uniqueTaints[newTaint.Effect]) > 0 && uniqueTaints[newTaint.Effect].Has(newTaint.Key) {
  				return nil, nil, fmt.Errorf("duplicated taints with the same key and effect: %v", newTaint)
  			}
  			// add taint to existingTaints for uniqueness check
  			if len(uniqueTaints[newTaint.Effect]) == 0 {
  				uniqueTaints[newTaint.Effect] = sets.String{}
  			}
  			uniqueTaints[newTaint.Effect].Insert(newTaint.Key)
  
  			taints = append(taints, newTaint)
  		}
  	}
  	return taints, taintsToRemove, nil
  }
docs: // parseTaints takes a spec which is an array and creates slices for new taints to be added, taints to be deleted.
  // It also validates the spec. For example, the form `<key>` may be used to remove a taint, but not to add one.