[med-svn] [Git][med-team/spoa][upstream] New upstream version 4.0.5+ds

Michael R. Crusoe gitlab at salsa.debian.org
Fri Jan 1 14:57:11 GMT 2021



Michael R. Crusoe pushed to branch upstream at Debian Med / spoa


Commits:
1b25f09f by Michael R. Crusoe at 2021-01-01T14:13:26+01:00
New upstream version 4.0.5+ds
- - - - -


13 changed files:

- CMakeLists.txt
- include/spoa/alignment_engine.hpp
- include/spoa/graph.hpp
- src/alignment_engine.cpp
- src/graph.cpp
- src/main.cpp
- src/simd_alignment_engine.hpp
- src/simd_alignment_engine_implementation.hpp
- src/sisd_alignment_engine.cpp
- src/sisd_alignment_engine.hpp
- − test/data/sample.fastq
- + test/data/sample.fastq.gz
- test/spoa_test.cpp


Changes:

=====================================
CMakeLists.txt
=====================================
@@ -1,6 +1,6 @@
 cmake_minimum_required(VERSION 3.9)
 
-project(spoa VERSION 4.0.0
+project(spoa VERSION 4.0.5
              LANGUAGES CXX
              DESCRIPTION "Spoa is a c++ library (and tool) for SIMD vectorized partial order alignment.")
 
@@ -61,7 +61,7 @@ target_include_directories(${PROJECT_NAME} PUBLIC
 target_link_libraries(${PROJECT_NAME}
   cereal)
 if (BUILD_SHARED_LIBS)
-  set_property(TARGET ${PROJECT_NAME} PROPERTY SOVERSION = "5.0.0")
+  set_property(TARGET ${PROJECT_NAME} PROPERTY SOVERSION = "7.0.0")
 endif ()
 
 if (spoa_generate_dispatch)
@@ -77,6 +77,8 @@ if (spoa_generate_dispatch)
       $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
       $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/vendor/simde>
       $<INSTALL_INTERFACE:include>)
+    target_link_libraries(${PROJECT_NAME}_${arch}
+      cereal)
     set_target_properties(${PROJECT_NAME}_${arch} PROPERTIES
       COMPILE_FLAGS "-m${arch}")
     if (BUILD_SHARED_LIBS)
@@ -132,6 +134,9 @@ endif ()
 option(spoa_build_tests "Build spoa unit tests" OFF)
 if (spoa_build_tests)
   find_package(GTest REQUIRED)
+  if (NOT TARGET biosoup)
+    add_subdirectory(vendor/bioparser/vendor/biosoup EXCLUDE_FROM_ALL)
+  endif ()
   if (NOT TARGET bioparser)
     add_subdirectory(vendor/bioparser EXCLUDE_FROM_ALL)
   endif ()
@@ -144,5 +149,5 @@ if (spoa_build_tests)
     biosoup
     GTest::Main)
   target_compile_definitions(${PROJECT_NAME}_test PRIVATE
-    SPOA_DATA_PATH="${PROJECT_SOURCE_DIR}/test/data/sample.fastq")
+    SPOA_DATA_PATH="${PROJECT_SOURCE_DIR}/test/data/sample.fastq.gz")
 endif ()


=====================================
include/spoa/alignment_engine.hpp
=====================================
@@ -56,7 +56,7 @@ class AlignmentEngine {
 
   virtual void Prealloc(
       std::uint32_t max_sequence_len,
-      std::uint32_t alphabet_size) = 0;
+      std::uint8_t alphabet_size) = 0;
 
   Alignment Align(
       const std::string& sequence,
@@ -66,7 +66,7 @@ class AlignmentEngine {
   virtual Alignment Align(
       const char* sequence, std::uint32_t sequence_len,
       const Graph& graph,
-      std::int32_t* score = nullptr) noexcept = 0;
+      std::int32_t* score = nullptr) = 0;
 
  protected:
   AlignmentEngine(
@@ -79,6 +79,10 @@ class AlignmentEngine {
       std::int8_t q,
       std::int8_t c);
 
+  std::int64_t WorstCaseAlignmentScore(
+      std::int64_t sequence_len,
+      std::int64_t graph_len) const;
+
   AlignmentType type_;
   AlignmentSubtype subtype_;
   std::int8_t m_;


=====================================
include/spoa/graph.hpp
=====================================
@@ -292,7 +292,8 @@ class Graph {
 
   std::vector<bool> ExtractSubgraph(const Node* begin, const Node* end) const;
 
-  std::vector<std::uint32_t> InitializeMultipleSequenceAlignment() const;
+  std::vector<std::uint32_t> InitializeMultipleSequenceAlignment(
+      std::uint32_t* row_size = nullptr) const;
 
   std::uint32_t num_codes_;
   std::vector<std::int32_t> coder_;


=====================================
src/alignment_engine.cpp
=====================================
@@ -98,4 +98,15 @@ Alignment AlignmentEngine::Align(
   return Align(sequence.c_str(), sequence.size(), graph, score);
 }
 
+std::int64_t AlignmentEngine::WorstCaseAlignmentScore(
+    std::int64_t i,
+    std::int64_t j) const {
+  auto gap_score = [&] (std::int64_t len) -> std::int64_t {
+    return len == 0 ? 0 : std::min(g_ + (len - 1) * e_, q_ + (len - 1) * c_);
+  };
+  return std::min(
+      -1 * (m_ * std::min(i, j) + gap_score(std::abs(i - j))),
+      gap_score(i) + gap_score(j));
+}
+
 }  // namespace spoa


=====================================
src/graph.cpp
=====================================
@@ -318,9 +318,11 @@ bool Graph::IsTopologicallySorted() const {
   return true;
 }
 
-std::vector<std::uint32_t> Graph::InitializeMultipleSequenceAlignment() const {
+std::vector<std::uint32_t> Graph::InitializeMultipleSequenceAlignment(
+    std::uint32_t* row_size) const {
   std::vector<std::uint32_t> dst(nodes_.size());
-  for (std::uint32_t i = 0, j = 0; i < rank_to_node_.size(); ++i, ++j) {
+  std::uint32_t j = 0;
+  for (std::uint32_t i = 0; i < rank_to_node_.size(); ++i, ++j) {
     auto it = rank_to_node_[i];
     dst[it->id] = j;
     for (const auto& jt : it->aligned_nodes) {
@@ -328,16 +330,20 @@ std::vector<std::uint32_t> Graph::InitializeMultipleSequenceAlignment() const {
       ++i;
     }
   }
+  if (row_size) {
+    *row_size = j;
+  }
   return dst;
 }
 
 std::vector<std::string> Graph::GenerateMultipleSequenceAlignment(
     bool include_consensus) {
-  auto node_id_to_column = InitializeMultipleSequenceAlignment();
+  std::uint32_t row_size = 0;
+  auto node_id_to_column = InitializeMultipleSequenceAlignment(&row_size);
 
   std::vector<std::string> dst;
   for (std::uint32_t i = 0; i < sequences_.size(); ++i) {
-    std::string row(node_id_to_column.size() + 1, '-');
+    std::string row(row_size, '-');
     auto it = sequences_[i];
     while (true) {
       row[node_id_to_column[it->id]] = decoder_[it->code];
@@ -349,7 +355,7 @@ std::vector<std::string> Graph::GenerateMultipleSequenceAlignment(
   }
   if (include_consensus) {
     TraverseHeaviestBundle();
-    std::string row(node_id_to_column.size() + 1, '-');
+    std::string row(row_size, '-');
     for (const auto& it : consensus_) {
       row[node_id_to_column[it->id]] = decoder_[it->code];
     }


=====================================
src/main.cpp
=====================================
@@ -31,7 +31,6 @@ std::unique_ptr<bioparser::Parser<biosoup::Sequence>> CreateParser(
         str.compare(str.size() - suff.size(), suff.size(), suff) == 0;
   };
 
-
   if (is_suffix(path, ".fasta") || is_suffix(path, ".fasta.gz") ||
       is_suffix(path, ".fna")   || is_suffix(path, ".fna.gz") ||
       is_suffix(path, ".faa")   || is_suffix(path, ".faa.gz") ||
@@ -263,18 +262,35 @@ int main(int argc, char** argv) {
   for (const auto& it : sequences) {
     max_sequence_len = std::max(max_sequence_len, it->data.size());
   }
-  alignment_engine->Prealloc(max_sequence_len, 4);
+  try {
+    alignment_engine->Prealloc(max_sequence_len, 4);
+  } catch (std::invalid_argument& exception) {
+    std::cerr << exception.what() << std::endl;
+    return 1;
+  }
 
   spoa::Graph graph{};
   std::vector<bool> is_reversed;
   for (const auto& it : sequences) {
     std::int32_t score = 0;
-    auto alignment = alignment_engine->Align(it->data, graph, &score);
+    spoa::Alignment alignment;
+    try {
+      alignment = alignment_engine->Align(it->data, graph, &score);
+    } catch (std::invalid_argument& exception) {
+      std::cerr << exception.what() << std::endl;
+      return 1;
+    }
 
     if (is_strand_ambiguous) {
       it->ReverseAndComplement();
       std::int32_t score_rev = 0;
-      auto alignment_rev = alignment_engine->Align(it->data, graph, &score_rev);
+      spoa::Alignment alignment_rev;
+      try {
+        alignment_rev = alignment_engine->Align(it->data, graph, &score_rev);
+      } catch (std::invalid_argument& exception) {
+        std::cerr << exception.what() << std::endl;
+        return 1;
+      }
       if (score >= score_rev) {
         it->ReverseAndComplement();
         is_reversed.push_back(false);
@@ -285,7 +301,11 @@ int main(int argc, char** argv) {
     }
 
     try {
-      graph.AddAlignment(alignment, it->data, it->quality);
+      if (it->quality.empty()) {
+        graph.AddAlignment(alignment, it->data);
+      } else {
+        graph.AddAlignment(alignment, it->data, it->quality);
+      }
     } catch(std::invalid_argument& exception) {
       std::cerr << exception.what() << std::endl;
       return 1;


=====================================
src/simd_alignment_engine.hpp
=====================================
@@ -48,12 +48,12 @@ class SimdAlignmentEngine: public AlignmentEngine {
 
   void Prealloc(
       std::uint32_t max_sequence_len,
-      std::uint32_t alphabet_size) override;
+      std::uint8_t alphabet_size) override;
 
   Alignment Align(
       const char* sequence, std::uint32_t sequence_len,
       const Graph& graph,
-      std::int32_t* score) noexcept override;
+      std::int32_t* score) override;
 
   friend std::unique_ptr<AlignmentEngine> CreateSimdAlignmentEngine(
       AlignmentType type,
@@ -78,34 +78,34 @@ class SimdAlignmentEngine: public AlignmentEngine {
 
   template<typename T>
   Alignment Linear(
-      const char* sequence, std::uint32_t sequence_len,
+      std::uint32_t sequence_len,
       const Graph& graph,
       std::int32_t* score) noexcept;
 
   template<typename T>
   Alignment Affine(
-      const char* sequence, std::uint32_t sequence_len,
+      std::uint32_t sequence_len,
       const Graph& graph,
       std::int32_t* score) noexcept;
 
   template<typename T>
   Alignment Convex(
-      const char* sequence, std::uint32_t sequence_len,
+      std::uint32_t sequence_len,
       const Graph& graph,
       std::int32_t* score) noexcept;
 
   void Realloc(
-      std::uint32_t matrix_width,
-      std::uint32_t matrix_height,
-      std::uint32_t num_codes);
+      std::uint64_t matrix_width,
+      std::uint64_t matrix_height,
+      std::uint8_t num_codes);
 
   template<typename T>
   void Initialize(
       const char* sequence,
       const Graph& graph,
-      std::uint32_t normal_matrix_width,
-      std::uint32_t matrix_width,
-      std::uint32_t matrix_height) noexcept;
+      std::uint64_t normal_matrix_width,
+      std::uint64_t matrix_width,
+      std::uint64_t matrix_height) noexcept;
 
   struct Implementation;
   std::unique_ptr<Implementation> pimpl_;


=====================================
src/simd_alignment_engine_implementation.hpp
=====================================
@@ -6,9 +6,11 @@
 #include "simd_alignment_engine.hpp"
 
 #include <algorithm>
+#include <cmath>
 #include <iostream>
 #include <limits>
 #include <memory>
+#include <stdexcept>
 #include <vector>
 
 extern "C" {
@@ -47,8 +49,8 @@ inline void* align(
 template<Architecture A, typename T>
 T* AllocateAlignedMemory(
     T** storage,
-    std::uint32_t size,
-    std::uint32_t alignment) {
+    std::size_t size,
+    std::size_t alignment) {
   *storage = new T[size + alignment - 1];
   void* ptr = static_cast<void*>(*storage);
   std::size_t storage_size = (size + alignment - 1) * sizeof(T);
@@ -311,12 +313,12 @@ struct SimdAlignmentEngine<A>::Implementation {
   std::vector<std::uint32_t> node_id_to_rank;
 
   std::unique_ptr<__mxxxi[]> sequence_profile_storage;
-  std::uint32_t sequence_profile_size;
+  std::uint64_t sequence_profile_size;
   __mxxxi* sequence_profile;
 
   std::vector<std::int32_t> first_column;
   std::unique_ptr<__mxxxi[]> M_storage;
-  std::uint32_t M_size;
+  std::uint64_t M_size;
   __mxxxi* H;
   __mxxxi* F;
   __mxxxi* E;
@@ -371,34 +373,50 @@ SimdAlignmentEngine<A>::SimdAlignmentEngine(
 template<Architecture A>
 void SimdAlignmentEngine<A>::Prealloc(
     std::uint32_t max_sequence_len,
-    std::uint32_t alphabet_size) {
-#if defined(__AVX2__) || defined(__SSE4_1__) || defined(USE_SIMDE)
-  std::uint32_t longest_path = max_sequence_len * (alphabet_size + 1) + 1 +
-      InstructionSet<A, std::int16_t>::kNumVar;
+    std::uint8_t alphabet_size) {
+  if (max_sequence_len > std::numeric_limits<int32_t>::max()) {
+    throw std::invalid_argument(
+        "[spoa::SimdAlignmentEngine::Prealloc] error: too large sequence!");
+  }
 
-  std::uint32_t max_penalty = std::max(
-      std::max(abs(m_), abs(n_)),
-      std::max(abs(g_), abs(q_)));
+#if defined(__AVX2__) || defined(__SSE4_1__) || defined(USE_SIMDE)
 
-  if (max_penalty * longest_path < std::numeric_limits<std::int16_t>::max()) {
-    Realloc(
-        (max_sequence_len / InstructionSet<A, std::int16_t>::kNumVar) + 1,
-        alphabet_size * max_sequence_len,
-        alphabet_size);
+  std::int64_t worst_case_score = WorstCaseAlignmentScore(
+      static_cast<std::int64_t>(max_sequence_len) + 8,
+      static_cast<std::int64_t>(max_sequence_len) * alphabet_size);
+
+  if (worst_case_score < std::numeric_limits<std::int32_t>::min() + 1024) {
+    return;
+  } else if (worst_case_score < std::numeric_limits<std::int16_t>::min() + 1024) {  // NOLINT
+    try {
+      Realloc(
+          (max_sequence_len / InstructionSet<A, std::int32_t>::kNumVar) + 1,
+          static_cast<std::uint64_t>(max_sequence_len) * alphabet_size,
+          alphabet_size);
+    } catch (std::bad_alloc& ba) {
+      throw std::invalid_argument(
+          "[spoa::SimdAlignmentEngine::Prealloc] error: insufficient memory!");
+    }
   } else {
-    Realloc(
-        (max_sequence_len / InstructionSet<A, std::int32_t>::kNumVar) + 1,
-        alphabet_size * max_sequence_len,
-        alphabet_size);
+    try {
+      Realloc(
+          (max_sequence_len / InstructionSet<A, std::int16_t>::kNumVar) + 1,
+          static_cast<std::uint64_t>(max_sequence_len) * alphabet_size,
+          alphabet_size);
+    } catch (std::bad_alloc& ba) {
+      throw std::invalid_argument(
+          "[spoa::SimdAlignmentEngine::Prealloc] error: insufficient memory!");
+    }
   }
+
 #endif
 }
 
 template<Architecture A>
 void SimdAlignmentEngine<A>::Realloc(
-    std::uint32_t matrix_width,
-    std::uint32_t matrix_height,
-    std::uint32_t num_codes) {
+    std::uint64_t matrix_width,
+    std::uint64_t matrix_height,
+    std::uint8_t num_codes) {
 #if defined(__AVX2__) || defined(__SSE4_1__) || defined(USE_SIMDE)
   if (pimpl_->node_id_to_rank.size() < matrix_height - 1) {
     pimpl_->node_id_to_rank.resize(matrix_height - 1, 0);
@@ -489,9 +507,9 @@ template<Architecture A> template<typename T>
 void SimdAlignmentEngine<A>::Initialize(
     const char* sequence,
     const Graph& graph,
-    std::uint32_t normal_matrix_width,
-    std::uint32_t matrix_width,
-    std::uint32_t matrix_height) noexcept {
+    std::uint64_t normal_matrix_width,
+    std::uint64_t matrix_width,
+    std::uint64_t matrix_height) noexcept {
 #if defined(__AVX2__) || defined(__SSE4_1__) || defined(USE_SIMDE)
   std::int32_t padding_penatly = -1 * std::max(
       std::max(abs(m_), abs(n_)),
@@ -666,54 +684,90 @@ template<Architecture A>
 Alignment SimdAlignmentEngine<A>::Align(
     const char* sequence, std::uint32_t sequence_len,
     const Graph& graph,
-    std::int32_t* score) noexcept {
+    std::int32_t* score) {
+  if (sequence_len > std::numeric_limits<int32_t>::max()) {
+    throw std::invalid_argument(
+        "[spoa::SimdAlignmentEngine::Align] error: too large sequence!");
+  }
+
   if (graph.nodes().empty() || sequence_len == 0) {
     return Alignment();
   }
 
 #if defined(__AVX2__) || defined(__SSE4_1__) || defined(USE_SIMDE)
-  std::uint32_t longest_path = graph.nodes().size() + 1 + sequence_len +
-      InstructionSet<A, std::int16_t>::kNumVar;
 
-  std::uint32_t max_penalty = std::max(std::max(abs(m_), abs(n_)), abs(g_));
+  std::int64_t worst_case_score = WorstCaseAlignmentScore(
+      sequence_len + 8,
+      graph.nodes().size());
+
+  if (worst_case_score < std::numeric_limits<std::int32_t>::min() + 1024) {
+    throw std::invalid_argument(
+        "[spoa::SimdAlignmentEngine::Align] error: possible overflow!");
+  } else if (worst_case_score < std::numeric_limits<std::int16_t>::min() + 1024) {  // NOLINT
+    try {
+      Realloc(
+          std::ceil(static_cast<double>(sequence_len) / InstructionSet<A, std::int32_t>::kNumVar),  // NOLINT
+          graph.nodes().size() + 1,
+          graph.num_codes());
+    } catch (std::bad_alloc& ba) {
+      throw std::invalid_argument(
+          "[spoa::SimdAlignmentEngine::Align] error: insufficient memory!");
+    }
+    Initialize<InstructionSet<A, std::int32_t>>(
+        sequence,
+        graph,
+        sequence_len,
+        std::ceil(static_cast<double>(sequence_len) / InstructionSet<A, std::int32_t>::kNumVar),  // NOLINT
+        graph.nodes().size() + 1);
 
-  if (max_penalty * longest_path < std::numeric_limits<std::int16_t>::max()) {
     if (subtype_ == AlignmentSubtype::kLinear) {
-      return Linear<InstructionSet<A, std::int16_t>>(sequence, sequence_len, graph, score);  // NOLINT
+      return Linear<InstructionSet<A, std::int32_t>>(sequence_len, graph, score);  // NOLINT
     } else if (subtype_ == AlignmentSubtype::kAffine) {
-      return Affine<InstructionSet<A, std::int16_t>>(sequence, sequence_len, graph, score);  // NOLINT
+      return Affine<InstructionSet<A, std::int32_t>>(sequence_len, graph, score);  // NOLINT
     } else if (subtype_ == AlignmentSubtype::kConvex) {
-      return Convex<InstructionSet<A, std::int16_t>>(sequence, sequence_len, graph, score);  // NOLINT
+      return Convex<InstructionSet<A, std::int32_t>>(sequence_len, graph, score);  // NOLINT
     }
   } else {
+    try {
+      Realloc(
+          std::ceil(static_cast<double>(sequence_len) / InstructionSet<A, std::int16_t>::kNumVar),  // NOLINT
+          graph.nodes().size() + 1,
+          graph.num_codes());
+    } catch (std::bad_alloc& ba) {
+      throw std::invalid_argument(
+          "[spoa::SimdAlignmentEngine::Align] error: insufficient memory!");
+    }
+    Initialize<InstructionSet<A, std::int16_t>>(
+        sequence,
+        graph,
+        sequence_len,
+        std::ceil(static_cast<double>(sequence_len) / InstructionSet<A, std::int16_t>::kNumVar),  // NOLINT
+        graph.nodes().size() + 1);
+
     if (subtype_ == AlignmentSubtype::kLinear) {
-      return Linear<InstructionSet<A, std::int32_t>>(sequence, sequence_len, graph, score);  // NOLINT
+      return Linear<InstructionSet<A, std::int16_t>>(sequence_len, graph, score);  // NOLINT
     } else if (subtype_ == AlignmentSubtype::kAffine) {
-      return Affine<InstructionSet<A, std::int32_t>>(sequence, sequence_len, graph, score);  // NOLINT
+      return Affine<InstructionSet<A, std::int16_t>>(sequence_len, graph, score);  // NOLINT
     } else if (subtype_ == AlignmentSubtype::kConvex) {
-      return Convex<InstructionSet<A, std::int32_t>>(sequence, sequence_len, graph, score);  // NOLINT
+      return Convex<InstructionSet<A, std::int16_t>>(sequence_len, graph, score);  // NOLINT
     }
   }
+
 #endif
   return Alignment();
 }
 
 template<Architecture A> template <typename T>
 Alignment SimdAlignmentEngine<A>::Linear(
-    const char* sequence, std::uint32_t sequence_len,
+    std::uint32_t sequence_len,
     const Graph& graph,
     std::int32_t* score) noexcept {
 #if defined(__AVX2__) || defined(__SSE4_1__) || defined(USE_SIMDE)
-  std::uint32_t normal_matrix_width = sequence_len;
-  std::uint32_t matrix_width =
-      (sequence_len + (sequence_len % T::kNumVar == 0 ?
-      0 : T::kNumVar - sequence_len % T::kNumVar)) / T::kNumVar;
-  std::uint32_t matrix_height = graph.nodes().size() + 1;
+  std::uint64_t normal_matrix_width = sequence_len;
+  std::uint64_t matrix_width =
+      std::ceil(static_cast<double>(sequence_len) / T::kNumVar);
   const auto& rank_to_node = graph.rank_to_node();
 
-  Realloc(matrix_width, matrix_height, graph.num_codes());
-  Initialize<T>(sequence, graph, normal_matrix_width, matrix_width, matrix_height);  // NOLINT
-
   typename T::type kNegativeInfinity =
       std::numeric_limits<typename T::type>::min() + 1024;
 
@@ -759,7 +813,7 @@ Alignment SimdAlignmentEngine<A>::Linear(
         T::_mmxxx_set1_epi(pimpl_->first_column[pred_i]),
         T::kRSS);
 
-    for (std::uint32_t j = 0; j < matrix_width; ++j) {
+    for (std::uint64_t j = 0; j < matrix_width; ++j) {
       // get diagonal
       __mxxxi t1 = _mmxxx_srli_si(H_pred_row[j], T::kRSS);
       H_row[j] = _mmxxx_or_si(
@@ -782,7 +836,7 @@ Alignment SimdAlignmentEngine<A>::Linear(
           T::_mmxxx_set1_epi(pimpl_->first_column[pred_i]),
           T::kRSS);
 
-      for (std::uint32_t j = 0; j < matrix_width; ++j) {
+      for (std::uint64_t j = 0; j < matrix_width; ++j) {
         // get diagonal
         __mxxxi t1 = _mmxxx_srli_si(H_pred_row[j], T::kRSS);
         __mxxxi m = _mmxxx_or_si(
@@ -806,7 +860,7 @@ Alignment SimdAlignmentEngine<A>::Linear(
             g),
         T::kRSS);
 
-    for (std::uint32_t j = 0; j < matrix_width; ++j) {
+    for (std::uint64_t j = 0; j < matrix_width; ++j) {
       // add last element of previous vector into this one
       H_row[j] = T::_mmxxx_max_epi(
           H_row[j],
@@ -851,14 +905,13 @@ Alignment SimdAlignmentEngine<A>::Linear(
     }
   }
 
+  if (max_i == -1 && max_j == -1) {
+    return Alignment();
+  }
   if (score) {
     *score = max_score;
   }
 
-  if (max_i == -1 && max_j == -1) {  // no alignment found
-    return Alignment();
-  }
-
   if (type_ == AlignmentType::kSW) {
     max_j = _mmxxx_index_of<A, T>(
         &(pimpl_->H[max_i * matrix_width]),
@@ -1057,20 +1110,15 @@ Alignment SimdAlignmentEngine<A>::Linear(
 
 template<Architecture A> template <typename T>
 Alignment SimdAlignmentEngine<A>::Affine(
-    const char* sequence, std::uint32_t sequence_len,
+    std::uint32_t sequence_len,
     const Graph& graph,
     std::int32_t* score) noexcept {
 #if defined(__AVX2__) || defined(__SSE4_1__) || defined(USE_SIMDE)
-  std::uint32_t normal_matrix_width = sequence_len;
-  std::uint32_t matrix_width =
-      (sequence_len + (sequence_len % T::kNumVar == 0 ?
-      0 : T::kNumVar - sequence_len % T::kNumVar)) / T::kNumVar;
-  std::uint32_t matrix_height = graph.nodes().size() + 1;
+  std::uint64_t normal_matrix_width = sequence_len;
+  std::uint64_t matrix_width =
+      std::ceil(static_cast<double>(sequence_len) / T::kNumVar);
   const auto& rank_to_node = graph.rank_to_node();
 
-  Realloc(matrix_width, matrix_height, graph.num_codes());
-  Initialize<T>(sequence, graph, normal_matrix_width, matrix_width, matrix_height);  // NOLINT
-
   typename T::type kNegativeInfinity =
       std::numeric_limits<typename T::type>::min() + 1024;
 
@@ -1121,7 +1169,7 @@ Alignment SimdAlignmentEngine<A>::Affine(
         T::_mmxxx_set1_epi(pimpl_->first_column[pred_i]),
         T::kRSS);
 
-    for (std::uint32_t j = 0; j < matrix_width; ++j) {
+    for (std::uint64_t j = 0; j < matrix_width; ++j) {
       // update F
       F_row[j] = T::_mmxxx_add_epi(
           T::_mmxxx_max_epi(
@@ -1148,7 +1196,7 @@ Alignment SimdAlignmentEngine<A>::Affine(
           T::_mmxxx_set1_epi(pimpl_->first_column[pred_i]),
           T::kRSS);
 
-      for (std::uint32_t j = 0; j < matrix_width; ++j) {
+      for (std::uint64_t j = 0; j < matrix_width; ++j) {
         // update F
         F_row[j] = T::_mmxxx_max_epi(
             F_row[j],
@@ -1174,7 +1222,7 @@ Alignment SimdAlignmentEngine<A>::Affine(
     __mxxxi score = zeroes;
     x = T::_mmxxx_set1_epi(pimpl_->first_column[i]);
 
-    for (std::uint32_t j = 0; j < matrix_width; ++j) {
+    for (std::uint64_t j = 0; j < matrix_width; ++j) {
       H_row[j] = T::_mmxxx_max_epi(H_row[j], F_row[j]);
 
       E_row[j] = T::_mmxxx_add_epi(
@@ -1225,14 +1273,13 @@ Alignment SimdAlignmentEngine<A>::Affine(
     }
   }
 
+  if (max_i == -1 && max_j == -1) {
+    return Alignment();
+  }
   if (score) {
     *score = max_score;
   }
 
-  if (max_i == -1 && max_j == -1) {  // no alignment found
-    return Alignment();
-  }
-
   if (type_ == AlignmentType::kSW) {
     max_j = _mmxxx_index_of<A, T>(
         &(pimpl_->H[max_i * matrix_width]),
@@ -1510,20 +1557,16 @@ Alignment SimdAlignmentEngine<A>::Affine(
 
 template<Architecture A> template <typename T>
 Alignment SimdAlignmentEngine<A>::Convex(
-    const char* sequence, std::uint32_t sequence_len,
+    std::uint32_t sequence_len,
     const Graph& graph,
     std::int32_t* score) noexcept {
 #if defined(__AVX2__) || defined(__SSE4_1__) || defined(USE_SIMDE)
-  std::uint32_t normal_matrix_width = sequence_len;
-  std::uint32_t matrix_width =
-      (sequence_len + (sequence_len % T::kNumVar == 0 ?
-      0 : T::kNumVar - sequence_len % T::kNumVar)) / T::kNumVar;
-  std::uint32_t matrix_height = graph.nodes().size() + 1;
+  std::uint64_t normal_matrix_width = sequence_len;
+  std::uint64_t matrix_width =
+      std::ceil(static_cast<double>(sequence_len) / T::kNumVar);
+  std::uint64_t matrix_height = graph.nodes().size() + 1;
   const auto& rank_to_node = graph.rank_to_node();
 
-  Realloc(matrix_width, matrix_height, graph.num_codes());
-  Initialize<T>(sequence, graph, normal_matrix_width, matrix_width, matrix_height);  // NOLINT
-
   typename T::type kNegativeInfinity =
       std::numeric_limits<typename T::type>::min() + 1024;
 
@@ -1584,7 +1627,7 @@ Alignment SimdAlignmentEngine<A>::Convex(
         T::_mmxxx_set1_epi(pimpl_->first_column[pred_i]),
         T::kRSS);
 
-    for (std::uint32_t j = 0; j < matrix_width; ++j) {
+    for (std::uint64_t j = 0; j < matrix_width; ++j) {
       // update F
       F_row[j] = T::_mmxxx_add_epi(
           T::_mmxxx_max_epi(
@@ -1619,7 +1662,7 @@ Alignment SimdAlignmentEngine<A>::Convex(
           T::_mmxxx_set1_epi(pimpl_->first_column[pred_i]),
           T::kRSS);
 
-      for (std::uint32_t j = 0; j < matrix_width; ++j) {
+      for (std::uint64_t j = 0; j < matrix_width; ++j) {
         // update F
         F_row[j] = T::_mmxxx_max_epi(
             F_row[j],
@@ -1659,7 +1702,7 @@ Alignment SimdAlignmentEngine<A>::Convex(
 
     __mxxxi score = zeroes;
 
-    for (std::uint32_t j = 0; j < matrix_width; ++j) {
+    for (std::uint64_t j = 0; j < matrix_width; ++j) {
       H_row[j] = T::_mmxxx_max_epi(
           H_row[j],
           T::_mmxxx_max_epi(F_row[j], O_row[j]));
@@ -1729,14 +1772,13 @@ Alignment SimdAlignmentEngine<A>::Convex(
     }
   }
 
+  if (max_i == -1 && max_j == -1) {
+    return Alignment();
+  }
   if (score) {
     *score = max_score;
   }
 
-  if (max_i == -1 && max_j == -1) {  // no alignment found
-    return Alignment();
-  }
-
   if (type_ == AlignmentType::kSW) {
     max_j = _mmxxx_index_of<A, T>(
         &(pimpl_->H[max_i * matrix_width]),


=====================================
src/sisd_alignment_engine.cpp
=====================================
@@ -4,6 +4,7 @@
 
 #include <algorithm>
 #include <limits>
+#include <stdexcept>
 
 #include "spoa/graph.hpp"
 
@@ -62,14 +63,26 @@ SisdAlignmentEngine::SisdAlignmentEngine(
 
 void SisdAlignmentEngine::Prealloc(
     std::uint32_t max_sequence_len,
-    std::uint32_t alphabet_size) {
-  Realloc(max_sequence_len, alphabet_size * max_sequence_len, alphabet_size);
+    std::uint8_t alphabet_size) {
+  if (max_sequence_len > std::numeric_limits<int32_t>::max()) {
+    throw std::invalid_argument(
+        "[spoa::SisdAlignmentEngine::Prealloc] error: too large sequence!");
+  }
+  try {
+    Realloc(
+        static_cast<std::uint64_t>(max_sequence_len) + 1,
+        static_cast<std::uint64_t>(max_sequence_len) * alphabet_size + alphabet_size,  // NOLINT
+        alphabet_size);
+  } catch (std::bad_alloc& ba) {
+    throw std::invalid_argument(
+        "[spoa::SisdAlignmentEngine::Prealloc] error: insufficient memory!");
+  }
 }
 
 void SisdAlignmentEngine::Realloc(
-    std::uint32_t matrix_width,
-    std::uint32_t matrix_height,
-    std::uint32_t num_codes) {
+    std::uint64_t matrix_width,
+    std::uint64_t matrix_height,
+    std::uint8_t num_codes) {
   if (pimpl_->node_id_to_rank.size() < matrix_height - 1) {
     pimpl_->node_id_to_rank.resize(matrix_height - 1, 0);
   }
@@ -243,35 +256,49 @@ void SisdAlignmentEngine::Initialize(
 Alignment SisdAlignmentEngine::Align(
     const char* sequence, std::uint32_t sequence_len,
     const Graph& graph,
-    std::int32_t* score) noexcept {
+    std::int32_t* score) {
+  if (sequence_len > std::numeric_limits<int32_t>::max()) {
+    throw std::invalid_argument(
+        "[spoa::SisdAlignmentEngine::Align] error: too large sequence!");
+  }
+
   if (graph.nodes().empty() || sequence_len == 0) {
     return Alignment();
   }
 
+  if (WorstCaseAlignmentScore(sequence_len, graph.nodes().size()) < kNegativeInfinity) {  // NOLINT
+    throw std::invalid_argument(
+        "[spoa::SisdAlignmentEngine::Align] error: possible overflow!");
+  }
+
+  try {
+    Realloc(sequence_len + 1, graph.nodes().size() + 1, graph.num_codes());
+  } catch (std::bad_alloc& ba) {
+    throw std::invalid_argument(
+        "[spoa::SisdAlignmentEngine::Align] error: insufficient memory!");
+  }
+  Initialize(sequence, sequence_len, graph);
+
   if (subtype_ == AlignmentSubtype::kLinear) {
-    return Linear(sequence, sequence_len, graph, score);
+    return Linear(sequence_len, graph, score);
   } else if (subtype_ == AlignmentSubtype::kAffine) {
-    return Affine(sequence, sequence_len, graph, score);
+    return Affine(sequence_len, graph, score);
   } else if (subtype_ == AlignmentSubtype::kConvex) {
-    return Convex(sequence, sequence_len, graph, score);
+    return Convex(sequence_len, graph, score);
   }
   return Alignment();
 }
 
 Alignment SisdAlignmentEngine::Linear(
-    const char* sequence, std::uint32_t sequence_len,
+    std::uint32_t sequence_len,
     const Graph& graph,
     std::int32_t* score) noexcept {
-  std::uint32_t matrix_width = sequence_len + 1;
-  std::uint32_t matrix_height = graph.nodes().size() + 1;
+  std::uint64_t matrix_width = sequence_len + 1;
   const auto& rank_to_node = graph.rank_to_node();
 
-  Realloc(matrix_width, matrix_height, graph.num_codes());
-  Initialize(sequence, sequence_len, graph);
-
   std::int32_t max_score = type_ == AlignmentType::kSW ? 0 : kNegativeInfinity;
-  std::int32_t max_i = -1;
-  std::int32_t max_j = -1;
+  std::uint32_t max_i = 0;
+  std::uint32_t max_j = 0;
   auto update_max_score = [&max_score, &max_i, &max_j] (
       std::int32_t* H_row,
       std::uint32_t i,
@@ -297,7 +324,7 @@ Alignment SisdAlignmentEngine::Linear(
     std::int32_t* H_pred_row = &(pimpl_->H[pred_i * matrix_width]);
 
     // update H
-    for (std::uint32_t j = 1; j < matrix_width; ++j) {
+    for (std::uint64_t j = 1; j < matrix_width; ++j) {
       H_row[j] = std::max(
           H_pred_row[j - 1] + char_profile[j],
           H_pred_row[j] + g_);
@@ -308,7 +335,7 @@ Alignment SisdAlignmentEngine::Linear(
 
       H_pred_row = &(pimpl_->H[pred_i * matrix_width]);
 
-      for (std::uint32_t j = 1; j < matrix_width; ++j) {
+      for (std::uint64_t j = 1; j < matrix_width; ++j) {
         H_row[j] = std::max(
             H_pred_row[j - 1] + char_profile[j],
             std::max(
@@ -317,7 +344,7 @@ Alignment SisdAlignmentEngine::Linear(
       }
     }
 
-    for (std::uint32_t j = 1; j < matrix_width; ++j) {
+    for (std::uint64_t j = 1; j < matrix_width; ++j) {
       H_row[j] = std::max(H_row[j - 1] + g_, H_row[j]);
 
       if (type_ == AlignmentType::kSW) {
@@ -332,6 +359,9 @@ Alignment SisdAlignmentEngine::Linear(
     }
   }
 
+  if (max_i == 0 && max_j == 0) {
+    return Alignment();
+  }
   if (score) {
     *score = max_score;
   }
@@ -430,19 +460,15 @@ Alignment SisdAlignmentEngine::Linear(
 }
 
 Alignment SisdAlignmentEngine::Affine(
-    const char* sequence, std::uint32_t sequence_len,
+    std::uint32_t sequence_len,
     const Graph& graph,
     std::int32_t* score) noexcept {
-  std::uint32_t matrix_width = sequence_len + 1;
-  std::uint32_t matrix_height = graph.nodes().size() + 1;
+  std::uint64_t matrix_width = sequence_len + 1;
   const auto& rank_to_node = graph.rank_to_node();
 
-  Realloc(matrix_width, matrix_height, graph.num_codes());
-  Initialize(sequence, sequence_len, graph);
-
   std::int32_t max_score = type_ == AlignmentType::kSW ? 0 : kNegativeInfinity;
-  std::int32_t max_i = -1;
-  std::int32_t max_j = -1;
+  std::uint32_t max_i = 0;
+  std::uint32_t max_j = 0;
   auto update_max_score = [&max_score, &max_i, &max_j] (
       std::int32_t* H_row,
       std::uint32_t i,
@@ -471,7 +497,7 @@ Alignment SisdAlignmentEngine::Affine(
     std::int32_t* F_pred_row = &(pimpl_->F[pred_i * matrix_width]);
 
     // update F and H
-    for (std::uint32_t j = 1; j < matrix_width; ++j) {
+    for (std::uint64_t j = 1; j < matrix_width; ++j) {
       F_row[j] = std::max(
           H_pred_row[j] + g_,
           F_pred_row[j] + e_);
@@ -484,7 +510,7 @@ Alignment SisdAlignmentEngine::Affine(
       H_pred_row = &(pimpl_->H[pred_i * matrix_width]);
       F_pred_row = &(pimpl_->F[pred_i * matrix_width]);
 
-      for (std::uint32_t j = 1; j < matrix_width; ++j) {
+      for (std::uint64_t j = 1; j < matrix_width; ++j) {
         F_row[j] = std::max(
             F_row[j],
             std::max(
@@ -498,7 +524,7 @@ Alignment SisdAlignmentEngine::Affine(
 
     // update E and H
     std::int32_t* E_row = &(pimpl_->E[i * matrix_width]);
-    for (std::uint32_t j = 1; j < matrix_width; ++j) {
+    for (std::uint64_t j = 1; j < matrix_width; ++j) {
       E_row[j] = std::max(H_row[j - 1] + g_, E_row[j - 1] + e_);
       H_row[j] = std::max(H_row[j], std::max(F_row[j], E_row[j]));
 
@@ -514,6 +540,9 @@ Alignment SisdAlignmentEngine::Affine(
     }
   }
 
+  if (max_i == 0 && max_j == 0) {
+    return Alignment();
+  }
   if (score) {
     *score = max_score;
   }
@@ -647,19 +676,15 @@ Alignment SisdAlignmentEngine::Affine(
 }
 
 Alignment SisdAlignmentEngine::Convex(
-    const char* sequence, std::uint32_t sequence_len,
+    std::uint32_t sequence_len,
     const Graph& graph,
     std::int32_t* score) noexcept {
-  std::uint32_t matrix_width = sequence_len + 1;
-  std::uint32_t matrix_height = graph.nodes().size() + 1;
+  std::uint64_t matrix_width = sequence_len + 1;
   const auto& rank_to_node = graph.rank_to_node();
 
-  Realloc(matrix_width, matrix_height, graph.num_codes());
-  Initialize(sequence, sequence_len, graph);
-
   std::int32_t max_score = type_ == AlignmentType::kSW ? 0 : kNegativeInfinity;
-  std::int32_t max_i = -1;
-  std::int32_t max_j = -1;
+  std::uint32_t max_i = 0;
+  std::uint32_t max_j = 0;
   auto update_max_score = [&max_score, &max_i, &max_j] (
       std::int32_t* H_row,
       std::uint32_t i,
@@ -691,7 +716,7 @@ Alignment SisdAlignmentEngine::Convex(
     std::int32_t* O_pred_row = &(pimpl_->O[pred_i * matrix_width]);
 
     // update F, O and H
-    for (std::uint32_t j = 1; j < matrix_width; ++j) {
+    for (std::uint64_t j = 1; j < matrix_width; ++j) {
       F_row[j] = std::max(H_pred_row[j] + g_, F_pred_row[j] + e_);
       O_row[j] = std::max(H_pred_row[j] + q_, O_pred_row[j] + c_);
       H_row[j] = H_pred_row[j - 1] + char_profile[j];
@@ -704,7 +729,7 @@ Alignment SisdAlignmentEngine::Convex(
       F_pred_row = &(pimpl_->F[pred_i * matrix_width]);
       O_pred_row = &(pimpl_->O[pred_i * matrix_width]);
 
-      for (std::uint32_t j = 1; j < matrix_width; ++j) {
+      for (std::uint64_t j = 1; j < matrix_width; ++j) {
         F_row[j] = std::max(
             F_row[j],
             std::max(
@@ -722,7 +747,7 @@ Alignment SisdAlignmentEngine::Convex(
     // update E, Q and H
     std::int32_t* E_row = &(pimpl_->E[i * matrix_width]);
     std::int32_t* Q_row = &(pimpl_->Q[i * matrix_width]);
-    for (std::uint32_t j = 1; j < matrix_width; ++j) {
+    for (std::uint64_t j = 1; j < matrix_width; ++j) {
       E_row[j] = std::max(H_row[j - 1] + g_, E_row[j - 1] + e_);
       Q_row[j] = std::max(H_row[j - 1] + q_, Q_row[j - 1] + c_);
       H_row[j] = std::max(
@@ -743,6 +768,9 @@ Alignment SisdAlignmentEngine::Convex(
     }
   }
 
+  if (max_i == 0 && max_j == 0) {
+    return Alignment();
+  }
   if (score) {
     *score = max_score;
   }


=====================================
src/sisd_alignment_engine.hpp
=====================================
@@ -34,12 +34,12 @@ class SisdAlignmentEngine: public AlignmentEngine {
 
   void Prealloc(
       std::uint32_t max_sequence_len,
-      std::uint32_t alphabet_size) override;
+      std::uint8_t alphabet_size) override;
 
   Alignment Align(
       const char* sequence, std::uint32_t sequence_len,
       const Graph& graph,
-      std::int32_t* score) noexcept override;
+      std::int32_t* score) override;
 
  private:
   SisdAlignmentEngine(
@@ -53,24 +53,24 @@ class SisdAlignmentEngine: public AlignmentEngine {
       std::int8_t c);
 
   Alignment Linear(
-      const char* sequence, std::uint32_t sequence_len,
+      std::uint32_t sequence_len,
       const Graph& graph,
       std::int32_t* score) noexcept;
 
   Alignment Affine(
-      const char* sequence, std::uint32_t sequence_len,
+      std::uint32_t sequence_len,
       const Graph& graph,
       std::int32_t* score) noexcept;
 
   Alignment Convex(
-      const char* sequence, std::uint32_t sequence_len,
+      std::uint32_t sequence_len,
       const Graph& graph,
       std::int32_t* score) noexcept;
 
   void Realloc(
-      std::uint32_t matrix_width,
-      std::uint32_t matrix_height,
-      std::uint32_t num_codes);
+      std::uint64_t matrix_width,
+      std::uint64_t matrix_height,
+      std::uint8_t num_codes);
 
   void Initialize(
       const char* sequence, std::uint32_t sequence_len,


=====================================
test/data/sample.fastq deleted
=====================================
@@ -1,220 +0,0 @@
- at 0
-GTCTAATGCGCTTTGTTGGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAAACGGTTTTTCCATGACAGGAGTTGAATATGGCATTCCGTAATCCCTCGTCGATGATCCAAGCGGGAGCGGTCTAAGTATTGCGCATATGCGCAGGGATTCAGTCTTGCGCCGCAAACAATGCGGTCTTGTACGCTCCGGCAGGCTGGGACATTGTGTCAGCCGCAGTCCACAGGCGTCCTGCCAGCAGTGGCTGGAGGAAGCCCACTGGCGTACTCTGACACCGACGAATTTACCCAGGTTTGCAGGAGGGCACAATGAGCCAGCATTTACCTCGGCTTCTGCCGCACAGCCCGGCATCTCATCGTAAGCAGAAAAACTGTCAGAATTACCCTCCCCCTGGCTCGCCATGTGCGCATTACGTTGAGTTAACCGCGAGGAGAGGTTGATTCACCCACTTGAGCCCGCGCGGTGGTTGCCTGTACACAGCCCACGGCAGGATACAC
-+
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- at 1
-ATGATGCGCTTTGTGTTGGCGCGGTGGCTTACATCTGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGACAAGGATTGAATATGGCATTCAGTAATCCCTTCGATGATCGCAGGGAGCGTTAGTCGATATTGCGCCACAATGCGCAGGAGCGTAATTCAGTCTGTGGCCGCAACAAGCGTGGCGTCTTACCGGCAGGGCTGGGACATTGTGTGTCGACCGCAGCTTTACAGGCGGTTGGGTCGGAGCAGTGGCTGGAAGCCCACTGGGGGTCAACTCTGACACCGACTGAAGTTTTACCCGATTCAGGAGAGGCACAATGAGCCAGCAAGTTTACCTGTTATGTGCCCGCACAGCCACAGGCATCTGGATGGCAGAAAAACTGTCAGAATTACTAGCCGCTGCGGAGCGTGGGCGCATCTCCTCGTTGAGTTAACCGCCAGAGTTGACTTCACATTACTGGCCCGCGCGGTGGTCCGCCGACTACGCAATAGCAGATACGC
-+
-/0/./1000/1-0-0...-...--..-..-.-,,/,----.-//--../..----.,,-,,-..,.--++-,,-,,-,,--+++,/.,-..//-...-.-.------+,-.,,,,---,.--..,-+,.,-,-1//.//,+.,,,/-/,-,,,,++++0.,-,/,+-,,.+,,+*,++,,++-,,-*,++**+***+++,**),**+)*,+,+,**)*,))),)*++,*)++)**,),*)*+((+),))+**++*,+****)))+))+*)-+*,+*++*+**-***++**)*,,++-+-,,*,*++*+++*-+++,,*,-.+,,,-+++*++/++,.++,,,./-,,+-,+,+,----/,.,-.-./..-.-,+,.,,,,,.--/----,++,.--,-,++-,--.,,---,-.-,-++++,++-+-,+,,+**-+++*+*-+++,++****-*,+++*,,+**++****+*++*)****+***,++,*,+,,+-+++,,,+,,.,,
- at 2
-GATCCTCAGGTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAAACCACTTTTCCATGACAGGAGTTAGAATATGGCATTCAGTAATCCCTTCGGCCGGATGATCGCAGGGAGCGTTTTACATATTGCGCAATGCGCAGGGGCAATTCAGTCTGTGGCCGCAACAATGCGTCTTACCGGCAGGCTGGGACATTGTGTGTCAGCCGCAGTCACACAGGCGTCCTGCCAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACACCGACGAATTTACCCAGTGCAGGGAGGCACAATGAGCCAGCATTTACCTTTGGTCGCCGCACAGCCCGGCATCTGGGATGGCAGAAAACTGTCAGAATTACCCTCCGCCTGGAGCTGTGGCGCATTACGTTGAGTTAACCGGAGAGGTTGATTCGCCATTACACTGGCCCGCGCGGTGGTTATGCCGGACTAGCGCAAGCAGATACGC
-+
--+.+-+--+-.-,-,.+,,,,++,+++*,++,/+,+,,,++,+,,,,+-,-,+,++,,+,,+*,+*****,++,+0-+0/,+++-++.,-,-.+++,+,-,,,,/*-*+*,,,-/,,--------020/1,,../1.0----.-0/..1//.--./.1/00////.1..///.../0/0.2/0/.0.../0/1000/0/..3//3//1//--0-//.//.0/...0/0030/2../-1-./1..1..--,,-,.--/.-///0//./...0.--./-..0.--..,,/.--,-0,--,--...10/0/-//..040/0-/././--/.././.0.1..0.////////10./2//./-0/3000.,,.././/-../--.1..1/.---./--..//-/-.0..0---/-------../.-.,/-.,-/--.---/.-/..1./2//.--/...--00---..-..-/..-,///----0.0
- at 3
-ACCTTAATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCATCGACCTCGTAAACCAACACTTTTCCAGATGACAGGAGTTGAATATGGCATTCAGTAATCCCCCTTCTAGATGATCGCAGGGAGCGTTTTACATCTGCGCAATGCGCAGGGGCAATTCAGTCTGGGCCGCAACAATGCGTCTTACCGGCAGGCTGGGACATTGTGTGTCAGCCGCAGTCACATGCGTCCTGTGCCAGCAGTGGCTGGAAGCCACTGGCGTACTCTGACACCGACGAATTTTACCCAGTTGCAGGAGGCACAATGAGCCAGCATTTGCTTTGGTCGCCCGCACAGCCCGGCATCTGGATGGCAGAAAAACTGTCAGAATTACCCTCCGCACTGGAGCTTGGCGCATTACGTTGAGTTAACCGGAGAGGTTGATTCGCCATTACTGGCCCGCGCGGTGGTTGTCGCCGGACGCTCACGCAAGCAGATTGAGGTC
-+
--,-..-./0//101..-,,-/-/-.-//./0-,.2-../,0-----1-./..-/0..///./////-.-...-0..0///..-...//-//././0--10.00-11....-//0101--/////..25211..//0-/0.--/./-/,-..--.-..0/1-.//--/---.,.--/...0--/-,-,,,--//./-.--.1/./...-,/,,--.-.0.--,-/0-.0./,-,/....0/0//0/..-/.-/...1...0///////.1./0././010..0.-..0/0.1.-2///.../.50001.00/002/////001..1/10/.././//00./.12//10/-.///0/.0.1./4./--/.//0/--....--.0../..///-..-/0.-.-.0/,..-.+++++.,,,-,-.,/-+,-,+,--,++-,,,++.+++*,+,*)**)*)*),**+++*-,+,+*,,+**,+)***),+
- at 4
-ATGATGCGCTTTGTTGGCGCGTGGCTTGATGCGCAGGGCTAATCGACCTCTGGCAACCACTTTTCCATGGACAGGAGTTGAATATGGCGGCATTCAGTAATCCCTGTCGCCCATGATCCGCGCAGGGAGCGTTTACATATTTGCGCAATGCGCAGGGGCAGGAGTTCAGTCTGTGGCCGCAACAATGCGTCTTACCGGCAGGCTGGGACATTGTGTCAGCCGCAGTCAAGGAGCGTCCTCAGCAGTGGCTGGAAGCCCACTGGCGCGTACTCTGACACCGACGAATTTACCCAGTTGCAGGAGAGGCACAATGGCTCAGCATTTACCTTTGGTCGCCGCACAGCCCGGCATCTGGATGGCAGAAAACTGTCAGAATTACCCTCCGCCTGGAGCGTGGCGCATTACGTTGAGTTAACCGGAGAGGTTGATTCGCCATTAGACCTCCACCATTCTTGGTCCCGCCTGACCGCAAGCGAATACCAC
-+
-./0-..../00/00..///01//00//....1///0./-.0001/0.2/0/...-..31/300-----/---...,-/-.../..-,-...--.--,-,,--,,-.,/,,,//,,-,,,..--0----,/--,,,-.../.--,,0-,-.-.....-..-./-./.../1..0.-...-0-./...0.-,,-,,,.-...-.-,,+-0..-.-,/-/,-.,/-.--++,,,+.---,+,--/0//0...-----//.1.-./--..--.,-/--../--..012/11/./12302/.///0//0./0/000/0///1200/01//0000//1//0100///.//./////.0//./1//./.0/0000/.-./001/0.././/0..../-.0--,--/2-.-/.--+,,,,,,,+,,+,,.,-,+.+++*,+,-*+*+**-++++,-..+,,+******.++-+.+,,-,,,+++,-++.+-
- at 5
-ATGATGCGCTTTGTTGTGCGCGGCTTATGCCGGGAGTGGACCTCTGGCAACCACTTTTCCATGACAGGGTTGAATATGGCATTCAGTAATCCCTTCGGATGATCGCAGGGAGCGTTTTACATATTGCGCAATGCGCAGGGGCAATTCAGTCTGTGGCCGCAACAATGCGTCTTACCGGCAGGCTGGGACATTACGCCGCAGTCACAGGCGTCCTGCCAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACACCGACGAATTTTACCCCAGTGCAGGAGGGCACAATGAGCCAGCATTACCTTTGGTCGCCGCACAGCCCGGCATCTGGCCTGAGAAAACTGTCAGAATTACCCTCCGCCTGGAGCGTGGCGCATTAACGTTGAGTTAACCGGAGAGGATGATTGGGCCATTACTGGCCCGCGCGGTGGTGCCAGCAAGCAGATACGC
-+
-+++++,,,,,--,.+.++,+++,,+++,,++---++,+,/+--..-//--,...-/-,,,-,--,-+-,-,-./../-...-----2..1//./.,/---./--...--,-./430.-../00//--..-../-/-.--,-..-,,.-/./---,--,,.------.,-0---,,-,-.--.--,++0,,,,,,,,,,...-,,+,+-,-.-,,---,-/-,.0--,+++-+++-,,.-----,---,-/.,,+,,-00/0/.,,,,,.--,/----,.+,-,/---/---,,,.--,,----,.,,,-,+.,,,----,,/..,,,,,,,,,++-,.-,.,+++-.,,+***+**,+**++**++++*+*,++**,*++****)*****++******))))),)*++*+++-+,+,+++--,+++,++,+++++-,,.,,+++,-,,
- at 6
-ATGATGCTATTTGTTGGCGCGGTGGCTTGATGCAGGGCTAATCGACCTCTGAAACCACTTTTCTCAATGACAGGGTCGAATATGGCATTCATCAATCCCTTCATATGATCGCAGGGAGCGTTTTACATATTTCTCACAGATGCGCAGGGGCAATTCAGTCTGTACGCCCAACAAATGCGTCGCAGCGGCAGGCCGGACATTGTGTGTCAGCCGCAGTCACAGGCGTCCTGCCAGCAGTGGCTGGAAGGTACATGGCGTACTCTGACACCGACGAATTTTACCCAGTTGCAGGAGGCACAATGAGCCAGCATTTACCTTTACCTCGCTAGACACTAAGCATATGGCCTAACCAAAACTGTCAGAATCTAGCGCCTGGCCTACGTGGCGCATTACGTTGAGTCAAGCGCCAGGTTGATTCGCCATTCTGGCCCGGCGGTGTATGCCCGACTAGCGCAAGCAATACGC
-+
-,,0,,-,+-,+,,,+++,-,,,,,-,++,++,-,,,,,+,-,-,,+,.+/+++-+,-,,-,+*,.,//1,.,,,+,+.,---0,,,,+,--+.,,,,-,,,.,,.-/--,--.-/-/.-/-,,,,/.//.--,,,/--..././---.-0--//-/---..--,/,-,,,,-.-/.00,,++.,---./1---,,,-.----..+,+,-,,.,---+--/-.-.-,,++,,----..--.-,,,-.,,-,---,-.-,--/-/--/---,,-,-.,,,-,,+,+,.+++,+++*-*++++++*+*+**+++++*+**)))*))*+*(()))*)()))***)*))*)()((+(+)*)+)*(())))))()***)*)++*)**+,***+,++*+-++**)***,**++**,+,,+-+,.,,,,--,+,++,+++++++,,,++,+***,++++,+,,-,.,.,,-,,
- at 7
-GATGCGCTTTGTTGTGGCGCGTGTCGCTTTACGATGCAGGGCTAATCGACCTCTGGCAACCACTTTTCTCATGACAGGAGTTGAATATGATTCTTCAGTAATCCCTTCATATCAATCCGCAGGAGCGTTTTACAGTCCGCGCAGATGCGCAGGGCAATTTCAGTCTGTGGCCGCGCCAACAATGCGTCTCTTACCGGCAGGCTGGGACATTGTGTCAGCCGCAGTCACAGGCGTCTTCAGTATCTTACCCTCGAAGCATTTTTGCGCTACGCAGCGACGAATGATGTATATCCAAGCGTGTTAATAACACCCCAGCATTTCACCTTGTATGCCGCAACACAGCCCGGCATCTGGATGGCAGAAAAGCTGTCAGCGAATCTACTCCGCCTGGAGCCCTCTTTGAATTACGCGTTTATCAGTTGGACCGTTGGTTTTATCAGCGCGGTTGATTCACTTGGTGCGCTAGTTTCTTTACCTGACCGGCGGATAAC
-+
-/.-/./----./---./...-/,.,,-----//-..2/.-/-,--.--/0/1/0...//0////.//.---...10002/1/1..-331/0-/,//..10//21/.1/./..0./0.01///020020./--0//.1.0-.-.-0.1.0/..///.//./....0/././../.--0,-.//022//---//--.-.././-,,++,.---/,,+,*,,+,,-++,,.,-+.+*,)**))*+)**)*****))**)+**),,*)(,)())+(*(+'((()(()')''&''(('())*,*)('(*'*()*((()+(+*)))))**()))((+)()((+((+*)))(()*))()()()()(*)(***)*)())((+()**))))()***)*****))**+**)**),*)+*,,**))+)**),),))*,-))****+),-.).0**++*+*-+,++*+.**-+-+,++++,,*,+))*-*+*,*,-**,*+*)
- at 8
-ATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCAATCGACCTCTGGCAACCACTTTTCCATGACAGGAGTTGAATATGGCATTCAGTAATCCTTCAGCTGATCCAGCGGAGCGTTTTACATATTGCGCAATGCGCAGGAGAATTTCAGTCTGTGGCCGCAACAATGCGTCTTACATGCACAGGCTGGGACATTGTGTCAGCCGCAGTCAGCAGGCGTCCCTGCCAGCAGTGGCTGGAAATCCCACTGGCGTACTCTGACACCGACGAATTTTACCCAGTTGCAGGAGGCACAATTGGCTCTACGATTTACCTTTGGTCGCCGCACAGCCCGGCATCTGGATGGCAGAAAAACTTCAGAATTACCCTCCGCCTGGAGCGTGGCGCATTACGTTGAGTCAACCGGAGCGATGATTCGCCATTACTGGCCCGCGCGGTGGTTGCCGGACTAGCGCAAGCAGATACGC
-+
-,,..-./,--...-.-,--/,,-..-,-/--..-,-..--0...../..0..0-.-//0.//.-----/../0/+/,,.---/--------/-..--.--.-..-...--.,-.,,,--,.,++---,/-.,,-,-,--,-.,,++,,,.0-,,,/,+,++,.,/++,----0-,,,.,,,/,--/--.0-,+,-..-.0/-..-....00...0-0..15---..2//01/010011/.-..//1.1/1/01000--./0.-.0/./../-/.//./,..3.-..,,---/.-.--0/--/-,,,+-0.///.--.....,,,,-,,+,-.--.-,,.--,.-/-.---/,+,-02/0..-,,,,,,-++,+,,.,---,--.-,-+,--.,.-/0+++****+**+++*+,**,,-++,+-,,++++,***+-****))+)****)))*,)*+***,*+,--****+*
- at 9
-ATGATGCGCTTTGTTGGCGCGGTGTAGTCGTGAGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGACAGCGAGTTGAAGTGGGATTCAGTAATCCCTTCGATGATCCGCAGGAGCGTTTACATATTGCGCAATGCTAGCAGGGGCAATTCAGTCTGTGGCCGCAACAATGCGTGTCTTACCGGCAGGCTCGGGACATTGTGTCAGCCGCAGTCACAGGCGTCCTGCCAGCAGTGCTGGAAGCCACTGGCGTACTCTGACACCGACGAATTTTACCCAGTTGCAAGGAGCTAAGACAATCCAGCATTTACCTTCTTACTCCCGCACAGCCAGCGGCATCTGGATGGCAGAAAAACTGTCAGAATTACCTCCGCCTGGAGCGTGGCGCATTACGTTGAGTTAACTAGAGAGGTTGATTCGCCATTACTGGCCCGCGCGGTGGTTGCCGGACTAGCGCAAGAGCAGATACA
-+
-,,-+,,,-,,----,,,,-.-,----.---,/+.,+,,,-,+---,,-.----./,+.,./.-/-,+,,+.,-.,.+----+,.,,------,,+--.-,,-,,.,,-,-,,/+,,,-,,-//.,+-,--.,0,.,.-,,*,+-,.-,./,,.-..-,..-,,,.-,.,,,,0..-3-.--,,-,,---.--/-.-.,,-/.--.-,,,,.-.,..-..-/./././/-.../0.///./..0-/...-0...../../0/./2////./0012101/-.,.10...--.-..-0,./--./..-..-/0//1/....0-/.-----0--./...-,,,./0.-.---.----/,./02/1.0-,,,-.----.--.//.0.-----/.--0/...00/.../---.--,-,-,-,.-1...-.-/0/-.-//-...//.///.0/.-/.---/.---.0-.-.--.1/---..
- at 10
-ACTTATCCGCTTTGTTGGCGCGGATGATGGTGCAGGGGCTTACGACCTCTGGCAACCACTTTCCATGACAGGAGTTAATATGGCATTGAGTAATCCTCGGTTCGATCAGCCGAGGCTAGTTTTACATGCGGATCCGCAGGGGCAATGCGCTTGGTGGCAACAATCGGCGTCTACCGGCAGGCTGGGACATGTGTGTCAGCCGCAGTCACAGTGCTTTCAGCAGGCTGGAAGCCCACTGAGTACTCTGACACCGACGAATTTACCCAGTTGCAGGAGGCTAATGAGCCAGGATGTTGTGGCCTTCTTACCGCACAGCCGGCATCTCATGGCAGAAAAACTGTCACGATGGCTCCGCTGCGGCTCTTAGCATTACGTTAGAGTTAACCGAGGCTTACTTCGCCATTACTGGCCGCCCCTTATGTGCGTACAAGGGCCCAAGCAAGATACGC
-+
-,,,,,,,+,,,-+++*+,,,+++++++*),+++++**,*,++,+-+-,./,,,-,,.,,,,+,,,+,--.---,,++,---,-----,,,.--.///-0,,.+,,..+.,,-,,-+,,./.,++++,,,,,-,,+,--+-,,+,-.-+/+++++,,+.,,,-,,,,----+++,-,-.-,/---,-1-.-/--./-0-./-1....-..0-..1/-..-//..1////././-.--0.--./0--..-0.,--,.--,,,++-,--..+----,,,+**++,+++,-+++,*.,+++*.++**+-+*)*--+,++,++++**,++*+***,+,+-,+++-*+*,*++**,**,+-++*-++,+++*--++,+,.+*),+-******)++*))),****+)*,****,*+*,*,**+++*+*++)*)*******+****,+*,*++++,+
- at 11
-ATGATGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCCACGTAGACCTCTGGCAACCACTTTTCCATGACAGGAGTCGCAGAATATGGCATTCAGTAATCCCTTCGATGATCCGCAGGGAGCGTTTTACATATTGCCAATGCGCAGGGCAATTCAGTCTGTGGCCGCAACAATGCGTCTTACCGGGCAGGCTGGGACATTGTGTCAGCCGCATCACAGGCGTGCTGCCAGCAGTGGCTGGAAGCCCACTGGCGTGTTACTCTGACACCGACGAATTTTTACCCAGTTGCAGGAGGCACAATGAGCCAGCATTTACCTTTTGGTCGCCGCACAGCCCGGCAATCGTATCGGCAGAAAAACTGTCAGAATTATAAGCGCCTGGGAAGCGTGGCGCATCGTTGAGTTAACCGGAGAGGTTGATTCTCATTACTGGCCCGCGCGGTGGTTGCCGGACTAGCGCAAGCATACGC
-+
-/02/./.-..-.-----.,+,,.-.,.,--..-..-0,/.--,0//.000//.-/-//0./..-0--.-../01////11/0/100//00/0///1/.10000.0../.0/.210//000046101/.0/10//2...//0/-...-//.1.0....20.0/././...//0/.0,-,,,-.----...0/-----001/0/...-/./-./--./---/.,-,--/././/.../..../../..0.//1.-.--.-,--.-/1.1/../.0./.0/.,-.-/..--/-.,-.,-,,.--.,++,,-/-../-/.2.--,-,,---,,,-.,-..,,,+-,+,,+,,,,,,++..10,.+,,-,-/,,++*-.++**++++*,-+,+,*++,,+,/,+,+,--+,,,,,+,+,+.*+,,+-*++,,,+-----,,--,,+,,+,+-,,++.-+,,+.,+,-/+++,,+
- at 12
-ATGATGCGCTTTGTTGAGGGGTGGCTTGATGCAGGGTAGAGACTTACATAGCCTGGCAACCACCTTCCATGACAGGAGTTGAATATGGCATTCAGTAATCCCTCATGGGTCCACATCTAGCAGGGAGCGTTTTAAGTGCCCAATGCGCAGGGGCAATCGGTCTGTGGCCGCAACAAATGCGTCTACCGGCAAGGCTGGGACATTGTGTCATCGCATAAGAAGGCGTCCTTGCCAGCAGTGGCGGGAAGCCCACTGGCGTACTCTGAGACACCGACGAATTTACCCAGTTGCAGGAGGCAAGTGGCTCAGCATTTACCTTGGTCCCTAACACACAGCCCGGCATCGGATGGCAGAAAAACTGTCAGAATTACCCTCGCCTGGAGCGTGGCATTACCGTTGAGTTAACCGCGAGAGTGATGTCGCCATTACTGGCCCGCGCGGTGGTTGCCGGACTAGCGCAAGCAGATACGC
-+
---.0-..0-------,,,.-,,./---/--./--++,,,+.-,,.+,,-,.,,0--++-+-,,,+,+,+,+*.,-+/+,+*+,,+,++----.,+.,--,..,+./,,,++++-,.-,*.,,,,,--.1../,+,,,,,++,,-0.+,-,,,,,,.,,+*-,+-,,,,+.-+,-.-.,.0--,+,,,,,--.-.1,,+,,0./..--,,+/,,/-----,0/21-/-.--./,.-..--/,-,-.-.,.,0----.-,,-.-.1/,,,,...---/+++--+-*,-++*+++++++-+++++,+**+++.-,,,++++,+*,*+*****,+,,,,,,,,,.--,,-,-,,--,,-./1./--..-.--.,.,--,..../0.//0.-/.//./..1/0...0.///0/...///./..--/,-000/1.///.----..-,/.,-,.,-,+.-,-,.-,---,+.,,+,-,
- at 13
-ACATGATGCGCTTTGTTGTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGTGGCAACCACTTTTCCATGACAGGAGTTGAATATGGATTCAGTAATCCCTTCGATGATCCGCGCAGGGAGCGTTTTACATATTGCGCAATGCGCGCAGGGGGGATCTTCAGTCTGTGGCCTACGCAACAATGCGTCTTACGGGCAGGCTGGGACACTATTGTGTGTCAGCCGCAGTCACAGGCGTGCTGCCAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACACCGACGAATTTGTACCCAGTTGCAGGAGGCAATGAGCCAGCATTTACCTTTGGTCGCCGCAACGCCCGGCATCTGGATGGCAGAAAACTGGTACGAATCACCTCCGCCTGGAGCGTGGCGCATTACGTTGAGTTAACCGGAAGAGGTTGATTCGCCATTACTGTACCGCGCGGTGGTGCTCCGGACTAGCGCAAGCAGATACGC
-+
-..0-/....-..-...---...-/-,....--0-0....//00-01111101300./..--0.///.1/.-/..--...-////////3/..2./10..//././,.,-,--.--1--0.......23/...,/.0./1.//../-.,,,/--,--++,,-,-+-.-/0.--,+,,++.++++,-1+20,-,*++****-+++-+****,,++-.,--,,++,*-,.,.-,,--..0,/,+,*+++,,,-------,,/--..-/../.1-/,-.-2-./.0..,--,-,-,,,.,..,1-0/.--,-.----,-0-,,.---..//,----,-+-,,-.----0.0--...-0--//./...---001/3./--0-//..-//..1/2//00//00./-..00//01/0./.././00//.-010/...////1./110.0.-..././/0//.20../.-,/-,..----0--.-.././.2./
- at 14
-ATGATGCGCTTTGTTGGCGCGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTCCATGACAGGAGTTGAATATGGCAATTCATGTAATCCCCTTCTATTGACTCAGGCATGGAGCGTTTTACATATTGCGCAATGCGCAGGGCAATTCAGTCTGTGGCCCGCAACAATGCTTTGCCTTACCGGCAGGCTGGGACATTGTGTGTTTAGCCGCAGTCCACAGGCGTCCTTGCCAGCAGTGGCTGGAAGCCCACTGGCGTAGTACTGACACCGACGAATTCCCAGTTTGCAGGAGGCACAATCGGCTACAGCATTTACCTTTGGTCCCGCCGCACAGCCCGCGGGCATCTGGATGGCAGAAAAACTTGTCAGAATTTACCCTCCGCCTTCGGAGCGTGGCGCATTACGTTGAGTTAACCGGAGAGGTTTTGATTCGCCATTACTGGCCCGCGCGGTGGTTGCCGGACTAGCGCAAGCAGATACGC
-+
-/.--,----,--.-,--,,------,,----/,-,-.-+.....//00./.-,-/,...-/.,+,,,+.,,-0+.------.-,,,-,--,+--,+/-.-,++,+++++,-++-..,,-,.,-./--/++-----,,+,+++-,,+,++**++++,,,,.0-,.,,-++.++-.0,//+,.-++,,++++,+.--.-+,+++//..-,,+,++,+.,.+--+++**-,-+--*++++,+,/-//--,--+/-,-,-,---/-.-/,+++,--,,,--0,,----,-.--...-,.,,,,-+--++-,,,.-+*+--+-./..-..2.---.,,+.,.,+,,.,,+*+++*-++++--,+,++,,++,-021,-++,+++-+-++,+-,,--/-,-,----0//.---///..0//--./.1.././-./././//.21//.//01001/1100//3100/./0//..0..-/.-..--....-,.++,-.+
- at 15
-ATGATGCGCTTTGTTGGGGTGCTTATGCCGCAGGGGCTAATCGACTCTGAAGCCACCTTCCATGACAGGAGTTGAATATGGATTCCGAGTAATCCCTTCGATGATCCTAGCAGGGAGCGTTTTACATTGCGCGACTGCGCAGGGGCAATTCAGTCTTACTCCGGCTCTTGACAATGCGTCTTACCGGCAGGCTCGGGACATTGTGTGTCAGCCGCATTACAGCGGGCGTCCTGCCAGCAGTGGCTGGAAGCCCACTGCGGGGGTCTATACTGACACCGACGAATTTTACCCAGTTGCAGGGAGAGGCACAATGAGCAGCATTTACCTTGTTCTGCTTAAGCACAGCCCGGCATCTGGATGGCAGAAAAACTGTCAGAATTACCCTCCGCCTGGAGCTCCGTGGCGCATTACGTTGAGTTAAACCCGCAGAGGTTGATTCGCCATTACTGGCCCGCGCGGTGGTTGCCTGAGACTAGCGCAAGCAGATACA
-+
--/0---./---.,,-,-,-/.-,,,/,/-,----//-,-/../0/-.1..-./.,.,,,,--,/-/--...-.1--/0.-..../.-,,/./../..-.--/...--,,0./....../-..,,-/.-.,-++.,-,,/..-,,/-,-,0-,+,/+-+--+.,,.,-+-.++-,+,,,.++-,-,,+.,,-,+,+++,---,+,-,+,,,+,-,..,++-++,+,+.,+,++++,,+--,-,,,-,+,,,,,+,,.+-+++,,,++*,*-+..+-,++.-+**+..+*,+,+--,++++,+++--++,+,,,,+,,,,--.,,--+,+-,++,+-,+,-,,---,-.-./.-.,,.-..,,,,,,1.21.0-,.,,,,.-----....1./////0.....//../0/0/0/0/...1-.----/---//--.-//-.1/-00/-/-..0.-.0/..--,/,+,--,+++,/-,,,,/----.,0-,-..
- at 16
-ATGATGCGCTTTGTTGGCGCGGGTTGGCTTGATGCAGGGCTAATCGACCTCTGGCAGACCATTTTCCATGACAGGAGTTGAATATGAATTCATAGTAATCCCTTCGGATGATCGCAGGGATGTTTTACATATTGCGGGCAATGCGCAAGCGGGGCAATTCGCCAGTCCTGCCGCAACAATGCGTCTTACGGCAGGCTGGGACATTGTGTGTCAGCCGCAGTCACAGGCGTCCTGCGCCAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACACCGACGAATTTACCCAGTGCCAAGGAGGCACAATGAGCCAGCATTTACTTTTGGTCGCCGCACAGCCCGGCATCTGGATGGCAGAAAAACTGTCAGAGAAATTACCCTCCGCCTGCGGAGCGTGGCGCGATTATACGTTGAGTTAACCGGAGGTTACTTCGCCATTACTGGCCCGCGCGCGGTGTATGCCGGACCCGCGACTAGCAGATACGC
-+
-//.-/.0.-///--,-,,-.,,,.++-+-+,,+.++-+-*+,,,,,++,+-,+*+*+*+,,*,-)))++*-++**)),)*+)*+*+,**++*,*+,+,,,++++,,)*,++**++,,,++-++)**+,/,,-,-+.-+.,--.,+,-+*+++++*+-++-,,,,-..+,,+*+++-1.-.0,,/,-*++,,,,,-++++-+,-.,-.-,/,,,--,-/,.-,.01-.-.-,--.//,/-./../.---,,,-./,.-.--.-...//0./.00.....00011.--/.-,.----/....,../././-./.0/1012..///.--/--.-/,-..0.0-./1......-./...--0.202100---,,-//-.--,---.-/-/...-,-,/--,-+-.-,,.+,-/--/-,,-+.,,-,,-.+,+,+-,,-,--,-,,-.,/,,/,./-,,-/0,,--/-++.++++++,+++,+++,-+.+,
- at 17
-ATGAACACGCTTTGTGTTGGCGCGGTGGCTTGATGCAGGGGCGATCGACCTTAGGAGCAACCACTTTTCTAAGTGACAGGAGTTGAATATGGCATTTTCAGTAATCCCTTCGTACGAGGGCAGCGTTTACATATTGCGCAATGCGCAGGGCAATTCAGTCTGTGGCCGCAACAATGCGTCTTACCGGCAGGCTCCACTTGTGTGTCAGCCGCAGTCAGGCGTTCTGCCAGCAGTGGCTGGAACTGGCCCACTGGGCGTACTCTGACACCGACGAATTTTACCCAGGTTGCAGGAGGCACAATGAGCCAGCATTTACCTTTGGTCGCCGCACAGCCCGGCATCTGGATGGCAGAAAACTGTCAGAATTACCCTCCGCCTGGAGCTGTGGGCGCATTACGTTGAGTTAACCGGAGAGGTTGATTCGCCATTACAACACGCGCGGTGGTTGCCGGACTAGCGCAAGCAGATACGC
-+
-/1..-..-/00100...--....,-,1.-///--0----,/1-..../-/,.-,,--.../220..-,,,-,,/---.-.--/----------/..-..--2-.020/././-../--././/2/0//0062211/..4//11./0./--.-//.0-.-/-/--..-.///40012../..--,,-.//--,-,--,-.-.----,,-,--/-..---.,.,++,,,,.---+/----,.+.-/.,.,.,/-,,-,--,1,-,..-.,.,,,02/./.,.,---,-.,0---,,---,,--..,-/-/-/-//../../--/.,-,,,--.--.----,-,.---./-----.///..-,,,.1,/.,.,,,,,-.,/-.,,.,/-,,,/..-,-.0.-,,-,-,,,,,-,,,.-,,,-+,,+--,-,,.,,-+-,-,-0-,-/,.-,,,,--,..-0----../-..--/.
- at 18
-AATGATGCGCCGTGTTGGCGCGGTGGCTTGATGCAGGGTAATCGACCTCTGGCAACCACTTTCATGACATAGGAGTTGAATATGCATTCTCAGTAATCCTTCGATGATCCGCAGGGAGCGTTTTACATATGCGCAATGCACTAGGGCAATTCGAGTCTGGGCATTAAAACCAATGCGTCTTAACCGGACCCAGGCTGGACAATGTGTCAATAGGCGAGTTCTAATATAAGAACGAGTTAGTGCCACATAGCAGTGGATGGGAAGGGACTAGGGTGAATCTGGTGACACCGACGAATTTGAGAGTTTGCAGGAGGAGCACAATGAGCCAGCATTTACGTCCTGGTCGCCGCGCACAGCCCGGCATCTGGATGGAAGAAAAACTGTTACGAATTACCTCGACCCCCGCTCCAAGTTAGAGATGCCGTTGAGTTAACCGGAGAGGTTGATTCGCCATTACTGGCCCGCGCGGTGGTTGCTCACGGCGGATCAGTCAGCAGATAC
-+
-+,.,,,.,/.-++,,*+-.++*,+-+,-,++,*+**,+*+,,,+,+-+,,++-+,+//++++**+,-,-+,-.-,.,*+,.-+.,-,,.+/,+-+,.-++,++,--,,,+,,---,,-0--0,*,+-,,-,+,++*,+-,))*,*++*,-+****++)))))+('(((*(*')(*((''(()''('()'''''*'(('()'''''&&&&)''''''''))'')*)&'('(')'')&'''''*')('')('*()))(*)+()+*(*)+*))+))****+*++*))*+,*+++,-+,,,**-+++,,++.++,*-,-+-,-,.-.,,-,.-/--/,,.-/.,/,--,--+/,,,.-.--,-,.,1.,,0,-,+++,--,//.-.,*-*.+-+/,+,-+-+.,,,..,,,------,+,-,--.-,/-,,-,-++.,,.++-+,-,-/+,,+/-./...----.,,-,,,+--/+-,,++,,,+-+,+-+-,.-.-,+/...++
- at 19
-ATGAATGCGCTTTGTGTTGCGCGGTGGCTTGATGCAGGGCTAATCGACCTCTGGCAACCACTTTCCATGACAGGAGTTGAATATGGCATTCAGTAATCCCTTCGAGTGAGCGCAGGGAGCGTTTTACATATTGCGCAATGCGCAGGGCAATTCAGTCTGTGGCCGCAACAATGCGTCTTAAGCAGGCTGGGACATTGTGTGTCGACCGCAGTCACAGGCGTCCTGCCAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACACACGACGAATTTACCCGATGTCCAGGAGGCACAATCAGCCATTTACCGCTTTGGTCGCCGCACAGCCCGGCATCTGGATGGCAGAAAAACTGTCAGAATTACCCTCCGCCTGGAGCGTGGCGCATTACGTTGAGTTAACCGGAGAGGTTGTGATTCGCCATTACTGGCCTAGGGGTGGTTGCCGGACTAGCCCCAAGCAGATACGC
-+
-/.0../000122030.2...//./.10///.1/1.//0/1.002100/202110100015///0.1.//2///2/01.1011101122010113003241113/0003000011001201214/100222312012011100//0..00211/./2--.-----/.-.-/./0.21.-.-..0.-.0--,+0---.,-+,.++*.**--,+,,,-,,.,--,---+-,,.++.++*++*++++++++-.,,,,.,+.,-,--,-+,,,.,,,,+**+*+**-+,*+,,-*----,.-,,+-,,++*+*+,,,-*+++*+,,,,,+,,.---.-.-0.-,,/---,,/----,.-,,,.2//.,-.....1.//1///3/...-./--../0-0----,,/--.,-,-/,-+.,,---,------,,/.,-,+*+,++,.+,+++++,,+-+,+**++,--,+,-+1,,
- at 20
-GTACGAGGCTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTCGCAACCACCTTTCCATGACAGGGAGTTGAATATGGCATTCAGTAATCCTAGTTCGGATGATCCGCAGCGGAGCGTTTTACATATTGCGCATGCGCAGGGGCAGATTCAGTCTGTGGCCCGCAACAATGCGTCTTACCGGCAGTAGATGGGACATTGTGTCCTAGCCGCAGTCACAGGCGTCCTGCCAGCAGTGGCTGGTGGAAGCCCACTGGCGTACTCTGACAAGGACGAATTTACCCAGTTGCAGGAGGCACAATCAGCCAGCATTTACCTTTGGTCGCCGCACAGCCCGGCATCTGGATGGCAGAAAAACTGTCAGAATGACTAGCCCGCTGGAGCGTGGCGCATTACGGTCGAGTTAACCGGAGAGGTTGATTCGCTTACTGGCCCGCGCATTGGTCGTAGCCGGACTAGCGCAAGCAGAACAA
-+
--+.-,.,.--.-,,/--.-.-1/--.,--0----.0--/../.2---/,/--/-.14/..0--0..//.///...0/-.///.0/.,,.3-./-./0/,,./--1-.0/--,.-,/,/-,--..,-,+,-/-./-,+..--0,-+,++,+++++,/++++-)-**+,**+-++,++-..--+,+***++,.++*)+****/,+++++***-*,,+---+,,+,..-/,++)+++++,+-++-++,.++,,,,,--,,,--/-0./.--0-..10.,--./..//---..0-/-.1..0.-01./-/....0//053/3.-////--/--.--/...0./--/00//.----/-,,--././0//.,/++,-,,.,,+--,-.---,---,+,,,,-,+-+/++,+..,-,,,,+**++-,-,-+-,,,-,.,.++++,+,0++-,,*+,+*-+,++++..+,,+,,-,-,-.*,,+,+
- at 21
-ATGTTGCTTTGTTGTGCGTGGCTTGATGCAGGGGCTAATTAGACCTCTGGCAACCACTTTCTCATGACAGGAGTGAATATGGCATTCAGTAATCCTTCGATGATCCGCAGCCATAGGGGAGCGTTTTACTATCCTAATGCGCAGCGGATTCAGTCTGTGGCCGCAACAATGCGTCTTACGGCAGGCTGGACATTGTGTCCTACAGCCGCATGTCAGGCGTCCTGCCACTGGCTGCTGGAAGCCCGGCGTACTCTGACACTAGACGAATTTTACCCAGTTGCAGGGAGAGCAACGTATGATCTAAGCGTTAGCTGTTATCCCGCAAACAGCCCGGCATCTCAGATGGCAGAAAAACTGTCATAGAATTACCCTCCGCCTGGAGCGTGGCAATTACGTTGGAGTTAACCGGAGAGGTTGATTCGGGGTCTTACTCATCCGCGCGTGGTTGCCGGACTCTAAGCAGATACGC
-+
-**())*+)*+***)++)*++.+,+.+,,,***++,*++++**,-++++-++*-+-,-,,,+),*+*+-,+++*--*++++*+)*)*****++,-,,****+*++********+*),****-+6,**+*+*+,++++,-.-+,++-**+++++,-,+*++,+-++++-,/-./,,-*,+.,,-,,,-,,++-,--,-+-+++*,.++-,-,,*-+*+,.,+,+++,*,+,*+,-,+++.++++***+--*)+*-/,+.+,***-+,-,.-,,*,**-,,,,,,,*+++,++*+-,++-,+-+*,.-..,,,,,.,,,*****,+*++-,+++++.-,,,,,*++,*+,,++,.-/,--++++*))**+**+,-,,,,+-,-,,-,+****+,**+,,+*****,****))*))**+++,,+,,*+++++*+,+++*+**+,+++,***,,*****++***++.,+++,,,
- at 22
-ATGATCCAATTTGTTGGCGCGGTGGCTTGATGCAGGGGCTATAAATCGACCTGGCGGCACCACTTTTCCATGACACAGGGGAGTTGAATATGGATTCAGTAATCCCCTTCGATGATCAAGCAGGGAGCGTTTTACATATTGCGCAATGCGCAGGGGCAATTCAGTCTGTGGCCGCAACAATGCGTCTTGAAGGCAGGCTGGGACATTGTGTGTCATGAGCCGCAGTCACACCGTCCTGCCAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACAAAGCGACGAATTTTACCCGATCAGTTGCGCAGGGGCACAATCAGCCGAGCATTTACCTTTGGTCGCCGCACAGCCCGGCATCTGGATGAGGCAGAAAACGTCAGAATTACCCTCCGCTGGCCGCTACCCTGCGCATTACATTCAGGTTAACCCGGAGGTTGATTCGCCATTACTGGCCGCGCGGTGGTTGCCGGACTAGCGCAAGCAGATGGGA
-+
-//-..-..0-////-.../0.0.41../12.0./../01./.0001110/0000/11020342421/020/10020111012/2//031/110122212211220/0/03/13//0/1000000//15141.1../001/00.1/111./..-,.,1-.-.4-0/.-.,,,++-+,,0.--/+.+,+++,++..,,.+,,++,+-.+,-+-+..++++,+,,,,-.-/,,,,,..+..-.,.0-,/,+,++,+,.,+-,+.-.,,-/-----...-----../--10-,++-,++,/,--,+,-0,,,.,-,.,---,,,-+,-1-,/+,,.,-++++++,,+---.,.,-,.-,,0-,+--,*,-,+,-,,,,-+**+,+,*))*)**,+++*++**,)+*+*)+*+++*)****,),*)+)())))**,++**.*+*,*)*+,+*++++++.,,***+,*--,++++++++,,-.--//.--/-,,.
- at 23
-ATGATGCGCTTGTTGGCGCATGGTGGCTTGATGGTGCAGGGGCTAATCGACCTCTGGCAACCACTTTTTCCATGACAGGAGTTGAATATGGCATTCAGTAATCCCTTCGGATGATCCGCAAGGGAGCGTTTTACATGATGCGCAATGCGCAGGGAATTCAGTCTGTGGCCGCAACAATGCGTCTTACCGGCAGGCTGAGGACATTGTGTGTCAGCCGCAGTCACGCAGGCGTCCTGCCAGCAGTGGCTGGAAGCCCACTGGCGTATACTCTGACACCGACGAATTACCCAGTTGCAAGGAGGCACACAATGAGCCAGGATTTTACCTTTGGTCGCCGCACAGCCATCCGGCATCTGGATGGCAGAAAAACTGTCAGAATTACCCTCGCCTGGAGCGTGGGCGCATTTACGTCAATTAACCGGAGTAGGTTGATTCGCTTACTAACTGCCGCGCGGTGTGGTTTGCCGAGACTAGCGCGACCCATGCC
-+
-/0//1/3.../1/../../.-.-.-.//./-,.-.......0..//00/3.3/10/.//.-23../..--/.///.0/2/.1.//110//.3.0.//.1//01....,/-/0/...-/...//./120//..///1/.//.0/.//0.0./.-../.40.41.././.--.0./20/22/./0...-/.01//0./0-0-2//0/0--0-0--.........--,..,0---,,-.,---20,--/,-,,+,-,+,,,/-/-/-/,,-/--1--.-.-.-.---,-,-,,./,-,,--.--..-0///0//-./...//200.././0...-.--0/./00.31110..02./00....-..,-0-///0/-/,,,.-.-,-/--1.--.-,-,.,,,+,,-../,--,/,/,-,+,-,,,+-,**,,-,+,-+++++*****-+,,+,/-.-.++.,+-.++++++,*-+++,/-,,.,,,.+,,,
- at 24
-GTCTAATGCGCTTTGTTGGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAAACGGTTTTTCCATGACAGGAGTTGAATATGGCATTCCGTAATCCCTCGTCGATGATCCAAGCGGGAGCGGTCTAAGTATTGCGCATATGCGCAGGGATTCAGTCTTGCGCCGCAAACAATGCGGTCTTGTACGCTCCGGCAGGCTGGGACATTGTGTCAGCCGCAGTCCACAGGCGTCCTGCCAGCAGTGGCTGGAGGAAGCCCACTGGCGTACTCTGACACCGACGAATTTACCCAGGTTTGCAGGAGGGCACAATGAGCCAGCATTTACCTCGGCTTCTGCCGCACAGCCCGGCATCTCATCGTAAGCAGAAAAACTGTCAGAATTACCCTCCCCCTGGCTCGCCATGTGCGCATTACGTTGAGTTAACCGCGAGGAGAGGTTGATTCACCCACTTGAGCCCGCGCGGTGGTTGCCTGTACACAGCCCACGGCAGGATACAC
-+
-,.+*++/,.,-,--,.+-++,+++-,-+-+++.,*++-,*,,,,+,--.,-,++++..---,,,+++++++.,,,+,.*+**+++*,-,+*,),*+++*+**),**+,+++****+)),),++***+)()+**)+*+*,))*)-+-*+++*-+*+,**+,)+**)*)***+++*,*+,*,-.*,-**++*,,,,+-,,--,,++,---,,-,,,--.---.-,,,-1--,/-+,,,-/-0-//-././.-,..,2..------,-/---,.-,-/----,-,-..///--,-,,,,.,-,,-.--+,,+-.,.--,.,/,...-.,--+-,-..,,-.++,,/-..--,,./..,-.--,-,.,,/-,,./21./.-,-,+,.-,+,,,.-..-.-/-,.,-,-++++++..,,---.,-++-++-*-++*+*+*+*-+/+,+++,*))*+***,****+,-,-,++,,+**,+)*))++**-)),*+*,+-*,**),,*
- at 25
-ATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCGAACGACAGGAGTCGAAACTGCATTCAGTAATCCCTTCAGATGATCCGCAGGGGAGCGTTTACATATTGCGCAATGCGCAGGGCAATTCAGTCTGTAAGGGTAACAATGCGTTTACCGGCAGGCTGGGACATTGTGCTACGCGGATTACAGGCGTCCTTGCGAGCGAGTGGCTGGAAGGCTCCGACTTACTCTGACAAGGGACGAATTTACCCAGTTGCAGGAGCCACATGCTACAGCATTCTACCTTTGGTCGCCGCACAGCCGGCATCTGGATGGCAGAAAAACATTTGAGAAGTGACGACTACGCGCCTGGGACTGTGCGCACATTACGTTGAGTTAACCGGAGAGGTTGATTCGCCATTACTGGCCGCGCGGTGGTCTCAGCGATTAGCCCCAAGCAGATACGC
-+
-/..-/0//001//.--..--,-.//.-.---1-...-/---/./-1.1./.--2--,..-,--+.+,-+,--...,--,.,-..-/..-.,-/.-0/0.-,-,/,-./--,-----.---11/..,./0////.-.0./.1-..-/----0/.0./.,,-,-,,-.-,-.../2,,.,,++,,.---.++**+0,,,,++****)))++*+***+*-+)+**,)**)))+***+,+*))(()**(*)(+)*)))*)+)*),+*(((*)(+*++(()())*+**)+**)))**++*+**++++-+,+,+**+*+)***)***++++,+,++++,+.,+*+,*****,,.,+,,,++)*)*)**+*+++**++,+0,,0+++-*+,,++,.+*,,,+,,,**+*,*)*)*,++++++,+-+,,,.-,--,+,.-.--..--,,---,,-0/--,//--.-..--..0.-...00/
- at 26
-ATGGATCCATTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCTCATGACAAGGAGTTGAATATGGCATTCAGTAATCCCTTCGATCAGCCGCAGGGAGCGTTTCACATATTGCGCAATGCGCAGGGGGCGATTCAGTCTGTGGCTGGCAACAATGCGTCTTACCGGCAGGCTGGGACATATTGTGTGTCAGAGCCGCAGTCCACAGGCGTCCTGCAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACACAGCACGAATTTTACCCAGTTGCAGGAGGCACAATCATCAGCATTTATCTATTTTGGTCGCCGCACAGCCAGGCATCTGGATGAAGCAGAAAAACCGATTTACGATCCCCTCCGCCTGAGCGGGTTGGCGCATTACGTTGTGAGTTAACCCAGGTTGATTCGCCATTACTGGCCCGCGCGGTGGTTGCCGAGACTAGCGCAGGCAGATACGC
-+
--0-,--,--,-.,,,,,--/,,,.,,,,,-,.,,,-,.,,-/.--.-/./.-,--,-1/-./.,--..-.,-.-//.-/.--./.000//.1/.11/.00---.--/-//--.-..-..-02./-,0--.////..-/-///,//--+,-+++--.1,,.,,.,+-++,,+-++,-.0++-+-.***,,,,,-,++**,**,+-,++**-**-**,++,.+*+*+++-,0,+.++,-.+.--,,-,--,++*-,,--,/.--,-,,,-,-++,,-,,------.,*-*,-,+.+++,,,++-+.,,--,-,+,++++,-+*+++--,**+*****.+**+**++)-+,*-+****)+*)*))***,++-)))*))+*+**+++,,-,+*++++-,++-*+*.,3++,,.,,*.++-+-++++++..-..,--.,-,-.,--,./-.-.0....,..,/.--.--.---.-1/...-.-,-0-//-
- at 27
-ATGATGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATCAAAGGAGTTGATATGGCATTCAGTAATCCCTTCGGCTGATCACGCAGGGAGCGTTTTACGTTCTGTACACAATGCGCAGGGGCAATCGGTCTTGTGGCCGCAACAATGCGTCTTACCGGCAGGCTGGGACATTGTGTGGAGCCGCATTCGCAGGCGTCCTGCCAGCAGTGGCTGGAAGCCACAGGCGTACTCGACACCGACGAATTTACCCAGTTGCAGGAGGCAATGAGCCAGCATTTACCTTTGGTCGCCGCACAGCCCGGCATCTGGATGGCTAAGAAAAACTGTACGAATTTACCTCCGCCTGGAGCGTGGCGCATCATGTTGAGTTAACCGGAGAGGTTGATTCGCCATTACTGGCCCGCGCGGTGGTTGCCGGACTAGCGCAAGCAGATACGC
-+
-..0..00-/1../--.--.,-/.--,/--./-/.//.-.//.0/0.//02/.-0.0/.-../----,,/.-.2..-...---./0-.0.-/-.../--/-,.,,-,,++.-,-,,.,,.1---,,-,-.--,,,.---,./---++,,--,,+,,,,,,-,,,-,,,,,,//.--2,.-,,,,,-+---.1+++*+..-,-,-+,,,,+,+,+,+.,..,,/,/,+++,,,,,,,--.,,++-+-.,+-,+,--,--,,+-,//-,-.,/..-,+-+--,-,-,,,,.+,-,,+0+**-,+--.,-,,,0,++++***+*))++)*)**,**,*,++++++*+*))*,,//,+,)),))))))))+**-*.++,+,,--,.+,,-,,-+,,,+,++--,-,,+++,,-+,,00/.0...-0./.00//..00./.,./-.-,--,-/-,-..---......0/2//
- at 28
-ATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAAGGCTAATCGACCTCTGGCAACCACTTTTCCATGACAGGAGTTGAAATATGGCATTCAGTAATCCTTCGAGATGGTGCCGCAGGGAGCGTTTTTACATATGCGCAATGCGCAGGCAATTCATCTGTGGCCACCGCAACAATGCGTCTTACCGGCAATAGTAGATGTGTCAGCCGCAGTCACAGGCGTCCTGCCAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACACGACTGAATTTGAACCAGTTGCAGGAGGCACAATGAGCCAGCATTTACCTTTGGTCGCCGCACAGCCGGCATCTGGATGGCAGAAAACTGTCAGAGATTAATAGCTCGCCGCCGGAGCGTGGGCGCATTACGTTGAGTTAACCGGAGAGGTTGATTCGCCATCTTACTGGCCGCGCGGTGGGTTGTCTCAGGGACTAGCGCAATAAGGTTACGC
-+
-/..--.../00.--,,-...-../0..-,--.---,,,,--.---,--./,-/,-..-----+,+,.,-,---,,-++.,----,,0,-.---.,--,-,,,.,,.--+/.,+.-,,--+-...-+,,-,,.,,,,*,,,,++++,*++*++,-*+**-********+++,.+*,,++++,+***++,++,++,*+,,,,+*.*,,+-1+*++-,,,/-,0+++,+-+,-.+-,-----,---,-.....-..-//0-.--..--./0/./0,,//-/00----.-.-,--,--///--.-/-.-..,,....0,/-,--,...,/,,-.-,-,--,,---,,/,.......,,.+,,+,-+.++,+,.,,,,.+,+,,-.,,+-,-.,,.,,-,,-,+++**++*++,--,,+-+-++,,+*,,+*,*++++,-,,,+-,+**,++*+*,+,,,,,,,,,,,+++*++****-+-
- at 29
-ATGATGCAGATTTGTTGGCGCGTGGCTTGATGCAGGGGCCGTAATGGCGGGACGGTTTCCATGACAGGGGAGTGAATATGGCATTCAGTAATCCCTTTCGATGACCATCCGCACCGGGAGCGTTTTACATATTGCGCAATGCTAAGTCGAGGCAATTCAGTCTGTGGCCGCAACAATGCGTCTTACCGGCAGGCTGGGACATTGTGTGTCATAGCCGCAGTTACAGGCGTCCTTTCAGCAGTGGCGCTGGAAGCCACTGGCGTACTCTGACACCGACGAATTTTTACCCAGTTGCAGGAGGCACAATGAGCCAGCATTTACCTTTGGTCCTACGCACAGCCCGGCATCTGGTTGATGGGCAGAAAAACGGTACATAGAATTTACCCTCCCGCCTGGAGCGTGGGCGCGTACGTTGAGTTAACCGGAGAGGTTTTGATTTCGCCATTACTGGCCCGCGCGGTATTGCCGGACTAGCGCAAGCAGATACGC
-+
-++-++,,,-)/.++,+*+++++-+-,++,+-,,+-,*+-*.+,/--0+.+,+-,--,,+,,+.,,+,,,,--,/--...-/..-..,,/-.-.0..,.+-+-,--+.,,.,--.,,./..23---,---..0-.,,,,.,,,+,+++,**,-*++++,,+,++,+,,,.++***-,+-/,,,**+**+*+**+-*+**++,-,-.,,,,,,+,/,.+,-,++,--.,4+-,++,,++,-,-----.---,..-.-/-.-/..----/..--//--//0---,./.,.-00//0./-../-1.-./101.--/.----/.-.-0---+-,-+,00-,./././-0/-.-..-.-,/.---,,,,...0/-,,+--,,,/1/....-...-0..,//---.2/-,.1-0..,-/--------,,/2-..,/,/--,1-.-.,,-.-/-.-..,-,,-,,,++++,++-,++-,,,-,1++-,++-+,,--,
- at 30
-ATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGACAAGGATTGAATATGCATTCAGTAATCCCTTCCATGATCCGCAGGGAGCGTTTTACATATTGCGCAATGCGCAGGGAAATTCAGTCTGTGGCCGCAACAATGCGTCTTACCGGGGCAGGCTGGGACATGTGTGTCAGCCGCATTGGCAGGCGTCCTTCAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACACGACGAATTTTACCCAGTCAGTTGCAGGAGGCACACAATGAGCCAGCATTTTACCTTTGGTGCCGCACAGCCCGGCATCTGGATGGCAGAAAAACTGTCAGAATTACCCTCCGCCTGAGCCTTGGCGCATTACGTTGAGTTAACCGGAGAGTAGGTTGATTCACCCATTATGGCCCGCGCGTGTGTCGTTTCGCCGGACTAGCGCAAGCGAGCAGATACGC
-+
-,,,+,,-,.,,-,,-,1---..-+-,-./1...-,,--,.-./----.--../..0////./.10-/--.-//,-/....-.-,,-.,/1.1/.-..2//10.///-...1/.-,,.../.21.00-./----...-.0//13/---..-,--,-...//-0-,,0.-/.---,,/--.,---,-,----2.--,.----.0.-//--,-,,-,,.--,--,--..0,/,.-...-..0//000---..0.,0-.-.-,.-----/0/-///0//-//0/001/0-../..,/,.-.+..----/-.-1.0....//2../-.0.020---/,,-----.,-----/,-----.-,.,,,-.----0.--.0,,,-,,,/,,+--++,---/,,,,,+--./-+/,,-,...-./---/-,0.,+.,,,,--,,+,.,.,,-.-,,----.-/,.
- at 31
-AGCCAGCATTTACCTTTGGTATGCTTCTCGGCACAGCCCGGCATCTGGATGGCAGAAAAACTGTCAAGAATTACCCTCCGCCTGGAAGATGTGGGATTACCAGTTGAGTTAACCGGAGAGGTTGATTCGCCCGGTCAGCCTGGCGGGGGGTTAGTTGCCGGACTAGCGCAGGCATCAGGCTG
-+
-,,,+++-./-.,-,..,,,,+.,--*-,+++,+,,+++,++.,,,,++++**++**++-,*,+++))*+)**,*+*++.+-+,.++-.-+--++++++***++,*-+*,)**+)))+,*,+.,.--,,++*++****,+*,**,*)*++*,-**+*++*+*,+**+,+,,++,**))))(*,
- at 32
-GTGATGCGCTTTGTTGAGCGGTGGCTTGATGCACCAGGGGCTAATCGAGACCTCTGGCACCACTTTCCAGTGACAGGAGTGAATATGGCATTTCAGATCATCCCCTTCATGATCCCAAGGGAGCGTTTTACATATTGCGCAATGCCAGGGGCAATTCAGTCTGTGGCCGCAACATGCGTCTTACCGGCAGGCTGGGACATTGTGTCAGCCGCAGTCACAGGCGTCCTGCCAGCAAGTGCTGGAAGCCACTGGCGTACTCTGACACTAGACGAATTTGGGCGTTTGCAGGAGGCACAATGAGCCAGCATTTACCTTTGGTCGCCGCACAGCCCGGCATCTGGATGGCAGAAAAACTGTCAGAATCTAGCTCCGCCGGGGAGCGTGTGGCAGTATTACGGTCCAATCGGAGAGGTTGATTCTACGTCTATCGGCCCGCGCGGTGGTTGCCGGACTAGCAAGCGAATACGC
-+
-)+**++,++*++,*++*,+,*+++**)+**+,+)))-*++*)*++*,*,+++,,-+,**+,,-,-,+***+++,,,,.++.+,,+,++,,+++,+,+-+,++++,+++*+--,,,+,+++---00-.,++,--+,,,,+,,-,.-,,.+,,,.--,-.,...---.-,,,,//.-./,++++,,----,,/-,,,,,.,.-.-,,,,,,,-..,,,,,,-,/+******+++++,++++,+***,-,,-,,,+-+,,+,0,,+,,+,++,+,++,-+,+-,,,,-+,---+,/+,/0,1,,,----.-,-+++,-++*+**+,+++,,++*+++,+,+,+++*,+,+*+.+/,**))(()*()()()()()**)*))*))*+)))+))*))**))+(()(((((((()*(*)))+*)**)****))**)********+*))*))))*))*+***+++++*,**,*+++
- at 33
-ATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGCTAATCGACCTCTGAACATTTTCCATGACAGGAGTTGAATATGGCATTCAGTAATCCCTTCGATGATCCGCAGGGAGCGTTTTACATATTGCGCAATGCGCAGGGGCAATTCAGTCTGTGGCCGCAACAATGCTTACCGGCAGGCTGAGACATTGTGTCAGCCGCAGTCACAGGCGTCCTGCCAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACACCGACGAATTTACCCAGTTGCAGGAGGCACAATGAGCCAGCATTTACCTTTGGTCGCCGCACAGCCCGGCATCTGGATGGCAGAAAAACTGTCAGAATTACCCTCCGCCTGGACGTGGCGCATTACGTTGAGTTAAAGCCCAGAGGTTGATTCGCCATTACTGGCCCGCGCGGTGGTTGCCGGACTAGCGCAATAGCAGATACGC
-+
-+,-,,,,--,.,,-,,,--/-,-.--.-/-//0--,..,..--///.0..--,0-.,--,,,,+,-.,,,-.+,,,.-/--,,,,-,-,,,,..-.,/-,,,,--.--,---/--,-,,++.-.-.-/+,,-.-/2+--.-.---.-.---/-..--..--,--.-/-..----..-.....-.---...//---/,/--..-,,-,.-,+--,,,-//-,--.....-.--..,./..-..../--.----,-..-,---/---,,.,..-..-,---/--.,,-/.0---//--,-.----..---.-...---./////..1//./0../-.//./3/32./-....02/...////100/0/00222/102210/0110/0////./.,../1/0/.../...12/010/3/122/..////.-.,..,-----./-..//../.-0..//0/100
- at 34
-ATGATGCGCTTTGTTGGCGCGGGCTTGATGCAGGGTAATCGACCTCTGGCAACCACTTTTCCATGACAGGAGTTGAATATGGCATTCAGTAATCCCTTCGATGATCGCAGGGAGCGTTTACATATTGCGCAATGCGCAGGGGCAATTCAGTCTGTGGCCGCAACAATGCGTCTTACCGGCAGGCTGGGACATTGTGTGTCAGCCGCAGTCACAGCGGCGTCCTGCCAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACACCGACGAAGTTTTTGATGAGTTGCAGGAGGGCACAATGAGAGCCAGCATTTACCTTTTGGTCCCGCACAGCCCGGCAGCCGGATACAGAAAACTGTCAGAATTACCCTCCGCCTGGAGCGTGGCGCATTACGTTGGGTTAACCGGAGAGGTTGATTCGCCATTACTGGCCCGCGCGGTGGTTGCCGGACCCAAGCAGATACGC
-+
--.--.....--,,++++/,,,,.--,-++-,,++,,,,,-,/-/-/.---/,,-.----*++,+,,,.--+,.-,,-,,---.--,-.01-./00-/-,-.,--.-.--,-,-.1..--..300/.--.0./.....0//--./0./,,..---,,-,,,0,,.---0,.-,-,++,,,/-,---,,+--,,,,+++.***+**+.-+++,+.++,--++*+-,,++*-,+,1,+,,+**++*+++,-++,++.+++-+--,,,,,,-,,,,,+**,+,+,/+,,,+,**,+++,-+++,***+***-*+,))*+*+*)*)))*),+++,+,+++,*)****))))(+(**+))))(()*-*+*)*+****+***+**+-****)***++)+*****++,,++,,+,,..-,,+++++,+*++++-,,,-++,+,,,+,-+,+,,,,,.,,-,,,,.,,,++,+
- at 35
-GAGTCGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACTCACTGGCAACCACTTTTCATGACAGGAGTTGAATATGGCAATTCAGTAATCCCTTCGATGATCCGCAGGAGCGTTTTAAGTTTGCGCAATGCGCAGGGGCAATTCAGTCTGTGGCCGCAACAATGCGCTGTACCGGCAGGCTGGGTTGTACACGCGGATGTTGCATACAGGCGTCCTGCCAGCAGTGCTGGAAGCCCACTGGCGATACTGACACCGACGAATTACCCAGTTGCAGGAGGCACAATGAGCCAGCATTACCTTTGGTCCTGGGACAGCCCGGCATCTCAGGATGGCAGAAAACTGTCAGAATTACCCTCCGCCTGGAGCGTGAATCATGAGTTAACCGGAGAGGTTGATTTCACCTTATACTGGCCCGCGCGTGGTTGCCGGACTAGCGCATAGCAATACGC
-+
---.,,/-.---...0--.-----./.-./-0..--.-/.-//./--0/-../..--0.000../..--../././.--......./.....-.--/../0./...-.-..--10.-.-..../.-,..0.--./....0/....-00..0////..0.//./.--,-..//./.,/---/...-/..//.---0.1-,00.//-----,.-..-,-./-0-,+-,..-.../--/.,,-/-./-..-.../----/-../-.--,-,..,,,,.,.--/-.-,-/+,----...,.,-,/-,,+,,,--,,+,+,+,++,-,----/---.--,-,,.------,-.-.-,,-+,-.---.,0-,,---...-.-/01--/..+..-/--.-/..-.,.,.0/----.-,-.---.-//..-.....-----,//--,---,/.---,.-0./--..-
- at 36
-TCACTCCCGGCCGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGACAGGTTGAATATGGCATTCAGTAATCCCTTCGATGATCCGCAGGGAGCGTTTTACATATTGCGCAATGCGCAGGGGCAATTCAGTCTGTGGCCGCAACAATGCGTCTTACCGGCATAGGCTGGGACATTGTGTCAGCCGCAGTCACAGGCGTTATGCCAGCAGTGGCTGGAAGCCGACGGCGTACTCTGACACCGACGAATTTACCCAGTTGCAGGAGGCACAATGAGCAGCATTTACCTTTGGTCCCGCACAGCCCGGCATCTGGATGGCAGAAAAACTGTCAGAATTACCTCCGCCTGGAGCGCATTACGTTGAGTTAACCGGAGAGGTTGATTCGCCATTACTGGCCCGCGCGGTGGTTGCCGGACTAGCAAGCAGATACGC
-+
-++*)))**+++**+++-,+,+-,,*+++*,++*+,+*+++--,-,/,,++++.+-.----.-,.-100..---,-....-../-0.-.////////0./-/11001/0000/0/1610/..11211/10./100221010/01//1/021002/0/../...--/0.0/1-00-/.--.,.-.-/--,-,,-,-...--,,+,,,,.-,,-+.,---.-.-,---,//.-/0/-.--.-/00./0.//.-..1.3.//0/..10131131..-01100/---/1.-../12///.0..//..0.//20...----0--..--,-,..-.,./.-.-.-/,,/..0.-,,,,/-/..--,,,-././......--...//.-.----/-,-.-.-.-,0--./-/-,-/--////..-----,-+-.-.,-..,,//./..0.././-..0/.
- at 37
-ATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGCTAATCGACCTCTGGCAACCTTCCATGACAGGAGTTGAATATGGCATTCAGTAATCCCTTCGATGATCCGCAGGGAGCGTTTTACATATTGCGGGACTTCGCGCAGGGGCAATTTCAGTCTGTGGCCGCAACAATGCGTCTTACCGGCAGGCTGGGACATTGTGTCAGCCGCAGTCACAGGCGTCCTGCCAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACACCGACGAATCAACGAGTTGCAGGAGGCAATGAGCCAGCATTTAGTTCTTGGTCGCCGCACAGCCCGGCATCTGGATGGCAGAAAACTGTCAGAATTACCTCCGCCTGGAGCGTGGGCATTACGTTGAGTTAACCGGAGGTTGATTCGCCATTACTGGCCCGCGCGGTGGTTGCCGGACTAGCACATAGCAGATACGC
-+
-,,.,,,,,+,-,,,-+,-,,.,,-,,,,.+,./---.,+,..///./2..--,+,,.-.--./.-./1.0-..-..-./-.-.,,.-,,-.-..--,-,,---,-1/./..0.-/1///--/1//100.-.-.-..0/.2.///..0/0/00/../1//..//0.//0/02/2102..././3/00/00///..000000/...//2/01../.0././---.-/-,---.--..,,,+-,,.,+-,,,--0-/,,.,,,+,,**)+)*))+*)**++*,+*****+)*-*+,***+++-.-++)*+*++*)*****,+++,----,,--,,,./-/.,-++,+,/1//.--,,,/---,.--.//./00./////../././0./.---//...00.--,.-/---0.-../..-/-.../0//..,..-.-/.-,,/.---./..-,---.,,-.0.
- at 38
-ATGATGCGCTTTGTTGGCGTGGGCTTGATATGCAGGGGTAATCGACCTCTGGCAACCACTTTCCATAGTGACAGGAGTTGAATATGAGAATTCAAGTAATCCCTTCGATGATCCGCAGGGAGCGTTTACATATTGCGCTGAATGCCCGGGAATTGGGATAGCCTAAATGCGTCTTACCGGCAGGCTGGGACATTGTGTGTCAAGCCGGGATTACATCGTCCTGCACAGCAGGTGCTGGAAAGCCCACTGGCGTACTCTGCTAACCATGACGAATTTTACCCAGTTGCAGGAGGCACAATGAGAGCCAGCATTTACCTTTGGTCGCCGCACAGCCCGGCATCTGGATGGCAGAAAAACTGTCAGAAGCGTCTCCGCCTGGAGACGCTTAAGGGTCCATTTGAGTTAACCGGAGAGGTTTGATTCGCCATTACTGGCCCGCGCGTGGTTGCCGGACTAGGCGCAAGCATACC
-+
--./-.....-./,--,,-/,-,,,-,-,-+,..-,,-,,+.,.,,-,---.,,,.-./-,-++++,+-.,,.,,-,-.++,--,--,-,,/,,+,--,,,,--,,/,,-,++*--,,--,+,.,,,,*++,,,,-,++.,,,/-,,,,-,-,.,-+++-++++++---,.+-++*+*+,,./-/-,,+++-,,-+,,+,++*,-+*++-,+*+*+++,*+*++*,,,),+**,,**-**+**-**+*,*+,+++**-+*,)),*++-******++*****+-,,,*)****),,-+*,+/****,++++,*++,+,++++++++,+,+++,+,,,++--,+,-,,,-,++**,.--,,.+++**+++*++,++,,+,.,+,+..,++,+++-+-+--*+.++++*+++***+*,,++*-++,,*++,+++*++++**+++,,,,+,*+,,+*,,++,,,-,,,,-,-++,
- at 39
-ATGATGCGCTTTGTTGGCGCGGTGGATGCAGGGCTAATCGACCTCTGGCAACCACTTTTCCATGACAGGAGTTGAATATGGCATTCAGTAATCCCTTCGATGATCCGCAGCGGAGCGTTTTACATTGCACAATGCGCACAGGGGGCAATTCAGTCTGTGGCCGCAACAATGCGTCTTACAGTGCGCAGGCTGGACATTGTGTGTCAGCCGCATCACAGGCGTGCTCTGCCAGCAGTGGCTGGAAAGCCCACTGGCGTACTCTGACACCGACGAATTTACCCAGTTTGCACAGGAGGCACAATGAGCCAGCATTTACCTTTGGTCGCCGCAGCAAAGCCCGGCATCTGGATGGCAGAAAAACTGTCAGAATTACCCTGCCTTCAGGCGCATTACGTTGAGTTAACCGGAGAGGTTGATTTGCCATTACTGGCCCGCGTGGTTGCCGGACTAGCGCAGCAGATACGC
-+
-----...----.,.,,+,++-*+++++/-,--..,--.....-/.0/-,+.,-/-..--.,,,,,-,,-......./....0--0/--../--.-,,,--.//...-.-.-/--./.-.--,//0..,,,,0/---,,/----,---.-/.-..0.,.,--,/,+,-......-,,,,,----,/-./-.,/,,.////.-,,,,-,,,-.--,-/.-,1,-+,++,,,-,-/1--0/,,-++,,,0++,+.+,,,,++,-,,,.--,+,,,-,,,-++,-.,.,+-**-++--+++++-,.0-,,,.,-.../-/.0.---,,,----,/,,/,,----.1/.-.0/./../.--0/130201.-.../----....--....0../0///023/...1..0001//0//.3./..-/,--//.0./11.-./////.//4/..../.../..-,.--,--/++
- at 40
-ATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGACAGGAGTTGAATATGGCATTCAGTAATCCCGTGCTTGTGTACGCAGGGGAGCGTTTTACATATTGCCAATGCGCACTAGGGGCAATTCGGTCTTGTGGCCGCAACAATGCGTCTTACCGCGCAGGCTGGGACATTGTGTCAGCCTCAAGAGCAGCCGGAGTCGGCCAGCAGTGGCTGGAAGCCCACTGGCGTATACTCTGACACCGACGAATTTTACCCAGTTGCAGGAAGAAATGAGCCAGCATTTACCTTTAGTCGCCGCACAGCCCGGCATCTGGATGGCAGAAAAACTGTCAGAATTACCCTCCGCCTGGAGCGTGGGCGCATTACGTTGAGTTAACCGGAGAGGTTGATTCGCCATTACTGGCCCGCGCGGTGGTTGCCGCAAAGCTAGCGCAAGCATACGC
-+
-./01-10//0///1..///1/.//0//.2//001.//10.1100000003/33/.2/12101/.///.0/0//0500///00/1///0.12//0///00/000,/-/-/-----.---/-./0/--,,.-/.1..-,././.-,,.,-,-,.,---,,-,//+-,,+,,++,+++./-...--+-+,+++*+,,--,,++,/-.--,,+++--,++-,.,----///.,..,,.,+-,---./-.-,,,+-..,-,---,.,,./0..-.1//1.--.-/.//.-,/,--/.--/-.,-,,/,../---.--.//./-..1-,+.,,,-/--,----,-,-/-.-..--.-0-----012//./-,/,.-,,.,/.-/./-..--../1--/0-/0.-./1/0....-0//.--.--.,/-0.-.1.-.../1-//-.--...-.,-0/.-0.,0-,/...--013,-.-.--.3//
- at 41
-ATGAATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGTCCCAACCACTTTCCGCTGACAGGAGTTGTAGAGTATATGGCATTCAGTAATCCCTTCCATAAGGTGATCCCGCAGGGAGCGTTTTTAGATATTGCGCAATGCGCAGGGGCAATTCAGTCTGTGGCCGCATAACAATGCGTCTTACCGGCAGGCTGGGACATTGTGTGTCAGCCGCAGTCACATACCAGGCGTCCTGCCAGACAGCAGTAGCTGGAAGCCCACTGGCGCGGAGTCACTCTGACACCGAGCAGGACGAATATTTTACCCAGTTGCAGGAGGCACAATGAGCCGGCATTTACTTTTGGTCGCCGCACAGCCCGGCATCTGGATGGCAGAAAACTGTCAGAATTACCCTCCGCACTCGAGCGTGGGCGCATGTCAATCGTTGAGTTAACCGGAGAGGTTGATTCGGCCATTACTGGCCCGCGCGGTGGTTGCCGGACTAGCGCAAGCAGATACGC
-+
-.-/-,-...../---,,.,-.,.-/-,,,,--0/+.--.,,..//.1,0-0//,,,--..1/.--,,-/,,-,,.--++.,,,-.-,,.-*,,,2+,.-++,*,-,,,-,-*-*+-+,,++.,+-----.--06/--,,+,,,,-.,,-+0,../,-,.**,++,-,./-2.,-0,,,0--/+.,--.--/..-0-.-,,-.---/,/,,.---./-/,+.,+.,,,-0--,/1*/-,*,,,.,*+*++,++,+,++,-+++*+,+*++++*++++.-,++**))**-***,)+*,**,,+****)+*-).+*+-+*++++++.++0*++++++,---.-+,,.+,.,,/*+,/--,,,,,--,-,,.+.-,+-,,,,/--++,-,+++-+,,,,,+*++-,-,++-,,,,--,++,++,-,,.*,,-,,-+,.-++++,,,++-,*+*+,+,+,,+++*+,+,-**,,,+-.,+,.+,-,-,++-,+-,,+++,,++++,,.,---.,-,,-,,
- at 42
-ATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCATGACAAGGGGAGTTGAATATGGCATTCAGTAATCCCTTCGATGATCCGCAGGAGCGTTTTACATATTGCGCGCACTTCGCGCAGGGGGCATTCAGTCTTGTGGCCGCAACAATGCGTCTTACCGGCAGGCTGGGACATTGTGTGTCAGCCGCAGTCCACAGGCGTCCTGCCAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACACCGACGAATTTACCCAGTTGCAGGAGGCAATGAACCGAGCATTTACCTTTAGTCGCCGAAGACTCATGGCATCTGGATGGCAGAAAAACTGTCAGAATTACCTCCGCCTGGTGGGAGTGGCGCATTACGTGTTGAGTTGACAGCCGGAGAGTATTGATTCGCCATTAGTTACTGGCCCGCGCGGTGGTTCCGGACTAGCAAGCAGATACGC
-+
-..0.-./0-../..---..0.-....--0./00---./.-/0/0100/3//1..-0.02000/./..1/1./1///000/00/0/2/0111120/0/0/00..0././0//.1...//2..2...-,.0/.2.0---.-/-,--.-/..-,.,----....,-,..----,,-+,,//./0,-,+--,,-,/.-.0,0,,-112/1/./.-../02/10./0./201/2..////////10/202.//..00/00.-0-0.0./..3./01-1.-..-./--.,-,-.-//--+,+-+++++,1.*,+-+,-0/--+,,0+++**+++*-+++++++++**++++-,-..,,,,++,-..,+--+,+,.--,+++,+,-++++.+-.+,/,0,,./.--.+.,+,,,,.,0,,--,/.,,-,+,+,+.,-,.,,-..-,,,+,,---.++,,/,,+,/,,,.,,,-.,++,-+,.-.-.,--+
- at 43
-ATGATGCGGGTTTGTTGGCGCGGGCTTGATGCAGGGGGCTAACCCACTCTGGCAACCACTGTTTTCCATGACAGGAGTTGAATATGGCATTCAGTAATCCCTTCGATGATCCGCAGGGAGCGTTTTAGTGCGCAATGCGCAAGAAATTCAGTCTGTAAGGGACCAATGCGTCTTACCGGCGGACAGGCCCTCTTGTCAGCCGCAGTCACAGGCGTCCTGCCGGAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACACCGACGAATTTTACCCAGTTGCAAGGAGGCACAATGAGCCCTCAGCACCATTTACCTTTGGTCGCCGCACAGCCCGGCATCTGGCTTGGCAGAAAAACTGTCGAATATTACCCTCCGCCTGGAGCGTGGCGCATTACGTTGGCAGTGCTGGAGAGGTTGATTCGAGGTTACTGGCCCGCGCGGTGGTTGCCGGACTAGCGCAAGCATACGC
-+
-,,+++,,,,,-.,,,++.,---,-,.--.,--,,.--,,,,.,,....//../-..1...,/--,.0/-0///..--/,,-/.-./0.--.2,.0../0/--/,,-,,,-,+,-------/-++***+,+*+.+,-,*+*****,**),)(*()()())*)*)+)*+,***)())(+*++*)****+)+)***),)))*)+*,*+*.**++0+,,**.,****++-,+.-+++,++,,+++-,-.----,--,-,-.,,,,-,/--//-+-+-.--.+,+/.,.,-/--/0//0-..,.,-.-0--./.0,-.00/.,,,,--,/--/..1...20../0/-10---,0-////1--.-,--//-./-.....-0../..-./.-,--.0-,--0.,+,,,,,-,+-+,+,//--/,--,+-,,,--+,-++.+,,,-/,,-,,-,,++,,-,,,,---,---,,,.0,
- at 44
-ATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCAATCGACCTGGCAACCACTTTTCCATGACATAGGGTCGAATATGGCATTCAGTAATCCCTTCAGTCGATCCGCAGGGAGCGTTTACATATTGCGCGCAATGCGCAGGGGCAATTCAGTCTGTGGCCGCAACAATGCGTCTTACTACCGGCAGGCTGAGAAGATTGTGTCAGCCGCAGTCACAGGCGTCCTTGCCAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACACCGACGAATTTACCCAGTTTCAGGAGGCAATGATAGGGATCTACCTTTGGTCGCCGCACAGCCCGGCATCTGGATGGCAGAAAACTGTCAGAATTATGCGCCTGGCAGTGGGCGCATTACGTTGAGTTAACCGGAGAGGTTGATTCGCCAGGGTACTGGCCCGCGCGGTGGTTGCCGGACTAGCAGCAAGCATACGC
-+
-//1/.1/.///0/100/001/.//0...1/./0./-.0//2//001.2/.--0-//../---.--,,-.,,--,,+.--/.--...-./-,-..----,,,,,-,,,,,+/,.--.-,-/,.,+.-/../.,-+.+,,,+,-,,++++*+-+,,/,-,,,-,,,++++.+---/0---*++-*+++++,-,--+,+++,,.--.-,,,+--,,,,,,,-0--,1,,,,,,+,--+..--.0-/,,.,-/--0----./,.-,,/,,--,-,--/002/-,,,.,.----/-.-,,--.-.--+-.,-../--.1..----../.-.-/.0....00/0/././..//..211/0///0/110/./0..1/0////0/2../.00/..00//../..../-.-...0/0.2/..../.-.-,,--.0-.--.---.,-/--,//-,-/--,--,.,,,-.,+,,.+
- at 45
-ATGATGCGGCTTTGTTGGCGCGGTGAGGTTATTAGCAGGGGCTAATCGACCTTAGCAACCACTTTCTAAGTGACAAGGAGTTGAATATGGCATTCAGTAATCCCTTCGGATGATCGCAGGGAGCGTTTTACATACTGGTCGCAATATTGCGCGGAAGTGATTCAGTCTGTGGCCGCAACAATGCGTCTTACCGGCAGGCTGGGACATGTGTGTCAGCCGCAGTCGCGCAGGCGTCCGTGCCAGCAGTGGCTGGAAGCCACTGGCGTACTCTGACACCGACGAGAATTTTGACCCAGTGCAAGGGAGGCACAATGAGCCAGCATTTACCTTTGGTCGCCGCACAGCCCGCAGGCATCTGGATGGGCAGAAAAACTGTCGAAGATTACCCTTCCGCCCGCTGAGGGTGCGCATTACGTTGAGTTAACCCGGAGAGGTTGATTCGCCATTACTGGCCCGCGGTGGTTATGCCGGACTAGCGCAAGCAGATACGC
-+
-,,,***),..*,**)))**)+***+(*)*)))*())+***+*)*+,,++*,****+*,+-,+*,)))+**-*+**,+,++,**+,---,,-,+-,,+.-+,++++-*,***)))*++,+,++,--*+***+-*-+/+,*)*,*+**,*+))*)**())()*****,**,*)**)))*+/-+./,,+*)*))+*,,,+-*)++*.*++++++++.++++,-++,+,,,,,-/-+*,*,**+-,0-,+,+,,++*++,++-+,-,,,-,-,-+,-,.+-,--.,,.+./,+,.,-,,,.+,+--.--+,,+-.-,-++-,--2.-/++,,,.++-,*,,+.,-,-,,,--+++,,++,+,*++,*++++.,,--,+,-**,,*+,,+-,--++,,-*,++++++++,,*,,,+.,-0+++,+.+++*+**+,,.,-,*-**+*++*+*,,*+-,+*++,+*,+*-****-******)+,*+**+,)*+)****
- at 46
-ATGATGCGCTTTGTTGTGGCGCGGTGGCTTGATGCAGGGGGCTAATCGACCTCTGGCGGACAGATTTTCCATGACAGGAGTCGAATATGGCATTCAGTAATCCCTTCGATGATCCTAAGGGGAGCGTTTTACATATTGCGCATGCGCAGGGGCAATTCAGTCTGTGGCCGCAACAATGCGTCTTACCGGCAGGCTGGGACATTGTGTATTCCAACACCCACAGGCGTCCTTGCCAGCAGTGGCTGGAAGCCCACATGGCGTACTCTGACACCGGATGACGAATTTTACCCAGTTGCAGGAGGCGCACACGCCAGCATTTACCTTTGGTCGCCGGCACAGCCCGGCATCTGGATGGCAGAGACGGTACAGAATCCCTCCGCCGGGTGAGCGTGGGCGCATACGTTGAGTTAACCGGAGAGGTTGATTCGCCATCTTACTGGCCCCACGCGCGGTGGTTGCCGGACTAGCGCAAGCATCAC
-+
--.0--.//,.-.--.-.,.,-.-,---,,,-++02-,,,..,+,.,,-,.,.,,/.,,*,.+,,.,,*,+,,+*+,,+-++*-,+,0+--,,+.,++.,,,,,-+-,,+-.-,,,++,,,,--,17/.-,-0.3/0.0-,/.-..,.--,./-..---,../,,,.--,,,,./01,0.,-,+,,+,-+,/,,-,,,,,.//-,,,+-,,,,+-/-+++,/-.,.,++-,+-*+/,-.++/,++-+,+-0-++-+++-,-+,,,-.++,,-,,-+,,.-,,*,+.,**,+,+-,,+++,+++++)++,*,++**++,,,+++/-+++,***,****,,,,-,,+-,-+-,.,---.0-.,+,,,,,//,-/-,/-,,--.--,,/./.01/..-.001./021..--0...-1../..0//.0.1.2/-/-..--.....//-011/0.--,/----....-0...000-.-/.,,,-.
- at 47
-ATGATGCGCTTTGTTGTGGGGTGGATGCAGGGCTAATCGACCTCTGGCAACCACTTCCATGACAGGAGTTGAATATGGCATTCAGTAATCCCTTCGATGATTGCAGGGAGCGTTTACATATTGCGCAATGCGCAGGGGCAATTCAGTCCTTGGCCGCAACACCGTGGCGTCTTGTAAGCAGGCTGGGACATTGTGTGTCAGCCGCAGTCCACAAGGCGTCCTGCAGCAGTGGCTGGGGAAGCCCACTGGCGTACTCTGACACCGGCCCGAAATTTTACCCAGTTGCAGGGCACAATCGGAGCATTTACCTTTGGTCGCCCGCACAGCCCGGCATCTGGATGGCAGAAAAACTGTCACGATTACCCTCCGCTGAGCGTGGCGCATTACGTTGAGTTAACCGGAGAGGTTTATTCACCGCTTACTGGCCCGCGCGGTGGTTGCATTAGGACCAGCGCAAGGGCAGATACGC
-+
-/---./../--+*,+-++,-,-,+,+0,,.,,.,.../,-,--,-,,,,,-.-,,,+*+++,,-,-,,..,,---.-.0/-....0-./--/-.,,.//----,----.-/./-/--/1/0/0.-1///0-.----.-.,/.01.,/.,,-/-,-.-./0--../,../.-0,,,.,.....---,,1,,--,,/,++++,,,.,-,,*++,,,.2,+,*++,,,,.,-..----++-++-,+,/+.++,++--+-*+,/-,,,,-++,,-..-,+-+--.,,,+,,-,,,,-,++,+*+,---.+,-/-.++++*+++*,/,+,,-+,,+/+,,+++**,,,++-,,,.,.,++*,,++,*+++**+++,,++,,+,+*+.,+,.,/,+-,,,+++*+**++++++**)-,++*,,++,.+-+,.+,--..---/+-+.++.+++,,-,,,-,..-,-./.-.,....
- at 48
-ATGATGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGAACCACTTTTCCCCATGACAGGAGTTGAATATGGCATTCAGTAATCCCTTCGATGATCCCGCGCAGCGTCAGTTTACTCACATATTGCGCAATGCGCAGGGCAATTCGGTCAGTAGCCGCAACAATGCGTCTTACCGGCAGCTCGTGTGTCATAACCACCCGGGTATCTTCACGCTAAGGCGTCCTGCCAGCAGTGGCTGGAAGCCCACTGGCGTACTCTGACACCGACGAATTTTACCCAGTTGCAGGAGGCACAATGAGCCAGCGGATTTACCTTGGTCGCCGGCACAGCCCGGCATCTGGATGGCAGAAAAACTTCTCAGAATTACCCTCCGCCTGGAGCGTGGCATTACCGTTGAGTTGACCGGAGAGTGTATCATTCGCCATTACTGGCCCGCGCGGTGGTTGCCGGACGACTAGCGCAAGCAGATACC
-+
-/.20///../0..-..-/.,..--.-1---.--,-..-/////...-,--,,--------+++-,,+.,+,---,-,,+-,,,.-,,,,,--+++++,,,.,+,,,,,+-.*.++-.-,*++-+***,*-,-++.+,*)*-++-,+,,,+--,-,,.++++,+)**+***)**.,,-1*,*)*****)+,++*,*,-*-,,**)+++-+*+++*,+-,.,+,,,-,+++,0+-,+,,,,,+--,---,,++---0/-.-.-./0,-/.1----/..-.0-...-/0---1//./..--.2-0...-//0.,-0..0.,.--0-.-.-/,,,--.---,/0-..-,/..-.-/.-/---,/,-.320--.,,-,---+,-++.,.,/,.---../-,/-..--,/2,,,-.,,/-,,-,-++-+-+,*,,+-.-,-.-,.,-0/,-,-.-,,+,/++,+*,+++***,,**-/**+++*+**+**
- at 49
-ATGAACGCTTTGTTGGGGCGCTTAGATGCAGGGGCTAATCGACCTCTGGCAACCAGATTTTCCGATGACAGGAGTTAGAATATGGCATTCAGTAATCCCTTCGAGTATCTGATCGCAGGGAGCGTTTTACAACTTGCGCAATGCGCAGGGGCAATTCAGTCTGTGGCCGCAACAATGCGTCTGTACCGGCAGGCTGGGACATCTTGTGTGTCAGCCGCAGTTACACATGCGTCCTTGCGCCAGCAGTGGCTGGAAGCCCACTGGGCGTACTCTGACACGAAGCGAATTTTACCCAGTTGCAGGAGGATGGCACAATCAGCCAGCATTTACCTTTGGTCGCCGCACATCACCGGCATCTGGATGGCAGAAAAAACTGTCAGAGAATTACCTAGCCGCCACTGGAGCGTGGGCGCATTACGTTGAGTTAACCCGGAGAGGTTGATTCGCCAGTCACTGGCCCGCGCGGTGGTTGCCGGACTACGCGCAAGCAGATACGC
-+
--+,,,,-,,-+*+**,*+-***)*+)),))*+**))+*,,+.+,+,-+*+**+-)*****)**,**++**++++-+*.+++,,+--,++,++.*++,++++)*,*++,,,,+++,,.---,/5.-,-,--.-,--,+,/,./0,---++---,..0,-10-,/-,-.--.,.0/-.9--/,,.,,,--.0../---+,0-./,,-/-.,/+,,,-,.0+.-,+.-,.,.-,.,+,-..0-,-./,,/.--.--/,-,,,,--,-/,-/,/--,--,.//---,,./30.,,,...-0,-,,-,-++,/,-,..-/.,/,--/-00-/,-,.--,,.-,.,+----.+/.+-,-,--/.--.0...--/./000///,,/,-00/0/--/,-....0..../...00.0--..6.-..0..-.0..-,--,,/.,-./---/-.---/--.-/,-..--+,-,--++,,*-+,+++++,*-,,+,.,,-.3++,-,.,
- at 50
-ATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTGAAACCACTTTCTCATTATAAAGAGTTGAATATGGCATTCAGTAATCCTTCTAGATGATCGCAGGGAGCGTTGCCCACTTAGTGCACCGCGCAGCGCAGTTCAGTCCTTACTAAACAATGCTGTTATAGGGCATCACCGGCTGGACATTGTGTGTCAGCCGCAGTCAAGGCGCGTGCCACCATGTAGCTGGAAGCCCACTGGCGGAGTTCTGACAGGACGAATATTTACCCCAGTTGCAGCAGGGGATACCGCCGCCCGGTTTGATTTATTTGTAGCCGCACAGCCCGGCATCTGATGGAAAAACTGTCTCAGTGTAGAAACTAAGGGCAGCCTGCCTGGGTTACTTCGCGTGCTCCCAAGGCGAGGTTTAACCGGTGATGAGGATTGGTTGCCCGACAACGCGCAGCAGATACGC
-+
-...---2.-..,-,,,.,,,,-,,,,,,.,..,,,-,.,,-/-/--,---,-,,...--,,,,,+,+,,,--,,-,,-,,,++-0,++,,+--+,,,,,+,+++,,,+*,++**++,.,+*+**+++**)*+*.*)***,***,++**))+*)*,))+)*))**++,,+,*++*+*+**-,,+.,+-+,,+++-,,,,,,,,++*+,,+-/-,.,..-,,-.,,,,,,,,,,-,,,--+,,,/.,,,++++++-,-,+++++++*++**++.,++)))))*,++)*+++++*++*)*))****+**++*++*+,++**+++*)))*)****+*+***++*))))))))**,,+,,,)**++*+*))*+***)*)))++**,))*,),)))**)**)+*****),)))****))*+**)),*)***+**++***+*+***+****+*+++++*,,*++,++++,-,
- at 51
-ATCATGCGGTTGTTGTAGGGTGCAATTAATGCCCGCTAATCGACCTCTGAATACCACTTCTAGTTAACATAGGAGTCAGTAATGTGCATGCAGTAATGCGTCGCTAATGATTAGAGGAGCGTTTTTACATATTGCATGCGCCACAGGGGGATTCAGTCTTGTGGCAAACACCTGCGTTGCCCGGCGATCGGCTCGAACTTGTGTAGTTTGTCTCACCGTACAGGCGGTTTCCCTGCCAGCAGTGGCTGGAAGGCTAATGGCGTACTCTGACTAGACAGCGATTTTACCCCATTGCCAGGAGCAAATGAGCAGGATTACCTTTATTGCCGGAACTAAGCCCGGGAGTACATGAATAAGAAAAACTGTCAGAAGTGGGTAGCGCCTGGGGTACTTGGGCGTGGCTCATTCAGTCTATCACGCGGGTCATTACGCCCGTACTCATGGCGCGTGAGTTGCACTAGCAGAGCAGCGTAGA
-+
--,-.,/--.-.-,,++,+++.,+-,-+,+.,-+,+-,+,,,,,,-,--/--,-.,+..,+,*+,++,--,,,,,--,,,+,-,,,+.-,/-,-.----.-.,,,+-----,,,.,,..,---.-,,+,----...-.0.-.+/.,,,-,,,,,.,-,,+-+++++*+,-,++-+,,+-+,,++./+-+)*++*+++,+,+-,+-**-*+++*++.,,.-,-,,+--++.,,-+,,,,,,-/,.,.--.,-.,-.+.-.-/.0-//--0.0--.-.0..00,/010,-/0/-----.+-/----,./-.--,-,.-.-.,.,.,.,/-,,++--+,,,,-,,+-**-,..,-++-+**-,,+--+*,,*-*,++**,*+*+,,+-+,++-++++-,.,.+-++,-+,+.+++-*+++,+.--++,-,-,,.--,,.,.,+--,,,.,-,.,,--+,--,+,,-/-.,../-/.,/-
- at 52
-ATGTAATGCGCTTTGTTGGCGCGGTGGGATCTGCAGGGCTAATGGTACACCTCTGGCAACCACTTTCCATGACAGGAGTTGAATATGGCATTCGCTAGTAATCCCTTCGATGATCCGCAAGGGAGCGTTTTACATATTGCGCAATGCGCAGGGGCAATTCAGTCTGTGGCCCGCAACAATGCGTCTTACCGGCAGGCTGGGACATTGTGTGTCAGCCGCAGTCACAGGCGTCCTGCCAGCAGTGGCTGGAAGCCCACTGGGCGTACTCTGACACCGACACGAATTTTACCCAGTGCAGGAGGCACAATGAGCCAGCATTTACCTTTGGTCGCCGCACAGCCCGGCATCTGGATGGCAGAAAAACTGTCTAGAATTACCCTCCGCCTGAGCGTGGCGCATTACGTTGAGCGAGTTAACCGGAGAGGTTGATTCGCCATATTACTGAGGGATGGTTAGCAAGCGACCCTGCGGAGTTGCCGTTTTACACGCGCAACCAAGGATTTCGG
-+
-,-++**+,-..,.**+*+,,,-++*+,++,-++++,++++,,,,,++-++-,,,++,+++/-+++**-+*,,,-,/.,.,++,,,+-+--,,+,/+,,--,..,-,,+--/,-,-,.-,-..--,1,,+++--1----,++.,--.,-,-,-,,,,--.-,/-,++*+++**+,*+0.,-/+-++****,+,-,,,++,**-*++++,++********/+*,.+*++/+)***+,**+*-++,,*+*))))+**,*,+**++++++++,,,,+***-*+*,,--,-*,*+,,+*,+++-+,-,,1,--+,,,,-/0--.+--.,,,,-.,-./,-...-0..-0//././/..../.-/.110..-,+,+-1//.,...---.-../,-/-,+,,,,,+++/++****,***+)))))******)+),)((((''('''')&'&'&'''&(&&&&(&''&&&&&&&'(&&&&&''&&%%%$#$#$$%$$$%$$$&$$%$$%$&&#$
- at 53
-ATGATGCGAGGTCGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGACAGGAGTCGAATATGGCATTCAGTAATCCCTTCGATGATCCGCAGGGAGCGTTTACATATCCTAATGCGCAGAGCCAATTCAGTCTGTGGCCGCAACAATGCGTATGTACCGGCAGGCTGGGACATTGTGTGTCAGCCGCATTCAAGGCGTCCTGCCAGCAGTGGCTGGAAGCCCATGATCGCTATATCGAGACACCGACGAATTTTTACCCAGTTGCAGGAGGCACAATGAGCCAGCATTTACCTTTGGTCGCCGCACAGCCCGGCAACCCGGATGGCAGAAAAACTGTCAGCAACGCCTCCGCCTGGAGCGTGGCGCCGATGAGTTAACCGGAGAGTGATTTCGCCATTACTGGCCCGCCCCGCGGTGGTTGCCGGACTAGCAAGCAGATACGC
-+
--.0..//--/,./0/./-..//-///.--202/1/..01/.01121011300400120434141102011131323/00201110/01100120200/12001././11///./..-.--240.-,....-.,-,--0/-.----+,,....,.,..,-,,--,,++,.--/2,,+/+,+,,-,.--..,,++-.-...----,-,/.1-/--,/+.--/-,+-++,,-,-/,,0---,+-...,---//.-.,,-----,,+,-/--,,-+------.,-,-..-/.,..-..,-,,-.-.,+.--,.../.,--0-,-,---..---...//....-.-./,--..----,/.12././,,/-,..0/--../0..././//..------+-.,..--....--,+,,.-.,.,--.,.,,,-2,,+,.++++**+**,*++0-,+++,+*)***++*.*)*,++
- at 54
-GCCGCACAGCCCGGCATCTGGATGGCAGAAAAACTGTCAGAATTACCCTCCGCCTGGAGCGTGGCGCATTACGTTGAGTTAACCGGAGAGGTTGATTCGCCATTATACCGCCCGCGCGGTGGTTGCCGACGCCCCGGACCGGCATACGC
-+
-//./././//...//1//..-..../-/--1//00//-...0/..----/././../--./.--.//...-../-,/,..-..-----/,-,-/,-.,--,./.,--..-.--.,-.+,1-,-,++-,,-.,+,++-+,+,,,,,,-,,


=====================================
test/data/sample.fastq.gz
=====================================
Binary files /dev/null and b/test/data/sample.fastq.gz differ


=====================================
test/spoa_test.cpp
=====================================
@@ -17,7 +17,7 @@ namespace test {
 class SpoaTest: public ::testing::Test {
  public:
   void Setup(
-      spoa::AlignmentType type,
+      AlignmentType type,
       std::int8_t m,
       std::int8_t n,
       std::int8_t g,
@@ -29,9 +29,12 @@ class SpoaTest: public ::testing::Test {
     s = p->Parse(-1);
     EXPECT_EQ(55, s.size());
 
-    auto ae = spoa::AlignmentEngine::Create(type, m, n, g, e, q, c);
-    gr = spoa::Graph();
+    ae = AlignmentEngine::Create(type, m, n, g, e, q, c);
+    gr = Graph();
+    iq = quality;
+  }
 
+  void Align() {
     std::size_t ms = 0;
     for (const auto& it : s) {
       ms = std::max(ms, it->data.size());
@@ -40,7 +43,7 @@ class SpoaTest: public ::testing::Test {
 
     for (const auto& it : s) {
       auto a = ae->Align(it->data, gr);
-      if (quality) {
+      if (iq) {
         gr.AddAlignment(a, it->data, it->quality);
       } else {
         gr.AddAlignment(a, it->data);
@@ -52,7 +55,19 @@ class SpoaTest: public ::testing::Test {
     EXPECT_EQ(c, gr.GenerateConsensus());
 
     auto msa = gr.GenerateMultipleSequenceAlignment();
-    EXPECT_TRUE(msa.size() == s.size());
+    EXPECT_EQ(s.size(), msa.size());
+
+    std::size_t rs = msa.front().size();
+    std::vector<std::uint32_t> gc(rs, 0);
+    for (const auto& it : msa) {
+      EXPECT_EQ(rs, it.size());
+      for (std::size_t i = 0; i < rs; ++i) {
+        gc[i] += it[i] == '-' ? 1 : 0;
+      }
+    }
+    for (const auto& it : gc) {
+      EXPECT_GT(msa.size(), it);
+    }
 
     for (std::uint32_t i = 0; i < msa.size(); ++i) {
       msa[i].erase(std::remove(msa[i].begin(), msa[i].end(), '-'), msa[i].end());  // NOLINT
@@ -61,13 +76,14 @@ class SpoaTest: public ::testing::Test {
   }
 
   std::vector<std::unique_ptr<biosoup::Sequence>> s;
-  spoa::Graph gr;
+  std::unique_ptr<AlignmentEngine> ae;
+  Graph gr;
+  bool iq;
 };
 
 TEST(SpoaAlignmentTest, TypeError) {
   try {
-    auto ae = spoa::AlignmentEngine::Create(
-        static_cast<spoa::AlignmentType>(4), 1, -1, -1);
+    auto ae = AlignmentEngine::Create(static_cast<AlignmentType>(4), 1, -1, -1);
   } catch(std::invalid_argument& exception) {
     EXPECT_STREQ(
         exception.what(),
@@ -76,24 +92,42 @@ TEST(SpoaAlignmentTest, TypeError) {
 }
 
 TEST(SpoaAlignmentTest, EmptyInput) {
-  auto ae = spoa::AlignmentEngine::Create(spoa::AlignmentType::kSW, 1, -1, -1);
-  spoa::Graph g{};
+  auto ae = AlignmentEngine::Create(AlignmentType::kSW, 1, -1, -1);
+  Graph g{};
   auto a = ae->Align("", g);
   EXPECT_TRUE(a.empty());
 }
 
+TEST(SpoaAlignmentTest, LargeInput) {
+  auto ae = AlignmentEngine::Create(AlignmentType::kSW, 1, -1, -1);
+  try {
+    ae->Prealloc(-1, 1);
+  } catch (std::invalid_argument& exception) {
+    EXPECT_EQ(
+        std::string(exception.what()).substr(11),
+        "AlignmentEngine::Prealloc] error: too large sequence!");
+  }
+  try {
+    ae->Prealloc((1ULL << 31) - 1, -1);
+  } catch (std::invalid_argument& exception) {
+    EXPECT_EQ(
+        std::string(exception.what()).substr(11),
+        "AlignmentEngine::Prealloc] error: insufficient memory!");
+  }
+}
+
 TEST_F(SpoaTest, Clear) {
-  Setup(spoa::AlignmentType::kSW, 5, -4, -8, -8, -8, -8, false);
+  Setup(AlignmentType::kSW, 5, -4, -8, -8, -8, -8, false);
+  Align();
   auto c = gr.GenerateConsensus();
-  gr.Clear();
-
-  Setup(spoa::AlignmentType::kSW, 5, -4, -8, -8, -8, -8, false);
 
+  gr.Clear();
+  Align();
   EXPECT_EQ(c, gr.GenerateConsensus());
 }
 
 TEST_F(SpoaTest, Archive) {
-  Setup(spoa::AlignmentType::kNW, 2, -5, -2, -2, -2, -2, true);
+  Setup(AlignmentType::kNW, 2, -5, -2, -2, -2, -2, true);
 
   {
     std::ofstream os("spoa.test.cereal");
@@ -102,7 +136,7 @@ TEST_F(SpoaTest, Archive) {
   }
 
   auto c = gr.GenerateConsensus();
-  gr.Clear();
+  gr = {};
 
   {
     std::ifstream is("spoa.test.cereal");
@@ -114,7 +148,8 @@ TEST_F(SpoaTest, Archive) {
 }
 
 TEST_F(SpoaTest, Local) {
-  Setup(spoa::AlignmentType::kSW, 5, -4, -8, -8, -8, -8, false);
+  Setup(AlignmentType::kSW, 5, -4, -8, -8, -8, -8, false);
+  Align();
 
   std::string c =
       "AATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGAC"
@@ -129,7 +164,8 @@ TEST_F(SpoaTest, Local) {
 }
 
 TEST_F(SpoaTest, LocalAffine) {
-  Setup(spoa::AlignmentType::kSW, 5, -4, -8, -6, -8, -6, false);
+  Setup(AlignmentType::kSW, 5, -4, -8, -6, -8, -6, false);
+  Align();
 
   std::string c =
       "AATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGAC"
@@ -144,7 +180,8 @@ TEST_F(SpoaTest, LocalAffine) {
 }
 
 TEST_F(SpoaTest, LocalConvex) {
-  Setup(spoa::AlignmentType::kSW, 5, -4, -8, -6, -10, -2, false);
+  Setup(AlignmentType::kSW, 5, -4, -8, -6, -10, -2, false);
+  Align();
 
   std::string c =
       "AATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGAC"
@@ -159,7 +196,8 @@ TEST_F(SpoaTest, LocalConvex) {
 }
 
 TEST_F(SpoaTest, LocalWithQualities) {
-  Setup(spoa::AlignmentType::kSW, 5, -4, -8, -8, -8, -8, true);
+  Setup(AlignmentType::kSW, 5, -4, -8, -8, -8, -8, true);
+  Align();
 
   std::string c =
       "AATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGAC"
@@ -174,7 +212,8 @@ TEST_F(SpoaTest, LocalWithQualities) {
 }
 
 TEST_F(SpoaTest, LocalAffineWithQualities) {
-  Setup(spoa::AlignmentType::kSW, 5, -4, -8, -6, -8, -6, true);
+  Setup(AlignmentType::kSW, 5, -4, -8, -6, -8, -6, true);
+  Align();
 
   std::string c =
       "AATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGAC"
@@ -189,7 +228,8 @@ TEST_F(SpoaTest, LocalAffineWithQualities) {
 }
 
 TEST_F(SpoaTest, LocalConvexWithQualities) {
-  Setup(spoa::AlignmentType::kSW, 5, -4, -8, -6, -10, -2, true);
+  Setup(AlignmentType::kSW, 5, -4, -8, -6, -10, -2, true);
+  Align();
 
   std::string c =
       "AATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGAC"
@@ -204,7 +244,8 @@ TEST_F(SpoaTest, LocalConvexWithQualities) {
 }
 
 TEST_F(SpoaTest, Global) {
-  Setup(spoa::AlignmentType::kNW, 5, -4, -8, -8, -8, -8, false);
+  Setup(AlignmentType::kNW, 5, -4, -8, -8, -8, -8, false);
+  Align();
 
   std::string c =
       "ATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGACA"
@@ -219,7 +260,8 @@ TEST_F(SpoaTest, Global) {
 }
 
 TEST_F(SpoaTest, GlobalAffine) {
-  Setup(spoa::AlignmentType::kNW, 5, -4, -8, -6, -8, -6, false);
+  Setup(AlignmentType::kNW, 5, -4, -8, -6, -8, -6, false);
+  Align();
 
   std::string c =
       "ATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGACA"
@@ -234,7 +276,8 @@ TEST_F(SpoaTest, GlobalAffine) {
 }
 
 TEST_F(SpoaTest, GlobalConvex) {
-  Setup(spoa::AlignmentType::kNW, 5, -4, -8, -6, -10, -2, false);
+  Setup(AlignmentType::kNW, 5, -4, -8, -6, -10, -2, false);
+  Align();
 
   std::string c =
       "ATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGACA"
@@ -249,7 +292,8 @@ TEST_F(SpoaTest, GlobalConvex) {
 }
 
 TEST_F(SpoaTest, GlobalWithQualities) {
-  Setup(spoa::AlignmentType::kNW, 5, -4, -8, -8, -8, -8, true);
+  Setup(AlignmentType::kNW, 5, -4, -8, -8, -8, -8, true);
+  Align();
 
   std::string c =
       "ATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGACA"
@@ -264,7 +308,8 @@ TEST_F(SpoaTest, GlobalWithQualities) {
 }
 
 TEST_F(SpoaTest, GlobalAffineWithQualities) {
-  Setup(spoa::AlignmentType::kNW, 5, -4, -8, -6, -8, -6, true);
+  Setup(AlignmentType::kNW, 5, -4, -8, -6, -8, -6, true);
+  Align();
 
   std::string c =
       "ATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGACA"
@@ -279,7 +324,8 @@ TEST_F(SpoaTest, GlobalAffineWithQualities) {
 }
 
 TEST_F(SpoaTest, GlobalConvexWithQualities) {
-  Setup(spoa::AlignmentType::kNW, 5, -4, -8, -6, -10, -2, true);
+  Setup(AlignmentType::kNW, 5, -4, -8, -6, -10, -2, true);
+  Align();
 
   std::string c =
       "ATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGACA"
@@ -294,7 +340,8 @@ TEST_F(SpoaTest, GlobalConvexWithQualities) {
 }
 
 TEST_F(SpoaTest, SemiGlobal) {
-  Setup(spoa::AlignmentType::kOV, 5, -4, -8, -8, -8, -8, false);
+  Setup(AlignmentType::kOV, 5, -4, -8, -8, -8, -8, false);
+  Align();
 
   std::string c =
       "ACATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGA"
@@ -309,7 +356,8 @@ TEST_F(SpoaTest, SemiGlobal) {
 }
 
 TEST_F(SpoaTest, SemiGlobalAffine) {
-  Setup(spoa::AlignmentType::kOV, 5, -4, -8, -6, -8, -6, false);
+  Setup(AlignmentType::kOV, 5, -4, -8, -6, -8, -6, false);
+  Align();
 
   std::string c =
       "GTATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGA"
@@ -324,7 +372,8 @@ TEST_F(SpoaTest, SemiGlobalAffine) {
 }
 
 TEST_F(SpoaTest, SemiGlobalConvex) {
-  Setup(spoa::AlignmentType::kOV, 5, -4, -8, -6, -10, -2, false);
+  Setup(AlignmentType::kOV, 5, -4, -8, -6, -10, -2, false);
+  Align();
 
   std::string c =
       "GTATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGA"
@@ -339,7 +388,8 @@ TEST_F(SpoaTest, SemiGlobalConvex) {
 }
 
 TEST_F(SpoaTest, SemiGlobalWithQualities) {
-  Setup(spoa::AlignmentType::kOV, 5, -4, -8, -8, -8, -8, true);
+  Setup(AlignmentType::kOV, 5, -4, -8, -8, -8, -8, true);
+  Align();
 
   std::string c =
       "ACATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGA"
@@ -354,7 +404,8 @@ TEST_F(SpoaTest, SemiGlobalWithQualities) {
 }
 
 TEST_F(SpoaTest, SemiGlobalAffineWithQualities) {
-  Setup(spoa::AlignmentType::kOV, 5, -4, -8, -6, -8, -6, true);
+  Setup(AlignmentType::kOV, 5, -4, -8, -6, -8, -6, true);
+  Align();
 
   std::string c =
       "ACATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGA"
@@ -369,7 +420,8 @@ TEST_F(SpoaTest, SemiGlobalAffineWithQualities) {
 }
 
 TEST_F(SpoaTest, SemiGlobalConvexWithQualities) {
-  Setup(spoa::AlignmentType::kOV, 5, -4, -8, -6, -10, -2, true);
+  Setup(AlignmentType::kOV, 5, -4, -8, -6, -10, -2, true);
+  Align();
 
   std::string c =
       "GTATGATGCGCTTTGTTGGCGCGGTGGCTTGATGCAGGGGCTAATCGACCTCTGGCAACCACTTTTCCATGA"



View it on GitLab: https://salsa.debian.org/med-team/spoa/-/commit/1b25f09fe49245631f50acd06dfc9b645f016f8f

-- 
View it on GitLab: https://salsa.debian.org/med-team/spoa/-/commit/1b25f09fe49245631f50acd06dfc9b645f016f8f
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20210101/0604708b/attachment-0001.html>


More information about the debian-med-commit mailing list