From aafbbf7438ae915a7668903b5b688d03361ac04d Mon Sep 17 00:00:00 2001 From: ufp0 Date: Mon, 22 Jul 2024 15:16:45 -0400 Subject: [PATCH 01/42] adding readme --- README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 README.md diff --git a/README.md b/README.md old mode 100644 new mode 100755 From a26a3c503af408d5049fefdbe6af00dd1a14bf7f Mon Sep 17 00:00:00 2001 From: ufp0 Date: Tue, 30 Jul 2024 11:39:19 -0400 Subject: [PATCH 02/42] updated gfa --- bin/mpxv-AssemblyGraph_gfaPy.py | 49 ++- bin/mpxv-AssemblyGraph_gfaPyv2.py | 487 ++++++++++++++++++++++ modules/nf-core/modules/unicycler/main.nf | 6 +- nextflow.config | 4 + 4 files changed, 529 insertions(+), 17 deletions(-) create mode 100755 bin/mpxv-AssemblyGraph_gfaPyv2.py diff --git a/bin/mpxv-AssemblyGraph_gfaPy.py b/bin/mpxv-AssemblyGraph_gfaPy.py index 7947edd..0e99988 100755 --- a/bin/mpxv-AssemblyGraph_gfaPy.py +++ b/bin/mpxv-AssemblyGraph_gfaPy.py @@ -17,8 +17,22 @@ import pprint import json +def clean_graph_tags(input_file, output_file): + # Define the regex pattern to match the LB and CL tags + tag_pattern = re.compile(r'\tLB:z:[^\t]+\tCL:z:[^\t]+') + + with open(input_file, 'r') as infile, open(output_file, 'w') as outfile: + for line in infile: + # Remove the tags from the line + cleaned_line = re.sub(tag_pattern, '\n', line) + # Remove trailing tabs + cleaned_line = cleaned_line.rstrip('\t') + # Write the cleaned line to the output file, ensuring the newline character is preserved + outfile.write(cleaned_line) + def readGFA(gfa): ### Read GFA file into gfapy python structure + #gfaGraph = gfapy.Gfa.from_file(gfa) try: gfaGraph = gfapy.Gfa.from_file(gfa) check = "PASS" @@ -38,7 +52,6 @@ def remove_loops(lnkInfo): for i in lnkInfo: if i.from_name == i.to_name: selfHits.append(i) - for j in lnkInfo: if not j in selfHits: prunedSelfs.append(j) @@ -62,7 +75,7 @@ def id_low_cov_contigs(segInfo): def remove_low_cov_contigs_from_edges(lowCov,selfHits): ### Remove low coverage hits from links (after self hits) fLinks = [] - + #print(selfHits) if len(lowCov) ==0: fLinks = selfHits check = "PASS" @@ -90,7 +103,6 @@ def find_longest_contig(seqs, gfa): lgContig[name]=seqLen lgSeq = max(lgContig,key=lgContig.get) - #write longest contig to file for j in seqs: if lgSeq == j.get('name'): @@ -123,10 +135,14 @@ def get_final_path( graph, longest_contig ): ### This is the function to assess if there are multiple paths ### duplicate pairs of contig links with different orientations contigs = [] + itr_candidates = [] all_simple_paths = {} lengths = {} longest_path = [] final_path = [] + + ### Identify ITR candidates based on depth + print(graph.nodes()) ### Check to see if longest contig in edge list to connect contig seqs, dups not removed edgeList = list(graph.edges) edgeCheck =[] @@ -150,7 +166,9 @@ def get_final_path( graph, longest_contig ): contigs.append(edge[1]) for contig in contigs: if contig != longest_contig: - for sp in nx.all_simple_paths( graph, longest_contig, contig ): + print(contig) + for sp in nx.all_simple_paths( graph, contig, longest_contig ): + print(sp) if contig not in all_simple_paths: all_simple_paths[contig] = [] all_simple_paths[contig].append( sp ) @@ -159,20 +177,21 @@ def get_final_path( graph, longest_contig ): if len(sp) not in lengths: lengths[len(sp)] = 0 lengths[len(sp)] = lengths[len(sp)] + 1 + #print(longest_path) ####REVERSE THE ITR length path instead of the first path of the all paths section###### #warning if there is more than one longest path + #print(lengths[len(longest_path)]) if lengths[len(longest_path)] > 1: status = "WARNING: >1 longest path" return final_path, status - # make sure there are 2 paths between the longest contig and the last contig in the longest path + # make sure there are 2 paths between the longest contig and the last contig in the longest sp_l = all_simple_paths[longest_path[-1]] if len(sp_l) < 2: status = "WARNING: only 1 path between longest contig and the last contig in the longest path" return final_path, status elif len(sp_l) == 2: - path_a = sp_l[0] path_b = sp_l[1] @@ -182,15 +201,14 @@ def get_final_path( graph, longest_contig ): elif len(path_b) < len(path_a): path_b.reverse() final_path = path_b + path_a[1:] - - + print(final_path) status = "PASS" return final_path, status + elif len(sp_l) > 2: status = "WARNING: >2 paths between longest contig and the last contig in the longest path" return final_path, status - def orient_longest_contig(query,reference): blastResults = query+"_blast.out" subprocess.call(["makeblastdb","-in",query,"-out",query+"_DB","-dbtype","nucl"],shell=False) @@ -207,8 +225,6 @@ def orient_longest_contig(query,reference): return orientation, check - - def get_final_orientation(final_path, lnks, longest_contig, longest_orient): contig_orientation = [0] * len(final_path) @@ -342,8 +358,12 @@ def main(arguments): logFile = [] logFile.append(gfaFile) + # clean up gfa tags + cleanedGfa = 'graph_cleaned.gfa' + clean_graph_tags(gfaFile, cleanedGfa) + # read gfa file into graph structure - original_graph, status = readGFA(gfaFile) + original_graph, status = readGFA(cleanedGfa) log['00'] = {'step_name' : "read_gfa", 'step_description' : "read gfa file into graph structure", 'status' : status, @@ -361,7 +381,6 @@ def main(arguments): # filter edges that are loops (these represent repeats, we'll deal with them later) if type(original_graph) == str: - sys.exit(0) else: filtered_edges, status = remove_loops( original_graph.edges ) @@ -372,6 +391,7 @@ def main(arguments): 'filtered_edges' : str(filtered_edges) } } + print(filtered_edges) if status != "PASS": write_log_and_exit(log, status) @@ -483,8 +503,7 @@ def main(arguments): 'final_itr_length' : final_itr_length } } - write_log_and_exit(log,status) if __name__=='__main__': - main(sys.argv[1:]) + main(sys.argv[1:]) \ No newline at end of file diff --git a/bin/mpxv-AssemblyGraph_gfaPyv2.py b/bin/mpxv-AssemblyGraph_gfaPyv2.py new file mode 100755 index 0000000..775072f --- /dev/null +++ b/bin/mpxv-AssemblyGraph_gfaPyv2.py @@ -0,0 +1,487 @@ +#!/usr/bin/env python3 + +### Written by S.Morrison and K. Knipe +### Date: 20221018 + +import gzip, argparse,os,sys,fnmatch,subprocess,re +import os.path +from datetime import datetime +import linecache +import gfapy +import networkx as nx +from Bio.Seq import Seq +from Bio.SeqRecord import SeqRecord +import functools +import operator +from Bio import SeqIO +import pprint +import json + +def readGFA(gfa): + ### Read GFA file into gfapy python structure + gfaGraph = gfapy.Gfa.from_file(gfa) + #print(gfaGraph.edges) + #print(gfaGraph) + if(len(gfaGraph.edges)) == 0: + check = "WARNING: gfa file only contains segment lines" + gfaGraph = "WARNING: gfa file only contains segment lines" + else: + check = "PASS" + #check = "WARNING: Issue with GFA file : No GFA processing" + # gfaGraph = "WARNING: Issue with GFA file : No GFA processing" + return gfaGraph,check + + +def remove_loops(lnkInfo): + ### Identify contigs with self hits, remove those links + selfHits = [] + prunedSelfs = [] + for i in lnkInfo: + if i.from_name == i.to_name: + selfHits.append(i) + + for j in lnkInfo: + if not j in selfHits: + prunedSelfs.append(j) + + check = "PASS" + return prunedSelfs,check + +def id_low_cov_contigs(segInfo): + ### Identify contigs below 0.5x coverage + lowCov = [] + for i in segInfo: + line = i.tagnames + for j in line: + if j == 'dp': + if i.get(j) < 0.5: + name = i.get('name') + lowCov.append(name) + check= "PASS" + return lowCov,check + +def remove_low_cov_contigs_from_edges(lowCov,selfHits): + ### Remove low coverage hits from links (after self hits) + fLinks = [] + + if len(lowCov) ==0: + fLinks = selfHits + check = "PASS" + elif len(lowCov) ==1: + for m in lowCov: + lowID = m + for n in range(0,len(selfHits)): + if not((lowID == selfHits[n].from_name) or (lowID == selfHits[n].to_name)): + fLinks.append(selfHits[n]) + check="PASS" + else: + check="[Warning :: There are 2 or more contigs with coverage less than 0.5 - manual review required]" + return fLinks,check + +def find_longest_contig(seqs, gfa): + ### Find the longest contig sequence and its name + lgContig ={} + + for j in seqs: + leng = j.tagnames + name = j.get('name') + for m in leng: + if m == 'LN': + seqLen = j.get(m) + lgContig[name]=seqLen + lgSeq = max(lgContig,key=lgContig.get) + + + #write longest contig to file + for j in seqs: + if lgSeq == j.get('name'): + SeqIO.write(SeqRecord(Seq(j.get('sequence')),lgSeq), gfa + "_longest.fasta", "fasta") + + #write all contigs to a file + gfaContigs = open(gfa + "_all_contigs.fasta", "w") + for n in seqs: + seqName = n.get('name') + gfaContigs.write(">"+seqName+"\n") + gfaContigs.write(n.get('sequence')+"\n") + gfaContigs.close() + check="PASS" + return lgSeq,check + +def create_filtered_graph(lnks): + ### Create NetworkX Graph + tGraph = nx.MultiGraph() + edgeCorrect =[] + for m in lnks: + tGraph.add_edge(m.from_name,m.to_name) + check="PASS" + if not nx.is_connected(tGraph): + check="WARNING :: This assembly graph does not appear to be connected -- there may be an assembly issue!" + else: + check = "PASS" + return tGraph,check + +def get_final_path( graph, longest_contig ): + ### This is the function to assess if there are multiple paths + ### duplicate pairs of contig links with different orientations + contigs = [] + all_simple_paths = {} + lengths = {} + longest_path = [] + final_path = [] + ### Check to see if longest contig in edge list to connect contig seqs, dups not removed + edgeList = list(graph.edges) + edgeCheck =[] + for i in edgeList: + edgeCheck.append(i[2]) + goEdge = list(set(edgeCheck)) + if not len(goEdge) == 1: + status = "WARNING: Multiple links connect to 2 or more contigs in assembly" + return final_path, status + else: + out = [item for t in edgeList for item in t] + + if not longest_contig in out: + status = "WARNING: Longest contig not in links to connect to other contigs in assembly " + return final_path, status + + for edge in graph.edges: + if edge[0] not in contigs: + contigs.append(edge[0]) + if edge[1] not in contigs: + contigs.append(edge[1]) + for contig in contigs: + if contig != longest_contig: + for sp in nx.all_simple_paths( graph, longest_contig, contig ): + #print(sp) + if contig not in all_simple_paths: + all_simple_paths[contig] = [] + all_simple_paths[contig].append( sp ) + if len(sp) > len(longest_path): + longest_path = sp + if len(sp) not in lengths: + lengths[len(sp)] = 0 + lengths[len(sp)] = lengths[len(sp)] + 1 + ####REVERSE THE ITR length path instead of the first path of the all paths section###### + #warning if there is more than one longest + if lengths[len(longest_path)] > 1: + status = "WARNING: >1 longest path" + return final_path, status + + # make sure there are 2 paths between the longest contig and the last contig in the longest path + sp_l = all_simple_paths[longest_path[-1]] + if len(sp_l) < 2: + status = "WARNING: only 1 path between longest contig and the last contig in the longest path" + return final_path, status + elif len(sp_l) == 2: + + path_a = sp_l[0] + path_b = sp_l[1] + + if len(path_a) < len(path_b): + path_a.reverse() + final_path = path_a + path_b[1:] + elif len(path_b) < len(path_a): + path_b.reverse() + final_path = path_b + path_a[1:] + status = "PASS" + return final_path, status + elif len(sp_l) > 2: + status = "WARNING: >2 paths between longest contig and the last contig in the longest path" + status="Pass" + return final_path, status + +def orient_longest_contig(query,reference): + blastResults = query+"_blast.out" + subprocess.call(["makeblastdb","-in",query,"-out",query+"_DB","-dbtype","nucl"],shell=False) + subprocess.call(["blastn","-query", reference,"-db", query+"_DB","-evalue",".00001","-outfmt","6 qseqid sseqid pident length qcovs sstart send sseq mismatch gapopen qlen slen bitscore","-out",blastResults]) + check = "PASS" + with open(blastResults,'r') as e: + for line in e: + f13LInfo = line.split('\t') + sstart = int(f13LInfo[5]) + send = int(f13LInfo[6]) + orientation = 1 if sstart < send else int(-1) + + #TODO - cleanup blast files + + return orientation, check + +def get_final_orientation(final_path, lnks, longest_contig, longest_orient): + contig_orientation = [0] * len(final_path) + + for i in range(final_path.index(longest_contig), len(final_path)): + if i == final_path.index(longest_contig): + contig_orientation[i] = longest_orient + else: + flag=0 + for link in lnks: + if (link.from_name == final_path[i-1] and link.to_name == final_path[i]): + from_orient = 1 if link.from_orient == '+' else int(-1) + to_orient = 1 if link.to_orient == '+' else int(-1) + contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient + flag=1 + if flag == 0: + for link in lnks: + if (link.to_name == final_path[i-1] and link.from_name == final_path[i]): + from_orient = 1 if link.from_orient == '+' else int(-1) + to_orient = 1 if link.to_orient == '+' else int(-1) + contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient + flag=1 + + for i in range(final_path.index(longest_contig)-1, -1 ,-1): + flag=0 + for link in lnks: + if (link.to_name == final_path[i+1] and link.from_name == final_path[i]): + from_orient = 1 if link.from_orient == '+' else int(-1) + to_orient = 1 if link.to_orient == '+' else int(-1) + contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient + flag=1 + if flag == 0: + for link in lnks: + if (link.from_name == final_path[i+1] and link.to_name == final_path[i]): + from_orient = 1 if link.from_orient == '+' else int(-1) + to_orient = 1 if link.to_orient == '+' else int(-1) + contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient + flag=1 + check="PASS" + return contig_orientation, check + +def get_final_sequence(contig_order, contig_orientation, segments): + segment_info = {} + for segment in segments: + segment_count = contig_order.count(segment.get('name')) + coverage = float(segment.get('dp')) if segment_count == 0 else float(segment.get('dp'))/contig_order.count(segment.get('name')) + segment_info[segment.get('name')] = { 'coverage' : coverage, + 'sequence' : Seq(segment.get('sequence')), + 'sequence_rc' : Seq(segment.get('sequence')).reverse_complement() + } + final_sequence = '' + final_order_orientation_copy_number = [] + for i in range(len(contig_order)): + sequence = segment_info[contig_order[i]]['sequence'] * round(segment_info[contig_order[i]]['coverage']) + if contig_orientation[i] == -1: + sequence = segment_info[contig_order[i]]['sequence_rc'] * round(segment_info[contig_order[i]]['coverage']) + orientation = '+' if contig_orientation[i] == 1 else '-' + order_orientation_copy_number = '%s%s' % (orientation, contig_order[i]) + if round(segment_info[contig_order[i]]['coverage']) > 1: + order_orientation_copy_number = '%sx%s' % (order_orientation_copy_number, round(segment_info[contig_order[i]]['coverage'])) + final_sequence = final_sequence + sequence + final_order_orientation_copy_number.append(order_orientation_copy_number) + + check = "PASS" + # are all segments in final_sequence? + for segment in segment_info: + if (segment_info[segment]['coverage'] > 0.5) and (segment not in contig_order): + check = 'WARNING: missing segments' + return final_sequence, len(final_sequence), " ".join(final_order_orientation_copy_number), check + +def get_itr_length(lgContig,contig_order,segments): + final_itr_length = 0 + itr=[] + for i in contig_order: + if not i == lgContig: + itr.append(i) + elif i == lgContig: + break + for segment in segments: + segmentName = segment.get('name') + segmentCov = segment.get('coverage') + if segmentName in itr: + segment_coverage = segment.get('dp') + half_coverage = segment_coverage /2 + segment_sequence_length = len(segment.get('sequence')) + total_itr_segment_length = segment_sequence_length * round(half_coverage) + final_itr_length = final_itr_length + total_itr_segment_length + check = "PASS" + return final_itr_length , check + +def write_log_and_exit( log, status ): + + log_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".log") + summary_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".summary") + + headers = ['sample', 'status', 'contig_order', 'contig_orientation', 'contig_order_orientation_copy_number', 'assembly_length', 'itr_length'] + data = [] + if '00' in log: + data.append( log['00']['input']['sample_name'] ) + data.append( status ) + if '06' in log: + data.append( ",".join( str(i) for i in log['06']['output']['final_path']) ) + if '08' in log: + data.append( ",".join( str(i) for i in log['08']['output']['final_orientation'] ) ) + if '09' in log: + data.append( str(log['09']['output']['final_order_orientation_copy_number']) ) + data.append( str(log['09']['output']['final_sequence_length']) ) + if '10' in log: + data.append( str(log['10']['output']['final_itr_length'])) + + with open(summary_file, 'w') as f: + f.write( '\t'.join( headers ) + '\n' ) + f.write( '\t'.join(data) + '\n' ) + + with open(log_file, 'w') as f: + json_object = json.dumps(log, indent = 4) + f.write(json_object) + +def main(arguments): + parser = argparse.ArgumentParser(description="GFA parser to construct assembly from Unicycler", epilog="______") + parser.add_argument('-i',type=str,required=True,help="GFA file from Unicycler") + parser.add_argument('-r',type=str,required=True,help="Monkeypox genome sequence - single line fasta") + parser.add_argument('-o',type=str,required=True,help="Output directory") + + args = parser.parse_args() + gfaFile = args.i + refSeq = args.r + out_dir = args.o + + log = {} + errors = [] + logFile = [] + logFile.append(gfaFile) + + # read gfa file into graph structure + original_graph, status = readGFA(gfaFile) + log['00'] = {'step_name' : "read_gfa", + 'step_description' : "read gfa file into graph structure", + 'status' : status, + 'input' : { + 'gfa' : gfaFile, + 'sample_name' : os.path.splitext(os.path.basename(gfaFile))[0], + 'output_dir' : out_dir + }, + 'output' : { + 'original_graph' : str(original_graph), + } + } + if status != "PASS": + write_log_and_exit(log, status) + + # filter edges that are loops (these represent repeats, we'll deal with them later) + if type(original_graph) == str: + + sys.exit(0) + else: + filtered_edges, status = remove_loops( original_graph.edges ) + log['01'] = {'step_name' : "remove_loops", + 'step_description' : "filter edges that are loops (these represent repeats, we'll deal with them later)", + 'status' : status, + 'output' : { + 'filtered_edges' : str(filtered_edges) + } + } + if status != "PASS": + write_log_and_exit(log, status) + + # identify low coverage contigs + low_cov_contigs, status = id_low_cov_contigs( original_graph.segments ) + log['02'] = {'step_name' : "id_low_cov_contigs", + 'step_description' : "identify low coverage contigs", + 'status' : status, + 'output' : { + 'low_cov_contigs' : low_cov_contigs + } + } + if status != "PASS": + write_log_and_exit(log, status) + + # remove low coverage contigs from edges + filtered_edges, status = remove_low_cov_contigs_from_edges( low_cov_contigs, filtered_edges ) + log['03'] = {'step_name' : "remove_low_cov_contigs_from_edges", + 'step_description' : "remove low coverage contigs from edges", + 'status' : status, + 'output' : { + 'filtered_edges' : str(filtered_edges) + } + } + if status != "PASS": + write_log_and_exit(log, status) + sys.exit(0) + + # find the longest contig + longest_contig, status = find_longest_contig( original_graph.segments, log['00']['input']['sample_name'] ) + log['04'] = {'step_name' : "find_longest_contig", + 'step_description' : "find the longest contig", + 'status' : status, + 'output' : { + 'longest_contig' : longest_contig + } + } + if status != "PASS": + write_log_and_exit(log, status) + + # create graph from filtered edges + filtered_graph, status = create_filtered_graph(filtered_edges) + log['05'] = {'step_name' : "create_filtered_graph", + 'step_description' : "create graph from filtered edges", + 'status' : status, + 'output' : { + 'filtered_graph' : str(filtered_graph) + } + } + if status != "PASS": + write_log_and_exit(log) + sys.exit(0) + + final_path, status = get_final_path( filtered_graph, longest_contig ) + log['06'] = {'step_name' : "get_final_path", + 'step_description' : "get final path from filtered graph using longest contig to longest simple path", + 'status' : status, + 'output' : { + 'final_path' : final_path + } + } + if status != "PASS": + write_log_and_exit(log, status) + sys.exit(0) + + # orient longest contig with F13L + longest_orientation, status = orient_longest_contig( log['00']['input']['sample_name'] + "_longest.fasta" , refSeq ) + log['07'] = {'step_name' : "orient_longest_contig", + 'step_description' : "get orientation of longest contig given F13L gene", + 'status' : status, + 'output' : { + 'longest_orientation' : longest_orientation + } + } + if status != "PASS": + write_log_and_exit(log) + + final_orientation, status = get_final_orientation(final_path, filtered_edges, longest_contig, longest_orientation) + log['08'] = {'step_name' : "get_final_orientation", + 'step_description' : "get orientation of contigs starting at the longest and traversing the path in either direction", + 'status' : status, + 'output' : { + 'final_orientation' : final_orientation + } + } + if status != "PASS": + write_log_and_exit(log, status) + + final_sequence, final_sequence_length, final_order_orientation_copy_number, status = get_final_sequence( final_path , final_orientation , original_graph.segments ) + log['09'] = {'step_name' : "get_final_sequence", + 'step_description' : "get_final_sequence", + 'status' : status, + 'output' : { + 'final_order_orientation_copy_number' : final_order_orientation_copy_number, + 'final_sequence' : str(final_sequence), + 'final_sequence_length' : final_sequence_length + } + } + if status != "PASS": + write_log_and_exit(log, status) + + SeqIO.write(SeqRecord(Seq(final_sequence),gfaFile), log['00']['input']['sample_name'] + "_asm.fasta", "fasta") + + final_itr_length, status = get_itr_length( longest_contig ,final_path , original_graph.segments ) + log['10'] = {'step_name' : "get_itr_length", + 'step_description' : "get_itr_length", + 'status' : status, + 'output' : { + 'final_itr_length' : final_itr_length + } + } + + write_log_and_exit(log,status) + +if __name__=='__main__': + main(sys.argv[1:]) diff --git a/modules/nf-core/modules/unicycler/main.nf b/modules/nf-core/modules/unicycler/main.nf index 9969d29..6c1a4e8 100755 --- a/modules/nf-core/modules/unicycler/main.nf +++ b/modules/nf-core/modules/unicycler/main.nf @@ -12,7 +12,7 @@ process UNICYCLER { output: tuple val(meta), path('*.scaffolds.fa.gz'), emit: scaffolds optional true - tuple val(meta), path('*.assembly.gfa.gz'), emit: gfa optional true + tuple val(meta), path('*.gfa'), emit: gfa optional true tuple val(meta), path('*.log') , emit: log path "versions.yml" , emit: versions @@ -28,11 +28,13 @@ process UNICYCLER { --threads $task.cpus \\ $args \\ $short_reads \\ - --out ./ + --out ./ \\ + --keep 2 mv unicycler.log ${prefix}.unicycler.log mv assembly.fasta ${prefix}.scaffolds.fa gzip -n ${prefix}.scaffolds.fa + mv 003_bridges_applied.gfa ${prefix}.003_bridges_applied.gfa mv assembly.gfa ${prefix}.assembly.gfa gzip -n ${prefix}.assembly.gfa diff --git a/nextflow.config b/nextflow.config index 96c9e7e..042f377 100755 --- a/nextflow.config +++ b/nextflow.config @@ -187,6 +187,10 @@ manifest { // Load modules.config for DSL2 module specific options includeConfig 'conf/modules.config' +// Load CDC config for operating on internal compute infrastructure +includeConfig 'conf/cdc.config' + + // Function to ensure that resource requirements don't go beyond // a maximum limit def check_max(obj, type) { From efb70ce6578197b0fec6d27940097d8663d0d7e3 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Thu, 8 Aug 2024 14:39:33 -0400 Subject: [PATCH 03/42] renamed python script for gfa to make more general, pushing several changes related to making the gfa script able to handle clade I, also added the same logging and summary file present in the original script, but a lot of the script was reorganized and refactored --- bin/AssemblyGraph_gfaPy.py | 453 ++++++++++++++++++++++++++++++ bin/mpxv-AssemblyGraph_gfaPyv3.py | 453 ++++++++++++++++++++++++++++++ 2 files changed, 906 insertions(+) create mode 100644 bin/AssemblyGraph_gfaPy.py create mode 100644 bin/mpxv-AssemblyGraph_gfaPyv3.py diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py new file mode 100644 index 0000000..1049c03 --- /dev/null +++ b/bin/AssemblyGraph_gfaPy.py @@ -0,0 +1,453 @@ +#!/usr/bin/env python3 + +### Written by S.Morrison, K. Knipe and Kyle O'Connell +### initial code : 20221018; refactor 20240730 + +''' +To Do: +- Need to add all the logging and summary file like shatavia had +- need to add ITR length to that script +- Need to add total seq length + +''' + +import gzip +import argparse +import os +import sys +import fnmatch +import subprocess +import re +import gfapy +import networkx as nx +from Bio.Seq import Seq +from Bio.SeqRecord import SeqRecord +from Bio import SeqIO +import json +import shutil + +def clean_graph_tags(input_file, output_file): + # Define the regex pattern to match the LB and CL tags + tag_pattern = re.compile(r'\tLB:z:[^\t]+\tCL:z:[^\t]+') + + with open(input_file, 'r') as infile, open(output_file, 'w') as outfile: + for line in infile: + # Remove the tags from the line + cleaned_line = re.sub(tag_pattern, '\n', line) + # Remove trailing tabs + cleaned_line = cleaned_line.rstrip('\t') + # Write the cleaned line to the output file, ensuring the newline character is preserved + outfile.write(cleaned_line) + print('cleaned graph tags') + +def read_gfa_file(gfa_path): + """Read GFA file into gfapy python structure.""" + print('reading cleaned gfa') + try: + gfa_graph = gfapy.Gfa.from_file(gfa_path) + # print(gfa_graph.edges) + if len(gfa_graph.edges) == 0: + return None, "WARNING: GFA file only contains segment lines" + return gfa_graph, "PASS" + except Exception as e: + return None, f"WARNING: Issue with GFA file : {str(e)}" + +def remove_self_loops(links): + """Remove self-loops from link information.""" + pruned_links = [link for link in links if link.from_name != link.to_name] + # print(pruned_links) + return pruned_links, "PASS" + +def identify_low_coverage_contigs(segments): + """Identify contigs below 0.5x coverage.""" + low_cov = [] + for seg in segments: + dp_value = seg.get('dp') # This will return None if 'dp' is not a field in the segment + if dp_value is not None and float(dp_value) < 0.5: + low_cov.append(seg.get('name')) + #$print(low_cov) + return low_cov, "PASS" + +def filter_links_by_coverage(low_cov, links): + """Filter out links involving low coverage contigs.""" + filtered_links = [link for link in links if link.from_name not in low_cov and link.to_name not in low_cov] + return filtered_links, "PASS" + +def find_longest_contig(segments, output_dir): + """Find the longest contig based on length.""" + longest_contig = max(segments, key=lambda x: x.get('LN')) + # write longest contig to file + longest_contig_file = os.path.join(output_dir, "longest_contig.fasta") + with open(longest_contig_file, "w") as gfaContigs: + seqName = longest_contig.get('name') + gfaContigs.write(">" + seqName + "\n") + gfaContigs.write(longest_contig.get('sequence') + "\n") + return longest_contig.get('name'), "PASS", longest_contig_file + +def filter_segments_by_graph(segments, graph): + """Filter segments to include only those that are part of the graph.""" + graph_nodes = set(graph.nodes()) # Get all nodes in the graph as a set for quick lookup + filtered_segments = [seg for seg in segments if seg.get('name') in graph_nodes] + return filtered_segments + +def create_filtered_graph(links): + """Create a filtered NetworkX graph from links and remove disconnected nodes.""" + graph = nx.Graph() # Using a simple Graph instead of MultiGraph if you don't handle multiple edges between the same nodes + for link in links: + graph.add_edge(link.from_name, link.to_name) + + # Remove disconnected nodes + disconnected_nodes = [node for node in graph.nodes if graph.degree(node) == 0] + graph.remove_nodes_from(disconnected_nodes) + + if not nx.is_connected(graph): + return None, "WARNING: Graph is not connected" + return graph, "PASS" + +def identify_itr( gfa_graph, segments ): + """Identify all Inverted Terminal Repeats (ITRs) based on depth criteria and check if they are connected in the graph.""" + depth_data = {seg.get('name'): float(seg.get('dp')) for seg in segments if 'dp' in seg.tagnames} + lower_bound = 1.5 + upper_bound = 3 + itrs = [contig for contig, depth in depth_data.items() if lower_bound < depth < upper_bound] + + itr_length = 0 + visited = set() + + for seg in segments: + if seg.name in itrs and seg.name not in visited: + visited.add(seg.name) # Mark this segment as visited + itr_length += len(seg.sequence) # Accumulate the sequence length + + print("Total ITR sequence length:", itr_length) + + return itrs, itr_length + +def get_final_path(gfa_graph, filtered_graph, segments): + """Find all longest paths in the graph starting from any ITR.""" + itrs, itr_length = identify_itr(gfa_graph, segments) + if not itrs: + return [], "WARNING: No suitable ITRs found based on depth criteria." + + longest_paths = [] + max_length = 0 + for itr in itrs: + for contig in filtered_graph.nodes(): + if contig != itr: + for path in nx.all_simple_paths(filtered_graph, source=itr, target=contig): + # print(path) + path_length = len(path) + if path_length > max_length: + longest_paths = [path] # Start a new list with the new longest path + max_length = path_length + elif path_length == max_length: + longest_paths.append(path) # Add path to the list of longest paths + + if longest_paths: + return longest_paths[0], f"PASS: Found {len(longest_paths)} longest path(s) of length {max_length}" + else: + return [], "WARNING: No path found starting from any ITR." + +def orient_longest_contig(query, reference, blast_db_dir): + blastResults = query + "_blast.out" + blast_db_path = os.path.join(blast_db_dir, query + "_DB") + makeblastdb_command = ["makeblastdb", "-in", query, "-out", blast_db_path, "-dbtype", "nucl"] + blastn_command = ["blastn", "-query", reference, "-db", blast_db_path, "-evalue", ".00001", "-outfmt", "6 qseqid sseqid pident length qcovs sstart send sseq mismatch gapopen qlen slen bitscore", "-out", blastResults] + + print(f"Running command: {' '.join(makeblastdb_command)}") + subprocess.call(makeblastdb_command, shell=False) + + print(f"Running command: {' '.join(blastn_command)}") + subprocess.call(blastn_command, shell=False) + + # Check if blastResults file is created and contains results + if not os.path.exists(blastResults): + print(f"BLAST results file not created: {blastResults}") + return None, "FAIL" + + with open(blastResults, 'r') as e: + for line in e: + f13LInfo = line.split('\t') + sstart = int(f13LInfo[5]) + send = int(f13LInfo[6]) + orientation = 1 if sstart < send else int(-1) + return orientation, "PASS" + +def get_final_orientation(final_path, lnks, longest_contig, longest_orient): + contig_orientation = [0] * len(final_path) + + for i in range(final_path.index(longest_contig), len(final_path)): + if i == final_path.index(longest_contig): + contig_orientation[i] = longest_orient + else: + flag=0 + for link in lnks: + if (link.from_name == final_path[i-1] and link.to_name == final_path[i]): + from_orient = 1 if link.from_orient == '+' else int(-1) + to_orient = 1 if link.to_orient == '+' else int(-1) + contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient + flag=1 + if flag == 0: + for link in lnks: + if (link.to_name == final_path[i-1] and link.from_name == final_path[i]): + from_orient = 1 if link.from_orient == '+' else int(-1) + to_orient = 1 if link.to_orient == '+' else int(-1) + contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient + flag=1 + + for i in range(final_path.index(longest_contig)-1, -1 ,-1): + flag=0 + for link in lnks: + if (link.to_name == final_path[i+1] and link.from_name == final_path[i]): + from_orient = 1 if link.from_orient == '+' else int(-1) + to_orient = 1 if link.to_orient == '+' else int(-1) + contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient + flag=1 + if flag == 0: + for link in lnks: + if (link.from_name == final_path[i+1] and link.to_name == final_path[i]): + from_orient = 1 if link.from_orient == '+' else int(-1) + to_orient = 1 if link.to_orient == '+' else int(-1) + contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient + flag=1 + check="PASS" + return contig_orientation, check + +def get_final_sequence(contig_order, contig_orientation, segments): + segment_info = {} + for segment in segments: + segment_count = contig_order.count(segment.get('name')) + coverage = float(segment.get('dp')) if segment_count == 0 else float(segment.get('dp')) / contig_order.count(segment.get('name')) + segment_info[segment.get('name')] = { + 'coverage': coverage, + 'sequence': Seq(segment.get('sequence')), + 'sequence_rc': Seq(segment.get('sequence')).reverse_complement() + } + + print("Segment Info Keys:", segment_info.keys()) + print("Contig Order:", contig_order) + + final_sequence = '' + final_order_orientation_copy_number = [] + for i in range(len(contig_order)): + segment_name = contig_order[i].strip('+').strip('-') # Strip orientation symbols + # print(f"Processing segment: {segment_name}") + sequence = segment_info[segment_name]['sequence'] * round(segment_info[segment_name]['coverage']) + if contig_orientation[i] == -1: + sequence = segment_info[segment_name]['sequence_rc'] * round(segment_info[segment_name]['coverage']) + orientation = '+' if contig_orientation[i] == 1 else '-' + order_orientation_copy_number = '%s%s' % (orientation, segment_name) + if round(segment_info[segment_name]['coverage']) > 1: + order_orientation_copy_number = '%sx%s' % (order_orientation_copy_number, round(segment_info[segment_name]['coverage'])) + final_sequence = final_sequence + sequence + final_order_orientation_copy_number.append(order_orientation_copy_number) + + check = "PASS" + # are all segments in final_sequence? + cleaned_contig_order = [contig.strip('+-') for contig in contig_order] + for segment in segment_info: + if (segment_info[segment]['coverage'] > 0.5) and (segment not in cleaned_contig_order): + check = 'WARNING: missing segments' + return final_sequence, len(final_sequence), " ".join(final_order_orientation_copy_number), check + +def write_oriented_fasta(final_path, segments, output_file, input_file): + """Write the segments in the specified orientation to a single FASTA entry with the input file name as the header.""" + segment_dict = {seg.name: seg.sequence for seg in segments} # Create a dictionary of segment names to sequences + full_sequence = "" # Initialize an empty string to accumulate full sequence + + for segment_name in final_path: + seq = segment_dict[segment_name.strip('+').strip('-')] # Remove orientation symbols for lookup + # Check if the segment should be reversed + if segment_name.endswith('-'): + seq = str(Seq(seq).reverse_complement()) # Reverse complement the sequence if needed + + full_sequence += seq # Concatenate sequence + + # Create a single SeqRecord with all concatenated sequences + # Use the base name of the input file as the ID for the SeqRecord + input_base_name = os.path.splitext(os.path.basename(input_file))[0] + record = SeqRecord(Seq(full_sequence), id=input_base_name, description="All contigs concatenated based on the final path") + + # Write the single record to the output file + with open(output_file, 'w') as f: + SeqIO.write(record, f, "fasta") + +def write_all_contigs(segments, output_file): + """Write all contigs to a FASTA file without considering orientation.""" + with open(output_file, 'w') as f: + for seg in segments: + record = SeqRecord(Seq(seg.sequence), id=seg.name, description="") + SeqIO.write(record, f, "fasta") + +def write_log_and_exit(log, status): + # print(log) + log_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".log") + summary_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".summary") + + headers = ['sample', 'status', 'contig_order', 'contig_orientation', 'contig_order_orientation_copy_number', 'assembly_length', 'itr_length'] + data = [] + if '00' in log: + data.append(log['00']['input']['sample_name']) + data.append(status) + if '03' in log: + data.append(",".join(str(i) for i in log['03']['output']['final_path'])) + if '06' in log: + data.append(",".join(str(i) for i in log['06']['output']['final_orientation'])) + if '07' in log: + data.append(str(log['07']['output']['final_order_orientation_copy_number'])) + data.append(str(log['07']['output']['final_sequence_length'])) + if '09' in log: + data.append(str(log['09']['output']['final_itr_length'])) + + with open(summary_file, 'w') as f: + f.write('\t'.join(headers) + '\n') + f.write('\t'.join(data) + '\n') + + with open(log_file, 'w') as f: + json_object = json.dumps(log, indent=4) + f.write(json_object) + sys.exit(0) + +def process_graph(gfa_graph, output_dir, input_file, reference): + """Process the graph and write output based on the results.""" + log = {} + input_with_ext = os.path.basename(input_file) + input_base, _ = os.path.splitext(input_with_ext) + sample_name = input_base + + # Initial log entry + log['00'] = {'step_name': "initialization", + 'step_description': "Initialize the logging process", + 'status': "PASS", + 'input': { + 'gfa': input_file, + 'sample_name': sample_name, + 'output_dir': output_dir + }, + 'output': {}} + + # Always write all contigs to a FASTA file at the start + write_all_contigs(gfa_graph.segments, os.path.join(output_dir, input_base + ".all_contigs.fasta")) + + # Start processing the graph + filtered_edges, status = remove_self_loops(gfa_graph.edges) + log['01'] = {'step_name': "remove_self_loops", + 'step_description': "Remove self-loops from link information", + 'status': status, + 'output': {'filtered_edges': [str(edge) for edge in filtered_edges]}} + if status != "PASS": + write_log_and_exit(log, status) + + filtered_graph, status = create_filtered_graph(filtered_edges) + log['02'] = {'step_name': "create_filtered_graph", + 'step_description': "Create a filtered NetworkX graph from links and remove disconnected nodes", + 'status': status, + 'output': {'filtered_graph': str(filtered_graph)}} + if status != "PASS": + write_log_and_exit(log, status) + + filtered_segments = filter_segments_by_graph(gfa_graph.segments, filtered_graph) + final_path, status = get_final_path(gfa_graph, filtered_graph, filtered_segments) + log['03'] = {'step_name': "get_final_path", + 'step_description': "Find all longest paths in the graph starting from any ITR", + 'status': status, + 'output': {'final_path': final_path}} + if not status.startswith("PASS"): + write_log_and_exit(log, status) + + # Find the longest contig + longest_contig, status, longest_contig_file = find_longest_contig(filtered_segments, output_dir) + log['04'] = {'step_name': "find_longest_contig", + 'step_description': "Find the longest contig based on length", + 'status': status, + 'output': {'longest_contig': longest_contig}} + if status != "PASS": + write_log_and_exit(log, status) + + # Create blast database directory + blast_db_dir = os.path.join(output_dir, 'blast_db') + os.makedirs(blast_db_dir, exist_ok=True) # Create if it doesn't exist + # Determine the orientation of the longest contig + longest_orient, status = orient_longest_contig(longest_contig_file, reference, blast_db_dir) + log['05'] = {'step_name': "orient_longest_contig", + 'step_description': "Determine the orientation of the longest contig", + 'status': status, + 'output': {'longest_orient': longest_orient}} + if status != "PASS": + write_log_and_exit(log, status) + + # Get the final orientation for all contigs + contig_orientation, status = get_final_orientation(final_path, filtered_edges, longest_contig, longest_orient) + log['06'] = {'step_name': "get_final_orientation", + 'step_description': "Get the final orientation for all contigs", + 'status': status, + 'output': {'final_orientation': contig_orientation}} + if status != "PASS": + write_log_and_exit(log, status) + + # Re-orient the final path based on determined orientation + oriented_final_path = [contig + ('-' if contig_orientation[i] == -1 else '+') for i, contig in enumerate(final_path)] + + # Get the final sequence and order + final_sequence, seq_len, final_order_orientation_copy_number, status = get_final_sequence(oriented_final_path, contig_orientation, filtered_segments) + log['07'] = {'step_name': "get_final_sequence", + 'step_description': "Get the final sequence and order", + 'status': status, + 'output': {'final_sequence': str(final_sequence), # Convert Seq object to string + 'final_sequence_length': seq_len, + 'final_order_orientation_copy_number': final_order_orientation_copy_number}} + if status != "PASS": + write_log_and_exit(log, status) + + # Write the oriented contigs to a FASTA file + asm_name = input_base + ".assembly_asm.fasta" + record = SeqRecord(Seq(final_sequence), id=input_base, description=final_order_orientation_copy_number) + with open(os.path.join(output_dir, asm_name), 'w') as f: + SeqIO.write(record, f, "fasta") + + log['08'] = {'step_name': "write_oriented_fasta", + 'step_description': "Write the oriented contigs to a FASTA file", + 'status': "PASS", + 'output': {'assembly_file': asm_name}} + + # Remove the blast_db directory + shutil.rmtree(blast_db_dir) # Remove the directory and its contents + + # Identify ITRs and their length + itrs, itr_length = identify_itr(gfa_graph, filtered_segments) + log['09'] = {'step_name': "identify_itr", + 'step_description': "Identify all Inverted Terminal Repeats (ITRs) based on depth criteria", + 'status': "PASS", + 'output': {'itrs': itrs, + 'final_itr_length': itr_length}} + + # Write the final log and summary + write_log_and_exit(log, "PASS") + +def main(arguments): + parser = argparse.ArgumentParser(description="GFA parser to construct assembly from Unicycler") + parser.add_argument('-i', type=str, required=True, help="GFA file from Unicycler") + parser.add_argument('-o', type=str, required=True, help="Output directory") + parser.add_argument('-r', type=str, required=True, help="Reference file for orientation") + args = parser.parse_args(arguments) + + gfa_file = args.i + output_dir = args.o + reference_file = args.r + + # clean up gfa tags + cleanedGfa = 'graph_cleaned.gfa' + clean_graph_tags(gfa_file, cleanedGfa) + + gfa_graph, status = read_gfa_file(cleanedGfa) + if status != "PASS": + return + + if gfa_graph is None: + print("Failed to read GFA file.") + return + + process_graph(gfa_graph, output_dir, gfa_file, reference_file) + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/bin/mpxv-AssemblyGraph_gfaPyv3.py b/bin/mpxv-AssemblyGraph_gfaPyv3.py new file mode 100644 index 0000000..1049c03 --- /dev/null +++ b/bin/mpxv-AssemblyGraph_gfaPyv3.py @@ -0,0 +1,453 @@ +#!/usr/bin/env python3 + +### Written by S.Morrison, K. Knipe and Kyle O'Connell +### initial code : 20221018; refactor 20240730 + +''' +To Do: +- Need to add all the logging and summary file like shatavia had +- need to add ITR length to that script +- Need to add total seq length + +''' + +import gzip +import argparse +import os +import sys +import fnmatch +import subprocess +import re +import gfapy +import networkx as nx +from Bio.Seq import Seq +from Bio.SeqRecord import SeqRecord +from Bio import SeqIO +import json +import shutil + +def clean_graph_tags(input_file, output_file): + # Define the regex pattern to match the LB and CL tags + tag_pattern = re.compile(r'\tLB:z:[^\t]+\tCL:z:[^\t]+') + + with open(input_file, 'r') as infile, open(output_file, 'w') as outfile: + for line in infile: + # Remove the tags from the line + cleaned_line = re.sub(tag_pattern, '\n', line) + # Remove trailing tabs + cleaned_line = cleaned_line.rstrip('\t') + # Write the cleaned line to the output file, ensuring the newline character is preserved + outfile.write(cleaned_line) + print('cleaned graph tags') + +def read_gfa_file(gfa_path): + """Read GFA file into gfapy python structure.""" + print('reading cleaned gfa') + try: + gfa_graph = gfapy.Gfa.from_file(gfa_path) + # print(gfa_graph.edges) + if len(gfa_graph.edges) == 0: + return None, "WARNING: GFA file only contains segment lines" + return gfa_graph, "PASS" + except Exception as e: + return None, f"WARNING: Issue with GFA file : {str(e)}" + +def remove_self_loops(links): + """Remove self-loops from link information.""" + pruned_links = [link for link in links if link.from_name != link.to_name] + # print(pruned_links) + return pruned_links, "PASS" + +def identify_low_coverage_contigs(segments): + """Identify contigs below 0.5x coverage.""" + low_cov = [] + for seg in segments: + dp_value = seg.get('dp') # This will return None if 'dp' is not a field in the segment + if dp_value is not None and float(dp_value) < 0.5: + low_cov.append(seg.get('name')) + #$print(low_cov) + return low_cov, "PASS" + +def filter_links_by_coverage(low_cov, links): + """Filter out links involving low coverage contigs.""" + filtered_links = [link for link in links if link.from_name not in low_cov and link.to_name not in low_cov] + return filtered_links, "PASS" + +def find_longest_contig(segments, output_dir): + """Find the longest contig based on length.""" + longest_contig = max(segments, key=lambda x: x.get('LN')) + # write longest contig to file + longest_contig_file = os.path.join(output_dir, "longest_contig.fasta") + with open(longest_contig_file, "w") as gfaContigs: + seqName = longest_contig.get('name') + gfaContigs.write(">" + seqName + "\n") + gfaContigs.write(longest_contig.get('sequence') + "\n") + return longest_contig.get('name'), "PASS", longest_contig_file + +def filter_segments_by_graph(segments, graph): + """Filter segments to include only those that are part of the graph.""" + graph_nodes = set(graph.nodes()) # Get all nodes in the graph as a set for quick lookup + filtered_segments = [seg for seg in segments if seg.get('name') in graph_nodes] + return filtered_segments + +def create_filtered_graph(links): + """Create a filtered NetworkX graph from links and remove disconnected nodes.""" + graph = nx.Graph() # Using a simple Graph instead of MultiGraph if you don't handle multiple edges between the same nodes + for link in links: + graph.add_edge(link.from_name, link.to_name) + + # Remove disconnected nodes + disconnected_nodes = [node for node in graph.nodes if graph.degree(node) == 0] + graph.remove_nodes_from(disconnected_nodes) + + if not nx.is_connected(graph): + return None, "WARNING: Graph is not connected" + return graph, "PASS" + +def identify_itr( gfa_graph, segments ): + """Identify all Inverted Terminal Repeats (ITRs) based on depth criteria and check if they are connected in the graph.""" + depth_data = {seg.get('name'): float(seg.get('dp')) for seg in segments if 'dp' in seg.tagnames} + lower_bound = 1.5 + upper_bound = 3 + itrs = [contig for contig, depth in depth_data.items() if lower_bound < depth < upper_bound] + + itr_length = 0 + visited = set() + + for seg in segments: + if seg.name in itrs and seg.name not in visited: + visited.add(seg.name) # Mark this segment as visited + itr_length += len(seg.sequence) # Accumulate the sequence length + + print("Total ITR sequence length:", itr_length) + + return itrs, itr_length + +def get_final_path(gfa_graph, filtered_graph, segments): + """Find all longest paths in the graph starting from any ITR.""" + itrs, itr_length = identify_itr(gfa_graph, segments) + if not itrs: + return [], "WARNING: No suitable ITRs found based on depth criteria." + + longest_paths = [] + max_length = 0 + for itr in itrs: + for contig in filtered_graph.nodes(): + if contig != itr: + for path in nx.all_simple_paths(filtered_graph, source=itr, target=contig): + # print(path) + path_length = len(path) + if path_length > max_length: + longest_paths = [path] # Start a new list with the new longest path + max_length = path_length + elif path_length == max_length: + longest_paths.append(path) # Add path to the list of longest paths + + if longest_paths: + return longest_paths[0], f"PASS: Found {len(longest_paths)} longest path(s) of length {max_length}" + else: + return [], "WARNING: No path found starting from any ITR." + +def orient_longest_contig(query, reference, blast_db_dir): + blastResults = query + "_blast.out" + blast_db_path = os.path.join(blast_db_dir, query + "_DB") + makeblastdb_command = ["makeblastdb", "-in", query, "-out", blast_db_path, "-dbtype", "nucl"] + blastn_command = ["blastn", "-query", reference, "-db", blast_db_path, "-evalue", ".00001", "-outfmt", "6 qseqid sseqid pident length qcovs sstart send sseq mismatch gapopen qlen slen bitscore", "-out", blastResults] + + print(f"Running command: {' '.join(makeblastdb_command)}") + subprocess.call(makeblastdb_command, shell=False) + + print(f"Running command: {' '.join(blastn_command)}") + subprocess.call(blastn_command, shell=False) + + # Check if blastResults file is created and contains results + if not os.path.exists(blastResults): + print(f"BLAST results file not created: {blastResults}") + return None, "FAIL" + + with open(blastResults, 'r') as e: + for line in e: + f13LInfo = line.split('\t') + sstart = int(f13LInfo[5]) + send = int(f13LInfo[6]) + orientation = 1 if sstart < send else int(-1) + return orientation, "PASS" + +def get_final_orientation(final_path, lnks, longest_contig, longest_orient): + contig_orientation = [0] * len(final_path) + + for i in range(final_path.index(longest_contig), len(final_path)): + if i == final_path.index(longest_contig): + contig_orientation[i] = longest_orient + else: + flag=0 + for link in lnks: + if (link.from_name == final_path[i-1] and link.to_name == final_path[i]): + from_orient = 1 if link.from_orient == '+' else int(-1) + to_orient = 1 if link.to_orient == '+' else int(-1) + contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient + flag=1 + if flag == 0: + for link in lnks: + if (link.to_name == final_path[i-1] and link.from_name == final_path[i]): + from_orient = 1 if link.from_orient == '+' else int(-1) + to_orient = 1 if link.to_orient == '+' else int(-1) + contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient + flag=1 + + for i in range(final_path.index(longest_contig)-1, -1 ,-1): + flag=0 + for link in lnks: + if (link.to_name == final_path[i+1] and link.from_name == final_path[i]): + from_orient = 1 if link.from_orient == '+' else int(-1) + to_orient = 1 if link.to_orient == '+' else int(-1) + contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient + flag=1 + if flag == 0: + for link in lnks: + if (link.from_name == final_path[i+1] and link.to_name == final_path[i]): + from_orient = 1 if link.from_orient == '+' else int(-1) + to_orient = 1 if link.to_orient == '+' else int(-1) + contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient + flag=1 + check="PASS" + return contig_orientation, check + +def get_final_sequence(contig_order, contig_orientation, segments): + segment_info = {} + for segment in segments: + segment_count = contig_order.count(segment.get('name')) + coverage = float(segment.get('dp')) if segment_count == 0 else float(segment.get('dp')) / contig_order.count(segment.get('name')) + segment_info[segment.get('name')] = { + 'coverage': coverage, + 'sequence': Seq(segment.get('sequence')), + 'sequence_rc': Seq(segment.get('sequence')).reverse_complement() + } + + print("Segment Info Keys:", segment_info.keys()) + print("Contig Order:", contig_order) + + final_sequence = '' + final_order_orientation_copy_number = [] + for i in range(len(contig_order)): + segment_name = contig_order[i].strip('+').strip('-') # Strip orientation symbols + # print(f"Processing segment: {segment_name}") + sequence = segment_info[segment_name]['sequence'] * round(segment_info[segment_name]['coverage']) + if contig_orientation[i] == -1: + sequence = segment_info[segment_name]['sequence_rc'] * round(segment_info[segment_name]['coverage']) + orientation = '+' if contig_orientation[i] == 1 else '-' + order_orientation_copy_number = '%s%s' % (orientation, segment_name) + if round(segment_info[segment_name]['coverage']) > 1: + order_orientation_copy_number = '%sx%s' % (order_orientation_copy_number, round(segment_info[segment_name]['coverage'])) + final_sequence = final_sequence + sequence + final_order_orientation_copy_number.append(order_orientation_copy_number) + + check = "PASS" + # are all segments in final_sequence? + cleaned_contig_order = [contig.strip('+-') for contig in contig_order] + for segment in segment_info: + if (segment_info[segment]['coverage'] > 0.5) and (segment not in cleaned_contig_order): + check = 'WARNING: missing segments' + return final_sequence, len(final_sequence), " ".join(final_order_orientation_copy_number), check + +def write_oriented_fasta(final_path, segments, output_file, input_file): + """Write the segments in the specified orientation to a single FASTA entry with the input file name as the header.""" + segment_dict = {seg.name: seg.sequence for seg in segments} # Create a dictionary of segment names to sequences + full_sequence = "" # Initialize an empty string to accumulate full sequence + + for segment_name in final_path: + seq = segment_dict[segment_name.strip('+').strip('-')] # Remove orientation symbols for lookup + # Check if the segment should be reversed + if segment_name.endswith('-'): + seq = str(Seq(seq).reverse_complement()) # Reverse complement the sequence if needed + + full_sequence += seq # Concatenate sequence + + # Create a single SeqRecord with all concatenated sequences + # Use the base name of the input file as the ID for the SeqRecord + input_base_name = os.path.splitext(os.path.basename(input_file))[0] + record = SeqRecord(Seq(full_sequence), id=input_base_name, description="All contigs concatenated based on the final path") + + # Write the single record to the output file + with open(output_file, 'w') as f: + SeqIO.write(record, f, "fasta") + +def write_all_contigs(segments, output_file): + """Write all contigs to a FASTA file without considering orientation.""" + with open(output_file, 'w') as f: + for seg in segments: + record = SeqRecord(Seq(seg.sequence), id=seg.name, description="") + SeqIO.write(record, f, "fasta") + +def write_log_and_exit(log, status): + # print(log) + log_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".log") + summary_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".summary") + + headers = ['sample', 'status', 'contig_order', 'contig_orientation', 'contig_order_orientation_copy_number', 'assembly_length', 'itr_length'] + data = [] + if '00' in log: + data.append(log['00']['input']['sample_name']) + data.append(status) + if '03' in log: + data.append(",".join(str(i) for i in log['03']['output']['final_path'])) + if '06' in log: + data.append(",".join(str(i) for i in log['06']['output']['final_orientation'])) + if '07' in log: + data.append(str(log['07']['output']['final_order_orientation_copy_number'])) + data.append(str(log['07']['output']['final_sequence_length'])) + if '09' in log: + data.append(str(log['09']['output']['final_itr_length'])) + + with open(summary_file, 'w') as f: + f.write('\t'.join(headers) + '\n') + f.write('\t'.join(data) + '\n') + + with open(log_file, 'w') as f: + json_object = json.dumps(log, indent=4) + f.write(json_object) + sys.exit(0) + +def process_graph(gfa_graph, output_dir, input_file, reference): + """Process the graph and write output based on the results.""" + log = {} + input_with_ext = os.path.basename(input_file) + input_base, _ = os.path.splitext(input_with_ext) + sample_name = input_base + + # Initial log entry + log['00'] = {'step_name': "initialization", + 'step_description': "Initialize the logging process", + 'status': "PASS", + 'input': { + 'gfa': input_file, + 'sample_name': sample_name, + 'output_dir': output_dir + }, + 'output': {}} + + # Always write all contigs to a FASTA file at the start + write_all_contigs(gfa_graph.segments, os.path.join(output_dir, input_base + ".all_contigs.fasta")) + + # Start processing the graph + filtered_edges, status = remove_self_loops(gfa_graph.edges) + log['01'] = {'step_name': "remove_self_loops", + 'step_description': "Remove self-loops from link information", + 'status': status, + 'output': {'filtered_edges': [str(edge) for edge in filtered_edges]}} + if status != "PASS": + write_log_and_exit(log, status) + + filtered_graph, status = create_filtered_graph(filtered_edges) + log['02'] = {'step_name': "create_filtered_graph", + 'step_description': "Create a filtered NetworkX graph from links and remove disconnected nodes", + 'status': status, + 'output': {'filtered_graph': str(filtered_graph)}} + if status != "PASS": + write_log_and_exit(log, status) + + filtered_segments = filter_segments_by_graph(gfa_graph.segments, filtered_graph) + final_path, status = get_final_path(gfa_graph, filtered_graph, filtered_segments) + log['03'] = {'step_name': "get_final_path", + 'step_description': "Find all longest paths in the graph starting from any ITR", + 'status': status, + 'output': {'final_path': final_path}} + if not status.startswith("PASS"): + write_log_and_exit(log, status) + + # Find the longest contig + longest_contig, status, longest_contig_file = find_longest_contig(filtered_segments, output_dir) + log['04'] = {'step_name': "find_longest_contig", + 'step_description': "Find the longest contig based on length", + 'status': status, + 'output': {'longest_contig': longest_contig}} + if status != "PASS": + write_log_and_exit(log, status) + + # Create blast database directory + blast_db_dir = os.path.join(output_dir, 'blast_db') + os.makedirs(blast_db_dir, exist_ok=True) # Create if it doesn't exist + # Determine the orientation of the longest contig + longest_orient, status = orient_longest_contig(longest_contig_file, reference, blast_db_dir) + log['05'] = {'step_name': "orient_longest_contig", + 'step_description': "Determine the orientation of the longest contig", + 'status': status, + 'output': {'longest_orient': longest_orient}} + if status != "PASS": + write_log_and_exit(log, status) + + # Get the final orientation for all contigs + contig_orientation, status = get_final_orientation(final_path, filtered_edges, longest_contig, longest_orient) + log['06'] = {'step_name': "get_final_orientation", + 'step_description': "Get the final orientation for all contigs", + 'status': status, + 'output': {'final_orientation': contig_orientation}} + if status != "PASS": + write_log_and_exit(log, status) + + # Re-orient the final path based on determined orientation + oriented_final_path = [contig + ('-' if contig_orientation[i] == -1 else '+') for i, contig in enumerate(final_path)] + + # Get the final sequence and order + final_sequence, seq_len, final_order_orientation_copy_number, status = get_final_sequence(oriented_final_path, contig_orientation, filtered_segments) + log['07'] = {'step_name': "get_final_sequence", + 'step_description': "Get the final sequence and order", + 'status': status, + 'output': {'final_sequence': str(final_sequence), # Convert Seq object to string + 'final_sequence_length': seq_len, + 'final_order_orientation_copy_number': final_order_orientation_copy_number}} + if status != "PASS": + write_log_and_exit(log, status) + + # Write the oriented contigs to a FASTA file + asm_name = input_base + ".assembly_asm.fasta" + record = SeqRecord(Seq(final_sequence), id=input_base, description=final_order_orientation_copy_number) + with open(os.path.join(output_dir, asm_name), 'w') as f: + SeqIO.write(record, f, "fasta") + + log['08'] = {'step_name': "write_oriented_fasta", + 'step_description': "Write the oriented contigs to a FASTA file", + 'status': "PASS", + 'output': {'assembly_file': asm_name}} + + # Remove the blast_db directory + shutil.rmtree(blast_db_dir) # Remove the directory and its contents + + # Identify ITRs and their length + itrs, itr_length = identify_itr(gfa_graph, filtered_segments) + log['09'] = {'step_name': "identify_itr", + 'step_description': "Identify all Inverted Terminal Repeats (ITRs) based on depth criteria", + 'status': "PASS", + 'output': {'itrs': itrs, + 'final_itr_length': itr_length}} + + # Write the final log and summary + write_log_and_exit(log, "PASS") + +def main(arguments): + parser = argparse.ArgumentParser(description="GFA parser to construct assembly from Unicycler") + parser.add_argument('-i', type=str, required=True, help="GFA file from Unicycler") + parser.add_argument('-o', type=str, required=True, help="Output directory") + parser.add_argument('-r', type=str, required=True, help="Reference file for orientation") + args = parser.parse_args(arguments) + + gfa_file = args.i + output_dir = args.o + reference_file = args.r + + # clean up gfa tags + cleanedGfa = 'graph_cleaned.gfa' + clean_graph_tags(gfa_file, cleanedGfa) + + gfa_graph, status = read_gfa_file(cleanedGfa) + if status != "PASS": + return + + if gfa_graph is None: + print("Failed to read GFA file.") + return + + process_graph(gfa_graph, output_dir, gfa_file, reference_file) + +if __name__ == '__main__': + main(sys.argv[1:]) From 45b7d1742aeedda6a84643a52ddc8a23b22a1c9c Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Thu, 8 Aug 2024 14:47:16 -0400 Subject: [PATCH 04/42] removing bin/mpxv scripts to make them less mpox specific, cleaned up comments, added proper spacing, fixed author atribution --- bin/AssemblyGraph_gfaPy.py | 29 +- bin/mpxv-AssemblyGraph_gfaPy.py | 509 ------------------------------ bin/mpxv-AssemblyGraph_gfaPyv2.py | 487 ---------------------------- bin/mpxv-AssemblyGraph_gfaPyv3.py | 453 -------------------------- 4 files changed, 12 insertions(+), 1466 deletions(-) delete mode 100755 bin/mpxv-AssemblyGraph_gfaPy.py delete mode 100755 bin/mpxv-AssemblyGraph_gfaPyv2.py delete mode 100644 bin/mpxv-AssemblyGraph_gfaPyv3.py diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py index 1049c03..496f3a5 100644 --- a/bin/AssemblyGraph_gfaPy.py +++ b/bin/AssemblyGraph_gfaPy.py @@ -1,15 +1,7 @@ #!/usr/bin/env python3 -### Written by S.Morrison, K. Knipe and Kyle O'Connell -### initial code : 20221018; refactor 20240730 - -''' -To Do: -- Need to add all the logging and summary file like shatavia had -- need to add ITR length to that script -- Need to add total seq length - -''' +### Written by S.Morrison, K. Knipe 20221018 +### Refactored by Kyle O'Connell with help from GPT 4o and Gemini 1.5 Pro 20240730 import gzip import argparse @@ -38,11 +30,9 @@ def clean_graph_tags(input_file, output_file): cleaned_line = cleaned_line.rstrip('\t') # Write the cleaned line to the output file, ensuring the newline character is preserved outfile.write(cleaned_line) - print('cleaned graph tags') def read_gfa_file(gfa_path): """Read GFA file into gfapy python structure.""" - print('reading cleaned gfa') try: gfa_graph = gfapy.Gfa.from_file(gfa_path) # print(gfa_graph.edges) @@ -50,12 +40,13 @@ def read_gfa_file(gfa_path): return None, "WARNING: GFA file only contains segment lines" return gfa_graph, "PASS" except Exception as e: + return None, f"WARNING: Issue with GFA file : {str(e)}" def remove_self_loops(links): """Remove self-loops from link information.""" pruned_links = [link for link in links if link.from_name != link.to_name] - # print(pruned_links) + return pruned_links, "PASS" def identify_low_coverage_contigs(segments): @@ -65,12 +56,13 @@ def identify_low_coverage_contigs(segments): dp_value = seg.get('dp') # This will return None if 'dp' is not a field in the segment if dp_value is not None and float(dp_value) < 0.5: low_cov.append(seg.get('name')) - #$print(low_cov) + return low_cov, "PASS" def filter_links_by_coverage(low_cov, links): """Filter out links involving low coverage contigs.""" filtered_links = [link for link in links if link.from_name not in low_cov and link.to_name not in low_cov] + return filtered_links, "PASS" def find_longest_contig(segments, output_dir): @@ -82,12 +74,14 @@ def find_longest_contig(segments, output_dir): seqName = longest_contig.get('name') gfaContigs.write(">" + seqName + "\n") gfaContigs.write(longest_contig.get('sequence') + "\n") + return longest_contig.get('name'), "PASS", longest_contig_file def filter_segments_by_graph(segments, graph): """Filter segments to include only those that are part of the graph.""" graph_nodes = set(graph.nodes()) # Get all nodes in the graph as a set for quick lookup filtered_segments = [seg for seg in segments if seg.get('name') in graph_nodes] + return filtered_segments def create_filtered_graph(links): @@ -102,6 +96,7 @@ def create_filtered_graph(links): if not nx.is_connected(graph): return None, "WARNING: Graph is not connected" + return graph, "PASS" def identify_itr( gfa_graph, segments ): @@ -135,7 +130,6 @@ def get_final_path(gfa_graph, filtered_graph, segments): for contig in filtered_graph.nodes(): if contig != itr: for path in nx.all_simple_paths(filtered_graph, source=itr, target=contig): - # print(path) path_length = len(path) if path_length > max_length: longest_paths = [path] # Start a new list with the new longest path @@ -241,13 +235,13 @@ def get_final_sequence(contig_order, contig_orientation, segments): order_orientation_copy_number = '%sx%s' % (order_orientation_copy_number, round(segment_info[segment_name]['coverage'])) final_sequence = final_sequence + sequence final_order_orientation_copy_number.append(order_orientation_copy_number) - check = "PASS" # are all segments in final_sequence? cleaned_contig_order = [contig.strip('+-') for contig in contig_order] for segment in segment_info: if (segment_info[segment]['coverage'] > 0.5) and (segment not in cleaned_contig_order): check = 'WARNING: missing segments' + return final_sequence, len(final_sequence), " ".join(final_order_orientation_copy_number), check def write_oriented_fasta(final_path, segments, output_file, input_file): @@ -309,7 +303,7 @@ def write_log_and_exit(log, status): sys.exit(0) def process_graph(gfa_graph, output_dir, input_file, reference): - """Process the graph and write output based on the results.""" + """Process the graph and write output.""" log = {} input_with_ext = os.path.basename(input_file) input_base, _ = os.path.splitext(input_with_ext) @@ -367,6 +361,7 @@ def process_graph(gfa_graph, output_dir, input_file, reference): # Create blast database directory blast_db_dir = os.path.join(output_dir, 'blast_db') os.makedirs(blast_db_dir, exist_ok=True) # Create if it doesn't exist + # Determine the orientation of the longest contig longest_orient, status = orient_longest_contig(longest_contig_file, reference, blast_db_dir) log['05'] = {'step_name': "orient_longest_contig", diff --git a/bin/mpxv-AssemblyGraph_gfaPy.py b/bin/mpxv-AssemblyGraph_gfaPy.py deleted file mode 100755 index 0e99988..0000000 --- a/bin/mpxv-AssemblyGraph_gfaPy.py +++ /dev/null @@ -1,509 +0,0 @@ -#!/usr/bin/env python3 - -### Written by S.Morrison and K. Knipe -### Date: 20221018 - -import gzip, argparse,os,sys,fnmatch,subprocess,re -import os.path -from datetime import datetime -import linecache -import gfapy -import networkx as nx -from Bio.Seq import Seq -from Bio.SeqRecord import SeqRecord -import functools -import operator -from Bio import SeqIO -import pprint -import json - -def clean_graph_tags(input_file, output_file): - # Define the regex pattern to match the LB and CL tags - tag_pattern = re.compile(r'\tLB:z:[^\t]+\tCL:z:[^\t]+') - - with open(input_file, 'r') as infile, open(output_file, 'w') as outfile: - for line in infile: - # Remove the tags from the line - cleaned_line = re.sub(tag_pattern, '\n', line) - # Remove trailing tabs - cleaned_line = cleaned_line.rstrip('\t') - # Write the cleaned line to the output file, ensuring the newline character is preserved - outfile.write(cleaned_line) - -def readGFA(gfa): - ### Read GFA file into gfapy python structure - #gfaGraph = gfapy.Gfa.from_file(gfa) - try: - gfaGraph = gfapy.Gfa.from_file(gfa) - check = "PASS" - if(len(gfaGraph.edges)) ==0: - check = "WARNING: gfa file only contains segment lines" - gfaGraph = "WARNING: gfa file only contains segment lines" - except: - check = "WARNING: Issue with GFA file : No GFA processing" - gfaGraph = "WARNING: Issue with GFA file : No GFA processing" - return gfaGraph,check - - -def remove_loops(lnkInfo): - ### Identify contigs with self hits, remove those links - selfHits = [] - prunedSelfs = [] - for i in lnkInfo: - if i.from_name == i.to_name: - selfHits.append(i) - for j in lnkInfo: - if not j in selfHits: - prunedSelfs.append(j) - - check = "PASS" - return prunedSelfs,check - -def id_low_cov_contigs(segInfo): - ### Identify contigs below 0.5x coverage - lowCov = [] - for i in segInfo: - line = i.tagnames - for j in line: - if j == 'dp': - if i.get(j) < 0.5: - name = i.get('name') - lowCov.append(name) - check= "PASS" - return lowCov,check - -def remove_low_cov_contigs_from_edges(lowCov,selfHits): - ### Remove low coverage hits from links (after self hits) - fLinks = [] - #print(selfHits) - if len(lowCov) ==0: - fLinks = selfHits - check = "PASS" - elif len(lowCov) ==1: - for m in lowCov: - lowID = m - for n in range(0,len(selfHits)): - if not((lowID == selfHits[n].from_name) or (lowID == selfHits[n].to_name)): - fLinks.append(selfHits[n]) - check="PASS" - else: - check="[Warning :: There are 2 or more contigs with coverage less than 0.5 - manual review required]" - return fLinks,check - -def find_longest_contig(seqs, gfa): - ### Find the longest contig sequence and its name - lgContig ={} - - for j in seqs: - leng = j.tagnames - name = j.get('name') - for m in leng: - if m == 'LN': - seqLen = j.get(m) - lgContig[name]=seqLen - lgSeq = max(lgContig,key=lgContig.get) - - #write longest contig to file - for j in seqs: - if lgSeq == j.get('name'): - SeqIO.write(SeqRecord(Seq(j.get('sequence')),lgSeq), gfa + "_longest.fasta", "fasta") - - #write all contigs to a file - gfaContigs = open(gfa + "_all_contigs.fasta", "w") - for n in seqs: - seqName = n.get('name') - gfaContigs.write(">"+seqName+"\n") - gfaContigs.write(n.get('sequence')+"\n") - gfaContigs.close() - check="PASS" - return lgSeq,check - -def create_filtered_graph(lnks): - ### Create NetworkX Graph - tGraph = nx.MultiGraph() - edgeCorrect =[] - for m in lnks: - tGraph.add_edge(m.from_name,m.to_name) - check="PASS" - if not nx.is_connected(tGraph): - check="WARNING :: This assembly graph does not appear to be connected -- there may be an assembly issue!" - else: - check = "PASS" - return tGraph,check - -def get_final_path( graph, longest_contig ): - ### This is the function to assess if there are multiple paths - ### duplicate pairs of contig links with different orientations - contigs = [] - itr_candidates = [] - all_simple_paths = {} - lengths = {} - longest_path = [] - final_path = [] - - ### Identify ITR candidates based on depth - print(graph.nodes()) - ### Check to see if longest contig in edge list to connect contig seqs, dups not removed - edgeList = list(graph.edges) - edgeCheck =[] - for i in edgeList: - edgeCheck.append(i[2]) - goEdge = list(set(edgeCheck)) - if not len(goEdge) == 1: - status = "WARNING: Multiple links connect to 2 or more contigs in assembly" - return final_path, status - else: - out = [item for t in edgeList for item in t] - - if not longest_contig in out: - status = "WARNING: Longest contig not in links to connect to other contigs in assembly " - return final_path, status - - for edge in graph.edges: - if edge[0] not in contigs: - contigs.append(edge[0]) - if edge[1] not in contigs: - contigs.append(edge[1]) - for contig in contigs: - if contig != longest_contig: - print(contig) - for sp in nx.all_simple_paths( graph, contig, longest_contig ): - print(sp) - if contig not in all_simple_paths: - all_simple_paths[contig] = [] - all_simple_paths[contig].append( sp ) - if len(sp) > len(longest_path): - longest_path = sp - if len(sp) not in lengths: - lengths[len(sp)] = 0 - lengths[len(sp)] = lengths[len(sp)] + 1 - #print(longest_path) - ####REVERSE THE ITR length path instead of the first path of the all paths section###### - #warning if there is more than one longest path - #print(lengths[len(longest_path)]) - if lengths[len(longest_path)] > 1: - status = "WARNING: >1 longest path" - return final_path, status - - # make sure there are 2 paths between the longest contig and the last contig in the longest - sp_l = all_simple_paths[longest_path[-1]] - if len(sp_l) < 2: - status = "WARNING: only 1 path between longest contig and the last contig in the longest path" - return final_path, status - elif len(sp_l) == 2: - - path_a = sp_l[0] - path_b = sp_l[1] - - if len(path_a) < len(path_b): - path_a.reverse() - final_path = path_a + path_b[1:] - elif len(path_b) < len(path_a): - path_b.reverse() - final_path = path_b + path_a[1:] - print(final_path) - status = "PASS" - return final_path, status - - elif len(sp_l) > 2: - status = "WARNING: >2 paths between longest contig and the last contig in the longest path" - return final_path, status - -def orient_longest_contig(query,reference): - blastResults = query+"_blast.out" - subprocess.call(["makeblastdb","-in",query,"-out",query+"_DB","-dbtype","nucl"],shell=False) - subprocess.call(["blastn","-query", reference,"-db", query+"_DB","-evalue",".00001","-outfmt","6 qseqid sseqid pident length qcovs sstart send sseq mismatch gapopen qlen slen bitscore","-out",blastResults]) - check = "PASS" - with open(blastResults,'r') as e: - for line in e: - f13LInfo = line.split('\t') - sstart = int(f13LInfo[5]) - send = int(f13LInfo[6]) - orientation = 1 if sstart < send else int(-1) - - #TODO - cleanup blast files - - return orientation, check - -def get_final_orientation(final_path, lnks, longest_contig, longest_orient): - contig_orientation = [0] * len(final_path) - - for i in range(final_path.index(longest_contig), len(final_path)): - if i == final_path.index(longest_contig): - contig_orientation[i] = longest_orient - else: - flag=0 - for link in lnks: - if (link.from_name == final_path[i-1] and link.to_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) - contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient - flag=1 - if flag == 0: - for link in lnks: - if (link.to_name == final_path[i-1] and link.from_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) - contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient - flag=1 - - for i in range(final_path.index(longest_contig)-1, -1 ,-1): - flag=0 - for link in lnks: - if (link.to_name == final_path[i+1] and link.from_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) - contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient - flag=1 - if flag == 0: - for link in lnks: - if (link.from_name == final_path[i+1] and link.to_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) - contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient - flag=1 - check="PASS" - return contig_orientation, check - -def get_final_sequence(contig_order, contig_orientation, segments): - segment_info = {} - for segment in segments: - segment_count = contig_order.count(segment.get('name')) - coverage = float(segment.get('dp')) if segment_count == 0 else float(segment.get('dp'))/contig_order.count(segment.get('name')) - segment_info[segment.get('name')] = { 'coverage' : coverage, - 'sequence' : Seq(segment.get('sequence')), - 'sequence_rc' : Seq(segment.get('sequence')).reverse_complement() - } - final_sequence = '' - final_order_orientation_copy_number = [] - for i in range(len(contig_order)): - sequence = segment_info[contig_order[i]]['sequence'] * round(segment_info[contig_order[i]]['coverage']) - if contig_orientation[i] == -1: - sequence = segment_info[contig_order[i]]['sequence_rc'] * round(segment_info[contig_order[i]]['coverage']) - orientation = '+' if contig_orientation[i] == 1 else '-' - order_orientation_copy_number = '%s%s' % (orientation, contig_order[i]) - if round(segment_info[contig_order[i]]['coverage']) > 1: - order_orientation_copy_number = '%sx%s' % (order_orientation_copy_number, round(segment_info[contig_order[i]]['coverage'])) - final_sequence = final_sequence + sequence - final_order_orientation_copy_number.append(order_orientation_copy_number) - - check = "PASS" - # are all segments in final_sequence? - for segment in segment_info: - if (segment_info[segment]['coverage'] > 0.5) and (segment not in contig_order): - check = 'WARNING: missing segments' - return final_sequence, len(final_sequence), " ".join(final_order_orientation_copy_number), check - -def get_itr_length(lgContig,contig_order,segments): - final_itr_length = 0 - itr=[] - for i in contig_order: - if not i == lgContig: - itr.append(i) - elif i == lgContig: - break - for segment in segments: - segmentName = segment.get('name') - segmentCov = segment.get('coverage') - if segmentName in itr: - segment_coverage = segment.get('dp') - half_coverage = segment_coverage /2 - segment_sequence_length = len(segment.get('sequence')) - total_itr_segment_length = segment_sequence_length * round(half_coverage) - final_itr_length = final_itr_length + total_itr_segment_length - check = "PASS" - return final_itr_length , check - -def write_log_and_exit( log, status ): - - log_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".log") - summary_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".summary") - - headers = ['sample', 'status', 'contig_order', 'contig_orientation', 'contig_order_orientation_copy_number', 'assembly_length', 'itr_length'] - data = [] - if '00' in log: - data.append( log['00']['input']['sample_name'] ) - data.append( status ) - if '06' in log: - data.append( ",".join( str(i) for i in log['06']['output']['final_path']) ) - if '08' in log: - data.append( ",".join( str(i) for i in log['08']['output']['final_orientation'] ) ) - if '09' in log: - data.append( str(log['09']['output']['final_order_orientation_copy_number']) ) - data.append( str(log['09']['output']['final_sequence_length']) ) - if '10' in log: - data.append( str(log['10']['output']['final_itr_length'])) - - with open(summary_file, 'w') as f: - f.write( '\t'.join( headers ) + '\n' ) - f.write( '\t'.join(data) + '\n' ) - - with open(log_file, 'w') as f: - json_object = json.dumps(log, indent = 4) - f.write(json_object) - -def main(arguments): - parser = argparse.ArgumentParser(description="GFA parser to construct assembly from Unicycler", epilog="______") - parser.add_argument('-i',type=str,required=True,help="GFA file from Unicycler") - parser.add_argument('-r',type=str,required=True,help="Monkeypox genome sequence - single line fasta") - parser.add_argument('-o',type=str,required=True,help="Output directory") - - args = parser.parse_args() - gfaFile = args.i - refSeq = args.r - out_dir = args.o - - log = {} - errors = [] - logFile = [] - logFile.append(gfaFile) - - # clean up gfa tags - cleanedGfa = 'graph_cleaned.gfa' - clean_graph_tags(gfaFile, cleanedGfa) - - # read gfa file into graph structure - original_graph, status = readGFA(cleanedGfa) - log['00'] = {'step_name' : "read_gfa", - 'step_description' : "read gfa file into graph structure", - 'status' : status, - 'input' : { - 'gfa' : gfaFile, - 'sample_name' : os.path.splitext(os.path.basename(gfaFile))[0], - 'output_dir' : out_dir - }, - 'output' : { - 'original_graph' : str(original_graph), - } - } - if status != "PASS": - write_log_and_exit(log, status) - - # filter edges that are loops (these represent repeats, we'll deal with them later) - if type(original_graph) == str: - sys.exit(0) - else: - filtered_edges, status = remove_loops( original_graph.edges ) - log['01'] = {'step_name' : "remove_loops", - 'step_description' : "filter edges that are loops (these represent repeats, we'll deal with them later)", - 'status' : status, - 'output' : { - 'filtered_edges' : str(filtered_edges) - } - } - print(filtered_edges) - if status != "PASS": - write_log_and_exit(log, status) - - # identify low coverage contigs - low_cov_contigs, status = id_low_cov_contigs( original_graph.segments ) - log['02'] = {'step_name' : "id_low_cov_contigs", - 'step_description' : "identify low coverage contigs", - 'status' : status, - 'output' : { - 'low_cov_contigs' : low_cov_contigs - } - } - if status != "PASS": - write_log_and_exit(log, status) - - # remove low coverage contigs from edges - filtered_edges, status = remove_low_cov_contigs_from_edges( low_cov_contigs, filtered_edges ) - log['03'] = {'step_name' : "remove_low_cov_contigs_from_edges", - 'step_description' : "remove low coverage contigs from edges", - 'status' : status, - 'output' : { - 'filtered_edges' : str(filtered_edges) - } - } - if status != "PASS": - write_log_and_exit(log, status) - sys.exit(0) - - # find the longest contig - longest_contig, status = find_longest_contig( original_graph.segments, log['00']['input']['sample_name'] ) - log['04'] = {'step_name' : "find_longest_contig", - 'step_description' : "find the longest contig", - 'status' : status, - 'output' : { - 'longest_contig' : longest_contig - } - } - if status != "PASS": - write_log_and_exit(log, status) - - # create graph from filtered edges - filtered_graph, status = create_filtered_graph(filtered_edges) - log['05'] = {'step_name' : "create_filtered_graph", - 'step_description' : "create graph from filtered edges", - 'status' : status, - 'output' : { - 'filtered_graph' : str(filtered_graph) - } - } - if status != "PASS": - write_log_and_exit(log) - sys.exit(0) - - final_path, status = get_final_path( filtered_graph, longest_contig ) - log['06'] = {'step_name' : "get_final_path", - 'step_description' : "get final path from filtered graph using longest contig to longest simple path", - 'status' : status, - 'output' : { - 'final_path' : final_path - } - } - if status != "PASS": - write_log_and_exit(log, status) - sys.exit(0) - - # orient longest contig with F13L - longest_orientation, status = orient_longest_contig( log['00']['input']['sample_name'] + "_longest.fasta" , refSeq ) - log['07'] = {'step_name' : "orient_longest_contig", - 'step_description' : "get orientation of longest contig given F13L gene", - 'status' : status, - 'output' : { - 'longest_orientation' : longest_orientation - } - } - if status != "PASS": - write_log_and_exit(log) - - final_orientation, status = get_final_orientation(final_path, filtered_edges, longest_contig, longest_orientation) - log['08'] = {'step_name' : "get_final_orientation", - 'step_description' : "get orientation of contigs starting at the longest and traversing the path in either direction", - 'status' : status, - 'output' : { - 'final_orientation' : final_orientation - } - } - if status != "PASS": - write_log_and_exit(log, status) - - final_sequence, final_sequence_length, final_order_orientation_copy_number, status = get_final_sequence( final_path , final_orientation , original_graph.segments ) - log['09'] = {'step_name' : "get_final_sequence", - 'step_description' : "get_final_sequence", - 'status' : status, - 'output' : { - 'final_order_orientation_copy_number' : final_order_orientation_copy_number, - 'final_sequence' : str(final_sequence), - 'final_sequence_length' : final_sequence_length - } - } - if status != "PASS": - write_log_and_exit(log, status) - - SeqIO.write(SeqRecord(Seq(final_sequence),gfaFile), log['00']['input']['sample_name'] + "_asm.fasta", "fasta") - - final_itr_length, status = get_itr_length( longest_contig ,final_path , original_graph.segments ) - log['10'] = {'step_name' : "get_itr_length", - 'step_description' : "get_itr_length", - 'status' : status, - 'output' : { - 'final_itr_length' : final_itr_length - } - } - write_log_and_exit(log,status) - -if __name__=='__main__': - main(sys.argv[1:]) \ No newline at end of file diff --git a/bin/mpxv-AssemblyGraph_gfaPyv2.py b/bin/mpxv-AssemblyGraph_gfaPyv2.py deleted file mode 100755 index 775072f..0000000 --- a/bin/mpxv-AssemblyGraph_gfaPyv2.py +++ /dev/null @@ -1,487 +0,0 @@ -#!/usr/bin/env python3 - -### Written by S.Morrison and K. Knipe -### Date: 20221018 - -import gzip, argparse,os,sys,fnmatch,subprocess,re -import os.path -from datetime import datetime -import linecache -import gfapy -import networkx as nx -from Bio.Seq import Seq -from Bio.SeqRecord import SeqRecord -import functools -import operator -from Bio import SeqIO -import pprint -import json - -def readGFA(gfa): - ### Read GFA file into gfapy python structure - gfaGraph = gfapy.Gfa.from_file(gfa) - #print(gfaGraph.edges) - #print(gfaGraph) - if(len(gfaGraph.edges)) == 0: - check = "WARNING: gfa file only contains segment lines" - gfaGraph = "WARNING: gfa file only contains segment lines" - else: - check = "PASS" - #check = "WARNING: Issue with GFA file : No GFA processing" - # gfaGraph = "WARNING: Issue with GFA file : No GFA processing" - return gfaGraph,check - - -def remove_loops(lnkInfo): - ### Identify contigs with self hits, remove those links - selfHits = [] - prunedSelfs = [] - for i in lnkInfo: - if i.from_name == i.to_name: - selfHits.append(i) - - for j in lnkInfo: - if not j in selfHits: - prunedSelfs.append(j) - - check = "PASS" - return prunedSelfs,check - -def id_low_cov_contigs(segInfo): - ### Identify contigs below 0.5x coverage - lowCov = [] - for i in segInfo: - line = i.tagnames - for j in line: - if j == 'dp': - if i.get(j) < 0.5: - name = i.get('name') - lowCov.append(name) - check= "PASS" - return lowCov,check - -def remove_low_cov_contigs_from_edges(lowCov,selfHits): - ### Remove low coverage hits from links (after self hits) - fLinks = [] - - if len(lowCov) ==0: - fLinks = selfHits - check = "PASS" - elif len(lowCov) ==1: - for m in lowCov: - lowID = m - for n in range(0,len(selfHits)): - if not((lowID == selfHits[n].from_name) or (lowID == selfHits[n].to_name)): - fLinks.append(selfHits[n]) - check="PASS" - else: - check="[Warning :: There are 2 or more contigs with coverage less than 0.5 - manual review required]" - return fLinks,check - -def find_longest_contig(seqs, gfa): - ### Find the longest contig sequence and its name - lgContig ={} - - for j in seqs: - leng = j.tagnames - name = j.get('name') - for m in leng: - if m == 'LN': - seqLen = j.get(m) - lgContig[name]=seqLen - lgSeq = max(lgContig,key=lgContig.get) - - - #write longest contig to file - for j in seqs: - if lgSeq == j.get('name'): - SeqIO.write(SeqRecord(Seq(j.get('sequence')),lgSeq), gfa + "_longest.fasta", "fasta") - - #write all contigs to a file - gfaContigs = open(gfa + "_all_contigs.fasta", "w") - for n in seqs: - seqName = n.get('name') - gfaContigs.write(">"+seqName+"\n") - gfaContigs.write(n.get('sequence')+"\n") - gfaContigs.close() - check="PASS" - return lgSeq,check - -def create_filtered_graph(lnks): - ### Create NetworkX Graph - tGraph = nx.MultiGraph() - edgeCorrect =[] - for m in lnks: - tGraph.add_edge(m.from_name,m.to_name) - check="PASS" - if not nx.is_connected(tGraph): - check="WARNING :: This assembly graph does not appear to be connected -- there may be an assembly issue!" - else: - check = "PASS" - return tGraph,check - -def get_final_path( graph, longest_contig ): - ### This is the function to assess if there are multiple paths - ### duplicate pairs of contig links with different orientations - contigs = [] - all_simple_paths = {} - lengths = {} - longest_path = [] - final_path = [] - ### Check to see if longest contig in edge list to connect contig seqs, dups not removed - edgeList = list(graph.edges) - edgeCheck =[] - for i in edgeList: - edgeCheck.append(i[2]) - goEdge = list(set(edgeCheck)) - if not len(goEdge) == 1: - status = "WARNING: Multiple links connect to 2 or more contigs in assembly" - return final_path, status - else: - out = [item for t in edgeList for item in t] - - if not longest_contig in out: - status = "WARNING: Longest contig not in links to connect to other contigs in assembly " - return final_path, status - - for edge in graph.edges: - if edge[0] not in contigs: - contigs.append(edge[0]) - if edge[1] not in contigs: - contigs.append(edge[1]) - for contig in contigs: - if contig != longest_contig: - for sp in nx.all_simple_paths( graph, longest_contig, contig ): - #print(sp) - if contig not in all_simple_paths: - all_simple_paths[contig] = [] - all_simple_paths[contig].append( sp ) - if len(sp) > len(longest_path): - longest_path = sp - if len(sp) not in lengths: - lengths[len(sp)] = 0 - lengths[len(sp)] = lengths[len(sp)] + 1 - ####REVERSE THE ITR length path instead of the first path of the all paths section###### - #warning if there is more than one longest - if lengths[len(longest_path)] > 1: - status = "WARNING: >1 longest path" - return final_path, status - - # make sure there are 2 paths between the longest contig and the last contig in the longest path - sp_l = all_simple_paths[longest_path[-1]] - if len(sp_l) < 2: - status = "WARNING: only 1 path between longest contig and the last contig in the longest path" - return final_path, status - elif len(sp_l) == 2: - - path_a = sp_l[0] - path_b = sp_l[1] - - if len(path_a) < len(path_b): - path_a.reverse() - final_path = path_a + path_b[1:] - elif len(path_b) < len(path_a): - path_b.reverse() - final_path = path_b + path_a[1:] - status = "PASS" - return final_path, status - elif len(sp_l) > 2: - status = "WARNING: >2 paths between longest contig and the last contig in the longest path" - status="Pass" - return final_path, status - -def orient_longest_contig(query,reference): - blastResults = query+"_blast.out" - subprocess.call(["makeblastdb","-in",query,"-out",query+"_DB","-dbtype","nucl"],shell=False) - subprocess.call(["blastn","-query", reference,"-db", query+"_DB","-evalue",".00001","-outfmt","6 qseqid sseqid pident length qcovs sstart send sseq mismatch gapopen qlen slen bitscore","-out",blastResults]) - check = "PASS" - with open(blastResults,'r') as e: - for line in e: - f13LInfo = line.split('\t') - sstart = int(f13LInfo[5]) - send = int(f13LInfo[6]) - orientation = 1 if sstart < send else int(-1) - - #TODO - cleanup blast files - - return orientation, check - -def get_final_orientation(final_path, lnks, longest_contig, longest_orient): - contig_orientation = [0] * len(final_path) - - for i in range(final_path.index(longest_contig), len(final_path)): - if i == final_path.index(longest_contig): - contig_orientation[i] = longest_orient - else: - flag=0 - for link in lnks: - if (link.from_name == final_path[i-1] and link.to_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) - contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient - flag=1 - if flag == 0: - for link in lnks: - if (link.to_name == final_path[i-1] and link.from_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) - contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient - flag=1 - - for i in range(final_path.index(longest_contig)-1, -1 ,-1): - flag=0 - for link in lnks: - if (link.to_name == final_path[i+1] and link.from_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) - contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient - flag=1 - if flag == 0: - for link in lnks: - if (link.from_name == final_path[i+1] and link.to_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) - contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient - flag=1 - check="PASS" - return contig_orientation, check - -def get_final_sequence(contig_order, contig_orientation, segments): - segment_info = {} - for segment in segments: - segment_count = contig_order.count(segment.get('name')) - coverage = float(segment.get('dp')) if segment_count == 0 else float(segment.get('dp'))/contig_order.count(segment.get('name')) - segment_info[segment.get('name')] = { 'coverage' : coverage, - 'sequence' : Seq(segment.get('sequence')), - 'sequence_rc' : Seq(segment.get('sequence')).reverse_complement() - } - final_sequence = '' - final_order_orientation_copy_number = [] - for i in range(len(contig_order)): - sequence = segment_info[contig_order[i]]['sequence'] * round(segment_info[contig_order[i]]['coverage']) - if contig_orientation[i] == -1: - sequence = segment_info[contig_order[i]]['sequence_rc'] * round(segment_info[contig_order[i]]['coverage']) - orientation = '+' if contig_orientation[i] == 1 else '-' - order_orientation_copy_number = '%s%s' % (orientation, contig_order[i]) - if round(segment_info[contig_order[i]]['coverage']) > 1: - order_orientation_copy_number = '%sx%s' % (order_orientation_copy_number, round(segment_info[contig_order[i]]['coverage'])) - final_sequence = final_sequence + sequence - final_order_orientation_copy_number.append(order_orientation_copy_number) - - check = "PASS" - # are all segments in final_sequence? - for segment in segment_info: - if (segment_info[segment]['coverage'] > 0.5) and (segment not in contig_order): - check = 'WARNING: missing segments' - return final_sequence, len(final_sequence), " ".join(final_order_orientation_copy_number), check - -def get_itr_length(lgContig,contig_order,segments): - final_itr_length = 0 - itr=[] - for i in contig_order: - if not i == lgContig: - itr.append(i) - elif i == lgContig: - break - for segment in segments: - segmentName = segment.get('name') - segmentCov = segment.get('coverage') - if segmentName in itr: - segment_coverage = segment.get('dp') - half_coverage = segment_coverage /2 - segment_sequence_length = len(segment.get('sequence')) - total_itr_segment_length = segment_sequence_length * round(half_coverage) - final_itr_length = final_itr_length + total_itr_segment_length - check = "PASS" - return final_itr_length , check - -def write_log_and_exit( log, status ): - - log_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".log") - summary_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".summary") - - headers = ['sample', 'status', 'contig_order', 'contig_orientation', 'contig_order_orientation_copy_number', 'assembly_length', 'itr_length'] - data = [] - if '00' in log: - data.append( log['00']['input']['sample_name'] ) - data.append( status ) - if '06' in log: - data.append( ",".join( str(i) for i in log['06']['output']['final_path']) ) - if '08' in log: - data.append( ",".join( str(i) for i in log['08']['output']['final_orientation'] ) ) - if '09' in log: - data.append( str(log['09']['output']['final_order_orientation_copy_number']) ) - data.append( str(log['09']['output']['final_sequence_length']) ) - if '10' in log: - data.append( str(log['10']['output']['final_itr_length'])) - - with open(summary_file, 'w') as f: - f.write( '\t'.join( headers ) + '\n' ) - f.write( '\t'.join(data) + '\n' ) - - with open(log_file, 'w') as f: - json_object = json.dumps(log, indent = 4) - f.write(json_object) - -def main(arguments): - parser = argparse.ArgumentParser(description="GFA parser to construct assembly from Unicycler", epilog="______") - parser.add_argument('-i',type=str,required=True,help="GFA file from Unicycler") - parser.add_argument('-r',type=str,required=True,help="Monkeypox genome sequence - single line fasta") - parser.add_argument('-o',type=str,required=True,help="Output directory") - - args = parser.parse_args() - gfaFile = args.i - refSeq = args.r - out_dir = args.o - - log = {} - errors = [] - logFile = [] - logFile.append(gfaFile) - - # read gfa file into graph structure - original_graph, status = readGFA(gfaFile) - log['00'] = {'step_name' : "read_gfa", - 'step_description' : "read gfa file into graph structure", - 'status' : status, - 'input' : { - 'gfa' : gfaFile, - 'sample_name' : os.path.splitext(os.path.basename(gfaFile))[0], - 'output_dir' : out_dir - }, - 'output' : { - 'original_graph' : str(original_graph), - } - } - if status != "PASS": - write_log_and_exit(log, status) - - # filter edges that are loops (these represent repeats, we'll deal with them later) - if type(original_graph) == str: - - sys.exit(0) - else: - filtered_edges, status = remove_loops( original_graph.edges ) - log['01'] = {'step_name' : "remove_loops", - 'step_description' : "filter edges that are loops (these represent repeats, we'll deal with them later)", - 'status' : status, - 'output' : { - 'filtered_edges' : str(filtered_edges) - } - } - if status != "PASS": - write_log_and_exit(log, status) - - # identify low coverage contigs - low_cov_contigs, status = id_low_cov_contigs( original_graph.segments ) - log['02'] = {'step_name' : "id_low_cov_contigs", - 'step_description' : "identify low coverage contigs", - 'status' : status, - 'output' : { - 'low_cov_contigs' : low_cov_contigs - } - } - if status != "PASS": - write_log_and_exit(log, status) - - # remove low coverage contigs from edges - filtered_edges, status = remove_low_cov_contigs_from_edges( low_cov_contigs, filtered_edges ) - log['03'] = {'step_name' : "remove_low_cov_contigs_from_edges", - 'step_description' : "remove low coverage contigs from edges", - 'status' : status, - 'output' : { - 'filtered_edges' : str(filtered_edges) - } - } - if status != "PASS": - write_log_and_exit(log, status) - sys.exit(0) - - # find the longest contig - longest_contig, status = find_longest_contig( original_graph.segments, log['00']['input']['sample_name'] ) - log['04'] = {'step_name' : "find_longest_contig", - 'step_description' : "find the longest contig", - 'status' : status, - 'output' : { - 'longest_contig' : longest_contig - } - } - if status != "PASS": - write_log_and_exit(log, status) - - # create graph from filtered edges - filtered_graph, status = create_filtered_graph(filtered_edges) - log['05'] = {'step_name' : "create_filtered_graph", - 'step_description' : "create graph from filtered edges", - 'status' : status, - 'output' : { - 'filtered_graph' : str(filtered_graph) - } - } - if status != "PASS": - write_log_and_exit(log) - sys.exit(0) - - final_path, status = get_final_path( filtered_graph, longest_contig ) - log['06'] = {'step_name' : "get_final_path", - 'step_description' : "get final path from filtered graph using longest contig to longest simple path", - 'status' : status, - 'output' : { - 'final_path' : final_path - } - } - if status != "PASS": - write_log_and_exit(log, status) - sys.exit(0) - - # orient longest contig with F13L - longest_orientation, status = orient_longest_contig( log['00']['input']['sample_name'] + "_longest.fasta" , refSeq ) - log['07'] = {'step_name' : "orient_longest_contig", - 'step_description' : "get orientation of longest contig given F13L gene", - 'status' : status, - 'output' : { - 'longest_orientation' : longest_orientation - } - } - if status != "PASS": - write_log_and_exit(log) - - final_orientation, status = get_final_orientation(final_path, filtered_edges, longest_contig, longest_orientation) - log['08'] = {'step_name' : "get_final_orientation", - 'step_description' : "get orientation of contigs starting at the longest and traversing the path in either direction", - 'status' : status, - 'output' : { - 'final_orientation' : final_orientation - } - } - if status != "PASS": - write_log_and_exit(log, status) - - final_sequence, final_sequence_length, final_order_orientation_copy_number, status = get_final_sequence( final_path , final_orientation , original_graph.segments ) - log['09'] = {'step_name' : "get_final_sequence", - 'step_description' : "get_final_sequence", - 'status' : status, - 'output' : { - 'final_order_orientation_copy_number' : final_order_orientation_copy_number, - 'final_sequence' : str(final_sequence), - 'final_sequence_length' : final_sequence_length - } - } - if status != "PASS": - write_log_and_exit(log, status) - - SeqIO.write(SeqRecord(Seq(final_sequence),gfaFile), log['00']['input']['sample_name'] + "_asm.fasta", "fasta") - - final_itr_length, status = get_itr_length( longest_contig ,final_path , original_graph.segments ) - log['10'] = {'step_name' : "get_itr_length", - 'step_description' : "get_itr_length", - 'status' : status, - 'output' : { - 'final_itr_length' : final_itr_length - } - } - - write_log_and_exit(log,status) - -if __name__=='__main__': - main(sys.argv[1:]) diff --git a/bin/mpxv-AssemblyGraph_gfaPyv3.py b/bin/mpxv-AssemblyGraph_gfaPyv3.py deleted file mode 100644 index 1049c03..0000000 --- a/bin/mpxv-AssemblyGraph_gfaPyv3.py +++ /dev/null @@ -1,453 +0,0 @@ -#!/usr/bin/env python3 - -### Written by S.Morrison, K. Knipe and Kyle O'Connell -### initial code : 20221018; refactor 20240730 - -''' -To Do: -- Need to add all the logging and summary file like shatavia had -- need to add ITR length to that script -- Need to add total seq length - -''' - -import gzip -import argparse -import os -import sys -import fnmatch -import subprocess -import re -import gfapy -import networkx as nx -from Bio.Seq import Seq -from Bio.SeqRecord import SeqRecord -from Bio import SeqIO -import json -import shutil - -def clean_graph_tags(input_file, output_file): - # Define the regex pattern to match the LB and CL tags - tag_pattern = re.compile(r'\tLB:z:[^\t]+\tCL:z:[^\t]+') - - with open(input_file, 'r') as infile, open(output_file, 'w') as outfile: - for line in infile: - # Remove the tags from the line - cleaned_line = re.sub(tag_pattern, '\n', line) - # Remove trailing tabs - cleaned_line = cleaned_line.rstrip('\t') - # Write the cleaned line to the output file, ensuring the newline character is preserved - outfile.write(cleaned_line) - print('cleaned graph tags') - -def read_gfa_file(gfa_path): - """Read GFA file into gfapy python structure.""" - print('reading cleaned gfa') - try: - gfa_graph = gfapy.Gfa.from_file(gfa_path) - # print(gfa_graph.edges) - if len(gfa_graph.edges) == 0: - return None, "WARNING: GFA file only contains segment lines" - return gfa_graph, "PASS" - except Exception as e: - return None, f"WARNING: Issue with GFA file : {str(e)}" - -def remove_self_loops(links): - """Remove self-loops from link information.""" - pruned_links = [link for link in links if link.from_name != link.to_name] - # print(pruned_links) - return pruned_links, "PASS" - -def identify_low_coverage_contigs(segments): - """Identify contigs below 0.5x coverage.""" - low_cov = [] - for seg in segments: - dp_value = seg.get('dp') # This will return None if 'dp' is not a field in the segment - if dp_value is not None and float(dp_value) < 0.5: - low_cov.append(seg.get('name')) - #$print(low_cov) - return low_cov, "PASS" - -def filter_links_by_coverage(low_cov, links): - """Filter out links involving low coverage contigs.""" - filtered_links = [link for link in links if link.from_name not in low_cov and link.to_name not in low_cov] - return filtered_links, "PASS" - -def find_longest_contig(segments, output_dir): - """Find the longest contig based on length.""" - longest_contig = max(segments, key=lambda x: x.get('LN')) - # write longest contig to file - longest_contig_file = os.path.join(output_dir, "longest_contig.fasta") - with open(longest_contig_file, "w") as gfaContigs: - seqName = longest_contig.get('name') - gfaContigs.write(">" + seqName + "\n") - gfaContigs.write(longest_contig.get('sequence') + "\n") - return longest_contig.get('name'), "PASS", longest_contig_file - -def filter_segments_by_graph(segments, graph): - """Filter segments to include only those that are part of the graph.""" - graph_nodes = set(graph.nodes()) # Get all nodes in the graph as a set for quick lookup - filtered_segments = [seg for seg in segments if seg.get('name') in graph_nodes] - return filtered_segments - -def create_filtered_graph(links): - """Create a filtered NetworkX graph from links and remove disconnected nodes.""" - graph = nx.Graph() # Using a simple Graph instead of MultiGraph if you don't handle multiple edges between the same nodes - for link in links: - graph.add_edge(link.from_name, link.to_name) - - # Remove disconnected nodes - disconnected_nodes = [node for node in graph.nodes if graph.degree(node) == 0] - graph.remove_nodes_from(disconnected_nodes) - - if not nx.is_connected(graph): - return None, "WARNING: Graph is not connected" - return graph, "PASS" - -def identify_itr( gfa_graph, segments ): - """Identify all Inverted Terminal Repeats (ITRs) based on depth criteria and check if they are connected in the graph.""" - depth_data = {seg.get('name'): float(seg.get('dp')) for seg in segments if 'dp' in seg.tagnames} - lower_bound = 1.5 - upper_bound = 3 - itrs = [contig for contig, depth in depth_data.items() if lower_bound < depth < upper_bound] - - itr_length = 0 - visited = set() - - for seg in segments: - if seg.name in itrs and seg.name not in visited: - visited.add(seg.name) # Mark this segment as visited - itr_length += len(seg.sequence) # Accumulate the sequence length - - print("Total ITR sequence length:", itr_length) - - return itrs, itr_length - -def get_final_path(gfa_graph, filtered_graph, segments): - """Find all longest paths in the graph starting from any ITR.""" - itrs, itr_length = identify_itr(gfa_graph, segments) - if not itrs: - return [], "WARNING: No suitable ITRs found based on depth criteria." - - longest_paths = [] - max_length = 0 - for itr in itrs: - for contig in filtered_graph.nodes(): - if contig != itr: - for path in nx.all_simple_paths(filtered_graph, source=itr, target=contig): - # print(path) - path_length = len(path) - if path_length > max_length: - longest_paths = [path] # Start a new list with the new longest path - max_length = path_length - elif path_length == max_length: - longest_paths.append(path) # Add path to the list of longest paths - - if longest_paths: - return longest_paths[0], f"PASS: Found {len(longest_paths)} longest path(s) of length {max_length}" - else: - return [], "WARNING: No path found starting from any ITR." - -def orient_longest_contig(query, reference, blast_db_dir): - blastResults = query + "_blast.out" - blast_db_path = os.path.join(blast_db_dir, query + "_DB") - makeblastdb_command = ["makeblastdb", "-in", query, "-out", blast_db_path, "-dbtype", "nucl"] - blastn_command = ["blastn", "-query", reference, "-db", blast_db_path, "-evalue", ".00001", "-outfmt", "6 qseqid sseqid pident length qcovs sstart send sseq mismatch gapopen qlen slen bitscore", "-out", blastResults] - - print(f"Running command: {' '.join(makeblastdb_command)}") - subprocess.call(makeblastdb_command, shell=False) - - print(f"Running command: {' '.join(blastn_command)}") - subprocess.call(blastn_command, shell=False) - - # Check if blastResults file is created and contains results - if not os.path.exists(blastResults): - print(f"BLAST results file not created: {blastResults}") - return None, "FAIL" - - with open(blastResults, 'r') as e: - for line in e: - f13LInfo = line.split('\t') - sstart = int(f13LInfo[5]) - send = int(f13LInfo[6]) - orientation = 1 if sstart < send else int(-1) - return orientation, "PASS" - -def get_final_orientation(final_path, lnks, longest_contig, longest_orient): - contig_orientation = [0] * len(final_path) - - for i in range(final_path.index(longest_contig), len(final_path)): - if i == final_path.index(longest_contig): - contig_orientation[i] = longest_orient - else: - flag=0 - for link in lnks: - if (link.from_name == final_path[i-1] and link.to_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) - contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient - flag=1 - if flag == 0: - for link in lnks: - if (link.to_name == final_path[i-1] and link.from_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) - contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient - flag=1 - - for i in range(final_path.index(longest_contig)-1, -1 ,-1): - flag=0 - for link in lnks: - if (link.to_name == final_path[i+1] and link.from_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) - contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient - flag=1 - if flag == 0: - for link in lnks: - if (link.from_name == final_path[i+1] and link.to_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) - contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient - flag=1 - check="PASS" - return contig_orientation, check - -def get_final_sequence(contig_order, contig_orientation, segments): - segment_info = {} - for segment in segments: - segment_count = contig_order.count(segment.get('name')) - coverage = float(segment.get('dp')) if segment_count == 0 else float(segment.get('dp')) / contig_order.count(segment.get('name')) - segment_info[segment.get('name')] = { - 'coverage': coverage, - 'sequence': Seq(segment.get('sequence')), - 'sequence_rc': Seq(segment.get('sequence')).reverse_complement() - } - - print("Segment Info Keys:", segment_info.keys()) - print("Contig Order:", contig_order) - - final_sequence = '' - final_order_orientation_copy_number = [] - for i in range(len(contig_order)): - segment_name = contig_order[i].strip('+').strip('-') # Strip orientation symbols - # print(f"Processing segment: {segment_name}") - sequence = segment_info[segment_name]['sequence'] * round(segment_info[segment_name]['coverage']) - if contig_orientation[i] == -1: - sequence = segment_info[segment_name]['sequence_rc'] * round(segment_info[segment_name]['coverage']) - orientation = '+' if contig_orientation[i] == 1 else '-' - order_orientation_copy_number = '%s%s' % (orientation, segment_name) - if round(segment_info[segment_name]['coverage']) > 1: - order_orientation_copy_number = '%sx%s' % (order_orientation_copy_number, round(segment_info[segment_name]['coverage'])) - final_sequence = final_sequence + sequence - final_order_orientation_copy_number.append(order_orientation_copy_number) - - check = "PASS" - # are all segments in final_sequence? - cleaned_contig_order = [contig.strip('+-') for contig in contig_order] - for segment in segment_info: - if (segment_info[segment]['coverage'] > 0.5) and (segment not in cleaned_contig_order): - check = 'WARNING: missing segments' - return final_sequence, len(final_sequence), " ".join(final_order_orientation_copy_number), check - -def write_oriented_fasta(final_path, segments, output_file, input_file): - """Write the segments in the specified orientation to a single FASTA entry with the input file name as the header.""" - segment_dict = {seg.name: seg.sequence for seg in segments} # Create a dictionary of segment names to sequences - full_sequence = "" # Initialize an empty string to accumulate full sequence - - for segment_name in final_path: - seq = segment_dict[segment_name.strip('+').strip('-')] # Remove orientation symbols for lookup - # Check if the segment should be reversed - if segment_name.endswith('-'): - seq = str(Seq(seq).reverse_complement()) # Reverse complement the sequence if needed - - full_sequence += seq # Concatenate sequence - - # Create a single SeqRecord with all concatenated sequences - # Use the base name of the input file as the ID for the SeqRecord - input_base_name = os.path.splitext(os.path.basename(input_file))[0] - record = SeqRecord(Seq(full_sequence), id=input_base_name, description="All contigs concatenated based on the final path") - - # Write the single record to the output file - with open(output_file, 'w') as f: - SeqIO.write(record, f, "fasta") - -def write_all_contigs(segments, output_file): - """Write all contigs to a FASTA file without considering orientation.""" - with open(output_file, 'w') as f: - for seg in segments: - record = SeqRecord(Seq(seg.sequence), id=seg.name, description="") - SeqIO.write(record, f, "fasta") - -def write_log_and_exit(log, status): - # print(log) - log_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".log") - summary_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".summary") - - headers = ['sample', 'status', 'contig_order', 'contig_orientation', 'contig_order_orientation_copy_number', 'assembly_length', 'itr_length'] - data = [] - if '00' in log: - data.append(log['00']['input']['sample_name']) - data.append(status) - if '03' in log: - data.append(",".join(str(i) for i in log['03']['output']['final_path'])) - if '06' in log: - data.append(",".join(str(i) for i in log['06']['output']['final_orientation'])) - if '07' in log: - data.append(str(log['07']['output']['final_order_orientation_copy_number'])) - data.append(str(log['07']['output']['final_sequence_length'])) - if '09' in log: - data.append(str(log['09']['output']['final_itr_length'])) - - with open(summary_file, 'w') as f: - f.write('\t'.join(headers) + '\n') - f.write('\t'.join(data) + '\n') - - with open(log_file, 'w') as f: - json_object = json.dumps(log, indent=4) - f.write(json_object) - sys.exit(0) - -def process_graph(gfa_graph, output_dir, input_file, reference): - """Process the graph and write output based on the results.""" - log = {} - input_with_ext = os.path.basename(input_file) - input_base, _ = os.path.splitext(input_with_ext) - sample_name = input_base - - # Initial log entry - log['00'] = {'step_name': "initialization", - 'step_description': "Initialize the logging process", - 'status': "PASS", - 'input': { - 'gfa': input_file, - 'sample_name': sample_name, - 'output_dir': output_dir - }, - 'output': {}} - - # Always write all contigs to a FASTA file at the start - write_all_contigs(gfa_graph.segments, os.path.join(output_dir, input_base + ".all_contigs.fasta")) - - # Start processing the graph - filtered_edges, status = remove_self_loops(gfa_graph.edges) - log['01'] = {'step_name': "remove_self_loops", - 'step_description': "Remove self-loops from link information", - 'status': status, - 'output': {'filtered_edges': [str(edge) for edge in filtered_edges]}} - if status != "PASS": - write_log_and_exit(log, status) - - filtered_graph, status = create_filtered_graph(filtered_edges) - log['02'] = {'step_name': "create_filtered_graph", - 'step_description': "Create a filtered NetworkX graph from links and remove disconnected nodes", - 'status': status, - 'output': {'filtered_graph': str(filtered_graph)}} - if status != "PASS": - write_log_and_exit(log, status) - - filtered_segments = filter_segments_by_graph(gfa_graph.segments, filtered_graph) - final_path, status = get_final_path(gfa_graph, filtered_graph, filtered_segments) - log['03'] = {'step_name': "get_final_path", - 'step_description': "Find all longest paths in the graph starting from any ITR", - 'status': status, - 'output': {'final_path': final_path}} - if not status.startswith("PASS"): - write_log_and_exit(log, status) - - # Find the longest contig - longest_contig, status, longest_contig_file = find_longest_contig(filtered_segments, output_dir) - log['04'] = {'step_name': "find_longest_contig", - 'step_description': "Find the longest contig based on length", - 'status': status, - 'output': {'longest_contig': longest_contig}} - if status != "PASS": - write_log_and_exit(log, status) - - # Create blast database directory - blast_db_dir = os.path.join(output_dir, 'blast_db') - os.makedirs(blast_db_dir, exist_ok=True) # Create if it doesn't exist - # Determine the orientation of the longest contig - longest_orient, status = orient_longest_contig(longest_contig_file, reference, blast_db_dir) - log['05'] = {'step_name': "orient_longest_contig", - 'step_description': "Determine the orientation of the longest contig", - 'status': status, - 'output': {'longest_orient': longest_orient}} - if status != "PASS": - write_log_and_exit(log, status) - - # Get the final orientation for all contigs - contig_orientation, status = get_final_orientation(final_path, filtered_edges, longest_contig, longest_orient) - log['06'] = {'step_name': "get_final_orientation", - 'step_description': "Get the final orientation for all contigs", - 'status': status, - 'output': {'final_orientation': contig_orientation}} - if status != "PASS": - write_log_and_exit(log, status) - - # Re-orient the final path based on determined orientation - oriented_final_path = [contig + ('-' if contig_orientation[i] == -1 else '+') for i, contig in enumerate(final_path)] - - # Get the final sequence and order - final_sequence, seq_len, final_order_orientation_copy_number, status = get_final_sequence(oriented_final_path, contig_orientation, filtered_segments) - log['07'] = {'step_name': "get_final_sequence", - 'step_description': "Get the final sequence and order", - 'status': status, - 'output': {'final_sequence': str(final_sequence), # Convert Seq object to string - 'final_sequence_length': seq_len, - 'final_order_orientation_copy_number': final_order_orientation_copy_number}} - if status != "PASS": - write_log_and_exit(log, status) - - # Write the oriented contigs to a FASTA file - asm_name = input_base + ".assembly_asm.fasta" - record = SeqRecord(Seq(final_sequence), id=input_base, description=final_order_orientation_copy_number) - with open(os.path.join(output_dir, asm_name), 'w') as f: - SeqIO.write(record, f, "fasta") - - log['08'] = {'step_name': "write_oriented_fasta", - 'step_description': "Write the oriented contigs to a FASTA file", - 'status': "PASS", - 'output': {'assembly_file': asm_name}} - - # Remove the blast_db directory - shutil.rmtree(blast_db_dir) # Remove the directory and its contents - - # Identify ITRs and their length - itrs, itr_length = identify_itr(gfa_graph, filtered_segments) - log['09'] = {'step_name': "identify_itr", - 'step_description': "Identify all Inverted Terminal Repeats (ITRs) based on depth criteria", - 'status': "PASS", - 'output': {'itrs': itrs, - 'final_itr_length': itr_length}} - - # Write the final log and summary - write_log_and_exit(log, "PASS") - -def main(arguments): - parser = argparse.ArgumentParser(description="GFA parser to construct assembly from Unicycler") - parser.add_argument('-i', type=str, required=True, help="GFA file from Unicycler") - parser.add_argument('-o', type=str, required=True, help="Output directory") - parser.add_argument('-r', type=str, required=True, help="Reference file for orientation") - args = parser.parse_args(arguments) - - gfa_file = args.i - output_dir = args.o - reference_file = args.r - - # clean up gfa tags - cleanedGfa = 'graph_cleaned.gfa' - clean_graph_tags(gfa_file, cleanedGfa) - - gfa_graph, status = read_gfa_file(cleanedGfa) - if status != "PASS": - return - - if gfa_graph is None: - print("Failed to read GFA file.") - return - - process_graph(gfa_graph, output_dir, gfa_file, reference_file) - -if __name__ == '__main__': - main(sys.argv[1:]) From 82ad7efe721ba5ee6abab8306300a96d20d23754 Mon Sep 17 00:00:00 2001 From: ufp0 Date: Mon, 12 Aug 2024 15:00:59 -0400 Subject: [PATCH 05/42] updated the gfa module --- modules/local/graph_reconstruct.nf | 8 ++++---- modules/nf-core/modules/unicycler/main.nf | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/local/graph_reconstruct.nf b/modules/local/graph_reconstruct.nf index 955a98a..7ba3283 100755 --- a/modules/local/graph_reconstruct.nf +++ b/modules/local/graph_reconstruct.nf @@ -18,11 +18,11 @@ process GRAPH_RECON { def prefix = task.ext.prefix ?: "${meta.id}" def gfa_unzip = "$gfa".replaceAll(/.gz/, "") """ - gunzip -f $gfa - cat $gfa_unzip | awk 'BEGIN { FS="\\t" } /^S/{ if( length(\$3) >= 1) print ">Contig"\$2"_len"substr(\$4,6)"_cov"substr(\$5,6,5)"\\n"\$3}' | fold > ${prefix}.contigs.fasta + #gunzip -f $gfa + #cat $gfa_unzip | awk 'BEGIN { FS="\\t" } /^S/{ if( length(\$3) >= 1) print ">Contig"\$2"_len"substr(\$4,6)"_cov"substr(\$5,6,5)"\\n"\$3}' | fold > ${prefix}.contigs.fasta - mpxv-AssemblyGraph_gfaPy.py \\ - -i $gfa_unzip \\ + AssemblyGraph_gfaPy.py \\ + -i $gfa \\ -r "$projectDir/assets/MPXV-UK_P2.noN_39086_40204.fasta" \\ -o . diff --git a/modules/nf-core/modules/unicycler/main.nf b/modules/nf-core/modules/unicycler/main.nf index 6c1a4e8..7a968cd 100755 --- a/modules/nf-core/modules/unicycler/main.nf +++ b/modules/nf-core/modules/unicycler/main.nf @@ -12,7 +12,7 @@ process UNICYCLER { output: tuple val(meta), path('*.scaffolds.fa.gz'), emit: scaffolds optional true - tuple val(meta), path('*.gfa'), emit: gfa optional true + tuple val(meta), path('*003_bridges_applied.gfa'), emit: gfa optional true tuple val(meta), path('*.log') , emit: log path "versions.yml" , emit: versions From 74e52fefe67cc3d89768cde9ee4430564294b6cd Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Mon, 12 Aug 2024 16:33:03 -0400 Subject: [PATCH 06/42] updated gfa python script --- bin/AssemblyGraph_gfaPy.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py index 496f3a5..77e89c7 100644 --- a/bin/AssemblyGraph_gfaPy.py +++ b/bin/AssemblyGraph_gfaPy.py @@ -103,7 +103,7 @@ def identify_itr( gfa_graph, segments ): """Identify all Inverted Terminal Repeats (ITRs) based on depth criteria and check if they are connected in the graph.""" depth_data = {seg.get('name'): float(seg.get('dp')) for seg in segments if 'dp' in seg.tagnames} lower_bound = 1.5 - upper_bound = 3 + upper_bound = 20 itrs = [contig for contig, depth in depth_data.items() if lower_bound < depth < upper_bound] itr_length = 0 @@ -114,8 +114,7 @@ def identify_itr( gfa_graph, segments ): visited.add(seg.name) # Mark this segment as visited itr_length += len(seg.sequence) # Accumulate the sequence length - print("Total ITR sequence length:", itr_length) - + # print("Total ITR sequence length:", itr_length) return itrs, itr_length def get_final_path(gfa_graph, filtered_graph, segments): @@ -136,9 +135,12 @@ def get_final_path(gfa_graph, filtered_graph, segments): max_length = path_length elif path_length == max_length: longest_paths.append(path) # Add path to the list of longest paths - + itr_order = [] if longest_paths: - return longest_paths[0], f"PASS: Found {len(longest_paths)} longest path(s) of length {max_length}" + final_path = longest_paths[0] + itr_order.extend(c for c in final_path if c in itrs) + final_path.extend(itr_order[::-1]) + return final_path, f"PASS: Found {len(longest_paths)} longest path(s) of length {max_length}" else: return [], "WARNING: No path found starting from any ITR." @@ -169,7 +171,6 @@ def orient_longest_contig(query, reference, blast_db_dir): def get_final_orientation(final_path, lnks, longest_contig, longest_orient): contig_orientation = [0] * len(final_path) - for i in range(final_path.index(longest_contig), len(final_path)): if i == final_path.index(longest_contig): contig_orientation[i] = longest_orient @@ -205,6 +206,8 @@ def get_final_orientation(final_path, lnks, longest_contig, longest_orient): contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient flag=1 check="PASS" + # print(final_path) + # print(contig_orientation) return contig_orientation, check def get_final_sequence(contig_order, contig_orientation, segments): @@ -217,10 +220,7 @@ def get_final_sequence(contig_order, contig_orientation, segments): 'sequence': Seq(segment.get('sequence')), 'sequence_rc': Seq(segment.get('sequence')).reverse_complement() } - - print("Segment Info Keys:", segment_info.keys()) - print("Contig Order:", contig_order) - + final_sequence = '' final_order_orientation_copy_number = [] for i in range(len(contig_order)): @@ -241,7 +241,6 @@ def get_final_sequence(contig_order, contig_orientation, segments): for segment in segment_info: if (segment_info[segment]['coverage'] > 0.5) and (segment not in cleaned_contig_order): check = 'WARNING: missing segments' - return final_sequence, len(final_sequence), " ".join(final_order_orientation_copy_number), check def write_oriented_fasta(final_path, segments, output_file, input_file): @@ -361,7 +360,7 @@ def process_graph(gfa_graph, output_dir, input_file, reference): # Create blast database directory blast_db_dir = os.path.join(output_dir, 'blast_db') os.makedirs(blast_db_dir, exist_ok=True) # Create if it doesn't exist - + # Determine the orientation of the longest contig longest_orient, status = orient_longest_contig(longest_contig_file, reference, blast_db_dir) log['05'] = {'step_name': "orient_longest_contig", From d227935054c15c1dc52536f590dc992e37a59e25 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Mon, 12 Aug 2024 16:38:01 -0400 Subject: [PATCH 07/42] fixed whitespace --- bin/AssemblyGraph_gfaPy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py index 77e89c7..a86674d 100644 --- a/bin/AssemblyGraph_gfaPy.py +++ b/bin/AssemblyGraph_gfaPy.py @@ -444,4 +444,4 @@ def main(arguments): process_graph(gfa_graph, output_dir, gfa_file, reference_file) if __name__ == '__main__': - main(sys.argv[1:]) + main(sys.argv[1:]) \ No newline at end of file From 3e25c88ec01af7b8ed11b417ca6d1e024afb81ec Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Fri, 30 Aug 2024 09:20:56 -0400 Subject: [PATCH 08/42] updated assembly python file --- bin/AssemblyGraph_gfaPy.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py index a86674d..6989101 100644 --- a/bin/AssemblyGraph_gfaPy.py +++ b/bin/AssemblyGraph_gfaPy.py @@ -114,10 +114,11 @@ def identify_itr( gfa_graph, segments ): visited.add(seg.name) # Mark this segment as visited itr_length += len(seg.sequence) # Accumulate the sequence length - # print("Total ITR sequence length:", itr_length) + print("Total ITR sequence length:", itr_length) return itrs, itr_length def get_final_path(gfa_graph, filtered_graph, segments): + print(gfa_graph) """Find all longest paths in the graph starting from any ITR.""" itrs, itr_length = identify_itr(gfa_graph, segments) if not itrs: @@ -137,9 +138,11 @@ def get_final_path(gfa_graph, filtered_graph, segments): longest_paths.append(path) # Add path to the list of longest paths itr_order = [] if longest_paths: + print(longest_paths) final_path = longest_paths[0] itr_order.extend(c for c in final_path if c in itrs) final_path.extend(itr_order[::-1]) + #print(final_path) return final_path, f"PASS: Found {len(longest_paths)} longest path(s) of length {max_length}" else: return [], "WARNING: No path found starting from any ITR." From 03c3deff59aa760db6ce6b5ef6e7501bd9ef233b Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Wed, 4 Sep 2024 14:52:59 -0400 Subject: [PATCH 09/42] added bandage image module --- .../image/environment.yaml} | 0 modules/nf-core/bandage/image/main.nf | 33 +++++++++++++ modules/nf-core/bandage/image/meta.yaml | 46 +++++++++++++++++++ .../nf-core/{modules => }/bwa/index/main.nf | 0 .../{modules => }/bwa/index/main_denovo.nf | 0 .../nf-core/{modules => }/bwa/index/meta.yml | 0 modules/nf-core/{modules => }/bwa/mem/main.nf | 0 .../{modules => }/bwa/mem/main_denovo.nf | 0 .../nf-core/{modules => }/bwa/mem/meta.yml | 0 .../custom/dumpsoftwareversions/main.nf | 0 .../custom/dumpsoftwareversions/meta.yml | 0 .../templates/dumpsoftwareversions.py | 0 modules/nf-core/{modules => }/fastp/main.nf | 0 modules/nf-core/{modules => }/fastp/meta.yml | 0 modules/nf-core/{modules => }/fastqc/main.nf | 0 modules/nf-core/{modules => }/fastqc/meta.yml | 0 .../{modules => }/ivar/consensus/main.nf | 0 .../ivar/consensus/main_denovo.nf | 0 .../{modules => }/ivar/consensus/meta.yml | 0 .../{modules => }/ivar/variants/main.nf | 0 .../{modules => }/ivar/variants/meta.yml | 0 .../{modules => }/kraken2/kraken2/main.nf | 0 .../{modules => }/kraken2/kraken2/meta.yml | 0 modules/nf-core/{modules => }/multiqc/main.nf | 0 .../nf-core/{modules => }/multiqc/meta.yml | 0 modules/nf-core/{modules => }/mummer/main.nf | 0 modules/nf-core/{modules => }/mummer/meta.yml | 0 modules/nf-core/{modules => }/quast/main.nf | 0 modules/nf-core/{modules => }/quast/meta.yml | 0 .../{modules => }/samtools/depth/main.nf | 0 .../{modules => }/samtools/depth/meta.yml | 0 .../samtools/flagstat/main.denovo.nf | 0 .../{modules => }/samtools/flagstat/main.nf | 0 .../{modules => }/samtools/flagstat/meta.yml | 0 .../{modules => }/samtools/index/main.nf | 0 .../{modules => }/samtools/index/meta.yml | 0 .../{modules => }/samtools/sort/main.nf | 0 .../{modules => }/samtools/sort/meta.yml | 0 .../{modules => }/seqtk/subseq/main.nf | 0 .../{modules => }/seqtk/subseq/meta.yml | 0 .../nf-core/{modules => }/unicycler/main.nf | 0 .../nf-core/{modules => }/unicycler/meta.yml | 0 modules/nf-core/vcftools/.gitkeep | 0 .../nf-core/{modules => }/vcftools/main.nf | 0 .../nf-core/{modules => }/vcftools/meta.yml | 0 .../{modules => }/vcftools/vcf_diff.nf | 0 subworkflows/local/denovo.nf | 8 ++++ 47 files changed, 87 insertions(+) rename modules/nf-core/{modules/vcftools/.gitkeep => bandage/image/environment.yaml} (100%) mode change 100755 => 100644 create mode 100644 modules/nf-core/bandage/image/main.nf create mode 100644 modules/nf-core/bandage/image/meta.yaml rename modules/nf-core/{modules => }/bwa/index/main.nf (100%) rename modules/nf-core/{modules => }/bwa/index/main_denovo.nf (100%) rename modules/nf-core/{modules => }/bwa/index/meta.yml (100%) rename modules/nf-core/{modules => }/bwa/mem/main.nf (100%) rename modules/nf-core/{modules => }/bwa/mem/main_denovo.nf (100%) rename modules/nf-core/{modules => }/bwa/mem/meta.yml (100%) rename modules/nf-core/{modules => }/custom/dumpsoftwareversions/main.nf (100%) rename modules/nf-core/{modules => }/custom/dumpsoftwareversions/meta.yml (100%) rename modules/nf-core/{modules => }/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py (100%) rename modules/nf-core/{modules => }/fastp/main.nf (100%) rename modules/nf-core/{modules => }/fastp/meta.yml (100%) rename modules/nf-core/{modules => }/fastqc/main.nf (100%) rename modules/nf-core/{modules => }/fastqc/meta.yml (100%) rename modules/nf-core/{modules => }/ivar/consensus/main.nf (100%) rename modules/nf-core/{modules => }/ivar/consensus/main_denovo.nf (100%) rename modules/nf-core/{modules => }/ivar/consensus/meta.yml (100%) rename modules/nf-core/{modules => }/ivar/variants/main.nf (100%) rename modules/nf-core/{modules => }/ivar/variants/meta.yml (100%) rename modules/nf-core/{modules => }/kraken2/kraken2/main.nf (100%) rename modules/nf-core/{modules => }/kraken2/kraken2/meta.yml (100%) rename modules/nf-core/{modules => }/multiqc/main.nf (100%) rename modules/nf-core/{modules => }/multiqc/meta.yml (100%) rename modules/nf-core/{modules => }/mummer/main.nf (100%) rename modules/nf-core/{modules => }/mummer/meta.yml (100%) rename modules/nf-core/{modules => }/quast/main.nf (100%) rename modules/nf-core/{modules => }/quast/meta.yml (100%) rename modules/nf-core/{modules => }/samtools/depth/main.nf (100%) rename modules/nf-core/{modules => }/samtools/depth/meta.yml (100%) rename modules/nf-core/{modules => }/samtools/flagstat/main.denovo.nf (100%) rename modules/nf-core/{modules => }/samtools/flagstat/main.nf (100%) rename modules/nf-core/{modules => }/samtools/flagstat/meta.yml (100%) rename modules/nf-core/{modules => }/samtools/index/main.nf (100%) rename modules/nf-core/{modules => }/samtools/index/meta.yml (100%) rename modules/nf-core/{modules => }/samtools/sort/main.nf (100%) rename modules/nf-core/{modules => }/samtools/sort/meta.yml (100%) rename modules/nf-core/{modules => }/seqtk/subseq/main.nf (100%) rename modules/nf-core/{modules => }/seqtk/subseq/meta.yml (100%) rename modules/nf-core/{modules => }/unicycler/main.nf (100%) rename modules/nf-core/{modules => }/unicycler/meta.yml (100%) create mode 100755 modules/nf-core/vcftools/.gitkeep rename modules/nf-core/{modules => }/vcftools/main.nf (100%) rename modules/nf-core/{modules => }/vcftools/meta.yml (100%) rename modules/nf-core/{modules => }/vcftools/vcf_diff.nf (100%) diff --git a/modules/nf-core/modules/vcftools/.gitkeep b/modules/nf-core/bandage/image/environment.yaml old mode 100755 new mode 100644 similarity index 100% rename from modules/nf-core/modules/vcftools/.gitkeep rename to modules/nf-core/bandage/image/environment.yaml diff --git a/modules/nf-core/bandage/image/main.nf b/modules/nf-core/bandage/image/main.nf new file mode 100644 index 0000000..a25926e --- /dev/null +++ b/modules/nf-core/bandage/image/main.nf @@ -0,0 +1,33 @@ +process BANDAGE_IMAGE { + tag "${meta.id}" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bandage:0.8.1--hc9558a2_2' : + 'biocontainers/bandage:0.8.1--hc9558a2_2' }" + + input: + tuple val(meta), path(gfa) + + output: + tuple val(meta), path('*.png'), emit: png + tuple val(meta), path('*.svg'), emit: svg + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + Bandage image $gfa ${prefix}.png $args + Bandage image $gfa ${prefix}.svg $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bandage: \$(echo \$(Bandage --version 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + END_VERSIONS + """ +} \ No newline at end of file diff --git a/modules/nf-core/bandage/image/meta.yaml b/modules/nf-core/bandage/image/meta.yaml new file mode 100644 index 0000000..9b0f938 --- /dev/null +++ b/modules/nf-core/bandage/image/meta.yaml @@ -0,0 +1,46 @@ +name: bandage_image +description: Render an assembly graph in GFA 1.0 format to PNG and SVG image formats +keywords: + - gfa + - graph + - assembly + - visualisation +tools: + - bandage: + description: | + Bandage - a Bioinformatics Application for Navigating De novo Assembly Graphs Easily + homepage: https://github.com/rrwick/Bandage + documentation: https://github.com/rrwick/Bandage + licence: ["GPL-3.0-or-later"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - gfa: + type: file + description: Assembly graph in GFA 1.0 format + pattern: "*.gfa" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - png: + type: file + description: Bandage image in PNG format + pattern: "*.png" + - svg: + type: file + description: Bandage image in SVG format + pattern: "*.svg" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@heuermh" +maintainers: + - "@heuermh" \ No newline at end of file diff --git a/modules/nf-core/modules/bwa/index/main.nf b/modules/nf-core/bwa/index/main.nf similarity index 100% rename from modules/nf-core/modules/bwa/index/main.nf rename to modules/nf-core/bwa/index/main.nf diff --git a/modules/nf-core/modules/bwa/index/main_denovo.nf b/modules/nf-core/bwa/index/main_denovo.nf similarity index 100% rename from modules/nf-core/modules/bwa/index/main_denovo.nf rename to modules/nf-core/bwa/index/main_denovo.nf diff --git a/modules/nf-core/modules/bwa/index/meta.yml b/modules/nf-core/bwa/index/meta.yml similarity index 100% rename from modules/nf-core/modules/bwa/index/meta.yml rename to modules/nf-core/bwa/index/meta.yml diff --git a/modules/nf-core/modules/bwa/mem/main.nf b/modules/nf-core/bwa/mem/main.nf similarity index 100% rename from modules/nf-core/modules/bwa/mem/main.nf rename to modules/nf-core/bwa/mem/main.nf diff --git a/modules/nf-core/modules/bwa/mem/main_denovo.nf b/modules/nf-core/bwa/mem/main_denovo.nf similarity index 100% rename from modules/nf-core/modules/bwa/mem/main_denovo.nf rename to modules/nf-core/bwa/mem/main_denovo.nf diff --git a/modules/nf-core/modules/bwa/mem/meta.yml b/modules/nf-core/bwa/mem/meta.yml similarity index 100% rename from modules/nf-core/modules/bwa/mem/meta.yml rename to modules/nf-core/bwa/mem/meta.yml diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf similarity index 100% rename from modules/nf-core/modules/custom/dumpsoftwareversions/main.nf rename to modules/nf-core/custom/dumpsoftwareversions/main.nf diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml similarity index 100% rename from modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml rename to modules/nf-core/custom/dumpsoftwareversions/meta.yml diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py similarity index 100% rename from modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py rename to modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py diff --git a/modules/nf-core/modules/fastp/main.nf b/modules/nf-core/fastp/main.nf similarity index 100% rename from modules/nf-core/modules/fastp/main.nf rename to modules/nf-core/fastp/main.nf diff --git a/modules/nf-core/modules/fastp/meta.yml b/modules/nf-core/fastp/meta.yml similarity index 100% rename from modules/nf-core/modules/fastp/meta.yml rename to modules/nf-core/fastp/meta.yml diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/fastqc/main.nf similarity index 100% rename from modules/nf-core/modules/fastqc/main.nf rename to modules/nf-core/fastqc/main.nf diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml similarity index 100% rename from modules/nf-core/modules/fastqc/meta.yml rename to modules/nf-core/fastqc/meta.yml diff --git a/modules/nf-core/modules/ivar/consensus/main.nf b/modules/nf-core/ivar/consensus/main.nf similarity index 100% rename from modules/nf-core/modules/ivar/consensus/main.nf rename to modules/nf-core/ivar/consensus/main.nf diff --git a/modules/nf-core/modules/ivar/consensus/main_denovo.nf b/modules/nf-core/ivar/consensus/main_denovo.nf similarity index 100% rename from modules/nf-core/modules/ivar/consensus/main_denovo.nf rename to modules/nf-core/ivar/consensus/main_denovo.nf diff --git a/modules/nf-core/modules/ivar/consensus/meta.yml b/modules/nf-core/ivar/consensus/meta.yml similarity index 100% rename from modules/nf-core/modules/ivar/consensus/meta.yml rename to modules/nf-core/ivar/consensus/meta.yml diff --git a/modules/nf-core/modules/ivar/variants/main.nf b/modules/nf-core/ivar/variants/main.nf similarity index 100% rename from modules/nf-core/modules/ivar/variants/main.nf rename to modules/nf-core/ivar/variants/main.nf diff --git a/modules/nf-core/modules/ivar/variants/meta.yml b/modules/nf-core/ivar/variants/meta.yml similarity index 100% rename from modules/nf-core/modules/ivar/variants/meta.yml rename to modules/nf-core/ivar/variants/meta.yml diff --git a/modules/nf-core/modules/kraken2/kraken2/main.nf b/modules/nf-core/kraken2/kraken2/main.nf similarity index 100% rename from modules/nf-core/modules/kraken2/kraken2/main.nf rename to modules/nf-core/kraken2/kraken2/main.nf diff --git a/modules/nf-core/modules/kraken2/kraken2/meta.yml b/modules/nf-core/kraken2/kraken2/meta.yml similarity index 100% rename from modules/nf-core/modules/kraken2/kraken2/meta.yml rename to modules/nf-core/kraken2/kraken2/meta.yml diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/multiqc/main.nf similarity index 100% rename from modules/nf-core/modules/multiqc/main.nf rename to modules/nf-core/multiqc/main.nf diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml similarity index 100% rename from modules/nf-core/modules/multiqc/meta.yml rename to modules/nf-core/multiqc/meta.yml diff --git a/modules/nf-core/modules/mummer/main.nf b/modules/nf-core/mummer/main.nf similarity index 100% rename from modules/nf-core/modules/mummer/main.nf rename to modules/nf-core/mummer/main.nf diff --git a/modules/nf-core/modules/mummer/meta.yml b/modules/nf-core/mummer/meta.yml similarity index 100% rename from modules/nf-core/modules/mummer/meta.yml rename to modules/nf-core/mummer/meta.yml diff --git a/modules/nf-core/modules/quast/main.nf b/modules/nf-core/quast/main.nf similarity index 100% rename from modules/nf-core/modules/quast/main.nf rename to modules/nf-core/quast/main.nf diff --git a/modules/nf-core/modules/quast/meta.yml b/modules/nf-core/quast/meta.yml similarity index 100% rename from modules/nf-core/modules/quast/meta.yml rename to modules/nf-core/quast/meta.yml diff --git a/modules/nf-core/modules/samtools/depth/main.nf b/modules/nf-core/samtools/depth/main.nf similarity index 100% rename from modules/nf-core/modules/samtools/depth/main.nf rename to modules/nf-core/samtools/depth/main.nf diff --git a/modules/nf-core/modules/samtools/depth/meta.yml b/modules/nf-core/samtools/depth/meta.yml similarity index 100% rename from modules/nf-core/modules/samtools/depth/meta.yml rename to modules/nf-core/samtools/depth/meta.yml diff --git a/modules/nf-core/modules/samtools/flagstat/main.denovo.nf b/modules/nf-core/samtools/flagstat/main.denovo.nf similarity index 100% rename from modules/nf-core/modules/samtools/flagstat/main.denovo.nf rename to modules/nf-core/samtools/flagstat/main.denovo.nf diff --git a/modules/nf-core/modules/samtools/flagstat/main.nf b/modules/nf-core/samtools/flagstat/main.nf similarity index 100% rename from modules/nf-core/modules/samtools/flagstat/main.nf rename to modules/nf-core/samtools/flagstat/main.nf diff --git a/modules/nf-core/modules/samtools/flagstat/meta.yml b/modules/nf-core/samtools/flagstat/meta.yml similarity index 100% rename from modules/nf-core/modules/samtools/flagstat/meta.yml rename to modules/nf-core/samtools/flagstat/meta.yml diff --git a/modules/nf-core/modules/samtools/index/main.nf b/modules/nf-core/samtools/index/main.nf similarity index 100% rename from modules/nf-core/modules/samtools/index/main.nf rename to modules/nf-core/samtools/index/main.nf diff --git a/modules/nf-core/modules/samtools/index/meta.yml b/modules/nf-core/samtools/index/meta.yml similarity index 100% rename from modules/nf-core/modules/samtools/index/meta.yml rename to modules/nf-core/samtools/index/meta.yml diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/samtools/sort/main.nf similarity index 100% rename from modules/nf-core/modules/samtools/sort/main.nf rename to modules/nf-core/samtools/sort/main.nf diff --git a/modules/nf-core/modules/samtools/sort/meta.yml b/modules/nf-core/samtools/sort/meta.yml similarity index 100% rename from modules/nf-core/modules/samtools/sort/meta.yml rename to modules/nf-core/samtools/sort/meta.yml diff --git a/modules/nf-core/modules/seqtk/subseq/main.nf b/modules/nf-core/seqtk/subseq/main.nf similarity index 100% rename from modules/nf-core/modules/seqtk/subseq/main.nf rename to modules/nf-core/seqtk/subseq/main.nf diff --git a/modules/nf-core/modules/seqtk/subseq/meta.yml b/modules/nf-core/seqtk/subseq/meta.yml similarity index 100% rename from modules/nf-core/modules/seqtk/subseq/meta.yml rename to modules/nf-core/seqtk/subseq/meta.yml diff --git a/modules/nf-core/modules/unicycler/main.nf b/modules/nf-core/unicycler/main.nf similarity index 100% rename from modules/nf-core/modules/unicycler/main.nf rename to modules/nf-core/unicycler/main.nf diff --git a/modules/nf-core/modules/unicycler/meta.yml b/modules/nf-core/unicycler/meta.yml similarity index 100% rename from modules/nf-core/modules/unicycler/meta.yml rename to modules/nf-core/unicycler/meta.yml diff --git a/modules/nf-core/vcftools/.gitkeep b/modules/nf-core/vcftools/.gitkeep new file mode 100755 index 0000000..e69de29 diff --git a/modules/nf-core/modules/vcftools/main.nf b/modules/nf-core/vcftools/main.nf similarity index 100% rename from modules/nf-core/modules/vcftools/main.nf rename to modules/nf-core/vcftools/main.nf diff --git a/modules/nf-core/modules/vcftools/meta.yml b/modules/nf-core/vcftools/meta.yml similarity index 100% rename from modules/nf-core/modules/vcftools/meta.yml rename to modules/nf-core/vcftools/meta.yml diff --git a/modules/nf-core/modules/vcftools/vcf_diff.nf b/modules/nf-core/vcftools/vcf_diff.nf similarity index 100% rename from modules/nf-core/modules/vcftools/vcf_diff.nf rename to modules/nf-core/vcftools/vcf_diff.nf diff --git a/subworkflows/local/denovo.nf b/subworkflows/local/denovo.nf index 6481a9b..e396d35 100755 --- a/subworkflows/local/denovo.nf +++ b/subworkflows/local/denovo.nf @@ -1,5 +1,6 @@ include { SAMTOOLS_FLAGSTAT as SAMTOOLS_FLAGSTAT_DENOVO } from '../../modules/nf-core/modules/samtools/flagstat/main.denovo' include { UNICYCLER } from '../../modules/nf-core/modules/unicycler/main' +include { BANDAGE } from '../../modules/nf-core/modules/bandage/image/main' include { GRAPH_RECON } from '../../modules/local/graph_reconstruct' include { BWA_MEM as BWA_MEM_DENOVO } from '../../modules/nf-core/modules/bwa/mem/main_denovo' include { PUBLISH_CONTIGS } from '../../modules/local/publish_contigs.nf' @@ -26,6 +27,13 @@ workflow DENOVO { ch_versions = ch_versions.mix(UNICYCLER.out.versions) ch_gfa = UNICYCLER.out.gfa + // + // Module: Publish Bandage PNG Plot + // + BANDAGE ( + ch_gfa, + ) + // // Module: Genome Reconstruction from Unicycler GFA // From 9efc3bb3d6ed33bf5d2470145c819da4eba2125e Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Wed, 4 Sep 2024 15:41:10 -0400 Subject: [PATCH 10/42] updated nf-core module paths --- subworkflows/local/denovo.nf | 14 +++++++------- subworkflows/local/filter_variants.nf | 2 -- subworkflows/local/ref_based.nf | 14 +++++++------- 3 files changed, 14 insertions(+), 16 deletions(-) delete mode 100755 subworkflows/local/filter_variants.nf diff --git a/subworkflows/local/denovo.nf b/subworkflows/local/denovo.nf index e396d35..3489cc7 100755 --- a/subworkflows/local/denovo.nf +++ b/subworkflows/local/denovo.nf @@ -1,12 +1,12 @@ -include { SAMTOOLS_FLAGSTAT as SAMTOOLS_FLAGSTAT_DENOVO } from '../../modules/nf-core/modules/samtools/flagstat/main.denovo' -include { UNICYCLER } from '../../modules/nf-core/modules/unicycler/main' -include { BANDAGE } from '../../modules/nf-core/modules/bandage/image/main' +include { SAMTOOLS_FLAGSTAT as SAMTOOLS_FLAGSTAT_DENOVO } from '../../modules/nf-core/samtools/flagstat/main.denovo' +include { UNICYCLER } from '../../modules/nf-core/unicycler/main' +include { BANDAGE } from '../../modules/nf-core/bandage/image/main' include { GRAPH_RECON } from '../../modules/local/graph_reconstruct' -include { BWA_MEM as BWA_MEM_DENOVO } from '../../modules/nf-core/modules/bwa/mem/main_denovo' +include { BWA_MEM as BWA_MEM_DENOVO } from '../../modules/nf-core/bwa/mem/main_denovo' include { PUBLISH_CONTIGS } from '../../modules/local/publish_contigs.nf' -include { MUMMER } from '../../modules/nf-core/modules/mummer/main' -include { QUAST } from '../../modules/nf-core/modules/quast/main' -include { IVAR_CONSENSUS as IVAR_CONSENSUS_POLISH } from '../../modules/nf-core/modules/ivar/consensus/main_denovo' +include { MUMMER } from '../../modules/nf-core/mummer/main' +include { QUAST } from '../../modules/nf-core/quast/main' +include { IVAR_CONSENSUS as IVAR_CONSENSUS_POLISH } from '../../modules/nf-core/ivar/consensus/main_denovo' workflow DENOVO { diff --git a/subworkflows/local/filter_variants.nf b/subworkflows/local/filter_variants.nf deleted file mode 100755 index 76e579a..0000000 --- a/subworkflows/local/filter_variants.nf +++ /dev/null @@ -1,2 +0,0 @@ -test - diff --git a/subworkflows/local/ref_based.nf b/subworkflows/local/ref_based.nf index edb63ec..c750ba2 100755 --- a/subworkflows/local/ref_based.nf +++ b/subworkflows/local/ref_based.nf @@ -1,11 +1,11 @@ -include { BWA_MEM } from '../../modules/nf-core/modules/bwa/mem/main' -include { IVAR_CONSENSUS as IVAR_CONSENSUS_BWA } from '../../modules/nf-core/modules/ivar/consensus/main' -include { IVAR_VARIANTS } from '../../modules/nf-core/modules/ivar/variants/main' +include { BWA_MEM } from '../../modules/nf-core/bwa/mem/main' +include { IVAR_CONSENSUS as IVAR_CONSENSUS_BWA } from '../../modules/nf-core/ivar/consensus/main' +include { IVAR_VARIANTS } from '../../modules/nf-core/ivar/variants/main' include { VARIANT_CONVERT } from '../../modules/local/variant_convert.nf' -include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' -include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/modules/samtools/flagstat/main' -include { SAMTOOLS_DEPTH } from '../../modules/nf-core/modules/samtools/depth/main' -include { VCFTOOLS as VCFTOOLS_IVAR } from '../../modules/nf-core/modules/vcftools/main' +include { SAMTOOLS_SORT } from '../../modules/nf-core/samtools/sort/main' +include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/samtools/flagstat/main' +include { SAMTOOLS_DEPTH } from '../../modules/nf-core/samtools/depth/main' +include { VCFTOOLS as VCFTOOLS_IVAR } from '../../modules/nf-core/vcftools/main' include { SUMMARIZE_TSV } from '../../modules/local/summarize_tsv.nf' include { AGGREGATE_TSVS } from '../../modules/local/aggregate_tsvs.nf' From 628913415dc3d2aaf00724f44f618903baf671d9 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Wed, 4 Sep 2024 16:16:50 -0400 Subject: [PATCH 11/42] fixed bandage name in main.nf --- modules/nf-core/bandage/image/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nf-core/bandage/image/main.nf b/modules/nf-core/bandage/image/main.nf index a25926e..b98a5e5 100644 --- a/modules/nf-core/bandage/image/main.nf +++ b/modules/nf-core/bandage/image/main.nf @@ -1,4 +1,4 @@ -process BANDAGE_IMAGE { +process BANDAGE { tag "${meta.id}" label 'process_low' From 168e2b16d537ee45e94b476053bf992add2e6008 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Wed, 4 Sep 2024 16:33:36 -0400 Subject: [PATCH 12/42] fixed path to kraken2 modules --- subworkflows/local/filter_reads.nf | 6 +++--- subworkflows/local/prepare_genome.nf | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/filter_reads.nf b/subworkflows/local/filter_reads.nf index 7ff9c64..9504a33 100755 --- a/subworkflows/local/filter_reads.nf +++ b/subworkflows/local/filter_reads.nf @@ -14,9 +14,9 @@ // // MODULE: Installed directly from nf-core/modules // -include { KRAKEN2_KRAKEN2 as KRAKEN2 } from '../../modules/nf-core/modules/kraken2/kraken2/main' -include { FASTP } from '../../modules/nf-core/modules/fastp/main' -include { SEQTK_SUBSEQ } from '../../modules/nf-core/modules/seqtk/subseq/main' +include { KRAKEN2_KRAKEN2 as KRAKEN2 } from '../../modules/nf-core/kraken2/main' +include { FASTP } from '../../modules/nf-core/fastp/main' +include { SEQTK_SUBSEQ } from '../../modules/nf-core/seqtk/subseq/main' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index b85169c..984d449 100755 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -2,7 +2,7 @@ // Generate reference genome related files for analysis // -include { BWA_INDEX } from '../../modules/nf-core/modules/bwa/index/main' +include { BWA_INDEX } from '../../modules/nf-core/bwa/index/main' workflow PREPARE_GENOME { main: From 95648782817fa562f7875b013ef924626340f34d Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Wed, 4 Sep 2024 17:11:28 -0400 Subject: [PATCH 13/42] fixed kraken2 module path --- modules/nf-core/kraken2/{kraken2 => }/main.nf | 0 modules/nf-core/kraken2/{kraken2 => }/meta.yml | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename modules/nf-core/kraken2/{kraken2 => }/main.nf (100%) rename modules/nf-core/kraken2/{kraken2 => }/meta.yml (100%) diff --git a/modules/nf-core/kraken2/kraken2/main.nf b/modules/nf-core/kraken2/main.nf similarity index 100% rename from modules/nf-core/kraken2/kraken2/main.nf rename to modules/nf-core/kraken2/main.nf diff --git a/modules/nf-core/kraken2/kraken2/meta.yml b/modules/nf-core/kraken2/meta.yml similarity index 100% rename from modules/nf-core/kraken2/kraken2/meta.yml rename to modules/nf-core/kraken2/meta.yml From ee7d2b4ba9d99882020f158156f56d6ec3cf6245 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Wed, 4 Sep 2024 17:12:21 -0400 Subject: [PATCH 14/42] fixed path in main workflow --- workflows/polkapox.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflows/polkapox.nf b/workflows/polkapox.nf index f9bb208..58b2d6b 100755 --- a/workflows/polkapox.nf +++ b/workflows/polkapox.nf @@ -56,9 +56,9 @@ include { REFBASED } from '../subworkflows/local/ref_based' // // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/modules/fastqc/main' -include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' +include { FASTQC } from '../modules/nf-core/fastqc/main' +include { MULTIQC } from '../modules/nf-core/multiqc/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' include { SUMMARIZE_QC } from '../modules/local/summarize_qc' /* From 81d1264bfb268fe16facf650a3f00709a073b0df Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Wed, 4 Sep 2024 17:26:19 -0400 Subject: [PATCH 15/42] added bandaged publish dir --- conf/modules.config | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index 4e6844b..98f0516 100755 --- a/conf/modules.config +++ b/conf/modules.config @@ -143,6 +143,14 @@ process { ] } + withName: BANDAGE { + publishDir = [ + path: { "${params.outdir}/bandage" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: PUBLISH_CONTIGS { publishDir = [ path: { "${params.outdir}/final_assembly" }, From 1e82fc9d6e8a8561193b603dd3a4d19b629e91a6 Mon Sep 17 00:00:00 2001 From: ufp0 Date: Mon, 9 Sep 2024 09:51:59 -0400 Subject: [PATCH 16/42] added clade I reference to assets --- assets/NC_003310_clade_I.fasta | 2815 ++++++++++++++++++++++++++++ assets/NC_003310_clade_I.fasta.fai | 1 + 2 files changed, 2816 insertions(+) create mode 100644 assets/NC_003310_clade_I.fasta create mode 100644 assets/NC_003310_clade_I.fasta.fai diff --git a/assets/NC_003310_clade_I.fasta b/assets/NC_003310_clade_I.fasta new file mode 100644 index 0000000..3bb1132 --- /dev/null +++ b/assets/NC_003310_clade_I.fasta @@ -0,0 +1,2815 @@ +>NC_003310.1 Monkeypox virus, complete genome +GTTAGTAAATTATATACATAATTTTATAATTAATTTAATTTTACTATTTTATTTAGTGTCTAGAAAAAAA +TGTGTGACCCACGACCGTAGGAAACTCTAGAGGGTAAGAAAAATCAATCGTTTATAGAGACCATCAGAAA +GAGGTTTAATATTTTTGTGAGACCCATCGAAGAGAGAAAGGATAAAAACTTTTTACGACTCCATCAGAAA +GAGGTTTAATATTTTTGTGAGACCCATCGACGAGAGAAAGAGATGGTTAGTCAAGATATTTTTCTTAGTA +CAAAAGTCAATGTTTTAAAATATATGGACGAGAATTAATTTGTCTGTATAAAAACTTGTGTGAAATTATG +TACTAGAGAAAAAACGTGAGCAGTGTCCCCTACATGGATTTTACAGATCATTTATATTCCAAAAATATTA +ACTATATACGTTTATTATATGATGTTAACGTGTAAATTATAAACATTATTTTATGATGCAATTGTCTGAC +AACCTAGATTGGCATAAGGATATTGATAAGCTCTACGAGAATATATTGTTGGACGTTATCGTTTACGAAA +TAGTTGAGACATCAGAAAGAGGTTTAATATTTTTGTGAGACCATCGAAGAGAGAAAGAGAATAAAAATAT +TTTTTTGTAAAACTTTTTATGAGACAAGAGAGAAAGAGAATACGAATAGTGATCATATCGTATCACATAT +TGAAACAGAAAGAAGAAGTAACGAGAGGTAACTTTTTGTGAATGTAGTTAAACATTTTTGTTTTGCAAAC +CGGAATATAGTACCCGGTACACTTTTTTAATTCGTGGTGCGGTGTCTGAATCGTTCGATTAACCCAACTC +ATCCATTTTCAGATGAATAGAGTTATCGATTCAGACACATGCTTTGAGTTTTGTTGAATCGATGAGTGAA +GTATCATCGGTTGCACCTTCAGATGCCGATCCGTCGACATACTTGAATCCATCCTTGACTTCAAGTTCAG +ATGATTCCTCACACATGTCTCCGATACGTACGCTAAACTCTAGGTTCTTAACACATTTTGTATCAACGAT +CGTTGAACCGATGATATCTTTGTAACTCACTTTCTTATGTGAGATGTTAGACCCAAGTACTGGATGGGTC +TTGATGTCGCTGTCTTTCTCTTCTTCGCTACATCTGATGTCGATAGACATCTCACAGTCTTTGATCATAG +CCAGAGCTTCTTCACGCGTGATCGCGGGAGAGTCCTTACCTTGTCCTGGTGACACGCTGGACAATCTAGT +ATTCACAGTGTTTCCATCAGAGGATTCGGAGATGGATGAAATCTTTGGGCATTTGGTGAATCCAAAGTTC +ATGTTAAGACCCGCGCCGACGATAGTGTAATAAGTGGTGGGATCTCCTTTTACAACTTCTTCGGATACCT +CATCATCTTCGGTCTCTGTAACTTCCGTTACGGATTGACAAATCTTATCATTGGTCGGTGTTTGGTCTTG +CTTTGTGACTTTGATAATAACATCGATTCCCATATGATGTTTGTTTTCTTCTTCAGTACACGAGGATGAG +GATTGTTGAAGACTAGTAGGCATAGCAGCTGCCACTAGGCACATGCATGCCAGGACAATATATTGTTTCA +TGATTGCTATTGATTGATTACTGTTCTAGATGATTCTACTTTCTTACCATATAATAAATTAGAATATATT +TTCTACTTTTACGAGAAATTAATTATTGTATTTATTATTTATGGGTAAAAAAAAACTTACTATAAGTGGG +TGGGATTCTGGGAATTAGTGATCAGTTTATGTATATCGCAACTAGCGGGCATATGGCTATTGACATCGAG +AACATTACCCATATGATAAGAGATTGTATCCGTTTCGTAGTCTTGAGTATTGGTATTACTATATAGTATG +TAGATGTCGACGCTAGATAGACAGTCGCCCACTAGAGTTACCGTCTCTGAATGCGGCATGATAGTATCAT +TCTTTGTTTTCGTTAACTGTTTGGAAGATGAATCTTTGTTGTTACATTTAATCTCGAAATTCAGAGTACA +TATCTTTGAAGTATTCTGATATCTATTTTCTCCTGTAAAGAATCCTGAAGTTGCTACATTATTAAGGACA +GAGAAGTATTCTGCACGAAAGACGGGATCACAATCTTTATGATTCATGGTAATAGTTAGTTCCGACGTTG +AGATGGATTCGCTGAGACCGGTAGTGGTCGTCCGAGTACACGATGTGTCGTTGACTGGATACAGGTTAAT +TTCCACATCGATATAGTTAAATGTATTGCTGGTTACGGGTTCGCATTTATCTGTGGAAGAGACGGTGTGA +GAATATGTTCCGGGACCACACGGAGAACAGATGACGTCTCCGGTAGACGTGTATCCGGATACTCCGTATC +CTATTCCACACTTTGTTTTAGAAATACATGTTCTACACCCTGATGATCCTTTGAGAAGACAATAATATCC +TGGAGAGCATTCACAGATTCTATTGTGAGTCGTGTTACACGATCGCGTCTCTACCTGATTACTATCACAT +CTTCCGTTACAACTTAGACAAGCCTGTAAATGATTATTGTGAGATGTAAAGGTATCCGAACCACACGGCG +TACATTGTGTATTAGTCTTGCTATCACATAATCTGGAAGCGTAAGTTCCCGGAGGACACGATAGACAACA +TAGATTACGGCTTCTGTATTCGTTGTCTTTACATTTTCCATTGGATGGTGCATGTGGTGCTAAATCTCTT +CCGTTTATTATTATACATGAGAGAAACAATATATACGAGTATAATACGGACCTCATGATTTAATAATAGT +AGTAATCGTCGTCTTGTTACTGTTTGTTTCCTACTTCTCCAATCATATAGATTATTTTTTAAATATTTTC +TTTCTATCATGGATAATATTTGTAATGGTTCTTTCCGTACAACATACTGTTTAGATGGTAGTCGCTTAGC +TTGGTTATGATATTGCGCATAATTTCCGGAGGCAAATACGATAGTCTAGATTGACTATCGATGGTAGACT +CTAATTTATTGAGTGCTTTGTCGACGAGTTTACTTTTATGCTCCATCGATAGATGACACTGTTCTATGAG +ATCGTCGTACATGGGAAATGAAATGCGTTTGTCTGAATGTATGGCTTCGAGATAGGTGTGATACCGGATG +TCTTCTGTTCTCAATACCGTATACAAGTTGGTGTCTGAGATTCGAATCTCTTTGAGGAGACTTATGTCAC +GACTACATTTTTCGATGATGGAATCTATCTTATCGAATGATATATTTTTCATAAATACACTTTTATAGTC +CTCGTTTAAACAGAATTTAGTATGTAGTTCCGCAAATGACTCGTCCCTTAATAGGCAGTAGGCTATTATC +TTCTTTACGTAGTGATCGTCGTAGGGAGAGAACTCCGACATCTTGTAGAACAACGATTTAATCATAGGTA +GAGATACTTTCAGTCTGTGGTGGATGATGTCATTAACGACATCCGCCTTGTATATGATGTTTCTGTTTTC +AAACACCAAGTCGAATACTGTCTTATCGTCTTTAGTCGGAAGGTTGATGTCGTATCCGATGTATACGAGG +TATGAGGCAACATTGTTATTGCAATTCTGGAAGGCGGTATGAAGAGGAGTCATTGTATTATAGTATTCGT +CTTTCTGAATGTCGAATCTATCTAGTAGATACCGTAGTATATTGAGAGAGCGACTTCCATATCCTTGATT +ATGTTTTATGAATAGATAAAGTAGATGTTGTCCTTCTTCCTTTTGTAATTTCCCGTATTTTTGTTCGTGC +CAATTGAGTAACATTATGAGAATATGACCTGTTGCACAATCGTTCTTTATGTATTCCATGATGGGTGTAC +AATCAAGATTATTACGTATCCTCGTATCGGCTCCTCGAGATAAAAGAGCATACACCACACGAGGACTATG +TTTGGTATACTGTTGAAGGTAAGTGTGTAACGGCGTATTTCCGATTTTCGTAACCGCGTTAATGTTTGCT +CCATGATCTATTATCGCGTAGATGAATCGCTTCTCAGCTCGCATCTTAGTGTGACTCTTTGACTTGTAAT +AATTGCTTTCGTGGAACACGGATATGTGTTTACAGTAGTAATGAAGAGAAGTGAGTCCATCCTCATCGAC +GCAATTAGGGTCAGATCCTTTAGTCAATAATTTGTACAGAACGTAATAGTTTAAGCTCCCATTGAATTTA +TATCTAAGATAACACAGCAATAGATCGGATGATTTACTAAAGTCATCAATGGGGTCCGTTAGTATATCAA +AGATCTTGTTATCGATTGATAGTGAATGAATCAGATAGTGGTGTAGAGGAATATGTCCTTTTTTATCCTT +GCTATCAAAGTTACGCATGCCGTGGCGTAACAATATCTTTAATACAGATGGATTAAATCGTGTATTCATC +GTATAGCAATGTAATGGAGAGTTACCACATTTTAGTCGTTTATTCAGATCGCAGTGTTTAATAACTAATT +TAAACAGATGAGATGATATATCCACATCAAAGAATGCGAGATACATATGACAGACATTATTGACAGAAAT +GTGACCTTCATTATCACCGTCGTCCATAAATGCGTTAGGTACGTACCACATACTATCGTTAACGATGCGC +ACAATCTCGTCCATTTTCATCCATCTTCATAATGATTTACTTTTTCATAATTAGAGAAAAAGATCAAGGT +ATAAAAATTAGAAGTGTTAGACTATAAACTAACTTATAAAACTAACTTATGACTTAACTAACTTATGACT +ATTAACTCATTTCAAGAAAGGTGGGTGGAGAGAACTCTATATGACAGCTTGTGAAACAATTAGATCCCTA +ATTTCTAATGGAAGTTTTGATAGGAGATTGTCATCAGTTGATACATTGTTTATTATCTCATCTATTAGAG +CACGTCTGTTTAGAGCTTTAGTGACCTGCTCGGTTACTTCTGTGTAAATCTTGAATCCTTTAGTGATACA +CTGTGTCAAAACTGGATGTTTAGAATACCTATGTAGAATATGGGAAGCATGCTTGTTTTTGTCTCTATTA +TAGATTAACTCATACATGGTTGTATTATGAATTTTCATCTGCCTAATGTACTCCAATTCTTGTTTACAAT +CAATTATATAATCAAAGAGTGATGATGCATACACATTACAAAGTGAATAATCTACCATCATAAAATACTT +GATACAGAGCTTTATCACATCATGGTTTTCAATTGTATTATTAAGTATAGCTAATTTTATACAGTCAATA +GACAATGGTTCTCTAAGCAATATTTCTAATATTTTAAGATGTGTTTCCCTACGGGCGATGACAGATCCCC +TATCCACGGCCACGTCAAGACATGTATATCCATTACTCATTACTGCGTTGACATTTGCTCCATTTTCTAA +TAGCCATGATACTAAATCTATATAACCTGCATAGATAGCGCGATAAAGCAAGGTCCTTCCACCAGCATCT +AGTTGATTGATATCTTCAATATATGGGATACAAAGCTTATAAATTTCTAATACTGTGGGTTCATCTACAA +GGAATCCCCTAGTATACTGAATTATTTTATATAGATCTAATTTAACATCATTTTCATCTGGGATACCACA +ATTCAAAATAAACTCAACAACACTACTTTCCTTTTTACATATTCCCCTAAAATAGGCATTCAAGCATTCT +ATTTTATATATTACAGCCCCATGATCTACCATAAAATCAACAATGTCTATTTCTACATATGCATTAGATA +GATAGTAAAGTAAGAGATCTTGTACAGAATTACAATTCTTAATAATTATAGAGAAAATATCTTCCATATA +ATTCTTTGACACTAATGCAGATATAATATCTTTATATGTAATATATGCAAACAGTCTATCTACTATATAC +TGATCAATATTATCTCTATGAATCCTAAAATAATCATACAGAACATCTACAGGATCACAAATTGGTTCAA +GGAGAAATCTATCAAATATTTTCCTGTCAACAACTGGTTCTAGAACATAACAGTCAACACCTAATCCATG +TTTTTTATAGTCATCTACCAAAGATAATGACCAAAGATCGAGGTCGTCGTGAAACTGCTCATCGACAGCC +ATGAAATCTGCCGACTCCATGGCGCGAATCGCACTGTCTTATTCGCCATTGATTTTCATTTTTTATAATT +ATGTACATGTTTTCCTTCTATTCTCAAGAGTCTACAAAAATATATTTTTTTTCGATATCTAAGTACTAAG +TTTTTTTACTGTTTTTGTTACTGTCTTCCATTCTTCTAACTAAAGATCTGAGATAAATTATACAATCTTC +GCTATCGAACCATTTTTGTAGTCTAAAGCCTGAAGTAATTAACCAACTGTTTTTATTAGTGGCTTTTTTC +GATCTATCCTCGTCCTCATCATCCTTATATTATTATCATTATTATCATAGTCTATTAAACACAAATCATC +TACGTTTATAACAACATTCTCATTATTAATTAGTTCTGTAGTAATATCTTTAATAATTTGGCTATACATC +TGTTCAATACTATCTATTGATGATTTCTTTTTTAAGACTTAAACTAGTTATGGTAATGACGATGAAATCG +AGTAGTAACTTCTAATAAAGACTTGATATCATTATCATATGTTTGATCGTCATAGTTAATAGTGTGGCTA +AATGGTACTGTTAATAAGTTTATAGACAATATCATAGTATTTTCTTTCCAGAATTAGATTATTTTTTTAA +ATACTGATCCTCACAATTCCGTGATGTAGCAGTAGTTGGTGCATGGTCTATATCGTTAAAATGTATCATA +TATAATAGTTTTCTGACGTGGAGTACAGAATTTTCGATTAATGAGTTCATGGTAAGGAAGGGCAAATGTC +TGTATATAATATACATAAGTTAATAGTTTTTTATCATATTTTCTAATACCATAATAAAAATTATCATTAT +GTATAATCATCACTGTCGCTATCATTATTGCGTTTGTGTAGTTCTGCCCTATCATCTACATCACTGTCAC +TCTCACTATATCTTCTAAAATTACAAACAACTGGATATTCGATAACAGCATTTGTGTAGTTTTTGTCTTT +TACAGTATATACGTTATTGTCAAAATCTAAACAAATATTAGCATAATACATCTATAAGATCAGGATCCAT +GTTCGAGCATACTAGCCATGTATATTTGTAACTTCGTCATACAGCGTTAGATCAATAGAATAAACAATCG +TGTGACGCAACTTTTTTACGATCTAGTTGTATGAGTTTATCGTTTACATAAGCAATTAACGGCTTTAACA +GATGATCTGAGTAATAATATACCTCTGTTATACGTTTAATGTTCACGGTCTTAGTATTTTTAGATATCAA +TTGTGATTTACACCATATTCGACTCCCTGTGTGCAACGTTAGAAATTCTAAATCTATAGTATTATCTATT +ACAGCGTAAAACACATTCAATATTGTATTGTTATTTTTATATTATTTACACAATTAACAATGTATTATTA +GTTTATATTACTGAATTAATAATATAAAATTCCCAATCTTGTCATAAACACAAAATCCATTAAAAATGTC +GATAAAATATCTGATGTTGTTGTTCGCTGCTATGATAATCAGATCATTAGCCGATAGTGGTAACGCTATC +GAAACAACATCGCCAGAAATTACAAACGCTACAACAGATATTCCAGCTATCAGATTATGTGGTCCAGAGG +GAGATGGATATTGTTTACACGGTGACTGTATCCACGCTAGAGATATCGACGGTATGTATTGTAGATGCTC +TCATGGTTATACAGGCATTAGATGTCAGCATGTAGTATTAGTAGACTATCAACGTTCAGGAAAACCAGAC +ACTACAACATCATATATCCCATCTCTAGGTATTGTGCTTGTATTAGTAGGCATTATTATTACGTGTTGTC +TATTATCTGTTTATAGGTTCACTCGAAGAACTAAACTACCTATACAAGATATGGTTGTGTTATATTTTTT +ATAAAATTTTTTTATGAGTATTTTTACAAAAATGTATATGTATAAAAAAATACTAAGTATGCGATGTATC +CTGTATTATTTGTATTTATCTAAACAATACTTCTGCCTCTAGATGGGATACAAAAATTTTTTATTTCAGC +ATATTAAAGTAAAATCTAGTTACCTTGAAAATGAATACAGTGGGTGGTTCCGTATCACCAGTAAGAACAT +AATAGTCGAATACAGTATCCGATTGAGATTTTGCATACAATACTAGTCTAGAAAGAAATTTATAATCATC +TTCTGTGACAGGAGTCCATATATCTGTATCATCGTCTAGTTTATCAGTGTCCTATGATATATTCCTGTTA +TCATCATTAGTTAATGAAAATAACTCTCGTGCTTCAGAAAAGTCAAATATTGTATCCATACATCTCCAAA +ACTATCACTTATACGTTTATCTTTAACGAACATATACCTGATGGTTATTTACTAACAGACATTTTTCAAG +ATCTATTGACAATAACTCCTATAGTTTCCACATCAACCAAGTAATGATCATCTATTGTTATATAACAATA +ACATAACTCTTTTCCATTTTTATCAGTATATATATATATATATATATATCAACGTCGTTGTAGTGAATAG +TAGTCATTGATCTATTATATGAAACGGATATGTCTAGTTAATATTTTCTTTGATTTAAAGTCTAGAGTCT +TTACAAACATAATATCCTTATCCGACTTTATATTTCCTGTAGGGTGGCATAATTTTATTCTGCCTCCACA +ATCAGTGTTTCCAAATATATTACTAGACAATATTCCATATGGTTATTAGTTAAGGGACCCGATTAGAACA +CGTACGCGCTTATTCATCATTTGGATCGTATTTCATAAAAGTTATTATGTTATCGATGTCAACACATTCT +ACATTTTTTAATCGTCTATATAGTATTTTTCTGATATTTTCTATAATATCAGAATTGTCTTCCATAGGAA +GTTGTATACTATCGGAATCAGTTACATGTTTAAATAATTCTCTGATGTCATTCCTTATACAATCAAATTC +ATTATTAAACAGTTTAATAGTCTGTAGACCTTTATCGTCGTACATATCCATTGTCTTATTAGTTACGCTT +ATTTTTATGGGTTTTACATTGCTTTATTATATTTTATAAGAATGATTGTTTGACAATGTCGTAGTATAGA +TATATTATTAGAGGAGGTATAATTATAAAAAGTTTCTGAGTACGATGTTATAAGAGGAGAGGACACATTA +ACAATCATACATCAATTAACTCATTCTTATAACATTGTAATCAAAAGAATTGCAATTTTGATGTATAACA +ACTGTCAATGGAATTGTATATTACAAATTACGGTATGTTGTAACGACAAATACCGATCGGTAATTGTCTC +TGTCGCTGTAATAGAATTAATTATATATCTATTACACCGACCTTGTATCATAATAAAGTTGTGGTAGTAT +GATCTCCATATTTATAATTTAGTACTTTGTATTTAGTATTTTTGGAATCATAAAAAAGTTTTACTAATTT +AAAATTTAAAAAGTATTTACATTTTTTTCACTGTTTAGTCGCGGATATGGAATTCGATCCTGTCAAAATC +AATACATCATCTATAGATCATGTAACAATATTACAATACATAGATGAACCAAATGATATAAGACTAACAG +TATGCATTATCCGAAATATTAATAACATTACATATTATATCAATATCACAAAAATAAATCCACATTTGGC +TAATCGATTTCGGGCTTGGAAAAAACGTATCGCCGGAAGGGACTATATGACTAACTTATCTAGAGATACA +GGAATACAACAATCAAAACTTACTGAAACTATACGTAACTGTCAAAAAAATAAAAACATATATGGTCTAT +ATATACACTACAATTTAGTTATTAATGTGGTTATTGATTGGATAACCGATGTGATTGTTCAATCAATATT +AAGAGGGTTGGTAAATTGGTACATAGCTAATAATACATATACTCCAAATACACCCAATAATACTACAACC +ATTTCTGAGTTGGATATCATCAAAATACTGGATAAATACGAGGACATGTATAGAGTAAGTAAAGAAAAAG +AATGTGGAATTTGCTATGAAGTTGTTTACTCAAAACGATTAGAAAACGATAGATACTTTGGTTTATTGGA +TTCGTGTAATCATATATTTTGCATAACATGTATCAATATATGGCATAGAACACGAAGAGAAACCGGTGCG +TTAGATAATTGTCCTATATGCCGTACCCGTTTTAGAAAAATAACAATGAGCAAGTTCTATAAGCTAGTTA +ACTAATAAATAAAAAGTTTAATTATCGACGATATATGTCGTTATTTTTCTCTCATATGAAAGATTAATTT +GATTCTAATATAATCTTCAGTATTGGATGAATCTCAATTCAAATTAATTCCATTAGATTAGATTAGATTA +GATTAGATTAGATTAGATTAGATTAGATTAGATTAGATTAGATTAGATTAGATTAGATTAGATTAGATCA +TAAATAAAAATAGTAGCACGCACTACTTCAGCCAAATATTCTTTTTTGAAACGCCATCTAGCGTAATGAG +AACACAAGTGAACCTATAATGAGCAAATTTATTAGTATCGGTTACATGAAGGACTTTACGTAGAGTGGTG +ATTCCTCCATCTGTGGTACGAACGGTTTCATCTTCTTTGATGCCATCACCCAGATGTTCTATAAACTTGG +TATCCTCGTCCGATTTCATATCATTTGCCAACCAATACATATAGCTAAACCCAGGCATACGTTCCACACA +TCCGGAACAATGAAATTCTCCAGAAGATGTTACAATGGCTAGATTTGGACATTTGGTTTCAACCGCGTTA +ACATATGAGTGAACACACCCATACATGAAAGCGATGAGAAATAGGATTCTCATCTTGCCAAAATATCACT +ATAAAAAATTTATTTATCAATTTTAAAGGTATAAAAAAATACTTATTGTTGCTCGAATATTTTGTATTTG +ATGGTATACGGAAGATTAGAAATGTAGGTATTATCATCAACTGATTCTATGATGGTTTTATGAATTTTAT +TATGCTTCACTATTGCATCGGAAATAATATCATATGCTTCCACGTATATTTTATTTTGTTTTGACTCATA +ATACGCACGTATTTCTGGATTATTGGCATATCGATGAATAATTTTAGCTCCATGCTCAGTAAATATTAAT +GAGAACATAGTGTTGCCTCCTACCATTATTTTTTTCATCTCATTCAATTCTTGATTGCAGAGATCTATAT +AATCATTATAGCGTTGACTTATGGACTCTGGAATCTTAGACGATGTACAGTCATCTATAATCATGGTATA +TTTAATACATTGTTTTATAGCATAGGCATTATCTACGATATTAGATACTTCACTCAATGAATCAATCACA +CAATCTAATGTAGGTTTATGACATAATAGCATTTTCAGCAGTTCAATGTTTCTAGATTCGTTGATGGCAA +TGGCTATACATGTATATCCGTTATTTGATCTAATGTTGACATCTGAACCGGATTCTAGCAGTAAAGATAC +TAGAGATTGTTTATTATATCTAACAGCCTTGTGAAGAAGTGTTTCTCCTCGTTTGTCAATCATGTTAATG +TCTTTAAGATAAGGTAGGCAAATGTTTATAGTACTAAGAATTGGGCAAGTATAAGACATGTCACAAAGAC +CCTTTTTGTATGTATAAGTGTAGAAATTATAACATCCATAGTTGGATTCACATAGGTGTCCAATCGGGAT +CTCTCCATCATCGAGATGATTGACGGCATCTCCCCCTTCCTTTTTTAGTAGATATTTCATCGTGTAAGAA +TCAATATTAATATTTCTAAAGTATCTGTGTATAGCCTCTTTATTTACCACAGCTCCATATTCCAACATGC +ATTCCACTAGAGGGATATCGATATCGCCGAATGTCATATACTCAATTAGTATATGTTGGAGGACATCCGA +GTTCATTGTTTTCAATATCAAAGAGATGGTTTCCTTATCATTTCTCCATAGTGGTACAATACTACGCATT +ATTCCGTGCGGCTTTCCATTCTCCAAAAACAATTTTACCAAATCTAAATCTACATCTTTATTGTATCTAT +AATCACTATTTAGATAATCAGCCATAATTCCTCGAGTGCAACATGTTAGATCGTCTATATATAAATAAGC +CGTGTTATCTATTCCTTTCATTAACAATTTAACGATGTCTATATCTATATGAGATGACTTAATATAATAT +TGAAGAGCTGTACAATAGTTTTTATCTATAGAAGACGGCTTGATTCCGTGATTAATTAGACATTTAACAA +CTTCCGGACGCACATATGCTCTCGTATCCGACTCTGAATACAGATGAGAGATGATATACAGATGCAATAC +GGTACCGCAATTTCGTGGTTGATAATCATCATACGCGTATCCGTACTCGTCATCCTCATAAAGAACACTG +CAGCCATTTTCTATGAACAAATCAATAATTTCAGGAACAGGATCATCTGTCATTACATAATTTTCTATAA +CTGAACGATGGTTTTCACATTTAACACTCAAGTCAAATCCATGTTCTACCAACACCTTTATCAAGTCAAC +GTCTACATTTTTTGATTTAATATAGCTGAATATATTAAAGTCATTTATGTTGCTATATCCAGTAGCTTCT +AGTAGAGCCATCGCTATATCCTTATTGACTTTAACATGTCTACTATTTGTGTATTCTTCTATTGGGGTAA +ACTGTCTCCAATTTTTGTGTAATGGATTAGTGCCACTGTCTAGTAGTAGTTTGACGACCTCAACATTATT +ACAATGCTCATTGAAAAGGTATGCGTGTAAAGCATTATTCTTGAATTGGTTCCTGGTATCATTAGGATCT +CTGTCTCTCAACATCTGTTTAAGTTCATCGAGAACCACCTCCTCATTTTCCAGATAGTCAAACATTTTGA +CTGAATAGAAGTGAATGAGCTACTGTGAACTCTATACACCCGCACAACTAATGTCATTAAATATCATTTT +TGAATGTATTTATACCATGTCAAAAACTTGTACAATTATTAATAAAAATAATTAGTGTTTAAATTTTACC +AGTTCCAGATTTTACACCTCCGTTAACACCTCCATTAACCCCACTTTTTACACCACTGGACGATCCTCCT +CCCCACATTCCACTGCCACCAGATGTATAAGTTTTAGATCCTTTATTACTACCATCATGTCCATGGATAA +AGACACTCCACATGCCGCCACTACTACCCCCTTTAGAAGACATATTAATAAGACAAGTTTAACAATAAAA +TTAATCACGAGTACCCTACTCCAACCACTATTATATGATTATAGTTTCTATTTTTACAGTACCTTGACTA +AAGTCTCTAGTCACAAGATCAATACTACCAACCTACACTATATATGATTATAGTTTCTATTTTTATAGGA +ACGCGTACGAGAAAATCAAATGTCTAAGTTCTAACGGTAGTGTTGATAAACGATTGTTATCCGCGGATAC +CTCATCTATCATGTTGTCTATTTTCTTACTTTGTTCTATTAACCTATTAGCATTATATATTATTTGATTA +TAAAACTTATATTGCTTATTAGCCCAATCTGTAAATATCGGATTATTAACATATCGTTTCTTTGTAGGTT +TATTTAACTTGTACATCACTGTAAGCATGTCCGTACCATTTATTTTAATTTGACACATATCAGCAATTTC +TTTTTCGCAGTCGGTTATATATTCTATATAAGATGGATACGTATCACATATGTACTTATAGTCTACTAAT +ATGAAGTACTTAATACATATTTTCAGTAACGATTTAGCCTTATTACCTATTAATAAGTGCCTGTCGTTGG +ATAGGTAATCAACTGTTTTCTTAATACATTCGATGGTTGGTAATTTACTCAAAATAATTTCCAATATCTT +AATATATATTTCTGCTATTTCTGGTATACATGCATGTGCCATTATAACACAAATACCAATACATGTAGAC +CCATATGTTGTTGTTATATTAATATCTGCGCCATTATCTATTAACCATTCTACTAGTGCAACACTATGCG +ACTCGATACAATAATAAAGTATACTACGTCCATGTTTATCTATTTTGTTTATATCATCGATATACGGCTT +ACAAATTTTTAGTATCGATAACACTTCTGACTCGTGAATAAATAAGGTAGGGAATAACGGCATAATATTT +ATTATGTTATCATCATTAACAACTACGTTTCCATTTTTTAAAATATACTCTACAACTTTAGGATCCCTAT +TGTCAAATCTTTTAAAATATTTATTTATATGCTTAAATCTATATAATATAGCTCCTTCCCTAATCATACA +TTTGATAACATTGATGTACACTGTATGATAAGATACATATTCTGACAATAGATCTTGTATAGAATCTGTA +TATCTTTTAAGAATTGAGGATATTATGACATTATTACGTAAACTATTACACAATTCTAAAATATAAAACG +TATCATGGGCAGATAATAGTTTATCCACTATATAATTATCTATTTTATGATTTTTCTTCCTATATTGTTT +ACGTAAATAGATAGATAGAATATGCATTAGTTCATTACCGCTATAGTTACTATCGAATAACACGTCAAAT +ATTTCCCGTTTAATATCGCATTTGTCAACATAATAATAGAGTATGGTACGTTCACGATAAGTATAATGAC +ACATTTCGTTTTCGTGCGAAATTAAATAGTTTATCACGTCCAAAGATGTCACATAACCATCTTGTGACCT +AGTAATAATATAATAATAGAGAACTGTTTTACCCATTCTATTATCATAATCAGTGGTGTAGTCATAATCT +AAATAATCAAACTCGTCATCCCAATTAAAATAAATATAATCAGTACATTGAATGGGTATGATATTGTACC +CATACTGTATGTTGCTACATGTAGGTATTCCTTTATCCAATAATAGTTTAAATACATCTATATTAGGATT +TGATGTTGTCGCGTATTTCTCTACAATATTAATACCATTTTTGATACTATTTATTTCTATACCTTTCGAA +ATTAGTAATTTCAATAAGTCTATATCGATGTTATCAGAACATAGATATTCAAATATATCAAAATCATTGA +TATTTTTATAGTCGACTGACGACAATAACAAAATCACAACATCGTTTTTGATATTATTATTTTTTTTGGT +AACGTATGCCTTTAATGGAGTTTCACCATCATACTCATATAATGGATTTGCACCACTTTCTATTAATGAT +TGTGCAATACTGGCATCGATGTTAAATGTTTTACAACTATCATAGAGTATCTTATCGTTAACCATGATTG +GTTGTTGACGTTATCACATTTTTTGGTTTCTTTCATTTCAGTTATGTATGGATTTAGCACGTTTGGGAAG +CATGAGCTCATATGATTTCAGTACTGTAGTGTCAGTACTATTAGTTTCGATCAGATCAATGTCTAGATCT +ATAGAATCAAAACACGATAGGTCAGAAGATAATGAATATCTGTACGCTTCTTCTTGTACTGTAACTTCTG +GTTTTGTTAGATGGTTGCATCGTGCTTTAACGTCAATGGTACAAATTTTATCCTCGCTTTGTGTATCATA +TTCGTCTCTAGTATAAAATTCTATATTCAAATTATCATGCGATGTGTATACGCTAACGGTATCAATAAAC +GGAGCACAGCATTTAGTCAACAGTAATCCAAATTTTTTTAAAGTATATCTTAACGAAAGAAGTTGTCATC +GTTAGAGTGTGGTAAATCATTGTCTACGGTACTAGATCCTCATAAGTGTATATATCTAGAGTAATATTTA +ATTTATCAAATGGTTGATAATATGGATGTCGTGGCAATTTCCTAATACGGAAATAAGACATAAACACGCA +ATAAATCTAATTGCGGACATGTTACACTCCTTAAAAATACGAATAAAAACTTTGGCTTTTAGTAAGTGTC +ATTTAACACTATACTCATATTAATCCATGGACTCATAATCTCTATACGGGATTAACGGATGTTCTATATA +CGGGGATGAGTAGTTCTCTTCTTTAATTTTATACTTTTTACTAATCATATTTAGACTGATGTATGGGTAA +TAGTGTTTGAAGAGCTCGTTCTCATCATCAGAATAAATCAATATCTCTGTTTTTTTATTATACAGATGTA +TTACAGCCTCATATATTACGTAATATAACGTGTAATCTACCTTATTAACTTTCACCGCATAGTTGTTTGC +AAATACGGTTAATCCTTTGACCTCGTCGATTTCCGACCAATCTGGGCGTATAACGAATCTTAACTTTAAT +TTCTTGTAATCATTCGAAATAATTTTTAGTTTGCATCCGTAGTTATCTCCTCTATGTAACTGTAAATTTC +TCAACGCGATATCTCCATTAATAATGATGTCGAATTCGTGTTGTATACCCATACTGAATTGATGAACGAA +TACCGACGGTGTGTGTTAATAGTAATTTACTTTTCATCTTTACATACTTGGTAATAGTTTTACTATCATA +AGTTTATAAATTCCACAAGCTACTATGGAATATACCAACCATCTTAGTATAGAACACATGTCTTAAAGTT +ATTAATTAATTACATGTTGTTTTATATATCGCTACGAATTTAAACAGAGAAATCAGTTAGGAAGAAAAAA +TTATCTATCATCATCTATTGGATAACGTCTCTGTATTCTACGATAGAGTGCTATTTTAAGATGTGACAGA +TCCGTGTCATCAAATATATACTCCATTAAAATGATTATTCCGGCAGCGAACTTGATATTGGATACATCAC +GACCTTTGTTAATATCCACGACAATAGACAGCAATCCCATGGTTCCATAAACAGTGAGTTTATCTTTCTT +TGAAGTGATATTTTGTAGAGATCTTATAAAACTGTCGAATGACATCGTATTTATATCTTTAGCTAAATCA +TATATGTTACCATCATAATATCTAACAGCATCTATCTTAAACGTTTCCATCGCTGTAAAGACGTTTCCGA +TAGATGGTCTCGTTTCATCAGTCATACTGAGCCAACAAATGTAATCGTGTATAACATCTTTGATAGAATC +AGACTCTAAAGAAAAGGAATCGGCTTTATTATACACATTCATGATAAACTTAATGAAAAATGTTTTTCGT +TGTTTAAGTTGGATGAATAGTATGTCTTAATAATTGTTATTATTTCACTAATTAATATTTAGTAACGAGT +ACACTCTATAAAAACGAGAATGACATAACTAATCATAACTAGTTATCAAAGAATGTCTAGGACGCGTAAT +TTTTTATGGTATAGATCCTGTAAGCGTTGTCTGTATTCTGGAGCTATTTTCTCTATCGCATTAGTGAGTT +CAGAATATGTTATAAATTTAAATCGAATAACGAACATAACTTTAGTAAAGTCGTCTATATTAACTCTTTT +ATTTTCTAGCCATCGTAATACCATGTTTAAGATAGTATATTCTCTAGTTACTACGATCTCATCGTTGTCT +AGAATATCGCATACTGAATCTACATCCAATTTTAGAAATTGGTCTGTGTTACATATCTCTTCTATATTAT +TGTTGATATATTGTCGTAGAAAACTATTACGTAGACCATTTTCTTTATAAAACGAATATATAGTACTCCA +ATTATCTTTACCGATATATTTGCATACATAATCCATTCTCTCAATCACTACATCTTTAAGAGTTTGGTTG +TTAAGATATTTGGCTAAACTATATAATTCTATTAGATCATCAACAGAATCAGTATATATTTTTCTAGATC +CAAAGATGAACTCTTTGGCATCCTCTATAATATTATCAGAAAAGATATTTTCGTGTTTTAGTTTATCAAG +ATCTAACCTGTTCATATCCATGATTAACGACGTCATATAACCACATAAAATAAAAATCCATTTTCATTTT +TAGCACAATACTATTCATAATTGATATTGATGTAATATTTTGTTACTTTGAACGTAAAGACAGTACACGG +GTCCGTATCTCCAACAAGCACGTAGTAATCAAATTTGGTGTTGTTAAACTTCGCAATATTCATCAATTTA +GATAGAAACTTATACTCATCATCTGTTTTAGGAATCCATGTATTATTACTTTCCAACTTATCATTATCCC +AGGCTATGTTTCGCCCATCATCGTTGTACAGAGTGAATAATTCTTTTGTATTCGGTAGTTCAAATATATG +ATCCATGCATATATCGACAAAGCTATTGTAGATGTGATTTTTCCTAAATCTAATATAAAACTCGTTTACT +AGCAAACATTTTCCTGATTTATCGACCAAGACACACATGGTTTCTAAATCTATCAAGTGGTGGGGATCCA +TAGTTATAACGCAGTAACATAGATTATTACCTTCTTGACTGTCGCTAATATCTATATACTTATTGTTATC +GTATTGGATTCTACATATAGATGGCTTGTATATCAAAGATATAGAACACATAACCAATTTATATTCTCGC +TTTGTATTTTCGAATCTAAAGTTAAGAGATTTAGAAAACATTATATCCTCGGATGATGATATCACTGTTT +CCAGAGTAGGATATATTAAAGTCTTTAAAGATTTTGTCCGATTCAAATAAATCACTAAATAATATCCCAT +ATTATCATCTGTTATAGTCATGTCATTAAATCTATTATATTTTATGAAAGATATATCACTGCTCACCTCT +ATATTTCGTACATTTTTAAACTGTTTGTATAATATCTCTCTAATACAATCAGATATATCTATTGTGTCGG +TAGACGATACCGTTACATTTGAATTAATGGTGTTCCATTTTACAACTTTTAACAAGTTGACCAATTCATT +TCTAATAGTATCAAACTCTCCATGATTAAATATTTTAATAGTATCCATTTTATATCACTACGGACATAAA +CCATTGTATAATTTTTATGTTTATTAGTGTACACATTTTGGAAGTAAGTTCCGGCTGCCATGTATTTCCT +GGAGAGCAAGTAGATGATGAGGAACCAGATAGTTTATATCCATACTTGCACTTAAAGTCTACATTGTAGT +TGTATGAGAGTATGATCTTTTAAGCCGCTAGAAGTTTTCCGTTTGATATAGGATGTGGACATTTAACAAT +CTGACACGTGGGTGGATTGGACCATTCTCCTCCTGAACACATGACACCAGAGTTACCAATCAACGAATAT +CCACTATTGCAACTATAAGTTACAATGCTCCCATCGATATAAAAATCCTCGTATCCGTTATGTCTTCCGT +TGGATATAGATGGAGGTGATTGGCATTTAACAGATTCGCAAATAGGTGCCTCAGGATTCCATACCATAGA +TCCAGTAGATCCTAATTCACAATACGATTTAGATTCACCGATCAAATGATATCCGCTATTACAAGAGTAC +GTTATACTAGAGCCAAAGTCTACTCCGCCAATATCAAGTTGGCCATTATCGATATCTCGAGGCGATGGGC +ATCTCCGTTTAATACATTGATTAAAGAGTGTCCATCCGGTACCGGTACATTTAGCATATATGGGTCCCAT +TTTTTGCTTTCTGTATCCAGGTAGACATAGATATTCTATAGTGTCTCCTATGTTGTAATTAGCATCAGTC +TCTACACTATTCTTAAATTTCATATTAATGGGGCGTGACGGAATAGTACAGTATGATAGAACACATCCTA +TTCCCAACAATGTCAGGAACGTCACGCTCTCCACCTTCATATTTATTTATCCGTAAAATGTTATCCTGGA +CATCGTACAAATAATAAAAAGCCCATATATATGTTCGCTATTGTAGAAATTGTTTTTCACAGTTGCTCAA +AAACAATGGCAGTGACTTATGAGTTAGTTACACTTTGGAGTCTCATCTTTAGTAAACATATCATAATATT +CGATATTACGAGTTGACATATCGAACAAATTCCAAGTATTTGATTTTGGATAATATTCGTATTTTGCATC +TGCTATAATTAAGATATAATCACCACAAGAACACACGAACGTCTTTCCTACATGGTTAAAGTACATGTAC +AATTCTATCCATTTGTCTTCCTTAACTATATATTTGTATAGATAATTACGAGTCTCATGAGTAATTCCAG +TAATTGCATAGATGTCACCATCGTATTCTACAGCATAAACTATACTATGACGTCTAGGCATGGGAGACTT +TTTTATCCAACGATTTTTAGTGAAACATTCCACATCGTTTAATACTACATATTTCTCATAGTGGTATAAA +CTCCACCCATTACATATATATCATCGTTTACGAATACTGATGCGCCTGAATATCTAGGAGTGATTAAGTT +TGGAAGTCTTTTCCATTTCGAAGTGCCGTGTTTCAAATATTCTGCTATACCCGTTGAAATAGAAAATTCT +AATCCTCCTATTACATATAACTTTCCATCGTTAACACAAGTACTAACTTCTGATTTTAACGACGACATAT +TAGTAACCGTTTTCCATTTTTTTTGTTTTAAGATCTACCCGCGATACGGAATAAACATGTCTATTGTTAA +TCATGCCGCCAATAATGTATAGACAATTATGTAAAACATTTGCATCATAGAATTGTCTATCTGTATTACC +GACTATCGTCCAATATTCTGTTCTAGGAGAGTAATGGGTTATTGTGGATATATAATCAGAGTTTTTAATG +ACTACTATATTATGTTTTATACCATTTCGTGTCACAGCTTTGTAGATTTGGATATAGTTAATCCCAACAA +TGCTATAGCATTGCATATAGCATTAGTCATAAACTTGGGATGTAAAATGTTGATGATATCTACATCGTTT +GGATTTTTATGTATCCACTTTAATAATATTATAGCGTAACATCCTCATGATTTACGTTAACGTTTTCGTG +TGATAAGATAGTGGTCAGTTCATCCTTTGATAATTTTCCAAATTCTGGATCGGATGTCACCGCAGTAATA +TTGTTGATTATTTCTGACATCGACGCATTATATAGTTTTTTAATTCCATATCTTTTAGAAAAGTTAAACA +TCCTTATACAATTTGTGGAATTAATATTATGAATCATGGTTTTTACACATAGATCTACTACAGGCGGAAC +ATCAATTATTATGGCAGCGACTAGTATCATTTCTACATTGTTTATGGTGATGTTTATCTTCTTCCAGCGC +ATATAGTCTAATATCGATTCAAACGCGTGATAGTTTATACCATTCAATATAATCGCTTCATCCTTTAGAT +GGTGATCCTGAATGTGTTTAAAAAATTATACGGAGACGCCGTAATAATTTCCCCATTGATAGAAAATATC +ACGCGTTCCATTCTCTTGAAGTACTATAAGTAATTATAATATAATGTAAAGGTTTATATATTCAATATTT +TTTTTATAAAAAAAATCATTTCGACATTAATTCCTTTTTAAATTTCCGTCTATCATCTATAGAAACATAT +TCTATGAATTTATAAAATGCTTTTACGTATCCTATCGTAGGCGATAGAACCGCTAAAAAGCCTATCGAAT +TTCTACAAAAGAATCTGTTATATGGTATAGGGAGAGTATAAAACATTAAATGTCCGTACTTATTAAAGTA +TTCAGTAGCCAATCCTAACTCTTTCGAATAATTATTAATGGCTCTTATTCTGTACGAATCTATTTTTTTG +AACAATGGACCTAGTGGTATATCTTGTTCTATGTATCTAAAATAATGTCTGACTAGATCCGTTAGTTTAA +TATCCGCAGTCATCTTGTCTAGAATGGCAAATCTAACTGCGGGTTTAGGTGTAGGCGTTAGTTTAGTTTC +TATATCTACATCTATGTCTTTATCTAACACCAAAAATATAATAGCTAATATTTTATTACAATCATCCGGA +TATTCTTCTACGATCTCACTAACTAATGTTTCTTTGGTTATACTAGTATAGTCACGATCAGACAAATAAA +GAAAATCAGATGATCGATGAATAATACATTTAAATTCATCATCTGTAAGATTTTTGAGATGTCTCATTAA +AATATTATTAGTGTCAGTTCTCATTATCATATATTGACAGCAGCTATTACACTTATTTTATTTTTCTGTA +TTTTATTACTTTTCACCATATAGATCAGTCATTAGATCATCAAAATACTTTTCAATCATCCTAAAGAGTA +TGGTGAACGAATCTTCCCATCTAATTTCTGAACGTCTACCAATGTCTCTAGCCACTTTGGCACTAATAGC +GATCATTCGCTTAACATCTTCTACATTATTAACTGGTTGATTCAATCTATCTAGCAATGGACCGTCGGAT +AGCGTCATTCTCATGTTCTTAATCAATGTACATACATCGTCATCATCTACCAATTCATCAAACAATATAA +GCTTTTTAAAATCATCATTATAATAGGATGGATCGCCGTCATTTCTCCAAAGAATATATCTAATAAGTAG +AGTCCTCATGCTTAGTAATTTAACTATTTTAGTTAACAACTATTTTTTATGTTAAATCAATTAGTAACAC +CGCTATGTTTAATACTTATTCATATTTTAGTTTTAGGATCGAGAATCAATACAAAAATTAATACATCAAT +TTTGGAAATACTTAGTTTCCACGTAGTCAATGAAACATTTGAGCTCATCGTAAAGGACGTTCTCGTACAG +GACGTAACTATAAATTGGTTTATATTTGTTCAAGATAGATACAAATCCGATAACTTTTTTGACGAATTCT +ACGGGATTCACTTTAAAAGTGTCATACCGGGTTCTTTTTATTCTTTTAAACAGATCGATTGTGTGATGTT +GATTAGGTCTTTTACGAATTTGATACAGAATAGCGTTTACATATCCACCATAGTAATCAATAGCCATTTG +TTCGTATGTCATAAATTCTTTAATTATATGACACTGTGTATTATTTAGTTCGTCCTTGTTCATCATTAGG +AATCTATCCAATATGGCAATTATATTAGAACTATAACTGCGTTGTATGCGCATGTTGATGTGTCTGTTTA +TACAATCAATTATACTAGGATCCATACCACTACATTCGGGTAAAATTGTAGCATCATATACCATTTCTAG +TACTTTAGGTTCATTGTTATCCATTGCAGAGGACGTCATGATCGAATCCAAAAAAATATATTATTTTTAT +GTTATTTTGTTAAAAATAATCATCAAATACTTCGTAAGATACTCCTTCATGAACATAATCAGTTACAAAA +CGTTTATATGAAGTAAAGTATCTACGATTTTTACAAAAGTCAGGATGCATAAGTACAAAGTACGCGATAA +ACGGAATAATAATAGATTTATCTAGTTTATCTTTTTCTATCTCTTTCATAGTTATATACATGGTCTCAGA +AGTCGGATTATGTAACATCAGCTTCGATAAAATGACTGGGTTATTTAGTCTTACACATTCGCTAATACAT +GTATGACCGTTAACTATAGAGTCTACACTAAAATGATTGAATAATAGATAGTCTACCATTGTTTCGTATT +CAGATAGTACAGCGTAGTACATGGCATCTTCACAAATTATATCATTATCTAATAGATATTTGACGCATCT +TATGGATCCCACTTCAACAGCCATCTTAAAATCGGTAGAATCATATTGCTTTCCTTTATCGTTAATAATT +TCTAGAACATCATCTCTATCATAAAAGATACAAATATTAACTGTTTGATCAGTAATAACATTGCTAGTCG +ATATCAATTTGTTAATAAGATGCGCTGGGCTCAATGTCTTAATAAGAAGTGTAAGAGGACTATCTCCGAA +TTTGTTTTGTTTATTAACATCCGTTGATGGAAGTAAAAGATTTATAATGTCTACATACTTGACTGTTTTA +GAGCATACAATATGGAGAGGCGTATTTCCATCATGATCTGGTTTTGAGGGACTAATTCCTAGTTTCATCA +TCCATGAGATTGTAGAAGCTTTTGGATTGTCTGACATAAGATGTCTATGAATATGATTTTTGCCAAATTT +ATCCACTATCCTGGCTTCGAATCCGATAGACATTATTTTTTTAAACACTCTTTCTGAAGGATCTGTATAC +GCCAACAACGGACCACATCCTTCTTCATCAACCGAGTTGTTAATCTTGGCTCCATACTGTACCAATAAAT +TTATTCTCTCTATGACTTCATCATCTGTTCCCGAGAGATAATATAGAGGTGTTTTATTATGTTTATCACA +TGCGTTTGGATCTGCGCCGTGCACCAGCAGCATCGCGACTATTCTATTATTATTAATTTTAGAAGCTATA +TGCAATGGATAATTTCCATCATCATCCGTCTCATTTGGAGAGTATCCTCTATGAAGAAGTTCTTCTATAA +ATCGTTCATCTAGTCCTTTAATGCCACAATACGCATGTAGAATGTGATAATTTCCAGAGGGTTCGATAAC +TTGTAGCATATTCCTAAATACATCTAAATTTTTACTATTATATTTGGCATAAAGAGATAGATAATACTCG +ACCGACATAATGTTGTGTTGTCCATTATAGTATAAAAATTAATATTTCTATTTCTATTTCTATATATTTG +CAACAATTTACTCTCTATAACAAATATCATAACTTAGTTCTTTTATGTCAAGAAGGCACTGGTTTAATTC +ATCTATAAATGTCACGCCATAACTACCACGCATACTATACTCAGAATTATGATAAAGATATTTATTCTTG +GGGTGTAAGTAATGGGGATTAATCTTTGTTGGATCAGTCTCTAAGTTAACACATGTCACACATGATCCAT +TTATAGTTATATCACACGATGATGATTTATGAATTGATTCCGGAAGATCGCTATTGTATTTTGTAGTTCC +ACAATTCATTTCCATACATGTTATTGTCACACTAATATTATGATGAACTTTATCTAGCCGCTGAGTGGTA +AACAACAGAACAGATAGTTTATTATCTTTACCAACACCCTCAGCCGCTGCCACAAATCTCTGATCCGTAT +CCATGATGGTCATGTTTATTTTTAGTCCGTATCCAGTCAACACTATGTTAGCATTTCTGTCGATATAGCT +TTCACTCATATGACACTCACCAATAATTGTAGAATTAATGTCGTAATTTACACCAATAGTGAGTTCGGCG +ACAAAGTACCAGTACCGGTAATCTTGTCGAGGAGGACATATAGTATTCTTGTATTCTACCGAATACCCGA +GAGATGCGATACAAAAGAGTAAGACTAATTTGTAAACCATCTTACTCAAAATATGCGACAATAGTACGAT +GCAATGAGTAAGACAATAGGAAATCTATCTTATACACATAATTATTCTATCAATTTTACCAATTAGTTAG +TGTAATGTTAACAAAAATGTGGGATAATTTAATAGTTTTTCCTTACATAATTGACATACATGAGTCTGAG +TTCCTCGTTTTTGCTAATTATTTCGTCCAATTTATTATTCTTGACATCGTCAAGATCTTTTGTATAGGAG +TCAGACTTGTATTCAACATGTTTTTCTATAATCATCTTAGCTATTTCGGCATCATCCAATAGTACATTTT +CCAGATTAACAGAATAGATATTAATGTCGTATTTGAACAGAGCCTGTAACATCTCAATGTCTTTATTATC +TATAGCCAATTTGATGTCCGGAATGAAGAGAAGGGAATTGGTGTTTGTCGACGTCATATAGTCGAGCAAG +AGAATCATCATATCCACGTGTCCATTTTTTATAGTGGTGTGAATACAACTAAGGAGAATAGCTAGATCAA +AAGGAGATGGTATCTCTGAAAGAAAGTAGGAAACAATACTTACATCATTAAGCATGACAGCATGATAAAA +TGAAGTTTTCCATCCAGTTTTCCCATAGAACATCAGTCTCCAATTTTTCTTAACAAACAGTTTTACCGTT +TGCATGTTACCACTATCAACCGCATAATACAATGCGGTGTTTCCTTTGTCATCAAATTGTGAATCATCCA +TTCCACTGAATAGCAAAATCTTTACTATTTTGGTATCTTCTAATGTGGCTGCCTGATGTAATGGAAATTC +ATTATCTAGAAGATTTTTCAATGCTCCAGCGTTCAACAACGTACATACTAGACGCACGTTATTATCAGCT +ATTGCATAATACAAGACACTATGACCGTTGATATCCGCCTTAAATGCATCTTTGCTAGAGAGAAAGCTTT +TCAGTTGCTTAGACTTCCAAGTATTAATTCGTGACAGATCCATGTCTGAAACGAGACGCTAATTAGTGTA +TATTTTTTCATTTTTTATAATTTTGTCATATTGCACCAGAATTAATAATATCTCTAATAGATCTGATTAG +TAGATACATGGCTATCGCAAAACAACATATACACATTTAATAAAAATAATATTCATTAAGAAGATTCAGA +TTCCACTGTACCCATCAATATAAATAAAATAATTATTCCTTACATCGTACCATAAACAATATATTAAGTA +GATTCCACCTTACCCATAAACAATATAAATCCAGTTATATCATGTCTAATGATGAACACAAATGGTGTAT +TAAATTCCAGTTCTTCAGGAGATGATCTCGCCGTAGCTACCATGATAGTAGATGCCTCCGCTACAGTTCC +TTGTTCGTCTACATCTATCTTTACATTCTGAAACATTTTATAAATATATAATGGGTCCCTAGTCATATGT +TTAAACGACGCCTTATCTGGATTAAACATACTAGGAGCCATCATTTCGGCTATCGACTTAATATCCCTCT +TGTTTTCGATAGAAAATCTAGGGAGTTTAAGATTGTACATTTTATTCCCTAATTGAGATGACCAATATTC +TAATTTTGCAGCCGTGATAGAATCTGTGAAATGGGTCATATTATCACCTATTGCCAGGTACATACTAATA +TTAGCATCCTTATACAGAAGGCGCACCATATCATATTCTTCGTCATCGATTGTGATTGTATTTCCTTGCA +ATTTAGTAACTACGTTCATCATGGGAACCGTTTTCGTACCGTACTTATTAGTAAAACTAGCATTGTGTGT +TTTAGTGATATCAAACGGATATTGCCATGTACCTTTAAAATATATAGTATTAATGATTGCCCATAGAGTA +TTATCGTCGAGCATAGTAGAATCAACTACATTAGACATACCAGATCTACGTTCTACTATAGAATTAATTT +TATTAACCGCATCTCGTCTAAAGTTTAATCTATATAGGCCGAATCTATGATATTGTTGATAATACGACGG +TTTAATACACACAGTACTATCGACGAAACTTTGATACGTTAGATCGGTGTACGTATATTTAGATGTTTTC +ATCTTAGCTAATCCTGATATTAATTCTGTAAATGCTGGACCCAGATCTCTTTTTCTCAAATTCATAGTAT +TCAATAATTCTACTCTAGTATTACCTGATGCAGACAATAGCGACATAAACATAGAAAACGAATACCCAAA +CGGTGAGAAGACAATATTATCATTATCATCCTCATCCCCATTTTGAATATTTTTATACGCTAATATACCG +GCATTGATAAATCCCTGCAGACGATATGCGGATACTGAACACGCTAATGATAGTATCAATAACGCAATCA +TGATTTTTATGGTATTAATAATTAACCTTATTTTTATGTTTGGTATAAAATTTATTGATGTCTACACATC +CTTTTGTATAATCAACTCTAATCACTTTAACTTTTACAGTTTTCCCTACAAGTTTATCCCTATATTCAAC +ATATCTATCCATATGCATCTCTTAACACTCTGCCAAGATAGCTTCAGAGTGAGGATAGTCAAAAAGATAA +ATATATAGAGTATAATCATTCTCGTATACTCTGCCCTTTATTACATCGCCCGCATTGGGCAACGAATAAC +AAAATGCAAGCATCTTGTTAACAGGCTCGTAAATTGGGATAAAATTATGTTTTTATTGTTTATCTATTTT +ATTCAAGAGAATATTCAGGAAGTTCCTTTTCCGGTTGTATCTCGTCGCAGTATATATCATTTGTACATTG +TTTCATATTTTTTAATAGTCTACACCTTTTAGTAGGACTAGTATCGTACAATTCATAGCTGTATTTTGAA +TTCCAATCACGTATAAAAATATCTTCCAATTGTTGACGAAGACCTAATCCATCATCCGGTGTAATATTAA +TAGATGCTCCACATATATCCGTAAAGTAATTTCCTGTCCAATTTGATGTACCTATATACGCCGTTTTATC +GGTTACCATATATTTTGCATGGTTTACCCTAGAATACGGAATGGGAGGATCAGCATCTGGTACAATAAAT +AGCTTTACTTCTATATCTATGTTTTTAGATTTTAGCATAGCTATAGATCTTAAAAAGTTTCTCATGATAA +ACGAAGATCGTTGCCAGCAACTAATCAATAGCTTAACGGATACTTGTCTGTCTATAGCGGATCTTCTTAA +TTCATCTTCTATATAAGGCCAAAACAAAATTTTACCCGCCTTTGAATAAATAATAGGAATAAAGTTCATA +ACAGATACATAAACGAATTTACTCGCATTTCTGATACATGACAATAAAGCGGTTAAATCATTGGTTCTTT +CCATAGTACATAATTGTTGTGGTGCAGAAGCAATAAATACAGAGTGTGGAACACCGCTTACGTTAATACT +AAGAGGATGATCTGTATTATAATACGACGGATAAAAGTTTTTCCAATTATATGGTAGATTGTTAACTCCA +AGATACCAGTATACCTCAAAAATTTGAGTGAGATCCGCTGCCAAGTTCCTATTATTGAAGATCGCAATAC +CCAATTCCTTGACCTGAGTTAGTGATCTCCAATCCATGTTAGCGCTTCCTAAATAAATATGTGTATTATC +AGATATCCAAAATTTTGTATGAAGAACTCCTCCTAGGATATTTGTAATATCTATGTATCGTACTTCAACT +CCGGCCATTTGTAGTCTTTCAACATCCTTTAATGGTTTGTTGGATTTATTGACGGCTACTCTAACTCTTA +CTCCTCTTTTGGGTAATTGTACAATCTCGTTTAATATTACCGTGCCGAAATTCGTACCCACTTCATCCGA +TAAACTCCAATAAAAAGATGATATATCTAGTGTTTTTATGGTATTGGATAGAATTTCCCTCCACATGTTA +AATGTAGTCAAATATACTTTATCAAATTGCATACCTATAGGAATAGTCTCTGTAATCACTGCGATTGTAT +TATCCGGATTCATTTTATTTGTTAAAAAATAATCCTATATCACTTCACTCTATTAAAAATCCAAGTTTCT +ATTTCTTTCATGACTGATTTTTTAACTTCATCCGTTTCCTTATGAAGATGATGTTTGGCACCTTCATAAA +TTTTTATTTCCCTATTACAATTTGCATGTTGCATGAAATAATATGCACCTGAAACATCGCTAATCTCATT +GTTTGTTCCCTGGAGTATGAGAGTCGGGGTGTCAATCTTGGGAATTATTTTTCTAACCTTGTTGGTAGCC +TTCAAGACCTGACTAGCAAATCCAGCCTTAATTTTTTCATGATTGACTAATGGATCGTATTGGTATTTAT +AAACTTCATCCATATCTCTAGATACTGATTCTGGACATAGCTTTCCGACTGACGCATTTGGTGTAATGGT +TCCCATAAGTTTTGCAGCTAGCAGATTCAGTCTTGGAACAGCGTCTGCATTAACTAGAGGAGACATTAGA +ATCATTGCTGTAAACAAGTTTGGATTATCGCAAGCAGCCAGTATAGAAATTGTTGCTCCCATGGAATGAC +CCAATAAGAAGACTGGAACTCCTGGATAAGTAGATTTAATAGTCACTACGTGCTGTACCACATCTCTAAC +ATACTTACCAAAGTCATCAATCATCATTTTTTCACCATTACTTCTTCCATGGCCAATATGATCATGTGAG +AATACTAAAATTCCTAACGATGATATGTTTTCAGCTAGTTCGTCATAACGTCCAGAATGTTCACCAGCTC +CATGACTTATGAATACTAATGCCTTAGGATATGTAATAGGTTTCCAATATTTACAATATATGTAATCATT +GTCCAGATTGAACATACAGTTTGCACTCATGATTCACTATATAACTATCAATATTAACAGTTCGTTTAAT +GATCATATTATTTTTATGTTTTATTGATAATTGTAAAAATATACAATTAAATCAATATAGAGGAAGGAGA +CGGTACTGTATTTTGTGAGATAGTCATGGAGACTAAATCAGATTATGAGGATGCTGTTTTTTACTTTGTG +GATGATGATGAAATATGTAGTCGCGACTCCATCATTGATCTAATAGATGAATATATCACGTGGAGAAATC +ATGTTATAGTGTTTAATAAAGATATTACCAGTTGTGGAAGACTGTACAAGGAATTGATAAAGTTCGATGA +TGCCGCTATACGGTACTATGGTATTGATAAAATTAATGAGATTGTCGAGGCTATGAGTGAAGGAGACCAC +TACATCAATCTTACAGAAGTCCATGATCAGGAAAGTCTATTCGCTACCATAGGAATATGTGCTAAAATCG +CTGAACATTGGGGATACAAAAAGATTTCAGAATCTAAATTCCAATCATTGGGAAACATTACAGATCTGAT +GACCGACGATAATATAAACATCTTGATACTTTTTCTAGAAAAAAAATTGAATTGATGATATAGGTGTCTT +CATAACGCATTATTACGTTAGCATTCTATTATCCTATCATGTATTTGAGAGTCTTATATGTAGCAAACAT +GATAACTGCAATACCCATAATCTTTAGATATTCACGCGTGCTATGGATGGCATTATCCCGCGGTGTGGAA +ATGTACGTTATATAATCTACAAAATAATCATCGCATATAGTATGAGATAGTAGAGTAAACATTTTTATCG +TTTCTACTGGGTTCATACATCGTCTACCCAATTCGGTAATGAATGAAATTGTCGCCAATCTTACACCCAA +ACCCTTGTTGTTCATTAGTATAGTATTAACTTCATTATTTATGTCATAAACTGTAAATGATTCTGTAGAT +GCCATATCACACATGATATTCATGTCACTATTATAATCATTATTAACTTTATCACAATACGTGTTGATAA +TATCTACATATGATCTAGTTTTTGTGGGTAATTGTCCATACAAGTCGTCTAAACGTTGTTTACTCATATA +GTATTGAACAGCCATCATTACATGGTCCCGTTCCGTTGATAGATAATCGAGTATGTTAGTAGACTTGTCA +AATCTATATACCATATTTTCTGGAAGCGGATATACATAGTCGCGATCATCATTATCACTAGCCTCATCCT +CTATATCATGTACATGTACATAATCTATGATATTATTATACATAAACATCGACAACATACTATTGTCTAT +TATCTAAGTCCTGTTGATCCAAACCCTTGATCTCCTCTATCTGTACTATCTAGAGATTGTACTTCTTCAA +GTTCTGGATAATATATACGTTGATAGATTAGCTGAGCTATTCTATCTCCAGTATTTACATTAAACGTACA +TTTTCCATTATTAATAAGAATGACTCCTATGTTTCCCCTATAATCTTCGTCTATTACACCGCCTCCTATA +TCAATGCCTTTTAGGGACAGACCAGACCTAGGAGCTATTCTACCATAGCAGAACTTAGGCATGGACATAC +TAATATCTGTCTTAATTAACTGTCGTTCTCCAGGAGGGATAGTATAATCGTAAGCGCTATACAAATCATA +TCCGGCAGCACCCGGCGATTGCCTAGTAGGCGATTTAGCTCTGTTAGTTTCCTTAACAAATCTAACTGGT +GAGTTAATATTCATGTTGAACATAAAAAATATCATTTTATTTCAAAATTATTTACCATCCCATCCCATCC +CATCCCATCCCATTCCATATATTCCATGAATAAGTGCGATTATTGTACACTTCTATAGTATCTATATACG +ATCCACGATAAAATCCTCCTATCAATAGCAGTTTATTATCCACTATGATCAATTCTGGATTATCCCTCGG +ATAAATAGGATCATCTATCAGAGTCCATGTATTACTGGATTCACAATAAAATTCCGCATTTCTACCAACC +AAGAATAACCTTCTACCAAACACTAACGCACATGATTTATAATGAGGATAATAAGTGGATGGTCCAAACT +GCCACTGATCATGATTGGGTAGCAAATATTCTGTAGTTGTATCAGTTTCAGAATGTCCTCCCATTACGTA +TATAACATTGTTTATGGATGCCACTGCTGGATTACATCTAGGTTTCAGAAGACTCGGCATATTAACCCAA +GCAGCATCCCCGTGGAACCAACGCTCAACAGATGTGGGATTTGGTAGACCTCCTACTACGTATAATTTAT +TGTTAGCGGGTATCCCGCTAGCATACAGTCTGGGGCTATTCATCGGAGGAATTGGAATCCAATTGTTTGA +TATATAATTTACCGCTATAGCATTGTTATGTATTTCATTGTTCATCCATCCACCGATGAGATATACTACT +TCTCCAACATGAGTACTTGTACACATATGGAATATATCTATAATTTGATCCATGTTCATAGGATACTCTA +TGAATGGATACTTGTATGATTTGCGTGGTTGTTTATCACAATGAAATATTTTGTTACAGTCTAGTATCCA +TTTTACATTATGTATACCTCTGGGAGAAAGATAATTTGACCTGATTACATTTTTGATAAGAAGTAGCAGA +TTTCCTAATCTATTTCTTCGCCTCATATACCACTTAATGACAAAATCAACTACATAATCCTCATCTGGAA +CATTTAGTTCGTCGCTTTCTAGAATAAGTTTCATAGATAGATAATCAAAATTGTCTATGATGTCATCTTC +TAGTTCCAAAAAGAGTTTGGTAATAAAGTCTTTAGTATGACATAAGAGATTGGATAGTCCGTATTCTATA +CCCATCATGTAACACACGATACAATATTCCTTTCTAAAATCTCGTAGGATAAAGTATATACAAGTGTAGA +TGATAAATTCTACAGATGTTAATATAGAAGCACGTAATAAATTGACGACGTTATGACTATCTATATATAC +CTTTCCAGTATATGAGTAAATAACTATAGAAGTTAGACTGTGAATGTCAAGGTCTAGACAAACCCTCGTA +ACTGGATCTTTATTTTTTGTGTATTTTTGACGTAAATGTGTGCGAAAGTATGGAGATAACTTTTTCAATA +TTGTAGAATTGACTATTATATTGCCTCCTATAGCTTCAATAATTGTTTTGAATTTCTTAGTCGTATACAA +TGCTAATATATTCTTACAGTACACAGTATTGACAAATATCGGCATTTATGTTTCTTTAAAAGTCAACATC +TAAAGAAAAATGATTGTCTTCTTGAGACATAACTCCCATTTTTTGGTATTCACCCACACGTTTTTCGAAA +AAATTAGTTTTTCCTTCCAATGATATATTTTCCATGAAATCAAACGGATTGGTAACATTGTAAATTTTTT +TAAATCCCAATTCAGAAATCAATCTATCTGCGACGAATTCTATATATGTTTTCATCATTTCACAATTCAT +TCCTATGAGTTTAACTGGAAGAGCCACAGTAAGAAATTCTTGTTCAATGGATACCGCATTTGTTATAATA +AATCTAACGGTTTCTTCACTCGGTGGATGTAATAAATGTTTAAACATCAAACATGCGAAATCGCAGTGCA +GACCCTCGTCTCTACTAATTAATTCGTTAGAAAACGTGAGTCCGGGCATTAGGCCACGCTTTTTAAGCCA +AAATATGGAAGCGAATGATCCGGAAAAGAAGATTCCTTCTACTGCAGCAAAGGCAATAAGTCTCTCTCCA +TAACCGGCGCTGTCATGTATCCACTTTTGAGCCCAATCGGCCTTCTTTTTTACACAAGGCATCGTTTCTA +TGGCATTAAAGAGATAGTTTTTTTCATTACTATCTTTAACATAAGTATCGATCAAAAGACTATACATTTC +CGAATGAATGTTTTCAATGGCCATCTGAAATCCGTAGAAACATCTAGCCTCGGTAATCTGCACTTCTGTA +CAAAATCGTTCTGCTAAATTTTCATTCACTATTCCATCACTGGCTGCAAAAAACGCCAATACATGTTTTA +TAAAATATTTTTCGTCTGGTGTTAGTTTATTCCAATCATTGATATCTTTAGATATATCCACTTCTTCCAC +TGTCCAAAATGATGCCTCTGCCTTTTTATACATATTCCAGATGTCATGATATTGGATTGGGAAAATAACA +AATCTATTTGGATTTGGTGCAAGGATAGGTTCCATAACTAAATTAACAATAGTAGTAATTTTTTTTTCAG +TTATCTGTATGACTGTACTTGGATCTTTTGTATATCGCTATCGCCGCAATCACTACAATAATTACAAGTA +TTATTGATAGCATTGTTATTACTACTATCATAATTAAATTATCGACATTCGTGGGTGCTGAATAATCGTT +ATCATCATTTTGTAATTGTGACATCATACTAGATAAATCATTTGTGAGATTGTTGTGGGAAGCGGGCACG +GAAGATGCATTATCATTATTATTTAACGCCTCCCATTCGGATTCACAAATGTTACGCACGTTCAACGTTT +TATGGAAACTATAATTTTGTGAAAACAGATAACAAGAAAACTCGTCATCGTTCAAATTTTTAACGATAGT +AAACCGATTAAACGTCGAGCTAATTTCTAACGCTAGCGACTCTGTTGGATATGGGTTTCCAGATATATAT +CTTTTCAGTTCCCCTACGTATCTATAATCATCTGTAGGAAATGGAAGATATTTCCATTTATCTACTGTTC +CTAATATCATATGCGGTGGTGTAGAACCATTAAGCGCGAAAGATGTTATTTCGCATCGTATTTTAACTTC +GCAATAATTTCTGGTTAGATAACGCACTCTACCAGTCAAGTCAATGATATTAGCCTTTACAGATATATTC +ATAGTAGTCGTAACGATGACTCCATCTTTTAGATGCGATACTCCTTTGTATGTACCAGAATCTTCGTACC +TCAAACTCGATATATTTAAACAAGTTAATGATATATTAACGCGTTTTATGAATGATGATATATAACCAGA +AGTTTTATCCTCTGTGGCTAGCGCTATAACCTTATCATTATAATACCAACTAGTGTAATTAATATGTGAC +ACGACAGTGTGGGTACAAATATGTACATTATCGTCTACGTCGTATTTGATACATCCGCATACAGCCAACA +AATATAAAATTACAAAAACTCTAACGACGTTCGTACACATCTTGATGCGGTTTAATAAATGTTTTGATTT +CAATTTATTGTAAAAAAGATTCGGTTTTATACTGTTCGATATTCTCATTGCTTATATTCTCATCTATCAT +CTCCACACAGTCAAATCCATGGTTAACATGTACCTCATCAACCGGTAAAAGACTATCGGATTCTTCTATC +ATCATAACTCGAGAATATTTAATTTGGTGGTCATTATTAATCAAGTCAATTATCTTATTTTTAACAAACG +TAAGTATTTTACTCATTTTTTATAAAAACTTTTAGAAATATACAGACTCTATCGTGTGTCTATATCTTCT +TTTTATATCCAATGTATTTATGTCTGATTTTTCTTCATTTATCATATATAATGGTCCAAATTCTACACGT +GCTTCGGATTCATCCAGATCATTAAGGTTCTTATAATCGCAACATCCTTCTCTTCCATCTTCTACATCTT +CCTTCTTATTCTTAGCGTCACAGAATCTACCACAGCAGGATCCCATGACGAGCGTCACATTAAACTAATT +CATTTTCAATTATAATATACTGATTAGTAATGACCATTAAAATAAAAATATTCTTCATAACCGGTAAGAA +AGTAAAAAGTTCACATTGAAACTATGTCAGTAGTTATACATCATGAGATGATATACTCTATTTTGGTGGA +GGATTATATGATATAATTCGTGGATAATCATTCTTAAGACACATTTCTTCATTCGTAAATCTTTTCACAT +TAAATGAGTGTCCATATTTTGCAATTTCTTCATATGATGGCGGTGTACGTGGACGAGGCTGCTCCTGTTC +TTGTAGTCGCCGACTGTCGTGTTTGCGTTTAGATCCCTCCATTATCGCGATTGCGTAGTGAGTACTATTT +ATACCTTGTAATTAAATTTTTTTATTAATTAAACGTATAAAAACGTTCCGTATCTGTATTTAAGAGCCAG +ATTTCGTCTAATAGAACAAATAGCTACAGTAAAAATAACTAGAATAATCGCTACACCCACTAGAAACCAC +GGATCGTAATACGGCAATCGGTTTTCGATAATAGGTGGAACGTATATTTTATTTAAGGACTTAACAATTG +TCTGTAAACCACAATTTGCTTCCGCCGATCCTGTATTAACTATCTGTAAAAGCATATGTTGGCCGGGCGG +AGCCGAACATTCTCCGATATTCAATTTTTGTATATCTATAATGTTATTAACCTCCGCATACGCATTACAG +TTCTTTTCTAGCTTGGATACTACACTAGGTACATCATCTAAATCTATTCCTATTTCCTCAGCGATAGCTC +TTCTATCCTTTTCCGGAAGTAATGAAATCACTTCAATAAATGATTCAACCATGAGTGTGAAACTAAGTCG +AGAATTACTCATGCATTTGTTAGTTATTCGGAGCGCGCAATTTTTAAACTGTCCTATAACCTCTCCTATA +TGAATAGCACAAGTGACATTAGTAGGGATAGAATGTTGAGCTAATTTTTGTAAATAACTATCTATAAAAA +GATTATACAAAGTTTTAAACTCTTTAGTTTCCGCCATTTATCCAGTCTGAGAAAATGTCTCTCATAATAA +ATTTTTCCAAGAAACTAATTGGGTGAAGAATGGAAACCTTTAATCTATATTTATCACAGTCTGTTTTGGT +ACACATAATGAATTCTTCTAATGCTGTACTAAATTCGATATCTTTTTCGATTTCTGGATATGTTTTTAAT +AAAGTATGAACAAAGAAATGGAAATCGTAATACCAGTTATGTTCAACTTTGAAATTGTTTTTTATTTTCT +TGTTAATGATACCAGCCACTTGGGAAAAGTCAAAGTCGTTTAATGCCGATTTAATACGTTCATTAAAAAC +AAACTTTTTATTCTTTAGATGAATTATTATTGGTTCATTGGAATCAAAAAGTAAGATATTATCGGGTTTA +AGATCTGCATGTAAAAAGTTGTCACAACAGGGTAGTTCGTAGATTTTAATGTATAACAGAGACATCTGTA +AAAAGATAAACTTTATGTATTGTACCAAAGATTTAAATCCTAATTTGATAGCTAACTCGGTATCTACTTT +ATCTGCCGAATACAGTACTAGGGGAAAAATTATAATATTTCCTCTTTCGTATTCGTAATTAGTTCTCTTT +TCATGTTCGAAAAAGTGAAACATGCGGTTAAAATAGTTTATAACATTAATATTACTGTTAATAACTGCAG +GATAAAAGTGGGATAGTAATTTCACGAATTTGATACTGTCCTTTCTCTCGTTAAACGCCTTTAGAAAAAC +TTTAGAAGAATATCTCAATGAGAGTTCCTGACCATCCATAGTTTGTATCAATAATAGCAACATATGAAGA +ACCCGCTTATACAGAGTATGTAAAAATGTTAATTTATAGTTTAATCCCATGGCCCACGCACACACGATTA +ATTTTTTTTCATCTCCCTTTAGATTGTTGTATAGAAATTTGGGTACTGTGAACTCCGCCGTAGTTTCCAT +GGGACTATATAATTTTGTGGCCTCGAATACAAATTTTACTACATAGTTATCTATCTTAAAGACTATACCA +TATCCTCCTGTAGATATGTGATAAAAATCGTCGTTTATAGGATAAAATCGTTTATCTTTTTGTTGGAAAA +AAGATGAATTAATGTAATCATTCTCTTCTATCTTTAGTAGTGTTTCCTTATTAAAATTCTTAAAATAATT +TAACAATCTAACTGACGGAGCCCAATTTTGGTGTAAATCTAATTGGGACATTATGTTGTTAAAATATAAA +CAGTCTCCTAATATAACAGTATCTGATAATCTATGGGGAGACATCCATTGATATTCAGGGGATGAATCAT +TGGCAACACCCATTTATTGTACAAAAAGCCCCAATTTACAAACGAAAGTCCAGGTTTGATAGAGACAAAC +TATTAACTATTTTGTCTCTGTTTTTAACACCTCCACAGTTTTTAATTTCTTTGGTAATGAAATTATTCAC +AATATCAGTATCTTCTTTATCTACCAGAGATTTTACTAACTTGATAACCTTGGCTGTCTCATTCAATAGG +GTAGTGATATTTGTATGTATGATATTGATATCTTTTTGAATTGTTTCTTTTAGAAGTGATTCTTTGATGG +TATCAGCATACGAATTACAATAATGCAGAAACTCAGTTAACATGCAGGAATTATAGTAAGCCAATTCCAA +TTGTTGCCTGTATTGTATTAGAGTATTAATATGCGCAATGATGTCCTTGCGTTTCTCTGATAGAATGCGA +GCAGCGATTTTGGCGTTATCATTTGACGATATTTCTGGAATAACGAATCCTGTTTCTACTAACTTCTTGG +TAGGACAAAGTGAAACAATCAAGAAAATAGCTTCTCCTCCTATTTGTGGAAGAAATTGAACTCCTCTAGA +TGATCTACTGACGATAGTATCTCCTTGACAGATATTGGACCGAACTACGGAAGTACCTGGAATGTAAAGC +CCTGAAACCCCCTCATTTTTTAAGCAGATTGTTGCCGTAAATCCTGCACTATGCCCAAGATAGAGAGCTC +CTTTGGTGAATCCATCACTATGTTTCAGTTTAACCAAGAAACAGTCAGCTGGTCTAAAATTTCCATCTCT +ATCTAATACAGAATCCAACTTGATGTCAGGGACTATGACCGGTTTAATGTTATATGTAACATTGAGTAAA +TCCTTAAGTTCATAATCATCGTTGTCATCAGTTATGTACGATCCAAACAATGTTTCTACCGGCATGGTGG +ATACGAAGATGCTATCCATCAGAATGTTTCCCTGATTAGTATTTTCTATATAGCTATTCTTCTTTAAACG +ATTTTCCGAATCAGTAACTATGTTCATTTTTTTAGGAGTAGGACGTCTAGCCAGTATGGAAGAGGATTTT +CTAGATACTCTCTTCAACATCTTTGATCTCAATGGAATGCAAAACCCCATGGTGTAACAACCAACGATAA +AAATAATATTGTTTTTTCACTTTTTATAATTTTACCATCTGACTCATGGATTCATTAATATCTTTATAAG +AGCTACTAACGTATAATTCTTTATAACTGAACTGAGATATATACACCGGATCTATGGTTTCCATAATTGA +GTAAATGAATGCTCGGCAATAACTAATGGCAAATGTATAGAACAACGAAATTATACTAGAGTTGTTAAAG +TTAATATTTTCTATGAGTTGTTCCAATAAATTATTTGTTGTGACTGCGTTCAAGTCATAAATTATCTTGA +TACTATCCAGTAAACAGTCTTTAAGTTCTGGAATATTATCATCCCATTGTAAAGCCCCTAGTTCGACTAT +CGAATATCCTGCTCTGATAGCAGTTTCAATATCGACGGACGTCAATACTGTAATAAAGGTGGTAGTATTG +TCATCATCGTGATAAACTACGGGAATATGGTCGTTAGTAGGTACCGTGACTTTACACAACGCGATATATA +ACTTTCCTTTTGTACCATTTTTAACGTAGTTGGGACGTCCTGCAGGGTATTGTTTTGAAGAAATGATATC +GAGAACAGATTTGATACGATATTTGTTGGATTCCTGATTATTCACTATAATATAATCTAGACAGATAGAT +GATTCGATAAATAGAGAAGGTATATCGTTGGTAGGATAATACATCCCCATTCCAGTATTCTCGGATACTC +TATTGATGACACTAGTTAAGAACATGTCTTCTATTCTAGAAAACGAAAACATCCTACATGGACTCATTAA +AACTTCTAACGCTCCTGATTGTGTTTCGAATGCCTCGTACAAGGATTTCAAGGATGCCATAGATTCTTTG +ACCAACGATTTAGAATTGCGTTTAGCATCTGATTTTTTTATTAAATCAAATGGTCGGCTCTCTGGTTTAC +TACCCCAATGATAACAATAGTCTTGTAAAGATAAACCGCAAGAAAATTTATACGCATCCATCCAAATAAC +CCTAGCACCGTCGGATGATATTAATGTATTATTATAGATTTTCCATCCACAGTTATTGGGCCAGTATACT +GTTAGCAACGGTATATCGAATAGATTACTCATGTAACCTACTAGAATGATAGTTCGTGTACTAGTCATAA +TATCTTTAATCCAATCTAAGAAATCTAAAATTAGATCTTTTACACTATTAAAGTTAACAAAGGTATTACC +CGGGTACGTGGATATCATATATGGTATTGGTCCATTATCAGTAATGGCTCCATAAACTGATACGGCGATG +GTTTTTATATGTGTTTGATCTAATGAGGACGAAATTCGCGCCCACAATTCATCTCTAGATATGTATTTAA +TATCGAACGGTAACACATCAATCTCGGGACGCGTATATGTTTCTAAATTCTTAATCCAAATATAATGATG +ACCTATATGCCCTATTATCATACTGTCAACTATAGTATACCTAGAGAACTTTCGATACATCTGCTGTTTC +CTGTAATCGTTAAATTTTACAAATCTATAACATGCTAAACCTTTTGACGACAGCCATTCATTAATTTCTG +ATATGGAATCTGTAATCTCAATACCGTATCGTTCTAAAGCCAGTGCTATATCTCCCTGTTCGTGGGAACG +CTTTCGTATAATATCGATCAATGGATAATATGAAGTTTTTGGAGAATAATATGATTCATGATCTATTTCG +TCCATAAACAATCTAGACATAGGAATTGGAGGCGATGATCTTAATTTTGTGCAATGGGTCAATCCTATAA +CTTCTAATATTGTAATATTCATCATCGACATAACACTATCTATGTTATCATCGTATATTAGTATACCACG +ACCTTCTTCATTTCGTGCCAAAATGATATACAGTCTTAAATAATTACGCAATATCTCAATAGTTTCATAA +TTGTTAGCTGTTTTCATCAAGGTTTGTATCCTGTTTAACATGATGGCGTTCTATAACGTCTCTATTTTCT +ATTTTTTAATTTTTTAAATTTTTAACGATTTACTGTGGCTAGATACCCAATCTCTCTCAAATATTTTTTT +AGCCTCGCTTACAAGCTGTTTATCTATACTATTAAAACTGACGAATCCGTGATTTTGGTAATGGGTTCCG +TCGAAATTTGCCGAAGTGATATGAACATATTCGTCGTCGACTATCAACAATTTTGTATTATTCTGAATAG +TGAAAACCTTCACAGATAGATCATTTTGAACACACAACGCATCTAGACTTCTGGCGGTTGCCATAGAATA +TACGTCGTTCTTATCCCAATTACCAACTAGAAGTCTGATCTTAACTCCTCTATTAATGGCTGCTTCTATA +ATGGAGTTGTAAATGTCAGGCCAATAGTAGCTACTACCGTCGACACGTGTAGTGGGAACTATGGCCAAAT +GTTCAATATCTATACTAGTCTTAGCCGACTTGAGTTTATCAATAACTACATCAGTGTCTAGATCTCTAGA +ATATCCCAATAGGTGTTCTGGAGAATCAGTAAAGAACACTCCACCTATAGGATTCTTAATATGATACGCA +GTGCTAACTGGCAGACAACAAGCCGCAGAGCATAAATTCAACCATGAATTTTTTGCGCTATTAAAGGCTT +TAAAAGTATCAAATCTTCTACGAAGATCTGTGGCCAGCGGAGGATAATCAGAATATACGCCTAACGTTTT +AATCGTATGTATAGATCCTCCAGTAAATGACGCGTTTCCTACATAACATCTTTCATCATCAGACACCCAA +AAACAACCGAGTAGTAGTCCCACATTATTTTTTTTATCTATATTAACGGTTATAAAATTTATATCCGGGG +AGTGACTTTGTAGCTCTCCCAGATTTCTTTTCCCTCGTTCATCTAGCAAAACTATTATTTTAATCCCTTT +TTCAGATACCTCTTTTAGTTTATCAAAAATAAGCGCTCCCCTAGTAGTACTCAGAGGATTACAACAAAAA +GATGCTATGTATATATATTTCTTAGCTAGAGTGATAATTTCGTTAAAACATTCAAATGTTGTCAAATGAT +CGGATCTAAAATCCATATTTTCTGGTAGTGTTTCTACCAGCCTACATTTTGCTCCCGCAGGTACCGATAC +AAATGGCCACATTTAGTTAACATAAAAACTTATATATCCTGTTCTATCAACGATTCTAGAATATCATCGG +CTATATCGCTAAAATTTTCATCAAAGTCGACATCACAACCTAACTCAGTCAATATATTAAGAAGTTCCAT +GATGTCATCTTCGTCTATTTCTATATCCGTATCCATTGTAGATTGTTGACCGATTATCGAGTTTAAATCA +TTACTAATACTCAATCCTTCAGAATACAATCTGTGTTTCATTGTAAATTTATAGGCGGTGTATTTAAGTT +GGTAGATTTTCAATTATGTATCATTATAGCAACAGTAATTCTTGCTCCTCCTTGATTTTAGCATCCTCTT +CATTATTTTCTTCTACGTACATAAGCATGTCCAATACGTTAGACAACACACCGACGATGGTGGCCGCCAC +AGACACGAATATGACTAGACCGATGACCATTTAAAAAATACTCTCTAGCTTTAACTTAAACTGTATCGAT +CATTCTTTTAGCACATGTATAATATAAAAACATTATTCTATTTCGAATTTAGGCTTCCAAAAATTTTTCA +TCCGTAAACCGATAATAATATATATAGACTTGTTAATAGTCGGAATAAATATATTAATGCTTAAACTATC +ATCATCTCCACGATTAGAGATACAATATTTACATTCTTTTTGCTGTTTCGAAACTTTATCAATACACGTT +AATACAAACCCAGGAAGGAGATATTGAAACTGAGGCTGTTGAAAATGAAACGGTGAATACAATAATTCAG +ATAATGTAAAATCATGATTCCGTATTCTGATGATATTAGAACTGCTAATGGATGTCGATGGTATGTATCT +AGGAGTATCTATTTTAACAAAGCATCGATTTGCTAATATACAATTATCCTTTTGATTAATTGTTATTTTA +TTCATATTCTTAAAAGGTTTCATATTTATCAATTCTTCTACATTAAAAATTTCCATTTTTAATTTATCTA +GCCCCGCAATACTCCTCATTACGTTTCATTTTTTGTCTAGAATGCCCATTTTGTTCATCTTGGTACATAG +ATTATCCAATTGAGAAGCGCATTTAGTAGTTTTGTACATTTTAAGTTTATTAACGAATCGTCGAAAACTA +GTTATAGTTAACATTTTATTATTTGATACCCTGATATTAATACCCCTGCCGTTACTATTATTTATAACTG +ATGTAACCCACGTAACATTGGAATTAATTATCGATAGTAATGCATCGACACTTCCAAAATTGTCTATTAT +AAACTCACCGATAATTTTTTTATTGCATGTTTTCATATTCATTAGGATTATCAAATCTTTAATCTTATTA +CGATTGTATGCGTTGATATTACAAGACGTCATTCTAAAAGACGGAGGATTTCCATCAAATGCCAGACAAT +CACGTACAAAGTACATGGAAATAGGTTTTGTTCTATTACGCATCATAGATTCATATAAAACACCCGTAGA +AATACTAATTTGTTTTACTCTATAAAATACTATTGCATCTATTTCATCGTTTTGTATAACGTCTTTCCAA +GTGTCAAATTCTAATTTTTTTTCATTGATAGTACCAAATTCTTCTATCTCTTTAACTACTTGCATAGATA +GGTAATTACAGTGATGCCTACATGCCGTTTTTTGAAACTGAATAGATGCATCTAGAAGCGATGCTACGCT +AGTCACGATCACCACTTTCATATTTAGAATATATGTATGTAAAAATATAGTAGAATTTCATTTTGTTTTT +TCTATGCTATAAATGAATTCTCATTTTGTATCTGCACATACTCCGTTTTATATCAATACCAAAGAAGGAA +GATATCTGGTTCTAAAAGCCGTTAAAGTATGCGATGTTAGAACTGTAGAATGCGAAGGAAGTAAAGCTTC +CTGCGTACTCAAAGTAGATAAACCCTCATCACCCACGTGTGAGAGAAGACCTTCGTCCCCGTCCAGATGC +GAGAGAATGAATAACCCTGGAAAACAAGTCCCGTTTATGAGAACGGACATGTTACAAAATATGTTTGCTG +CTAATCGCGACAACGTAACGTCAAGACTTTTGAACTAAAATACAATTATATCTTTTTCGATATTAATAAA +TCCGTGTCTCCCGGGTTTTTTATCTCTTTCAGTATGTGAATAGATAGGTATTTTATCTCTATTCATCATC +GAATTTAAGAGATCCGATAAACATTGTTTGTATTCTCCAGATGTCAGCATCTGATACAACAATATATGTG +CACATAAACCTCTGGCACTTATTTCATGTACCTTCCCCTTATCACTAAGGAGAATAGTATTTGAGAAATA +TGTATACATGATATTATCATGAATTAGATATACAGAATTTGTAACACTCTCGAAATCACACGATGTGTCG +GCGTTAAGATCTAATATATCACTCGATAACACATTTTCATCTAGATACACTAGACATTTTTTAAAGCTAA +AATAGTCTTTAGTAGTAACAGTAACTATGCGATTATTTTCATCGATGATACATTTCATCGGCATATTATT +ACGCGTACCATCAAAGACTATACCATGTGTATATCTAACGTATTCTAGCATAGTTGCCATACGTGCATTA +AACTTTTCAGGATCTTTGGATAGATCTTCCAATCTATCTATTTGAGAAAACATTTTTATCATGTTCAATA +GTTGAAACGTCGGATCCACTATATAGATATTATCTATAAAGATTTTAGGAACTATGTTCATGGTATCCTG +GCGAATATTAAAACTATCAATGATATGATTATCGTTTTCATCTTTTATCACCATATAGTTTCTAAGATAT +GGGATTTTACTTAATATAATATTATTTCCCGTAATAAATTTTATTAGAAATGCCAAATCTATAAGAAAAG +TCCTAGAATTAGTCTGAAGAATATCTATATCACCGTACCGTATATTTGGATTAATTAGATATAGAGAATA +TGATCCGTAACATATACAACTTTTATTATGACGTCTAAGATATTCTTCCATCAACTTATTAACATTTTTG +ACTAGGGAAGATACATTATGACGTCCCATTACTTTTGCCTTGTCTATTACAGCGACGTTCATAGAATTTA +GCATATCTCTTGCCAATTCTTCCATTGATGTTACATTATAAGAAATTTTAGATGAAATTACATTTGGAGC +TTTAATAGTAAGAACTCCTAATATATCCGTGTATGTGGTCACTAATACAGATTGTAGTTCTATAATCGTA +AATAATTTACCTATATTATATGTTTGAGTTTGTTTAGAAAAGTAGCTAAGTATACGATCTTTTATTTCTG +ATGCCGATGTATCAACATCGAAAAAAAATCTTTTTTTATTCTTTTTTACTAACGATACGAATATGTCTTT +GTTAAAAACAGTTATTTTCTGAATATTTCTAGCTTGTAATTTTAACATATGATATTCGTTCACACTAGGT +ACTCTGCCTAAATAGGTTTCTATAATCTTTAATGTAATATTAGGAAGAGTATTCTGATCAGGATTCCTAT +TCATTTTGAGGATTTAAAACTCTGATTATTGTCTAATATGGTCTCAACACAAACTTTTTCACAGAGCGAT +AGAGTTTTTGATAACTCGTTTTTCTTAAGAAATATAAAACTACTGTCTCCAGAGCTCGCTCTATCTTTTA +TTTTATCTAATTCGATACAAACTCCTGATACTGGTTCAGAAAGTAATTCATTAATTTTCAGTCCTTTATA +GAAGATATTTAATATAGATAATACAAAATCTTCAGTTCTTGATATCGATCTGATTGATCCTAGAACTAGA +TATATTAATAACGTGCTCATTAGGCAGTTTATGGCAGCTTGATAATTAGATATAGTATATTCCAGTTCAT +ATTTATTAGATACCGCATTGCCCAGATTTTGATATTCTATGAATTCCTCTGAAAATAAATCCAAAATAAC +TAGACATTCTATTTTTTGTGGATTAGTGTACTCTCTTCCCTCTATCATGTTCACTACTGGTGTCCACAAT +GATAAATATCTAGAGGGAATATAATATAGTCCATATGATGCCAATCTAGCAATGTCGAATAACTGTAATT +TTATTCTTCGCTCTTCATTATGAATTGAATCTTGAGGTATAAACCTAACACAAATTATATCATTAGACTT +TTCGTATGTAATGTCTTTCATGTTATAAGTTTTTAATCCTGGAATAGAATCTATTTTAATGAGGCTTTTA +AATGCAGCGTTCTCCAACGAGTCAAAGCATAATACTCTGTTGGTTTTCTTATATTCAATATTACGATTTT +CTTCTTTGAATGGAATAGGTTTTTGAATTAGTTTATAATTACAACATAATAGATAAGGAAGTGTGTAAAT +AGTACGCGGAAAAAACATAATAGCTCCCCTGTTTTCATCCATGGTTTTAAGTAAATGATCACTGGCTTCT +TTAGTCAATGGATATTCGAACATTAACCGTTTCATCATCATTGGACAGAATCCATATTTCTTAATGTAAA +GAGTGATCAAATCATTGTGTTTATTGTACCATCTTGTTGTAAATGTGTATTCGGTTATCGGATCTGCTCC +TTTTTCTATTAAAGTATCGATATCGATCTCGTCTAAGAATTCAACTATATCGACATATTTCATTTGTATA +CACATAACCATTACTAACGTAGAATGTATAGGAAGAGATGTAACGGGAACAGGGTTTGTTGATTCGCAAA +CTATTCTAATACATAATTCTTCTGTTAATACGTCTTGCACGTAATCTATTATAGATGCCAAGATATCTAT +ATAATTATTTTGTAAGATGATATTAACTATGTGATCTATATAAGTAGTGTAATAATTCATGTATTTCGAT +ATATGTTCCAACTCTGTCTTTGTGATGTCTAGTTTCGTAATATCTATAGCGTCCTCAAAAAATATATTCG +CATATATTCCCAAGTCTTCAGTTCTATCTTCTAAAAAATCTTCAACGTATGGAATATAATAATCTATTTT +ACCTCTTCTGATGTCATTAATGATATAGTTTTTGACACTATTTTCCGTCAATTGATTCTTATTCACTATG +TCTAAAAACCGGATAGCGTCCCTAGGACGAACTACTGCCATTAATATCTCTATTATAGCTTCTGGACATA +AATCATCTATTATACCAGAATTAATGGGAACTATTCCGTATCTATCTAACATAGTTTTAAGAAAGTCAGA +ATCTAAGACCTGATGTTCATATATTGGTTCATACATGAAATGATCTCTATTGATGATAGTGACTATTTCA +TTCTCTGAAAATTGGTAACTCATTCTATACACGCTTTCCTTGTTGATAAAGGATAGTATATACTCGATGG +AATTTGTACCAACAAACTGTTCTCTTATGAATCGTATATCATCATCTGAAATGATCATGTAAGGCATACA +TTTAACAATGAGAGACTTGTCTCCTGTTATCAATATACTATTCTTGTGATAATTTATGTGTGAGGCAAAT +TTGTCCACGTTCTTTAATTTTGTTATAGTAGATATCAAATCCAATGGAGATACAGTTCTTGGCTTAAACA +GATATAGTTTTTCTGGAACGAATTCTACAACATTATTATAAAGGACTTTGGGTATATAAGTGGGATGAAA +TCCTATTTTAATTAATGCGATAGCCTTGTCCTCGTGCAGATATCCAAACGCTTTTGTGATAGTATGGCAT +TCATTGTCTAGAAACGCTCTACGAATATCTGTAACAGATATCATCTTTAGAGAATACTAGTCGCGTTAAT +AGTACTAAAATTTGTATTTTTTAATCTATCTCAATAAAAAATTAATATGTATGATTCAATGTATAACTAA +ACTACTAACTGTTATTGATAACTAGAATCAGAATCTAATGATGACATAACTAAGAAGTTTATCTACAGCC +AATTTAGCTGCATTATTTTTAGCATCTCGTTTAGATTTTCCATCTGCCTTATCGAATACTCTTCCGTCAA +TGTCTACACAGGCATAAAATGTAGGAGAGTTACTAGGCCCCACTGATTCAATACGAAAAGACCAATCTCT +CCTAGTTATTTGGCAGTACTCATTAATAACGGTGACAGGGTTAACACCTTTCCAATAAATAATTTTTTTA +ACCGGAATAACATCATCAAAAGACTTATTATCCTCTCTCATTGATTTTTCGCGGGATACATCATCTATTA +TAGCATCAGCATCAGAATCTGTAGGCCGTGTATCAGCATCCATTGTCGTAGACCAACGAGGAGGAGTATC +GTCGGAACTGTACACCATAGTACTACGTTGAAGATCATACAGAGCTTTATTAACTTCTCGCTTCTCCATA +TTAAGTTGTTTAGTTAGTTGTGCAGTAGCTCCTTAGTCCAATGTTTTTAATAACCGCACACAATCTCTGT +GTCAGAACGCTCGTCAATATAGATCGTAGAAATTTTTTAGAGAGAACTAACACAACTAGCAATAAAACTG +ATCTTATTTTATCATTTTTTTATTCATCATCCTCTGGTGGTTCGTCGTTCCTATCGAATGTAGCTCTGAT +TAACCCGTCATCTATAGGTGATGCTGGTTCTGGAGATTCTGGAGGAGATGGATTATTATCCGGAAGAATC +TCTGTTATTTCCTTGTTTTCATGTATCGATTGCGTTGTAACATTAAGATTGCGAAATGCTCTAAATTTGG +GAGGCTTAAAGTGTTGTTTACAATCTCTACACGCGTGTCTAACTAATGGAGGTTCGTCAGCGGCTCTAGT +TTGAATCATCATCGGTGTAGTATTCCTACTTTTACAGTTAGGACACGGTGTATTGTATTTCTCGTCGAGA +ACGTTAAAATAATCGTTGTAACTCACATCCTTTATTTTATCTATATTGTATTCTACTCCTTTCTTAATGC +ATTTTATACCGAACAAGAGATAGCGAAGGAATTCTTTTTCGGTACCGCTAGTACCCTTAATCATATCACA +TAGTGTTTTATATTCTAAATTTGTGGCAATGGACGGTTTATTTCTATACGATAGTTTGTTTCTGGAATCC +TTTGAGTATTCTATACCAATATTATTCTTTGATTCGAATTTAGTTTCTTCGATATTAGATTTTGTATTAC +CTATATTCTTGATGTAGTACTTTGATGATTTTTCCATGGCCCATTCTATTAAGTTTTCCAAGTTGGCATC +ATCCACATATTGTGATAGTAATTCTCGGATATCAGTAGTGACTACCGCCATTGATATTTGTTCATTTGAT +GAGTAACTACTAATGTATACATTTTCCATTTATAACACTTATGTATTAACTTTGTTTATTTATATTTTTT +CATTATTATGTTGATATTAATAATCGTATTGTGGTTATATGGCTACAATTTCATAATGAGTTGAAGTCAG +TGTCCTATGATCAATGACGATAGCTTTACTCTGAAAGAAAGTATCAAATCGATAGTGCAGAGTCAACAAT +GAAAATGGATAAGACGATGACAAAGTTTCAGAATAGAGTCAAAATGGTAAAAGAAATAAATCAGACGATA +AGAGCAGCACAAACTCATTGAGACATTGAAACTAGGATATATAAAATTTAAGTGAATGATTAGGACAGGA +CTACTACTCTAGAAGATATAGCACCATCTATTATTCCAAATAATCAGAAAACTTATAAACTATTCTCGGA +CATTTCAGTCATTGGCAAAGCATCACAGAATCCGAGTAAGATGATATATGCTCGCTGCTTTACATGTTTC +CCAATTTGTTTGGAGATGACCATAGATTCATTTGTTATAGAATGCATCCAATGAGTAAAATCAAACACAA +AATCTTCGTTCAAACTTAATCTTATTAGAATATTAGTGGAAGAAAGATTCTATAATAATGAATGCAGAGA +TTATAAATGGAGAATAATTGGAACACAAGTTGATAAAATATTGATAGCTAAATATACAATAGATGCAATG +TATCGCATAAGACCGATATATATAATACAAAGCAGTACAGATACAATGATGATGTAGAAAATGGATTCAT +TGGATTGGATAAACTAAAATTAAACATTGTTCATGATATAGTTGAATCATGTATACCTGTTCGTATGCCT +GTGGCTAAGATACTGTGTAAAGAAATGGTAAATAAATACTTTGAGAATCTTTAAGAGTGTATTGACTTTG +TTAGTGAATATGCATTCCATCTTTCTCCAATACTAATTCAAATTGTTAAATTAATAATGGAATAGTATAA +ATAGTTATTAGTGATAAGATAGTAAAAATAATTATTAGAATAGTGTAGTATCATAGATAACTCTCTTCTA +TAAAAAATGGATTTTATTCGTAGAAAGTATCTTATATACACAGTAGAAAATAATATAGATTTTTTAAAGG +ATGATACATTAAGTAAAGTAAACAATTTTACCCTCAATCATGTACTAGCTCTCAAGTATCTAGTTAGCAA +TTTTCCTCAACATGTTATTACTAAGGATGTATTAGCTAATACCAATTTTTTTGTTTTTATACATATGGTA +CGATGCTGTAAAGTATACGAAGCGGTTTTACGACACGCATTTGATGCACCCACGTTGTACGTTAAAGCAT +TGACTAAGAATTATTTATCGTTTAGTAACACAATACAGTCGTACAAGGAAACCGTGCATAAACTAACACA +AGATGAAAAATTTTTAGAGGTTGCCGAATACATGGACGAATTAGGAGAACTTATAGGCGTAAATTATGAC +TTAGTTCTTAATCCATTATTTCACGGAGGGGAACCCATCAAAGATATGGAAATCATTTTTTTAAAACTGT +TTAAGAAAACAGACTTCAAAGTTGTTAAAAAATTAAGTGTTATAAGATTACTTATTTGGGCATACCTAAG +CAAGAAAGATACAGGCATAGAGTTTGCGGATAATGATAGACAAGATATATATACTCTATTTCAACAAACT +GGTAGAATAGTCCATAGCAATCTAACAGAAACGTTTAGGGATTATATCTTTCCCGGAGATAAGACTAGCT +ATTGGGTGTGGTTAAACGAAAGTATAGCTAATGATGCGGATATCGTTATTAATAGATCCGCCATTACCAT +GTATGATAAAATTCTTAGTTATATATACTCTGAGATAAAACAGGGACGCGTTAATAAAAACATGCTTAAG +TTAGTTTATATCTTTGAGCCTGAAAAAGATATCAGAGAACTTCTGCTAGAAATCATATATGATATTCCTG +GAGATATCCTATCTATTATTGATGCAAAAAACGATGATTGGAAAAAATATTTTATTAGTTTTTACAAAGC +TAATTTTATTAACGGTAATACATTTATTAGTGATAGAACGTTTAACGAGGACTTATTCAGAGTTGTTGTT +CAAATAGATCCCGAATATTTCGATAATGAACGAATTATGTCTTTATTCTATACGAGTGCTGCGGACATTA +AACGATTTGATGAGTTAGATATTAATAACAGTTATATATCTAATATAATTTATGAGGTGAACGATATCAC +ATTAGATACAATGGATGATATGAAGAAGTGTCAAATCTTTAACGAGGATACGTTGTATTATGTTAAGGAA +TACAATACATACCTGTTTTTGCACGAGTCGGATCCCATGGTCATAGAGAACGGAATACTAAAGAAACTGT +CATCTATAAAATCCAAGAGTAGACGGCTGAACTTGTTTAGCAAAAACATTTTAAAATATTATTTAGACGG +ACAATTGGCTCGTCTAGGTCTTGTGTTAGATGATTATAAAGGAGACTTATTAGTTAAAATGATAAACCAT +CTCAAATCTGTGGAGGATGTATCCGCATTCGTTAGATTTTCTACAGATAAAAACCCTAGTATTCTTCCAT +CGCTAATCAAAACTATTTTAGCTAGTTATAATATTTCCATCATCGTCTTATTTCAAAGGTTTTTAAGAGA +TAATCTATATCATGTAGAAGAATTCTTGGATAAAAGCATCCATCTAACCAAGACTGATAAGAAATATATA +CTTCAATTGATAAGGCACGGTAGATCATAGAACAAACCAAATATATTATTAATAATTTGTATATACATAG +ATATAATTATCATATATTAAAAAATAACACATTTTTGATAAATGGAAACTGTTGCAACAATTCAGACTCC +CACCAAATTAATGAATAAAGAAAATGCAGAAATGATTTTGGAAAAAATTGTTAATCATATAGCTATGTAT +ATTAGTGACGAATCAATATATTCAGAAAATAATCCTGAATATATTGATTTTCGTAACAGATACGGAGACT +ATAGATCTCTCATTATAAAAAGTGATCACGAGTTTGTAAAGCTATGTAAAGATCATGCAGAGAAAAGTTC +TCCAGAAACGCAACAAATGATTATCAAACACATATACGAACAATATCTTATTCCAGTATCTGAAGTACTG +TTAAAACCTATAATGTCCATGGGTGACATATTTACATATAACGGATGTAAAGACAATGAATGGATGCTAG +AACAACTCTCTACCCTAAACTTTAACAATCTCTACACATGGAACTCATGTAGCATAGGCAATGTAACGCG +TCTGTTTTATACATTTTTTAGTTATCTGATGAAAGATAAACTAAATATATAAGTATAATCCCATTAATAC +TTTAACCTGATGTATTATTACCTGCATCTTATTAGAATATTAACCTAACTAAAAGACATAAAAAGCGGGG +ATATAAATATTATGGCAGCAACCGTTCCGCGTTTTGACGATGTGTACAAAAATGCACAAAGAAGAATTCT +AGATCAAGAAACATTTTTTAGTAGAGGTCTAAGTAGACCGTTAATGAAAAACACATATCTATTTGATAAT +TACGCGTATGGATGGATACCAGAAACTGCAATTTGGAGTAGTAGATACGCAAACCTAGATGCTAGTGACT +ATTATCCCATTTCGTTGGGATTACTTAAAAAGTTTGAATTTCTCATGTCTCTATATAAAGGTCCTATTCC +CGTATATGAAGAAAAAGTAAATACTGAATTCATTGCTAATGGATCTTTCTCCGGTAGATACGTATCATAT +CTTAGAAAGTTTTCTGCCCTTCCAACAAACGAGTTTATTAGTTTTTTATTATTGACCTCCATCCCTATCT +ATAATATCTTATTCTGGTTTAAAAACACACAGTTTGATATTACTAAACACACATTATTCAGATACGTCTA +TACAGATAATACCAAACACCTTGCGTTGGCTAGGTATATACATCAAACAGGAGACTATAAGCCTTTGTTT +AGTCGTCTCAAAGAGAATTATATATTTACCGGTCCCGTTCCAATAGGTATCAAAGATATAGATTACCCTA +ATCTTAGTAGAGCAAGAAGTCCATCCGATTATGAGACATTAGCTAATATTAGTACTATATTGTACTTTAC +CAAGTATGATCCAGTATTAATGTTTTTATTGTTTTACGTACCTGGGTATTCAATTACTACAAAAATTACT +CCAGCCGTAGAATATCTAATGGATAAACTGAATCTAACAAAGAGCGACGTACAACTGTTGTAAATTATTT +TTATGCTTCGTAAAATGTAGGTCTTGAACCAAACATTCTTTGAAAAAATGAGATGCATAAAACTTTATTA +TCCAATAGATTAACTATTTCAGACGTCAATCGTTTAAAGTAAACTTCGTAAAATATTCTTTGATTGCTGC +CGAGTTTAAAACTTCTATCGATAATTGTTTCATATGTTTTAATATTTACAAGTTTTTTGGTCCATGGTAC +ATTAGCTGGACAGATATATGCAAAATAATATCGTTCTCCAAGTTCTATAGTCTCTGGATTGTTTTTATTA +TATTCAGTAACCAAATACATATTAGGGTTATCTGCGGATTTATAATTTGAGTGATGCATTCGACTCAACA +TAAATAATTCTAGAGGAGACGATCTACTATCAAATTCGGATCGTAAATCTGTTTCTAAAGAACGGAGAAT +ATCTATACATACCTGATTAGAATTCATCCGTCCTTCAGACAACATCTCAGACAGTCTGGTCTTGTATGTC +TTAATCATATTCTTATGAAACTTGGAAACATCTCTTCTAGTTTCACTAGTACCTTTATTAATTCTCTCAG +GTACAGATTTTGAATTCGACGATGCCGAGTATTTCATCGTTGTATATTTCTTCTTCGATTGCATAATCAA +ATTCTTATATACCGCCTCAAACTCTATTTTAAAATTATCAAACAATACTCTACTATTAATCAGTCGTTCT +AACTCCTTTGCTATTTCTATGGACTTATCTACATCTTGACTGTCTATCTCTGTAAACACGGAGTCGGTAT +CTCCATACACGCTACGAAAACGAAATCTATAATCTATAGGCAACGATGTTTTCACAATCGGATTAATATC +TCTATCGTCCATATAAAATGGATTACTTAATGTATTGGCAAACCGTAACATACCGTTGGATAACTCTGCT +CCATTTAGTACCGATTCTAGATACAAGATCATTCTACGTCCTATGGATGTGCAACTCTTAGCCGAAGCGT +ATGAGTATAGAGCACTATTTCTAAATCCCATCAGACCATATACTGAGTTGGCTACTATCTTGTACGTATA +TTGCATGGAATCATAGATGGCCTTTTCAGTTGAACTGGTAGCCTGTTTTAACATCTTTTTATATCTGGCT +CTCTCTGCCAAAAATGTTCTTAATAGTCTAGGAATGGTTCCTTCTATTGATCTATCGAAAATTGCTATTT +CAGAGATGAGGTTCGGTAGTCTAGGTTCACAATGAACCGTAATATATCTAGGAGGTGGATATTTCTGAAG +CAAGAGCTGATTATTTATTTCTTCTTCCAATCTATTGGTACTAACAACGACACCGACTAATGTTTCCGGA +GATAGATTTCCAAAGATACACACATTAGGATACAGACTGTTATAATCAAAGATTAATACATTATTACTAA +ACATTTTTTGTTTTGGAGCAAATACCTTACCGCCTTCATAAGGAAACTTTTGTTTTGTTTCTGATCTGAC +TAAGATAGTTTTAGTTTCCAACAATAGCTTTAACAGTGGACCCTTGATGACTGTACTCGCTCTATATTCG +AATACCATGGATTGAGGAAGCACATATGTTGACGCACCAGCGTCTGTTTTTGTTTCTACTCCATAATACT +CCCACAAATACTGACACAAACAAGCATCATGAATACAGTATCTAGCCATATCTAAAGCTATGTTTAGATT +ATAATCCTTATACATCTGAGCTAAATCAATGTCATCCTTTCCGAAAGATAATTTATATGTATCATTAGGT +AAAGTAGGACATGATAGTACGACTTTAAATCCATTTTCCCAAATATCTTTACGAATTACTTTACATATAA +TATCCTCATCAACAGTCACATAATTACCTGTTGTTAAAACCTTTGCAAATGTATCGGCTTTGCCTTTCGC +GTCCGTAGTATCGTCACCGATGAACGTCATTTCTCTAACTCCTCTATTTAATACTTTACCCATGCAACTG +AACGCGTTCTTGGATATAGAATCCAATTTGTACGAATCCAATTTTTCAGATTTTTGAATGAATGAATATA +GATCGAAAAATATAGTTCCATTATTGTTATTAACGTGAAACGTAGTATTGGCCATGCCGCATACTCCCTT +ATGACTAGACTGATTTCTCTCATAAATACAGAGATGTACAGCTTCCTTTTTGTCTGGAGATCTAAAGATA +ATCTTCTCTCCTGTTAATAACTCTAGACGATTAGTAATATATCTCAGATCAAAGTTATGTCCGTTAAAGG +TAACGACGTAGTCGAACGTTAGTTCCAACAATTGTTTAGCTATTCGTAACAAAACTATTTCAGAACATAG +AACTAGTTCTCGTTCGTAATCCATTTCCATTAGCGACTGTATCCTCAAACATCCTCTATCGACGGCTTCT +TGTATTTCCTGTTCCGTTAACATCTCTTCATTAATGAGCGTAAACAGTAATCGTTTACCACTTAAATCGA +TATAACAGTAACTTGTATGCGAGATTGGGTTAATAAATACAGAAGGAAACTTCTTATCGAAGTGACACTC +TATATCTAGAAATAAGTACGATCTTGGGATATCGAATCTAGGTATTTCTTTAGCGAAACAGTTACGTGGA +TCGTCACAATGATAACATCCATTGTTAATCTTTGTCAAATATTGCTCGTCCAACGAGTAACATCCGTCTG +GAGATATCCCGTTAGAAATATAAAACCAACTAATATTGAGAAATTCATCCATGGTGGCATTTTGTATGCT +GCGTTTCTTTGGCTCTTCTATCAACCACATATCTGCGACGGAGCATTTTCTATCTTTAATATCTAGATTA +TAACTTATTGTCTCGTCAATGTCTATAGTTCTCATCTTTCCCATCGGCCTCGCATTAAATGGAGGAGGAG +ATAATGACTGATATATTTCGTCCGTCACTACGTAATAAAAGTAATGAGGAAATCGTATAAATACTGTCTC +GCCATTTCGACATCTGGATTTCAGATATAAAAATCTGTTTTCACCGTGACTTTCAAACCAATTAATACAC +CTAACATCCATTTCTAGAATTTAGAAATATATTTTCATTTAAATGAATCCCAAACATTGGGGAAGAGCCA +TATGGACCATTATTTTTATAGTACTTTCGCAAGCGGGTTTAGACGGCAACATAGAAGCGTGTAAACGAAA +AATATATACTATAGTCAGCACTCTTCCATGTCCTGCATGTAGACGACACGCGACTATCGCTATAGAGGAC +AATAATGTCATGTCTAGCGATGATCTGAATTATATTTATTATTTTTTCATCAGATTATTTAACAATTTGG +CATTTGATCCCAAATACGCAATCGATGTGTCAAAGGTTAAACCTTTATAAACTTAACCCATTATAAAACT +TATGATTAGTCACGACTGAAATAACCGCGTGATTATTTTTTGGTATAATTCTACACGGCATGGTTTCTGT +GACTATGAATTCAACACCTGTTATCTTAGTGAAATCTTTAACAAACAGCAAGGGTTCGTCAAAGACATAA +AACTCATTGTTTACGATCGAAATAGACCCCCTATCACACTTAAAATAAAAAATATCCTTATCCTTTACCA +CCAAATAAAATTCTGATTGGTCAATGTGAATGTATTCACTTAACAGTTCCACAAATTTATTTATTAACTC +CGAGGCACATACATCGTCGGTATTTTTTATGACAAACTTTACTCTTCCAGCATCCGTTTCTAAAAAAATA +TTAACGAGTTCCATTTATATCATCCAATATTATTGAAATGACGTTGATGGACAGATGATACAAATAAGAA +GGTACGGTACCTTTGTCCACCATCTCCTCCAATTCATACTCTATTTTGTCATTAACTTTAATGTGTGAAA +ACAGTACGCCACATGCTTCCATGACAGTGTGTAACACTTTGGATACAAAATGTTTGACATTAGTATAATT +GTCCAAGACTGTCAATCTATAATAGATAGTAGCTATAATATATTCTATGATGGTATTGAAGAAGATGACA +ACCTTGGCATATTGATCATTTAACACAGACATGGTATCAACAAATAGCTTAAATGAAAGAGAATCAGTAA +TTGGAATAAGCGTCTTCTCGATGTAGTGTCCGTATACCAACATGTCTGATATTTTGATGTATTCCATTAA +ATTATTTAGTTTTTTCTTTTTATTCTCGTTAAACAGAATTTCTGTCAATGGACCCCAACATCGTTGACCT +ATTAAGTTTTGATTGATTTTTCCGTGTAAGGCGTATCTAGTCAGATCGTATAGCCTATCCAATAATCCAT +CGTCTGTGCGTAGATCACATCGTACACTTTTTAATTTTCTATAGAAGAGTGACAGACATCTGGAGCAATT +ACAGACAGCAATTTCTTTATTCTCTACAGATGTAAGATACTTGAAGACATTCCTATGATGATGCAGAATT +TTGGATAACACGGTATTGATGGTATCTGTTACCATAATTCCTTTGACTGATAGTGTCAAAGTACAAGATT +TCCAATCTTTTGCAATTTTCAGTACCATTATCTTTGTTTTGATATCTATATCAGACAGCATGGTACGTCT +GACAACACAGGGATTAAGACGGAAAGATGAAATGATTCTCTCAACATCTTCAATAGATACCTTGCTATTT +TTTTTGGCATTATCTATATGTGAGAGAATATCCTCTAGAGAATCAGTATCCTTTTTGATGATAGTGGATC +TCAATGACATGGGACGTCTAAACCTTCTTATTCTATCACCAGATTGCATGGTGATTTGTCTTCTTTCTTT +TATCATGATGTAATCTCTAAATTCATCGGCAAATTGTCTATATCTAAAATCATAATATGAGATGTTTACC +TCTACAAATATCTGTTCGTCCAATGTTAGAGTATCTATATCAGTTTTGTATTCCAAATTAAACATGGCAA +CGGATTTAATTTTATATTCCTCTATTAAGTCCTCGTCGATAATAACAGAATGTAGATAATCATTTAATCC +ATCGTACATTGTTGGAAGATGCTCGTTGACAAAATCTTTAATTGTCTTGATGAAGGTGGGACTATATCTA +ACATCTTGATTAATAAAATTTATAACATTGTCCATAGGATACTTTGTAACTAGTTTTATACACATCTCTT +CATCGGTAAGTTTAGACAGAATATCGTGAACAGGTGGTATATTATATTCATCAGATATACGAAGAATAAT +GTCCAAATCTATATTGTTTAATATATTATATAGATGTAGTGTAGCTCCTACAGGAATATCTTTAACTAAG +TCAATGATTTCATCAACAGTTAGATCTATTTTAAAGTTAATCATATAGGCATTGATTTTTAAAAGGTATG +TAGCCTTGACTACATTCTCATTAATTAACCATTCCAAGTCACTGTGTGTAAGAAGATTATATTCTATCAT +AAGCTTGACTACATTTGGTCCCGATACCATTAAAGAATTCTTATGATATAAGGAAACAGCTTTTAGGTAC +TCATCTACTCTACAAGAATTTTGGAGAGCCTTAACGATATCAGTGACGTTTATTATTTCAGGAGGAAAGA +ACCTAACATTGAGAATATCTGAATTAATAGCTTCCAGATACAGTGATTTTGGCAATAGTCCGTGTAATCC +ATAATCCAGTAACACGAGCTGGTGCTTGCTAGACACCTTTTCAATGTTTAATTTTTTTGAAATAAGCTTT +GATAAAGCCTTCCTCGCAAATTCCGGATACATGAACATGTCGCCAACATGATTAAGTATTGTTTTTCATT +ATTTTTATATTTTCTCAACAAGTTCTCAATACCCCAATAGATAATAGAATATCACCCAATGCGTCCATGT +TGTCTATTTCCAACAGGTCGCTATATCCACCAATAGAAGTTTTCCCAAAAAAGATTCTAGGAACAGTTCT +ACCACCAGTAATTTGTTCAAAATAGTCACGCAATTCATTTTCGGGTTTAAATTCTTTAATATCTACAATT +TCATACGCTCCTCTTTTGAAACTAAACTTATTTAGAATATCCAGTGCGTTTCTACAAAAAGGACACGTAA +ACTTGACAAAAATTGTCACTTTGTTATTGGCCAACCTTTGTTGTACAAATTCCTCGGCCATTTTTAATAT +TTAAGTGATACAAAACTATCTCGACTTATTTAACTCTTTAGTCGAGATATATGGACACAGATAGTTATAT +GATAACCAACTACAGAAGACAAACGCTATAAAAAACATAATTACAACGAGCATATTTATAAATATTTTTA +TTCAGTATTACTTGATATAGTAATATTAGGTACAGTCAAACATTCAACCACTCTAGATACATTAACTCTC +TCATTTTCTTTAACAAATTCTGCAATATCTTCGTAAAAAGATTCTTGAAACTTTTTAGAATATCTATCGA +CTCTAGATGAAATAGCGTTCGTCAACATACTATGTTTTGTATACATAAAGGCGCCCATTTTAACAGTTTC +TAGTGACAAAATGCTAGCGATCCTAGGATCCTTTAGAATCACATAGATTGACGATTCGTCTCTCTTAGTA +ACTCTAGTAAAATAATCATACAATCTAGTACGCGAAATAATATTATCCTTGACTTGAGGAGATCTAAACA +ATCTAGTTTTGAGAACATCGATAAGTTCATCGGGAATGACATACATACTATCTTTAATAGAACTCTTTTC +ATCCAGTTGAATGGATTCGTCCTTAACCAACTGATTAATGAGATCTTCTATTTTATCATTTTCCAGATGA +TATGTATGTCCATTAAAGTTAAATTGTGTAGCGCTTCTTTTTAGCCTAGCAGCCAATACTTTAACATCAC +TAATATCGATATACAAAGGAGATGATTTATCGATGGTATTAAGAATTCGTTTTTCGACATCCGTCAAAAC +CAATTCCTTTTTGCCTGTATCATCCAGTTTGCCATTCTTTGTAAAGAAATTATTTTCTACTAGACTATTA +ATAAGACTGATAAGGATTCCTCCATAATTGCACAATCCAAACTTTTTCACAAAACTAGACTTTACGAGAT +CTACAGGAATGCGTACTTCAGGTTTCTTAGCTTGTGATTTTTTCTTTTGCGGACATTTTCTAGTGACCAA +CTCATCTACCATTTCATTGATTTTAGCAGTGAAATAAGCTTTCAATGCACGGGCACTGATACTATTGAAA +ACGAGTTGATCTTCAAATTCCGCCATTTAAGTTCACCAAACAACTTTTAAATACAAATATATCAATAGTA +GTAGAATAAGAACTATAAAAAAAATAATAATTAACCAATACCAACCCCAACAACCTGTATTATTAGTTGA +TGTGACAGTTTTCTCATCACTTAGAACAGATTTAACAATTTCTATAAAGTCTGTCAAATCATCTTCCTGA +GAACCCATAAATACACCAAATATAGCAGCGTACAACTTATCCATTTATACATTGAATATTGGCTTTTCTT +TATCGCTATCTTCATCATATTCATCATCAATATCGACAAGTCCCAGATTACGAACCAGATCTTCTTCTAC +ATTTTCAGTCATTGATACGCGTTCACTATCTCCAGAGAGTCCGATAACGTTAGCCACCACTTCTCTATCA +ATGATTAGTTTCTTGAGCGCGAATGTAATTTTTGTTTCCGTTCCGGATCTATAGAAAACTACAGGTGTGA +TAATTGCCTTGGCTAATTGTCTTTCTCTTTTACTGAGTGATTCTAGTTCACCTTCTATAGATCTGAGAAT +GGATGATTCTCCAGTCGAAACATATTCTACCATGGCTCCGTTTAATTTGTTGATGAAGATGGATTCATCC +TTAAATGTTTTCTCTGTAATAGTTTCCGCCGAAAGACTATGCAAAGAATTTGGAATGCGTTCCTTGTGCG +TAATGTTTCCATAGACAGCTTCTAGAAGTTGATACAACATAGGACTAGCCGCGGTAACTTTTATTTTTAG +AAAGTATCCATCGCTTCTATCTTGTTTAGATTTATTTTTATAAAGTTTAGTCTCTCCTTCCAACATAATA +AAAGTGGAAGTCATCTGACTAGATAAACTATCAGTAAGTTTTATAGAGATAGATGAACAATTAGCGTATT +GAGAAGCATTTAGTGTAACGTATTCGATACATTTTGCATTAGATTTACTAATCGATTTTGCATACTCTAT +AACACCCGCACAAGTCTGTAGAGAATCGCTAGATGCTGTAGGTCTTGGTGAAGTTTCAACTCTCTTCTTG +ATTACCTTACTCATGATTAAACCTAAATAATTGTACTTTGCAATATAATGATATATATTTTCACTTTATC +TCATTTGAGAATAAAAATGTTTTTGTTAACCGCTGCATGATGTACAGATTTCGGAATCGCAAACCACTTG +TGGTTTTATTTTATCCTTGTCCAATGTGAATTGAATGGGAGCGGATGCGGGTTTCGTACGTAGATAGTAC +ATTCCCGTTTTTAGACCGAGACTCCATCCGTAAAAATGCATACTCGTTAGTTTGGAATAACTCGGATCTG +CTATATGGATATTCATAGATTGACTTTGATCGATGAAGGCTCCCCTGTCTGCAGCCATTTTTATGATCGT +CTTTTGTGCAATTTCCCAAATAGTTTTATAAACTCGCTTAATATCTTCTGGAAGGTTTGTATTCTGAATG +GATCCACCATCTACCATAATCCTATTCTTGATCTCATCATTCCATAATTTTCTCTCGGTTAAAACTCTAA +GGAGATGCGGGTTAACTACTTGGAATTCTCCAGACAATACTCTCCGAGTGTAAATATTACTGGTATACGG +TTCCACCGACTCATTATTTCCCAAAATTTGAGCAGTTGATGCAGTCGGCATAGGTGCCACCAATAAACTA +TTTCTAAGACCGTATGTTCTGATTTTATCTTTTAGATGTTCCCAATTCCAAAGATCCGACGGTACAACAT +TCCAAAGATCATATTGTAGAATACCGTTACTGGCGTACGATCCTACATATGTATCATATGGTCCTTCCTT +CTCAGCTAGTTTACAACTCGCCTCTAATGCACCGTAATAAATGGTTTCAAAGATCTTCTTATTTAGATCT +TGTGCTTCCGGGCTATCAAATGGATAATTTAAGAGAATAAACGCGTCCGCTAATCCTTGAACACCAATAC +CGATAGGTCTATGTCTCTTATTAGAGATTTCAGCTTCTGGAATAGGATAATAATTAATATCTATAATTTT +ATTGAGATTTCTGACAATTACTTTGACCACATCCTTCAGTTTGAGAAAATCAAATCGCCCATCTATTACA +AACATGTTCAATGCAACAGATGCCAGATTACACACGGCTACCTCATTAGCATCCGCATATTGTATTATCT +CAGTGCAAAGATTACTACACTTGATAGTTCCTAAATTTTGTTGATTACTCTTTTTGTTACACGCATCCTT +ATAAAGAATGAATGGAGTACCAGTTTCAATCTGAGATTCTATAATCGCTTTCCAGACGACTCGAGCCTTT +ATTATAGATTTGTATCTCCTTTCTCTTTCGTATAGAGTATACAATCGTTCGAACTCGTCTCCCCAAACAT +TGTCCAATCTAGGACATTCATCCGGACACATCAACGACCACTCTCCGTCATCCTTCACTCGTTTCATAAA +GAGATCAGGAATCCAAAGAGCTATAAATAGATCTCTTGTTCTATGTTCCTCGTTTCCTGTATTCTTTTTA +AGATCGAGGAACGCCATAATATCAGAATGCCACGGTTCCAAGTATATGGCCATAACTCCAGGCCGTTTGT +TTCCTCCCTGATCTATGTATCTAGCGGTGTTATTATAAACTCTCAACATTGGAATAATACCGTTTGATAT +ACCATTGGTACCGGAGATATAGCCTCCACTGGCACGAATATTACTAATTGATAGACCTATTCCCCCTGCC +ATTTTAGAGATTAATGCGCATCGTTTTAACGTGTCATAGATGCCTTCTATGCTATCATCGATCATGTTAA +GTAGAAAACAGCTAGACATTTGGTGACGAGTAGTTCCCGCATTAAATAAGGTAGGAGAAGCGTGCGTAAA +CCATTTTTCAGAAAGTAGATTGTACGTCTCAATAGCTGAGTCTATATCCCATTGATGAATTCCTACTGCG +ACACGCATTAACATGTGCTGAGGTCTTTCAACAATTTTGTTGTTTATTTTCAACAAGTAGGATTTTTCCA +AAGTTTTAAAACCAAAATAGTTGTATGAAAAGTCTCGTTCGTAAATAATAACCGAATTGAGCTTATCCTT +ATATTTGTTAACTATATCCATGGTAATACTTGAAATAATCGGAGAATGTTTCCCATTTTTAGGATTAACA +TAGTTGAATAAATCCTCCATCACTTCACTAAATAGTTTTTTTGTTTCCTTGTGTAGATTTGATATGGCTA +TTCTGGCGGCTAGAATGGCATAATCCGGATGTTGTGTAGTACAAGTGGCTGCTATTTCGGCTGCCAGAGT +GTCCAATTCTACCGTTGTTACTCCATTATATATTCCTTGAATAACCTTCATAGCTATTTTAATAGGATCT +ATATGATCCGTGTTTAAGCCATAGCACAATTTTCTAATACGAGACGTGATTTTATCAAACATGACATTTT +CCTTGTATCCATTTCGTTTAATGACAAACATTTTTGTTGGTGTAATAAAAAAAAATTATTTAATTTTTCA +TTAATAGGGATTTGACGTATGTAGCGTACAAAATTATCGTTCCTGGTATATAGATAAAGAGTCCTATATA +TTTGAAAATCGTTACGGTTCGATTAAACTTTAATGATTGCATAGTGAATATATCATTAGGATTTAACTCC +TTGACTATCATGGCGGTGCCAGAAATTACCATCAAAAGCATTAATACAGTTATACAGATCGCAGTTAGAA +CGGTTATAGCATCCACCATTTATATCTAAAAATTAGATCAAAGAATATGTGACAACGTCCTAGTTGTATA +CTGAGAATTGACGAAACAATGTTTCTTACATATTTTTTTCTTATTAGTAACCGACTTAATAGTAGGAACT +GGAAAACTAGACTTGATTATTCTATAAGTATAGATACCCTTCCAAATAATGTTCTCTTTGATAAAAGTTC +CAGAAAATGTAGAATTTTTTAAAAAGTTATCTTTTGCTATTACTAATATCGTGGTTAGACGCTTATTATT +AATATGAGTGATGAAATCCACACCGCTTCTAGATATCGCTTTTATTTCCACATTAGATGGTAAATCCAAT +AGTGAAACTATCTTTTTAGGAATGTATGGACTTGCGTTTAGAGGAGTGAACGTCTTCGGAGTAGTAAAGG +ATGATTCGTCAAATGAATAAACAATTTCACAAATGGATGTTAATGTATTAGTAGGAAATTTTTTGACGCT +AGTGGAATTGAAGATTCTAATGGATGATGTTCTACCTATTTCATCCGATAACATGTTAATTTCCAACACC +AACGGTTTTAATATTTCGATGATATACGGTAGTCTCTCTTTCGGACTTATATAGCTTATTCCACAATACG +AGTCATTATATACTCCAAAAAACAAAATAACTAGTATAAAATCTTTATCGAATGGGAAAAACGAAATTAT +CGATATAGGTATAGAATCCGGAACATTGAACGTATTAATACTTAATTCTTTTTCAGTGGTAAGAACCGAT +AGGTTATTGACATTGTATGGTTTTAAATATTCTATAACTTGAGACTTGATAGATATTAATGACGAATTGA +AAATTATTTTTATCACCACGTGTGTTTCAGGATCATCGTCGACGCCAGTCAACCAACCGAATGGAGTAAA +ATAAATATCATTAATATATGCTCTAGATATTAGTATTTTTATTAATCCTTTGATTATCATCTTCTCGTAC +GCGAATGATTCCATGATCAAGAGTGATTTGAGAACATCCTCCGGAGTATTAATGGGCTTAGTAAACAGTC +CATCGTTGCAATAATAAAAGTTGTCCAAGTTAAAGGATATTATGCATTCGTTTAAAGATATCACCTCATC +TAACGGAGACAATTTTTTGGTAGGTTTTAGAGACTTTGAAGCTACTTGTTTAACAAAGTTATTCATCGTC +GTCTACTATTCTATTTAATTTTGTAGTTAATTTATCACATATCACATTAATTGACTTTTTGGTCCACTTT +TCCATACGTTTATATTCTTTTAATCCTGCGTTATCCGTTTCCGTTATATACAGGGATAGATCTTGCAAGT +TAAATAGAATGCTCTTAAATAATGTCATTTTTTTATCCGCTAAAAATTTAAAGAATGTATAAACTTTTTT +CAAAGATTTAAAACTTTTAGGTGGAGTTCTGGTACACAATATCATAAACAAACTAATAAACATCCCACAT +TCAGATTCCAACAATTGATTAACTTCCACATTAATACAGCCTATTTTCGCTCCAAATGTACATTCGAAAA +ATCTGAATAAAACATCAATATCGCAATTTGTATTATCCAATACAGAATGTCTGTGATTCGTGTTAAAACC +ATCGGAAAAAGAATAGAAATAAAAATTATTATAATGGTGGAATTCAGTTGGAATATTGCCTCCGGAGTCA +TAAAAGGATACTAAACATTGTTTTTTATCATAAATTACACATTTCCAATGAGACAAATAACAAAATCCAA +ACATTACAAATCTAGAGGTAGAACTTTTAATTTTGTCTTTAAGTATATACGATAAGATATGTTTATTCAT +AAACGCGTCAAATTTTTCATGAATAGCTAAGGAGTTTAAGAATCTCATGTCAAATTGTCCTATATAATCC +ACTTCGGATCCATAAGCAAACTGAGAGACTAAGTTCTTAATACTTCGATTGCTCATCCAGGCTCCTCTCT +CAGGCTCTATTTTCATCTTGACGACCTTTGGATTTTCACCAGTATGTATTCCTTTACGTGATAAATCATC +GATTTTCAAATCCATTTGTGAGAAGTCTATCGCCTTAGATACTTTTTCCCGTAGTTGAGGTTTAAAGAAA +TACGCTAACGGTATACTAGTAGGTAACTCAAAGACATCATATATAGAATGGTAACGCGTCGTTAACTCGT +CGGTTAACTCTTTCTTTTGATCGAGTTCGTCGCTACTATTGGGTCTGCTCAGGTGCCCCGACTCTACTAG +TTCCAACATCATACCGATAGGAATACAAGACACTTTGCCAGCGGTTGTAGATTTATCATATTTCTCCACC +ACATATCCGTTACAATTTGTTAAGAATTTAGATACATCTATATTGCTACATAATCCAGCTAGTGAATATA +TATGACATAATAAATTGGTAAATCCTAGTTCTGGTATTTTACTAATTACTAAATCTGTATATCTTTCCAT +TTATCATGGAAAAGAATTTACCAGATATCTTCTTTTTTCCAAACTGCGTTAATGTATTCTCTTACAAATA +TTCACAAGATGAATTCAGTAATATGAGTAAAACGGAACGTGATAATTTCTCATTGGCTGTGTTTCCAGTG +ATAAAACATAGATGGCATAACGCACACGTTGTAAAACATAAAGGAATATACAAAGTTAGTACAGAAGCAC +GTGGAAAAAAAGTATCTCCTCCATCACTAGGAAAACCCGCACATATAAACCTAATGTCGAAGCAATATAT +ATATAGTGAGTATGCAATAAGCTTTGAATGTTATAGTTTTCTAAAATGTATAACAAATACAGAAATCAAT +TCGTTCGATGAGTATATATTAAGAGGACTATTAGAAGCTGGTAATAGTTTACAGATATTTTCCAATTCCG +TAGGCAAACGAATAGATACTATAGGTGTACTAGGGAATAAGTATCCATTTAGCAAAATTCCATTGGCCTC +ATTAACTCCTAAAGCACAACGAGAGATATTTTTAGCGTGGATTTCTCATAGACCTGTAGTTTTAACTGGA +GGAACCGGAGTGGGTAAGACGTCACAGGTACCCAAGTTATTGCTTTGGTTTAATTATTTATTTGGTGGAT +TCTCTACTCTAGATAAAATCACTGACTTTCACGAAAGACCAGTCATTCTATCTCTTCCTAGGATAGCTTT +AGTTAGATTGCATAGCAATACCATTTTAAAATCATTGGGATTTAAGGTACTAGATGGATCTCCTATCTCT +TTACGGTACGGATCTATACCGGAAGAATTAATAAACAAACAACCAAAAAAATATGGAATTGTATTTTCTA +CCCATAAGTTATCTCTAACAAAACTATTTAGTTATGGCACTATTATTATAGACGAAGTTCATGAGCATGA +TCAAATAGGAGATATTATTATAGCAGTAGCGAGAAAGCATCATACGAAAATAGATTCTATGTTTTTAATG +ACTGCCACGTTAGAGGATGACAGGGAACGTCTAAAAATATTTTTACCTAATCCCGCATTTATACATATTC +CTGGAGATACACTGTTTAAAATTAGCGAGGTATTTATTCATAATAAGATAAATCCATCTTCCAGAATGGC +ATATATAGAAGAAGAAAAGAGAAATTTAGTTACCGCTATACAGATGTATACTCCTCCTGATGGATCATCC +GGTATAGTCTTTGTGGCATCCGTTGCACAGTGTCACGAATATAAATCATATTTAGAAAAAAGATTACCGT +ATGATATGTATATTATTCATGGTAAGGTCTTAGATATAGACGAAATATTAGAAAAAGTGTATTCATCACC +TAATGTATCGATAATTATTTCTACTCCTTATTTGGAATCCAGCGTTACTATACGCAATGTTACACACATT +TATGATATGGGTAGAGTTTTTGTCCCCGCTCCTTTTGGAGGATCACAACAATTTATTTCTAAATCTATGA +GAGATCAACGAAAAGGAAGAGTAGGAAGAGTTAATCCTGGAACATACGTATATTTCTATGATCTGTCTTA +TATGAAGTCTATACAGCGAATAGATTCAGAATTTCTACATAATTATATATTGTACGCTAATAAGTTTAAT +CTAACACTCCCCGAAGATTTGTTTATAATCCCTACAAATTTGGATATTCTATGGCGTACAAAGGAATATA +TAGACTCGTTCGATATTAGTACAGAAACATGGAATAAATTATTATCCAATTATTATATGAAGATGATAGA +GTATGCTAAACTTTATGTACTAAGTCCTATTCTCGCTGAGGAGTTGGATAACTTTGAGAGGACGGGAGAA +TTAACTAGTATTGTACAAGAAGCCATTTTATCTCTAAATTTACGAATTAAGATTTTAAAATTTAAACATA +AAGATGATGATACGTATATACACTTTTGTAGAATATTATTCGGCGTCTATAACGGAACAAACGCTACTAT +ATATTATCATAGACCTCTAACGGGATATATGAATATGATTTCAGATACTATATTTGTTCCTGTAGATAAT +AACTAAAAATCAAACTCTAATGACCACATCTTTTTTTAGAGATGAAAAATTTTCCACATCTCCTTTTGTA +GACACGACTAAACATTTTGCAGAAAAAAGTTTATTATTATTTAGATAATCGTATACTTCATCAGTGTAGA +TAGTAAATGTGAACAGATAAAAGGTATTCTTGCTCAATAGATTGGTAAATTCCATAGAATATATTAATCC +TTTCTTCTTGAGATCCCACATCATTTCAACCAAAGACGTTTTATCCAATGATTTACCTCGTACTATACCA +CATACAAAACTAGATTTTGCAGTGATGTCGTACCTGGTATTCCTACCAAACAAAATTTTACTTTTAGTTC +TTTTAGAAAATTCTAAGGTAGAATCTCTATTTGTCAATATGTCATCTATGGAATTACCACTAGCAAAAAA +TGATAGAAATATATATTGATACATCGCAGCTGGTTTTGATCTACTATACTTTAAAAACGAATCAGATTCC +ATAATTGCCTGTATATCATCAGCTGAAAAACTATGTTTTACACGTATTCCTTCGGCATTTCTTTTTAATG +ATATATCTTGTTTAGACAATGATAAAGTTATCATGTCCATGGGAGATGCGTCTCCGTATCGTATAAATAT +TTCATTAGATGTTAGACGCTTCATTAGGGGTATACTTCTATAAGGTTTCTTAATTAGTCCATCATTGGTT +GCGTCAAGAACTACTATCTGATGTTGTTGGGTATCTCTAGTGTTACACATGGCCTTACTAAAGTTTGGGT +AAATAACTATGATATCTCTATTAATTATAGATGCATATATTTCATTCGTCAAGGATATTAATATCGACTT +ACTATCGTCATTAATACGTGTAATATAATCATATAAATCATGCGATAGCCAAGGAAAATTCAAATAGATG +TTCATCATATAATCGTCGCTATAATTCATATTAATACTTTGACATTGACTAATTTGTAATATAGCCTCGC +CACGAAGAAAGCTCTCGTATTCAGTTTCATCGATAAAGGATACCGTTAAATATAACTGGTTGCCGATAGT +CTCATAGTCTATTAAGTGGTAAGTTTCGTACAAATACAGAATCCCTAAAATATTATCTAATGTGGGATTA +ATCCTTACCATAACTGTATAAAATGGAGCCGGAGTCATAACTATTTTACCGTTTGTACTTACTGGAATAG +ATGAAGGAATAATCTCCGGACATGATGGTAAAGACCCAAATGTCTGTTTGAAGAAATCCAATGTTCCAGG +TCCTAATCTCTTGACAAAAATTACGATATTCGATCCCGATATCCTTTGCATTCTATTTACCAGCATATCA +CGAACTATATTAAGATTATCTATCATGTCTATTCTCCCACCGTTATATAAATCGCCTCCGCTAAGAAACG +TTAGTATATCCATACAATGGAATACTTCATTTCTAAAATAGTATTCGTTTTCTAATTCTTTAATGTGAAA +TCGTATACTAGAAAGGGAAAAATTATCTTTGAGTTTTCCATTAGAAAAGAACCACGAAACTAATGTTCTG +ATTGCGTCTGTCTCCGTCGCTGAATTAATAGATTTACACCAAAAACTCATATAACTTCTAGATGTAGAAG +CATTCGCTAAAAAATTAGTAGAATCAAAGGATATAAGTAGATGTTCCAACAAGTGAGCAATTCCCAAGAT +TTCATCTATATCATTCTCGAATCCGAAATTAGAAATTCCCAAGTAGATATCCTTTTTCATCCGATCATTG +ATGAAAATACGAACTTTATTCGGTAAGACGATCATTTACTAAGGAGTAAAATAGGAAGTAACGTTCGTAT +ATCGTTATCGTCGTATAAATTAAAGGTGTGTTTTTTGCCATTAAGAGACATTATAATTTTACCAATATTG +GAATTATAATATAGGTGTATTTGAGCACTAGAAACGGTCGATGCATCGGTAAATATAGCTGTATCTAATG +TTCTAGTCGGTATTTCTTCATTTCGCTGTCTAATGATAGCGTTTTCTCTATCTGTTTCCATTACAGCTGC +CTGAAGTTTATTGGTCGGGTAATATGTAAAATAATAAGAAATACATACGAATAACAAAAATAAAATAAGA +TATAATAAAGATGCCATTTAGAGATCTAATTTTGTTCAACTTGTCCAAATTCCTACTTACAGAAGATGAG +GAATCGTTGGAGATAGTATCTTCCTTATGTAGAGGATTTGAAATATCTTACGATGACTTAATATCGTACT +TTCCAGATAGGAAATACCATAAATATATTTCTAAGGTATTTGAACATGTAGATTTATCGGAGGAATTAAG +TATGGAATTCCATGATACAACTCTGAGAGATTTAGTATATCTTAGATTGTACAAGTATTCCAAGTATATA +CGGCCGTGTTATAAATTAGGAGATAATCTAAAAGGTATAGTTGTTATAAAGGACAGAAATATATATATTA +GAGAAGCAAATGATGACTTGATAGAATATCTCCTCAAGGAATACACTCCTCAGATTTATACATATTCTAA +TGAGCGAGTTCCCATAGCTGGTTCAAAATTAATTCTTTGTGGATTTTCTCAAGTTACATTTATGGCGTAT +ACAACGTCGCATATAACAACAAATAAAAAGGTAGATGTTCTCGTTTCCAAAAAATGTATAGATGAACTAG +TCGATCCAATAAATTATCAAATACTTCAAAATTTATTTGATAAAGGAAGCGGAACAATAAACAAAATACT +CAGGAAGATATTTTATTCGGTAACAGGTGGCCAAACTCCATAGGTAGCTTTTTCTATTTCGGATTTTAGA +ATTTCCAAATTCACCAGCGATTTATCGGTTTTGGTGAAATCCAAGGATTTATTAATGTCCACAAATGCCA +TTTGTTTTGTCTGTGGATTGTATTTGAAAATGGAAACGATGTAGTTAGATAGATGCGCTGCGAAGTTTCC +TATTAGGGTTCCGCGCTTCACGTCACCCAACATACTTGAATCACCATCCTTTAAAAAAAATGATAAGATA +TCAACATGGAGTATATCATACTCGGATTTTAATTCTTCTACTGCCTCACTGACATTTTCACAAATACTAC +AATACGGTTTACCGAAAATAATCAGTACGTTCTTCATTTATGGGTATCAAAAACTTAAAATCGTTACTGT +TGGAAAATAAATCACTGACGATATTAGATGATAATTTATACAAAGTATACAATGGAATATTTGTGGATAC +AATGAGTATTTATATAGCCGTCGCCAATTGTGTCAGAAACTTAGAAGAGTTAACTACGGTATTCATAAAA +TACGTAAACGGATGGGTAAAAAAGGGAGGACATGTAACCCTTTTTATCGATAGAGGAAGTATAAAAATTA +AACAAGACGTTAGAGACAAGAGACGTAAATATTCTAAATTAACCAAGGACAGAAAAATGTTAGAATTAGA +AAAGTGTACATCCGAAATACAAAATGTTACCGGATTTATGGAAGAAGAAATAAAGGCAGAAATGCAATTA +AAAATCGATAAACTCACATTTCAAATATATTTATCTGATTATGATAACATAAAAATATCATTGAATGAGA +TACTAACACATTTCAACAATAATGAGAATGTTACATTATTTTATTGTGATGAACGAGACGCAGAATTCGT +TATGTGTCTAGAGGCTAAAACACAGTTCTCTACCACAGGAGAATGGCCGTTAATAATAAGTACCGATCAG +GATACTATGCTATTCGCGTCTGCTGATAATCATCCTAAGATGATAATAAACTTAACTCAACTGTTTAAAT +TTGTTCCCTCGGCAGAGGATAACTATTTAGCAAAATTAACTGCATTAGTGAATGGATGTGATTTCTTTCC +TGGACTCTATGGGGCATCTATAACACCCAACAACTTAAACAAAATACAATTGTTTAGTGATTTTACAATC +GATAATATAGTCACTAGTTTGGCAATTAAAAATTATTATAGAAAGACTAACTCTACCGTAGACGTGCGTA +ATATTGTTACGTTTATAAACGATTACGCTAATTTAGAAGATGTCTACTCGTATATTCCTCCTTGTCAATG +CACTGTTCAAGAATTTATATTCTCCGCATTAGATGAAAAATGGAATGAATTTAAATCATCTTATTTAGAG +AGCGTGCCGTTACCCTGCCAATTAATGTACGCATTAGAACCACGTAAGGAGATTGATGTTTCAGAAGTTA +AAACTTTATCATCTTATATAGATTTCGAAAATACTAAATCAGATATCGATGTTATAAAATCTATATCCTC +GATTTTTGGATATTCTAATGAAAACTGTAACACCATAGTGTTCGGCATCTATAAGGATAATTTACTACTG +AGTATAAATAATTCATTTTACTTTAACGATAGTCTGTTAATAACCAATACTAAAAGTGATAATATAATAA +ATATAGGTTACTAGATTAAAAATGGTGTTCCAGCTCGTGTGTTCTACGTGCGGCAAAGATATTTCTCACG +AACGATATAAATTGATTATACGAAAAAAATCATTAAAGGATGTACTAGTCAGTGTAAAGAACGAATGTTG +TAGGTTAAAATTATCTACACAAATAGAACCTCAACGTAACTTAACAGTGCAACCTCTATTGGATATAAAC +TAATGGATCCGGTTAATTTTATCAAGACATATGCGCCTAGAGGTTCTATTATTTCTATTAATTATGCCAT +GTCATTAACTAGTCATTTGAATCCATCGATAGAAAAACATGTGGGTATTTATTATGGTACGTTATTATCG +GAACACTTGGTAGTTGAATCTACCTATAGAAAAGGAGTTAGAATAATCCCATTGGATAGATTTTTTGAAG +GATATCTTAATGCAAAAGTATACATGTTAGAGAATATTCAAGTTATGAAAATAGCAGCTGATATGTCGTT +AACTTTACTAGGTATTCCATATGGATTTGGTCATGATAGAATGTATTGTTTTAAATTGGTAGCTGAATGT +TATAAAAATGCCGGTATTGATACATCGTCTAAACGAATATTAGGTAAAGATATTTTTCTGAGCCAAAACT +TTACAGATGATAATAGATGGATAAAGATATATGATTCTAATAATTTAACATTTTGGCAAATTGATTACCT +TAAAGGGTGAGTTAATATGCATAACTACTCCTCCGTTGTTTTTTCCCTCGTTCTTTTTCTTAACGTTGTT +TGCCATCACTCTCATAATGTAAAGATATTCTAAAATGGTAAACTTTTGCATATCGGATGCAGAAATTGGT +ATAAATGTTGTAATTGTATTATTTCCCGTCAATGGACTAGTCACAGCTCCATCAGTTTTATATCCTTTAG +AGTATTTCTCACTCGTGTCTAGCATTCTAGAGCATTCCATGATTTGTTTATCGTTGATATTGGCCGGAAA +GATAGATTTTTTATTTTTTATTATATTACTATTGGCAATTGTAGATATAACTTCTGGTAAATATTTTTCT +ACCTTTTCATTCTCTTCTATTTTTAAGCCGGCTATATATTCTGCTATATTGTTGCTAGTATCAATACCTT +TTCTGGCTAAGAAGTCATATGTGGTATTCACTATATCAGTTTTAACTGGTAGTTCCATTAGCCTTTCCAC +TTCTGCAGAATAATCAGAAATTGGTTCTTTACCAGAAAATCCAGCTACTATAATAGGCTCACCGATGATC +ATTGGCAAAATCCTATATTGTACCAGATTAATGAGAGCATATTTCATTTCCAATAATTCTGCTAGTTCTT +GAGACATTGATTTATTTGATGAATCTATTTGGTTCTCTAGATACTCTACCATTTCTGCCGCATACAATAA +CTTGTTAGATAAAATCAGGGTTATCAAAGTGTTTAGTGTGGCTAGAATAGTGGGCTTGCACGTATTAAAG +AATGCTGTAGTATGAGTAAACCGTTTTAACGAATTATATAGTCTCCAGAAATCTGTGGCGTTGCATACAT +GAACTGAATGACATCGAAGATTGTCCAATATTTTTAATAGCTGCTCTTTGTCCATTATTTCTATATTTGA +CTCGCAACAATTGTAGATACCATTAATCACTGATTCCTTTTTCGATGCCGGACAATAGCACAATTGTTTA +GCTTTGGACTCTATGTATTCAGAATTAATAGATATATCTCTCAATACAGATTGCACTATACATTTTGAAA +CTATGTCAAAAATTGTAGAACGACGCTGTTCTGTAGCCATTTAACTTTAAATAATTTACAAAAATTTAAA +ATGAGCATCCGTATAAAAATCGATAAATTGCGCCAAATTGTGGCATATTTTTCAGAGTTCAGCGAAGAAG +TGTCTATAAATGTAGACTCGACGGATGAGTTAATGTATATTTTTGCCGCCTTGGGCGGATCTGTAAACAT +TTGGGCCATTATACCTCTCAGTGCATCAGTGTTCTACCGCGGAGCCGAAAATATTGTGTTTAACCTTCCA +GTGTCCAAGGTAAAATCGTGTTTGTGTAGTTTTCACAATGATGCTATCATAGATATAGAACCTGATCTGG +AAAATAATCTAGTAAAACTTTCTAGTTATCATGTAGTAAGTGTCGATTGTAACAAGGAACTGATGCCTAT +TAGGACAGATACTACTATTTGTTTAAGTATAGATCAAAAGAAATCTTACGTATTTAATTTTCACAAGTAT +GAAGAAAAATGTTGTGGTAGAACCGTCATTCATCTAGAATGGTTGTTGGGCTTTATCAAGTGTATTAGTC +AGCATCAGCATTTGGCTATTATGTTTAAAGATGACAATATTATTATGAAGACTCCTGGTAATACTGATGC +GTTTTCCAGGGAATATTCTATGACTGAATGTTCTCAAGAACTACAAAAGTTTTCTTTCAAAATAGCTATC +TCGTCTCTCAACAAACTACGAGGATTCAAAAAGAGAGTCAATGTTTTTGAAACTAGAATCGTAATGGATA +ATGACGATAACATTCTAGGAATGTTGTTTTCGGATAGAGTTCAATCCTTTAAGATTAACATCTTTATGGC +GTTTTTAGACTAATACTTTCAATGAGATATATATGGGTGGCGGAGTAAGTGTTGAGCTCCCTAAACGGGA +TCCGCCTCCGGGAGTACCCACTGATGAGATGTTATTAAACGTGGATAAAATGCATGACGTGATAGCTCCC +GCTAAGCTTTTAGAATATGTGCATATAGGACCACTAACAAAAGATAAAGAGGATAAAGTAAAGAAAAGAT +ATCCAGAGTTTAGATTAGTCAACACAGGACCCGGTGGTCTTTCGGCATTATTAAGACAATCATATAATGG +AACCGCACCCAATTGCTGTCGCACTTTTAATCGTACTCATTATTGGAAGAAGGATGGAAAGATATCAGAT +AAGTATGAAGAGGGCGCAGTATTAGAATCGTGTTGGCCCGACGTCCACGACACTGGAAAATGCGATGTTG +ATTTATTCGACTGGTGTCAGGGGGATACGTTCGATATGAACATATGCCATCAGTGGATCGGTTCAGCCTT +TAATAGGAGTGATAGAACTGTAGAGGGTCGACAATCGTTAATAAATCTGTATAATAAGATGCAAACATTA +TGTAGTAAAGATGCTAGTGTACCAATATGTGAATTATTTTTGCATCATTTACGCGCACACAATACAGAAG +ATAGCAAAGAGATGATCGATTATATTCTAAGACAACAGTCGGCGGACTTTAAACAGAAATATATGAGATG +TAGTTATCCCACTAGAGATAAGTTAGAAGAGTCATTAAAATATGCGGAACCTCGAGAATGTTGGGATCCA +GAGTGTTCGAATGCCAATGTTAATTTCTTACTAACACGTAATTATAATAATTTAGGACTTTGCAATATTG +TACGATGTAATACGAGCGTGAATAACTTACAGATGGATAAAACTTCCTCATTAAGATTATCATGTGGATT +AAGCAATAGTGATAGATTTTCTACTGTTCCCGTCAATAGAGCAAAAGTAGTTCAACATAATATTAAACAT +TCGTTCGACCTAAAATTGCATTTGATCAGTTTATTATCTCTCTTGGTAATATGGATACTAATTGTAGCTA +TTTAAATGGGTGCCGCAGCAAGCATACAGACGACTGTGAATACACTCAGTGAACGTATCTCGTCTAAATT +AGAACAAGAAGCGAACGCTAGTGCTCAAACAAAATGTGATATAGAAATCGGAAATTTTTATATCCGACAA +AACCATGGATGTAACATCACTGTTAAAAATATGTGCTCTGCGGACGCGGATGCTCAGTTGGATGCTGTGT +TATCAGCCGCTACAGAAACATATAGTGGATTAACACCGGAACAAAAAGCATACGTACCAGCTATGTTTAC +TGCTGCGTTAAACATTCAGACGAGTGTAAACACTGTTGTTAGAGATTTTGAAAATTATGTGAAACAGACT +TGTAATTCTAGCGCTGTTGTCGATAACAAATTAAAGATACAAAACGTAATTATAGATGAATGTTACGGAG +CCCCAGGATCTCCAACAAATTTGGAATTTATTAATACAGGATCTAGCAAAGGAAATTGTGCCATTAAGGC +GTTGATGCAATTGACTACTAAGGCCACTACTCAAATAGCACCTAGACAAGTTGCTGGTACAGGTGTTCAG +TTTTATATGATTGTTATCGGTGTTATAATATTGGCAGCGTTGTTTATGTACTATGCCAAGCGTATGCTGT +TCACATCCACCAATGATAAAATCAAACTTATTTTAGCCAATAAGGAAAACGTCCATTGGACTACTTACAT +GGACACATTCTTTAGAACTTCTCCGATGATTATTGCTACCACGGATATACAAAACTGAAAATATATTGAT +AATATTTTAATAGATTAACATGGAAGTTATCGCTGATCGTCTAGACGATATAGTGAAACAAAATATAGCG +GATGAAAAATTTGTAGATTTTGTTATACACGGTCTAGAGCATCAATGTCCTGCTATACTTCGACCATTAA +TTAGGTTGTTTATTGATATACTATTATTTGTTATAGTAATTTATATTTTTACGGTACGTCTAGTAAGTAG +AAATTATCAAATGTTGTTGGTGTTGGTGGCGCTAGTCATCACATTAACTATTTTTTTATTACTTTATACT +ATAATAGTACTAGACTGACTTCTAACAAACATCTCACCTGCCATAAATAAATGCTTGATATTAAAGTCTT +CTATTTCTAACACTATTCCATCTGTGGAAAATAATACTCTGACATTATCGCTAATTGATACATCGGTAAG +TGATATGCCTATAAAGTAATAATCTTCTTTGGGTACATATACCAGTGTACCAGGTTCTAACAACCTATTT +ACTGGTGCTCCTGTAGCATACTTTTTTTTTACCTTGAGAATATCCATTGTTTGCTTGGTCAATAGCGATA +TGTGATTTTTTATCAACCACTCAAAAAAGTAATTGGAGTGTTCATATCCTCTACGGGCTATTGTCTCATG +GCCGTGTATGAAATTTAAGTAACACGACTGTGGTAGATTTGTTCTATAGAGCCGGTTGCCGCAAATAGAT +AGAACTACCAATATGTTTGTACAAATGTTAAACATTAATTGATTAACAGAAAAAACAATGTTCGTTCTGG +GAATAGAAACCAGATTAAAACAAAATTCATTAGAATATATGCCACGTTTATACATGGAATATAAAATAAC +TACAGTTTGAAAAATAACAGTATCATTTAAACATTTAACTTGCGGGGTTAATCTCACAACTTTACTGTTT +TTGAACTGTTCAAAATATAGCATAGATCCATGAGAAATACGTTTAGCCGCCTTTAATAGAGGAAATCCAA +CCGCCTTTCTGGATCTCACCAACGACGATAGTTCTGACCAGCAACTCATTTCTTCATCATCCACCTGTTT +TAACATATAATAGGCAGGAGATAGATATCCGTCATTGCAATATTCCTTCTCGTAGGCACACAATCTAATA +TTGATAAAATCTCCATTCTCTTCTCTGTATTTATTATCTTGTCTCGGTGGCTGATTAGGCTGTGGTCTAT +CGTTGTTGAATCTATTTTGGTCATTAAATCTTTCATTTCTTCCTGGTATATTTCTATCACCTCGTTTGGT +TGGATTTTTGTCTATATTATCGTTTGTAACATCGGTACGGGTATTCATTTATCACAAAAAAAACTTCTCT +AAATGAGTCTACTGCTAGAAAACCTCATCGAAGAAGATACCATATTTTTTGCAGGAAGTATATCTGAGTA +TGATGATTTACAAATGGTTATTGCTGGTGCAAAATCCAAATTTCCAAGATCTATGCTTTCTATTTTTAAT +ATAGTACCTAGAACGATGTCAAAATATGAGTTGGAGTTGATTCATAACGAGAATATCACAGGGGCAATGT +TTACCACAATGTATAATATAAGAAACAATTTGGGTCTAGGCGATGATAAACTAACTATTGAAGCCATTGA +AAACTATTTCTTGGATCCTAACAATGAGGTTATGCCTCTTATCATTAATAATACGGATATGACTACCGTC +ATTCCTAAAAAAAGTGGTAGGAGAAAGAATAAGAACATGGTTATCTTCCGTCAAGGATCATCACCTATCT +TGTGTATTTTCGAAACTCGTAAAAAGATTAATATTTATAAAGAAAATATGGAATCCGTATCGACTGAGTA +TACACCTATCGGAGACAACAAGGCTTTGATATCTAAATATGCGGGAATTAATATCCTGAATGTGTATTCT +CCTTCCACGTCCATGAGATTGAATGCCATTTACGGATTCACCAATAAAAATAAACTAGAGAAACTTAGTA +CTAATAAGGAACTAGAATCGTATAGTTCTAGCCCTCTTCAAGAACCCATTAGGTTAAATGATTTTCTGGG +ACTATTGGAATGTGTTAAAAAGAATATTCCTCTAACAGATATTCCGACAAAGGATTGATTACTATAAATG +GAGAATGTTCCTAATGTATACTTTAATCCTGTGTTTATAGAGCCCACGTTTAAACATTCTTTATTAAGTG +TTTATAAACACAGATTAATAGTTTTATTTGAAGTATTCGTTGTATTCATTCTAATATATGTATTTTTTAG +ATCTGAATTAAATATGTTCTTCATGCCTAAACGAAAAATACCCGATCCTATTGATAGATTACGACGTGCT +AATCTAGCGTGTGAAGACGATAAATTAATGATCTATGGATTACCATGGATAACAACTCAAACATCTGCGT +TATCAATAAATAGTAAACCGATAGTGTATAAAGATTGTGCAAAGCTTTTGCGATCAATAAATGGATCACA +ACCAGTATCTCTTAACGATGTTCTTCGCAGATGATGATTCATTTTTTAAGTATTTTGCTAGTCAAGATGA +TGAATCTTCATTATCTGATATATTGCAAATCACTCAATATCTAGACTTTCTGTTATTATTATTGATCCAA +TCAAAAAATAAATTAGAAGCTGTGGGTCATTGTTATGAATCTCTTTCAGAGGAATACAGACAATTGACAA +AATTCACAGACTCTCAAGATTTTAAAAAACTGTTTAACAAGGTCCCTATTGTTACAGATGGAAGGGTCAA +ACTTAATAAAGGATATTTGTTCGACTTTGTGATTAGTTTGATGCGATTCAAAAAAGAATCAGCTCTAGCT +ACCACCGCAATAGATCCTGTTAGATACATAGATCCTCGTCGTGATATCGCATTTTCTAACGTGATGGATA +TATTAAAGTCGAATAAAGTTGAACAATAATTAATTCTTTATTGTTATCATGAACGGCGGACATATTCAGT +TGATAATCGGCCCCATGCTTTCAGGTAAAAGTACAGAATTAATTAGACGAGTTAGACGTTATCAAATAGC +TCAATATAAATGTGTGACTATAAAATATTCTAACGATAATAGATACGGAACGGGACTATGGACGCATGAT +AAGAATAATTTTGCAGCATTGGAAGTAACTAAACTATGTGATGTCTTGGAAGCAATTACAGATTTCTCCG +TGATAGGTATCGATGAAGGACAGTTCTTTCCAGACATTGTTGAATTCTGTGAGCGTATGGCAAACGAAGG +AAAAATAGTTATAGTAGCCGCGCTCGATGGGACATTTCAACGTAGACCGTTTAATAATATTTTGAATCTT +ATTCCATTATCTGAAATGGTGGTAAAACTAACTGCAGTGTGTATGAAATGCTTTAAGGAGGCTTCCTTTT +CTAAACGATTAGGTGCAGAAACCGAGATAGAAATAATAGGAGGTAATGATATGTATCAATCTGTGTGTAG +AAAGTGTTACATCGACTCATAATATTATATTTTTTATCTAAAAAACTAAAAATAAACATTGATTAAATTT +TAATATAATACTTAAAAATGGATGTTGTGTCGTTAGATAAACCGTTTATGTATTTTGAGGAAATTGATAA +TGAGTTAGATTACGAACCAGAAAGTGCAAATGAGGTCGCAAAAAAACTGCCGTATCAAGGACAGTTAAAA +CTATTACTAGGAGAATTATTTTTTCTTAGTAAGTTACAGCGACACGGTATATTAGATGGTGCCACCGTAG +TGTATATAGGATCTGCTCCAGGTACACATATACGTTATTTGAGAGATCATTTCTATAATTTAGGAGTGAT +CATCAAATGGATGCTAATTGACGGCCGCCATCATGATCCTATTCTAAATGGATTGCGTGATGTGACTCTA +GTGACTCGGTTTGTTGATGAGGAATATCTACGATCCATCAAAAAACAACTACATCCTTCTAAGATTATTT +TAATTTCTGATGTGAGATCCAAACGAGGAGGAAATGAACCTAGTACTGCGGATTTACTAAGTAATTATGC +TCTACAAAATGTCATGATTAGTATTTTAAACCCCGTGGCGTCTAGTCTTAAATGGAGATGCCCGTTTCCA +GATCAATGGATCAAGGACTTTTATATCCCACACGGTAATAAAATGTTACAACCTTTTGCTCCTTCATATT +CAGCTGAAATGAGATTATTAAGTATTTATACCGGTGAGAATATGAGACTGACTCGAGTTACCAAATCAGA +CGCTGTAAATTATGAAAAAAAGATGTATTACCTTAATAAGATAGTCCGCAACAAAGTAGTTGTTAACTTT +GATTATCCTAATCAGGAATATGACTATTTTCACATGTACTTTATGTTGAGGACCGTATACTGCAATAAAA +CATTTCCTACTACTAAAGCAAAGATACTATTTCTACAACAATCTATATTTCGTTTCTTAAATATTCCAAC +GACATCAACTGAAAAAGTTAGTCATGAACCAATACAACGTAAAATATCTAGCAAAGATTCTATGTCTAAA +AACAGAAATAGCAAGAGATCCGTACGCGGTAATAAATAGAAACGTACTACTGAGATATACTACCGATATA +GAGTATAATGATTTAGTTACTTTAATAACCGTTAGACATAAAATTGATTCTATGAAAACTGTGTTTCAGG +TATTTAACGAATCATCCATAAATTATACTCCGGTTGATGATGATTATGGAGAACCAATCATTATAACATC +GTATCTTCAAAAAGGTCATAACAAGTTTCCTGTAAATTTTCTATACATAGATGTGGTAATATCTGACTTA +TTTCCTAGCTTTGTTAGACTAGATACTACAGAAACTAATATAGTTAATAGTGTACTACAAACAGGCGATG +GTAAAAAGACTCTTCGTCTTCCTAAAATGTTAGAGACGGAAATAGTTGTCAAGATTCTCTATCGTCCTAA +TATACCATTAAAAATTGTTAGATTTTTCCGCAATAACATGGTAACTGGAGTAGAGATAGCCGATAGATCT +GTTATTTCAGTCGCTGATTAATCAATTAGTAGAGATGAGATAAGAACATTATAATAATCAATAATATATC +TTATATCTGTTTAGAAAAATGCTAATATTAAAATAGCTAACGCTAGTAATCCAATCGGAAGCCATTTGAT +ATCTATAATAGGGTATCTAATTTCCTGATTCAGATAGCGTACGGCTATATTCTCGGTAGCTACTCGTTTG +GAATCACAAACATTATTTACATCTAATTTACTATCTGTAATGGAAACGTTTCCCAATGAAATGGTACAAT +CAGATACATTACATCTTGATATATTTTTTTTTAAAGAGGCTGGTAACAACGCATCGCTTCGTTTACATGG +CTCGTACCAACAATAATAGGGTAATCTTGTATCTATTCCTATCCGTACTATACTTTTATCAGGATAAATA +CATTTACATCGTATATCGTCTTTGTTAGCATCACAGAATGCATAAATTTGTTCGTCCGTCATGATAAAAA +TTTAAAGTGTAAATATAACTATTATTTTTATAGTTGTAATAAAAAGGGAAATTTGATTGTATACCTTCGG +TTCTTTAAAAGAAACTGACTTGATAAAAATGGCTGTAATCTCTAAGGTTACGTATAGTCTATACGATCAA +AAAGAGATTAATGCTACAGATATTATCATTAGTCATATTAAAAATGACGACGATATCGGTACCGTTAAAG +ATGGTAGACTAGGTGCTATGGATGGGGCATTATGTAAGACTTGTGGGAAAACGGAATTGGAATGTTTCGG +TCACTGGGGTAAAGTAAGTATTTATAAAACTCATATAGTTAAGCCTGAATTTATTTCAGAAATTATTCGT +TTACTGAATCATATATGTATTCATTGCGGATTATTGCGTTCACGAGAACCGTATTCCGACGATATTAACC +TAAAAGAGTTATCGGGACACGCTCTTAGGAGATTAAAGGATAAAATATTATCCAAGAAAAAGTCATGTTG +GAACAGCGAATGTATGCAACCGTATCAAAAAATTACTTTTTCAAAGAAAAAGGTTTGTTTCGTCAACAAG +TTGGATGATATTAACGTTCCTAATTCTCTCATCTATCAAAAGTTAATTTCTATTCATGAAAAGTTTTGGC +CATTATTAGAAATTCATCAATATCCAGCTAACTTATTTTATACAGACTACTTTCCCATCCCTCCGTTGAT +TATTAGACCGGCTATTAGTTTTTGGATAGATAGTATACCCAAAGAGACAAATGAATTAACTTACTTATTA +GGTATGATCGTTAAGAATTGTAACTTGAATGCTGATGAACAGGTTATCCAGAAGGCGGTAATAGAATACG +ATGATATTAAAATTATTTCTAATAACACTACCAGTATCAATTTATCATATATCACATCCGGCAAAAATAA +TATGATTAGAAGTTATATCGTCGCTCGGCGAAAGATCAGACCAGCTAGATCTGTAATTGGTCCCAGTACA +TCTATCACCGTTAATGAGGTAGGAATGCCCACATATATTAGAAATACACTTACAGAAAAGATATTTGTTA +ATGCCTTTACAGTGGATAAAGTTAAACAACTATTAGCATCAAACCAAGTTAAATTTTACTTTAATAAACG +ATTAAACCAATTAACAAGAATACGTCAAGGAAAGTTTATCAAAAATAAAATACATTTATTGCCTGGTGAT +TGGGTAGAAGTAGCTGTTCAAGAATATACAAGTATTATTTTTGGAAGACAACCGTCTCTACATAGATACA +ACGTCATCGCTTCATCTATCAGAGCCACCGAAGGAGATACTATCAAAATATCTCCCGGAATTGCCAACTC +TCAAAATGCTGATTTCGACGGAGATGAAGAATGGATGATATTGGAGCAAAATCCTAAAGTCGTAGTTGAA +CAAAGTATTCTTATGTATCCGACGACGTTACTCAAACACGATATTCATGGAGCCCCCGTTTATGGATCTA +TTCAAGATGAAATCGTAGCAGCGTATTCATTGTTTAGGATACAAGATCTTCGTTTAGATGAAGTATTGAA +CATCTTGGGGAAATATGGAAGAGAGTTCGATCCTAAAGGTAAATGTAAATTCAGCGGTAAAGATATCTAT +ACTGACTTGATAGGTGAAAAGATTAATTATCCGGGTCTCTTAAAGGATGGCGAAATTATTGCAAACGACG +TAGATAGTAATTTTGTTGTAGCTATGAGGCATCTGTCATTGGCTGGACTCTTATCCGATCATAAATCGAA +CGTGGAAGGTATCAACTTTATTATCAAGTCATCTTATGTTTTTAAGAGATATCTATCTATTTACGGTTTT +GGGGTGACATTCAAAGATCTGAGACCAAATTCGACGTTCACTAATAAATTGGAGGCTATCAACGTAGAAA +AAATAGAACTTATCAAAGAAGCATACGCCAAATATCTCAAAGATGTAAGAGACGGGAAAATAGTTCCATT +ATCTAAAGCTTTAGAGGCGGACTACTTGGAATCCATGTTATCCAACTTGACAAATCTTAATATCAGAGAG +ATAGAAGAACATATGAGACAAACGCTGATAGATGATCCAGATAATAACCTCCTGAAAATGGCCAAAGCGG +GTTATAAAGTAAATCCCACAGAACTAATGTATATTCTAGGTACTTATGGACAACAGAGGATAGATGGCGA +ACCAGCAGAGACTCGAGTATTGGGTAGAGTCTTACCTTACTATCTTCCAGACTCTAAGGATCCAGAAGGA +AGAGGTTATATTCTTAATTCTTTAACAAAAGGATTAACGGGTTCTCAATATTACTTTTCGATGCTGGTTG +CAAGATCTCAATCTACTGATATCGTCTGTGAAACATCACGTACCGGAACACTGGCTAGAAAAATCATTAA +AAAGATGGAGGATATGGTGGTCGACGGATACGGACAAGTAGTTATAGGTAATACGCTCATCAAGTACGCA +GCCAATTATACCAAAATTCTAGGCTCAGTATGTAAACCTGTAGATCTTATCTATCCAGATGAGTCCATGA +CTTGGTATTTGGAAATTAGTGCTTTGTGGAATAAAATAAAACAGGGATTCGTTTACTCTCAGAAACAGAA +ACTTGCAAAGAAGACATTGGCGCCGTTTAATTTCCTAGTATTCGTCAAACCCACCACTGAGGATAATGCT +ATTAAGGTTAAGGATCTGTACGATATGATTCATAACGTCATTGATGATGTGAGAGAGAAATACTTCTTTA +CGGTATCTAATATAGATTTTATGGAGTATATATTCTTGACGCATCTTAATCCTTCTAGAATTAGAATTAC +AAAAGAAACGGCTATCACTATCTTTGAAAAGTTCTATGAAAAACTCAATTATACTCTAGGTGGTGGAACT +CCTATTGGAATTATTTCTGCACAGGTATTGTCTGAGAAGTTTACACAACAAGCCCTGTTCAGTTTTCACA +CTACTGAAAAGAGTGGTGCTGTAAAACAAAAACTTGGTTTCAACGAGTTTAATAACTTGACTAATTTGAG +TAAGAATAAGACCGAAATTATCACTCTGGTATCCGATGATATCTCTAAACTTCAATCTGTTAAGATTAAT +TTCGAATTTGTATGTTTGGGAGAATTAAATCCAGACATCACTCTTCGAAAAGAAACAGATAGATATGTAG +TAGACATAATAGTCAATAGATTATACATCAAGAGAGCAGAAATAACCGAATTAGTCGTCGAATATATGAT +TGAACGATTTATCTCCTTTAGCGTCATTGTAAAGGAATGGGGCATGGAGACATTCATTGAGGACGAGGAT +AATATTAGATTTACTGTCTACCTAAATTTCGTTGAACCGGAGGAATTGAATCTTAGTAAGTTTATGATGG +TTCTTCCGGGTGCCGCCAACAAGGGCAAGATTAGTAAATTCAAGATTCCTATCTCTGACTATACGGGATA +TAACGACTTCAATCAAACAAAAAAGCTCAATAAGATGACTGTAGAACTCATGAATCTAAAAGAATTGGGT +TCTTTCGATTTGGAGAACGTCAACGTGTATCCTGGAGTATGGAATACATACGATATCTTCGGTATTGAGG +CCGCTCGTGGATACTTGTGCGAAGCCATGTTAAACACCTATGGAGAAGGTTTCGATTATCTGTACCAGCC +TTGTGATCTTCTCGCTAGTTTACTATGTGCTAGTTACGAACCAGAATCAGTTAATAAATTCAAGTTCGGT +GCAGCTAGTACTCTTAAGAGAGCTACGTTCGGAGATAATAAAGCATTGTTAAACGCGGCTCTTCATAAAA +AGTCAGAACCTATTAACGATAATAGTAGCTGCCACTTTTTTAGCAAGGTCCCTAATATAGGAACTGGATA +TTACAAATACTTTATCGACTTGGGTCTTCTCATGAGAATGGAAAGGAAATTATCTGATAAGATATCTTCT +CAAAAGATCAAGGAGATAGAAGAAACAGAAGACTTTTAATTCTTATCAATAACATATTTTTCTATGATCT +GTCTTTTAAACGATGGATTTTCCACAAATGCGCCTCTCAAGTCCCTCATAGAATGATACACGTATAAAAA +ATATAGCATAGGTGATGACTCCTTATTTTTAGACATTAGATATGCCAAAATCATAGCCCCGCTTCTATTT +ACTCCCGCAACACAATGAACCAACACGGGCTCGTTTCGTTGATCACATTTAGATAAGAAGGCGGTCACGT +CGTCAAAATATTTACTAATATCAGTAGTTGTATCATCTACCAACGGTATATGAATAATATTAATATTAGA +GTTAGGTAATGTATATTTATCCATCGTCAAATTTAAAACATATTTGAACTTAACTTCAGATGATGGTGCA +TCCATAGCATTTTTATAATTTCCCAAATACACATTATTTGTTACTCTTGTCATTATAGTGGGAGATTTGG +CTCTGTGCATATCTCCAGTTGAACGTAGTAGTAAGTATTTATACAAACTTTTCTTATCCATTTATAACGT +ACAAATGGATAAAACTACTTTATCAGTAAACGCATGCAATTTAGAATACGTTAGAGAAAAGGCTATAGTA +GGCGTACAAGCAGCCAAGACATCAACACTTATATTTTTTGTTATTATATTGGCAATTAGTGCGCTATTAC +TCTGGTTTCAGACGTCTGATAATCCAGTCTTTAATGAATTAACGAGATATATGCGAATTAAAAATACGGT +TAACGATTGGAAATCATTAACGGATAGCAAAACAAAATTAGAAAGTGATAGAGGTAGACTTCTAGCCGCT +GGTAAGGATGATATATTCGAATTCAAATGTGTGGATTTCGGCGCCTATTTTATAGCTATGCGATTGGATA +AGAAAACATATCTGCCGCAAGCTATTAGGCGAGGTACTGGAGACGCGTGGATGGTTAAAAAGGCGGCAAA +AGTCGATCCATCTGCTCAACAATTTTGTCAGTATTTGATAAAACACAAGTCTAATAATGTTATTACTTGT +GGTAATGAGATGTTAAATGAATTAGGTTATAGCGGTTATTTTATGTCACCGCATTGGTGTTCCGATCTTA +GTAATATGGAATAAGTGTTAGATAAATGCGGTAACAAATGTTCCTGTAAGGAACCATAACAGTTTAGATT +TAACATTAAAGATGAGCATAAACATAATAAACAAAATTACAATCAAACCTATAACATTAATATCAAACAA +TCCAAAAAATGAAATCAGTGGAGTAGTAAACGTGTACATGACTCCTGGATAACGTTTAGCAGCTACCGTT +CCTATTCTAGACCAAAAATTTGGTTTCATGGTTTCGAAGCGGTGTTCTGCAACAAGACGAGGATCGTGTT +CTACATATTTGGCAGAGTTATCCATTATTTGCCTGTTAATCTTCATTTCGTTTTCGATTCTGGCTATTTC +AAAATAAAATCCCGATGATAGACCTCCAGACTTTATAATTTCATCTACGATGTTCAGCGCCGTAGTAACT +CTAATAATATAGGCTGATAAGCTAACATCATACCCTCCTGTATATGTGAATATGGCATGATCTTTGTCTA +TTACAAGCTCGGTTTTAACTTTATTTCCTGTAATAATTTCTCTCATCTGTAGGATATCTATTTTCTTGTC +ATGTATTGCCTTCAAGACGGGACGAAGAAACGTAATATCCTCAATAACGTTATCGTTTTCTATAATAACT +ACATATTCTACATTTTTATTTTCTAGCTCGATAAAAAATTTAGAATCCCATAGGGCTAAATGTCTAGCGA +TATTTCTTTTCGTTTCCTCTGTACACATAGTGTTACAAAACCCTGAAAAGAAGTGAGTATACTTGTCATC +ATCTCTAATATTTCCTCCAGTCCATTGTATAAACACATAATCCTTGTAATGATCTGGATCATCATTGACT +ATCACAACATCTCTTTTTTCTTGCATAACTTCATTGTCCTTCACATCATCGAACTTCTGATCATTAATAT +GCTCATGAACATTAGGAAATGTTTCTGATGGAGGTCTATCAATAACTGGCACAACAATAACAGGAGTTTT +CGCCGCCGCCATTTAGTTATTGAAATTAATCATATACAACTCTCTAATACGAGTTATATTTTCGTCTATC +CATTGTTTCACATTGACATATTTCGACAAAAAGATATAAAATGCGTATTCCAATGCTTCTCTGTTTAATG +AATTACTAAAATATACAAACACGTCACTGTCTGGTAATAAATGATATCTTAGAATATTGTAACAATTTAT +TTTGTATTGTACATGTTCGTGATCTATGAGTTCTTCTTCGAATGGCATAGGATCTCCGAATCTGAAAACG +TATAAATAGGAGTTAGAATAATAATATTTGAGAGTATTGGTAATGTATAAACTCTTTAGCGGTATAATTA +GTTTTTTTCTCTCGATTTCTATTTTTAGATGTGATGGAAAAATGACTAATTTTGTAGCATTAGTATCATG +AACTCTAATCAAAATCTTAATATCTTCGTCACACGTTAGCTCTTTGAAGTTTTTAAGAGATGCATCAGTT +GGTTTTACAGATGGAGTAGGTGTAACAATTTTTTGTTTAATGCATGTATGTATTGGAGCCATTGTCTTAA +CTATAATGGTGCTTGTATCGAAAAACTTTAATGCGGATAACGGAAGCTCTTCGCCGCGACTTTCTACGTC +GTAATTGGGTTCTAATGCCGATCTCTGAATGGATACTAGTTTTCTAAGTTCTAATGTGATTCTCTGAAAA +TGTAAATCCAATTCCTCCGGCATTATAGATGTGTATACATCGGTAAATAAAACTATAGTATCCAACGATC +CCTTCTCGCAAATTCTAGTCTTAACCAAGAAATCGTATATAACTACGGAGATGGCGTATTTAAGAGTGGA +TTCTTCTACCGTTTTGTTCTTGGATTTCATATAAGAAACTATAAAGTCCGCACTACTGTTAAGAATGATC +ACTAACGCAACTATATAGTTCAAATTAAGCATCTTGGAAACATAAAATAACTCTGTAGATGATACTTGAC +TTTCGAATAAGTTTGCAGACAAACGAAGAAAGAACAGACCTCTCTTAATTTCAGAAGAAAACTTTTTTTC +GTATTCCTGACGTCTAGAGTTTATATCAATAAGAAAGTTAAGAATTAGTCGGTTAATGTTGTATTTCATT +ACCCAAGTTTGAGATTTCATAATATTGTCAAAAGACATGATAATATTAAAGATAAAGCGCTGACTATGAA +CGAAATAGCTATATGGTTCGCTCAAGAATATAGTCTTGTTAAACGTGGAAACGATAACTGTATTTTTAAT +CACGTCAGCGACATCTAAATTAAATATAGGTATATTTATTCCACACACACTACAATATGCCACACCATCT +TCATAATAAATAAATTCGTTAGCAAAATTATTAATTTTAGTGAAATAGTTAGCGTCAACTTTCATAGCTT +CCTTCAATCTAATTTGATGCTCACATGGCGCGAATTCTACTCTAACATCCCTTTTCCATGCCTCAGGTTC +ATCGATCTCTATAATATCTAGTTTCTTGCGTTTCACAAACACAGGCTCGTCTCTCGCGATGAGATCTGTA +TAGTAACTATGTAAATGATAACTAGATAGAAAGATGTAGCTATATAGATGACGATCCTTTAAGAGAGGTA +TAATAACTTTACCCCAATCAGATAGACTGTTGTTATGGTCTTCGGAAAAAGAATTTTTATAAATTTTTCC +AGTATTTTCTAAATATACATACTTGATATCTAAGAAATCCTTAATGATAATAGGAATGGATAATCCGTCT +ATTTTATAAAGAAATACATATCGCATATTATACTTTTTTTTGGAAATTGGAATACCGATGTGTCTACATA +AATACGCAAAGTCTAAATATTTTTTAGAGAATCTTAGTTGGTCCAAATTCTTTTCCAAGTACGGTAATAG +ATTTTTCATATTGAACGGTATCTTCTTGATCTCTGGTTCTAATTCCGCATTAAATGATGAAACTAAGTCA +CTATTTTTATAACTAACGATTACATCACCTCTAACATCATCATTTACCAGGATACTGATCTTCTTTTGTC +GTAAATACATGTCTAATGTGTTAAAAAAAAGATCATACAAGTTATACGTCATTTCATCTGTAGTATTCTT +GTCATTGAAGGATAAACTCGTACTAATCTCTTCTTTAACAGTCTGTTCAAATTTATATCCTATATACGAA +AAAATAGCAACCAGTGTTTGATCATCCGCGTCAATATTCTGTTCTATCGTAGTGTATAGCAATCTTATAT +CTTCTTCTGTGATAGTCGATACGTTATAAAGGTTGATAACGAAAATATTTTTATTTCGTGAAATAAAGTC +ATTGTAGGATTTTGGACTTATATTCGTGTCTAGTAGATATGATTTTATTTTTGGAATGATCTCAATTAAA +ATAGTCTCTTTAGAGTCCATTTAAAGTTACAAACAACTAGGAAATTGGTTTATGATGTATAATTTTTTTA +GTTTTTATAGATTCTTTATTCTATACTTAAAAAATGAAAATAAATACAAAGGTTCTTGAGGGTTGTGTTA +ATTGAAAGCGAGAAATAATCATAAATTATTTCATTATCGCGATATCCGTTAAGTTTGTATCGTAATGGCG +TGGTCAATTACGAATAAAGCGGATACTAGTAGTTTCACAAAGATGGCTGAAATCAGAGCTCATCTAAGAA +ATAGCGCTGAAAATAAAGATAAAAACGAGGATATTTTCCCGGAAGATGTAATAATTCCATCTACTAAGCC +CAAAACCAAACGAACCACTACTCCTCGTAAACCAGCGGCTACTAAAAGATCAACCAAAAAGGATAAAGAA +AAGGAGGAAGTGGAAGAAGTAGAAGAAGTAGTTATAGAGGAATATCATCAAACAACTGAAGAAAATTCTC +CACCTCCGTCATCATCTCCTGGAGTCGGCGACATTGTAGAAAGCGTGGCCGCTGTAGAGCTCGATGATAG +CGACGGGGATGATGAACCTATGGTACAAGTTGAAGCTGGTAAAGTAAATCATAGTGCTAGAAGCGATCTC +TCTGACCTAAAGGTGGCTACCGACAATATCGTTAAAGATCTTAAGAAAATTATTACTAGAATCTCTGCAG +TATCGACTGTTCTAGAGGATGTTCAAGCAGCTGGTATCTCTAGACAATTTACTTCTATGACTAAAGCTAT +TACAACACTATCTGATCTAGTCACCGAGGGAAAATCTAAAGTTGTTCGTAAAAAAGTTAAAACTTGTAAG +AAGTAAATGCGTGCACTTTTTTATAAAGATGGTAAACTGTTTACCGATAATAATTTTTTAAATCCTGTAT +CAGACGATAATCCAGCGTATGAGGTTTTGCAACATGTTAAAATTCCTACTCATTTAACAGATGTAGTAGT +ATATGAACAAACGTGGGAAGAGGCATTAACTAGATTAATTTTTGTGGGAAGTGATTCAAAAGGACGTAGA +CAATACTTTTACGGAAAAATGCATGTACAGAATCGCAATGCTAAAAGAGATCGTATTTTTGTTAGAGTAT +ATAACGTTATGAAACGAATTAATTGTTTTATAAACAAAAATATAAAGAAATCGTCCACAGATTCCAATTA +TCAGTTGGCGGTTTTTATGTTAATGGAAACTATGTTTTTTATTAGATTTGGTAAAATGAAATATCTTAAG +GAGAATGAAACAGTAGGGTTATTAACACTAAAAAATAAACACATAGAAATAAGTCCCGATGAAATAGTTA +TCAAGTTTGTAGGAAAGGACAAAGTTTCACATGAATTTGTTGTTCATAAGTCTAATAGACTATATAAACC +GTTATTGAAACTGACTGATGATTCTAGTCCCGAAGAATTTCTGTTCAACAAACTAAGTGAACGAAAGGTA +TACGAATGTATCAAACAGTTTGGTATTAGAATCAAGGATCTCCGAACGTATGGAGTCAATTATACGTTTT +TATATAATTTTTGGACAAATGTAAAGTCCGTATCTCCTCTTCCATCACCAAAAAAGTTGATAGCGTTAAC +TATCAAACAAACTGCTGAAGTGGTAGGTCATACTCCATCAATTTCAAAAAGAGCTTATATGGCAACGACT +ATTTTAGAAATGGTAAAGGATAAAAATTTTTTAGACGTAGTATCTAAAACTACGTTCGATGAATTCCTAT +CTATAGTCGTAGATCACGTTAAATCATCTACGGATGGATGATAATAGATCTTTACACAAATAATTACAAG +ACCGATAAATGGAAATGGATAAACGGATGAAATCTCTCGCTATGACAGCTTTCTTCGGAGAGCTAAACAC +GTTAGATATTATGGCATTGATAATGTCTATATTTAAACGCCATCCAAACAATACCATTTTTTCAGTGGAT +AAGGATGGTCAATTTATGATTGATTTCGAATACGATAATTATAAGGCTTCTCAATATTTGGATCTGACCC +TCACTCCGATATCTGGAAATGAATGCAAGACTCACGCATCGAGTATAGCCGAACAATTGGCGTGTGTGGA +TATTATTAAAGAGGATATTAGCGAATATATCAAAACTACTCCCCGTCTTAAACGATTTATAAAAAAATAC +CGCAATAGATCATATACTCGTATCAGTCGAGATACAGAAAAGCTTAAAATAGCTCTAGCTAAAGGCATAG +ATTACGAATATATAAAAGACGCTTGTTAATAAGTAAATGAAAAAAAACTAGTCGTTTATAATAAAACACG +ATATGGATGCCAACATAGTATCATCTTCTACTATTGCGACGTATATAGACGCTTTAGCGAAGAATGCTTC +AGAATTAGAACAGAGGTCTACCGCATACGAAATAAATAATGAATTGGAACTAGTATTTATTAAACCGCCA +TTGATTACGTTGACAAATGTAGTAAATATCTCCACGATTCAGGAATCGTTTATTCGATTTACCGTTACTA +ATAAGGAAGGTATCAAAATTAGAACTAAGATTCCATTATCTAAGGTACATGGTCTAGATGTAAAAAATGT +ACAGTTGGTAGATGCTATAGATAACATAGTTTGGGAAAAGAAATCATTAGTGACGGAAAATCGTCTTCAC +AAAGAATGCTTGTTGAGACTATCGACAGAGGAACGTCATATATTTTTGGATTACAAGAAATATGGATCCT +CTATCCGACTAGAATTAGTCAATCTTATTCAAGCAAAAACAAAAAACTTTACGATAGACTTTAAGCTAAA +ATATTTTCTAGGATCTGGTGCTCAATCTAAAAGTTCTTTATTGCACGCTATTAATCATCCAAAGTCAAGG +CCTAATACATCTCTGGAAATAGAATTTACACCTAGAGACAATGAAACAGTTCCATATGATGAACTAATAA +AGGAATTGACGACTCTCTCGCGTCATATATTTATGGCTTCTCCAGAGAATGTAATTCTTTCTCCACCTAT +TAACGCACCTATAAAGACTTTTATGTTGCCTAAACAAGATATAGTAGGTCTGGATCTGGAAAATCTATAT +GCCGTAACTAAGACTGATGGCATTCCTATAACTATCAGAGTTACATCAAAAGGGTTGTATTGTTATTTTA +CACATCTTGGTTATATTATTAGATATCCAGTTAAGAGAACAATAGATTCCGAAGTAGTAGTCTTTGGTGA +GGCAGTTAAGGATAAGAACTGGACCGTATATCTCATTAAGCTAATAGAGCCCGTAAATGCAATCAGTGAT +AGACTAGAAGAAAGTAAGTATGTTGAATCTAAACTAGTGGATATTTGTGATCGGATAGTATTCAAGTCAA +AGAAATACGAAGGTCCGTTTACTACAACTAGTGAAGTCGTCGATATGTTATCTACATATTTACCAAAGCA +ACCAGAAGGTGTTATTCTGTTCTATTCAAAGGGACCTAAATCTAACATTGATTTTAAAATCAAAAAGGAG +AATACTATAGACCAAACTGCAAATGTAGTATTTAGGTACATGTCCAGTGAACCAATTATCTTTGGAGAGT +CGTCTATCTTTATAGAGTATAAGAAATTTACCAACGATAAAGGCTTTCCTAAAGAATATGGTTCTGGTAA +GATTGTGTTATATAACGGCGTTAATTATCTAAATAATATCTATTGTTTGGAATATATTAATACACATAAT +GAAGTGGGTATTAAGTCCGTTGTTGTACCTATTAAGTTTATAGCAGAATTCTTAGTCAATGGAGAAATAC +TTAAACCTAGAATCGATAAAACCATGAAATATATTAACTCAGAAGACTATTATGGAAATCAACATAATAT +CATAGTCGAACATTTAAGAGATCAAAGCATCAAAATAGGAGATGTCTTTAACGAGGATAAACTATCGGAT +ATTGGACATCAATACGCCGCCAACAACGATAAATTTAGATTAAATCCAGAAGTTAGTTATTTTACTAATA +AACGAACTAGAGGGCCGTTGGGAATTTTATCAAACTACGTCAAGACTCTTCTTATTTCTATGTATTGTTC +CAAAACATTTTTAGACGATTCCAACAAACGAAAGGTATTAGCGATTGATTTTGGAAACGGTGCTGACCTG +GAAAAATACTTTTATGGAGAGATTGCGTTATTGGTAGCGACGGATCCGGATGCTGATGCTATAGCTAGAG +GAAATGAAAGATACAACAAATTAAATTCTGGAATTAAAACCAAGTACTACAAATTTGACTACATTCAGGA +AACTATTCGATCCGATACATTTGTCTCTAGTGTCAGAGAAGTATTCTATTTTGGAAAGTTTAATATCATT +GACTGGCAGTTCGCTATTCATTATTCTTTTCATCCAAGACATTATGCTACAGTCATGAATAACTTATCCG +AACTAACTGCTTCTGGAGGCAAGGTATTAATTACTACCATGGATGGAGACAAATTATCAAAATTAACCGA +TAAAAAGACTTTTATAATTCATAAGAATCTACCTAGTAGCGAAAACTATATGTCTGTAGAAAAAATAGCT +GATGATAGAATAGTGGTATATAATCCATCAACAATGTCTACTCCAATGACTGAATACATTATCAAAAAGA +ACGATATAGTCAGAGTGTTTAATGAATACGGATTTGTTCTTGTAGATAATGTTGATTTCGCTACAATTAT +AGAACGAAGTAAAAAGTTTATTAATGGCGCATCTACAATGGAAGATAGACCGTCTACAAGAAACTTTTTC +GAACTAAATAGAGGAGCCATTAAATGTGAAGGTTTAGATGTCGAAGACTTACTTAGTTACTATGTTGTTT +ATGTCTTTTCTAAGCGGTAAATAATAATATGGTATGGGTTCTGATATCCCCGTTCTAAATGCATTAAATA +ATTCCAATAGAGCGATTTTTGTTCCTATAGGACCTTCCAACTGTGGATACTCTGTATTATTAATAGATAT +ATTAATACTTTTGTAGGGTAACAGAGGTTCTACGTCTTCTAAAAATAAAAGTTTTATAACATCTGGCCTG +TTCATAAATAAAAACTTGGCGATTCTATATATACTCTTATTATCAAATCTAGCCATTGTCTTATAGATGT +GAGCTACTGTAGGTGTACCATTTGATTTTCTTTCTAATACTATATATTTCTCTCGAAGAAGTTCTTGCAG +ATCATCTGGGAATAAAATACTACTATTGAGTAAATCAGTTATTTTTTTTATATCGATATTGATGGACATT +TTTATAGTTAAGGATAATAAGTATCCCAAAGTAGATAACGACGATAACGAAGTATTTATACTTTTAGGAA +ATCACAATGACTTTATCAGATCAAAATTAACAAAATTAAAGGAGCATGTATTTTTTTCTGAATATATTGT +GACTCCAGATACATATGGATCTTTATGCGTCGAATTAAATGGGTCTAGTTTTCAGCACGGTGGTAGATAT +ATAGAGGTGGAGGAATTTATAGATGCTGGAAGACAAGTTAGATGGTGTTCTACATCCAATCATATATCTG +AAGATATACACACTGATAAATTTGTCATTTATGATATTTATACGTTTGATTCGTTCAAGAATAAACGATT +GGTATTTGTACAGGTGCCTCCATCATTAGGAGATGATAGCTATTTAACTAATCCGTTATTGTCTCCGTAT +TATCGTAATTCAGTAGCCAGACAAATGGTCAATGATATGATTTTTAATCAAGATTCATTTTTAAAATATT +TATTAGAACATCTGATTAGAAGCCACTATAGAGTTTCTAAACATATAACAATAGTTAGATACAAGGATAC +CGAAGAATTAAATCTAACAAGAATATGTTATAATAGAGATAAGTTTAAGGCATTTGTATTCGCTTGGTTT +AACGGCGTTTCGGAAAATGAAAAGGTACTAGATACGTATAAAAAGGTATCTGATTTGATATAATGAATTC +AGTGACTATATCACACGCACCATATACTATTACTTATCACGATGATTGGGAACCAGTAATGAGTCAATTG +GTAGAGTTTTATAACGAAGTAGCCAGTTGGCTGCTACGAGACGAGACGTCGCCTATTCCTGATAAGTTCT +TTATACAATTGAAACAGCCGCTTAGAAATAAACGAGTATGTGTGTGTGGTATAGATCCGTATCCAAAAGA +TGGAACTGGTGTACCGTTCGAATCACCAAATTTTACAAAAAAATCAATTAAGGAGATAGCTTCATCTATA +TCTAGATTAACCGGAGTAATTGATTATAAAGGTTATAACCTTAATATAATAGACGGGGTTATACCCTGGA +ATTATTACTTAAGTTGTAAATTAGGAGAAACAAAAAGTCACGCGATTTACTGGGATAAGATTTCCAAGTT +ACTGCTGCAGCATATAACTAAACACGTTAGTGTTCTTTATTGTTTGGGTAAAACAGATTTCTCGAATATA +CGGGCAAAGTTAGAATCCCCGGTAACTACCATAGTGGGATATCATCCAGCGGCCAGAGACCACCAATTCG +AGAAAGATCGATCATTTGAAATTATCAACGTTTTACTGGAATTAGACAACAAGACACCTATAAATTGGGC +TCAAGGGTTTATTTATTAATGCTTTAGTGAAATTTTAACTTGTGTTCTAAATGGATGCGGCTATTAGAGG +TAATGATGTTATCTTTGTTCTTAAGACTATAGGTGTCCCGTCAGCATGCAGACAAAATGAAGATCCAAGA +TTCGTAGAAGCATTTAAATGCGACGAGTTAGAAAGATATATTGATAATAATCCAGAATGTACACTATTCG +AAAGTCTTAGGGATGAGGAAGCATACTCTATAGTCAGAATTTTCATGGATGTAGATTTAGACGCGTGTCT +AGACGAAATAGATTATTTAACGGCTATTCAAGATTTTATTATCGAGGTGTCAAACTGTGTAGCTAGATTC +GCATTTACAGAATGCGGTGCCATTCATGAAAATGTAATAAAATCCATGAGATCTAATTTTTCATTGACTA +AGTCTACAAATAGAGATAAAACAAGTTTTCATATTATCTTTTTAGACACGTATACCACTATGGATACATT +GATAGCTATGAAACGAACACTATTAGAATTAAGTAGATCATCTGAAAATCCACTAACAAGATCGATAGAC +ACTGCCGTATATAGGAGAAAAACAACTCTTCGGGTTGTAGGTACTAGGAAAAATCCAAATTGCGACACTA +TTCATGTAATGCAACCACCTCATGATAATATAGAAGATTACCTATTCACTTACGTGGATATGAACAACAA +TAGTTATTACTTTTCTCTACAACGACGATTGGAGGATTTAGTTCCTGATAAGTTATGGGAACCAGGGTTT +ATTTCGTTCGAAGACGCTATAAAAAGAGTTTCAAAAATATTCATTAATTCTATAATAAACTTTAATGATC +TCGATGAAAATAATTTTACAACGGTACCACTGGTCATAGATTATGTAACACCTTGTGCATTATGTAAAAA +ACGATCGCATAAACATCCGCATCAACTATCGTTGGAAAATGGTGCTATTAGAATTTACAAAACTGGTAAT +CCACATAGTTGTAAAGTTAAAATTGTTCCGTTGGATGGTAATAAACTGTTTAATATTGCACAAAGAATTT +TAGACACTAACTCTGTTTTATTAACCGAACGAGGAGACCATATAGTTTGGATTAATAATTCATGGAAATT +TAACAGCGAAGAACCATTGATAACAAAACTAATTCTATCAATAAGACATCAACTACCTAAGGAATATTCA +AGCGAATTACTCTGTCCGAGGAAACGAAAGACTGTAGAAGCTAACATACGAGACATGTTAGTAGATTCAG +TAGAGACCGATACCTATCCGGATAAACTTCCGTTTAAAAATGGTGTATTGGACCTGGTAGACGGAATGTT +TTACTCTGGAGATGATGCTAAAAAATATACGTGTACTGTATCGACCGGATTTAAATTTGACGATACAAAA +TTCGTCGAAAACAGTCCAGAAATGGAAGAGTTAATGAATATCATTAACGATATCCAACCATTAACGGATG +AAAATAAGAAAAATAGAGAGCTGTATGAAAAAACATTATCTAGTTGTTTATGTGGTGCTACCAAAGGATG +TTTAACATTCTTTTTTGGAGAAACCGCAACTGGAAAGTCGACAACCAAACGTTTGTTAAAGTCTGCTATC +GGTGACCTGTTTGTCGAGACGGGTCAAACAATTTTAACAGATGTATTGGATAAAGGACCTAATCCATTTA +TCGCTAATATGCATTTAAAAAGATCTGTATTCTGTAGCGAACTACCTGATTTTGCATGTAGTGGATCAAA +GAAAATTAGATCTGATAATATTAAAAAGTTGACAGAACCTTGTGTCATTGGAAGACCGTGTTTCTCCAAT +AAAATTAATAATAGAAACCATGCGACAATCATTATCGATACTAATTACAAACCTGTCTTTGATAGGATAG +ATAACGCATTAATGAGAAGAATTGCCGTCGTGCGATTCAGAACACACTTTTCTCAACCTTCTGGTAGAGA +GGCTGCTGAAAATAATGACGCGTACGATAAAGTCAAACTATTAGACGAGGGATTAGATGGTAAAATACAG +AATAATAGATATAGATTCGCATTTCTATACTTGTTGGTTAAATGGTACAAAAAATATCATATTCCTATTA +TGAAACTATATCCTACACCGGAAGAGATTCCGGACTTTGCATTCTATCTCAAAATAGGTACTCTGTTGGT +ATCTAGCTCTGTAAAGCATATTCCATTAATGACAGACCTCTCCAAAAAGGGATATATATTGTACGATAAT +GTGGTTACTCTTCCGTTGACTACTTTCCAACAGAAAATATCCAAGTATTTTAATTCTAGACTATTTGGAC +ACGATATAGAGAGCTTCATCAATAGACATAAGAAATTTGCCAATGTTAGTGATGAATATCTGCAATATAT +ATTCATAGAGGATATTTCATCTCCGTAAATATATGCCATATATTTATAGAAGATATCACATATCTAAATG +AATACCGGAATCATAGATTTATTTGATAATCATGTTGATAGTATACCAACTATATTACCTCATCAGTTAG +CTACTTTAGATTATCTAGTTAGAACTATCATAGATGAGAACAGAAGCGTGTTATTGTTCCATATTATGGG +ATCGGGTAAAACAATAATCGCTTTGTTGTTCGCCTTGGTAGCTTCCAGATTTAAAAAGGTTTACATTTTA +GTACCGAACATCAACATCTTAAAAATTTTCAATTATAATATGGGTGTAGCTATGAACTTGTTTAATGACG +AATTCATAGCTGAGAATATCTTTATTCATTCCACAACAAGTTTTTATTCTCTTAATTATAACGATAACGT +CATTAATTATAACGGATTAAGTCGCTACAATAACTCTATTTTTATCGTTGATGAGGCACATAATATTTTT +GGGAATAATACTGGAGAACTTATGACCGTGATAAAAAATAAAAACAAGATTCCTTTTCTACTATTGTCTG +GATCTCCCATTACTAACACACCTAATACGCTGGGTCATATTATAGATTTAATGTCCGAAGAGACGATAGA +TTTTGGTGAGATTATTAGTCGTGGTAAGAAAGTAATTCAGACACTTCTTAACGAACGCGGAGTGAATGTA +CTCAAGGATTTGCTTAAAGGAAGAATATCATATTACGAAATGCCGGACAAAGATCTACCAACAATAAGAT +ATCACGGACGTAAATTTCTAGATACTCGAGTAGTATATTGTCACATGTCTAAACTTCAAGAGAGAGATTA +TATGATTACTAGACGACAGCTATGTTATCATGAAATGTTTGATAAAAATATGTATAACGTGTCAATGGCA +GTATTGGGACAACTTAATCTGATGAATAATTTAGATACGTTATTTCAGGAACAGGATAAGGAATTGTACC +CAAATCTGAAAATAAATAATGGAGTGTTATACGGTGAAGAATTGGTAACGTTAAACATTAGTTCCAAATT +TAAGTACTTTATCAATCGGATACAGACACTCAAGGGAAAACACTTTATATACTTCTCTAATTCTACATAT +GGTGGATTGGTAATTAAATATATCATGCTCAGTAATGGATATTCTGAATATAATGGTTCTCAGGGAACTA +ATCCACATATGATAAACGGCAAACCAAAAACATTTGCTATCGTTACTAGTAAAATGAAATCGTCTTTAGA +GGATCTATTAGATGTGTATAATTCTCCTGAAAACGATGATGGCAGTCAATTGATGTTTTTGTTTTCGTCA +AACATTATGTCTGAATCCTATACTCTGAAAGAGGTAAGGCATATTTGGTTTATGACTATCCCGGATACTT +TTTCTCAATACAACCAAATTCTTGGACGATCTATTAGAAAATTCTCTTACGCCGATATTTCTGAACCCGT +TAATGTATATCTTTTAGCAGCCGTATATTCAGATTTCAATGACGAAGTGACGTCATTAAACGATTATACA +CAGGATGAATTGATTAATGTTTTACCCTTTGACATCAAAAAGCTGTTGTATCTAAAATTTAAGACTAAAG +AAACGAATAGAATATACTCTATTCTTCAAGAGATGTCTGAAACGTATTCTCTTCCACCACATCCATCAAT +TGTAAAAGTTTTATTGGGAGAATTGGTCAGACAATTTTTTTATAATAATTCTCGTATTAAGTATAACGAC +TCCAAGTTACTTAAAATGGTTACATCAGTTATAAAAAATAAAGAAGACGCTAGGAATTACATAGATGATA +TTGTAAACGGTCACTTCTTTGTATCGAATAAAGTATTTGATAAATCTCTTTTATACAAATACGAAAACGA +TATTATTACAGTACCGTTTAGACTTTCCTACGAACCATTTGTTTGGGGAGTTAACTTTCGTAAAGAATAT +AACGTGGTATCTTCTCCATAAAACTGATGAGATATATAAAGAAATAAATGTCGAGCTTTGTTACCAATGG +ATATCTTCCAGTTACATTGGAACCACATGAGTTGACATTAGACATAAAAACTAATATTAGGAATGCCGTA +TATAAGGCGTATCTCCATAGAGAAATTAGTGGTAAAATGGCCAAGAAAATAGAAATTCGTGAAGACGTGG +AATTACCTCTCGGCGAAATAGTTAATAATTCTGTAGTTATAAACGTTCCGTGTGTAATAACCTACGCATA +TTATCACGTTGGGGATATAGTCAGAGGAACATTAAACATCGAAGATGAATCAAATGTAACTATTCAATGT +GGAGATTTAATCTGTAAACTAAGTAGAGATTCGGGTACTGTATCATTTAGCGATTCAAAGTACTGCTTTT +TTCGAAATGGTAATGCGTATGATAACGGCATCGAAGTCTCCGCCGTTCTAATGGAGGCTCAACAAGGTAC +CGAATCTAGTTTTGTTTTTCTCGCGAATATCGTTGACTCATAAGAAAGAGAATAGCGGTGAGTATAAATA +CGAATACTATGGCAATAATTGCGAATGTTTTATTCCCTTCGATATATTTTTGATAATATGAAAAACATGC +CTCTCTCAAATCAGACAACCATTTCATAAAATAGTTCTCTCGCACTGGTGAGGTGGTTGCAGCTCGTATA +ATCTCCCCAGAATAATATACTTGCGTGTCGTCGTTCAATTTATACGGATTTCTATAATTCTCTGTTATAT +AATGAGGTTTACCCTCATGATTAGACGACGACAATAGTGTTCTGAATTTAGATAGTTGATCAGAATGAAT +GTTTATTGGTGTTGGAAAAATTATCCATGCTGCGTCTGCAGAGTGGTTGATAGTTGTTCCTAGATATGTA +AAATAATCCAACGTACTAGGTAGCAAATTGTCTAGATAAAATACTGAATCAAATGGCGCAGACATATTAG +CGGATCTAATGGAATCCAATTGATTGACTATCTTTTGAAAATATACATTTTTATGATCTGATACTTGTAA +GAATATAGCAATAATGATAATTCCATCATCGTGTTTTTTTGCCTCTTCATAAGAACTATATTTTTTCTTA +TTCCAATGAACCAGATTAATCTCTCCAGAGTATTTGTATACATCTATCAAGTGATTGGATCCATAATCGT +CTTCCTTCCCCCAATATATATGTATTGTTGATAACACATATTCATTGGGGAGAAACCCTCCACTTATATA +TCCTCCTTTAAAATTAATCCTTACTAGTTTTCCAGTATTCTGGATAGTGGTTGGTTTCGACTCATTATAA +TGTATGTCTAACGTCTTCAATCGCGTGTCAGAAATTGCTTTTTTAGTTTCTATATTAATAGGAGATAGTT +GTTGAGGCATAGTAAAAATGAAATGATAACTGTCTAGAAATAGCTCTTAGTATGGGATTTACAATGGATG +AGGAAGTGATATTTGAAACTCCTAGAGAATTAATATCTATTAAACGAATAAAAGATATTCCAAGATCAAA +AGACACGCACGTGTTTGCTGCGTGTATAACAAGTGACGGATATCCGTTAATAGGAGCTAGAAGAACTTCA +TTCGCATTCCAGGCGATATTATCTCAACAAAATTCAGATTCTATCTTTAGAGTATCCACTAAACTATTAC +GGTTTATGTACTACAATGAACTAAGAGAAATCTTTAGACGGTTGAGAAAAGGTTCTATCAACAATATCGA +TCCTCACTTCGAAGAGTTAATATTATTGGGTGGTAAACTAGATAAAAAGGAATCTATTAAAGATTGTTTA +AGAAGAGAATTAAAAGAGGAAAGTGATGAACATATAACAGTAAAAGAATTCGGAAATGTAATTCTAAAAC +TTACAACGAGTGATAAATTATTTAATAAAGTATATATAGGTTATTGCATGGCATGTTTTATTAATCAATC +GTTGGAGGATTTATCACATACTAGTATTTACAATGTAGAAATTAGAAAGATTAAATCGTTAAATGATTGT +ATTAACGACGATAAATACGAATATCTGTCTTATATTTATAATATACTAATTAATAGTAAATGAGCTTTTA +CAGATCTAGTATAATTAGTCAGATTATTAAGTATAATAGACGACTAGCTAAGTCTATTATTTGCGAGGAT +GACTCTCAAATTATTACACTCACGGCATTCGTTAACCAATGCCTATGGTGTCATAAACGAGTATCCGTGT +CCGCTATTTTATTAACTACTGATAACAAAATATTAGTATGTAACAGACGAGATAGTTTTCTCTATTCTGA +AATAATTAGAACTAGAAACATGTATAGAAAGAAACGATTATTTCTGAATTATTCCAATTATTTGAACAAA +CAGGAAAGAAGTATACTATCGTCATTTTTTTCTCTAGATCCAGCTACTGCTGATAATGATAGAATAAACG +CTATTTATCCGGGTGGTATACCCAAAAGGGGTGAGAACGTTCCAGAGTGTTTATCCAGGGAAATCAAAGA +AGAAGTTAATATAGACAATTCTTTTGTATTCATAGACACTCGTTTTTTTATTCATGGTATCATAGAAGAT +ACCATTATTAACAAATTTTTTGAGGTAATTTTCTTTGTTGGAAGAATATCTCTAACGAGTGATCAAATTA +TTGATACATTTAAAAGTAATCATGAAATAAAGGATCTAATATTTTTAGATCCGAATTCAGGTAATGGACT +CCAATACGAAATTGCAAAATATGCTCTAGATACTGCAAAACTTAAATGTTACGGTCATAGAGGATGTTAT +TATGAATCATTAAAAAAATTAACTGAGGATGATTGATTAGAAAATATAAATTAATTTACCATCGTGTATT +TTTATAACGGGATTGTCTGGCATATCATGTAGATAGTTACCGTCTACATCGTATACTCTACCATCTACGC +CTTTAAATCCTCTATTTATTGATATTAATCTATTAGAATTGGAATACCAAATATTAGTACCCTCAATTAG +TTTATTGGTAATATTTTTTTTAGACGATAGATCGATGGCTCTTGAAACCAAGGTTTTCCAACCGGACTCA +TTGTCGATCGGTGAGAAGTCTTTTTCATTAGCATGAATCCATTCTAATGATGTATGTTTAAACACTCTAA +ACAATTGTACAAATTCTTTTGATTTGTTTTGAATGATTTCAAATAGGTCTTCGTCTACAGTAGGCATACC +ATTAGATAATCTAGCCATTATAAAGTGCACGTTTACATATCTACGTTCTGGAGGAGTAAGAACGTGACTA +TTGAGACGAATGGCTCTTCCTACTATCTGACGAAGAGACGCCTCGTTCCATGTCATATCTAAAATGAAGA +TATCATTGATTGAGAAGAAACTAATACCCTCGCCTCCGCTAGAAGAGAATACGCATGTTTTAATGTATTC +TCCGTTAGTGTTTGATTCTTGGTTAAACTCAGCCACAGCCTTGATTCTAGTATCTTTTGTTCTAGATGAG +AACTCTATATTAGAGATACCAAAGACTTTGAAATATAGTAATAAGATTTCTATTCCTGACTGATTAACAA +ATGGTTCAAAGACTAGACATTTACCATGGGATGCTAATATTCCCAAACATACATCTATAAATTTGACGCT +TTTCTCTTTTAATTCAGTAAATAGAGAGATATCAGCCGCAATAGCATCCCCTCCCAATAGTTCTCCCTTT +TTAAAGGTGTCTAATGCGGATTTAGAAAATTCTCTATCTCTTAATGAATTTTTAAAATCATTATATAGGG +TTGCTATCTCTTGTGTGTATTCTCCCGGATCACGATTTTGTCTTTCAGGAAAGCTATCGAATGTAAACGT +AGTAGCCATACGTCTCAGAATTCTAAATGATGATATACCAGTTTTTATTTCTGCGAGTTTAGCCTTTTGA +TAAATCTCTTCTTGCTTTTTTGACATATTAACGTATCGCATTAATACTGTTTTCTTAGCGAATGATGCAG +ACCCTTCCACATCATCAAAAATAGAAAACTCGTTATTAACTATGTACGAACATAGGCCTCCTAGTTTGGA +GACTAATTCTTTTTCATCGACTAGACGTTTATTCTCAAATAGCGATTGGTGTTGTAAGGATCCTGGTCGC +AGTAAGTTAACCAACATGGTGAATTCTTGCACACTATTAACGATAGGTGTAGCCGATAAACAAATCATCT +TATGGTTTTTTAACGCAGTGGTCTTAGATAAAAAATTATATACTGACCGAGTAGGACGGATCTTACCATC +TTCTTTGATTAATGATTTAGAAATGAAGTTATGACATTCATCAATGATGACGCATATTCTACTCTTGGAA +TTAATAGTTTTGATATTAGTAAAAAATTTATTTCTAAAATTTTGATCATCGTAATTAATAAAAATACAAT +CCTTCGTTATCTCTGGAGCGTATCTGAGTATAGTGTTTATCCAAGGATCTTCTATCAAAGCCTTTTTTAC +CAATAAGATAATTGCCCAATTTGTATAAATATCCTTAAGATGTTTGAGAATATATACAGTAGTCATTGTT +TTACCGACACCTGTTTCATGGAACAATAAAAGAGAATGCATACTGTCTAATCCTAAGAAAACTCTTGCTA +CAAAATGTTGATAATCCTTGAGGCGTACTACGTCTGACCCCATCATTTCAACGGGCATATTAGTAGTTCT +GCGTAAGGCATAATCGATATAGGCCGCGTGTGATTTACTCATTTATGAGTGATAAGTAATAACTATGTTT +TAAAAATCACAGCAGTAGTTTAACTAGTCTTCTCTGATGTTTGTTTTCGATACTTTTTGAATCAGAAGTC +ATACTAGAATAAAGCAGCGAGTGAACGTAATAGAGAGCTTCGTATACTCTATTCGAAAACTCTAAGAACT +TATTAATGAATTCCGTATCCACTGGATCGTTTAAAATACTAAATTGAACAGTGTTCACATCCTTCCAAGA +CGAAGACTTAGTGACGGACTTAACATGAGACATAAATAAATCCAAATTTTTTTTATAAACATCACTAGCC +ACCATAATGGCGCTATCTTTCAACCAACTATCGCTTACGCATTTTAACAGTCTAACATTTTTAAAGAGAC +TACAATATATTCTCATAGTATCGATTACACCTCTACCGAATAGAGTGGGAAGTTTAATAATACAATATTT +TTCGTTTACAAAATCAAATAATGGTCGAAACACGTCGAAGGTTAACATCTTATAATCGCTAATGTATAGA +TTGTTTTCAGTGAGATGATTATTAGATTTAATAGCATCTCGTTCACGTTTGAACAGTTTATTGCGTGCGC +TGAGGTCGGCAACTACGGCATCCGCTCTAGTACTCCTCCCATAATACTTTACGCTATTAATCTTTAAAAT +TTCATAGACTTTATCTAGATCGCTTTCTGGTAACATGATATCATGTGTAAAAAGTTTTAACATGTCGGTC +GGCATTCTATTTAGATCATTAACTCTAGAAATCTGAAGAAAGTAATTAGCTCCATATTCCAGACTAGGTA +ATGGGCTTTTACCTAAAGACAAGTTAAGTTCTGGCAATGTTTCATAAAATGGAAGAAGGACATGTGTCCC +CTCCCGGATATTTTTTACAATTTCATCCATTTACAACTCTATAGTTTGTTTTCATTATTATTAGTTATTA +TCTCCCATAATCTTGGTAATACTTACACCTTGATCATAAGATACCTTATACAGGTCATTACATACAACTA +CCAATTGTTTTTGTACATAATAGATTGGATGATTGACATCCATGGTGGAATAAACTACTCGAACAGATAG +TTTATCTTTCCCCCTAGATACATTGGCCGTAATAGTTGTCGGCCTAAAGAATATCTTTGGTGTAAAGTTA +AAAGTTAGGGTTCTTGTTCCATTATTGCTTTTTGTCAGTAGTTCGTTATAAATTCTCGAGATGGGCCCGT +TCTCTGAATATAGAACATCATTTCCAAATCTAACTTCTAGTCTAGAAATAATATCGGTCTTATTTTTAAA +ATCTATTCCCTTGATGAATGGATCGTTAATAAACAAATCCTTGGCCTTTGATTCGGCTGATCTATTATCT +CCGTTATAGACGTTACGTTGACTAGTCCAAAGACTTACAGGAATAGATGTATCGATGATGTTGATAGTAT +GTGATATGTGAGCAAAGACTGTTCTCTTGGTGGCGTCGCTATATGTTCCAGTAATAGCGGAAAACTTTTT +AGAAATGTTATATATAAAAGAATTTTTTCGGGTTCCAAACATTAACAGATTAGTATGAAGATAAACACTC +ATATTATCAGGAACATTATCAATTTTTACATAAACATCGGCATCTTGAATAGAAACAACACCATCTTCTG +GAACCTCTACGATCTCGGCAGATTCCGGATAACCAGTCGGTGGACCATCACTAACAATAACTAGATCATC +CAACAATCTACTCACATATGCGTCTATATAATCTTTTTCATCTTGTGAGTACCCTGGATACGAAATAAAT +TTGTTATCCGTATTTCCATAATAAGGTTTAGTATAAACAGAGAGAGATGTTGCTGCATGAACTTCGGTTA +CTGTCGCCGTTGGTTGGTTTATTTGACCTATTACTCTCCTAGGTTTCTCTATAAATGATGGTTTAATTTG +TACATTCTTAACCATATATCCAATAAAGCTCAATTCAGGAACATAAACAAATTCTTTGTTGAACGTTTCA +AAGTCGAACGAAGAGTCACGAATAACGATATCGGATACTGGATTGAAGGTCACCGTTACCGTAATTTTTG +AATCGGATAGTTTAAGACTACTGAATGTATCTTCCACATCAAACGGAGTTTTAATATAAACGTATACTGT +AGATGGTTCTTTAATAGTGTCATTAGGAGTTAGACCAATAGAAATATCATTAAGTTCACTAGAATATCCA +GAATGTTTCAAAGCAATTGTATTATTGATACAATTATTATATAATTCTTCGCCATCAATTTCCCAAATAA +CACCGTTACACGAAGAGACAGATACATGATTAATACATTTATATCCAACATATGGTACGTAACCGAATCT +TCCCATACCTTTAACTTCTGGAAGTTCCAAACTCAGAACCAAATGATTAAGCGCAGTAATATACTGATCC +CTAATTTCGAAGCTAGCGATAGCCTGATTGTCGGGCCCATCGTTTGTCATAACTCCGGATAGAGAAATAT +ATTGCGGCATATATAAAGTTGGAATTTGACTATCAACTGCGAAGACATTAGACCGTTTAATAAAGTCATC +CCCACCGATCAAAGAATTAATGATAGTATTATTCATTTTCTATTTAAAATGGAAAAAAGCTTACAATAAA +CTCCGTAGAGAAATATCTATAATTTGTGAGTTTTCCTTAAAGTAACAGCTTCCGTAAACACCGTCTTTAT +CTCTTAATAAGTTTATTGTATTTATGACCTTTTCCTTATCTTCATAGAATACTAAAGGCAATAAAGAAAT +TTTTGGTTCTTCTCTAAGAGCTACGTGAGACTTAACCATAGACGCCAACGAATCCCTACATATTTTAGAA +CAGAAATACCCAACTTCACCACCCTTGAATGTCTCAATACTAATAGGTCTAAAAACCAAATCTTGATTAC +AAAACCAACACTTATCAATTACACTATTTGTCTTAATAGACATATCTGCCATAGATTTATAATACTTTGG +TAGTATACAAGCGAGTGCTTCTTCTTTAGCGGGCTTAAAGACTGCTTTAGGTGCTGAAATAACCACATCT +GGAAGACTTACTCGCTTAGCCATTTAATTACGGAACTATTTTTTTATACTTCTAATGAACAAGTAGAAAA +CCTCTCATCTACAAAAACATACTCGTGTCCATAATCCTCTACCATAGTAACACGTTTTTTAGATCTCATA +TGTGCTAAAAAGTTTTCCCATACTAATTGGTTACTATTATTTTTCGTATAATTTCTAACAGTTTGAGGTT +TTAGATTTTTAGTTACAGAAGTGATATCGAATATTTTATCCAAAAAGAATGAGTAATTAATTGTCTTAGA +AGGAGTGTTTTCTTGGCAAAAGAATACCAAGTGCTTAAATATTTCTACTACTTCATTAATCTTTTCTGTA +CTCAGATTCAGTTTCTCATCTTTTACTTGATTGATTATTTCAAAGACTAACTTATAATCCTTTTTATTTA +TTCTCTCGTTAGCCTTAAGAAAACTAGATACAAAATTTGCATCTACATCATCCGTGGATATTTGATTTTT +TTCCATGATATCCAATAGTTCCGAGATAATTTCTCCAGAACATTGATGAGACAATAATCTCCGCAATACA +TTTCTCAAATGAATAAGTTTATTAGACACGTGGAAGTTTGACTTTTTTTGTACCTTTGTACATTTTTGAA +ATACAGACTCGCAAAAAATACAATATTCATATCCTTGTTCAGATACTATACCGTTGTGTCTACAACAGCT +ACATAATCGTAGATTCATGTTAACACTCTACGTATCTCGTCGTCCAATATTTTATATAAAAACATTTTAT +TTCTAGACGTTGTCAGAAAATCCTGTAATATTTTTAGTTTTTTTGGTTGTGAATAAAGTATCGCCCTAAT +AATATTGGTACCGTCTTCCGACAATATAGTAGTTAAATTATCCGAGCATGTAGAAGAACACCGCTTAGGC +GGATTCAGTACAATGTTATATTTTTCGTACCAACTCATTTAAATATCATAATCTAAAATAGTTCTGTAAT +ATGTCTAGCGCTAATATATTGATCATAATCCTGTGCATAAATTAAGATACAACAATGTCTTGAAATCATC +GACATGGCTTCTTCCATAGTTAGAAGATCATCGTCAAAGTTAGCAACGTGATTCATCAACATTTGCTGTT +TTGAGGCAGCAAATACTGAACCATCACCATTCAACCATTCATAAAAACCATCGTCTGAATCCATTGATAA +TTTCTTGTACTGGTTTTTGAGAGCTCGCATCAATCTAGCATTTCTAGCTCCCGGATTGAAAACAGAAAGA +GGATCGTACATCCAGGGTCCATTTTCTGTAAATAGAATCGTATAATGTCCCTTCAAGAAGATATCAGACG +ATCCACAATCAAAGAATTGGTCTCCGAGTTTGTAACAGACTGCGGACTTTAACCTATACATGATACCGTT +TAGCATGATTTCTGGTGATACGTCAATAGGAGTATCATCTATTAGAGATCTAAAGCCGGTGTAACATTCT +CCACCAAACATATTCTTATTCTGACGTCGTTCTACATAAAACATCATTGCTCCATTAACGATAACAGGTG +AATGAACAGCACTACCCATCACATTAGTTCCCAATGGATCAATGTGTGTAACTCCAGAACATCTTCCATA +GCCTATGTTAGGAGGAGCGAACACCACTCTTCCACTATTGCCATCGAATGCCATAGAATAAATATCCTTG +GAATTGATAGAAATCGGACTGTCGGATGTTGTTATCATCTTCATAGGATTAACAACGATGTATGGTGCAG +CCTGAAGTTTCATATCATAACTGATGCCGTTCATAGGTCTAGCCACAGAAACCAACGTAGGTCTAAATCC +AACTATAGACAAAATAGAAGCTAATATCTGTTCCTCATCTGTCATAACTTGAGAGCATCCAGTATGAATA +ATCTTCATTAGATGGGGATCTACCGCATCATCATCGTTACAATAAAAAATTCCCATTCTAATGTTCATAA +TTGCTTTTCTAATCATGGTATGAATGTTTGCTCTCTGAATCTCTGTGGAAATTAGATCTGATACACCTGT +AATCACTATCGGATTATCCTCCGTAAGACGATTAACCAACAACATATAATTATAAGACTTTACTCTTCTA +AATTCATAAAGTTGCTGGATTAGACTATATGTGTCTCCATGTACATACGCGTTCTCGAGCGCAGGAAGTT +TAATACCGAATAGTGCCATCAGAATAGGATGAATGTAGTAATTAGTTTCTGGTTTTCTATAAATAAAAGA +CAAATCTTGTGAACTAGACATATCGGTAAAATGCATGGATTGGAATCGTGTAGTCGACAGAAGAATATGA +TGATTAGATGGAGAGTATATTTTATCTAACTCTTTGAGTTGGTCACCGATTCTAGGACTAGCTCGAGAAT +GAATAAGTACTAAGGGATGAGTACATTTCACAGAAACACTGGCGTTGTTCAACGTACTCTTTACATGGGA +AAGGAGTTGAAATAGCTCGTTTCTATTTGTCCTGACAATATTTAGTTTATTCATAATATTAAGCATATCC +TGAATAGTAAAGTTAGATGTGTCATACTTGTTAGTAGTTAGATATTTAGCAATTGCATTCCCATCATTTC +TCAATCTCGTACTCCAATCATGTGTGGATGCTACTTCGTCGATGGAAACCATACAATCCTTTTTGATAGG +CTGTTGAGATTGATCATTTCCTGTACGTTTAGGTTTGGTACGTTGATTTCTAGCCCCTGCGGATATAAAG +TCATCGTCTACAATTTGGGATAATGAATTACATACACTACAAGACAAAGATTTATCAGAAGTGTGAATAT +GATCTTCATCTACCAAAGAAAGAGTTTGATTAGTATAACTAGATTTTAGTCCCGCGTTAGATGTTAAAAA +AACATCGCTATTGACCACGGCTTCCATTATTTATATTCGTAGTTTTTACTCGAAAGCGTGATTTTAATAT +CCAATCTTATTACTTTTGGAATCGTTCAAAACCTTTGACTAGTTGTATAATTTGATCTATTGCCCTACGC +GTATACTCCCTTGCATCATATACGTTCGTCACCAGATCGTTTGTTTCGGCCTGAAGTTGACGCATATCTT +TTTCAACACTCGACATGAGATCCTTAAGGGTCATATCGTCTAGATTTTGTTGAGATGCTGCTCCTGGATT +TGGATTTTGTTGTGCTGTTGTACATACTGTACCACCAGTAGGTGTGGGAGTACATACAGTGGCCACAATA +GGAGGTTGAAGAGGTGTAACCGTTGGAGTAGTACAAGAAATACTTCCATCCGATTGTTGTGTACATGTGG +TTGTTGGTAACGTCTGAGAAGGTTGGGTAGATGGCGGTGTCGTCATCTTTTGATCTTTATTAAATTTAGA +GATAATATCCTGAACAGTATTGCTCGGCGTCAACGCTGGAAGGAGTGTACTCGCCGGCGCATCAGTATCT +GCAGACAGCCAATCAAAAAGATTAGACATATCAGATGATGTATTAGTTTGTTGTCGTGGTTTTAGTACAG +GAGCAGTACTACTAGGTAGAAGAATAGGAGCCGGTGTAGGTGTCGGAACCGGCTGTGGAGTTATATGAAT +AGTTGGTTGTAGCGGTTGGGTAGGCTGTCTGCTGGCGACCATCATATTATCTCTAGCTAGTTGTTCTCGC +AACTGTCTTTGATAATACGACTCTTGAGACTTTAGTCCTATTTCAATCGCTTCATCCTTTTTCGTATCCG +GATCCTTTTCTTCAGAATAATAGATTGACGACTTTGGTGTAGAGGATTCTGCCAGCCCCTGTGAGAACTT +GTTAAAGAAGTCCATTTAAGGCTTTAAAATTGAATTGCGATTATAAGATTAAATGGCAGACACGGACGAT +ATTATCGACTATGAATCCGATGATCTCACCGAATACGAGGATGATGAAGAAGATGGAGAGTCACTAGAAA +CTAGTGATATAGATCCCAAATCTTCTTATAAGATTGTAGAATCAACATCCACTCATATAGAAGATGCGCA +TTCCAATCTTAAACATATAGGGAATCATATATCTGCTCTTAAACGACGCTATACTAGACGTATAAGTCTA +TTTGAAATAGCGGGTATAATAGCAGAAAGCTATAACTTACTTCAACGAGGAAGGTTACCTCTAGTTTCAG +AATTTTCTGACGAAACGATGAAGCAAAATATGCTACATGTAATTATACAAGAGATAGAGGAGGGTTCTTG +TCCTATAGTCATCGAAAAGAACGGAGAATTGTTGTCGGTAAACGATTTTGATAAAGATGGTCTAAAATTC +CATCTAGACTATATTATCAAAATTTGGAAACTTCAAAAACGATATTAGAATTTATACGAATATCGTTCTC +TAAATGTTACAATCAAGTCTCTCATATTCAGCAGTTTATTGTCGTACTTTATATCGTGTTCATTAACGAT +ATTTTGCAAAATAGTAATGATTCTATCTTCCTTCGATAGATATTCTTCAGAGATTATTGTCTTATATTCT +TTCTTGTTATCCGATATGAATTTGATAAGACTTTGAACATTATTAATACCCGTCTGTTTAATTTTTTCTA +TAGATATTTTAGTTTTGGTAGATTCTATGGTGTCTGTTAATAGGCATCCAACATCGACATTCGACGTCAA +TTGTCTATAAATCAGAGTATAAATTTTAGAAATAACATTAGCAAATTGTTGTGCGTTGATGTCGTTATTC +TGAAACAGTATGATTTTAGGTAGCATTTTCTTAACAAAGAGAACGTATTTATTGTTACTCAGTTGAACAG +ATGATATATCCAGATTACTAACGCATCTGATTCCATATACCAAACTTTCAGAAGAAATGGTGTACAATTG +TTTGTATTCATTCAATGTCTCCTTTTCAGAAATTAGTTTAGAGTCGAATACTGCAATAATTTTCAAGAGA +TAGTTTTCATCAGATAAGATTTTATTTAGTGTAGATATGATAAAACTATTGTTTTGTTGGAGAACTTGAT +ACGCCGCATTCTCTGTAGTCGACGCTCTCAAATGGGAAACAATCTCTATTATTTTTTTGGAATCGGATAC +TATATCTTCGGTATCTTGACGCAGTCTAGTATACATAGAGTTAAGAGAAATTAGAGTTTGTACATTAAGC +AACATGTCTCTAAATGTGGCTACAAACTTTTCTTTTTCCACATCATCTAGTTTATTATATACCGATTTCA +CAACGGCACCAGATTTAAGGAACCAGAATGAAAAACTCTGATAACTACAATATTTCATCATAGTTACGAT +TTTATCATCTTCTATAGTTGGTGTGATAACACATACCTTTTTCTCCAAGACTGGAACCAACGTCATAAAA +ATGTTTAAATCAAAATCCATATCAACATCTGATGCGCTAAGACCAGTCTCGCGTTCAAGATTATCTTTAC +TAATGGTGACGAACTCATCGTATAGAACTCTAAGTTTGTCCATTATTTATTTACAGATTTAGTTGTTTAA +TTTATTTGTGCTCTTCCAGAGTTGGGATAGTATTTTTCTAACGTCGGTATTATATTATTAGGATCTACGT +TCATATGTATCATAATATTAATCATCCACGTTTTGATAAATCTATCTTTAGCTTCTGAAATAACGTATTT +AAACAAAGGAGAAAAATATTTAGTTACGGCATCAGACGCAATAACATTTTTTGTAAATGTAACGTATTTA +GACGACAGATCTTCGTTAAAAAGTTTTCCATCTATGTAGAATCCATCGGTTGTTAACACCATTCCCGCGT +CAGAGTGAATAGGAGTTTGAATAGTTTGTTTTGGAAATAGATCCTTCAATAACTTATAGTTGGGTGGGGA +AAAATCAATTTTATCACTAGACTCTTTCTTTTTTACTATCATTACCTCATGAACTATTTCTTGAATGAGT +ATATGTATTTTCTTTCCTATATCGGTCGCGTTCATTGGAAAATATATCATGTCGTTAACTATAAGAATAT +TTTTATCCTCGTTTACAAACTGAATAATATCAGATATAGTTCGTAAACGAACTATATCATCACCAGCACA +ACATCTAACTATATGATATCCACTAGTTTCCTTTAGCCGTTTATTATCTTGTTCCATATTAGCAGTCATT +CCATCATTTAAGAAGGCGTCAAAGATAATAGGGAGAAATGACATTTTGGATTCTGTTACGACTTTACCAA +AATTAAGGATATACGGACTTACTATCTTTTTCTCAACGTCGATTTGATGAACACACGATGAAAATGTACT +TCGATGAGATTGATCATGTAGAAAACAACAAGGGATACAATATTTCCGCATATCATGAAATATATTAAGA +AATCCCACTTTATTATATTTCCCCAAAGGATCAATGCATGTAAACATTATGCCGTTATCATTAATAAAGA +CTTCTTTCTCATCGGATCTGTAAAAGTTGTTACTGATTTTTTTCATTCCAGGATCTAGATAATTAATAAT +AATGGGTTTTCTATTCTTATTCTTTGTATTTTGACATATCCTAGACCAGTAAACAGTTTCCACTTTGGTA +AAATCAGAAGACTTTTGAACGCTATTAAACATGGCATTAATGGCAATAACTAAAAATGTAAAATATTTTT +CTATGTTAGGAATATGGTTTTTCACTTTAATAGATATATGGTTTTTTGCCAAAATGATAGATATTTTTTT +ATCCGATGATAGCAAAATATTATTAGTCGCCGTCTCTATAAAAATGAAGCTAGTCTCGATATCCAATTTT +ATTCTAGAATTGATAGGAGTCGCCAAATGTACCTTATACGTTATATCTCCCTTGATGCGTTCCATTTGTG +TATCTATATCGGACACAAGATCTGTAAATAGTTTTACGTTATTAATCATCACGGTATCGCCATCGCTAGA +TAATGCTAATGTACTATCCAAGTCCCAAATGGAGAGATTTAACTGTTCATCGTTTAGAATAAAATGATTA +CCTGTCATATTAATAAAGTGTTCATCGTATCTAGATAACAACGACTTATAATTAATGTCCAAGTCTTGAA +CTCGCTGAATGATCTTTTTTAACCCAGTTAGTTTTAGATTGGTACGAAATATATTGTTAAACTTTGATTC +TACAGTAATGTCCAAATCTAGTTGTGGAAATACTTCCATCAACATTGTTTCAAACTTGATAATATTATTA +TCTACATCTTCGTACGATCCAAATTCCGGAATAGATGTATCGCACGCTCTGGCCACCCAGATAACCAAAA +AGTCACACGCTCCAGAATATACATTGTATAAAAAGCTATCGTTTTTTAGTAGTGTTTTTTTCTGAGTATA +TACGAAAGGATTAAAAATAGTATTATCAACGTAACTATATTCCAAATTATTCTTATGAGAATAGATAATA +ATATCGTCCTTAATATCTAACAAATTTCCTAAATATCCCTTTAATTGAGTCATTCGAAGCGTTAATAAAA +TATGTCTCTTAACTATTTCCGGCCGTTGTATATTTAAATGACTTCGTAAGAAATAATATATAGGCGACTT +CTCATCTATGTAATCATATGGAGTGAGATATAGGGCTCGTTCTACCTCCTGCCCCTTACCCACCTGTAAT +ACCAATTGTGGACTCACTATATATCGCATATTTATATCGTGGGGTAAAGTGAAAATCTACTACCGATGAT +GTAAGTCTTACAATGTTCGAACCAGTACCAGATCTTAATTTGGAGGCCTCCGTAGAGCTAGGGGAGGTAA +ATATAGATCAAACAACACCTATGATAAAGGAGAATAGCGGTTTTATATCCCGTAGTAGACGTCTATTCGC +CCATAGATCTAAGGATGATGAGAGAAAACTAGCACTACGATTCTTTTTACAAAGACTTTATTTTTTAGAT +CATAGAGAGATTCATTATTTGTTCAGATGCGTCGACGCTGTAAAAGACGTCACTATTACCAAAAAAAATA +ACATTATCGTGGCGCCTTATATAGCACTTTTAACTATCGCATCAAAAGGATGCAAACTTACAGAAACAAT +GATTGAAGCATTCTTTCCAGAACTATATAATGAACATAGTAAGAAATTCAAATTCAACTCTCAAGTATCC +ATCATCCAAGAAAAACTCGGATACCAGTCTGGAAACTATCACGTTTATGATTTTGAACCGTATTACTCTA +CAGTAGCTCTGGCTATTCGAGATGAACATTCATCTGGCATTTTTAATATCCGTCAAGAGAGTTATCTTGT +AAGTTCATTATCTGAAATAACATATAGATTTTATCTAATTAATCTAAAATCTGATCTTGTTCAATGGAGT +GCTAGTACGGGCGCTGTAATTAATCAAATGGTAAATACTGTATTGATTACAGTGTATGACAAATTACAAC +TGGCCATAGAAAATGATTCACAATTTACATGTTCATTGGCTGTGGAATCAGAACTTCCAATAAAATTACT +TAAAGATAGAAATGAATTATTTACAAAATTCATTAACGAGTTAAAAAAGACCAGTTCATTCAAGATAAGC +AAACGCGATAAGGATACGCTATTAAAACATTTTACTTATGACTGGAGTTAGAATTTATAGACGACTCATT +TCGTTTATCATTATTACTATTACTATCATTATTAGTATTCTTCTTGTCATCTTGTTCAGAAATATACAGC +AATGCTATACCTAATACCAAATACATTATCATGCTTGCAATGGCTCTAACAACAACGAACCAAAATGAAT +TTGGTCGTAGCTTTTGTTCACAAAAATACATAAAGAAATGTCTACATAAATCTATGGCGCCATTGGCTAC +TTGAAATAGCGCCAGTCCTCCTACAGATTTTAATATAGCTGTATAACATGACATTTATTCATCATCAAAA +GAGACAGAGTCACCATCTGTCATATTTAGATTTTTTTTCATGTGTTCAAAGTATCCTCTACTCATTTCAT +TATAATAGTTTATCATACTTAGAATTTTAGGACGGATCAATGAGTAAGATTTGACTAGATCGTCAGTAGT +AATTTGTGCATCATCTATTCTGCATCCGCTTCGTCGAATAATGTATAGCATCGCTTTGAGATTCTCCATA +GCTATCAAGTCTTTATATAATGACATGGAAATATCTGTGAATGCTTTATACTTCTCCAACATCGATGCCT +TAACATCATCACATACTTTAGCATTGAAAATACGTTCTATTGTGTAGATGGATGTAGCAAGATTTTTAAA +CAACAATGCCATCTTACATGATGATTGTCTCAAGTCTCCAATCGTTTGTTTAGAACGATTAGCTACAGAG +TCCAATGCTTGGCTAACTAGCATATTATTATCTTTAGAAATTGTATTCTTCAATGAGGCGTTTATCATAT +CTGTGATTTCGTTAGTCATATTACAGTCTGACTGGGTTGTAATGTTATCCAACATATCACCTATGGATAC +GGTACACGTACCAGCATTTGTAATAATCCTATCTAAGATGTTGTATGGCATTGCGCAGAAAATATCTTCT +CCTGTAATATCTCCACTCTCGATAAATCTACTCAGATTATTCTTAAATGCCTTATTCTCTGGAGAAAAGA +TATCAGTGTCCATCATTTCATTAATAGTATACGCAGAAAAGATACCACGAGTATCAATTCTATCCAAGAT +ACTTATCGGTTCCGAGTCACAGATAATGGTTTCCTCTCCTTCGGGAGATCCTGCATAGAAATATCTAGGA +CAATAGTTTCTATACTGTCTGTAACTCTGATAATCTCTAAAGTCACTAACTGATACCATGAAATTGAGAA +GATCAAACGCTGAAGTAATCAATTTTTCTGCCTCGTTTTTACTACAACTAGTTTTCATCAATGTAGTGAC +GATGTATTGTTTAGTTACTCTTGGTCTAATACTGATGATAGAGATATTATTGCTTCCCATAATGGATCTT +CTAGTAGTCACCTTAAAGCCCATTGATGCGAATAGCAGATAGATAAAGTCTTGGTATGACTCCTTTCTAA +TATAGTACGGACTACCTTTGTCACCCAACTTTATACCCACATAAGCCATAACAACCTCTTTAATAGCCGT +TTCATGAGGTTTATCAGCCATGAGCCTGAGTAGTTGAAAGAATCGCATGAATCCCGTCTCAGAAAGTCCT +ATATGCATGATAGATTTATCTTTCCTGGGAAACTCTCGTATAGTTATAGATGAAATACTCTTCAAAGTTT +CTGAAATAAGATTAGTAACAGTCTTACCTCCGACTACTCTGGGTAACAAACATACTCTAATAGGTGTTTT +CTCTGCGGAGATAATATCAGAAAGGATAGAGCAATAAGTAGTATTATTGTGATTATAAAGACCGAATACA +TAACAGGTAGAATTTATAAACATCATGTCCTGAAGGGTTTTAGACTTGTATTCCTCGTAATCTATACCGT +CCCAAAACATGGATTTGGTAACTTTGATAGCCGTAGATCTTTGTTCCTTCGCCAACAGGTTAAAGAAATT +AATAAAGAATTTGTTGTTTCTATTTATGTCCACAAATTGCACGTTTGGAAGCGCCACGGTTACATTCACT +GCAGCATTTTGAGGATCGCGAGTATGAAGTACAATGTTATTGTTTACTGGTATATCTGGAAAGAAATCTA +CCAGTCTAGGAATAAGAGATTGATATCGCATAGAAATAGTAAAGTTTATAATCTCATCATTGTAGATTAC +TCTGTTACCATTGTAATAAATTGGTACTCTATCATAATCATTGACAAAGTACTGTTCATACATGATGAGA +TGTTTATATGTTGGCATAGTAGTGAGATCGACGTTTGGTAATGGCAATGTATTAAGATTAACTCCATAAT +GTCTAGCAGCATCTGTGATGTTATAAGTGATGTCAAAGCGGGGTTGATCTTGTGCTGTTATATATTGTCT +AACACCTATAAGATTATCAAAATCTTGTCTGCTTAATACACCGTTAACAATTTTTGCCTTGAATTCTTTT +ATTGGTGCATTAATAACATCCTTATAGAGGATGTTAAACAAATAAGTATTATCAAAGTTAAGATCTGGGT +ATTTCTTTTCTGCTAGAACATCCATTGAGTCGGAGCCATCTGGTTTAATATAACCACCGATAAATCTAGC +TCTGTATTCTGTATCCGTCAATCTAATATTAAGAAGGTGTTGAGTGAAAGGTGGAAGATCGTAAAAGCTG +TGAGTATTAATAATAGGGTTAGTTTCCGAACTAATGTTAATTGGATGATTAATAATATCTATATTTCCAG +CGTTAAGTGTAACATTAAACAGTTTTAATTCACGTGACGTGGTATCAATTAAATAATTAATGCCCAATTT +GGATATAGTAGCCTGAAGCTCATCTTGTTTAGTTACGGATCCTAATGAGTTATTAAGAAATACATCGAAC +GGATGAACGAAGGTTGTTTTAAGTTGATCACATACTTTGTAATCTAGACATAGATGTGGAAGAACGGTAG +AAACTATACGAAATAGATATTCAGAGTCCTCTAATTGATCAAGAGTAACTATTGACTTAATAGGCATCAT +TTATTTAGTATTAAATGACGACCGTACCAGTGACAGATATACAAAACGACTTAATTACAGAGTTTTCAGA +AGATAATTATCCATCTAACAAAAATTATGAAATAACTCTTCGCCAAATGTCTATTCTAACTCACGTTAAC +AACGTGGTAGATAGAGAACATAATGCCGCCGTAGTGTCATCTCCAGAGGAAATATCATCACAACTTAATG +AAGATCTATTTCCAGATGATGATTCACCGGCCACTATTATCGAACGAGTACAACCTCATACTACTATTAT +TGACGATACGCCACCTCCTACTTTTCGTAGAGAGTTATTGATATCGGAACAACGTCAACAACGAGAAAAA +AGATTTAATATTACAGTATCAAAAAATTCTGAAGCAATAATGGAATCTAGATCTATGATAACTTCTATGC +CAACACAAACACCATCCTTGGGAGTAGTTTATGATAAAGATAAAAGAATTCAGATGCTAGAGGATGAAGT +GGTTAATCTTAGAAATCAACGATCTAATACAAAATCATCTGATAATTTAGATAATTTTACCAGAATACTA +TTTGGTAAGACTCCGTATAAATCAACAGAAGTTAATAAGCGTATAGCCATCGTTAATTATGCAAATTTGA +ACGGGTCCCCCTTATCAGTCGAGGACTTGGATGTTTGTTCGGAGGATGAAATAGATAGAATCTATAAAAC +GATTAAACAATATCACGAAAGTAGAAAACGAAAAATTATCGTCACTAACGTGATTATTATTGTCATAAAC +ATTATCGAGCAGGCATTGCTAAAACTCGGATTTGAAGAAATCAAAGGACTGAGTACCGATATCACTTCAG +AAATTATCGATGTGGAGATCGGAGATGACTGCGATGCTGTAGCATCAAAACTAGGAATCGGTAACAGTCC +GGTTCTTAATATTGTATTGTTTATACTCAAGATATTCGTTAAACGAATTAAAATTATTTAATTTAATACA +TTCCCATATCCAGACAACAATCGTCTGGATTAATCTGTTCCTGTCGTCTCATACCGGACGACATATTAAT +CTTTTTATTAGTGGGCATCTTTTTAGATGGTTTCTTTTTCCCAGCATTAACTGATTCGATACCTAGAAGA +TCGTGATTGATTTCTCCGACCATTCCACGAACTTCTAATTGGCCGTCTCTAACGGTACCATAAACTATTT +TACCAGCATTAGTAACAGCTTGGACAATCTGACCATCCATTGCGTTGAATGATGTAGTTGCTGTTGTTCT +ACGTCTAGGAGCACCAGAGGTATTTTTAGAGCTCTTGGATGTTGATGTAGAAGACGAGGATTTTGATTTT +GGTTTACATGTAATACATTTTGAACTCTTTGATTTTGTATCACATGCGCCGGCAGTCACATCTGTTTGAG +AATTAAGATTATTGTTGCCTCCTTTGACGGCTGCATCTCCACCGATCTGCGCTAGTAGATTTTTAAGCTG +TGGTGTAATCTTATTAACTGTTTCGATATAATCATCGTAACTACTTCTAACGGCTAAATTTTTTTTATCC +GCCATTTAGAAGCTAAAAATATTTTTATTTATGCAGAAGATTTAACTAGATTATACAATGAACTAATATG +ATCCTTTTCTAGATTATTTACGAACTTGGTATTTCTTGTTTCTGGAGGAGGAGAATTTAAATTCGGACTT +GGATTCGGATTTTGTGGGTTCTTGATCTTATTATACAGCGTGTATAGGATGGCGACGGTAACTGCTACAC +AAATACCGATCAACAGAAGAATACCAATCATTTATTGACAATAACTTCACTATGATCAAGTATGTAATAA +TCATCTTTTCACTAAGTAAGTAGTAATAATGATTCAACAATGACAAGATATATGGACGATAATAATTTAG +TTCATGGAAATATCGCTATGATTGGTGTGAATGACTCCGCTAACTCTGTGGGGTGCACAGTGCTTTCCCC +ACATAGAATAAATTAGCATTCCGACTGTGATAATAATACCAAGTATAAACGCCATAATACTCAATACTTT +CCATGTACGAGTGGGACTGGTAGACTTACTAAAGTCAATAAAGGCGAAGATACACGAAAGAATCAAAAGA +ATGATTCCAGCGATTAGCACGCCGGAAAAATAATTTCCAATCATAAGCATCATGTCCATTTAACTAATAA +AAATTTTAAATCGCCGAATAAACAAAGTGGAATATAAACCATATAAAAACAATAGTTTGTACTGCAAAAA +TAATATCTATTTTTGTTTTCGAAGATATGGTAAAATTAAATAGTAGTACACAGCATGTTATAACTAACAG +CAGCAACGGCTCGTAATTACTTATCATTTACTAGACGAAAAGGTGGTGGGATATTTTCTTGCTCAAATAA +TACGAATATATCACCCATCCATTTTATACGATGTTTATATACTCTAATCTTTAATAGATCTATAGATGAC +GGGTTTACCAACAATATAGATTTTATCGATTCATCTAATTTAAACCCTTCCTTAAACGTGAATGATCTAT +TATCTGGCATAATGATGACCCTACCTGATGAATCTGACAATGTACTGGGCCATGTAGAATAAATTATCAA +CGAATTATCGTCTACGAACATTTATATCATTTGTTTTAATTTTAGGACGTGAATAAATAGATATAAAATA +GAAAATAACAGATATTACAACCAGTGTTATGGACGCACCCAACCATGTAGGCAGTTTTATTTTATCGTTT +ACTACAGGTTCTCCTGGATGTACGTCACCAACTACAGACGTAGTTCTAGTACAATTAGACGTAAGTTCCG +CTTGGGAATTTTTTAACACTAAAGAGTTAACGTTAATCGTACACCCAACGTATTTACATCTAGCTCTTTG +AACATCTTGATTATAATATAACCATTTTCTATCTCTAGATTCGTCAGTGCACTCATGTAACCAACATACC +CTAGGTCCTAAATATTTATCTCCGGAATTAGATTTTGGATAATTCGCGCACCAACAATTTCTATTTCCTT +TATGGTCGTTACAAAAGACGTATAATGCCGTATCCCCAAAAGTAAAATAATCAGGACGAATAATTCTAAT +AAACTCAGAACAATATCTCGCATCCATATGTTTGGAGCAAATATCGGAATAAGTAGACATAGCCGGTTTC +CGTTTTACACGTAACCATTCTAAACAATTGGGGTTTCCAGGATCGTTTCTACAAAAACCAGTCATGAAAT +CGTCACAATGTTCTGTCTTGTAATTATTATTAAATATTTTTGGACAGTGTTTGGTATTTGTCTTAGAACA +ACATTTTGCCACGCTATCACTATCACCCAGGAGATAATCCTTTTTTATAAAATGACACCGTTGCCCGGAT +GCTATATAATCAGTAGCATATTTTAAATCCTTAATATACTCAGGAGTTACCTCGTTCTGATAATAGATTA +ATGATCCAGGACGAAATTTGAAAGAACTACATGGTTCTCCATGAATTAATACATATTGTTTAGCAAATTC +AGGAACTATAAAACTACTACAATGATCTATCGACATACCATCTATCAAACAAAATTTGGGTTTAATTTCT +CCTGGAGACGTTTCATAATAATACATATAACTTTCTTCGGCAAACCTAACAGCTCTATTATATTCAGGAT +AATTAAAATCTAATACCATATATTTGTCTCGTATATCTGCTATTCCTGTCTCTATTTTGATTCTATTAAG +AGTAACAGCTGCCCCCATTCTTAATAATCATCAGTATTTAAACTGTTAAATGTTGGTATATCAACATCTA +TCTTATTTCCCGCAATATAAGGTTTGTTGCAGGTATACTGTTCAGGAATGGGTACATTTATACTTCTTTT +ATAGTCCTGTCTTTCGATGTTCATCACAAATGCAAAGAACAGAATAAACAAAATAATGTAAGAAATAATA +TTAAATATCTGTGAATTCGTAAATACATTGATTGCCATAATAATTACAGCAGCTACAATACACACAATAG +ACATTCCCACAGTGTTGCCATTACCTCCACGATACATTTGAGTTACTAAGCAATAGGTAATAACTAAGCT +AGTAAGAGGCAATAGAAAAGATGAGATAAATATCATCAATATAGAGATTAGAGGAGGGCTATATAGAGCC +AAGACGAACAAAATCAAACCGAGTAACGTTCTAACATCATTATTTTTGAAGATTCCCAAATAATCATTCA +TTATTCCTCCATAATCGTTTTGCATCATACCCCCATCTTTAGGCATAAACGATTGCTGCTGTTCCTCTGT +AAATAAATCTTTATCAAGCACTCCAGCACCCGCAGAGAAGTCATCAAGCATATTGTAATATCTTAAATAA +CTCATTTATATATTAAAAAATGTCACTATTAAAGATGGAGTATAATCTTTATGCCGAACTAAAAAAAATG +ACTTGTGGTCAGACCATAAGTCTTTTTAATGAAGACGGCGATTTCGTAGAAGTTGAACCAGGATCATCCT +TTAAGTTTCTAATACCTAAGGGATTTTACTCCTCTCCTTGTGTAAAGACGAGTCTAGTATTCGAGACATT +AACAACGACCGATAATAAAATTACTAGTATCAATCCAACAAATGCGCCAAAGTTATATCCTCTTCAACGC +AAAGTCGTATCTGAAGTAGTTTCTAATATGAGGAAAATGATCGAATTAAAACGTCCTCTATACATCACTC +TTCACTTGGCATGTGGATTTGGTAAGACTATTACCACGTGTTATCTTATGACCACACACGGCAGAAAAAC +CATCATTTGCGTACCCAATAAAATGTTAATACATCAATGGAAGACACAGGTAGAGGCAGTCGGATTGGAA +CATAAGATATCTATAGATGGAGTTAGTAGTCTATTAAAGGAACTAAAGACTCAAAGTCCGGATGTATTAA +TCGTAGTCAGTAGACATCTGACAAACGATGCATTTTGTAAATATATCAATAAGCATTATGATTTGTTTAT +CTTGGATGAATCACATACGTATAATCTGATGAACAATACAGCAGTTACAAGATTTTTAGCGTATTATCCT +CCGATGATGTGTTATTTTTTAACTGCTACACCTAGACCAGCTAACCGAATTTATTGTAACAGTGTTATTA +ATATTGCCAAGTTATCAGATCTAAAAAAAACTATCTATACAGTAGATAGTTTTTTTGAGCCATATTCCAC +AGACAATATTAGAAATATGGTAAAACGACTAGATGGACCATCTAATAAATATCATATATATACCGAGAAG +TTATTATCTGTAGACGAGCCTAGAAACCAACTTATTCTTGATACCCTGGTAGAAGAATTCAAGTCAGGAA +CTATTAATAGAATTTTAGTTATTACTAAACTACGTGAACATATGGTATTCTTCTACAAACGATTATTAGA +TCCTTTCGGACCAGAGGTTGTATTTATAGGAGACGCCCAAAATAGACGTACTCCAGATATGGTCAAATCA +ATTAAGGAACTAAATAGATTTATATTCGTATCCACCTTATTTTATTCCGGCACTGGTTTAGATATTCCGA +GTTTGGATTCTTTGTTCATTTGCTCGGCAGTAATCAACAATATGCAAATAGAGCAATTACTAGGGAGGGT +ATGTCGAGAAACAGAACTATTAGATAGGACGGTATATGTATTTCCTAACACATCCATCAAAGAAATAAAG +TACATGATAGGAAATTTCGTGCAACGAATTATTAGTCTGTCTGTAGATAAACTCGGATTTAAACAAGAAA +GTTATCGGAAACATCAGGAATCTGAACCCGCTTCCGTGCCAACATCCTCCAGAGAAGAACGTGTATTAAA +TAGAATATTTAACTCGCAAAATCGTTAAGAAGTTTAAGAGACGATCCACATGCTGAGCAGGCCAGTGTAT +TACCCCTCATAGTATTAATATAATCCAATGATACTTTTGTGATGTCGGAAATCTTAACCAATTTAGACTG +ACAGGCAGAACACGTCATGCAATCATCACCGTCATCGATAACTGTAGTCTTGGGCTTCTTTTTGCGACTC +TTCATTCCGGAACGCATATTGGTGCTATCCATTTAGGTAGTAAAAAATAAGTCAGAATATGCCCTATAAC +ACGATCGTGCAAAACCTGGTATATCGTCTCTATCTTTATCACAATATAGTGTATCAACATCTTTATTATT +GACCTCGTTTATCTTGGAACATGGAATGGGAACATTTTTGTTAACGGCCACCTTTGCCTTAATTCCAGAT +GTTGTAAAATTATAACCAAACAGTCTATCATCGACACAAATGAAATTCTTGTTTAGACGTTTGTAGTTTA +CGTATGCGGCTCGTTCTCGTCTCATTTTTTCAGATATTGCAGGTACTATAATATTAAAAATAAGAATGAA +ATAACATAGGATTAAAAATAAAGTTATCATGACTTCTAGTGCTGATTTAACTAACTTAAAAGAATTACTT +AGTCTGTACAAAAGTTTGAGATTTTCAGATTCTGTGGCTATAGAGAAGTATAATTCTTTGGTAGAATGGG +GAACATCTACTTACTGGAAAATAGGCGTACAAAAGGTAACTAATGTCGAGACGTCCATATCTGATTATTA +TGATGAGGTAAAAAATAAACCGTTCAATATTGATCCGGGGTATTATATTTTCTTACCAGTATACTTTGGA +AGCGTCTTTATTTATTCGAAGGGTAAAAATATGGTAGAACTTGGATCTGGAAACTCTTTTCAAATACCGG +ATGAGATTCGAAGTGCGTGTAACAAAGTATTAGATAGTGATAACGGAATAGACTTTCTGAGATTTGTTTT +GTTAAACAATAGATGGATAATGGAAGACGCTATATCAAAATACCAGTCTCCAGTTAATATATTTAAACTA +GCTAGTGAGTACGGATTAAACATACCCAACTATTTAGAAATTGAAATAGAGGAAGACACATTATTTGACG +ATGAGTTATACTCTATTATGGAACGCTCTTTCGATGATACATTTCCAAAAATATCTATATCGTATATTAA +GTTGGGAGAACTTAAACGGCAAGTTGTAGACTTTTTCAAATTCTCATTCATGTATATTGAGTCAATCAAG +GTAGATCGTATAGGAGATAATATTTTTATTCCTAGCGTTATAACAAAATCAGGAAAAAAGATATTAGTAA +AAGATGTAGACCATTTAATACGATCCAAGGTTAGAGAACATACATTTGTAAAAGTAAAAAAGAAAAACAC +ATTTTCCATTTTATACGACTATGATGGGAACGGAACAGAAACTAGAGGAGAAGTAATAAAACGAATTATA +GACACTATAGGACGAGACTATTATGTTAATGGAAAGTATTTCTCTAAGGTTGGTAGTGCAGGCTTAAAGC +AATTGACTAATAAATTAGATATTAACGAGTGCGCAACTGTCGATGAGTTAGTTGATGAGATTAATAAATC +CGGAACTGTAAAACGAAAAATAAAAAACCAATCAGTATTTGATTTAAGCAGAGAATGTTTGGGATATCCA +GAAGCGGATTTTATAACGTTAGTTAATAACATGCGGTTCAAAATAGAAAATTGTAAGGTCGTAAATTTCA +ATATTGAAAATACTAATTGTTTAAATAACCCGAGTATTGAAACTATATATGGAAACTTCAACCAGTTCGT +CTCAATCTTTAATACCGTTACCGATGTCAAAAAAAGATTATTCGAGTGAAATAATATGCGCCTTTGATAT +AGGTGCAAAAAATCCTGCCAGAACTGTTTTAGAAGTCAAGGATAACTCCGTTAGGGTATTGGATATATCA +AAATTAGACTGGAGTTCTGATTGGGAAAGGCGCATAGCTCAAGATTTGTCACAATATGAATACACTACAG +TTCTTCTAGAACGTCAGCCTAGAAGGTCACCGTACGTCAAATTTATCTATTTTATTAAAGGCTTTTTATA +TCATACATCTGCTGCCAAAGTTATTTGCGTCTCACCTGTCATGTCTGGTAATTCATATAGAGATCGAAAA +AAGAGATCTGTTGAAGCATTTCTTGATTGGATGGACACATTCGGATTGCGAGACTCCGTTCCGGATAGAC +GCAAATTAGACGATGTAGCGGATAGTTTCAATTTGGCTATGAGATACGTATTAGATAAATGGAATACTAA +TTATACACCTTATAATAGGTGTAAATATAGAAATTACATAAAAAAAATGTAATAACGTTAGTAACGCCAT +TATGGATAATCTATTTACCTTTCTACATGAAATAGAAGATAGATATGCCAGAACTATTTTTAACTTTCAT +CTAATAAGTTGCGATGAAATAGGAGATATATATGGTCTTATGAAAGAACGCATTTCCTCAGAGGATATGT +TTGACAATATAGTATATAATAAAGATATACATCCTGCCATTAAGAAACTAGTTTATTGCGACATCCAACT +TACTAAACATATTATTAATCAGAATACGTATCCGGTATTTAACGATTCTTCACAAGTGAAATGTTGTCAT +TATTTCGATATAAACTCAGATAATAGCAATATTAGCTCTCGTACAGTAGAGATATTTGAGAGTGAAAAGT +CATCTCTTGTATCATATATTAAAACTACCAATAAGAAGAGAAAGGTCAATTACGGCGAAATAAAGAAAAC +TGTACATGGAGGCACTAATGCAAATTACTTTTCCGGTAAAAAGTCTGATGAGTATCTGAGCACTACAGTC +AGGTCCAACATTAATCAACCTTGGATCAAAACCATTTCTAAGAGAATGAGAGTAGATATCATTAATCACT +CTATAGTAACGCGTGGAAAAAGCTCTATATTACAAACTATAGAAATTATTTTTACTAATAGAACATGTGT +GAAAATATTCAAGGATTCTACTATGCACATTATTCTATCCAAGGACAAGGATGAAAAGGGATGTATAAAC +ATGATTGATAAATTATTCTATGTATATTATAATTTATTTCTGTTGTTCGAGGATATCATCCAAAACGAGT +ACTTTAAAGAAGTAGCTAATGTTGTAAACCATGTACTCATGGCTACGGCATTAGATGAGAAATTATTCCT +AATTAAGAAAATGGCTGAACACGATGTTTATGGAGTTAGCAATTTCAAAATAGGGATGTTTAACCTGACA +TTTATTAAGTCGTTGGATCATACCGTTTTCCCCTCTCTGTTAGATGAGGATAGCAAAATAAAGTTTTTTA +AGGGGAAAAAGCTCAATATTGTAGCATTACGATCTCTGGAGGATTGTACAAATTACGTGACTAAATCCGA +GAATATGATAGAAATGATGAAGGAAAGATCGACTATTTTAAATAGCATAGATATAGAAACGGAATCGGTA +GATCGTCTAAAAGAATTGCTTCTAAAATGAAAAAAAACACTGTTTCAGAAATGGATCAACGACTCGGGTA +TAAGTTTTTGGTGCCTGATCCTAAAGCCGGAGTTTTTTATAGACCGTTACATTTCCAATATGTATCGTAT +TCTAATTTTATATTGCATCGATTGCATGAAATCTTGACCGTCAAGCGGCCACTCTTATCGTTTAAGAATA +ATACAGAACGAATTATGATAGAAATTAGCAATGTTAAAGTGACTCCTCCAGATTACTCACCTATAATTGC +GAGTATTAAAGGTAAGAGTTATGACGCATTAGCCACGTTCACTGTAAATATCTTTAAAGAGGTAATGACC +AAAGAGGGTATATCCATCACTAAAATAAGTAGTTATGAGGGAAAAGATTCTCATTTGATAAAAATTCCGC +TACTAATAGGATATGGGAATAAAAATCCACTTGATACAGCCAAGTATCTTGTTCCTAATGTCATAGGTGG +AGTCTTTATCAATAAACAATCTGTCGAAAAAGTAGGAATTAATCTAGTAGAAAAGATTACAACATGGCCA +AAATTTAGGGTTGTTAAGCCAAACTCATTCACTTTCTCGTTTTCCTCCGTATCCCCTCCTAATGTATTAC +CGACAAGATATCGCCATTACAAGATATCTCTGGATATATCACAATTGGAAGCGTCTAATATATCATCGAC +AAAGACATTTATAACGGTCAATATTGTTTTGCTGTCTCAATATTTATCTAGAGTGAGTCTAGAATTCATT +AGACGTAGTTTATCATACGATATGCCTCCAGAAGTTGTCTATCTAGTAAACGCGATAATAGATAGTGCTA +AACGACTTACCGAATCTATTACTGACTTTGATATTGATACATACATTAATGACCTGGTGGAAGCTGAACA +CATTAAACAAAAATCTCAGTTAACGATTAACGAGTTTAAATATGAAATGCTGCATAACTTTTTACCTCAT +ATGAACTATACACCCGATCAACTAAAGGGATTTTATATGATATCTTTACTAAGAAAGTTTCTCTACTGTA +TCTACCACACTTCTAGATATCCAGATAGAGATTCGATGGTTTGTCATCGCATCCTAACGTACGGCAAATA +TTTTGAGACGTTGGCACATGATGAATTAGAGAATTACATAGGTAACATCCGAAACGATATCATGAACAAT +CACAAGAACAGAGGCACTTACGCAGTAAACATTCATGTACTAACAACTCCTGGACTTAATCATGCATTTT +CTAGTCTATTGAGTGGAAAGTTCAAAAAGTCAGACGGTAGTTATCGAACACATCCTCACTATTCATGGAT +GCAGAATATTTCTATTCCTAGAAGTGTTGGATTTTATCCGGATCAAGTAAAGATTTCAAAGATGTTTTCT +GTCAGAAAATACCATCCAAGCCAATATCTTTACTTTTGTTCATCAGACGTTCCGGAAAGAGGTCCTCAGG +TAGGTTTAGTATCTCAATTGTCTGTCTTGAGTTCCATTACAAATATACTAACGTCTGAGTATTTGGATTT +GGAAAAGAAAATTTGTGAGTATATCAGATCATATTATAAAGATGATATAAGTTACTTTGAAACAGGATTT +CCAATCACTATAGAAAATGCTCTAGTCGCATCTCTTAATCCAAATATGATATGTGATTTTGTAACTGACT +TTAGACGTAGAAAACGGATGGGATTCTTCGGTAACTTGGAGGTAGGTATTACTTTAGTTAGGGATCACAT +GAATGAAATTCGCATTAATATTGGAGCAGGAAGATTAGTCAGACCATTCTTGGTTGTGGATAACGGAGAG +CTCATGACGGATGTGTGTCCGGAGTTAGAAAGCAGATTAGACGACATGACATTCTCTGACATTCAGAAAG +AGTTTCCACATGTCATCGAAATGGTAGATATAGACCAATTTACTTTTAGTAACGTATGTGAATCGGTTCA +AAAATTTAGAATGATGTCAAAGGATGAAAGAAAGCAATACGATTTATGTGACTTTCCTGCCGAATTTAGA +GATGGATATGTAGCATCTTCACTAGTGGGAATCAATCACAATTCTGGACCCAGAGCTATTCTTGGATGTG +CTCAAGCTAAACAAGCTATCTCTTGTCTGAGTTCGGATATACGAAATAAAATAGACAATGGAATTCATTT +GATGTATCCAGAGAGGCCAATTGTGATTAGTAAGGCTTTAGAAACTTCAAAGATTGCGGCTAATTGCTTC +GGACAACATGTTACTATAGCATTAATGTCGTACAAAGGTATCAATCAAGAGGATGGAATTATCATCAAAA +AACAATTTATTCAGAGAGGCGGTCTCGATATTGTTACAGCCAAGAAACATCAAGTAGAAATTCCATTGGA +AAACTTTAATAACAAAGAAAGAGATAGGTCTAACGCCTATTCGAAATTAGAAAGTAATGGATTAGTTAGA +CTGAATGCTTTCTTGGAATCCGGAGACGCTATGGCAAGAAATATCTCATCAAGAACTCTTGAAGATGATT +TTGCTAGAGATAATCAGATTAGCTTTGATGTTTCCGAGAAATATACAGATATGTACAAATCTCGCGTTGA +ACGAGTACAAGTAGAACTTACTGACAAAGTTAAGGTGCGAGTATTAACCATGAAAGAAAGAAGACCCATT +CTAGGAGACAAATTTACTACTAGAACGAGTCAAAAGGGAACAGTCGCGTATATCGCAGATGAAACGGAAC +TTCCGTACGACGAAAATGGTATCACACCAGATGTCATTATTAATTCTACATCCATCTTCTCTAGAAAAAC +TATATCTATGTTGATAGAAGTTATTTTAACAGCCGCATATTCTACTAAGCCGTACAACAATAAGGGAGAA +AACCGACCTGTCTGTTTTCCTAGTAGTAACGAAACATCCATTGATGCATATATGCAATTCGCTAAACAAT +GTTATGAGTATTCAAATCCGAAATTGTCCGAGGAAGAATTATCGGATAAAATCTTTTGTGAAAAGATTCT +CTATGATCCTGAAACGGATAAGCCTTATGAATCCAAAGTATTTTTTGGACCAATTTATTACTTGCGTCTG +AGACATTTAACTCAGGACAAGGCAACCGTTAGATGTAGAGGTAAAAAGACGAAGCTCATTAGACAAGCGA +ATGAGGGACGAAAACGTGGAGGAGGTATCAAGTTTGGAGAAATGGAGAGAGACTGTTTAATAGCACATGG +CGCAGCCAATACTATTACAGAAGTTTTAAAAGACTCAGAAGAGGATTATCAAGATGTGTATATTTGTGAA +AATTGTGGAGACATAGCAGCACAAATCAAAAGTATTAATACATGTCTTAGATGTTCAAAACTTAATCTCT +CTCCTCTCTTAACAAAAATTGATACCACACACGTATCTAAAGTATTTCTTACTCAAATGAACGCCAGAGG +CGTAAAAGTTAAATTAGATTTCGAACGAAGGCCTCCTTCGTTTTATAAACCATTAGATAAAGTTGATCTT +AAACCGTCTTTTCTGGTATAATATTGTTTAGTAGATACTCATCAAGATTATCAAGATAAGCTAATTCACT +AAACATATTATCGGATTCGGTATTGTTACTCGAGAATAGAGTTCGTTATGCTCCTGATATTCGGAAATCT +GTGGAGTTTCAGGTTTTGGTGGAAGTGTAACTGCTACTTGGTGGGATACTGAAGGATATTTCAGAGAGTT +GTGGATGTTCGGGTTCGACATCCACCGATGGTGTCACGCCACTAATCGGTTCGGTAACGTCTGTGGATGG +AGGTGCTACTTCTACAGAACCTGTAGCCTCAGTTGTCAACGGAGATACATCTTCAATGCGCGGAAATGTA +TAATTTGGTAATGGTTTCTCATGTGGATCTTAAGAAGAAGAGGTAAGATATCTACGAAAGATACCGATCA +CGTTCTAGTTCTCTTTTGTAGAACTTTAACTTTTTCTTTCTCAGCATCTAGTTGATATTCCGACCTCTTC +ACGTTTCACATGGGTTACCTCCGCAGTTTTTACAAGCGATTTCACGTTCCAGATCACGTTCAGCCTTCAT +ACGTCTCTCCCTCTCTCTATCGAGTTTATCAGAGCAGTCTTTCTGAAGGCGATCGAACTCCATAAATTTC +TCCAACGCTTTGATTGTTTCCATAGATTTCCGAAGTTTAGCTTCTAGGACGGCGATTCTTTTTTCTTTCG +AATTCACGGGGTACAACCGTTTCCATTACCACCATCTCTACGTTTCTTTTCTAGATCGGCAATCTTTCTC +AACATTTCATCCCCATGCCTTTTCATTCCTCGAGTCTATCGTCGTCGAAATATCGTTCCAGCTCCTTTTC +GACCTCAATAACTTTAGCACGTTGTCTCATCAAGCTCTCTCTTGTAGTACTATCATTTTTATCTGATTCC +CTGGCACGTTTAAGATCTTCATGTAATTGAGTCAGCTCTTGACACAATCTCTTAACTAACTTCCTCTCTT +GCTTCTTCGTCATAGTACTTACAATCACTATGGGATCCATTGTTACCACGTCTGTACTCGGCGAGCTCAC +GTTTAAGAGATTCAATTTCCAGTTTGTACATTGATTTCATTATTACGTCCGCAGTCGTTCAACTGTATTT +CAAGATCTGAGATTCTAGATTGTAATCTCTGTAGCATTTCCACGGCATTCACTCAGTTGTCTTTCAAGAT +CTGAGATTCTAGATTGGAGTCTGCTAATCTCTGTAAGATTTCCTCCTCCGCTCTCGATGCAGTCGGTCAA +CTTATTCTCTAGTTCTCTAATACGTGAACGCAGTGCATCAACTTCTTGTGTGTCTTCTTGATTGCGTGTG +CATTCATCGAGTCTAGATTCGAGATCTCTAACGTGTCGTCGTTCTTCCTCAAGTTCTCTGTGTACTACAG +AAAGCGTGTCCCTATCTTGTTGATATTTAGCAATTTCTGATTCTAGAGTACTGATTCTGCTCACGTATGT +ACTAATAGTTGTCTTATCCTTATCAAGATCCTCCTTGTATTTGTCACATTCCTTGATATCCATACGAAGT +CTGGACAGTTCCCATTCGACATTACGACGTTTATCGATTTCAGCTCGGAGATCGTCGTCGCGTTGTTTTA +GCCACATACGACTGAGTTCAAGTTCTCGTTGACAAGATCCATCTACTTTTCCATCCCTAATAGTATCCAG +TTCCTTTTCTAGTTCTGACCGCATTTCTCGTTCCATATCAAGAGATTCTCTCAATTCTCGTATAGTCTTC +TTATCAATTTCTGATGAATCTGAACCATCATCTGTCCCATTTTGTTGCATATCCCTGAGTTCTTTGATCT +CTGTTGTAAGTCTGTCGATTCTTTCGGTTTTATAAACAGAATCCCTTTCCAAAGTCCTAATCTTACTGAG +TTTATCACTAAGTTCTTCATTCAATTCAGTGAGTTTTCTCTTGGCTTCTTCCAAGTCTGTTTTAAACTCT +CCATCATTTCCGCATTCTTCCTCGCATTTATCTAACCATTCAATTAGTTTATTAATGACTAGTTGGTAAT +CAGCGATTCCTATAACCGTTCTTGTATTTGTGGGAACATAATTAGGATCTTCTAATGGATTGTATGGCTT +GATAGCATCATCTTTATCATTATTAGGTGGGGGATGGACAACCTTAATTGGTTGGTCCTCCTTATCTCCT +CCAGTAGCATGTGGTTCTTCAATACCAGTATTAGTAATAGGCTTAGACAAATGCTTGTCGTACGCGGGCA +CTTCCTCATCCATCAAGTATTTATAATCGGGTTCTGTTTCAGAATATTCTTTTCTAAGAGACGCGACTTC +AGGAGTTAGTAGAAGAACTCTGTTTCTGTATCTATCAACGCTGGAATCGATACTCAAGTTAAGGATAGCG +AATACCTCATCGTCATCATCCGTATCTTCTGAAACGCCATCATATGACATTTCATGAAGTCTAACGTATT +GATAAACAGAATCAGATTTAGTATTAAACAGATCCTTGACCTTTTTAGTAAATGCATATGTATATTTTAG +ATCTCCAGATTTCATAATATGATCGCATGCCTTAAATGTCAATGCTTCCATGATATAGTCTGGAACACTA +ATGGGTGACGAAAAAGATACAGCACCATATGCTACGTTGATAAATAGATCTGAACCACTAAGTAGATAAT +GATTAATGTTAAGGAAGAGGAAATATTCAGTATATAGATATGCCTTAGCATCATATCTTGTACTAAACAC +GCTAAACAGTTTATTGATGTGATCAATTTCCAACAGAACAATTAGAGCGGCAGGAATACCAACAAACATA +TTACCACATCCGTATTTTCTATGAATATCACATATCATGTTAAAAAATCTTGATAGAAGAGCGAATATCT +CGTCTGACTTAATGAGATGTAGTTCAGCAGCATAAGTCATAACTGTAAATAGAACATACTTTCCTGTAGT +GTTGATTCTAGACTCCACATCAACACCATTATTAAAAATAGTTTTATATACATCTTTAATCTGCTCTCCG +TTAATCGTCGAACGTTCTAGTATACGGAAACACTTTGATTTCTTATCTGTAGTTAATGACTTAGTGATAT +CACGAAGAATATTACGAATTACATTTCTTGTTTTTCTTGTGAGACCTGATTCAGAACTCAACTCATCATT +CCATAGTTTTTCTACCTCAGTGGCGAAATCTTTGGAGTGTTTGGTACATTTTTTAATAAGGTTCGTGACC +TCCATTTATTATAAAAAATTTTTATTCAAAACTTAACTACAATCGGGTAATTATAAGATCGTAGATCTCC +CATGTGGTGGAATACTACCATCTATCGCATGTGGATGGACAGTAGGTAATGGCCATGGGAACAGTAATGT +TTGCATATTTATCTTTCTTGCTAGTATTACTGTATATTGTCCCAATGTTTCAATGTGATGTTCTAACCTA +TCAACTGCCACTGTATCACAACAATAATGTCCGATGGAATTAAGATTATGATCCAATGTGTTTAATATAT +GATTATCAAGTCTTATACGATCAGCGTCTTTTTTGACAGGATCAGGCTCTTCTACAGGAAGAAGTTTCGG +CCTCTTATGATAGTCATGTCTGGGAAATGGTGGTCTAGGATGAGGATCCGGTATCGGAGTGGGTTTTGGA +TTATAATCATCATCATCATCATCATCATCATCATCATCATCATCATCATCATCATCATCATCATCATCAT +CATCTATGATATCATCATCATCATCTTCGATATTTATTTTGCTATCTTGATGATGTCCTGTATCAGTTGC +ATTTTCAGCACTCGACTGAATACTAGTACATTCATTGTCTATTATTAACGTATTTCTAAACCCAAAATGT +ATGTGTTGAACATCACTACTATAGTTGATGAGTCTTATAGCATGAATTCGCTTATCGTTATCGGGTTTAT +CTTCTGTCACCTTAACAATTCCTTTTTTATTAAACTCTGCATAATCATAACCATTTCTATTGTTTGTTCT +AATATAAACGAGTATAGCATCATTGCTAAATTTTTCAATCGTATCGAAAACAGAATATCCTAAACCATAT +AATATATATTCAGGAACACTCAAACTAAATGTCCAGGATTCTCCTAAATACGTAAACTTTAATAGTGCTA +AATCATTCAAAAATCTACCGCTTATAGATAGATAGTACATGAATGCGTATAGTAGTCTACCGATCTCTTT +ATTATGAAAACCGACATTACGATCATATATTTCGTGATATACATGTGACCCGTTTACGTTAAACCATAAA +TACATGGGTGATCCTATAAACATGAATTTATTTCTAATTCTCAGAGCCATAGTTAATTGACCGTGTAATA +TTTGTTTACATGCATACTTGATACGATCATTAATAAGATTTTTATCATTGCTCGTTATTTCAGAATCGTA +TATATAAGGAGTACCATCATGATTCTTACCAGATATTATACAAAATACTATATATAAAATATATTGACCC +ACGTTAGTAATCATGTAAATGTTTAATGTTTTAAATTTTGTATTTAATGATCCATCATCATACGCTAGCA +TGGTCTTGTGATATTCATTCTTTAAAATATAATATTGTGTTAGCCATTGCATTGGAGCTCCTAATGGAGA +TTTTCTATTCTCGTCCATTTTAGGATATGCTTTCATAAAGTCCCTAATAACTTCGTGAATAATGTTTCTA +TGTTTTCTACTGATGCATGTATTTGCTTCGATTTTTTTATCCCATGTTTCATCTATCATAGATTTAAACG +CAGTAATGCTCGCAACATTAACATCTTGAACCGTTGGTACAATTCCGTTCCATAAATTTATAATGTTCGC +CATTTATATAACTCATTTTTTGAATATACTTTTAATTGAACAAAAGAGTTAAGTTACTCATATGGACGCC +GTCCAGTCTGTACATCAATCTTTTTAGCCAGAGATATCATAGCCGCTCTTAGAGTTTCAGCGTGATTTTC +CAACCTAAATAGAACTTCATCGTTGTGTTTACAACACTTTTCTATTTGTTCAAACTTTGTTGTTATATTA +GTAATCTTTTTTTCCAAATTAGTTAGCCGTTGTTTGAGAGTTTCCTCATTGTCGTCTCCATAGGCTTTAA +CAATTGCTTCGCGTTTAGTCTCTGGATTTTTAGCAGCCTTTGTAGAGAAAAATTCAGTTGCTGGAATTGC +AAGATCGTCATCTCCGGGGAAAAGAGTTCCGTCCATTTAAAGTACAGATTTTAGAAACTGACACTCTGTG +TTATTTATATTTGGCGCAATACATGGATTATAAATATCGATGTTAATAACATCAGAAAATGTAAAGTCTA +TACATTGTCGCATCGTGTTAAATTTTCTAATGGATCTAGTATTATTGGGTCCAACTTCTGCCTGAAATCC +AAATATGGAAGCGGATACAAAACCGTTTCCTGGATAAACCACACATCTCCACTTTTGCTTTACATCAGAA +ATTGTGTCATTGACATCTTGAACTCTCCTATCTAATGCCGGTGTTCCACCTATAGATTTTGAATACTCGA +ATGCTGCATGAGTAGCATTGAATTCCTTAATATTGCCATAATTTTCATATATTGAGTAACTCTGGATAAA +AAGTAAACACACCGCAGCCGTCGCTACTACAATAAAAAAAATTGATAGAGAGTTCATTTATAATCTATTA +GAAGCTGACAAAATTTTTTTACACGCGTCAGACAATGCTTTAATAAATAGTTCAACATCTACTTTTGTCA +TATCGAACCGATGGTATGATTCTAACCTAGAATTACATCCGAAAAAGTTGACCATGTTCATAGTCATTAA +GTCATTAACAAACAACATTCCAGACTCTGGATTATAAGACGATACTGTTTCGTCACAATCACCCACCTTA +ATCATGTGATTATGAATATTGGCTATTAGAGCACCTTCTAAGAAATCTATAATATCTTTGAAACACGATT +TAAAATCAAACCACGAATATACTTCTACGAAGAAAGTTAGTTTACCCATAGGAGATATAACTATAAATGG +AGATCTAGATACAAAATCCGGATCTATGATAGTTTTAACATTATTATATTCTCTATTAAATACCTCCACA +TCTAAAAATGTTAATTTTGAAACCATGTCTTCGTTTATTACCGTACCTGAACTAAACGCTATAAGCTCTA +TTGTTTGAGAACTCTTTAAACGATATTCTTGAAATACATGTAACAAAGTTTCCTTTAACTCGGTCGGTTT +ATCTACCATAGTTACAGAATTTGTATCCTTATCTATAATATAATAATCAAAATCGTATAAAGTTATATAA +TTATCGTGTTCAGATTGTGATCTTTTCAAATAGACTAAAAACCCCATTTCTCTAGTAAGTATCTTATGTA +TATGTTTGTAAAATATCTTCATGGTGGGAATATGCTCTACAGCAGTTAGCCATTCCTCATTGACAGCTGT +AGATGTATTAGACAAAACTACTCCAATGTTTAACAAGGGCCATTTTACGAGATTATTAAATCCTTGTTTG +ATAAATGTAGCCAATGCGGGTTCGAGTTCAACGACGATTGAATTCTCTTCCCGTGGATGCTGCATGATGA +ACGACGGGATGTTGTTCTATTGATTTGGAATTCTTTTTCGACTTTTTGTTTATATTAAATATTTTAAAAT +TTATGGCTGATAGTAATTCATGTACTACGGATAATGTAGACGTGTATTGCACATCGATATCTTTATTATT +AGATAAATTTATCAATAAATGTGAGAAGTTTGCCTCGTTAAGGTCTTCCATTTAAATATTATATAAATAT +TTGTGTTTGTATTTTATTCGTCTTTTATGGGATAGTTTTTAACTAGTAAAGCTGTAATTACATACTTTGT +CCGTAAAACATAAATATAAATACCCGCTTTTATCAAACGTTCCAAAAAGTCGGCAGCCGACATTTTTAAC +ATGGCATCTATTTTAAATACACTTAGGTTTTTAGAAAAAACATCATTTTATAATTGTAACGATTCAATAA +CTAAAGAAAAGATTAAGATTAAACATAAGGGAATGTCATTTGTATTTTATAAGCCAAAGCATTCTACCGT +TGTTAAATACTTGTCTGGAGGAGGTATATATCATGATGATTTGGTTGTATTGGGGAAGGTAACAATTAAT +GATCTAAAGATGATGCTATTTTACATGGATTTATCATATCATGGAGTGACAAGTAGTGGAGCAATTTACA +AATTGGGATCGTCTATCGATAGACTTTCTCTAAATAGGACTATTGTTACAAAAGTTAATAACAATTATAA +CAATTATAACAATTATAATTGTTATAATAATTATAATTGTTATAATTATGATGATACATTTTTTGACGAT +GATGATTGATCACTATTACACAATTTTGTTTTTGTACTTTCTAATATAGTGTTTAGGTTCTTTTTCATAT +GAGAATATTGACTTACTAAAATATCTATGTTTAACTTTTGTTCTATAACGTCCTTATCGGCGGTATCGGT +ACATATACGTAATTCACCTTCACAAAATACGGAGTCTTCGATAATAATAGCCAATCGATTATTGGATCTA +GCTGTCTGTATCATATTCAACATGTTTAATATATCCTTTCGTTTCCCCTTTACAGGCATCGATCGTAGCA +TATTTTCCGCGTCTGAGATGGAAATGTTAAAACTGCAAAAATGCGTAATGTTAGCCCGTCCTAATATTGG +TACGTGTCTATAAGTTTGGCATAGTAGAATAATAGACGTGTTTAAATGCCTTCCAAAGTTTAAGAATTCT +ATTAGAGTATTACATTTTGATAGTTTATCACCTACATCATCAAAAATAAGTAAAAAGTGTGCTGATTTTT +TATGATTTTGTGCGACAGCAATACATTTTTCTATGTTACTTTTAGTTCGTATCAGATTATATTCTAGAGC +TTCCTGACTACTAACGAAATTAATATGATTTGGCCAAATGTATCCATCATAATCTGGGTTATAAACGGGT +GTAAACAAGAATATATGTTTATATTTTTTAACTAGTGTAGAAAACAGAGATAGTAAATAGATAGTTCTTC +CAGATCCAGATCCTCCTGTTAAAACCATTCTAAACGGCATTTTTAATAAATTTTCTCTTGAAAATTGTTT +TTCTTGAAAACAATTCATAATTATATTTACAGTTACTAAATTAATTTGATAATAAATCAAAATATGGAAA +ACTAAGGTCGTTAGTAGGGAGGAGAACAACGAAGACATATCGTGATATAAATAACATTTATTATCATGAT +GACACCAGAAAACGACGAAGAGCAGACATCTGTGTTCTCCGCTACTGTTTACGGAGACAAAATTCAGGGA +AAGAATAAACGCAAACGCGTGATTGGTCTATGTATTAGAATATCTATGGTTATTTCACTACTATCTATGA +TTACCATGTCCGCGTTTCTCATAGTGCGCCAAAATCAATGCATGTCTGCTAACGAGGCTGCTATTACTGA +CTCCGCTGTTGCCGTTGCTGCGGCATCATCTACTCATAGAAAGGTTGCGTCTAGCACTACACAATATGAT +CACAAAGAAAGCTGTAATGGTTTATATTACCAGGGTTCTTGTTATATATTACATTCAGACTATAAGTCAT +TCGAGGATGCTAAAGCAAACTGCGCTGCGGAATCATCAACGCTACCCAATAAATCCGATGTCTTGACTAC +CTGGCTCATTGATTATGTTGAGGATACATGGGGATCTGATGGTAATCCAATTACAAAAACTACATCCGAT +TATCAAGATTCTGATGTATCACAAGAAGTTAGAAAGTATTTTTGTACATAAATAAATGAAATCGCTTAAT +AGACAAACTGTAAGTAGGTTTAGGAAGTTGTCGGTGCCGGCCGCTATAATGATGTTACTCTCAACCATTA +TTAGCGGCATAGGAACATTTCTACATTACAGAGAAGAACTGATGCCTAGTGCTTGCGCCAATGGATGGAT +ACAATACGATAAACATTGTTATCTGGATACCAACATTAAAATGTCTACGGATAATGCAGTTTATCAGTGT +CGCAAATTACGAGCTAGATTGCCTGGACCTGATACTAGACATCTGAGAGTATTGTTTAGTATTTTTTATA +AAGATTATTGGGTAAGTTTAAAAAAGACCAATGATAAATGGTTAGATATTAATAATGATAAAGATATAGA +TATTAGTAAATTAACAAATTTTAAGCAACTAAACAGCACAACGGATTCTGAAGCGTGTTATATATACAAG +TCTGGAAAACTGGTTAAAACAGTATGTAAAAGTACTCAATCTGTACTATGCGTTAAAAGATTCTACAAGT +GATAACAAAAAATGAATTAATAGTAAGTCGTTAACGTACGCCGCCATGGACGCCGCGTTTGTTATTACTC +CAATGGGTGTGTTGACTATAACAGATACATTGTATGATGATCTCGATATCTCAATCATGGACTTTATAGG +ACCATACATTATAGGTAACATAAAAATTGTCCAAATAGATGCACGGGATATAAAATATTCCGACATGCAA +AAATGCTACTTTAGCTATAAGGGTAAAATAGTTCCTCAGGATTCTAATGATTTGGCTAGATTCAACATTT +ATAGTATTTGTACCGCATACAGATCAAAAAATACCATCATCATAGCATGCGACTATGATATCATGTTAGA +TATAGAAGGTAAACATCAACCATTTTATCTATTCCCATCTATTGATGTTTTTAACGCTACAATCATAGAA +GCGTATAATCTGTATACAGCTGGAGATTATCATCTGATCATCAATCCTTCAGATAATCTGAAAATGAAAT +TGTCGTTTAATTCTTCATTTTGTATATCAGACGGCAATGGATGGATTATAATTGATGGGAAATGTAATAG +TAATTTTTTATCATAAAAGTTGTAAAGTAAATAATAAACAATAAATATTGAACTAGTAGTATGTTGTATA +TTGAGCAATCAGAGATGATGCTGGTACCTCTTATCACGGTGACCGTAGTTGCGGGAACAATATTAGTATG +TTATATATTATATATTTGTAGGAAAAAGATACGTACTGTCTATAATGACAATAAAATTATCATGACAAAA +TTAAAAAAGATAAAGAGTCCTAATTCCAGCAAATCTAGTAAATCAACTGATAGCGAATCAGACTGGGAGG +ATCACTGTAGTGCTATGGAACAAAACTATGACGTAGATAATATTTCTAGAAATGAGATATTGAACGATGA +TAGCTTCGCTGGTAGTTTAATATGGGATAACGAATCCAATGTCATGGCGCCTAGCACAAAACACATTTAC +GATAGTGTTGCTGGAAGCACGCTGCTAATAAATAATGATCGTAATGAACTGACTATTTATCAGAATACTA +CAGTAGTAATTAATGATACAGAGACTGTTGAAATACTTAATGAAGATACCAAACAGATTCCTAGCTATTC +TTCCAATCCTTTCGTAAATTATAATAAAACCAGTATTTGTAGCAAGTCAAATCCGTTCATTGCAGAACTC +AACAATAAATTTAGTGATAATAATCCGTTTAGGAGAGCACATAGCGACGATTATCTTAATAAGCAATAAC +AATAACAATAACAAGATCATGAACACGATGATATAGAATCATCGGTTGTATCATTGTCTGATTAGTTTCC +TTTTTATAAAATTGAAGTAATATTTAGTATTAATTACCGCCGATGCATTATACAAATATGGAGATATTCC +CTGTATTCGGCATTTCTAAAATTAGCAATTTTATTGCTAATAATGACTGTAGATATTATATAGATGTAGA +GCATCAAAAAATTATATCTGATGAGATCAATAGACAGATGGATGAAACGGTACTTCTTACCAACATCTTA +AGCGTAGAAGTTGTAAATGGCAATGAGATGTACCATCTTATTCCCCATAGACTATCGACGATTATACTCT +GTATTAGTTCTGTTGGAGGATGTGTTATCTCTATAGATAATGACGTCAATGATAAAAATATTCTAACATT +TCCCATTAATCATGCTGTAATCATATCCCCACTGAGTAAATGTGTCGTAGTTAGCAAGGGCCCTACAACC +ACACTGGTTGTTAAAGCGGATATACCCAGCAAACGATTGGTAACATCGTTTACAAACGACATACTGTATG +TAAACAATCTATCACTGATTAATTATTTACCGTTGTCTGTATTCATTATTAGACGAGTCACTGACTATTT +GGATAGACACATATGCGATCAGATATTTGCTAATAATAAGTGGTATTCCATTATAACTATCGACGATAAG +CAATATCCTATTCCATCAAATTGTATAGGTATGTCTTCTGCCAAGTACATAAATTCGAGCATCGAGCAAG +ATATTTTGATCCATGTTTGTAACCTCGAGCATCCATTCGACTCAGTCTACAAAAAAATGCAGTCGTACAA +TTCTCTACCTATCAAGGAACAAATATTGTATGGTAGAATTGATAATATAAATATGAGCATTAGTATTTCG +GTGGATTAATAGATTTCTCTAGTATGGGATCATTAATCATCTCTAAATACATCATAAAAAAGCTATTATC +AAATACTGTACTGAATGGATTCATTCTTTTCTCTTTTTATGAAACTCTGTTGTATATCTACGGATAAAAC +TAGAAGCAAAAAATCTGATAGGAAGAATAATGATTATATGGAGGAACACGATTATTATAAAATAACAATA +GTTCCTGGTTCCTCTTCCACGTCTACTAGCTCGTGGTATTATACACATGCCTAGTAATAGTCTCTTTGCG +TTGACGGAAAGCAGACTAGAAATAACAGGCCAAAATGTTCAGACACCATAATAGTTCCCAACCCAGATAA +TAACAGAGTTCCATCAACACATTCCTTTAAACTCAATCCCAAACCCAAAACCGTTAAAATGTATCCAGCC +AATTGATAATAGATAATGAGGTGTACAGCACATGATAATTTACACAGTAACCAAAATGAAAACACTTTAG +TAATTATAAGAAATATAGACGGTAATGTCATCATCAACAATCCAATAATATGCCTGAGAGTAAACATTGA +CGGATAAAACAAAAATGCCCCGCATAACTCTATCATGGCAATAACGCAACCAAACACTTGTAAAATTCCT +AAATTAGTAGAAAATACAACTGATATCGATGTATAAGCGATTTCGAGGAATAATAAGAACAAAGTAATTC +CCGTAAAGATAAACATCAACATTGTTTGGTAATCATTAAACCAATTAGTATGACGTTGAACTAATTTCAC +AGTAGATTTTATTCCAGTATTATCCCCGCATGTATACGTACCTGGTAAGATATCTTTATATTCCATAATC +AATGAGACATCACTATCCGATAACGAATGAAGTCTAGCACTAGTATGCCATTTACTTAATATGGTCGTCT +TGGAAGTTTTATTATAAGTTAAAATATCATGATTGTCCAATTTCCATCTAATATACTTTGTCGGATTATC +TATAATACATGGAATAATGATGGTATCATTACATGCTGTATACTCTATAGTCTTTGTAGATGTTATAACC +ACAAAAGTACAGAGGTATATCAACAATATTCTAACTCTTAACATTTTTATTTATTTAAAATGATACCTTT +GTTATTTATTTTATTCTTATTTTGCTAACGGTATCGAATGGCATAAGTTTGAAACGAGTGAAGAAATAAT +TTCTACTTACTTAATAGATGATGTGGTAACGGGTGTTATTAATGGGGCTGTATATACATTTTCAAATAAT +GAACTAAACAAAACTGGGTTAACTAATAACAATAATTATATCACAACATCTATAAAAGTAGAGGATAATG +ATACATTAGTAGTATGCGGAACCAATAACGGAAATCCCAAATGTTGGAAAATAGACGGTTCATACTACCC +AAAACATATAGGTAGAGGATACGATCATCAAAATAGCAAAGTAACGATAATCAGTCACAATGAATGTGTA +CTATCCGACATAAACATATCAAAAGAAGGAATTAAACGATGGAGAAGATTTGACGGACCATGTGGTTATG +ATTAAACGAGTTAAGTTTTTTAAGAAGCCTTAGAAGAGGGCTATTGGGTATGAAAATCCGAAATATTAAA +CCAGACAACCCCATATAATTTTATAGCTAAGAATACCGCGAAGAATGGAACTAAAAACGGAAATATTTGT +AGCACAACGAATAACTCCCAAACTGCATTCATGTTACACTATATAACAATTACAATACATTTTTATCATA +ACACTACTTCGGTTAGATGTTTTAGAAAAAAATAAATATCACTACCGTTCTTGTTTTATAAAAATAACAA +TTAACAATTATCAATTTTTTTCTTTAATATTTTACGTGGTTGACCATTCTTGGTGGTAAAATAATCTCTT +AGTGTTGGAATGGAATGCTGTTTAATGTTTCCGCACTCATCGTATATTTTGACGTATGCAGTCACATCGT +TTACGCAATAGTCAGACTGTAGTTCTATCATGCTTCCTACGTTAGAAGGAGGAACAGTTTTAAAGTCTCT +TGGTTTTAATCTATTGTCATTAGTTTTCATGAAATCCTTTGTTTTATCCACTTCACATTTTAAATAAATG +TCAACTATACATTCTTCTGTTAATTTTACTAGATCATCATAGGTCATAGAATTTATAGGTTCCGTAGTCC +ATGGATCCAAACTAGCAAACTTCGCGTATACAGTATCGCGATTAGTGTATACACCAACTGTATGAAAATT +AAGAAAACAGTTTAATAAATCTACAGAAATATTTAATCCTCCGTTTGATACAGATGCGCCATATTTATGG +ATTTCGGATTCACACGTTGTTTGTCTAAGTGGTTCGTCTAGTGTTGCTTCTACATAGACTTCGATTCCCA +TATATTCTTTATTGTCAGAATCACATACCGATTTATCATACGCTGGTTCACTTGTTTGAAAACTAAATGG +TAGTAGATACATCAAAATAATAAATAATAAGTACATTCTGCAATATTGTTATCGTAATTGGAAAATTGGT +ATTCAAGTGAGCTGGATTATGTGAGTATTGGATTGTATATTTTATTTTATTTTATATTTTATATTTTATA +TTTTATTTTATATTTTGTAGTAAGAATAGAATGCTAAATGTCAAGTTTATTCGAATAGATGTCTTATTAA +AAACATATATAATAAATAACAATGGCTGAATGGCATAAAATTATCGAGGATATCTCAAAAAATAATAAGT +TCGAGGATGCCGCCATCGTTGATTACAAGACTACAAAGAATGTTCTAGCGGCTATTCCTAACAGAACATT +TGCAAAGATTAATCCGGGTGAAGTTATTCCCCTCATCACTAATCATAATATTCTAAAACCTCTTATTGGT +CAGAAATTTTGTATTGTATATACTAACTCTCTAATGGATGAGAACACGTATGCTATGGAGTTGCTTACTG +GGTACGCCCCTGTATCTCCGATCGTTATAGCGAGAACTCATACCGCACTTATATTTTTGATGGGTAAGCC +AACAACATCCAGACGTGATGTGTATAGAACATGTAGAGATCACGCTACCCGTGTACGTGCAACTGGTAAT +TAAAATAAAAAGTAATATTCATATGTAGTGTCAATTTTAAATGATGATGATGAAATGGATAATATCCATA +TTGACGATGTCAATAATGCCGGTATTGACATACAGTTCATCGATTTTTAGATTTCATTCAGAGGATATTG +AATTATGTTATGGGAATTTGTATTTTGATAGGATCTATAATAATGTAGTAAATATAAAATATATTCCTGA +GCATATTCCATATAGATATAATTTTATTAATCGTACGTTCTCCGTAGATGAACTAGATGATAATGTCTTT +TTTACACATGGTTATTTTTTAAAACACAAATATGGTTGTTCACTTAATCCTAGTTTGATTGTCTCATTAT +CAGGAAACTTAAAATATAATGATATACAATGCTCAGTAAATGTATCATGTCTCATTAAAAATTTGGTAAC +GAGTACATCTACTATATTAACATCTAAACATAAGACTTATTCTCTATATCGGTCCACGTGTATTGCTATA +ATAGGATACGATTCTATTATATGGTATAAAGATATAAATGACAGGTATAATGACATCTATGATTTTACTG +CAATATGTATGCTAATAGCGTCTACATTGATAGTGATCATATACGTGTTTAAAAAAATAAAAATGAACTC +TTAATTATGTTATACTATTAGAAATGGATAAAATCAAAATTACGATTGATTCAAAAATTGGTAATGTTGT +TACCATATCGTATAACTTGGAAAAGATAACTATTGATGTCACACCAAAAAAGAAAAAAGAAAAGGATGTA +TTATTAGCGCAATCAGTTGCTGTCGAAGAGGCAAAAGATGTCAAGGTGGAAGAAAAAAATATTATCGATA +TTGAAGATGACGATGATATGGATATAGAAAACACGTAATACGATCTATAAAAATAAGGTATTAAATACTT +TTTATTTACGGTACTCTTGTAGTGGTGATACCACTAATCGATTTTTTTTTAAAAAAAATACTTATTCTGA +TTCTTCTAGCCATTTCCGTGTTCGTTCGAATGCCACATCGACGTCAAAGATAGGGGAGTAGTTGAAATCT +AGTTCTGCATTGTTGGTACGCACCTCAAATGTAGTGTTGGATATCTTCAACGTATAGTTGTTGAGTATTG +ATGGTTTTCTAAATAGAATTCTCTTCATATCATTCTTGCACGCGTACATTTTTAGCATCCATCTTGGAAT +CCTAGATCCTTGTTCTATTCCCAATGGTTTCATCAATAGAAGATTAAACATATCGTAAGAACACGATGGA +GAGTAATCGTAGCAAAAGTAAGCATTTCCTTTAATCGCAGATCCCGGATACTGGATATATTTTGCAGCCA +ACACGTGCATCCATGCAACATTTCCTACATATACCCGGCTATGCACAGCGTCATCATCGACTGTACGATA +CATAATGTTACCGTGTTGCTTACATTGCTCGTAAAAGACTTTCGTCAATTTGTCTCCTTCTCCGTAAATT +CCAGTGGGTCTTAGGCAACAAGTATACAATTTTGCGCCATTCATGATTACGGAATTATTGGCTTTCATAA +CCAGTTGCTCGGCCATACGTTTACTTTTTGCGTATACATGTCCTGGTGATATATCATAAAGGGTATGCTC +ATGACCGATGAATGGATTACCGTGTTTATTTGGTCCTATTGCTTCCATGCTACTAGTATAGATCAAATAC +TTGATTCCTAGGTCCACACAAGCTGCCAATATAGTCTGTGTTCCATAATAGTTTACTTTCATGATTTCAT +TATCAGTGTATTTTCCAAATACATCCACTAGAGCAGCCGTATGAATAATCAGATTTACCCCATCTAGCGC +TTCTCTCACCTTATCAAAGTCGTTTATATCACATTGTATATAGTTTATAACCTTAACTTTCGAGGTTATT +GGTTGTGGATCTTCTACAATATCTATGACTCTTATTTCTTGAACATCATCTGCGCTAATTAAAAGTTTTA +CTATATACCTGCCTAGAAATCCGGCACCGCCAGTAACCGCGTACACGGCCATTGCTGCCACTCATAATAT +CAGACTACTTATTCTATTTTACTAAATAATGGCTGTTTGTATAATAGACCACGATAATATCAGAGGAGTT +ATTTACGTTGAACAAGTCCATGGAAAAGATAAAGTTTTAGGATCAGTTATTGGATTAAAATCCGGAACGT +ATAGTTTGATAATTCATCGTTACGGAGATATTAGTCGAGGATGTGATTCCATAGGCAGTCCAGAAATATT +TATCGGTAACATCTTTGTAAACAGATATGGTGTAGCATATGTTTATTTAGATACAGATGTAAATATATCT +ACAATTATTGGAAAGGCGTTATCTATTTCAAAAAATGATCAGAGATTAGCGTGTGGAGTTATTGGTATTT +CTTACATAAATGAAAAGATAATACATTTTCTTACAATTAACGAGAATGGCGTTTGATATATCAGTTAATG +CGTCTAAAACAATAAATGCATTAGTTTACTTTTCTACTCAGCAAAATAAATTAGTCATACGTAATGAAGT +TAATGATATACACTACACTGTCGAATTTGATAGGGACAAAGTAGTTGATACGTTTATTTCATATAATAGA +CATAATGACTCCATAGAGATAAGAGGGGTGCTTCCAGAGGAAACTAATATTGGTCGCGTGGTTAATACGC +CGGTTAGTATGACTTACTTGTATAATAAGTATAGTTTTAAACCGATTTTAGCAGAATATATAAGACACAG +AAATACTATATCCGGCAATATTTATTCGGCATTGATGACACTGGATGATTTGGTTATTAAACAGTATGGA +GACATTGATCTATTATTTAATGAGAAACTTAAAGTAGACTCCGATTCGGGACTATTTGACTTTGTCAACT +TTGTAAAGGATATGATATGTTGTGATTCTAGAATAGTAGTAGCTCTATCTAGTCTAGTATCTAAACATTG +GGAATTGACAAATAAAAAGTATAGGTGTATGGCATTAGCCGAACATATAGCTGATAGTATTCCAATATCT +GAGCTATCTAGACTACGATACAATCTATGTAAGTATCTACGCGGACACACCGATAGCATAGAGGATGAAT +TTGATCATTTTGAAGACGATGATTCGTCTACATGTTCTGCCGTAACCGACAGGGAAACGGATGTATAATT +TTTTTATAGTGTGATGGATATGATGGATATGATATATGATGGATATTATGATGGATATGATGGATATTAT +GATGGATATGATGGATATGATGGATATGATGGATATGATAAATATGATAAAAATATAATTGTTGTATATG +ATGGATATGATGGATATGATGGATATGATGGATATGATGGATATGATGGATATGATAAATATGATAAAAA +TATAATTGTTGTATCCATTCCCATTCAAATCACCTTATATGATTCTGTAACACAATGAAGGAGTCTCATA +GATATATAGAGGTCAGATACTGGTTTGATAAACTTTTTATTCCACATGAGTATGTTTGACTTATGGTTAG +ACACGCATACTTTAACAAATCACTGAAAATTGGAGTTAGGTATTCCTCTCAGAATCAGTTGCCGTTCTGG +AACATTAAATGTATTTTTTATGATATACTCCAACGCATTTATGTGGGTATACAACAAGTCATTAATAATG +AGTATTTCCAAGAGTTTTAGCTGTCTAGTATTTAACAAGAGAAGAGATTTCATCAGACTGTTTATGAACT +CGAATACCGCCTCATTGTCGCTTATATTGATGACATCGAATTCCCAATATCATCTCATCAGTGATGAGTA +GCTCAATCTTGTTATCGGGATCCAATTTCTAAAGATGTCATTAAACCCTCGATCGTGAATGGATTTATCA +TCATCGTTTTTATGTTGGACATGAGCTTAGTCCGTTTGTCCACATCTATATACGATGATTTCTGAATTAT +TTCATATATCTCTCGTTAACTCCAGGAACTTGTCAGGGATCTAACTTTAATATGTTCTCGTCTAAGAGAT +GAAAATCTTTGGATGGTGGCATGTGACTTTTCTCTAAAGGATGATGTTGCCCGATCCTCTCTTAAATGAA +TCCATCTTATCCTTGGACAAGATGGACAGTCTATTTTCCTTAGATGGTTTAATATTTTTTACCCATGATC +TATAAAGGTAGACAGACCTAATCGTCTCGGATGACCATATATTATTTTCAGTTTTATTATACGCATAAAT +TGTAAAAAATATGTTAGGTTTACGAAAATGTCTCGTGGGGCATTAATCGTTTTTGAAGGATTGGACAAAT +CTGGAAAAACAACACAATGTATGAACATCATGGAATCTATACCGGCAAACACGATAAAATATCTTAACTT +TCCTCAGCGATCCACAGTCACTGGAAAGATGATAGATGACTATCTAACTCGTAAAAAAACCTATAATGAT +CATATAGTTAATCTATTATTTTGTGCAAATAGATGGGAGTTTGCATCTTTTATACAAGAACAACTAGAAC +AGGGAATTACTTTAATAGTTGACAGATACGCGTTCTCTGGAGTAGCGTATGCCACCGCTAAAGGCGCGTC +AATGACTCTCAGTAAGAGTTATGAATCTGGATTGCCTAAACCCGACTTAGTTATATTCTTGGAATCTGGT +AGCAAAGAAATTAATAGAAACGTCGGCGAGGAAATTTATGAAGATGTTGAATTCCAACAAAAGGTATTAC +AAGAATATAAAAAAATGATTGAAGAAGGAGATATTCATTGGCAAATTATTTCTTCTGAATTCGAGGAAGA +TGTAAAGAAGGAGTTGATTAAGAATATAGTTATAGAGGCTATACACACGGTTACTGGACCAGTGGGGCAA +CTGTGGATGTAATAAAATGAAATTACATTTTTATAAATAGATGTTAGTACAGTGTTATAAATGGATGAAG +CATATTACTCTGGCAACTTGGAATCAGTACTCGGGGATACGTGTCCGATATGCATACCGAACTCGCATCA +ATATCTCAATTAGTTGCCAAGATAGAAACTATAGATAATGATTATTAAACAAGGACATTGTAAATTTTAT +CATATGTAGATCAAACTTGGATAATCCATTTATCTCTTTCCTAGATACTGCATATACTATCATAGATCAA +GAGATCTATCAGAACGAGTTGATTAATTCATTAGACGATAATGAAATTATCGATTGTATAGTTAACAAGT +TTATGAGCTTTTATAAGGATAACCTAGAAAATATGGTAGATGCTATCATTACTCTAAAATATTATAATTA +ATAATCCAGATTTTAAAACTACGTATGTGGAAGTACTCGGTTCCAGAATAGCTGATATAGATATTAAACA +AGTGATACGTAAGAATATAATACAATTGTCTAATGATCCGCGAACGATATTTGTGAAAATATTAAAAAAA +AATACTTTTTTTATTAAATGACGTCTCTTCGCGAATTTAGAAAATTATGCTGTGATATATATCACGCATC +AGGATATAAAGAAAAATCTAAATTAATTAGAGACTTTATAACAGATAGAGATGATACCGATACATATTTG +ATCATTAAGCTATTGCTTCCCGGATTAGACGATAGAATGTATAACATGAACGATAAACAAATTATAAAAT +TATATAGTATAATATTTAAACAATCTCAGGAAGATATGCTACAAGATTTAGGATACGGATATATAGGAGA +CACTATTAGGACATTCTTCAAAGAGAACACGGAAATCCGTCCACGAGATAAAAGCATTTTAACTTTAGAA +GAAGTGGATAGTTTTTTAACTACGTTATCATCAGTAACTAAAGAATCACATCAAATAAAATTATTGACTG +ATATAGCATCTGTTTGTACATGTAATGATTTAAAATGTGTAGTCATGCTTATTGATAAAGATCTAAAAAT +TAAAGCGGGTCCTCGGTACGTGCTTAACGCTATTAGTCCTCATGCCTATGATGTTTTTAGAAAATCTAAT +AACTTGAAAGAGATAATAGAAAATGCAGCTAAACAAAATCTAGACTCTATATCTATTTCTGTTATGACTC +CAATTAATCCCATGTTAGCGGAATCATGTGATTCTGTCAATAAGGCGTTTAAAAAATTTCCATCAGGAAT +GTTTGCGGAAGTCAAATACGATGGTGAAAGAGTACAAGTTCATAAAAAAAATAACGAGTTTGCATTCTTT +AGTAGAAACATGAAACCAGTACTCTCTCATAAAGTGGATTATCTCAAAGAATACATACCGAAAGCATTTA +AAAAAGCTACGTCTATCGTATTGGATTCTGAAATTGTTCTTGTAGACGAACATAATGTACCGCTACCGTT +TGGAAGTTTAGGTATACACAAAAAGAAAGAATATAAAAACTCTAACATGTGTTTGTTCGTGTTTGACTGT +TTATACTTTGATGGATTCGATATGACAGACATTCCATTGTATGAACGAAGATCTTTTCTCAAAGATGTTA +TGGTCGAAATACCCAATAGAATAGTATTCTCAGAGTTGACGAATATTAGTAACGAGTCTCAGTTAACTGA +TGTATTAGATGATGCACTAACGAGAAAATTAGAAGGATTGGTCTTAAAAGATATTAATGGCGTATACGAA +CCGGGAAAGAGAAGATGGTTAAAAATAAAGCGAGACTATTTGAACGAGGGTTCCATGGCAGATTCTGCCG +ATTTAGTAGTACTAGGTGCCTACTATGGTAAAGGAGGAAAGGGTGGTATCATGGCAGTCTTTCTAATGGG +TTGTTACGACGATGAATCCGGTAAATGGAAGACGGTAACTAAATGTTCCGGTCACGATGATAATACGTTA +AGGGTTTTGCAAGACCAATTAACGATGGTTAAAATTAACAAGGATCCCAAAAAAATTCCAGAGTGGTTGG +TAGTTAATAAAATCTATATTCCCGATTTTGTAGTAGATGATCCGAAACAATCTCAGATATGGGAAATTTC +AGGAGCAGAGTTTACATCTTCCAAGTCACATACAGCGAATGGAATATCAATTAGATTTCCTAGATTTACT +AGGATTAGAGAAGATAAAACGTGGAAAGAATCTACTCATCTAAACGATTTAGTAAACTTGACTAAATCTT +AATAGTTACATATAAACTGAAAAATAAAATAATACTATTTTAGTTGGTGGTCGCCATGGATGGTGTTATC +GTATACTGTCTAAATGCGTTAGTAAAACATGGCGAGGAAATAAATCATATAAAAAATGATTTCATGATTA +AACCATGTTGTGAAAGAGTTTGTGAAAAAGTCAAGAACGTTCACATCGGCGGACAATCTAAAAACAATAC +AGTGATTGCAGATTTGCCATATCTGGATAATGCTGTATCAGATGTATGCAAATCAATATATAAAAAGAAT +GTATCAAGAATATCCAGATTTGCTAATATGATAAAAATAGATGACGATGACAAGACTCCTACCGGTGTAT +ATAATTATTTTAAACCTAAAGATACTATTCCTGTTATTATATCCATAGGAAAGGATAAAGATGTCTGTGA +ACTATTAATCTCATATGATAAAGCGTGTGCGTGTATAAAGTTAAATTTATATAAAGTAGCCATTCTTCCC +ATGGATGTTTCCTTTTTTACCAAAGGAAATGCATCATTGATTATTCTCCTGTTTGATTTCTCTATCGATG +CGGCACCTCTCTTAAGAAGTGTAACCGATAATAATGTTATTATATCTAGACACCAGCGTCTACATGACGA +GCTTCCGAGTTCCAATTGGTTCAAGTTTTACATAAGTATAAAGTCCGACTATTGTTCTATATTATATATG +GTTGTTGATGGATCTATGATGTATGCGATAGCTGATAATAGAACTCACGCAATTATTAGCAAAAATATAT +TAGACAATACTACGATTAACGATGAGTGTAGATGCTGTTATTCTGAACCACAGATTAGGATTCTTGATAG +AGATGAGATGCTCAATGGATCATCGTGTTATATGAACAGACATTGTATTATGATGAATTTACCTGATGTA +GGCGAATTTGGATCTAGTATGTTGGGGAAATATGAACCTGACATGATTAAGATTGCTCTTTCGGTGGCTG +GTAATTTAATAAGAAATCGAGACTACATTCCCGGGAGACGAGGCTATAGCTACTACGTTTACGGTATAGC +CTCTAGATAATTTTTTTAAGCACGAAATAAAAACATAATTTTAAACAATCTATTTCATACTATTTTGTGT +GATCAACATGAACATAAAGATAGATGATATGATATATTAGTATTTCTGGTGATAAATTTACGGCGACTGC +TAGGAGGGAAAATGAAGAAAGAAAAAATATCTACCTCTCCAAAAAGAAAAACTACTGATGTTATCAAACC +TGATTATCTTGAGTACAATGACTTGTTAGATAGAGATGAGATGTCTACTATTCTAGAGGAATATTAGGCC +TTAGAATAAAATATGGACGACTCTTAACGAAATTAGAAAATTCGATAATGATGTTGAAGAACAATTCGGT +ACTATAGAAGAACTCAAGCAGAAGCTTAGATTAAATTCTGAAGAGGGAGCAGATAATTTTTATAGATTAT +ATAAAGGTACAAAAACAGGATATCGTCAAACTTACTGTATACGATTGCATATATCTATGATAGGATTGTA +TGCGTGCGTGGTAGATGTTTGGAGAAATGAGAAACTGTTTTCTAGATGGAAATATTGGTTACAAGCGATT +AAACTGTTTATTGATGATCACATGCTTGATAAGATAAAATCTATACTGTAGAATAGACTAGTGTATGTGG +AAATGTCATAGAAAGTTAAAAGTTAATGAGAGCAAAAATATATAAGGTTGTATTCCATATTTGTTATTTT +TTTCTGTAATAGTTAGAAAATACATTCGATGGTCTATCTACCAGATTATTATGTGTTATAAGGTACTTTT +CTCATAATAAACTAGAGTATGAGTAAGATAGTGTTTTTCAAAACATATAAATCTAAAATTGATGGATGAG +ATATACAGCTATTAATTTCGAAAATATATTTTAATCTGATAACTTTAAACATGGATTTTTGATGGTGGTT +TAAGTTTAAAAAAGATTTTGTTATTGTAGTATGATAATATCAAAAAGATGGATATAAAGAATTGGTCAGT +GTATAATAAATTATATGTAGGAGGAGGAATATCTGATGATGTTCAAACTAATACATCTGAAACATACGAT +AAAGAAAAAGATTGTTGGACATTGGATAATGGTCACTTGGTACCACATAATTATATAATGTATAAATGCG +AACCGGTTAAACATAGATATCCATTGGAAAAAAACACAGTACACGAATGATTTTCTAAAGTATTTGGAAA +GTTTTATAGGTAGTTGATAGAACAAAATACATAATTTTGTAAAAATAAATCACTTTTTATACTAATATGA +CACAATTACCAATACTTTTGTTACTAATATCATTAGTATACGTTACACCTTCTCCTCAGACATCTAAAAA +AATAGGTGATGATGCAACTATATCATGTAGTCGAAATAATACAAATTACTACGTTGTTATGAGTGCTTGG +TATAAGGAGCCCAATTCCATTATTCTCTTAGCTGCCAAAAGCGACGTCTTGTATTTTGATAATTATACCA +AGGATAAAATATCTTACGACTCTCCATACGATGATCTAGTTACAACTATCACAATTAAATCATTGACTGC +TGGAGATGCCGGTACTTATATATGTGCATTCTTTATGACATCGACTACAAATGATACTGATAAAGTAGAT +TATGAAGAATACTCCATAGAGTTGATTGTAAATACAGATAGTGAATCGACTATAGACATAATACTATCTG +GATCTACACCGGAAACTATTTCTGAGAAACCAGAGGATATAGATAATTCTAATTGCTCGTCTGTATTCGA +AATCGCGACTCCGGAACCAATTACTGATAATGTAGAAGACCATACAGACACCGTCACATACACTAGTGAT +AGCATTAATACAGTAAATGCATCATCTGGAGAATCCACAACAGACGAGACTCCGGAACCAATTACTGATA +AAGAAGAAGATCATACAGTAACAGACACTGTCTCATACACTACAGTAAGTACATCATCTGGAATTGTCAC +TACTAAATCAACCACCGATGATGCGGATCTTTATGATACATACAATGATAATGATACAGTACCGCCAACT +ACTGTAGGTGGTAGTACAACCTCTATTAGCAATTATAAAACCAAGGACTTTGTAGAAATATTTGGTATTA +CCACATTAATTATATTGTCGGCAGTGGCGATTTTCTGTATTACGTATTATATATGTAATAAACACCCACG +TAAATACAAAACAGAGAACAAAGTCTAGATTTTTGACTTACATAAATATCTGGGATAATAAAATCTATCA +TATTGAGAGGACCATCTGGTTCAGGAAAGACAGCCATAACCAAAAGACTGTTAAAAGACTATGGGAATAT +ATTTGGATTTGTGGTGTCCCATACCACTAGATTTCCTCGTCCTATGGAACGACGAGAAGGTGTTGATTAC +CATTACTTAACAGAGAGGCAATCTGGAAGGGAATAGCCGCCGGAAACTTTCTAGAACATACTGAGTTTTT +AGGAAATATTTACGGAACTTCTAAAACAGCTGTAAATACAGCGGCTATTAATAATCGTATTTGCGCGATG +GATTTAAACATCAACGGTGTTAGAAGTCTTAAAAATACTTACCTAATGCATTACTTGGGTATATAAGACC +TACCTCTCTTAAAATGGTTGAGGCCAATCTTCGTCGTAGAAACACTGAAGCGGACGACGAATCTCATCGT +CGCGTGATGTTGGCAAAAAACGGATATGGATGAGGTCAACGAAGCAGGTCTATTCGACACTATTATTATT +GAAGATGATGTGAATTTAGCATATAGTAAGTGTTAATTCAGATACTACAGGACCGTATTAGAATGTATTT +TAACACTAATTAGAGACTTAAGATTTGACTTAAAACTTGATAATTAATAATATAACTCGTTTTTATATGT +GGCTATTTCAACGTCTAATGTATTAGTTAAATATTAAAACTTACCACGTAAAACTTAAAATTTAAAATGG +TATTTCATTGACAGATCATACATTATGAAGTTTCAAGGACTTGTGTTAATTGACAATTGCAAAAATCAAT +GGGTCGTTGGACCATTAATAGGAAAAGGTGGATTCGGTAGTATTTATACTACTAATGACAATAATTATGT +AGTAAAAATAGAGCCCAAAGCTAACGGATCATTATTTACCGAACAGGCATTTTATACTAGAGTACTTAAA +CCATCCGTTATCGAAGAATGGAAAAAATCTCACAATATAAAGCACGTAGGTCTTATCACGTGCAAGGCAT +TTGGTTTATACAAATCCATTAATGTGGAATATCGATTCTTGGTAATTAATAGATTAGGTGCAGATCTAGA +TGCGGTGATCAGAGCCAATAATAATAGACTACCAGAAAGGTCGGTGATGTTGATCGGAATCGAAATCTTA +AATACCATACAATTTATGCACGAGCAAGGATATTCTCACGGAGATATTAAAGCGAGTAATATAGTCTTGG +ATCAAATAGATAAGAATAAATTATATCTAGTGGATTACGGATTGGTTTCTAAATTCATGTCTAACGGCGA +ACATGTTCCATTTATAAGAAATCCAAATAAAATGGATAACGGTACTCTAGAATTTACACCTATAGATTCG +CATAAAGGATACGTTGTATCTAGACGTGGTGATCTAGAAACACTTGGATATTGTATGATTAGATGGTTGG +GAGGTATCTTGCCATGGACTAAGATATCTGAAACAAAGAATTCTGCATTAGTAAGTGCTGCAAAACAGAA +ATATGTTAACAATACTGCGACTTTGTTAATGACCAGTTTGCAATATGCACCTAGAGAATTGCTGCAATAT +ATTACCATGGTAAACTCTTTGACATATTTTGAGGAACCCAATTACGACGAGTTTCGTCGAGTATTAATGA +ATGGAGTTATGTAAAATTTTTGTTGATAAAAAAATTAAAAAAATAACTTAGTTATTATCACTCTCGCGAG +TGCAATAGAAACACGGCGATGTTTTACGCACACGCTTTCGGTGGGTACGACGAGAACCTTCATGCATTTC +CTAGAATATCATCGACGGTTGCCAATGATGTCAGGAAATATTCTGTTGTGTCAGTTTATAATAAAAAGTA +TAACATTGTAAAAAACAAATATATGTGGTGTAACAGTCAAGTGAACAAGAGATATATTGGAGCACTACTG +CCTATGTTTGAGTGCAATGAATATCTACAAATTGGAGATCCAATCCATGATCTAGAAGGAAATCAAATCT +CTATTGTCACATATCGCCACAAAAACTACTATGCTCTAAGTGGAATTGGGTACGAGAGTCTAGACTTGTG +TTTGGAAGGAGTAGGGATTCATCATCACGTACTTGAAACAGGAAACGCGGTATATGGAAAAGTTCAACAT +GAGTATTCTACTATCAAAGAGAAGGCCAAAGAAATGAATGCACTCAAACCAGGACCTATCATCGATTACC +ACGTCTGGATAGGAGATTGTGTCTGCCAAGTTACTACTGTAGACGTGCATGGAAAGGAAATTATGAGAAT +GAGATTCAAAAGGGGTGCGGTGCTTCCGATTCCAAATCTGGTAAAAGTTAAAGTTGGGGAGGAAAATGAT +ACAATAAATCTTTCCACTTCCATATCAGCTCTCCTGAATTCCGGTGGCGGCACCATCGAGGTAACATCTA +AGGAAGAACGTGTGGATTATGTACTCATGAAACGTTTGGAATCTATACATCATCTGTGGTCTGTAGTGTA +TGATCATCTTAATGTTGTGAATGGCGAAGAACGATGCTATATACATATGCATTCATCTCATCAAAGTCCT +ATGCTGAGTACTGTAAAAACAAATTTGTATATGAAGACTATGGGAGCATGTCTTCAAATGGACTCCATGG +AAGCTCTAGAGTATCTTAGTGAACTGAAGGAATCAGGTGGGCGGAGTCCCAGACCAGAATTGCAGAAATT +TGAATATCCAGATGGAGTGAAAGACACTGAATCAATTGAGAGATTGGCAGAGGAGTTCTTCAATAGATCA +GAACTTCAGGCTGGTGAATCAGTCAAATTTGGTAATTCTATTAATGTTAAACATACATCTGTTTCAGCTA +AGCAACTAAGAACACGTATACGGCAGCAGCTTCCTTCTATACTCTCATCTTTTGCCAACACAAAGGGTGG +ATATTTGTTCATTGGAGTTGATAATAATACACACAAAGTAATTGGATTCACGGTGGGTCACGACTACCTC +AAACTGGTAGAGAGAGATATAGAAAAGTATATCCAAAAACTTCCTGTTGTGCATTTCTGCAAGAAAAAAG +AGGACATCAAGTACGCATGTAGATTCATCAAGGTGTATAAACCTGGTGATGAGACTACCTCGACATATGT +GTGCGCAATCAAAGTGGAAAGATGCTGCTGTGCTGTGTTTGCGGATTGGCCAGAATCATGGTACATGGAT +ACTAGTGGTAGTATGAAGAAGTATTCTCCAGATGAATGGGTGTCACATATAAAATTTTAATTAGGGTAAG +GTAAAACTATATATAATAACTAACAATTTGTGTATCATATAGACAATTAATTAGGTAACTGTTATCTCTT +TTTAACTAACTAACTAACTCTTATATACTATTAATAATACATCTATTAATAATACATCTATTAATAATAC +ATCTATTAATCATTGATTAGTTTATTGCTTTAATTGTTTTTGTAAACTAACACTGTTCATTGAAAAGGGA +TAACATGTTACAGAATATAAATTATATATGGATTTTTTTAAAAAGGAAATACTTGACTGGAGTATATATT +TATTTCTTCATTACATAACACGTCTGTGTTCTAATTCTTCCAATTCTTCCACATCTCATATAATACAGGA +ATATAATCTTGTTCGAAAATACGAGAAAGTGGATAAAACAATAGTTGATTTTTTATCTAGGTGGCCAAAT +TTATTCCATATTTTAGAATATGGGGAAAATATTCTACATATTTATTTTATAGATGCTGCTAATACGAATA +TTATGATTTTTTTTCTAGATAGAGTATTAAATATTAATAAGAACCGTGGGTCATTTATACATAATCTCGG +GTTATCATCCATTAATATAAAAGAATATGTATATCAATTAGTTAATAATGATCATCTAGATAATAGTATA +AGACTAATGCTTGAAAATGGACGTAGAACAAGACATTTTTTGTCTTATATATTGGATACAGTTAATATCT +ATATAAGTATTTTAATAAATCATAGATTTTATATAGATGCCGAAGACAGTTACGGTTGTACATTATTACA +TAGATGTATATATAACTATAGGAAATCAGAATCAGAATCATATAATGAATTAATTAAGATATTGTTAAAT +AATGGATCAGATGTAGATAAAAAAGATACGTACGGAAACACACCGTTTATCCTATTATGTAAACACGATA +TCGACAACGCGGAATTGTTTGAGATATGTTTAGAGAATGCTAATATAGACTCTGTAGACTTTAATGGATA +TACACCTCTTCATTATGTCTCATGTCGTAATAAATATGATTTTGTAAAGTTATTAATTTCTAAAGGAGCA +AATGTTAATGCACGTAATAGATTCGGAACTACTCCATTTTATTGTGGAATTATACACGGTATCTCGCTTA +TAAAACTATATTTGGAATCAGACACAGAGTTAGAAATAGATAATGAACATATAGTTCGTCATTTAATAAT +TTTTGATGCTGTTGAATCTTTAGATTATCTATTGTCCAGAGGAGTTATTGATATTAACTATCGTACTATA +TACAACGAAACATCTATTTACGACGCTGTCAGTTATAATGCGTATAATACGTTAGTCTATCTATTAAACA +GAAATGGTGATTTTGAGACGATTACTACTAGTGGATGTACATGTATTTCGGAAGCAGTCGCGAACAACAA +CAAAATAATAATGGATATACTATTGTCTAAACGACCATCTTTGAAAATTATGATACCATCTATGATAGCA +ATTACTAAACATAAACAACATAATGCAGATTTATTGAAAATGTGTATAAAATATACTGCGTGTATGACCG +ATTATGATACTCTTATAGATGTACAATCGCTACATCAATATAAATGGTATATTTTAAAATGTTTTGATGA +AATAGATATCATGAAGAGATGTTATATAAAAAATAAAACTGTATTCCAATTAGTTTTTTGTATCAAAGAC +ATTAATACTTTAATGAGATACGGTAGACATCCTTCTTTCGTGAAATGTAATATTCTCGACGTATACGGAA +GTCATGTACGTAATATCATAGCATCTATTAGATATCGTCAGAGATTAATTAGTCTATTATCCAAGAAGCT +GGATGCTGGAGATAAATGGTCGTGTTTTCCTAACGAAATAAAATATAAAATATTGGAAAACTTTAACGAT +AACGAACTGACCACATATCTAAAAATCTTATAAACACTATTAAAATATAAAATCTAAGTAGGATAAAAAC +ACTACATCATTGTTTCCTTTTAGTGCTCGACAGTGTATGCTATTTTTAACACTCATAAATAAAAATGAAA +ACGATTTCCGTTGTTACGTTGTTATGCGTACTACCTGCTGTTGTTTATTCAACATGTACTGTACCCACTA +TGAATAACGCTAAATTAACGTCTACCGAAACATCGTTTAATGATAAACAGAAAGTTACGTTTACATGTGA +TTCAGGATATCATTCTTTGGATCCAAATGCTGTCTGCGAAACAGATAAATGGAAATACGAAAATCCATGC +AAGAAAATGTGCACAGTTTCTGATTATGTCTCTGAACTATATGATAAGCCATTATACGAAGTGAATTCCA +CCATGACACTAAGTTGCAACGGTGAAACAAAATATTTTCGTTGTGAAGAAAAAAATGGAAATACTTCTTG +GAATGATACTGTCACGTGTCCTAATGCGGAATGTCAACCTCTTCAATTAGAACACGGATCGTGTCAACCA +GTTAAAGAAAAATACTCATTTGGGGAATATATGACTATCAACTGTGATGTTGGATATGAGGTTATTGGTG +TTTCGTATATAAGTTGTACGGCTAATTCTTGGAATGTTATTCCATCATGTCAACAAAAATGTGATATACC +GTCTCTATCTAATGGATTAATTTCCGGATCTACATTTTCTATCGGTGGCGTTATACATCTTAGTTGTAAA +AGTGGTTTTACACTAACGGGGTCTCCATCATCCACATGTATCGACGGTAAATGGAATCCCATACTCCCAA +CATGTGTACGATCTAACGAAGAATTTGATCCAGTGGATGATGGTCCCGACGATGAGACAGATCTGAGCAA +ACTCTCGAAAGACGTTGTACAATATGAACAAGAAATAGAATCGTTAGAAGCAACTTATCATATAATCATA +ATGGCGTTGACAATTATGGGTGTCATATTTCTAATCTCTATTATAGTATTAGTTTGTTCCTGTGACAAAA +ATAATGACCAATATAAGTTCCATAAATTGCTACCGTGAATATAAATCCGTTAAAATAATTAATAATTAAT +AATTAATAATTAATAACGAACAAGTATCAAAAGATTAAAGAATTAGCTAGAATCAATTAGATGTCTTCTT +CAGTGGATGTTGATATCTACGATGCTGTTAGAGCATTTTTACTCAGGCACTATTATGACAAGAGATTTAT +TGTGTATGGAAGAAGTAACACCATATTACATAATATATACAGGCTATTTACAAGATGCACCGTTATACAG +TTCGATGATATAGTACGTACTATGCCAAATGAATCACGTGTTAAACAATGGGTGATGGATACACTTAATG +GTATAATGATGAATGAATGCGATACTGTATGTGTGGGTACCGGACTACGATTCATGGAAATGTTTTTCGA +TTACAATAAAAATAATCCCAAAAATAGCATCAACAATCAAATAATGTATGATATAATTAATAGCGTAACC +ATAATTCTAGCTAATGAGAGATATAGAAGCGCGTTTAACGACGATAGAATATACATCCGTAGAACTATGA +TGGACAAATTGTACGAATACGCATCTCTAACTACTATTGGTACGATCACTGGAGGTGTTTGTTATTATCT +GTTGATGCATCTAGTTAGTTTGTATAAATAATTATTTCGATATACTAGTAAAATTTTAAGATTTTAAATG +TATAAAAAACTAATAACGTTTTTATTTGTAATAGGTGCAGTTGCATCCTATTCGAATAATGAGTACACTC +CGTTTAATAAACTGAGTGTAAAACTCTATATAGATGGAGTAGATAATATAGAAAATTCATATACTGATGA +TAATAATGAATTGGTGTTAAATTTTAAAGAGTACACAATTTCTATTATTACAGAGTCATGCGACGTCGGA +TTTGATTCCATAGATATAGATGTTATAAACGACTATAAAATTATTGATATGTATACCATTGACTCGTCTA +CTATTCAACGCAGAGAACATACGTGTAGAATATCTACCAAATTATCATGCTATTATGATAAGTACCCTTA +TATCCACAAATATGAGGGTGATGAACGACAATATTCTATTACTGCAGAGGGAAAATGCTATAAAGGAATA +AAATATGAAATAAGTATGATGAACGATGATACTCTATTGAGAAAACATACTCTTAAAATTGGATTTACTT +ATATATTCGATCGTCATGGGCATAGTAATACATATTATTCAAAATATGATTTTTAAAAATTTAAAATATA +TTATCACTTCAGTGACAGTAGTCAAATAACAAACAACACCATGAGATATATTATAATTCTCGCAGTTTTG +TTCATTAATAGTATACATGCTAAAATAACTAGTTATAAGTTTGAATCCGTCAATTTTGATTCCAAAATTG +AATGGACTGGGGATGGTCTATACAATATATCCCTTAAAAATTATGGCATCAAGACGTGGCAAACAATGTA +TACAAATGTACCAGAAGGAACATACGACATATCCGGATTTCCAAAGAATGATTTCGTATCTTTCTGGGTT +AAATTTGAACAAGGCGACTATAAAGTGGAAGAGTATTGTACGGGACTATGTGTCGAAGTAAAAATTGGAC +CACCAACTGTAAGATTGACTGAATATGACGATCATATCAATTTGTTCATCGAGCATCCGTATGCTACTAG +AGGTAGCAAGAAGATTCCTATTTACAAACGCGGTGACATGTGTGATATCTACTTGTTGTATACGGCTAAC +TTCACATTCGGAGATTCTGAAGAACCAGTAACATATGATATCGATGACTACGATTGCACGTCTACAGGTT +GCAGCATAGACTTTGCCACAACAGAAAAAGTGTGTGTGACAGCACAGGGAGCCACAGAAGGGTTTCTCGA +AAAAATTACTCCATGGAGTTCGGAAGTATGTCTGACACCTAAAAAGAATGTATATACGTGCGCAATTAGA +TCTAAAGAAGATGTTCCCAATTTCAAGGACAAAATAGCCAGAGTTATCACGAGAAAATTTAATAAACAGT +CTCAATCTTATTTGACTAAATTTCTCGGTAGCACATCGAATGATGTTACAACTTTTCTTAGCATTCTTGA +CTAAATATTCATAACTAATTTTTATTAATGATACAAAAATGAAATAAAACTGCATATTATACACTGGTTA +ACGCCCTTGGCCTAACCATTTTTAAGATGAGGTCCCTGATTATAGTCCTTCTGTTCCCCTCTATCATCTA +CTCCATGTCTATTAGACGATGCGAGAAGACTGAAGAGGAAACATGGGGATTAAAAATAGGGTTGTGTATA +ATTGCCAAAGATTTCTATCCCGAAAGAACTGATTGCAGTGTTCATCGCCCAACTGCAAGTGGAGGATTGA +TAACTGAAGGCAATGGATTCAGAGTAGTTATATATGATCAATGTACAGAACCACATGACTTTATTATCAC +CGATACTCAACAAACACGTCTTGGATCATCTCATACATATATTAAATTCAGTAACATGAATACAGGTGTC +CCATCTAGTATTCCAAAATGTTCCAGAACTCTCTCTATTTCTGTATATTGTGATCAAGAGGCGGGAGACA +TAAAATTTGAGGAGTATACTCAAGAATCAAGTGATATCAGTATTAGAGTTAAGTATGATTCATCATGTAT +TGATTATCTGGGTATTAATCAAAGTTTCATGAATGAATGTATTCGAAGAATTACAACATGGGATAGAGAA +TCATGTGTCAGAATTGATACACAGACTATAAATAAATATCTTAAGTCTTGCACCAACACAAAATTCGACC +GTAATGTCTACAAAAGGTACATACTGAAGAGTAAAGCACTCCATGCTAAAACAGAGTTGTAATAGATATA +AAATACTTTTTATAATAATTAGGCTAGAAAAATCTCACTCACATGTAATCTTAAAAAATGATATGATAGT +TCTTACAAGTAGAGATTGAGTTTTAAATGGATTCTATTAATTACCGGGGACTTAACAATTCGTTCTGATC +TACAGACATTGGTTAATAAATCATCTTATTTTGCCGATATATTAAAATGTGGAAACTCCACTAATAATAT +TACATTGTGTGACTTTCAAGATGATGCGATATATAGGGTTATACAGTTTAACAATTATATAATAGAGATA +GAAAGTACAAAAGATGTAGAATCAATGATATGGCACGCTAAACAGTTGGGTGTGGAATCATTGCTAAAAG +AATGTCAAAATTATTTGCTTAGAATATTACGTATATAATTGTTTAGAAATTTATAGAATAACTAATATTA +ATACATTATCGTATATCTACAACGATGTAAGAAACTTCATATTGGATAATATTACTATTAATATATAAGG +ATCCAGATTTTATATATTTGCCTAAATACATTATTATAGATTTACTAGGACAATCACCTAAATGTTTTTA +ACGAAGATAATGTGGTAAAGATTATATACACTTATATATCTTCCGATATCTACAAGGATATTTCCATATC +ATCATTGTGTAAACTAAATAACGTTTTCTATGGCATTTAATAAGGCATTGGATATGTGGAAAAGATGATG +GTGTATGGAAGTTAGTACATCATTATCAACTTCTCCTTATTGATTGAAAATGAAAATATAAATAGTTTTT +ATATATAGCGGTATCTACCCTATAGTTTTATTGCTTACTACTAACATGGATACAGATACAGATACAGATA +CAGATACAGATATAGATACAGATACAGATGTTAGATAGAGAGAAAGAAGAAATACTAAAAAATGTAGAAA +TTGAAAATAATAAAAACATTAACAAGAATCATCCCAGTGAATATATTAGAGAAGCACTCGTTATTAATAC +CAGTAGTAATAGTGATTCCATTGATAAAGAAGTTATAGAATATATCAGTCACGATGTAGGAATATAGATC +ATATCTACTAATTTTTATAATCGATACAAAACATAAAAAACAACTCGTTATTACATAGCAGGCATGGAAT +CCTTCAAGTATTGTTTTGATAACGATGGTAAGGAATGGATTATCGGAAATACTTTATATTCTGGTAATTC +AATACTCTATAAGGTCAGAAAAAATTTCACTAGTTCGTTCTACAATTACGTAATGAAGATAGATCATAAA +TCACACAAGCCATTGTTGTCCGAAATACGATTCTATATATCTGTATTGGATCCTTTGACTATCGACAACT +GGACACGGGAACGTGGTATAAAGTATTTGGCTATTCCAGATCTGTATGGAATTGGAGAAACCGATGATTA +TATGTTCTTCGTTATAAAGAATTTGGGAAGAGTATTCGCCCCAAAGGATAGTGAATCAGTTTTCGAAGCA +TGTGTCACTATGATAAACACGTTAGAGTTTATACACTCTCGAGGATTTACTCATGGAAAAATAGAACCGA +TGAATATACTGATTAGAAATAAACGTATTTCACTAATTGACTATTCTAGAACTAACAAACTATACAAAAG +TGGAACACATATAGATTACAACGAGGACATGATAACTTCAGGAAATATCAATTATATGTGTGTAGACAAT +CATCTTGGAGCAACAGTTTCAAGACGAGGAGATTTAGAAATGTTGGGATATTGCATGATAGAATGGTTCG +GTGGTAAACTTCCATGGAAAAACGAAAGTAGTATAAAAGTAATAAAACAAAAAAAAGAATATAAACAATT +TATAGCTACTTTTTTTGAGGACTGTTTTCCTGAAGGAAATGAACCTCTGGAATTAGTTAGATATATAGAA +TTAGTATACATGTTAGATTATTCTCAAACTCCTAATTATGACAGACTACGTAGACTGTTTATACAAGATT +GAAATTATATTCTTTTTTTTATAGAGTGTGGGGTAGTGTTACGGATATCTGATATCTAATATCTAATATT +AATATTAGACTATCTCTATCGCGCTACACGACCAATATCGATTACTATGGATATCTTTAGGGAAATCGCA +TCTTCTATGAAAGGAAAGAATGTATTCATTTCTCCAGCGTCAATCTCGTCAGTATTGACAATACTGTATT +ATGGAGCTAATGGATCCACTGCTGAACAGCTATCAAAATATGTAGAAAAGGAGGAGAACATGGATAAGGT +TAGCGCTCAGAATATCTCATTCAAATCCATGAATAAAGTATATGGGCGATATTCTGCCGTGTTTAAAGAT +TCCTTTTTGGGAAAAATTGGCGATAAGTTTCAAACTGTTGACTTCACTGATTGTCGCACTATAGATGCAA +TCAATAAGTGTGTAGATATCTTTACTGAGGGAAAAATCAATCCACTATTGGATGAACCATTGTCTCCTGA +TACCTGTCTCCTAGCAATTAGTGCCGTATACTTTAAAGCAAAATGGTTGATGCCATTCGAAAAGGAATTT +ACCAGTGATTATCCCTTTTACGTATCTCCAACGGAAATGGTAGATGTAAGTATGATGTCTATTTACGGCG +AGCCATTTAATCACGCATCTGTAAAAGAATCATTCGGTAACTTTTCAATCATAGAACTGTCATATGTTGG +AGATACTAGTATGATGGTCATTCTTCCAAACAAGATTGATGGATTAGAATCCATAGAACAAAATCTAACA +GATACAAATTTTAAGAAATGGTGTAACTCTCTGGAAGCTACGTTTATCGATGTGCACATTCCTAAGTTTA +AGGTAATAGGTTCGTATAATCTTGTGGATACGCTAATAAAGTTGGGACTGACAGATGTGTTCTATTCAAC +TGGTGATTATATCAATATGTGTAATTCAGATGTGAGTGTTGACGCTATGATTCACAAAACGTATATAGAT +GTCAATGAAGAGTATACAGAAGCAGCTGCAGCAACTTCTGTACTAGTGGCAGACTGTGCATCAACAGTTA +CAAATGAGTTCTGTGCAGATCATCCGTTCATCTATGTGATTAGACATGTCGATGGTAAAATTCTTTTCGT +TGGTAGATATTGCTCTCCAACAACTAATTAAGCACATTCTTAATATTAGAATATTATATAGTTAAGATTT +TACTAACAGGTTAACATTTTTTTTAAAAAATAGAAAAAACATGTGGTATTAGTGCAGGTCGTTATTCTTC +CAATTGCAATTGGTAAGATGACGGCCAACTTTAGTACCCACGTCTTTTCACCACAGCACTGTGGATGTGA +CAGACTGACCAGTATTGATGACGTCAGACAATGTTTGACTGAATATATTTATTGGTCGTCGTATGCATAC +CGCAACAGGCAATGCGCTGGACAACTGTATGGCACACTCCTCTCTTTTAAAGATGATGCGGAATCAGTGT +TCATCGACGTTCGTGAGCTGGTAAAAAATATGCCGTGGGATAATGTTAAGGATTGTACAGAGATCATCCG +TTGTTATATACCGGATGAGCAAAAAACCATCAGAGAGATTTCGGCCATCATTGGACTTTGTGCATATGCT +GCTACTTACTGGGGAGGTGAAGACCATCCCACTAGTAACAGTCTGAACGCATTGTTTGTGATGCTTGGGA +TGCTCAATTACATGGATTATACCATCATATTCTGGCGTATGAATTGATGAGTTACAGCTTGACATTTCTT +CTTTCCTCCCTCTTCTTCTACTTTTCCCAGAAACAAACTTTTTTTACCTACTATAAAATAAAATGAGTAT +ACTACCTGTTATATTTCTTCCTATATTTTTTTATTCTCCATTCGTTCAGACTTTTAACGTGCCTGAATGT +ATCGACAAAGGGCAATATTTTGCATCATTCATGGAGTTAGAAAACGAGCCAGTAATCTTACCATGTCCTC +AAATAAATACGCTATCATCCGGATATAATATATTAGATATTTTATGGGAAAAACGAGGAGCGGATAATGA +TAGAATTATACAGATAGATAATGGTAGCAATATGCTAATTCTGAACCCGACACAATCAGACTCTGGTATT +TATATATGCATTACCACGAACGAAACCTACTGTGACATGATGTCGTTAAATTTGACAATCGTGTCTGTCT +CAGAATCAAATATAGATCTTATCTCGTATCCACAAATAGTAAATGAGAGATCTACTGGTGAAATGGTATG +TCCCAATATTAATGCATTTATTTCTAGTAACGTAAACGCAGATATTATATGGAGCGGACATCGACGCCTT +AGAAATAAGAGACTTAAACAACGGACACCTGGAATTATTACCATAGAAGATGTTAGAAAAAATGATGCTG +GTTATTATACATGTGTTTTAGAATATATATATATGGGCAAAACATATAACGTAACCAGAATTATAAAATT +AGAGGTACGTGATAGAATAATACCTCCTACTATGAAATTACCAGAAGGAGTAGTAACTTCAATAGGTAGT +AATTTGACTATTACATGCAGAGTATCGTTGAGACTTCCCACAACGGACGCTGACGTCTTTTGGATAAGTA +ATGGTATGTATTACGAAGAAGAAGACGAGGACGGAGACGGTAGAATAAGTGTAGCAAATAAAATCTATAT +GACTGATAAGAGACGTGTTATTACATCCTGGTTAAACATTAATCCTGTCAAGGAAGAAGATGCTACAACG +TTTACGTGTATGGCGTTTACTATTCCTAGCATCAGCAAAACAGTTACTGTTAGTATAACGTGAATGTATG +TTGTTACATTTCCATATCAATTGAGTTTATAAGAATTTTTATACATTATCTTCCAACAAACAATTGACGA +ACGTATTGCTATGATTAACTCCCACAATACTATGCATATTATTAATCATTAACTTGCAGACTATACCTAG +TAGTGCTATTTTGACATACTCATGTTCTTGTGTAATTGCAGTATCTATATTATTAAAGTACGTAAATCTA +GCTATAGTTTTATTATTTAATTTTAGATAATATACTGTCTCCGTATTTTTAAAAAATTGCCACATCCTTT +ATTAAATCATGAATGGGAATTTCTGTGTCATCGTTAGTATATTGTGAACAACAAGAGCTGATATCTATAG +GAAAGGGTGGAATGCGATACATTGATCTATGTAGTTTTAAAACATAAGCGAACTTTGAAGAATTTATATA +AATCATCTCACGAGATATTGTTCTCTGTCATATTCATACACCTGCATAAACTTTCTATACATCTTACAAT +GTGTTATTTTATGATCATATTTACATATTTACTGGTATATCAAAGATGTTAGATTAGTTAATGGGAATCG +TCTATAATAATGAATATTAAACAATTATAGGAGGAATTTATACCTACAAAAACATCATAAAAATGAGTCA +TCGTCCGATTTATGTTTTAAATATACTAACATTACTACCTTCAGAAATTATATACGAAATATTATACATG +CTGACAATTAACGATCTTTATAATATATAGTATCCACCTACCAAAGTATAATTGTATTTTTTCTCATGTG +ATGTGTGTAAAAAACTGATATTATATAATTATCTTAGTACCTATGATGAAGATGAAGATGATGGTCCGTA +TATATTTTGTATCATTATCGTTATTGCTATTCCATAGTTACGCCATAGACATCGAAAATGAAATCACCGA +ATTCTTCAATAAAATGAGAGATACTCTACCAGCTAAAGACTCTAAATGGTTGAATCCAGTATGTATGTTT +GGAGGCACAATGAATGATATGGCCGCTCTAGGAGAGCCATTCAGTGCAAAGTGTCCTCCTATTGAAGACA +GTCTTTTATCGCATAGATATAAAGACTATGTGGTTAAATGGGAAAGGCTAGAAAAGAATAGACGGCGACA +GGTTTCTAATAAACGTGTCAAACATGGTGATTTATGGATAGCCAACTATACATCTAAATTCAGTAACCGT +AGGTATTTATGTACCGTAACCACAAAGAATGGTGACTGTGTTCAGGGTGTAGTTAGATCTCATGTGTGGA +AACCTTCTTCATGCATTCCAAAAACATATGAACTAGGTACTTATGATAAGTATGGCATAGACTTATACTG +TGGAATTCTTTATGCGAAACATTATAATAATATAACTTGGTATAAAGATAATAAGGAAATTAATATCGAC +GATTTTAAGTATTCACAAGCGGGAAAGGAATTAATTATTCATAATCCAGAGTTAGAAGATAGTGGAAGAT +ACGACTGTTACGTTCATTACGACGACGTTAGAATCAAGAATGATATCGTAGTATCAAGATGTAAAATACT +TACGGTTATACCGTCACAAGACCACAGGTTTAAACTAATACTAGATCCGAAAATCAACGTAACGATAGGA +GAACCTGCCAATATAACATGCAGTGCTGTGTCAACGTCATTATTTGTCGACGATGTACTGATTGAATGGG +AAAATCCATCCGGATGGATTATAGGATTAGATTTTGGTGTATACTCTATTTTAACTAGTAGAGGCGGTAT +CACCGAGGCGACTTTGTATTTTGAAAATGTTACTGAAGAATATATAGGCAATACATATACATGTCGTGGA +CACAACTATTATTTTGATAAAACTCTTACAACTACAGTAGTATTGGAGTAAATACACAATGCATTTTTAT +ATACATTACTGAATTATTATTATTAATTATATCGTATTTGTGCTATAGAATGGATGAAGATACGCGACTA +TCTAGGTATTTGTATCTCACCGATAGAGAACATATAAATGTAGACTCTATTAAACAGTTGTGTAAAATAT +CAGATCCTAATGCATGTTATAGATGTGGATGTACGGCTTTACATGAGTACTTTTATAATTATAGATCAGT +CAACGGAAAATACAAGTATAGATACAACGGTTACTATCAATATTATTCATCTAGCGATTATGAAAATTAT +AATGAATATTATTATGATGATTATGATAGAACTGGTATGAACAGTGAGAGTGATAATATATCAATCAAAA +CAGAATATGAGAATGAATATGAATTCTATGATGAAACACAAGATCAAAGTACACAACTAGTAGATTACGA +CATTAAACTCAAAACCAATGAGGATGATTTTGTTGATGAATTCTATGGTTATGATAGATCAGTGGGTGTC +CATGATTATATAGATGTATCAATTAATAAAGTAGTATATGGAAGAGAGTCTCACGTAAGATGGCGGGATA +TATGGCAAGAACATAATGATGGCGTATACAGTATAGGAAAGGAGTGCATAGATAATATATACGAAGACAG +ACATACCGTAGACGAATTCTACAAGATAGACAGCGTATCAGATGTAGATGACGCAGAACATATATCTCAG +ATAACTAATGATGTATCTACACAAACATGGGAAAAGAAATCAGAGTTAGATAGATACATGGAAATGTATC +CTCGTCATAGATATGGTAAGCATTCTGTCTTTAAGGGATTTTCTGACAAAGTTAGAAAAAATGATTTAGA +CATGAATGTGGTAAAAGAATTACTTTCTAACGGTGCATCTCTAACAATCAAGGATAGCAGTAATAAGGAT +CCAATTGCTGTTTATTTTAGAAGAACAATAATGAATTTAGAAATGATTGATATCATTAACAAACATACAA +CTATCTATGAACGCAGGTATATAGTACACTCCTATCTAAAAAATTATAGAAATTTCGATTATCCATTTTT +CAGAAAGTTAGTTTTGACTAATAAACATTGTCTCAACAATTATTATAATATAAGCGACAGCAAATATGGA +ACACCACTACATATATTAGCATCTAATAAAAAAATAATAACTCCTAATTACATGAAGTTATTAGTGTATA +ACGGAAATGATATAAACGCACGAGGTGAAGATACACAAATGCGAACTCCATTACACAAATATTTGTGTAA +ATTTGTATATCATAATATTGAATATGGTATCCGATACTATAATGAAAAGATTATAGACGCATTTATAGAG +TTAGGAGCCGATCTAACTATTCCAAATGACGATGGAATGATACCAGTAGTTTACTGTATACACTCAAATG +CCGAATATGGTTATAACAATATTACTAACATAAAGATAATACGTAAACTACTTAATCTTAGTAGACATGC +GTCACATAATCTATTTAGAGATCGAGTCATGCACGATTATATAAGTAATACATATATTGATCTTGAGTGT +TTAGATATCATTAGATCACTGGATGGGTACGATATTAATTGTTACTTTGAAGGACGTACACCACTTCATT +GCGCTATACAATATAACTTCACTCAGATTGCTGAGTACTTATTAGATCGAGGAGCTGATATATCATTAAA +GACAGACGATGGTAAAACTGTATTTGATTTATCGTTATGTAGTTACATTCCTCTTAAATGGACTAGCTTT +TTGATTAGTCGTCTACCGCCTAAAAGTGTCATATGCTCACTGACTAACCATATAATAGATTATGTTCTTA +CGAACAATAGACGTATTATTTGGCAGAGTCAAATGATTAATAAGTACGTACTGTTACTGGACCCATCCTT +TTATTATAGATTCAGAAATGCTATCGAAAACAAATTAGACCAATACAATAATCGTTATAATATGTTCGAA +CACGATAGGGACGTTAATGAAAAGTATGGCAAAGTCTTACATGACCTCGATACATATATCAAGGATGTAC +AAGTATTAAAATCTACTTCCATCACTAATAATATAACACTATACGACACTATTATAAATAATAAGTCAGA +GTTTCCTATACGTCGTGCAAACGACAAACAATTAATTAATCTCATAAAATCCAATACATATCATAATCTT +ATCGAAAAAGTTATTAAAAATACATTAGAGAAATATACTTTAACTAATATAGTCCTCGAGTATATGATCT +CATCTCAATCTCAATCTCAATCTCAATCTCAATCATCTTATTTGAGTCGTATTCCTAATGAGATATTACT +CGAAATATTATATAAACTCGACATGTACGATTTACGTAATCTATATACAAGATATATGAGAGAGAATGAT +ATCACAGAGTATCATATAGAGAATACGAGGTCTGTTTCTACACAGACATGAATAATGAATACACATACAA +CGTTTTTTTTTTAATCTTAGATATAACACTAATTACATCAAGATTATATATTGAAATCGTAATTTGAGTT +GTCTGATCATCATGGATATCGAAAATGATATACGTAACATTAGCAATCTTTTTTAGATGATTGATATATT +ATTATGCGATGTAATCATAACTATCGGAGATGTAGAAATTAAAGCGCATAAAACTATTTTGGCTGCCGGA +TCTACGTATTTTAAAACAATGTTCACAACACCTATGATAGCGAGAGATCTAGCAACTAGAGTAAATCTAC +AGATGTTCGATAAGATGCCGTCAAAAATATTGTACAGTACTTATACAATAGGTATATAAGTTCTATGAAT +GTGATAGACGTATTAAAATGCACCGACTAAGAACGTAGAACGAACTATAGAATGTTATACAATGGGTGAT +GATAAGTAGAAGATGTTACCCGATATACCCATAGCATTATCTAGTTATGGCATGTGTGTATTAGATCAAT +ACATATACATTATAGGCGGTCGTACCCAACACTGATTATACATCGGTACATACAGTAAATAGCATAGATA +TGGAGGAGGATACAAATATTTCAAATAAAGTTATGAGATACGCACTGTCAATAATATATGGAAGACATTA +CCTAACTTCTGAACTGGAACTATAAATCCAGGCTCTTGCATAAAGATGAATATATATGTTGTATGCGACA +TCAAAGATGAAAAAATGTTAAGACTTATATATTTAGATATAACACGAATATGTATAACGGATGGGAATTG +GTAACGATGACAGAAAGCAGATTGTCAGCTCTGCATACTATTCTTCATGACAATACCATAATGATGTTAC +ATTGTTATGAAACGTATATGTTACAAGATACATTTAATGTGCTTACGGAACATATATTTAGAAACATCTA +CTAACGATTTTTTATGCTTGTATTATTAATGGTATGTAATATGATTTAATTGATTGTGTACACGATACCA +ATTTGTCAAGTATGAATACGGAGTACAAACATAAACTGAAGTTTAACATTATTTATTTATGATATACATT +ATATACATTATATACATTATATACATTATATACATTATATACATTATATACATTATATACATTATATACA +TTATATACATTATATACATTATATACATTATATACATTATATACATTATATACATTATATACATTATATA +TCGTTATATATCGTTATATATCGTTATTGTTTGGTCTATGCCATGGATATCTTTAAAGAACTAATCTTAA +AACATACGGATGAAAATGTTTTGATTTCTCCAGTTTCCATTTTATCTACTTTATCTATTCTGAATCATGG +AGTAGCTGGTTCTACAGCTGAACAACTATCAAAATATATAGAGAATATGAATGAGAATACACCCGATGAT +AAGAAGGATGACAATAATGACATGGACGTAGATATTCCGTATTGTGCGACACTAGCTACCGCAAATAAAA +TATACGGTAGTGATAGTATCGAGTTCCATGCCTCCTTCCTACAAAAAATAAAAGACGATTTTCAAACTGT +AAACTTTAATAATGCTAACCAAACAAAGGAACTAATCAACGAATGGGTTAAGACAATGACAAATGGTAAA +ATTAATTCCTTATTGACTAGTCCGCTATCCATTAATACTCGTATGACAGTTATTAGCGCCGTCCATTTTA +AAGCAATGTGGAAATATCCATTTTCTAAACATCTTACATATACAGACAAGTTTTATATTTCTAAGAATAT +AGTTACCAGTGTTGATATGATGGTGGGTACCGAGAATGACTTGCAATATGTACATATTAATGAATTATTC +GGAGGATTCTCTATTATCGATATTCCATACGAGGGAAACTCTAGTATGGTGATTATACTGCCGGACGACA +TAGAAGGTATATATAACATAGAAAAAAATATAACAGATGAAAAATTTAAAAAATGGTGTGGTATGTTATC +TACTAAAAGTATAGACTTGTATATGCCAAAGTTTAAAGTGGAAATGACGGAACCGTATAATCTGGTACCG +ATTCTAGAAAATTTAGGACTTACTAATATATTTGGATATTATGCAGATTTTAGTAAGATGTGTAATGAAA +CTATCACTGTAGAAAAATTTCTACATACGGCGTTTATAGATGTTAATGAGGAGTATACAGAAGCATCGGC +CGTTACAGGAGTATTCATGACTAACTTTTCGATGGTATATCGTATGAAGGTCTACATAAACCATCCATTC +ATATACATGATTAAAGATAACACCGGACATACACTTTTTATAGGGAAATACTGCTATCCGCAATAAATAT +AAACAATAGACTTTTATCACGTTATCTCATGTATAAAATATTACAAATAGTATAGCATAAACTAAAGTCG +ATACATACATTAAAACTTAAAAAATAATGTAATTTACAATTAATAGTATAAACTAAAAAAATTAAAAAAT +TAAAAACAATATCATTATTATAAGTAATATCAAAATGACGATATACGGATTAATAGCGTATCTTGTATTC +GTGACTTCATCCATCGCTAGTCCATTTTACATTCCCGTTATTCCGCCCATTTCGGAAGATAAATCGTTCA +ATAGTGTAGAGGTATTAGTTTCTTTGTTTCCCGATGACCAAAAAGACTATACAGTAACTTCTCAGTTCAA +TAACTACACTATCGGTACCAAAGACTGGACTATCAACGTACTATCCACACCTGATGGTCTGGACATACCA +TTGACTAATATAACTTATTGGTCACGGTTTACTATAGGTCGTGCATTGTTCAAATCAGAGTCTGAGGATA +TTTTCCAAAAGAAAATGAGTATTCTAGGTGTTTCTATAGAATGTAAGAAGCCGTCGACATTACTTACTTT +TTTAACCGTGCGTAAAATGACTCGAGTATTTAATAGATTTCCAGATATGGCTTATTATCGAGGAGACTGT +CTAGAAGCCGTTTATGTAACAATGACTTATAAAAATACTAAAACTGGAGAGACTGATTACACGTACCTCT +CTAATGGGGGGTTGCCTGCATACTATCGTAATGGGGTCGATGGTTGATTATTGATTAGTATATTCCTTAT +TCTTTTTATTCACACAAAAAGAACATTTTTATAAACATGAAACCACTGTCTAAATGTAATTATGATCTTG +ATTTATAGATGATGATCAGCCTTCAGAGGATTTTGACCAGCATGTTTAATATGAAAAAAAACATAACTAT +TAAGCGCTATTGCGCTATTGTGCTTAATTATTTTGCTCTATAAACTGAATATATATAGCCACAATTATTG +ACGGGCTTGTTTGTGACCGGTAATCATGAATTTACAGAAATTATCTCTGGCTATATATCTTACGGTGACA +TGTTCGTGGTGTTATGAAACATGTATGAGAAAAACTGCGTTGTATCATGACATTCAATTGGAGCATGTAG +AAGACAATAAAGATAGTGTAGCATCGCTACCGTACAAGTATCTACAAGTAGTCAAACAAAGAGAACGTAG +TAGATTGTTGGCTACATTTAATTGGACGGATATAGCTGAGGGTGTTAGAAATGAGTTCATTAAAATATGT +GATATCAACGGAACATATCTATATAATTATACTATTGATGTTAGTATAATTATTGATTCCACGGAAGAAC +TACCAACAGTTACTCCAATTACAACATATGAACCTTCTATATATAATTATACTATCGATTATAGCACTGT +TATTACTACTGAAGAACTACAAGTGACTCCAACATATGCGCCTGTAACAACTCCTCTTCCAACATCAGCA +GTTCCTTATGATCAACGATCGAATAACAATGTAAGTACTATATCTATTCAGATACTGAGTAAAATATTGG +GAGTCAATGAAACAGAATTAACTAATTATCTTATTATGCATAAAAATGACACTGTTGACAATAACACCAT +GGTTGATGATGAGACATCTGACAATAACACATTGCATGGTAATATAGGATTTTTGGAAATAAATAATTGT +TACAATGTTTCTGTGTCAGATGCTAGTTTTAGAATAACATTAGTAAACGATACTTCTGAAGAAATTTTGC +TAATGCTAACAGGAACTAGTTCATCCGACACCTTCATATCTTCCACCAATATCACTGAATGTTTGAAAAC +ATTAATCAATAATGTGTCGATTAATGATGTACTTATAACACAAAATATGAATGTAACATCTAATTGTGAT +AAATGCTCAATGAATTTGATGGCATCCGTTATTCCTGCAGTTAATGAATTTAACAATACGTTGATGAAAA +TTGGTGTAAAAGATGATGAAAACAATACGGTATATAACTATTATATTTGTAAACTAACTACAAATTCTAC +ATGTGATGAGTTAATCAATTTAGATGAAGTCATTAACAACATAACTCTGACAAATATTATACGCAATAGT +GTTTCGACAACTAACAGCAGAAAAAGACGAGATCTGAATGGTGAGTTTGAATTTTCCACTTCCAAGGAAT +TAGATTGTCTTTACGAATCATATGGTGTAAACGATGATATAAGTCATTGTTTTGCATCACCTAGACGTAG +ACGATCTGACGACAAAAAGGAGTACATGGACATGAAATTATTCGACCACGCGAAAAAAGATTTAGGAATA +GACAGTGTTATTCCTAGAGGTACAACCCATTTCCAAGTAGGTGCATCTGGTGCAAGTGGTGGTGTTGTAG +GAGATAGTTTCCCATTTCAAAATGTTAAATCGCGTGCCAGTCTATTGGCGGAAAAAATAATGCCTAGAGT +ACCTATTACTGCTACCGAAGCTGATCTATATGCAACTGTAAATAGACAACCCAAGTTACCAGCAGGTGTT +AAAAGTACTCCGTTTACAGAGGCGCTTGCGTCTACGATAAACCAAAAGCTTTCTAATGTTAGAGAGGTAA +CTTATGCTTCGTCCAATCTGCCAGGATCAAGTGGCTATGTTCATAGACCATCTGATTCTGTTATTTACAG +CAGTATAAGACGGTCACGTTTACCTAGTGATAGCGATAGTGATTATGAGGATATACAAACTGTTGTTAAG +GAATATAATGAAAGATATGGTAGATCAGTCAGTAGAACACAGTCATCAAGTAGTGAAAGCGATTTTGAAG +ATATAGATACTGTTGTTAGGGAATATAGACAAAAATATGGCAATGCAATGGCAAAAGGACGTAGTAGTTC +CCCTAAACCTGATCCATTATATAGTACTGTTAAGAAAACAACTAAAAGTCTATCTACTGGTGTAGACATA +GTTACAAAACAATCAGACTATTCTCTATTACCTGACGTTAATACTGGCAGTTCTATTGTGTCACCTCTCA +CCAGAAAAGGAGCTACTAGACGACGACCTAGACGCCCTACAAATGATGGTCTACAGAGTCCAAATCCTCC +TCTCCGTAATCCACTTCCTCAACATGATGATTATTCTCCTCCACAAGTACACAGACCTCCGACACTTCCT +CCTAAACCAGTCCAAAATCCGACACAACTTCCCCCTAGACCAGTAGGTCAATTACCTCCTCCTATAGATC +AACCAGATAAAGGATTTAGTAAGTTTGTATCACCTAGACGGTGTAGAAGAGCAAGCTCTGGAGTCATATG +TGGTATGATACAATCAAAACCAAACGATGATACCTATTCACTTCTTCAACGGCCAAAAATTGAACCAGAA +TATGCGGAGGTTGGTAATGGTATACCCAAGAACAATGTTCCTGTAATAGGTAATAAACATAGTAAAAAAT +ATACATCGACGATGTCAAAAATATCAACAAAATTTGATAAATCTACGGCATTTGGAGCAGCAATGTTACT +AACTGGTCAGCAGGCCATTAGCCAACAGACTAGATCAACTACGTTGAGTAGAAAAGATCAGATGAGCAAG +GAAGAAAAGATATTCGAAGCAGTTACAATGAGTCTATCAACTATAGGTTCAACGTTGACGTCTGCAGGTA +TGACGGGTGGTCCAAAACTAATGATTGCAGGAATGGCTATAACGGCTATAACTGGTATAATAGATACGAT +AAAAGATATATATTACATGTTTTCAGGACAGGAGAGGCCAGTAGATCCTGTTATTAAATTATTTAATAAG +TACGCTGGCTTAATGTCCGATAATAATAAAATGGGTGTAAGAAAATGTTTGACACCCGGTGACGACACAC +TTATTTATATCGCATACAGAAACGATACCAGTTTTAAACAGAATACGGATGCGATGGCTTTGTATTTCTT +AGATGTTATCGACTCAGAGATCCTATATCTAAACACATCAAATTTAGTTCTAGAGTATCAACTAAAGGTG +GCTTGCCCCATAGGAACATTAAGATCTGTAGATGTGGACATAACTGCGTATACAATATTATATGATACAG +CGGATAATATTAAGAAATACAAGTTTATCAGAATGGCAACGCTACTATCCAAACATCCAGTTATTAGATT +GACATGTGGTTTAGCAGCAACATTGGTGATTAAACCGTACGAGGTACCCATCAGTGATATGCAACTACTA +AAAATGGCGACGCCTGGTGAACCAGAATCCACTAAATCTATACCATCCGATGTCTGTGATAGGTATCCTC +TAAAGAAATTCTATCTTTTAGCTGGTGGTTGTCCCTATGATACATCTCAAACTTTTATTGTACATACTAC +TTGCAGTATTCTACTAAGAACAGCTACACGGGATCAGTTTAGAAACAGATGGGTGTTACAAAATCCATTT +AGACAAGAAGGGACATATAAGCAACTGTTTACCTTTAGCAAATACGATTTTAACGACACCATAATCGATC +CTAATGGTGTGGTGGGTCATGCTAGCTTTTGTACCAATAGAAGCAGCAACCAATGTTTCTGGTCCGAACC +TATGATATTGGAAGATGTATCATCGTGTAGTTCTAGAACTAGAAAAATATACGTAAAACTGGGAATATTT +AATGCTGAAGGTTTTAATAGTTTTGTACTAAATTGTCCAACTGGGTCTACACCTACATACATCAAACATA +AAAATGCGGACAGTAACAATGTTATCATAGAGCTACCTGTAGGTGATTACGGCACAGCCAAATTGTATTC +AGCAACAAAACCATCGAGGATAGCTGTGTTCTGCACACATAACTATGATAAACGATTCAAATCAGATATT +ATAGTTCTAATGTTTAATAAAAACAGCGGTATTCCATTTTGGAGCATGTACACAGGAAGTGTAACTAGTA +AAAATAGAATGTTTACCACATTGGCTAGAGGAATGCCGTTTAGATCAACGTATTGCGATAACAGACGACG +ATCAGGTTGTTATTATGCAGGAATACCATTTCATGAAGATAGTGTAGAAGCAGATATACATTATGGACCA +GAAATAATGTTAAAGGAAACATATGACATAAACAGTATTGACCCACGAGTTATAACAAAGTCAAAGACCC +ATTTTCCTACTCCATTGAGTGTAAAATTCATGGTTGACAATTTAGGAAATGGATATGACAACCCTAATTC +ATTTTGGGAAGATGCTAAAACTAAGAAACGGACATATAGTGCAATGACGATAAAAGTCCTACCATGTACA +GTGAGAAATAAAAATATAGACTTTGGATATAACTATGGAGATATTATTTCTAATATGGTTTATCTACAAT +CTACTAGTCAGGATTATGGAGATGGTACCAAATATACATTTAAATCCGTAACTAGATCAGATCATGAGTG +TGAATCTAGCTTAGATCTGACGTCTAAGGAAGTAACTGTGACATGTCCTGCGTTTAGTATACCAAGAAAT +ATATCAACATATGAAGGTCTATGCTTTAGTGTTACTACATCTAAAGATCATTGTGCTACAGGTATTGGTT +GGTTAAAATCTAGTGGCTATGGGAAGGAAGATGCTGATAAACCACGTGCTTGTTTTCATCATTGGAATTA +TTACACACTGTCGTTGGATTATTACTGTTCATACGAAGATATTTGGAGAAGCACCTGGCCTGACTATGAT +CCATGTAAGTCATATATCCATATAGAGTATAGAGATACATGGATAGAATCTAACGTGTTACAGCAACCTC +CTTACACATTCGAATTCATTCATGACAATTCTAACGAATATGTGGATAAAGAAATTAGTAACAAATTAAA +TGATCTGTACAATGAATACAAGAAGATTATGGAATATAGCGACGGATCATTGCCGGCGTCTATAAACAGA +TTAGCAAAGGCATTGACTTCAGAGGGTAGAGAAATAGCAAGTGTTAATATAGATGGTAATCTGTTAGATA +TCGCATATCAAGCAGATAAGGAAAAGATGGCCGACATACAGACAAGAATAAATGATATTATTAGAGATTT +GTTTATACACACTCTATCAGACAAAGATATAAAAGACATTATAGAATCCGAAGAAGGTAAGAGATGTTGT +ATAATAGATGTTAAGAACAATCGTGTTAAAAAGTACTATTCTATTGATAATTATCTATGCGGTACTTTAG +ATGATTATATATACACCGTTGTAGAATATAACAAATCCTATGTGTTAGTAAACGATACTTATATGAGCTA +TGACTATCTTGAATCATCAGGTGTAGTTGTTCTATCATGTTATGAAATGACTATAATCTCCTTGGATACA +AAAGACGCCAAAGATGCTATAGAAGATGTGATAGTAGCAAGTGCGGTAGCCGAAGCATTGAATGACATGT +TTAAGGAATTTGATAAAAACGTAAGTGCTATTATAATAAAAGAAGAAGATAATTATCTAAACAGTTCGCC +CGATATCTACCATATAATATATATCATAGGTGGCACTATTCTGCTATTGTTAGTCATTATTTTAATATTG +GCAATTTATATAGCGCGCAATAAATACAGAACCAGGAAATATGAAATAATGAAATATGACAATATGAGCA +TTAAATCTGATCATCATGATAGTCTTGAAACAGTGTCTATGGAAATTATTGATAATCGGTACTAATAAAA +TAGTTTAACTCTTTTAGAACCAGTTTGGTACTGTAATTTCAGTTCATTACTCGTTGAGAATATTGATGAT +TTTTTTTAAAATGAGTATCGGTAGTTACATATTACCATATCATCCATTATATAATCGATGATGCATGTAT +TAAAATACTTTCCGAATAAGTCTTCTAAATATTGTATTAATTATGAAAAACTATGCTATGTGAGATGATT +CAAAGATGTTTAATGATACGATACTAGATTTTATCTCTAGCGAGATTGTTTAGAATCATTTATCATAACT +ATGTTTAATAAATTCATCAACGAATATCGATAAAGACCTCTTGTAATTCGAGTATAGGAAGCAGTATTAC +CATATCAACTTCCGAGTTAACAATTACTCTAAAACATGAGGATTGTACTCCTGTCTTTATTGGAGATTAC +TATTCAGTCGTTGATAAACTAGTAACCTCAGGTTTCTTTACAAACGATAAAGTACAACATCAAGACCTCA +CAACGCAGTGCAAGATTAATCTAGAAATCAAATGTAATTATGGAGGAGAATCTAGACAACTAACACCCAC +GGCGAAGTATACTTTATGCCTCATTCAGAAACGGTAACTGTAGTAGGAGACTGTCTCTCTAATCTCGATG +TATATATAATATATACCAATACGGACGCGATATATTCCGACATGAATGGCGTCGCTTATCATATGTTATA +TCCTAAATGTTGATCATATTCCACAAATGATTGTGAACGAGATTAAATCATCTAACAAATAATTAGTTTT +TATGACATTAACATATAATAAATAAATTAATCATTATTGACTTAACGATGACGAAAGTTATCATCATCTT +AGGATTCTTGATTATTAATACAAATTCGTTGTGTCTATGAAATGTGAACAATGTGTCTCATATTATAATA +CACAAGAATTAAAGTGTTGTAAACTATCTAAGCCAGGAACATATTCAGATCATCGATGTGATAAATACAG +CGATACCATCTGTGGACATTGTCCAAGTGACACATTCACGTCAATATATAATCGTTCTCCTCGGTGTCAT +AGTTGTAGAGGTCACACCTTGTACACCTACCACAAATAGAATCTGTCATTGTGACTCGAATAGTTATCGT +CTCCTTAAAGCTTCTGATGGTAACTGTGTTACATGTGCTCCTAAAACAAAATATGGTCGTGTGTACGGAA +AGAAAGGAGAAAATGATATGGAATACCATTTGTAAGAAATGTCGGAAGGGTACTTATTCAGATATTGTAT +CTGACTCTGATCAATGTAAACCTATGACAAGATAAGACTTACTCGCATCTACTGGATAGACATAAATATC +CTCCTCGTAATAATGAAATATAATATAATATACACTAATTATTAATATCAATCGAGTATTAACATATAAG +TTATTTTTAAACCCCTTTTGGGTTCCGTCCTAAACGGCGTTTCGGTCTGTGTCGCCACCATGGTCACACC +GAGCCTCTGCGTGCTCCTCCATCGAGGACGACTTCAACTATGACAGCTCGGTGGCGTCTGCCAGCGTGCA +CATACGAATGGCATTTCTAAGAAAAGTCTACGGTATCCTTGTCTACAATTTCCTTTAACAACGGCAACAG +CTGCAGTATTTTTATACTTTGAATGCATTCGGACATTTATACAAGGGAGTCCTGTTCTAATATTGGCATC +AATGTTCGGATCTATAGGCTTGATTTTCGCATTGACTTTACACAGACATAAACATCCCCTGAATCTGTAC +CTACTTTGTGGATTTACACTGTTAGAATCTCTAACGCTGGCCTCTGTTGTTACTTTCTATGATGCGCGTA +TCGTTATACAAGCTTTCATGTTGACTACTGCAGTGTTTCTTGCTCTGACTACATGTACTCTACAATCAAA +GAGAGATTTCAGTAAACTTGTAACAGGATTGTTTGCTGCTTTCTGGATTTTAATTTTGTCAGGAGTCTTG +AGGATAAAGTTTAAAATAGAATTAATAAAGAACATATAGGTCATTTTTTAAACATGGATAGAAACCAAGG +TTGTTAGTTAATAATATACAAGATATTTTTTCTCACTCTGATCCATGTAAACCAAGGACGAGAGACACTC +TCATTCCTCATTCACGACACCATTAAAAATGGAAATTAAAGCCCTCTATTAAGCACAGACGGCTACAGGT +CTACCATCAGGTTAACCTTCGTCTACCTTCACAATGGCCTTTCCTTGTGCCCAGTTCAGTCCCTGTCATT +GCCACGCTACTAAGGACTCCCTGAATACCGTGACTGACGTCAGACATTGTCTGACTGAATACATCCTGTG +GGTTTCTCATAGATGGACCCATAGAGAAAGCGCAGGGCCTCTCTACAGGCTTCTCATCTCTTTCAGAATT +GATGCAATGGAGCTATTTGGTAGCGAGTTGAAGGAGTTCTCGGATTCACTTCCGTGGGACAATATCGACA +ATTGCGTGGAGATCATTAAATGTTTCATCAGAAATGACTCCATGAAAACCGCCAAAGAACTTTGTGCAAT +AATTGGACTTTGTACTCAATCAGCTATTGTCACTGGAAGAGTCTTCAATGATAAGTATATCGACATACTA +CTTATGCTGCGAAAGATTCTGAATGAGAACGACTATCTCACCCTCTTGGATCATATCCTCACTGCTAAAT +ACTAAATCTCCTTCATGCTCTCTCACTAATACTCTTACTCACTACACTTTTTATCATCTTATGATGAATG +ATTGCCTTCATCATTTTTCGTGGAATATAATATAGGAATAATTAGCACCAGAATAGCTATGGATATCTCG +TTAAGAATATTCTCGATAAGAGACATAATGTAGACATAGTTATTATATCCTTCTTAGATAAGTGTTACGC +TACTGGAAAGTTTCCATCGTTATTATTACGTGAAGATGATATCATTAAACCAACATTGAGATTGGCTCTT +ATGTTAGCTGGATTGAATTACTGTAATAAATGCATCGAGTATAGAGGGATATAGCAATTCTCGATAATAG +TCATGCAATATTTGAATGAGACTGATAATTTAGGTAATACAGTACTACACACACATATCTTTCTAGATTA +TATATCGTTAAAAATCTGTAAGAGGTATATTTCTCATAAGTATCCACTGTGTAATATTATTAATGGATAT +ATAGATAACACAATAGGGACTAATAGTATTGTAAAAGATATAATCGACTATTTGTACATATCCAGATATC +TATATTCCTACTAGTTTGCTGCGTAGTTGCATCATTGATATGCATGATTTATCAGGATTCAGAGATGAAT +TACTAAGTAAACTACAATCCCACAATAAGTAAGAATCAAATATCAAAAACTCACTTTTGATTTTTCTAGT +CTTAAGTAATACATATATTTATTAATAGACCTATGAAATAAAAAAGTTAACAATGGATTCGCGTATAGCT +ATTTACGTATTAGTATCGGCATCTCTTTTGTATCTTGTTAATTGTCACAAACTAGTACATTACTTCAATC +TGAAAATAAATGGAAGTGATATAACTAATACAGCAGATATATTGCTGGACAATTATCCAATTATGACCTT +TGATGGAAAGGATATTTATCCATCTATCGCGTTCATGGTCGGTAATAAACTTTTCCTAGATCTTTATAAA +AATATCTTTGTAGAATTTTTCAGACTATTTCGAGTATCTGTAAGTAGTCAATACGAGGAATTAGAATATT +ATTATTCATGTGATTATACTAACAACCGTCCTACAATTAAACAACATTACTTTTATAACGGCGAAGAATA +TACTGAAATTGATAGATCGAAAAAAGCCACTAATAAAAACAGTTGGTTAATTACTTCAGGCTTTAGACTA +CAAAAATGGTTCGATAGCGAAGATTGTATAATTTATCTCAGATCTTTAGTTAGAAGAATGGAAGACAGTA +ACAAAAACAGTAAAAAAACTTAGTACTTAGATATCGAAAAAAAATATATTTTTGTAGACTCTTGAGAATA +GAAGGAAAACATGTACATAATTATAAAAAATGAAAATCAATGGCGAATAAGACAGTGCGATTCGCGCCAT +GGAGTCGGCAGATTTCATGGCTGTCGATGAGCAGTTTCACGACGACCTCGATCTTTGGTCATTATCTTTG +GTAGATGACTATAAAAAACATGGATTAGGTGTTGACTGTTATGTTCTAGAACCAGTTGTTGACAGGAAAA +TATTTGATAGATTTCTCCTTGAACCAATTTGTGATCCTGTAGATGTTCTGTATGATTATTTTAGGATTCA +TAGAGATAATATTGATCAGTATATAGTAGATAGACTGTTTGCATATATTACATATAAAGATATTATATCT +GCATTAGTGTCAAAGAATTATATGGAAGATATTTTCTCTATAATTATTAAGAATTGTAATTCTGTACAAG +ATCTCTTACTTTACTATCTATCTAATGCATATGTAGAAATAGACATTGTTGATTTTATGGTAGATCATGG +GGCTGTAATATATAAAATAGAATGCTTGAATGCCTATTTTAGGGGAATATGTAAAAAGGAAAGTAGTGTT +GTTGAGTTTATTTTGAATTGTGGTATCCCAGATGAAAATGATGTTAAATTAGATCTATATAAAATAATTC +AGTATACTAGGGGATTCCTTGTAGATGAACCCACAGTATTAGAAATTTATAAGCTTTGTATCCCATATAT +TGAAGATATCAATCAACTAGATGCTGGTGGAAGGACCTTGCTTTATCGCGCTATCTATGCAGGTTATATA +GATTTAGTATCATGGCTATTAGAAAATGGAGCAAATGTCAACGCAGTAATGAGTAATGGATATACATGTC +TTGACGTGGCCGTGGATAGGGGATCTGTCATCGCCCGTAGGGAAACACATCTTAAAATATTAGAAATATT +GCTTAGAGAACCATTGTCTATTGACTGTATAAAATTAGCTATACTTAATAATACAATTGAAAACCATGAT +GTGATAAAGCTCTGTATCAAGTATTTTATGATGGTAGATTATTCACTTTGTAATGTGTATGCATCATCAC +TCTTTGATTATATAATTGATTGTAAACAAGAATTGGAGTACATTAGGCAGATGAAAATTCATAATACAAC +CATGTATGAGTTAATCTATAATAGAGACAAAAACAAGCATGCTTCCCATATTCTACATAGGTATTCTAAA +CATCCAGTTTTGACACAGTGTATCACTAAAGGATTCAAGATTTACACAGAAGTAACCGAGCAGGTCACTA +AAGCTCTAAACAGACGTGCTCTAATAGATGAGATAATAAACAATGTATCAACTGATGACAATCTCCTATC +AAAACTTCCATTAGAAATTAGGGATCTAATTGTTTCACAAGCTGTCATATAGAGTTCTCTCCACCCACCT +TTCTTGAAATGAGTTAATAGTCATAAGTTAGTTAAGTCATAAGTTAGTTTTATAAGTTAGTTTATAGTCT +AACACTTCTAATTTTTATACCTTGATCTTTTTCTCTAATTATGAAAAAGTAAATCATTATGAAGATGGAT +GAAAATGGACGAGATTGTGCGCATCGTTAACGATAGTATGTGGTACGTACCTAACGCATTTATGGACGAC +GGTGATAATGAAGGTCACATTTCTGTCAATAATGTCTGTCATATGTATCTCGCATTCTTTGATGTGGATA +TATCATCTCATCTGTTTAAATTAGTTATTAAACACTGCGATCTGAATAAACGACTAAAATGTGGTAACTC +TCCATTACATTGCTATACGATGAATACACGATTTAATCCATCTGTATTAAAGATATTGTTACGCCACGGC +ATGCGTAACTTTGATAGCAAGGATAAAAAAGGACATATTCCTCTACACCACTATCTGATTCATTCACTAT +CAATCGATAACAAGATCTTTGATATACTAACGGACCCCATTGATGACTTTAGTAAATCATCCGATCTATT +GCTGTGTTATCTTAGATATAAATTCAATGGGAGCTTAAACTATTACGTTCTGTACAAATTATTGACTAAA +GGATCTGACCCTAATTGCGTCGATGAGGATGGACTCACTTCTCTTCATTACTACTGTAAACACATATCCG +TGTTCCACGAAAGCAATTATTACAAGTCAAAGAGTCACACTAAGATGCGAGCTGAGAAGCGATTCATCTA +CGCGATAATAGATCATGGAGCAAACATTAACGCGGTTACGAAAATCGGAAATACGCCGTTACACACTTAC +CTTCAACAGTATACCAAACATAGTCCTCGTGTGGTGTATGCTCTTTTATCTCGAGGAGCCGATACGAGGA +TACGTAATAATCTTGATTGTACACCCATCATGGAATACATAAAGAACGATTGTGCAACAGGTCATATTCT +CATAATGTTACTCAATTGGCACGAACAAAAATACGGGAAATTACAAAAGGAAGAAGGACAACATCTACTT +TATCTATTCATAAAACATAATCAAGGATATGGAAGTCGCTCTCTCAATATACTACGGTATCTACTAGATA +GATTCGACATTCAGAAAGACGAATACTATAATACAATGACTCCTCTTCATACCGCCTTCCAGAATTGCAA +TAACAATGTTGCCTCATACCTCGTATACATCGGATACGACATCAACCTTCCGACTAAAGACGATAAGACA +GTATTCGACTTGGTGTTTGAAAACAGAAACATCATATACAAGGCGGATGTCGTTAATGACATCATCCACC +ACAGACTGAAAGTATCTCTACCTATGATTAAATCGTTGTTCTACAAGATGTCGGAGTTCTCTCCCTACGA +CGATCACTACGTAAAGAAGATAATAGCCTACTGCCTATTAAGGGACGAGTCATTTGCGGAACTACATACT +AAATTCTGTTTAAACGAGGACTATAAAAGTGTATTTATGAAAAATATATCATTCGATAAGATAGATTCCA +TCATCGAAAAATGTAGTCGTGACATAAGTCTCCTCAAAGAGATTCGAATCTCAGACACCAACTTGTATAC +GGTATTGAGAACAGAAGACATCCGGTATCACACCTATCTCGAAGCCATACATTCAGACAAACGCATTTCA +TTTCCCATGTACGACGATCTCATAGAACAGTGTCATCTATCGATGGAGCATAAAAGTAAACTCGTCGACA +AAGCACTCAATAAATTAGAGTCTACCATCGATAGTCAATCTAGACTATCGTATTTGCCTCCGGAAATTAT +GCGCAATATCATAACCAAGCTAAGCGACTACCATCTAAACAGTATGTTGTACGGAAAGAACCATTACAAA +TATTATCCATGATAGAAAGAAAATATTTAAAAAATAATCTATATGATTGGAGAAGTAGGAAACAAACAGT +AACAAGACGACGATTACTACTATTATTAAATCATGAGGTCCGTATTATACTCGTATATATTGTTTCTCTC +ATGTATAATAATAAACGGAAGAGATTTAGCACCACATGCACCATCCAATGGAAAATGTAAAGACAACGAA +TACAGAAGCCGTAATCTATGTTGTCTATCGTGTCCTCCGGGAACTTACGCTTCCAGATTATGTGATAGCA +AGACTAATACACAATGTACGCCGTGTGGTTCGGATACCTTTACATCTCACAATAATCATTTACAGGCTTG +TCTAAGTTGTAACGGAAGATGTGATAGTAATCAGGTAGAGACGCGATCGTGTAACACGACTCACAATAGA +ATCTGTGAATGCTCTCCAGGATATTATTGTCTTCTCAAAGGATCATCAGGGTGTAGAACATGTATTTCTA +AAACAAAGTGTGGAATAGGATACGGAGTATCCGGATACACGTCTACCGGAGACGTCATCTGTTCTCCGTG +TGGTCCCGGAACATATTCTCACACCGTCTCTTCCACAGATAAATGCGAACCCGTAACCAGCAATACATTT +AACTATATCGATGTGGAAATTAACCTGTATCCAGTCAACGACACATCGTGTACTCGGACGACCACTACCG +GTCTCAGCGAATCCATCTCAACGTCGGAACTAACTATTACCATGAATCATAAAGATTGTGATCCCGTCTT +TCGTGCAGAATACTTCTCTGTCCTTAATAATGTAGCAACTTCAGGATTCTTTACAGGAGAAAATAGATAT +CAGAATACTTCAAAGATATGTACTCTGAATTTCGAGATTAAATGTAACAACAAAGATTCATCTTCCAAAC +AGTTAACGAAAACAAAGAATGATACTATCATGCCGCATTCAGAGACGGTAACTCTAGTGGGCGACTGTCT +ATCTAGCGTCGACATCTACATACTATATAGTAATACCAATACTCAAGACTACGAAACGGATACAATCTCT +TATCATATGGGTAATGTTCTCGATGTCAATAGCCATATGCCCGCTAGTTGCGATATACATAAACTGATCA +CTAATTCCCAGAATCCCACCCACTTATAGTAAGTTTTTTTTTACCCATAAATAATAAATACAATAATTAA +TTTCTCGTAAAAGTAGAAAATATATTCTAATTTATTATATGGTAAGAAAGTAGAATCATCTAGAACAGTA +ATCAATCAATAGCAATCATGAAACAATATATTGTCCTGGCATGCATGTGCCTAGTGGCAGCTGCTATGCC +TACTAGTCTTCAACAATCCTCATCCTCGTGTACTGAAGAAGAAAACAAACATCATATGGGAATCGATGTT +ATTATCAAAGTCACAAAGCAAGACCAAACACCGACCAATGATAAGATTTGTCAATCCGTAACGGAAGTTA +CAGAGACCGAAGATGATGAGGTATCCGAAGAAGTTGTAAAAGGAGATCCCACCACTTATTACACTATCGT +CGGCGCGGGTCTTAACATGAACTTTGGATTCACCAAATGCCCAAAGATTTCATCCATCTCCGAATCCTCT +GATGGAAACACTGTGAATACTAGATTGTCCAGCGTGTCACCAGGACAAGGTAAGGACTCTCCCGCGATCA +CGCGTGAAGAAGCTCTGGCTATGATCAAAGACTGTGAGATGTCTATCGACATCAGATGTAGCGAAGAAGA +GAAAGACAGCGACATCAAGACCCATCCAGTACTTGGGTCTAACATCTCACATAAGAAAGTGAGTTACAAA +GATATCATCGGTTCAACGATCGTTGATACAAAATGTGTTAAGAACCTAGAGTTTAGCGTACGTATCGGAG +ACATGTGTGAGGAATCATCTGAACTTGAAGTCAAGGATGGATTCAAGTATGTCGACGGATCGGCATCTGA +AGGTGCAACCGATGATACTTCACTCATCGATTCAACAAAACTCAAAGCATGTGTCTGAATCGATAACTCT +ATTCATCTGAAAATGGATGAGTTGGGTTAATCGAACGATTCAGACACCGCACCACGAATTAAAAAAGTGT +ACCGGGTACTATATTCCGGTTTGCAAAACAAAAATGTTTAACTACATTCACAAAAAGTTACCTCTCGTTA +CTTCTTCTTTCTGTTTCAATATGTGATACGATATGATCACTATTCGTATTCTCTTTCTCTCTTGTCTCAT +AAAAAGTTTTACAAAAAAATATTTTTATTCTCTTTCTCTCTTCGATGGTCTCACAAAAATATTAAACCTC +TTTCTGATGTCTCAACTATTTCGTAAACGATAACGTCCAACAATATATTCTCGTAGAGCTTATCAATATC +CTTATGCCAATCTAGGTTGTCAGACAATTGCATCATAAAATAATGTTTATAATTTACACGTTAACATCAT +ATAATAAACGTATATAGTTAATATTTTTGGAATATAAATGATCTGTAAAATCCATGTAGGGGACACTGCT +CACGTTTTTTCTCTAGTACATAATTTCACACAAGTTTTTATACAGACAAATTAATTCTCGTCCATATATT +TTAAAACATTGACTTTTGTACTAAGAAAAATATCTTGACTAACCATCTCTTTCTCTCGTCGATGGGTCTC +ACAAAAATATTAAACCTCTTTCTGATGGAGTCGTAAAAAGTTTTTATCCTTTCTCTCTTCGATGGGTCTC +ACAAAAATATTAAACCTCTTTCTGATGGTCTCTATAAACGATTGATTTTTCTTACCCTCTAGAGTTTCCT +ACGGTCGTGGGTCACACATTTTTTTCTAGACACTAAATAAAATAGTAAAATTAAATTAATTATAAAATTA +TGTATATAATTTACTAAC + diff --git a/assets/NC_003310_clade_I.fasta.fai b/assets/NC_003310_clade_I.fasta.fai new file mode 100644 index 0000000..c7dbeaf --- /dev/null +++ b/assets/NC_003310_clade_I.fasta.fai @@ -0,0 +1 @@ +NC_003310.1 196858 46 70 71 From 9f324eebb8c24463354427bf2dd2dfdbca0ddadd Mon Sep 17 00:00:00 2001 From: ufp0 Date: Mon, 9 Sep 2024 11:21:30 -0400 Subject: [PATCH 17/42] added clade I gff and updated nextflow.config --- assets/NC_003310.gff3 | 393 +++++++++++++++++++++++++++++ assets/NC_003310_clade_I.fasta | 0 assets/NC_003310_clade_I.fasta.fai | 0 nextflow.config | 18 +- 4 files changed, 407 insertions(+), 4 deletions(-) create mode 100755 assets/NC_003310.gff3 mode change 100644 => 100755 assets/NC_003310_clade_I.fasta mode change 100644 => 100755 assets/NC_003310_clade_I.fasta.fai diff --git a/assets/NC_003310.gff3 b/assets/NC_003310.gff3 new file mode 100755 index 0000000..38c95fa --- /dev/null +++ b/assets/NC_003310.gff3 @@ -0,0 +1,393 @@ +##gff-version 3 +#!gff-spec-version 1.21 +#!processor NCBI annotwriter +##sequence-region NC_003310.1 1 196858 +##species https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=10244 +NC_003310.1 RefSeq region 1 196858 . + . ID=NC_003310.1:1..196858;Dbxref=taxon:10244;collection-date=1996;country=Zaire: Sankuru subregion%2C Kasdai Oriental;gbkey=Src;genome=genomic;genotype=MPXV clade 1;mol_type=genomic DNA;nat-host=Homo sapiens;note=isolated in rhesus monkey kidney cell culture LLC-MK2 from a scab sample of a monkeypox patient residing in the Sankuru subregion%2C Kasdai Oriental%2C Zaire during a human monkeypox outbreak in 1996;strain=Zaire-96-I-16 +NC_003310.1 RefSeq long_terminal_repeat 1 6378 . - . ID=id-NC_003310.1:1..6378;gbkey=repeat_region;rpt_type=long_terminal_repeat +NC_003310.1 RefSeq gene 871 1611 . - . ID=gene-MPXV_gp001;Dbxref=GeneID:928994;Name=OPG001;gbkey=Gene;gene=OPG001;gene_biotype=protein_coding;locus_tag=MPXV_gp001 +NC_003310.1 RefSeq CDS 871 1611 . - 0 ID=cds-NP_536428.1;Parent=gene-MPXV_gp001;Dbxref=GenBank:NP_536428.1,GeneID:928994;Name=NP_536428.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: J1L%3B Chemokine binding protein (Cop-C23L)%3B most abundant secreted protein%3B CC-chemokine binding%3B similar to VACV-WR J1L and VACV-Cop C23L;gbkey=CDS;gene=OPG001;locus_tag=MPXV_gp001;product=Chemokine binding protein;protein_id=NP_536428.1 +NC_003310.1 RefSeq gene 1740 2786 . - . ID=gene-MPXV_gp002;Dbxref=GeneID:928919;Name=OPG002;gbkey=Gene;gene=OPG002;gene_biotype=protein_coding;locus_tag=MPXV_gp002 +NC_003310.1 RefSeq CDS 1740 2786 . - 0 ID=cds-NP_536429.1;Parent=gene-MPXV_gp002;Dbxref=GenBank:NP_536429.1,GeneID:928919;Name=NP_536429.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: J2L%3B TNF receptor (CrmB)%3B similar to VACV-WR J2L and VACV-Cop C22L;gbkey=CDS;gene=OPG002;locus_tag=MPXV_gp002;product=Crm-B secreted TNF-alpha-receptor-like protein;protein_id=NP_536429.1 +NC_003310.1 RefSeq gene 2877 4640 . - . ID=gene-MPXV_gp003;Dbxref=GeneID:929051;Name=OPG003;gbkey=Gene;gene=OPG003;gene_biotype=protein_coding;locus_tag=MPXV_gp003 +NC_003310.1 RefSeq CDS 2877 4640 . - 0 ID=cds-NP_536430.1;Parent=gene-MPXV_gp003;Dbxref=GenBank:NP_536430.1,GeneID:929051;Name=NP_536430.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: J3L%3B Ankyrin%3B similar to VACV-WR J3L and VACV-Cop C19L;gbkey=CDS;gene=OPG003;locus_tag=MPXV_gp003;product=Ankyrin repeat protein (25);protein_id=NP_536430.1 +NC_003310.1 RefSeq gene 4797 6110 . - . ID=gene-MPXV_gp004;Dbxref=GeneID:928899;Name=OPG015;gbkey=Gene;gene=OPG015;gene_biotype=protein_coding;locus_tag=MPXV_gp004 +NC_003310.1 RefSeq CDS 4797 6110 . - 0 ID=cds-NP_536431.1;Parent=gene-MPXV_gp004;Dbxref=GenBank:NP_536431.1,GeneID:928899;Name=NP_536431.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: D1L%3B Ankyrin%3B similar to VACV-WR D1L and CPXV-017;gbkey=CDS;gene=OPG015;locus_tag=MPXV_gp004;product=Ankyrin repeat protein (39);protein_id=NP_536431.1 +NC_003310.1 RefSeq sequence_feature 6226 6375 . - . ID=id-NC_003310.1:6226..6375;Note=OPG016;gbkey=misc_feature +NC_003310.1 RefSeq sequence_feature 6398 6840 . - . ID=id-NC_003310.1:6398..6840;Note=OPG017;gbkey=misc_feature +NC_003310.1 RefSeq sequence_feature 6921 7439 . - . ID=id-NC_003310.1:6921..7439;Note=OPG018;gbkey=misc_feature +NC_003310.1 RefSeq gene 7556 7984 . + . ID=gene-MPXV_gp005;Dbxref=GeneID:928882;Name=OPG019;gbkey=Gene;gene=OPG019;gene_biotype=protein_coding;locus_tag=MPXV_gp005 +NC_003310.1 RefSeq CDS 7556 7984 . + 0 ID=cds-NP_536433.1;Parent=gene-MPXV_gp005;Dbxref=GenBank:NP_536433.1,GeneID:928882;Name=NP_536433.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: D3R%3B secreted growth factor Secreted EGF-like protein%3B similar to VACV-WR D3R and VACV-Cop C11R;gbkey=CDS;gene=OPG019;locus_tag=MPXV_gp005;product=EGF-like domain protein;protein_id=NP_536433.1 +NC_003310.1 RefSeq sequence_feature 8111 9081 . - . ID=id-NC_003310.1:8111..9081;Note=OPG020;gbkey=misc_feature +NC_003310.1 RefSeq gene 9567 10295 . + . ID=gene-MPXV_gp006;Dbxref=GeneID:928906;Name=OPG021;gbkey=Gene;gene=OPG021;gene_biotype=protein_coding;locus_tag=MPXV_gp006 +NC_003310.1 RefSeq CDS 9567 10295 . + 0 ID=cds-NP_536435.1;Parent=gene-MPXV_gp006;Dbxref=GenBank:NP_536435.1,GeneID:928906;Name=NP_536435.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: D5R%3B Zinc finger-like protein%3B zinc binding%3B virosome localization%3B virulence factor%3B inhibition of apoptosis induced by UV irradiation%3B similar to VACV-WR D5R;gbkey=CDS;gene=OPG021;locus_tag=MPXV_gp006;product=Zinc finger-like protein (2);protein_id=NP_536435.1 +NC_003310.1 RefSeq gene 10523 10903 . - . ID=gene-MPXV_gp007;Dbxref=GeneID:929030;Name=OPG022;gbkey=Gene;gene=OPG022;gene_biotype=protein_coding;locus_tag=MPXV_gp007 +NC_003310.1 RefSeq CDS 10523 10903 . - 0 ID=cds-NP_536436.1;Parent=gene-MPXV_gp007;Dbxref=GenBank:NP_536436.1,GeneID:929030;Name=NP_536436.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: D6L%3B secreted IL-18 binding protein%3B Soluble IL-18 binding protein (Bsh-D7L)%3B similar to VACV-WR D6L;gbkey=CDS;gene=OPG022;locus_tag=MPXV_gp007;product=Interleukin-18-binding protein;protein_id=NP_536436.1 +NC_003310.1 RefSeq gene 10963 12945 . - . ID=gene-MPXV_gp008;Dbxref=GeneID:928974;Name=OPG023;gbkey=Gene;gene=OPG023;gene_biotype=protein_coding;locus_tag=MPXV_gp008 +NC_003310.1 RefSeq CDS 10963 12945 . - 0 ID=cds-NP_536437.1;Parent=gene-MPXV_gp008;Dbxref=GenBank:NP_536437.1,GeneID:928974;Name=NP_536437.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: D7L%3B host range%3B ankyrin-like%3B Ankyrin/Host Range (Bang-D8L)%3B similar to VACV-WR D7L;gbkey=CDS;gene=OPG023;locus_tag=MPXV_gp008;product=Ankyrin repeat protein (2);protein_id=NP_536437.1 +NC_003310.1 RefSeq gene 13079 13273 . - . ID=gene-MPXV_gp009;Dbxref=GeneID:928911;Name=OPG024;gbkey=Gene;gene=OPG024;gene_biotype=protein_coding;locus_tag=MPXV_gp009 +NC_003310.1 RefSeq CDS 13079 13273 . - 0 ID=cds-NP_536438.1;Parent=gene-MPXV_gp009;Dbxref=GenBank:NP_536438.1,GeneID:928911;Name=NP_536438.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: D8L%3B ANK-containing protein%3B similar to VACV-WR D8L;gbkey=CDS;gene=OPG024;locus_tag=MPXV_gp009;product=retroviral pseudoprotease-like protein;protein_id=NP_536438.1 +NC_003310.1 RefSeq gene 13433 15325 . - . ID=gene-MPXV_gp010;Dbxref=GeneID:928983;Name=OPG025;gbkey=Gene;gene=OPG025;gene_biotype=protein_coding;locus_tag=MPXV_gp010 +NC_003310.1 RefSeq CDS 13433 15325 . - 0 ID=cds-NP_536439.1;Parent=gene-MPXV_gp010;Dbxref=GenBank:NP_536439.1,GeneID:928983;Name=NP_536439.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: D9L%3B ankyrin-like%3B Type I IFN resistance%3B similar to VACV-WR D9L and VACV-Cop C9L;gbkey=CDS;gene=OPG025;locus_tag=MPXV_gp010;product=Ankyrin repeat protein (14);protein_id=NP_536439.1 +NC_003310.1 RefSeq sequence_feature 15368 15910 . - . ID=id-NC_003310.1:15368..15910;Note=OPG026;gbkey=misc_feature +NC_003310.1 RefSeq gene 15980 16432 . - . ID=gene-MPXV_gp011;Dbxref=GeneID:929018;Name=OPG027;gbkey=Gene;gene=OPG027;gene_biotype=protein_coding;locus_tag=MPXV_gp011 +NC_003310.1 RefSeq CDS 15980 16432 . - 0 ID=cds-NP_536440.1;Parent=gene-MPXV_gp011;Dbxref=GenBank:NP_536440.1,GeneID:929018;Name=NP_536440.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: D10L%3B host range%3B Type 1 IFN inhibitor%3B similar to VACV-WR D10L and VACV-Cop C7L;gbkey=CDS;gene=OPG027;locus_tag=MPXV_gp011;product=Host range protein;protein_id=NP_536440.1 +NC_003310.1 RefSeq gene 16661 17122 . - . ID=gene-MPXV_gp012;Dbxref=GeneID:928928;Name=OPG029;gbkey=Gene;gene=OPG029;gene_biotype=protein_coding;locus_tag=MPXV_gp012 +NC_003310.1 RefSeq CDS 16661 17122 . - 0 ID=cds-NP_536441.1;Parent=gene-MPXV_gp012;Dbxref=GenBank:NP_536441.1,GeneID:928928;Name=NP_536441.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: D11L%3B Putative tlr signaling inhibitor%2C IFN-beta inhibitor%3B similar to VACV-WR D11L and VACV-Cop C6L;gbkey=CDS;gene=OPG029;locus_tag=MPXV_gp012;product=Bcl-2-like protein;protein_id=NP_536441.1 +NC_003310.1 RefSeq gene 17266 17886 . - . ID=gene-MPXV_gp013;Dbxref=GeneID:929027;Name=OPG030;gbkey=Gene;gene=OPG030;gene_biotype=protein_coding;locus_tag=MPXV_gp013 +NC_003310.1 RefSeq CDS 17266 17886 . - 0 ID=cds-NP_536442.1;Parent=gene-MPXV_gp013;Dbxref=GenBank:NP_536442.1,GeneID:929027;Name=NP_536442.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: D12L%3B BTB domain of kelch-like protein%3B Kelch-like protein%3B similar to VACV-WR D12L and VACV-Cop C5L;gbkey=CDS;gene=OPG030;locus_tag=MPXV_gp013;product=Kelch-like protein (1);protein_id=NP_536442.1 +NC_003310.1 RefSeq gene 17931 18878 . - . ID=gene-MPXV_gp014;Dbxref=GeneID:928991;Name=OPG031;gbkey=Gene;gene=OPG031;gene_biotype=protein_coding;locus_tag=MPXV_gp014 +NC_003310.1 RefSeq CDS 17931 18878 . - 0 ID=cds-NP_536443.1;Parent=gene-MPXV_gp014;Dbxref=GenBank:NP_536443.1,GeneID:928991;Name=NP_536443.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: D13L%3B IL-1 receptor antagonist%3B similar to VACV-WR D13L and VACV-Cop C4L and C10L;gbkey=CDS;gene=OPG031;locus_tag=MPXV_gp014;product=C4L/C10L-like family protein;protein_id=NP_536443.1 +NC_003310.1 RefSeq gene 19060 19710 . - . ID=gene-MPXV_gp015;Dbxref=GeneID:928959;Name=OPG032;gbkey=Gene;gene=OPG032;gene_biotype=protein_coding;locus_tag=MPXV_gp015 +NC_003310.1 RefSeq CDS 19060 19710 . - 0 ID=cds-NP_536444.1;Parent=gene-MPXV_gp015;Dbxref=GenBank:NP_536444.1,GeneID:928959;Name=NP_536444.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: D14L%3B secreted complement binding protein%2C prevents complement activation%3B similar to VACV-WR D14L and VACV-Cop C4L;gbkey=CDS;gene=OPG032;locus_tag=MPXV_gp015;product=Complement control protein (CCP);protein_id=NP_536444.1 +NC_003310.1 RefSeq sequence_feature 19778 21291 . - . ID=id-NC_003310.1:19778..21291;Note=OPG033;gbkey=misc_feature +NC_003310.1 RefSeq gene 21366 22010 . - . ID=gene-MPXV_gp016;Dbxref=GeneID:928889;Name=OPG034;gbkey=Gene;gene=OPG034;gene_biotype=protein_coding;locus_tag=MPXV_gp016 +NC_003310.1 RefSeq CDS 21366 22010 . - 0 ID=cds-NP_536449.1;Parent=gene-MPXV_gp016;Dbxref=GenBank:NP_536449.1,GeneID:928889;Name=NP_536449.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: D19L%3B Putative TLR signalling inhibitor%3B start of ORF is missing approx. 18 AA compared to CPXVs%3B similar to VACV-WR D19L and VACV-Cop C1L;gbkey=CDS;gene=OPG034;locus_tag=MPXV_gp016;product=Bcl-2-like protein;protein_id=NP_536449.1 +NC_003310.1 RefSeq gene 22056 22409 . - . ID=gene-MPXV_gp017;Dbxref=GeneID:928890;Name=OPG035;gbkey=Gene;gene=OPG035;gene_biotype=protein_coding;locus_tag=MPXV_gp017 +NC_003310.1 RefSeq CDS 22056 22409 . - 0 ID=cds-NP_536450.1;Parent=gene-MPXV_gp017;Dbxref=GenBank:NP_536450.1,GeneID:928890;Name=NP_536450.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: P1L%3B secreted virulence factor%3B Putative tlr signaling inhibitor%3B Anti-apoptotic Bcl-2-like protein%3B similar to VACV-WR P1L and VACV-Cop N1L;gbkey=CDS;gene=OPG035;locus_tag=MPXV_gp017;product=Bcl-2-like protein;protein_id=NP_536450.1 +NC_003310.1 RefSeq gene 22536 23069 . - . ID=gene-MPXV_gp018;Dbxref=GeneID:928892;Name=OPG036;gbkey=Gene;gene=OPG036;gene_biotype=protein_coding;locus_tag=MPXV_gp018 +NC_003310.1 RefSeq CDS 22536 23069 . - 0 ID=cds-NP_536451.1;Parent=gene-MPXV_gp018;Dbxref=GenBank:NP_536451.1,GeneID:928892;Name=NP_536451.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: P2L%3B Alpha amanatin target protein%3B Putative tlr signaling inhibitor%3B similar to VACV-WR P2L and VACV-Cop #N2L;gbkey=CDS;gene=OPG036;locus_tag=MPXV_gp018;product=Bcl-2-like protein;protein_id=NP_536451.1 +NC_003310.1 RefSeq gene 23110 24438 . - . ID=gene-MPXV_gp019;Dbxref=GeneID:928893;Name=OPG037;gbkey=Gene;gene=OPG037;gene_biotype=protein_coding;locus_tag=MPXV_gp019 +NC_003310.1 RefSeq CDS 23110 24438 . - 0 ID=cds-NP_536452.1;Parent=gene-MPXV_gp019;Dbxref=GenBank:NP_536452.1,GeneID:928893;Name=NP_536452.1;Note=Taxonomic breadth: orthopoxvirus%3B Old product: O1L%3B ankyrin-like%3B ANK-containing protein%3B apoptosis inhibitor%3B start of ORF is missing approx. 31 AA compared to CPXVs%3B similar to VACV-WR O1L and VACV-Cop M1L;gbkey=CDS;gene=OPG037;locus_tag=MPXV_gp019;product=Ankyrin-like protein (1);protein_id=NP_536452.1 +NC_003310.1 RefSeq gene 24508 25170 . - . ID=gene-MPXV_gp020;Dbxref=GeneID:928894;Name=OPG038;gbkey=Gene;gene=OPG038;gene_biotype=protein_coding;locus_tag=MPXV_gp020 +NC_003310.1 RefSeq CDS 24508 25170 . - 0 ID=cds-NP_536453.1;Parent=gene-MPXV_gp020;Dbxref=GenBank:NP_536453.1,GeneID:928894;Name=NP_536453.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: O2L%3B NFkB inhibitor%3B similar to VACV-WR O2L and VACV-Cop M2L;gbkey=CDS;gene=OPG038;locus_tag=MPXV_gp020;product=NFkB inhibitor;protein_id=NP_536453.1 +NC_003310.1 RefSeq gene 25299 26153 . - . ID=gene-MPXV_gp021;Dbxref=GeneID:928903;Name=OPG039;gbkey=Gene;gene=OPG039;gene_biotype=protein_coding;locus_tag=MPXV_gp021 +NC_003310.1 RefSeq CDS 25299 26153 . - 0 ID=cds-NP_536454.1;Parent=gene-MPXV_gp021;Dbxref=GenBank:NP_536454.1,GeneID:928903;Name=NP_536454.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C1L%3B host range%3B ankyrin-like%3B Ankyrin/NFkB inhibitor%3B similar to VACV-WR C1L and VACV-Cop K1L;gbkey=CDS;gene=OPG039;locus_tag=MPXV_gp021;product=Ankyrin-like protein (3);protein_id=NP_536454.1 +NC_003310.1 RefSeq gene 26384 27511 . - . ID=gene-MPXV_gp022;Dbxref=GeneID:928904;Name=OPG040;gbkey=Gene;gene=OPG040;gene_biotype=protein_coding;locus_tag=MPXV_gp022 +NC_003310.1 RefSeq CDS 26384 27511 . - 0 ID=cds-NP_536455.1;Parent=gene-MPXV_gp022;Dbxref=GenBank:NP_536455.1,GeneID:928904;Name=NP_536455.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C2L%3B serine protease inhibitor-like%2C SPI-3%3B inhibition of the ability of infected cells to fuse%3B Serpin 1%2C2%2C3%3B similar to VACV-WR C2L and VACV-Cop K2L;gbkey=CDS;gene=OPG040;locus_tag=MPXV_gp022;product=Serpin;protein_id=NP_536455.1 +NC_003310.1 RefSeq sequence_feature 27562 27803 . - . ID=id-NC_003310.1:27562..27803;Note=OPG041;gbkey=misc_feature +NC_003310.1 RefSeq gene 27859 29133 . - . ID=gene-MPXV_gp023;Dbxref=GeneID:928909;Name=OPG042;gbkey=Gene;gene=OPG042;gene_biotype=protein_coding;locus_tag=MPXV_gp023 +NC_003310.1 RefSeq CDS 27859 29133 . - 0 ID=cds-NP_536457.1;Parent=gene-MPXV_gp023;Dbxref=GenBank:NP_536457.1,GeneID:928909;Name=NP_536457.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C4L%3B phospholipase D-like%3B Phospholipase-D-like protein%3B similar to VACV-WR C4L and VACV-Cop K4L;gbkey=CDS;gene=OPG042;locus_tag=MPXV_gp023;product=Phospholipase-D-like protein;protein_id=NP_536457.1 +NC_003310.1 RefSeq gene 29160 29990 . - . ID=gene-MPXV_gp024;Dbxref=GeneID:928910;Name=OPG043;gbkey=Gene;gene=OPG043;gene_biotype=protein_coding;locus_tag=MPXV_gp024 +NC_003310.1 RefSeq CDS 29160 29990 . - 0 ID=cds-NP_536458.1;Parent=gene-MPXV_gp024;Dbxref=GenBank:NP_536458.1,GeneID:928910;Name=NP_536458.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C5L%3B lysophospholipase-like%3B Monoglyceride lipase%3B similar to VACV-WR C5L and VACV-Cop K5L;gbkey=CDS;gene=OPG043;locus_tag=MPXV_gp024;product=Putative monoglyceride lipase;protein_id=NP_536458.1 +NC_003310.1 RefSeq gene 30126 30575 . + . ID=gene-MPXV_gp025;Dbxref=GeneID:928912;Name=OPG044;gbkey=Gene;gene=OPG044;gene_biotype=protein_coding;locus_tag=MPXV_gp025 +NC_003310.1 RefSeq CDS 30126 30575 . + 0 ID=cds-NP_536459.1;Parent=gene-MPXV_gp025;Dbxref=GenBank:NP_536459.1,GeneID:928912;Name=NP_536459.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C6R%3B Putative tlr signaling inhibitor%3B Host immune response repressor%3B similar to VACV-WR C6R and VACV-Cop #K7R%3B VAC B15R-like;gbkey=CDS;gene=OPG044;locus_tag=MPXV_gp025;product=Bcl-2-like protein;protein_id=NP_536459.1 +NC_003310.1 RefSeq gene 30619 31278 . - . ID=gene-MPXV_gp026;Dbxref=GeneID:928913;Name=OPG045;gbkey=Gene;gene=OPG045;gene_biotype=protein_coding;locus_tag=MPXV_gp026 +NC_003310.1 RefSeq CDS 30619 31278 . - 0 ID=cds-NP_536460.1;Parent=gene-MPXV_gp026;Dbxref=GenBank:NP_536460.1,GeneID:928913;Name=NP_536460.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C7L%3B Caspase-9 (apoptosis) inhibitor (mitochondrial- associated)%3B similar to VACV-WR C7L and VACV-Cop F1L;gbkey=CDS;gene=OPG045;locus_tag=MPXV_gp026;product=Caspase-9 inhibitor;protein_id=NP_536460.1 +NC_003310.1 RefSeq gene 31290 31745 . - . ID=gene-MPXV_gp027;Dbxref=GeneID:928914;Name=OPG046;gbkey=Gene;gene=OPG046;gene_biotype=protein_coding;locus_tag=MPXV_gp027 +NC_003310.1 RefSeq CDS 31290 31745 . - 0 ID=cds-NP_536461.1;Parent=gene-MPXV_gp027;Dbxref=GenBank:NP_536461.1,GeneID:928914;Name=NP_536461.1;Note=Taxonomic breadth: poxviridae%3B Old product: C8L%3B deoxyuridine triphosphatase%3B dUTPase%3B similar to VACV-WR C8L and VACV-Cop F2L;gbkey=CDS;gene=OPG046;locus_tag=MPXV_gp027;product=dUTPase;protein_id=NP_536461.1 +NC_003310.1 RefSeq gene 31762 33225 . - . ID=gene-MPXV_gp028;Dbxref=GeneID:928915;Name=OPG047;gbkey=Gene;gene=OPG047;gene_biotype=protein_coding;locus_tag=MPXV_gp028 +NC_003310.1 RefSeq CDS 31762 33225 . - 0 ID=cds-NP_536462.1;Parent=gene-MPXV_gp028;Dbxref=GenBank:NP_536462.1,GeneID:928915;Name=NP_536462.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C9L%3B kelch-like%3B Kelch-like protein%3B similar to VACV-WR C9L and VACV-Cop F3L;gbkey=CDS;gene=OPG047;locus_tag=MPXV_gp028;product=Kelch-like protein (2);protein_id=NP_536462.1 +NC_003310.1 RefSeq gene 33236 34195 . - . ID=gene-MPXV_gp029;Dbxref=GeneID:928921;Name=OPG048;gbkey=Gene;gene=OPG048;gene_biotype=protein_coding;locus_tag=MPXV_gp029 +NC_003310.1 RefSeq CDS 33236 34195 . - 0 ID=cds-NP_536463.1;Parent=gene-MPXV_gp029;Dbxref=GenBank:NP_536463.1,GeneID:928921;Name=NP_536463.1;Note=Taxonomic breadth: poxviridae%3B Old product: C10L%3B Ribonucleotide reductase small subunit%2C R2%3B similar to VACV-WR C10L and VACV-Cop F4L;gbkey=CDS;gene=OPG048;locus_tag=MPXV_gp029;product=Ribonucleotide reductase small subunit;protein_id=NP_536463.1 +NC_003310.1 RefSeq gene 34227 35180 . - . ID=gene-MPXV_gp030;Dbxref=GeneID:928936;Name=OPG049;gbkey=Gene;gene=OPG049;gene_biotype=protein_coding;locus_tag=MPXV_gp030 +NC_003310.1 RefSeq CDS 34227 35180 . - 0 ID=cds-NP_536464.2;Parent=gene-MPXV_gp030;Dbxref=GenBank:NP_536464.2,GeneID:928936;Name=NP_536464.2;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C11L%3B 36kDa major membrane protein%3B similar to VACV-WR C11L and VACV-Cop F5L;gbkey=CDS;gene=OPG049;locus_tag=MPXV_gp030;product=Telomere-binding protein I6 (1);protein_id=NP_536464.2 +NC_003310.1 RefSeq gene 35215 35436 . - . ID=gene-MPXV_gp031;Dbxref=GeneID:928939;Name=OPG050;gbkey=Gene;gene=OPG050;gene_biotype=protein_coding;locus_tag=MPXV_gp031 +NC_003310.1 RefSeq CDS 35215 35436 . - 0 ID=cds-NP_536465.1;Parent=gene-MPXV_gp031;Dbxref=GenBank:NP_536465.1,GeneID:928939;Name=NP_536465.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C12L%3B Hypothetical protein%3B similar to VACV-WR C12L and VACV-Cop F6L;gbkey=CDS;gene=OPG050;locus_tag=MPXV_gp031;product=CPXV053 protein;protein_id=NP_536465.1 +NC_003310.1 RefSeq gene 35452 35676 . - . ID=gene-MPXV_gp032;Dbxref=GeneID:928940;Name=OPG051;gbkey=Gene;gene=OPG051;gene_biotype=protein_coding;locus_tag=MPXV_gp032 +NC_003310.1 RefSeq CDS 35452 35676 . - 0 ID=cds-NP_536466.1;Parent=gene-MPXV_gp032;Dbxref=GenBank:NP_536466.1,GeneID:928940;Name=NP_536466.1;Note=Taxonomic breadth: orthopoxvirus%3B Old product: C13L%3B Hypothetical protein%3B similar to VACV-WR C13L and VACV-Cop F7L;gbkey=CDS;gene=OPG051;locus_tag=MPXV_gp032;product=CPXV054 protein;protein_id=NP_536466.1 +NC_003310.1 RefSeq gene 35828 36022 . - . ID=gene-MPXV_gp033;Dbxref=GeneID:928945;Name=OPG052;gbkey=Gene;gene=OPG052;gene_biotype=protein_coding;locus_tag=MPXV_gp033 +NC_003310.1 RefSeq CDS 35828 36022 . - 0 ID=cds-NP_536467.1;Parent=gene-MPXV_gp033;Dbxref=GenBank:NP_536467.1,GeneID:928945;Name=NP_536467.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C14L%3B Cytoplasmic protein%3B similar to VACV-WR C14L and VACV-Cop F8L;gbkey=CDS;gene=OPG052;locus_tag=MPXV_gp033;product=Cytoplasmic protein;protein_id=NP_536467.1 +NC_003310.1 RefSeq gene 36079 36717 . - . ID=gene-MPXV_gp034;Dbxref=GeneID:928949;Name=OPG053;gbkey=Gene;gene=OPG053;gene_biotype=protein_coding;locus_tag=MPXV_gp034 +NC_003310.1 RefSeq CDS 36079 36717 . - 0 ID=cds-NP_536468.1;Parent=gene-MPXV_gp034;Dbxref=GenBank:NP_536468.1,GeneID:928949;Name=NP_536468.1;Note=Taxonomic breadth: poxviridae%3B Old product: C15L%3B S-S bond formation pathway protein substrate%3B similar to VACV-WR C15L and VACV-Cop F9L;gbkey=CDS;gene=OPG053;locus_tag=MPXV_gp034;product=IMV membrane protein L1R;protein_id=NP_536468.1 +NC_003310.1 RefSeq gene 36704 38023 . - . ID=gene-MPXV_gp035;Dbxref=GeneID:928951;Name=OPG054;gbkey=Gene;gene=OPG054;gene_biotype=protein_coding;locus_tag=MPXV_gp035 +NC_003310.1 RefSeq CDS 36704 38023 . - 0 ID=cds-NP_536469.1;Parent=gene-MPXV_gp035;Dbxref=GenBank:NP_536469.1,GeneID:928951;Name=NP_536469.1;Note=Taxonomic breadth: poxviridae%3B Old product: C16L%3B serine%3B Essential Ser/Thr kinase morph%3B similar to VACV-WR C16L and VACV-Cop F10L%3B VPK2%3B regulation of virion morphogenesis;gbkey=CDS;gene=OPG054;locus_tag=MPXV_gp035;product=Serine/threonine-protein kinase;protein_id=NP_536469.1 +NC_003310.1 RefSeq gene 38046 39110 . - . ID=gene-MPXV_gp036;Dbxref=GeneID:928955;Name=OPG055;gbkey=Gene;gene=OPG055;gene_biotype=protein_coding;locus_tag=MPXV_gp036 +NC_003310.1 RefSeq CDS 38046 39110 . - 0 ID=cds-NP_536470.1;Parent=gene-MPXV_gp036;Dbxref=GenBank:NP_536470.1,GeneID:928955;Name=NP_536470.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C17L%3B RhoA signalling inhibitor%2C virus release protein%3B MC018%3B similar to VACV-WR C17L and VACV-Cop F11L;gbkey=CDS;gene=OPG055;locus_tag=MPXV_gp036;product=Protein F11;protein_id=NP_536470.1 +NC_003310.1 RefSeq gene 39154 41061 . - . ID=gene-MPXV_gp037;Dbxref=GeneID:928964;Name=OPG056;gbkey=Gene;gene=OPG056;gene_biotype=protein_coding;locus_tag=MPXV_gp037 +NC_003310.1 RefSeq CDS 39154 41061 . - 0 ID=cds-NP_536471.1;Parent=gene-MPXV_gp037;Dbxref=GenBank:NP_536471.1,GeneID:928964;Name=NP_536471.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C18L%3B actin tail formation%3B EEV maturation protein%3B similar to VACV-WR C18L and VACV-Cop F12L;gbkey=CDS;gene=OPG056;locus_tag=MPXV_gp037;product=EEV maturation protein;protein_id=NP_536471.1 +NC_003310.1 RefSeq gene 41104 42222 . - . ID=gene-MPXV_gp038;Dbxref=GeneID:928971;Name=OPG057;gbkey=Gene;gene=OPG057;gene_biotype=protein_coding;locus_tag=MPXV_gp038 +NC_003310.1 RefSeq CDS 41104 42222 . - 0 ID=cds-NP_536472.1;Parent=gene-MPXV_gp038;Dbxref=GenBank:NP_536472.1,GeneID:928971;Name=NP_536472.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C19L%3B major envelope antigen of EEV%3B wrapping of IMV to form IEV%3B phospholipase D-like%3B Palmitylated EEV membrane glycoprotein%3B similar to VACV-WR C19L and VACV-Cop F13L;gbkey=CDS;gene=OPG057;locus_tag=MPXV_gp038;product=Palmytilated EEV membrane protein;protein_id=NP_536472.1 +NC_003310.1 RefSeq gene 42240 42461 . - . ID=gene-MPXV_gp039;Dbxref=GeneID:928977;Name=OPG058;gbkey=Gene;gene=OPG058;gene_biotype=protein_coding;locus_tag=MPXV_gp039 +NC_003310.1 RefSeq CDS 42240 42461 . - 0 ID=cds-NP_536473.1;Parent=gene-MPXV_gp039;Dbxref=GenBank:NP_536473.1,GeneID:928977;Name=NP_536473.1;Note=Taxonomic breadth: orthopoxvirus%3B Old product: C20L%3B similar to VACV-WR C20L and VACV-Cop F14L;gbkey=CDS;gene=OPG058;locus_tag=MPXV_gp039;product=Protein F14 (1);protein_id=NP_536473.1 +NC_003310.1 RefSeq gene 42514 42660 . - . ID=gene-MPXV_gp040;Dbxref=GeneID:74814291;Name=OPG059;gbkey=Gene;gene=OPG059;gene_biotype=protein_coding;locus_tag=MPXV_gp040 +NC_003310.1 RefSeq CDS 42514 42660 . - 0 ID=cds-YP_010466079.1;Parent=gene-MPXV_gp040;Dbxref=GenBank:YP_010466079.1,GeneID:74814291;Name=YP_010466079.1;Note=Taxonomic breadth: poxvirinae%3B IMV protein%3B C20.5L%3B similar to VACV-CopF14.5L;gbkey=CDS;gene=OPG059;locus_tag=MPXV_gp040;product=Cytochrome C oxidase;protein_id=YP_010466079.1 +NC_003310.1 RefSeq gene 42733 43209 . - . ID=gene-MPXV_gp041;Dbxref=GeneID:928980;Name=OPG060;gbkey=Gene;gene=OPG060;gene_biotype=protein_coding;locus_tag=MPXV_gp041 +NC_003310.1 RefSeq CDS 42733 43209 . - 0 ID=cds-NP_536474.1;Parent=gene-MPXV_gp041;Dbxref=GenBank:NP_536474.1,GeneID:928980;Name=NP_536474.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C21L%3B Unknown conserved protein%3B similar to VACV-WR C21L and VACV-Cop F15L;gbkey=CDS;gene=OPG060;locus_tag=MPXV_gp041;product=Protein F15;protein_id=NP_536474.1 +NC_003310.1 RefSeq gene 43216 43911 . - . ID=gene-MPXV_gp042;Dbxref=GeneID:928982;Name=OPG061;gbkey=Gene;gene=OPG061;gene_biotype=protein_coding;locus_tag=MPXV_gp042 +NC_003310.1 RefSeq CDS 43216 43911 . - 0 ID=cds-NP_536475.1;Parent=gene-MPXV_gp042;Dbxref=GenBank:NP_536475.1,GeneID:928982;Name=NP_536475.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C22L%3B Non-functional Serine Recombinase%3B similar to VACV-WR C22L and VACV-Cop F16L;gbkey=CDS;gene=OPG061;locus_tag=MPXV_gp042;product=Protein F16 (1);protein_id=NP_536475.1 +NC_003310.1 RefSeq gene 43973 44278 . + . ID=gene-MPXV_gp043;Dbxref=GeneID:928986;Name=OPG062;gbkey=Gene;gene=OPG062;gene_biotype=protein_coding;locus_tag=MPXV_gp043 +NC_003310.1 RefSeq CDS 43973 44278 . + 0 ID=cds-NP_536476.1;Parent=gene-MPXV_gp043;Dbxref=GenBank:NP_536476.1,GeneID:928986;Name=NP_536476.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: C23R%3B virion core DNA-binding phosphoprotein (VP11)%3B mTOR antagonist%3B similar to VACV-WR C23R and VACV-Cop F17R;gbkey=CDS;gene=OPG062;locus_tag=MPXV_gp043;product=DNA-binding phosphoprotein (1);protein_id=NP_536476.1 +NC_003310.1 RefSeq gene 44275 45714 . - . ID=gene-MPXV_gp044;Dbxref=GeneID:928987;Name=OPG063;gbkey=Gene;gene=OPG063;gene_biotype=protein_coding;locus_tag=MPXV_gp044 +NC_003310.1 RefSeq CDS 44275 45714 . - 0 ID=cds-NP_536477.1;Parent=gene-MPXV_gp044;Dbxref=GenBank:NP_536477.1,GeneID:928987;Name=NP_536477.1;Note=Taxonomic breadth: poxvirinae%3B Old product: F1L%3B poly-A polymerase%2C Poly (A) polymerase catalytic subunit (VP55)%3B similar to VACV-WR F1L and VACV-Cop E1L;gbkey=CDS;gene=OPG063;locus_tag=MPXV_gp044;product=Poly(A) polymerase catalytic subunit (3);protein_id=NP_536477.1 +NC_003310.1 RefSeq gene 45711 47924 . - . ID=gene-MPXV_gp045;Dbxref=GeneID:928989;Name=OPG064;gbkey=Gene;gene=OPG064;gene_biotype=protein_coding;locus_tag=MPXV_gp045 +NC_003310.1 RefSeq CDS 45711 47924 . - 0 ID=cds-NP_536478.1;Parent=gene-MPXV_gp045;Dbxref=GenBank:NP_536478.1,GeneID:928989;Name=NP_536478.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: F2L%3B IEV morphogenesis%3B similar to VACV-WR F2L and VACV-Cop E2L;gbkey=CDS;gene=OPG064;locus_tag=MPXV_gp045;product=Iev morphogenesis protein;protein_id=NP_536478.1 +NC_003310.1 RefSeq gene 48048 48509 . - . ID=gene-MPXV_gp046;Dbxref=GeneID:928998;Name=OPG065;gbkey=Gene;gene=OPG065;gene_biotype=protein_coding;locus_tag=MPXV_gp046 +NC_003310.1 RefSeq CDS 48048 48509 . - 0 ID=cds-NP_536479.1;Parent=gene-MPXV_gp046;Dbxref=GenBank:NP_536479.1,GeneID:928998;Name=NP_536479.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: F3L%3B interferon resistance factor%3B two forms (25 kDa and 19 kDa) of the dsRNA-binding protein%3B inhibition of dsRNA-dependent protein kinase and 2-5A-synthet%3B dsRNA-binding protein%2C IFN resistance/PKR inhibitor (Z-DNA binding)%3B apoptosis inhibition%3B start of ORF is missing approx. 37 AA compared to CPXVs%3B similar to VACV-WR F3L and VACV-Cop E3L;gbkey=CDS;gene=OPG065;locus_tag=MPXV_gp046;product=Double-stranded RNA binding protein;protein_id=NP_536479.1 +NC_003310.1 RefSeq gene 48670 49449 . - . ID=gene-MPXV_gp047;Dbxref=GeneID:929002;Name=OPG066;gbkey=Gene;gene=OPG066;gene_biotype=protein_coding;locus_tag=MPXV_gp047 +NC_003310.1 RefSeq CDS 48670 49449 . - 0 ID=cds-NP_536480.1;Parent=gene-MPXV_gp047;Dbxref=GenBank:NP_536480.1,GeneID:929002;Name=NP_536480.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: F4L%3B RNA polymerase 30 kDa subunit (RPO30)%3B simultaneously intermediate stage promoter-specific transcription factor%2C VITF-1%3B similar to VACV-WR F4L and VACV-Cop E4L;gbkey=CDS;gene=OPG066;locus_tag=MPXV_gp047;product=DNA-directed RNA polymerase 30 kDa polypeptide;protein_id=NP_536480.1 +NC_003310.1 RefSeq sequence_feature 49546 50341 . + . ID=id-NC_003310.1:49546..50341;Note=OPG067;gbkey=misc_feature +NC_003310.1 RefSeq gene 50477 52180 . + . ID=gene-MPXV_gp048;Dbxref=GeneID:929003;Name=OPG068;gbkey=Gene;gene=OPG068;gene_biotype=protein_coding;locus_tag=MPXV_gp048 +NC_003310.1 RefSeq CDS 50477 52180 . + 0 ID=cds-NP_536481.1;Parent=gene-MPXV_gp048;Dbxref=GenBank:NP_536481.1,GeneID:929003;Name=NP_536481.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: F5R%3B Virion protein%3B similar to VACV-WR F5R and VACV-Cop E6R;gbkey=CDS;gene=OPG068;locus_tag=MPXV_gp048;product=IMV membrane protein E6;protein_id=NP_536481.1 +NC_003310.1 RefSeq gene 52262 52762 . + . ID=gene-MPXV_gp049;Dbxref=GeneID:929005;Name=OPG069;gbkey=Gene;gene=OPG069;gene_biotype=protein_coding;locus_tag=MPXV_gp049 +NC_003310.1 RefSeq CDS 52262 52762 . + 0 ID=cds-NP_536482.1;Parent=gene-MPXV_gp049;Dbxref=GenBank:NP_536482.1,GeneID:929005;Name=NP_536482.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: F6R%3B soluble myristylated protein%3B similar to VACV-WR F6R and VACV-Cop E7R;gbkey=CDS;gene=OPG069;locus_tag=MPXV_gp049;product=Myristoylated protein E7;protein_id=NP_536482.1 +NC_003310.1 RefSeq gene 52862 53683 . + . ID=gene-MPXV_gp050;Dbxref=GeneID:929006;Name=OPG070;gbkey=Gene;gene=OPG070;gene_biotype=protein_coding;locus_tag=MPXV_gp050 +NC_003310.1 RefSeq CDS 52862 53683 . + 0 ID=cds-NP_536483.1;Parent=gene-MPXV_gp050;Dbxref=GenBank:NP_536483.1,GeneID:929006;Name=NP_536483.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: F7R%3B ER-localized membrane protein%2C virion core protein%3B similar to VACV-WR F7R and VACV-Cop E8R;gbkey=CDS;gene=OPG070;locus_tag=MPXV_gp050;product=Membrane protein E8;protein_id=NP_536483.1 +NC_003310.1 RefSeq gene 53691 56711 . - . ID=gene-MPXV_gp051;Dbxref=GeneID:929021;Name=OPG071;gbkey=Gene;gene=OPG071;gene_biotype=protein_coding;locus_tag=MPXV_gp051 +NC_003310.1 RefSeq CDS 53691 56711 . - 0 ID=cds-NP_536484.1;Parent=gene-MPXV_gp051;Dbxref=GenBank:NP_536484.1,GeneID:929021;Name=NP_536484.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: F8L%3B DNA polymerase%2C catalytic subunit%3B similar to VACV-WR F8L and VACV-Cop E9L;gbkey=CDS;gene=OPG071;locus_tag=MPXV_gp051;product=DNA polymerase (2);protein_id=NP_536484.1 +NC_003310.1 RefSeq gene 56743 57030 . + . ID=gene-MPXV_gp052;Dbxref=GeneID:929024;Name=OPG072;gbkey=Gene;gene=OPG072;gene_biotype=protein_coding;locus_tag=MPXV_gp052 +NC_003310.1 RefSeq CDS 56743 57030 . + 0 ID=cds-NP_536485.1;Parent=gene-MPXV_gp052;Dbxref=GenBank:NP_536485.1,GeneID:929024;Name=NP_536485.1;Note=Taxonomic breadth: poxviridae%3B Old product: F9R%3B protein disulfide bond-forming enzyme%3B Sulfhydryl oxidase (FAD-linked)%3B similar to VACV-WR F9R and VACV-Cop E10R;gbkey=CDS;gene=OPG072;locus_tag=MPXV_gp052;product=Sulfhydryl oxidase;protein_id=NP_536485.1 +NC_003310.1 RefSeq gene 57025 57414 . - . ID=gene-MPXV_gp053;Dbxref=GeneID:929028;Name=OPG073;gbkey=Gene;gene=OPG073;gene_biotype=protein_coding;locus_tag=MPXV_gp053 +NC_003310.1 RefSeq CDS 57025 57414 . - 0 ID=cds-NP_536486.1;Parent=gene-MPXV_gp053;Dbxref=GenBank:NP_536486.1,GeneID:929028;Name=NP_536486.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: F10L%3B virion core protein%3B similar to VACV-WR F10L and VACV-Cop E11L;gbkey=CDS;gene=OPG073;locus_tag=MPXV_gp053;product=Virion core protein E11;protein_id=NP_536486.1 +NC_003310.1 RefSeq gene 57401 59398 . - . ID=gene-MPXV_gp054;Dbxref=GeneID:929033;Name=OPG074;gbkey=Gene;gene=OPG074;gene_biotype=protein_coding;locus_tag=MPXV_gp054 +NC_003310.1 RefSeq CDS 57401 59398 . - 0 ID=cds-NP_536487.1;Parent=gene-MPXV_gp054;Dbxref=GenBank:NP_536487.1,GeneID:929033;Name=NP_536487.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: Q1L%3B Membrane protein%3B similar to VACV-WR Q1L and VACV-Cop O1L;gbkey=CDS;gene=OPG074;locus_tag=MPXV_gp054;product=Iev morphogenesis protein;protein_id=NP_536487.1 +NC_003310.1 RefSeq gene 59445 59771 . - . ID=gene-MPXV_gp055;Dbxref=GeneID:929038;Name=OPG075;gbkey=Gene;gene=OPG075;gene_biotype=protein_coding;locus_tag=MPXV_gp055 +NC_003310.1 RefSeq CDS 59445 59771 . - 0 ID=cds-NP_536488.1;Parent=gene-MPXV_gp055;Dbxref=GenBank:NP_536488.1,GeneID:929038;Name=NP_536488.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: Q2L%3B virion-associated glutaredoxin%3B glutaredoxin 1%3B similar to VACV-WR Q2L and VACV-Cop O2L;gbkey=CDS;gene=OPG075;locus_tag=MPXV_gp055;product=Glutaredoxin-1;protein_id=NP_536488.1 +NC_003310.1 RefSeq gene 59796 59903 . - . ID=gene-MPXV_gp056;Dbxref=GeneID:74814292;Name=OPG076;gbkey=Gene;gene=OPG076;gene_biotype=protein_coding;locus_tag=MPXV_gp056 +NC_003310.1 RefSeq CDS 59796 59903 . - 0 ID=cds-YP_010466080.1;Parent=gene-MPXV_gp056;Dbxref=GenBank:YP_010466080.1,GeneID:74814292;Name=YP_010466080.1;gbkey=CDS;gene=OPG076;locus_tag=MPXV_gp056;product=MV membrane EFC component;protein_id=YP_010466080.1 +NC_003310.1 RefSeq gene 59918 60856 . - . ID=gene-MPXV_gp057;Dbxref=GeneID:929042;Name=OPG077;gbkey=Gene;gene=OPG077;gene_biotype=protein_coding;locus_tag=MPXV_gp057 +NC_003310.1 RefSeq CDS 59918 60856 . - 0 ID=cds-NP_536489.1;Parent=gene-MPXV_gp057;Dbxref=GenBank:NP_536489.1,GeneID:929042;Name=NP_536489.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: I1L%3B virosomal protein essential for virus multiplication%3B DNA-binding core protein%3B similar to VACV-WR I1L and VACV-Cop I1L;gbkey=CDS;gene=OPG077;locus_tag=MPXV_gp057;product=Telomere-binding protein I1;protein_id=NP_536489.1 +NC_003310.1 RefSeq gene 60863 61084 . - . ID=gene-MPXV_gp058;Dbxref=GeneID:929044;Name=OPG078;gbkey=Gene;gene=OPG078;gene_biotype=protein_coding;locus_tag=MPXV_gp058 +NC_003310.1 RefSeq CDS 60863 61084 . - 0 ID=cds-NP_536490.1;Parent=gene-MPXV_gp058;Dbxref=GenBank:NP_536490.1,GeneID:929044;Name=NP_536490.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: I2L%3B IMV membrane protein%3B similar to VACV-WR I2L and VACV-Cop I2L;gbkey=CDS;gene=OPG078;locus_tag=MPXV_gp058;product=IMV membrane protein I2;protein_id=NP_536490.1 +NC_003310.1 RefSeq gene 61085 61894 . - . ID=gene-MPXV_gp059;Dbxref=GeneID:929048;Name=OPG079;gbkey=Gene;gene=OPG079;gene_biotype=protein_coding;locus_tag=MPXV_gp059 +NC_003310.1 RefSeq CDS 61085 61894 . - 0 ID=cds-NP_536491.1;Parent=gene-MPXV_gp059;Dbxref=GenBank:NP_536491.1,GeneID:929048;Name=NP_536491.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: I3L%3B virosomal ssDNA-binding phosphoprotein%3B interacts with R2 subunit of ribonucleotide reductase%3B similar to VACV-WR I3L and VACV-Cop I3L;gbkey=CDS;gene=OPG079;locus_tag=MPXV_gp059;product=DNA-binding phosphoprotein (2);protein_id=NP_536491.1 +NC_003310.1 RefSeq gene 61976 64291 . - . ID=gene-MPXV_gp060;Dbxref=GeneID:929053;Name=OPG080;gbkey=Gene;gene=OPG080;gene_biotype=protein_coding;locus_tag=MPXV_gp060 +NC_003310.1 RefSeq CDS 61976 64291 . - 0 ID=cds-NP_536492.1;Parent=gene-MPXV_gp060;Dbxref=GenBank:NP_536492.1,GeneID:929053;Name=NP_536492.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: I4L%3B ribonucleotide reductase%2C large subunit%2C R1%3B similar to VACV-WR I4L and VACV-Cop I4L;gbkey=CDS;gene=OPG080;locus_tag=MPXV_gp060;product=Ribonucleoside-diphosphate reductase (2);protein_id=NP_536492.1 +NC_003310.1 RefSeq gene 64320 64559 . - . ID=gene-MPXV_gp061;Dbxref=GeneID:929054;Name=OPG081;gbkey=Gene;gene=OPG081;gene_biotype=protein_coding;locus_tag=MPXV_gp061 +NC_003310.1 RefSeq CDS 64320 64559 . - 0 ID=cds-NP_536493.1;Parent=gene-MPXV_gp061;Dbxref=GenBank:NP_536493.1,GeneID:929054;Name=NP_536493.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: I5L%3B IMV surface membrane protein%2C VP13%3B similar to VACV-WR I5L and VACV-Cop I5L;gbkey=CDS;gene=OPG081;locus_tag=MPXV_gp061;product=IMV membrane protein I5;protein_id=NP_536493.1 +NC_003310.1 RefSeq gene 64578 65726 . - . ID=gene-MPXV_gp062;Dbxref=GeneID:929055;Name=OPG082;gbkey=Gene;gene=OPG082;gene_biotype=protein_coding;locus_tag=MPXV_gp062 +NC_003310.1 RefSeq CDS 64578 65726 . - 0 ID=cds-NP_536494.1;Parent=gene-MPXV_gp062;Dbxref=GenBank:NP_536494.1,GeneID:929055;Name=NP_536494.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: I6L%3B Telomere-binding protein%3B similar to VACV-WR I6L and VACV-Cop I6L;gbkey=CDS;gene=OPG082;locus_tag=MPXV_gp062;product=Telomere-binding protein;protein_id=NP_536494.1 +NC_003310.1 RefSeq gene 65719 66990 . - . ID=gene-MPXV_gp063;Dbxref=GeneID:929056;Name=OPG083;gbkey=Gene;gene=OPG083;gene_biotype=protein_coding;locus_tag=MPXV_gp063 +NC_003310.1 RefSeq CDS 65719 66990 . - 0 ID=cds-NP_536495.1;Parent=gene-MPXV_gp063;Dbxref=GenBank:NP_536495.1,GeneID:929056;Name=NP_536495.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: I7L%3B virion core protein%3B similar to DNA topoisomerase II%3B Virion core cysteine protease%3B similar to VACV-WR I7L and VACV-Cop I7L;gbkey=CDS;gene=OPG083;locus_tag=MPXV_gp063;product=Viral core cysteine proteinase;protein_id=NP_536495.1 +NC_003310.1 RefSeq gene 66996 69026 . + . ID=gene-MPXV_gp064;Dbxref=GeneID:929057;Name=OPG084;gbkey=Gene;gene=OPG084;gene_biotype=protein_coding;locus_tag=MPXV_gp064 +NC_003310.1 RefSeq CDS 66996 69026 . + 0 ID=cds-NP_536496.1;Parent=gene-MPXV_gp064;Dbxref=GenBank:NP_536496.1,GeneID:929057;Name=NP_536496.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: I8R%3B nucleoside triphosphate phosphohydrolase II%2C NPH-II%3B DNA and RNA helicase%3B DExH-NPH-II domain%3B similar to VACV-WR I8R and VACV-Cop I8R;gbkey=CDS;gene=OPG084;locus_tag=MPXV_gp064;product=RNA helicase NPH-II (2);protein_id=NP_536496.1 +NC_003310.1 RefSeq gene 69030 70805 . - . ID=gene-MPXV_gp065;Dbxref=GeneID:929058;Name=OPG085;gbkey=Gene;gene=OPG085;gene_biotype=protein_coding;locus_tag=MPXV_gp065 +NC_003310.1 RefSeq CDS 69030 70805 . - 0 ID=cds-NP_536497.1;Parent=gene-MPXV_gp065;Dbxref=GenBank:NP_536497.1,GeneID:929058;Name=NP_536497.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: G1L%3B proteinase%3B Metalloprotease%3B similar to VACV-WR G1L and VACV-Cop G1L;gbkey=CDS;gene=OPG085;locus_tag=MPXV_gp065;product=Metalloendopeptidase;protein_id=NP_536497.1 +NC_003310.1 RefSeq gene 70802 71137 . - . ID=gene-MPXV_gp066;Dbxref=GeneID:929062;Name=OPG086;gbkey=Gene;gene=OPG086;gene_biotype=protein_coding;locus_tag=MPXV_gp066 +NC_003310.1 RefSeq CDS 70802 71137 . - 0 ID=cds-NP_536498.1;Parent=gene-MPXV_gp066;Dbxref=GenBank:NP_536498.1,GeneID:929062;Name=NP_536498.1;Note=Taxonomic breadth: poxviridae%3B Old product: G2L%3B Entry/fusion complex component%3B similar to VACV-WR G2L and VACV-Cop G3L;gbkey=CDS;gene=OPG086;locus_tag=MPXV_gp066;product=Entry/fusion complex component;protein_id=NP_536498.1 +NC_003310.1 RefSeq gene 71131 71793 . + . ID=gene-MPXV_gp067;Dbxref=GeneID:929067;Name=OPG087;gbkey=Gene;gene=OPG087;gene_biotype=protein_coding;locus_tag=MPXV_gp067 +NC_003310.1 RefSeq CDS 71131 71793 . + 0 ID=cds-NP_536499.1;Parent=gene-MPXV_gp067;Dbxref=GenBank:NP_536499.1,GeneID:929067;Name=NP_536499.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: G3R%3B VLTF (late transcription elongation factor)%3B similar to VACV-WR G3R and VACV-Cop G2R;gbkey=CDS;gene=OPG087;locus_tag=MPXV_gp067;product=Late transcription elongation factor;protein_id=NP_536499.1 +NC_003310.1 RefSeq gene 71763 72137 . - . ID=gene-MPXV_gp068;Dbxref=GeneID:928880;Name=OPG088;gbkey=Gene;gene=OPG088;gene_biotype=protein_coding;locus_tag=MPXV_gp068 +NC_003310.1 RefSeq CDS 71763 72137 . - 0 ID=cds-NP_536500.1;Parent=gene-MPXV_gp068;Dbxref=GenBank:NP_536500.1,GeneID:928880;Name=NP_536500.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: G4L%3B virion-associated glutaredoxin%3B Glutaredoxin-like protein%3B similar to VACV-WR G4L and VACV-Cop G4L;gbkey=CDS;gene=OPG088;locus_tag=MPXV_gp068;product=Glutaredoxin-2;protein_id=NP_536500.1 +NC_003310.1 RefSeq gene 72140 73444 . + . ID=gene-MPXV_gp069;Dbxref=GeneID:928929;Name=OPG089;gbkey=Gene;gene=OPG089;gene_biotype=protein_coding;locus_tag=MPXV_gp069 +NC_003310.1 RefSeq CDS 72140 73444 . + 0 ID=cds-NP_536501.1;Parent=gene-MPXV_gp069;Dbxref=GenBank:NP_536501.1,GeneID:928929;Name=NP_536501.1;Note=Taxonomic breadth: poxviridae%3B Old product: G5R%3B FEN1-like nuclease%3B similar to VACV-WR G5R and VACV-Cop G5R;gbkey=CDS;gene=OPG089;locus_tag=MPXV_gp069;product=FEN1-like nuclease;protein_id=NP_536501.1 +NC_003310.1 RefSeq gene 73452 73643 . + . ID=gene-MPXV_gp070;Dbxref=GeneID:928884;Name=OPG090;gbkey=Gene;gene=OPG090;gene_biotype=protein_coding;locus_tag=MPXV_gp070 +NC_003310.1 RefSeq CDS 73452 73643 . + 0 ID=cds-NP_536502.1;Parent=gene-MPXV_gp070;Dbxref=GenBank:NP_536502.1,GeneID:928884;Name=NP_536502.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: G6R%3B RNA polymerase subunit%2C 7 kDa subunit (RPO7)%3B similar to VACV-WR G6R and VACV-Cop G5.5R;gbkey=CDS;gene=OPG090;locus_tag=MPXV_gp070;product=DNA-directed RNA polymerase 7 kDa subunit;protein_id=NP_536502.1 +NC_003310.1 RefSeq gene 73643 74140 . + . ID=gene-MPXV_gp071;Dbxref=GeneID:928922;Name=OPG091;gbkey=Gene;gene=OPG091;gene_biotype=protein_coding;locus_tag=MPXV_gp071 +NC_003310.1 RefSeq CDS 73643 74140 . + 0 ID=cds-NP_536503.1;Parent=gene-MPXV_gp071;Dbxref=GenBank:NP_536503.1,GeneID:928922;Name=NP_536503.1;Note=Taxonomic breadth: poxvirinae%3B Old product: G7R%3B NLPc/P60 superfamily protein%3B similar to VACV-WR G7R and VACV-Cop G6R;gbkey=CDS;gene=OPG091;locus_tag=MPXV_gp071;product=Nlpc/p60 superfamily protein;protein_id=NP_536503.1 +NC_003310.1 RefSeq gene 74105 75220 . - . ID=gene-MPXV_gp072;Dbxref=GeneID:928972;Name=OPG092;gbkey=Gene;gene=OPG092;gene_biotype=protein_coding;locus_tag=MPXV_gp072 +NC_003310.1 RefSeq CDS 74105 75220 . - 0 ID=cds-NP_536504.1;Parent=gene-MPXV_gp072;Dbxref=GenBank:NP_536504.1,GeneID:928972;Name=NP_536504.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: G8L%3B virion protein%3B Virion phosphoprotein%2C early morphogenesis%3B similar to VACV-WR G8L and VACV-Cop G7L;gbkey=CDS;gene=OPG092;locus_tag=MPXV_gp072;product=Assembly protein G7;protein_id=NP_536504.1 +NC_003310.1 RefSeq gene 75251 76033 . + . ID=gene-MPXV_gp073;Dbxref=GeneID:928970;Name=OPG093;gbkey=Gene;gene=OPG093;gene_biotype=protein_coding;locus_tag=MPXV_gp073 +NC_003310.1 RefSeq CDS 75251 76033 . + 0 ID=cds-NP_536505.1;Parent=gene-MPXV_gp073;Dbxref=GenBank:NP_536505.1,GeneID:928970;Name=NP_536505.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: G9R%3B late gene transcription factor%2C VLTF-1%3B similar to VACV-WR G9R and VACV-Cop G8R;gbkey=CDS;gene=OPG093;locus_tag=MPXV_gp073;product=Late transcription factor VLTF-1;protein_id=NP_536505.1 +NC_003310.1 RefSeq gene 76053 77075 . + . ID=gene-MPXV_gp074;Dbxref=GeneID:928969;Name=OPG094;gbkey=Gene;gene=OPG094;gene_biotype=protein_coding;locus_tag=MPXV_gp074 +NC_003310.1 RefSeq CDS 76053 77075 . + 0 ID=cds-NP_536506.1;Parent=gene-MPXV_gp074;Dbxref=GenBank:NP_536506.1,GeneID:928969;Name=NP_536506.1;Note=Taxonomic breadth: poxviridae%3B Old product: G10R%3B myristylated protein%3B Entry/fusion complex component%2C myristylprotein%3B similar to VACV-WR G10R and VACV-Cop G9R;gbkey=CDS;gene=OPG094;locus_tag=MPXV_gp074;product=Myristylated protein;protein_id=NP_536506.1 +NC_003310.1 RefSeq gene 77076 77828 . + . ID=gene-MPXV_gp075;Dbxref=GeneID:928968;Name=OPG095;gbkey=Gene;gene=OPG095;gene_biotype=protein_coding;locus_tag=MPXV_gp075 +NC_003310.1 RefSeq CDS 77076 77828 . + 0 ID=cds-NP_536507.1;Parent=gene-MPXV_gp075;Dbxref=GenBank:NP_536507.1,GeneID:928968;Name=NP_536507.1;Note=Taxonomic breadth: poxviridae%3B Old product: M1R%3B myristylated IMV surface membrane protein%3B similar to VACV-WR M1R and VACV-Cop L1R;gbkey=CDS;gene=OPG095;locus_tag=MPXV_gp075;product=IMV membrane protein L1R;protein_id=NP_536507.1 +NC_003310.1 RefSeq gene 77860 78138 . + . ID=gene-MPXV_gp076;Dbxref=GeneID:928952;Name=OPG096;gbkey=Gene;gene=OPG096;gene_biotype=protein_coding;locus_tag=MPXV_gp076 +NC_003310.1 RefSeq CDS 77860 78138 . + 0 ID=cds-NP_536508.1;Parent=gene-MPXV_gp076;Dbxref=GenBank:NP_536508.1,GeneID:928952;Name=NP_536508.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: M2R%3B Viral membrane assembly proteins (VMAP)%3B similar to VACV-WR M2R and VACV-Cop L2R;gbkey=CDS;gene=OPG096;locus_tag=MPXV_gp076;product=Crescent membrane and immature virion formation protein;protein_id=NP_536508.1 +NC_003310.1 RefSeq gene 78114 79148 . - . ID=gene-MPXV_gp077;Dbxref=GeneID:928950;Name=OPG097;gbkey=Gene;gene=OPG097;gene_biotype=protein_coding;locus_tag=MPXV_gp077 +NC_003310.1 RefSeq CDS 78114 79148 . - 0 ID=cds-NP_536509.1;Parent=gene-MPXV_gp077;Dbxref=GenBank:NP_536509.1,GeneID:928950;Name=NP_536509.1;Note=Taxonomic breadth: poxviridae%3B Old product: M3L%3B Internal virion protein%3B similar to VACV-WR M3L and VACV-Cop L3L;gbkey=CDS;gene=OPG097;locus_tag=MPXV_gp077;product=Internal virion L3/FP4 protein;protein_id=NP_536509.1 +NC_003310.1 RefSeq gene 79173 79928 . + . ID=gene-MPXV_gp078;Dbxref=GeneID:928943;Name=OPG098;gbkey=Gene;gene=OPG098;gene_biotype=protein_coding;locus_tag=MPXV_gp078 +NC_003310.1 RefSeq CDS 79173 79928 . + 0 ID=cds-NP_536510.1;Parent=gene-MPXV_gp078;Dbxref=GenBank:NP_536510.1,GeneID:928943;Name=NP_536510.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: M4R%3B virion core protein vp8%3B stimulation of I8R helicase activity%3B ss/dsDNA binding protein (VP8)%3B similar to VACV-WR M4R and VACV-Cop L4R;gbkey=CDS;gene=OPG098;locus_tag=MPXV_gp078;product=Nucleic acid binding protein VP8/L4R;protein_id=NP_536510.1 +NC_003310.1 RefSeq gene 79938 80324 . + . ID=gene-MPXV_gp079;Dbxref=GeneID:928942;Name=OPG099;gbkey=Gene;gene=OPG099;gene_biotype=protein_coding;locus_tag=MPXV_gp079 +NC_003310.1 RefSeq CDS 79938 80324 . + 0 ID=cds-NP_536511.1;Parent=gene-MPXV_gp079;Dbxref=GenBank:NP_536511.1,GeneID:928942;Name=NP_536511.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: M5R%3B Entry and Fusion IMV protein%3B similar to VACV-WR M5R and VACV-Cop L5R;gbkey=CDS;gene=OPG099;locus_tag=MPXV_gp079;product=Membrane protein CL5;protein_id=NP_536511.1 +NC_003310.1 RefSeq gene 80281 80739 . + . ID=gene-MPXV_gp080;Dbxref=GeneID:928938;Name=OPG100;gbkey=Gene;gene=OPG100;gene_biotype=protein_coding;locus_tag=MPXV_gp080 +NC_003310.1 RefSeq CDS 80281 80739 . + 0 ID=cds-NP_536512.1;Parent=gene-MPXV_gp080;Dbxref=GenBank:NP_536512.1,GeneID:928938;Name=NP_536512.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: L1R%3B Virion morph%3B similar to VACV-WR L1R and VACV-Cop J1R;gbkey=CDS;gene=OPG100;locus_tag=MPXV_gp080;product=IMV membrane protein J1;protein_id=NP_536512.1 +NC_003310.1 RefSeq gene 80759 81292 . + . ID=gene-MPXV_gp081;Dbxref=GeneID:928935;Name=OPG101;gbkey=Gene;gene=OPG101;gene_biotype=protein_coding;locus_tag=MPXV_gp081 +NC_003310.1 RefSeq CDS 80759 81292 . + 0 ID=cds-NP_536513.1;Parent=gene-MPXV_gp081;Dbxref=GenBank:NP_536513.1,GeneID:928935;Name=NP_536513.1;Note=Taxonomic breadth: poxvirinae%3B Old product: L2R%3B thymidine kinase%3B similar to VACV-WR L2R and VACV-Cop J2R;gbkey=CDS;gene=OPG101;locus_tag=MPXV_gp081;product=Thymidine kinase;protein_id=NP_536513.1 +NC_003310.1 RefSeq gene 81358 82359 . + . ID=gene-MPXV_gp082;Dbxref=GeneID:928981;Name=OPG102;gbkey=Gene;gene=OPG102;gene_biotype=protein_coding;locus_tag=MPXV_gp082 +NC_003310.1 RefSeq CDS 81358 82359 . + 0 ID=cds-NP_536514.1;Parent=gene-MPXV_gp082;Dbxref=GenBank:NP_536514.1,GeneID:928981;Name=NP_536514.1;Note=Taxonomic breadth: poxviridae%3B Old product: L3R%3B poly-A polymerase%2C stimulatory subunit%2C simultaneously cap-specific mRNA (nucleoside-O2'-)-methyltransferase%3B Poly (A) polymerase small subunit (VP39)%3B similar to VACV-WR L3R and VACV-Cop J3R;gbkey=CDS;gene=OPG102;locus_tag=MPXV_gp082;product=Cap-specific mRNA;protein_id=NP_536514.1 +NC_003310.1 RefSeq gene 82274 82831 . + . ID=gene-MPXV_gp083;Dbxref=GeneID:929064;Name=OPG103;gbkey=Gene;gene=OPG103;gene_biotype=protein_coding;locus_tag=MPXV_gp083 +NC_003310.1 RefSeq CDS 82274 82831 . + 0 ID=cds-NP_536515.1;Parent=gene-MPXV_gp083;Dbxref=GenBank:NP_536515.1,GeneID:929064;Name=NP_536515.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: L4R%3B RNA polymerase%2C 22 kDa subunit (RPO22)%3B similar to VACV-WR L4R and VACV-Cop J4R;gbkey=CDS;gene=OPG103;locus_tag=MPXV_gp083;product=DNA-directed RNA polymerase subunit;protein_id=NP_536515.1 +NC_003310.1 RefSeq gene 82891 83292 . - . ID=gene-MPXV_gp084;Dbxref=GeneID:928930;Name=OPG104;gbkey=Gene;gene=OPG104;gene_biotype=protein_coding;locus_tag=MPXV_gp084 +NC_003310.1 RefSeq CDS 82891 83292 . - 0 ID=cds-NP_536516.1;Parent=gene-MPXV_gp084;Dbxref=GenBank:NP_536516.1,GeneID:928930;Name=NP_536516.1;Note=Taxonomic breadth: poxviridae%3B Old product: L5L%3B essential for virus multiplication%3B IMV membrane protein%3B similar to VACV-WR L5L and VACV-Cop J5L;gbkey=CDS;gene=OPG104;locus_tag=MPXV_gp084;product=Myristylated protein;protein_id=NP_536516.1 +NC_003310.1 RefSeq gene 83399 87259 . + . ID=gene-MPXV_gp085;Dbxref=GeneID:929036;Name=OPG105;gbkey=Gene;gene=OPG105;gene_biotype=protein_coding;locus_tag=MPXV_gp085 +NC_003310.1 RefSeq CDS 83399 87259 . + 0 ID=cds-NP_536517.1;Parent=gene-MPXV_gp085;Dbxref=GenBank:NP_536517.1,GeneID:929036;Name=NP_536517.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: L6R%3B RNA polymerase%2C 147 kDa subunit (RPO147)%3B similar to VACV-WR L6R and VACV-Cop J6R;gbkey=CDS;gene=OPG105;locus_tag=MPXV_gp085;product=DNA-dependent RNA polymerase subunit rpo147;protein_id=NP_536517.1 +NC_003310.1 RefSeq gene 87256 87771 . - . ID=gene-MPXV_gp086;Dbxref=GeneID:928997;Name=OPG106;gbkey=Gene;gene=OPG106;gene_biotype=protein_coding;locus_tag=MPXV_gp086 +NC_003310.1 RefSeq CDS 87256 87771 . - 0 ID=cds-NP_536518.1;Parent=gene-MPXV_gp086;Dbxref=GenBank:NP_536518.1,GeneID:928997;Name=NP_536518.1;Note=Taxonomic breadth: poxvirinae%3B Old product: H1L%3B tyrosine%3B Tyr/Ser phosphatase%2C IFN-gamma inhibitor%3B signal transduction%3B similar to VACV-WR H1L and VACV-Cop H1L;gbkey=CDS;gene=OPG106;locus_tag=MPXV_gp086;product=Tyr/ser protein phosphatase;protein_id=NP_536518.1 +NC_003310.1 RefSeq gene 87785 88354 . + . ID=gene-MPXV_gp087;Dbxref=GeneID:928891;Name=OPG107;gbkey=Gene;gene=OPG107;gene_biotype=protein_coding;locus_tag=MPXV_gp087 +NC_003310.1 RefSeq CDS 87785 88354 . + 0 ID=cds-NP_536519.1;Parent=gene-MPXV_gp087;Dbxref=GenBank:NP_536519.1,GeneID:928891;Name=NP_536519.1;Note=Taxonomic breadth: poxviridae%3B Old product: H2R%3B IMV membrane protein%3B similar to VACV-WR H2R and VACV-Cop H2R;gbkey=CDS;gene=OPG107;locus_tag=MPXV_gp087;product=Entry-fusion complex essential component;protein_id=NP_536519.1 +NC_003310.1 RefSeq gene 88358 89332 . - . ID=gene-MPXV_gp088;Dbxref=GeneID:928895;Name=OPG108;gbkey=Gene;gene=OPG108;gene_biotype=protein_coding;locus_tag=MPXV_gp088 +NC_003310.1 RefSeq CDS 88358 89332 . - 0 ID=cds-NP_536520.1;Parent=gene-MPXV_gp088;Dbxref=GenBank:NP_536520.1,GeneID:928895;Name=NP_536520.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: H3L%3B IMV surface membrane protein%3B IMV heparin binding surface protein%3B similar to VACV-WR H3L and VACV-Cop H3L;gbkey=CDS;gene=OPG108;locus_tag=MPXV_gp088;product=IMV heparin binding surface protein;protein_id=NP_536520.1 +NC_003310.1 RefSeq gene 89333 91720 . - . ID=gene-MPXV_gp089;Dbxref=GeneID:928896;Name=OPG109;gbkey=Gene;gene=OPG109;gene_biotype=protein_coding;locus_tag=MPXV_gp089 +NC_003310.1 RefSeq CDS 89333 91720 . - 0 ID=cds-NP_536521.1;Parent=gene-MPXV_gp089;Dbxref=GenBank:NP_536521.1,GeneID:928896;Name=NP_536521.1;Note=Taxonomic breadth: poxviridae%3B Old product: H4L%3B virion core RNA polymerase-associated protein%2C RAP94%3B similar to VACV-WR H4L and VACV-Cop H4L;gbkey=CDS;gene=OPG109;locus_tag=MPXV_gp089;product=RNA polymerase-associated transcription-specificity factor RAP94;protein_id=NP_536521.1 +NC_003310.1 RefSeq gene 91905 92546 . + . ID=gene-MPXV_gp090;Dbxref=GeneID:928898;Name=OPG110;gbkey=Gene;gene=OPG110;gene_biotype=protein_coding;locus_tag=MPXV_gp090 +NC_003310.1 RefSeq CDS 91905 92546 . + 0 ID=cds-NP_536522.1;Parent=gene-MPXV_gp090;Dbxref=GenBank:NP_536522.1,GeneID:928898;Name=NP_536522.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: H5R%3B virosome-associated late gene transcription factor%2C VLTF-4%3B Ca2+-binding motif%3B similar to VACV-WR H5R and VACV-Cop H5R;gbkey=CDS;gene=OPG110;locus_tag=MPXV_gp090;product=Late transcription factor VLTF-4 (1);protein_id=NP_536522.1 +NC_003310.1 RefSeq gene 92547 93491 . + . ID=gene-MPXV_gp091;Dbxref=GeneID:929046;Name=OPG111;gbkey=Gene;gene=OPG111;gene_biotype=protein_coding;locus_tag=MPXV_gp091 +NC_003310.1 RefSeq CDS 92547 93491 . + 0 ID=cds-NP_536523.1;Parent=gene-MPXV_gp091;Dbxref=GenBank:NP_536523.1,GeneID:929046;Name=NP_536523.1;Note=Taxonomic breadth: poxviridae%3B Old product: H6R%3B DNA topoisomerase type I%3B similar to VACV-WR H6R and VACV-Cop H6R;gbkey=CDS;gene=OPG111;locus_tag=MPXV_gp091;product=DNA topoisomerase type I;protein_id=NP_536523.1 +NC_003310.1 RefSeq gene 93529 93969 . + . ID=gene-MPXV_gp092;Dbxref=GeneID:929065;Name=OPG112;gbkey=Gene;gene=OPG112;gene_biotype=protein_coding;locus_tag=MPXV_gp092 +NC_003310.1 RefSeq CDS 93529 93969 . + 0 ID=cds-NP_536524.1;Parent=gene-MPXV_gp092;Dbxref=GenBank:NP_536524.1,GeneID:929065;Name=NP_536524.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: H7R%3B Viral membrane assembly proteins (VMAP)%3B similar to VACV-WR H7R and VACV-Cop H7R;gbkey=CDS;gene=OPG112;locus_tag=MPXV_gp092;product=Late protein H7;protein_id=NP_536524.1 +NC_003310.1 RefSeq gene 94013 96550 . + . ID=gene-MPXV_gp093;Dbxref=GeneID:928883;Name=OPG113;gbkey=Gene;gene=OPG113;gene_biotype=protein_coding;locus_tag=MPXV_gp093 +NC_003310.1 RefSeq CDS 94013 96550 . + 0 ID=cds-NP_536525.1;Parent=gene-MPXV_gp093;Dbxref=GenBank:NP_536525.1,GeneID:928883;Name=NP_536525.1;Note=Taxonomic breadth: poxviridae%3B Old product: E1R%3B mRNA capping enzyme%2C large subunit%3B RNA 5' triphosphatase and RNA guanylyl transferase activities%3B similar to VACV-WR E1R and VACV-Cop D1R;gbkey=CDS;gene=OPG113;locus_tag=MPXV_gp093;product=mRNA capping enzyme large subunit;protein_id=NP_536525.1 +NC_003310.1 RefSeq gene 96509 96949 . - . ID=gene-MPXV_gp094;Dbxref=GeneID:928881;Name=OPG114;gbkey=Gene;gene=OPG114;gene_biotype=protein_coding;locus_tag=MPXV_gp094 +NC_003310.1 RefSeq CDS 96509 96949 . - 0 ID=cds-NP_536526.1;Parent=gene-MPXV_gp094;Dbxref=GenBank:NP_536526.1,GeneID:928881;Name=NP_536526.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: E2L%3B virion core protein%3B similar to VACV-WR E2L and VACV-Cop D2L;gbkey=CDS;gene=OPG114;locus_tag=MPXV_gp094;product=Virion protein D2;protein_id=NP_536526.1 +NC_003310.1 RefSeq gene 96942 97643 . + . ID=gene-MPXV_gp095;Dbxref=GeneID:929052;Name=OPG115;gbkey=Gene;gene=OPG115;gene_biotype=protein_coding;locus_tag=MPXV_gp095 +NC_003310.1 RefSeq CDS 96942 97643 . + 0 ID=cds-NP_536527.1;Parent=gene-MPXV_gp095;Dbxref=GenBank:NP_536527.1,GeneID:929052;Name=NP_536527.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: E3R%3B virion core protein%3B similar to VACV-WR E3R and VACV-Cop D3R;gbkey=CDS;gene=OPG115;locus_tag=MPXV_gp095;product=Virion core protein D3;protein_id=NP_536527.1 +NC_003310.1 RefSeq gene 97643 98299 . + . ID=gene-MPXV_gp096;Dbxref=GeneID:929066;Name=OPG116;gbkey=Gene;gene=OPG116;gene_biotype=protein_coding;locus_tag=MPXV_gp096 +NC_003310.1 RefSeq CDS 97643 98299 . + 0 ID=cds-NP_536528.1;Parent=gene-MPXV_gp096;Dbxref=GenBank:NP_536528.1,GeneID:929066;Name=NP_536528.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: E4R%3B uracil DNA glycosylase%3B DNA polymerase processivity factor%3B similar to VACV-WR E4R and VACV-Cop D4R;gbkey=CDS;gene=OPG116;locus_tag=MPXV_gp096;product=Uracil DNA glycosylase superfamily;protein_id=NP_536528.1 +NC_003310.1 RefSeq gene 98331 100688 . + . ID=gene-MPXV_gp097;Dbxref=GeneID:928934;Name=OPG117;gbkey=Gene;gene=OPG117;gene_biotype=protein_coding;locus_tag=MPXV_gp097 +NC_003310.1 RefSeq CDS 98331 100688 . + 0 ID=cds-NP_536529.1;Parent=gene-MPXV_gp097;Dbxref=GenBank:NP_536529.1,GeneID:928934;Name=NP_536529.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: E5R%3B nucleic acid-independent nucleoside triphosphatase%3B NTPase%2C DNA primase%3B similar to VACV-WR E5R and VACV-Cop D5R;gbkey=CDS;gene=OPG117;locus_tag=MPXV_gp097;product=NTPase (1);protein_id=NP_536529.1 +NC_003310.1 RefSeq gene 100728 102641 . + . ID=gene-MPXV_gp098;Dbxref=GeneID:928933;Name=OPG118;gbkey=Gene;gene=OPG118;gene_biotype=protein_coding;locus_tag=MPXV_gp098 +NC_003310.1 RefSeq CDS 100728 102641 . + 0 ID=cds-NP_536530.1;Parent=gene-MPXV_gp098;Dbxref=GenBank:NP_536530.1,GeneID:928933;Name=NP_536530.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: E6R%3B early transcription factor%2C small subunit%2C VETF-s%3B Morphogenesis%3B similar to VACV-WR E6R and VACV-Cop D6R;gbkey=CDS;gene=OPG118;locus_tag=MPXV_gp098;product=Early transcription factor 70 kDa subunit;protein_id=NP_536530.1 +NC_003310.1 RefSeq gene 102668 103153 . + . ID=gene-MPXV_gp099;Dbxref=GeneID:929015;Name=OPG119;gbkey=Gene;gene=OPG119;gene_biotype=protein_coding;locus_tag=MPXV_gp099 +NC_003310.1 RefSeq CDS 102668 103153 . + 0 ID=cds-NP_536531.1;Parent=gene-MPXV_gp099;Dbxref=GenBank:NP_536531.1,GeneID:929015;Name=NP_536531.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: E7R%3B RNA polymerase%2C 18 kDa subunit (RPO18)%3B similar to VACV-WR E7R and VACV-Cop D7R;gbkey=CDS;gene=OPG119;locus_tag=MPXV_gp099;product=RNA polymerase subunit RPO18;protein_id=NP_536531.1 +NC_003310.1 RefSeq gene 103116 104030 . - . ID=gene-MPXV_gp100;Dbxref=GeneID:929017;Name=OPG120;gbkey=Gene;gene=OPG120;gene_biotype=protein_coding;locus_tag=MPXV_gp100 +NC_003310.1 RefSeq CDS 103116 104030 . - 0 ID=cds-NP_536532.1;Parent=gene-MPXV_gp100;Dbxref=GenBank:NP_536532.1,GeneID:929017;Name=NP_536532.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: E8L%3B IMV surface membrane 32 kDa protein%3B binding to cell surface chondroitin sulfate%3B IMV adsorption to cell surface%3B GAG-binding IMV membrane protein%3B similar to VACV-WR E8L and VACV-Cop D8L;gbkey=CDS;gene=OPG120;locus_tag=MPXV_gp100;product=Carbonic anhydrase;protein_id=NP_536532.1 +NC_003310.1 RefSeq gene 104072 104713 . + . ID=gene-MPXV_gp101;Dbxref=GeneID:929063;Name=OPG121;gbkey=Gene;gene=OPG121;gene_biotype=protein_coding;locus_tag=MPXV_gp101 +NC_003310.1 RefSeq CDS 104072 104713 . + 0 ID=cds-NP_536533.1;Parent=gene-MPXV_gp101;Dbxref=GenBank:NP_536533.1,GeneID:929063;Name=NP_536533.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: E9R%3B Mut-like%3B mRNA decapping enzyme%3B similar to VACV-WR E9R and VACV-Cop D9R;gbkey=CDS;gene=OPG121;locus_tag=MPXV_gp101;product=NUDIX domain protein;protein_id=NP_536533.1 +NC_003310.1 RefSeq gene 104710 105456 . + . ID=gene-MPXV_gp102;Dbxref=GeneID:929061;Name=OPG122;gbkey=Gene;gene=OPG122;gene_biotype=protein_coding;locus_tag=MPXV_gp102 +NC_003310.1 RefSeq CDS 104710 105456 . + 0 ID=cds-NP_536534.1;Parent=gene-MPXV_gp102;Dbxref=GenBank:NP_536534.1,GeneID:929061;Name=NP_536534.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: E10R%3B down regulation of gene expression%3B Mut-like%3B mRNA decapping enzyme%3B similar to VACV-WR E10R and VACV-Cop D10R;gbkey=CDS;gene=OPG122;locus_tag=MPXV_gp102;product=MutT motif protein;protein_id=NP_536534.1 +NC_003310.1 RefSeq gene 105457 107352 . - . ID=gene-MPXV_gp103;Dbxref=GeneID:929060;Name=OPG123;gbkey=Gene;gene=OPG123;gene_biotype=protein_coding;locus_tag=MPXV_gp103 +NC_003310.1 RefSeq CDS 105457 107352 . - 0 ID=cds-NP_536535.1;Parent=gene-MPXV_gp103;Dbxref=GenBank:NP_536535.1,GeneID:929060;Name=NP_536535.1;Note=Taxonomic breadth: poxviridae%3B Old product: E11L%3B nucleoside triphosphate phosphohydrolase I%2C NPH I%3B DNA-dependent ATPase%3B early gene transcription termination factor%3B similar to VACV-WR E11L and VACV-Cop D11L;gbkey=CDS;gene=OPG123;locus_tag=MPXV_gp103;product=Nucleoside triphosphatase I;protein_id=NP_536535.1 +NC_003310.1 RefSeq gene 107387 108250 . - . ID=gene-MPXV_gp104;Dbxref=GeneID:929059;Name=OPG124;gbkey=Gene;gene=OPG124;gene_biotype=protein_coding;locus_tag=MPXV_gp104 +NC_003310.1 RefSeq CDS 107387 108250 . - 0 ID=cds-NP_536536.1;Parent=gene-MPXV_gp104;Dbxref=GenBank:NP_536536.1,GeneID:929059;Name=NP_536536.1;Note=Taxonomic breadth: poxviridae%3B Old product: E12L%3B mRNA capping enzyme small subunit%3B mRNA (guanine-N7-)-methyl-transferase%3B transcription initiation factor%3B similar to VACV-WR E12L and VACV-Cop D12L;gbkey=CDS;gene=OPG124;locus_tag=MPXV_gp104;product=mRNA capping enzyme small subunit;protein_id=NP_536536.1 +NC_003310.1 RefSeq gene 108281 109936 . - . ID=gene-MPXV_gp105;Dbxref=GeneID:929047;Name=OPG125;gbkey=Gene;gene=OPG125;gene_biotype=protein_coding;locus_tag=MPXV_gp105 +NC_003310.1 RefSeq CDS 108281 109936 . - 0 ID=cds-NP_536537.1;Parent=gene-MPXV_gp105;Dbxref=GenBank:NP_536537.1,GeneID:929047;Name=NP_536537.1;Note=Taxonomic breadth: poxviridae%3B Old product: E13L%3B protein needed for the formation of immature IMV surface membrane%3B Trimeric virion coat protein (rifampicin res)%3B similar to VACV-WR E13L and VACV-Cop D13L;gbkey=CDS;gene=OPG125;locus_tag=MPXV_gp105;product=Rifampicin resistance protein;protein_id=NP_536537.1 +NC_003310.1 RefSeq gene 109961 110413 . - . ID=gene-MPXV_gp106;Dbxref=GeneID:929032;Name=OPG126;gbkey=Gene;gene=OPG126;gene_biotype=protein_coding;locus_tag=MPXV_gp106 +NC_003310.1 RefSeq CDS 109961 110413 . - 0 ID=cds-NP_536538.1;Parent=gene-MPXV_gp106;Dbxref=GenBank:NP_536538.1,GeneID:929032;Name=NP_536538.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A1L%3B late gene transcription factor%2C VLTF-2%3B similar to VACV-WR A1L and VACV-Cop A1L;gbkey=CDS;gene=OPG126;locus_tag=MPXV_gp106;product=Late transcription factor VLTF-2 (2);protein_id=NP_536538.1 +NC_003310.1 RefSeq gene 110434 111108 . - . ID=gene-MPXV_gp107;Dbxref=GeneID:929029;Name=OPG127;gbkey=Gene;gene=OPG127;gene_biotype=protein_coding;locus_tag=MPXV_gp107 +NC_003310.1 RefSeq CDS 110434 111108 . - 0 ID=cds-NP_536539.1;Parent=gene-MPXV_gp107;Dbxref=GenBank:NP_536539.1,GeneID:929029;Name=NP_536539.1;Note=Taxonomic breadth: poxviridae%3B Old product: A2L%3B late gene transcription factor%2C VLTF-3%3B zinc binding%3B similar to VACV-WR A2L and VACV-Cop A2L;gbkey=CDS;gene=OPG127;locus_tag=MPXV_gp107;product=Late transcription factor VLTF-3 (1);protein_id=NP_536539.1 +NC_003310.1 RefSeq gene 111105 111338 . - . ID=gene-MPXV_gp108;Dbxref=GeneID:929026;Name=OPG128;gbkey=Gene;gene=OPG128;gene_biotype=protein_coding;locus_tag=MPXV_gp108 +NC_003310.1 RefSeq CDS 111105 111338 . - 0 ID=cds-NP_536540.1;Parent=gene-MPXV_gp108;Dbxref=GenBank:NP_536540.1,GeneID:929026;Name=NP_536540.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A3L%3B S-S bond formation pathway protein%3B similar to VACV-WR A3L and VACV-Cop A2.5L;gbkey=CDS;gene=OPG128;locus_tag=MPXV_gp108;product=S-S bond formation pathway protein;protein_id=NP_536540.1 +NC_003310.1 RefSeq gene 111353 113287 . - . ID=gene-MPXV_gp109;Dbxref=GeneID:929020;Name=OPG129;gbkey=Gene;gene=OPG129;gene_biotype=protein_coding;locus_tag=MPXV_gp109 +NC_003310.1 RefSeq CDS 111353 113287 . - 0 ID=cds-NP_536541.1;Parent=gene-MPXV_gp109;Dbxref=GenBank:NP_536541.1,GeneID:929020;Name=NP_536541.1;Note=Taxonomic breadth: poxviridae%3B Old product: A4L%3B major virion core protein p4b%3B P4b precursor%3B similar to VACV-WR A4L and VACV-Cop A3L;gbkey=CDS;gene=OPG129;locus_tag=MPXV_gp109;product=Virion core protein P4b;protein_id=NP_536541.1 +NC_003310.1 RefSeq gene 113340 114185 . - . ID=gene-MPXV_gp110;Dbxref=GeneID:929016;Name=OPG130;gbkey=Gene;gene=OPG130;gene_biotype=protein_coding;locus_tag=MPXV_gp110 +NC_003310.1 RefSeq CDS 113340 114185 . - 0 ID=cds-NP_536542.1;Parent=gene-MPXV_gp110;Dbxref=GenBank:NP_536542.1,GeneID:929016;Name=NP_536542.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A5L%3B 39 kDa immunodominant virion core protein needed for the progression of IV to infectious IMV%3B 39kDa virion core protein%3B similar to VACV-WR A5L and VACV-Cop A4L;gbkey=CDS;gene=OPG130;locus_tag=MPXV_gp110;product=A5L protein-like;protein_id=NP_536542.1 +NC_003310.1 RefSeq gene 114223 114708 . + . ID=gene-MPXV_gp111;Dbxref=GeneID:929014;Name=OPG131;gbkey=Gene;gene=OPG131;gene_biotype=protein_coding;locus_tag=MPXV_gp111 +NC_003310.1 RefSeq CDS 114223 114708 . + 0 ID=cds-NP_536543.1;Parent=gene-MPXV_gp111;Dbxref=GenBank:NP_536543.1,GeneID:929014;Name=NP_536543.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A6R%3B precursor of RNA polymerase 22 kDa and 21 kDa%3B RNA polymerase subunit (RPO19)%3B similar to VACV-WR A6R and VACV-Cop A5R;gbkey=CDS;gene=OPG131;locus_tag=MPXV_gp111;product=DNA-directed RNA polymerase 19 kDa subunit;protein_id=NP_536543.1 +NC_003310.1 RefSeq gene 114705 115823 . - . ID=gene-MPXV_gp112;Dbxref=GeneID:929013;Name=OPG132;gbkey=Gene;gene=OPG132;gene_biotype=protein_coding;locus_tag=MPXV_gp112 +NC_003310.1 RefSeq CDS 114705 115823 . - 0 ID=cds-NP_536544.1;Parent=gene-MPXV_gp112;Dbxref=GenBank:NP_536544.1,GeneID:929013;Name=NP_536544.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A7L%3B Viral membrane assembly proteins (VMAP)%2C core protein%3B similar to VACV-WR A7L and VACV-Cop A6L;gbkey=CDS;gene=OPG132;locus_tag=MPXV_gp112;product=Virion morphogenesis protein;protein_id=NP_536544.1 +NC_003310.1 RefSeq gene 115847 117979 . - . ID=gene-MPXV_gp113;Dbxref=GeneID:929012;Name=OPG133;gbkey=Gene;gene=OPG133;gene_biotype=protein_coding;locus_tag=MPXV_gp113 +NC_003310.1 RefSeq CDS 115847 117979 . - 0 ID=cds-NP_536545.1;Parent=gene-MPXV_gp113;Dbxref=GenBank:NP_536545.1,GeneID:929012;Name=NP_536545.1;Note=Taxonomic breadth: poxviridae%3B Old product: A8L%3B early transcription factor%2C large subunit%2C VETF-L%3B needed for morphogenesis of the virion core%3B similar to VACV-WR A8L and VACV-Cop A7L;gbkey=CDS;gene=OPG133;locus_tag=MPXV_gp113;product=Early transcription factor 82 kDa subunit;protein_id=NP_536545.1 +NC_003310.1 RefSeq gene 118033 118911 . + . ID=gene-MPXV_gp114;Dbxref=GeneID:929011;Name=OPG134;gbkey=Gene;gene=OPG134;gene_biotype=protein_coding;locus_tag=MPXV_gp114 +NC_003310.1 RefSeq CDS 118033 118911 . + 0 ID=cds-NP_536546.1;Parent=gene-MPXV_gp114;Dbxref=GenBank:NP_536546.1,GeneID:929011;Name=NP_536546.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A9R%3B intermediate transcription factor%2C VITF-3 34kda subunit%2C 34 kDa%3B similar to VACV-WR A9R and VACV-Cop A8R;gbkey=CDS;gene=OPG134;locus_tag=MPXV_gp114;product=Intermediate transcription factor VITF-3 (1);protein_id=NP_536546.1 +NC_003310.1 RefSeq gene 118892 119194 . - . ID=gene-MPXV_gp115;Dbxref=GeneID:929010;Name=OPG135;gbkey=Gene;gene=OPG135;gene_biotype=protein_coding;locus_tag=MPXV_gp115 +NC_003310.1 RefSeq CDS 118892 119194 . - 0 ID=cds-NP_536547.1;Parent=gene-MPXV_gp115;Dbxref=GenBank:NP_536547.1,GeneID:929010;Name=NP_536547.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A10L%3B Viral membrane associated%2C early morphogenesis protein%3B similar to VACV-WR A10L and VACV-Cop A9L;gbkey=CDS;gene=OPG135;locus_tag=MPXV_gp115;product=IMV membrane protein A9;protein_id=NP_536547.1 +NC_003310.1 RefSeq gene 119195 121870 . - . ID=gene-MPXV_gp116;Dbxref=GeneID:929009;Name=OPG136;gbkey=Gene;gene=OPG136;gene_biotype=protein_coding;locus_tag=MPXV_gp116 +NC_003310.1 RefSeq CDS 119195 121870 . - 0 ID=cds-NP_536548.1;Parent=gene-MPXV_gp116;Dbxref=GenBank:NP_536548.1,GeneID:929009;Name=NP_536548.1;Note=Taxonomic breadth: poxviridae%3B Old product: A11L%3B major virion core protein p4a%3B P4a precursor%3B similar to VACV-WR A11L and VACV-Cop A10L;gbkey=CDS;gene=OPG136;locus_tag=MPXV_gp116;product=Virion core protein P4a;protein_id=NP_536548.1 +NC_003310.1 RefSeq gene 121885 122841 . + . ID=gene-MPXV_gp117;Dbxref=GeneID:929008;Name=OPG137;gbkey=Gene;gene=OPG137;gene_biotype=protein_coding;locus_tag=MPXV_gp117 +NC_003310.1 RefSeq CDS 121885 122841 . + 0 ID=cds-NP_536549.1;Parent=gene-MPXV_gp117;Dbxref=GenBank:NP_536549.1,GeneID:929008;Name=NP_536549.1;Note=Taxonomic breadth: poxviridae%3B Old product: A12R%3B Viral membrane assembly proteins (VMAP)%3B similar to VACV-WR A12R and VACV-Cop A11R;gbkey=CDS;gene=OPG137;locus_tag=MPXV_gp117;product=Viral membrane formation protein;protein_id=NP_536549.1 +NC_003310.1 RefSeq gene 122843 123415 . - . ID=gene-MPXV_gp118;Dbxref=GeneID:929004;Name=OPG138;gbkey=Gene;gene=OPG138;gene_biotype=protein_coding;locus_tag=MPXV_gp118 +NC_003310.1 RefSeq CDS 122843 123415 . - 0 ID=cds-NP_536550.1;Parent=gene-MPXV_gp118;Dbxref=GenBank:NP_536550.1,GeneID:929004;Name=NP_536550.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A13L%3B Virion core and cleavage processing protein%3B similar to VACV-WR A13L and VACV-Cop A12L;gbkey=CDS;gene=OPG138;locus_tag=MPXV_gp118;product=A12 protein;protein_id=NP_536550.1 +NC_003310.1 RefSeq gene 123439 123651 . - . ID=gene-MPXV_gp119;Dbxref=GeneID:929001;Name=OPG139;gbkey=Gene;gene=OPG139;gene_biotype=protein_coding;locus_tag=MPXV_gp119 +NC_003310.1 RefSeq CDS 123439 123651 . - 0 ID=cds-NP_536551.1;Parent=gene-MPXV_gp119;Dbxref=GenBank:NP_536551.1,GeneID:929001;Name=NP_536551.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A14L%3B IMV inner and outer membrane protein%3B virion maturation%3B similar to VACV-WR A14L and VACV-Cop A13L;gbkey=CDS;gene=OPG139;locus_tag=MPXV_gp119;product=IMV membrane protein A13L;protein_id=NP_536551.1 +NC_003310.1 RefSeq gene 123757 124029 . - . ID=gene-MPXV_gp120;Dbxref=GeneID:929023;Name=OPG140;gbkey=Gene;gene=OPG140;gene_biotype=protein_coding;locus_tag=MPXV_gp120 +NC_003310.1 RefSeq CDS 123757 124029 . - 0 ID=cds-NP_536552.1;Parent=gene-MPXV_gp120;Dbxref=GenBank:NP_536552.1,GeneID:929023;Name=NP_536552.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A15L%3B IMV inner membrane protein%3B Essential IMV membrane protein%3B similar to VACV-WR A15L and VACV-Cop A14L;gbkey=CDS;gene=OPG140;locus_tag=MPXV_gp120;product=IMV membrane protein A14;protein_id=NP_536552.1 +NC_003310.1 RefSeq gene 124046 124207 . - . ID=gene-MPXV_gp121;Dbxref=GeneID:74814295;Name=OPG141;gbkey=Gene;gene=OPG141;gene_biotype=protein_coding;locus_tag=MPXV_gp121 +NC_003310.1 RefSeq CDS 124046 124207 . - 0 ID=cds-YP_010466081.1;Parent=gene-MPXV_gp121;Dbxref=GenBank:YP_010466081.1,GeneID:74814295;Name=YP_010466081.1;Note=Taxonomic breadth: chordopoxvirinae%3B Non-essential IMV membrane protein%3B similar to VACV-WR A15.5L and VACV-Cop A14.5L;gbkey=CDS;gene=OPG141;locus_tag=MPXV_gp121;product=DUF1029 domain protein;protein_id=YP_010466081.1 +NC_003310.1 RefSeq gene 124197 124481 . - . ID=gene-MPXV_gp122;Dbxref=GeneID:929000;Name=OPG142;gbkey=Gene;gene=OPG142;gene_biotype=protein_coding;locus_tag=MPXV_gp122 +NC_003310.1 RefSeq CDS 124197 124481 . - 0 ID=cds-NP_536553.1;Parent=gene-MPXV_gp122;Dbxref=GenBank:NP_536553.1,GeneID:929000;Name=NP_536553.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A16L%3B Core protein%3B similar to VACV-WR A16L and VACV-Cop A15L;gbkey=CDS;gene=OPG142;locus_tag=MPXV_gp122;product=Core protein A15;protein_id=NP_536553.1 +NC_003310.1 RefSeq gene 124465 125598 . - . ID=gene-MPXV_gp123;Dbxref=GeneID:928999;Name=OPG143;gbkey=Gene;gene=OPG143;gene_biotype=protein_coding;locus_tag=MPXV_gp123 +NC_003310.1 RefSeq CDS 124465 125598 . - 0 ID=cds-NP_536554.1;Parent=gene-MPXV_gp123;Dbxref=GenBank:NP_536554.1,GeneID:928999;Name=NP_536554.1;Note=Taxonomic breadth: poxviridae%3B Old product: A17L%3B soluble myristylated protein%3B essential for entry/fusion%3B similar to VACV-WR A17L and VACV-Cop A16L;gbkey=CDS;gene=OPG143;locus_tag=MPXV_gp123;product=Myristylated protein;protein_id=NP_536554.1 +NC_003310.1 RefSeq gene 125601 126215 . - . ID=gene-MPXV_gp124;Dbxref=GeneID:928995;Name=OPG144;gbkey=Gene;gene=OPG144;gene_biotype=protein_coding;locus_tag=MPXV_gp124 +NC_003310.1 RefSeq CDS 125601 126215 . - 0 ID=cds-NP_536555.1;Parent=gene-MPXV_gp124;Dbxref=GenBank:NP_536555.1,GeneID:928995;Name=NP_536555.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A18L%3B IMV surface membrane protein%3B early function in virion morphgenesis%3B similar to VACV-WR A18L and VACV-Cop A17L;gbkey=CDS;gene=OPG144;locus_tag=MPXV_gp124;product=IMV membrane protein P21;protein_id=NP_536555.1 +NC_003310.1 RefSeq gene 126230 127708 . + . ID=gene-MPXV_gp125;Dbxref=GeneID:928993;Name=OPG145;gbkey=Gene;gene=OPG145;gene_biotype=protein_coding;locus_tag=MPXV_gp125 +NC_003310.1 RefSeq CDS 126230 127708 . + 0 ID=cds-NP_536556.1;Parent=gene-MPXV_gp125;Dbxref=GenBank:NP_536556.1,GeneID:928993;Name=NP_536556.1;Note=Taxonomic breadth: poxviridae%3B Old product: A19R%3B virion core associated DNA helicase%3B post-replicative negative transcription elongation factor%3B transcript release factor%3B similar to VACV-WR A19R and VACV-Cop A18R;gbkey=CDS;gene=OPG145;locus_tag=MPXV_gp125;product=DNA helicase;protein_id=NP_536556.1 +NC_003310.1 RefSeq gene 127689 127922 . - . ID=gene-MPXV_gp126;Dbxref=GeneID:928992;Name=OPG146;gbkey=Gene;gene=OPG146;gene_biotype=protein_coding;locus_tag=MPXV_gp126 +NC_003310.1 RefSeq CDS 127689 127922 . - 0 ID=cds-NP_536557.1;Parent=gene-MPXV_gp126;Dbxref=GenBank:NP_536557.1,GeneID:928992;Name=NP_536557.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A20L%3B Zinc finger-like protein%3B similar to VACV-WR A20L and VACV-Cop A19L;gbkey=CDS;gene=OPG146;locus_tag=MPXV_gp126;product=Zinc finger-like protein (1);protein_id=NP_536557.1 +NC_003310.1 RefSeq gene 127923 128270 . - . ID=gene-MPXV_gp127;Dbxref=GeneID:928990;Name=OPG147;gbkey=Gene;gene=OPG147;gene_biotype=protein_coding;locus_tag=MPXV_gp127 +NC_003310.1 RefSeq CDS 127923 128270 . - 0 ID=cds-NP_536558.1;Parent=gene-MPXV_gp127;Dbxref=GenBank:NP_536558.1,GeneID:928990;Name=NP_536558.1;Note=Taxonomic breadth: poxviridae%3B Old product: A21L%3B IMV membrane protein%2C entry/fusion complex component%3B similar to VACV-WR A21L and VACV-Cop A21L;gbkey=CDS;gene=OPG147;locus_tag=MPXV_gp127;product=IMV membrane protein A21;protein_id=NP_536558.1 +NC_003310.1 RefSeq gene 128269 129549 . + . ID=gene-MPXV_gp128;Dbxref=GeneID:928985;Name=OPG148;gbkey=Gene;gene=OPG148;gene_biotype=protein_coding;locus_tag=MPXV_gp128 +NC_003310.1 RefSeq CDS 128269 129549 . + 0 ID=cds-NP_536559.1;Parent=gene-MPXV_gp128;Dbxref=GenBank:NP_536559.1,GeneID:928985;Name=NP_536559.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A22R%3B processivity factor for the viral DNA polymerase%2C VPF%3B similar to VACV-WR A22R and VACV-Cop A20R;gbkey=CDS;gene=OPG148;locus_tag=MPXV_gp128;product=DNA polymerase processivity factor;protein_id=NP_536559.1 +NC_003310.1 RefSeq gene 129479 130042 . + . ID=gene-MPXV_gp129;Dbxref=GeneID:928984;Name=OPG149;gbkey=Gene;gene=OPG149;gene_biotype=protein_coding;locus_tag=MPXV_gp129 +NC_003310.1 RefSeq CDS 129479 130042 . + 0 ID=cds-NP_536560.1;Parent=gene-MPXV_gp129;Dbxref=GenBank:NP_536560.1,GeneID:928984;Name=NP_536560.1;Note=Taxonomic breadth: poxviridae%3B Old product: A23R%3B Holliday junction resolvase%3B similar to VACV-WR A23R and VACV-Cop A22R;gbkey=CDS;gene=OPG149;locus_tag=MPXV_gp129;product=Holliday junction resolvase;protein_id=NP_536560.1 +NC_003310.1 RefSeq gene 130062 131210 . + . ID=gene-MPXV_gp130;Dbxref=GeneID:928978;Name=OPG150;gbkey=Gene;gene=OPG150;gene_biotype=protein_coding;locus_tag=MPXV_gp130 +NC_003310.1 RefSeq CDS 130062 131210 . + 0 ID=cds-NP_536561.1;Parent=gene-MPXV_gp130;Dbxref=GenBank:NP_536561.1,GeneID:928978;Name=NP_536561.1;Note=Taxonomic breadth: poxviridae%3B Old product: A24R%3B intermediate transcription factor%2C VITF-3%2C 45 kDa subunit%3B similar to VACV-WR A24R and VACV-Cop A23R;gbkey=CDS;gene=OPG150;locus_tag=MPXV_gp130;product=Intermediate transcription factor VITF-3 (2);protein_id=NP_536561.1 +NC_003310.1 RefSeq gene 131207 134701 . + . ID=gene-MPXV_gp131;Dbxref=GeneID:928976;Name=OPG151;gbkey=Gene;gene=OPG151;gene_biotype=protein_coding;locus_tag=MPXV_gp131 +NC_003310.1 RefSeq CDS 131207 134701 . + 0 ID=cds-NP_536562.1;Parent=gene-MPXV_gp131;Dbxref=GenBank:NP_536562.1,GeneID:928976;Name=NP_536562.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A25R%3B RNA polymerase%2C 132 kDa subunit (RPO132)%3B similar to VACV-WR A25R and VACV-Cop A24R;gbkey=CDS;gene=OPG151;locus_tag=MPXV_gp131;product=DNA-dependent RNA polymerase subunit rpo132;protein_id=NP_536562.1 +NC_003310.1 RefSeq sequence_feature 134679 137905 . - . ID=id-NC_003310.1:134679..137905;Note=OPG152;gbkey=misc_feature +NC_003310.1 RefSeq gene 137951 139513 . - . ID=gene-MPXV_gp132;Dbxref=GeneID:928967;Name=OPG153;gbkey=Gene;gene=OPG153;gene_biotype=protein_coding;locus_tag=MPXV_gp132 +NC_003310.1 RefSeq CDS 137951 139513 . - 0 ID=cds-NP_536565.1;Parent=gene-MPXV_gp132;Dbxref=GenBank:NP_536565.1,GeneID:928967;Name=NP_536565.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A28L%3B major component of IMV surface tubules%3B A-type inclusion protein%3B P4c precursor%3B similar to VACV-WR A28L and VACV-Cop A26L;gbkey=CDS;gene=OPG153;locus_tag=MPXV_gp132;product=Orthopoxvirus A26L/A30L protein;protein_id=NP_536565.1 +NC_003310.1 RefSeq gene 139564 139896 . - . ID=gene-MPXV_gp133;Dbxref=GeneID:928966;Name=OPG154;gbkey=Gene;gene=OPG154;gene_biotype=protein_coding;locus_tag=MPXV_gp133 +NC_003310.1 RefSeq CDS 139564 139896 . - 0 ID=cds-NP_536566.1;Parent=gene-MPXV_gp133;Dbxref=GenBank:NP_536566.1,GeneID:928966;Name=NP_536566.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A29L%3B IMV surface membrane 14 kDa fusion protein%3B binding to cell surface heparan%3B similar to VACV-WR A29L and VACV-Cop A27L;gbkey=CDS;gene=OPG154;locus_tag=MPXV_gp133;product=IMV surface fusion protein;protein_id=NP_536566.1 +NC_003310.1 RefSeq gene 139897 140337 . - . ID=gene-MPXV_gp134;Dbxref=GeneID:928965;Name=OPG155;gbkey=Gene;gene=OPG155;gene_biotype=protein_coding;locus_tag=MPXV_gp134 +NC_003310.1 RefSeq CDS 139897 140337 . - 0 ID=cds-NP_536567.1;Parent=gene-MPXV_gp134;Dbxref=GenBank:NP_536567.1,GeneID:928965;Name=NP_536567.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A30L%3B IMV MP/Virus entry%3B similar to VACV-WR A30L and VACV-Cop A28L;gbkey=CDS;gene=OPG155;locus_tag=MPXV_gp134;product=Envelope protein A28 homolog;protein_id=NP_536567.1 +NC_003310.1 RefSeq gene 140338 141255 . - . ID=gene-MPXV_gp135;Dbxref=GeneID:928963;Name=OPG156;gbkey=Gene;gene=OPG156;gene_biotype=protein_coding;locus_tag=MPXV_gp135 +NC_003310.1 RefSeq CDS 140338 141255 . - 0 ID=cds-NP_536568.1;Parent=gene-MPXV_gp135;Dbxref=GenBank:NP_536568.1,GeneID:928963;Name=NP_536568.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A31L%3B RNA polymerase%2C 35 kDa subunit (RPO35)%3B similar to VACV-WR A31L and VACV-Cop A29L;gbkey=CDS;gene=OPG156;locus_tag=MPXV_gp135;product=DNA-directed RNA polymerase 35 kDa subunit;protein_id=NP_536568.1 +NC_003310.1 RefSeq gene 141218 141451 . - . ID=gene-MPXV_gp136;Dbxref=GeneID:928962;Name=OPG157;gbkey=Gene;gene=OPG157;gene_biotype=protein_coding;locus_tag=MPXV_gp136 +NC_003310.1 RefSeq CDS 141218 141451 . - 0 ID=cds-NP_536569.1;Parent=gene-MPXV_gp136;Dbxref=GenBank:NP_536569.1,GeneID:928962;Name=NP_536569.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A32L%3B IMV protein%3B similar to VACV-WR A32L and VACV-Cop A30L;gbkey=CDS;gene=OPG157;locus_tag=MPXV_gp136;product=IMV membrane protein A30;protein_id=NP_536569.1 +NC_003310.1 RefSeq gene 141484 141612 . - . ID=gene-MPXV_gp137;Dbxref=GeneID:74814293;Name=OPG158;gbkey=Gene;gene=OPG158;gene_biotype=protein_coding;locus_tag=MPXV_gp137 +NC_003310.1 RefSeq CDS 141484 141612 . - 0 ID=cds-YP_010466082.1;Parent=gene-MPXV_gp137;Dbxref=GenBank:YP_010466082.1,GeneID:74814293;Name=YP_010466082.1;Note=Viral membrane assembly proteins (VMAP)%3B similar to VACV-Cop A30.5L;gbkey=CDS;gene=OPG158;locus_tag=MPXV_gp137;product=A32.5L;protein_id=YP_010466082.1 +NC_003310.1 RefSeq gene 141611 142039 . + . ID=gene-MPXV_gp138;Dbxref=GeneID:928961;Name=OPG159;gbkey=Gene;gene=OPG159;gene_biotype=protein_coding;locus_tag=MPXV_gp138 +NC_003310.1 RefSeq CDS 141611 142039 . + 0 ID=cds-NP_536570.1;Parent=gene-MPXV_gp138;Dbxref=GenBank:NP_536570.1,GeneID:928961;Name=NP_536570.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A33R%3B Hypothetical protein%3B similar to VACV-WR A33R and VACV-Cop A31R;gbkey=CDS;gene=OPG159;locus_tag=MPXV_gp138;product=CPXV166 protein;protein_id=NP_536570.1 +NC_003310.1 RefSeq gene 142006 142908 . - . ID=gene-MPXV_gp139;Dbxref=GeneID:928960;Name=OPG160;gbkey=Gene;gene=OPG160;gene_biotype=protein_coding;locus_tag=MPXV_gp139 +NC_003310.1 RefSeq CDS 142006 142908 . - 0 ID=cds-NP_536571.1;Parent=gene-MPXV_gp139;Dbxref=GenBank:NP_536571.1,GeneID:928960;Name=NP_536571.1;Note=Taxonomic breadth: poxviridae%3B Old product: A34L%3B DNA packaging into virion%3B NTP-binding motif A%3B ATPase/DNA packaging protein%3B similar to VACV-WR A34L and VACV-Cop A32L;gbkey=CDS;gene=OPG160;locus_tag=MPXV_gp139;product=ATPase A32;protein_id=NP_536571.1 +NC_003310.1 RefSeq gene 142936 143481 . + . ID=gene-MPXV_gp140;Dbxref=GeneID:928958;Name=OPG161;gbkey=Gene;gene=OPG161;gene_biotype=protein_coding;locus_tag=MPXV_gp140 +NC_003310.1 RefSeq CDS 142936 143481 . + 0 ID=cds-NP_536572.1;Parent=gene-MPXV_gp140;Dbxref=GenBank:NP_536572.1,GeneID:928958;Name=NP_536572.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A35R%3B EEV envelope glycoprotein%2C needed for formation of actin-containing microvilli and cell-to-cell spread of virion%3B interacts with VAC A36R%3B EEV membrane phosphoglycoprotein%2C C-type lectin-like domain%3B similar to VACV-WR A35R and VACV-Cop A33R;gbkey=CDS;gene=OPG161;locus_tag=MPXV_gp140;product=EEV glycoprotein (1);protein_id=NP_536572.1 +NC_003310.1 RefSeq gene 143486 143992 . + . ID=gene-MPXV_gp141;Dbxref=GeneID:928957;Name=OPG162;gbkey=Gene;gene=OPG162;gene_biotype=protein_coding;locus_tag=MPXV_gp141 +NC_003310.1 RefSeq CDS 143486 143992 . + 0 ID=cds-NP_536573.1;Parent=gene-MPXV_gp141;Dbxref=GenBank:NP_536573.1,GeneID:928957;Name=NP_536573.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A36R%3B EEV envelope glycoprotein%2C lectin-like%3B required for infectivity of EEV%2C formation of actin-containing microvilli%2C and cell-to-cell spread of virion%3B C-type lectin-like IEV/EEV glycoprotein%3B similar to VACV-WR A36R and VACV-Cop A34R;gbkey=CDS;gene=OPG162;locus_tag=MPXV_gp141;product=EEV glycoprotein (2);protein_id=NP_536573.1 +NC_003310.1 RefSeq gene 144036 144566 . + . ID=gene-MPXV_gp142;Dbxref=GeneID:928956;Name=OPG163;gbkey=Gene;gene=OPG163;gene_biotype=protein_coding;locus_tag=MPXV_gp142 +NC_003310.1 RefSeq CDS 144036 144566 . + 0 ID=cds-NP_536574.1;Parent=gene-MPXV_gp142;Dbxref=GenBank:NP_536574.1,GeneID:928956;Name=NP_536574.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A37R%3B MHC class II antigen presentation inhibitor%3B similar to VACV-WR A37R and VACV-Cop A35R;gbkey=CDS;gene=OPG163;locus_tag=MPXV_gp142;product=MHC class II antigen presentation inhibitor;protein_id=NP_536574.1 +NC_003310.1 RefSeq gene 144611 145249 . + . ID=gene-MPXV_gp143;Dbxref=GeneID:928954;Name=OPG164;gbkey=Gene;gene=OPG164;gene_biotype=protein_coding;locus_tag=MPXV_gp143 +NC_003310.1 RefSeq CDS 144611 145249 . + 0 ID=cds-NP_536575.1;Parent=gene-MPXV_gp143;Dbxref=GenBank:NP_536575.1,GeneID:928954;Name=NP_536575.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A38R%3B IEV but not CEV envelope protein%3B plays critical role for actin tail formation%3B interacts with VAC A33R and A34R%3B IEV transmembrane phosphoprotein%3B similar to VACV-WR A38R and VACV-Cop A36R;gbkey=CDS;gene=OPG164;locus_tag=MPXV_gp143;product=IEV transmembrane phosphoprotein;protein_id=NP_536575.1 +NC_003310.1 RefSeq gene 145363 146169 . + . ID=gene-MPXV_gp144;Dbxref=GeneID:928953;Name=OPG165;gbkey=Gene;gene=OPG165;gene_biotype=protein_coding;locus_tag=MPXV_gp144 +NC_003310.1 RefSeq CDS 145363 146169 . + 0 ID=cds-NP_536576.1;Parent=gene-MPXV_gp144;Dbxref=GenBank:NP_536576.1,GeneID:928953;Name=NP_536576.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A39R%3B Hypothetical protein%3B similar to VACV-WR A39R and VACV-Cop A37R;gbkey=CDS;gene=OPG165;locus_tag=MPXV_gp144;product=CPXV173 protein;protein_id=NP_536576.1 +NC_003310.1 RefSeq gene 146245 146424 . + . ID=gene-MPXV_gp145;Dbxref=GeneID:74814294;Name=OPG166;gbkey=Gene;gene=OPG166;gene_biotype=protein_coding;locus_tag=MPXV_gp145 +NC_003310.1 RefSeq CDS 146245 146424 . + 0 ID=cds-YP_010466083.1;Parent=gene-MPXV_gp145;Dbxref=GenBank:YP_010466083.1,GeneID:74814294;Name=YP_010466083.1;Note=Hypothetical protein%3B according to YP_233043.1%2C this VACV-WR protein was purified by sucrose gradient centrifugation%3B similar to VACWR161 and VARGAR-A43R;gbkey=CDS;gene=OPG166;locus_tag=MPXV_gp145;product=hypothetical protein;protein_id=YP_010466083.1 +NC_003310.1 RefSeq gene 146421 147254 . - . ID=gene-MPXV_gp146;Dbxref=GeneID:928948;Name=OPG167;gbkey=Gene;gene=OPG167;gene_biotype=protein_coding;locus_tag=MPXV_gp146 +NC_003310.1 RefSeq CDS 146421 147254 . - 0 ID=cds-NP_536577.1;Parent=gene-MPXV_gp146;Dbxref=GenBank:NP_536577.1,GeneID:928948;Name=NP_536577.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A40L%3B integral membrane glycoprotein%3B immunoglobulin-like%3B regulation of the influx of extracellular Ca2+%3B CD47-like%3B similar to VACV-WR A40L and VACV-Cop A38L;gbkey=CDS;gene=OPG167;locus_tag=MPXV_gp146;product=CD47-like protein;protein_id=NP_536577.1 +NC_003310.1 RefSeq sequence_feature 147270 147703 . + . ID=id-NC_003310.1:147270..147703;Note=OPG168;gbkey=misc_feature +NC_003310.1 RefSeq sequence_feature 147704 147886 . + . ID=id-NC_003310.1:147704..147886;Note=OPG169;gbkey=misc_feature +NC_003310.1 RefSeq gene 147981 148646 . - . ID=gene-MPXV_gp147;Dbxref=GeneID:928947;Name=OPG170;gbkey=Gene;gene=OPG170;gene_biotype=protein_coding;locus_tag=MPXV_gp147 +NC_003310.1 RefSeq CDS 147981 148646 . - 0 ID=cds-NP_536578.1;Parent=gene-MPXV_gp147;Dbxref=GenBank:NP_536578.1,GeneID:928947;Name=NP_536578.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A41L%3B secreted protein reducing infiltration of inflammatory cells into the infected area%3B Chemokine binding protein%3B similar to VACV-WR A41L and VACV-Cop A41L;gbkey=CDS;gene=OPG170;locus_tag=MPXV_gp147;product=Chemokine binding protein;protein_id=NP_536578.1 +NC_003310.1 RefSeq gene 148842 149243 . + . ID=gene-MPXV_gp148;Dbxref=GeneID:928946;Name=OPG171;gbkey=Gene;gene=OPG171;gene_biotype=protein_coding;locus_tag=MPXV_gp148 +NC_003310.1 RefSeq CDS 148842 149243 . + 0 ID=cds-NP_536579.1;Parent=gene-MPXV_gp148;Dbxref=GenBank:NP_536579.1,GeneID:928946;Name=NP_536579.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A42R%3B Profilin-like protein%2C ATI-localized%3B similar to VACV-WR A42R and VACV-Cop A42R;gbkey=CDS;gene=OPG171;locus_tag=MPXV_gp148;product=Profilin domain protein;protein_id=NP_536579.1 +NC_003310.1 RefSeq gene 149281 149874 . + . ID=gene-MPXV_gp149;Dbxref=GeneID:928944;Name=OPG172;gbkey=Gene;gene=OPG172;gene_biotype=protein_coding;locus_tag=MPXV_gp149 +NC_003310.1 RefSeq CDS 149281 149874 . + 0 ID=cds-NP_536580.1;Parent=gene-MPXV_gp149;Dbxref=GenBank:NP_536580.1,GeneID:928944;Name=NP_536580.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A43R%3B Type I membrane glycoprotein%3B similar to VACV-WR A43R and VACV-Cop A43R;gbkey=CDS;gene=OPG172;locus_tag=MPXV_gp149;product=Type-I membrane glycoprotein;protein_id=NP_536580.1 +NC_003310.1 RefSeq gene 149894 150118 . + . ID=gene-MPXV_gp150;Dbxref=GeneID:928941;Name=OPG173;gbkey=Gene;gene=OPG173;gene_biotype=protein_coding;locus_tag=MPXV_gp150 +NC_003310.1 RefSeq CDS 149894 150118 . + 0 ID=cds-NP_536581.1;Parent=gene-MPXV_gp150;Dbxref=GenBank:NP_536581.1,GeneID:928941;Name=NP_536581.1;Note=Old product: A44R%3B Hypothetical protein%3B similar to VACV-WR A44R and VACV-Cop A43.5R;gbkey=CDS;gene=OPG173;locus_tag=MPXV_gp150;product=MPXV_gp150;protein_id=NP_536581.1 +NC_003310.1 RefSeq gene 150212 151252 . - . ID=gene-MPXV_gp151;Dbxref=GeneID:928937;Name=OPG174;gbkey=Gene;gene=OPG174;gene_biotype=protein_coding;locus_tag=MPXV_gp151 +NC_003310.1 RefSeq CDS 150212 151252 . - 0 ID=cds-NP_536582.1;Parent=gene-MPXV_gp151;Dbxref=GenBank:NP_536582.1,GeneID:928937;Name=NP_536582.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A45L%3B 3-b-Hydroxy-delta5-steroid dehydrogenase%3B 3 beta-hydroxysteroid dehydrogenase/delta 5->4 isomerase%3B similar to VACV-WR A45L and VACV-Cop A44L;gbkey=CDS;gene=OPG174;locus_tag=MPXV_gp151;product=Hydroxysteroid dehydrogenase;protein_id=NP_536582.1 +NC_003310.1 RefSeq gene 151299 151676 . + . ID=gene-MPXV_gp152;Dbxref=GeneID:928932;Name=OPG175;gbkey=Gene;gene=OPG175;gene_biotype=protein_coding;locus_tag=MPXV_gp152 +NC_003310.1 RefSeq CDS 151299 151676 . + 0 ID=cds-NP_536583.1;Parent=gene-MPXV_gp152;Dbxref=GenBank:NP_536583.1,GeneID:928932;Name=NP_536583.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A46R%3B virion core protein%3B Inactive Cu-Zn superoxide dismutase-like virion protein%3B similar to VACV-WR A46R and VACV-Cop A45R;gbkey=CDS;gene=OPG175;locus_tag=MPXV_gp152;product=Copper/zinc superoxide dismutase;protein_id=NP_536583.1 +NC_003310.1 RefSeq gene 151666 152388 . + . ID=gene-MPXV_gp153;Dbxref=GeneID:928931;Name=OPG176;gbkey=Gene;gene=OPG176;gene_biotype=protein_coding;locus_tag=MPXV_gp153 +NC_003310.1 RefSeq CDS 151666 152388 . + 0 ID=cds-NP_536584.1;Parent=gene-MPXV_gp153;Dbxref=GenBank:NP_536584.1,GeneID:928931;Name=NP_536584.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A47R%3B IL-1/TLR signaling inhibitor%3B similar to VACV-WR A47R and VACV-Cop A46R;gbkey=CDS;gene=OPG176;locus_tag=MPXV_gp153;product=Bcl-2-like protein;protein_id=NP_536584.1 +NC_003310.1 RefSeq sequence_feature 152649 153366 . - . ID=id-NC_003310.1:152649..153366;Note=OPG177;gbkey=misc_feature +NC_003310.1 RefSeq gene 153468 154082 . + . ID=gene-MPXV_gp154;Dbxref=GeneID:928926;Name=OPG178;gbkey=Gene;gene=OPG178;gene_biotype=protein_coding;locus_tag=MPXV_gp154 +NC_003310.1 RefSeq CDS 153468 154082 . + 0 ID=cds-NP_536586.1;Parent=gene-MPXV_gp154;Dbxref=GenBank:NP_536586.1,GeneID:928926;Name=NP_536586.1;Note=Taxonomic breadth: poxviridae%3B Old product: A49R%3B thymidylate kinase%3B start of ORF is missing approx. 37 AA compared to CPXVs%3B similar to VACV-WR A49R and VACV-Cop A48R;gbkey=CDS;gene=OPG178;locus_tag=MPXV_gp154;product=Thymidylate kinase;protein_id=NP_536586.1 +NC_003310.1 RefSeq sequence_feature 154131 154616 . + . ID=id-NC_003310.1:154131..154616;Note=OPG179;gbkey=misc_feature +NC_003310.1 RefSeq gene 154648 156312 . + . ID=gene-MPXV_gp155;Dbxref=GeneID:928925;Name=OPG180;gbkey=Gene;gene=OPG180;gene_biotype=protein_coding;locus_tag=MPXV_gp155 +NC_003310.1 RefSeq CDS 154648 156312 . + 0 ID=cds-NP_536587.1;Parent=gene-MPXV_gp155;Dbxref=GenBank:NP_536587.1,GeneID:928925;Name=NP_536587.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A50R%3B ATP-dependent DNA ligase%3B similar to VACV-WR A50R and VACV-Cop A50R;gbkey=CDS;gene=OPG180;locus_tag=MPXV_gp155;product=DNA ligase (2);protein_id=NP_536587.1 +NC_003310.1 RefSeq gene 156366 157370 . + . ID=gene-MPXV_gp156;Dbxref=GeneID:928924;Name=OPG181;gbkey=Gene;gene=OPG181;gene_biotype=protein_coding;locus_tag=MPXV_gp156 +NC_003310.1 RefSeq CDS 156366 157370 . + 0 ID=cds-NP_536588.1;Parent=gene-MPXV_gp156;Dbxref=GenBank:NP_536588.1,GeneID:928924;Name=NP_536588.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: A51R%3B Hypothetical protein%3B similar to VACV-WR A51R and VACV-Cop A51R;gbkey=CDS;gene=OPG181;locus_tag=MPXV_gp156;product=M137R;protein_id=NP_536588.1 +NC_003310.1 RefSeq sequence_feature 157438 158001 . + . ID=id-NC_003310.1:157438..158001;Note=OPG182;gbkey=misc_feature +NC_003310.1 RefSeq sequence_feature 158318 158567 . + . ID=id-NC_003310.1:158318..158567;Note=OPG184;gbkey=misc_feature +NC_003310.1 RefSeq gene 158617 159558 . + . ID=gene-MPXV_gp157;Dbxref=GeneID:928920;Name=OPG185;gbkey=Gene;gene=OPG185;gene_biotype=protein_coding;locus_tag=MPXV_gp157 +NC_003310.1 RefSeq CDS 158617 159558 . + 0 ID=cds-NP_536590.1;Parent=gene-MPXV_gp157;Dbxref=GenBank:NP_536590.1,GeneID:928920;Name=NP_536590.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: B2R%3B EEV envelope and cell membrane glycoprotein hemagglutinin%3B inhibition of the ability of infected cells to fuse%3B interacts with VAC F13L%3B similar to VACV-WR B2R and VACV-Cop A56R;gbkey=CDS;gene=OPG185;locus_tag=MPXV_gp157;product=Hemagglutinin;protein_id=NP_536590.1 +NC_003310.1 RefSeq sequence_feature 159576 160173 . + . ID=id-NC_003310.1:159576..160173;Note=OPG186;gbkey=misc_feature +NC_003310.1 RefSeq gene 160325 161224 . + . ID=gene-MPXV_gp158;Dbxref=GeneID:928918;Name=OPG187;gbkey=Gene;gene=OPG187;gene_biotype=protein_coding;locus_tag=MPXV_gp158 +NC_003310.1 RefSeq CDS 160325 161224 . + 0 ID=cds-NP_536591.1;Parent=gene-MPXV_gp158;Dbxref=GenBank:NP_536591.1,GeneID:928918;Name=NP_536591.1;Note=Taxonomic breadth: poxviridae%3B Old product: B3R%3B serine%3B Ser/Thr Kinase essential for transcription of viral intermediate genes%3B similar to VACV-WR B3R and VACV-Cop B1R;gbkey=CDS;gene=OPG187;locus_tag=MPXV_gp158;product=Ser/thr kinase;protein_id=NP_536591.1 +NC_003310.1 RefSeq gene 161299 162810 . + . ID=gene-MPXV_gp159;Dbxref=GeneID:928917;Name=OPG188;gbkey=Gene;gene=OPG188;gene_biotype=protein_coding;locus_tag=MPXV_gp159 +NC_003310.1 RefSeq CDS 161299 162810 . + 0 ID=cds-NP_536592.1;Parent=gene-MPXV_gp159;Dbxref=GenBank:NP_536592.1,GeneID:928917;Name=NP_536592.1;Note=Taxonomic breadth: orthopoxvirus%3B Old product: B4R%3B schlafen-like%3B similar to VACV-WR B4R and VACV-Cop B2R;gbkey=CDS;gene=OPG188;locus_tag=MPXV_gp159;product=Schlafen (1);protein_id=NP_536592.1 +NC_003310.1 RefSeq gene 163058 164743 . + . ID=gene-MPXV_gp160;Dbxref=GeneID:928916;Name=OPG189;gbkey=Gene;gene=OPG189;gene_biotype=protein_coding;locus_tag=MPXV_gp160 +NC_003310.1 RefSeq CDS 163058 164743 . + 0 ID=cds-NP_536593.1;Parent=gene-MPXV_gp160;Dbxref=GenBank:NP_536593.1,GeneID:928916;Name=NP_536593.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: B5R%3B ankyrin-like%3B similar to VACV-WR B5R and VACV-Cop B4R;gbkey=CDS;gene=OPG189;locus_tag=MPXV_gp160;product=Ankyrin repeat protein (25);protein_id=NP_536593.1 +NC_003310.1 RefSeq gene 164845 165798 . + . ID=gene-MPXV_gp161;Dbxref=GeneID:928902;Name=OPG190;gbkey=Gene;gene=OPG190;gene_biotype=protein_coding;locus_tag=MPXV_gp161 +NC_003310.1 RefSeq CDS 164845 165798 . + 0 ID=cds-NP_536594.1;Parent=gene-MPXV_gp161;Dbxref=GenBank:NP_536594.1,GeneID:928902;Name=NP_536594.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: B6R%3B palmitated 42 kDa glycoprotein located both on the membranes of infected cells and on EEV envelope%3B complement control protein-like%3B EEV type-1 membrane glycoprotein%2C protective antigen%3B similar to VACV-WR B6R and VACV-Cop B5R;gbkey=CDS;gene=OPG190;locus_tag=MPXV_gp161;product=EEV type-I membrane glycoprotein;protein_id=NP_536594.1 +NC_003310.1 RefSeq gene 165891 166421 . + . ID=gene-MPXV_gp162;Dbxref=GeneID:928901;Name=OPG191;gbkey=Gene;gene=OPG191;gene_biotype=protein_coding;locus_tag=MPXV_gp162 +NC_003310.1 RefSeq CDS 165891 166421 . + 0 ID=cds-NP_536595.1;Parent=gene-MPXV_gp162;Dbxref=GenBank:NP_536595.1,GeneID:928901;Name=NP_536595.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: B7R%3B Ankyrin-like protein%3B similar to VACV-WR B7R and VACV-Cop B6R;gbkey=CDS;gene=OPG191;locus_tag=MPXV_gp162;product=Ankyrin-like protein (46);protein_id=NP_536595.1 +NC_003310.1 RefSeq gene 166458 167006 . + . ID=gene-MPXV_gp163;Dbxref=GeneID:928900;Name=OPG192;gbkey=Gene;gene=OPG192;gene_biotype=protein_coding;locus_tag=MPXV_gp163 +NC_003310.1 RefSeq CDS 166458 167006 . + 0 ID=cds-NP_536596.1;Parent=gene-MPXV_gp163;Dbxref=GenBank:NP_536596.1,GeneID:928900;Name=NP_536596.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: B8R%3B Virulence%2C ER resident%3B similar to VACV-WR B8R and VACV-Cop B7R;gbkey=CDS;gene=OPG192;locus_tag=MPXV_gp163;product=Virulence protein;protein_id=NP_536596.1 +NC_003310.1 RefSeq gene 167061 167864 . + . ID=gene-MPXV_gp164;Dbxref=GeneID:928897;Name=OPG193;gbkey=Gene;gene=OPG193;gene_biotype=protein_coding;locus_tag=MPXV_gp164 +NC_003310.1 RefSeq CDS 167061 167864 . + 0 ID=cds-NP_536597.1;Parent=gene-MPXV_gp164;Dbxref=GenBank:NP_536597.1,GeneID:928897;Name=NP_536597.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: B9R%3B secreted IFN-g binding protein%3B Soluble IFN-g receptor-like protein%3B similar to VACV-WR B9R and VACV-Cop B8R;gbkey=CDS;gene=OPG193;locus_tag=MPXV_gp164;product=Soluble interferon-gamma receptor-like protein;protein_id=NP_536597.1 +NC_003310.1 RefSeq gene 167957 168622 . + . ID=gene-MPXV_gp165;Dbxref=GeneID:928885;Name=OPG195;gbkey=Gene;gene=OPG195;gene_biotype=protein_coding;locus_tag=MPXV_gp165 +NC_003310.1 RefSeq CDS 167957 168622 . + 0 ID=cds-NP_536598.1;Parent=gene-MPXV_gp165;Dbxref=GenBank:NP_536598.1,GeneID:928885;Name=NP_536598.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: B10R%3B shope fibroma virus T4 protein-like%3B ER-localized apoptosis regulator%3B similar to VACV-WR B10R and VACV-Cop B9R;gbkey=CDS;gene=OPG195;locus_tag=MPXV_gp165;product=Intracellular viral protein;protein_id=NP_536598.1 +NC_003310.1 RefSeq sequence_feature 168727 169373 . + . ID=id-NC_003310.1:168727..169373;Note=OPG196;gbkey=misc_feature +NC_003310.1 RefSeq sequence_feature 169401 169677 . + . ID=id-NC_003310.1:169401..169677;Note=OPG197;gbkey=misc_feature +NC_003310.1 RefSeq gene 169744 170592 . + . ID=gene-MPXV_gp166;Dbxref=GeneID:928877;Name=OPG198;gbkey=Gene;gene=OPG198;gene_biotype=protein_coding;locus_tag=MPXV_gp166 +NC_003310.1 RefSeq CDS 169744 170592 . + 0 ID=cds-NP_536599.1;Parent=gene-MPXV_gp166;Dbxref=GenBank:NP_536599.1,GeneID:928877;Name=NP_536599.1;Note=Taxonomic breadth: poxviridae%3B Old product: B11R%3B protein kinase-like%3B similar to VACV-WR B11R and VACV-Cop B12R;gbkey=CDS;gene=OPG198;locus_tag=MPXV_gp166;product=Ser/thr kinase;protein_id=NP_536599.1 +NC_003310.1 RefSeq gene 170707 171741 . + . ID=gene-MPXV_gp167;Dbxref=GeneID:928996;Name=OPG199;gbkey=Gene;gene=OPG199;gene_biotype=protein_coding;locus_tag=MPXV_gp167 +NC_003310.1 RefSeq CDS 170707 171741 . + 0 ID=cds-NP_536600.1;Parent=gene-MPXV_gp167;Dbxref=GenBank:NP_536600.1,GeneID:928996;Name=NP_536600.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: B12R%3B serine protease inhibitor-like%2C SPI-2%3B inhibition of the IL-1b converting enzyme%3B apoptosis inhibition%3B Serpin 1%2C2%2C3%3B similar to VACV-WR B12R and VACV-Cop K2L;gbkey=CDS;gene=OPG199;locus_tag=MPXV_gp167;product=Serpin;protein_id=NP_536600.1 +NC_003310.1 RefSeq gene 171868 172317 . + . ID=gene-MPXV_gp168;Dbxref=GeneID:928905;Name=OPG200;gbkey=Gene;gene=OPG200;gene_biotype=protein_coding;locus_tag=MPXV_gp168 +NC_003310.1 RefSeq CDS 171868 172317 . + 0 ID=cds-NP_536601.1;Parent=gene-MPXV_gp168;Dbxref=GenBank:NP_536601.1,GeneID:928905;Name=NP_536601.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: B13R%3B Hypothetical protein%3B Putative tlr signaling inhibitor%3B similar to VACV-WR B13R and VACV-Cop C16L and B15R;gbkey=CDS;gene=OPG200;locus_tag=MPXV_gp168;product=Bcl-2-like protein;protein_id=NP_536601.1 +NC_003310.1 RefSeq gene 172403 173383 . + . ID=gene-MPXV_gp169;Dbxref=GeneID:928908;Name=OPG201;gbkey=Gene;gene=OPG201;gene_biotype=protein_coding;locus_tag=MPXV_gp169 +NC_003310.1 RefSeq CDS 172403 173383 . + 0 ID=cds-NP_536602.1;Parent=gene-MPXV_gp169;Dbxref=GenBank:NP_536602.1,GeneID:928908;Name=NP_536602.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: B14R%3B secreted IL-1b binding protein%3B 3 immunoglobulin domains%2C blocks IL-1b%3B inhibition of virus infection induced fever in mice%3B similar to VACV-WR B14R and VACV-Cop B16R;gbkey=CDS;gene=OPG201;locus_tag=MPXV_gp169;product=IL-1 receptor homolog;protein_id=NP_536602.1 +NC_003310.1 RefSeq sequence_feature 173429 173872 . - . ID=id-NC_003310.1:173429..173872;Note=OPG202;gbkey=misc_feature +NC_003310.1 RefSeq sequence_feature 174013 174141 . + . ID=id-NC_003310.1:174013..174141;Note=OPG203;gbkey=misc_feature +NC_003310.1 RefSeq gene 174203 175261 . + . ID=gene-MPXV_gp170;Dbxref=GeneID:928988;Name=OPG204;gbkey=Gene;gene=OPG204;gene_biotype=protein_coding;locus_tag=MPXV_gp170 +NC_003310.1 RefSeq CDS 174203 175261 . + 0 ID=cds-NP_536604.1;Parent=gene-MPXV_gp170;Dbxref=GenBank:NP_536604.1,GeneID:928988;Name=NP_536604.1;Note=Taxonomic breadth: orthopoxvirus%3B Old product: B16R%3B cell surface antigen and secreted IFN-a%3B IFN-alpha/beta receptor glycoprotein%3B similar to VACV-WR B16R and VACV-Cop B19R;gbkey=CDS;gene=OPG204;locus_tag=MPXV_gp170;product=IFN-alpha/beta-receptor-like secreted glycoprotein;protein_id=NP_536604.1 +NC_003310.1 RefSeq gene 175330 177711 . + . ID=gene-MPXV_gp171;Dbxref=GeneID:929045;Name=OPG205;gbkey=Gene;gene=OPG205;gene_biotype=protein_coding;locus_tag=MPXV_gp171 +NC_003310.1 RefSeq CDS 175330 177711 . + 0 ID=cds-NP_536605.1;Parent=gene-MPXV_gp171;Dbxref=GenBank:NP_536605.1,GeneID:929045;Name=NP_536605.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: B17R%3B ankyrin-like%3B similar to VACV-WR B17R and VACV-Cop B20R;gbkey=CDS;gene=OPG205;locus_tag=MPXV_gp171;product=Ankyrin repeat protein (44);protein_id=NP_536605.1 +NC_003310.1 RefSeq sequence_feature 177812 178611 . + . ID=id-NC_003310.1:177812..178611;Note=OPG206;gbkey=misc_feature +NC_003310.1 RefSeq gene 178963 180036 . + . ID=gene-MPXV_gp172;Dbxref=GeneID:928879;Name=OPG208;gbkey=Gene;gene=OPG208;gene_biotype=protein_coding;locus_tag=MPXV_gp172 +NC_003310.1 RefSeq CDS 178963 180036 . + 0 ID=cds-NP_536607.1;Parent=gene-MPXV_gp172;Dbxref=GenBank:NP_536607.1,GeneID:928879;Name=NP_536607.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: B19R%3B serine protease inhibitor-like%2C SPI-1%3B apoptosis inhibition%3B Serpin 1%2C2%2C3%3B Actual start may be at position 179%2C074%3B annotated start of ORF is missing approx. 17 AA compared to CPXVs%3B similar to VACV-WR B19R and VACV-Cop K2L;gbkey=CDS;gene=OPG208;locus_tag=MPXV_gp172;product=Serpin;protein_id=NP_536607.1 +NC_003310.1 RefSeq gene 180215 180787 . + . ID=gene-MPXV_gp173;Dbxref=GeneID:929039;Name=OPG209;gbkey=Gene;gene=OPG209;gene_biotype=protein_coding;locus_tag=MPXV_gp173 +NC_003310.1 RefSeq CDS 180215 180787 . + 0 ID=cds-NP_536608.1;Parent=gene-MPXV_gp173;Dbxref=GenBank:NP_536608.1,GeneID:929039;Name=NP_536608.1;Note=Old product: B20R%3B Hypothetical protein%3B similar to VACV-WR B20R and VACV-Cop C14L;gbkey=CDS;gene=OPG209;locus_tag=MPXV_gp173;product=Virulence protein;protein_id=NP_536608.1 +NC_003310.1 RefSeq gene 181046 186685 . + . ID=gene-MPXV_gp174;Dbxref=GeneID:929043;Name=OPG210;gbkey=Gene;gene=OPG210;gene_biotype=protein_coding;locus_tag=MPXV_gp174 +NC_003310.1 RefSeq CDS 181046 186685 . + 0 ID=cds-NP_536609.1;Parent=gene-MPXV_gp174;Dbxref=GenBank:NP_536609.1,GeneID:929043;Name=NP_536609.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: B21R%3B Surface glycoprotein%3B putative membrane-associated glycoprotein%3B cadherin-like domain%3B similar to VACV-WR B21R;gbkey=CDS;gene=OPG210;locus_tag=MPXV_gp174;product=B22R family protein;protein_id=NP_536609.1 +NC_003310.1 RefSeq sequence_feature 187004 187430 . + . ID=id-NC_003310.1:187004..187430;Note=OPG212;gbkey=misc_feature +NC_003310.1 RefSeq sequence_feature 187508 187985 . + . ID=id-NC_003310.1:187508..187985;Note=OPG213;gbkey=misc_feature +NC_003310.1 RefSeq sequence_feature 188150 188656 . + . ID=id-NC_003310.1:188150..188656;Note=OPG214;gbkey=misc_feature +NC_003310.1 RefSeq gene 188894 189355 . + . ID=gene-MPXV_gp176;Dbxref=GeneID:929035;Name=OPG005;gbkey=Gene;gene=OPG005;gene_biotype=protein_coding;locus_tag=MPXV_gp176 +NC_003310.1 RefSeq CDS 188894 189355 . + 0 ID=cds-NP_536612.1;Parent=gene-MPXV_gp176;Dbxref=GenBank:NP_536612.1,GeneID:929035;Name=NP_536612.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: N1R%3B VAC B15R-like%3B Hypothetical protein%3B Putative tlr signaling inhibitor%3B similar to VACV-WR N1R and VACV-Cop C16L and B22R;gbkey=CDS;gene=OPG005;locus_tag=MPXV_gp176;product=Bcl-2-like protein;protein_id=NP_536612.1 +NC_003310.1 RefSeq gene 190103 190633 . + . ID=gene-MPXV_gp177;Dbxref=GeneID:929031;Name=OPG016;gbkey=Gene;gene=OPG016;gene_biotype=protein_coding;locus_tag=MPXV_gp177 +NC_003310.1 RefSeq CDS 190103 190633 . + 0 ID=cds-NP_536614.1;Parent=gene-MPXV_gp177;Dbxref=GenBank:NP_536614.1,GeneID:929031;Name=NP_536614.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: N3R%3B similar to VACV-WR N3R;gbkey=CDS;gene=OPG016;locus_tag=MPXV_gp177;product=Brix domain protein;protein_id=NP_536614.1 +NC_003310.1 RefSeq long_terminal_repeat 190481 196858 . + . ID=id-NC_003310.1:190481..196858;gbkey=repeat_region;rpt_type=long_terminal_repeat +NC_003310.1 RefSeq gene 190749 192062 . + . ID=gene-MPXV_gp178;Dbxref=GeneID:929034;Name=OPG015;gbkey=Gene;gene=OPG015;gene_biotype=protein_coding;locus_tag=MPXV_gp178 +NC_003310.1 RefSeq CDS 190749 192062 . + 0 ID=cds-NP_536615.1;Parent=gene-MPXV_gp178;Dbxref=GenBank:NP_536615.1,GeneID:929034;Name=NP_536615.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: N4R%3B ankyrin-like%3B Ankyrin (CPXV-017)%3B similar to VACV-WR N4R;gbkey=CDS;gene=OPG015;locus_tag=MPXV_gp178;product=Ankyrin repeat protein (39);protein_id=NP_536615.1 +NC_003310.1 RefSeq gene 192219 193982 . + . ID=gene-MPXV_gp179;Dbxref=GeneID:929025;Name=OPG003;gbkey=Gene;gene=OPG003;gene_biotype=protein_coding;locus_tag=MPXV_gp179 +NC_003310.1 RefSeq CDS 192219 193982 . + 0 ID=cds-NP_536616.1;Parent=gene-MPXV_gp179;Dbxref=GenBank:NP_536616.1,GeneID:929025;Name=NP_536616.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: J1R%3B ankyrin-like%3B similar to VACV-WR J1R and VACV-Cop C19L;gbkey=CDS;gene=OPG003;locus_tag=MPXV_gp179;product=Ankyrin repeat protein (25);protein_id=NP_536616.1 +NC_003310.1 RefSeq gene 194073 195119 . + . ID=gene-MPXV_gp180;Dbxref=GeneID:929019;Name=OPG002;gbkey=Gene;gene=OPG002;gene_biotype=protein_coding;locus_tag=MPXV_gp180 +NC_003310.1 RefSeq CDS 194073 195119 . + 0 ID=cds-NP_536617.1;Parent=gene-MPXV_gp180;Dbxref=GenBank:NP_536617.1,GeneID:929019;Name=NP_536617.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: J2R%3B secreted TNF binding protein%3B TNF receptor (CrmB)%3B similar to VACV-WR J2R and VACV-Cop C22L;gbkey=CDS;gene=OPG002;locus_tag=MPXV_gp180;product=Crm-B secreted TNF-alpha-receptor-like protein;protein_id=NP_536617.1 +NC_003310.1 RefSeq gene 195248 195988 . + . ID=gene-MPXV_gp181;Dbxref=GeneID:929022;Name=OPG001;gbkey=Gene;gene=OPG001;gene_biotype=protein_coding;locus_tag=MPXV_gp181 +NC_003310.1 RefSeq CDS 195248 195988 . + 0 ID=cds-NP_536618.1;Parent=gene-MPXV_gp181;Dbxref=GenBank:NP_536618.1,GeneID:929022;Name=NP_536618.1;Note=Taxonomic breadth: chordopoxvirinae%3B Old product: J3R%3B Chemokine binding protein (Cop-C23L)%3B most abundant secreted protein%3B CC-chemokine binding protein%3B similar to VACV-WR J3R and VACV-Cop C23L and B29R;gbkey=CDS;gene=OPG001;locus_tag=MPXV_gp181;product=Chemokine binding protein;protein_id=NP_536618.1 + diff --git a/assets/NC_003310_clade_I.fasta b/assets/NC_003310_clade_I.fasta old mode 100644 new mode 100755 diff --git a/assets/NC_003310_clade_I.fasta.fai b/assets/NC_003310_clade_I.fasta.fai old mode 100644 new mode 100755 diff --git a/nextflow.config b/nextflow.config index 042f377..8754241 100755 --- a/nextflow.config +++ b/nextflow.config @@ -18,10 +18,20 @@ params { workflow = 'full' // References - fasta = "${projectDir}/assets/MPXV-UK_P2.noN.fasta" - fai = "${projectDir}/assets/MPXV-UK_P2.noN.fasta.fai" - gff = "${projectDir}/assets/UK-P2.noN.gff" - kraken_db = "/scicomp/reference/mpx_human_kdb" + if (params.clade == "cladeI"){ + fasta = "${projectDir}/assets/NC_003310_clade_I.fasta" + fai = "${projectDir}/assets/NC_003310_clade_I.fasta.fai" + gff = "${projectDir}/assets/NC_003310.gff3" + kraken_db = "s3://io-pe1-prod-ncezid-oamd-nextstrain/polkapox/mpx_human_kdb/" + } + else if (params.clade = "cladeII") { + fasta = "${projectDir}/assets/MPXV-UK_P2.noN.fasta" + fai = "${projectDir}/assets/MPXV-UK_P2.noN.fasta.fai" + gff = "${projectDir}/assets/UK-P2.noN.gff" + kraken_db = "s3://io-pe1-prod-ncezid-oamd-nextstrain/polkapox/mpx_human_kdb/" + // can also use older kraken db with only a single clade II reference and human, but this will result in fewer retained reads for anything non-clade II + // kraken_db = "s3://io-pe1-prod-ncezid-oamd-nextstrain/polkapox/mpx_human_kdb/" + } kraken2_tax_ids = "${projectDir}/assets/kraken2_tax_ids.txt" // MultiQC options From 9e2008f95818aafba599e68e1959e580c623cd5d Mon Sep 17 00:00:00 2001 From: ufp0 Date: Mon, 9 Sep 2024 12:19:14 -0400 Subject: [PATCH 18/42] updated --clade param --- bin/AssemblyGraph_gfaPy.py | 0 modules/nf-core/unicycler/main.nf | 1 + nextflow.config | 2 +- 3 files changed, 2 insertions(+), 1 deletion(-) mode change 100644 => 100755 bin/AssemblyGraph_gfaPy.py mode change 100755 => 100644 modules/nf-core/unicycler/main.nf diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py old mode 100644 new mode 100755 diff --git a/modules/nf-core/unicycler/main.nf b/modules/nf-core/unicycler/main.nf old mode 100755 new mode 100644 index 7a968cd..40acfbc --- a/modules/nf-core/unicycler/main.nf +++ b/modules/nf-core/unicycler/main.nf @@ -44,3 +44,4 @@ process UNICYCLER { END_VERSIONS """ } + diff --git a/nextflow.config b/nextflow.config index 8754241..ae2008c 100755 --- a/nextflow.config +++ b/nextflow.config @@ -16,7 +16,7 @@ params { file_levels = 'top' // run pipeline on top-level fastq files ('top') or nested files ('nested') paired = true workflow = 'full' - + clade = 'cladeII' // References if (params.clade == "cladeI"){ fasta = "${projectDir}/assets/NC_003310_clade_I.fasta" From 441730c01cf0a5766f95101d2d42163345cb0fda Mon Sep 17 00:00:00 2001 From: ufp0 Date: Mon, 9 Sep 2024 12:31:33 -0400 Subject: [PATCH 19/42] added extra error logging to graph recon script --- bin/AssemblyGraph_gfaPy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py index 6989101..e87db84 100755 --- a/bin/AssemblyGraph_gfaPy.py +++ b/bin/AssemblyGraph_gfaPy.py @@ -243,7 +243,7 @@ def get_final_sequence(contig_order, contig_orientation, segments): cleaned_contig_order = [contig.strip('+-') for contig in contig_order] for segment in segment_info: if (segment_info[segment]['coverage'] > 0.5) and (segment not in cleaned_contig_order): - check = 'WARNING: missing segments' + check = 'WARNING: missing segments or is not fully connected' return final_sequence, len(final_sequence), " ".join(final_order_orientation_copy_number), check def write_oriented_fasta(final_path, segments, output_file, input_file): From ebb31ee4d3ba91a11e3a9993be828ea1f722c84a Mon Sep 17 00:00:00 2001 From: ufp0 Date: Mon, 9 Sep 2024 12:41:57 -0400 Subject: [PATCH 20/42] fixed kraken_db path ; --- nextflow.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index ae2008c..e01e97a 100755 --- a/nextflow.config +++ b/nextflow.config @@ -22,13 +22,13 @@ params { fasta = "${projectDir}/assets/NC_003310_clade_I.fasta" fai = "${projectDir}/assets/NC_003310_clade_I.fasta.fai" gff = "${projectDir}/assets/NC_003310.gff3" - kraken_db = "s3://io-pe1-prod-ncezid-oamd-nextstrain/polkapox/mpx_human_kdb/" + kraken_db = "s3://io-pe1-prod-ncezid-oamd-nextstrain/polkapox/orthopox_kdb/" } else if (params.clade = "cladeII") { fasta = "${projectDir}/assets/MPXV-UK_P2.noN.fasta" fai = "${projectDir}/assets/MPXV-UK_P2.noN.fasta.fai" gff = "${projectDir}/assets/UK-P2.noN.gff" - kraken_db = "s3://io-pe1-prod-ncezid-oamd-nextstrain/polkapox/mpx_human_kdb/" + kraken_db = "s3://io-pe1-prod-ncezid-oamd-nextstrain/polkapox/orthopox_kdb/" // can also use older kraken db with only a single clade II reference and human, but this will result in fewer retained reads for anything non-clade II // kraken_db = "s3://io-pe1-prod-ncezid-oamd-nextstrain/polkapox/mpx_human_kdb/" } From 6e0f0804a48b9100354ffa1c103c452a309a7573 Mon Sep 17 00:00:00 2001 From: ufp0 Date: Thu, 12 Sep 2024 16:34:06 -0400 Subject: [PATCH 21/42] 1- updated assembly graph to have hard cutoff of 3x coverage to include in the itr for segment order/orientation, 2- updated graph recon submodule and subworkflows to properly name log and summary outputs and pass all channels correctly downstream, 3- fixed summarize qc to align the script with the new format of the log file coming out of graph recon, and to modified the kraken db variable to fix some bug where it wasnt grabbing the kraken-db within the function and writing to final outfile --- bin/AssemblyGraph_gfaPy.py | 12 +++--- bin/summarize_qc.py | 66 +++++++++++++++--------------- modules/local/graph_reconstruct.nf | 4 +- subworkflows/local/denovo.nf | 4 +- 4 files changed, 44 insertions(+), 42 deletions(-) diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py index e87db84..5d03ce8 100755 --- a/bin/AssemblyGraph_gfaPy.py +++ b/bin/AssemblyGraph_gfaPy.py @@ -103,7 +103,7 @@ def identify_itr( gfa_graph, segments ): """Identify all Inverted Terminal Repeats (ITRs) based on depth criteria and check if they are connected in the graph.""" depth_data = {seg.get('name'): float(seg.get('dp')) for seg in segments if 'dp' in seg.tagnames} lower_bound = 1.5 - upper_bound = 20 + upper_bound = 3 itrs = [contig for contig, depth in depth_data.items() if lower_bound < depth < upper_bound] itr_length = 0 @@ -277,8 +277,8 @@ def write_all_contigs(segments, output_file): def write_log_and_exit(log, status): # print(log) - log_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".log") - summary_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".summary") + log_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".assembly.log") + summary_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".assembly.summary") headers = ['sample', 'status', 'contig_order', 'contig_orientation', 'contig_order_orientation_copy_number', 'assembly_length', 'itr_length'] data = [] @@ -309,7 +309,7 @@ def process_graph(gfa_graph, output_dir, input_file, reference): log = {} input_with_ext = os.path.basename(input_file) input_base, _ = os.path.splitext(input_with_ext) - sample_name = input_base + sample_name = input_base.replace('.003_bridges_applied','') # Initial log entry log['00'] = {'step_name': "initialization", @@ -323,7 +323,7 @@ def process_graph(gfa_graph, output_dir, input_file, reference): 'output': {}} # Always write all contigs to a FASTA file at the start - write_all_contigs(gfa_graph.segments, os.path.join(output_dir, input_base + ".all_contigs.fasta")) + write_all_contigs(gfa_graph.segments, os.path.join(output_dir, sample_name + ".contigs.fasta")) # Start processing the graph filtered_edges, status = remove_self_loops(gfa_graph.edges) @@ -397,7 +397,7 @@ def process_graph(gfa_graph, output_dir, input_file, reference): write_log_and_exit(log, status) # Write the oriented contigs to a FASTA file - asm_name = input_base + ".assembly_asm.fasta" + asm_name = sample_name + ".assembly_asm.fasta" record = SeqRecord(Seq(final_sequence), id=input_base, description=final_order_orientation_copy_number) with open(os.path.join(output_dir, asm_name), 'w') as f: SeqIO.write(record, f, "fasta") diff --git a/bin/summarize_qc.py b/bin/summarize_qc.py index d95c0f6..90e17d8 100755 --- a/bin/summarize_qc.py +++ b/bin/summarize_qc.py @@ -68,7 +68,7 @@ def parse_args(): return parser.parse_args() -def get_raw_filt_counts(search_dir, sample): +def get_raw_filt_counts(sample): """ Get raw filter counts from fastp output :param search_dir: work directory :param sample: sample name @@ -91,7 +91,7 @@ def get_raw_filt_counts(search_dir, sample): return 'NA', 'NA' return total_raw_reads, total_filtered_reads -def get_kraken_stats(search_dir, sample, kraken_db, kraken_tax_ids): +def get_kraken_stats(sample, kdb, kraken_tax_ids): """ Get stats from kraken output :param search_dir: work directory :param sample: sample name @@ -103,8 +103,8 @@ def get_kraken_stats(search_dir, sample, kraken_db, kraken_tax_ids): total, opx_perc, human_perc, unclass_perc, kraken_db, k_tax_ids = ('NA',) * 6 kraken_reads = "{}.kraken2.classifiedreads.txt".format(sample) - ortho_reads = "**/{}*.opxreads.txt".format(sample) - + ortho_reads = "{}.opxreads.txt".format(sample) + if os.path.exists(kraken_reads) and os.path.exists(ortho_reads): try: k_data = pd.read_csv(kraken_reads, delim_whitespace=True, usecols=[0,1,2,3,4], header=None) @@ -134,9 +134,9 @@ def get_kraken_stats(search_dir, sample, kraken_db, kraken_tax_ids): lines = [line.strip() for line in l.readlines()] k_tax_ids = ', '.join(lines) - return total, opx_perc, human_perc, unclass_perc, kraken_db, k_tax_ids + return total, opx_perc, human_perc, unclass_perc, kdb, k_tax_ids -def get_flagstat_denovo(search_dir, sample): +def get_flagstat_denovo(sample): """ Get samtools flagstat results from denovo mapping :param search_dir: work directory :param sample: sample name @@ -162,7 +162,7 @@ def get_flagstat_denovo(search_dir, sample): return total_reads_denovo, mapped_reads_denovo, percent_mapped_denovo -def get_cov_stats(search_dir, sample, reference): +def get_cov_stats(sample, reference): """ Get coverage stats from samtools output :param search_dir: work directory :param sample: sample name @@ -193,7 +193,7 @@ def get_cov_stats(search_dir, sample, reference): return avg_dp, dp_gt_20, ref_genome -def get_gfa_stats(search_dir, sample): +def get_gfa_stats(sample): """ Get stats from Unicycler graph assembly output :param search_dir: work directory :param sample: sample name @@ -210,13 +210,14 @@ def get_gfa_stats(search_dir, sample): except: logger.error(f"Could not load data from {gfa_log}") return(['NA','NA','NA','NA','NA']) - - if len(parsed_json.keys()) == 11: + + if len(parsed_json.keys()) == 10: notes = 'GFA step complete' - successCode_step9 = list(parsed_json)[-2] + successCode_step8 = list(parsed_json)[-3] successCode_step10 = list(parsed_json)[-1] - final_order_orientation_copy_number = parsed_json[successCode_step9]['output']['final_order_orientation_copy_number'] - final_sequence_length = parsed_json[successCode_step9]['output']['final_sequence_length'] + + final_order_orientation_copy_number = parsed_json[successCode_step8]['output']['final_order_orientation_copy_number'] + final_sequence_length = parsed_json[successCode_step8]['output']['final_sequence_length'] status = parsed_json[successCode_step10]['status'] final_itr_length = parsed_json[successCode_step10]['output']['final_itr_length'] gfaResults = [final_order_orientation_copy_number, float(final_sequence_length), float(final_itr_length), status, notes] @@ -226,9 +227,10 @@ def get_gfa_stats(search_dir, sample): statusReport = 'FAIL' gfaResults = ['Unknown','Unknown','Unknown', statusReport, status] else: - status = 'Unicycler-GFA Log No Exist' + status = 'Unicycler-GFA Log DOES NOT Exist' statusReport = 'FAIL' gfaResults = ['Unknown','Unknown','Unknown', statusReport, status] + print(gfaResults) return gfaResults def fix_names(df): @@ -276,7 +278,7 @@ def fix_names(df): return df -def get_total_snps(search_dir, sample): +def get_total_snps(sample): """ Grab the tsv files from ivar output (ivar_variants dir) and get total number of SNPs :param search_dir: work directory :param sample: sample name @@ -296,7 +298,7 @@ def get_total_snps(search_dir, sample): return 'NA' return total_snps -def get_snp_metadata(search_dir, sample, coords): +def get_snp_metadata(sample, coords): """ Get number of SNPs for input coordinates from ivar_summary file (in variant_summaries dir) :param search_dir: work directory :param sample: sample name @@ -375,7 +377,7 @@ def count_ns_in_pileup(sample): def main(): args = parse_args() - summary_file = glob(os.path.join(args.analysis_dir, '**/*general_stats.txt'), recursive=True)[0] + summary_file = glob(os.path.join('**/*general_stats.txt'), recursive=True)[0] sample_file = args.samplesheet logger.info(f"Running summary_qc.py for {args.workflow}") try: @@ -408,7 +410,7 @@ def main(): fixed_summary.set_axis(new_col_names, axis=1, inplace=True) if args.workflow == 'denovo' or args.workflow == 'full': - contig_files = glob(os.path.join(args.analysis_dir, '**/*quast_num_contigs_1.txt'), recursive=True) + contig_files = glob(os.path.join('**/*quast_num_contigs_1.txt'), recursive=True) if contig_files: contig_file = contig_files[0] logger.info(f"{contig_file} found") @@ -437,35 +439,35 @@ def main(): fixed_summary['reads_total_bwa'] = pd.to_numeric(fixed_summary['reads_total_bwa'], errors='coerce') percent_mapped_bwa = (fixed_summary['reads_mapped_bwa'] / fixed_summary['reads_total_bwa']) * 100 fixed_summary['percent_mapped_bwa'] = np.where(fixed_summary['reads_mapped_bwa'].isna() | fixed_summary['reads_total_bwa'].isna(), np.nan, percent_mapped_bwa).round(2) - summary_full = fixed_summary.reindex(fixed_summary.columns.tolist() + ['raw_read_count_fastp', 'filtered_read_count_fastp', 'total_raw_reads', 'opx_percent_kraken','human_percent_kraken', 'unclass_percent_kraken', 'average_depth_bwa', 'count_20xdepth_bwa'], axis=1) summary_full.to_csv("before_adding_values.csv") - + # get data from other non multiqc input files: for sample in summary_full['sample']: - summary_full.loc[summary_full['sample'] == sample, ['opx_read_count_kraken', 'filtered_read_count_fastp']] = get_raw_filt_counts(args.analysis_dir, sample) - summary_full.loc[summary_full['sample'] == sample, ['total_raw_reads', 'opx_percent_kraken', 'human_percent_kraken', 'unclass_percent_kraken', 'kraken_db','kraken_tax_ids']] = get_kraken_stats(args.analysis_dir, sample, args.kraken_db, args.kraken_tax_ids) + summary_full.loc[summary_full['sample'] == sample, ['opx_read_count_kraken', 'filtered_read_count_fastp']] = get_raw_filt_counts(sample) + kraken_db = args.kraken_db + summary_full.loc[summary_full['sample'] == sample, ['total_raw_reads', 'opx_percent_kraken', 'human_percent_kraken', 'unclass_percent_kraken', 'kraken_db','kraken_tax_ids']] = get_kraken_stats(sample, kraken_db, args.kraken_tax_ids) if args.workflow == 'ref_based': - summary_full.loc[summary_full['sample'] == sample, ['average_depth_bwa', 'count_20xdepth_bwa','reference_genome']] = get_cov_stats(args.analysis_dir, sample, args.reference_genome) - summary_full.loc[summary_full['sample'] == sample, ['total_snps']] = get_total_snps(args.analysis_dir,sample) + summary_full.loc[summary_full['sample'] == sample, ['average_depth_bwa', 'count_20xdepth_bwa','reference_genome']] = get_cov_stats(sample, args.reference_genome) + summary_full.loc[summary_full['sample'] == sample, ['total_snps']] = get_total_snps(sample) summary_full.loc[summary_full['sample'] == sample, ['corrected_Ns']] = count_ns_in_pileup(sample) #logic to handle if a user is not interested in variant filtering if args.filter == 'true': - summary_full.loc[summary_full['sample'] == sample, [f'{args.locus1}_SNPs',f'{args.locus2}_SNPs']] = get_snp_metadata(args.analysis_dir, sample, args.coords) + summary_full.loc[summary_full['sample'] == sample, [f'{args.locus1}_SNPs',f'{args.locus2}_SNPs']] = get_snp_metadata(sample, args.coords) elif args.workflow == 'denovo': - summary_full.loc[summary_full['sample'] == sample, ['orientation_copy_number' ,'sequence_length', 'itr_length', 'gfa_status', 'gfa_notes']] = get_gfa_stats(args.analysis_dir, sample) - summary_full.loc[summary_full['sample'] == sample, ['total_reads_denovo','mapped_reads_denovo','percent_mapped_denovo']] = get_flagstat_denovo(args.analysis_dir, sample) + summary_full.loc[summary_full['sample'] == sample, ['orientation_copy_number' ,'sequence_length', 'itr_length', 'gfa_status', 'gfa_notes']] = get_gfa_stats(sample) + summary_full.loc[summary_full['sample'] == sample, ['total_reads_denovo','mapped_reads_denovo','percent_mapped_denovo']] = get_flagstat_denovo(sample) summary_full.loc[summary_full['sample'] == sample, ['corrected_snps','corrected_indels']] = get_polish_stats(sample) summary_full.loc[summary_full['sample'] == sample, ['corrected_Ns']] = count_ns_in_pileup(sample) elif args.workflow == 'full': - summary_full.loc[summary_full['sample'] == sample, ['average_depth_bwa', 'count_20xdepth_bwa', 'reference_genome']] = get_cov_stats(args.analysis_dir, sample, args.reference_genome) - summary_full.loc[summary_full['sample'] == sample, ['total_snps']] = get_total_snps(args.analysis_dir,sample) + summary_full.loc[summary_full['sample'] == sample, ['average_depth_bwa', 'count_20xdepth_bwa', 'reference_genome']] = get_cov_stats(sample, args.reference_genome) + summary_full.loc[summary_full['sample'] == sample, ['total_snps']] = get_total_snps(sample) summary_full.loc[summary_full['sample'] == sample, ['corrected_snps','corrected_indels']] = get_polish_stats(sample) summary_full.loc[summary_full['sample'] == sample, ['corrected_Ns']] = count_ns_in_pileup(sample) - summary_full.loc[summary_full['sample'] == sample, ['orientation_copy_number' ,'sequence_length', 'itr_length', 'gfa_status', 'gfa_notes']] = get_gfa_stats(args.analysis_dir, sample) - summary_full.loc[summary_full['sample'] == sample, ['total_reads_denovo','mapped_reads_denovo','percent_mapped_denovo']] = get_flagstat_denovo(args.analysis_dir, sample) + summary_full.loc[summary_full['sample'] == sample, ['orientation_copy_number' ,'sequence_length', 'itr_length', 'gfa_status', 'gfa_notes']] = get_gfa_stats(sample) + summary_full.loc[summary_full['sample'] == sample, ['total_reads_denovo','mapped_reads_denovo','percent_mapped_denovo']] = get_flagstat_denovo(sample) if args.filter == 'true': - summary_full.loc[summary_full['sample'] == sample, [f'{args.locus1}_SNPs',f'{args.locus2}_SNPs']] = get_snp_metadata(args.analysis_dir, sample, args.coords) + summary_full.loc[summary_full['sample'] == sample, [f'{args.locus1}_SNPs',f'{args.locus2}_SNPs']] = get_snp_metadata(sample, args.coords) # final column order if args.workflow == 'filter_reads': diff --git a/modules/local/graph_reconstruct.nf b/modules/local/graph_reconstruct.nf index 7ba3283..58e3337 100755 --- a/modules/local/graph_reconstruct.nf +++ b/modules/local/graph_reconstruct.nf @@ -8,8 +8,8 @@ process GRAPH_RECON { output: tuple val(meta), path('*asm.fasta') , emit: gfa_assembly optional true - path '*longest.fasta' , emit: gfa_longest optional true - tuple val(meta), path('*.contigs.fasta') , emit: unicycler_contigs optional true + // path '*longest.fasta' , emit: gfa_longest optional true + tuple val(meta), path('*contigs.fasta') , emit: unicycler_contigs optional true path '*.log' , emit: log path '*.summary' , emit: summary optional true path "versions.yml" , emit: versions diff --git a/subworkflows/local/denovo.nf b/subworkflows/local/denovo.nf index 3489cc7..80064c8 100755 --- a/subworkflows/local/denovo.nf +++ b/subworkflows/local/denovo.nf @@ -76,8 +76,8 @@ workflow DENOVO { ch_polishing_input, false ) - ch_gfapolish_compare = IVAR_CONSENSUS_POLISH.out.fasta - ch_tocompare = ch_gfaassm_compare.join(ch_gfapolish_compare, by: 0) + //ch_gfapolish_compare = IVAR_CONSENSUS_POLISH.out.fasta + ch_tocompare = ch_gfaassm_compare.join(IVAR_CONSENSUS_POLISH.out.fasta, by: 0) //join unicycler contigs with the polished fasta, and only keep contigs if fasta doesn't exist ch_assemblies = ch_uni_contigs.join(IVAR_CONSENSUS_POLISH.out.fasta, remainder: true) From 4b794942a8316c489b3d72846f5d27e71c3d4b61 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Wed, 25 Sep 2024 20:07:14 -0400 Subject: [PATCH 22/42] fixed bug where contigs were being multiplied by depth which caused ITRs to be double the target length --- bin/AssemblyGraph_gfaPy.py | 76 ++++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 23 deletions(-) diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py index 5d03ce8..5463280 100755 --- a/bin/AssemblyGraph_gfaPy.py +++ b/bin/AssemblyGraph_gfaPy.py @@ -35,7 +35,6 @@ def read_gfa_file(gfa_path): """Read GFA file into gfapy python structure.""" try: gfa_graph = gfapy.Gfa.from_file(gfa_path) - # print(gfa_graph.edges) if len(gfa_graph.edges) == 0: return None, "WARNING: GFA file only contains segment lines" return gfa_graph, "PASS" @@ -99,26 +98,39 @@ def create_filtered_graph(links): return graph, "PASS" -def identify_itr( gfa_graph, segments ): +def identify_itr(gfa_graph, segments): """Identify all Inverted Terminal Repeats (ITRs) based on depth criteria and check if they are connected in the graph.""" depth_data = {seg.get('name'): float(seg.get('dp')) for seg in segments if 'dp' in seg.tagnames} lower_bound = 1.5 +<<<<<<< HEAD upper_bound = 3 itrs = [contig for contig, depth in depth_data.items() if lower_bound < depth < upper_bound] +======= + upper_bound = 20 + potential_itrs = [contig for contig, depth in depth_data.items() if lower_bound < depth < upper_bound] + + # Create a subgraph with only potential ITRs + subgraph = nx.Graph() + for link in gfa_graph.edges: + if link.from_name in potential_itrs and link.to_name in potential_itrs: + subgraph.add_edge(link.from_name, link.to_name) +>>>>>>> 519d3b5 (fixed bug where contigs were being multiplied by depth which caused ITRs to be double the target length) - itr_length = 0 - visited = set() - - for seg in segments: - if seg.name in itrs and seg.name not in visited: - visited.add(seg.name) # Mark this segment as visited - itr_length += len(seg.sequence) # Accumulate the sequence length - + # Find connected components in the subgraph + connected_components = list(nx.connected_components(subgraph)) + # Select the largest connected component as the ITRs + if connected_components: + itrs = max(connected_components, key=len) + else: + itrs = [] + + itr_length = sum(len(seg.sequence) for seg in segments if seg.name in itrs) + + print("contigs in ITR", itrs) print("Total ITR sequence length:", itr_length) - return itrs, itr_length + return list(itrs), itr_length def get_final_path(gfa_graph, filtered_graph, segments): - print(gfa_graph) """Find all longest paths in the graph starting from any ITR.""" itrs, itr_length = identify_itr(gfa_graph, segments) if not itrs: @@ -136,13 +148,19 @@ def get_final_path(gfa_graph, filtered_graph, segments): max_length = path_length elif path_length == max_length: longest_paths.append(path) # Add path to the list of longest paths - itr_order = [] + if longest_paths: - print(longest_paths) + print("longest path =", longest_paths) final_path = longest_paths[0] - itr_order.extend(c for c in final_path if c in itrs) - final_path.extend(itr_order[::-1]) - #print(final_path) + + # Ensure ITRs are not duplicated and are correctly oriented + left_itrs = [itr for itr in final_path if itr in itrs] + right_itrs = [itr for itr in reversed(final_path) if itr in itrs] + + # Construct the final path with ITRs on both ends, ensuring no duplicates + middle_path = [node for node in final_path if node not in itrs] + final_path = left_itrs + middle_path + right_itrs + return final_path, f"PASS: Found {len(longest_paths)} longest path(s) of length {max_length}" else: return [], "WARNING: No path found starting from any ITR." @@ -209,11 +227,12 @@ def get_final_orientation(final_path, lnks, longest_contig, longest_orient): contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient flag=1 check="PASS" - # print(final_path) - # print(contig_orientation) + print("final path =",final_path) + print("final contig orientation",contig_orientation) return contig_orientation, check def get_final_sequence(contig_order, contig_orientation, segments): + print("contig order used for final sequence", contig_order) segment_info = {} for segment in segments: segment_count = contig_order.count(segment.get('name')) @@ -226,25 +245,34 @@ def get_final_sequence(contig_order, contig_orientation, segments): final_sequence = '' final_order_orientation_copy_number = [] + for i in range(len(contig_order)): segment_name = contig_order[i].strip('+').strip('-') # Strip orientation symbols - # print(f"Processing segment: {segment_name}") - sequence = segment_info[segment_name]['sequence'] * round(segment_info[segment_name]['coverage']) + sequence = segment_info[segment_name]['sequence'] if contig_orientation[i] == -1: - sequence = segment_info[segment_name]['sequence_rc'] * round(segment_info[segment_name]['coverage']) + sequence = segment_info[segment_name]['sequence_rc'] orientation = '+' if contig_orientation[i] == 1 else '-' order_orientation_copy_number = '%s%s' % (orientation, segment_name) if round(segment_info[segment_name]['coverage']) > 1: order_orientation_copy_number = '%sx%s' % (order_orientation_copy_number, round(segment_info[segment_name]['coverage'])) final_sequence = final_sequence + sequence final_order_orientation_copy_number.append(order_orientation_copy_number) + + final_sequence_length = len(final_sequence) + print("Final sequence length:", final_sequence_length) + check = "PASS" # are all segments in final_sequence? cleaned_contig_order = [contig.strip('+-') for contig in contig_order] for segment in segment_info: if (segment_info[segment]['coverage'] > 0.5) and (segment not in cleaned_contig_order): check = 'WARNING: missing segments or is not fully connected' +<<<<<<< HEAD return final_sequence, len(final_sequence), " ".join(final_order_orientation_copy_number), check +======= + + return final_sequence, final_sequence_length, " ".join(final_order_orientation_copy_number), check +>>>>>>> 519d3b5 (fixed bug where contigs were being multiplied by depth which caused ITRs to be double the target length) def write_oriented_fasta(final_path, segments, output_file, input_file): """Write the segments in the specified orientation to a single FASTA entry with the input file name as the header.""" @@ -263,7 +291,6 @@ def write_oriented_fasta(final_path, segments, output_file, input_file): # Use the base name of the input file as the ID for the SeqRecord input_base_name = os.path.splitext(os.path.basename(input_file))[0] record = SeqRecord(Seq(full_sequence), id=input_base_name, description="All contigs concatenated based on the final path") - # Write the single record to the output file with open(output_file, 'w') as f: SeqIO.write(record, f, "fasta") @@ -276,7 +303,10 @@ def write_all_contigs(segments, output_file): SeqIO.write(record, f, "fasta") def write_log_and_exit(log, status): +<<<<<<< HEAD # print(log) +======= +>>>>>>> 519d3b5 (fixed bug where contigs were being multiplied by depth which caused ITRs to be double the target length) log_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".assembly.log") summary_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".assembly.summary") From 5ade21be6508b5cbbbacbe4d7606b782bb50de59 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Wed, 25 Sep 2024 20:13:47 -0400 Subject: [PATCH 23/42] fixing assembly graph --- bin/AssemblyGraph_gfaPy.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py index 5463280..3333c5f 100755 --- a/bin/AssemblyGraph_gfaPy.py +++ b/bin/AssemblyGraph_gfaPy.py @@ -102,10 +102,6 @@ def identify_itr(gfa_graph, segments): """Identify all Inverted Terminal Repeats (ITRs) based on depth criteria and check if they are connected in the graph.""" depth_data = {seg.get('name'): float(seg.get('dp')) for seg in segments if 'dp' in seg.tagnames} lower_bound = 1.5 -<<<<<<< HEAD - upper_bound = 3 - itrs = [contig for contig, depth in depth_data.items() if lower_bound < depth < upper_bound] -======= upper_bound = 20 potential_itrs = [contig for contig, depth in depth_data.items() if lower_bound < depth < upper_bound] @@ -114,7 +110,6 @@ def identify_itr(gfa_graph, segments): for link in gfa_graph.edges: if link.from_name in potential_itrs and link.to_name in potential_itrs: subgraph.add_edge(link.from_name, link.to_name) ->>>>>>> 519d3b5 (fixed bug where contigs were being multiplied by depth which caused ITRs to be double the target length) # Find connected components in the subgraph connected_components = list(nx.connected_components(subgraph)) @@ -267,12 +262,8 @@ def get_final_sequence(contig_order, contig_orientation, segments): for segment in segment_info: if (segment_info[segment]['coverage'] > 0.5) and (segment not in cleaned_contig_order): check = 'WARNING: missing segments or is not fully connected' -<<<<<<< HEAD - return final_sequence, len(final_sequence), " ".join(final_order_orientation_copy_number), check -======= return final_sequence, final_sequence_length, " ".join(final_order_orientation_copy_number), check ->>>>>>> 519d3b5 (fixed bug where contigs were being multiplied by depth which caused ITRs to be double the target length) def write_oriented_fasta(final_path, segments, output_file, input_file): """Write the segments in the specified orientation to a single FASTA entry with the input file name as the header.""" @@ -303,10 +294,6 @@ def write_all_contigs(segments, output_file): SeqIO.write(record, f, "fasta") def write_log_and_exit(log, status): -<<<<<<< HEAD - # print(log) -======= ->>>>>>> 519d3b5 (fixed bug where contigs were being multiplied by depth which caused ITRs to be double the target length) log_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".assembly.log") summary_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".assembly.summary") From 88a144ac2766a0efaec83ce07611cfe9fc9dbc41 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Wed, 25 Sep 2024 20:14:47 -0400 Subject: [PATCH 24/42] updated param --- bin/AssemblyGraph_gfaPy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py index 3333c5f..bedf92b 100755 --- a/bin/AssemblyGraph_gfaPy.py +++ b/bin/AssemblyGraph_gfaPy.py @@ -102,7 +102,7 @@ def identify_itr(gfa_graph, segments): """Identify all Inverted Terminal Repeats (ITRs) based on depth criteria and check if they are connected in the graph.""" depth_data = {seg.get('name'): float(seg.get('dp')) for seg in segments if 'dp' in seg.tagnames} lower_bound = 1.5 - upper_bound = 20 + upper_bound = 30 potential_itrs = [contig for contig, depth in depth_data.items() if lower_bound < depth < upper_bound] # Create a subgraph with only potential ITRs From e19ba9f8e803e39ead83193a57c715fea78a7fb1 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Wed, 2 Oct 2024 14:48:01 -0400 Subject: [PATCH 25/42] fixed bug in assembly script to correctly determine the orientation of the ITRs. The new version keeps all longest paths, determines the orientations of all paths in the list, then uses quast to find the best alignment with the reference and keep that longest path as the final path under the assumption that the wrongly oriented path will align more poorly." --- bin/AssemblyGraph_gfaPy.py | 406 ++++++++++++++++++++++--------------- 1 file changed, 237 insertions(+), 169 deletions(-) diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py index bedf92b..cd939c1 100755 --- a/bin/AssemblyGraph_gfaPy.py +++ b/bin/AssemblyGraph_gfaPy.py @@ -1,22 +1,22 @@ #!/usr/bin/env python3 ### Written by S.Morrison, K. Knipe 20221018 -### Refactored by Kyle O'Connell with help from GPT 4o and Gemini 1.5 Pro 20240730 +### Refactored by Kyle O'Connell with help from GPT 4o, o1-preview, and Gemini 1.5 Pro 20240730 -import gzip -import argparse import os +import re +import gzip import sys +import json +import gfapy +import shutil import fnmatch +import argparse import subprocess -import re -import gfapy import networkx as nx +from Bio import SeqIO from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord -from Bio import SeqIO -import json -import shutil def clean_graph_tags(input_file, output_file): # Define the regex pattern to match the LB and CL tags @@ -102,7 +102,7 @@ def identify_itr(gfa_graph, segments): """Identify all Inverted Terminal Repeats (ITRs) based on depth criteria and check if they are connected in the graph.""" depth_data = {seg.get('name'): float(seg.get('dp')) for seg in segments if 'dp' in seg.tagnames} lower_bound = 1.5 - upper_bound = 30 + upper_bound = 20 potential_itrs = [contig for contig, depth in depth_data.items() if lower_bound < depth < upper_bound] # Create a subgraph with only potential ITRs @@ -121,11 +121,11 @@ def identify_itr(gfa_graph, segments): itr_length = sum(len(seg.sequence) for seg in segments if seg.name in itrs) - print("contigs in ITR", itrs) - print("Total ITR sequence length:", itr_length) + # print("contigs in ITR", itrs) + # print("Total ITR sequence length:", itr_length) return list(itrs), itr_length -def get_final_path(gfa_graph, filtered_graph, segments): +def get_final_paths(gfa_graph, filtered_graph, segments): """Find all longest paths in the graph starting from any ITR.""" itrs, itr_length = identify_itr(gfa_graph, segments) if not itrs: @@ -139,24 +139,25 @@ def get_final_path(gfa_graph, filtered_graph, segments): for path in nx.all_simple_paths(filtered_graph, source=itr, target=contig): path_length = len(path) if path_length > max_length: - longest_paths = [path] # Start a new list with the new longest path + longest_paths = [path] # Start a naew list with the new longest path max_length = path_length elif path_length == max_length: longest_paths.append(path) # Add path to the list of longest paths - + final_paths = [] if longest_paths: - print("longest path =", longest_paths) - final_path = longest_paths[0] + print("longest path list =", longest_paths) # Ensure ITRs are not duplicated and are correctly oriented - left_itrs = [itr for itr in final_path if itr in itrs] - right_itrs = [itr for itr in reversed(final_path) if itr in itrs] - - # Construct the final path with ITRs on both ends, ensuring no duplicates - middle_path = [node for node in final_path if node not in itrs] - final_path = left_itrs + middle_path + right_itrs + for path in longest_paths: + left_itrs = [itr for itr in path if itr in itrs] + right_itrs = [itr for itr in reversed(path) if itr in itrs] - return final_path, f"PASS: Found {len(longest_paths)} longest path(s) of length {max_length}" + # Construct the final path with ITRs on both ends, ensuring no duplicates + middle_path = [node for node in path if node not in itrs] + final_path = left_itrs + middle_path + right_itrs + final_paths.append(final_path) + + return final_paths, itr_length, f"PASS: Found {len(longest_paths)} longest path(s) of length {max_length}" else: return [], "WARNING: No path found starting from any ITR." @@ -164,106 +165,110 @@ def orient_longest_contig(query, reference, blast_db_dir): blastResults = query + "_blast.out" blast_db_path = os.path.join(blast_db_dir, query + "_DB") makeblastdb_command = ["makeblastdb", "-in", query, "-out", blast_db_path, "-dbtype", "nucl"] - blastn_command = ["blastn", "-query", reference, "-db", blast_db_path, "-evalue", ".00001", "-outfmt", "6 qseqid sseqid pident length qcovs sstart send sseq mismatch gapopen qlen slen bitscore", "-out", blastResults] + blastn_command = ["blastn", "-query", reference, "-db", blast_db_path, "-evalue", "1e-10", "-word_size", "28", "-outfmt", "6 qseqid sseqid pident length qcovs sstart send mismatch gapopen qlen slen bitscore", "-out", blastResults] - print(f"Running command: {' '.join(makeblastdb_command)}") - subprocess.call(makeblastdb_command, shell=False) + #print(f"Running command: {' '.join(makeblastdb_command)}") + result = subprocess.run(makeblastdb_command, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - print(f"Running command: {' '.join(blastn_command)}") - subprocess.call(blastn_command, shell=False) + #print(f"Running command: {' '.join(blastn_command)}") + result2 = subprocess.run(blastn_command, shell=False) # Check if blastResults file is created and contains results if not os.path.exists(blastResults): print(f"BLAST results file not created: {blastResults}") return None, "FAIL" - + with open(blastResults, 'r') as e: for line in e: - f13LInfo = line.split('\t') - sstart = int(f13LInfo[5]) - send = int(f13LInfo[6]) + blastHits = line.split('\t') + sstart = int(blastHits[5]) + send = int(blastHits[6]) orientation = 1 if sstart < send else int(-1) return orientation, "PASS" -def get_final_orientation(final_path, lnks, longest_contig, longest_orient): - contig_orientation = [0] * len(final_path) - for i in range(final_path.index(longest_contig), len(final_path)): - if i == final_path.index(longest_contig): - contig_orientation[i] = longest_orient - else: - flag=0 - for link in lnks: - if (link.from_name == final_path[i-1] and link.to_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) - contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient - flag=1 - if flag == 0: +def get_final_orientation(final_paths, lnks, longest_contig, longest_orient): + contig_orientations = [] + status = "PASS" + for path in final_paths: + if longest_contig not in path: + print("Longest contig not in path, skipping orientation determination for this path.") + contig_orientations.append(None) + continue + contig_orientation = [0] * len(path) + index = path.index(longest_contig) + # Forward direction + for i in range(index, len(path)): + if i == index: + contig_orientation[i] = longest_orient + else: + flag = 0 for link in lnks: - if (link.to_name == final_path[i-1] and link.from_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) + if (link.from_name == path[i-1] and link.to_name == path[i]): + from_orient = 1 if link.from_orient == '+' else -1 + to_orient = 1 if link.to_orient == '+' else -1 contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient - flag=1 - - for i in range(final_path.index(longest_contig)-1, -1 ,-1): - flag=0 - for link in lnks: - if (link.to_name == final_path[i+1] and link.from_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) - contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient - flag=1 - if flag == 0: + flag = 1 + break + if flag == 0: + for link in lnks: + if (link.to_name == path[i-1] and link.from_name == path[i]): + from_orient = 1 if link.from_orient == '+' else -1 + to_orient = 1 if link.to_orient == '+' else -1 + contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient + flag = 1 + break + if flag == 0: + print(f"Unable to determine orientation between {path[i-1]} and {path[i]}.") + contig_orientation = None + break + if contig_orientation is None: + break + if contig_orientation is None: + contig_orientations.append(None) + continue + # Backward direction + for i in range(index - 1, -1, -1): + flag = 0 for link in lnks: - if (link.from_name == final_path[i+1] and link.to_name == final_path[i]): - from_orient = 1 if link.from_orient == '+' else int(-1) - to_orient = 1 if link.to_orient == '+' else int(-1) + if (link.to_name == path[i+1] and link.from_name == path[i]): + from_orient = 1 if link.from_orient == '+' else -1 + to_orient = 1 if link.to_orient == '+' else -1 contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient - flag=1 - check="PASS" - print("final path =",final_path) - print("final contig orientation",contig_orientation) - return contig_orientation, check - -def get_final_sequence(contig_order, contig_orientation, segments): - print("contig order used for final sequence", contig_order) - segment_info = {} - for segment in segments: - segment_count = contig_order.count(segment.get('name')) - coverage = float(segment.get('dp')) if segment_count == 0 else float(segment.get('dp')) / contig_order.count(segment.get('name')) - segment_info[segment.get('name')] = { - 'coverage': coverage, - 'sequence': Seq(segment.get('sequence')), - 'sequence_rc': Seq(segment.get('sequence')).reverse_complement() - } - - final_sequence = '' - final_order_orientation_copy_number = [] - - for i in range(len(contig_order)): - segment_name = contig_order[i].strip('+').strip('-') # Strip orientation symbols - sequence = segment_info[segment_name]['sequence'] - if contig_orientation[i] == -1: - sequence = segment_info[segment_name]['sequence_rc'] - orientation = '+' if contig_orientation[i] == 1 else '-' - order_orientation_copy_number = '%s%s' % (orientation, segment_name) - if round(segment_info[segment_name]['coverage']) > 1: - order_orientation_copy_number = '%sx%s' % (order_orientation_copy_number, round(segment_info[segment_name]['coverage'])) - final_sequence = final_sequence + sequence - final_order_orientation_copy_number.append(order_orientation_copy_number) - + flag = 1 + break + if flag == 0: + for link in lnks: + if (link.from_name == path[i+1] and link.to_name == path[i]): + from_orient = 1 if link.from_orient == '+' else -1 + to_orient = 1 if link.to_orient == '+' else -1 + contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient + flag = 1 + break + if flag == 0: + print(f"Unable to determine orientation between {path[i+1]} and {path[i]}.") + contig_orientation = None + break + contig_orientations.append(contig_orientation) + print("Final orientations",contig_orientations) + return contig_orientations, status + +def get_final_sequence(oriented_path, orientation, segments): + """Generate the final sequence for a given path and orientation.""" + segment_dict = {seg.name: seg.sequence for seg in segments} # Create a dictionary of segment names to sequences + final_sequence = "" # Initialize an empty string to accumulate the final sequence + + for i, segment_name in enumerate(oriented_path): + seq = segment_dict[segment_name.strip('+').strip('-')] # Remove orientation symbols for lookup + # Check if the segment should be reversed + if orientation[i] == -1: + seq = str(Seq(seq).reverse_complement()) # Reverse complement the sequence if needed + + final_sequence += seq # Concatenate sequence + final_sequence_length = len(final_sequence) - print("Final sequence length:", final_sequence_length) - - check = "PASS" - # are all segments in final_sequence? - cleaned_contig_order = [contig.strip('+-') for contig in contig_order] - for segment in segment_info: - if (segment_info[segment]['coverage'] > 0.5) and (segment not in cleaned_contig_order): - check = 'WARNING: missing segments or is not fully connected' - - return final_sequence, final_sequence_length, " ".join(final_order_orientation_copy_number), check + final_order_orientation_copy_number = ",".join([f"{seg}{orientation[i]}" for i, seg in enumerate(oriented_path)]) + + return final_sequence, final_sequence_length, final_order_orientation_copy_number, "PASS" def write_oriented_fasta(final_path, segments, output_file, input_file): """Write the segments in the specified orientation to a single FASTA entry with the input file name as the header.""" @@ -303,15 +308,12 @@ def write_log_and_exit(log, status): data.append(log['00']['input']['sample_name']) data.append(status) if '03' in log: - data.append(",".join(str(i) for i in log['03']['output']['final_path'])) + data.append(",".join(str(i) for i in log['03']['output']['final_paths'])) if '06' in log: - data.append(",".join(str(i) for i in log['06']['output']['final_orientation'])) + data.append(",".join(str(i) for i in log['06']['output']['contig_orientations'])) if '07' in log: - data.append(str(log['07']['output']['final_order_orientation_copy_number'])) - data.append(str(log['07']['output']['final_sequence_length'])) - if '09' in log: - data.append(str(log['09']['output']['final_itr_length'])) - + data.append(str(log['07']['final_order_orientation_copy_number'])) + data.append(str(log['07']['final_sequence_length'])) with open(summary_file, 'w') as f: f.write('\t'.join(headers) + '\n') f.write('\t'.join(data) + '\n') @@ -344,36 +346,46 @@ def process_graph(gfa_graph, output_dir, input_file, reference): # Start processing the graph filtered_edges, status = remove_self_loops(gfa_graph.edges) - log['01'] = {'step_name': "remove_self_loops", - 'step_description': "Remove self-loops from link information", - 'status': status, - 'output': {'filtered_edges': [str(edge) for edge in filtered_edges]}} + log['01'] = { + 'step_name': "remove_self_loops", + 'step_description': "Remove self-loops from link information", + 'status': status, + 'output': {'filtered_edges': [str(edge) for edge in filtered_edges]} + } if status != "PASS": write_log_and_exit(log, status) filtered_graph, status = create_filtered_graph(filtered_edges) - log['02'] = {'step_name': "create_filtered_graph", - 'step_description': "Create a filtered NetworkX graph from links and remove disconnected nodes", - 'status': status, - 'output': {'filtered_graph': str(filtered_graph)}} + log['02'] = { + 'step_name': "create_filtered_graph", + 'step_description': "Create a filtered NetworkX graph from links and remove disconnected nodes", + 'status': status, + 'output': {'filtered_graph': str(filtered_graph)} + } if status != "PASS": write_log_and_exit(log, status) filtered_segments = filter_segments_by_graph(gfa_graph.segments, filtered_graph) - final_path, status = get_final_path(gfa_graph, filtered_graph, filtered_segments) - log['03'] = {'step_name': "get_final_path", - 'step_description': "Find all longest paths in the graph starting from any ITR", - 'status': status, - 'output': {'final_path': final_path}} + + # Find all longest paths + final_paths, itr_length, status = get_final_paths(gfa_graph, filtered_graph, filtered_segments) + log['03'] = { + 'step_name': "get_final_paths", + 'step_description': "Find all longest paths in the graph starting from any ITR", + 'status': status, + 'output': {'final_paths': final_paths,'itr_length':itr_length} + } if not status.startswith("PASS"): write_log_and_exit(log, status) # Find the longest contig longest_contig, status, longest_contig_file = find_longest_contig(filtered_segments, output_dir) - log['04'] = {'step_name': "find_longest_contig", - 'step_description': "Find the longest contig based on length", - 'status': status, - 'output': {'longest_contig': longest_contig}} + log['04'] = { + 'step_name': "find_longest_contig", + 'step_description': "Find the longest contig based on length", + 'status': status, + 'output': {'longest_contig': longest_contig} + } if status != "PASS": write_log_and_exit(log, status) @@ -383,57 +395,113 @@ def process_graph(gfa_graph, output_dir, input_file, reference): # Determine the orientation of the longest contig longest_orient, status = orient_longest_contig(longest_contig_file, reference, blast_db_dir) - log['05'] = {'step_name': "orient_longest_contig", - 'step_description': "Determine the orientation of the longest contig", - 'status': status, - 'output': {'longest_orient': longest_orient}} + log['05'] = { + 'step_name': "orient_longest_contig", + 'step_description': "Determine the orientation of the longest contig", + 'status': status, + 'output': {'longest_orient': longest_orient} + } if status != "PASS": write_log_and_exit(log, status) - # Get the final orientation for all contigs - contig_orientation, status = get_final_orientation(final_path, filtered_edges, longest_contig, longest_orient) - log['06'] = {'step_name': "get_final_orientation", - 'step_description': "Get the final orientation for all contigs", - 'status': status, - 'output': {'final_orientation': contig_orientation}} + # Get the final orientation for all contigs in each path + contig_orientations, status = get_final_orientation(final_paths, filtered_edges, longest_contig, longest_orient) + log['06'] = { + 'step_name': "get_final_orientation", + 'step_description': "Get the final orientation for all contigs", + 'status': status, + 'output': {'contig_orientations': contig_orientations} + } if status != "PASS": write_log_and_exit(log, status) - # Re-orient the final path based on determined orientation - oriented_final_path = [contig + ('-' if contig_orientation[i] == -1 else '+') for i, contig in enumerate(final_path)] - - # Get the final sequence and order - final_sequence, seq_len, final_order_orientation_copy_number, status = get_final_sequence(oriented_final_path, contig_orientation, filtered_segments) - log['07'] = {'step_name': "get_final_sequence", - 'step_description': "Get the final sequence and order", - 'status': status, - 'output': {'final_sequence': str(final_sequence), # Convert Seq object to string - 'final_sequence_length': seq_len, - 'final_order_orientation_copy_number': final_order_orientation_copy_number}} - if status != "PASS": - write_log_and_exit(log, status) + assembled_sequences = [] - # Write the oriented contigs to a FASTA file - asm_name = sample_name + ".assembly_asm.fasta" - record = SeqRecord(Seq(final_sequence), id=input_base, description=final_order_orientation_copy_number) - with open(os.path.join(output_dir, asm_name), 'w') as f: - SeqIO.write(record, f, "fasta") + for idx, (path, orientation) in enumerate(zip(final_paths, contig_orientations)): + if orientation is None: + print(f"Skipping path {idx + 1} due to missing orientation.") + continue - log['08'] = {'step_name': "write_oriented_fasta", - 'step_description': "Write the oriented contigs to a FASTA file", - 'status': "PASS", - 'output': {'assembly_file': asm_name}} + print(f"Processing path in quast to determine best orientation {idx + 1}/{len(final_paths)}") + + # Re-orient the final path based on determined orientation + oriented_path = [contig + ('-' if orientation[i] == -1 else '+') for i, contig in enumerate(path)] + + # Generate the final sequence for this path + final_sequence, seq_len, final_order_orientation_copy_number, status = get_final_sequence( + oriented_path, orientation, filtered_segments) + + if status != "PASS": + print(f"Skipping path {idx + 1} due to sequence generation failure.") + continue + + # Write the sequence to a FASTA file + asm_name = f"{sample_name}_assembly_path_{idx + 1}.fasta" + assembly_file = os.path.join(output_dir, asm_name) + record = SeqRecord(Seq(final_sequence), id=input_base, description=final_order_orientation_copy_number) + with open(assembly_file, 'w') as f: + SeqIO.write(record, f, "fasta") + + # Run QUAST to evaluate the assembly + quast_output_dir = os.path.join(output_dir, f"quast_output_{idx + 1}") + quast_command = ["quast.py", assembly_file, "-r", reference, "-o", quast_output_dir] + #print(f"Running QUAST for path {idx + 1}: {' '.join(quast_command)}") + result = subprocess.run(quast_command, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + + # Parse QUAST results + quast_report = os.path.join(quast_output_dir, "report.tsv") + if not os.path.exists(quast_report): + print(f"QUAST analysis failed for path {idx + 1}.") + continue + + quast_metrics = {} + with open(quast_report, 'r') as report_file: + for line in report_file: + key_value = line.strip().split('\t') + if len(key_value) == 2: + quast_metrics[key_value[0].strip()] = key_value[1].strip() + + # Store the assembly data + assembled_sequences.append({ + 'path_index': idx, + 'path': path, + 'orientation': orientation, + 'assembly_file': assembly_file, + 'sequence': final_sequence, + 'sequence_length': seq_len, + 'order_orientation_copy_number': final_order_orientation_copy_number, + 'quast_output_dir': quast_output_dir, + 'quast_metrics': quast_metrics + }) + # Select the best assembly based on QUAST results + if not assembled_sequences: + write_log_and_exit(log, "FAIL: No valid assemblies generated from longest paths.") + + # Example: select assembly with the highest Total aligned length + best_assembly = max(assembled_sequences, key=lambda x: int(x['quast_metrics'].get('Largest alignment', '0'))) + #print(best_assembly) + best_idx = best_assembly['path_index'] + print(f"Selected path {best_idx + 1} as the best assembly based on QUAST results.") + + # Update log with the final selected assembly + log['07'] = { + 'final_path': best_assembly['path'], + 'final_orientation': best_assembly['orientation'], + 'final_sequence_length': best_assembly['sequence_length'], + 'final_order_orientation_copy_number': best_assembly['order_orientation_copy_number'] + } # Remove the blast_db directory shutil.rmtree(blast_db_dir) # Remove the directory and its contents - # Identify ITRs and their length - itrs, itr_length = identify_itr(gfa_graph, filtered_segments) - log['09'] = {'step_name': "identify_itr", - 'step_description': "Identify all Inverted Terminal Repeats (ITRs) based on depth criteria", - 'status': "PASS", - 'output': {'itrs': itrs, - 'final_itr_length': itr_length}} + # Write the final assembly to a file + asm_name = sample_name + ".assembly_asm.fasta" + assembly_file = os.path.join(output_dir, asm_name) + record = SeqRecord(Seq(best_assembly['sequence']), id=input_base, description=best_assembly['order_orientation_copy_number']) + with open(assembly_file, 'w') as f: + SeqIO.write(record, f, "fasta") + + log['07']['assembly_file'] = asm_name # Write the final log and summary write_log_and_exit(log, "PASS") From 45fdf093bdd0e268d16e4fc028700ea872a871f4 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Thu, 10 Oct 2024 08:20:20 -0400 Subject: [PATCH 26/42] added --names argument to bandage plot module --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index 98f0516..048f03f 100755 --- a/conf/modules.config +++ b/conf/modules.config @@ -149,6 +149,7 @@ process { mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] + ext.args = '--names' } withName: PUBLISH_CONTIGS { From ac27292cb29e763d1365d82aa7c2b47b21e8efee Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Thu, 24 Oct 2024 08:45:11 -0400 Subject: [PATCH 27/42] updated assembly graph python script to fix orientation of itrs, esp updated get_final_orientation function --- bin/AssemblyGraph_gfaPy.py | 318 +++++++++++++++++-------------------- 1 file changed, 145 insertions(+), 173 deletions(-) diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py index cd939c1..1f9fa4a 100755 --- a/bin/AssemblyGraph_gfaPy.py +++ b/bin/AssemblyGraph_gfaPy.py @@ -2,15 +2,16 @@ ### Written by S.Morrison, K. Knipe 20221018 ### Refactored by Kyle O'Connell with help from GPT 4o, o1-preview, and Gemini 1.5 Pro 20240730 - +''' +to do : figure out how to identify terminal ITR based on links +to do: figure out how to differentiate seqs with single ITR contig (no other connections) vs. those with several +''' import os import re -import gzip import sys import json import gfapy import shutil -import fnmatch import argparse import subprocess import networkx as nx @@ -39,7 +40,7 @@ def read_gfa_file(gfa_path): return None, "WARNING: GFA file only contains segment lines" return gfa_graph, "PASS" except Exception as e: - + print('Issue with gfa file') return None, f"WARNING: Issue with GFA file : {str(e)}" def remove_self_loops(links): @@ -102,9 +103,9 @@ def identify_itr(gfa_graph, segments): """Identify all Inverted Terminal Repeats (ITRs) based on depth criteria and check if they are connected in the graph.""" depth_data = {seg.get('name'): float(seg.get('dp')) for seg in segments if 'dp' in seg.tagnames} lower_bound = 1.5 - upper_bound = 20 - potential_itrs = [contig for contig, depth in depth_data.items() if lower_bound < depth < upper_bound] - + #upper_bound = 20 + potential_itrs = [contig for contig, depth in depth_data.items() if lower_bound < depth] + print("potential ITRs",potential_itrs) # Create a subgraph with only potential ITRs subgraph = nx.Graph() for link in gfa_graph.edges: @@ -113,6 +114,7 @@ def identify_itr(gfa_graph, segments): # Find connected components in the subgraph connected_components = list(nx.connected_components(subgraph)) + print('connected components',connected_components) # Select the largest connected component as the ITRs if connected_components: itrs = max(connected_components, key=len) @@ -121,8 +123,8 @@ def identify_itr(gfa_graph, segments): itr_length = sum(len(seg.sequence) for seg in segments if seg.name in itrs) - # print("contigs in ITR", itrs) - # print("Total ITR sequence length:", itr_length) + print("contigs in ITR", itrs) + print("Total ITR sequence length:", itr_length) return list(itrs), itr_length def get_final_paths(gfa_graph, filtered_graph, segments): @@ -157,7 +159,7 @@ def get_final_paths(gfa_graph, filtered_graph, segments): final_path = left_itrs + middle_path + right_itrs final_paths.append(final_path) - return final_paths, itr_length, f"PASS: Found {len(longest_paths)} longest path(s) of length {max_length}" + return final_paths, itrs, itr_length, f"PASS: Found {len(longest_paths)} longest path(s) of length {max_length}" else: return [], "WARNING: No path found starting from any ITR." @@ -181,93 +183,117 @@ def orient_longest_contig(query, reference, blast_db_dir): with open(blastResults, 'r') as e: for line in e: blastHits = line.split('\t') + #print(blastHits) sstart = int(blastHits[5]) send = int(blastHits[6]) - orientation = 1 if sstart < send else int(-1) + orientation = '1 +' if sstart < send else '1 -' + print('orientation of longest contig',orientation) return orientation, "PASS" def get_final_orientation(final_paths, lnks, longest_contig, longest_orient): - contig_orientations = [] - status = "PASS" + # Build a dictionary for quick lookup of links + links_dict = {} + for link in lnks: + print(link) + # Map direct links + key = (link.from_name, link.to_name) + links_dict[key] = (link.from_orient, link.to_orient) + # Map reverse links with flipped orientations + reverse_key = (link.to_name, link.from_name) + # Flip the orientations for the reverse mapping + reversed_from_orient = '-' if link.to_orient == '+' else '+' + reversed_to_orient = '-' if link.from_orient == '+' else '+' + links_dict[reverse_key] = (reversed_from_orient, reversed_to_orient) + + final_oriented_path = [] + # Iterate over each path for path in final_paths: - if longest_contig not in path: - print("Longest contig not in path, skipping orientation determination for this path.") - contig_orientations.append(None) - continue - contig_orientation = [0] * len(path) - index = path.index(longest_contig) - # Forward direction - for i in range(index, len(path)): - if i == index: - contig_orientation[i] = longest_orient - else: - flag = 0 - for link in lnks: - if (link.from_name == path[i-1] and link.to_name == path[i]): - from_orient = 1 if link.from_orient == '+' else -1 - to_orient = 1 if link.to_orient == '+' else -1 - contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient - flag = 1 - break - if flag == 0: - for link in lnks: - if (link.to_name == path[i-1] and link.from_name == path[i]): - from_orient = 1 if link.from_orient == '+' else -1 - to_orient = 1 if link.to_orient == '+' else -1 - contig_orientation[i] = contig_orientation[i-1] * from_orient * to_orient - flag = 1 - break - if flag == 0: - print(f"Unable to determine orientation between {path[i-1]} and {path[i]}.") - contig_orientation = None - break - if contig_orientation is None: + contig_orientations = [] + print('Processing path:', path) + + if not path: + continue # Skip empty paths + + # Assign orientation to the first contig + first_contig = path[0] + first_contig_orient = None + # Find an initial orientation for the first contig + for link in lnks: + if first_contig == link.from_name: + first_contig_orient = link.from_orient break - if contig_orientation is None: - contig_orientations.append(None) - continue - # Backward direction - for i in range(index - 1, -1, -1): - flag = 0 - for link in lnks: - if (link.to_name == path[i+1] and link.from_name == path[i]): - from_orient = 1 if link.from_orient == '+' else -1 - to_orient = 1 if link.to_orient == '+' else -1 - contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient - flag = 1 - break - if flag == 0: - for link in lnks: - if (link.from_name == path[i+1] and link.to_name == path[i]): - from_orient = 1 if link.from_orient == '+' else -1 - to_orient = 1 if link.to_orient == '+' else -1 - contig_orientation[i] = contig_orientation[i+1] * from_orient * to_orient - flag = 1 - break - if flag == 0: - print(f"Unable to determine orientation between {path[i+1]} and {path[i]}.") - contig_orientation = None + elif first_contig == link.to_name: + # Flip the orientation since it's the 'to_name' in the link + first_contig_orient = '-' if link.to_orient == '+' else '+' break - contig_orientations.append(contig_orientation) - print("Final orientations",contig_orientations) - return contig_orientations, status + if first_contig_orient is None: + print(f"Could not determine orientation for contig {first_contig}") + continue # Skip this path if orientation is unknown + + contig_orientations.append(f"{first_contig} {first_contig_orient}") + previous_contig = first_contig + previous_orient = first_contig_orient + + # Process the rest of the contigs in the path + for current_contig in path[1:]: + key = (previous_contig, current_contig) + if key in links_dict: + prev_orient_in_link, curr_orient_in_link = links_dict[key] + # Adjust current orientation based on the previous orientation + if previous_orient == prev_orient_in_link: + current_orient = curr_orient_in_link + else: + # If previous orientation doesn't match, flip the current orientation + current_orient = '-' if curr_orient_in_link == '+' else '+' + contig_orientations.append(f"{current_contig} {current_orient}") + previous_contig = current_contig + previous_orient = current_orient + else: + print(f"No link found between {previous_contig} and {current_contig}") + break # Cannot process further without a link + + print('Final contig orientations:', contig_orientations) + # Check if this path contains the longest contig with the correct orientation + for contig_info in contig_orientations: + contig_name, contig_orient = contig_info.split(' ') + if contig_name == longest_contig and contig_orient == longest_orient.split(' ')[1]: + final_oriented_path = contig_orientations + #print('Updated final_oriented_path:', final_oriented_path) + break + # if final_oriented_path: + # print('Final oriented path with longest contig in correct orientation:', final_oriented_path) + + # After all paths have been processed + print('final oriented path with correct longest contig orientation', final_oriented_path) + return path, final_oriented_path, "PASS" -def get_final_sequence(oriented_path, orientation, segments): +def get_final_sequence(oriented_path, segments): """Generate the final sequence for a given path and orientation.""" - segment_dict = {seg.name: seg.sequence for seg in segments} # Create a dictionary of segment names to sequences + # Create a dictionary mapping segment names to sequences + segment_dict = {seg.name: seg.sequence for seg in segments} final_sequence = "" # Initialize an empty string to accumulate the final sequence - for i, segment_name in enumerate(oriented_path): - seq = segment_dict[segment_name.strip('+').strip('-')] # Remove orientation symbols for lookup + for segment_name in oriented_path: + #print(f"Processing segment: {segment_name}") + # Split the segment name and orientation + contig, orient = segment_name.strip().split(' ') + #print(f"Contig: {contig}, Orientation: {orient}") + # Get the sequence corresponding to the contig name + seq = segment_dict.get(contig) + if seq is None: + print(f"Warning: Sequence for contig '{contig}' not found.") + continue # Skip if the contig is not found + # Check if the segment should be reversed - if orientation[i] == -1: + if orient == '-': seq = str(Seq(seq).reverse_complement()) # Reverse complement the sequence if needed - final_sequence += seq # Concatenate sequence + final_sequence += seq # Concatenate the sequence final_sequence_length = len(final_sequence) - final_order_orientation_copy_number = ",".join([f"{seg}{orientation[i]}" for i, seg in enumerate(oriented_path)]) - + print('final_sequence_length = ', final_sequence_length) + # Create a comma-separated string of the oriented path + final_order_orientation_copy_number = ",".join(oriented_path) return final_sequence, final_sequence_length, final_order_orientation_copy_number, "PASS" def write_oriented_fasta(final_path, segments, output_file, input_file): @@ -302,18 +328,21 @@ def write_log_and_exit(log, status): log_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".assembly.log") summary_file = os.path.join(log['00']['input']['output_dir'], log['00']['input']['sample_name'] + ".assembly.summary") - headers = ['sample', 'status', 'contig_order', 'contig_orientation', 'contig_order_orientation_copy_number', 'assembly_length', 'itr_length'] + headers = ['sample', 'status', 'longest_paths', 'final_contig_order_orientation', 'itr_length', 'assembly_length'] data = [] if '00' in log: - data.append(log['00']['input']['sample_name']) - data.append(status) + data.append(log['00']['input']['sample_name']) # 'sample' + data.append(status) # 'status' if '03' in log: - data.append(",".join(str(i) for i in log['03']['output']['final_paths'])) + data.append(",".join(str(i) for i in log['03']['output']['final_paths'])) # 'contig_order' + data.append(str(log['03']['output']['itr_length'])) # 'itr_length' added here if '06' in log: - data.append(",".join(str(i) for i in log['06']['output']['contig_orientations'])) + data.append(",".join(str(i) for i in log['06']['output']['final_orientation'])) # 'contig_orientation' + if '03' in log: + data.append(str(log['03']['output']['itr_length'])) # 'itr_length' added here if '07' in log: - data.append(str(log['07']['final_order_orientation_copy_number'])) - data.append(str(log['07']['final_sequence_length'])) + data.append(str(log['07']['output']['final_sequence_length'])) # 'assembly_length' + with open(summary_file, 'w') as f: f.write('\t'.join(headers) + '\n') f.write('\t'.join(data) + '\n') @@ -328,7 +357,7 @@ def process_graph(gfa_graph, output_dir, input_file, reference): log = {} input_with_ext = os.path.basename(input_file) input_base, _ = os.path.splitext(input_with_ext) - sample_name = input_base.replace('.003_bridges_applied','') + sample_name = input_base.replace('.003_bridges_applied', '') # Initial log entry log['00'] = {'step_name': "initialization", @@ -368,12 +397,12 @@ def process_graph(gfa_graph, output_dir, input_file, reference): filtered_segments = filter_segments_by_graph(gfa_graph.segments, filtered_graph) # Find all longest paths - final_paths, itr_length, status = get_final_paths(gfa_graph, filtered_graph, filtered_segments) + final_paths, itrs, itr_length, status = get_final_paths(gfa_graph, filtered_graph, filtered_segments) log['03'] = { 'step_name': "get_final_paths", 'step_description': "Find all longest paths in the graph starting from any ITR", 'status': status, - 'output': {'final_paths': final_paths,'itr_length':itr_length} + 'output': {'final_paths': final_paths, 'itr_length': itr_length} } if not status.startswith("PASS"): write_log_and_exit(log, status) @@ -405,104 +434,47 @@ def process_graph(gfa_graph, output_dir, input_file, reference): write_log_and_exit(log, status) # Get the final orientation for all contigs in each path - contig_orientations, status = get_final_orientation(final_paths, filtered_edges, longest_contig, longest_orient) + final_path, final_oriented_path, status = get_final_orientation( + final_paths, filtered_edges, longest_contig, longest_orient) log['06'] = { 'step_name': "get_final_orientation", 'step_description': "Get the final orientation for all contigs", 'status': status, - 'output': {'contig_orientations': contig_orientations} + 'output': {'final_path': final_path, 'final_orientation': final_oriented_path} } - if status != "PASS": - write_log_and_exit(log, status) - - assembled_sequences = [] - - for idx, (path, orientation) in enumerate(zip(final_paths, contig_orientations)): - if orientation is None: - print(f"Skipping path {idx + 1} due to missing orientation.") - continue + if status != "PASS" or final_path is None: + write_log_and_exit(log, "FAIL: No valid path found with the longest contig in the correct orientation.") - print(f"Processing path in quast to determine best orientation {idx + 1}/{len(final_paths)}") + # Generate the final sequence for this path + final_sequence, seq_len, final_order_orientation_copy_number, status = get_final_sequence( + final_oriented_path, filtered_segments) - # Re-orient the final path based on determined orientation - oriented_path = [contig + ('-' if orientation[i] == -1 else '+') for i, contig in enumerate(path)] - - # Generate the final sequence for this path - final_sequence, seq_len, final_order_orientation_copy_number, status = get_final_sequence( - oriented_path, orientation, filtered_segments) - - if status != "PASS": - print(f"Skipping path {idx + 1} due to sequence generation failure.") - continue - - # Write the sequence to a FASTA file - asm_name = f"{sample_name}_assembly_path_{idx + 1}.fasta" - assembly_file = os.path.join(output_dir, asm_name) - record = SeqRecord(Seq(final_sequence), id=input_base, description=final_order_orientation_copy_number) - with open(assembly_file, 'w') as f: - SeqIO.write(record, f, "fasta") - - # Run QUAST to evaluate the assembly - quast_output_dir = os.path.join(output_dir, f"quast_output_{idx + 1}") - quast_command = ["quast.py", assembly_file, "-r", reference, "-o", quast_output_dir] - #print(f"Running QUAST for path {idx + 1}: {' '.join(quast_command)}") - result = subprocess.run(quast_command, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - - # Parse QUAST results - quast_report = os.path.join(quast_output_dir, "report.tsv") - if not os.path.exists(quast_report): - print(f"QUAST analysis failed for path {idx + 1}.") - continue - - quast_metrics = {} - with open(quast_report, 'r') as report_file: - for line in report_file: - key_value = line.strip().split('\t') - if len(key_value) == 2: - quast_metrics[key_value[0].strip()] = key_value[1].strip() - - # Store the assembly data - assembled_sequences.append({ - 'path_index': idx, - 'path': path, - 'orientation': orientation, - 'assembly_file': assembly_file, - 'sequence': final_sequence, - 'sequence_length': seq_len, - 'order_orientation_copy_number': final_order_orientation_copy_number, - 'quast_output_dir': quast_output_dir, - 'quast_metrics': quast_metrics - }) - # Select the best assembly based on QUAST results - if not assembled_sequences: - write_log_and_exit(log, "FAIL: No valid assemblies generated from longest paths.") - - # Example: select assembly with the highest Total aligned length - best_assembly = max(assembled_sequences, key=lambda x: int(x['quast_metrics'].get('Largest alignment', '0'))) - #print(best_assembly) - best_idx = best_assembly['path_index'] - print(f"Selected path {best_idx + 1} as the best assembly based on QUAST results.") + if status != "PASS": + write_log_and_exit(log, "FAIL: Sequence generation failed for the final path.") + # Write the sequence to a FASTA file + asm_name = sample_name + ".assembly_asm.fasta" + assembly_file = os.path.join(output_dir, asm_name) + record = SeqRecord(Seq(final_sequence), id=input_base, description=final_order_orientation_copy_number) + with open(assembly_file, 'w') as f: + SeqIO.write(record, f, "fasta") # Update log with the final selected assembly log['07'] = { - 'final_path': best_assembly['path'], - 'final_orientation': best_assembly['orientation'], - 'final_sequence_length': best_assembly['sequence_length'], - 'final_order_orientation_copy_number': best_assembly['order_orientation_copy_number'] + 'step_name': "generate_final_sequence", + 'step_description': "Generate the final sequence based on the best path and orientation", + 'status': "PASS", + 'output': { + 'final_sequence_length': seq_len, + 'final_order_orientation_copy_number': final_order_orientation_copy_number, + 'assembly_file': asm_name, + 'final_path': final_path, + 'final_orientation': final_oriented_path + } } # Remove the blast_db directory shutil.rmtree(blast_db_dir) # Remove the directory and its contents - # Write the final assembly to a file - asm_name = sample_name + ".assembly_asm.fasta" - assembly_file = os.path.join(output_dir, asm_name) - record = SeqRecord(Seq(best_assembly['sequence']), id=input_base, description=best_assembly['order_orientation_copy_number']) - with open(assembly_file, 'w') as f: - SeqIO.write(record, f, "fasta") - - log['07']['assembly_file'] = asm_name - # Write the final log and summary write_log_and_exit(log, "PASS") From 74e124b8f6d953b56080e9b48d9d58e954f8f2df Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Thu, 24 Oct 2024 17:17:57 -0400 Subject: [PATCH 28/42] updated itr id function so that it selects terminal itr based on links, then selects conneected itrs based on list with terminal itr in it, if there are no connected itrs, then there is 1 itr contig, the terminal itr. --- bin/AssemblyGraph_gfaPy.py | 52 +++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py index 1f9fa4a..2b09c56 100755 --- a/bin/AssemblyGraph_gfaPy.py +++ b/bin/AssemblyGraph_gfaPy.py @@ -100,13 +100,49 @@ def create_filtered_graph(links): return graph, "PASS" def identify_itr(gfa_graph, segments): - """Identify all Inverted Terminal Repeats (ITRs) based on depth criteria and check if they are connected in the graph.""" + """ + Identify all Inverted Terminal Repeats (ITRs) based on the orientation of their connections. + A terminal ITR is identified as a contig that has connections only on the same end (orientation), + whereas other contigs are connected on both '+' and '-' ends. + """ + # Create a dictionary to store the set of connected orientations for each contig depth_data = {seg.get('name'): float(seg.get('dp')) for seg in segments if 'dp' in seg.tagnames} lower_bound = 1.5 - #upper_bound = 20 potential_itrs = [contig for contig, depth in depth_data.items() if lower_bound < depth] print("potential ITRs",potential_itrs) - # Create a subgraph with only potential ITRs + + # idenfify the terminal ITR + contig_ends = [] + for itr in potential_itrs: + #print(itr) + from_orients = [] + to_orients = [] + for edge in gfa_graph.edges: + if edge.from_name != edge.to_name: + if edge.from_name == itr: + from_orients.append(edge.from_orient) + elif edge.to_name == itr: + to_orients.append(edge.to_orient) + # create set of each list + from_orients=set(from_orients) + to_orients=set(to_orients) + #print(from_orients,to_orients) + + # if links are both ++ or both -- or if to and from are opposite +/- + if len(from_orients) == 1 and len(to_orients) < 1 or len(from_orients) <1 and len(to_orients) == 1: + contig_ends.append(itr) + elif len(from_orients) == 1 and len(to_orients) == 1: + if list(from_orients)[0] != list(to_orients)[0]: + contig_ends.append(itr) + + # if more than one terminal contig exit + if len(contig_ends) > 1: + print('WARNING: more than one terminal contig!') + break + + print("Terminal ITR contigs based on links:", contig_ends) + + # Create a subgraph with only potential ITRs to check for connected ITR contigs and get rid of unconnected repeats subgraph = nx.Graph() for link in gfa_graph.edges: if link.from_name in potential_itrs and link.to_name in potential_itrs: @@ -115,11 +151,14 @@ def identify_itr(gfa_graph, segments): # Find connected components in the subgraph connected_components = list(nx.connected_components(subgraph)) print('connected components',connected_components) - # Select the largest connected component as the ITRs + + # Select the connected component list with the if connected_components: - itrs = max(connected_components, key=len) + for group in connected_components: + if contig_ends[0] in group: + itrs = max(connected_components, key=len) else: - itrs = [] + itrs = contig_ends[0] itr_length = sum(len(seg.sequence) for seg in segments if seg.name in itrs) @@ -193,6 +232,7 @@ def orient_longest_contig(query, reference, blast_db_dir): def get_final_orientation(final_paths, lnks, longest_contig, longest_orient): # Build a dictionary for quick lookup of links links_dict = {} + print ('listing all the links') for link in lnks: print(link) # Map direct links From 45ed46dfb26db4d406bd272ff99fd4e80722469b Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Wed, 30 Oct 2024 16:10:19 -0400 Subject: [PATCH 29/42] fixed some bugs to allow for better error handling and accomodate edge case of one long contig and only an ITR, as well as handle broken (non cyclical) sequences --- bin/AssemblyGraph_gfaPy.py | 467 ++++++++++++++++++++----------------- 1 file changed, 253 insertions(+), 214 deletions(-) diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py index 2b09c56..38227f9 100755 --- a/bin/AssemblyGraph_gfaPy.py +++ b/bin/AssemblyGraph_gfaPy.py @@ -2,10 +2,7 @@ ### Written by S.Morrison, K. Knipe 20221018 ### Refactored by Kyle O'Connell with help from GPT 4o, o1-preview, and Gemini 1.5 Pro 20240730 -''' -to do : figure out how to identify terminal ITR based on links -to do: figure out how to differentiate seqs with single ITR contig (no other connections) vs. those with several -''' + import os import re import sys @@ -86,18 +83,30 @@ def filter_segments_by_graph(segments, graph): def create_filtered_graph(links): """Create a filtered NetworkX graph from links and remove disconnected nodes.""" - graph = nx.Graph() # Using a simple Graph instead of MultiGraph if you don't handle multiple edges between the same nodes + graph = nx.MultiGraph() # Using a simple Graph instead of MultiGraph if you don't handle multiple edges between the same nodes for link in links: graph.add_edge(link.from_name, link.to_name) # Remove disconnected nodes disconnected_nodes = [node for node in graph.nodes if graph.degree(node) == 0] graph.remove_nodes_from(disconnected_nodes) - if not nx.is_connected(graph): return None, "WARNING: Graph is not connected" - return graph, "PASS" + # Check if the graph forms a cycle + degrees = dict(graph.degree()) + count_not_two = sum(1 for degree in degrees.values() if degree < 2) + all_degree_two = count_not_two <= 1 + + num_edges = graph.number_of_edges() + num_nodes = graph.number_of_nodes() + + if all_degree_two and num_edges == num_nodes: + print('The graph forms a complete cycle') + return graph, "PASS" + else: + print("graph is not circular") + return None, "WARNING: Graph is not circular" def identify_itr(gfa_graph, segments): """ @@ -108,25 +117,30 @@ def identify_itr(gfa_graph, segments): # Create a dictionary to store the set of connected orientations for each contig depth_data = {seg.get('name'): float(seg.get('dp')) for seg in segments if 'dp' in seg.tagnames} lower_bound = 1.5 + filt_depth = 0.5 potential_itrs = [contig for contig, depth in depth_data.items() if lower_bound < depth] + filt_contigs = [contig for contig, depth in depth_data.items() if filt_depth >= depth] print("potential ITRs",potential_itrs) # idenfify the terminal ITR contig_ends = [] for itr in potential_itrs: - #print(itr) + # print('itr in loop', itr) from_orients = [] to_orients = [] for edge in gfa_graph.edges: - if edge.from_name != edge.to_name: - if edge.from_name == itr: - from_orients.append(edge.from_orient) - elif edge.to_name == itr: - to_orients.append(edge.to_orient) + if edge.from_name == itr or edge.to_name == itr: + print(edge) + if edge.from_name != edge.to_name and edge.from_name not in filt_contigs and edge.to_name not in filt_contigs: + if edge.from_name != edge.to_name: + if edge.from_name == itr: + from_orients.append(edge.from_orient) + elif edge.to_name == itr: + to_orients.append(edge.to_orient) # create set of each list from_orients=set(from_orients) to_orients=set(to_orients) - #print(from_orients,to_orients) + # print(from_orients,to_orients) # if links are both ++ or both -- or if to and from are opposite +/- if len(from_orients) == 1 and len(to_orients) < 1 or len(from_orients) <1 and len(to_orients) == 1: @@ -157,13 +171,15 @@ def identify_itr(gfa_graph, segments): for group in connected_components: if contig_ends[0] in group: itrs = max(connected_components, key=len) + else: + itrs = contig_ends[0] + else: itrs = contig_ends[0] - + # print('this is the group of ITRS',itrs) itr_length = sum(len(seg.sequence) for seg in segments if seg.name in itrs) - print("contigs in ITR", itrs) - print("Total ITR sequence length:", itr_length) + print("contigs in ITR", itrs, "with total length", itr_length) return list(itrs), itr_length def get_final_paths(gfa_graph, filtered_graph, segments): @@ -171,7 +187,7 @@ def get_final_paths(gfa_graph, filtered_graph, segments): itrs, itr_length = identify_itr(gfa_graph, segments) if not itrs: return [], "WARNING: No suitable ITRs found based on depth criteria." - + longest_paths = [] max_length = 0 for itr in itrs: @@ -183,7 +199,8 @@ def get_final_paths(gfa_graph, filtered_graph, segments): longest_paths = [path] # Start a naew list with the new longest path max_length = path_length elif path_length == max_length: - longest_paths.append(path) # Add path to the list of longest paths + if path not in longest_paths: # handle cases with only one longest path + longest_paths.append(path) # Add path to the list of longest paths final_paths = [] if longest_paths: print("longest path list =", longest_paths) @@ -229,12 +246,10 @@ def orient_longest_contig(query, reference, blast_db_dir): print('orientation of longest contig',orientation) return orientation, "PASS" -def get_final_orientation(final_paths, lnks, longest_contig, longest_orient): +def get_final_orientation(final_paths, lnks, longest_contig, longest_orient, itrs): # Build a dictionary for quick lookup of links links_dict = {} - print ('listing all the links') for link in lnks: - print(link) # Map direct links key = (link.from_name, link.to_name) links_dict[key] = (link.from_orient, link.to_orient) @@ -246,67 +261,71 @@ def get_final_orientation(final_paths, lnks, longest_contig, longest_orient): links_dict[reverse_key] = (reversed_from_orient, reversed_to_orient) final_oriented_path = [] - # Iterate over each path - for path in final_paths: - contig_orientations = [] - print('Processing path:', path) - - if not path: - continue # Skip empty paths - - # Assign orientation to the first contig - first_contig = path[0] - first_contig_orient = None - # Find an initial orientation for the first contig - for link in lnks: - if first_contig == link.from_name: - first_contig_orient = link.from_orient - break - elif first_contig == link.to_name: - # Flip the orientation since it's the 'to_name' in the link - first_contig_orient = '-' if link.to_orient == '+' else '+' - break - if first_contig_orient is None: - print(f"Could not determine orientation for contig {first_contig}") - continue # Skip this path if orientation is unknown - - contig_orientations.append(f"{first_contig} {first_contig_orient}") - previous_contig = first_contig - previous_orient = first_contig_orient - - # Process the rest of the contigs in the path - for current_contig in path[1:]: - key = (previous_contig, current_contig) - if key in links_dict: - prev_orient_in_link, curr_orient_in_link = links_dict[key] - # Adjust current orientation based on the previous orientation - if previous_orient == prev_orient_in_link: - current_orient = curr_orient_in_link + + if len(final_paths) > 1: + # Existing logic remains the same + # Iterate over each path + for path in final_paths: + contig_orientations = [] + print('Processing path:', path) + + if not path: + continue # Skip empty paths + + # Assign orientation to the first contig + first_contig = path[0] + first_contig_orient = None + # Find an initial orientation for the first contig + for link in lnks: + if first_contig == link.from_name: + first_contig_orient = link.from_orient + break + elif first_contig == link.to_name: + # Flip the orientation since it's the 'to_name' in the link + first_contig_orient = '-' if link.to_orient == '+' else '+' + break + if first_contig_orient is None: + print(f"Could not determine orientation for contig {first_contig}") + continue # Skip this path if orientation is unknown + + contig_orientations.append(f"{first_contig} {first_contig_orient}") + previous_contig = first_contig + previous_orient = first_contig_orient + + # Process the rest of the contigs in the path + for current_contig in path[1:]: + key = (previous_contig, current_contig) + if key in links_dict: + prev_orient_in_link, curr_orient_in_link = links_dict[key] + # Adjust current orientation based on the previous orientation + if previous_orient == prev_orient_in_link: + current_orient = curr_orient_in_link + else: + # If previous orientation doesn't match, flip the current orientation + current_orient = '-' if curr_orient_in_link == '+' else '+' + contig_orientations.append(f"{current_contig} {current_orient}") + previous_contig = current_contig + previous_orient = current_orient else: - # If previous orientation doesn't match, flip the current orientation - current_orient = '-' if curr_orient_in_link == '+' else '+' - contig_orientations.append(f"{current_contig} {current_orient}") - previous_contig = current_contig - previous_orient = current_orient - else: - print(f"No link found between {previous_contig} and {current_contig}") - break # Cannot process further without a link - - print('Final contig orientations:', contig_orientations) - # Check if this path contains the longest contig with the correct orientation - for contig_info in contig_orientations: - contig_name, contig_orient = contig_info.split(' ') - if contig_name == longest_contig and contig_orient == longest_orient.split(' ')[1]: - final_oriented_path = contig_orientations - #print('Updated final_oriented_path:', final_oriented_path) - break - # if final_oriented_path: - # print('Final oriented path with longest contig in correct orientation:', final_oriented_path) - - # After all paths have been processed - print('final oriented path with correct longest contig orientation', final_oriented_path) - return path, final_oriented_path, "PASS" + print(f"No link found between {previous_contig} and {current_contig}") + break # Cannot process further without a link + print('Final contig orientations:', contig_orientations) + # Check if this path contains the longest contig with the correct orientation + for contig_info in contig_orientations: + contig_name, contig_orient = contig_info.split(' ') + if contig_name == longest_contig and contig_orient == longest_orient.split(' ')[1]: + final_oriented_path = contig_orientations + break + + # After all paths have been processed + print('Final oriented path with correct longest contig orientation:', final_oriented_path) + return path, final_oriented_path, "PASS" + + else: + # Only one longest path; apply new logic + return None, [], "FAIL: Unable to resolve final orientation, likely only one longest contig and ITRs" + def get_final_sequence(oriented_path, segments): """Generate the final sequence for a given path and orientation.""" # Create a dictionary mapping segment names to sequences @@ -374,14 +393,20 @@ def write_log_and_exit(log, status): data.append(log['00']['input']['sample_name']) # 'sample' data.append(status) # 'status' if '03' in log: - data.append(",".join(str(i) for i in log['03']['output']['final_paths'])) # 'contig_order' - data.append(str(log['03']['output']['itr_length'])) # 'itr_length' added here + data.append(",".join(str(i) for i in log['03']['output']['final_paths'])) # 'longest_paths' + data.append(str(log['03']['output']['itr_length'])) # 'itr_length' if '06' in log: - data.append(",".join(str(i) for i in log['06']['output']['final_orientation'])) # 'contig_orientation' + data.append(",".join(str(i) for i in log['06']['output']['final_orientation'])) # 'final_contig_order_orientation' + else: + data.append('') # Empty string if '06' not in log if '03' in log: - data.append(str(log['03']['output']['itr_length'])) # 'itr_length' added here + data.append(str(log['03']['output']['itr_length'])) # 'itr_length' added here again + else: + data.append('') # Empty string if '03' not in log if '07' in log: data.append(str(log['07']['output']['final_sequence_length'])) # 'assembly_length' + else: + data.append('') # Empty string if '07' not in log with open(summary_file, 'w') as f: f.write('\t'.join(headers) + '\n') @@ -392,131 +417,124 @@ def write_log_and_exit(log, status): f.write(json_object) sys.exit(0) -def process_graph(gfa_graph, output_dir, input_file, reference): +def process_graph(gfa_graph, output_dir, input_file, reference, log): """Process the graph and write output.""" - log = {} - input_with_ext = os.path.basename(input_file) - input_base, _ = os.path.splitext(input_with_ext) - sample_name = input_base.replace('.003_bridges_applied', '') + try: + input_with_ext = os.path.basename(input_file) + input_base, _ = os.path.splitext(input_with_ext) + sample_name = input_base.replace('.003_bridges_applied', '') + + # write all contigs to a FASTA file at the start + write_all_contigs(gfa_graph.segments, os.path.join(output_dir, sample_name + ".contigs.fasta")) + + # Start processing the graph + filtered_edges, status = remove_self_loops(gfa_graph.edges) + log['01'] = { + 'step_name': "remove_self_loops", + 'step_description': "Remove self-loops from link information", + 'status': status, + 'output': {'filtered_edges': [str(edge) for edge in filtered_edges]} + } + if status != "PASS": + write_log_and_exit(log, status) + + filtered_graph, status = create_filtered_graph(filtered_edges) + log['02'] = { + 'step_name': "create_filtered_graph", + 'step_description': "Create a filtered NetworkX graph from links and remove disconnected nodes", + 'status': status, + 'output': {'filtered_graph': str(filtered_graph)} + } + if status != "PASS": + write_log_and_exit(log, status) + + filtered_segments = filter_segments_by_graph(gfa_graph.segments, filtered_graph) + + # Find all longest paths + final_paths, itrs, itr_length, status = get_final_paths(gfa_graph, filtered_graph, filtered_segments) + log['03'] = { + 'step_name': "get_final_paths", + 'step_description': "Find all longest paths in the graph starting from any ITR", + 'status': status, + 'output': {'final_paths': final_paths, 'itr_length': itr_length} + } + if not status.startswith("PASS"): + write_log_and_exit(log, status) + + # Find the longest contig + longest_contig, status, longest_contig_file = find_longest_contig(filtered_segments, output_dir) + log['04'] = { + 'step_name': "find_longest_contig", + 'step_description': "Find the longest contig based on length", + 'status': status, + 'output': {'longest_contig': longest_contig} + } + if status != "PASS": + write_log_and_exit(log, status) + + # Create blast database directory + blast_db_dir = os.path.join(output_dir, 'blast_db') + os.makedirs(blast_db_dir, exist_ok=True) # Create if it doesn't exist + + # Determine the orientation of the longest contig + longest_orient, status = orient_longest_contig(longest_contig_file, reference, blast_db_dir) + log['05'] = { + 'step_name': "orient_longest_contig", + 'step_description': "Determine the orientation of the longest contig", + 'status': status, + 'output': {'longest_orient': longest_orient} + } + if status != "PASS": + write_log_and_exit(log, status) + + # Get the final orientation for all contigs in each path + final_path, final_oriented_path, status = get_final_orientation( + final_paths, filtered_edges, longest_contig, longest_orient, itrs) + log['06'] = { + 'step_name': "get_final_orientation", + 'step_description': "Get the final orientation for all contigs", + 'status': status, + 'output': {'final_path': final_path, 'final_orientation': final_oriented_path} + } + if status != "PASS" or final_path is None: + write_log_and_exit(log, "FAIL: No valid path found with the longest contig in the correct orientation.") - # Initial log entry - log['00'] = {'step_name': "initialization", - 'step_description': "Initialize the logging process", - 'status': "PASS", - 'input': { - 'gfa': input_file, - 'sample_name': sample_name, - 'output_dir': output_dir - }, - 'output': {}} + # Generate the final sequence for this path + final_sequence, seq_len, final_order_orientation_copy_number, status = get_final_sequence( + final_oriented_path, filtered_segments) - # Always write all contigs to a FASTA file at the start - write_all_contigs(gfa_graph.segments, os.path.join(output_dir, sample_name + ".contigs.fasta")) - - # Start processing the graph - filtered_edges, status = remove_self_loops(gfa_graph.edges) - log['01'] = { - 'step_name': "remove_self_loops", - 'step_description': "Remove self-loops from link information", - 'status': status, - 'output': {'filtered_edges': [str(edge) for edge in filtered_edges]} - } - if status != "PASS": - write_log_and_exit(log, status) - - filtered_graph, status = create_filtered_graph(filtered_edges) - log['02'] = { - 'step_name': "create_filtered_graph", - 'step_description': "Create a filtered NetworkX graph from links and remove disconnected nodes", - 'status': status, - 'output': {'filtered_graph': str(filtered_graph)} - } - if status != "PASS": - write_log_and_exit(log, status) - - filtered_segments = filter_segments_by_graph(gfa_graph.segments, filtered_graph) - - # Find all longest paths - final_paths, itrs, itr_length, status = get_final_paths(gfa_graph, filtered_graph, filtered_segments) - log['03'] = { - 'step_name': "get_final_paths", - 'step_description': "Find all longest paths in the graph starting from any ITR", - 'status': status, - 'output': {'final_paths': final_paths, 'itr_length': itr_length} - } - if not status.startswith("PASS"): - write_log_and_exit(log, status) - - # Find the longest contig - longest_contig, status, longest_contig_file = find_longest_contig(filtered_segments, output_dir) - log['04'] = { - 'step_name': "find_longest_contig", - 'step_description': "Find the longest contig based on length", - 'status': status, - 'output': {'longest_contig': longest_contig} - } - if status != "PASS": - write_log_and_exit(log, status) - - # Create blast database directory - blast_db_dir = os.path.join(output_dir, 'blast_db') - os.makedirs(blast_db_dir, exist_ok=True) # Create if it doesn't exist - - # Determine the orientation of the longest contig - longest_orient, status = orient_longest_contig(longest_contig_file, reference, blast_db_dir) - log['05'] = { - 'step_name': "orient_longest_contig", - 'step_description': "Determine the orientation of the longest contig", - 'status': status, - 'output': {'longest_orient': longest_orient} - } - if status != "PASS": - write_log_and_exit(log, status) - - # Get the final orientation for all contigs in each path - final_path, final_oriented_path, status = get_final_orientation( - final_paths, filtered_edges, longest_contig, longest_orient) - log['06'] = { - 'step_name': "get_final_orientation", - 'step_description': "Get the final orientation for all contigs", - 'status': status, - 'output': {'final_path': final_path, 'final_orientation': final_oriented_path} - } - if status != "PASS" or final_path is None: - write_log_and_exit(log, "FAIL: No valid path found with the longest contig in the correct orientation.") - - # Generate the final sequence for this path - final_sequence, seq_len, final_order_orientation_copy_number, status = get_final_sequence( - final_oriented_path, filtered_segments) - - if status != "PASS": - write_log_and_exit(log, "FAIL: Sequence generation failed for the final path.") - - # Write the sequence to a FASTA file - asm_name = sample_name + ".assembly_asm.fasta" - assembly_file = os.path.join(output_dir, asm_name) - record = SeqRecord(Seq(final_sequence), id=input_base, description=final_order_orientation_copy_number) - with open(assembly_file, 'w') as f: - SeqIO.write(record, f, "fasta") - # Update log with the final selected assembly - log['07'] = { - 'step_name': "generate_final_sequence", - 'step_description': "Generate the final sequence based on the best path and orientation", - 'status': "PASS", - 'output': { - 'final_sequence_length': seq_len, - 'final_order_orientation_copy_number': final_order_orientation_copy_number, - 'assembly_file': asm_name, - 'final_path': final_path, - 'final_orientation': final_oriented_path + if status != "PASS": + write_log_and_exit(log, "FAIL: Sequence generation failed for the final path.") + + # Write the sequence to a FASTA file + asm_name = sample_name + ".assembly_asm.fasta" + assembly_file = os.path.join(output_dir, asm_name) + record = SeqRecord(Seq(final_sequence), id=input_base, description=final_order_orientation_copy_number) + with open(assembly_file, 'w') as f: + SeqIO.write(record, f, "fasta") + # Update log with the final selected assembly + log['07'] = { + 'step_name': "generate_final_sequence", + 'step_description': "Generate the final sequence based on the best path and orientation", + 'status': "PASS", + 'output': { + 'final_sequence_length': seq_len, + 'final_order_orientation_copy_number': final_order_orientation_copy_number, + 'assembly_file': asm_name, + 'final_path': final_path, + 'final_orientation': final_oriented_path + } } - } - # Remove the blast_db directory - shutil.rmtree(blast_db_dir) # Remove the directory and its contents + # Remove the blast_db directory + shutil.rmtree(blast_db_dir) # Remove the directory and its contents - # Write the final log and summary - write_log_and_exit(log, "PASS") + # Write the final log and summary + write_log_and_exit(log, "PASS") + except Exception as e: + log['Exception'] = {'error': str(e)} + write_log_and_exit(log, "FAIL: Exception occurred during processing") + return def main(arguments): parser = argparse.ArgumentParser(description="GFA parser to construct assembly from Unicycler") @@ -529,19 +547,40 @@ def main(arguments): output_dir = args.o reference_file = args.r - # clean up gfa tags - cleanedGfa = 'graph_cleaned.gfa' - clean_graph_tags(gfa_file, cleanedGfa) + input_with_ext = os.path.basename(gfa_file) + input_base, _ = os.path.splitext(input_with_ext) + sample_name = input_base.replace('.003_bridges_applied', '') - gfa_graph, status = read_gfa_file(cleanedGfa) - if status != "PASS": - return + # Initialize log + log = {} + log['00'] = {'step_name': "initialization", + 'step_description': "Initialize the logging process", + 'status': "PASS", + 'input': { + 'gfa': gfa_file, + 'sample_name': sample_name, + 'output_dir': output_dir + }, + 'output': {}} - if gfa_graph is None: - print("Failed to read GFA file.") - return + try: + # clean up gfa tags + cleanedGfa = 'graph_cleaned.gfa' + clean_graph_tags(gfa_file, cleanedGfa) - process_graph(gfa_graph, output_dir, gfa_file, reference_file) + gfa_graph, status = read_gfa_file(cleanedGfa) + if status != "PASS": + write_log_and_exit(log, status) + + if gfa_graph is None: + print("Failed to read GFA file.") + write_log_and_exit(log, "FAIL: Failed to read GFA file") + return + + process_graph(gfa_graph, output_dir, gfa_file, reference_file, log) + except Exception as e: + log['Exception'] = {'error': str(e)} + write_log_and_exit(log, "FAIL: Exception occurred in main") if __name__ == '__main__': main(sys.argv[1:]) \ No newline at end of file From d7a834ecf0091221cccb1dc668ee60031d459a47 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Tue, 5 Nov 2024 12:28:25 -0500 Subject: [PATCH 30/42] added BorealPox to the list of kraken2 tax ids --- assets/kraken2_tax_ids.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assets/kraken2_tax_ids.txt b/assets/kraken2_tax_ids.txt index 88de324..6241e77 100755 --- a/assets/kraken2_tax_ids.txt +++ b/assets/kraken2_tax_ids.txt @@ -10,4 +10,5 @@ 2200830 10256 28871 -160796 \ No newline at end of file +160796 +2602439 \ No newline at end of file From 04eb4b633815cf95bc6f7ab80a34ca859041f732 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Tue, 5 Nov 2024 14:16:47 -0500 Subject: [PATCH 31/42] made one change to the circularity check to check for complete cycle in the graph --- bin/AssemblyGraph_gfaPy.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/bin/AssemblyGraph_gfaPy.py b/bin/AssemblyGraph_gfaPy.py index 38227f9..3fd4395 100755 --- a/bin/AssemblyGraph_gfaPy.py +++ b/bin/AssemblyGraph_gfaPy.py @@ -85,6 +85,7 @@ def create_filtered_graph(links): """Create a filtered NetworkX graph from links and remove disconnected nodes.""" graph = nx.MultiGraph() # Using a simple Graph instead of MultiGraph if you don't handle multiple edges between the same nodes for link in links: + print(link) graph.add_edge(link.from_name, link.to_name) # Remove disconnected nodes @@ -94,14 +95,17 @@ def create_filtered_graph(links): return None, "WARNING: Graph is not connected" # Check if the graph forms a cycle + # get the number of edges for each node degrees = dict(graph.degree()) + # figure out how many nodes have more or less than two edges, count count_not_two = sum(1 for degree in degrees.values() if degree < 2) all_degree_two = count_not_two <= 1 num_edges = graph.number_of_edges() num_nodes = graph.number_of_nodes() - - if all_degree_two and num_edges == num_nodes: + + # make sure the number of edges and nodes are equal (perfect loop) or one off (loop + ITR) + if all_degree_two and num_edges == num_nodes or num_edges == num_nodes+1: print('The graph forms a complete cycle') return graph, "PASS" else: From 888d13d7b5993beddc4b95c874e38e099cb5730f Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Tue, 5 Nov 2024 15:32:27 -0500 Subject: [PATCH 32/42] fixed summarize qc log to match new graph recon log --- bin/summarize_qc.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bin/summarize_qc.py b/bin/summarize_qc.py index 90e17d8..a27e19a 100755 --- a/bin/summarize_qc.py +++ b/bin/summarize_qc.py @@ -211,15 +211,15 @@ def get_gfa_stats(sample): logger.error(f"Could not load data from {gfa_log}") return(['NA','NA','NA','NA','NA']) - if len(parsed_json.keys()) == 10: + if len(parsed_json.keys()) == 7: notes = 'GFA step complete' - successCode_step8 = list(parsed_json)[-3] - successCode_step10 = list(parsed_json)[-1] + step07 = list(parsed_json)[6] + step03 = list(parsed_json)[3] - final_order_orientation_copy_number = parsed_json[successCode_step8]['output']['final_order_orientation_copy_number'] - final_sequence_length = parsed_json[successCode_step8]['output']['final_sequence_length'] - status = parsed_json[successCode_step10]['status'] - final_itr_length = parsed_json[successCode_step10]['output']['final_itr_length'] + final_order_orientation_copy_number = parsed_json[step07]['output']['final_orientation'] + final_sequence_length = parsed_json[step07]['output']['final_sequence_length'] + status = parsed_json[step07]['status'] + final_itr_length = parsed_json[step03]['output']['itr_length'] gfaResults = [final_order_orientation_copy_number, float(final_sequence_length), float(final_itr_length), status, notes] else: failCode_stepN = list(parsed_json)[-1] From 05d0ef325a70e628da6b342c05850c85104d8bc3 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Wed, 6 Nov 2024 15:16:13 -0500 Subject: [PATCH 33/42] updated summarize qc to match new gfa output --- bin/summarize_qc.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/bin/summarize_qc.py b/bin/summarize_qc.py index a27e19a..60cb832 100755 --- a/bin/summarize_qc.py +++ b/bin/summarize_qc.py @@ -106,6 +106,7 @@ def get_kraken_stats(sample, kdb, kraken_tax_ids): ortho_reads = "{}.opxreads.txt".format(sample) if os.path.exists(kraken_reads) and os.path.exists(ortho_reads): + print('Kraken Paths Exist!!!!!') try: k_data = pd.read_csv(kraken_reads, delim_whitespace=True, usecols=[0,1,2,3,4], header=None) logger.info(f"Data load from {kraken_reads}") @@ -133,7 +134,7 @@ def get_kraken_stats(sample, kdb, kraken_tax_ids): with open(kraken_tax_ids) as l: lines = [line.strip() for line in l.readlines()] k_tax_ids = ', '.join(lines) - + print('printing kraken stuff for testing',total,opx_perc, human_perc) return total, opx_perc, human_perc, unclass_perc, kdb, k_tax_ids def get_flagstat_denovo(sample): @@ -202,7 +203,7 @@ def get_gfa_stats(sample): """ gfa_log = "{}.assembly.log".format(sample) - if os.path.exists(gfa_log): + if os.path.exists(gfa_log): f = open(gfa_log) try: parsed_json = json.load(f) @@ -210,19 +211,23 @@ def get_gfa_stats(sample): except: logger.error(f"Could not load data from {gfa_log}") return(['NA','NA','NA','NA','NA']) - - if len(parsed_json.keys()) == 7: + print('len of json keys', len(parsed_json.keys())) + + if len(parsed_json.keys()) == 8: + print('parsing log file') notes = 'GFA step complete' - step07 = list(parsed_json)[6] + step07 = list(parsed_json)[7] step03 = list(parsed_json)[3] final_order_orientation_copy_number = parsed_json[step07]['output']['final_orientation'] + final_order_orientation_copy_number = ', '.join(str(item) for item in final_order_orientation_copy_number) + final_sequence_length = parsed_json[step07]['output']['final_sequence_length'] status = parsed_json[step07]['status'] final_itr_length = parsed_json[step03]['output']['itr_length'] gfaResults = [final_order_orientation_copy_number, float(final_sequence_length), float(final_itr_length), status, notes] else: - failCode_stepN = list(parsed_json)[-1] + failCode_stepN = list(parsed_json)[step07] status = parsed_json[failCode_stepN]['status'] statusReport = 'FAIL' gfaResults = ['Unknown','Unknown','Unknown', statusReport, status] @@ -407,7 +412,7 @@ def main(): new_col_names = ['sample', 'reads_total_bwa', 'reads_mapped_bwa', 'n50_unicycler','assembly_length_unicycler','top_taxa_percent_kraken','top5_taxa_percent_kraken','unclassified_percent_kraken','percent_duplication_fastp','q30_rate_postfilter_fastp','q30_bases_postfilter_fastp','gc_content_postfilter_fastp','percent_reads_passed_fastp','percent_adapter_fastp'] fixed_summary = fix_names(summary) - fixed_summary.set_axis(new_col_names, axis=1, inplace=True) + fixed_summary = fixed_summary.set_axis(new_col_names, axis=1) if args.workflow == 'denovo' or args.workflow == 'full': contig_files = glob(os.path.join('**/*quast_num_contigs_1.txt'), recursive=True) @@ -446,6 +451,7 @@ def main(): for sample in summary_full['sample']: summary_full.loc[summary_full['sample'] == sample, ['opx_read_count_kraken', 'filtered_read_count_fastp']] = get_raw_filt_counts(sample) kraken_db = args.kraken_db + print(summary_full) summary_full.loc[summary_full['sample'] == sample, ['total_raw_reads', 'opx_percent_kraken', 'human_percent_kraken', 'unclass_percent_kraken', 'kraken_db','kraken_tax_ids']] = get_kraken_stats(sample, kraken_db, args.kraken_tax_ids) if args.workflow == 'ref_based': summary_full.loc[summary_full['sample'] == sample, ['average_depth_bwa', 'count_20xdepth_bwa','reference_genome']] = get_cov_stats(sample, args.reference_genome) From 2255d30cef591dd4e1fbad6dfa68917513141462 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell <84786080+kyleoconnell@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:05:27 -0500 Subject: [PATCH 34/42] changed path in README of assembly gfa script --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 57e7c61..223b8f5 100755 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool **Reference-free analyses** 1. De novo assembly. ([`Unicycler`](https://github.com/rrwick/Unicycler)) 1. Calculate assembly quality metrics. ([`QUAST`](http://quast.sourceforge.net/)) -1. Assembly graph resolution. ([`mpxv-AssemblyGraph_gfaPy.py`](/bin/mpxv-AssemblyGraph_gfaPy.py)) +1. Assembly graph resolution. ([`AssemblyGraph_gfaPy.py`](/bin/AssemblyGraph_gfaPy.py)) 1. Align reads to assembled genome. ([`BWA`](http://bio-bwa.sourceforge.net/)) 1. Correct assembly errors and ambiguities. ([`iVar`](https://andersen-lab.github.io/ivar/html/manualpage.html)) 1. Quantify assembly corrections. ([`MUMmer`](https://github.com/mummer4/mummer#dnadiff)) From a233334e3e9532934c082594c50a1e184aad697c Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Thu, 7 Nov 2024 15:09:42 -0500 Subject: [PATCH 35/42] updated worklfow image --- README.md | 78 +---------------------------- docs/images/polkapox_v20240322.png | Bin 0 -> 79722 bytes 2 files changed, 1 insertion(+), 77 deletions(-) create mode 100644 docs/images/polkapox_v20240322.png diff --git a/README.md b/README.md index 223b8f5..0ccd3c3 100755 --- a/README.md +++ b/README.md @@ -34,83 +34,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool 1. Visualize reads metrics and summary of software versions. ([`MultiQC`](http://multiqc.info/)) 1. Compile various QC metrics. ([`summarize_qc.py`](/bin/summarize_qc.py)) -```mermaid -graph TD - subgraph filter_reads["Filter Reads"] - kraken2["Kraken2
classify opxv reads"] - seqtk["Seqtk
subsample opxv reads"] - fastp["Fastp:
quality trim + filter"] - kraken2 -- read_assignments --> seqtk - seqtk -- subsampled_reads --> fastp - end - -subgraph ref_based["Reference-based assembly"] - direction LR - bwa["Bwa mem
map to reference"]; - samtools["Samtools
calculate mapping stats"]; - ivar_cons["Ivar consensus
generate consensus fasta"]; - ivar_var["Ivar variants
call variants"] - var_filt[Filtered variants]; - bwa -- bam --> samtools - bwa -- bam --> ivar_cons - bwa -- bam --> ivar_var - ivar_var-."if filter=true".->var_filt - ref_fasta([Consensus fasta]); - vcf([VCF]); - - ivar_cons --> ref_fasta - ivar_var --> vcf -end - - subgraph denovo[Denovo assembly] - %% Assign the processes (nodes) - unicycler["Unicycler
Denovo assembly"] - graph_recon["graph_reconstruct.py
Reconstruct assembly path"] - bwa_denovo["Bwa mem
map to assembly"] - samtools_denovo["Samtools
calculate mapping stats"] - ivar_polish["Ivar consensus
generate consensus fasta"] - summarize_asmb["Mummer and Quast
Summarize assembly"] - - %% Assign output files - assembly_fasta(["Final assembly"]) - assembly_contigs(["Assembly contigs"]) - - %% Assign the arrows - %%fastp -- cleaned_reads --> unicycler - unicycler -- assembly_graph --> graph_recon - graph_recon -- fasta assembly --> bwa_denovo - graph_recon -."if unable to reconstruct graph".-> assembly_contigs - %%fastp -- cleaned_reads --> bwa_denovo - bwa_denovo -- bam --> samtools_denovo - bwa_denovo -- bam --> ivar_polish - ivar_polish --> assembly_fasta - graph_recon --> summarize_asmb - assembly_fasta --> summarize_asmb - end - - subgraph summarize[Summarize and QC] - direction LR - %% Assign the processes (nodes) - multiqc["MultiQC
Gather and summarize"] - summarizeqc["Summarize_qc.py
Summarize all processes"] - - %% Assign output files - sample_summary(["sample_summary.tsv
Summary table of all processes"]) - - %% Assign the arrows - %%assembly_fasta --> multiqc - %%ref_fasta --> multiqc - multiqc --> summarizeqc - summarizeqc --> sample_summary - end - - %% Connect the subworkflows - filter_reads -- cleaned reads --> denovo - filter_reads -- cleaned reads --> ref_based - denovo --> summarize - ref_based --> summarize -``` - +![workflow diagram](/docs/images/bandage_polkapox.png) ## Quick Start 1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) diff --git a/docs/images/polkapox_v20240322.png b/docs/images/polkapox_v20240322.png new file mode 100644 index 0000000000000000000000000000000000000000..7cf59bbfe82c3d7487b054b4605bf0d5c7babcb2 GIT binary patch literal 79722 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 L`;ChYokRZv%|*>o literal 0 HcmV?d00001 From 793031d9b9e1574de890d05e293637347ddc9619 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Thu, 7 Nov 2024 15:11:50 -0500 Subject: [PATCH 36/42] fixed path to image --- README.md | 3 ++- docs/images/polkapox_workflow.png | Bin 0 -> 79723 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 docs/images/polkapox_workflow.png diff --git a/README.md b/README.md index 0ccd3c3..a1d7655 100755 --- a/README.md +++ b/README.md @@ -34,7 +34,8 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool 1. Visualize reads metrics and summary of software versions. ([`MultiQC`](http://multiqc.info/)) 1. Compile various QC metrics. ([`summarize_qc.py`](/bin/summarize_qc.py)) -![workflow diagram](/docs/images/bandage_polkapox.png) +![workflow diagram](/docs/images/polkapox_workflow.png) + ## Quick Start 1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) diff --git a/docs/images/polkapox_workflow.png b/docs/images/polkapox_workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..74f8333c34b3e8ae88580273ad88f703650137f3 GIT binary patch literal 79723 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%0Ab<2qA$juQ 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 Md-od^890ah2kphwS^xk5 literal 0 HcmV?d00001 From dd2b259831fc5eeea3aa88d387c5d41521ad12a3 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Thu, 7 Nov 2024 15:18:24 -0500 Subject: [PATCH 37/42] updated contributions --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a1d7655..b6dc623 100755 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz nextflow run polkapox/main.nf --input {SAMPLESHEET.csv OR input_directory} --outdir {OUTDIR} --fasta {REF.fa} -profile sge,singularity --kraken_db {PATH/TO/DB} --gff {ANNOTATION.gff} --workflow {WORKFLOW} --filter {true/false} ``` - **note**: If you do not provide `--fasta`, `--gff`, or `--kraken_db`, they will default to the reference and gff in the `assets` folder of this repo, and a kraken db hosted on the SciComp file system, respectively. If you do not specify `--filter` then it will default to `true`. See `nextflow.config` for details. Add `--file_levels {top (default)/nested}` if passing a directory as input. See [usage](/docs/usage.md) for details. + **note**: If you do not provide `--fasta`, `--gff`, or `--kraken_db`, they will default to a Clade II reference and gff in the `assets` folder of this repo, and a kraken db will be downloaded from `s3://io-pe1-prod-ncezid-oamd-nextstrain/polkapox/orthopox_kdb/`. If you do not specify `--filter` then it will default to `true`. See `nextflow.config` for details. Add `--file_levels {top (default)/nested}` if passing a directory as input. See [usage](/docs/usage.md) for details. ## Pipeline configuration @@ -100,6 +100,7 @@ Pipeline outputs are organized into sub-directories for each step in the selecte ``` ${outdir}/ ├── bwa + ├── bandage ├── fastp ├── final_assembly ├── graph_recon @@ -123,9 +124,9 @@ The **PolkaPox** pipeline includes de novo assembly optimized for the linear gen ## Credits Contributors:\ -Lynsey Kovar | Hunter Seabolt | Shatavia Morrison | Kristen Knipe\ -Kyle O'Connell | Ethan Hetrick | Michael Weigand | Crystal Gigante\ -Dhwani Batra | Ankush Gupta | Jessica Rowell | Daisy McGrath\ +Kyle O'Connell | Michael Weigand | Jessica Rowell | Shatavia Morrison\ +Kristen Knipe | Ethan Hetrick | Crystal Gigante | Lynsey Kovar\ +Hunter Seabolt | Dhwani Batra | Daisy McGrath\ Yesh Kulasekarapandian | Jason Caravas ## Contributions and Support From 8c1dcf2a93f39592b31acb71894d038e2fbfefaf Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Thu, 7 Nov 2024 16:04:24 -0500 Subject: [PATCH 38/42] updated some kraken2 language in docs --- docs/usage.md | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 2b16ea6..3be833a 100755 --- a/docs/usage.md +++ b/docs/usage.md @@ -103,15 +103,18 @@ TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, | `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | | `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. +An [example samplesheet](../assets/samplesheet.test.csv) has been provided with the pipeline. +### Multiple runs of the same sample -### Input Directory -Instead of providing a samplesheet you can also provide the path to a directory with fastq files. The script currently accepts two directory structures: -1. A parent directory with subdirectories, each containing paired FastQ files. -2. A directory with FastQ files directly under it +The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once (e.g. to increase sequencing depth). The pipeline will concatenate the raw reads before performing any downstream analysis. Below is an example for the same sample sequenced across 3 lanes: -The pipeline will exit if it detects a mix of directory structures (i.e., some FastQ files directly under the parent directory and others nested one level down). +```console +sample,fastq_1,fastq_2 +CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz +CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz +CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz +``` ### Single-end vs. Paired-end reads @@ -119,28 +122,14 @@ The pipeline assumes paired-end reads by default. You should specify `--paired If you're providing a samplesheet, the pipeline will automatically detect paired-end vs. single-end reads based on the samplesheet, as described above. ## Entrypoint/Subworkflow options -This workflow contains several entrypoints that allow you as the user to specify which components of the workflow you would like to run. You must select one entrypoint using the `--workflow` parameter. +This workflow contains several entrypoints that allow you as the user to specify which components of the workflow you would like to run. You must select one entrypoint using the `--workflow` parameter. Options include `full`, `filter_reads`, `ref_based`, and `denovo`. Read filtering is always run, but can optionally be run alone. ## Kraken2 DB options -The default kraken2 database was assembled from MA001_USA_002 (Genbank Accession ON563414.3) and the human genome GRCh38 (GCF_000001405.40). For MPOX samples from other clades, or for other species of Orthopox, we recommend using an expanded database more inclusive of the target lineage. We included one version of this expanded database that includes MA001 and the human genome, as well as MPOX from Clade I (NC_003310), and the following Orthopox representative Refseq genomes: - - + Variola major (NC_001611) - + Variola minor (DQ441419) - + Alaskapox (MN240300) - + Camelpox (NC_003391) - + Cowpox (NC_003663) - + Ectromelia (NC_004105) - + Vaccinia (NC_006998) - + Taterapox (NC_008291) - + Racoonpox (NC027213) - + Volepox (NC_031033) - + Skunkpox (NC_031038) - + Akhmeta (NC_055230) - + Horsepox (NC_066642) +The default kraken2 database was assembled from 15 Orthopox viruses including Monkeypox virus Clade II (MA001_USA_002), Monkeypox virus Clade I (NC_003310), Variola major (NC_001611), Variola minor (DQ441419), Borealpox (MN240300), Camelpox (NC_003391), Cowpox (NC_003663), Ectromelia (NC_004105), Vaccinia (NC_006998), Taterapox (NC_008291), Racoonpox (NC027213), Volepox (NC_031033), Skunkpox (NC_031038), Akhmeta (NC_055230), Horsepox (NC_066642), and the human genome build GRCh38 (GCF_000001405.40). We also include the path to smaller database with only Monkeypox virus Clade II (MA001_USA_002), and human genome build GRCh38 (GCF_000001405.40) which works quite well on Monkeypox virus Clade II samples. By default the pipeline will keep reads pertaining to any of these NCBI taxon IDs which are defined in the file `assets/kraken2_tax_ids.txt`. You can modify this file and point to it for filtering with the `--kraken2_tax_ids` parameter. -You can recreate this database with the following commands: +You can also recreate this database with the following commands: Install mamba ``` From 6b76799e032b88f55a668f6b49025cb7d9f81250 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Tue, 4 Feb 2025 20:21:55 +0000 Subject: [PATCH 39/42] updated some broken modules/nf-core/modules paths --- .../sratools/fasterqdump/environment.yml | 8 +++ modules/nf-core/sratools/fasterqdump/main.nf | 45 ++++++++++++++ modules/nf-core/sratools/fasterqdump/meta.yml | 53 ++++++++++++++++ .../sratools/fasterqdump/nextflow.config | 10 +++ .../fasterqdump/sratools-fasterqdump.diff | 62 +++++++++++++++++++ .../nf-core/sratools/prefetch/environment.yml | 7 +++ modules/nf-core/sratools/prefetch/main.nf | 25 ++++++++ modules/nf-core/sratools/prefetch/meta.yml | 56 +++++++++++++++++ .../nf-core/sratools/prefetch/nextflow.config | 8 +++ .../prefetch/templates/retry_with_backoff.sh | 55 ++++++++++++++++ .../sratoolsncbisettings/environment.yml | 7 +++ .../sratools/sratoolsncbisettings/main.nf | 23 +++++++ .../sratools/sratoolsncbisettings/meta.yml | 28 +++++++++ .../templates/detect_ncbi_settings.sh | 45 ++++++++++++++ nextflow.config | 2 +- subworkflows/nf-core/sra_tools/main.nf | 4 +- workflows/polkapox.nf | 3 +- 17 files changed, 436 insertions(+), 5 deletions(-) create mode 100755 modules/nf-core/sratools/fasterqdump/environment.yml create mode 100755 modules/nf-core/sratools/fasterqdump/main.nf create mode 100755 modules/nf-core/sratools/fasterqdump/meta.yml create mode 100755 modules/nf-core/sratools/fasterqdump/nextflow.config create mode 100755 modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff create mode 100755 modules/nf-core/sratools/prefetch/environment.yml create mode 100755 modules/nf-core/sratools/prefetch/main.nf create mode 100755 modules/nf-core/sratools/prefetch/meta.yml create mode 100755 modules/nf-core/sratools/prefetch/nextflow.config create mode 100755 modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh create mode 100755 modules/nf-core/sratools/sratoolsncbisettings/environment.yml create mode 100755 modules/nf-core/sratools/sratoolsncbisettings/main.nf create mode 100755 modules/nf-core/sratools/sratoolsncbisettings/meta.yml create mode 100755 modules/nf-core/sratools/sratoolsncbisettings/templates/detect_ncbi_settings.sh diff --git a/modules/nf-core/sratools/fasterqdump/environment.yml b/modules/nf-core/sratools/fasterqdump/environment.yml new file mode 100755 index 0000000..dd0faa5 --- /dev/null +++ b/modules/nf-core/sratools/fasterqdump/environment.yml @@ -0,0 +1,8 @@ +name: sratools_fasterqdump +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::sra-tools=2.11.0 + - conda-forge::pigz=2.6 diff --git a/modules/nf-core/sratools/fasterqdump/main.nf b/modules/nf-core/sratools/fasterqdump/main.nf new file mode 100755 index 0000000..ec76786 --- /dev/null +++ b/modules/nf-core/sratools/fasterqdump/main.nf @@ -0,0 +1,45 @@ +process SRATOOLS_FASTERQDUMP { + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' : + 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' }" + + input: + tuple val(meta), path(id) + + output: + tuple val(meta), path('*_1.fastq.gz'), emit: forward + tuple val(meta), path('*_2.fastq.gz'), emit: reverse + + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta}" + def outfile = "${prefix}.fastq" + """ + fasterq-dump \\ + $args \\ + --threads $task.cpus \\ + --outfile $outfile \\ + ${id} + + pigz \\ + $args2 \\ + --no-name \\ + --processes $task.cpus \\ + *.fastq + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + sratools: \$(fasterq-dump --version 2>&1 | grep -Eo '[0-9.]+') + pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/sratools/fasterqdump/meta.yml b/modules/nf-core/sratools/fasterqdump/meta.yml new file mode 100755 index 0000000..b5e0175 --- /dev/null +++ b/modules/nf-core/sratools/fasterqdump/meta.yml @@ -0,0 +1,53 @@ +name: sratools_fasterqdump +description: Extract sequencing reads in FASTQ format from a given NCBI Sequence Read Archive (SRA). +keywords: + - sequencing + - FASTQ + - dump +tools: + - sratools: + description: SRA Toolkit and SDK from NCBI + homepage: https://github.com/ncbi/sra-tools + documentation: https://github.com/ncbi/sra-tools/wiki + tool_dev_url: https://github.com/ncbi/sra-tools + licence: ["Public Domain"] +input: + - meta: + type: map + description: > + Groovy Map containing sample information e.g. [ id:'test', single_end:false ] + + - sra: + type: directory + description: Directory containing ETL data for the given SRA. + pattern: "*/*.sra" + - ncbi_settings: + type: file + description: > + An NCBI user settings file. + + pattern: "*.mkfg" + - certificate: + type: file + description: > + Path to a JWT cart file used to access protected dbGAP data on SRA using the sra-toolkit + + pattern: "*.cart" +output: + - meta: + type: map + description: > + Groovy Map containing sample information e.g. [ id:'test', single_end:false ] + + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - reads: + type: file + description: Extracted FASTQ file or files if the sequencing reads are paired-end. + pattern: "*.fastq.gz" +authors: + - "@Midnighter" +maintainers: + - "@Midnighter" diff --git a/modules/nf-core/sratools/fasterqdump/nextflow.config b/modules/nf-core/sratools/fasterqdump/nextflow.config new file mode 100755 index 0000000..f98b140 --- /dev/null +++ b/modules/nf-core/sratools/fasterqdump/nextflow.config @@ -0,0 +1,10 @@ +process { + withName: SRATOOLS_FASTERQDUMP { + ext.args = '--split-files --include-technical' + publishDir = [ + path: { "${params.outdir}/fastq" }, + mode: params.publish_dir_mode, + pattern: "*.fastq.gz" + ] + } +} \ No newline at end of file diff --git a/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff b/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff new file mode 100755 index 0000000..089862b --- /dev/null +++ b/modules/nf-core/sratools/fasterqdump/sratools-fasterqdump.diff @@ -0,0 +1,62 @@ +Changes in module 'nf-core/sratools/fasterqdump' +--- modules/nf-core/sratools/fasterqdump/main.nf ++++ modules/nf-core/sratools/fasterqdump/main.nf +@@ -4,8 +4,8 @@ + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? +- 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:2f4a4c900edd6801ff0068c2b3048b4459d119eb-0' : +- 'biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:2f4a4c900edd6801ff0068c2b3048b4459d119eb-0' }" ++ 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' : ++ 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' }" + + input: + tuple val(meta), path(sra) + +--- /dev/null ++++ modules/nf-core/sratools/fasterqdump/nextflow.config +@@ -0,0 +1,10 @@ ++process { ++ withName: SRATOOLS_FASTERQDUMP { ++ ext.args = '--split-files --include-technical' ++ publishDir = [ ++ path: { "${params.outdir}/fastq" }, ++ mode: params.publish_dir_mode, ++ pattern: "*.fastq.gz" ++ ] ++ } ++} +--- modules/nf-core/sratools/fasterqdump/environment.yml ++++ modules/nf-core/sratools/fasterqdump/environment.yml +@@ -4,5 +4,5 @@ + - bioconda + - defaults + dependencies: +- - bioconda::sra-tools=3.0.8 ++ - bioconda::sra-tools=2.11.0 + - conda-forge::pigz=2.6 + +--- modules/nf-core/sratools/fasterqdump/tests/main.nf.test ++++ modules/nf-core/sratools/fasterqdump/tests/main.nf.test +@@ -3,11 +3,8 @@ + script "../main.nf" + config "./nextflow.config" + process "SRATOOLS_FASTERQDUMP" +- tag "modules" +- tag "modules_nfcore" +- tag "untar" +- tag "sratools" +- tag "sratools/fasterqdump" ++ ++ tag "UNTAR" + + test("Single-end") { + + +--- modules/nf-core/sratools/fasterqdump/tests/tags.yml ++++ /dev/null +@@ -1,2 +0,0 @@ +-sratools/fasterqdump: +- - modules/nf-core/sratools/fasterqdump/** + +************************************************************ diff --git a/modules/nf-core/sratools/prefetch/environment.yml b/modules/nf-core/sratools/prefetch/environment.yml new file mode 100755 index 0000000..cfc7d9a --- /dev/null +++ b/modules/nf-core/sratools/prefetch/environment.yml @@ -0,0 +1,7 @@ +name: sratools_prefetch +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::sra-tools=3.0.8 diff --git a/modules/nf-core/sratools/prefetch/main.nf b/modules/nf-core/sratools/prefetch/main.nf new file mode 100755 index 0000000..0569d8a --- /dev/null +++ b/modules/nf-core/sratools/prefetch/main.nf @@ -0,0 +1,25 @@ +process SRATOOLS_PREFETCH { + tag "$id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' : + 'ncbi/sra-tools:2.11.3' }" + + input: + tuple val(meta), val(id) + + output: + tuple val(meta), path(id), emit: sra + //path 'versions.yml' , emit: versions + + when: + task.ext.when == null || task.ext.when + + shell: + """ + prefetch $id -O . + + """ +} diff --git a/modules/nf-core/sratools/prefetch/meta.yml b/modules/nf-core/sratools/prefetch/meta.yml new file mode 100755 index 0000000..ff54229 --- /dev/null +++ b/modules/nf-core/sratools/prefetch/meta.yml @@ -0,0 +1,56 @@ +name: sratools_prefetch +description: Download sequencing data from the NCBI Sequence Read Archive (SRA). +keywords: + - sequencing + - fastq + - prefetch +tools: + - sratools: + description: SRA Toolkit and SDK from NCBI + homepage: https://github.com/ncbi/sra-tools + documentation: https://github.com/ncbi/sra-tools/wiki + tool_dev_url: https://github.com/ncbi/sra-tools + licence: ["Public Domain"] +input: + - meta: + type: map + description: > + Groovy Map containing sample information e.g. [ id:'test', single_end:false ] + + - id: + type: string + description: > + A string denoting an SRA id. + + - ncbi_settings: + type: file + description: > + An NCBI user settings file. + + pattern: "*.mkfg" + - certificate: + type: file + description: > + Path to a JWT cart file used to access protected dbGAP data on SRA using the sra-toolkit + + pattern: "*.cart" +output: + - meta: + type: map + description: > + Groovy Map containing sample information e.g. [ id:'test', single_end:false ] + + - sra: + type: directory + description: > + Directory containing the ETL data for the given SRA id. + + pattern: "*/*.sra" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@Midnighter" +maintainers: + - "@Midnighter" diff --git a/modules/nf-core/sratools/prefetch/nextflow.config b/modules/nf-core/sratools/prefetch/nextflow.config new file mode 100755 index 0000000..a2ca884 --- /dev/null +++ b/modules/nf-core/sratools/prefetch/nextflow.config @@ -0,0 +1,8 @@ +process { + withName: SRATOOLS_PREFETCH { + publishDir = [ + path: { "${params.outdir}/sra" }, + enabled: false + ] + } +} \ No newline at end of file diff --git a/modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh b/modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh new file mode 100755 index 0000000..a72a4bf --- /dev/null +++ b/modules/nf-core/sratools/prefetch/templates/retry_with_backoff.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash + +set -u + +retry_with_backoff() { + local max_attempts=${1} + local delay=${2} + local max_time=${3} + local attempt=1 + local output= + local status= + + # Remove the first three arguments to this function in order to access + # the 'real' command with `${@}`. + shift 3 + + while [ ${attempt} -le ${max_attempts} ]; do + output=$("${@}") + status=${?} + + if [ ${status} -eq 0 ]; then + break + fi + + if [ ${attempt} -lt ${max_attempts} ]; then + echo "Failed attempt ${attempt} of ${max_attempts}. Retrying in ${delay} s." >&2 + sleep ${delay} + elif [ ${attempt} -eq ${max_attempts} ]; then + echo "Failed after ${attempt} attempts." >&2 + return ${status} + fi + + attempt=$(( ${attempt} + 1 )) + delay=$(( ${delay} * 2 )) + if [ ${delay} -ge ${max_time} ]; then + delay=${max_time} + fi + done + + echo "${output}" +} + +export NCBI_SETTINGS="$PWD/!{ncbi_settings}" + +retry_with_backoff !{args2} \ + prefetch \ + !{args} \ + !{id} + +[ -f !{id}.sralite ] && vdb-validate !{id}.sralite || vdb-validate !{id} + +cat <<-END_VERSIONS > versions.yml +"!{task.process}": + sratools: $(prefetch --version 2>&1 | grep -Eo '[0-9.]+') +END_VERSIONS diff --git a/modules/nf-core/sratools/sratoolsncbisettings/environment.yml b/modules/nf-core/sratools/sratoolsncbisettings/environment.yml new file mode 100755 index 0000000..44a1b00 --- /dev/null +++ b/modules/nf-core/sratools/sratoolsncbisettings/environment.yml @@ -0,0 +1,7 @@ +name: custom_sratoolsncbisettings +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::sra-tools=3.0.8 diff --git a/modules/nf-core/sratools/sratoolsncbisettings/main.nf b/modules/nf-core/sratools/sratoolsncbisettings/main.nf new file mode 100755 index 0000000..e2692a2 --- /dev/null +++ b/modules/nf-core/sratools/sratoolsncbisettings/main.nf @@ -0,0 +1,23 @@ +process CUSTOM_SRATOOLSNCBISETTINGS { + tag 'ncbi-settings' + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' : + 'quay.io/biocontainers/mulled-v2-5f89fe0cd045cb1d615630b9261a1d17943a9b6a:6a9ff0e76ec016c3d0d27e0c0d362339f2d787e6-0' }" + + input: + val ids + + output: + path('*.mkfg') , emit: ncbi_settings + path 'versions.yml', emit: versions + + when: + task.ext.when == null || task.ext.when + + shell: + config = "/LIBS/GUID = \"${UUID.randomUUID().toString()}\"\\n/libs/cloud/report_instance_identity = \"true\"\\n" + template 'detect_ncbi_settings.sh' +} diff --git a/modules/nf-core/sratools/sratoolsncbisettings/meta.yml b/modules/nf-core/sratools/sratoolsncbisettings/meta.yml new file mode 100755 index 0000000..46a6cd3 --- /dev/null +++ b/modules/nf-core/sratools/sratoolsncbisettings/meta.yml @@ -0,0 +1,28 @@ +name: "custom_sratoolsncbisettings" +description: Test for the presence of suitable NCBI settings or create them on the fly. +keywords: + - NCBI + - settings + - sra-tools + - prefetch + - fasterq-dump +tools: + - "sratools": + description: "SRA Toolkit and SDK from NCBI" + homepage: https://github.com/ncbi/sra-tools + documentation: https://github.com/ncbi/sra-tools/wiki + tool_dev_url: https://github.com/ncbi/sra-tools + licence: ["Public Domain"] +output: + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - ncbi_settings: + type: file + description: An NCBI user settings file. + pattern: "*.mkfg" +authors: + - "@Midnighter" +maintainers: + - "@Midnighter" diff --git a/modules/nf-core/sratools/sratoolsncbisettings/templates/detect_ncbi_settings.sh b/modules/nf-core/sratools/sratoolsncbisettings/templates/detect_ncbi_settings.sh new file mode 100755 index 0000000..cfe3a32 --- /dev/null +++ b/modules/nf-core/sratools/sratoolsncbisettings/templates/detect_ncbi_settings.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash + +set -u + + +# Get the expected NCBI settings path and define the environment variable +# `NCBI_SETTINGS`. +eval "$(vdb-config -o n NCBI_SETTINGS | sed 's/[" ]//g')" + +# If the user settings do not exist yet, create a file suitable for `prefetch` +# and `fasterq-dump`. If an existing settings file does not contain the required +# values, error out with a helpful message. +if [[ ! -f "${NCBI_SETTINGS}" ]]; then + printf '!{config}' > 'user-settings.mkfg' +else + prefetch --help &> /dev/null + if [[ $? = 78 ]]; then + echo "You have an existing vdb-config at '${NCBI_SETTINGS}' but it is"\ + "missing the required entries for /LIBS/GUID and"\ + "/libs/cloud/report_instance_identity."\ + "Feel free to add the following to your settings file:" >&2 + echo "$(printf '!{config}')" >&2 + exit 1 + fi + fasterq-dump --help &> /dev/null + if [[ $? = 78 ]]; then + echo "You have an existing vdb-config at '${NCBI_SETTINGS}' but it is"\ + "missing the required entries for /LIBS/GUID and"\ + "/libs/cloud/report_instance_identity."\ + "Feel free to add the following to your settings file:" >&2 + echo "$(printf '!{config}')" >&2 + exit 1 + fi + if [[ "${NCBI_SETTINGS}" != *.mkfg ]]; then + echo "The detected settings '${NCBI_SETTINGS}' do not have the required"\ + "file extension '.mkfg'." >&2 + exit 1 + fi + cp "${NCBI_SETTINGS}" ./ +fi + +cat <<-END_VERSIONS > versions.yml +"!{task.process}": + sratools: $(vdb-config --version 2>&1 | grep -Eo '[0-9.]+') +END_VERSIONS diff --git a/nextflow.config b/nextflow.config index 938523e..f3463cf 100755 --- a/nextflow.config +++ b/nextflow.config @@ -200,7 +200,7 @@ manifest { includeConfig 'conf/modules.config' // Load CDC config for operating on internal compute infrastructure -includeConfig 'conf/cdc.config' +//includeConfig 'conf/cdc.config' // Function to ensure that resource requirements don't go beyond diff --git a/subworkflows/nf-core/sra_tools/main.nf b/subworkflows/nf-core/sra_tools/main.nf index 4f9458c..1dda55d 100755 --- a/subworkflows/nf-core/sra_tools/main.nf +++ b/subworkflows/nf-core/sra_tools/main.nf @@ -1,5 +1,5 @@ -include { SRATOOLS_PREFETCH } from '../../../modules/nf-core/modules/sratools/prefetch/main' -include { SRATOOLS_FASTERQDUMP } from '../../../modules/nf-core/modules/sratools/fasterqdump/main' +include { SRATOOLS_PREFETCH } from '../../../modules/nf-core/sratools/prefetch/main' +include { SRATOOLS_FASTERQDUMP } from '../../../modules/nf-core/sratools/fasterqdump/main' include { SRA_TO_SAMPLESHEET } from '../../../modules/local/sra_to_samplesheet' // // Download FASTQ sequencing reads from the NCBI's Sequence Read Archive (SRA). diff --git a/workflows/polkapox.nf b/workflows/polkapox.nf index f03616b..4521e66 100755 --- a/workflows/polkapox.nf +++ b/workflows/polkapox.nf @@ -63,8 +63,7 @@ include { REFBASED } from '../subworkflows/local/ref_based' include { FASTQC } from '../modules/nf-core/fastqc/main' include { MULTIQC } from '../modules/nf-core/multiqc/main' include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main' -include { FASTQC } from '../modules/nf-core/modules/fastqc/main' -include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' +include { SUMMARIZE_QC } from '../modules/local/summarize_qc' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 8c54a21db15af46f56080a4c5aeb39a07a1ca2c8 Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Tue, 4 Feb 2025 20:25:49 +0000 Subject: [PATCH 40/42] updated path to test data --- assets/samplesheet.test.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/samplesheet.test.csv b/assets/samplesheet.test.csv index b3eae99..e113ea5 100755 --- a/assets/samplesheet.test.csv +++ b/assets/samplesheet.test.csv @@ -1,2 +1,2 @@ sample,fastq_1,fastq_2 -test,s3://io-pe1-prod-ncezid-oamd-nextstrain/polkapox/test_data/LIY16011A34_2022_5630_NY_3003749700_1.fq.gz,s3://io-pe1-prod-ncezid-oamd-nextstrain/polkapox/test_data/LIY16011A34_2022_5630_NY_3003749700_2.fq.gz \ No newline at end of file +test_sub,s3://io-pe1-prod-ncezid-oamd-nextstrain/polkapox/test_data/test_sub_1.fq.gz,s3://io-pe1-prod-ncezid-oamd-nextstrain/polkapox/test_data/test_sub_2.fq.gz From ae7f8e5c3cf1a763bb8c9ae4ce78a1e68b7207ed Mon Sep 17 00:00:00 2001 From: Kyle O'Connell Date: Tue, 4 Feb 2025 20:48:03 +0000 Subject: [PATCH 41/42] updated bandage command to remove --name --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 048f03f..f44d486 100755 --- a/conf/modules.config +++ b/conf/modules.config @@ -149,7 +149,7 @@ process { mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] - ext.args = '--names' + ext.args = '' } withName: PUBLISH_CONTIGS { From e2a79d2199518abcbc0a5918858b613a8be65521 Mon Sep 17 00:00:00 2001 From: Jessica Rowell Date: Wed, 5 Feb 2025 11:49:03 -0500 Subject: [PATCH 42/42] updated lines 121 and 125 based on MW's comments --- docs/usage.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 3be833a..5dc1cb8 100755 --- a/docs/usage.md +++ b/docs/usage.md @@ -118,11 +118,11 @@ CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz ### Single-end vs. Paired-end reads -The pipeline assumes paired-end reads by default. You should specify `--paired False` for single-end reads when you run the pipeline. +The pipeline assumes paired-end reads by default. You should specify `--paired False` for single-end reads when you run the pipeline with a directory path as input (`--indir`). If you're providing a samplesheet, the pipeline will automatically detect paired-end vs. single-end reads based on the samplesheet, as described above. ## Entrypoint/Subworkflow options -This workflow contains several entrypoints that allow you as the user to specify which components of the workflow you would like to run. You must select one entrypoint using the `--workflow` parameter. Options include `full`, `filter_reads`, `ref_based`, and `denovo`. Read filtering is always run, but can optionally be run alone. +This workflow contains several subworkflows that allow you as the user to specify which components of the workflow you would like to run. You must select one subworkflow using the `--workflow` parameter. Options include `full`, `filter_reads`, `ref_based`, and `denovo`. Read filtering is always run, but can optionally be run alone. ## Kraken2 DB options The default kraken2 database was assembled from 15 Orthopox viruses including Monkeypox virus Clade II (MA001_USA_002), Monkeypox virus Clade I (NC_003310), Variola major (NC_001611), Variola minor (DQ441419), Borealpox (MN240300), Camelpox (NC_003391), Cowpox (NC_003663), Ectromelia (NC_004105), Vaccinia (NC_006998), Taterapox (NC_008291), Racoonpox (NC027213), Volepox (NC_031033), Skunkpox (NC_031038), Akhmeta (NC_055230), Horsepox (NC_066642), and the human genome build GRCh38 (GCF_000001405.40). We also include the path to smaller database with only Monkeypox virus Clade II (MA001_USA_002), and human genome build GRCh38 (GCF_000001405.40) which works quite well on Monkeypox virus Clade II samples.