def copy_parallel_text(file_list: List[str], dest_prefix: str):
    """
    Copy pre-compiled raw parallel files with a given prefix.  Perform
    whitespace character normalization to ensure that only ASCII newlines are
    considered line breaks.

    :param file_list: List of file pairs to use.
    :param dest_prefix: Prefix for output files.
    """
    # Group files into source-target pairs
    file_sets = []
    for i in range(0, len(file_list), 2):
        file_sets.append((file_list[i], file_list[i + 1]))
    multiple_sets = len(file_sets) > 1
    for i, (source_fname, target_fname) in enumerate(file_sets):
        if multiple_sets:
            source_dest = dest_prefix + str(i) + "." + SUFFIX_SRC_GZ
            target_dest = dest_prefix + str(i) + "." + SUFFIX_TRG_GZ
        else:
            source_dest = dest_prefix + SUFFIX_SRC_GZ
            target_dest = dest_prefix + SUFFIX_TRG_GZ
        logging.info("Populate: %s %s", source_dest, target_dest)
        with gzip.open(source_dest, "wb") as source_out, gzip.open(target_dest, "wb") as target_out:
            with third_party.bin_open(source_fname) as inp:
                for line in inp:
                    line = (re.sub(r"\s", " ", line.decode("utf-8"))).encode("utf-8") + b"\n"
                    source_out.write(line)
            with third_party.bin_open(target_fname) as inp:
                for line in inp:
                    line = (re.sub(r"\s", " ", line.decode("utf-8"))).encode("utf-8") + b"\n"
                    target_out.write(line)
Copy pre-compiled raw parallel files with a given prefix.  Perform
    whitespace character normalization to ensure that only ASCII newlines are
    considered line breaks.

    :param file_list: List of file pairs to use.
    :param dest_prefix: Prefix for output files.