changeset 0:decd5688d719 draft

planemo upload for repository https://github.com/jvolkening/galaxy-tools/tree/master/tools/nanonet commit bf5788ad5a3293446a50a3246b44ba09174c9b71
author jdv
date Wed, 30 Aug 2017 02:53:02 -0400
parents
children 57447db0ec78
files nanonet_1D.py nanonet_1D.xml test-data/test_data.fast5.tar.gz test-data/test_data.fastq
diffstat 4 files changed, 162 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nanonet_1D.py	Wed Aug 30 02:53:02 2017 -0400
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+
+import sys, os
+import glob
+import tarfile
+import subprocess
+import shutil
+import h5py
+import numpy as np
+
+def main():
+    tar_file = sys.argv[1]
+    out_file = sys.argv[2]
+    threads  = sys.argv[3]
+
+    extract_fast5(tar_file)
+
+    subprocess.call(["nanonetcall",
+        "--jobs", threads,
+        "--fastq",
+        "--output", out_file,
+        "in_dir" ])
+
+def extract_fast5(fn):
+
+    try:
+        in_dir = "in_dir"
+        if not os.path.exists(in_dir):
+            os.makedirs(in_dir)
+
+        tar = tarfile.open(fn, mode='r')
+        tar.extractall(path=in_dir)
+
+        files = glob.glob(
+            os.path.join(in_dir, "**", "*.fast5"),
+            recursive=True
+        )
+        if len(files) < 1:
+            raise ValueError('No FAST5 files found')
+        for f in files:
+            shutil.copy(f, in_dir)
+
+    except OSError as e:
+        print("Unexpected error:", e.strerror)
+        raise
+
+    except:
+        print("Unexpected error:", sys.exc_info()[0])
+        raise
+
+if __name__ == "__main__" :
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nanonet_1D.xml	Wed Aug 30 02:53:02 2017 -0400
@@ -0,0 +1,86 @@
+<tool id="nanonet_1D" name="Nanonet 1D" version="2.0.0">
+
+    <description>ONT development basecaller</description>
+
+    <!-- ***************************************************************** -->
+   
+    <!--
+    <requirements>
+        <requirement type="package" version="2.0.0">nanonet</requirement>
+    </requirements>
+    -->
+
+    <!-- ***************************************************************** -->
+
+    <version_command>echo "2.0.0"</version_command>
+
+    <!-- ***************************************************************** -->
+
+    <command detect_errors="aggressive">
+    <![CDATA[
+
+    python3 $__tool_directory__/nanonet_1D.py $input $output \${GALAXY_SLOTS:-1}
+
+    ]]>
+    </command>
+
+    <!-- ***************************************************************** -->
+
+    <inputs>
+
+        <param name="input" type="data" format="fast5_archive" label="Input reads" />
+
+    </inputs>
+
+    <!-- ***************************************************************** -->
+
+    <outputs>
+
+        <data name="output" format="fastq" label="${tool.name} on ${on_string} (called.fastq)" />
+
+    </outputs>
+
+    <!-- ***************************************************************** -->
+
+    <tests>
+        <!-- multithreaded output is non-deterministic, so simply compare file
+        sizes -->
+        <test>
+            <param name="input" value="test_data.fast5.tar.gz" ftype="fast5_archive" />
+            <output name="output" file="test_data.fastq" compare="sim_size" delta="0" />
+        </test>
+    </tests>
+
+    <!-- ***************************************************************** -->
+
+    <help>
+    <![CDATA[
+
+**Description**
+
+Nanonet provides recurrent neural network basecalling for Oxford Nanopore
+MinION data. It represents the first generation of such a basecaller from
+Oxford Nanopore Technologies, and is provided as a technology demonstrator.
+Nanonet is provided unsupported by Oxford Nanopore Technologies, see
+LICENSE.md for more information.
+
+For training networks, Nanonet leverages currennt to run recurrent neural
+networks. Currennt is generally run with GPUs to aid performance but can be
+run in a CPU only environment. The basecaller does not require currennt, and
+is written in pure python with minimal requirements.
+
+The Galaxy wrapper has modified nanonet to take a gzip tarball of FAST5 reads
+as input, such as can be produced by `poretools combine`, and always outputs a
+single FASTQ file.
+
+This is the 1D basecaller.
+
+    ]]>
+    </help>
+
+    <!-- ***************************************************************** -->
+    
+    <citations>
+    </citations>
+
+</tool>
Binary file test-data/test_data.fast5.tar.gz has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/test_data.fastq	Wed Aug 30 02:53:02 2017 -0400
@@ -0,0 +1,24 @@
+@macs_MacBook_local_20170809_FAH11850_MN21227_sequencing_run_AIV_run_1_84332_read_12091_ch_399_strand
+TCAACTACAGGGCTGGGAGAATGCAGCAGTGCAGGAGGCTGCTGAGGAGGCAGAAGCGGAGGCAAGCACTCAGAACAGCAGCAATCAGGCTGGGGCAGGCTGCTCAGCTCGCCAGGCGGTGCAGGCGGGAAGCTGAGTAAATGCTGGGGGCTCAAACTCGCTGGAATCAGAATGGGGAGGCATCCTCAGTCTCAGCCAAGGCATATAGCAGGGAAGCTGGGGCTCAGGCTCAGGCAGTCAGGGAGGCACGTCAAGGCAGCCAGGGCTGAGGCTCTGCTGGGGCTGGGAAGCAAGGCTCAGGCATAATCACTTCAGAGAATCTCAGGGAGGTCAGATGGCTCAAGCAGGCTGGGAAACGGCGGGGCTCCGCCCAGCAAGAATGGGTGGGGCAGTGGCCGGGCAGAGGCATCTTGAGGCTGGTCAGTGGGGCTCAGGGCGCAGCTCACTCAGGAAACTGCAGAGGGCTCAGGAGAAACACAGGCATGCTGGGGGCTGGGGCGCTGAAATGAGGGTCAAAGTGCAGGCTCAGTCTCATGGGGGCTCAGAAATGATCTTTTGGGGCTAGGAATCCTGCCTCGAGGCTCAGAGGCTGAGGAGGCGGGAAGCAGAGTGAGGGCGCTCACTCAGGAAGCAGAAGCAGGAAATGAGGGGGCAATCAGGGCCGAGAACTGAGAAACAGGCAGTAGAGGGGTGCGGCGCGGTCAAGGCAGAGGCAGAGCAGGCTGGGAATCAGGCAGCAGGCTCGCGGCTGCTCAAGCAGGGGCAAGGCAAGGCTCAGGCTCAAAATAGAAACACGCTTTT
++
+%$%$$%#$$*'$#$#')$&##$###"##$"#%$%&#'%$#&&#$#'&#%&#$&##$#%%#$$#%&&&$$#$#$##$##$$%%$#$%#%%%&$)'###''$$#%$$#%'&%"#$$'($%%$%%$'$#$&'%$#$$$$%#$%$$$$%%%&&###$%%&&#$$$$%'$(%%&$$##$'*&#&&$"$$$#%##$%%%$%#$((&*'%$######$%%$%###&('&##%$(&"##$'&$#%$$"&()$#$%%&$&$$#)$#$#$%%),'$###$'&%$###$$%)%##%''###%$$%&$$#$#"$######"#$$$%$$&$%#$%&$(/*%'%###&#$#$$$'&$$###&&$$&%$$%&%'$'''%$#$%$$$#$"###%#$##$&$%(+(%$%#"##$%**&#&$%(&##$"#$#'&##$$#""&"$$&%$#%%&%%$$%$$%$$#%%'#%'$$##$"$#%"('$$$'$()%&%%$&$%$#$$$%"###&+)($%'%'''%$$"#%%#%#)'$##$$%#####&'"$##%#$%%%$$(*+*')(&$%%$####$###$%'%##$$%&##$$$##$##"$#&%&%%#&#&%#$##%&%''#%''&%$$#%"&#'$)))%$$#&#$$%$&%$#%$&'%$%%#'''&&$%$())%$#%$%&$'&$&&$#'###$$#$$$###)*$$$#$$#&(+'$%%%'%&&%($$&&%&$#'$(&&$%$&%%'(&%&)'%%&&###%"$$#$#%$%#$$%%$$$$$#$###(('%##$'%$"####$#%$###$#%&%#'$%&%%#&#####"
+@macs_MacBook_local_20170809_FAH11850_MN21227_sequencing_run_AIV_run_1_84332_read_12153_ch_399_strand
+TAGAACTGGGTCACTCCAGCCTCAGGCGGGGGCTGGAGGGGCGGGAATCCTGACCTCAAGTGATCTCAGGCAGCTAAATCCCAGCTAGAGGCTCAAGGTGCTCAGGGCTCAAGCTGCAGGGCTCAGAATCAAGAGTGGCTCAGGAGGTGGGCTGCAAGAACCTTCCTTCCCGGCTGTGGCTGCTCCGCCTCCCAAGTAAGCGTGGCTGCGCTCCCTCCGCCGCTGGGGGCTGCAGTGTCAGTGCTGGGAGTGGGATGCACTCGCTGGGAGTGGAGGCACTCCTCATCCCAGGCTGTGATGGGGCACGAAATCGGCGTGGCTGGGCGCGGGAGTGGGGGTCCCGCTGCCTAAGCAGCCAGCTGCGTAGCTATCAGTGGCGGTGCAGTGCAAAATAAGGCTGGCTCTCAGGGAGTCACTGAGGAGCTCAGGCATCAAATCTCAGGCTGGCGCTGCTCAAAGCTGGTGGCACAGAGCGCAGCACTTCAGCTCAAGTCAGAATCCCA
++
+"%%$#$$#%%$$"#$&(##%#$&%'($&'''&$$(($$%*'%%)(&$$$#"""&'$%('%"&###$(%&''$%%$#%$$#%%$$###$#&$"##%'('%$%$$"*($"##''#$$#$#%&%$$%$%$$###'%$$##$#$#"&(#%$#$$$#$$%&('$$%##$%%$$&$##%##$$$$##"$%$%$%%$&%%####$&&&$##'&$$&#$$('&##&#%&#$#$)-*$$##$#$$#$$$$##$$#'&#%%&)&$##$#%%'#$#$&)###&($(&%#%%&&%$##$$$$$$$#$"&$$%(&%$#$$#$%$&#'&'&%%$#&%#%#$$(*$&%''((#$$&%"$##$$$###$%#$$#"#&&%#$##%$#$$$""$$#%(#%$"&"###%#"#$$'&$#""#$$#$#%&&#$$$"##$#()$&&$$#$$$#$$$%#$$#$"%(%#%&%#$#####$&%##"$####%%&%#%%$#$%$$#$#%#""##%%#&###$$$###%%
+@macs_MacBook_local_20170809_FAH11850_MN21227_sequencing_run_AIV_run_1_84332_read_12081_ch_399_strand
+CAGCACGCTCAGGCTGCATGTCGCCTGCAGCAGCACTCAGCTGCAGAGGCTGGGGAGGCAGCTTCCCAGGCAGCTCAGAGAGGCGCTGCTCGAAGCAGGCTGCAGGCTCAGCAGCTCAGCTCAAGCCTGCAGTGGCTCCGCAACAGCACTTCCCAAAATCAGCTGCTACAGGCTTACTGCTCAGGCAACAAAGCAGCTGCTGCTGGGGAAGCAGGAGGCCCTCACATCTGCAAGCAGCACCTGCTCACAAAACTGAGGGAAATGCCCATAGCAAAGAACTCTAGAGGCTCAGGCTGGCAGGCAGCGCTGCATACGGCAAAGCAGGAGGCTGGGGAAGGCAGGCCGCTGGCTTCAAGTGTACCTCAGAGAGCAGAGGCTGCTGGCTGGCTGCTTCCAGCTGAAATGAGGCTGCAGCTCAGCTGCAGGCTCAGGAAGCTTTCAGGAACGCTCACTGGGACAAGGGAACGCACATAAAATAAATAAAGAGCTCAAGCCATAAGAAACACATGAAATAAGAAATGGCAGAGAAATAGAGGAAATAAAGGCATAATGAGATATAAGATAAAGCACATGGCAGAAATGGCTGATAAAACGAAAGCAATAACACTCAAGGGAGGCTGATAAAGTGAGGCAAGAAATAGAAATGGCTAAAATAAATCAGGCAAAGAAATATGAAACTCGGCGTGGCAGAATCATCCGCACTCGCAGCTCAGAGGCTCAAGGGGCTCCAGCTGGCATGGCAGCAGCTCAGCAAGCAGTGAGGCTGGGCGGCAGCAGCACAAAGCGCGAGAGTGGCTCAGAGGCAAAGCAAGCGAGGCTGGGAATGTCAGGCTCAGGGGCCGCGCGCTCGGGGTGGGGGCTGCAGAGCAAAGGCCACTGCACAAATGCATGGGGCAGCAAAGGCCTCAGCTGGGCAGAGGCCATGGCTGAGGCGCGGCTGCTTCAAGCTCTCGCAAGCACTGGAAGCAGGCTCCTCGCTCACTGGCGCGGGGTGCGCCAGCGGGGCTCGCTGCACAGGGCTCGCTCCGCCACAGGCGTCGGCTCTGTGGCGTGCTGGGGCTCGCTGGCTCGGCGCAGCAGGCTGGGGCAGGGGCTCGCTCAGGC
++
+$"#$$&$&$$$&%$%#&$%$%%#$##"#%"$##$"%#$#$$$##$&$&)%$&%*(%&&##"$$%$%##$#"$####$$$%$'%%###"##$#$$#$#$%##$$#'%$&$&"#%###$#"##&&)#$###$$$#"""#$&#%%$%&#$####%%%$%&%%&"##%&&%#$#%$##%$$##$$&&#$#####%%#%$#$#####$$$'('%%#$#')$&$$$&$$#$#$$$%%'&$$$#$$%$#"###$$#$$#%$'$((&(*&$"$%$#%#%%&'%%$$&))&&%%$%&$&&$$$###$%$&%%%&$$$"%#%#%$%$#%&$$#(&$$%""&%''$$&&$"$$$&$$$&%$#$$$$####"%%$'%%$%#'%$%$('%$$$#%%$#$$$##$$#$$%$%$$#$"###%%$#####$#&$###"$###"#$&%%####"#$%#$&$#$$###$$#&&$$$%&'(%%&$#%(%'$&%$&"%%&#&$##%##$#$$#$#$#$%#%$$####"###$$$%$$%$##$#%&$$&'%#'$%&%&%$"$$$###$#$%$#$$#$$$#$%##&'&#$$%$""###%$%%$#$####$$$$$#$$%$"#"%####$###%)(+&%&$$#$%%%%%%"%#&$"%(#'&$%##$%#"###$&%%%$(''&&%%($$$&%%$##$#$%(&$##$$"$"###$$$$"#%#$#"##$#$$$#$$#'&*#'%##%&&')&#$$%&###"$$##$$%&####$$$$$$$#""$"$"%#,*%#$%&#$%####"#$"$$%$$##$&#(#%#$$$%%&&#%%"$$##$$$$#%$('$$'(&%$#"###%&####$%$$&&$$$%#$$$#$$$##$&%$###$#%#$%&'&%)&%"$$"&"#####$%##%''%$#$&%%$$$$$#$#%%$%$$$%#$''$$""$###%"'&#$"%'$%#%%%$$$$"#$###$$$#$"%#$'$%###%$$#%&$%#%$%#$"%&$$$&'(&#%%#$$#$$%$$$%%%$$"#$$&#'(%$#%#$#$&#%%"$#$%#%#$#$#$%$$"#$$##$$##%&$#$%"$####$$$$"#%$%%#&&#$$%%$$#&)'&%%%"$$##"$"
+@macs_MacBook_local_20170809_FAH11850_MN21227_sequencing_run_AIV_run_1_84332_read_12113_ch_399_strand
+CAGGTGGGAACTGAGGAATCAGGCAGGCGCTGAGGCAGGCAGAAACTTCAGGGAGGCTGCACATCTCAATGAGGGAACCGCTCTCAGCTCTTCAGGCTCAATCCCGGGAGCTCAAGAGGCATGTTCAAGGCTGGCTCTCAGCTGTTCCTTTCAGAAATCCCAGTGGCTTGGAATAAAACAGCTCAGCTTCCAGAGCAGCAGCAGGCTGCCAAGCAGGCAAGGTGGAGGTGGCATGTGGGCAGTGTGGGGCTGGGAGGCTCAGGGCTTCCTTCACAGCAAGTCGCTCAAAGTCATAAATGGGGCTGCAGTCCCTTCCGGCGTGCTCAATCAGGCTGCTCAGGAGGCGTGAGGCTGCAGCTCCTTCCCAGCTGCAGGGAGTGAGGCAGGCTGGGGTGCAGGCTCAGAATAAAGCTGGGAGTCAGCAGAGCCAGCAGGTGGCTGCTAAGTAGCTCGCTCAGTGGCTCCTGCGGGGGCGCAAACTGCACTCAGGGTCAGGCGTAGAGCCGAGGCTCCATCAGGCTGCTTCATCAATCATCAGAACAAATGCTCAAGCAGGCGGGGCGGAGGCGGCTCAGGTGGGGCTGCCAGGTGGCTCAGGGTCCTTCCTCCTCAGGAATCAAGCTCATCGCTGCGCGGGAAAGCTCACAGGCTCAAGGGCTGCCGGGAATCGCTGTGGCAGCTGCACTCAGGGCTCACTCAAGGCAGGCTGAAATCCGGGGGCGTCTCAGTCTGCTCCAAGTGGGCAGAAATGCTGAGGCTGGCTCAGAAACTCAGCGCGTGTCAGGAAACTCAAAGTCATGTTGTAAAGCTCCTGCAACAA
++
+'&$%$%'&$#$#&$+(%&##$$###$%%%%$%#&$$%'###%$%$$$&&$**&#$%"#$$#$##%#$#####%&)#%%%$&%$$$$%&%%#%$$&$##"$$&''&$&%%$%##$%&$$####"""#$%&$$##"##%%&##$##%%$#"###$#'(#''%$#%$&&&$%%%%$%%&%$#"#&%&#"#%$&&#$&%&#######""$$%%%%'$$$$###"'(#'+&''$%#$$$$##&%####$#$&($"#%()#%&$$%%'(%$$%&$###"%&%()&$$%##$&&&$%#$$#'('%&+.(&$#$%##%$$$%&&$'&$$###$%%$%%%(%####$$&'#$%#$###%&$#$%##$&%#"#$'$'$$$"$$&)(###$$(&$$&&$$$%'%##&$%$#$$%%#$#$'%%'%%'&#$#$$%%$'#%$$$%&#&&$%#$##$########%%$%$$"(###"#&%"#$%-/*(%$#%&&%'$&$%#$"$%#"##'*&#$"%#)&&$#&$##$###$#((###&%&&$#$$%$"$$$$$$##&(%$$$$%$$#&$&%%#()&%(+$'(&&'&&%(*(%&()(%$$$'%(("##$#%$&($#$%%(('&'%#$$%&%%%%%&#$##"$%"$$$%$#'&&##$%%%$#$#$###%&&&'$&%#%$$')$$$%#%$$$#$$##$##%#$$&$(&#$#%#$#$%#$%##%)$#&$&$#%$).*'(#%$%%$#'$%$$%&%#%%"#$&&$$#$$##"%"%#&&##$#$$$#$$%%$'*"%%$$$$#%'''('%$&&&(*'$%%$%$$%#"#&%"#$$#$"#$$"$#
+@macs_MacBook_local_20170809_FAH11850_MN21227_sequencing_run_AIV_run_1_84332_read_12085_ch_399_strand
+TCACAAGGTAAGTCAGGCTGGCAGAAACTGCAGGAGGCGGGGGTAAAGTAGAGGCAGTGGCACAAGGGCAGATGGCGTGAAACACAGGCTCAGCTAGGTAGCTCATCGGGGAATCAGGCAGGCAGAGGCAGAGGCCGGGAGATGTAGTAATGGGAAACTCACTCAGGCAAAGCTGGCTGAGCAAGGCTGGGGGCAGGAGTGGGGCTCCGAGCCACTCAAGTAGCTCAGGCAATGAGGCGCCTCAAGTGGCTCAGAGGCTCACTCAGGGGCTGGAGGCATGGAGGCTGTGAGCTCCAGGGCTGCCTTCAGCTCAGGGAACTGCAGCAAATGGGGCTGCTCGCGGCAGGCTGTGCAGAAGCGGGGCTGGCGTGCAAGTGCTGGGGAGGCGCGTGGCGCTGGGCGGGGAATCAGGCTCAAATGCCTCAGGGGCGGGGGCTGAGGCTGCCGCTGAGAGCAGAAGCTGCTCAAAGGCAAAATAGGCAGGCAGCTCAGGCACCAGGCCTCTGCAGGCTCAAGCTGTCACTCCTCAGGAAAATGGGGAGCAGGCGCAGCAGGAGGCAGCAAGTTTCGGCAGCAAGCCGCTCACTGCACGCGCTCACTGGCGCTGTGGCTCAAGTGGCTCACAGCAC
++
++*&,)(#$$&&%'$#%&###%%%%''#(#"##%&%'&$''++%"#%%%#$(#&$#$%$$%)%'%$)-&%#%#$%$#%#%$$$&#$###"#$#$&$$#&$#$#"###$$&('$%$(#&)'$%#$###&&$%%$&$%$&*)$&"#""###$%##%'&(%%$$$$$$#$$$&&&$##&%$#$$%%%$'&#%&'('&&#*+$#%'(&##$'&"$#%&#&%'&$#$##$$%$'(&%$$%#'&##$%#%&&%%"""#$&$%%'%&$"$$%$)+)'%#$&$###"##%#&&%%&###%&&'&$&'%#$"%%#&&$$&'%$'*($$##"$##%%%&%'&-'$####$$##$$#&&"##$#%#$$$$#%(+&$#$$##$$%%$""$##%-/*$'%#%%$$$$$####$&$**+)$%%%%#%$#%$%##$%$$%#'('%#%()'&$$%#'$#$$%&#%%%#&#%$##%%$%$#$$%#%$&&%"#$)%'(&%$(%%##$$#$(&&#%$#$%#$$$####%(&&$#$"#$#$$"$$%'#%#&'$#%%#"&+'##%%&)$$#$%%$%'$&'%##$##$"#$%$%###$#$$#&"$%%"%%#&$%%&''$'"##&%$$$$##%$$#$##$##$$#%%##"##"
+@macs_MacBook_local_20170809_FAH11850_MN21227_sequencing_run_AIV_run_1_84332_read_12103_ch_399_strand
+GGCTAAGCTGGCAAATTCGCGGCCCCGTCAGGCTGAGGCGCGAGTGAGGAGGCAGAGGCAGGGGCTGTCAGCTCAGAGCCGAGGGGATCTCCTCAAAGCTCTGCTCAGGCGTGGTGCTGGGGCTGCTCAGGCTGCAGGCAGGCTGCAACAGGCGCTGCAAACGCTCGCACTGGGAGGCTGCAGCGGGCAGGGCTGAGCGCAAGGCCTGCAGGCAGCGGAGGCTGGGGCTGCTCAAAGCGCCAGGTGGCAGCCTCAGGAAGCGTCAGAACTTCAGAACAAGTCGCTAAAAACAAGGCTGCTCAGGGGCTGGGGCAAACAAATCTCAGCGGCAACTCAGAGTCAGGAGGGCCTCCGCAGGCTCAGCTGCCTCGAAATCAGGTAAATGGGGACTACAGGCTGGGAATGAAATCACTGCAGGGTAAAACACAAAGCTCCATGACCTTCGTAAAATTCCAGCTCAAAACAAATGCCAGGAGGCATAAGCTGTGGGAGGCAGGCTCGGCTCACTCAGGCTCATCAGCTATCAAGTCTCAGAAATATAGTAATGGGGCAGGGAGGCTGTCAATGGCTGCAGGCTCAGGGCAGCCTCACAGGCTCAAGTAAAGCTCAAGCAGGCTCAAGCACAAATGGGGCGCTCGCTGCAAAGCAGGCAGAAATGAAATGAGGCATGGCTGGGCTCTCAAATCTGCCAAATCAAGTCCCAGGCAGAGGCAGAAATCACTCAGGAGGCTCCAGCAAACATTCAGATCAAGCACAAGCTGCAGCAAACTCGCTTCACA
++
+$'"$$#$$#####$$%$'"$##$$$##%&$$%$#&$&(%&&%$&#&$'($$$"$&$'%%#))'$$#""$####$$'%''%&%&&('##%#$%"$$&''(((''&'%$&)&''&$$###&((&$#"##$$&%###$#&$$$''$##$####$$$###$#$$$$##$$#$#%$%+,%''$##%"$%$&%##')&$#$$#%"%#$''#$####&%$#$%'*$'%$$(,+(%&%)-&')&$%$$'&&&$##$%%(%$$#'(%&$#%###$#$#$&$$(#$$$$"##"##$)))'$%%$%$%$%$%#%&'&$$$$%%#%###$&%#$$%#%%%#$##$%#$%$$$$#&&#%'%$$$%%#%#$%#%$""$$$&%#####%#$$$&##$###&('%$$"$#%($#$&$#""#$$##$#$$#$%'&###&&%&#$#%%""#%&""#"##$%&%#$&$$$%''%"##$%&&$####$$&&$)*#('%#$##$$$#"$&'%'%"#(&$#$$%$$&"$#$#$##"#####"##$%&#$$#$$&&$()%&&'&%&%%%#&)&%%)*-&'&$%&'%##$&'%&&%%##%%%$$(('##('&'"$$$%##$$%"#%()%%$%$$#$$$&#'#$$$$#%%&%$&(&%$$$#$#$%###$$$##$$##$#%$$$#%'%$$)'$#$$%%%$$$#$&&%$$$$&%$$##$&"$'%#$%&%#%&$%$%%&$"$#$$%%$&&'&(($$$##$#$##%$$$%$%%$$()($$#$##$%#$$$$"#$$$$$&$##$&%&&#