code: def uts46_remap(domain, std3_rules=True, transitional=False):
      
      from .uts46data import uts46data
      output = u""
      try:
          for pos, char in enumerate(domain):
              code_point = ord(char)
              uts46row = uts46data[code_point if code_point < 256 else
                  bisect.bisect_left(uts46data, (code_point, "Z")) - 1]
              status = uts46row[1]
              replacement = uts46row[2] if len(uts46row) == 3 else None
              if (status == "V" or
                      (status == "D" and not transitional) or
                      (status == "3" and not std3_rules and replacement is None)):
                  output += char
              elif replacement is not None and (status == "M" or
                      (status == "3" and not std3_rules) or
                      (status == "D" and transitional)):
                  output += replacement
              elif status != "I":
                  raise IndexError()
          return unicodedata.normalize("NFC", output)
      except IndexError:
          raise InvalidCodepoint(
              "Codepoint {0} not allowed at position {1} in {2}".format(
              _unot(code_point), pos + 1, repr(domain)))
docs: Re-map the characters in the string according to UTS46 processing.