Using NetBeans IDE to Build Quick UI s Ray Hylock, GISo Tutorial 3/8/2011 We will be building the following application using the NetBeans IDE. It s a simple nucleotide search tool where we have as input a sequence to search, a search sequence, the direction of the input sequence (5 3 Forward or 3 5 Reverse), the maximum percent mismatch, the minimum percent GC content, and whether or not the search sequence indicates transitions. If transitions are allowed, then the search sequence is case sensitive where a lower-case nucleotide indicates the possibility for a transition (i.e., a = A or G, c = C or T, g = A or G, and t = C or T); otherwise case doesn t matter. The input file may or may not be in FASTA format. The output is the matching nucleotide sequence from the input file with an offset to the start position in the input sequence, the percent mismatch, and the percent gc content. We also add three parameter presets to the menu bar.
INSTALLATION STEPS 1. Downloading and installing the latest NetBeans IDE (using 6.9.1 in this demo) a. Go to: http://netbeans.org/downloads/index.html b. Select the version you want and save it somewhere i. This file is an installer on windows so you just delete it after installation (not like Eclipse) ii. I typically just download ALL because I use the Java and C/C++ modules c. Install the file when the download is complete d. Run when installation is complete e. At any point in time, if you wish to run the project, you must first execute Clean and Build then Run i. 6.8 and earlier execute Build with Run, but for some reason, 6.9.1 doesn t CREATING A DESKTOP PROJECT 1. File New Project 2. In the categories section, select Java 3. In the projects section, select Java Desktop Application 4. Next Next Name the project (e.g., GisoDemo) Finish 5. You should now have something that looks like the figure below 6. In package gisodemo, you have the following files
a. GisoDemoAboutBox: This is an about box tied to Help About b. GisoDemoApp: This is where the project is instantiated; do not modify unless you know what you re doing c. GisoDemoView: This is the interface class which provides Source and Design view i. Source: the underlying code for the GUI ii. Design: the drag-and-drop view BUILDING THE EXAMPLE INTERFACE BUILDING THE INPUT 1. To being with our demo, we first want to make sure the palette is open a. If you do not see the Palette window, then Window Palette
2. Before we can continue on, we must first set some code generation variables. a. Click in any part of the white space around the application b. In the Form GisoDemoView Properties panel (below the Palette in the screenshot from part a Windows Properties), (in the following order) i. Uncheck Use Local Variable ii. Set Variable Modifiers Access = Private and 3. First, drag a Swing Panel object into the main panel (the central object) place it in the upper half of pane with full width 4. Next, in the Properties window, click on border and select Titled Border, change the Border option to EtchedBorder, type Input into the Title field and change the color to black
5. Next, we will drag a Swing Label and Combo Box control into the Input pane a. To change the variable name, right-click on the label and select Change variable name enter direction as the new name
6. To change the text for jlabel1, simply double-click it and type Species 7. To change the values in the combo box, click on it and in Properties select model Type in Forward <enter> Reverse 8. Next, we are going to add a series of Label and Spinner objects (Mismatch, GCMin) a. To modify the Spinner elements, select Properties model i. We want to use the Model Type number for both of these ii. Initial Value for Mismatch is 20, minimum is 0 and max is 100, step size 1 iii. Initial Value for GCMin is 70, minimum is 0 and max is 100, step size 1
b. Set the variable names to mismatch and gcminrespectively 9. We need to specify whether or not transitions are allowed (i.e., A G and C T) a. Drag a Check Box control next to max and name it Transitions b. Change the variable name to transitions c. If it is checked then that means allowed else disallowed 10. We need to specify a search sequence via an input field a. Add a Label called Search String and a Text Field with a variable name of search b. Clear the default text by deleting everything in Properties text
11. Next, we are going to add the controls to input a file from the File Choose (multi-step process) a. Drag a Swing Button control to the pane and change its text value (in properties) to Select File b. Next, we will add a Label to the right of the select file where we will eventually display the path to the selected file; set text to empty i. To change the variable name to filename c. Instead of using the File Chooser palette option, we will create an action for the button to call the File Chooser from i. Select Source view private File infile = null; ii. Under the method showaboutbox(), add the following (you may have to add the import to File) @Action public void filechooser(){ JFileChooser chooser = new JFileChooser(""); chooser.setfileselectionmode(jfilechooser.files_only); int returnval = chooser.showopendialog((java.awt.component) null); if (returnval == JFileChooser.APPROVE_OPTION ){ infile = chooser.getselectedfile(); filename.settext(infile.getpath()); iii. Return to the Design menu iv. Double-click the Select File button Action = filechooser 1. This assigns the method filechooser to the button when it is pressed
12. We will round out the input part with a submission button a. Add a Button names Execute b. Add the following code below the filechooser method i. The method execute sets initializes the progress bar ii. The class Task manages the progress bar and calls the runexecute method iii. The runexecute method is where the computation is done (we will be adding to this later) @Action public void execute(){ statusanimationlabel.seticon(busyicons[0]); busyiconindex = 0; busyicontimer.start(); progressbar.setvisible(true); progressbar.setindeterminate(true); jbutton1.setenabled(false); task = new Task(); task.addpropertychangelistener(propertychangelistener); task.execute(); // just like run, different from this execute private void runexecute() throws IOException{ String dir = this.direction.getselecteditem().tostring(); int mm = Integer.parseInt(this.mismatch.getValue().toString()); int gcm = Integer.parseInt(this.gcmin.getValue().toString()); boolean trans = this.transitions.isselected(); String srch = this.search.gettext(); private Task task; class Task extends SwingWorker<Void, Void> { /* * Main task. Executed in background thread. */ @Override public Void doinbackground() throws IOException { runexecute(); return null; /* * Executed in event dispatch thread */ public void done() {
// Beep Toolkit.getDefaultToolkit().beep(); // reset the status bar busyicontimer.stop(); statusanimationlabel.seticon(idleicon); progressbar.setvisible(false); progressbar.setvalue(0); // enable the execute button jbutton1.setenabled(true); /** * Invoked when task's progress property changes. */ public void propertychange(propertychangeevent evt) { if ("progress" == evt.getpropertyname()) { int progress = (Integer) evt.getnewvalue(); progressbar.setindeterminate(false); progressbar.setvisible(false); progressbar.setvalue(progress); PropertyChangeListener propertychangelistener = new PropertyChangeListener() { ; public void propertychange(propertychangeevent propertychangeevent) { String property = propertychangeevent.getpropertyname(); c. Double-click on the button and set the action to execute BUILDING THE OUTPUT 1. Add another Panel below the input and name it Output 2. Drag a Table Control object into that new Output Pane a. Change the variable name to results
3. Go to the source view and add the following line before the execute method (required import of DefaultTableModel) a. The table model controls the jtable content private DefaultTableModel model = new DefaultTableModel(); 4. Let s add a label for the total number in the result set a. Drag a Label between the top of the Table and the Panel b. Set the text to --- c. Change the variable name to resultsize
5. Now we need to write the methods to process the input a. Create a new package called compute with a new method named Compute b. Replace this class with the code provided at the end of this tutorial c. Go back to GisoDemo and enter the source view i. Add the following code the end of the runexecute method results.setautocreaterowsorter(true); model = new DefaultTableModel(); Compute c = new Compute(inFile, dir, trans, mm, gcm, srch, model); results.setmodel(model); this.resultsize.settext(model.getrowcount() + " Results"); 6. We need to assign the new DefaultTableModel to the jtable a. In design view, select the jtable: Properties model Set jtable s model property using = Custom code, jtable1.setmodel = model 7. The last thing we ll cover is the creation of menu items with preset values a. In design view, go to the Inspector window (lower-left) and right-click on menubar Add menu b. Change the variable name to presetmenu and set the text to Presets c. Drag it to the second position d. Right-click on presetmenu in the Inspector and add three menu items (Add From Palette Menu Item) i. Change the variable name to notrans and set the text to No Trans ii. Change the variable name to trans and set the text to Trans
iii. Change the variable name to reverse and set the text to Reverse e. We need to add the actions to the source (we still have to add the file from the GUI) @Action public void notrans(){ this.direction.setselectedindex(0); this.mismatch.setvalue(25); this.gcmin.setvalue(25); this.transitions.setselected(false); this.search.settext("atgaag"); @Action public void trans(){ this.direction.setselectedindex(0); this.mismatch.setvalue(25); this.gcmin.setvalue(25); this.transitions.setselected(true); this.search.settext("atgaag"); @Action public void reverse(){ this.direction.setselectedindex(1); this.mismatch.setvalue(25); this.gcmin.setvalue(25); this.transitions.setselected(true); this.search.settext("atgaag"); f. Back in the Design view, click on Presets in the menu bar and add the appropriate action to each of the menu items 8. That s it! Clean and Build then Run (a sequence file is also provided in this document) 9. Additionally, to change the application title and About box, go to gisodemo.resources and edit GisoDemoAboutBox.properties and GisoDemoApp.properties
COMPUTE.java package compute; import java.io.bufferedreader; import java.io.file; import java.io.filereader; import java.io.ioexception; import javax.swing.table.defaulttablemodel; /** * * @author Ray */ public class Compute { StringBuilder sequence = null; boolean transitions = false; int mismatch = 0; int gcmin = 0; String search = null; String direction = null; DefaultTableModel model = null; public Compute(File f, String direction, boolean transitions, int mismatch, int gcmin, String search, DefaultTableModel model) throws IOException{ this.direction = direction; this.transitions = transitions; this.mismatch = mismatch; this.gcmin = gcmin; this.search = search; this.model = model; this.sequence = new StringBuilder(); FileReader fr = new FileReader(f); BufferedReader br = new BufferedReader(fr); String s; String seqheader = "", accession = ""; while((s = br.readline())!= null) { if(s.charat(0) == '>'){ seqheader = s; // 0=gi, 1=gi-number, 2=from datasource, 3=accession, 4=locus String[] t = s.split(" "); accession = t[3]; else { sequence.append(s.touppercase()); fr.close(); if(direction.equalsignorecase("reverse")){ StringBuilder t = new StringBuilder(); for(int i=this.sequence.length()-1; i>=0; i--){ t.append(this.sequence.charat(i)); this.sequence.delete(0, this.sequence.length()); this.sequence = t; model.addcolumn("match"); model.addcolumn("offset"); model.addcolumn("mismatch%"); model.addcolumn("gc%");
this.compute(false); private void compute(boolean sortkey) { // iterate over the sequence boolean loop = true; int pos = 0; while (loop) { boolean match = false; String v = sequence.substring(pos, pos + search.length()); if(transitions){ this.trans(v, search, pos); else { this.exact(v, search.touppercase(), pos); if (sequence.length() - search.length() == pos) { loop = false; pos++; private void exact(string v, String seq, int offset) { double mis = 0.0d; double gc = 0.0d; boolean match = false; StringBuilder s = new StringBuilder(); // compare each nucleotide for (int i = 0; i < v.length(); i++) { char n = seq.charat(i); // the search sequence char t = v.charat(i); s.append(t); if(t == 'C' t == 'G'){ gc += 100/v.length(); if(n!= t){ mis += 100/v.length(); if (i + 1 == v.length()) { if(mis <= this.mismatch && gc >= this.gcmin){ match = true; if(match){ Object[] newrow = {s.tostring(), offset, mis, gc; model.addrow(newrow); private void trans(string v, String seq, int offset) { double mis = 0.0d; double gc = 0.0d; int length = v.length(); boolean match = false; StringBuilder s = new StringBuilder(); // compare each nucleotide
for (int i = 0; i < length; i++) { char n = seq.charat(i); // the search sequence char t = v.charat(i); s.append(t); if(t == 'C' t == 'G'){ gc += 100/length; if(n == 'A' n == 'C' n == 'G' n == 'T'){ if(n!= t){ mis += 100/length; else if(n == 'a' n == 'g'){ if(t == 'C' t == 'T'){ mis += 100/length; else if(n == 'c' n == 't'){ if(t == 'A' t == 'G'){ mis += 100/length; if (i + 1 == v.length()) { if(mis <= this.mismatch && gc >= this.gcmin){ match = true; if(match){ Object[] newrow = {s.tostring(), offset, mis, gc; model.addrow(newrow);
SAMPLE SEQUENCE >gi gi-number from accession locus ATGACCGACCTCTTGAGAAGTGTTGTCACCGTAATTGATGTTTTCTACAA ATACACCAAGCAAGATGGGGAGTGTGGCACACTGAGCAAGGGTGAACTAA AGGAACTTCTGGAGAAAGAGCTTCATCCAGTTCTGAAGAACCCAGATGAT CCAGACACAGTGGATGTCATCATGCATATGCTGGATCGAGATCATGACAG AAGATTGGACTTTACTGAGTTTCTTTTGATGATATTCAAGCTGACTATGG CCTGCAACAAGGTCCTCAGCAAAGAATACTGCAAAGCTTCAGGGTCAAAG AAGCATAGGCGTGGTCACCGACACCAAGAAGAAGAAAGTGAAACAGAAGA GGATGAAGAGGATACACCAGGACATAAATCAGGTTACAGACATTCAAGTT GGAGTGAGGGAGAGGAGCATGGATATAGTTCTGGGCACTCAAGGGGAACT GTGAAATGTAGACATGGGTCCAACTCCAGGAGGCTAGGAAGACAAGGTAA TTTATCCAGCTCTGGGAACCAAGAGGGATCTCAGAAAAGATACCACAGGT CCAGCTGTGGTCATTCATGGAGTGGTGGCAAAGACAGACATGGTTCCAGC TCTGTAGAACTGAGAGAAAGAATAAACAAGTCACACATTAGCCCTTCTAG GGAATCTGGGGAGGAGTATGAATCTGGATCTGGATCAAACAGTTGGGAAA GGAAAGGTCATGGTGGTCTGTCATGTGGATTGGAGACTAGTGGGCATGAA TCAAACTCTACTCAGTCAAGAATTAGAGAACAAAAGCTTGGGTCTAGCTG TTCAGGTTCAGGAGACAGTGGGAGGCGAAGTCATGCATGTGGTTATAGCA ATTCAAGTGGGTGTGGAAGGCCACAAAATGCTTCAAGTTCTTGTCAGTCA CATAGATTTGGAGGGCAAGGAAATCAATTTAGCTATATTCAGTCAGGCTG TCAGTCAGGAATTAAGGGAGGACAAGGCCATGGCTGTGTCTCAGGAGGTC AGCCCTCTGGATGTGGTCAACCTGAGTCTAACCCCTGTAGTCAGTCCTAT AGTCAGAGAGGATATGGAGCTAGAGAAAATGGTCAACCACAGAACTGTGG AGGACAATGGAGAACAGGCTCAAGTCAGTCCTCTTGCTGTGGACAATATG GGTCTGGAGGTAGCCAGTCTTGTAGTAATGGTCAACATGAATATGGTTCC TGTGGCCGCTTTTCAAACTCTTCTAGTTCAAATGAATTTTCCAAATGTGA TCAATATGGGTCTGGTTCAAGTCAGTCTACTAGCTTTGAACAACATGGAA CAGGCTTGAGTCAGTCCTCTGGGTTCGAACAACATGTATGTGGCTCAGGT CAAACTTGTGGCCAGCATGAGTCTACATCAAGTCAATCCTTGGGCTATGA CCAGCATGGGTCTAGCTCAGGTAAGACATCTGGCTTTGGACAACATGGGT CTGGCTCAGGTCAGTCCTCTGGCTTTGGACAATGTGGGTCAGGCTCAGGT CAGTCCTCTGGCTTTGGACAGCATGGGTCTGTCTCAGGACAATCCTCTGG TTTTGGACAGCATGGGTCTGTCTCAGGACAATCCTCTGGTTTTGGACAAC ATGAGTCTAGATCACGTCAGTCTAGCTATGGCCAACATGGTTCTGGCTCA AGTCAATCATCTGGCTATGGCCAATATGGGTCTAGAGAGACATCTGGCTT TGGACAACATGGGTTGGGCTCAGGTCAATCCACTGGCTTTGGCCAATATG GATCGGGCTCAGGTCAGTCCTCTGGCTTTGGACAACATGGGTCTGGCTCA GGACAATCCTCTGGCTTTGGACAACATGAGTCTAGATCAGGTCAGTCTAG TTATGGCCAACACAGTTCTGGCTCAAGTCAGTCATCTGGCTATGGCCAAC ATGGGTCTAGACAGACATCTGGCTTTGGACAACATGGGTCAGGCTCAAGT CAATCCACTGGCTTTGGCCAATATGGATCAGGCTCAGGTCAGTCCTCTGG CTTTGGACAACATGTTTCTGGCTCAGGACAATCCTCTGGTTTTGGACAAC ATGAGTCTAGATCAGGTCATTCTAGCTATGGCCAACATGGTTTTGGCTCA AGTCAATCATCTGGCTATGGTCAACATGGGTCAAGTTCAGGACAGACATC TGGATTTGGACAACACGAGTTAAGCTCAGGTCAGTCTTCCAGCTTTGGCC AACATGGATCAGGCTCAGGTCAGTCCTCTGGCTTTGGACAACATGGGTCT GGCTCAGGACAATCCTCTGGCTTTGGACAACATGAGTCTAGATCAGGTCA GTCTAGCTATGGCCAACACAGTTCTGGCTCAAGTCAGTCATCTGGCTATG GCCAACATGGGTCTAGACAGACATCTGGCTTTGGACAACATGGGTCAGGC TCAAGTCAATCCACTGGCTTTGGCCAATATGGATCAGGCTCAGGTCAGTC CGCTGGCTTTGGACAACATGGGTCTGGCTCAGGACAATCCTCTGGCTTTG GACAGCATGAGTCTAGATCACATCAGTCCAGCTATGGCCAACATGGTTCT GGCTCAAGTCAATCATCTGGCTATGGTCAACATGGGTCAAGTTCGGGACA GACATCTGGCTTTGGACAACACAGGTCAAGCTCAGGTCAATACTCTGGCT TTGGACAACATGGATCAGGCTCAGGTCAGTCCAGTGGCTTTGGACAACAT GGGACTGGCTCAGGACAATACTCTGGTTTTGGACAACATGAGTCTAGATC
ACATCAGTCTAGCTATGGCCAACATGGTTCTGGCTCAAGTCAGTCATCTG GCTATGGTCAACATGGGTCAAGTTCAGGACAGACTTTTGGATTTGGACAA CACAGGTCAGGCTCAGGTCAATCCTCTGGCTTTGGCCAACATGGATCAGG CTCAGGTCAGTCCTCTGGCTTTGGACAACATGAGTCAGGCTCAGGAAAAT CCTCTGGCTTTGGACAGCATGAGTCTAGATCAAGTCAGTCTAATTATGGC CAACATGGTTCTGGCTCAAGTCAGTCATCTGGCTATGGTCAACATGGGTC TAGTTCAGGACAGACAACTGGCTTTGGACAACACAGGTCAAGCTCAGGCC AATACTCAGGCTTTGGACAACATGGATCAGGCTCAGATCAGTCCTCTGGC TTTGGACAACATGGGACTGGTTCAGGACAATCCTCTGGTTTTGGACAATA TGAGTCTAGATCACGTCAGTCTAGCTATGGCCAACATGGTTCTGGCTCAA GTCAATCATCTGGCTATGGTCAACATGGGTCAAATTCAGGACAGACATCT GGATTTGGACAACACAGGCCAGGCTCAGGTCAGTCCTCTGGCTTTGGCCA ATATGGATCGGGCTCAGGTCAGTCTTCTGGCTTTGGACAACATGGGTCAG GCACAGGTAAATCCTCTGGCTTTGCACAGCATGAGTACAGATCAGGTCAG TCTAGCTATGGCCAACATGGTACTGGCTCCAGTCAATCATCTGGCTGTGG CCAACATGAGTCTGGCTCAGGTCCAACCACAAGTTTTGGACAGCATGTGT CTGGCTCAGACAATTTCTCTAGTTCTGGACAACATATATCTGACTCAGGT CAGTCCACTGGATTTGGCCAATATGGTTCAGGCTCAGGTCAATCAACTGG CTTGGGCCAGGGTGAATCTCAACAAGTAGAGTCAGGATCCACAGTTCATG GGAGACAGGAAACTACTCATGGTCAGACAATAAATACCACTAGACATAGC CAGTCTGGTCAAGGACAATCCACACAGACAGGGTCCAGGGTAACTAGAAG ACGAAGATCTAGCCAAAGTGAGAACAGTGACAGTGAAGTGCACTCAAAGG TCTCACACAGACATTCAGAACACATTCACACACAAGCTGGATCTCACTAC CCAAAGTCAGGATCCACAGTTCGCAGAAGACAAGGAACTACTCATGGACA GAGAGGAGATACCACTAGACATGGCCATTCTGGTCATGGACAGTCTACAC AGACAGGTTCCAGAACATCTGGAAGACAGAGATTTAGCCACAGTGATGCC ACTGACAGTGAAGTGCACTCAGGGGTCTCACATAGACCACACTCACAAGA ACAAACTCACAGCCAAGCTGGATCTCAACATGGAGAGTCAGAATCCACAG TTCATGAGAGACATGAAACTACTTATGGACAGACAGGAGAGGCCACTGGA CATGGCCACTCTGGTCATGGACAGTCCACACAGAGAGGGTCCAGGACAAC TGGAAGAAGGGGATCTGGCCATAGTGAGTCCAGTGACAGTGAAGTGCACT CAGGGGGCTCACACAGACCACAATCACAAGAACAAACTCATGGCCAAGCC GGATCTCAACATGGAGAGTCAGGATCCACAGTTCATGGGAGACACGGAAC TACTCATGGACAGACAGGAGATACCACTAGACATGCCCACTATCATCATG GAAAATCCACACAGAGAGGGTCCAGTACAACTGGAAGAAGGGGATCTGGC CACAGTGAGTCCAGTGACAGTGAAGTGCACTCAGGGGGCTCGCACACACA TTCAGGACACACTCACGGCCAAAGTGGATCTCAACATGGAGAGTCAGAAT CCATAATTCATGACAGACACAGAATTACTCATGGACAGACAGGAGATACC ACTAGACATTCCTACTCTGGTCATGAACAAACCACACAGACAGGGTCCAG GACAACTGGAAGACAGAGAACTAGCCACAGTGAGTCCACTGACAGTGAAG TGCACTCAGGGGGCTCACACAGACCACACTCACGAGAACACACTTACGGC CAAGCCGGATCTCAACATGAAGAGCCAGAATTCACAGTTCATGAGAGACA CGGAACTACTCATGGACAGATAGGAGATACCACTGGACATTCCCACTCTG GTCATGGACAGTCCACACAGAGAGGGTCCAGGACAACTGGAAGACAGAGA TCTAGCCACAGTGAGTCCAGTGACAGTGAAGTGCACTCAGGGGTCTCACA CACACATACAGGACACACTCATGGTCAAGCTGGATCTCAACATGGACAGT CAGAATCCATAGTTCCTGAGAGACATGGAACTACTCATGGACAGACAGGA GATACCACTAGACATGCCCACTATCATCATGGATTAACCACACAGACAGG GTCCAGGACTACTGGAAGAAGGGGATCTGGCCACAGTGAGTACAGTGACA GTGAAGGGTACTCAGGAGTCTCACATACACATTCAGGACACACTCATGGC CAAGCCAGATCTCAACATGGAGAGTCAGAATCCATAGTTCATGAGAGACA TGGAACTATACATGGACAGACAGGCGATACCACCAGACATGCCCACTCTG GTCATGGACAGTCCACACAGACAGGGTCCAGGACCACTGGAAGAAGGTCA TCTGGCCACAGTGAGTACAGTGACAGTGAAGGGCACTCAGGGTTCTCACA AAGACCACACTCACGAGGACACACTCACGGCCAGGCTGGATCTCAACATG GAGAGTCAGAATCCATAGTTGACGAGAGACATGGAACTACTCATGGACAG ACAGGAGATACCAGTGGACATTCTCAATCTGGTCATGGACAGTCCACACA
GTCAGGATCCAGTACAACTGGAAGAAGGAGATCTGGCCACAGTGAGTCCA GTGACAGTGAAGTGCACTCAGGGGGCTCACATACACATTCAGGACACACA CACAGCCAAGCCAGGTCTCAACATGGAGAGTCAGAATCCACAGTTCACAA GAGACACCAAACTACTCATGGACAGACAGGAGATACCACTGAACATGGCC ACCCTAGTCATGGACAAACCATACAGACAGGGTCCAGGACAACTGGAAGA AGGGGATCTGGCCACAGTGAGTACAGTGACAGTGAAGGGCCCTCAGGGGT CTCACACACACATTCAGGACACACTCACGGTCAAGCTGGATCTCACTATC CAGAGTCAGGATCCTCAGTTCATGAGAGACACGGAACTACTCATGGACAA ACAGCAGATACCACTAGACATGGCCACTCTGGTCATGGACAGTCCACACA GAGAGGGTCCAGGACAACTGGAAGAAGGGCATCTGGCCACAGTGAGTACA GTGACAGTGAAGGGCACTCAGGGGTCTCACACACACATTCAGGACACGCT CATGGCCAAGCCGGATCTCAACATGGAGAGTCAGGATCCTCAGTTCATGA GAGACACGGAACTACTCATGGACAGACAGGAGATACCACTAGACATGCTC ACTCTGGTCATGGACAGTCCACACAGAGAGGGTCAAGGACAGCTGGAAGA AGGGGATCTGGCCACAGTGAGTCCAGTGACAGTGAAGTGCACTCAGGGGT CTCACACACACATTCAGGACACACTTATGGCCAAGCCAGATCTCAACATG GAGAGTCAGGATCTGCCATTCACGGGAGACAGGGAACTATACATGGACAG ACAGGAGATACCACTAGACATGGCCAGTCTGGTCATGGACAGTCCACACA GACAGGTTCCAGGACAACTGGAAGACAAAGATCTAGTCACAGTGAGTCCA GTGATAGTGAAGTGCACTCAGAGGCCTCACCCACACATTCAGGACACACT CACAGCCAAGCCGGATCTCGACATGGACAGTCAGGATCCTCAGGTCATGG GAGACAGGGAACTACTCATGGACAGACAGGAGATACCACTAGACATGCCC ACTATGGTTATGGACAATCCACACAGAGAGGGTCCAGGACAACTGGAAGA AGGGGATCTGGCCACAGTGAGTCCAGTGACAGTGAAGTGCACTCATGGGG CTCACACACACATTCAGGACACATTCAGGGCCAAGCTGGATCTCAACAAA GACAGCCAGGATCCACAGTTCATGGGAGACTGGAAACTACTCATGGACAG ACAGGAGATACCACTAGACATGGCCATTCTGGTTATGGACAATCCACACA GACAGGTTCCAGATCTAGTAGAGCAAGTCATTTTCAGTCACATAGTAGTG AAAGGCAAAGGCATGGATCAAGTCAGGTTTGGAAACATGGCAGCTATGGA CCTGCAGAATATGACTATGGGCACACTGGGTATGGGCCTTCTGGTGGCAG CAGAAAAAGCATCAGTAATTCTCACCTTTCATGGTCAACAGACAGCACTG CAAACAAGCAACTGTCTAGACATTGA