changeset 0:1769c133986b draft default tip

planemo upload for repository https://github.com/brsynth/galaxytools/tree/main/tools commit 3401816c949b538bd9c67e61cbe92badff6a4007-dirty
author tduigou
date Wed, 11 Jun 2025 09:42:52 +0000
parents
children
files get_db_info.py seq_form_db.xml test-data/2-step-golden_gate_plan.csv test-data/test_missing_input.csv testMock.py
diffstat 5 files changed, 1854 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/get_db_info.py	Wed Jun 11 09:42:52 2025 +0000
@@ -0,0 +1,267 @@
+import subprocess
+import argparse
+import time
+import os
+import socket
+import re
+from Bio.Seq import Seq
+import pandas as pd
+from Bio.SeqRecord import SeqRecord
+from sqlalchemy import create_engine, inspect
+from sqlalchemy.engine.url import make_url
+from sqlalchemy.sql import text
+from sqlalchemy.exc import OperationalError
+
+
+def fix_db_uri(uri):
+    """Replace __at__ with @ in the URI if needed."""
+    return uri.replace("__at__", "@")
+
+
+def is_port_in_use(uri):
+    """Check if a TCP port is already in use on host."""
+    url = make_url(uri)
+    host = url.host
+    port = url.port
+    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
+        s.settimeout(2)
+        return s.connect_ex((host, port)) == 0
+
+
+def extract_db_name(uri):
+    """Extract the database name from the SQLAlchemy URI."""
+    url = make_url(uri)
+    return url.database
+
+
+# this fuction is to activate the Docker id the DB is in container. BUT IT IS NOT USED IN MAIN()
+def start_postgres_container(db_name):
+    """Start a PostgreSQL container with the given database name as the container name."""
+    container_name = db_name
+
+    # Check if container is already running
+    container_running = subprocess.run(
+        f"docker ps -q -f name={container_name}", shell=True, capture_output=True, text=True
+    )
+
+    if container_running.stdout.strip():
+        print(f"Container '{container_name}' is already running.")
+        return
+
+    # Check if container exists (stopped)
+    container_exists = subprocess.run(
+        f"docker ps -a -q -f name={container_name}", shell=True, capture_output=True, text=True
+    )
+
+    if container_exists.stdout.strip():
+        print(f"Starting existing container '{container_name}'...")
+        subprocess.run(f"docker start {container_name}", shell=True)
+        print(f"PostgreSQL Docker container '{container_name}' activated.")
+        return
+
+    # If container does not exist, create and start a new one
+    port = 5432 if not is_port_in_use(5432) else 5433
+    postgres_password = os.getenv("POSTGRES_PASSWORD", "RK17")
+
+    start_command = [
+        "docker", "run", "--name", container_name,
+        "-e", f"POSTGRES_PASSWORD={postgres_password}",
+        "-p", f"{port}:5432",
+        "-d", "postgres"
+    ]
+
+    try:
+        subprocess.run(start_command, check=True)
+        print(f"PostgreSQL Docker container '{container_name}' started on port {port}.")
+    except subprocess.CalledProcessError as e:
+        print(f"Failed to start Docker container: {e}")
+
+
+def wait_for_db(uri, timeout=60):
+    """Try connecting to the DB until it works or timeout."""
+    engine = create_engine(uri)
+    start_time = time.time()
+    while time.time() - start_time < timeout:
+        try:
+            with engine.connect():
+                print("Connected to database.")
+                return
+        except OperationalError:
+            print("Database not ready, retrying...")
+            time.sleep(2)
+    raise Exception("Database connection failed after timeout.")
+
+
+def fetch_annotations(csv_file, sequence_column, annotation_columns, db_uri, table_name, fragment_column_name, output):
+    """Fetch annotations from the database and save the result as GenBank files."""
+    db_uri = fix_db_uri(db_uri)
+    df = pd.read_csv(csv_file, sep=',', header=None)
+
+    engine = create_engine(db_uri)
+    connection = engine.connect()
+
+    annotated_data = []
+
+    try:
+        with connection:
+            inspector = inspect(engine)
+            columns = [column['name'] for column in inspector.get_columns(table_name)]
+
+            # Fetch all fragments from the table once
+            if fragment_column_name not in columns:
+                raise ValueError(f"Fragment column '{fragment_column_name}' not found in table '{table_name}'.")
+
+            fragment_column_index = columns.index(fragment_column_name)
+            all_rows = connection.execute(text(f"SELECT * FROM {table_name}")).fetchall()
+            fragment_map = {row[fragment_column_index]: row for row in all_rows}
+
+            # Compare fragments between CSV and DB
+            csv_fragments = set()
+            all_ids = set(df[0].dropna().astype(str))
+            for _, row in df.iterrows():
+                for col in df.columns:
+                    if col != 0:
+                        fragment = row[col]
+                        if pd.notna(fragment):
+                            fragment_str = str(fragment)
+                            if fragment_str not in all_ids:
+                                csv_fragments.add(fragment_str)
+
+            db_fragments = set(fragment_map.keys())
+            missing_fragments = sorted(list(csv_fragments - db_fragments))
+            if missing_fragments:
+                raise ValueError(
+                    f" Missing fragments in DB: {', '.join(missing_fragments)}"
+                )
+
+            # === CONTINUE WITH GB FILE CREATION ===
+            for _, row in df.iterrows():
+                annotated_row = {"Backbone": row[0], "Fragments": []}
+                for col in df.columns:
+                    if col != 0:
+                        fragment = row[col]
+                        if fragment not in csv_fragments:
+                            continue
+                        db_row = fragment_map.get(fragment)
+
+                        if db_row:
+                            fragment_data = {"id": fragment}
+                            for i, column_name in enumerate(columns[1:]):  # skip ID column
+                                fragment_data[column_name] = db_row[i + 1]
+                        else:
+                            fragment_data = {"id": fragment, "metadata": "No data found"}
+
+                        annotated_row["Fragments"].append(fragment_data)
+
+                annotated_data.append(annotated_row)
+
+    except Exception as e:
+        print(f"Error occurred during annotation: {e}")
+        raise  # Ensures the error exits the script
+
+    # GenBank file generation per fragment
+    try:
+        for annotated_row in annotated_data:
+            backbone_id = annotated_row["Backbone"]
+            for fragment in annotated_row["Fragments"]:
+                fragment_id = fragment["id"]
+                sequence = fragment.get(sequence_column, "")
+                annotation = fragment.get(annotation_columns, "")
+
+                # Create the SeqRecord
+                record = SeqRecord(
+                    Seq(sequence),
+                    id=fragment_id,
+                    name=fragment_id,
+                    description=f"Fragment {fragment_id} from Backbone {backbone_id}"
+                )
+
+                # Add annotations to GenBank header
+                record.annotations = {
+                    k: str(fragment[k]) for k in annotation_columns if k in fragment
+                }
+
+                # LOCUS line extraction from annotation (copy-paste the LOCUS from annotation)
+                locus_line_match = re.search(r"LOCUS\s+.+", annotation)
+                if locus_line_match:
+                    locus_line = locus_line_match.group()
+                else:
+                    print(f"LOCUS info missing for fragment {fragment_id}")
+                    locus_line = f"LOCUS       {fragment_id: <20} {len(sequence)} bp    DNA     linear   UNK 01-JAN-2025"
+
+                # Format sequence as per GenBank standards (with ORIGIN and line breaks)
+                if "ORIGIN" in sequence:
+                    origin_block = sequence.strip()
+                else:
+                    # Format sequence as per GenBank standards (with ORIGIN and line breaks)
+                    formatted_sequence = "ORIGIN\n"
+                    seq_str = str(record.seq)
+                    for i in range(0, len(seq_str), 60):  # 60 bases per line
+                        line_seq = seq_str[i:i + 60]
+                        formatted_sequence += f"{str(i + 1).rjust(9)} { ' '.join([line_seq[j:j+10] for j in range(0, len(line_seq), 10)]) }\n"
+                    origin_block = formatted_sequence.strip()
+
+                # Find and copy the FEATURES section directly from annotation
+                features_section = ""
+                features_start = annotation.find("FEATURES")
+                if features_start != -1:
+                    features_section = annotation[features_start:]
+
+                # Writing the GenBank file
+                if not os.path.exists(output):
+                    os.makedirs(output)
+
+                gb_filename = os.path.join(output, f"{fragment_id}.gb")
+                with open(gb_filename, "w") as f:
+                    # Write the LOCUS line
+                    f.write(locus_line + "\n")
+                    # Write DEFINITION, ACCESSION, and other annotations
+                    f.write(f"DEFINITION  {record.description}\n")
+                    f.write(f"ACCESSION   {record.id}\n")
+                    f.write(f"VERSION     DB\n")
+                    f.write(f"KEYWORDS    .\n")
+                    f.write(f"SOURCE      .\n")
+                    # Write the FEATURES section directly from annotation
+                    f.write(features_section)
+                    # Write the ORIGIN section
+                    f.write(origin_block + "\n")
+                    f.write("//\n")
+
+    except Exception as e:
+        print(f"Error saving GenBank files: {e}")
+        return
+
+
+def main():
+    parser = argparse.ArgumentParser(description="Fetch annotations from PostgreSQL database and save as JSON.")
+    parser.add_argument("--input", required=True, help="Input CSV file")
+    parser.add_argument("--sequence_column", required=True, help="DB column contains sequence for ganbank file")
+    parser.add_argument("--annotation_columns", required=True, help="DB column contains head for ganbank file")
+    parser.add_argument("--db_uri", required=True, help="Database URI connection string")
+    parser.add_argument("--table", required=True, help="Table name in the database")
+    parser.add_argument("--fragment_column", required=True, help="Fragment column name in the database")
+    parser.add_argument("--output", required=True, help="Output dir for gb files")
+    args = parser.parse_args()
+
+    # Wait until the database is ready
+    db_uri = fix_db_uri(args.db_uri)
+    # db_name = extract_db_name(db_uri)
+    # start_postgres_container(db_name)
+    MAX_RETRIES = 3
+    for attempt in range(1, MAX_RETRIES + 1):
+        try:
+            wait_for_db(db_uri)
+            break  # Success
+        except Exception as e:
+            if attempt == MAX_RETRIES:
+                print(f"Attempt {attempt} failed: Could not connect to database at {db_uri}.")
+                raise e
+            else:
+                time.sleep(2)
+
+    # Fetch annotations from the database and save as gb
+    fetch_annotations(args.input, args.sequence_column, args.annotation_columns, db_uri, args.table, args.fragment_column, args.output)
+
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/seq_form_db.xml	Wed Jun 11 09:42:52 2025 +0000
@@ -0,0 +1,135 @@
+<tool id="seq_form_db" name="Get sequences Data From DB" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="21.09">
+    <description>Import fragment's data from an accessible DB and export it as .gb files</description>
+    <macros>
+        <token name="@VERSION_SUFFIX@">0</token>
+        <token name="@TOOL_VERSION@">0.1.0</token>
+    </macros>
+    <requirements>
+        <requirement type="package" version="2.2.3">pandas</requirement>
+        <requirement type="package" version="2.0.40">sqlalchemy</requirement>
+        <requirement type="package" version="2.9.9">psycopg2</requirement>
+        <requirement type="package" version="1.85">biopython</requirement>
+    </requirements>
+    <command detect_errors="exit_code"><![CDATA[
+        mkdir 'outdir' &&
+        python '$__tool_directory__/get_db_info.py'
+            --input '$input' 
+            --sequence_column '$sequence_column'
+            --annotation_columns '$annotation_columns'
+            --db_uri '$db_uri' 
+            --table '$table' 
+            --fragment_column '$fragment_column'
+            --output 'outdir'
+    ]]></command>
+    <inputs> 
+        <param name="input" type="data" format="csv" label="Input CSV File" />
+        <param name="table" type="text" label="DB Table Name" optional="false" />
+        <param name="sequence_column" type="text" label="DB Column Contains Sequence For ganbank File" optional="false" />
+        <param name="annotation_columns" type="text" label="DB Column Contains Annotation For Ganbank File" optional="false" />
+        <param name="fragment_column" type="text" label="DB IDs Column Name" optional="false" />
+        <param name="db_uri" type="text" label="DB Connection URI" help="postgresql://container_name:password@host:port/path/to/database" optional="false" />
+    </inputs>    
+    <outputs>
+        <collection name="output_gb" type="list" label="GenBank Files collection" >
+            <discover_datasets pattern="(?P&lt;name&gt;.*).gb" format="genbank" directory="outdir" />
+        </collection>
+    </outputs>
+    <tests>
+    <!--python get_db_info.py -input 'test-data/test_input.csv' -sequence_column 'sequence' -annotation_column 'annotation' -db_uri 'postgresql://postgres:RK17@localhost:5432/test_fragments_db' -table 'sample' -fragment_column 'fragment' -output 'test-data/output'-->
+        <test> 
+            <param name="input" value="2-step-golden_gate_plan.csv" />
+            <param name="table" value="sample" />
+            <param name="sequence_column" value="sequence" />
+            <param name="annotation_columns" value="annotation" />
+            <param name="fragment_column" value="fragment" />
+            <param name="db_uri" value="postgresql://postgres:RK17@localhost:5432/test_fragments_db" />
+            <output_collection name="output_gb" type="list" count="12">
+                <element name="part_A">
+                    <assert_contents>
+                     <has_n_lines min="10" />
+                    </assert_contents>
+                </element>
+                <element name="part_B">
+                    <assert_contents>
+                     <has_n_lines min="10" />
+                    </assert_contents>
+                </element>
+                <element name="part_C">
+                    <assert_contents>
+                     <has_n_lines min="10" />
+                    </assert_contents>
+                </element>
+                <element name="part_D">
+                    <assert_contents>
+                     <has_n_lines min="10" />
+                    </assert_contents>
+                </element>
+                <element name="part_E">
+                    <assert_contents>
+                     <has_n_lines min="10" />
+                    </assert_contents>
+                </element>
+                <element name="part_F">
+                    <assert_contents>
+                     <has_n_lines min="10" />
+                    </assert_contents>
+                </element>
+                <element name="part_G">
+                    <assert_contents>
+                     <has_n_lines min="10" />
+                    </assert_contents>
+                </element>
+                <element name="part_H">
+                    <assert_contents>
+                     <has_n_lines min="10" />
+                    </assert_contents>
+                </element>
+                <element name="part_I">
+                    <assert_contents>
+                     <has_n_lines min="10" />
+                    </assert_contents>
+                </element>
+                <element name="part_J">
+                    <assert_contents>
+                     <has_n_lines min="10" />
+                    </assert_contents>
+                </element>
+                <element name="part_K">
+                    <assert_contents>
+                     <has_n_lines min="10" />
+                    </assert_contents>
+                </element>
+                <element name="part_L">
+                    <assert_contents>
+                     <has_n_lines min="10" />
+                    </assert_contents>
+                </element>
+            </output_collection>
+        </test>
+    </tests>
+    
+    <help><![CDATA[
+Get sequences Data From DB
+==========================
+
+Implemented a system to generate GenBank (.gb) files for ADN fragments in CSV input, based on data retrieved from an accessible database via URI requests.
+
+**Parameters**:
+---------------
+* **Input CSV File**: Assembly csv contains construct IDs in the first column and their corresponding fragments in the following columns. (Without Header)
+* **DB Table Name**: Name of the target table in the database.
+* **DB Column Contains Sequence For ganbank File**: Column storing sequence data, expected to start with "ORIGIN". 
+* **DB Column Contains Annotation For Ganbank File**: Column containing annotation data, starting with "FEATURES" and including "LOCUS" information. Other metadata is optional.
+* **DB IDs Column Name**: Column holding the unique fragment IDs.
+* **DB Connection URI**: URI used to connect to the database (e.g., postgresql://postgres:pass@localhost:5432/test_fragments_db).
+    ]]></help>
+    <citations>
+        <citation type="bibtex">
+            @unpublished{seq_form_db
+                author = {Ramiz Khaled},
+                title = {{seq_form_db}},
+                url = {https://github.com/brsynth/},
+            }
+        </citation>
+    </citations>
+</tool>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/2-step-golden_gate_plan.csv	Wed Jun 11 09:42:52 2025 +0000
@@ -0,0 +1,4 @@
+construct_3,construct_1,part_L,part_J,part_K,,
+construct_4,construct_2,part_L,part_J,part_K,,
+construct_1,part_A,part_B,part_C,part_D,part_E,part_F
+construct_2,part_A,part_G,part_H,part_I,part_F,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/test_missing_input.csv	Wed Jun 11 09:42:52 2025 +0000
@@ -0,0 +1,4 @@
+Sample-1,ACP10001AaCbbBS,NEW20001BbDccKT,XYZ10003AaCbbBS
+Sample-2,CFP10002AaCbbBS,ACP10001AaCbbBS,ALT30005CcEddLM
+Sample-3,XYZ10003AaCbbBS,ALT30005CcEddLM,ACP10001AaCbbBS
+Sample-4,QWE10004AaCbbBS,NEW20001BbDccKT,CFP10002AaCbbBS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testMock.py	Wed Jun 11 09:42:52 2025 +0000
@@ -0,0 +1,1444 @@
+import psycopg2
+import subprocess
+import time
+
+
+def docker_container_exists(name):
+    """Vérifie si le conteneur Docker existe (arrêté ou démarré)."""
+    result = subprocess.run(
+        f"docker ps -a -q -f name={name}",
+        shell=True, capture_output=True, text=True
+    )
+    return bool(result.stdout.strip())
+
+
+def docker_container_is_running(name):
+    """Vérifie si le conteneur Docker est en cours d'exécution."""
+    result = subprocess.run(
+        f"docker ps -q -f name={name}",
+        shell=True, capture_output=True, text=True
+    )
+    return bool(result.stdout.strip())
+
+
+def docker_start_container(name):
+    """Démarre un conteneur Docker existant."""
+    subprocess.run(f"docker start {name}", shell=True, check=True)
+
+
+def docker_run_container(name, password="RK17", port=5432):
+    """Crée et démarre un nouveau conteneur PostgreSQL."""
+    subprocess.run(
+        f"docker run --name {name} -e POSTGRES_PASSWORD={password} -p {port}:5432 -d postgres",
+        shell=True, check=True
+    )
+
+
+def docker_stop_container(name):
+    """Arrête un conteneur Docker."""
+    subprocess.run(f"docker stop {name}", shell=True, check=True)
+
+
+def wait_postgres_ready(host="localhost", port=5432, timeout=30):
+    """Attend que Postgres accepte les connexions."""
+    import socket
+    start = time.time()
+    while time.time() - start < timeout:
+        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
+            try:
+                sock.connect((host, port))
+                return True
+            except ConnectionRefusedError:
+                time.sleep(1)
+    raise RuntimeError("PostgreSQL is not ready after timeout")
+
+
+def create_db_and_insert_data():
+    container_name = "test_fragments_db"
+
+    # 1. Vérifier si conteneur existe
+    if docker_container_exists(container_name):
+        print(f"Conteneur Docker '{container_name}' existe.")
+        # 2. Démarrer s'il n'est pas déjà lancé
+        if not docker_container_is_running(container_name):
+            print(f"Démarrage du conteneur '{container_name}'...")
+            docker_start_container(container_name)
+        else:
+            print(f"Conteneur '{container_name}' déjà en cours d'exécution.")
+    else:
+        print(f"Création et démarrage du conteneur '{container_name}'...")
+        docker_run_container(container_name)
+
+    # 3. Attendre que PostgreSQL soit prêt
+    wait_postgres_ready()
+
+    # 4. Connexion et création DB + table + insertion
+    conn = psycopg2.connect(
+        dbname='postgres', user='postgres', password='RK17',
+        host='localhost', port='5432'
+    )
+    conn.autocommit = True
+    cursor = conn.cursor()
+
+    cursor.execute("SELECT 1 FROM pg_catalog.pg_database WHERE datname = 'test_fragments_db';")
+    exists = cursor.fetchone()
+
+    if exists:
+        print("Base de données 'test_fragments_db' déjà existante, suppression...")
+        cursor.execute("DROP DATABASE test_fragments_db;")
+
+    cursor.execute("CREATE DATABASE test_fragments_db;")
+    print("Base de données 'test_fragments_db' créée.")
+
+    cursor.close()
+    conn.close()
+    # Connect to the PostgreSQL container (default 'postgres' database for setup)
+    conn = psycopg2.connect(
+        dbname='postgres',  # Default database
+        user='postgres',  # Default user
+        password='RK17',  # Password from Docker environment
+        host='localhost',  # Running locally on the default Docker network
+        port='5432'  # Default PostgreSQL port
+    )
+
+    conn.autocommit = True  # Necessary to create a database
+    cursor = conn.cursor()
+
+    # Check if the test database already exists
+    cursor.execute("SELECT 1 FROM pg_catalog.pg_database WHERE datname = 'test_fragments_db';")
+    exists = cursor.fetchone()
+    
+    if exists:
+        print("Database 'test_fragments_db' already exists, dropping it...")
+        cursor.execute("DROP DATABASE test_fragments_db;")
+
+    # Create the new database for testing
+    cursor.execute('CREATE DATABASE test_fragments_db;')
+    print("Database 'test_fragments_db' created.")
+
+    cursor.close()
+    conn.close()
+
+    # Now connect to the new test database
+    conn = psycopg2.connect(
+        dbname='test_fragments_db',
+        user='postgres',
+        password='RK17',
+        host='localhost',
+        port='5432'
+    )
+
+    cursor = conn.cursor()
+
+    # Create the 'sample' table instead of 'fragments'
+    cursor.execute('''
+        CREATE TABLE sample (
+            fragment TEXT PRIMARY KEY,
+            sequence TEXT,
+            annotation TEXT,
+            metadata_1 TEXT,
+            metadata_2 TEXT
+        );
+    ''')
+
+    # Insert mock data
+    cursor.executemany('''
+    INSERT INTO sample (fragment, sequence, annotation, metadata_1, metadata_2)
+    VALUES (%s, %s, %s, %s, %s);
+''', [
+    (
+        'part_A',
+        '''ORIGIN
+        1 tcacaggatg gtccaacgaa actaggcttt agacgaggga tgaatgaccg acccccactc
+       61 gtggcactaa cggacagact tccctgacgg ttattcgacc attaaagtca gacatgcggg
+      121 ggtgaataaa ttagccaaat tgtgtcgaag aaaagacgtg cggctggcac ataaggcagt
+      181 cttgatccta gtcttgcagg gatgcacgta agtcgcctca attaactgca gccgagctcc
+      241 aggttaccaa agaccctagt atgccagggc ctaacggttg gagtatatta tgggtacgca
+      301 atagtgcgga agttaacctg ggcaacatcc aggtgagagg ttggacggaa gcgacagtaa
+      361 gtggccatag actgccgagt cgtgttaatg aatcgctata cgcccatgga gttgtggggt
+      421 cgttttatcc gagtaggggc ccgctgacta cttcgtccag acaatatgcc gtcttcaata
+      481 gtctacctga gagtcatgcc ggcatttccg acgctgagtg aaacccgcgt agccaggcga
+      541 aatttgcatc ttgaaatacc actgcagatc agccagtaag gcccatataa gggcgctggt
+      601 gttctggcga cagataaagt gttatctaat gtaacccgcg gacttttaga ggatacttga
+      661 atgcgggcat atcgtcccac cagcgtcacg tggtcgggct agcggcagac aaactctgcc
+      721 gatgtttttc tttgccgcga tagcgggcta gtcaattcac tatccggcga tgaagcatag
+      781 attgttatcg cgcttatgcg gaggataatc aagtcttggc agaacctgct cgctcatgca
+      841 ctggtgaggc gtggttatcc taacaaccgc ctaggacgaa gaatgggctc ggtagggaca
+      901 gttcgtgcgt ttagcttcgt cccatcttaa tgctgtctgg agggaggcta catgcgaaca
+      961 gaagccgtgg gcgaaagttg ttgatccggg tctaacacgg ataagggcca tggtgaacgc
+     1021 atcatgcgat acttcttggt agttcttcta acatgaccgt gccatagccc ttaccctttg
+     1081 aagaagttaa cctatctgcc gtctcctgca cgaatagcga ctggactcgg gtattttgga
+     1141 tacctcacga aagcacttcg atcggccgaa gcatggatat ttcgccggac gggcccgaat
+     1201 agagagcctt gtatgtcggt tagtacaacg cagtcctgga gacatctacg cggatgggcc
+     1261 taggggctgg acttaacatt gggtaacgta cctggtccaa agtgaatgca aagcactttt
+     1321 acaaagcgcg ggtccccgtg ggtgtttagg gtagaagatt ggcggatgct acgaacgatc
+     1381 ccgctttgaa actatcatta catcgtgtaa aagagacact taacaaaggc caataaactg
+     1441 ccagtaagaa tcgctcagtg cggtgctggg gacgctaagt aggggcaaca gccagtgaag
+     1501 gacgtgaccg acctttctca gataagatat gctggcgtct atctaataag catagtgaaa
+     1561 aaccaaccat ttcacttaca cgaagtacat ttgcattgct agtaaagacg cctaaacaga
+     1621 agtgcccttg catgctgtat gtctatagtc cttagggaag catcagccct tctacttatt
+     1681 cgaggtctga gaaaccctgg acaagctccg aattattcaa tgtgcctgtc tccgaggtta
+     1741 gatagcgcta tgctcttaag agttgcacag aatgaccatc ctggaatgtc cctggagggg
+     1801 tctaggtatg ctgatcgaag ggtgctctaa ggacttgacg tgcgtccgag gagggtgctg
+     1861 cctccttcgc ctttagatcc aacgcggatc acatgcgcgt gagctaatag gatcaccttc
+     1921 tgctccgatt tttaccctcc tgggtcactt ccgaatgagg tagcgggcga aatataatgt
+     1981 ctccactcgt aggtgttccc tgtatgtgaa gctctatagt ggacaaaggt ttgatgaact
+     2041 agcccccgta tacgctctca ccgacggacg cgggggtctg ttatttgaag catcatacat
+     2101 gcgaaggtgc cttctcagca acgaaaggta gtgggagtgt acaagttcaa tgcgccgcca
+     2161 taggtctgag tatacaaggg gatgccccca tccacaacgg gattggctac ccggagagct
+     2221 ggctccgctc caacaaataa ttatattaac ctattggaat tccacctgca tatcagagga
+     2281 gagagacctt tacggctatt ctgtttaccg gatccatcgg taccaaggat cagaaagtga
+     2341 cacggtttga acgggttgtt gtaatacttt gagtatacct ctgacgctga gcgtgtcgtc
+     2401 ctgagcgcag actcaataac atagcagtcc gacatcgccg tgatatgtaa atgcaacgaa
+     2461 tttaggtctt gactcggtct accatgtcaa aagggtagcc agatttcagc gcgaaattga
+     2521 actttgtgtt tagtgtgggg tcctcggtta caaaatagga tcagacatgt gtgattttgg
+     2581 taacctagtc tggcagtccg acagacttcg ctatgatttg atggggccgg cctataattg
+     2641 gcttgcgcaa cccgctcatc tcgggcgtgt tttacttcct gcggtcccca cgccctattt
+     2701 tcgggccagc tgtaggtgct agagtgaatg ctggcgaata agattccccg ctatttggcg
+     2761 cctcgccaca gctctggcac tatgggggga gtttctctgt tccttaaaca gcacccgttt
+     2821 ttgaggtgta ttggtttcgg ttctgcatta ggcaattcgt accgtacaat caattacgac
+     2881 acattggcgg cagttatcag ctacccatcg caaagcacac acccacatgt atctattttt
+     2941 cgcaaattcc aaaagcttcg attgagattg catcggtagt ccctcagaca tgtcgtaatc
+     3001 gaatgcctct tgttccatga gagagagaag tatggcgcga accgctctgc ctttaatttg
+     3061 gttctaccat ccacgagttt aaggggcata accctgccca gcactttccg aggctcacgt
+     3121 tcatgctacg gtagcacctt tctgcgggtc tcacgctgtc aatatgcagg tgctgcagga
+     3181 atttgtctcc aatcgacttg agatatcgca agcatgaaat tatattagac acgccagaga
+     3241 acttgggaag cagcactggt agtgatagca acccgagtac agtaacgagt gagcttctga
+     3301 tcatgagctc tcctacggcg tcaatgcgac gaatgcccag catgcactct cgctatccat
+     3361 gcctgctagg gtggcattat gctcaggaac agttgtagct tggatatcgt ctagatgaaa
+     3421 tacctggaca ctggttagcg tcgtcaagca ccaaggacat tcacacgctc gcggtctttc
+     3481 gtctccctaa gcgttcggca gtcgggcgtg aagaggttgt aatcagacgg aacaaagcct
+     3541 gaaaaaattc cagcgacgta gtattcatga tcctgtacca tctgtagccg ccgcggcgca
+     3601 cgattgaatg taggctacta accccatccg tgttagcgat gtgagtttct accgcaacga
+     3661 atgctcaagc gaaccttctt ctttcgtccg caacccacaa gccgtggtta tgacagctaa
+     3721 attgtcccag acatcccttt attacacaag agctccagcg gaatacctag tcacagcggt
+     3781 aatgacacaa agctcttagt tagtccaggg actacttctg tctacagcac atcacactca
+     3841 ttatcagcat cagtgtagag acggagaaca tgggctatcc tataccaaga tccgccatct
+     3901 aaacatttga agtttcccgt cttctataac ttagcactcg acgctattct gctgagtgcg
+     3961 cttagtctgt agcgacttgc gaaatccata aactgagaat tgaaagagag tgcataaccg
+     4021 aaacctttgt ggcatatttc cgttgaaacg taccagaaca gccgtttagt gcggaacata
+     4081 cagtatcctg ataaagcact caacccaaca gacaccctat gccgatagcg ggatgctaac
+     4141 aagtatagtc atgatgattt ctcggacagc ggggtttggt acagctgcaa tccgtgattt
+     4201 aaattcggac ctctgcacac accgacggtt acccatatcc tctacggctg taggaagttt
+     4261 taccttggat gtcattctga tttcggcgta tc
+''',
+        '''LOCUS       part_A                  4292 bp    ds-DNA  circular UNK 28-OCT-2019
+DEFINITION  .
+ACCESSION   part_A
+VERSION     part_A
+KEYWORDS    "creator:SynthSys Center".
+SOURCE      .
+  ORGANISM  .
+            .
+FEATURES             Location/Qualifiers
+     RBS             2332..2343
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     misc_feature    2208..2238
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     promoter        2289..2323
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#85dae9"
+     misc_feature    3162..3178
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     -35_signal      228..233
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     gene            1009..2028
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     -35_signal      51..56
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     CDS             2350..3027
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#ff00ff"
+     CDS             complement(3376..4191)
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#993366"
+     misc_RNA        87..639
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    2257
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#84b0dc"
+     terminator      3119..3146
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     misc_feature    2053..2100
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     misc_feature    2278..2281
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#ff0000"
+     misc_RNA        complement(90..197)
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    726..734
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    2274..2277
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#faac61"
+     rep_origin      51..639
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     misc_feature    2161..2185
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     -10_signal      206..211
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    complement(3292..3332)
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     rep_origin      760..1008
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     terminator      3032..3103
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     misc_feature    3158..3161
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#faac61"
+     misc_feature    3173..3178
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#84b0dc"
+     gene            complement(3376..4191)
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    2258..2262
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#84b0dc"
+     misc_feature    3342..3365
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    3204..3227
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    2256..2273
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     -10_signal      72..77
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    2029..2052
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     CDS             1009..2028
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#993366"
+     misc_feature    3237..3265
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    3154..3157
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#ff0000"
+     misc_feature    3180..3290
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    2212..2236
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#f8d3a9"
+     misc_feature    1..24
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+''',
+        'Metadata1 for part_A', 'Metadata2 for part_A'
+    ),
+    (
+        'part_B',
+        '''ORIGIN
+        1 cgggtctagc cacgcggctg aaaatgcgcc tcaccaagtt cagagagttg taatttaaag
+       61 gaccaaagaa cgtccattat gaagacacca atgagaaaag ttcattgcga tcgcagctta
+      121 gactgacgtg aagttccaac atttggcata cgtacttgtt aagttcctcc ggctatatgc
+      181 gctaggcgca ggtatattag ccggacatct gcaaggttga cgctgaagcc ttatcggtaa
+      241 tgcaagcaca acggtattgc agacacacaa taggaagtta tgttaacagg agagggtgat
+      301 gccgatgatt acgccccgcg tcgacagtac aataaaacag ctagatcatg tcgaaagtgt
+      361 aggcaaaaca ggtaggtgca ggacaggagg gttccctcaa gtcggcttgc tttatgtggc
+      421 gaatctgata cccataccgg ctatacatcg gccagggaat atcacagatt ttaaatgagc
+      481 ggagatagac ctatgggacc gcatcgatgc aagacatcgc ctacagatac ataatctgga
+      541 agacgcagat atcagtacgc tccttcctgg gaggcgtggt ccttggcacc agtcggccac
+      601 cccttagcgt ttcacctaag caacgaatcc aggactcctc ttttagcgtt tgggtgtcag
+      661 gcgcatcagg agtggttaaa tgaacgctgt acttcgcaag ataattgtga agatctctgc
+      721 tattccttaa cattaccacc aactttgcct acatatggcg taatcaaaaa tgcagcgggg
+      781 tgctcgatcg tgaaccctca atcacgatgt gctatggcgt agccacacaa catagttccg
+      841 gtctggaatt cggtctctgg agagcatacg gtgctctggg ctcacacgta cttcctcttg
+      901 tcacgcgcct ttgtagagca ttagggcgga ggtcactggg acggggatca gagagcttaa
+      961 aatcccaagt agcagtgcct aaggtgtaga atcttgtgca gatcttcgtc tggcccgaaa
+     1021 cctgggcctc cacaacaatg tcgggtcttt tataatttga aaacatcgcg ccttacccgc
+     1081 accgcgcagg acgattagac acagggggtc atgtccatgg ttcggggtaa gccaaattta
+     1141 catcgagtgt gggcttcatt gaggagaggg cgttacgata cccgttaaat gaaaacccgg
+     1201 acagtctcta actgataggc ctgataatcg ccaaatgaag tcgcaattag cagtacatga
+     1261 ctggcagata tgtcgccgga gacggtatgg gggacctatc ctaggttggc acgcgagcgc
+     1321 gaatgacgcc tatcttatcc ccctgcacgt gatggtatcg tcccaactat cttttacctc
+     1381 atcaacgttt tcctgcataa tctgcaagat ggagagtccg cgagtgcggg gagtacgaga
+     1441 tcacaaatct gccctgaaga caaagctcgc aggccgtact caggaaatag catcgactca
+     1501 cacatatcgg gaacggcaaa gagtgcatcg gccaatgcaa actattgaac gtccatgaaa
+     1561 ttgtgtcaaa ctactagtgt gtggacttgc gtcaaggcca tggcgcaata ctcaaagccc
+     1621 cggtatttat cccccgcaga gtatccgtgc ggatggagtt ccacagctct ttggacatgc
+     1681 aatgcgtggc gctacatgct ccgctgatac agaatatcta atgtctcgcc tcttgccgtc
+     1741 gaccctacaa ctactgcacg ggcagagtgg acgcgacccc tgagcggtgc agaaccttag
+     1801 tataaggcaa gggtggcacg gccgagccgc acttgctcct actaggccgt gctcgaagct
+     1861 attgatgcaa gcacagtatt cccgatttgt aaagcaaggt gcccgtagcc atacacccag
+     1921 ctactcaccg gccaatttcg accctctcta tctcagacct ccgcatattc ccaaactcct
+     1981 gctcaagtat gaaatgaccg gctcctccta aggcctgcgg acatggagtc atgcgtggaa
+     2041 tgccgtgtag gtagggtaca cacagcctta ccatgtaggg caataaatta tagactactg
+     2101 acattgattc cttgagggcc cgttcacttg tgggggaacc aggaaggcgc cgatagtcat
+     2161 cacttaaaca catgcgacgc atccatttca agaaagacac gctacgggtc tacaccgcct
+     2221 atagttctaa tttgggcccc ggtacgcaca tcgatgtact ctccattaca gcatagcaca
+     2281 tcagcggccc tagttagcgc ttctttttgt tccaacattc aatagcgggg actgcattat
+     2341 cctcacccta tttgttgcat aggtatttgg ccgtatactt gggaaagagc aaccacggga
+     2401 gtgcactaga aactgattca cccatgttat aacgcgttgc tcgcaagtcg tactgtggcc
+     2461 acgcacaggt caggcaatcg caaccatgtc ttagcagttt gtaagaagac ctttaaacat
+     2521 gtacctcaca gcaatctcgg aacttttaat tttcctgagt caatgacatg ctagctccgt
+     2581 ccacttgtaa tcaccgtcat aacacagtta gcctgcaaaa gggcgtgtac accttgccac
+     2641 tttaaagctg accgaataac ctacctacag gagatgctta gtgccacgga atgatctcgc
+     2701 aatgcttagt cttacaccca gtgaatcaac ccaagacctc gccgactgaa cggtattgag
+     2761 tccaatcccg agaggcaatt tatggccgtt agtgacagtc ggtcgctgat agaataaggc
+     2821 agactcgtct taagcgggct gctttaagag aaaatggagc cctgacgaag aagtggatga
+     2881 accaggtttt gacaacgtcc catattggta atgtaggctc gttatcaaga gataggttta
+     2941 gaaggctcaa tgctcgacgt aaaagaagtc ttaagctcta tgagccagtg atgagagcta
+     3001 attatagggc gcattcgttg gggtaaggtt gcgaattgtc atttaactaa aaccgacggc
+     3061 aatgtgagac cctgcagtcc gcctacacct ggctcactga ggcggcaacc gttatcgaag
+     3121 cagcatgtat tggtagtacc tgtcgccgat ttccttggga gtgcgctgtt gcgataacgc
+     3181 ttatttatgg tttgcgcggg atgtatctaa tgcggccgcc gcccgatcag cctgaacact
+     3241 gcggtcatga gccggtccat catgcagttc gcctgtaatt ataacctatt tgttaatggg
+     3301 gcttacagag gagcttccaa cgcatctacg agtaacggct gggatcacaa cttagccacc
+     3361 ttgtagcagg gacataccgc tttgcgacta ctgcgattct ctaacgagtc ttctgattgg
+     3421 tcctatgctc tttcaaaatc tcgataccgt agccaaccct gctgcccacc ttaaactatg
+     3481 acaggacaca ccattgtgcc aacctacacc ttaccagtag ttctgctctc caccactaat
+     3541 acgatgtcag aggccagaag gagcaccgtc aacaaacgcg ataatcaggg cggcgaagat
+     3601 ggaagtagct tgggttgtcg gtgggcaggt caggcgttag tgttatttga ataccaactg
+     3661 ttagaccaca gcgactcgaa cagtccgcaa gtcaagtgcg gtcggctttt acaggtggcg
+     3721 gattttcatt ccaccattcg ggtctaggtg tggtactaac cgcggtcata cgtggagttg
+     3781 aaccgcctga cgcactaagc tatgcgggca acaatatcgc caaagtcatt gtgttgggtt
+     3841 ttcacaacag tcacttcgct cacggccgaa ttaaatatct ctaactatta agccattttc
+     3901 caaccatcgg ctatcccagc ggttcaatcc gaatcgttac cagtgggtag ctgcagagga
+     3961 tcctaagggc gggtcccgct tactgtaact cgtcatgtct cgtggtctac caattcggtt
+     4021 agtattcgtg ccatgtatct cataagggtt gcagtttcgt cattgtcgta gttccttaat
+     4081 ggactggtac gacccggttg ttatacaacc atcaatcgtt aacggacatt agtgagccga
+     4141 ggagaagacc catcagcgga taacccgcca ttatcaccga tactgacata tgagtgccat
+     4201 actgggactg gcttcacgtg agggacctca aagtgagtcg tacaaggcag ctcctcaaa
+''',
+        '''LOCUS       part_B                  4259 bp    ds-DNA  circular UNK 29-OCT-2019
+DEFINITION  .
+ACCESSION   part_B
+VERSION     part_B
+KEYWORDS    "Source" "Sequence" "Freezer" "Shelf" "Box" "Concentration" "Use".
+SOURCE      .
+  ORGANISM  .
+            .
+FEATURES             Location/Qualifiers
+     primer_bind     531..550
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#faac61"
+     terminator      3078..3135
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     CDS             complement(join(4216..4259,1..616))
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#f58a5e"
+     exon            2863..3060
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#75c6a9"
+     gene            2863..3060
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#faac61"
+     terminator      4101..4195
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#9eafd2"
+     primer_bind     complement(3410..3429)
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#faac61"
+     primer_bind     778..796
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#75c6a9"
+     misc_feature    859..862
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     primer_bind     complement(3159..3176)
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#faac61"
+     misc_feature    863..3060
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#f58a5e"
+     rep_origin      complement(3330..3918)
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#84b0dc"
+     misc_feature    3061..3064
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     terminator      800..843
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#85dae9"
+''',
+        'Metadata1 for part_B', 'Metadata2 for part_B'
+    ),
+    (
+        'part_C',
+        '''ORIGIN
+        1 tggctaggtc tccaatggtt tcaccggagc tgagatcgca ttaaagtcac actacgaatt
+       61 atttgtcccc gcggctccag agacaaattt ctaggagtgg gttcatggag aaccgtgaca
+      121 agcatggtag cttcaaatag cgtcatcgga tcttaaagtg attgtgacat atatgggatt
+      181 gcgcgtctct cttacacaag ctagtgtgcg cgaggtgctg aacacctatt acgtcaactc
+      241 ccgggatccc ggcgggttac agagacataa gcagggtgtc catcattaac ttcgatgttg
+      301 agcccgtgcc ctgatcaaac acctctcgta gtagtgggtg ccggccgtgt attattttgg
+      361 gggagaggat gcgccctaag caatttcttt ccatcggcca gccattcgac gccggcacgc
+      421 aagttgttgc gggcactgtt gcagttcccg tactagagtc tcaagtctag aggtaccagc
+      481 atcaggaaga tgggtacttc gtgtggatct tctcctgaac ctgaaacctg aagagctaaa
+      541 gcgcgtcgcg ctgccatacg ataagtcgct ctcatttccg gaagacgtcg ttgggtgatg
+      601 gcgaacaatc gcgaaacgaa aatcgcggtc ggtatgttga ttcaagacgg gctacgggcg
+      661 ggttactaac aggtgcgcag aaatgtgatg ggtcacttga ccatgaactt tcgcgccgtc
+      721 gcttctgtgg actggccggc tccctgatag tgcactagcc cgttgatatg cccattacca
+      781 tttggcggcg cagtgtgcca gcgggattaa gatgcgtggc gtacaactat ccgcactttg
+      841 ctgacgcaca aaggcaactg atggacagcc ttcgggcatt cgactggttg gctgagttcg
+      901 cctgcctatt aatatgcttg tggaaattga tttacagcgc ctacttctac ttaggtgtac
+      961 ctatttacgg cacagggata aaggctgaca gaaaagtcct ggacaggtca taggtagttg
+     1021 tcagacctac aatggtataa cttgagagtc ctgtaccgca catgcggttg tagctagatg
+     1081 tccagaagac cgtagctagc gacgagtggg ttgcacgcgc attttgggaa ggggctgcgc
+     1141 gagggtgggg tcacgggtta ttccatttct aaatgctaaa ccagcagttg ctttagttct
+     1201 gacctagcag gcatgtcata tgtatggcta gattattagt acaatgcagg actaagaaag
+     1261 cctgagactt aaatgcgttg gtttttcagc cgacgggccg ggagggcaga tggccgaatg
+     1321 cgcactgagg agtgcattgc gagggaatag gcggaccacc aggtcccctc acatactgtg
+     1381 gataaaccta cccagggaca actcacgcca tcattttcaa gagtagcact actttccact
+     1441 aagtacggtt tgtcgagagc cggtggcacc gtgcgacgag cttgtgggca ctaggcgaac
+     1501 cgggttatat aggactgcct tgcggtgcgg gaatacttta ccccgtggag aggccataaa
+     1561 agcttacatt tattgtagcc gctagcggtt tcgacgcgct caagtggggc tttatcttag
+     1621 agtatcaaat aatgccctct cagcttcatc ttgatttttg tgtttggggt agtgtatccg
+     1681 atgggtcacc ttcttgacct tggggagctc catccatcgt accaatactc cgtttctttg
+     1741 tgttgcctac cgagtaatcg aataccgcac gagggctaga atctaattta aggtgggtct
+     1801 tatccctgtt gtttggacct aacgctgtaa caaatcactt ccgcgacggg tgtcattacg
+     1861 tcttctatcc gccaccggtt caacagtgcg tcgaatgcca agtccctatt acccgcattg
+     1921 taaagccatt acaatacctc cggtgatata attgattgcc ggttggcaag ggatcatctg
+     1981 tacgggccgc gattgattgc tgataaggaa cggcggtaag gaacgtatcg cgtacgaggt
+     2041 tgtacactgg aaccgctaaa caagcggtat cgctaaatta ccggcgatta tatcaaggga
+     2101 atcttaggta gcacgaagcc ctacgccctg gaaacaggat cggcgcgagg ccgtggacat
+     2161 attagcctac gtttttttac acccagattt ccgacgatgt ccacagctaa ggctatccta
+     2221 aaccgcaaac acatataacc gcagtataaa gcacgggatg attccttggc catcttgcaa
+     2281 gcagtgcaag gcaattctgg tgataggggc aaggcagtga accgagtggt cagcgtattg
+     2341 tgaccctgca attgtcatgg cagataattg tttatgaacc tgtttcacac acccatccct
+     2401 tggatctcca gcgtagttac taatagtacg atttcctggt gttctgtcac ccgccttgct
+     2461 gccttcacgc ctgccccacg ttttgctgtc cactgaatat cgctctaatt aataggtgtc
+     2521 acactgtatc aggtaagtcc attccgggtg ctattggatc attcctgaga tgtaccaccg
+     2581 atcccatagg cgttaggtct tacatctgga gtgaaaaaga tcagcatcga actataggta
+     2641 gataaaggtc atgactgtta acagagaatc gttcctatcg caaccttcac taactggaag
+     2701 gcacccccac actttgatta gtaagcccct agcgaatgta gtgatccaag aacatcgagt
+     2761 atactttagc tctcggttca ggcatgtatg caatcgacca cccttccgtt cagagtactc
+     2821 tcaaccagca gatttctaaa ctttatagcc tccgcccact aaaattgcct tatctcaggt
+     2881 tgactcttgg atgtagctgt aatctaacat acacatggag ctgcggcaaa ttatcgtacg
+     2941 tccaaaccac caccggatca gtggcgatac tattctcgca aaaaagccat ccagcattgg
+     3001 aacaagtgtt aaccagcatt tttctgagtc ccccggaaag aaagttgact acactacatc
+     3061 cataaatgct agagtgtgga ttcgccatgt gttacaacgg tcaaccgaaa ggttagcatg
+     3121 atacttcgtt gttcaatcgg acgttcgagc gccctccctg tttatcactt gatccccctt
+     3181 ttgaaacatg tgcgctgcga cgcagggctg ggagagtcac cggaaaccaa aagcccgacc
+     3241 tcggacgtgt agggccctcc gtttgccatc aatggcgatg taggattctc ttttaataca
+     3301 acgttcactc aattaacgtc ttggtataag cgtcgaacgt gaccgaggtt gacaccagtg
+     3361 tcacggctgc gccggggttt gttgctccgc gtgtacaggg tattggttcg tgagacctag
+     3421 cca
+''',
+        '''LOCUS       part_C                  3423 bp    ds-DNA  linear   UNK 20-NOV-2019
+DEFINITION  .
+ACCESSION   part_C
+VERSION     part_C
+KEYWORDS    .
+SOURCE      .
+  ORGANISM  .
+            .
+FEATURES             Location/Qualifiers
+     CDS             18..3275
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     CDS             3276..3404
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     misc_feature    2486
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b1ff67"
+     misc_feature    3411..3423
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#faac61"
+     misc_feature    3407..3410
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#f8d3a9"
+     misc_feature    14..17
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#f8d3a9"
+     misc_feature    1..13
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#faac61"
+     misc_feature    3131
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b1ff67"
+     misc_feature    2078
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b1ff67"
+     misc_feature    14
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b1ff67"
+''',
+        'Metadata1 for part_C', 'Metadata2 for part_C'
+    ),
+    (
+        'part_D',
+        '''ORIGIN
+        1 accctgcagt ccgtgaatta agaccaatcc actggagctc tatacaggac atcagcgatc
+       61 ggtcgagtaa aaccgagttt ctggactccc ttagtctgag aattgtacct tattacgaat
+      121 ccggaaatga agtgcgctca taaaatcttg atcgctaact gttttccgct ttttgaacct
+      181 acagtcagct atttcgccgc aagcgaggtt tatccccttt tgtgtgtgtc agcgggcgaa
+      241 cgtggaggac aattatgacg aatgcctaat aaccaacgta ggcttggctg gtgaggacat
+      301 tgcccttccc cttctactaa ccagtgttgt tcagatcatg taccaagtgc agtaatgcta
+      361 atcccctgaa ttctgacgtt ggatttggag cgtgattggc aattatccgc tgcaaggcgt
+      421 agtatcgcta tctgggaaaa cttagggttg caagcaaggt catcgcccgt ctctagatcc
+      481 gacgggagcc tcaccctgca tgaggaagtc ctaatccgct ctaaacaaga gctgaacact
+      541 ggatgtctcg cagtagattt gctagaatgc aatgctggct cgtgtgcagc ctcaaggtca
+      601 ccatgcttcc gttaaattcc acgctctccg agtctgctgg ttcgggataa atctacgtga
+      661 cattcgcgag gtcccggcct gtagatcgtc tcggcaggag agaacacggt tgatccccca
+      721 cgcggaaccg atagatgcca ggctagatga tgactgaagg tagtttgtac gagtgacctc
+      781 tctagccaag tattttcccg tctcttaagt tatagccgct ctcattccgg gttgtgatat
+      841 ccttcatatc cactctctgt aaaatgctgg gttgttcttc tctccacggt cagggaatcg
+      901 cctcttttcg gataaacgac attatttcgc gccacagaac ggtttggggg tcgaaggacc
+      961 ctagactttg ggtatcccac tcttaccgga tggtaccgct atctccccag ggtccatcgg
+     1021 aatggctagc cacgttaccc ttatctgtca gtatcagtct cagacttaag tataccacgg
+     1081 tagcgacagc tgtcttttaa tggcccgggc agggagccgg gcccaccgtc catggtccac
+     1141 tgtaagggta tctgcaacct tcgccgagct tcttccccaa ggaggtagta ccttaccaaa
+     1201 cttccgagtc agtatcgtca aaggggcccc tagggctcac accatcgagt ttccgcggct
+     1261 taccagtcta gcctgatatg tttcaggtca ggaaataaga ggtatagccc cgtggacacg
+     1321 tactgttcga gcggctagat gtaggttgag ttaagtacag tagacgcgtt ggataccgtc
+     1381 gaacattact ccgtctgcca agggtagccg agtacttctt ccggctcggc cattccgact
+     1441 aagttagttt cgaattgacg tgccaaagcg tggctcccag tcatttgtcc ttaaattaaa
+     1501 cataagtttt ttacctgctc gcgtgccggc cgcttgaggg ggcagcaaga agtcggttca
+     1561 aatggggtgt taagaccggt gttgcaagcg gaccatccag agttagcgtc ctcgacgaaa
+     1621 cgttaacaat cgtgagatta gaggtcgaat atccccttcg tagggggttt tattgtgcaa
+     1681 gatgcgcaaa tgaaccccaa ccttgcgggc ctgtagcgaa caggcgaaaa ggtccaatac
+     1741 ggcgcccgat gcaccgtaaa acaggtcctc taactgtgtg ttctacgctc tccggatcct
+     1801 gtatataaga acgaatcccc ttttcctagg gcccggccgc gtagacccag tacacttgac
+     1861 tttcacgaag atccatccta ctcccatacg cttgagagtg ccaacgtagt ttgtaaccga
+     1921 ccttgcctcg gctagaaagg cattttgtcg catgtggcca gcctgtcagg gcgtgctcta
+     1981 ggcttgacga ttagtgctac gggatgattc gtaaccgagc tgacgggacg cctctggaat
+     2041 tcggtctctt tcgatggtgc ctcctctacg tagatctact ggataaccgt ccccaatatc
+     2101 cgcttcccaa cgtagattgc cgacaggcat aagcttcggg ggcgcaaagg ccgacgtccg
+     2161 cattgcagtg tagctttgtg agcaggaagt gtgatagtct ttcgattatt aaagtctgag
+     2221 ctgaatgaaa aaaggtccaa cgaatggagg acgcgaagac atgggtgtct cttatggccc
+     2281 gagcgggagt aatggcggtt cgtacataaa ggctgaaagg attctggcgt tagctgtctt
+     2341 acgttggatt ggcccttcaa attatcgatg ttagctgatt cggtgtaccg ggcgaggaaa
+     2401 gcgctctcag aacaacttca tatacgaggt tcgactataa tggtctaagc tcctgggcta
+     2461 gtctcaagaa gcgggtacct ttagtagcac gtatcgacgg caaagcaaag aataaaaact
+     2521 tggctttgca tcgtgcaaag atttctaact aggttgttta agggctggta tctatgtccc
+     2581 gctataacag cgcgcctaca gtagaagttt aaccatgaca tacctttgaa gtgttcgtat
+     2641 cacacacaag gaaggagcat gtggacacca ctgagctttg ag
+''',
+        '''LOCUS       part_D                  2682 bp    ds-DNA  circular UNK 30-OCT-2019
+DEFINITION  .
+ACCESSION   part_D
+VERSION     part_D
+KEYWORDS    "Source:Subcloned from vector Andrew" "Sequence" "Freezer" "Shelf"
+            "Box:Mobius box" "Concentration" "Use:Mobius".
+SOURCE      .
+  ORGANISM  .
+            .
+FEATURES             Location/Qualifiers
+     rep_origin      complement(262..850)
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     misc_feature    2642..2671
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b1ff67"
+     terminator      1991..2034
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     CDS             2054..2566
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#84b0dc"
+     misc_feature    1919..1938
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#f58a5e"
+     misc_feature    2050..2053
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#f8d3a9"
+     misc_feature    2576..2641
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b7e6d7"
+     terminator      10..67
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     misc_feature    143..162
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#75c6a9"
+     misc_feature    2675..2678
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#f8d3a9"
+     CDS             2618..2641
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#84b0dc"
+     CDS             complement(1148..1807)
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b7e6d7"
+     terminator      1033..1127
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+''',
+        'Metadata1 for part_D', 'Metadata2 for part_D'
+    ),
+    (
+        'part_E',
+        '''ORIGIN
+        1 tggctaggtc tccgctttga tcagcacgcg tctcagagtt tcagggggac ccaaattact
+       61 ggtcctcaat tgggacgcga ccgcatctcc ccacgaaagc ttatggggat tgcccactgc
+      121 ccagcttcaa atctgaaggt tcggcttatt gacagggtct aacacgcagc tcaactgctc
+      181 gaggttagag gcgtaatgac gggccccgat agccttctac gattacgtcc agcaggaacc
+      241 ccacagcttt tccctacgtc taacaccgtg aaagcaaaac tgtctgccct tttacatggt
+      301 ctttaaggaa tctctgcact tatgttatta ggtatgagac ctagcca
+''',
+        '''LOCUS       part_E                   347 bp    ds-DNA  linear   UNK 20-OCT-2019
+DEFINITION  .
+ACCESSION   part_E
+VERSION     part_E
+KEYWORDS    .
+SOURCE      .
+  ORGANISM  .
+            .
+FEATURES             Location/Qualifiers
+     3'UTR           21..330
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     misc_feature    1..13
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#faac61"
+     misc_feature    18..20
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b1ff67"
+     misc_feature    14..17
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    331..334
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#f8d3a9"
+     misc_feature    14..17
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#f8d3a9"
+     misc_feature    335..347
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#faac61"
+''',
+        'Metadata1 for part_E', 'Metadata2 for part_E'
+    ),
+    (
+        'part_F',
+        '''ORIGIN
+        1 accctgcagt ccgctcacgg accgcaagga cgggctaatt aggaggcaac gccgatgggg
+       61 ccgcagttca gcgctgcaat gtttgctgaa cagggatgtc acgcatactc gtctacaccg
+      121 cccgtgaccc gttatcacgg ttgaagtgtc gaggactagt gctgccgctg cgtgagggac
+      181 acaagctgct atttgtccat acgccatgtg ctccgagctc atgctgccat gagacaatga
+      241 gacatgtcgc caataatcga gtgacgagtc agaatgacct ggctccgcat aaccgttcaa
+      301 agttattgac aacgcatctt tcgtagttcg tgcagcagcg gtctttcttc tatagccgac
+      361 tagatgttaa gggactcctg gataccgcta gttttaccct ctccaggaag ccagcgaggg
+      421 cgtgccgcaa gtcccaatag ataccgggca tgatcaaggg gccctgtgct ctgagtctgg
+      481 aggcgacagt gcgctgcagc tcagaggtgg ttattgcgaa ccggcaccgc tggacagcac
+      541 ccacggggac acgtaagtaa tttagggtct gggccaacgg ctcagcgcca gtaggattaa
+      601 caaactcgac taatcaatgt gccagctact tccgccgggt ctgacggggc ggcacccatt
+      661 accatgtgta ctgaataggg attccgagcg accgtaaagg cgttcctaag tgtcatatac
+      721 tggcaactag aggcactcac atcggggtta agggcccacc gtaatggcca cgcaggatac
+      781 caattggccg ggtgaggatc tattcacgcc gatggggagt tctaagcccg agttattggt
+      841 gctagtggct tggacctgtg tgtcgatgat gcgcgatata gaggcgcggg actagctggg
+      901 gtccacaggt gctatgttgg gtgcgctcta tggacgtccg gaaagagact aatgcaacgg
+      961 tatggcatca agcgcgaccg atggggagac tggaaattgt gaaatagtgt actggcgcga
+     1021 tcattaaata ttgcatacgc tgtccgttat gacctagagg ggattatttg aacgagaggt
+     1081 cttgggaact gcattggaga tggtcagatg gaatgcgaaa tgtatcacca cgggcggccg
+     1141 aaggggagac agactatccc tagttggctt cggtaaccgt aatcagatgg aacggcgggt
+     1201 aatgctgata ccgagcgctc gtacggcgcg tggtgatgac acggtctgat gtcgtagcaa
+     1261 acgagccggt cctcgtacaa caggctcaca tctcaatcac gcataccaac cgattacata
+     1321 acgcgatcta tatttgggga actctactta ctaccctgtc tgcagagtgc gttctatgat
+     1381 cctcccctac gtgacggcca acgattagtc ggcctaggtc taacggataa aaggactccc
+     1441 cagtacatgt gaccatatga gccaggccgt cgagcgcgac cactccccag cctatagtga
+     1501 ggaggagcgg tattcggtta aagtttagct agcgactttt ttgtcaccga agtagggacg
+     1561 ggcatattgt ttacccttaa agcggggatc aatccattgg ggtcggcagt cataaaagga
+     1621 tctaagcccc caaagcgcat ggtaaggtac tcccgggttt cccgaaatct aggcaagtct
+     1681 cggtgggtgt cagcctgacg agtagggcac gttaccgagg ccacggtgct tgatgactac
+     1741 gggtgaatcg aaccgatcaa acgcacagca tctaaaccct ggtgtactgg tccacagggg
+     1801 gacaagtctt tgaagtgtcg cttcagatga cggccgcggg ccaatctgaa ttgttagaca
+     1861 ccgacagtag ggtgtgcaac tcgctcgggc aagagtgtaa aggcacatcc tccccgaggt
+     1921 aagttatacc gctctaacgg cgcgggcagc ttttcaactc aacacttccg cggttcagtc
+     1981 ctgagcatta ggctgcatgt ctatcacaag aggtgcgggg aacgacaagg gctctggaat
+     2041 tcggtctctg gtaagctccc ataagagcac cacttcgtgt accttgctaa ctcccttcat
+     2101 ccccacccgc gaaaacttaa gacgtcaccc ctgttattat cccgtgcact cctaaagtgc
+     2161 gatgggcaag aacgcaaaca attgtctgag atttatatgg gcggcggaca tagtcagaga
+     2221 gccttatata atctcccacg tcttgccagt ccgagttatg agaaacccgg gaccgatgac
+     2281 gctattacgg tcgcccagcg aggttcaaca gagcgaggca taggagtcat tacgcgtgtt
+     2341 agcttcaaca tgcgtggaag tgaaacggat ctataaaacg gcgtggagtc atcagcttga
+     2401 gcagatctaa cttactcgcc acgcgcgcaa atcgtctttc gctgtccacg ttatacgtaa
+     2461 ctcgcttgag
+''',
+        '''LOCUS       part_F                  2470 bp    ds-DNA  circular UNK 20-OCT-2019
+DEFINITION  .
+ACCESSION   part_F
+VERSION     part_F
+KEYWORDS    .
+SOURCE      .
+  ORGANISM  .
+            .
+FEATURES             Location/Qualifiers
+     terminator      1991..2034
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     terminator      10..67
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     rep_origin      complement(262..850)
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     CDS             complement(1148..1807)
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b7e6d7"
+     misc_feature    2054..2462
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#faac61"
+     primer_bind     complement(2351..2371)
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#85dae9"
+     terminator      1033..1127
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+''',
+        'Metadata1 for part_F', 'Metadata2 for part_F'
+    ),
+    (
+        'part_G',
+        '''ORIGIN
+        1 tggctaggtc tccggaggaa cttctatggg acgaaagatg cgcagctcga caaatctcaa
+       61 attggaaacc gtctaaggtc tttgagccca cgctaggcca ccgaatagtt gcgagctcgt
+      121 gggcaattgc tggctagcgg tttgtatcgt atacgtaaca agagattgcg ccggattcat
+      181 tcgtgtgggg tgctttcaca tcggaatact caagagtggg ggtttgcgct ttaatatgac
+      241 ggcctcatgc accccaaaaa taagagcgcc aatttcatcg accacattcc ggacaattct
+      301 gacttccctg tcggatcgac cctcgctcac aactcctaga actccaagac ggtaggacgt
+      361 cagccgaaaa ggaggagtga cgacgggccc tcctagctga agcaatgggg ggcgtcgacc
+      421 ctagcctggt gtgggacttc ggagggtcgg gcgtgtggcc attcctgcac gaggggccct
+      481 tgcagtatcg aactttgacg agaaagtggg gggcgaccta taaacatagc ggagttcaat
+      541 actcctgcaa gtgcatgatg acgttcagcg ttggcacatc gaacgcgtcg ctacacttgc
+      601 tcaccggaag gcaaaataga ccggcagctg gcccgcacgg acgtctagac tcctacgctg
+      661 tcaaatgcac gatgactatt agcatgcgga attcgaggcg gccggtacat cgagacacgc
+      721 tggtcttaat acctgtgtta tgtcaaaaca agtgtctcgg cggctttgta ctacgctgtg
+      781 aatgcgcatg atgttgcgag aagctgaacg ttggtagcag tctacaacag aaccgacgag
+      841 ctacggacgg gttacagcag gatcccctct taaggcatta ttcgacgact ccaggttcta
+      901 accgatcagt aattgcctcg gatggtcgta cgtgttaacc gagacagcaa ggcaccacat
+      961 agacaactgc atagggcgcc tacaggtcca caatcagggt ggcccaagat cctcaaagac
+     1021 ttgttgcagt ctctgcttat tccgtttaac acgttgtgtg agctctagct tactacctca
+     1081 tcggtgtcgg gagtgattta ggaatgtgag acctagcca
+''',
+        '''LOCUS       part_G                  1119 bp    ds-DNA  linear   UNK 25-OCT-2019
+DEFINITION  .
+ACCESSION   part_G
+VERSION     part_G
+KEYWORDS    .
+SOURCE      .
+  ORGANISM  .
+            .
+FEATURES             Location/Qualifiers
+     GoldenGate      1..13
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#faac61"
+     GoldenGate      1107..1119
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#faac61"
+''',
+        'Metadata1 for part_G', 'Metadata2 for part_G'
+    ),
+    (
+        'part_H',
+        '''ORIGIN
+        1 aacatggatc cgttacacaa ggtctactcc gcgatgtggg ctcaccccct agatcccttt
+       61 tcctaccgcc cgatcgcaaa ctacgcgtag cttcacggct ctctgtctgt cggctgacct
+      121 gcggctcatt tttcatccat ttagtatagg ttgcaagggg tgtgactgat ttctctacat
+      181 aaagaagcct atagtaccac atgcaatgcc gatccggtga gtgctgtagt ccttattccg
+      241 gcttggtggc ctcctgccac ttaggatcgc aacggaattc tagttcctaa cgtcccttct
+      301 acctgattaa gtgagagaaa acggaaccaa cctaagacat ctatgcatcg atgttttaca
+      361 atgacgagag tgctccatgg ttcatactgg ggacatagtt tcgggcattt aggcccgcaa
+      421 gagttcgggt atctagtttt tccgtacgaa aaacaccacc ttagaacagg tcacacgagt
+      481 acagagagta aacccgtaat gttttcaccc attccccgat ttgactgcaa acaaacaagt
+      541 ctccccgtat cgcttcattg ttttatcaac gggggcggaa tcgtagacca ataattaacg
+      601 acaactctag gcttttcaac cgacgggggc aaagtctgaa atgcctgaga aaggcacaac
+      661 gacggtggga ggggcccctg caaatattgt tctagcactc caggattcac accaacctcg
+      721 gggccagcca ttccggtact tttggttata cggcaggata ccacgtccct aagcggagta
+      781 tacacggagt tgccttagcc aggtacccgc ttaaccgtcc aactcccctg agtggtacgt
+      841 ccatcacgcc gcgtaaacgg tttccaaaag agtaagctta ggcattcctc acctgtcacg
+      901 tccctcttaa gatccctgcc tcgaactggg atcttgtaaa aatgtggcca tgggagcagg
+      961 agttcatgtg gggcgacggc gatcggacgc ccctttaaac cagagccctt gacgctagga
+     1021 gatcagtaga gttacccgga atgagatctc taatctaagt ttgatacgac gaaagcggcc
+     1081 tgacgggcgc tactcatgct cttagaatcc gtcacttatt ctgccacaga tccgaggtac
+     1141 tgtggatgtt atttgcggag actggcctcg gattaggggt actaagtccg agatgtcatg
+     1201 agttaagccc aattcactag ttgcattgtc aacgagtgga cctccaaaac gatgttaggg
+     1261 tcactacccc aagcgagcac ctccgctagg accacacacc cccactttca aggtattttg
+     1321 ttcgcatcac ataccgtctt ccctttgcgg tctaatagtg aagcttggga caaggaacgg
+     1381 ccagtcgcag caatactacg agtgagagtc ctaggcgcaa ctacgtaggt tccgcaaacg
+     1441 tgttgtggat tactgttgag gtttgagttt atccggaggg ctgtgtaaga attaccagct
+     1501 agtcaaaagc cctgcatggc ctgatctcat tagatacctc ggccgggccg aggcaaatcc
+     1561 gtgaacaaaa accatgcatt tattctatca tagaaacatt tgttacacat ctactggccg
+     1621 tgtgccgtga acaagaactc aatttagtta tcaagggact gctgtaaacg gagccgcgtc
+     1681 acccgcgtgc acacgtgtag tgcttacgcc ggcccccgtc cagcgacacc gtagtcaagt
+     1741 aaaaaatgcg tattcacgac ctcacgtacc cgtttcggag ggtgccttga cgcatagagt
+     1801 tgtctgtgtg attggaattt gtaaggggtc cgcccatgta aaatagagcc catgtcttac
+     1861 gaggacatga ggaaacatag gttctggtgg ccttccaaga agctgcctct acactccttc
+     1921 tctttaatca ccgaaaacct taccttgaga ggacgtcatt cgtcaaaaca aaatattggt
+     1981 ggcaaattaa gattaccact ataggcggtc tcaaatggaa gacgcgttta gtcttcggcc
+     2041 cccagacggc accggcagag ccactgccaa tgccttttac gctgaactct tcgactttgg
+     2101 catgtgcgac tgactatacg ccgatggccc taccctgcag cggaaaggca cagggccaaa
+     2161 aacagtggaa gcgcaccgct agagctttac taaatccttt agggtgaacc ggtgttcagt
+     2221 caacagaaac atatgactag tccttaatgg cactactaaa ggcggcccat ctcttttgta
+     2281 ggtcacgtct catcgtttag caagcgtccg ccatccgagg agtatcctag tacgtgagag
+     2341 ggtgttttac ctcatcacat ggtttttggc tagatgtggc agatgccagc tgatacctta
+     2401 caacccgcta taacggtttc tggatcgacg atacaacctg cttcggcata tcataatggc
+     2461 ggcctcatag gacttccaat catggttatg cgagtttgat gtgttgaaga ttgtgagggg
+     2521 aaaccttttt ccgagtacgt tgaatctgcg actgatggtg aacaactcat cgagagggat
+     2581 gtgcgggcag tctccttgat gcgcgaaaag gagtcgcgac cgcgtgttcg tgacgcactt
+     2641 gatgctagac cgtaggggct cattatctcc tgaaacagta gctagctttt ggtgtccgag
+     2701 tcagcttagg cacagtaatt gaaaagaagg aaatgcgtga aaactaaacg tagacactcc
+     2761 ttgctaagaa ttccctggtc tttttcgagc atagactacc gtaggtaaaa ggcttgtcgt
+     2821 gtcacaaata gacttgatct gttcggcata tacacatcct actgcttcag taaccaagga
+     2881 cgattctccg gccattggac tgtgggacca cccgcgttca aacggaatcc tctacgaacg
+     2941 gttaagaaag gagcccactg cttgcggaga catatcgttg ctgagtggta caccggtgag
+     3001 tcaaaaagta ctgacactac tggtggactc tcgggtacga tgtgtggggt attggcatac
+     3061 tatggcgcta agcgtggaat agtgtttcca atagcccttt acctaagaag cattctgaca
+     3121 catgggttgg acttttacac agacctataa ctcgtatccg gcctggtgat gtatgtccgc
+     3181 ttatcactga atgcaggatt ccgccaattc cgctcgcggg ttctcggaca acgggccatg
+     3241 gagatggatc aatgagccat gttgattacc atttcactac acacggttag tcaattccgg
+     3301 agatcataat tcgacaattg aatatgcgtg atacgctttc tgttaccagg atcgttgcta
+     3361 attagtttcc aatgtcacag tgttgggcgg cgaggtatca cggcgctctg ggtagaatgg
+     3421 cggtgcctga ctggacctca taactggtaa catacctatg accaaaggag gtcagacacc
+     3481 gatgagtcgg tgacatgggc ggtcacagcg tgccctgcat agtaatacag ctcgtttcta
+     3541 gacatttgtc ctaattcgcc acacaagtac gagagcgggg gtaacccatc accatcgtgc
+     3601 ccgtaggtac ctaatcttca tcgagcgcta ttgttaaagt ggactcaggg atcggcatct
+     3661 cgtgtagctt tgagaccggg gcccgaggat gtatgccttg catggaactt gactaatctc
+     3721 agtaatactg gccgtgtatt ggtgtgtctt ccttggcctc acatgggaac attaccacat
+     3781 ataacatcat ggggttcagt ctattactaa cgaagtcact aaaacgtact cgacggcgca
+     3841 tgcgagtatc gacgtagcgg ttggttacct taagctgact tggtctatgc atacactgat
+     3901 tagcttgtag cggtggcctt cgacgtctgt atcgtaggcg ttgtttgttg caaacacaaa
+     3961 cgacctagcg tcaagacccc ttctagagaa agagagtgac gactcttgtc agttcaactc
+     4021 tgtggtacgc cgctgcgaga tgcgcgttgc cacggcagac cccatgaact cgttcaagct
+     4081 aaactctagt tcacgctaca tgtgtttgtt tctgcgtacg caaaagtact aggtacagct
+     4141 atcttttggg ccccaagtgg gaccacactt tcggtcttcc tagcaaggct ataaaaccgt
+     4201 atggcatgag tccttgatct gcatttcgtt tagacagagc gagatg
+''',
+        '''LOCUS       part_H                  4246 bp    ds-DNA  circular UNK 07-NOV-2019
+DEFINITION  .
+ACCESSION   part_H
+VERSION     part_H
+KEYWORDS    "creator:militzis" "marker:SmR".
+SOURCE      .
+  ORGANISM  .
+            .
+FEATURES             Location/Qualifiers
+     primer_bind     1966..1982
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#a020f0"
+     terminator      3774..3860
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     rep_origin      complement(63..651)
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     CDS             2015..3667
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     promoter        1987..2005
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     CDS             complement(744..1535)
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b7e6d7"
+     misc_feature    3667..3670
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#ff0000"
+     terminator      3952..3979
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     primer_bind     complement(3694..3710)
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#a020f0"
+''',
+        'Metadata1 for part_H', 'Metadata2 for part_H'
+    ),
+    (
+        'part_I',
+        '''ORIGIN
+        1 accctgcagt ccgcatccaa gcttgctggg gcctctatcc gggacctgct tccgtacccc
+       61 gtccgcctat caggctaacg actctgcctg ccattcaggc tcaccggcaa gttggagtga
+      121 cctcttcatc gatacaaata gcgcatacgc cagacatacc gcccacgcac tcgaccataa
+      181 aattccccgt cacggcgcgc acctccacac tccgtggcct aaggaacgtg gcagccggct
+      241 gggccacttt ttagactacc atcggctcat ttttagaagg ccaccggctg tccgtcaatc
+      301 gtacccgttt aggcctcctt aacacagttc cgaatagtta cctcaagatg cggatacagg
+      361 atggctcccc caggggtcta gttcagtctt ttgtcgcctg cgcttgaacc tttatgcagc
+      421 gatccacaaa cggaacaccg agatttgtat ttgggagggc aggctttgga ggaacggtgt
+      481 atgtactttt gcttggtacc ctaggtaccc cacgatctaa tcggtcttcc tgacaggtga
+      541 cagaggaggc cgtaactgcg accacaggct aactgcggcc ttaacttatg gtcgcgaact
+      601 gcataagggc gtcgccgccc gttgtcagtg cgaattctgt tagtcgtcgt gtacaccttc
+      661 cggtctaaca tctcgtagtt actagaagag cggatgggtc ctgtaaagag agcaggttcc
+      721 cgtcttctct cactttaccg gtactggtgt gaccgggtgt gagtgatact gtgattccgc
+      781 tactattgct atgcctgccg tcgtagctag atacgatccc agaacatttt gggctgattt
+      841 caagtctctc cgggattccg taacgacggt tctcgaactg aatagctttg agatatcgca
+      901 atattccttg gttgactctt gtccccggga cacaagtcgt gtgcaatatg tatacgtcag
+      961 tatgctcgag actcctaagg ccgcatatct atgctatcac tattgcctat gcagtaactg
+     1021 gctaagcttg tggggtactt gcacatgact catgtcaagg tcggaggatt cccagacagt
+     1081 tggcatcatc agtgcgttca aggcggggag cgaccagcca gatattgatc gacgaggtgc
+     1141 cacgaagtgt tccaaggtta tttttagtat gttacatcca tcagcgggtc taggccatac
+     1201 cggtctatat tatggtgagt cgtataggct gtaatgccgg ctgcacaatc tacggccgat
+     1261 tgcacataaa atggtcaact aacgacaagc tctgattctc aacttggata aaccttatca
+     1321 caaaaggtcc gacacggttc agccgaggta aatcaaagtg attatgactc caggagcgac
+     1381 acaaagttgc actgtctact gttggtcatc accgtactgc aaacgggtaa agatacttag
+     1441 ctttgttagc tattgcagaa cctaattgct ttcctgccct aaggcgatcc ggatcctcta
+     1501 tttatcaagt taattatcag agcttagctc aagtcaaagg tcttagtcag gtatggttta
+     1561 gtcggcttat ctcgctccga taaacccctc gcgcctcgga ttcattcacg cgtttatatg
+     1621 gtgaggggcg acccgtaggc tagtcgcact cctcggcaat taatcctaca gaaacctaga
+     1681 catgggagtt gcgatcctcg agatacggcc tgagagggtc ggcaaagtgg gtgcttcatt
+     1741 ctcttcggcg gagttcgcag gctctagaat gcctggtttt catctcgaca taaattacga
+     1801 tgttatctcg tgcattatta ccccttttct gcaggtttta agtcgagtct agtcttacta
+     1861 acgctgttct tcccgagaag gtgtccaggt tagatctcgg catattttca ctggcgcgct
+     1921 atccgacagg aagacagcac ccgttaagcg ccccagtcac atcaagatca gtcctatgtt
+     1981 gactcttgct ggaggtcttc tcgaatccag ctaatgttgg attacccgcc cctctggaat
+     2041 tcggtctctg cttttattat ccggcatgca tgcggcgttg catcgcttca tcgtcatcga
+     2101 catatcgtta gcgggactta tcagggtccc atcacggctg tgacagctgt tcataagtgt
+     2161 aatagcagtc accccaccaa atgcaagact gttcccaaac taagtgctag ggaggttggc
+     2221 tacctatcgg cgtggcagtt gaccgggttt ttcttagtac ctgccttcca atctccgata
+     2281 aaagcaagat gacttcctgc ttgcgctaaa gtctgaattc gctaaggggg cagattcatt
+     2341 accagagact gccaaagtca accgccgaac gatactggaa tatatggagg tatgag
+''',
+        '''LOCUS       part_I                  2396 bp    ds-DNA  circular UNK 29-OCT-2019
+DEFINITION  .
+ACCESSION   part_I
+VERSION     part_I
+KEYWORDS    .
+SOURCE      .
+  ORGANISM  .
+            .
+FEATURES             Location/Qualifiers
+     terminator      1991..2034
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     terminator      10..67
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     rep_origin      complement(262..850)
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     misc_feature    2054..2388
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#f8d3a9"
+     CDS             complement(1148..1807)
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b7e6d7"
+     terminator      1033..1127
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+''',
+        'Metadata1 for part_I', 'Metadata2 for part_I'
+    ),
+    (
+        'part_J',
+        '''ORIGIN
+        1 ctcatgggag tgtagcgcta gccatagttg acctgtcagc cggtcaaggt tggtccgaac
+       61 ctagccagtt agacgaccag ctcccccact attgcacagt gcctgtataa gcacgtcagt
+      121 gtctggcacc actgtgcgcg gtgtggtcct cgggacgatc ttcctacggc tacccatgcg
+      181 ctagtgatta cagacgatcg ttttttcttt ttctgtggtg caaatacaca agatacgtca
+      241 agagtcctag cagcctcatc ttgccaattg caggggtacc gattcaccca tggtatcagt
+      301 cacgcaaaaa aagacgacat cggagttgct ggcgactggc aaaagaaaac atctatctgc
+      361 cgtggcgttc gtctagcgca gcgagccgac tgactactcc gttatctcaa atttagtttc
+      421 gtaagatctt cacgggagcc ggccagctga agaatctata ggtctaccgc tagaggaagc
+      481 ccgtttacaa ccgacgtact agtccgacag caatcgtcag catgccaatt tattgtatca
+      541 ggttgagaat gcaccactac ggaatcgacg tgccactggc cgcacgatac tagtgcgctg
+      601 gtaaacaggc caggagctct aaatctggag tggtgtgaat ttaaccgcgg aacgattgtt
+      661 gcacgcggtc cctgtgactc tgttgggagc actgtccccg gctccggata agtgatgtga
+      721 acgaaaaggt gggctgacca gagatagggt taaggacggg cgatcgtagt ggacgattac
+      781 tgctgatctt ccgagcactc tgagtcgcgc ggcgtatcgg gagttacccc gctcgctaca
+      841 catctgaatt ccgccggata ctatgggtgc agagtggatc accttttcgt gacccgtata
+      901 ttcgtcgttc tcatcactgt cctccgcgat ttatttcaat cgtcggtttc gccagatgca
+      961 ttcctgggga agtcatcgcg acagtgcgct gcgcgcacag ctcttcttgg tttattcgag
+     1021 attgtggttt atcaacatgg tctatctacg gactgattag aatattccca cgttaagccg
+     1081 acgtgcattg gtactggctc cttaattaag cgcagagggt aggcgccttt tcttgtgcaa
+     1141 accattatat gaggaactag caaacactat ggcgcaatat gtccacgtga ctcgagcatt
+     1201 ctgtgttgcg gtagcgattt cactagtcac aaacggatag attctacggc gcacccggtg
+     1261 catcgttgta tgttcagcaa tttggtcata tcccgctcct ctattcaatc tcttttttcg
+     1321 tcaggggggg cacatacttg gagcagctgc gcctaacatt acaataagca gtcggagctc
+     1381 agtacaaaac ccttatctta gcggtccgtt ctggaattcg gtctcaggag atatgcaggt
+     1441 gtttacggct aggcacttac gcgaaatttc agctcgcggc aaactgtgct tatgcgactt
+     1501 cagctagtcg tcatcgagtg ctgacgcgct tgttctacct taaggtgccc gctatcgcat
+     1561 tgtccagggt tcggctatga gggtcggaac cagatcgcac ctacatgatg tcacgatact
+     1621 attattcacg tcgttagaga acggacggtc cttcgtcctc acaggaaaat tattagaaat
+     1681 ggtcaaccgg gtccacaaac gggcaattgc cactttggta gtacggttgc acataagatg
+     1741 atatttacgc cttctgcgtt caggttacga tagtcgttga tggggctcgc tccgggtgaa
+     1801 gttgatccag taaaatgggc gtcgatactt ctcctgtgag ctaagcgtct aaattcattc
+     1861 ctagtctcgt gacgagaaca gaaaagacta aaccacgcgt gatggacctt ggtaagcgct
+     1921 tgtcggtcta acttgtctca tctcacacgg tatgttcttg tgagcgctga ccagcccgtg
+     1981 tccctgacgg ggaattcatt ctaacttacg gcttgggcgt cgtgatgttt cggaatccag
+     2041 gatattacac agtagatgta gcttgtggcc gaacgagtgt atttcctgcg tcggattacc
+     2101 tcatttcttg ttaatctgcc tacaattaag ccctttcagc agccttccct ctcgtttata
+     2161 tttcgacagt caccgtgaca gtgtgatcga gctgtgggaa aatcacaata tagacgttag
+     2221 ttgcttcgac agaaacggcg aatgtacgcg gttgtgatgg atgagacagg ccattcaatt
+     2281 ctattcagcg aagttcagat tggttgctac tgctaaagga tgcgcatttg tcctttctgc
+     2341 gcacctgcat atacccctaa gatgccagcg caatacggca tcgcagggca agcaacaccg
+     2401 cacagcatgt ccctaaaggg aagatttaat acggactcag tcaagttgtg agaaacgaca
+     2461 atacattgag tggaatgccc tttggtacgt tggcgataga tctaacgaga aacttcaacg
+     2521 agatctagag tatcggactg agatgcatca tggctaggga ttgctgaatg gatatctttg
+     2581 ccaaaatgag ctcgactagg aatctcagac tgccagctac gaaaagctgg gggatattca
+     2641 tttccgctct tgtaaggcgc acgatgaccc tgtggagcaa aattcgacgc ggcaacgtag
+     2701 tcaaagtacg gcctatctgg gacggagatg ggattgtttc tgtattcatg ccggcctctt
+     2761 gagattgtaa ggatacccgg ccacagtctc gtaagaaacc cgatatcgct caaacgaatt
+     2821 gacatcagtt agggcttgcg ctctagcaac cacgcgtcgg gtgttcgact gaatttaaga
+     2881 tccagcgcaa accattcctt aaaggcggtc caggtgaaac cggctctgat aatgtacagt
+     2941 ggattgtcca gttcgcttca aagtgcaatc aggcaaggta ctggcaagtc accgcttggg
+     3001 gccggtttca gtggagcttt atcgacaaaa ggccgggccc tttggcctag agctcacttt
+     3061 tggtgtcgtt cacgagtgag aactttggct cgcagcttga atgcttgtca cgtttagggt
+     3121 tatacaacgt ttctataaac tacctatgac aaatcccgat cttctgaaac tccataagga
+     3181 ctaagagagt ccgcgacagt ttcacttggt cggtgctatt gactatgtca cgcatgcccg
+     3241 gtaaagcttt taagcaaagc ctgatatatc acgggaggtt actcaaagca ttttctaaag
+     3301 ggacagcgga ctcacattag cctaatataa acccgatcag gccatgcacc tcgattcacc
+     3361 ggaaggtagt accatgcacc ggatatttgg gacaacagtg aatagtacat cgtaaaatgt
+     3421 caaggcctag ctatttttca ctggtgtctt atctctatta caacacacac ggatgtcccg
+     3481 agcctacact ttcaaatata ctcaaggttc gctgttaagg gtaatacaag agtgctcggt
+     3541 ttagtatcca tatgttggta caagtgactg tgctagccgt aaattaattc ggcttccatt
+     3601 ccagcttggg tgtttagggt ctagacggtt gaaaccagaa agagtacaga caaaaccgta
+     3661 gctctcccaa ggttgatcct ccagacacct acccacacta gtagcgcagg cctagaggag
+     3721 acgttaggag cggaattgta cattcagtat cgcattaagc acaaagacag acaaacctag
+     3781 aagccactta tcccctcgta ggagtacaac ggcagcgctt tcgggaggag ttgcctaact
+     3841 acgctctgga cagcaagtcc cagaatgaag aaaatgactt ggcgagaacc caccactaca
+     3901 tgcagggtct tgggaccggt cagcacagct tatccatgcg gcaattccgg acgaccgcga
+     3961 atgaggatca cgacactgcc gatgttgcac cattgacctt ctcctatgca acaagggctt
+     4021 aagatggtag atggtaatag agtagcctgc gaccttatgc ggtaatacac aaaaaccggt
+     4081 aaacagtgcg ttgatgctgt gtgctggcgc atttgtgtac cttgctgggc tcgtataaaa
+     4141 ttctgtcagc aggacgttca cctcccttct gctagtcgct aggcacaaac ggaaaaggtc
+     4201 taatcgcgcg cgtgctcgtt agagtactgg ggcctcccac cacggatgat cacctcgccg
+     4261 atacatttgg ccttatgtct caataagacc tcatggtcta tcctacacca tagatttgga
+     4321 aagtctagtt gctgcctagc aggctgatag caagcgtcgt acgaggatcg aggaagggca
+''',
+        '''LOCUS       part_J                  4380 bp    ds-DNA  circular UNK 31-OCT-2019
+DEFINITION  .
+ACCESSION   part_J
+VERSION     part_J
+KEYWORDS    "Source" "Sequence" "Freezer" "Shelf" "Box" "Concentration" "Use"
+            "creator:SynthSys Center" "marker:SmR".
+SOURCE      .
+  ORGANISM  .
+            .
+FEATURES             Location/Qualifiers
+     rep_origin      join(4298..4380,1..166)
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     promoter        1442..1476
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#85dae9"
+     misc_feature    2345..2362
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     CDS             complement(2550..3341)
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b7e6d7"
+     misc_feature    1187..1210
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    1366..1396
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     CDS             complement(2550..3455)
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#993366"
+     misc_feature    2421..2449
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     -35_signal      3766..3771
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     CDS             167..1186
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#993366"
+     misc_feature    2526..2549
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     gene            167..1186
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     -10_signal      3744..3749
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     CDS             1503..2222
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     misc_feature    1409..1426
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     -35_signal      3589..3594
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     terminator      2227..2298
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     misc_feature    1319..1343
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    1370..1394
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#f8d3a9"
+     misc_RNA        3625..4177
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     terminator      2314..2341
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     misc_feature    2364..2474
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_RNA        complement(3628..3735)
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    4264..4272
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     RBS             1485..1496
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     misc_feature    2353..2356
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#ff0000"
+     misc_feature    complement(2476..2516)
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     misc_feature    3539..3562
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    1427..1430
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#ff0000"
+     -10_signal      3610..3615
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     misc_feature    1211..1258
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     gene            complement(2550..3455)
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     rep_origin      3589..4177
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     misc_feature    1414..1419
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#84b0dc"
+     misc_feature    2388..2411
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     terminator      1409..1411
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     misc_feature    2357..2362
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#84b0dc"
+''',
+        'Metadata1 for part_J', 'Metadata2 for part_J'
+    ),
+    (
+        'part_K',
+        '''ORIGIN
+        1 accagacagc ttccctgctg cttagagtgc catggggaat tgatctgtgt tcaatgactt
+       61 taccataagc gcgcatcgtc attgcatcac gtgctttatc tctcgtagct agtagggaac
+      121 aagagtttgc gaccactggt ggaatttcta gccgctatgt gaaaagtcac tagtagtatt
+      181 aatagtcggc acatcgcgta cgcagtgctg agattcccct cactgttact tgagctagtc
+      241 gcgccttgac agaccgcctt tcgaaggtgg cagagtgcct aatatattgc cacgttgagc
+      301 gtactccttc ccggagtttc atcttaccgc cgggcgcgcg aagctacgtt tttcgaattt
+      361 actaacgcac gctgacggtg gaagggcgat tggactggtt agattcaggt atgccttaag
+      421 cgtactttac aaccagaggc tttatttgat tgtctaatct tcgtcaaaga acgaatacca
+      481 gcgcttgagg ggtgactaga ctaataggag acaccgtctg tatcactcgt cggctatggc
+      541 cgtactgtga acgcgacggg ccctaccagg ccacagattc ctatgtacgt tgcaagggtg
+      601 ggctttgacc gttgcaacgg cgcactaggt ggcattcttc tctgctgcca atgatccgcc
+      661 tcgccgagct aggggcgaag caggttatga cgcagcggaa cggtagtact atctaatatc
+      721 aactaaaatt gtttctcaaa ggttcaaact agtattcttt attagaaacg atgatggcat
+      781 ccggaacagg gttatggccc aggtgctgga tgaagccttg cctcgaggga cttagtcgcg
+      841 tcgcccctct accaaggcgc taacggctag cgagatggtt gaggcgggag ccccgccact
+      901 ttctagttga attcagagct acgtatcctg atgctaatcc ctcgaagaac tttccgatgc
+      961 agctactatc tctttcgtaa agttagaata ggaacccggt aacggtggaa cgtcccgtca
+     1021 taggaggttg tctcctacac tatctaagta cgtcagaaga tcgatttcct cagccgctga
+     1081 ccccgtccgg catgaccagc gccgaacgta taggccgtat tgctgccgga acgactgctt
+     1141 caaaggtaac catagccgtg gtacagtgac aacccactta gctattaaat catgcgcact
+     1201 ctagacctct tgcacatacg gagcaactat gtatctaatt ggcacgagac atagaggagg
+     1261 gccaatcaca gtagtttact ggtcgaattc cacctgcata tggagagaca ctccttcatc
+     1321 aacagcagag gttacatacg tttaacctga ccgatggttg cccatcgaaa gcaaggaccc
+     1381 acgggtaggc agctgttgtt tgatatgctt ttgtccccgg aaggcgccga taaaattata
+     1441 cgccgtcccc cgcgtccgtt acgagcttcg tgatgttgcg ggctgaagtt ccctacgagt
+     1501 caataggcca actcgaatgg ctaaatggtt gcaacccaca ggctcaactt tgaaggtaat
+     1561 acgccaaaat ccaatatgct ctttcgggta gcgcataaaa ccttctgggg gccactgcag
+     1621 acagtcatgg aggactacgt gcaacactac gctctagagt gatgatgtgg cagtcaaccg
+     1681 agggctgtta agagaagtct gtgcacgaaa atcaatgagt cggtgtaatc ttcaccttcc
+     1741 tacaaaccaa ggcttgaggg cctcaatttc gagcaccact tcttgaccaa gccgttcgcc
+     1801 ggtataggag ttacgaattc gggtcgtctg ccgtctttga accatagata agtacctccc
+     1861 gagtcgggag aacacgaatc gcatcagaac tcatcgaagg gtgttacttt gcccatcggc
+     1921 atccccgaag attaattgca ttcgaaattt taacttcgag aatcatccgt gctaaccaac
+     1981 gtggacgagc tatgaacgtt tacgtgttca gtatctagga attgacacgt ctccgatagc
+     2041 gggagtcacg gcatgagtta cggcttttgt gaccagcgtc tgtgtaattt tattgacagt
+     2101 ttcatatata gtgtctcgtc ttgcctttga gattcacagg ctgtaagagg gatgccgtcg
+     2161 tgtatatgcc tgcagttaga gcttccttgt caggacgagc aactcactcc ttctggtgat
+     2221 gctttgctag catgtagctt cgggtacttg cggaaaagga cagcctacag tgtctgcggc
+     2281 ggtacgtcac taatatgaca tacgctgtgg acatcgtgaa gcggcgaatc gctccagatt
+     2341 gaggtttaca gagtactcca tagtcacaca actcagaata tgcaggtgct gcagtgaccg
+     2401 aatcctctca ggtcgcgctg gcggcccgtt tgagagtgct gaaagcgaag tttatccgca
+     2461 ccgtcatcca gtgcacctcc cccagagaat gattacttgt gaatgcggtt aacctgaggg
+     2521 ccgacgccgc gattaaattt ttaacgtgat gcacaagctg ggggcactct cccctggggt
+     2581 caggttataa ttttaaaccc actacggacc tggactgcaa gatgcttagt ccacgcgtct
+     2641 catagaccgt cggtctatag ccatgttcaa cgccgccagg ctgggcgcat aactgtatgt
+     2701 gactttgtcc acatccaagg cgacgatggc ggcagttggc cggagggctg gctgtcaagg
+     2761 ggccacgcgg atgaagggag ctcatacgca actatggagc gcggtatata gtataggatc
+     2821 cgccgggaca cgcgggaatc aagggacaaa ggagcagtca gcgtgaaatc tttacgggtg
+     2881 aagcgcgctc gtaccaccta gtcccgccta aggcccttgt gtcgtgcaac atcgctgggg
+     2941 cgacggatga caatatgatc aaggcccgag agctttgaat gtaagaggcg tattataaag
+     3001 cctaggtccg catgttgata cggggagcag cccatgcgca gtaggaaggt ccgaccaccc
+     3061 ttttctgagg tctactccaa cctccttgcc gagtgctctc cgctatctcc acgcatagca
+     3121 tactccgctt ctaacatctt cttcaaagca tacacgctac ttagcagagc aaatcgacac
+     3181 gcccatggag tggtccgctc aaaccgcgca attaagtata agctaatgtg acggaccgga
+     3241 cctacgattt cccccaactc gtggggatca gttgactcgt ctcagcttat gagacataat
+     3301 tacggtcata gggtacgcct atgcccctca gagatctcta ggtcatatgc cctatcgggt
+     3361 gctcggtgac cattgtctca tacaaagtca tatttggcag ggcttctatg gacgagtatt
+     3421 atgtgcccaa aagggaacgt ctgagttggg attcgcttct aaccaatact ctaatggtac
+     3481 ctaatttaat gtggtcgctg cgcaccccgc cgggtacaac tgctgagttc ctgagatcgg
+     3541 tacggcaaac atcttttatc cagacgaggg ttctggccag aattgatgtt cagatacgag
+     3601 aaggcatgtc atgtcacaag gattttggag aatt
+''',
+        '''LOCUS       part_K                  3634 bp    ds-DNA  circular UNK 28-OCT-2019
+DEFINITION  .
+ACCESSION   part_K
+VERSION     part_K
+KEYWORDS    "creator:SynthSys Center" "marker:KanR, BlpR".
+SOURCE      .
+  ORGANISM  .
+            .
+FEATURES             Location/Qualifiers
+     misc_feature    1268..1284
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#b4abac"
+     CDS             complement(join(3199..3634,1..380))
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b7e6d7"
+     misc_feature    2374..2377
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#faac61"
+     misc_feature    2395..2419
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#f8d3a9"
+     promoter        1382..1560
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     misc_feature    2370..2373
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#ff0000"
+     misc_feature    2389..2393
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#84b0dc"
+     misc_feature    1239..1261
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#f8d3a9"
+     rep_origin      complement(2510..3098)
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     terminator      2117..2369
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     CDS             1562..2112
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#b7e6d7"
+     rep_origin      671..1106
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+''',
+        'Metadata1 for part_K', 'Metadata2 for part_K'
+    ),
+    (
+        'part_L',
+        '''ORIGIN
+        1 gtccgatgcg agcaccacct atagataccc taatcagcat ggtcccggtg accattacca
+       61 ccgacggcct tgttttaaac gaaggcgctc actatacaag aaactaatgt ctcccacaag
+      121 gctcagaccc agccggtgct ttcagcgctc cccgttggcg ccccccgaag accatagaga
+      181 ggtgctctgt taacaactat aatgaaaggg attattgagg gagtcggagg tgaattctga
+      241 agccttaccc ctacggtcgt ggtcatcatc acggatcgcg ataagcggcc ggtctgttac
+      301 ggacgccact acgaggaggg tttcttggca atcaaggcta cgcattacaa ccatcggggt
+      361 cggtctggct gaacaatctt gatgttcaac ctttgttacc ggctccttgt gttattatcc
+      421 ggtttttttg atctatatgt ttataaggaa gcggtgcaga ccgtagagaa ataccggcta
+      481 aggcagtcgc tcaatgcaca ccagcatcgc cgagacatat aaagccataa acattaattg
+      541 gaatgctagt cacagcgtgt tgactggacg cttaaaagtt tctacaaaag gtatagtttt
+      601 aacatttctc tgagttagcg ctatcgggtc gactgacatc tagaattgac acgttactca
+      661 cctggatcct agtcacactc cgggaaccgc tcgcttagtg gcagtagcgg ggggcgtccc
+      721 taggatagct gcgcaaagcg tggtttatct aatcgtggct tgtgtggaca tgatgctgtt
+      781 caggcgcatc tgtggccgcc acagcattac caagctaatc agaaaccgcg gcatgtcccc
+      841 gcgatgcgag aggcatctgt tagagccaaa gagtggaggt ctgtaatatc gctagcggag
+      901 attttctaag gggcgtggga ctttatcccg atatggctga acgatccaac ggcaaatggt
+      961 tctgccattg aactttaacc atgaatagac tccaggcgag ggataatgga aataatagca
+     1021 ggaaatgaca atctactagg tgcgcactat caagattgta tgtttgcgta tcgtagttct
+     1081 aatggtcttg tgtcccgtat tgggtcggac ggtgctgttc ctgatcgtag caatgcccgg
+     1141 ttagaatcac gcatcggagc gatcatttcg ggcgatacgc gttcgttctg tccactcttg
+     1201 tgggagtccg acgtatgcct gctcggtatt gttttattca ggcgacagta cctcccattc
+     1261 aaatatacag ggttatacta cacaccacga gtaataaaga cttgtgttgt gccaattcct
+     1321 cgtgggactg ccacgctcgt gagcttcgcg gttacatacc cctatgtccc caactgttgg
+     1381 tggcaaatcc ctaatctaat ctattgtatc acagtcggtc aacgactgaa attggggcaa
+     1441 caccaacagt gctcttacga tattcgtctg tgtctaacaa tccaacaaaa agctgttatt
+     1501 atgatggagg atcttggatt gcgtcagtac tacggtgttg tacgagaatt gcatgatgat
+     1561 tcctcgatgt cgagtccttg caagatcgtg atctatagcc aagctgctgc tgtagatcaa
+     1621 cctcaccggg gcgggggtcc cattactatg ggcggcatta gagtaccata gatgaacgcg
+     1681 agcagagaca tgtcaatgta tcccagtcct gcagtactac gtcagtctct gctcctgggg
+     1741 ccaatgcacg cctgtagaat agggccgtgt tcccatgaga aatttgaggg acttacgatt
+     1801 agatggcctt ggcaggggac tccgcgtacg tgtggggatg aaccggcacc ggccttggcc
+     1861 ctgagtaaat gtaagcgata tcaacttcgc tattcatgat cagtggtatt cgtgtaggca
+     1921 ccgaaagtcc cttggcgaaa gtagagacat acgatacgga ccgcaagcga gcagaatttc
+     1981 agcacatgac agttattagc ttttttctaa tggtgctccc attatgattg tcaagtcccg
+     2041 actgctagct gtaggatgaa acacatccac acacgtgtta ccatactgat tttgacacta
+     2101 cttcctaacc gggccgaatg gtatctgctg cgatgcttag ttacgtaaca gccgaatgtc
+     2161 acgccactgc atattgtggt tctggaattc cacctgcata tgtcacgcta gagaccgtat
+     2221 gaggtgggcg gatagtggtg acttcaaacc catatgcagg tgctgca
+''',
+        '''LOCUS       part_L                  2267 bp    ds-DNA  circular UNK 28-OCT-2019
+DEFINITION  .
+ACCESSION   part_L
+VERSION     part_L
+KEYWORDS    "creator:SynthSys Center" "marker:KanR".
+SOURCE      .
+  ORGANISM  .
+            .
+FEATURES             Location/Qualifiers
+     misc_feature    join(2263..2267,1)
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#84b0dc"
+     terminator      2..59
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     CDS             complement(1140..1955)
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#b7e6d7"
+     misc_feature    2206..2209
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#ff0000"
+     misc_feature    2202..2205
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#faac61"
+     terminator      2139..2182
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+     rep_origin      complement(254..842)
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#ffef86"
+     misc_feature    2248..2251
+                     /label="another feature"
+                     /ApEinfo_fwdcolor="#ff0000"
+     misc_feature    2185..2190
+                     /label="yet another feature"
+                     /ApEinfo_fwdcolor="#84b0dc"
+     terminator      1025..1119
+                     /label="feature"
+                     /ApEinfo_fwdcolor="#c6c9d1"
+''',
+        'Metadata1 for part_L', 'Metadata2 for part_L'
+    )
+])
+
+    conn.commit()
+    print("Mock data inserted into 'sample' table.")
+
+    cursor.close()
+    conn.close()
+
+
+if __name__ == "__main__":
+    create_db_and_insert_data()