Skip to main content

extended_htslib/bam/
ext.rs

1//* Copyright 2019 Johannes Köster and Florian Finkernagel,
2// Copyright 2025 Guilhem Zeitoun.
3// Licensed under the MIT license (http://opensource.org/licenses/MIT)
4// This file may not be copied, modified, or distributed
5// except according to those terms.
6
7// Extensions for BAM records beyond htslib */
8use bio_types::genome::AbstractInterval;
9
10use crate::bam;
11use crate::bam::record::{Aux, CsString};
12use crate::bam::record::{
13    Cigar, CigarString,
14    CsValue::{self, *},
15};
16use crate::htslib;
17use std::collections::{BTreeMap, HashMap};
18
19use std::convert::TryInto;
20use std::ops::{Range, RangeBounds, RangeInclusive};
21use std::str::FromStr;
22#[derive(Debug, Clone, Copy)]
23pub struct MovingPos {
24    fakepos: i64,
25    isvalid: bool,
26}
27impl MovingPos {
28    fn new(pos: i64, isvalid: bool) -> Self {
29        MovingPos {
30            fakepos: pos,
31            isvalid,
32        }
33    }
34}
35#[derive(Debug, Clone)]
36pub struct CsData {
37    ///Get the genome align position
38    pub genome_pos: MovingPos,
39    //Get the read align position
40    pub read_pos: MovingPos,
41    //Get CS value
42    pub state: CsValue,
43    //Get sequence if existing else None
44    pub sequence: SeqPos,
45}
46impl CsData {
47    //Get genome pos or none if not existing
48    pub fn getgenomepos(&self) -> Option<i64> {
49        match self.genome_pos.isvalid {
50            true => Some(self.genome_pos.fakepos),
51            false => None,
52        }
53    }
54    //Get genome pos or the genomic position nefore
55    pub fn getgenomepos_zero(&self) -> i64 {
56        self.genome_pos.fakepos
57    }
58    //Get read pos or none if not existing
59    pub fn getreadpos(&self) -> Option<i64> {
60        match self.read_pos.isvalid {
61            true => Some(self.read_pos.fakepos),
62            false => None,
63        }
64    }
65    //Get read pos or or the read position nefore
66    pub fn getreadpos_zero(&self) -> i64 {
67        self.read_pos.fakepos
68    }
69    fn new(
70        genome_pos: (i64, bool),
71        read_pos: (i64, bool),
72        state: CsValue,
73        sequence: SeqPos,
74    ) -> Self {
75        CsData {
76            genome_pos: MovingPos::new(genome_pos.0, genome_pos.1),
77            read_pos: MovingPos::new(read_pos.0, read_pos.1),
78            state,
79            sequence,
80        }
81    }
82}
83#[derive(Debug, Clone)]
84pub struct SeqPos {
85    ///Get genomic sequence, None if not available
86    genome_seq: Option<String>,
87    ///Get read sequence, None if not available
88    read_seq: Option<String>,
89}
90impl SeqPos {
91    //Check genome seq is equal to given seq (None == None)
92    pub fn genomematch<T>(&self, genome_match: Option<T>) -> bool
93    where
94        T: AsRef<str>,
95    {
96        match (&self.genome_seq, genome_match) {
97            (Some(d), Some(q)) if d.to_lowercase() == q.as_ref().to_lowercase() => true,
98            (None, None) => true,
99            _ => false,
100        }
101    }
102    //Check read seq is equal to given seq (None == None)
103    pub fn readmatch<T>(&self, read_match: Option<T>) -> bool
104    where
105        T: AsRef<str>,
106    {
107        match (&self.read_seq, read_match) {
108            (Some(d), Some(q)) if d.to_lowercase() == q.as_ref().to_lowercase() => true,
109            (None, None) => true,
110            _ => false,
111        }
112    }
113}
114/// Block of aligned pairs
115pub struct CgAlignedBlockPairs {
116    /// Contig name, use getcontig()
117    pub contig: Vec<u8>,
118    /// Starting position in the genome, 0-based
119    pub genome_pos: i64,
120    /// Length of the alignment
121    pub genomelen: usize,
122    cs_index: usize,
123    csdata: Vec<CsData>,
124    /// Cs String
125    pub cs: CsString,
126}
127impl CgAlignedBlockPairs {
128    ///Get contig name
129    pub fn getcontig(&self) -> &[u8] {
130        &self.contig
131    }
132    /// Is a long cs
133    pub fn islongcs(&self) -> bool {
134        self.cs.islongcs()
135    }
136    /// Get CS tag
137    pub fn getcs(&self) -> &CsString {
138        &self.cs
139    }
140    ///Restrict Cgblocks to a specific region
141    pub fn restrict<T>(&mut self, contig: &[u8], range: T)
142    where
143        T: RangeBounds<usize>,
144    {
145        let genomepos = match self.genome_pos.try_into() {
146            Ok(a) => a,
147            Err(_a) => {
148                return;
149            }
150        };
151        if self.contig != contig || !range.contains(&genomepos) {
152            self.csdata.clear();
153            return;
154        }
155        let new = self
156            .filter(|p| {
157                if let Ok(a) = p.getgenomepos_zero().try_into() {
158                    range.contains(&a)
159                } else {
160                    false
161                }
162            })
163            .collect();
164        self.csdata = new;
165    }
166}
167impl Iterator for CgAlignedBlockPairs {
168    type Item = CsData;
169
170    fn next(&mut self) -> Option<Self::Item> {
171        match self.csdata.get(self.cs_index) {
172            Some(value) => {
173                self.cs_index += 1;
174                Some(value.clone())
175            }
176            None => None,
177        }
178    }
179}
180impl Into<CsString> for CgAlignedBlockPairs {
181    fn into(self) -> CsString {
182        self.cs
183    }
184}
185impl CgAlignedBlockPairs {
186    fn increasecounting(mut genome_pos: i64, mut query_pos: i64, state: &CsValue) -> (i64, i64) {
187        match state {
188            CsValue::Same(_) | CsValue::Intron(_) => {
189                genome_pos += state.getlength() as i64;
190                query_pos += state.getlength() as i64;
191                (genome_pos, query_pos)
192            }
193            CsValue::Deletion(_) => {
194                genome_pos += state.getlength() as i64;
195                (genome_pos, query_pos)
196            }
197            CsValue::Insertion(_) => {
198                query_pos += state.getlength() as i64;
199                (genome_pos, query_pos)
200            }
201            CsValue::Substitution(_) => {
202                genome_pos += 1;
203                query_pos += 1;
204                (genome_pos, query_pos)
205            }
206        }
207    }
208    /// Transform a CSstring into a CgAlignedBlockPairs
209    fn createfromcs<T, F>(
210        csstring: F,
211        seq: Option<T>,
212        contig: Vec<u8>,
213        old_genome_pos: i64,
214    ) -> Result<Self, crate::bam::Error>
215    where
216        T: Into<String>,
217        F: Into<CsString>,
218    {
219        let (mut genome_pos, mut query_pos): (i64, i64) = (old_genome_pos, 0);
220        let csstring = csstring.into();
221        let seq = seq.map(|p| p.into()).and_then(|f| {
222            if f.trim().is_empty() {
223                None
224            } else {
225                Some(f.trim().to_string())
226            }
227        });
228        let mut list = Vec::new();
229        for block in csstring.into_iter() {
230            let (seq, state) = match (seq.as_ref(), block) {
231                //Cs tag does not provide sequence (short form) but we have a cigar tag that can help us
232                (Some(s), a) if a.issame() => {
233                    let val: String = s
234                        .char_indices()
235                        .skip(query_pos.try_into().unwrap_or_default())
236                        .take(a.getlength())
237                        .into_iter()
238                        .map(|(_a, b)| b)
239                        .collect();
240                    if val.trim().is_empty() {
241                        return Err(crate::errors::Error::BamParseCS {
242                            rec: format!("Invalid format for CS tag at value {}", a),
243                        });
244                    }
245                    (Some(val), a)
246                }
247                (None, a) if a.issame() => {
248                    return Err(crate::errors::Error::BamParseCS {
249                        rec: format!("No seq provided to match for CS tag at value {}", a),
250                    });
251                }
252                (_, s) if s.isintron() => (None, s),
253                //Cs tag provides the sequence
254                (_, s) if let Some(a) = s.getseq() => (Some(a), s),
255                (_, b) => {
256                    return Err(crate::errors::Error::BamParseCS {
257                        rec: format!("Invalid format for CS tag at value {}", b),
258                    });
259                }
260            };
261            let (seq1, seq2) = match state {
262                CsValue::Substitution((a, b)) => (Some(a.to_string()), Some(b.to_string())),
263                CsValue::Same(_) => match seq {
264                    None => (None, None),
265                    Some(d) => (Some(d.clone()), Some(d.clone())),
266                },
267                CsValue::Deletion(_) => {
268                    let seq = seq
269                        .as_ref()
270                        .ok_or_else(|| crate::errors::Error::BamParseCS {
271                            rec: "Invalid string CS".to_string(),
272                        })?;
273                    (None, Some(seq.clone()))
274                }
275                CsValue::Insertion(_) | CsValue::Intron(_) => {
276                    let seq = seq
277                        .as_ref()
278                        .ok_or_else(|| crate::errors::Error::BamParseCS {
279                            rec: "Invalid string CS".to_string(),
280                        })?;
281                    (Some(seq.clone()), None)
282                }
283            };
284            let seq = SeqPos {
285                genome_seq: seq1,
286                read_seq: seq2,
287            };
288            let genome_bool = !matches!(state, CsValue::Insertion(_));
289            let read_bool = !matches!(state, CsValue::Deletion(_));
290            let elem = CsData::new(
291                (genome_pos, genome_bool),
292                (query_pos, read_bool),
293                state.clone(),
294                seq,
295            );
296            (genome_pos, query_pos) = Self::increasecounting(genome_pos, query_pos, &state);
297            list.push(elem);
298        }
299        Ok(CgAlignedBlockPairs {
300            contig,
301            genome_pos: old_genome_pos,
302            genomelen: std::convert::TryInto::<usize>::try_into(genome_pos - old_genome_pos + 1)
303                .unwrap(),
304            cs_index: 0,
305            csdata: list,
306            cs: csstring,
307        })
308    }
309    /// Parses an MD tag (from SAM format) and a CIGAR string to generate a consensus sequence (CS).
310    ///
311    /// # Arguments
312    /// * `md` - The MD tag string (e.g., "147^C4418^C731^G").
313    /// * `seq` - The read sequence (e.g., "ACGTACGT...").
314    /// * `cigar` - The CIGAR string as a slice of `Cigar` operations.
315    /// * `line` - A identifier for the current line (used for error reporting).
316    /// * `long_cs` - If true, generates a detailed consensus sequence with explicit matches/mismatches.
317    /// * `contig` - The contig (chromosome) name.
318    /// * `genome_pos` - The starting genome position of the alignment.
319    ///
320    /// # Returns
321    /// A `Result` containing the parsed consensus sequence or an error if parsing fails.
322    ///
323    /// # Errors
324    /// Returns `bam::Error::BamParseMD` if:
325    /// - The MD tag, sequence, or CIGAR string is empty.
326    /// - The MD tag starts or ends with a deletion (`^`).
327    /// - The MD tag or CIGAR string is malformed.
328    /// - The MD tag and CIGAR string are inconsistent (e.g., lengths do not match).
329    ///
330    /// # SAM Format Notes
331    /// - The MD tag describes mismatches and deletions in the reference.
332    ///   - Matches: `\d+` (e.g., "10" for 10 matches).
333    ///   - Mismatches: `[A-Za-z]` (e.g., "A" for a mismatch with base `A`).
334    ///   - Deletions: `\^[A-Za-z]+` (e.g., "^ATG" for a deletion of "ATG" in the reference).
335    /// - The CIGAR string describes the alignment:
336    ///   - `M`/`=`/`X`: Match/mismatch (consumes both read and reference).
337    ///   - `I`: Insertion (consumes read only).
338    ///   - `D`: Deletion (consumes reference only).
339    ///   - `N`: Reference skip (consumes reference only).
340    ///   - `S`/`H`: Soft/hard clip (ignored for MD tag parsing).
341    fn createfrommdtag<T>(
342        md: T,
343        seq: T,
344        cigar: &[Cigar],
345        line: T,
346        long_cs: bool,
347        contig: Vec<u8>,
348        genome_pos: i64,
349    ) -> Result<Self, bam::Error>
350    where
351        T: AsRef<str>,
352    {
353        // Trim and validate inputs
354        let md = md.as_ref().trim();
355        let seq = seq.as_ref().trim();
356        let line = line.as_ref().trim();
357
358        if md.is_empty() || seq.is_empty() || cigar.is_empty() {
359            return Err(bam::Error::BamParseMD {
360                rec: format!("at line {}: MD, SEQ, or CIGAR tag is empty", line),
361            });
362        }
363
364        if md.starts_with('^') || md.ends_with('^') {
365            return Err(bam::Error::BamParseMD {
366                rec: format!("at line {}: MD tag cannot start or end with '^'", line),
367            });
368        }
369
370        // Regex to parse the MD tag:
371        // - Group 1: Matches (digits, e.g., "10").
372        // - Group 2: Deletion marker (`^`).
373        // - Group 3: Deletion bases (e.g., "ATG" in "^ATG").
374        // - Group 4: Mismatch base(s) (e.g., "A" or "A0T").
375        let re_md = regex::RegexBuilder::new(r"(\d+)|(\^)([a-z]+)|((?:[a-z]0?)+)")
376            .case_insensitive(true)
377            .build()
378            .map_err(|e| bam::Error::BamParseMD {
379                rec: format!("at line {}: Invalid MD tag regex: {}", line, e),
380            })?;
381
382        // Initialize positions:
383        // - `cx`: Current reference position (from CIGAR).
384        // - `cy`: Current read position (from CIGAR).
385        // - `mx`: Current reference position (from MD tag).
386        // - `my`: Current read position (from MD tag).
387        let mut cx = 0;
388        let mut cy = 0;
389        let mut mx = 0;
390        let mut my: usize = 0;
391        let mut k = 0; // CIGAR index
392        let mut rem_cl: usize = 0; // Cigar last bases (M/=/X)
393        let mut cs = String::new(); // Consensus sequence
394
395        for cap in re_md.captures_iter(md) {
396            // --- Handle deletions in the MD tag (e.g., "^ATG") ---
397            if let Some(deletion) = cap.get(3) {
398                let deletion_len = deletion.as_str().len();
399                // Deletions in the MD tag represent bases in the reference that are not in the read.
400                // They only advance the reference position (`mx`).
401                cs.push('-');
402                cs.push_str(deletion.as_str());
403                mx += deletion_len;
404                cx += deletion_len;
405                if cigar.get(k) == Some(&Cigar::Del(deletion_len.try_into().unwrap_or_default())) {
406                    k += 1;
407                }
408                rem_cl = 0;
409                continue;
410            }
411
412            // --- Handle matches (digits) or mismatches (multiples base) ---
413            let mut ml = if let Some(match_len) = cap.get(1) {
414                // Parse match length (e.g., "10" -> 10)
415                match_len
416                    .as_str()
417                    .parse::<usize>()
418                    .map_err(|e| bam::Error::BamParseMD {
419                        rec: format!("at line {}: Invalid match length in MD tag: {}", line, e),
420                    })?
421            } else if let Some(b) = cap.get(4) {
422                // Mismatch: remove 0 match and count bases
423                b.as_str().replace("0", "").len()
424            } else {
425                return Err(bam::Error::BamParseMD {
426                    rec: format!("at line {}: Invalid MD tag component: {}", line, md),
427                });
428            };
429
430            if ml == 0 {
431                continue; // Skip zero-length matches
432            }
433
434            // --- Process CIGAR operations to align with the MD tag ---
435            while let Some(elem) = cigar.get(k) {
436                match elem {
437                    // --- Deletions in CIGAR (D) ---
438                    // Deletions in CIGAR represent bases in the reference that are not in the read.
439                    // They only advance the reference position (`cx`).
440                    Cigar::Del(cl) => {
441                        let cl: usize = (*cl).try_into().map_err(|_| bam::Error::BamParseMD {
442                            rec: format!("at line {}: Invalid CIGAR deletion length", line),
443                        })?;
444                        cx += cl;
445                        mx += cl;
446                        k += 1;
447                        rem_cl = 0;
448                    }
449
450                    // --- Matches, mismatches, or equal operations (M/=/X) ---
451                    // These consume both the read and reference.
452                    Cigar::Equal(cl) | Cigar::Diff(cl) | Cigar::Match(cl) => {
453                        let cl: usize = (*cl).try_into().map_err(|_| bam::Error::BamParseMD {
454                            rec: format!("at line {}: Invalid CIGAR match length", line),
455                        })?;
456                        if rem_cl == 0 {
457                            rem_cl = cl;
458                        }
459                        let take = ml.min(rem_cl);
460
461                        if let Some(mismatch_base) = cap.get(4) {
462                            // (inchangé pour le cas courant à 1 base — voir note plus bas
463                            //  si un mismatch multi-bases peut chevaucher une insertion)
464                            let mut raw = String::new();
465                            for (index, charm) in
466                                mismatch_base.as_str().replace("0", "").chars().enumerate()
467                            {
468                                raw.push('*');
469                                raw.push_str(&charm.to_string());
470                                let string: Vec<char> =
471                                    seq.chars().skip(my.saturating_add(index)).take(1).collect();
472                                let string: String = string.into_iter().collect();
473                                if string.trim().is_empty() {
474                                    return Err(bam::Error::BamParseMD {
475                                        rec: format!(
476                                            "at line {}: Read sequence too short for MD tag",
477                                            line
478                                        ),
479                                    });
480                                }
481                                raw.push_str(&string);
482                            }
483                            cs.push_str(&raw);
484                        } else if long_cs {
485                            cs.push('=');
486                            let string: Vec<char> = seq.chars().skip(my).take(take).collect();
487                            let string: String = string.into_iter().collect();
488                            if string.trim().is_empty() {
489                                return Err(bam::Error::BamParseMD {
490                                    rec: format!(
491                                        "at line {}: Read sequence too short for MD tag",
492                                        line
493                                    ),
494                                });
495                            }
496                            cs.push_str(&string);
497                        } else {
498                            cs.push(':');
499                            cs.push_str(&take.to_string()); // était `cl.to_string()`
500                        }
501
502                        mx += take;
503                        my += take;
504                        cx += take;
505                        cy += take;
506                        ml -= take;
507                        rem_cl -= take;
508
509                        if rem_cl == 0 {
510                            k += 1; // opération CIGAR épuisée seulement maintenant
511                        }
512                        if ml == 0 {
513                            break;
514                        }
515                    }
516
517                    // --- Insertions in CIGAR (I) ---
518                    // Insertions consume the read but not the reference.
519                    Cigar::Ins(cl) => {
520                        let cl: usize = (*cl).try_into().map_err(|_| bam::Error::BamParseMD {
521                            rec: format!("at line {}: Invalid CIGAR insertion length", line),
522                        })?;
523                        cs.push('+');
524                        let string: Vec<char> = seq.chars().skip(cy).take(cl).collect();
525                        let string: String = string.into_iter().collect();
526                        if string.trim().is_empty() {
527                            return Err(bam::Error::BamParseMD {
528                                rec: format!(
529                                    "at line {}: Read sequence too short for MD tag insertion. Cy is {} and CL is {}",
530                                    line, cy, cl
531                                ),
532                            });
533                        }
534                        cs.push_str(&string);
535                        cy += cl;
536                        my += cl;
537                        k += 1;
538                        rem_cl = 0;
539                    }
540
541                    // --- Soft clips (S) ---
542                    // Soft clips consume the read but not the reference.
543                    Cigar::SoftClip(cl) => {
544                        let cl: usize = (*cl).try_into().map_err(|_| bam::Error::BamParseMD {
545                            rec: format!("at line {}: Invalid CIGAR soft clip length", line),
546                        })?;
547                        cy += cl;
548                        my += cl;
549                        k += 1;
550                        rem_cl = 0;
551                    }
552
553                    // --- Reference skips (N) ---
554                    // Reference skips consume the reference but not the read.
555                    Cigar::RefSkip(cl) => {
556                        let cl: usize = (*cl).try_into().map_err(|_| bam::Error::BamParseMD {
557                            rec: format!("at line {}: Invalid CIGAR reference skip length", line),
558                        })?;
559                        cx += cl;
560                        mx += cl;
561                        k += 1;
562                        rem_cl = 0;
563                    }
564
565                    // --- Hard clips (H) and padding (P) ---
566                    // These are ignored for MD tag parsing.
567                    Cigar::HardClip(_) | Cigar::Pad(_) => {
568                        k += 1;
569                        rem_cl = 0;
570                    }
571                }
572            }
573
574            // If there's remaining `ml`, the CIGAR string is incomplete
575            if ml != 0 {
576                return Err(bam::Error::BamParseMD {
577                    rec: format!(
578                        "at line {}: Inconsistent MD tag (ml={} remaining, cx={}, mx={}, cy={}, my={}, cigarpos={}, elem={:?}, md={:?})",
579                        line,
580                        ml,
581                        cx,
582                        mx,
583                        cy,
584                        my,
585                        k,
586                        cigar.get(k.saturating_sub(1)),
587                        cap
588                    ),
589                });
590            }
591        }
592
593        // Final check: All positions must align
594        if cx != mx || cy != my {
595            return Err(bam::Error::BamParseMD {
596                rec: format!(
597                    "at line {}: Inconsistent alignment (cx={}, mx={}, cy={}, my={})",
598                    line, cx, mx, cy, my
599                ),
600            });
601        }
602
603        // Success: Create the consensus sequence
604        Ok(Self::createfromcs(
605            CsString::from_str(&cs)?,
606            Some(seq.to_string()),
607            contig,
608            genome_pos,
609        )?)
610    }
611}
612pub trait MatchIter {
613    ///Only print matched bases?
614    fn ismatchonly(&self) -> bool;
615    ///Set match state
616    fn setmatchstate(&mut self, matchs: bool);
617}
618pub struct IterAlignedBlockCigarMatchPairs {
619    genome_pos: i64,
620    read_pos: i64,
621    cigar_index: usize,
622    cigar: Vec<Cigar>,
623}
624impl Iterator for IterAlignedBlockCigarMatchPairs {
625    type Item = (Option<(Range<i64>, Range<i64>)>, Cigar);
626    fn next(&mut self) -> Option<Self::Item> {
627        while self.cigar_index < self.cigar.len() {
628            let entry = self.cigar[self.cigar_index];
629            self.cigar_index += 1;
630            match entry {
631                Cigar::Match(len) | Cigar::Equal(len) | Cigar::Diff(len) => {
632                    let qstart = self.read_pos;
633                    let qend = qstart + len as i64;
634                    let rstart = self.genome_pos;
635                    let rend = self.genome_pos + len as i64;
636                    self.read_pos += len as i64;
637                    self.genome_pos += len as i64;
638                    if matches!(entry, Cigar::Equal(_)) {
639                        return Some((Some((qstart..qend, rstart..rend)), entry));
640                    }
641                }
642                Cigar::Ins(len) | Cigar::SoftClip(len) => {
643                    self.read_pos += len as i64;
644                }
645                Cigar::Del(len) | Cigar::RefSkip(len) => {
646                    self.genome_pos += len as i64;
647                }
648                Cigar::HardClip(_) => {} // no advance
649                Cigar::Pad(_) => panic!("Padding (Cigar::Pad) is not supported."), //padding is only used for multiple sequence alignment
650            }
651            return Some((None, entry));
652        }
653        None
654    }
655}
656pub struct IterAlignedBlockCigarPairs {
657    genome_pos: i64,
658    read_pos: i64,
659    cigar_index: usize,
660    cigar: Vec<Cigar>,
661}
662impl Iterator for IterAlignedBlockCigarPairs {
663    type Item = (Range<i64>, Range<i64>, Cigar);
664    fn next(&mut self) -> Option<Self::Item> {
665        while self.cigar_index < self.cigar.len() {
666            let entry = self.cigar[self.cigar_index];
667            self.cigar_index += 1;
668            match entry {
669                Cigar::Match(len) | Cigar::Equal(len) | Cigar::Diff(len) => {
670                    let qstart = self.read_pos;
671                    let qend = qstart + len as i64;
672                    let rstart = self.genome_pos;
673                    let rend = self.genome_pos + len as i64;
674                    self.read_pos += len as i64;
675                    self.genome_pos += len as i64;
676                    return Some((qstart..qend, rstart..rend, entry));
677                }
678                Cigar::Ins(len) | Cigar::SoftClip(len) => {
679                    let qstart = self.read_pos;
680                    let qend = qstart + len as i64;
681                    let rstart = self.genome_pos;
682                    self.read_pos += len as i64;
683                    return Some((qstart..qend, rstart..rstart, entry));
684                }
685                Cigar::Del(len) | Cigar::RefSkip(len) => {
686                    let qstart = self.read_pos;
687                    let rstart = self.genome_pos;
688                    let rend = self.genome_pos + len as i64;
689                    self.genome_pos += len as i64;
690                    return Some((qstart..qstart, rstart..rend, entry));
691                }
692                Cigar::HardClip(_) => {
693                    return Some((
694                        self.read_pos..self.read_pos,
695                        self.genome_pos..self.genome_pos,
696                        entry,
697                    ));
698                } // no advance
699                Cigar::Pad(_) => panic!("Padding (Cigar::Pad) is not supported."), //padding is only used for multiple sequence alignment
700            }
701        }
702        None
703    }
704}
705pub struct IterAlignedBlockPairs {
706    genome_pos: i64,
707    read_pos: i64,
708    cigar_index: usize,
709    cigar: Vec<Cigar>,
710    r#match: bool,
711}
712impl MatchIter for IterAlignedBlockPairs {
713    fn ismatchonly(&self) -> bool {
714        self.r#match
715    }
716
717    fn setmatchstate(&mut self, matchs: bool) {
718        self.r#match = matchs;
719    }
720}
721impl Iterator for IterAlignedBlockPairs {
722    type Item = ([i64; 2], [i64; 2]);
723    fn next(&mut self) -> Option<Self::Item> {
724        while self.cigar_index < self.cigar.len() {
725            let entry = self.cigar[self.cigar_index];
726            match entry {
727                Cigar::Match(len) | Cigar::Equal(len) | Cigar::Diff(len) => {
728                    let qstart = self.read_pos;
729                    let qend = qstart + len as i64;
730                    let rstart = self.genome_pos;
731                    let rend = self.genome_pos + len as i64;
732                    self.read_pos += len as i64;
733                    self.genome_pos += len as i64;
734                    #[allow(clippy::nonminimal_bool)]
735                    if (self.r#match && matches!(entry, Cigar::Equal(_))) || !self.r#match {
736                        self.cigar_index += 1;
737                        return Some(([qstart, qend], [rstart, rend]));
738                    }
739                }
740                Cigar::Ins(len) | Cigar::SoftClip(len) => {
741                    self.read_pos += len as i64;
742                }
743                Cigar::Del(len) | Cigar::RefSkip(len) => {
744                    self.genome_pos += len as i64;
745                }
746                Cigar::HardClip(_) => {} // no advance
747                Cigar::Pad(_) => panic!("Padding (Cigar::Pad) is not supported."), //padding is only used for multiple sequence alignment
748            }
749            self.cigar_index += 1;
750        }
751        None
752    }
753}
754#[derive(Ord, PartialOrd, Eq, PartialEq, Debug, Copy, Clone)]
755pub struct RangePos {
756    pub start: i64,
757    pub end: i64,
758}
759impl RangePos {
760    pub fn getrange(&self) -> Range<i64> {
761        self.start..self.end
762    }
763    pub fn start(&self) -> i64 {
764        self.start
765    }
766    pub fn end(&self) -> i64 {
767        self.end
768    }
769    #[allow(unused)]
770    fn new(start: i64, end: i64) -> Self {
771        let (start, end) = match start.cmp(&end) {
772            std::cmp::Ordering::Greater => (end, start),
773            _ => (start, end),
774        };
775        RangePos { start, end }
776    }
777}
778/// Matching sequence, return a genomic range and associated sequence
779/// ```
780/// use extended_htslib::bam::ext::MatchSequence;
781/// let test = MatchSequence::default();
782/// for (range, sequence) in test.gethash() {
783///     println!("SEQ: {} for {}-{}",sequence,range.start,range.end);
784/// }
785/// ```
786pub struct MatchSequence {
787    pub hash: BTreeMap<RangePos, String>,
788}
789impl MatchSequence {
790    pub fn new(range: RangePos, text: String) -> Self {
791        let mut map = BTreeMap::new();
792        map.insert(range, text);
793        MatchSequence { hash: map }
794    }
795    /// return a hash of rangepos and genomic sequence
796    pub fn gethash(&self) -> &BTreeMap<RangePos, String> {
797        &self.hash
798    }
799    ///Check if a range of genomic position is completely aligned with the read. Return the sequence if yes else return None
800    pub fn isfullymatched(&self, range: RangeInclusive<i64>) -> Option<String> {
801        let mut vec = self.hash.iter();
802        vec.find_map(|(a, b)| {
803            if a.getrange().contains(range.start()) && a.getrange().contains(range.end()) {
804                Some(b.clone())
805            } else {
806                None
807            }
808        })
809    }
810}
811impl Default for MatchSequence {
812    fn default() -> Self {
813        let default = String::new();
814        let range = RangePos { start: 1, end: 1 };
815        Self::new(range, default)
816    }
817}
818pub struct IterAlignedBlocks {
819    pos: i64,
820    cigar_index: usize,
821    cigar: Vec<Cigar>,
822    r#match: bool,
823}
824impl MatchIter for IterAlignedBlocks {
825    fn ismatchonly(&self) -> bool {
826        self.r#match
827    }
828
829    fn setmatchstate(&mut self, matchs: bool) {
830        self.r#match = matchs;
831    }
832}
833impl Iterator for IterAlignedBlocks {
834    type Item = [i64; 2];
835    fn next(&mut self) -> Option<Self::Item> {
836        while self.cigar_index < self.cigar.len() {
837            let entry = self.cigar[self.cigar_index];
838            match entry {
839                Cigar::Match(len) | Cigar::Equal(len) | Cigar::Diff(len) => {
840                    let out_pos = self.pos;
841                    //result.push([pos, pos + *len as i64]);
842                    self.pos += len as i64;
843                    #[allow(clippy::nonminimal_bool)]
844                    if (self.r#match && matches!(entry, Cigar::Equal(_))) || !self.r#match {
845                        self.cigar_index += 1;
846                        return Some([out_pos, out_pos + len as i64]);
847                    }
848                }
849                Cigar::Del(len) => self.pos += len as i64,
850                Cigar::RefSkip(len) => self.pos += len as i64,
851                _ => (),
852            }
853            self.cigar_index += 1;
854        }
855        None
856    }
857}
858
859pub struct IterIntrons {
860    pos: i64,
861    cigar_index: usize,
862    cigar: Vec<Cigar>,
863}
864
865impl Iterator for IterIntrons {
866    type Item = [i64; 2];
867    fn next(&mut self) -> Option<Self::Item> {
868        while self.cigar_index < self.cigar.len() {
869            let entry = self.cigar[self.cigar_index];
870            match entry {
871                Cigar::Match(len) | Cigar::Equal(len) | Cigar::Diff(len) | Cigar::Del(len) => {
872                    self.pos += len as i64
873                }
874                Cigar::RefSkip(len) => {
875                    let junc_start = self.pos;
876                    self.pos += len as i64;
877                    self.cigar_index += 1;
878                    return Some([junc_start, self.pos]); //self.pos is  junc_start + len
879                }
880                _ => {}
881            }
882            self.cigar_index += 1;
883        }
884        None
885    }
886}
887
888pub struct IterAlignedPairs {
889    genome_pos: i64,
890    read_pos: i64,
891    cigar: Vec<Cigar>,
892    remaining_match_bp: u32,
893    cigar_index: usize,
894    r#match: bool,
895}
896impl MatchIter for IterAlignedPairs {
897    fn ismatchonly(&self) -> bool {
898        self.r#match
899    }
900
901    fn setmatchstate(&mut self, matchs: bool) {
902        self.r#match = matchs;
903    }
904}
905impl Iterator for IterAlignedPairs {
906    type Item = [i64; 2];
907    fn next(&mut self) -> Option<Self::Item> {
908        if self.remaining_match_bp > 0 {
909            self.remaining_match_bp -= 1;
910            self.genome_pos += 1;
911            self.read_pos += 1;
912            return Some([self.read_pos - 1, self.genome_pos - 1]);
913        }
914
915        while self.cigar_index < self.cigar.len() {
916            let entry = self.cigar[self.cigar_index];
917            match entry {
918                Cigar::Match(len) | Cigar::Equal(len) | Cigar::Diff(len) => {
919                    self.genome_pos += 1;
920                    self.read_pos += 1;
921                    self.remaining_match_bp = len - 1;
922                    #[allow(clippy::nonminimal_bool)]
923                    if (self.r#match && matches!(entry, Cigar::Equal(_))) || !self.r#match {
924                        self.cigar_index += 1;
925                        return Some([self.read_pos - 1, self.genome_pos - 1]);
926                    }
927                }
928                Cigar::Ins(len) | Cigar::SoftClip(len) => {
929                    self.read_pos += len as i64;
930                }
931                Cigar::Del(len) | Cigar::RefSkip(len) => {
932                    self.genome_pos += len as i64;
933                }
934                Cigar::HardClip(_) => {} // no advance
935                Cigar::Pad(_) => panic!("Padding (Cigar::Pad) is not supported."), //padding is only used for multiple sequence alignment
936            }
937            self.cigar_index += 1;
938        }
939        None
940    }
941}
942
943pub struct IterAlignedPairsFull {
944    genome_pos: i64,
945    read_pos: i64,
946    cigar: Vec<Cigar>,
947    remaining_match_bp: u32,
948    remaining_ins_bp: u32,
949    remaining_del_bp: u32,
950    cigar_index: usize,
951}
952pub(super) struct IterAlignedPairsFullCigar {
953    genome_pos: i64,
954    read_pos: i64,
955    cigar: Vec<Cigar>,
956    qual: Vec<u8>,
957    remaining_match_bp: u32,
958    remaining_ins_bp: u32,
959    remaining_del_bp: u32,
960    cigar_index: usize,
961}
962impl IterAlignedPairsFullCigar {
963    pub fn new(start: IterAlignedPairsFull, record: &bam::Record) -> Self {
964        Self {
965            genome_pos: start.genome_pos,
966            read_pos: start.read_pos,
967            cigar: start.cigar,
968            qual: record.qual().to_vec(),
969            remaining_match_bp: start.remaining_match_bp,
970            remaining_ins_bp: start.remaining_ins_bp,
971            remaining_del_bp: start.remaining_del_bp,
972            cigar_index: start.cigar_index,
973        }
974    }
975}
976/// Iterate over read pos, genome pos, cigar and quality of read
977impl Iterator for IterAlignedPairsFullCigar {
978    type Item = ([Option<i64>; 2], Cigar, u8);
979    fn next(&mut self) -> Option<Self::Item> {
980        if self.remaining_match_bp > 0 {
981            self.remaining_match_bp -= 1;
982            self.genome_pos += 1;
983            self.read_pos += 1;
984            return Some((
985                [Some(self.read_pos - 1), Some(self.genome_pos - 1)],
986                self.cigar[self.cigar_index.saturating_sub(1)],
987                self.qual
988                    .get(
989                        usize::try_from(self.read_pos)
990                            .unwrap_or_default()
991                            .saturating_sub(1),
992                    )
993                    .copied()
994                    .unwrap_or(u8::MAX),
995            ));
996        }
997        if self.remaining_ins_bp > 0 {
998            self.remaining_ins_bp -= 1;
999            self.read_pos += 1;
1000            return Some((
1001                [Some(self.read_pos - 1), None],
1002                self.cigar[self.cigar_index.saturating_sub(1)],
1003                self.qual
1004                    .get(
1005                        usize::try_from(self.read_pos)
1006                            .unwrap_or_default()
1007                            .saturating_sub(1),
1008                    )
1009                    .copied()
1010                    .unwrap_or(u8::MAX),
1011            ));
1012        }
1013        if self.remaining_del_bp > 0 {
1014            self.remaining_del_bp -= 1;
1015            self.genome_pos += 1;
1016            return Some((
1017                [None, Some(self.genome_pos - 1)],
1018                self.cigar[self.cigar_index.saturating_sub(1)],
1019                self.qual
1020                    .get(usize::try_from(self.read_pos).unwrap_or_default())
1021                    .copied()
1022                    .unwrap_or(u8::MAX),
1023            ));
1024        }
1025
1026        while self.cigar_index < self.cigar.len() {
1027            let entry = self.cigar[self.cigar_index];
1028            match entry {
1029                Cigar::Match(len) | Cigar::Equal(len) | Cigar::Diff(len) => {
1030                    self.genome_pos += 1;
1031                    self.read_pos += 1;
1032                    self.remaining_match_bp = len - 1;
1033                    self.cigar_index += 1;
1034                    return Some((
1035                        [Some(self.read_pos - 1), Some(self.genome_pos - 1)],
1036                        entry,
1037                        self.qual
1038                            .get(
1039                                usize::try_from(self.read_pos)
1040                                    .unwrap_or_default()
1041                                    .saturating_sub(1),
1042                            )
1043                            .copied()
1044                            .unwrap_or(u8::MAX),
1045                    ));
1046                }
1047                Cigar::Ins(len) | Cigar::SoftClip(len) => {
1048                    self.read_pos += 1;
1049                    self.remaining_ins_bp = len - 1;
1050                    self.cigar_index += 1;
1051                    return Some((
1052                        [Some(self.read_pos - 1), None],
1053                        entry,
1054                        self.qual
1055                            .get(
1056                                usize::try_from(self.read_pos)
1057                                    .unwrap_or_default()
1058                                    .saturating_sub(1),
1059                            )
1060                            .copied()
1061                            .unwrap_or(u8::MAX),
1062                    ));
1063                }
1064                Cigar::Del(len) | Cigar::RefSkip(len) => {
1065                    self.genome_pos += 1;
1066                    self.remaining_del_bp = len - 1;
1067                    self.cigar_index += 1;
1068                    return Some((
1069                        [None, Some(self.genome_pos - 1)],
1070                        entry,
1071                        self.qual
1072                            .get(usize::try_from(self.read_pos).unwrap_or_default())
1073                            .copied()
1074                            .unwrap_or(u8::MAX),
1075                    ));
1076                }
1077                Cigar::HardClip(_) => {
1078                    // no advance
1079                }
1080                Cigar::Pad(_) => panic!("Padding (Cigar::Pad) is not supported."), //padding is only used for multiple sequence alignment
1081            }
1082            self.cigar_index += 1;
1083        }
1084        None
1085    }
1086}
1087
1088impl Iterator for IterAlignedPairsFull {
1089    type Item = [Option<i64>; 2];
1090    fn next(&mut self) -> Option<Self::Item> {
1091        if self.remaining_match_bp > 0 {
1092            self.remaining_match_bp -= 1;
1093            self.genome_pos += 1;
1094            self.read_pos += 1;
1095            return Some([Some(self.read_pos - 1), Some(self.genome_pos - 1)]);
1096        }
1097        if self.remaining_ins_bp > 0 {
1098            self.remaining_ins_bp -= 1;
1099            self.read_pos += 1;
1100            return Some([Some(self.read_pos - 1), None]);
1101        }
1102        if self.remaining_del_bp > 0 {
1103            self.remaining_del_bp -= 1;
1104            self.genome_pos += 1;
1105            return Some([None, Some(self.genome_pos - 1)]);
1106        }
1107
1108        while self.cigar_index < self.cigar.len() {
1109            let entry = self.cigar[self.cigar_index];
1110            match entry {
1111                Cigar::Match(len) | Cigar::Equal(len) | Cigar::Diff(len) => {
1112                    self.genome_pos += 1;
1113                    self.read_pos += 1;
1114                    self.remaining_match_bp = len - 1;
1115                    self.cigar_index += 1;
1116                    return Some([Some(self.read_pos - 1), Some(self.genome_pos - 1)]);
1117                }
1118                Cigar::Ins(len) | Cigar::SoftClip(len) => {
1119                    self.read_pos += 1;
1120                    self.remaining_ins_bp = len - 1;
1121                    self.cigar_index += 1;
1122                    return Some([Some(self.read_pos - 1), None]);
1123                }
1124                Cigar::Del(len) | Cigar::RefSkip(len) => {
1125                    self.genome_pos += 1;
1126                    self.remaining_del_bp = len - 1;
1127                    self.cigar_index += 1;
1128                    return Some([None, Some(self.genome_pos - 1)]);
1129                }
1130                Cigar::HardClip(_) => {
1131                    // no advance
1132                }
1133                Cigar::Pad(_) => panic!("Padding (Cigar::Pad) is not supported."), //padding is only used for multiple sequence alignment
1134            }
1135            self.cigar_index += 1;
1136        }
1137        None
1138    }
1139}
1140
1141/// Extra functionality for BAM records
1142///
1143/// Inspired by pysam
1144pub trait BamRecordExtensions {
1145    /// iterator over start and end positions with the sequence of matched
1146    /// blocks.
1147    /// # Errors
1148    /// Return None if CIGAR does not contain any = or sequence is not present.
1149    fn matched_sequence(&self) -> Option<MatchSequence>;
1150    /// iterator over start and end positions of aligned gapless blocks
1151    ///
1152    /// The start and end positions are in genomic coordinates.
1153    /// There is not necessarily a gap between blocks on the genome,
1154    /// this happens on insertions.
1155    ///
1156    /// pysam: blocks
1157    /// See also: [aligned_block_pairs](#tymethod.aligned_block_pairs) if you need
1158    /// the read coordinates as well.
1159    fn aligned_blocks(&self) -> IterAlignedBlocks;
1160    /// iterator over start and end positions of aligned matched blocks.
1161    ///
1162    /// The start and end positions are in genomic coordinates.
1163    /// There is not necessarily a gap between blocks on the genome,
1164    /// this happens on insertions.
1165    /// # Errors
1166    /// Return None if CIGAR does not contain any = or sequence is not present.
1167    fn aligned_blocks_match(&self) -> Option<IterAlignedBlocks>;
1168    ///Iter over <([read_start, read_stop], [genome_start, genome_stop]) blocks
1169    ///of continously aligned reads.
1170    ///
1171    ///In contrast to [aligned_blocks](#tymethod.aligned_blocks), this returns
1172    ///read and genome coordinates.
1173    ///
1174    ///There is not necessarily a gap between blocks in either coordinate space
1175    ///(this happens in in-dels).
1176    fn aligned_block_pairs(&self) -> IterAlignedBlockPairs;
1177    ///Iter over <([read_start, read_stop], [genome_start, genome_stop]) blocks
1178    ///of continously matched reads.
1179    ///
1180    ///In contrast to [aligned_blocks](#tymethod.aligned_blocks), this returns
1181    ///read and genome coordinates.
1182    ///In contrast to aligned_pairs, this returns only match sequence.
1183    ///
1184    ///There is not necessarily a gap between blocks in either coordinate space
1185    ///(this happens in in-dels).
1186    /// # Errors
1187    /// Return None if CIGAR does not contain any = or sequence is not present.
1188    fn aligned_block_pairs_match(&self) -> Option<IterAlignedBlockPairs>;
1189    ///Iter over <(([read_start..read_stop], [genome_start..genome_stop], Cigar)> blocks
1190    ///of cigar blocks (it is a range).
1191    ///
1192    ///In contrast to [aligned_blocks](#tymethod.aligned_blocks), this returns
1193    ///read and genome coordinates and by blocks of cigar.
1194    ///In contrast to aligned_pairs, this returns the cigar format.
1195    ///
1196    ///There is not necessarily a gap between blocks in either coordinate space
1197    ///(this happens in in-dels).
1198    fn aligned_block_pairs_cigar(&self) -> IterAlignedBlockCigarPairs;
1199    ///Iter over <(Option<([read_start..read_stop], [genome_start..genome_stop]),Cigar)> blocks
1200    ///of cigar blocks that perfectly match the reference (it is a range).
1201    ///
1202    ///In contrast to [aligned_blocks_match](#tymethod.aligned_blocks_match), this returns
1203    ///read and genome coordinates.
1204    ///In contrast to aligned_pairs_match, this returns None for every element that has no matching element and the cigar.
1205    ///
1206    ///There is not necessarily a gap between blocks in either coordinate space
1207    ///(this happens in in-dels).
1208    ///
1209    /// # Errors
1210    /// Return None if CIGAR does not contain any = or sequence is not present.
1211    fn aligned_block_pairs_cigar_match(&self) -> Option<IterAlignedBlockCigarMatchPairs>;
1212    /// This scans the CIGAR for reference skips
1213    /// and reports their positions.
1214    /// It does not inspect the reported regions
1215    /// for actual splice sites.
1216    /// pysam: get_introns
1217    fn introns(&self) -> IterIntrons;
1218    /// iter aligned read and reference positions on a basepair level
1219    ///
1220    /// No entry for mismatches, insertions, deletions or skipped pairs
1221    ///
1222    /// pysam: get_aligned_pairs(matches_only = True) but only matched bases
1223    ///
1224    /// See also [aligned_block_pairs](#tymethod.aligned_block_pairs)
1225    /// if you just need start&end coordinates of each block.
1226    /// That way you can allocate less memory for the same
1227    /// informational content.
1228    /// # Errors
1229    /// Return None if CIGAR does not contain any =/X.
1230    fn aligned_pairs_match(&self) -> Option<IterAlignedPairs>;
1231    /// iter aligned read and reference positions on a basepair level
1232    ///
1233    /// No entry for insertions, deletions or skipped pairs
1234    ///
1235    /// pysam: get_aligned_pairs(matches_only = True)
1236    ///
1237    /// See also [aligned_block_pairs](#tymethod.aligned_block_pairs)
1238    /// if you just need start&end coordinates of each block.
1239    /// That way you can allocate less memory for the same
1240    /// informational content.
1241    fn aligned_pairs(&self) -> IterAlignedPairs;
1242
1243    /// iter list of read and reference positions on a basepair level.
1244    ///
1245    /// Unlike `aligned_pairs` this returns None in
1246    /// either the read positions or the reference position
1247    /// for insertions, deletions or skipped pairs
1248    ///
1249    /// pysam: aligned_pairs(matches_only = False)
1250    fn aligned_pairs_full(&self) -> IterAlignedPairsFull;
1251
1252    /// the number of nucleotides covered by each Cigar::* variant.
1253    ///
1254    /// Result is a Hashmap Cigar::*(0) => covered nucleotides
1255    ///
1256    /// pysam: first result from get_cigar_stats
1257    fn cigar_stats_nucleotides(&self) -> HashMap<Cigar, i32>;
1258
1259    /// the number of occurrences of each each Cigar::* variant
1260    ///
1261    /// Result is a Hashmap Cigar::*(0) => number of times this Cigar::
1262    /// appeared
1263    ///
1264    /// pysam: second result from get_cigar_stats
1265    fn cigar_stats_blocks(&self) -> HashMap<Cigar, i32>;
1266
1267    /// iter over  reference positions that this read aligns to
1268    ///
1269    /// only returns positions that are aligned, excluding any soft-clipped
1270    /// or unaligned positions within the read
1271    ///
1272    /// pysam: get_reference_positions(full_length=False)
1273    fn reference_positions(&self) -> Box<dyn Iterator<Item = i64>>;
1274    /// iter over reference positions that this read aligns to
1275    ///
1276    /// only returns positions that are matched, excluding any soft-clipped
1277    /// or mismatched positions, unaligned positions within the read. Return None if cigar has no =
1278    ///
1279    /// pysam: get_reference_positions(full_length=False)
1280    fn reference_positions_match(&self) -> Option<Box<dyn Iterator<Item = i64>>>;
1281    ///
1282    /// iter over reference positions that this read aligns to
1283    ///
1284    /// include soft-clipped or skipped positions as None
1285    ///
1286    /// pysam: get_reference_positions(full_length=True)
1287    fn reference_positions_full(&self) -> Box<dyn Iterator<Item = Option<i64>>>;
1288
1289    /// left most aligned reference position of the read on the reference genome.
1290    fn reference_start(&self) -> i64;
1291
1292    /// right most aligned reference position of the read on the reference genome.
1293    fn reference_end(&self) -> i64;
1294
1295    /// infer the query length from the cigar string, optionally include hard clipped bases
1296    ///
1297    /// Contrast with record::seq_len which returns the length of the sequence stored
1298    /// in the BAM file, and as such is 0 if the BAM file omits sequences
1299    ///
1300    /// pysam: infer_query_length / infer_read_length
1301    fn seq_len_from_cigar(&self, include_hard_clip: bool) -> usize;
1302    /// Get CS tag and perfect match alignment from BAM, try to use MD if existing else None if extension does not exist
1303    #[deprecated(since = "0.3.0", note = "use getorgeneratecsblock")]
1304    fn getcsaligned(&self) -> Option<CgAlignedBlockPairs>;
1305    /// Get CS tag and perfect match alignment from BAM, try to use MD if existing else return an error. Needs also a header with contig name.
1306    /// # Errors
1307    /// No CS or MD tag.
1308    /// # Examples
1309    /// ```
1310    /// use extended_htslib::bam::{self,Read,ext::BamRecordExtensions};
1311    /// use extended_htslib::bam::record::{Aux,CsString};
1312    /// use std::str::FromStr;
1313    /// let mut t = bam::Reader::from_path("test/locusmd.bam").unwrap();
1314    /// let info = t
1315    ///     .rc_records()
1316    ///     .filter_map(Result::ok)
1317    ///     .filter(|p| p.is_primary())
1318    ///     .next()
1319    ///     .unwrap()
1320    ///     .getorgeneratecsblock(false)
1321    ///     .unwrap();
1322    /// let raw = CsString::from_str(":15+g:67+c:329-t:125+g:58-c:901+g:280-g:160-t:23-t:32-g:73+g:300-gt:16-t:401-t:5*ta:76-t:259*ta:187-a:17-a:36-a:63-t:39-g:39-g:193-c:128+c:689+c:49-t:133-g:186+g:92+g:107+g:42+c:250-g:68-c:6-c:136+g:306+c:31+c:167-g:156*ta:1319-c:308-c:67-c:208-ca:66+c:3-t:16-c:38-ac:2*ac:40-c:128-a:54+g:51-a:273-a:3-t:225-a:4-t:45-ac:53-a:227-a:37*at*ta*at:31-ac:32-ca:199*at:136-ca:41-cac:45-c:370-c:195-g:241+g:400-c:108-g:681+c:190-g:768-c:108-g:441-c:198-c:80+g:113+t:208-g:504-c:9+t:253+c:113-g:100+c:164-c:639-t:390-tc:381+c:335-t:984+c:473-c:40-c:39+c:225-g:54-g:83+c:82-c:344+c:4+g:142-t:496").unwrap();
1323    /// assert_eq!(info.cs,raw);
1324    /// ```
1325    ///
1326    /// # Panics
1327    /// ```should_panic
1328    /// use extended_htslib::bam::{self,ext::BamRecordExtensions,record::Aux};
1329    /// let mut test = bam::Record::new();
1330    /// let cigar = "20M1X3M1D2M1I30S";
1331    /// let seqread = "ctatgtcaatcaatcgcttggacaactcctgcatcacatcgagctcttgccgaaaat";
1332    /// let cigarresult = bam::record::CigarString::try_from(cigar).unwrap();
1333    /// let qual = vec![255 as u8; seqread.len()];
1334    /// test.set_tid(1);
1335    /// test.set(
1336    ///     "test".as_bytes(),
1337    ///     Some(&cigarresult),
1338    ///     seqread.as_bytes(),
1339    ///     &qual,
1340    /// );
1341    /// assert!(test.getorgeneratecsblock(false).is_err_and(|f| f.to_string().as_str() == "error parsing CS record: Absent MD tag."));
1342    /// test.update_aux(b"MD", Aux::String("20T3^C2")).unwrap();
1343    /// assert!(test.getorgeneratecsblock(false).is_ok());
1344    /// ```
1345    fn getorgeneratecsblock(&self, long_cs: bool) -> crate::bam::Result<CgAlignedBlockPairs>;
1346    /// Edit cigar to add =/X if does not contain, return None if cannot perform or =/X already present.
1347    /// Can give a CgAlignedBlockPairs or set None to extract it from the CS tag.
1348    /// # Examples
1349    /// ```
1350    /// use extended_htslib::bam::{self, Read, ext::BamRecordExtensions, record::Aux};
1351    /// let mut t = bam::Reader::from_path("test/setcigar.sam").unwrap();
1352    /// let mut info = t
1353    ///     .records()
1354    ///     .filter_map(Result::ok)
1355    ///     .filter(|p| p.is_primary())
1356    ///     .next()
1357    ///     .unwrap();
1358    /// info.setcigarfromcs(None).unwrap();
1359    /// assert_eq!(info.cigar().to_string(), "31=1X29=1I1X45=1X39=1D143=1I203=1I1404=");
1360    /// ```
1361    fn setcigarfromcs(&mut self, record: Option<&CgAlignedBlockPairs>) -> Option<()>;
1362    #[deprecated(since = "0.4.0", note = "Use setcigarfromcs")]
1363    fn setseqfromcs(&mut self, record: &CgAlignedBlockPairs) -> Option<()>;
1364    /// Edit or add cs tag to the record. Return Error is fails.
1365    /// # Examples
1366    /// ```
1367    /// use extended_htslib::bam::{self, Read, ext::BamRecordExtensions, record::Aux};
1368    /// let mut t = bam::Reader::from_path("test/locusmd.bam").unwrap();
1369    /// let mut info = t
1370    ///     .records()
1371    ///     .filter_map(Result::ok)
1372    ///     .filter(|p| p.is_primary())
1373    ///     .next()
1374    ///     .unwrap();
1375    /// assert!(info.aux(b"cs").is_err());
1376    /// if let Ok(a) = info.getorgeneratecsblock(false) {
1377    ///     info.updateorsetcstag(&a.getcs());
1378    /// }
1379    /// let string = match info.aux(b"cs").unwrap() {
1380    ///    Aux::String(a) => a,
1381    ///    _ => panic!("Invalid tag"),
1382    /// };
1383    /// assert_eq!(string, ":15+g:67+c:329-t:125+g:58-c:901+g:280-g:160-t:23-t:32-g:73+g:300-gt:16-t:401-t:5*ta:76-t:259*ta:187-a:17-a:36-a:63-t:39-g:39-g:193-c:128+c:689+c:49-t:133-g:186+g:92+g:107+g:42+c:250-g:68-c:6-c:136+g:306+c:31+c:167-g:156*ta:1319-c:308-c:67-c:208-ca:66+c:3-t:16-c:38-ac:2*ac:40-c:128-a:54+g:51-a:273-a:3-t:225-a:4-t:45-ac:53-a:227-a:37*at*ta*at:31-ac:32-ca:199*at:136-ca:41-cac:45-c:370-c:195-g:241+g:400-c:108-g:681+c:190-g:768-c:108-g:441-c:198-c:80+g:113+t:208-g:504-c:9+t:253+c:113-g:100+c:164-c:639-t:390-tc:381+c:335-t:984+c:473-c:40-c:39+c:225-g:54-g:83+c:82-c:344+c:4+g:142-t:496");
1384    /// ```
1385    fn updateorsetcstag(&mut self, string: &CsString) -> bam::Result<()>;
1386}
1387impl BamRecordExtensions for bam::Record {
1388    fn matched_sequence(&self) -> Option<MatchSequence> {
1389        let aligned = self.aligned_block_pairs_match()?;
1390        let sequence = self.seq();
1391        if sequence.is_empty() {
1392            return None;
1393        }
1394        let mut hash = BTreeMap::new();
1395        for ([rstart, rend], [gstart, gend]) in aligned {
1396            let (rstart, rend) = (rstart.try_into().unwrap(), rend.try_into().unwrap());
1397            let sequence = sequence.rangeextract(rstart..rend).unwrap();
1398            hash.insert(
1399                RangePos {
1400                    start: gstart,
1401                    end: gend,
1402                },
1403                sequence.to_string(),
1404            );
1405        }
1406        Some(MatchSequence { hash })
1407    }
1408    fn aligned_blocks(&self) -> IterAlignedBlocks {
1409        IterAlignedBlocks {
1410            pos: self.pos(),
1411            cigar: self.cigar().take().0,
1412            cigar_index: 0,
1413            r#match: false,
1414        }
1415    }
1416    fn aligned_blocks_match(&self) -> Option<IterAlignedBlocks> {
1417        if !self.cigar().containsequal() {
1418            return None;
1419        };
1420        Some(IterAlignedBlocks {
1421            pos: self.pos(),
1422            cigar: self.cigar().take().0,
1423            cigar_index: 0,
1424            r#match: true,
1425        })
1426    }
1427    fn getcsaligned(&self) -> Option<CgAlignedBlockPairs> {
1428        self.getorgeneratecsblock(true).ok()
1429    }
1430    fn setseqfromcs(&mut self, record: &CgAlignedBlockPairs) -> Option<()> {
1431        let initialcigar = self.cigar();
1432        let mycigar = initialcigar.iter();
1433        let first: Vec<&Cigar> = mycigar
1434            .take_while(|p| matches!(p, &Cigar::SoftClip(_)) || matches!(p, &Cigar::HardClip(_)))
1435            .collect();
1436        let mycigar = initialcigar.iter().skip(first.len());
1437        let mut first = first.into_iter().map(|p| p.clone()).collect();
1438        let last: Vec<&Cigar> = mycigar
1439            .skip_while(|p| !matches!(p, &Cigar::SoftClip(_)) && !matches!(p, &Cigar::HardClip(_)))
1440            .take_while(|_| true)
1441            .collect();
1442        let mut last = last.into_iter().map(|p| p.clone()).collect();
1443        let mut length: Option<usize> = None;
1444        let mut vec: Vec<Cigar> = Vec::new();
1445        vec.append(&mut first);
1446        for elem in record.csdata.iter() {
1447            if elem.state.isubstitution() {
1448                if let Some(l) = length {
1449                    length = Some(l.saturating_add(1));
1450                } else {
1451                    length = Some(1);
1452                }
1453                continue;
1454            }
1455            let lengthraw = elem.state.getlength().try_into().ok()?;
1456            if let Some(a) = length {
1457                vec.push(Cigar::Diff(a.try_into().ok()?));
1458                length = None;
1459            }
1460            let val = match elem.state {
1461                Same(_) => Cigar::Equal(lengthraw),
1462                Insertion(_) => Cigar::Ins(lengthraw),
1463                Deletion(_) => Cigar::Del(lengthraw),
1464                Intron(_) => Cigar::RefSkip(lengthraw),
1465                Substitution(_) if let Some(a) = length => Cigar::Diff(a.try_into().ok()?),
1466                Substitution(_) => unreachable!("Length must be set"),
1467            };
1468            vec.push(val);
1469        }
1470        if let Some(a) = length {
1471            vec.push(Cigar::Diff(a.try_into().ok()?));
1472        }
1473        vec.append(&mut last);
1474        self.set_cigar(Some(&CigarString::from(vec)));
1475        Some(())
1476    }
1477    fn setcigarfromcs(&mut self, record: Option<&CgAlignedBlockPairs>) -> Option<()> {
1478        if self
1479            .cigar()
1480            .iter()
1481            .any(|p| matches!(p, Cigar::Equal(_)) || matches!(p, Cigar::Diff(_)))
1482        {
1483            return None; //Already X/= in cigar
1484        }
1485        let record = match record {
1486            Some(a) => a,
1487            None => &self.getorgeneratecsblock(true).ok()?,
1488        };
1489        let initialcigar = self.cigar();
1490        let mycigar = initialcigar.iter();
1491        let first: Vec<&Cigar> = mycigar
1492            .take_while(|p| matches!(p, &Cigar::SoftClip(_)) || matches!(p, &Cigar::HardClip(_)))
1493            .collect();
1494        let mycigar = initialcigar.iter().skip(first.len());
1495        let mut first = first.into_iter().map(|p| p.clone()).collect();
1496        let last: Vec<&Cigar> = mycigar
1497            .skip_while(|p| !matches!(p, &Cigar::SoftClip(_)) && !matches!(p, &Cigar::HardClip(_)))
1498            .take_while(|_| true)
1499            .collect();
1500        let mut last = last.into_iter().map(|p| p.clone()).collect();
1501        let mut length: Option<usize> = None;
1502        let mut vec: Vec<Cigar> = Vec::new();
1503        vec.append(&mut first);
1504        for elem in record.csdata.iter() {
1505            if elem.state.isubstitution() {
1506                if let Some(l) = length {
1507                    length = Some(l.saturating_add(1));
1508                } else {
1509                    length = Some(1);
1510                }
1511                continue;
1512            }
1513            let lengthraw = elem.state.getlength().try_into().ok()?;
1514            if let Some(a) = length {
1515                vec.push(Cigar::Diff(a.try_into().ok()?));
1516                length = None;
1517            }
1518            let val = match elem.state {
1519                Same(_) => Cigar::Equal(lengthraw),
1520                Insertion(_) => Cigar::Ins(lengthraw),
1521                Deletion(_) => Cigar::Del(lengthraw),
1522                Intron(_) => Cigar::RefSkip(lengthraw),
1523                Substitution(_) if let Some(a) = length => Cigar::Diff(a.try_into().ok()?),
1524                Substitution(_) => unreachable!("Length must be set"),
1525            };
1526            vec.push(val);
1527        }
1528        if let Some(a) = length {
1529            vec.push(Cigar::Diff(a.try_into().ok()?));
1530        }
1531        vec.append(&mut last);
1532        self.set_cigar(Some(&CigarString::from(vec)));
1533        Some(())
1534    }
1535    fn updateorsetcstag(&mut self, string: &CsString) -> bam::Result<()> {
1536        self.update_aux(b"cs", Aux::String(&string.to_string()))
1537    }
1538    fn getorgeneratecsblock(&self, long_cs: bool) -> crate::bam::Result<CgAlignedBlockPairs> {
1539        let csext = self.aux(b"cs");
1540        let mdext = self.aux(b"MD");
1541        match (
1542            csext
1543                .and_then(|ext| {
1544                    if let bam::record::Aux::String(d) = ext {
1545                        Ok(d)
1546                    } else {
1547                        Err(bam::Error::BamParseCS {
1548                            rec: "Invalid CS tag found".to_string(),
1549                        })
1550                    }
1551                })
1552                .map_err(|_| bam::Error::BamParseCS {
1553                    rec: "Absent CS tag.".to_string(),
1554                }),
1555            mdext
1556                .and_then(|ext| {
1557                    if let bam::record::Aux::String(d) = ext {
1558                        Ok(d)
1559                    } else {
1560                        Err(bam::Error::BamParseMD {
1561                            rec: "Invalid MD tag found".to_string(),
1562                        })
1563                    }
1564                })
1565                .map_err(|_| bam::Error::BamParseCS {
1566                    rec: "Absent MD tag.".to_string(),
1567                }),
1568        ) {
1569            (Ok(data), _) => CgAlignedBlockPairs::createfromcs(
1570                // We have a valid CS tag
1571                CsString::from_str(data)?,
1572                String::from_utf8(self.seq().as_bytes())
1573                    .map(|a| a.to_string())
1574                    .map_err(|_| crate::bam::Error::NoSequencesInReference)
1575                    .ok(),
1576                self.contig().as_bytes().to_vec(),
1577                self.reference_start(),
1578            ),
1579            (Err(_), Ok(ext)) => {
1580                //We have a valid MD tag
1581                let line = String::from_utf8_lossy(self.qname());
1582                let cigar = &self.cigar().0;
1583                let seq = String::from_utf8(self.seq().as_bytes())
1584                    .map_err(|_| crate::bam::Error::NoSequencesInReference)?;
1585                let a = CgAlignedBlockPairs::createfrommdtag(
1586                    ext,
1587                    &seq,
1588                    cigar,
1589                    &line,
1590                    long_cs,
1591                    self.contig().as_bytes().to_vec(),
1592                    self.reference_start(),
1593                );
1594                a
1595            }
1596            (_, Err(b)) => return Err(b),
1597        }
1598    }
1599    fn introns(&self) -> IterIntrons {
1600        IterIntrons {
1601            pos: self.pos(),
1602            cigar: self.cigar().take().0,
1603            cigar_index: 0,
1604        }
1605    }
1606
1607    fn aligned_block_pairs(&self) -> IterAlignedBlockPairs {
1608        IterAlignedBlockPairs {
1609            genome_pos: self.pos(),
1610            read_pos: 0,
1611            cigar: self.cigar().take().0,
1612            cigar_index: 0,
1613            r#match: false,
1614        }
1615    }
1616    fn aligned_block_pairs_cigar_match(&self) -> Option<IterAlignedBlockCigarMatchPairs> {
1617        let cigar = self.cigar().take().0;
1618        if cigar.iter().any(|f| matches!(f, Cigar::Match(_))) {
1619            return None;
1620        }
1621        Some(IterAlignedBlockCigarMatchPairs {
1622            genome_pos: self.pos(),
1623            read_pos: 0,
1624            cigar: cigar,
1625            cigar_index: 0,
1626        })
1627    }
1628    fn aligned_block_pairs_cigar(&self) -> IterAlignedBlockCigarPairs {
1629        IterAlignedBlockCigarPairs {
1630            genome_pos: self.pos(),
1631            read_pos: 0,
1632            cigar: self.cigar().take().0,
1633            cigar_index: 0,
1634        }
1635    }
1636    fn aligned_block_pairs_match(&self) -> Option<IterAlignedBlockPairs> {
1637        if !self.cigar().containsequal() {
1638            return None;
1639        };
1640        Some(IterAlignedBlockPairs {
1641            genome_pos: self.pos(),
1642            read_pos: 0,
1643            cigar: self.cigar().take().0,
1644            cigar_index: 0,
1645            r#match: true,
1646        })
1647    }
1648    fn aligned_pairs_match(&self) -> Option<IterAlignedPairs> {
1649        if !self.cigar().containsequal() {
1650            return None;
1651        };
1652        Some(IterAlignedPairs {
1653            genome_pos: self.pos(),
1654            read_pos: 0,
1655            cigar: self.cigar().take().0,
1656            remaining_match_bp: 0,
1657            cigar_index: 0,
1658            r#match: true,
1659        })
1660    }
1661    fn aligned_pairs(&self) -> IterAlignedPairs {
1662        IterAlignedPairs {
1663            genome_pos: self.pos(),
1664            read_pos: 0,
1665            cigar: self.cigar().take().0,
1666            remaining_match_bp: 0,
1667            cigar_index: 0,
1668            r#match: false,
1669        }
1670    }
1671
1672    fn aligned_pairs_full(&self) -> IterAlignedPairsFull {
1673        IterAlignedPairsFull {
1674            genome_pos: self.pos(),
1675            read_pos: 0,
1676            cigar: self.cigar().take().0,
1677            remaining_match_bp: 0,
1678            remaining_ins_bp: 0,
1679            remaining_del_bp: 0,
1680            cigar_index: 0,
1681        }
1682    }
1683
1684    fn cigar_stats_nucleotides(&self) -> HashMap<Cigar, i32> {
1685        let mut result = HashMap::new();
1686        result.insert(Cigar::Match(0), 0); // M
1687        result.insert(Cigar::Ins(0), 0); // I
1688        result.insert(Cigar::Del(0), 0); // D
1689        result.insert(Cigar::RefSkip(0), 0); // N
1690        result.insert(Cigar::SoftClip(0), 0); // S
1691        result.insert(Cigar::HardClip(0), 0); // H
1692        result.insert(Cigar::Pad(0), 0); // P
1693        result.insert(Cigar::Equal(0), 0); // =
1694        result.insert(Cigar::Diff(0), 0); // X
1695        for entry in self.cigar().iter() {
1696            match entry {
1697                Cigar::Match(len) => *result.get_mut(&Cigar::Match(0)).unwrap() += *len as i32, // M
1698                Cigar::Ins(len) => *result.get_mut(&Cigar::Ins(0)).unwrap() += *len as i32,     // I
1699                Cigar::Del(len) => *result.get_mut(&Cigar::Del(0)).unwrap() += *len as i32,     // D
1700                Cigar::RefSkip(len) => *result.get_mut(&Cigar::RefSkip(0)).unwrap() += *len as i32, // N
1701                Cigar::SoftClip(len) => {
1702                    *result.get_mut(&Cigar::SoftClip(0)).unwrap() += *len as i32
1703                } // S
1704                Cigar::HardClip(len) => {
1705                    *result.get_mut(&Cigar::HardClip(0)).unwrap() += *len as i32
1706                } // H
1707                Cigar::Pad(len) => *result.get_mut(&Cigar::Pad(0)).unwrap() += *len as i32, // P
1708                Cigar::Equal(len) => *result.get_mut(&Cigar::Equal(0)).unwrap() += *len as i32, // =
1709                Cigar::Diff(len) => *result.get_mut(&Cigar::Diff(0)).unwrap() += *len as i32, // X
1710            }
1711        }
1712        result
1713    }
1714
1715    fn cigar_stats_blocks(&self) -> HashMap<Cigar, i32> {
1716        let mut result = HashMap::new();
1717        result.insert(Cigar::Match(0), 0); // M
1718        result.insert(Cigar::Ins(0), 0); // I
1719        result.insert(Cigar::Del(0), 0); // D
1720        result.insert(Cigar::RefSkip(0), 0); // N
1721        result.insert(Cigar::SoftClip(0), 0); // S
1722        result.insert(Cigar::HardClip(0), 0); // H
1723        result.insert(Cigar::Pad(0), 0); // P
1724        result.insert(Cigar::Equal(0), 0); // =
1725        result.insert(Cigar::Diff(0), 0); // X
1726        for entry in self.cigar().iter() {
1727            match entry {
1728                Cigar::Match(_) => *result.get_mut(&Cigar::Match(0)).unwrap() += 1, // M
1729                Cigar::Ins(_) => *result.get_mut(&Cigar::Ins(0)).unwrap() += 1,     // I
1730                Cigar::Del(_) => *result.get_mut(&Cigar::Del(0)).unwrap() += 1,     // D
1731                Cigar::RefSkip(_) => *result.get_mut(&Cigar::RefSkip(0)).unwrap() += 1, // N
1732                Cigar::SoftClip(_) => *result.get_mut(&Cigar::SoftClip(0)).unwrap() += 1, // S
1733                Cigar::HardClip(_) => *result.get_mut(&Cigar::HardClip(0)).unwrap() += 1, // H
1734                Cigar::Pad(_) => *result.get_mut(&Cigar::Pad(0)).unwrap() += 1,     // P
1735                Cigar::Equal(_) => *result.get_mut(&Cigar::Equal(0)).unwrap() += 1, // =
1736                Cigar::Diff(_) => *result.get_mut(&Cigar::Diff(0)).unwrap() += 1,   // X
1737            }
1738        }
1739        result
1740    }
1741
1742    fn reference_positions(&self) -> Box<dyn Iterator<Item = i64>> {
1743        Box::new(self.aligned_pairs().map(|x| x[1]))
1744    }
1745    fn reference_positions_match(&self) -> Option<Box<dyn Iterator<Item = i64>>> {
1746        match self.aligned_pairs_match() {
1747            Some(b) => Some(Box::new(b.map(|x| x[1]))),
1748            None => None,
1749        }
1750    }
1751    fn reference_positions_full(&self) -> Box<dyn Iterator<Item = Option<i64>>> {
1752        Box::new(
1753            self.aligned_pairs_full()
1754                .filter(|x| x.get(0).copied().flatten().is_some())
1755                .map(|x| x.get(1).copied().flatten()),
1756        )
1757    }
1758
1759    fn reference_start(&self) -> i64 {
1760        self.pos()
1761    }
1762
1763    /// Calculate the rightmost base position of an alignment on the reference genome.
1764    /// Returns the coordinate of the first base after the alignment (0-based).
1765    fn reference_end(&self) -> i64 {
1766        unsafe { htslib::bam_endpos(self.inner_ptr()) }
1767    }
1768
1769    fn seq_len_from_cigar(&self, include_hard_clip: bool) -> usize {
1770        let mut result = 0;
1771        for entry in self.cigar().iter() {
1772            match entry {
1773                Cigar::Match(len)
1774                | Cigar::Ins(len)
1775                | Cigar::SoftClip(len)
1776                | Cigar::Equal(len)
1777                | Cigar::Diff(len) => {
1778                    result += len;
1779                }
1780                Cigar::HardClip(len) if include_hard_clip => {
1781                    result += len;
1782                }
1783                _ => {}
1784            }
1785        }
1786        result as usize
1787    }
1788}
1789
1790#[cfg(test)]
1791mod tests {
1792    use crate::bam;
1793    use crate::bam::Read;
1794    use crate::bam::Record;
1795    use crate::bam::ext::BamRecordExtensions;
1796    use crate::bam::ext::CsValue;
1797    use crate::bam::ext::RangePos;
1798    use crate::bam::record::{Cigar, CigarString};
1799    use bio_types::genome::AbstractInterval;
1800    use std::collections::HashMap;
1801    fn mergemdandcstest(element: &Record) {
1802        assert_eq!(element.qname(), b"SRR11292120.509914");
1803        assert_eq!(element.contig(), "chr14");
1804        let mut cs = element.getorgeneratecsblock(true).unwrap();
1805        let val = cs.next().unwrap();
1806        assert_eq!(val.getreadpos(), Some(0));
1807        assert_eq!(val.getgenomepos(), Some(99813318));
1808        let val = cs.nth(2).unwrap();
1809        assert_eq!(val.getreadpos(), None);
1810        assert_eq!(val.getgenomepos(), Some(99813465));
1811        assert_eq!(val.state, CsValue::Deletion("c".to_string()));
1812        assert!(val.sequence.genomematch(None::<&str>));
1813        assert!(val.sequence.readmatch(Some("c")));
1814        let val = cs.nth(2).unwrap();
1815        assert_eq!(val.getreadpos(), Some(292));
1816        assert_eq!(val.getgenomepos(), Some(99813609));
1817        if let CsValue::Same(a) = val.state {
1818            assert_eq!(a.getsize(), 203)
1819        } else {
1820            assert!(false)
1821        };
1822    }
1823    /*
1824    #[test]
1825    fn changecigar() {
1826        let mut d = crate::bam::Reader::from_path("test/locusmd.bam").unwrap();
1827        let mut output = crate::bam::Writer::from_path(
1828            "test/locusmdcigar.bam",
1829            &bam::Header::from_template(d.header()),
1830            bam::Format::Bam,
1831        )
1832        .unwrap();
1833        let mut record = Record::new();
1834        let mut matches = 0;
1835        while let Some(_) = d.read(&mut record) {
1836            let cigar = record.cigar();
1837            let mut cigarvec = Vec::new();
1838            if !record.cigarhasequal() {
1839                continue;
1840            }
1841            for ci in cigar.into_iter() {
1842                match ci {
1843                    Cigar::Match(e) | Cigar::Equal(e) | Cigar::Diff(e) => matches += e,
1844                    e => {
1845                        if matches > 0 {
1846                            cigarvec.push(Cigar::Match(matches));
1847                            matches = 0;
1848                        }
1849                        cigarvec.push(e.clone())
1850                    }
1851                }
1852            }
1853            if matches > 0 {
1854                cigarvec.push(Cigar::Match(matches));
1855                matches = 0;
1856            }
1857            let cigarnew = CigarString(cigarvec);
1858            record.set_cigar(Some(&cigarnew));
1859            output.write(&record).unwrap();
1860        }
1861    }
1862    */
1863    #[test]
1864    fn testcs() {
1865        let mut read = crate::bam::Reader::from_path("test/locus.bam").unwrap();
1866        let mut element = read.records().filter_map(Result::ok).skip(1).take(1);
1867        let element = element.next().unwrap();
1868        mergemdandcstest(&element);
1869    }
1870    #[test]
1871    //#[ignore]
1872    fn testgeneratedcssame() {
1873        let mut csread = crate::bam::Reader::from_path("test/locus.bam").unwrap();
1874        let mut mdread = crate::bam::Reader::from_path("test/locusmd.bam").unwrap();
1875        let mdread = mdread
1876            .rc_records()
1877            .filter_map(Result::ok)
1878            .filter(|a| a.is_primary())
1879            .map(|a| a.getorgeneratecsblock(false).unwrap());
1880        let csread = csread
1881            .rc_records()
1882            .filter_map(Result::ok)
1883            .filter(|a| a.is_primary())
1884            .map(|a| a.getorgeneratecsblock(false).unwrap());
1885        for (mdread, csread) in mdread.zip(csread) {
1886            if mdread.islongcs() == csread.islongcs() {
1887                //Same form
1888                assert_eq!(mdread.cs, csread.cs)
1889            } else {
1890                panic!("Different format");
1891            }
1892        }
1893    }
1894    #[test]
1895    fn testgeneratedmdsame() {
1896        let mut csread = crate::bam::Reader::from_path("test/locus.bam").unwrap();
1897        let mut mdread = crate::bam::Reader::from_path("test/locusmdcigar.bam").unwrap();
1898        let mdread = mdread
1899            .rc_records()
1900            .filter_map(Result::ok)
1901            .filter(|a| a.is_primary())
1902            .map(|a| a.getorgeneratecsblock(false).unwrap());
1903        let csread = csread
1904            .rc_records()
1905            .filter_map(Result::ok)
1906            .filter(|a| a.is_primary())
1907            .map(|a| a.getorgeneratecsblock(false).unwrap());
1908        for (mdread, csread) in mdread.zip(csread) {
1909            if mdread.islongcs() == csread.islongcs() {
1910                //Same form
1911                assert_eq!(mdread.cs, csread.cs)
1912            } else {
1913                panic!("Different format");
1914            }
1915        }
1916    }
1917    #[test]
1918    fn testmd() {
1919        let mut read = crate::bam::Reader::from_path("test/locusmd.bam").unwrap();
1920        let mut element = read.rc_records().filter_map(Result::ok).skip(1).take(1);
1921        let element = element.next().unwrap();
1922        mergemdandcstest(&element);
1923    }
1924    /*
1925    #[test]
1926    fn testmd2() {
1927        let mut read = crate::bam::Reader::from_path("test/outlight.bam").unwrap();
1928        let mut rawelem = read.rc_records().filter_map(Result::ok).into_iter();
1929        let element = rawelem
1930            .find(|p| p.qname() == "m84072_250402_125013_s1/241502339/ccs".as_bytes())
1931            .unwrap();
1932        let v = element.getorgeneratecsblock(false).unwrap();
1933        assert_eq!(
1934            v.cs.to_string(),
1935            ":113+t:43+t:16-a:92-g:103-g:81-g:66+a:91+t:47+g:396+a:312-a:21+t:49-tc:157-t:3-c:832*ca:103-c:294*tg:17-c:17-t:334+g:51-c:10-t:47-t:16+g:44-c:61-c:31+c:289+g:47-c:204-c:56+g:94+t:74-t:29-g:129-c:397-a:105-t:161+a:24+a:662-t:104-t:83-a:82-a:52-at:129*gt:5*at:71-c:38-g:217-t:26-g:65-a:245-t:42+c:151-t:49-ga:46-c:161*tc:19-a:27-a:12+g:378-g:518-c:547+g:170-t:160-g:669-t:351-g:147+t:74*ta:497-g:106+a:110-t:419-g:207-at:151-g:1224+a:110-a:153-a:490-t:314-g:356-t:2*ta:940-t:447-t:329-a:663*at:150+g:219-a:11-a:22-t:21-t:144+a:54+c:212-c:226*ct*tc:782-t:4+t:8-c:604+t:30-t:183-g:178-c:29+t:134+c:251+t:396-t:40-g:276-a:73-t:616-a:144-g:436+t:1014-t:446",
1936            "Cigar is invalid"
1937        );
1938        let element = rawelem
1939            .find(|p| p.qname() == "m84070_250402_111906_s3/138216250/ccs".as_bytes())
1940            .unwrap();
1941        let v = element.getorgeneratecsblock(false).unwrap();
1942        assert_eq!(v.cs,CsString::from_str(":394+C:25+A:1238+T:180-T:119+T:140+A:387+A:685-T:137+G:73+C:753+T:1625+A:736+G:223-T:363-T:3047-T:778+G:408-A:21-T:860+T:165-AT:1478-T:821-A:3*TA:5-A:309-T:1198+A:177-T:110-G:1023-A:1492+T:220+A:107+T:589+T:162-T:168+T:629+A:55-A:552-T:165+A:85-T:26-T:483+T:295+A:77-C:215+T:142-G:93-T:189-T:431+T:1031-A:415").unwrap(),"Not valid CS");
1943        for left in rawelem.take(1000) {
1944            let _ = left.getorgeneratecsblock(false).unwrap();
1945        }
1946    }  */
1947    #[test]
1948    fn testcigar() {
1949        let mut read = crate::bam::Reader::from_path("test/locus.bam").unwrap();
1950        let elem = read
1951            .rc_records()
1952            .filter_map(Result::ok)
1953            .take(1)
1954            .next()
1955            .unwrap();
1956        let mut cigar = elem.aligned_pairs_match().unwrap();
1957        let _ = cigar.next();
1958        let align = cigar.next();
1959        assert_eq!(align, Some([1, 99812480]));
1960        let align = cigar.nth(40);
1961        assert_eq!(align, Some([43, 99812521]));
1962    }
1963    #[test]
1964    fn testblock() {
1965        let mut read = crate::bam::Reader::from_path("test/locus.bam").unwrap();
1966        let elem = read.rc_records().filter_map(Result::ok).nth(3).unwrap();
1967        assert_eq!(elem.qname(), b"SRR11292123.1482913");
1968        assert_eq!(elem.contig(), "chr14");
1969        let mut element = elem.aligned_blocks_match().unwrap();
1970        assert_eq!(element.next(), Some([99814926, 99816399]));
1971        assert_eq!(element.next(), Some([99816400, 99817131]));
1972        assert_eq!(element.next(), Some([99817132, 99830222]));
1973        assert!(element.next().is_none());
1974    }
1975    #[test]
1976    fn testseq() {
1977        let mut read = crate::bam::Reader::from_path("test/locus.bam").unwrap();
1978        let elem = read.records().filter_map(Result::ok).nth(7).unwrap();
1979        let val = elem.matched_sequence().unwrap();
1980        assert!(val.isfullymatched(99820271..=99826916).is_some());
1981        assert!(val.isfullymatched(99820271..=99826917).is_none());
1982        let mut elem = val.gethash().iter();
1983        let test = elem.next();
1984        let rangepos = RangePos::new(99820271, 99826917);
1985        assert_eq!(
1986            test,
1987            Some((
1988                &rangepos,
1989                &String::from(
1990                    "AGAGGCAGGGATGACAGAGACAGACACAAAGCAGAGAGACGGAGGCAGAGGGAGACATGCAGAGTCGCGGAGACATCCGGGCTCAGGCCCCGACTCTCAGGGGCCACCCCCAGGGAGGACACGCAGTGCACCCCCACACCCACACCTCACACACACACTCACACCCACATACCCCCATCCACACACACCCAGAGACACACAGACACCCACAGCCACACACTCACACTCACGAACTTATCCAGTCACGTCCCACACACTCCCACCCAACCCATACACCACACACCTACACAACCCATACACCACACACACTCACAAACTATATACCACACACACACCAACCATACACCTATATACACTCACACACCCATATACCACACACTCACACACAACCCATACACCACACGCACACAACCCATACACCTATACACACTCACACCTACAAACTATATACTACACACTCACACACAACCCATACACCTATACACACACACCCATATACCACACACAACCCATACACCACACACACAAACCATATACCACACACTCACACAACCCATACACCTATACACACTCATACCCATATACCACATACAACCAATATACCACACACACACAACCCATACACCTATACACACACACCTATACACCACACACAGCCCATACACTACACAATCACACCACAAACTGTATACCACACACTCACACATAACCCATACACCTATACACACACACCCATATACCACACACACAACCTGTGCACCTACACACACACATACACCACACACACACAACTCCTACACCTACACACACCCACCACCCATACACACACAGCCTATACACCTACACACACTCATACACTCATATAGCACACACACAACCCATATACCACACACACAACCCACATACCTATACACACACGCCCATACACCACACACTCACACAACCCATGCACCACATACACCCACAAACTATATGCTACACGCTCACACACAACCCATACACCTATACACAATCCCACAACCCATACACACTTACACAACCTATACACCACACACACTCACAATCTGTATACCACACACACAACCCATACAGTTATACACACACACCCATATACCACACACACACAACCCATATACCACACACTCACACACAAACCATACATCTATACACATACCCATATGCCACACATACAACCCATACACCACACACTCACACACAACACATACACCACACACACAACCCATAGAACACAAACACAAGTCATAACCACACACACAGCCCATATACCTATACACATTCACACACACAACCCATACACTACACACACAACACATACACCTATACACACTCACACTCAATTCATACACCACACACACACAGCCCATACATCTATACACAAACTCACACACAATCCATATACCACAAACTCACACACAACGCATACACCTATACACACACACGCAACTCATACAGCACACACTCACACAACCCACAGACCATAAACACACACAAGCCATAACCACACACAAACCCATACACCTATACACACACTCATAAACAAGCCATACACCCCTACACAACCCATACACCACACACTCACAACCCATACACCTATATACACACACAACCATATACCACAAACTCACGCTCAACACATACACCTATACACACACACAACTCATACACCACACACTCATACACAACGCACAGACCACATACACAAGCCATAACCACACACACACAACCCGTACACATATATACACACTAATAAACAAGCCATACACCTACACATACAACCCATACACCACACATTCACACATAACCCATACACCTATACACACACACACACAACCCATATACCACAAACACACACAACCTATACACACATACAACCCATACACCACACACACAACACATACACACCACACACACACAGAATACTCATACACACACCCATACACCACCCCCACACAGAACCCATACACCACACACACACAACCTATACACCTATACACACACTCACACACACAACTCATATACCACAAACACACACAACACATACACCTATGCACACACACAACCCATACACCACACATTCACATACAACCCATACACCACACACACACAACACATACATGAAACATACATACAACCCACACACCACCCACTCATACACAACCTATACACCACACACACAACTCATACACCTATACACACACAACACATACACCTATCATACACTCACAACACATACACCTCCTATACACACACAACACACACACTTCCTATACACACAACCCACACGCCTATACACACATCCTCACTCACACTCACCCTCACATTCATATACTCACTAACACACTTCCACACTCACACCCTCACCCACACTTACACCCCCACCCACACTCAAACCCCGACGCTAAGTCACTGTCACATTTGTACCCATGCTCACACGCTCACACGCTCACACACTCACCCCCCACCAGCTCCAGGGCTCACTGGTGTGTGCCCACCAAACCCCCCTCGGGGGTCCCCTCGGTAAGCCGACAGTGCTCTGCTCATCGGTGGCCTGGGGAAACAGGGCCCACCCAAGGCCTGGCTCAGGAAAGGCTCCAAACACACATGGCCCAGGAGCAAATGGGCAGAGCTCAGCCTGCAGCTGGGAGCGGCCGAGCGGGTGCTGGGCCAGAGTCGGGGCCTGTCTGTGGGTGAGGGGCACGGCAGCACGGGCCCACCTGCACCTACAAGGCCTGGCCCCCGAGGTCACTGGGCCACCACCCAGCCCTCGCCCTGTTCCCCGTCTGTGCTGGCCGGGGCAGGACTCTGAGCCTCGGGGAAACCCACAGATACACACGGGACCCCGAACATCGGGCTGGGGAGGCTGGGGTGGGTAACAACATCCCAGAGGCAGGAGCAGGAGGTCCTGGGACCCTGCACACTGCGACCCCAGCCCTGGGGGCTGAAGCCCAGGACAGCCTCAGGTCTCCCAGGAGGGACTGGATAGTGGGGGATGGTCAGAGAACAGGACAGCCAGCAGGGTGCAGCCCGAGGACAGGGATGGATGCTGGGAGGTCAACAGGACAGGGGCAGGGGCAGGGGCTGTGGAGTGTGAGAAGGTCCTGGAGGGCCTGGAGAACCTGTGGGTCAGTGTCTGTGGGAAGGAGGCCAGGAGCAGCCCTGAGTGGCCAGGCTGGCAGGGGTGAGGAGGTGGGGGCAGTGAGGTGAGGGTGACCGAGACAGGCCTCTGGCCAGGGAGGGGACCTTGGCTGGGCTCTGACTGAACCCAGGGCTCCTGGAGAAGGGGCCCCAGGCGGGGATGAGGATGTGGGCATCTGACTCCATCAACAATGGGGCTTCCAACACGCACAGCCTGGGCCTCGGAGACCTGGGCCCTGACCCGCCTCCCCCTGGCACTGGGCCGGGTGCCGTGTGTGGTCCCCAGTCCCCGCAGCACCTCCCCCACACTGGTCACGTTCCAGGGCCCCTCTGAAGCACCTGCTGTGAGGGGATGTGAGGAGGGGACAGGGACTTGGGCCTGAGCTGCCGGGTCGGGGGGGAGTCGGGGACCCAGGCTCAGCGTGTGGCTGGGGACCAGACAGATGGGGATGGAGGAGGACACGCCCTGTACCCACTGCCTGCCAAGGGGCTGGACCCACGCCCAGTCTAGGCCATGTCCCCCGAGGCCTGTGAACCTTCACTCTGAGCCACTAAAACATTCAGGAGCTTTGAAAGCAGCCCCCGTCCTTGTCACTATGCGATGACTCTGAGCATCACGCTGTCCCTGCTGGATCCACCCTCCAGCCCCAGCGAGGGAGGCTGGGCCCCGGGCAGCAGGTGGTGAGGGCAGCGGGCACAGCCACCCTACAGCACACACAGGGTCTCAGGGACGCGTCCACCACAGCCCGTGCACAGGCTCCTCACGGCACTGAGTTCACCCGGGGCGCGGGCCGTTTGTCCTCAGGAGTCCCACTGTGCCCTCCGCCCCCAGCCCTGTCCTGCTGAGGCTGCAGCTGGGTCCCGGGGCACAGGGCGGCCCTGAGCACCTTGTCATGTTGGTCCCTGTCGGGTGGGCTGCTGGCTGTCTGTGGAGCTGGCAGAGCCGCGGTTCAGCCTTGGAGGCCGGTCCTGGGGCCCAGCAGCCGTGGGGAGCACTGCCCAGTCCCGTGCCCACAGGGAATCACCTGGGCTGAGGAAGGGCCCACACGCCGACGGGATCGGGGTCAGGCAGCGCACGCCTGGCACCGAGATCCCACGTCCCGAAGTGGGGACACGGCCCAGGGGCACTGTTCCGGGAGGGTCTCAAGATGGGGTCTCCTATTTCAATCTTCACTCCTTCTGCACCTGTTAGCTGGGAACCTTCTAGAAGGAGGGGTGTCCTCAATCATGGGGTGGTTGTGAGCTGAGCACAGATCATGCAGGAAGGTACATGGCTTCTCCTTCACCAGGAAAACAGTGCAGAGAGACAGAGACACAGAGACAGAGTAACAGAGAAAGACAGAGAGACAGAGACACAGAGACAGAGACAGAGTAACAGAGAAAGACAGAGAGACAGAGAGACACAGACAGAGACAGAGTAACAGAGAAAGGCAGAGAGACAGAGAGAGACAGAGACAGAGTAACAGAGAAAGACAGAGAGGCAGAGAGAGAGAGACAGAGACAGAGACAGAGTAACAGAGATAGACAGAGAGACACAGAGACAGAGACAGAGTAACAGAGATAGAGAGACAGAGAGAGACACAGAGACAGAGTAACAGACAGAGACAGAGACAGGCACAGAGATAAGAAAGATACACAGAAACAGAGAGAGACAGAGACAGAGATAGTCACTGTCACATTCATACCCACGCTCACCTGCTCACACACACACACCTCACACACACTCACACTCACACTCACCTCACACACACAGTCACACACACACTCACACACACTCACACACACACACTGAGCTTCCCTCAGGCCCTGTCACTTCCGATGGGGCCTACGGCCTGTCTAAGCCTCTGGGCCACCAGCCCCTGGCTCACCGGTGTGTGCCCACCACACCCCGCCTTGGGGGTCTCCTCTATGAGCTGGGCACATGCCCTCCGCTCTGTTCATGGCTGGCCTGGGGGAAACAGGGCCCACCCAAGGCCTGGCTCAGGGAAGGCCTCAAACACACATGGCCCAGGAGCAAAGGGGCAGAGCTCAGCCTGCAGCTGGGAGCGGGCAGGGGTAGTGGAGTGGGCGGAGGGCCTGGAGAACCTGCAGGGCTACGATGTCTCTGGGAAGGGGGCCCAGGAGCAGCTCAGCGTGGCTGGGCCGGCAGGGCCGAGGAGGTGGGGGCCGTGAGGGAGGGGTGACTCGGCTGTGTGGGGTGCCGGGGGACACGGGCTTTGCTCCGGCTGAGCCCAGGCAGTGGCGAATCCCTGAGCTGCCAGGAGGAGAGCAGGGCCGGGGTCAGGCAGAGGTGGGCCGCGGGGCCGAGGGCTGCGGCCGGTCGGGAGCAGTCGGTCGGTTGAGGGCACCATTACATGGAGGGCTGTGAGACGGGAGACCCCATTCCCTTCATTCCTTGTGCACGTGTTAGTGAGGAAGCTTCTAGAAGGAGGGCATTGCTCGTAGTGGGTGAGTGTGAGCACAGATCATGCAGGCTGGCGTGCTGCCGTGAAGTGCCTCTCTTTACTTTCCAGACCTCAGCATGGCAAGCCCGTCCTGCGCCCCAGGGTCTTTCTGGAGTACACGCCGCGCGGTCCTGGTGGGCACCATACCTGGCACCCACGCTTTGGCCGGGCCCGAACCTTGCGCCCTCCCAGCCCCCATGTGGCTCTCCCTTGGCCATACTGGCCTTTTGCCAGTCCTCCTACCTCACCCTAGGGTCTGCCTGGCCCTGCCCTCCCTTCCTAGCCCCCCAAGGAGGCTGGAGGGCACCCCTGCGTCCACCAGCAGCAGCTCCTCATGGGCGAGTCTCCTTGGGCCAGTGACACATAGTGTGCCCCGATGGTGCCACGGCAGCCTGGGCCCTCCGCCTTCCTGCTTGGCAGGCACCCCCGCTCCCTGCACCCTCACCGGGGCACCTGTGAGCCCTGAGGGCCAGTGGGGGTCTCACTGCTGCTCCCTCCCACAGCCTAGCCTCGGGCCTCAGGGCTCTGCATCCAAGCGGCCCAGGGCTCCCTGAGGTCTCAGCCCGAGTGGGCCTTTGAGCCTTCGCGTTCTCTGCAGGGTGGGACCTGCCCAAGGGCTGCTGAGGGCTTCCCAGGGGTCCTGTGGGTCCCACCTAGGGGCAAGCTGGTGAGGAAAGTGGGTCCTGCCATGGCGGCCGGGTGGGCTGAGTTTTCGGCATCTCTGGGCCCAACAGCAGGTCCCTGGAGCGGCGCCCACCCCTCCCCCAGGCAGGTGTGAGGGCTCTGATCTGTTTCTCCTTGAGTGACTCATTCTGGGCAGACTTGGCCCTCAGGGCACATGCAAATGGTTGTTTGTTCCACACCGAAAACATGTTTCTTGCCCTCTGAGGCTGTTTCCAGAAATAGCTTGCACGATTCTCCACCTGCAGCTGCAGCCGCCACCCACCCAGTGTGGCCAGGCTGGCCCAGGCCTCCAGATTCGGGGACACCCCCCGCCCCCTCCCCCAGCGTGGCCAGGCTGGCTCAGGCCTCCAGATTCGGGGACA"
1991                )
1992            ))
1993        );
1994        let test = elem.next();
1995        let rangepos = RangePos::new(99826917, 99827017);
1996        assert_eq!(
1997            test,
1998            Some((
1999                &rangepos,
2000                &String::from(
2001                    "CCCCCCCCCCCCAACAGCGTGGCCAGGCTGGCTCAGGCCTCCAGATTCGGGGACACCCCCCCACCACAGCGTGGCCAGGCTGGCTCAGGCCTCCAGATTC"
2002                )
2003            ))
2004        );
2005        let test = elem.next();
2006        let rangepos = RangePos::new(99827017, 99829102);
2007        assert_eq!(
2008            test,
2009            Some((
2010                &rangepos,
2011                &String::from(
2012                    "GGGGACACCCGCCCCCTCCCCCAGGACAGGCCCACTTGGGTTACTGACACTGGGACCACCCTGCAAACGTCAACTTTATTGAATTCAGTGGTTCTGAACTTGTTGCCATCTTTGGGACCAGGACCCAGGGGCAGCCCCCAGGTTGGCAGGAAGGGCAGGGGAGCCAACGCTGGCAGGGCCCCCAGCCAACCCCCACCCCAGAAGCCCCAAGGAGGCTGAGCGGAGGTGGCCCTGGTGGCCTGGGCACAGGCAGCCCGATTGGTACAGGGCCTGTCTGGTGCAGGCCCGCACCTCCCCCACCCTCATGGCCTGGTGGTCCCCACTGTACAGAGAGAACACTGAGGCTCAGCAGGGCCAGGGACATGGCCTGAGGTTACATGGTGATGGGGGCTGGGTCTCCGGGCCTGGGGGCCGTGGTGGGTGCAGCACCCGGACTGCGTGGGCTGTGGCCTCCCTGCTCCCAGCTCTGTCACACCCGTCTCCATCTGAGCCTCCAGCTCCATCTTTCCCGCTGTCCCTGTCTCTGGCCACCCTTCTGTCTCCCTGTCTCTCTGCCTCTCTGAAGGTATCTCCCTGCCCGAATCTCTGTCTCTGTCCCATTGTCGGTGTCTCTGACTCATCTCTGTCAAGCCCGTCTGCTGGGCTTTGTCCCGCCATCTTGCCTGTCTTGGCCTCTCTCTCTTTCTGTGTGTCTCCGTCGGTGCCTCCTTTCTCCATCCATCTCTCCCCCGTGTCTGTCTCTATCCCTCCGTCTCTCTTCCCGTCTATCCCTCCCTCTGTGCCTGTCCCTTTGCTGTGTCCCTTTCTTTGCCTCTGTCTCTCTGTCTGTCTCTTCGTGTCCCTGTGTGTGTCTCTCTCTTCTCTCTGCTTCTCTTTCTGTATCTCTGTCTATATCTCAGCCTCTTTGTGTCCCTGTGTGTGTGTCTCTCTCTTCTCTGTCTTTCCATGTCTCTGTCTATATCTCTGTCTCTCTGCCTCTGTATCTCTGTCTGTCTGTTCGTGTCCCTGTGTATGTCTCTCTCTGTCTCTTTCTGTATCTCTGTCTATATCTGTCTCTCTCATCTGTCTCTTCCTGTGTGTGTCTCTCTGTCTCTCTGCCTCTGTCTCTGTCTCTCTGTCTCTTCATCTCTGTCTGTCTCTGCCTGTCTGTGTCATTTGGTGTCTCTGTTTTTGTATGTCTCTCTGTTTGTCTGTGTCTCTTCCTCTCTGTAGCTCTGCCTCTCTCTATCTCTCCTTATATCTGTCTTTCTCTCTCCCTGTTTCTTTCTCTGTCTCTTTTTGTCTTTCTGAGTCTGTCTCTGTCTCTGTCTCTTCCTCTCTGTATATACCTCTCTGTCTTTCTGTTGCTGTCTGTCTCTGTTTCTCTTCTCCTCTCTCTATCTCTCTTTGTCTGTCTTTCTCTGCCTTTCTAACTCTGTCTTTCTCTGTCTCTCTGTCTCTATCTCAGTCTCTCTTCTTATCTCTCTCTCTGTCTCTCTCACTCTCTGTATCTCTTTGTCTCTGTCTTTCTCTTATCTCTATCGCTCTGTCTCTATCTCTCTTTCTGTCTCTCTGTATCTCTATCTCTGTCTCTCTCATGTCTATCTCTCTGTCTTTCTCTGTCTCTCTGTATCTCTGTCTTTCATCTCTATCTCTATCTCTGTCTTTCTGTCTCTATCTCTGTCTCTCTATCTCTTTCTCTGTCTGTATCTCTCTGTCTCTATCTCTCTCTGTCTTTCTCTGTGTCTCTGTATCTCTGTCTCTATCTCTGTCTCTCTATCTCTCTCTGTCTCTCCCTGTCTCTCTCTATCTCTGTCTCTCCATCCCATGTGGGTCTGTGGGTTTCCCCGAGGCTCAGAGCCCTGCCCCGGTCAGCACAGACAGGGAACAGGGCGAGGGCTGGGTGGTGGCCCAGTGACCTTGGGGGCCAGGCCTTGGGGGTGCAGGTGGGCCCGTGCTGCCGTGCCCCCCACCCACAGACAGGCCCCGGCTCTGGCCCAGCACCCGCTCCGCCGCTCCCAGCTGCAGGCTGAGCTCTGCCCGTTTGCTGCTGGGCCATGTGTGTTTGGGGCCTTTCCTGAGCCAGGCCTTGGGTGGGCCCTGTTT"
2013                )
2014            ))
2015        );
2016        let test = elem.next();
2017        let rangepos = RangePos::new(99829102, 99835825);
2018        assert_eq!(
2019            test,
2020            Some((
2021                &rangepos,
2022                &String::from(
2023                    "CCCCAGACCACCCATGAGCAGAGTGTAGGGCACGTGCCCAGCTCACAGAGGGGACCTCTGAGGCGGGGTGTGGTGGGCACACAGCAGTGAGCCATGAGGCTGGTGGCCCAGAGGCTTGGACATGCCGTGGGCCCCATAGGAAGTGACAGGGCTTGAGGGAAGCTCAGTGTGAGTGTGTGAGCGTGGGTATGAATGTGACAGTGACTCTCTATCTGTCTCTTTGTATCTCTGTCTCTCTGTGTGTATCTTTCTATCTCTGTCTCTCTATATGTCTCTCTATCTCTGTCTCTCTGTATCTCTATCTCTCTGTGTGTATCTTTCTATCTCTGTCTCTCTTTCTTGATCTCTCTCTATCTCTGTCTCTGTAACTCTCTTTATCTCTTACTGCTTCTGTTTCTCTCACTCTGTCTCTGTCTCTCTTTATCTCTGTCTTGCTCTCTCTCTCTGTAACTTTATCTCTGTCTCTCTGTTTCTATCTCTGTTTTTCTCTGTCTCTGTCTGTATCTCTGTCTCTCTTTATCTGTCTCTCTGTCTCTGTGTATCTCTGTCTCTCTGTAACTTTATCTCTGTCTTTTTCTGTCTCTGTGTGTGTCTGTCTCTGTGTCTTTGTTTTTCTCTCTGTCTCTGTCAATGTCTCTTTCTGTATCTGTTTCTTTCTCTCTGTCTCTGTCTCTCTATCTCTGTCTCTATCTCTCTGTCTCTCTGTAACTCCTCATCTCTGTCTCTGTGTCTGCATGTCTCTTTCTGTGTCTCTGTTTCTCTCTCTGTCTCTGTCTCTCTGTGACTCTGTCTCTGTCTCTGTCTCTGTCTTTCTCTGTTACTCTGTCTCTCTCTCTGTCTCTCTGTGACTCTATCTGTTACTCTGTCTCTGTCTCTGTCTCTCTCTGTCTCTCTTTCTCTGTTACTCTGTCTGTGTCTCTGTGTCTCTCTCTCGTCTGTCTTTCTCTGTTACTCTGTCTCTGTCTCTGTGTCTCTGTCTCTCTGCACTGTTTTCCTGGTGAAGGAGAAGCCATGTACCTTCCTGCATGATCTGTGCTCAGCTCACAACCACCCCATGATTGAGGACACCCCTCCTTCTAGAAGGTTCCCAGCTAACAGGTGCAGAAGGAGTGAAGATTGAAATAGGAGACCCCATCTTGAGACCCTCCCGGAACAGTGCCCCTGGGCCGTGTCCCCACTTCGGGACGTGGGATCTCGGTGCCAGGCGTGCGCTGCCTGACCCCGATCCCGTCGGCGTGTGGGCCCTTCCTCAGCCCAGGTGATTCCCTGTGGGCACGGGACTGGGCAGTGCTCCCCACGGCTGCTGGGCCCCAGGACCGGCCTCCAAGGCTGAACCGCGGCTCTGCCAGCTCCACAGACAGCCAGCAGCCCACCCGACAGGGACCAACATGACAAGGTGCTCAGGGCCGCCCTGTGCCCCGGGACCCAGCTGCAGCCTCAGCAGGACAGGGCTGGGGGTGGAGGGCACAGCCGGACTCCTGAGGACAAACGGCCCGCGCCCCGGGTGAACTCAGTGCCGTGGGGAGCCTGTGCACGGGCTGTGGTGGACGCGTCCCTGAGACCCTGTGTGTGCTGTAGGGTGGCTGTGCCCGCTGCCCTCACCACCTGCTGCCCGGGGCCCAGCCTCCCTCGCTGGGGCTGGAGGGTGGATCCAGCAGGGACAGCGTGATGCTCAGAGTCATCGCATAGTGACAAGGACGGGGGCTGCTTTCAAAGCTCCTGAATGTTTTAGTGGCTCAGAGTGAAGGTTCACAGGCCTCGGGGGACATGGCCTAGACTGGGCGTGGGTCCAGCCCCTTGGCAAGCAGTGGGTACATGGCGTGTCCTCCTCCATCCCCATCTGTCTGGTCCCCAGCCACACGCTGAGCCTGGGTCCCCGACTCCCCCCCGACCCGGCAGCTCAGGCCCAAGTCCCTGTCCCCTCCCCACATCCCCTCACAGCAGGTGCTTCAGAGGGGCCCTGGAACGTGACCAGTGTGGGGGAGGTGCTGCGGGGACTGGGGACCACACACGGCACCCGGCCCAGTGCCAGGGGGAGGCGGGTCAGGGCCCAGGTCTCCGAGGCCCAGGCTGTGCGTGTTGGAAGCCCCATTGTTGATGGAGTCAGATGCCCACATCCTCATCCCCGCCTGGGGCCCCTTCTTCAGGAGCCCTGGGTTCAGTCAGAGCCCAGCCAAGGTCCCCTCCCTGGCCAGAGGCCTCACTGTCTCGGTCACCCTCACCTCACTGCCCCCACCTCCTCACCCCTGCCAGCCTGGCCACTCTGGGCTGCTCCTGGCCTCCTTCCCACAAACACGGACCCACAGGTTCTCTAGGCCCTCCAGGACCTTCGCCCACTCCACGGCCCCTGCCCCTGTCCTGTTGACCTCCCAGCGTCCATCCCTGTCCTCGGGCTGCACCCTGCTGGCTATCCTGTTCTCTGACCATCCCCCACTGTCCAGTCCCTCCTGGGAGACCTGAGGCCGTCCTGGGCTTCAGCCCCCAGGGCTGGGGTCGCAGTGCGCAGGGTCCTGGGACCTCCTGCTCCCGCCTCTCCCATGTTGTTACCCACCCCAGCCCGATGTTCGGGGTCCTGTGTGGATCTGTAGGTTTCCCCGAGGCTCAGAGTCCTGCCCCGTCCAGCACAGACGGGGAACAGGGCGAGGGCTGGGTGGTGGCCCAGTGACCTCGGGGGCCAGGCCTTGTAGGTGCAGGTGGGCCCGTGCTGCCGTGCCCCCCACCCACAGACAGGCCCCGACTCTGGCCCAGCGCCCGCTCGGCCGCTCCCAGCTGCAGGCTGAGGTCTCCCCATTTGCTCCTGGGCCATGTGTGTTTGGGTGTGAGTGTGGGTATGGATGTGACAGTGACTTAGTGTGTGGCTGTGAGCGTGGGTATGTTTCTGTGTGTTTGTGTGTGAATGTTGTATAATAGTCGTGGTGTGTGTTTGTGAGAGTGACTGTGTGAGAGGGGCTTGCAGCTGAGTTCCTGGGCCCATCTTGCTGCCTCTTTCTCTCCCTGTGTGTTCTCTGCCTCTGTTGTGTTCTCTCTGCATGTCTGTCTCCATGTCTCTTTTTCCCTGTTCCCATCTCCTCCCTTTTTCTCCCATCTCTGTCTCTGTTTCTTATCTATCTCATCTCATCTCTCTCTTTCTGTCTCTTGTGTCTCTGTCCCTCCCCATCCCTGTCTCTTATCTCTCTCCATCCCCATCTCTCTCTCTGTGTCTGTCTTTGTCTCTGTCTCTATGTCTCTTGTCTCTCCCCATCCCTGTCTCTCTCTATGTCTCTGTGTCTCTTATCTCTCCCCATCCCTGTCTCTCTATGTCTCTGTGTCTCTTATCTCTCCTTGTCCTTGTCTTTCTCTGTCTACGTCTCTGTGTCTCTCTCCATCCCTGTCTCTCTCTATGTCTCTGTGTCTCTTATCTCTCCCTATCCCTGTCTCTCTATGTCTCTTGTCTCTCCCCATCCCTGTCTCTCTCTCTCTATGTCTCTGTGTCTCTTATCTCTCCCCATCCCTGTCTCTCTCTATGTCTCTTCATCTCTTATCTCTCTCCCCATCCCTGTCTCTATGTCTCTGTGTCTCTTATCTCTCCCCATCCTTGTCTCTGTCTATGTCTCTGTGTCTCTTGTCTCTCCCTGTCCCTGTCTCTCTCTATGTCTCTGTGTCTCTCTGGGCCCCTGGTCCAATGTCCCCTTCCCAGAACCCCTGTTTCCCTGGTGTGGGGTGCAGGTCCTTCTGTGGCCCTGTGGGCCGTGCTTGTGCTGGGCACAGCCTGCCAGGGCAGCCACTCAAGCCCCAGGGCTGGGCACTGCGTCCTGGCTCTGGCCAAGGGCCCTGGGGAGAGCTGAGGGAGGTGCATGCAGGGTGTGAGGCCCACCACAGTCACTGCCAGATGCTCAGTGCTGGTGCTTCCCTGGGTCTGCTGTGTGGTGGGCACAGCCCTCGTGAGGGCTGCCCATGGAGGAGGCCTGCCGCCTAGAGAGCCCGGACAGGGGGACAATGGCCTGTGCTGACCCTGGCGGAACCCTGGCTGGCCCCAGATGACCCCAGATGGCCCTGGCTGACCCTGGCGGAACCCAGATGACCCTGGCTGACCCTGGCTGGCCCTGGCTGACCCCAGATGACCCTGGCTGACCCTGGCTGATCCTGGCTGACCCTGGCTGACCTCTGCCTAACCCTGGACCTGGAAAGCCCTAGCTGACCCCGGGCTGGTTGGGGCTGGGCCTCCCTGTGGCTGCAGCCCCTCGCTCAGGCCCCAGGCACACCTGGCCAGGTCTCGGTTTTGGGGCATGTTTCTCAGAACAGCAGTTCTCTGGCTGGAACACCTGGCCTGGGCTGTGTTCACAATGACTCAGCCGCCCCACAGGGCTATTTTGGATATTTCTGCAGGTGATGGGGTACAAGAGGCTTCAGGAGAGAGAGAAAAGCAAGAGAATACAAACAGCATGGCCTCCCCCGACCTTCCTGTCCCCACTCCTGTACTGTACCCCCTCCCCAGTGCTAAGTCGAGACCTGGCGACCCCTTAGGGGCTGGGGCTGGGTGTAGCTCACAGGGCCTGGGCTGGTCCTCTCCCCACCAAGTCCTCCTGGGGCCTACACACCCCTCTGAGCCTGGAAAAATGGAGCAAGCCATTGGGGTCATTTCTTCATCTACCAGTGAGTACATGCACTGAGAGGGTCTCGGCTCCCCTGGAGGCCTCCCTCCACCACTGCAGGTCACTTACTCATGAGGGCCAAGGCTCAGAAATCAGACAGGACTCAGTGTCTAGTCAGACTGATACATGCTCAGAAAAGGAATCAGATTTCAAAATGAATATGTATAAGAAAAGAACCGGGGATCAGTGATCAGGAACAGGGATCCATGATCTGGTCCAGGGCTCAGCGGTCAGGAACAGGGCCCAGCGATCAGGACCAGGGCTCAGTAATCAGGACCAGGGCCCAGTGATCAGGACCAGGGCCCAGCGATTGGGTCCAGGGCTCAGTGATCAGGAACAGGGCTCAGTGATCAGGACCAGGGCCCAGTGATCAGGAACAGGGGCCAGTGACTGGGTCCAGGGCTCAGTAATCAGGACCAGGGCTCAGTGATCAGGACCAGGGCTCAGTGATCAGGAACAGGGGTTAGTGATCAGGAACAGGGCTCAGTGATCAGGACCAGCATTCAGTGATCAGGACCAGGGCTCAGTGATCAGGAACAGGGCTCAGTGATCAGGAACAGGGGTTAGTGATCAGGAACAGGGCTCAGTGATCAGGACCAGCACTCAGTGATCAGGACCAGGGCCCAGTGATCAGGAACAGGGGCCAGTGACTGGGTCCAGGGCTCAGTAATCAGGACCAGGGCTCAGTGATCAGGACCAGGGCTCAGTGATCAGGAATAGGGGTTAGTGATCAGGAACAGGGCTCAGTGATCAGGACCAGGGCTCAGTGATCAGGAACAGGGCTCAGTGATCAGGAACAGTGGTCAGTGATCAGGAACAGGGGTTAGTGATCAGGAACAGGGCTCAGTGATCGGGACCAGGGCTCAGTGATCAGGACCAGGGCCCAGTGATTGTGTCCAGGGCTCAGTGATCAGGACCAGGGCTCAGTGATCAGGAACAGGGCTCAGTGATCAGGAACAGGGGTTAGTGATCAGGAACAGGGCTCAGTGATCAGGACCAGCACTCAGTGATCAGGACCAGGGCCCAGTGATCAGGACCAGGGCCCAGCGATTGGGTCCAGGGCTCAGTAATCAGGACCAGGGCCCAGTGATCAGGAACAGGGCTCAGTGATCAGGAACAGGGGTTAGTGATCAGGAACAGGGGTTAGTGATCAGGAACAGGGCTCAGTGATCAGGAACAGGGCTCAGAGATCAGGACCAGGGCCCAGCGATTGGGTCCAGAGCTCAGTGATCAGGAACAGGGCCCAGCGATCAGGACCAGGGCTCAGTAATCAGGACCAGGGCTCAGTGATCAGGACCAGGGCCCAGTGATCAGGAACAGGGGCCAGTGACTGGGTCCAGGGCTCAGTAATCAGGACCAGGGCTCAGTGATCAGGAACAGCGGTTAGTGATCAGGAACAGGGCTCAGTGATCAGGACCAGCGCTCAGTGATCAGGAGCAGGGCTCAGTAATCAGGACCAGGGCCCAGTGATCAGGAACAGGGCTCAGTGATCAGGAACAGGGGTTAGTGATCAGGAACAGGGCTCAGTGATCAGGACCAGGGCCCAGCGATTGGGTCCAGAGCTCAGTGATCAGGAACAGGGCCCAGCGATCAGGACCAGGGCTCAGTAATCAGGACCAGGGCTCAGTGATCAGTACCAGGGCCCAGCGATTGGGTCCAGGGCTCAGTGATCAGGACCAGGGCCCAGCGATTGGGTCCAGGGCTCAGTGATCAGGAACAGGGCCCAGCGATCAGGACCAGGGCTCAGTAATCAGGACCAGGGCTCAGTGATCAGGACCAGGGCCCAGCGATTGGGTCCAGGGCTCAGTGATCAGGAACAGGGCCCAGCGATTGGGTCCAGGGCTCAGTGATCAGGAACAGGGCCCAGCGATCAGGACCAGGGCTCAGTAATCAGGACCAGGGCTCAGTGATCAGGACCAGGGCCCAGCGATTGGGTCCAGGGCTCAGTGATCAGGACCAGGGCCCAGCGATTGGGTCCAGGGCTCAGTGATCAGGAACAGGGGTTAGTGATCAGGAACAGGGCTCAGTGATCAGGAACAGGGGTTAGTGATCAGGAACAGGGCTCAGTGATCAGGACCAGGGCCCAGTGATT"
2024                )
2025            ))
2026        );
2027        assert!(elem.next().is_none());
2028    }
2029    #[test]
2030    fn testseqreverse() {
2031        let mut read = crate::bam::Reader::from_path("test/locus.bam").unwrap();
2032        let elem = read.records().filter_map(Result::ok).nth(8).unwrap();
2033        let val = elem.matched_sequence().unwrap();
2034        assert!(val.isfullymatched(99820441..=99821296).is_some());
2035        assert!(val.isfullymatched(99821296..=99821298).is_none());
2036        let mut elem = val.gethash().iter();
2037        let test = elem.next();
2038        let rangepos = RangePos::new(99820441, 99821297);
2039        assert_eq!(
2040            test,
2041            Some((
2042                &rangepos,
2043                &String::from(
2044                    "ACCCCCATCCACACACACCCAGAGACACACAGACACCCACAGCCACACACTCACACTCACGAACTTATCCAGTCACGTCCCACACACTCCCACCCAACCCATACACCACACACCTACACAACCCATACACCACACACACTCACAAACTATATACCACACACACACCAACCATACACCTATATACACTCACACACCCATATACCACACACTCACACACAACCCATACACCACACGCACACAACCCATACACCTATACACACTCACACCTACAAACTATATACTACACACTCACACACAACCCATACACCTATACACACACACCCATATACCACACACAACCCATACACCACACACACAAACCATATACCACACACTCACACAACCCATACACCTATACACACTCATACCCATATACCACATACAACCAATATACCACACACACACAACCCATACACCTATACACACACACCTATACACCACACACAGCCCATACACTACACAATCACACCACAAACTGTATACCACACACTCACACATAACCCATACACCTATACACACACACCCATATACCACACACACAACCTGTGCACCTACACACACACATACACCACACACACACAACTCCTACACCTACACACACCCACCACCCATACACACACAGCCTATACACCTACACACACTCATACACTCATATAGCACACACACAACCCATATACCACACACACAACCCACATACCTATACACACACGCCCATACACCACACACTCACACAACCCATGCACCACATACACCCACAAACTATATGCTACACGCTCACACACAACCCATACACCTATACACAATCCCACAACCCATA"
2045                )
2046            ))
2047        );
2048        let test = elem.next();
2049        let rangepos = RangePos::new(99821297, 99822851);
2050        assert_eq!(
2051            test,
2052            Some((
2053                &rangepos,
2054                &String::from(
2055                    "CACACTTACACAACCTATACACCACACACACTCACAATCTGTATACCACACACACAACCCATACAGTTATACACACACACCCATATACCACACACACACAACCCATATACCACACACTCACACACAAACCATACATCTATACACATACCCATATGCCACACATACAACCCATACACCACACACTCACACACAACACATACACCACACACACAACCCATAGAACACAAACACAAGTCATAACCACACACACAGCCCATATACCTATACACATTCACACACACAACCCATACACTACACACACAACACATACACCTATACACACTCACACTCAATTCATACACCACACACACACAGCCCATACATCTATACACAAACTCACACACAATCCATATACCACAAACTCACACACAACGCATACACCTATACACACACACGCAACTCATACAGCACACACTCACACAACCCACAGACCATAAACACACACAAGCCATAACCACACACAAACCCATACACCTATACACACACTCATAAACAAGCCATACACCCCTACACAACCCATACACCACACACTCACAACCCATACACCTATATACACACACAACCATATACCACAAACTCACGCTCAACACATACACCTATACACACACACAACTCATACACCACACACTCATACACAACGCACAGACCACATACACAAGCCATAACCACACACACACAACCCGTACACATATATACACACTAATAAACAAGCCATACACCTACACATACAACCCATACACCACACATTCACACATAACCCATACACCTATACACACACACACACAACCCATATACCACAAACACACACAACCTATACACACATACAACCCATACACCACACACACAACACATACACACCACACACACACAGAATACTCATACACACACCCATACACCACCCCCACACAGAACCCATACACCACACACACACAACCTATACACCTATACACACACTCACACACACAACTCATATACCACAAACACACACAACACATACACCTATGCACACACACAACCCATACACCACACATTCACATACAACCCATACACCACACACACACAACACATACATGAAACATACATACAACCCACACACCACCCACTCATACACAACCTATACACCACACACACAACTCATACACCTATACACACACAACACATACACCTATCATACACTCACAACACATACACCTCCTATACACACACAACACACACACTTCCTATACACACAACCCACACGCCTATACACACATCCTCACTCACACTCACCCTCACATTCATATACTCACTAACACACTTCCACACTCACACCCTCACCCACACTTACACCCCCACCCACACTCAAACCCCGACGCTAAGTCACTGTCACATTTGTACCCATGCTCACACGCTCACACGCTCACACACTCACCCCCCACCAGCTCCAGGGCTCACTGGTGTGTGCCCACCAAACCCCCCTCGGGGGTCCCCTCGGTAAGCCGACAGTGCTCTGCTCATCGGTGGCCTGGGGAAACA"
2056                )
2057            ))
2058        );
2059    }
2060    #[test]
2061    fn spliced_reads() {
2062        let mut bam = bam::Reader::from_path("./test/test_spliced_reads.bam").unwrap();
2063        let mut it = bam.records();
2064        let blocks: Vec<_> = it.next().expect("iter").unwrap().aligned_blocks().collect();
2065        //6S45M - 0
2066        assert!(blocks[0] == [16050676, 16050721]);
2067
2068        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2069        //7M2D44M - 1
2070        assert!(blocks[0] == [16096878, 16096885]);
2071        //7M2D44M - 1
2072        assert!(blocks[1] == [16096887, 16096931]);
2073
2074        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2075        //29M2D22M - 2
2076        assert!(blocks[0] == [16097145, 16097174]);
2077        //29M2D22M - 2
2078        assert!(blocks[1] == [16097176, 16097198]);
2079
2080        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2081        //51M - 3
2082        assert!(blocks[0] == [16117350, 16117401]);
2083
2084        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2085        //51M - 4
2086        assert!(blocks[0] == [16118483, 16118534]);
2087
2088        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2089        //51M - 5
2090        assert!(blocks[0] == [16118499, 16118550]);
2091
2092        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2093        //51M - 6
2094        assert!(blocks[0] == [16118499, 16118550]);
2095
2096        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2097        //51M - 7
2098        assert!(blocks[0] == [16118499, 16118550]);
2099
2100        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2101        //51M - 8
2102        assert!(blocks[0] == [16123411, 16123462]);
2103
2104        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2105        //6S45M - 9
2106        assert!(blocks[0] == [16123417, 16123462]);
2107
2108        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2109        //41M10S - 10
2110        assert!(blocks[0] == [16165860, 16165901]);
2111
2112        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2113        //51M - 11
2114        assert!(blocks[0] == [16180871, 16180922]);
2115
2116        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2117        //51M - 12
2118        assert!(blocks[0] == [16189705, 16189756]);
2119
2120        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2121        //51M - 13
2122        assert!(blocks[0] == [16231271, 16231322]);
2123
2124        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2125        //51M - 14
2126        assert!(blocks[0] == [16237657, 16237708]);
2127
2128        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2129        //9S42M - 15
2130        assert!(blocks[0] == [16255012, 16255054]);
2131
2132        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2133        //51M - 16
2134        assert!(blocks[0] == [16255391, 16255442]);
2135
2136        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2137        //50M1S - 17
2138        assert!(blocks[0] == [16255392, 16255442]);
2139
2140        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2141        //45M6S - 18
2142        assert!(blocks[0] == [16256084, 16256129]);
2143
2144        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2145        //3S48M - 19
2146        assert!(blocks[0] == [16256224, 16256272]);
2147
2148        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2149        //42M9S - 20
2150        assert!(blocks[0] == [16325199, 16325241]);
2151
2152        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2153        //13S38M - 21
2154        assert!(blocks[0] == [16352865, 16352903]);
2155
2156        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2157        //44M7S - 22
2158        assert!(blocks[0] == [16352968, 16353012]);
2159
2160        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2161        //5S46M - 23
2162        assert!(blocks[0] == [16414998, 16415044]);
2163
2164        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2165        //23M4I24M - 24
2166        assert!(blocks[0] == [17031591, 17031614]);
2167        //23M4I24M - 24
2168        assert!(blocks[1] == [17031614, 17031638]);
2169
2170        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2171        //18M1I32M - 25
2172        assert!(blocks[0] == [17057382, 17057400]);
2173        //18M1I32M - 25
2174        assert!(blocks[1] == [17057400, 17057432]);
2175
2176        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2177        //17M2183N34M - 26
2178        assert!(blocks[0] == [17092766, 17092783]);
2179        //17M2183N34M - 26
2180        assert!(blocks[1] == [17094966, 17095000]);
2181
2182        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2183        //1M2183N50M - 27
2184        assert!(blocks[0] == [17092782, 17092783]);
2185        //1M2183N50M - 27
2186        assert!(blocks[1] == [17094966, 17095016]);
2187
2188        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2189        //1M2183N50M - 28
2190        assert!(blocks[0] == [17092782, 17092783]);
2191        //1M2183N50M - 28
2192        assert!(blocks[1] == [17094966, 17095016]);
2193
2194        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2195        //9S33M9S - 29
2196        assert!(blocks[0] == [17137287, 17137320]);
2197
2198        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2199        //2S48M1S - 30
2200        assert!(blocks[0] == [17306238, 17306286]);
2201
2202        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2203        //4S45M2S - 31
2204        assert!(blocks[0] == [17561868, 17561913]);
2205
2206        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2207        //41M11832N10M - 32
2208        assert!(blocks[0] == [17566078, 17566119]);
2209        //41M11832N10M - 32
2210        assert!(blocks[1] == [17577951, 17577961]);
2211
2212        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2213        //11M11832N25M710N15M - 33
2214        assert!(blocks[0] == [17566108, 17566119]);
2215        //11M11832N25M710N15M - 33
2216        assert!(blocks[1] == [17577951, 17577976]);
2217        //11M11832N25M710N15M - 33
2218        assert!(blocks[2] == [17578686, 17578701]);
2219
2220        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2221        //8M11832N25M710N18M - 34
2222        assert!(blocks[0] == [17566111, 17566119]);
2223        //8M11832N25M710N18M - 34
2224        assert!(blocks[1] == [17577951, 17577976]);
2225        //8M11832N25M710N18M - 34
2226        assert!(blocks[2] == [17578686, 17578704]);
2227
2228        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2229        //8M11832N25M710N18M - 35
2230        assert!(blocks[0] == [17566111, 17566119]);
2231        //8M11832N25M710N18M - 35
2232        assert!(blocks[1] == [17577951, 17577976]);
2233        //8M11832N25M710N18M - 35
2234        assert!(blocks[2] == [17578686, 17578704]);
2235
2236        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2237        //8M11832N25M710N18M - 36
2238        assert!(blocks[0] == [17566111, 17566119]);
2239        //8M11832N25M710N18M - 36
2240        assert!(blocks[1] == [17577951, 17577976]);
2241        //8M11832N25M710N18M - 36
2242        assert!(blocks[2] == [17578686, 17578704]);
2243
2244        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2245        //8M11832N25M710N18M - 37
2246        assert!(blocks[0] == [17566111, 17566119]);
2247        //8M11832N25M710N18M - 37
2248        assert!(blocks[1] == [17577951, 17577976]);
2249        //8M11832N25M710N18M - 37
2250        assert!(blocks[2] == [17578686, 17578704]);
2251
2252        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2253        //7M11832N25M710N19M - 38
2254        assert!(blocks[0] == [17566112, 17566119]);
2255        //7M11832N25M710N19M - 38
2256        assert!(blocks[1] == [17577951, 17577976]);
2257        //7M11832N25M710N19M - 38
2258        assert!(blocks[2] == [17578686, 17578705]);
2259
2260        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2261        //6M11832N25M710N20M - 39
2262        assert!(blocks[0] == [17566113, 17566119]);
2263        //6M11832N25M710N20M - 39
2264        assert!(blocks[1] == [17577951, 17577976]);
2265        //6M11832N25M710N20M - 39
2266        assert!(blocks[2] == [17578686, 17578706]);
2267
2268        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2269        //6M11832N25M710N20M - 40
2270        assert!(blocks[0] == [17566113, 17566119]);
2271        //6M11832N25M710N20M - 40
2272        assert!(blocks[1] == [17577951, 17577976]);
2273        //6M11832N25M710N20M - 40
2274        assert!(blocks[2] == [17578686, 17578706]);
2275
2276        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2277        //1S44M1467N6M - 41
2278        assert!(blocks[0] == [17579733, 17579777]);
2279        //1S44M1467N6M - 41
2280        assert!(blocks[1] == [17581244, 17581250]);
2281
2282        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2283        //2M1514N48M95N1M - 42
2284        assert!(blocks[0] == [17581369, 17581371]);
2285        //2M1514N48M95N1M - 42
2286        assert!(blocks[1] == [17582885, 17582933]);
2287        //2M1514N48M95N1M - 42
2288        assert!(blocks[2] == [17583028, 17583029]);
2289
2290        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2291        //1M1514N48M95N2M - 43
2292        assert!(blocks[0] == [17581370, 17581371]);
2293        //1M1514N48M95N2M - 43
2294        assert!(blocks[1] == [17582885, 17582933]);
2295        //1M1514N48M95N2M - 43
2296        assert!(blocks[2] == [17583028, 17583030]);
2297
2298        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2299        //1M1514N48M95N2M - 44
2300        assert!(blocks[0] == [17581370, 17581371]);
2301        //1M1514N48M95N2M - 44
2302        assert!(blocks[1] == [17582885, 17582933]);
2303        //1M1514N48M95N2M - 44
2304        assert!(blocks[2] == [17583028, 17583030]);
2305
2306        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2307        //1S22M95N28M - 45
2308        assert!(blocks[0] == [17582911, 17582933]);
2309        //1S22M95N28M - 45
2310        assert!(blocks[1] == [17583028, 17583056]);
2311
2312        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2313        //37M538N13M1S - 46
2314        assert!(blocks[0] == [17588621, 17588658]);
2315        //37M538N13M1S - 46
2316        assert!(blocks[1] == [17589196, 17589209]);
2317
2318        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2319        //37M538N13M1S - 47
2320        assert!(blocks[0] == [17588621, 17588658]);
2321        //37M538N13M1S - 47
2322        assert!(blocks[1] == [17589196, 17589209]);
2323
2324        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2325        //37M538N13M1S - 48
2326        assert!(blocks[0] == [17588621, 17588658]);
2327        //37M538N13M1S - 48
2328        assert!(blocks[1] == [17589196, 17589209]);
2329
2330        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2331        //1S25M1D25M - 49
2332        assert!(blocks[0] == [17591770, 17591795]);
2333        //1S25M1D25M - 49
2334        assert!(blocks[1] == [17591796, 17591821]);
2335
2336        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2337        //24M1D24M3S - 50
2338        assert!(blocks[0] == [17593855, 17593879]);
2339        //24M1D24M3S - 50
2340        assert!(blocks[1] == [17593880, 17593904]);
2341
2342        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2343        //16M1D28M7S - 51
2344        assert!(blocks[0] == [17593863, 17593879]);
2345        //16M1D28M7S - 51
2346        assert!(blocks[1] == [17593880, 17593908]);
2347
2348        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2349        //11S7M1I32M - 52
2350        assert!(blocks[0] == [17596476, 17596483]);
2351        //11S7M1I32M - 52
2352        assert!(blocks[1] == [17596483, 17596515]);
2353
2354        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2355        //5S9M1892N37M - 53
2356        assert!(blocks[0] == [17624012, 17624021]);
2357        //5S9M1892N37M - 53
2358        assert!(blocks[1] == [17625913, 17625950]);
2359
2360        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2361        //2S9M1892N40M - 54
2362        assert!(blocks[0] == [17624012, 17624021]);
2363        //2S9M1892N40M - 54
2364        assert!(blocks[1] == [17625913, 17625953]);
2365
2366        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2367        //1S7M3D19M2285N24M - 55
2368        assert!(blocks[0] == [31796700, 31796707]);
2369        //1S7M3D19M2285N24M - 55
2370        assert!(blocks[1] == [31796710, 31796729]);
2371        //1S7M3D19M2285N24M - 55
2372        assert!(blocks[2] == [31799014, 31799038]);
2373
2374        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2375        //14M799N28M13881N7M2S - 56
2376        assert!(blocks[0] == [36722692, 36722706]);
2377        //14M799N28M13881N7M2S - 56
2378        assert!(blocks[1] == [36723505, 36723533]);
2379        //14M799N28M13881N7M2S - 56
2380        assert!(blocks[2] == [36737414, 36737421]);
2381
2382        let blocks: Vec<_> = it.next().unwrap().unwrap().aligned_blocks().collect();
2383        //4S21M1696N23M2331N3M - 57
2384        assert!(blocks[0] == [44587963, 44587984]);
2385        //4S21M1696N23M2331N3M - 57
2386        assert!(blocks[1] == [44589680, 44589703]);
2387        //4S21M1696N23M2331N3M - 57
2388        assert!(blocks[2] == [44592034, 44592037]);
2389    }
2390
2391    #[test]
2392    fn test_introns() {
2393        let mut bam = bam::Reader::from_path("./test/test_spliced_reads.bam").unwrap();
2394        let mut it = bam.records();
2395
2396        //6S45M - 0
2397        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2398        assert_eq!(introns.len(), 0);
2399        //7M2D44M - 1
2400        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2401        assert_eq!(introns.len(), 0);
2402        //29M2D22M - 2
2403        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2404        assert_eq!(introns.len(), 0);
2405        //51M - 3
2406        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2407        assert_eq!(introns.len(), 0);
2408        //51M - 4
2409        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2410        assert_eq!(introns.len(), 0);
2411        //51M - 5
2412        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2413        assert_eq!(introns.len(), 0);
2414        //51M - 6
2415        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2416        assert_eq!(introns.len(), 0);
2417        //51M - 7
2418        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2419        assert_eq!(introns.len(), 0);
2420        //51M - 8
2421        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2422        assert_eq!(introns.len(), 0);
2423        //6S45M - 9
2424        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2425        assert_eq!(introns.len(), 0);
2426        //41M10S - 10
2427        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2428        assert_eq!(introns.len(), 0);
2429        //51M - 11
2430        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2431        assert_eq!(introns.len(), 0);
2432        //51M - 12
2433        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2434        assert_eq!(introns.len(), 0);
2435        //51M - 13
2436        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2437        assert_eq!(introns.len(), 0);
2438        //51M - 14
2439        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2440        assert_eq!(introns.len(), 0);
2441        //9S42M - 15
2442        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2443        assert_eq!(introns.len(), 0);
2444        //51M - 16
2445        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2446        assert_eq!(introns.len(), 0);
2447        //50M1S - 17
2448        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2449        assert_eq!(introns.len(), 0);
2450        //45M6S - 18
2451        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2452        assert_eq!(introns.len(), 0);
2453        //3S48M - 19
2454        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2455        assert_eq!(introns.len(), 0);
2456        //42M9S - 20
2457        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2458        assert_eq!(introns.len(), 0);
2459        //13S38M - 21
2460        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2461        assert_eq!(introns.len(), 0);
2462        //44M7S - 22
2463        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2464        assert_eq!(introns.len(), 0);
2465        //5S46M - 23
2466        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2467        assert_eq!(introns.len(), 0);
2468        //23M4I24M - 24
2469        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2470        assert_eq!(introns.len(), 0);
2471        //18M1I32M - 25
2472        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2473        assert_eq!(introns.len(), 0);
2474        //17M2183N34M - 26
2475        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2476        assert_eq!(introns.len(), 1);
2477        assert_eq!(introns[0], [17092783, 17094966]);
2478        //1M2183N50M - 27
2479        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2480        assert_eq!(introns.len(), 1);
2481        assert_eq!(introns[0], [17092783, 17094966]);
2482        //1M2183N50M - 28
2483        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2484        assert_eq!(introns.len(), 1);
2485        assert_eq!(introns[0], [17092783, 17094966]);
2486        //9S33M9S - 29
2487        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2488        assert_eq!(introns.len(), 0);
2489        //2S48M1S - 30
2490        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2491        assert_eq!(introns.len(), 0);
2492        //4S45M2S - 31
2493        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2494        assert_eq!(introns.len(), 0);
2495        //41M11832N10M - 32
2496        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2497        assert_eq!(introns.len(), 1);
2498        assert_eq!(introns[0], [17566119, 17577951]);
2499        //11M11832N25M710N15M - 33
2500        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2501        assert_eq!(introns.len(), 2);
2502        assert_eq!(introns[0], [17566119, 17577951]);
2503        assert_eq!(introns[1], [17577976, 17578686]);
2504        //8M11832N25M710N18M - 34
2505        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2506        assert_eq!(introns.len(), 2);
2507        assert_eq!(introns[0], [17566119, 17577951]);
2508        assert_eq!(introns[1], [17577976, 17578686]);
2509        //8M11832N25M710N18M - 35
2510        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2511        assert_eq!(introns.len(), 2);
2512        assert_eq!(introns[0], [17566119, 17577951]);
2513        assert_eq!(introns[1], [17577976, 17578686]);
2514        //8M11832N25M710N18M - 36
2515        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2516        assert_eq!(introns.len(), 2);
2517        assert_eq!(introns[0], [17566119, 17577951]);
2518        assert_eq!(introns[1], [17577976, 17578686]);
2519        //8M11832N25M710N18M - 37
2520        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2521        assert_eq!(introns.len(), 2);
2522        assert_eq!(introns[0], [17566119, 17577951]);
2523        assert_eq!(introns[1], [17577976, 17578686]);
2524        //7M11832N25M710N19M - 38
2525        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2526        assert_eq!(introns.len(), 2);
2527        assert_eq!(introns[0], [17566119, 17577951]);
2528        assert_eq!(introns[1], [17577976, 17578686]);
2529        //6M11832N25M710N20M - 39
2530        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2531        assert_eq!(introns.len(), 2);
2532        assert_eq!(introns[0], [17566119, 17577951]);
2533        assert_eq!(introns[1], [17577976, 17578686]);
2534        //6M11832N25M710N20M - 40
2535        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2536        assert_eq!(introns.len(), 2);
2537        assert_eq!(introns[0], [17566119, 17577951]);
2538        assert_eq!(introns[1], [17577976, 17578686]);
2539        //1S44M1467N6M - 41
2540        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2541        assert_eq!(introns.len(), 1);
2542        assert_eq!(introns[0], [17579777, 17581244]);
2543        //2M1514N48M95N1M - 42
2544        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2545        assert_eq!(introns.len(), 2);
2546        assert_eq!(introns[0], [17581371, 17582885]);
2547        assert_eq!(introns[1], [17582933, 17583028]);
2548        //1M1514N48M95N2M - 43
2549        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2550        assert_eq!(introns.len(), 2);
2551        assert_eq!(introns[0], [17581371, 17582885]);
2552        assert_eq!(introns[1], [17582933, 17583028]);
2553        //1M1514N48M95N2M - 44
2554        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2555        assert_eq!(introns.len(), 2);
2556        assert_eq!(introns[0], [17581371, 17582885]);
2557        assert_eq!(introns[1], [17582933, 17583028]);
2558        //1S22M95N28M - 45
2559        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2560        assert_eq!(introns.len(), 1);
2561        assert_eq!(introns[0], [17582933, 17583028]);
2562        //37M538N13M1S - 46
2563        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2564        assert_eq!(introns.len(), 1);
2565        assert_eq!(introns[0], [17588658, 17589196]);
2566        //37M538N13M1S - 47
2567        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2568        assert_eq!(introns.len(), 1);
2569        assert_eq!(introns[0], [17588658, 17589196]);
2570        //37M538N13M1S - 48
2571        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2572        assert_eq!(introns.len(), 1);
2573        assert_eq!(introns[0], [17588658, 17589196]);
2574        //1S25M1D25M - 49
2575        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2576        assert_eq!(introns.len(), 0);
2577        //24M1D24M3S - 50
2578        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2579        assert_eq!(introns.len(), 0);
2580        //16M1D28M7S - 51
2581        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2582        assert_eq!(introns.len(), 0);
2583        //11S7M1I32M - 52
2584        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2585        assert_eq!(introns.len(), 0);
2586        //5S9M1892N37M - 53
2587        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2588        assert_eq!(introns.len(), 1);
2589        assert_eq!(introns[0], [17624021, 17625913]);
2590        //2S9M1892N40M - 54
2591        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2592        assert_eq!(introns.len(), 1);
2593        assert_eq!(introns[0], [17624021, 17625913]);
2594        //1S7M3D19M2285N24M - 55
2595        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2596        assert_eq!(introns.len(), 1);
2597        assert_eq!(introns[0], [31796729, 31799014]);
2598        //14M799N28M13881N7M2S - 56
2599        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2600        assert_eq!(introns.len(), 2);
2601        assert_eq!(introns[0], [36722706, 36723505]);
2602        assert_eq!(introns[1], [36723533, 36737414]);
2603        //4S21M1696N23M2331N3M - 57
2604        let introns: Vec<_> = it.next().unwrap().unwrap().introns().collect();
2605        assert_eq!(introns.len(), 2);
2606        assert_eq!(introns[0], [44587984, 44589680]);
2607        assert_eq!(introns[1], [44589703, 44592034]);
2608    }
2609
2610    #[test]
2611    fn test_aligned_pairs() {
2612        let mut bam = bam::Reader::from_path("./test/test_spliced_reads.bam").unwrap();
2613        let mut it = bam.records();
2614
2615        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
2616        assert_eq!(
2617            pairs,
2618            vec![
2619                [6, 16050676],
2620                [7, 16050677],
2621                [8, 16050678],
2622                [9, 16050679],
2623                [10, 16050680],
2624                [11, 16050681],
2625                [12, 16050682],
2626                [13, 16050683],
2627                [14, 16050684],
2628                [15, 16050685],
2629                [16, 16050686],
2630                [17, 16050687],
2631                [18, 16050688],
2632                [19, 16050689],
2633                [20, 16050690],
2634                [21, 16050691],
2635                [22, 16050692],
2636                [23, 16050693],
2637                [24, 16050694],
2638                [25, 16050695],
2639                [26, 16050696],
2640                [27, 16050697],
2641                [28, 16050698],
2642                [29, 16050699],
2643                [30, 16050700],
2644                [31, 16050701],
2645                [32, 16050702],
2646                [33, 16050703],
2647                [34, 16050704],
2648                [35, 16050705],
2649                [36, 16050706],
2650                [37, 16050707],
2651                [38, 16050708],
2652                [39, 16050709],
2653                [40, 16050710],
2654                [41, 16050711],
2655                [42, 16050712],
2656                [43, 16050713],
2657                [44, 16050714],
2658                [45, 16050715],
2659                [46, 16050716],
2660                [47, 16050717],
2661                [48, 16050718],
2662                [49, 16050719],
2663                [50, 16050720]
2664            ]
2665        );
2666        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
2667        assert_eq!(
2668            pairs,
2669            vec![
2670                [0, 16096878],
2671                [1, 16096879],
2672                [2, 16096880],
2673                [3, 16096881],
2674                [4, 16096882],
2675                [5, 16096883],
2676                [6, 16096884],
2677                [7, 16096887],
2678                [8, 16096888],
2679                [9, 16096889],
2680                [10, 16096890],
2681                [11, 16096891],
2682                [12, 16096892],
2683                [13, 16096893],
2684                [14, 16096894],
2685                [15, 16096895],
2686                [16, 16096896],
2687                [17, 16096897],
2688                [18, 16096898],
2689                [19, 16096899],
2690                [20, 16096900],
2691                [21, 16096901],
2692                [22, 16096902],
2693                [23, 16096903],
2694                [24, 16096904],
2695                [25, 16096905],
2696                [26, 16096906],
2697                [27, 16096907],
2698                [28, 16096908],
2699                [29, 16096909],
2700                [30, 16096910],
2701                [31, 16096911],
2702                [32, 16096912],
2703                [33, 16096913],
2704                [34, 16096914],
2705                [35, 16096915],
2706                [36, 16096916],
2707                [37, 16096917],
2708                [38, 16096918],
2709                [39, 16096919],
2710                [40, 16096920],
2711                [41, 16096921],
2712                [42, 16096922],
2713                [43, 16096923],
2714                [44, 16096924],
2715                [45, 16096925],
2716                [46, 16096926],
2717                [47, 16096927],
2718                [48, 16096928],
2719                [49, 16096929],
2720                [50, 16096930]
2721            ]
2722        );
2723        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
2724        assert_eq!(
2725            pairs,
2726            vec![
2727                [0, 16097145],
2728                [1, 16097146],
2729                [2, 16097147],
2730                [3, 16097148],
2731                [4, 16097149],
2732                [5, 16097150],
2733                [6, 16097151],
2734                [7, 16097152],
2735                [8, 16097153],
2736                [9, 16097154],
2737                [10, 16097155],
2738                [11, 16097156],
2739                [12, 16097157],
2740                [13, 16097158],
2741                [14, 16097159],
2742                [15, 16097160],
2743                [16, 16097161],
2744                [17, 16097162],
2745                [18, 16097163],
2746                [19, 16097164],
2747                [20, 16097165],
2748                [21, 16097166],
2749                [22, 16097167],
2750                [23, 16097168],
2751                [24, 16097169],
2752                [25, 16097170],
2753                [26, 16097171],
2754                [27, 16097172],
2755                [28, 16097173],
2756                [29, 16097176],
2757                [30, 16097177],
2758                [31, 16097178],
2759                [32, 16097179],
2760                [33, 16097180],
2761                [34, 16097181],
2762                [35, 16097182],
2763                [36, 16097183],
2764                [37, 16097184],
2765                [38, 16097185],
2766                [39, 16097186],
2767                [40, 16097187],
2768                [41, 16097188],
2769                [42, 16097189],
2770                [43, 16097190],
2771                [44, 16097191],
2772                [45, 16097192],
2773                [46, 16097193],
2774                [47, 16097194],
2775                [48, 16097195],
2776                [49, 16097196],
2777                [50, 16097197]
2778            ]
2779        );
2780        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
2781        assert_eq!(
2782            pairs,
2783            vec![
2784                [0, 16117350],
2785                [1, 16117351],
2786                [2, 16117352],
2787                [3, 16117353],
2788                [4, 16117354],
2789                [5, 16117355],
2790                [6, 16117356],
2791                [7, 16117357],
2792                [8, 16117358],
2793                [9, 16117359],
2794                [10, 16117360],
2795                [11, 16117361],
2796                [12, 16117362],
2797                [13, 16117363],
2798                [14, 16117364],
2799                [15, 16117365],
2800                [16, 16117366],
2801                [17, 16117367],
2802                [18, 16117368],
2803                [19, 16117369],
2804                [20, 16117370],
2805                [21, 16117371],
2806                [22, 16117372],
2807                [23, 16117373],
2808                [24, 16117374],
2809                [25, 16117375],
2810                [26, 16117376],
2811                [27, 16117377],
2812                [28, 16117378],
2813                [29, 16117379],
2814                [30, 16117380],
2815                [31, 16117381],
2816                [32, 16117382],
2817                [33, 16117383],
2818                [34, 16117384],
2819                [35, 16117385],
2820                [36, 16117386],
2821                [37, 16117387],
2822                [38, 16117388],
2823                [39, 16117389],
2824                [40, 16117390],
2825                [41, 16117391],
2826                [42, 16117392],
2827                [43, 16117393],
2828                [44, 16117394],
2829                [45, 16117395],
2830                [46, 16117396],
2831                [47, 16117397],
2832                [48, 16117398],
2833                [49, 16117399],
2834                [50, 16117400]
2835            ]
2836        );
2837        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
2838        assert_eq!(
2839            pairs,
2840            vec![
2841                [0, 16118483],
2842                [1, 16118484],
2843                [2, 16118485],
2844                [3, 16118486],
2845                [4, 16118487],
2846                [5, 16118488],
2847                [6, 16118489],
2848                [7, 16118490],
2849                [8, 16118491],
2850                [9, 16118492],
2851                [10, 16118493],
2852                [11, 16118494],
2853                [12, 16118495],
2854                [13, 16118496],
2855                [14, 16118497],
2856                [15, 16118498],
2857                [16, 16118499],
2858                [17, 16118500],
2859                [18, 16118501],
2860                [19, 16118502],
2861                [20, 16118503],
2862                [21, 16118504],
2863                [22, 16118505],
2864                [23, 16118506],
2865                [24, 16118507],
2866                [25, 16118508],
2867                [26, 16118509],
2868                [27, 16118510],
2869                [28, 16118511],
2870                [29, 16118512],
2871                [30, 16118513],
2872                [31, 16118514],
2873                [32, 16118515],
2874                [33, 16118516],
2875                [34, 16118517],
2876                [35, 16118518],
2877                [36, 16118519],
2878                [37, 16118520],
2879                [38, 16118521],
2880                [39, 16118522],
2881                [40, 16118523],
2882                [41, 16118524],
2883                [42, 16118525],
2884                [43, 16118526],
2885                [44, 16118527],
2886                [45, 16118528],
2887                [46, 16118529],
2888                [47, 16118530],
2889                [48, 16118531],
2890                [49, 16118532],
2891                [50, 16118533]
2892            ]
2893        );
2894        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
2895        assert_eq!(
2896            pairs,
2897            vec![
2898                [0, 16118499],
2899                [1, 16118500],
2900                [2, 16118501],
2901                [3, 16118502],
2902                [4, 16118503],
2903                [5, 16118504],
2904                [6, 16118505],
2905                [7, 16118506],
2906                [8, 16118507],
2907                [9, 16118508],
2908                [10, 16118509],
2909                [11, 16118510],
2910                [12, 16118511],
2911                [13, 16118512],
2912                [14, 16118513],
2913                [15, 16118514],
2914                [16, 16118515],
2915                [17, 16118516],
2916                [18, 16118517],
2917                [19, 16118518],
2918                [20, 16118519],
2919                [21, 16118520],
2920                [22, 16118521],
2921                [23, 16118522],
2922                [24, 16118523],
2923                [25, 16118524],
2924                [26, 16118525],
2925                [27, 16118526],
2926                [28, 16118527],
2927                [29, 16118528],
2928                [30, 16118529],
2929                [31, 16118530],
2930                [32, 16118531],
2931                [33, 16118532],
2932                [34, 16118533],
2933                [35, 16118534],
2934                [36, 16118535],
2935                [37, 16118536],
2936                [38, 16118537],
2937                [39, 16118538],
2938                [40, 16118539],
2939                [41, 16118540],
2940                [42, 16118541],
2941                [43, 16118542],
2942                [44, 16118543],
2943                [45, 16118544],
2944                [46, 16118545],
2945                [47, 16118546],
2946                [48, 16118547],
2947                [49, 16118548],
2948                [50, 16118549]
2949            ]
2950        );
2951        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
2952        assert_eq!(
2953            pairs,
2954            vec![
2955                [0, 16118499],
2956                [1, 16118500],
2957                [2, 16118501],
2958                [3, 16118502],
2959                [4, 16118503],
2960                [5, 16118504],
2961                [6, 16118505],
2962                [7, 16118506],
2963                [8, 16118507],
2964                [9, 16118508],
2965                [10, 16118509],
2966                [11, 16118510],
2967                [12, 16118511],
2968                [13, 16118512],
2969                [14, 16118513],
2970                [15, 16118514],
2971                [16, 16118515],
2972                [17, 16118516],
2973                [18, 16118517],
2974                [19, 16118518],
2975                [20, 16118519],
2976                [21, 16118520],
2977                [22, 16118521],
2978                [23, 16118522],
2979                [24, 16118523],
2980                [25, 16118524],
2981                [26, 16118525],
2982                [27, 16118526],
2983                [28, 16118527],
2984                [29, 16118528],
2985                [30, 16118529],
2986                [31, 16118530],
2987                [32, 16118531],
2988                [33, 16118532],
2989                [34, 16118533],
2990                [35, 16118534],
2991                [36, 16118535],
2992                [37, 16118536],
2993                [38, 16118537],
2994                [39, 16118538],
2995                [40, 16118539],
2996                [41, 16118540],
2997                [42, 16118541],
2998                [43, 16118542],
2999                [44, 16118543],
3000                [45, 16118544],
3001                [46, 16118545],
3002                [47, 16118546],
3003                [48, 16118547],
3004                [49, 16118548],
3005                [50, 16118549]
3006            ]
3007        );
3008        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3009        assert_eq!(
3010            pairs,
3011            vec![
3012                [0, 16118499],
3013                [1, 16118500],
3014                [2, 16118501],
3015                [3, 16118502],
3016                [4, 16118503],
3017                [5, 16118504],
3018                [6, 16118505],
3019                [7, 16118506],
3020                [8, 16118507],
3021                [9, 16118508],
3022                [10, 16118509],
3023                [11, 16118510],
3024                [12, 16118511],
3025                [13, 16118512],
3026                [14, 16118513],
3027                [15, 16118514],
3028                [16, 16118515],
3029                [17, 16118516],
3030                [18, 16118517],
3031                [19, 16118518],
3032                [20, 16118519],
3033                [21, 16118520],
3034                [22, 16118521],
3035                [23, 16118522],
3036                [24, 16118523],
3037                [25, 16118524],
3038                [26, 16118525],
3039                [27, 16118526],
3040                [28, 16118527],
3041                [29, 16118528],
3042                [30, 16118529],
3043                [31, 16118530],
3044                [32, 16118531],
3045                [33, 16118532],
3046                [34, 16118533],
3047                [35, 16118534],
3048                [36, 16118535],
3049                [37, 16118536],
3050                [38, 16118537],
3051                [39, 16118538],
3052                [40, 16118539],
3053                [41, 16118540],
3054                [42, 16118541],
3055                [43, 16118542],
3056                [44, 16118543],
3057                [45, 16118544],
3058                [46, 16118545],
3059                [47, 16118546],
3060                [48, 16118547],
3061                [49, 16118548],
3062                [50, 16118549]
3063            ]
3064        );
3065        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3066        assert_eq!(
3067            pairs,
3068            vec![
3069                [0, 16123411],
3070                [1, 16123412],
3071                [2, 16123413],
3072                [3, 16123414],
3073                [4, 16123415],
3074                [5, 16123416],
3075                [6, 16123417],
3076                [7, 16123418],
3077                [8, 16123419],
3078                [9, 16123420],
3079                [10, 16123421],
3080                [11, 16123422],
3081                [12, 16123423],
3082                [13, 16123424],
3083                [14, 16123425],
3084                [15, 16123426],
3085                [16, 16123427],
3086                [17, 16123428],
3087                [18, 16123429],
3088                [19, 16123430],
3089                [20, 16123431],
3090                [21, 16123432],
3091                [22, 16123433],
3092                [23, 16123434],
3093                [24, 16123435],
3094                [25, 16123436],
3095                [26, 16123437],
3096                [27, 16123438],
3097                [28, 16123439],
3098                [29, 16123440],
3099                [30, 16123441],
3100                [31, 16123442],
3101                [32, 16123443],
3102                [33, 16123444],
3103                [34, 16123445],
3104                [35, 16123446],
3105                [36, 16123447],
3106                [37, 16123448],
3107                [38, 16123449],
3108                [39, 16123450],
3109                [40, 16123451],
3110                [41, 16123452],
3111                [42, 16123453],
3112                [43, 16123454],
3113                [44, 16123455],
3114                [45, 16123456],
3115                [46, 16123457],
3116                [47, 16123458],
3117                [48, 16123459],
3118                [49, 16123460],
3119                [50, 16123461]
3120            ]
3121        );
3122        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3123        assert_eq!(
3124            pairs,
3125            vec![
3126                [6, 16123417],
3127                [7, 16123418],
3128                [8, 16123419],
3129                [9, 16123420],
3130                [10, 16123421],
3131                [11, 16123422],
3132                [12, 16123423],
3133                [13, 16123424],
3134                [14, 16123425],
3135                [15, 16123426],
3136                [16, 16123427],
3137                [17, 16123428],
3138                [18, 16123429],
3139                [19, 16123430],
3140                [20, 16123431],
3141                [21, 16123432],
3142                [22, 16123433],
3143                [23, 16123434],
3144                [24, 16123435],
3145                [25, 16123436],
3146                [26, 16123437],
3147                [27, 16123438],
3148                [28, 16123439],
3149                [29, 16123440],
3150                [30, 16123441],
3151                [31, 16123442],
3152                [32, 16123443],
3153                [33, 16123444],
3154                [34, 16123445],
3155                [35, 16123446],
3156                [36, 16123447],
3157                [37, 16123448],
3158                [38, 16123449],
3159                [39, 16123450],
3160                [40, 16123451],
3161                [41, 16123452],
3162                [42, 16123453],
3163                [43, 16123454],
3164                [44, 16123455],
3165                [45, 16123456],
3166                [46, 16123457],
3167                [47, 16123458],
3168                [48, 16123459],
3169                [49, 16123460],
3170                [50, 16123461]
3171            ]
3172        );
3173        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3174        assert_eq!(
3175            pairs,
3176            vec![
3177                [0, 16165860],
3178                [1, 16165861],
3179                [2, 16165862],
3180                [3, 16165863],
3181                [4, 16165864],
3182                [5, 16165865],
3183                [6, 16165866],
3184                [7, 16165867],
3185                [8, 16165868],
3186                [9, 16165869],
3187                [10, 16165870],
3188                [11, 16165871],
3189                [12, 16165872],
3190                [13, 16165873],
3191                [14, 16165874],
3192                [15, 16165875],
3193                [16, 16165876],
3194                [17, 16165877],
3195                [18, 16165878],
3196                [19, 16165879],
3197                [20, 16165880],
3198                [21, 16165881],
3199                [22, 16165882],
3200                [23, 16165883],
3201                [24, 16165884],
3202                [25, 16165885],
3203                [26, 16165886],
3204                [27, 16165887],
3205                [28, 16165888],
3206                [29, 16165889],
3207                [30, 16165890],
3208                [31, 16165891],
3209                [32, 16165892],
3210                [33, 16165893],
3211                [34, 16165894],
3212                [35, 16165895],
3213                [36, 16165896],
3214                [37, 16165897],
3215                [38, 16165898],
3216                [39, 16165899],
3217                [40, 16165900]
3218            ]
3219        );
3220        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3221        assert_eq!(
3222            pairs,
3223            vec![
3224                [0, 16180871],
3225                [1, 16180872],
3226                [2, 16180873],
3227                [3, 16180874],
3228                [4, 16180875],
3229                [5, 16180876],
3230                [6, 16180877],
3231                [7, 16180878],
3232                [8, 16180879],
3233                [9, 16180880],
3234                [10, 16180881],
3235                [11, 16180882],
3236                [12, 16180883],
3237                [13, 16180884],
3238                [14, 16180885],
3239                [15, 16180886],
3240                [16, 16180887],
3241                [17, 16180888],
3242                [18, 16180889],
3243                [19, 16180890],
3244                [20, 16180891],
3245                [21, 16180892],
3246                [22, 16180893],
3247                [23, 16180894],
3248                [24, 16180895],
3249                [25, 16180896],
3250                [26, 16180897],
3251                [27, 16180898],
3252                [28, 16180899],
3253                [29, 16180900],
3254                [30, 16180901],
3255                [31, 16180902],
3256                [32, 16180903],
3257                [33, 16180904],
3258                [34, 16180905],
3259                [35, 16180906],
3260                [36, 16180907],
3261                [37, 16180908],
3262                [38, 16180909],
3263                [39, 16180910],
3264                [40, 16180911],
3265                [41, 16180912],
3266                [42, 16180913],
3267                [43, 16180914],
3268                [44, 16180915],
3269                [45, 16180916],
3270                [46, 16180917],
3271                [47, 16180918],
3272                [48, 16180919],
3273                [49, 16180920],
3274                [50, 16180921]
3275            ]
3276        );
3277        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3278        assert_eq!(
3279            pairs,
3280            vec![
3281                [0, 16189705],
3282                [1, 16189706],
3283                [2, 16189707],
3284                [3, 16189708],
3285                [4, 16189709],
3286                [5, 16189710],
3287                [6, 16189711],
3288                [7, 16189712],
3289                [8, 16189713],
3290                [9, 16189714],
3291                [10, 16189715],
3292                [11, 16189716],
3293                [12, 16189717],
3294                [13, 16189718],
3295                [14, 16189719],
3296                [15, 16189720],
3297                [16, 16189721],
3298                [17, 16189722],
3299                [18, 16189723],
3300                [19, 16189724],
3301                [20, 16189725],
3302                [21, 16189726],
3303                [22, 16189727],
3304                [23, 16189728],
3305                [24, 16189729],
3306                [25, 16189730],
3307                [26, 16189731],
3308                [27, 16189732],
3309                [28, 16189733],
3310                [29, 16189734],
3311                [30, 16189735],
3312                [31, 16189736],
3313                [32, 16189737],
3314                [33, 16189738],
3315                [34, 16189739],
3316                [35, 16189740],
3317                [36, 16189741],
3318                [37, 16189742],
3319                [38, 16189743],
3320                [39, 16189744],
3321                [40, 16189745],
3322                [41, 16189746],
3323                [42, 16189747],
3324                [43, 16189748],
3325                [44, 16189749],
3326                [45, 16189750],
3327                [46, 16189751],
3328                [47, 16189752],
3329                [48, 16189753],
3330                [49, 16189754],
3331                [50, 16189755]
3332            ]
3333        );
3334        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3335        assert_eq!(
3336            pairs,
3337            vec![
3338                [0, 16231271],
3339                [1, 16231272],
3340                [2, 16231273],
3341                [3, 16231274],
3342                [4, 16231275],
3343                [5, 16231276],
3344                [6, 16231277],
3345                [7, 16231278],
3346                [8, 16231279],
3347                [9, 16231280],
3348                [10, 16231281],
3349                [11, 16231282],
3350                [12, 16231283],
3351                [13, 16231284],
3352                [14, 16231285],
3353                [15, 16231286],
3354                [16, 16231287],
3355                [17, 16231288],
3356                [18, 16231289],
3357                [19, 16231290],
3358                [20, 16231291],
3359                [21, 16231292],
3360                [22, 16231293],
3361                [23, 16231294],
3362                [24, 16231295],
3363                [25, 16231296],
3364                [26, 16231297],
3365                [27, 16231298],
3366                [28, 16231299],
3367                [29, 16231300],
3368                [30, 16231301],
3369                [31, 16231302],
3370                [32, 16231303],
3371                [33, 16231304],
3372                [34, 16231305],
3373                [35, 16231306],
3374                [36, 16231307],
3375                [37, 16231308],
3376                [38, 16231309],
3377                [39, 16231310],
3378                [40, 16231311],
3379                [41, 16231312],
3380                [42, 16231313],
3381                [43, 16231314],
3382                [44, 16231315],
3383                [45, 16231316],
3384                [46, 16231317],
3385                [47, 16231318],
3386                [48, 16231319],
3387                [49, 16231320],
3388                [50, 16231321]
3389            ]
3390        );
3391        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3392        assert_eq!(
3393            pairs,
3394            vec![
3395                [0, 16237657],
3396                [1, 16237658],
3397                [2, 16237659],
3398                [3, 16237660],
3399                [4, 16237661],
3400                [5, 16237662],
3401                [6, 16237663],
3402                [7, 16237664],
3403                [8, 16237665],
3404                [9, 16237666],
3405                [10, 16237667],
3406                [11, 16237668],
3407                [12, 16237669],
3408                [13, 16237670],
3409                [14, 16237671],
3410                [15, 16237672],
3411                [16, 16237673],
3412                [17, 16237674],
3413                [18, 16237675],
3414                [19, 16237676],
3415                [20, 16237677],
3416                [21, 16237678],
3417                [22, 16237679],
3418                [23, 16237680],
3419                [24, 16237681],
3420                [25, 16237682],
3421                [26, 16237683],
3422                [27, 16237684],
3423                [28, 16237685],
3424                [29, 16237686],
3425                [30, 16237687],
3426                [31, 16237688],
3427                [32, 16237689],
3428                [33, 16237690],
3429                [34, 16237691],
3430                [35, 16237692],
3431                [36, 16237693],
3432                [37, 16237694],
3433                [38, 16237695],
3434                [39, 16237696],
3435                [40, 16237697],
3436                [41, 16237698],
3437                [42, 16237699],
3438                [43, 16237700],
3439                [44, 16237701],
3440                [45, 16237702],
3441                [46, 16237703],
3442                [47, 16237704],
3443                [48, 16237705],
3444                [49, 16237706],
3445                [50, 16237707]
3446            ]
3447        );
3448        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3449        assert_eq!(
3450            pairs,
3451            vec![
3452                [9, 16255012],
3453                [10, 16255013],
3454                [11, 16255014],
3455                [12, 16255015],
3456                [13, 16255016],
3457                [14, 16255017],
3458                [15, 16255018],
3459                [16, 16255019],
3460                [17, 16255020],
3461                [18, 16255021],
3462                [19, 16255022],
3463                [20, 16255023],
3464                [21, 16255024],
3465                [22, 16255025],
3466                [23, 16255026],
3467                [24, 16255027],
3468                [25, 16255028],
3469                [26, 16255029],
3470                [27, 16255030],
3471                [28, 16255031],
3472                [29, 16255032],
3473                [30, 16255033],
3474                [31, 16255034],
3475                [32, 16255035],
3476                [33, 16255036],
3477                [34, 16255037],
3478                [35, 16255038],
3479                [36, 16255039],
3480                [37, 16255040],
3481                [38, 16255041],
3482                [39, 16255042],
3483                [40, 16255043],
3484                [41, 16255044],
3485                [42, 16255045],
3486                [43, 16255046],
3487                [44, 16255047],
3488                [45, 16255048],
3489                [46, 16255049],
3490                [47, 16255050],
3491                [48, 16255051],
3492                [49, 16255052],
3493                [50, 16255053]
3494            ]
3495        );
3496        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3497        assert_eq!(
3498            pairs,
3499            vec![
3500                [0, 16255391],
3501                [1, 16255392],
3502                [2, 16255393],
3503                [3, 16255394],
3504                [4, 16255395],
3505                [5, 16255396],
3506                [6, 16255397],
3507                [7, 16255398],
3508                [8, 16255399],
3509                [9, 16255400],
3510                [10, 16255401],
3511                [11, 16255402],
3512                [12, 16255403],
3513                [13, 16255404],
3514                [14, 16255405],
3515                [15, 16255406],
3516                [16, 16255407],
3517                [17, 16255408],
3518                [18, 16255409],
3519                [19, 16255410],
3520                [20, 16255411],
3521                [21, 16255412],
3522                [22, 16255413],
3523                [23, 16255414],
3524                [24, 16255415],
3525                [25, 16255416],
3526                [26, 16255417],
3527                [27, 16255418],
3528                [28, 16255419],
3529                [29, 16255420],
3530                [30, 16255421],
3531                [31, 16255422],
3532                [32, 16255423],
3533                [33, 16255424],
3534                [34, 16255425],
3535                [35, 16255426],
3536                [36, 16255427],
3537                [37, 16255428],
3538                [38, 16255429],
3539                [39, 16255430],
3540                [40, 16255431],
3541                [41, 16255432],
3542                [42, 16255433],
3543                [43, 16255434],
3544                [44, 16255435],
3545                [45, 16255436],
3546                [46, 16255437],
3547                [47, 16255438],
3548                [48, 16255439],
3549                [49, 16255440],
3550                [50, 16255441]
3551            ]
3552        );
3553        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3554        assert_eq!(
3555            pairs,
3556            vec![
3557                [0, 16255392],
3558                [1, 16255393],
3559                [2, 16255394],
3560                [3, 16255395],
3561                [4, 16255396],
3562                [5, 16255397],
3563                [6, 16255398],
3564                [7, 16255399],
3565                [8, 16255400],
3566                [9, 16255401],
3567                [10, 16255402],
3568                [11, 16255403],
3569                [12, 16255404],
3570                [13, 16255405],
3571                [14, 16255406],
3572                [15, 16255407],
3573                [16, 16255408],
3574                [17, 16255409],
3575                [18, 16255410],
3576                [19, 16255411],
3577                [20, 16255412],
3578                [21, 16255413],
3579                [22, 16255414],
3580                [23, 16255415],
3581                [24, 16255416],
3582                [25, 16255417],
3583                [26, 16255418],
3584                [27, 16255419],
3585                [28, 16255420],
3586                [29, 16255421],
3587                [30, 16255422],
3588                [31, 16255423],
3589                [32, 16255424],
3590                [33, 16255425],
3591                [34, 16255426],
3592                [35, 16255427],
3593                [36, 16255428],
3594                [37, 16255429],
3595                [38, 16255430],
3596                [39, 16255431],
3597                [40, 16255432],
3598                [41, 16255433],
3599                [42, 16255434],
3600                [43, 16255435],
3601                [44, 16255436],
3602                [45, 16255437],
3603                [46, 16255438],
3604                [47, 16255439],
3605                [48, 16255440],
3606                [49, 16255441]
3607            ]
3608        );
3609        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3610        assert_eq!(
3611            pairs,
3612            vec![
3613                [0, 16256084],
3614                [1, 16256085],
3615                [2, 16256086],
3616                [3, 16256087],
3617                [4, 16256088],
3618                [5, 16256089],
3619                [6, 16256090],
3620                [7, 16256091],
3621                [8, 16256092],
3622                [9, 16256093],
3623                [10, 16256094],
3624                [11, 16256095],
3625                [12, 16256096],
3626                [13, 16256097],
3627                [14, 16256098],
3628                [15, 16256099],
3629                [16, 16256100],
3630                [17, 16256101],
3631                [18, 16256102],
3632                [19, 16256103],
3633                [20, 16256104],
3634                [21, 16256105],
3635                [22, 16256106],
3636                [23, 16256107],
3637                [24, 16256108],
3638                [25, 16256109],
3639                [26, 16256110],
3640                [27, 16256111],
3641                [28, 16256112],
3642                [29, 16256113],
3643                [30, 16256114],
3644                [31, 16256115],
3645                [32, 16256116],
3646                [33, 16256117],
3647                [34, 16256118],
3648                [35, 16256119],
3649                [36, 16256120],
3650                [37, 16256121],
3651                [38, 16256122],
3652                [39, 16256123],
3653                [40, 16256124],
3654                [41, 16256125],
3655                [42, 16256126],
3656                [43, 16256127],
3657                [44, 16256128]
3658            ]
3659        );
3660        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3661        assert_eq!(
3662            pairs,
3663            vec![
3664                [3, 16256224],
3665                [4, 16256225],
3666                [5, 16256226],
3667                [6, 16256227],
3668                [7, 16256228],
3669                [8, 16256229],
3670                [9, 16256230],
3671                [10, 16256231],
3672                [11, 16256232],
3673                [12, 16256233],
3674                [13, 16256234],
3675                [14, 16256235],
3676                [15, 16256236],
3677                [16, 16256237],
3678                [17, 16256238],
3679                [18, 16256239],
3680                [19, 16256240],
3681                [20, 16256241],
3682                [21, 16256242],
3683                [22, 16256243],
3684                [23, 16256244],
3685                [24, 16256245],
3686                [25, 16256246],
3687                [26, 16256247],
3688                [27, 16256248],
3689                [28, 16256249],
3690                [29, 16256250],
3691                [30, 16256251],
3692                [31, 16256252],
3693                [32, 16256253],
3694                [33, 16256254],
3695                [34, 16256255],
3696                [35, 16256256],
3697                [36, 16256257],
3698                [37, 16256258],
3699                [38, 16256259],
3700                [39, 16256260],
3701                [40, 16256261],
3702                [41, 16256262],
3703                [42, 16256263],
3704                [43, 16256264],
3705                [44, 16256265],
3706                [45, 16256266],
3707                [46, 16256267],
3708                [47, 16256268],
3709                [48, 16256269],
3710                [49, 16256270],
3711                [50, 16256271]
3712            ]
3713        );
3714        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3715        assert_eq!(
3716            pairs,
3717            vec![
3718                [0, 16325199],
3719                [1, 16325200],
3720                [2, 16325201],
3721                [3, 16325202],
3722                [4, 16325203],
3723                [5, 16325204],
3724                [6, 16325205],
3725                [7, 16325206],
3726                [8, 16325207],
3727                [9, 16325208],
3728                [10, 16325209],
3729                [11, 16325210],
3730                [12, 16325211],
3731                [13, 16325212],
3732                [14, 16325213],
3733                [15, 16325214],
3734                [16, 16325215],
3735                [17, 16325216],
3736                [18, 16325217],
3737                [19, 16325218],
3738                [20, 16325219],
3739                [21, 16325220],
3740                [22, 16325221],
3741                [23, 16325222],
3742                [24, 16325223],
3743                [25, 16325224],
3744                [26, 16325225],
3745                [27, 16325226],
3746                [28, 16325227],
3747                [29, 16325228],
3748                [30, 16325229],
3749                [31, 16325230],
3750                [32, 16325231],
3751                [33, 16325232],
3752                [34, 16325233],
3753                [35, 16325234],
3754                [36, 16325235],
3755                [37, 16325236],
3756                [38, 16325237],
3757                [39, 16325238],
3758                [40, 16325239],
3759                [41, 16325240]
3760            ]
3761        );
3762        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3763        assert_eq!(
3764            pairs,
3765            vec![
3766                [13, 16352865],
3767                [14, 16352866],
3768                [15, 16352867],
3769                [16, 16352868],
3770                [17, 16352869],
3771                [18, 16352870],
3772                [19, 16352871],
3773                [20, 16352872],
3774                [21, 16352873],
3775                [22, 16352874],
3776                [23, 16352875],
3777                [24, 16352876],
3778                [25, 16352877],
3779                [26, 16352878],
3780                [27, 16352879],
3781                [28, 16352880],
3782                [29, 16352881],
3783                [30, 16352882],
3784                [31, 16352883],
3785                [32, 16352884],
3786                [33, 16352885],
3787                [34, 16352886],
3788                [35, 16352887],
3789                [36, 16352888],
3790                [37, 16352889],
3791                [38, 16352890],
3792                [39, 16352891],
3793                [40, 16352892],
3794                [41, 16352893],
3795                [42, 16352894],
3796                [43, 16352895],
3797                [44, 16352896],
3798                [45, 16352897],
3799                [46, 16352898],
3800                [47, 16352899],
3801                [48, 16352900],
3802                [49, 16352901],
3803                [50, 16352902]
3804            ]
3805        );
3806        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3807        assert_eq!(
3808            pairs,
3809            vec![
3810                [0, 16352968],
3811                [1, 16352969],
3812                [2, 16352970],
3813                [3, 16352971],
3814                [4, 16352972],
3815                [5, 16352973],
3816                [6, 16352974],
3817                [7, 16352975],
3818                [8, 16352976],
3819                [9, 16352977],
3820                [10, 16352978],
3821                [11, 16352979],
3822                [12, 16352980],
3823                [13, 16352981],
3824                [14, 16352982],
3825                [15, 16352983],
3826                [16, 16352984],
3827                [17, 16352985],
3828                [18, 16352986],
3829                [19, 16352987],
3830                [20, 16352988],
3831                [21, 16352989],
3832                [22, 16352990],
3833                [23, 16352991],
3834                [24, 16352992],
3835                [25, 16352993],
3836                [26, 16352994],
3837                [27, 16352995],
3838                [28, 16352996],
3839                [29, 16352997],
3840                [30, 16352998],
3841                [31, 16352999],
3842                [32, 16353000],
3843                [33, 16353001],
3844                [34, 16353002],
3845                [35, 16353003],
3846                [36, 16353004],
3847                [37, 16353005],
3848                [38, 16353006],
3849                [39, 16353007],
3850                [40, 16353008],
3851                [41, 16353009],
3852                [42, 16353010],
3853                [43, 16353011]
3854            ]
3855        );
3856        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3857        assert_eq!(
3858            pairs,
3859            vec![
3860                [5, 16414998],
3861                [6, 16414999],
3862                [7, 16415000],
3863                [8, 16415001],
3864                [9, 16415002],
3865                [10, 16415003],
3866                [11, 16415004],
3867                [12, 16415005],
3868                [13, 16415006],
3869                [14, 16415007],
3870                [15, 16415008],
3871                [16, 16415009],
3872                [17, 16415010],
3873                [18, 16415011],
3874                [19, 16415012],
3875                [20, 16415013],
3876                [21, 16415014],
3877                [22, 16415015],
3878                [23, 16415016],
3879                [24, 16415017],
3880                [25, 16415018],
3881                [26, 16415019],
3882                [27, 16415020],
3883                [28, 16415021],
3884                [29, 16415022],
3885                [30, 16415023],
3886                [31, 16415024],
3887                [32, 16415025],
3888                [33, 16415026],
3889                [34, 16415027],
3890                [35, 16415028],
3891                [36, 16415029],
3892                [37, 16415030],
3893                [38, 16415031],
3894                [39, 16415032],
3895                [40, 16415033],
3896                [41, 16415034],
3897                [42, 16415035],
3898                [43, 16415036],
3899                [44, 16415037],
3900                [45, 16415038],
3901                [46, 16415039],
3902                [47, 16415040],
3903                [48, 16415041],
3904                [49, 16415042],
3905                [50, 16415043]
3906            ]
3907        );
3908        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3909        assert_eq!(
3910            pairs,
3911            vec![
3912                [0, 17031591],
3913                [1, 17031592],
3914                [2, 17031593],
3915                [3, 17031594],
3916                [4, 17031595],
3917                [5, 17031596],
3918                [6, 17031597],
3919                [7, 17031598],
3920                [8, 17031599],
3921                [9, 17031600],
3922                [10, 17031601],
3923                [11, 17031602],
3924                [12, 17031603],
3925                [13, 17031604],
3926                [14, 17031605],
3927                [15, 17031606],
3928                [16, 17031607],
3929                [17, 17031608],
3930                [18, 17031609],
3931                [19, 17031610],
3932                [20, 17031611],
3933                [21, 17031612],
3934                [22, 17031613],
3935                [27, 17031614],
3936                [28, 17031615],
3937                [29, 17031616],
3938                [30, 17031617],
3939                [31, 17031618],
3940                [32, 17031619],
3941                [33, 17031620],
3942                [34, 17031621],
3943                [35, 17031622],
3944                [36, 17031623],
3945                [37, 17031624],
3946                [38, 17031625],
3947                [39, 17031626],
3948                [40, 17031627],
3949                [41, 17031628],
3950                [42, 17031629],
3951                [43, 17031630],
3952                [44, 17031631],
3953                [45, 17031632],
3954                [46, 17031633],
3955                [47, 17031634],
3956                [48, 17031635],
3957                [49, 17031636],
3958                [50, 17031637]
3959            ]
3960        );
3961        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
3962        assert_eq!(
3963            pairs,
3964            vec![
3965                [0, 17057382],
3966                [1, 17057383],
3967                [2, 17057384],
3968                [3, 17057385],
3969                [4, 17057386],
3970                [5, 17057387],
3971                [6, 17057388],
3972                [7, 17057389],
3973                [8, 17057390],
3974                [9, 17057391],
3975                [10, 17057392],
3976                [11, 17057393],
3977                [12, 17057394],
3978                [13, 17057395],
3979                [14, 17057396],
3980                [15, 17057397],
3981                [16, 17057398],
3982                [17, 17057399],
3983                [19, 17057400],
3984                [20, 17057401],
3985                [21, 17057402],
3986                [22, 17057403],
3987                [23, 17057404],
3988                [24, 17057405],
3989                [25, 17057406],
3990                [26, 17057407],
3991                [27, 17057408],
3992                [28, 17057409],
3993                [29, 17057410],
3994                [30, 17057411],
3995                [31, 17057412],
3996                [32, 17057413],
3997                [33, 17057414],
3998                [34, 17057415],
3999                [35, 17057416],
4000                [36, 17057417],
4001                [37, 17057418],
4002                [38, 17057419],
4003                [39, 17057420],
4004                [40, 17057421],
4005                [41, 17057422],
4006                [42, 17057423],
4007                [43, 17057424],
4008                [44, 17057425],
4009                [45, 17057426],
4010                [46, 17057427],
4011                [47, 17057428],
4012                [48, 17057429],
4013                [49, 17057430],
4014                [50, 17057431]
4015            ]
4016        );
4017        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4018        assert_eq!(
4019            pairs,
4020            vec![
4021                [0, 17092766],
4022                [1, 17092767],
4023                [2, 17092768],
4024                [3, 17092769],
4025                [4, 17092770],
4026                [5, 17092771],
4027                [6, 17092772],
4028                [7, 17092773],
4029                [8, 17092774],
4030                [9, 17092775],
4031                [10, 17092776],
4032                [11, 17092777],
4033                [12, 17092778],
4034                [13, 17092779],
4035                [14, 17092780],
4036                [15, 17092781],
4037                [16, 17092782],
4038                [17, 17094966],
4039                [18, 17094967],
4040                [19, 17094968],
4041                [20, 17094969],
4042                [21, 17094970],
4043                [22, 17094971],
4044                [23, 17094972],
4045                [24, 17094973],
4046                [25, 17094974],
4047                [26, 17094975],
4048                [27, 17094976],
4049                [28, 17094977],
4050                [29, 17094978],
4051                [30, 17094979],
4052                [31, 17094980],
4053                [32, 17094981],
4054                [33, 17094982],
4055                [34, 17094983],
4056                [35, 17094984],
4057                [36, 17094985],
4058                [37, 17094986],
4059                [38, 17094987],
4060                [39, 17094988],
4061                [40, 17094989],
4062                [41, 17094990],
4063                [42, 17094991],
4064                [43, 17094992],
4065                [44, 17094993],
4066                [45, 17094994],
4067                [46, 17094995],
4068                [47, 17094996],
4069                [48, 17094997],
4070                [49, 17094998],
4071                [50, 17094999]
4072            ]
4073        );
4074        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4075        assert_eq!(
4076            pairs,
4077            vec![
4078                [0, 17092782],
4079                [1, 17094966],
4080                [2, 17094967],
4081                [3, 17094968],
4082                [4, 17094969],
4083                [5, 17094970],
4084                [6, 17094971],
4085                [7, 17094972],
4086                [8, 17094973],
4087                [9, 17094974],
4088                [10, 17094975],
4089                [11, 17094976],
4090                [12, 17094977],
4091                [13, 17094978],
4092                [14, 17094979],
4093                [15, 17094980],
4094                [16, 17094981],
4095                [17, 17094982],
4096                [18, 17094983],
4097                [19, 17094984],
4098                [20, 17094985],
4099                [21, 17094986],
4100                [22, 17094987],
4101                [23, 17094988],
4102                [24, 17094989],
4103                [25, 17094990],
4104                [26, 17094991],
4105                [27, 17094992],
4106                [28, 17094993],
4107                [29, 17094994],
4108                [30, 17094995],
4109                [31, 17094996],
4110                [32, 17094997],
4111                [33, 17094998],
4112                [34, 17094999],
4113                [35, 17095000],
4114                [36, 17095001],
4115                [37, 17095002],
4116                [38, 17095003],
4117                [39, 17095004],
4118                [40, 17095005],
4119                [41, 17095006],
4120                [42, 17095007],
4121                [43, 17095008],
4122                [44, 17095009],
4123                [45, 17095010],
4124                [46, 17095011],
4125                [47, 17095012],
4126                [48, 17095013],
4127                [49, 17095014],
4128                [50, 17095015]
4129            ]
4130        );
4131        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4132        assert_eq!(
4133            pairs,
4134            vec![
4135                [0, 17092782],
4136                [1, 17094966],
4137                [2, 17094967],
4138                [3, 17094968],
4139                [4, 17094969],
4140                [5, 17094970],
4141                [6, 17094971],
4142                [7, 17094972],
4143                [8, 17094973],
4144                [9, 17094974],
4145                [10, 17094975],
4146                [11, 17094976],
4147                [12, 17094977],
4148                [13, 17094978],
4149                [14, 17094979],
4150                [15, 17094980],
4151                [16, 17094981],
4152                [17, 17094982],
4153                [18, 17094983],
4154                [19, 17094984],
4155                [20, 17094985],
4156                [21, 17094986],
4157                [22, 17094987],
4158                [23, 17094988],
4159                [24, 17094989],
4160                [25, 17094990],
4161                [26, 17094991],
4162                [27, 17094992],
4163                [28, 17094993],
4164                [29, 17094994],
4165                [30, 17094995],
4166                [31, 17094996],
4167                [32, 17094997],
4168                [33, 17094998],
4169                [34, 17094999],
4170                [35, 17095000],
4171                [36, 17095001],
4172                [37, 17095002],
4173                [38, 17095003],
4174                [39, 17095004],
4175                [40, 17095005],
4176                [41, 17095006],
4177                [42, 17095007],
4178                [43, 17095008],
4179                [44, 17095009],
4180                [45, 17095010],
4181                [46, 17095011],
4182                [47, 17095012],
4183                [48, 17095013],
4184                [49, 17095014],
4185                [50, 17095015]
4186            ]
4187        );
4188        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4189        assert_eq!(
4190            pairs,
4191            vec![
4192                [9, 17137287],
4193                [10, 17137288],
4194                [11, 17137289],
4195                [12, 17137290],
4196                [13, 17137291],
4197                [14, 17137292],
4198                [15, 17137293],
4199                [16, 17137294],
4200                [17, 17137295],
4201                [18, 17137296],
4202                [19, 17137297],
4203                [20, 17137298],
4204                [21, 17137299],
4205                [22, 17137300],
4206                [23, 17137301],
4207                [24, 17137302],
4208                [25, 17137303],
4209                [26, 17137304],
4210                [27, 17137305],
4211                [28, 17137306],
4212                [29, 17137307],
4213                [30, 17137308],
4214                [31, 17137309],
4215                [32, 17137310],
4216                [33, 17137311],
4217                [34, 17137312],
4218                [35, 17137313],
4219                [36, 17137314],
4220                [37, 17137315],
4221                [38, 17137316],
4222                [39, 17137317],
4223                [40, 17137318],
4224                [41, 17137319]
4225            ]
4226        );
4227        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4228        assert_eq!(
4229            pairs,
4230            vec![
4231                [2, 17306238],
4232                [3, 17306239],
4233                [4, 17306240],
4234                [5, 17306241],
4235                [6, 17306242],
4236                [7, 17306243],
4237                [8, 17306244],
4238                [9, 17306245],
4239                [10, 17306246],
4240                [11, 17306247],
4241                [12, 17306248],
4242                [13, 17306249],
4243                [14, 17306250],
4244                [15, 17306251],
4245                [16, 17306252],
4246                [17, 17306253],
4247                [18, 17306254],
4248                [19, 17306255],
4249                [20, 17306256],
4250                [21, 17306257],
4251                [22, 17306258],
4252                [23, 17306259],
4253                [24, 17306260],
4254                [25, 17306261],
4255                [26, 17306262],
4256                [27, 17306263],
4257                [28, 17306264],
4258                [29, 17306265],
4259                [30, 17306266],
4260                [31, 17306267],
4261                [32, 17306268],
4262                [33, 17306269],
4263                [34, 17306270],
4264                [35, 17306271],
4265                [36, 17306272],
4266                [37, 17306273],
4267                [38, 17306274],
4268                [39, 17306275],
4269                [40, 17306276],
4270                [41, 17306277],
4271                [42, 17306278],
4272                [43, 17306279],
4273                [44, 17306280],
4274                [45, 17306281],
4275                [46, 17306282],
4276                [47, 17306283],
4277                [48, 17306284],
4278                [49, 17306285]
4279            ]
4280        );
4281        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4282        assert_eq!(
4283            pairs,
4284            vec![
4285                [4, 17561868],
4286                [5, 17561869],
4287                [6, 17561870],
4288                [7, 17561871],
4289                [8, 17561872],
4290                [9, 17561873],
4291                [10, 17561874],
4292                [11, 17561875],
4293                [12, 17561876],
4294                [13, 17561877],
4295                [14, 17561878],
4296                [15, 17561879],
4297                [16, 17561880],
4298                [17, 17561881],
4299                [18, 17561882],
4300                [19, 17561883],
4301                [20, 17561884],
4302                [21, 17561885],
4303                [22, 17561886],
4304                [23, 17561887],
4305                [24, 17561888],
4306                [25, 17561889],
4307                [26, 17561890],
4308                [27, 17561891],
4309                [28, 17561892],
4310                [29, 17561893],
4311                [30, 17561894],
4312                [31, 17561895],
4313                [32, 17561896],
4314                [33, 17561897],
4315                [34, 17561898],
4316                [35, 17561899],
4317                [36, 17561900],
4318                [37, 17561901],
4319                [38, 17561902],
4320                [39, 17561903],
4321                [40, 17561904],
4322                [41, 17561905],
4323                [42, 17561906],
4324                [43, 17561907],
4325                [44, 17561908],
4326                [45, 17561909],
4327                [46, 17561910],
4328                [47, 17561911],
4329                [48, 17561912]
4330            ]
4331        );
4332        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4333        assert_eq!(
4334            pairs,
4335            vec![
4336                [0, 17566078],
4337                [1, 17566079],
4338                [2, 17566080],
4339                [3, 17566081],
4340                [4, 17566082],
4341                [5, 17566083],
4342                [6, 17566084],
4343                [7, 17566085],
4344                [8, 17566086],
4345                [9, 17566087],
4346                [10, 17566088],
4347                [11, 17566089],
4348                [12, 17566090],
4349                [13, 17566091],
4350                [14, 17566092],
4351                [15, 17566093],
4352                [16, 17566094],
4353                [17, 17566095],
4354                [18, 17566096],
4355                [19, 17566097],
4356                [20, 17566098],
4357                [21, 17566099],
4358                [22, 17566100],
4359                [23, 17566101],
4360                [24, 17566102],
4361                [25, 17566103],
4362                [26, 17566104],
4363                [27, 17566105],
4364                [28, 17566106],
4365                [29, 17566107],
4366                [30, 17566108],
4367                [31, 17566109],
4368                [32, 17566110],
4369                [33, 17566111],
4370                [34, 17566112],
4371                [35, 17566113],
4372                [36, 17566114],
4373                [37, 17566115],
4374                [38, 17566116],
4375                [39, 17566117],
4376                [40, 17566118],
4377                [41, 17577951],
4378                [42, 17577952],
4379                [43, 17577953],
4380                [44, 17577954],
4381                [45, 17577955],
4382                [46, 17577956],
4383                [47, 17577957],
4384                [48, 17577958],
4385                [49, 17577959],
4386                [50, 17577960]
4387            ]
4388        );
4389        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4390        assert_eq!(
4391            pairs,
4392            vec![
4393                [0, 17566108],
4394                [1, 17566109],
4395                [2, 17566110],
4396                [3, 17566111],
4397                [4, 17566112],
4398                [5, 17566113],
4399                [6, 17566114],
4400                [7, 17566115],
4401                [8, 17566116],
4402                [9, 17566117],
4403                [10, 17566118],
4404                [11, 17577951],
4405                [12, 17577952],
4406                [13, 17577953],
4407                [14, 17577954],
4408                [15, 17577955],
4409                [16, 17577956],
4410                [17, 17577957],
4411                [18, 17577958],
4412                [19, 17577959],
4413                [20, 17577960],
4414                [21, 17577961],
4415                [22, 17577962],
4416                [23, 17577963],
4417                [24, 17577964],
4418                [25, 17577965],
4419                [26, 17577966],
4420                [27, 17577967],
4421                [28, 17577968],
4422                [29, 17577969],
4423                [30, 17577970],
4424                [31, 17577971],
4425                [32, 17577972],
4426                [33, 17577973],
4427                [34, 17577974],
4428                [35, 17577975],
4429                [36, 17578686],
4430                [37, 17578687],
4431                [38, 17578688],
4432                [39, 17578689],
4433                [40, 17578690],
4434                [41, 17578691],
4435                [42, 17578692],
4436                [43, 17578693],
4437                [44, 17578694],
4438                [45, 17578695],
4439                [46, 17578696],
4440                [47, 17578697],
4441                [48, 17578698],
4442                [49, 17578699],
4443                [50, 17578700]
4444            ]
4445        );
4446        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4447        assert_eq!(
4448            pairs,
4449            vec![
4450                [0, 17566111],
4451                [1, 17566112],
4452                [2, 17566113],
4453                [3, 17566114],
4454                [4, 17566115],
4455                [5, 17566116],
4456                [6, 17566117],
4457                [7, 17566118],
4458                [8, 17577951],
4459                [9, 17577952],
4460                [10, 17577953],
4461                [11, 17577954],
4462                [12, 17577955],
4463                [13, 17577956],
4464                [14, 17577957],
4465                [15, 17577958],
4466                [16, 17577959],
4467                [17, 17577960],
4468                [18, 17577961],
4469                [19, 17577962],
4470                [20, 17577963],
4471                [21, 17577964],
4472                [22, 17577965],
4473                [23, 17577966],
4474                [24, 17577967],
4475                [25, 17577968],
4476                [26, 17577969],
4477                [27, 17577970],
4478                [28, 17577971],
4479                [29, 17577972],
4480                [30, 17577973],
4481                [31, 17577974],
4482                [32, 17577975],
4483                [33, 17578686],
4484                [34, 17578687],
4485                [35, 17578688],
4486                [36, 17578689],
4487                [37, 17578690],
4488                [38, 17578691],
4489                [39, 17578692],
4490                [40, 17578693],
4491                [41, 17578694],
4492                [42, 17578695],
4493                [43, 17578696],
4494                [44, 17578697],
4495                [45, 17578698],
4496                [46, 17578699],
4497                [47, 17578700],
4498                [48, 17578701],
4499                [49, 17578702],
4500                [50, 17578703]
4501            ]
4502        );
4503        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4504        assert_eq!(
4505            pairs,
4506            vec![
4507                [0, 17566111],
4508                [1, 17566112],
4509                [2, 17566113],
4510                [3, 17566114],
4511                [4, 17566115],
4512                [5, 17566116],
4513                [6, 17566117],
4514                [7, 17566118],
4515                [8, 17577951],
4516                [9, 17577952],
4517                [10, 17577953],
4518                [11, 17577954],
4519                [12, 17577955],
4520                [13, 17577956],
4521                [14, 17577957],
4522                [15, 17577958],
4523                [16, 17577959],
4524                [17, 17577960],
4525                [18, 17577961],
4526                [19, 17577962],
4527                [20, 17577963],
4528                [21, 17577964],
4529                [22, 17577965],
4530                [23, 17577966],
4531                [24, 17577967],
4532                [25, 17577968],
4533                [26, 17577969],
4534                [27, 17577970],
4535                [28, 17577971],
4536                [29, 17577972],
4537                [30, 17577973],
4538                [31, 17577974],
4539                [32, 17577975],
4540                [33, 17578686],
4541                [34, 17578687],
4542                [35, 17578688],
4543                [36, 17578689],
4544                [37, 17578690],
4545                [38, 17578691],
4546                [39, 17578692],
4547                [40, 17578693],
4548                [41, 17578694],
4549                [42, 17578695],
4550                [43, 17578696],
4551                [44, 17578697],
4552                [45, 17578698],
4553                [46, 17578699],
4554                [47, 17578700],
4555                [48, 17578701],
4556                [49, 17578702],
4557                [50, 17578703]
4558            ]
4559        );
4560        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4561        assert_eq!(
4562            pairs,
4563            vec![
4564                [0, 17566111],
4565                [1, 17566112],
4566                [2, 17566113],
4567                [3, 17566114],
4568                [4, 17566115],
4569                [5, 17566116],
4570                [6, 17566117],
4571                [7, 17566118],
4572                [8, 17577951],
4573                [9, 17577952],
4574                [10, 17577953],
4575                [11, 17577954],
4576                [12, 17577955],
4577                [13, 17577956],
4578                [14, 17577957],
4579                [15, 17577958],
4580                [16, 17577959],
4581                [17, 17577960],
4582                [18, 17577961],
4583                [19, 17577962],
4584                [20, 17577963],
4585                [21, 17577964],
4586                [22, 17577965],
4587                [23, 17577966],
4588                [24, 17577967],
4589                [25, 17577968],
4590                [26, 17577969],
4591                [27, 17577970],
4592                [28, 17577971],
4593                [29, 17577972],
4594                [30, 17577973],
4595                [31, 17577974],
4596                [32, 17577975],
4597                [33, 17578686],
4598                [34, 17578687],
4599                [35, 17578688],
4600                [36, 17578689],
4601                [37, 17578690],
4602                [38, 17578691],
4603                [39, 17578692],
4604                [40, 17578693],
4605                [41, 17578694],
4606                [42, 17578695],
4607                [43, 17578696],
4608                [44, 17578697],
4609                [45, 17578698],
4610                [46, 17578699],
4611                [47, 17578700],
4612                [48, 17578701],
4613                [49, 17578702],
4614                [50, 17578703]
4615            ]
4616        );
4617        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4618        assert_eq!(
4619            pairs,
4620            vec![
4621                [0, 17566111],
4622                [1, 17566112],
4623                [2, 17566113],
4624                [3, 17566114],
4625                [4, 17566115],
4626                [5, 17566116],
4627                [6, 17566117],
4628                [7, 17566118],
4629                [8, 17577951],
4630                [9, 17577952],
4631                [10, 17577953],
4632                [11, 17577954],
4633                [12, 17577955],
4634                [13, 17577956],
4635                [14, 17577957],
4636                [15, 17577958],
4637                [16, 17577959],
4638                [17, 17577960],
4639                [18, 17577961],
4640                [19, 17577962],
4641                [20, 17577963],
4642                [21, 17577964],
4643                [22, 17577965],
4644                [23, 17577966],
4645                [24, 17577967],
4646                [25, 17577968],
4647                [26, 17577969],
4648                [27, 17577970],
4649                [28, 17577971],
4650                [29, 17577972],
4651                [30, 17577973],
4652                [31, 17577974],
4653                [32, 17577975],
4654                [33, 17578686],
4655                [34, 17578687],
4656                [35, 17578688],
4657                [36, 17578689],
4658                [37, 17578690],
4659                [38, 17578691],
4660                [39, 17578692],
4661                [40, 17578693],
4662                [41, 17578694],
4663                [42, 17578695],
4664                [43, 17578696],
4665                [44, 17578697],
4666                [45, 17578698],
4667                [46, 17578699],
4668                [47, 17578700],
4669                [48, 17578701],
4670                [49, 17578702],
4671                [50, 17578703]
4672            ]
4673        );
4674        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4675        assert_eq!(
4676            pairs,
4677            vec![
4678                [0, 17566112],
4679                [1, 17566113],
4680                [2, 17566114],
4681                [3, 17566115],
4682                [4, 17566116],
4683                [5, 17566117],
4684                [6, 17566118],
4685                [7, 17577951],
4686                [8, 17577952],
4687                [9, 17577953],
4688                [10, 17577954],
4689                [11, 17577955],
4690                [12, 17577956],
4691                [13, 17577957],
4692                [14, 17577958],
4693                [15, 17577959],
4694                [16, 17577960],
4695                [17, 17577961],
4696                [18, 17577962],
4697                [19, 17577963],
4698                [20, 17577964],
4699                [21, 17577965],
4700                [22, 17577966],
4701                [23, 17577967],
4702                [24, 17577968],
4703                [25, 17577969],
4704                [26, 17577970],
4705                [27, 17577971],
4706                [28, 17577972],
4707                [29, 17577973],
4708                [30, 17577974],
4709                [31, 17577975],
4710                [32, 17578686],
4711                [33, 17578687],
4712                [34, 17578688],
4713                [35, 17578689],
4714                [36, 17578690],
4715                [37, 17578691],
4716                [38, 17578692],
4717                [39, 17578693],
4718                [40, 17578694],
4719                [41, 17578695],
4720                [42, 17578696],
4721                [43, 17578697],
4722                [44, 17578698],
4723                [45, 17578699],
4724                [46, 17578700],
4725                [47, 17578701],
4726                [48, 17578702],
4727                [49, 17578703],
4728                [50, 17578704]
4729            ]
4730        );
4731        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4732        assert_eq!(
4733            pairs,
4734            vec![
4735                [0, 17566113],
4736                [1, 17566114],
4737                [2, 17566115],
4738                [3, 17566116],
4739                [4, 17566117],
4740                [5, 17566118],
4741                [6, 17577951],
4742                [7, 17577952],
4743                [8, 17577953],
4744                [9, 17577954],
4745                [10, 17577955],
4746                [11, 17577956],
4747                [12, 17577957],
4748                [13, 17577958],
4749                [14, 17577959],
4750                [15, 17577960],
4751                [16, 17577961],
4752                [17, 17577962],
4753                [18, 17577963],
4754                [19, 17577964],
4755                [20, 17577965],
4756                [21, 17577966],
4757                [22, 17577967],
4758                [23, 17577968],
4759                [24, 17577969],
4760                [25, 17577970],
4761                [26, 17577971],
4762                [27, 17577972],
4763                [28, 17577973],
4764                [29, 17577974],
4765                [30, 17577975],
4766                [31, 17578686],
4767                [32, 17578687],
4768                [33, 17578688],
4769                [34, 17578689],
4770                [35, 17578690],
4771                [36, 17578691],
4772                [37, 17578692],
4773                [38, 17578693],
4774                [39, 17578694],
4775                [40, 17578695],
4776                [41, 17578696],
4777                [42, 17578697],
4778                [43, 17578698],
4779                [44, 17578699],
4780                [45, 17578700],
4781                [46, 17578701],
4782                [47, 17578702],
4783                [48, 17578703],
4784                [49, 17578704],
4785                [50, 17578705]
4786            ]
4787        );
4788        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4789        assert_eq!(
4790            pairs,
4791            vec![
4792                [0, 17566113],
4793                [1, 17566114],
4794                [2, 17566115],
4795                [3, 17566116],
4796                [4, 17566117],
4797                [5, 17566118],
4798                [6, 17577951],
4799                [7, 17577952],
4800                [8, 17577953],
4801                [9, 17577954],
4802                [10, 17577955],
4803                [11, 17577956],
4804                [12, 17577957],
4805                [13, 17577958],
4806                [14, 17577959],
4807                [15, 17577960],
4808                [16, 17577961],
4809                [17, 17577962],
4810                [18, 17577963],
4811                [19, 17577964],
4812                [20, 17577965],
4813                [21, 17577966],
4814                [22, 17577967],
4815                [23, 17577968],
4816                [24, 17577969],
4817                [25, 17577970],
4818                [26, 17577971],
4819                [27, 17577972],
4820                [28, 17577973],
4821                [29, 17577974],
4822                [30, 17577975],
4823                [31, 17578686],
4824                [32, 17578687],
4825                [33, 17578688],
4826                [34, 17578689],
4827                [35, 17578690],
4828                [36, 17578691],
4829                [37, 17578692],
4830                [38, 17578693],
4831                [39, 17578694],
4832                [40, 17578695],
4833                [41, 17578696],
4834                [42, 17578697],
4835                [43, 17578698],
4836                [44, 17578699],
4837                [45, 17578700],
4838                [46, 17578701],
4839                [47, 17578702],
4840                [48, 17578703],
4841                [49, 17578704],
4842                [50, 17578705]
4843            ]
4844        );
4845        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4846        assert_eq!(
4847            pairs,
4848            vec![
4849                [1, 17579733],
4850                [2, 17579734],
4851                [3, 17579735],
4852                [4, 17579736],
4853                [5, 17579737],
4854                [6, 17579738],
4855                [7, 17579739],
4856                [8, 17579740],
4857                [9, 17579741],
4858                [10, 17579742],
4859                [11, 17579743],
4860                [12, 17579744],
4861                [13, 17579745],
4862                [14, 17579746],
4863                [15, 17579747],
4864                [16, 17579748],
4865                [17, 17579749],
4866                [18, 17579750],
4867                [19, 17579751],
4868                [20, 17579752],
4869                [21, 17579753],
4870                [22, 17579754],
4871                [23, 17579755],
4872                [24, 17579756],
4873                [25, 17579757],
4874                [26, 17579758],
4875                [27, 17579759],
4876                [28, 17579760],
4877                [29, 17579761],
4878                [30, 17579762],
4879                [31, 17579763],
4880                [32, 17579764],
4881                [33, 17579765],
4882                [34, 17579766],
4883                [35, 17579767],
4884                [36, 17579768],
4885                [37, 17579769],
4886                [38, 17579770],
4887                [39, 17579771],
4888                [40, 17579772],
4889                [41, 17579773],
4890                [42, 17579774],
4891                [43, 17579775],
4892                [44, 17579776],
4893                [45, 17581244],
4894                [46, 17581245],
4895                [47, 17581246],
4896                [48, 17581247],
4897                [49, 17581248],
4898                [50, 17581249]
4899            ]
4900        );
4901        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4902        assert_eq!(
4903            pairs,
4904            vec![
4905                [0, 17581369],
4906                [1, 17581370],
4907                [2, 17582885],
4908                [3, 17582886],
4909                [4, 17582887],
4910                [5, 17582888],
4911                [6, 17582889],
4912                [7, 17582890],
4913                [8, 17582891],
4914                [9, 17582892],
4915                [10, 17582893],
4916                [11, 17582894],
4917                [12, 17582895],
4918                [13, 17582896],
4919                [14, 17582897],
4920                [15, 17582898],
4921                [16, 17582899],
4922                [17, 17582900],
4923                [18, 17582901],
4924                [19, 17582902],
4925                [20, 17582903],
4926                [21, 17582904],
4927                [22, 17582905],
4928                [23, 17582906],
4929                [24, 17582907],
4930                [25, 17582908],
4931                [26, 17582909],
4932                [27, 17582910],
4933                [28, 17582911],
4934                [29, 17582912],
4935                [30, 17582913],
4936                [31, 17582914],
4937                [32, 17582915],
4938                [33, 17582916],
4939                [34, 17582917],
4940                [35, 17582918],
4941                [36, 17582919],
4942                [37, 17582920],
4943                [38, 17582921],
4944                [39, 17582922],
4945                [40, 17582923],
4946                [41, 17582924],
4947                [42, 17582925],
4948                [43, 17582926],
4949                [44, 17582927],
4950                [45, 17582928],
4951                [46, 17582929],
4952                [47, 17582930],
4953                [48, 17582931],
4954                [49, 17582932],
4955                [50, 17583028]
4956            ]
4957        );
4958        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
4959        assert_eq!(
4960            pairs,
4961            vec![
4962                [0, 17581370],
4963                [1, 17582885],
4964                [2, 17582886],
4965                [3, 17582887],
4966                [4, 17582888],
4967                [5, 17582889],
4968                [6, 17582890],
4969                [7, 17582891],
4970                [8, 17582892],
4971                [9, 17582893],
4972                [10, 17582894],
4973                [11, 17582895],
4974                [12, 17582896],
4975                [13, 17582897],
4976                [14, 17582898],
4977                [15, 17582899],
4978                [16, 17582900],
4979                [17, 17582901],
4980                [18, 17582902],
4981                [19, 17582903],
4982                [20, 17582904],
4983                [21, 17582905],
4984                [22, 17582906],
4985                [23, 17582907],
4986                [24, 17582908],
4987                [25, 17582909],
4988                [26, 17582910],
4989                [27, 17582911],
4990                [28, 17582912],
4991                [29, 17582913],
4992                [30, 17582914],
4993                [31, 17582915],
4994                [32, 17582916],
4995                [33, 17582917],
4996                [34, 17582918],
4997                [35, 17582919],
4998                [36, 17582920],
4999                [37, 17582921],
5000                [38, 17582922],
5001                [39, 17582923],
5002                [40, 17582924],
5003                [41, 17582925],
5004                [42, 17582926],
5005                [43, 17582927],
5006                [44, 17582928],
5007                [45, 17582929],
5008                [46, 17582930],
5009                [47, 17582931],
5010                [48, 17582932],
5011                [49, 17583028],
5012                [50, 17583029]
5013            ]
5014        );
5015        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
5016        assert_eq!(
5017            pairs,
5018            vec![
5019                [0, 17581370],
5020                [1, 17582885],
5021                [2, 17582886],
5022                [3, 17582887],
5023                [4, 17582888],
5024                [5, 17582889],
5025                [6, 17582890],
5026                [7, 17582891],
5027                [8, 17582892],
5028                [9, 17582893],
5029                [10, 17582894],
5030                [11, 17582895],
5031                [12, 17582896],
5032                [13, 17582897],
5033                [14, 17582898],
5034                [15, 17582899],
5035                [16, 17582900],
5036                [17, 17582901],
5037                [18, 17582902],
5038                [19, 17582903],
5039                [20, 17582904],
5040                [21, 17582905],
5041                [22, 17582906],
5042                [23, 17582907],
5043                [24, 17582908],
5044                [25, 17582909],
5045                [26, 17582910],
5046                [27, 17582911],
5047                [28, 17582912],
5048                [29, 17582913],
5049                [30, 17582914],
5050                [31, 17582915],
5051                [32, 17582916],
5052                [33, 17582917],
5053                [34, 17582918],
5054                [35, 17582919],
5055                [36, 17582920],
5056                [37, 17582921],
5057                [38, 17582922],
5058                [39, 17582923],
5059                [40, 17582924],
5060                [41, 17582925],
5061                [42, 17582926],
5062                [43, 17582927],
5063                [44, 17582928],
5064                [45, 17582929],
5065                [46, 17582930],
5066                [47, 17582931],
5067                [48, 17582932],
5068                [49, 17583028],
5069                [50, 17583029]
5070            ]
5071        );
5072        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
5073        assert_eq!(
5074            pairs,
5075            vec![
5076                [1, 17582911],
5077                [2, 17582912],
5078                [3, 17582913],
5079                [4, 17582914],
5080                [5, 17582915],
5081                [6, 17582916],
5082                [7, 17582917],
5083                [8, 17582918],
5084                [9, 17582919],
5085                [10, 17582920],
5086                [11, 17582921],
5087                [12, 17582922],
5088                [13, 17582923],
5089                [14, 17582924],
5090                [15, 17582925],
5091                [16, 17582926],
5092                [17, 17582927],
5093                [18, 17582928],
5094                [19, 17582929],
5095                [20, 17582930],
5096                [21, 17582931],
5097                [22, 17582932],
5098                [23, 17583028],
5099                [24, 17583029],
5100                [25, 17583030],
5101                [26, 17583031],
5102                [27, 17583032],
5103                [28, 17583033],
5104                [29, 17583034],
5105                [30, 17583035],
5106                [31, 17583036],
5107                [32, 17583037],
5108                [33, 17583038],
5109                [34, 17583039],
5110                [35, 17583040],
5111                [36, 17583041],
5112                [37, 17583042],
5113                [38, 17583043],
5114                [39, 17583044],
5115                [40, 17583045],
5116                [41, 17583046],
5117                [42, 17583047],
5118                [43, 17583048],
5119                [44, 17583049],
5120                [45, 17583050],
5121                [46, 17583051],
5122                [47, 17583052],
5123                [48, 17583053],
5124                [49, 17583054],
5125                [50, 17583055]
5126            ]
5127        );
5128        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
5129        assert_eq!(
5130            pairs,
5131            vec![
5132                [0, 17588621],
5133                [1, 17588622],
5134                [2, 17588623],
5135                [3, 17588624],
5136                [4, 17588625],
5137                [5, 17588626],
5138                [6, 17588627],
5139                [7, 17588628],
5140                [8, 17588629],
5141                [9, 17588630],
5142                [10, 17588631],
5143                [11, 17588632],
5144                [12, 17588633],
5145                [13, 17588634],
5146                [14, 17588635],
5147                [15, 17588636],
5148                [16, 17588637],
5149                [17, 17588638],
5150                [18, 17588639],
5151                [19, 17588640],
5152                [20, 17588641],
5153                [21, 17588642],
5154                [22, 17588643],
5155                [23, 17588644],
5156                [24, 17588645],
5157                [25, 17588646],
5158                [26, 17588647],
5159                [27, 17588648],
5160                [28, 17588649],
5161                [29, 17588650],
5162                [30, 17588651],
5163                [31, 17588652],
5164                [32, 17588653],
5165                [33, 17588654],
5166                [34, 17588655],
5167                [35, 17588656],
5168                [36, 17588657],
5169                [37, 17589196],
5170                [38, 17589197],
5171                [39, 17589198],
5172                [40, 17589199],
5173                [41, 17589200],
5174                [42, 17589201],
5175                [43, 17589202],
5176                [44, 17589203],
5177                [45, 17589204],
5178                [46, 17589205],
5179                [47, 17589206],
5180                [48, 17589207],
5181                [49, 17589208]
5182            ]
5183        );
5184        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
5185        assert_eq!(
5186            pairs,
5187            vec![
5188                [0, 17588621],
5189                [1, 17588622],
5190                [2, 17588623],
5191                [3, 17588624],
5192                [4, 17588625],
5193                [5, 17588626],
5194                [6, 17588627],
5195                [7, 17588628],
5196                [8, 17588629],
5197                [9, 17588630],
5198                [10, 17588631],
5199                [11, 17588632],
5200                [12, 17588633],
5201                [13, 17588634],
5202                [14, 17588635],
5203                [15, 17588636],
5204                [16, 17588637],
5205                [17, 17588638],
5206                [18, 17588639],
5207                [19, 17588640],
5208                [20, 17588641],
5209                [21, 17588642],
5210                [22, 17588643],
5211                [23, 17588644],
5212                [24, 17588645],
5213                [25, 17588646],
5214                [26, 17588647],
5215                [27, 17588648],
5216                [28, 17588649],
5217                [29, 17588650],
5218                [30, 17588651],
5219                [31, 17588652],
5220                [32, 17588653],
5221                [33, 17588654],
5222                [34, 17588655],
5223                [35, 17588656],
5224                [36, 17588657],
5225                [37, 17589196],
5226                [38, 17589197],
5227                [39, 17589198],
5228                [40, 17589199],
5229                [41, 17589200],
5230                [42, 17589201],
5231                [43, 17589202],
5232                [44, 17589203],
5233                [45, 17589204],
5234                [46, 17589205],
5235                [47, 17589206],
5236                [48, 17589207],
5237                [49, 17589208]
5238            ]
5239        );
5240        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
5241        assert_eq!(
5242            pairs,
5243            vec![
5244                [0, 17588621],
5245                [1, 17588622],
5246                [2, 17588623],
5247                [3, 17588624],
5248                [4, 17588625],
5249                [5, 17588626],
5250                [6, 17588627],
5251                [7, 17588628],
5252                [8, 17588629],
5253                [9, 17588630],
5254                [10, 17588631],
5255                [11, 17588632],
5256                [12, 17588633],
5257                [13, 17588634],
5258                [14, 17588635],
5259                [15, 17588636],
5260                [16, 17588637],
5261                [17, 17588638],
5262                [18, 17588639],
5263                [19, 17588640],
5264                [20, 17588641],
5265                [21, 17588642],
5266                [22, 17588643],
5267                [23, 17588644],
5268                [24, 17588645],
5269                [25, 17588646],
5270                [26, 17588647],
5271                [27, 17588648],
5272                [28, 17588649],
5273                [29, 17588650],
5274                [30, 17588651],
5275                [31, 17588652],
5276                [32, 17588653],
5277                [33, 17588654],
5278                [34, 17588655],
5279                [35, 17588656],
5280                [36, 17588657],
5281                [37, 17589196],
5282                [38, 17589197],
5283                [39, 17589198],
5284                [40, 17589199],
5285                [41, 17589200],
5286                [42, 17589201],
5287                [43, 17589202],
5288                [44, 17589203],
5289                [45, 17589204],
5290                [46, 17589205],
5291                [47, 17589206],
5292                [48, 17589207],
5293                [49, 17589208]
5294            ]
5295        );
5296        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
5297        assert_eq!(
5298            pairs,
5299            vec![
5300                [1, 17591770],
5301                [2, 17591771],
5302                [3, 17591772],
5303                [4, 17591773],
5304                [5, 17591774],
5305                [6, 17591775],
5306                [7, 17591776],
5307                [8, 17591777],
5308                [9, 17591778],
5309                [10, 17591779],
5310                [11, 17591780],
5311                [12, 17591781],
5312                [13, 17591782],
5313                [14, 17591783],
5314                [15, 17591784],
5315                [16, 17591785],
5316                [17, 17591786],
5317                [18, 17591787],
5318                [19, 17591788],
5319                [20, 17591789],
5320                [21, 17591790],
5321                [22, 17591791],
5322                [23, 17591792],
5323                [24, 17591793],
5324                [25, 17591794],
5325                [26, 17591796],
5326                [27, 17591797],
5327                [28, 17591798],
5328                [29, 17591799],
5329                [30, 17591800],
5330                [31, 17591801],
5331                [32, 17591802],
5332                [33, 17591803],
5333                [34, 17591804],
5334                [35, 17591805],
5335                [36, 17591806],
5336                [37, 17591807],
5337                [38, 17591808],
5338                [39, 17591809],
5339                [40, 17591810],
5340                [41, 17591811],
5341                [42, 17591812],
5342                [43, 17591813],
5343                [44, 17591814],
5344                [45, 17591815],
5345                [46, 17591816],
5346                [47, 17591817],
5347                [48, 17591818],
5348                [49, 17591819],
5349                [50, 17591820]
5350            ]
5351        );
5352        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
5353        assert_eq!(
5354            pairs,
5355            vec![
5356                [0, 17593855],
5357                [1, 17593856],
5358                [2, 17593857],
5359                [3, 17593858],
5360                [4, 17593859],
5361                [5, 17593860],
5362                [6, 17593861],
5363                [7, 17593862],
5364                [8, 17593863],
5365                [9, 17593864],
5366                [10, 17593865],
5367                [11, 17593866],
5368                [12, 17593867],
5369                [13, 17593868],
5370                [14, 17593869],
5371                [15, 17593870],
5372                [16, 17593871],
5373                [17, 17593872],
5374                [18, 17593873],
5375                [19, 17593874],
5376                [20, 17593875],
5377                [21, 17593876],
5378                [22, 17593877],
5379                [23, 17593878],
5380                [24, 17593880],
5381                [25, 17593881],
5382                [26, 17593882],
5383                [27, 17593883],
5384                [28, 17593884],
5385                [29, 17593885],
5386                [30, 17593886],
5387                [31, 17593887],
5388                [32, 17593888],
5389                [33, 17593889],
5390                [34, 17593890],
5391                [35, 17593891],
5392                [36, 17593892],
5393                [37, 17593893],
5394                [38, 17593894],
5395                [39, 17593895],
5396                [40, 17593896],
5397                [41, 17593897],
5398                [42, 17593898],
5399                [43, 17593899],
5400                [44, 17593900],
5401                [45, 17593901],
5402                [46, 17593902],
5403                [47, 17593903]
5404            ]
5405        );
5406        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
5407        assert_eq!(
5408            pairs,
5409            vec![
5410                [0, 17593863],
5411                [1, 17593864],
5412                [2, 17593865],
5413                [3, 17593866],
5414                [4, 17593867],
5415                [5, 17593868],
5416                [6, 17593869],
5417                [7, 17593870],
5418                [8, 17593871],
5419                [9, 17593872],
5420                [10, 17593873],
5421                [11, 17593874],
5422                [12, 17593875],
5423                [13, 17593876],
5424                [14, 17593877],
5425                [15, 17593878],
5426                [16, 17593880],
5427                [17, 17593881],
5428                [18, 17593882],
5429                [19, 17593883],
5430                [20, 17593884],
5431                [21, 17593885],
5432                [22, 17593886],
5433                [23, 17593887],
5434                [24, 17593888],
5435                [25, 17593889],
5436                [26, 17593890],
5437                [27, 17593891],
5438                [28, 17593892],
5439                [29, 17593893],
5440                [30, 17593894],
5441                [31, 17593895],
5442                [32, 17593896],
5443                [33, 17593897],
5444                [34, 17593898],
5445                [35, 17593899],
5446                [36, 17593900],
5447                [37, 17593901],
5448                [38, 17593902],
5449                [39, 17593903],
5450                [40, 17593904],
5451                [41, 17593905],
5452                [42, 17593906],
5453                [43, 17593907]
5454            ]
5455        );
5456        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
5457        assert_eq!(
5458            pairs,
5459            vec![
5460                [11, 17596476],
5461                [12, 17596477],
5462                [13, 17596478],
5463                [14, 17596479],
5464                [15, 17596480],
5465                [16, 17596481],
5466                [17, 17596482],
5467                [19, 17596483],
5468                [20, 17596484],
5469                [21, 17596485],
5470                [22, 17596486],
5471                [23, 17596487],
5472                [24, 17596488],
5473                [25, 17596489],
5474                [26, 17596490],
5475                [27, 17596491],
5476                [28, 17596492],
5477                [29, 17596493],
5478                [30, 17596494],
5479                [31, 17596495],
5480                [32, 17596496],
5481                [33, 17596497],
5482                [34, 17596498],
5483                [35, 17596499],
5484                [36, 17596500],
5485                [37, 17596501],
5486                [38, 17596502],
5487                [39, 17596503],
5488                [40, 17596504],
5489                [41, 17596505],
5490                [42, 17596506],
5491                [43, 17596507],
5492                [44, 17596508],
5493                [45, 17596509],
5494                [46, 17596510],
5495                [47, 17596511],
5496                [48, 17596512],
5497                [49, 17596513],
5498                [50, 17596514]
5499            ]
5500        );
5501        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
5502        assert_eq!(
5503            pairs,
5504            vec![
5505                [5, 17624012],
5506                [6, 17624013],
5507                [7, 17624014],
5508                [8, 17624015],
5509                [9, 17624016],
5510                [10, 17624017],
5511                [11, 17624018],
5512                [12, 17624019],
5513                [13, 17624020],
5514                [14, 17625913],
5515                [15, 17625914],
5516                [16, 17625915],
5517                [17, 17625916],
5518                [18, 17625917],
5519                [19, 17625918],
5520                [20, 17625919],
5521                [21, 17625920],
5522                [22, 17625921],
5523                [23, 17625922],
5524                [24, 17625923],
5525                [25, 17625924],
5526                [26, 17625925],
5527                [27, 17625926],
5528                [28, 17625927],
5529                [29, 17625928],
5530                [30, 17625929],
5531                [31, 17625930],
5532                [32, 17625931],
5533                [33, 17625932],
5534                [34, 17625933],
5535                [35, 17625934],
5536                [36, 17625935],
5537                [37, 17625936],
5538                [38, 17625937],
5539                [39, 17625938],
5540                [40, 17625939],
5541                [41, 17625940],
5542                [42, 17625941],
5543                [43, 17625942],
5544                [44, 17625943],
5545                [45, 17625944],
5546                [46, 17625945],
5547                [47, 17625946],
5548                [48, 17625947],
5549                [49, 17625948],
5550                [50, 17625949]
5551            ]
5552        );
5553        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
5554        assert_eq!(
5555            pairs,
5556            vec![
5557                [2, 17624012],
5558                [3, 17624013],
5559                [4, 17624014],
5560                [5, 17624015],
5561                [6, 17624016],
5562                [7, 17624017],
5563                [8, 17624018],
5564                [9, 17624019],
5565                [10, 17624020],
5566                [11, 17625913],
5567                [12, 17625914],
5568                [13, 17625915],
5569                [14, 17625916],
5570                [15, 17625917],
5571                [16, 17625918],
5572                [17, 17625919],
5573                [18, 17625920],
5574                [19, 17625921],
5575                [20, 17625922],
5576                [21, 17625923],
5577                [22, 17625924],
5578                [23, 17625925],
5579                [24, 17625926],
5580                [25, 17625927],
5581                [26, 17625928],
5582                [27, 17625929],
5583                [28, 17625930],
5584                [29, 17625931],
5585                [30, 17625932],
5586                [31, 17625933],
5587                [32, 17625934],
5588                [33, 17625935],
5589                [34, 17625936],
5590                [35, 17625937],
5591                [36, 17625938],
5592                [37, 17625939],
5593                [38, 17625940],
5594                [39, 17625941],
5595                [40, 17625942],
5596                [41, 17625943],
5597                [42, 17625944],
5598                [43, 17625945],
5599                [44, 17625946],
5600                [45, 17625947],
5601                [46, 17625948],
5602                [47, 17625949],
5603                [48, 17625950],
5604                [49, 17625951],
5605                [50, 17625952]
5606            ]
5607        );
5608        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
5609        assert_eq!(
5610            pairs,
5611            vec![
5612                [1, 31796700],
5613                [2, 31796701],
5614                [3, 31796702],
5615                [4, 31796703],
5616                [5, 31796704],
5617                [6, 31796705],
5618                [7, 31796706],
5619                [8, 31796710],
5620                [9, 31796711],
5621                [10, 31796712],
5622                [11, 31796713],
5623                [12, 31796714],
5624                [13, 31796715],
5625                [14, 31796716],
5626                [15, 31796717],
5627                [16, 31796718],
5628                [17, 31796719],
5629                [18, 31796720],
5630                [19, 31796721],
5631                [20, 31796722],
5632                [21, 31796723],
5633                [22, 31796724],
5634                [23, 31796725],
5635                [24, 31796726],
5636                [25, 31796727],
5637                [26, 31796728],
5638                [27, 31799014],
5639                [28, 31799015],
5640                [29, 31799016],
5641                [30, 31799017],
5642                [31, 31799018],
5643                [32, 31799019],
5644                [33, 31799020],
5645                [34, 31799021],
5646                [35, 31799022],
5647                [36, 31799023],
5648                [37, 31799024],
5649                [38, 31799025],
5650                [39, 31799026],
5651                [40, 31799027],
5652                [41, 31799028],
5653                [42, 31799029],
5654                [43, 31799030],
5655                [44, 31799031],
5656                [45, 31799032],
5657                [46, 31799033],
5658                [47, 31799034],
5659                [48, 31799035],
5660                [49, 31799036],
5661                [50, 31799037]
5662            ]
5663        );
5664        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
5665        assert_eq!(
5666            pairs,
5667            vec![
5668                [0, 36722692],
5669                [1, 36722693],
5670                [2, 36722694],
5671                [3, 36722695],
5672                [4, 36722696],
5673                [5, 36722697],
5674                [6, 36722698],
5675                [7, 36722699],
5676                [8, 36722700],
5677                [9, 36722701],
5678                [10, 36722702],
5679                [11, 36722703],
5680                [12, 36722704],
5681                [13, 36722705],
5682                [14, 36723505],
5683                [15, 36723506],
5684                [16, 36723507],
5685                [17, 36723508],
5686                [18, 36723509],
5687                [19, 36723510],
5688                [20, 36723511],
5689                [21, 36723512],
5690                [22, 36723513],
5691                [23, 36723514],
5692                [24, 36723515],
5693                [25, 36723516],
5694                [26, 36723517],
5695                [27, 36723518],
5696                [28, 36723519],
5697                [29, 36723520],
5698                [30, 36723521],
5699                [31, 36723522],
5700                [32, 36723523],
5701                [33, 36723524],
5702                [34, 36723525],
5703                [35, 36723526],
5704                [36, 36723527],
5705                [37, 36723528],
5706                [38, 36723529],
5707                [39, 36723530],
5708                [40, 36723531],
5709                [41, 36723532],
5710                [42, 36737414],
5711                [43, 36737415],
5712                [44, 36737416],
5713                [45, 36737417],
5714                [46, 36737418],
5715                [47, 36737419],
5716                [48, 36737420]
5717            ]
5718        );
5719        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs().collect();
5720        assert_eq!(
5721            pairs,
5722            vec![
5723                [4, 44587963],
5724                [5, 44587964],
5725                [6, 44587965],
5726                [7, 44587966],
5727                [8, 44587967],
5728                [9, 44587968],
5729                [10, 44587969],
5730                [11, 44587970],
5731                [12, 44587971],
5732                [13, 44587972],
5733                [14, 44587973],
5734                [15, 44587974],
5735                [16, 44587975],
5736                [17, 44587976],
5737                [18, 44587977],
5738                [19, 44587978],
5739                [20, 44587979],
5740                [21, 44587980],
5741                [22, 44587981],
5742                [23, 44587982],
5743                [24, 44587983],
5744                [25, 44589680],
5745                [26, 44589681],
5746                [27, 44589682],
5747                [28, 44589683],
5748                [29, 44589684],
5749                [30, 44589685],
5750                [31, 44589686],
5751                [32, 44589687],
5752                [33, 44589688],
5753                [34, 44589689],
5754                [35, 44589690],
5755                [36, 44589691],
5756                [37, 44589692],
5757                [38, 44589693],
5758                [39, 44589694],
5759                [40, 44589695],
5760                [41, 44589696],
5761                [42, 44589697],
5762                [43, 44589698],
5763                [44, 44589699],
5764                [45, 44589700],
5765                [46, 44589701],
5766                [47, 44589702],
5767                [48, 44592034],
5768                [49, 44592035],
5769                [50, 44592036]
5770            ]
5771        );
5772    }
5773    #[test]
5774    fn test_cigar_full() {
5775        let mut bam = bam::Reader::from_path("./test/locusmd.bam").unwrap();
5776        let mut it = bam.records();
5777        let test = it.next().unwrap().unwrap();
5778        let pairs: Vec<_> = test.aligned_block_pairs_cigar().collect();
5779        assert_eq!(
5780            pairs,
5781            vec![
5782                (0..15, 99812479..99812494, Cigar::Equal(15)),
5783                (15..16, 99812494..99812494, Cigar::Ins(1)),
5784                (16..83, 99812494..99812561, Cigar::Equal(67)),
5785                (83..84, 99812561..99812561, Cigar::Ins(1)),
5786                (84..413, 99812561..99812890, Cigar::Equal(329)),
5787                (413..413, 99812890..99812891, Cigar::Del(1)),
5788                (413..538, 99812891..99813016, Cigar::Equal(125)),
5789                (538..539, 99813016..99813016, Cigar::Ins(1)),
5790                (539..597, 99813016..99813074, Cigar::Equal(58)),
5791                (597..597, 99813074..99813075, Cigar::Del(1)),
5792                (597..1498, 99813075..99813976, Cigar::Equal(901)),
5793                (1498..1499, 99813976..99813976, Cigar::Ins(1)),
5794                (1499..1779, 99813976..99814256, Cigar::Equal(280)),
5795                (1779..1779, 99814256..99814257, Cigar::Del(1)),
5796                (1779..1939, 99814257..99814417, Cigar::Equal(160)),
5797                (1939..1939, 99814417..99814418, Cigar::Del(1)),
5798                (1939..1962, 99814418..99814441, Cigar::Equal(23)),
5799                (1962..1962, 99814441..99814442, Cigar::Del(1)),
5800                (1962..1994, 99814442..99814474, Cigar::Equal(32)),
5801                (1994..1994, 99814474..99814475, Cigar::Del(1)),
5802                (1994..2067, 99814475..99814548, Cigar::Equal(73)),
5803                (2067..2068, 99814548..99814548, Cigar::Ins(1)),
5804                (2068..2368, 99814548..99814848, Cigar::Equal(300)),
5805                (2368..2368, 99814848..99814850, Cigar::Del(2)),
5806                (2368..2384, 99814850..99814866, Cigar::Equal(16)),
5807                (2384..2384, 99814866..99814867, Cigar::Del(1)),
5808                (2384..2785, 99814867..99815268, Cigar::Equal(401)),
5809                (2785..2785, 99815268..99815269, Cigar::Del(1)),
5810                (2785..2790, 99815269..99815274, Cigar::Equal(5)),
5811                (2790..2791, 99815274..99815275, Cigar::Diff(1)),
5812                (2791..2867, 99815275..99815351, Cigar::Equal(76)),
5813                (2867..2867, 99815351..99815352, Cigar::Del(1)),
5814                (2867..3126, 99815352..99815611, Cigar::Equal(259)),
5815                (3126..3127, 99815611..99815612, Cigar::Diff(1)),
5816                (3127..3314, 99815612..99815799, Cigar::Equal(187)),
5817                (3314..3314, 99815799..99815800, Cigar::Del(1)),
5818                (3314..3331, 99815800..99815817, Cigar::Equal(17)),
5819                (3331..3331, 99815817..99815818, Cigar::Del(1)),
5820                (3331..3367, 99815818..99815854, Cigar::Equal(36)),
5821                (3367..3367, 99815854..99815855, Cigar::Del(1)),
5822                (3367..3430, 99815855..99815918, Cigar::Equal(63)),
5823                (3430..3430, 99815918..99815919, Cigar::Del(1)),
5824                (3430..3469, 99815919..99815958, Cigar::Equal(39)),
5825                (3469..3469, 99815958..99815959, Cigar::Del(1)),
5826                (3469..3508, 99815959..99815998, Cigar::Equal(39)),
5827                (3508..3508, 99815998..99815999, Cigar::Del(1)),
5828                (3508..3701, 99815999..99816192, Cigar::Equal(193)),
5829                (3701..3701, 99816192..99816193, Cigar::Del(1)),
5830                (3701..3829, 99816193..99816321, Cigar::Equal(128)),
5831                (3829..3830, 99816321..99816321, Cigar::Ins(1)),
5832                (3830..4519, 99816321..99817010, Cigar::Equal(689)),
5833                (4519..4520, 99817010..99817010, Cigar::Ins(1)),
5834                (4520..4569, 99817010..99817059, Cigar::Equal(49)),
5835                (4569..4569, 99817059..99817060, Cigar::Del(1)),
5836                (4569..4702, 99817060..99817193, Cigar::Equal(133)),
5837                (4702..4702, 99817193..99817194, Cigar::Del(1)),
5838                (4702..4888, 99817194..99817380, Cigar::Equal(186)),
5839                (4888..4889, 99817380..99817380, Cigar::Ins(1)),
5840                (4889..4981, 99817380..99817472, Cigar::Equal(92)),
5841                (4981..4982, 99817472..99817472, Cigar::Ins(1)),
5842                (4982..5089, 99817472..99817579, Cigar::Equal(107)),
5843                (5089..5090, 99817579..99817579, Cigar::Ins(1)),
5844                (5090..5132, 99817579..99817621, Cigar::Equal(42)),
5845                (5132..5133, 99817621..99817621, Cigar::Ins(1)),
5846                (5133..5383, 99817621..99817871, Cigar::Equal(250)),
5847                (5383..5383, 99817871..99817872, Cigar::Del(1)),
5848                (5383..5451, 99817872..99817940, Cigar::Equal(68)),
5849                (5451..5451, 99817940..99817941, Cigar::Del(1)),
5850                (5451..5457, 99817941..99817947, Cigar::Equal(6)),
5851                (5457..5457, 99817947..99817948, Cigar::Del(1)),
5852                (5457..5593, 99817948..99818084, Cigar::Equal(136)),
5853                (5593..5594, 99818084..99818084, Cigar::Ins(1)),
5854                (5594..5900, 99818084..99818390, Cigar::Equal(306)),
5855                (5900..5901, 99818390..99818390, Cigar::Ins(1)),
5856                (5901..5932, 99818390..99818421, Cigar::Equal(31)),
5857                (5932..5933, 99818421..99818421, Cigar::Ins(1)),
5858                (5933..6100, 99818421..99818588, Cigar::Equal(167)),
5859                (6100..6100, 99818588..99818589, Cigar::Del(1)),
5860                (6100..6256, 99818589..99818745, Cigar::Equal(156)),
5861                (6256..6257, 99818745..99818746, Cigar::Diff(1)),
5862                (6257..7576, 99818746..99820065, Cigar::Equal(1319)),
5863                (7576..7576, 99820065..99820066, Cigar::Del(1)),
5864                (7576..7884, 99820066..99820374, Cigar::Equal(308)),
5865                (7884..7884, 99820374..99820375, Cigar::Del(1)),
5866                (7884..7951, 99820375..99820442, Cigar::Equal(67)),
5867                (7951..7951, 99820442..99820443, Cigar::Del(1)),
5868                (7951..8159, 99820443..99820651, Cigar::Equal(208)),
5869                (8159..8159, 99820651..99820653, Cigar::Del(2)),
5870                (8159..8225, 99820653..99820719, Cigar::Equal(66)),
5871                (8225..8226, 99820719..99820719, Cigar::Ins(1)),
5872                (8226..8229, 99820719..99820722, Cigar::Equal(3)),
5873                (8229..8229, 99820722..99820723, Cigar::Del(1)),
5874                (8229..8245, 99820723..99820739, Cigar::Equal(16)),
5875                (8245..8245, 99820739..99820740, Cigar::Del(1)),
5876                (8245..8283, 99820740..99820778, Cigar::Equal(38)),
5877                (8283..8283, 99820778..99820780, Cigar::Del(2)),
5878                (8283..8285, 99820780..99820782, Cigar::Equal(2)),
5879                (8285..8286, 99820782..99820783, Cigar::Diff(1)),
5880                (8286..8326, 99820783..99820823, Cigar::Equal(40)),
5881                (8326..8326, 99820823..99820824, Cigar::Del(1)),
5882                (8326..8454, 99820824..99820952, Cigar::Equal(128)),
5883                (8454..8454, 99820952..99820953, Cigar::Del(1)),
5884                (8454..8508, 99820953..99821007, Cigar::Equal(54)),
5885                (8508..8509, 99821007..99821007, Cigar::Ins(1)),
5886                (8509..8560, 99821007..99821058, Cigar::Equal(51)),
5887                (8560..8560, 99821058..99821059, Cigar::Del(1)),
5888                (8560..8833, 99821059..99821332, Cigar::Equal(273)),
5889                (8833..8833, 99821332..99821333, Cigar::Del(1)),
5890                (8833..8836, 99821333..99821336, Cigar::Equal(3)),
5891                (8836..8836, 99821336..99821337, Cigar::Del(1)),
5892                (8836..9061, 99821337..99821562, Cigar::Equal(225)),
5893                (9061..9061, 99821562..99821563, Cigar::Del(1)),
5894                (9061..9065, 99821563..99821567, Cigar::Equal(4)),
5895                (9065..9065, 99821567..99821568, Cigar::Del(1)),
5896                (9065..9110, 99821568..99821613, Cigar::Equal(45)),
5897                (9110..9110, 99821613..99821615, Cigar::Del(2)),
5898                (9110..9163, 99821615..99821668, Cigar::Equal(53)),
5899                (9163..9163, 99821668..99821669, Cigar::Del(1)),
5900                (9163..9390, 99821669..99821896, Cigar::Equal(227)),
5901                (9390..9390, 99821896..99821897, Cigar::Del(1)),
5902                (9390..9427, 99821897..99821934, Cigar::Equal(37)),
5903                (9427..9430, 99821934..99821937, Cigar::Diff(3)),
5904                (9430..9461, 99821937..99821968, Cigar::Equal(31)),
5905                (9461..9461, 99821968..99821970, Cigar::Del(2)),
5906                (9461..9493, 99821970..99822002, Cigar::Equal(32)),
5907                (9493..9493, 99822002..99822004, Cigar::Del(2)),
5908                (9493..9692, 99822004..99822203, Cigar::Equal(199)),
5909                (9692..9693, 99822203..99822204, Cigar::Diff(1)),
5910                (9693..9829, 99822204..99822340, Cigar::Equal(136)),
5911                (9829..9829, 99822340..99822342, Cigar::Del(2)),
5912                (9829..9870, 99822342..99822383, Cigar::Equal(41)),
5913                (9870..9870, 99822383..99822386, Cigar::Del(3)),
5914                (9870..9915, 99822386..99822431, Cigar::Equal(45)),
5915                (9915..9915, 99822431..99822432, Cigar::Del(1)),
5916                (9915..10285, 99822432..99822802, Cigar::Equal(370)),
5917                (10285..10285, 99822802..99822803, Cigar::Del(1)),
5918                (10285..10480, 99822803..99822998, Cigar::Equal(195)),
5919                (10480..10480, 99822998..99822999, Cigar::Del(1)),
5920                (10480..10721, 99822999..99823240, Cigar::Equal(241)),
5921                (10721..10722, 99823240..99823240, Cigar::Ins(1)),
5922                (10722..11122, 99823240..99823640, Cigar::Equal(400)),
5923                (11122..11122, 99823640..99823641, Cigar::Del(1)),
5924                (11122..11230, 99823641..99823749, Cigar::Equal(108)),
5925                (11230..11230, 99823749..99823750, Cigar::Del(1)),
5926                (11230..11911, 99823750..99824431, Cigar::Equal(681)),
5927                (11911..11912, 99824431..99824431, Cigar::Ins(1)),
5928                (11912..12102, 99824431..99824621, Cigar::Equal(190)),
5929                (12102..12102, 99824621..99824622, Cigar::Del(1)),
5930                (12102..12870, 99824622..99825390, Cigar::Equal(768)),
5931                (12870..12870, 99825390..99825391, Cigar::Del(1)),
5932                (12870..12978, 99825391..99825499, Cigar::Equal(108)),
5933                (12978..12978, 99825499..99825500, Cigar::Del(1)),
5934                (12978..13419, 99825500..99825941, Cigar::Equal(441)),
5935                (13419..13419, 99825941..99825942, Cigar::Del(1)),
5936                (13419..13617, 99825942..99826140, Cigar::Equal(198)),
5937                (13617..13617, 99826140..99826141, Cigar::Del(1)),
5938                (13617..13697, 99826141..99826221, Cigar::Equal(80)),
5939                (13697..13698, 99826221..99826221, Cigar::Ins(1)),
5940                (13698..13811, 99826221..99826334, Cigar::Equal(113)),
5941                (13811..13812, 99826334..99826334, Cigar::Ins(1)),
5942                (13812..14020, 99826334..99826542, Cigar::Equal(208)),
5943                (14020..14020, 99826542..99826543, Cigar::Del(1)),
5944                (14020..14524, 99826543..99827047, Cigar::Equal(504)),
5945                (14524..14524, 99827047..99827048, Cigar::Del(1)),
5946                (14524..14533, 99827048..99827057, Cigar::Equal(9)),
5947                (14533..14534, 99827057..99827057, Cigar::Ins(1)),
5948                (14534..14787, 99827057..99827310, Cigar::Equal(253)),
5949                (14787..14788, 99827310..99827310, Cigar::Ins(1)),
5950                (14788..14901, 99827310..99827423, Cigar::Equal(113)),
5951                (14901..14901, 99827423..99827424, Cigar::Del(1)),
5952                (14901..15001, 99827424..99827524, Cigar::Equal(100)),
5953                (15001..15002, 99827524..99827524, Cigar::Ins(1)),
5954                (15002..15166, 99827524..99827688, Cigar::Equal(164)),
5955                (15166..15166, 99827688..99827689, Cigar::Del(1)),
5956                (15166..15805, 99827689..99828328, Cigar::Equal(639)),
5957                (15805..15805, 99828328..99828329, Cigar::Del(1)),
5958                (15805..16195, 99828329..99828719, Cigar::Equal(390)),
5959                (16195..16195, 99828719..99828721, Cigar::Del(2)),
5960                (16195..16576, 99828721..99829102, Cigar::Equal(381)),
5961                (16576..16577, 99829102..99829102, Cigar::Ins(1)),
5962                (16577..16912, 99829102..99829437, Cigar::Equal(335)),
5963                (16912..16912, 99829437..99829438, Cigar::Del(1)),
5964                (16912..17896, 99829438..99830422, Cigar::Equal(984)),
5965                (17896..17897, 99830422..99830422, Cigar::Ins(1)),
5966                (17897..18370, 99830422..99830895, Cigar::Equal(473)),
5967                (18370..18370, 99830895..99830896, Cigar::Del(1)),
5968                (18370..18410, 99830896..99830936, Cigar::Equal(40)),
5969                (18410..18410, 99830936..99830937, Cigar::Del(1)),
5970                (18410..18449, 99830937..99830976, Cigar::Equal(39)),
5971                (18449..18450, 99830976..99830976, Cigar::Ins(1)),
5972                (18450..18675, 99830976..99831201, Cigar::Equal(225)),
5973                (18675..18675, 99831201..99831202, Cigar::Del(1)),
5974                (18675..18729, 99831202..99831256, Cigar::Equal(54)),
5975                (18729..18729, 99831256..99831257, Cigar::Del(1)),
5976                (18729..18812, 99831257..99831340, Cigar::Equal(83)),
5977                (18812..18813, 99831340..99831340, Cigar::Ins(1)),
5978                (18813..18895, 99831340..99831422, Cigar::Equal(82)),
5979                (18895..18895, 99831422..99831423, Cigar::Del(1)),
5980                (18895..19239, 99831423..99831767, Cigar::Equal(344)),
5981                (19239..19240, 99831767..99831767, Cigar::Ins(1)),
5982                (19240..19244, 99831767..99831771, Cigar::Equal(4)),
5983                (19244..19245, 99831771..99831771, Cigar::Ins(1)),
5984                (19245..19387, 99831771..99831913, Cigar::Equal(142)),
5985                (19387..19387, 99831913..99831914, Cigar::Del(1)),
5986                (19387..19883, 99831914..99832410, Cigar::Equal(496)),
5987            ]
5988        );
5989        assert_eq!(
5990            test.aligned_block_pairs_cigar_match()
5991                .unwrap()
5992                .into_iter()
5993                .filter_map(|a| match a {
5994                    (Some((a, b)), _) => Some(((a.start, a.end), (b.start, b.end))),
5995                    (None, _) => None,
5996                })
5997                .collect::<Vec<_>>(),
5998            //Block pairs and aligned blocks must match
5999            test.aligned_block_pairs_match()
6000                .unwrap()
6001                .into_iter()
6002                .map(|(a, b)| ((a[0], a[1]), (b[0], b[1])))
6003                .collect::<Vec<_>>(),
6004            "Invalid alignment of pairs and cigar"
6005        );
6006        let pairs: Vec<_> = test.aligned_block_pairs_cigar_match().unwrap().collect();
6007        assert_eq!(
6008            pairs,
6009            vec![
6010                (Some((0..15, 99812479..99812494)), Cigar::Equal(15)),
6011                (None, Cigar::Ins(1)),
6012                (Some((16..83, 99812494..99812561)), Cigar::Equal(67)),
6013                (None, Cigar::Ins(1)),
6014                (Some((84..413, 99812561..99812890)), Cigar::Equal(329)),
6015                (None, Cigar::Del(1)),
6016                (Some((413..538, 99812891..99813016)), Cigar::Equal(125)),
6017                (None, Cigar::Ins(1)),
6018                (Some((539..597, 99813016..99813074)), Cigar::Equal(58)),
6019                (None, Cigar::Del(1)),
6020                (Some((597..1498, 99813075..99813976)), Cigar::Equal(901)),
6021                (None, Cigar::Ins(1)),
6022                (Some((1499..1779, 99813976..99814256)), Cigar::Equal(280)),
6023                (None, Cigar::Del(1)),
6024                (Some((1779..1939, 99814257..99814417)), Cigar::Equal(160)),
6025                (None, Cigar::Del(1)),
6026                (Some((1939..1962, 99814418..99814441)), Cigar::Equal(23)),
6027                (None, Cigar::Del(1)),
6028                (Some((1962..1994, 99814442..99814474)), Cigar::Equal(32)),
6029                (None, Cigar::Del(1)),
6030                (Some((1994..2067, 99814475..99814548)), Cigar::Equal(73)),
6031                (None, Cigar::Ins(1)),
6032                (Some((2068..2368, 99814548..99814848)), Cigar::Equal(300)),
6033                (None, Cigar::Del(2)),
6034                (Some((2368..2384, 99814850..99814866)), Cigar::Equal(16)),
6035                (None, Cigar::Del(1)),
6036                (Some((2384..2785, 99814867..99815268)), Cigar::Equal(401)),
6037                (None, Cigar::Del(1)),
6038                (Some((2785..2790, 99815269..99815274)), Cigar::Equal(5)),
6039                (None, Cigar::Diff(1)),
6040                (Some((2791..2867, 99815275..99815351)), Cigar::Equal(76)),
6041                (None, Cigar::Del(1)),
6042                (Some((2867..3126, 99815352..99815611)), Cigar::Equal(259)),
6043                (None, Cigar::Diff(1)),
6044                (Some((3127..3314, 99815612..99815799)), Cigar::Equal(187)),
6045                (None, Cigar::Del(1)),
6046                (Some((3314..3331, 99815800..99815817)), Cigar::Equal(17)),
6047                (None, Cigar::Del(1)),
6048                (Some((3331..3367, 99815818..99815854)), Cigar::Equal(36)),
6049                (None, Cigar::Del(1)),
6050                (Some((3367..3430, 99815855..99815918)), Cigar::Equal(63)),
6051                (None, Cigar::Del(1)),
6052                (Some((3430..3469, 99815919..99815958)), Cigar::Equal(39)),
6053                (None, Cigar::Del(1)),
6054                (Some((3469..3508, 99815959..99815998)), Cigar::Equal(39)),
6055                (None, Cigar::Del(1)),
6056                (Some((3508..3701, 99815999..99816192)), Cigar::Equal(193)),
6057                (None, Cigar::Del(1)),
6058                (Some((3701..3829, 99816193..99816321)), Cigar::Equal(128)),
6059                (None, Cigar::Ins(1)),
6060                (Some((3830..4519, 99816321..99817010)), Cigar::Equal(689)),
6061                (None, Cigar::Ins(1)),
6062                (Some((4520..4569, 99817010..99817059)), Cigar::Equal(49)),
6063                (None, Cigar::Del(1)),
6064                (Some((4569..4702, 99817060..99817193)), Cigar::Equal(133)),
6065                (None, Cigar::Del(1)),
6066                (Some((4702..4888, 99817194..99817380)), Cigar::Equal(186)),
6067                (None, Cigar::Ins(1)),
6068                (Some((4889..4981, 99817380..99817472)), Cigar::Equal(92)),
6069                (None, Cigar::Ins(1)),
6070                (Some((4982..5089, 99817472..99817579)), Cigar::Equal(107)),
6071                (None, Cigar::Ins(1)),
6072                (Some((5090..5132, 99817579..99817621)), Cigar::Equal(42)),
6073                (None, Cigar::Ins(1)),
6074                (Some((5133..5383, 99817621..99817871)), Cigar::Equal(250)),
6075                (None, Cigar::Del(1)),
6076                (Some((5383..5451, 99817872..99817940)), Cigar::Equal(68)),
6077                (None, Cigar::Del(1)),
6078                (Some((5451..5457, 99817941..99817947)), Cigar::Equal(6)),
6079                (None, Cigar::Del(1)),
6080                (Some((5457..5593, 99817948..99818084)), Cigar::Equal(136)),
6081                (None, Cigar::Ins(1)),
6082                (Some((5594..5900, 99818084..99818390)), Cigar::Equal(306)),
6083                (None, Cigar::Ins(1)),
6084                (Some((5901..5932, 99818390..99818421)), Cigar::Equal(31)),
6085                (None, Cigar::Ins(1)),
6086                (Some((5933..6100, 99818421..99818588)), Cigar::Equal(167)),
6087                (None, Cigar::Del(1)),
6088                (Some((6100..6256, 99818589..99818745)), Cigar::Equal(156)),
6089                (None, Cigar::Diff(1)),
6090                (Some((6257..7576, 99818746..99820065)), Cigar::Equal(1319)),
6091                (None, Cigar::Del(1)),
6092                (Some((7576..7884, 99820066..99820374)), Cigar::Equal(308)),
6093                (None, Cigar::Del(1)),
6094                (Some((7884..7951, 99820375..99820442)), Cigar::Equal(67)),
6095                (None, Cigar::Del(1)),
6096                (Some((7951..8159, 99820443..99820651)), Cigar::Equal(208)),
6097                (None, Cigar::Del(2)),
6098                (Some((8159..8225, 99820653..99820719)), Cigar::Equal(66)),
6099                (None, Cigar::Ins(1)),
6100                (Some((8226..8229, 99820719..99820722)), Cigar::Equal(3)),
6101                (None, Cigar::Del(1)),
6102                (Some((8229..8245, 99820723..99820739)), Cigar::Equal(16)),
6103                (None, Cigar::Del(1)),
6104                (Some((8245..8283, 99820740..99820778)), Cigar::Equal(38)),
6105                (None, Cigar::Del(2)),
6106                (Some((8283..8285, 99820780..99820782)), Cigar::Equal(2)),
6107                (None, Cigar::Diff(1)),
6108                (Some((8286..8326, 99820783..99820823)), Cigar::Equal(40)),
6109                (None, Cigar::Del(1)),
6110                (Some((8326..8454, 99820824..99820952)), Cigar::Equal(128)),
6111                (None, Cigar::Del(1)),
6112                (Some((8454..8508, 99820953..99821007)), Cigar::Equal(54)),
6113                (None, Cigar::Ins(1)),
6114                (Some((8509..8560, 99821007..99821058)), Cigar::Equal(51)),
6115                (None, Cigar::Del(1)),
6116                (Some((8560..8833, 99821059..99821332)), Cigar::Equal(273)),
6117                (None, Cigar::Del(1)),
6118                (Some((8833..8836, 99821333..99821336)), Cigar::Equal(3)),
6119                (None, Cigar::Del(1)),
6120                (Some((8836..9061, 99821337..99821562)), Cigar::Equal(225)),
6121                (None, Cigar::Del(1)),
6122                (Some((9061..9065, 99821563..99821567)), Cigar::Equal(4)),
6123                (None, Cigar::Del(1)),
6124                (Some((9065..9110, 99821568..99821613)), Cigar::Equal(45)),
6125                (None, Cigar::Del(2)),
6126                (Some((9110..9163, 99821615..99821668)), Cigar::Equal(53)),
6127                (None, Cigar::Del(1)),
6128                (Some((9163..9390, 99821669..99821896)), Cigar::Equal(227)),
6129                (None, Cigar::Del(1)),
6130                (Some((9390..9427, 99821897..99821934)), Cigar::Equal(37)),
6131                (None, Cigar::Diff(3)),
6132                (Some((9430..9461, 99821937..99821968)), Cigar::Equal(31)),
6133                (None, Cigar::Del(2)),
6134                (Some((9461..9493, 99821970..99822002)), Cigar::Equal(32)),
6135                (None, Cigar::Del(2)),
6136                (Some((9493..9692, 99822004..99822203)), Cigar::Equal(199)),
6137                (None, Cigar::Diff(1)),
6138                (Some((9693..9829, 99822204..99822340)), Cigar::Equal(136)),
6139                (None, Cigar::Del(2)),
6140                (Some((9829..9870, 99822342..99822383)), Cigar::Equal(41)),
6141                (None, Cigar::Del(3)),
6142                (Some((9870..9915, 99822386..99822431)), Cigar::Equal(45)),
6143                (None, Cigar::Del(1)),
6144                (Some((9915..10285, 99822432..99822802)), Cigar::Equal(370)),
6145                (None, Cigar::Del(1)),
6146                (Some((10285..10480, 99822803..99822998)), Cigar::Equal(195)),
6147                (None, Cigar::Del(1)),
6148                (Some((10480..10721, 99822999..99823240)), Cigar::Equal(241)),
6149                (None, Cigar::Ins(1)),
6150                (Some((10722..11122, 99823240..99823640)), Cigar::Equal(400)),
6151                (None, Cigar::Del(1)),
6152                (Some((11122..11230, 99823641..99823749)), Cigar::Equal(108)),
6153                (None, Cigar::Del(1)),
6154                (Some((11230..11911, 99823750..99824431)), Cigar::Equal(681)),
6155                (None, Cigar::Ins(1)),
6156                (Some((11912..12102, 99824431..99824621)), Cigar::Equal(190)),
6157                (None, Cigar::Del(1)),
6158                (Some((12102..12870, 99824622..99825390)), Cigar::Equal(768)),
6159                (None, Cigar::Del(1)),
6160                (Some((12870..12978, 99825391..99825499)), Cigar::Equal(108)),
6161                (None, Cigar::Del(1)),
6162                (Some((12978..13419, 99825500..99825941)), Cigar::Equal(441)),
6163                (None, Cigar::Del(1)),
6164                (Some((13419..13617, 99825942..99826140)), Cigar::Equal(198)),
6165                (None, Cigar::Del(1)),
6166                (Some((13617..13697, 99826141..99826221)), Cigar::Equal(80)),
6167                (None, Cigar::Ins(1)),
6168                (Some((13698..13811, 99826221..99826334)), Cigar::Equal(113)),
6169                (None, Cigar::Ins(1)),
6170                (Some((13812..14020, 99826334..99826542)), Cigar::Equal(208)),
6171                (None, Cigar::Del(1)),
6172                (Some((14020..14524, 99826543..99827047)), Cigar::Equal(504)),
6173                (None, Cigar::Del(1)),
6174                (Some((14524..14533, 99827048..99827057)), Cigar::Equal(9)),
6175                (None, Cigar::Ins(1)),
6176                (Some((14534..14787, 99827057..99827310)), Cigar::Equal(253)),
6177                (None, Cigar::Ins(1)),
6178                (Some((14788..14901, 99827310..99827423)), Cigar::Equal(113)),
6179                (None, Cigar::Del(1)),
6180                (Some((14901..15001, 99827424..99827524)), Cigar::Equal(100)),
6181                (None, Cigar::Ins(1)),
6182                (Some((15002..15166, 99827524..99827688)), Cigar::Equal(164)),
6183                (None, Cigar::Del(1)),
6184                (Some((15166..15805, 99827689..99828328)), Cigar::Equal(639)),
6185                (None, Cigar::Del(1)),
6186                (Some((15805..16195, 99828329..99828719)), Cigar::Equal(390)),
6187                (None, Cigar::Del(2)),
6188                (Some((16195..16576, 99828721..99829102)), Cigar::Equal(381)),
6189                (None, Cigar::Ins(1)),
6190                (Some((16577..16912, 99829102..99829437)), Cigar::Equal(335)),
6191                (None, Cigar::Del(1)),
6192                (Some((16912..17896, 99829438..99830422)), Cigar::Equal(984)),
6193                (None, Cigar::Ins(1)),
6194                (Some((17897..18370, 99830422..99830895)), Cigar::Equal(473)),
6195                (None, Cigar::Del(1)),
6196                (Some((18370..18410, 99830896..99830936)), Cigar::Equal(40)),
6197                (None, Cigar::Del(1)),
6198                (Some((18410..18449, 99830937..99830976)), Cigar::Equal(39)),
6199                (None, Cigar::Ins(1)),
6200                (Some((18450..18675, 99830976..99831201)), Cigar::Equal(225)),
6201                (None, Cigar::Del(1)),
6202                (Some((18675..18729, 99831202..99831256)), Cigar::Equal(54)),
6203                (None, Cigar::Del(1)),
6204                (Some((18729..18812, 99831257..99831340)), Cigar::Equal(83)),
6205                (None, Cigar::Ins(1)),
6206                (Some((18813..18895, 99831340..99831422)), Cigar::Equal(82)),
6207                (None, Cigar::Del(1)),
6208                (Some((18895..19239, 99831423..99831767)), Cigar::Equal(344)),
6209                (None, Cigar::Ins(1)),
6210                (Some((19240..19244, 99831767..99831771)), Cigar::Equal(4)),
6211                (None, Cigar::Ins(1)),
6212                (Some((19245..19387, 99831771..99831913)), Cigar::Equal(142)),
6213                (None, Cigar::Del(1)),
6214                (Some((19387..19883, 99831914..99832410)), Cigar::Equal(496))
6215            ]
6216        );
6217        let mut bam = bam::Reader::from_path("./test/setcigar.sam").unwrap();
6218        let mut it = bam.rc_records();
6219        let hit = it
6220            .next()
6221            .unwrap()
6222            .unwrap()
6223            .aligned_block_pairs_cigar_match();
6224        assert!(hit.is_none())
6225    }
6226    #[test]
6227    fn test_aligned_pairs_full() {
6228        let mut bam = bam::Reader::from_path("./test/test_spliced_reads.bam").unwrap();
6229        let mut it = bam.records();
6230        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6231        assert_eq!(
6232            pairs.clone().into_iter().take(12).collect::<Vec<_>>(),
6233            vec![
6234                [Some(0), None],
6235                [Some(1), None],
6236                [Some(2), None],
6237                [Some(3), None],
6238                [Some(4), None],
6239                [Some(5), None],
6240                [Some(6), Some(16050676)],
6241                [Some(7), Some(16050677)],
6242                [Some(8), Some(16050678)],
6243                [Some(9), Some(16050679)],
6244                [Some(10), Some(16050680)],
6245                [Some(11), Some(16050681)],
6246            ]
6247        );
6248        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6249        assert_eq!(
6250            pairs,
6251            vec![
6252                [Some(0), Some(16096878)],
6253                [Some(1), Some(16096879)],
6254                [Some(2), Some(16096880)],
6255                [Some(3), Some(16096881)],
6256                [Some(4), Some(16096882)],
6257                [Some(5), Some(16096883)],
6258                [Some(6), Some(16096884)],
6259                [None, Some(16096885)],
6260                [None, Some(16096886)],
6261                [Some(7), Some(16096887)],
6262                [Some(8), Some(16096888)],
6263                [Some(9), Some(16096889)],
6264                [Some(10), Some(16096890)],
6265                [Some(11), Some(16096891)],
6266                [Some(12), Some(16096892)],
6267                [Some(13), Some(16096893)],
6268                [Some(14), Some(16096894)],
6269                [Some(15), Some(16096895)],
6270                [Some(16), Some(16096896)],
6271                [Some(17), Some(16096897)],
6272                [Some(18), Some(16096898)],
6273                [Some(19), Some(16096899)],
6274                [Some(20), Some(16096900)],
6275                [Some(21), Some(16096901)],
6276                [Some(22), Some(16096902)],
6277                [Some(23), Some(16096903)],
6278                [Some(24), Some(16096904)],
6279                [Some(25), Some(16096905)],
6280                [Some(26), Some(16096906)],
6281                [Some(27), Some(16096907)],
6282                [Some(28), Some(16096908)],
6283                [Some(29), Some(16096909)],
6284                [Some(30), Some(16096910)],
6285                [Some(31), Some(16096911)],
6286                [Some(32), Some(16096912)],
6287                [Some(33), Some(16096913)],
6288                [Some(34), Some(16096914)],
6289                [Some(35), Some(16096915)],
6290                [Some(36), Some(16096916)],
6291                [Some(37), Some(16096917)],
6292                [Some(38), Some(16096918)],
6293                [Some(39), Some(16096919)],
6294                [Some(40), Some(16096920)],
6295                [Some(41), Some(16096921)],
6296                [Some(42), Some(16096922)],
6297                [Some(43), Some(16096923)],
6298                [Some(44), Some(16096924)],
6299                [Some(45), Some(16096925)],
6300                [Some(46), Some(16096926)],
6301                [Some(47), Some(16096927)],
6302                [Some(48), Some(16096928)],
6303                [Some(49), Some(16096929)],
6304                [Some(50), Some(16096930)]
6305            ]
6306        );
6307        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6308        assert_eq!(
6309            pairs,
6310            vec![
6311                [Some(0), Some(16097145)],
6312                [Some(1), Some(16097146)],
6313                [Some(2), Some(16097147)],
6314                [Some(3), Some(16097148)],
6315                [Some(4), Some(16097149)],
6316                [Some(5), Some(16097150)],
6317                [Some(6), Some(16097151)],
6318                [Some(7), Some(16097152)],
6319                [Some(8), Some(16097153)],
6320                [Some(9), Some(16097154)],
6321                [Some(10), Some(16097155)],
6322                [Some(11), Some(16097156)],
6323                [Some(12), Some(16097157)],
6324                [Some(13), Some(16097158)],
6325                [Some(14), Some(16097159)],
6326                [Some(15), Some(16097160)],
6327                [Some(16), Some(16097161)],
6328                [Some(17), Some(16097162)],
6329                [Some(18), Some(16097163)],
6330                [Some(19), Some(16097164)],
6331                [Some(20), Some(16097165)],
6332                [Some(21), Some(16097166)],
6333                [Some(22), Some(16097167)],
6334                [Some(23), Some(16097168)],
6335                [Some(24), Some(16097169)],
6336                [Some(25), Some(16097170)],
6337                [Some(26), Some(16097171)],
6338                [Some(27), Some(16097172)],
6339                [Some(28), Some(16097173)],
6340                [None, Some(16097174)],
6341                [None, Some(16097175)],
6342                [Some(29), Some(16097176)],
6343                [Some(30), Some(16097177)],
6344                [Some(31), Some(16097178)],
6345                [Some(32), Some(16097179)],
6346                [Some(33), Some(16097180)],
6347                [Some(34), Some(16097181)],
6348                [Some(35), Some(16097182)],
6349                [Some(36), Some(16097183)],
6350                [Some(37), Some(16097184)],
6351                [Some(38), Some(16097185)],
6352                [Some(39), Some(16097186)],
6353                [Some(40), Some(16097187)],
6354                [Some(41), Some(16097188)],
6355                [Some(42), Some(16097189)],
6356                [Some(43), Some(16097190)],
6357                [Some(44), Some(16097191)],
6358                [Some(45), Some(16097192)],
6359                [Some(46), Some(16097193)],
6360                [Some(47), Some(16097194)],
6361                [Some(48), Some(16097195)],
6362                [Some(49), Some(16097196)],
6363                [Some(50), Some(16097197)]
6364            ]
6365        );
6366        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6367        assert_eq!(
6368            pairs,
6369            vec![
6370                [Some(0), Some(16117350)],
6371                [Some(1), Some(16117351)],
6372                [Some(2), Some(16117352)],
6373                [Some(3), Some(16117353)],
6374                [Some(4), Some(16117354)],
6375                [Some(5), Some(16117355)],
6376                [Some(6), Some(16117356)],
6377                [Some(7), Some(16117357)],
6378                [Some(8), Some(16117358)],
6379                [Some(9), Some(16117359)],
6380                [Some(10), Some(16117360)],
6381                [Some(11), Some(16117361)],
6382                [Some(12), Some(16117362)],
6383                [Some(13), Some(16117363)],
6384                [Some(14), Some(16117364)],
6385                [Some(15), Some(16117365)],
6386                [Some(16), Some(16117366)],
6387                [Some(17), Some(16117367)],
6388                [Some(18), Some(16117368)],
6389                [Some(19), Some(16117369)],
6390                [Some(20), Some(16117370)],
6391                [Some(21), Some(16117371)],
6392                [Some(22), Some(16117372)],
6393                [Some(23), Some(16117373)],
6394                [Some(24), Some(16117374)],
6395                [Some(25), Some(16117375)],
6396                [Some(26), Some(16117376)],
6397                [Some(27), Some(16117377)],
6398                [Some(28), Some(16117378)],
6399                [Some(29), Some(16117379)],
6400                [Some(30), Some(16117380)],
6401                [Some(31), Some(16117381)],
6402                [Some(32), Some(16117382)],
6403                [Some(33), Some(16117383)],
6404                [Some(34), Some(16117384)],
6405                [Some(35), Some(16117385)],
6406                [Some(36), Some(16117386)],
6407                [Some(37), Some(16117387)],
6408                [Some(38), Some(16117388)],
6409                [Some(39), Some(16117389)],
6410                [Some(40), Some(16117390)],
6411                [Some(41), Some(16117391)],
6412                [Some(42), Some(16117392)],
6413                [Some(43), Some(16117393)],
6414                [Some(44), Some(16117394)],
6415                [Some(45), Some(16117395)],
6416                [Some(46), Some(16117396)],
6417                [Some(47), Some(16117397)],
6418                [Some(48), Some(16117398)],
6419                [Some(49), Some(16117399)],
6420                [Some(50), Some(16117400)]
6421            ]
6422        );
6423        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6424        assert_eq!(
6425            pairs,
6426            vec![
6427                [Some(0), Some(16118483)],
6428                [Some(1), Some(16118484)],
6429                [Some(2), Some(16118485)],
6430                [Some(3), Some(16118486)],
6431                [Some(4), Some(16118487)],
6432                [Some(5), Some(16118488)],
6433                [Some(6), Some(16118489)],
6434                [Some(7), Some(16118490)],
6435                [Some(8), Some(16118491)],
6436                [Some(9), Some(16118492)],
6437                [Some(10), Some(16118493)],
6438                [Some(11), Some(16118494)],
6439                [Some(12), Some(16118495)],
6440                [Some(13), Some(16118496)],
6441                [Some(14), Some(16118497)],
6442                [Some(15), Some(16118498)],
6443                [Some(16), Some(16118499)],
6444                [Some(17), Some(16118500)],
6445                [Some(18), Some(16118501)],
6446                [Some(19), Some(16118502)],
6447                [Some(20), Some(16118503)],
6448                [Some(21), Some(16118504)],
6449                [Some(22), Some(16118505)],
6450                [Some(23), Some(16118506)],
6451                [Some(24), Some(16118507)],
6452                [Some(25), Some(16118508)],
6453                [Some(26), Some(16118509)],
6454                [Some(27), Some(16118510)],
6455                [Some(28), Some(16118511)],
6456                [Some(29), Some(16118512)],
6457                [Some(30), Some(16118513)],
6458                [Some(31), Some(16118514)],
6459                [Some(32), Some(16118515)],
6460                [Some(33), Some(16118516)],
6461                [Some(34), Some(16118517)],
6462                [Some(35), Some(16118518)],
6463                [Some(36), Some(16118519)],
6464                [Some(37), Some(16118520)],
6465                [Some(38), Some(16118521)],
6466                [Some(39), Some(16118522)],
6467                [Some(40), Some(16118523)],
6468                [Some(41), Some(16118524)],
6469                [Some(42), Some(16118525)],
6470                [Some(43), Some(16118526)],
6471                [Some(44), Some(16118527)],
6472                [Some(45), Some(16118528)],
6473                [Some(46), Some(16118529)],
6474                [Some(47), Some(16118530)],
6475                [Some(48), Some(16118531)],
6476                [Some(49), Some(16118532)],
6477                [Some(50), Some(16118533)]
6478            ]
6479        );
6480
6481        //
6482        //for the rest, we just verify that they have the expected amount of None in each position
6483        fn some_count(pairs: &[[Option<i64>; 2]], pos: usize) -> i64 {
6484            pairs.iter().filter(|x| x[pos].is_some()).count() as i64
6485        }
6486        fn none_count(pairs: &[[Option<i64>; 2]], pos: usize) -> i64 {
6487            pairs.iter().filter(|x| x[pos].is_none()).count() as i64
6488        }
6489
6490        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6491        assert_eq!(some_count(&pairs, 0), 51);
6492        assert_eq!(none_count(&pairs, 0), 0);
6493        assert_eq!(some_count(&pairs, 1), 51);
6494        assert_eq!(none_count(&pairs, 1), 0);
6495        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6496        assert_eq!(some_count(&pairs, 0), 51);
6497        assert_eq!(none_count(&pairs, 0), 0);
6498        assert_eq!(some_count(&pairs, 1), 51);
6499        assert_eq!(none_count(&pairs, 1), 0);
6500        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6501        assert_eq!(some_count(&pairs, 0), 51);
6502        assert_eq!(none_count(&pairs, 0), 0);
6503        assert_eq!(some_count(&pairs, 1), 51);
6504        assert_eq!(none_count(&pairs, 1), 0);
6505        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6506        assert_eq!(some_count(&pairs, 0), 51);
6507        assert_eq!(none_count(&pairs, 0), 0);
6508        assert_eq!(some_count(&pairs, 1), 51);
6509        assert_eq!(none_count(&pairs, 1), 0);
6510        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6511        assert_eq!(some_count(&pairs, 0), 51);
6512        assert_eq!(none_count(&pairs, 0), 0);
6513        assert_eq!(some_count(&pairs, 1), 45);
6514        assert_eq!(none_count(&pairs, 1), 6);
6515        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6516        assert_eq!(some_count(&pairs, 0), 51);
6517        assert_eq!(none_count(&pairs, 0), 0);
6518        assert_eq!(some_count(&pairs, 1), 41);
6519        assert_eq!(none_count(&pairs, 1), 10);
6520        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6521        assert_eq!(some_count(&pairs, 0), 51);
6522        assert_eq!(none_count(&pairs, 0), 0);
6523        assert_eq!(some_count(&pairs, 1), 51);
6524        assert_eq!(none_count(&pairs, 1), 0);
6525        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6526        assert_eq!(some_count(&pairs, 0), 51);
6527        assert_eq!(none_count(&pairs, 0), 0);
6528        assert_eq!(some_count(&pairs, 1), 51);
6529        assert_eq!(none_count(&pairs, 1), 0);
6530        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6531        assert_eq!(some_count(&pairs, 0), 51);
6532        assert_eq!(none_count(&pairs, 0), 0);
6533        assert_eq!(some_count(&pairs, 1), 51);
6534        assert_eq!(none_count(&pairs, 1), 0);
6535        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6536        assert_eq!(some_count(&pairs, 0), 51);
6537        assert_eq!(none_count(&pairs, 0), 0);
6538        assert_eq!(some_count(&pairs, 1), 51);
6539        assert_eq!(none_count(&pairs, 1), 0);
6540        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6541        assert_eq!(some_count(&pairs, 0), 51);
6542        assert_eq!(none_count(&pairs, 0), 0);
6543        assert_eq!(some_count(&pairs, 1), 42);
6544        assert_eq!(none_count(&pairs, 1), 9);
6545        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6546        assert_eq!(some_count(&pairs, 0), 51);
6547        assert_eq!(none_count(&pairs, 0), 0);
6548        assert_eq!(some_count(&pairs, 1), 51);
6549        assert_eq!(none_count(&pairs, 1), 0);
6550        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6551        assert_eq!(some_count(&pairs, 0), 51);
6552        assert_eq!(none_count(&pairs, 0), 0);
6553        assert_eq!(some_count(&pairs, 1), 50);
6554        assert_eq!(none_count(&pairs, 1), 1);
6555        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6556        assert_eq!(some_count(&pairs, 0), 51);
6557        assert_eq!(none_count(&pairs, 0), 0);
6558        assert_eq!(some_count(&pairs, 1), 45);
6559        assert_eq!(none_count(&pairs, 1), 6);
6560        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6561        assert_eq!(some_count(&pairs, 0), 51);
6562        assert_eq!(none_count(&pairs, 0), 0);
6563        assert_eq!(some_count(&pairs, 1), 48);
6564        assert_eq!(none_count(&pairs, 1), 3);
6565        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6566        assert_eq!(some_count(&pairs, 0), 51);
6567        assert_eq!(none_count(&pairs, 0), 0);
6568        assert_eq!(some_count(&pairs, 1), 42);
6569        assert_eq!(none_count(&pairs, 1), 9);
6570        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6571        assert_eq!(some_count(&pairs, 0), 51);
6572        assert_eq!(none_count(&pairs, 0), 0);
6573        assert_eq!(some_count(&pairs, 1), 38);
6574        assert_eq!(none_count(&pairs, 1), 13);
6575        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6576        assert_eq!(some_count(&pairs, 0), 51);
6577        assert_eq!(none_count(&pairs, 0), 0);
6578        assert_eq!(some_count(&pairs, 1), 44);
6579        assert_eq!(none_count(&pairs, 1), 7);
6580        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6581        assert_eq!(some_count(&pairs, 0), 51);
6582        assert_eq!(none_count(&pairs, 0), 0);
6583        assert_eq!(some_count(&pairs, 1), 46);
6584        assert_eq!(none_count(&pairs, 1), 5);
6585        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6586        assert_eq!(some_count(&pairs, 0), 51);
6587        assert_eq!(none_count(&pairs, 0), 0);
6588        assert_eq!(some_count(&pairs, 1), 47);
6589        assert_eq!(none_count(&pairs, 1), 4);
6590        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6591        assert_eq!(some_count(&pairs, 0), 51);
6592        assert_eq!(none_count(&pairs, 0), 0);
6593        assert_eq!(some_count(&pairs, 1), 50);
6594        assert_eq!(none_count(&pairs, 1), 1);
6595        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6596        assert_eq!(some_count(&pairs, 0), 51);
6597        assert_eq!(none_count(&pairs, 0), 2183);
6598        assert_eq!(some_count(&pairs, 1), 2234);
6599        assert_eq!(none_count(&pairs, 1), 0);
6600        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6601        assert_eq!(some_count(&pairs, 0), 51);
6602        assert_eq!(none_count(&pairs, 0), 2183);
6603        assert_eq!(some_count(&pairs, 1), 2234);
6604        assert_eq!(none_count(&pairs, 1), 0);
6605        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6606        assert_eq!(some_count(&pairs, 0), 51);
6607        assert_eq!(none_count(&pairs, 0), 2183);
6608        assert_eq!(some_count(&pairs, 1), 2234);
6609        assert_eq!(none_count(&pairs, 1), 0);
6610        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6611        assert_eq!(some_count(&pairs, 0), 51);
6612        assert_eq!(none_count(&pairs, 0), 0);
6613        assert_eq!(some_count(&pairs, 1), 33);
6614        assert_eq!(none_count(&pairs, 1), 18);
6615        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6616        assert_eq!(some_count(&pairs, 0), 51);
6617        assert_eq!(none_count(&pairs, 0), 0);
6618        assert_eq!(some_count(&pairs, 1), 48);
6619        assert_eq!(none_count(&pairs, 1), 3);
6620        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6621        assert_eq!(some_count(&pairs, 0), 51);
6622        assert_eq!(none_count(&pairs, 0), 0);
6623        assert_eq!(some_count(&pairs, 1), 45);
6624        assert_eq!(none_count(&pairs, 1), 6);
6625        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6626        assert_eq!(some_count(&pairs, 0), 51);
6627        assert_eq!(none_count(&pairs, 0), 11832);
6628        assert_eq!(some_count(&pairs, 1), 11883);
6629        assert_eq!(none_count(&pairs, 1), 0);
6630        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6631        assert_eq!(some_count(&pairs, 0), 51);
6632        assert_eq!(none_count(&pairs, 0), 12542);
6633        assert_eq!(some_count(&pairs, 1), 12593);
6634        assert_eq!(none_count(&pairs, 1), 0);
6635        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6636        assert_eq!(some_count(&pairs, 0), 51);
6637        assert_eq!(none_count(&pairs, 0), 12542);
6638        assert_eq!(some_count(&pairs, 1), 12593);
6639        assert_eq!(none_count(&pairs, 1), 0);
6640        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6641        assert_eq!(some_count(&pairs, 0), 51);
6642        assert_eq!(none_count(&pairs, 0), 12542);
6643        assert_eq!(some_count(&pairs, 1), 12593);
6644        assert_eq!(none_count(&pairs, 1), 0);
6645        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6646        assert_eq!(some_count(&pairs, 0), 51);
6647        assert_eq!(none_count(&pairs, 0), 12542);
6648        assert_eq!(some_count(&pairs, 1), 12593);
6649        assert_eq!(none_count(&pairs, 1), 0);
6650        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6651        assert_eq!(some_count(&pairs, 0), 51);
6652        assert_eq!(none_count(&pairs, 0), 12542);
6653        assert_eq!(some_count(&pairs, 1), 12593);
6654        assert_eq!(none_count(&pairs, 1), 0);
6655        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6656        assert_eq!(some_count(&pairs, 0), 51);
6657        assert_eq!(none_count(&pairs, 0), 12542);
6658        assert_eq!(some_count(&pairs, 1), 12593);
6659        assert_eq!(none_count(&pairs, 1), 0);
6660        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6661        assert_eq!(some_count(&pairs, 0), 51);
6662        assert_eq!(none_count(&pairs, 0), 12542);
6663        assert_eq!(some_count(&pairs, 1), 12593);
6664        assert_eq!(none_count(&pairs, 1), 0);
6665        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6666        assert_eq!(some_count(&pairs, 0), 51);
6667        assert_eq!(none_count(&pairs, 0), 12542);
6668        assert_eq!(some_count(&pairs, 1), 12593);
6669        assert_eq!(none_count(&pairs, 1), 0);
6670        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6671        assert_eq!(some_count(&pairs, 0), 51);
6672        assert_eq!(none_count(&pairs, 0), 1467);
6673        assert_eq!(some_count(&pairs, 1), 1517);
6674        assert_eq!(none_count(&pairs, 1), 1);
6675        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6676        assert_eq!(some_count(&pairs, 0), 51);
6677        assert_eq!(none_count(&pairs, 0), 1609);
6678        assert_eq!(some_count(&pairs, 1), 1660);
6679        assert_eq!(none_count(&pairs, 1), 0);
6680        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6681        assert_eq!(some_count(&pairs, 0), 51);
6682        assert_eq!(none_count(&pairs, 0), 1609);
6683        assert_eq!(some_count(&pairs, 1), 1660);
6684        assert_eq!(none_count(&pairs, 1), 0);
6685        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6686        assert_eq!(some_count(&pairs, 0), 51);
6687        assert_eq!(none_count(&pairs, 0), 1609);
6688        assert_eq!(some_count(&pairs, 1), 1660);
6689        assert_eq!(none_count(&pairs, 1), 0);
6690        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6691        assert_eq!(some_count(&pairs, 0), 51);
6692        assert_eq!(none_count(&pairs, 0), 95);
6693        assert_eq!(some_count(&pairs, 1), 145);
6694        assert_eq!(none_count(&pairs, 1), 1);
6695        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6696        assert_eq!(some_count(&pairs, 0), 51);
6697        assert_eq!(none_count(&pairs, 0), 538);
6698        assert_eq!(some_count(&pairs, 1), 588);
6699        assert_eq!(none_count(&pairs, 1), 1);
6700        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6701        assert_eq!(some_count(&pairs, 0), 51);
6702        assert_eq!(none_count(&pairs, 0), 538);
6703        assert_eq!(some_count(&pairs, 1), 588);
6704        assert_eq!(none_count(&pairs, 1), 1);
6705        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6706        assert_eq!(some_count(&pairs, 0), 51);
6707        assert_eq!(none_count(&pairs, 0), 538);
6708        assert_eq!(some_count(&pairs, 1), 588);
6709        assert_eq!(none_count(&pairs, 1), 1);
6710        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6711        assert_eq!(some_count(&pairs, 0), 51);
6712        assert_eq!(none_count(&pairs, 0), 1);
6713        assert_eq!(some_count(&pairs, 1), 51);
6714        assert_eq!(none_count(&pairs, 1), 1);
6715        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6716        assert_eq!(some_count(&pairs, 0), 51);
6717        assert_eq!(none_count(&pairs, 0), 1);
6718        assert_eq!(some_count(&pairs, 1), 49);
6719        assert_eq!(none_count(&pairs, 1), 3);
6720        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6721        assert_eq!(some_count(&pairs, 0), 51);
6722        assert_eq!(none_count(&pairs, 0), 1);
6723        assert_eq!(some_count(&pairs, 1), 45);
6724        assert_eq!(none_count(&pairs, 1), 7);
6725        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6726        assert_eq!(some_count(&pairs, 0), 51);
6727        assert_eq!(none_count(&pairs, 0), 0);
6728        assert_eq!(some_count(&pairs, 1), 39);
6729        assert_eq!(none_count(&pairs, 1), 12);
6730        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6731        assert_eq!(some_count(&pairs, 0), 51);
6732        assert_eq!(none_count(&pairs, 0), 1892);
6733        assert_eq!(some_count(&pairs, 1), 1938);
6734        assert_eq!(none_count(&pairs, 1), 5);
6735        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6736        assert_eq!(some_count(&pairs, 0), 51);
6737        assert_eq!(none_count(&pairs, 0), 1892);
6738        assert_eq!(some_count(&pairs, 1), 1941);
6739        assert_eq!(none_count(&pairs, 1), 2);
6740        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6741        assert_eq!(some_count(&pairs, 0), 51);
6742        assert_eq!(none_count(&pairs, 0), 2288);
6743        assert_eq!(some_count(&pairs, 1), 2338);
6744        assert_eq!(none_count(&pairs, 1), 1);
6745        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6746        assert_eq!(some_count(&pairs, 0), 51);
6747        assert_eq!(none_count(&pairs, 0), 14680);
6748        assert_eq!(some_count(&pairs, 1), 14729);
6749        assert_eq!(none_count(&pairs, 1), 2);
6750        let pairs: Vec<_> = it.next().unwrap().unwrap().aligned_pairs_full().collect();
6751        assert_eq!(some_count(&pairs, 0), 51);
6752        assert_eq!(none_count(&pairs, 0), 4027);
6753        assert_eq!(some_count(&pairs, 1), 4074);
6754        assert_eq!(none_count(&pairs, 1), 4);
6755    }
6756
6757    #[test]
6758    fn test_aligned_block_pairs() {
6759        let mut bam = bam::Reader::from_path("./test/test_spliced_reads.bam").unwrap();
6760        let mut it = bam.records();
6761
6762        let read = it.next().unwrap().unwrap();
6763        let pairs: Vec<_> = read.aligned_pairs().collect();
6764        let block_pairs: Vec<_> = read.aligned_block_pairs().collect();
6765
6766        //first coordinates identical
6767        assert_eq!(pairs[0][0], block_pairs[0].0[0]); //read
6768        assert_eq!(pairs[0][1], block_pairs[0].1[0]); // genomic
6769
6770        //end coordinates are + 1, so the ranges are the same...
6771        assert_eq!(
6772            pairs[pairs.len() - 1][0],
6773            block_pairs[block_pairs.len() - 1].0[1] - 1
6774        );
6775        assert_eq!(
6776            pairs[pairs.len() - 1][1],
6777            block_pairs[block_pairs.len() - 1].1[1] - 1
6778        );
6779
6780        //let's see if they're really identical
6781        for read in it {
6782            let read = read.unwrap();
6783            let pairs: Vec<_> = read.aligned_pairs().collect();
6784            let block_pairs: Vec<_> = read.aligned_block_pairs().collect();
6785            let mut ii = 0;
6786            for ([read_start, read_stop], [genome_start, genome_stop]) in block_pairs {
6787                assert_eq!(read_stop - read_start, genome_stop - genome_start);
6788                for (read_pos, genome_pos) in (read_start..read_stop).zip(genome_start..genome_stop)
6789                {
6790                    assert_eq!(pairs[ii][0], read_pos);
6791                    assert_eq!(pairs[ii][1], genome_pos);
6792                    ii += 1;
6793                }
6794            }
6795        }
6796    }
6797
6798    #[test]
6799    fn test_get_cigar_stats() {
6800        let mut bam = bam::Reader::from_path("./test/test_spliced_reads.bam").unwrap();
6801        let mut it = bam.records();
6802
6803        fn to_arr(hm: HashMap<Cigar, i32>) -> [i32; 9] {
6804            [
6805                *hm.get(&Cigar::Match(0)).unwrap(),
6806                *hm.get(&Cigar::Ins(0)).unwrap(),
6807                *hm.get(&Cigar::Del(0)).unwrap(),
6808                *hm.get(&Cigar::RefSkip(0)).unwrap(),
6809                *hm.get(&Cigar::SoftClip(0)).unwrap(),
6810                *hm.get(&Cigar::HardClip(0)).unwrap(),
6811                *hm.get(&Cigar::Pad(0)).unwrap(),
6812                *hm.get(&Cigar::Equal(0)).unwrap(),
6813                *hm.get(&Cigar::Diff(0)).unwrap(),
6814            ]
6815        }
6816
6817        let read = it.next().unwrap().unwrap();
6818        let cigar_nucleotides = read.cigar_stats_nucleotides();
6819        assert_eq!(to_arr(cigar_nucleotides), [45, 0, 0, 0, 6, 0, 0, 0, 0]);
6820        let cigar_blocks = read.cigar_stats_blocks();
6821        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 1, 0, 0, 0, 0]);
6822        let read = it.next().unwrap().unwrap();
6823        let cigar_nucleotides = read.cigar_stats_nucleotides();
6824        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 2, 0, 0, 0, 0, 0, 0]);
6825        let cigar_blocks = read.cigar_stats_blocks();
6826        assert_eq!(to_arr(cigar_blocks), [2, 0, 1, 0, 0, 0, 0, 0, 0]);
6827        let read = it.next().unwrap().unwrap();
6828        let cigar_nucleotides = read.cigar_stats_nucleotides();
6829        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 2, 0, 0, 0, 0, 0, 0]);
6830        let cigar_blocks = read.cigar_stats_blocks();
6831        assert_eq!(to_arr(cigar_blocks), [2, 0, 1, 0, 0, 0, 0, 0, 0]);
6832        let read = it.next().unwrap().unwrap();
6833        let cigar_nucleotides = read.cigar_stats_nucleotides();
6834        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 0, 0, 0, 0, 0, 0]);
6835        let cigar_blocks = read.cigar_stats_blocks();
6836        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 0, 0, 0, 0, 0]);
6837        let read = it.next().unwrap().unwrap();
6838        let cigar_nucleotides = read.cigar_stats_nucleotides();
6839        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 0, 0, 0, 0, 0, 0]);
6840        let cigar_blocks = read.cigar_stats_blocks();
6841        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 0, 0, 0, 0, 0]);
6842        let read = it.next().unwrap().unwrap();
6843        let cigar_nucleotides = read.cigar_stats_nucleotides();
6844        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 0, 0, 0, 0, 0, 0]);
6845        let cigar_blocks = read.cigar_stats_blocks();
6846        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 0, 0, 0, 0, 0]);
6847        let read = it.next().unwrap().unwrap();
6848        let cigar_nucleotides = read.cigar_stats_nucleotides();
6849        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 0, 0, 0, 0, 0, 0]);
6850        let cigar_blocks = read.cigar_stats_blocks();
6851        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 0, 0, 0, 0, 0]);
6852        let read = it.next().unwrap().unwrap();
6853        let cigar_nucleotides = read.cigar_stats_nucleotides();
6854        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 0, 0, 0, 0, 0, 0]);
6855        let cigar_blocks = read.cigar_stats_blocks();
6856        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 0, 0, 0, 0, 0]);
6857        let read = it.next().unwrap().unwrap();
6858        let cigar_nucleotides = read.cigar_stats_nucleotides();
6859        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 0, 0, 0, 0, 0, 0]);
6860        let cigar_blocks = read.cigar_stats_blocks();
6861        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 0, 0, 0, 0, 0]);
6862        let read = it.next().unwrap().unwrap();
6863        let cigar_nucleotides = read.cigar_stats_nucleotides();
6864        assert_eq!(to_arr(cigar_nucleotides), [45, 0, 0, 0, 6, 0, 0, 0, 0]);
6865        let cigar_blocks = read.cigar_stats_blocks();
6866        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 1, 0, 0, 0, 0]);
6867        let read = it.next().unwrap().unwrap();
6868        let cigar_nucleotides = read.cigar_stats_nucleotides();
6869        assert_eq!(to_arr(cigar_nucleotides), [41, 0, 0, 0, 10, 0, 0, 0, 0]);
6870        let cigar_blocks = read.cigar_stats_blocks();
6871        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 1, 0, 0, 0, 0]);
6872        let read = it.next().unwrap().unwrap();
6873        let cigar_nucleotides = read.cigar_stats_nucleotides();
6874        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 0, 0, 0, 0, 0, 0]);
6875        let cigar_blocks = read.cigar_stats_blocks();
6876        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 0, 0, 0, 0, 0]);
6877        let read = it.next().unwrap().unwrap();
6878        let cigar_nucleotides = read.cigar_stats_nucleotides();
6879        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 0, 0, 0, 0, 0, 0]);
6880        let cigar_blocks = read.cigar_stats_blocks();
6881        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 0, 0, 0, 0, 0]);
6882        let read = it.next().unwrap().unwrap();
6883        let cigar_nucleotides = read.cigar_stats_nucleotides();
6884        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 0, 0, 0, 0, 0, 0]);
6885        let cigar_blocks = read.cigar_stats_blocks();
6886        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 0, 0, 0, 0, 0]);
6887        let read = it.next().unwrap().unwrap();
6888        let cigar_nucleotides = read.cigar_stats_nucleotides();
6889        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 0, 0, 0, 0, 0, 0]);
6890        let cigar_blocks = read.cigar_stats_blocks();
6891        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 0, 0, 0, 0, 0]);
6892        let read = it.next().unwrap().unwrap();
6893        let cigar_nucleotides = read.cigar_stats_nucleotides();
6894        assert_eq!(to_arr(cigar_nucleotides), [42, 0, 0, 0, 9, 0, 0, 0, 0]);
6895        let cigar_blocks = read.cigar_stats_blocks();
6896        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 1, 0, 0, 0, 0]);
6897        let read = it.next().unwrap().unwrap();
6898        let cigar_nucleotides = read.cigar_stats_nucleotides();
6899        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 0, 0, 0, 0, 0, 0]);
6900        let cigar_blocks = read.cigar_stats_blocks();
6901        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 0, 0, 0, 0, 0]);
6902        let read = it.next().unwrap().unwrap();
6903        let cigar_nucleotides = read.cigar_stats_nucleotides();
6904        assert_eq!(to_arr(cigar_nucleotides), [50, 0, 0, 0, 1, 0, 0, 0, 0]);
6905        let cigar_blocks = read.cigar_stats_blocks();
6906        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 1, 0, 0, 0, 0]);
6907        let read = it.next().unwrap().unwrap();
6908        let cigar_nucleotides = read.cigar_stats_nucleotides();
6909        assert_eq!(to_arr(cigar_nucleotides), [45, 0, 0, 0, 6, 0, 0, 0, 0]);
6910        let cigar_blocks = read.cigar_stats_blocks();
6911        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 1, 0, 0, 0, 0]);
6912        let read = it.next().unwrap().unwrap();
6913        let cigar_nucleotides = read.cigar_stats_nucleotides();
6914        assert_eq!(to_arr(cigar_nucleotides), [48, 0, 0, 0, 3, 0, 0, 0, 0]);
6915        let cigar_blocks = read.cigar_stats_blocks();
6916        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 1, 0, 0, 0, 0]);
6917        let read = it.next().unwrap().unwrap();
6918        let cigar_nucleotides = read.cigar_stats_nucleotides();
6919        assert_eq!(to_arr(cigar_nucleotides), [42, 0, 0, 0, 9, 0, 0, 0, 0]);
6920        let cigar_blocks = read.cigar_stats_blocks();
6921        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 1, 0, 0, 0, 0]);
6922        let read = it.next().unwrap().unwrap();
6923        let cigar_nucleotides = read.cigar_stats_nucleotides();
6924        assert_eq!(to_arr(cigar_nucleotides), [38, 0, 0, 0, 13, 0, 0, 0, 0]);
6925        let cigar_blocks = read.cigar_stats_blocks();
6926        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 1, 0, 0, 0, 0]);
6927        let read = it.next().unwrap().unwrap();
6928        let cigar_nucleotides = read.cigar_stats_nucleotides();
6929        assert_eq!(to_arr(cigar_nucleotides), [44, 0, 0, 0, 7, 0, 0, 0, 0]);
6930        let cigar_blocks = read.cigar_stats_blocks();
6931        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 1, 0, 0, 0, 0]);
6932        let read = it.next().unwrap().unwrap();
6933        let cigar_nucleotides = read.cigar_stats_nucleotides();
6934        assert_eq!(to_arr(cigar_nucleotides), [46, 0, 0, 0, 5, 0, 0, 0, 0]);
6935        let cigar_blocks = read.cigar_stats_blocks();
6936        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 1, 0, 0, 0, 0]);
6937        let read = it.next().unwrap().unwrap();
6938        let cigar_nucleotides = read.cigar_stats_nucleotides();
6939        assert_eq!(to_arr(cigar_nucleotides), [47, 4, 0, 0, 0, 0, 0, 0, 0]);
6940        let cigar_blocks = read.cigar_stats_blocks();
6941        assert_eq!(to_arr(cigar_blocks), [2, 1, 0, 0, 0, 0, 0, 0, 0]);
6942        let read = it.next().unwrap().unwrap();
6943        let cigar_nucleotides = read.cigar_stats_nucleotides();
6944        assert_eq!(to_arr(cigar_nucleotides), [50, 1, 0, 0, 0, 0, 0, 0, 0]);
6945        let cigar_blocks = read.cigar_stats_blocks();
6946        assert_eq!(to_arr(cigar_blocks), [2, 1, 0, 0, 0, 0, 0, 0, 0]);
6947        let read = it.next().unwrap().unwrap();
6948        let cigar_nucleotides = read.cigar_stats_nucleotides();
6949        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 2183, 0, 0, 0, 0, 0]);
6950        let cigar_blocks = read.cigar_stats_blocks();
6951        assert_eq!(to_arr(cigar_blocks), [2, 0, 0, 1, 0, 0, 0, 0, 0]);
6952        let read = it.next().unwrap().unwrap();
6953        let cigar_nucleotides = read.cigar_stats_nucleotides();
6954        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 2183, 0, 0, 0, 0, 0]);
6955        let cigar_blocks = read.cigar_stats_blocks();
6956        assert_eq!(to_arr(cigar_blocks), [2, 0, 0, 1, 0, 0, 0, 0, 0]);
6957        let read = it.next().unwrap().unwrap();
6958        let cigar_nucleotides = read.cigar_stats_nucleotides();
6959        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 2183, 0, 0, 0, 0, 0]);
6960        let cigar_blocks = read.cigar_stats_blocks();
6961        assert_eq!(to_arr(cigar_blocks), [2, 0, 0, 1, 0, 0, 0, 0, 0]);
6962        let read = it.next().unwrap().unwrap();
6963        let cigar_nucleotides = read.cigar_stats_nucleotides();
6964        assert_eq!(to_arr(cigar_nucleotides), [33, 0, 0, 0, 18, 0, 0, 0, 0]);
6965        let cigar_blocks = read.cigar_stats_blocks();
6966        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 2, 0, 0, 0, 0]);
6967        let read = it.next().unwrap().unwrap();
6968        let cigar_nucleotides = read.cigar_stats_nucleotides();
6969        assert_eq!(to_arr(cigar_nucleotides), [48, 0, 0, 0, 3, 0, 0, 0, 0]);
6970        let cigar_blocks = read.cigar_stats_blocks();
6971        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 2, 0, 0, 0, 0]);
6972        let read = it.next().unwrap().unwrap();
6973        let cigar_nucleotides = read.cigar_stats_nucleotides();
6974        assert_eq!(to_arr(cigar_nucleotides), [45, 0, 0, 0, 6, 0, 0, 0, 0]);
6975        let cigar_blocks = read.cigar_stats_blocks();
6976        assert_eq!(to_arr(cigar_blocks), [1, 0, 0, 0, 2, 0, 0, 0, 0]);
6977        let read = it.next().unwrap().unwrap();
6978        let cigar_nucleotides = read.cigar_stats_nucleotides();
6979        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 11832, 0, 0, 0, 0, 0]);
6980        let cigar_blocks = read.cigar_stats_blocks();
6981        assert_eq!(to_arr(cigar_blocks), [2, 0, 0, 1, 0, 0, 0, 0, 0]);
6982        let read = it.next().unwrap().unwrap();
6983        let cigar_nucleotides = read.cigar_stats_nucleotides();
6984        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 12542, 0, 0, 0, 0, 0],);
6985        let cigar_blocks = read.cigar_stats_blocks();
6986        assert_eq!(to_arr(cigar_blocks), [3, 0, 0, 2, 0, 0, 0, 0, 0]);
6987        let read = it.next().unwrap().unwrap();
6988        let cigar_nucleotides = read.cigar_stats_nucleotides();
6989        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 12542, 0, 0, 0, 0, 0],);
6990        let cigar_blocks = read.cigar_stats_blocks();
6991        assert_eq!(to_arr(cigar_blocks), [3, 0, 0, 2, 0, 0, 0, 0, 0]);
6992        let read = it.next().unwrap().unwrap();
6993        let cigar_nucleotides = read.cigar_stats_nucleotides();
6994        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 12542, 0, 0, 0, 0, 0],);
6995        let cigar_blocks = read.cigar_stats_blocks();
6996        assert_eq!(to_arr(cigar_blocks), [3, 0, 0, 2, 0, 0, 0, 0, 0]);
6997        let read = it.next().unwrap().unwrap();
6998        let cigar_nucleotides = read.cigar_stats_nucleotides();
6999        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 12542, 0, 0, 0, 0, 0],);
7000        let cigar_blocks = read.cigar_stats_blocks();
7001        assert_eq!(to_arr(cigar_blocks), [3, 0, 0, 2, 0, 0, 0, 0, 0]);
7002        let read = it.next().unwrap().unwrap();
7003        let cigar_nucleotides = read.cigar_stats_nucleotides();
7004        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 12542, 0, 0, 0, 0, 0],);
7005        let cigar_blocks = read.cigar_stats_blocks();
7006        assert_eq!(to_arr(cigar_blocks), [3, 0, 0, 2, 0, 0, 0, 0, 0]);
7007        let read = it.next().unwrap().unwrap();
7008        let cigar_nucleotides = read.cigar_stats_nucleotides();
7009        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 12542, 0, 0, 0, 0, 0],);
7010        let cigar_blocks = read.cigar_stats_blocks();
7011        assert_eq!(to_arr(cigar_blocks), [3, 0, 0, 2, 0, 0, 0, 0, 0]);
7012        let read = it.next().unwrap().unwrap();
7013        let cigar_nucleotides = read.cigar_stats_nucleotides();
7014        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 12542, 0, 0, 0, 0, 0],);
7015        let cigar_blocks = read.cigar_stats_blocks();
7016        assert_eq!(to_arr(cigar_blocks), [3, 0, 0, 2, 0, 0, 0, 0, 0]);
7017        let read = it.next().unwrap().unwrap();
7018        let cigar_nucleotides = read.cigar_stats_nucleotides();
7019        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 12542, 0, 0, 0, 0, 0],);
7020        let cigar_blocks = read.cigar_stats_blocks();
7021        assert_eq!(to_arr(cigar_blocks), [3, 0, 0, 2, 0, 0, 0, 0, 0]);
7022        let read = it.next().unwrap().unwrap();
7023        let cigar_nucleotides = read.cigar_stats_nucleotides();
7024        assert_eq!(to_arr(cigar_nucleotides), [50, 0, 0, 1467, 1, 0, 0, 0, 0]);
7025        let cigar_blocks = read.cigar_stats_blocks();
7026        assert_eq!(to_arr(cigar_blocks), [2, 0, 0, 1, 1, 0, 0, 0, 0]);
7027        let read = it.next().unwrap().unwrap();
7028        let cigar_nucleotides = read.cigar_stats_nucleotides();
7029        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 1609, 0, 0, 0, 0, 0]);
7030        let cigar_blocks = read.cigar_stats_blocks();
7031        assert_eq!(to_arr(cigar_blocks), [3, 0, 0, 2, 0, 0, 0, 0, 0]);
7032        let read = it.next().unwrap().unwrap();
7033        let cigar_nucleotides = read.cigar_stats_nucleotides();
7034        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 1609, 0, 0, 0, 0, 0]);
7035        let cigar_blocks = read.cigar_stats_blocks();
7036        assert_eq!(to_arr(cigar_blocks), [3, 0, 0, 2, 0, 0, 0, 0, 0]);
7037        let read = it.next().unwrap().unwrap();
7038        let cigar_nucleotides = read.cigar_stats_nucleotides();
7039        assert_eq!(to_arr(cigar_nucleotides), [51, 0, 0, 1609, 0, 0, 0, 0, 0]);
7040        let cigar_blocks = read.cigar_stats_blocks();
7041        assert_eq!(to_arr(cigar_blocks), [3, 0, 0, 2, 0, 0, 0, 0, 0]);
7042        let read = it.next().unwrap().unwrap();
7043        let cigar_nucleotides = read.cigar_stats_nucleotides();
7044        assert_eq!(to_arr(cigar_nucleotides), [50, 0, 0, 95, 1, 0, 0, 0, 0]);
7045        let cigar_blocks = read.cigar_stats_blocks();
7046        assert_eq!(to_arr(cigar_blocks), [2, 0, 0, 1, 1, 0, 0, 0, 0]);
7047        let read = it.next().unwrap().unwrap();
7048        let cigar_nucleotides = read.cigar_stats_nucleotides();
7049        assert_eq!(to_arr(cigar_nucleotides), [50, 0, 0, 538, 1, 0, 0, 0, 0]);
7050        let cigar_blocks = read.cigar_stats_blocks();
7051        assert_eq!(to_arr(cigar_blocks), [2, 0, 0, 1, 1, 0, 0, 0, 0]);
7052        let read = it.next().unwrap().unwrap();
7053        let cigar_nucleotides = read.cigar_stats_nucleotides();
7054        assert_eq!(to_arr(cigar_nucleotides), [50, 0, 0, 538, 1, 0, 0, 0, 0]);
7055        let cigar_blocks = read.cigar_stats_blocks();
7056        assert_eq!(to_arr(cigar_blocks), [2, 0, 0, 1, 1, 0, 0, 0, 0]);
7057        let read = it.next().unwrap().unwrap();
7058        let cigar_nucleotides = read.cigar_stats_nucleotides();
7059        assert_eq!(to_arr(cigar_nucleotides), [50, 0, 0, 538, 1, 0, 0, 0, 0]);
7060        let cigar_blocks = read.cigar_stats_blocks();
7061        assert_eq!(to_arr(cigar_blocks), [2, 0, 0, 1, 1, 0, 0, 0, 0]);
7062        let read = it.next().unwrap().unwrap();
7063        let cigar_nucleotides = read.cigar_stats_nucleotides();
7064        assert_eq!(to_arr(cigar_nucleotides), [50, 0, 1, 0, 1, 0, 0, 0, 0]);
7065        let cigar_blocks = read.cigar_stats_blocks();
7066        assert_eq!(to_arr(cigar_blocks), [2, 0, 1, 0, 1, 0, 0, 0, 0]);
7067        let read = it.next().unwrap().unwrap();
7068        let cigar_nucleotides = read.cigar_stats_nucleotides();
7069        assert_eq!(to_arr(cigar_nucleotides), [48, 0, 1, 0, 3, 0, 0, 0, 0]);
7070        let cigar_blocks = read.cigar_stats_blocks();
7071        assert_eq!(to_arr(cigar_blocks), [2, 0, 1, 0, 1, 0, 0, 0, 0]);
7072        let read = it.next().unwrap().unwrap();
7073        let cigar_nucleotides = read.cigar_stats_nucleotides();
7074        assert_eq!(to_arr(cigar_nucleotides), [44, 0, 1, 0, 7, 0, 0, 0, 0]);
7075        let cigar_blocks = read.cigar_stats_blocks();
7076        assert_eq!(to_arr(cigar_blocks), [2, 0, 1, 0, 1, 0, 0, 0, 0]);
7077        let read = it.next().unwrap().unwrap();
7078        let cigar_nucleotides = read.cigar_stats_nucleotides();
7079        assert_eq!(to_arr(cigar_nucleotides), [39, 1, 0, 0, 11, 0, 0, 0, 0]);
7080        let cigar_blocks = read.cigar_stats_blocks();
7081        assert_eq!(to_arr(cigar_blocks), [2, 1, 0, 0, 1, 0, 0, 0, 0]);
7082        let read = it.next().unwrap().unwrap();
7083        let cigar_nucleotides = read.cigar_stats_nucleotides();
7084        assert_eq!(to_arr(cigar_nucleotides), [46, 0, 0, 1892, 5, 0, 0, 0, 0]);
7085        let cigar_blocks = read.cigar_stats_blocks();
7086        assert_eq!(to_arr(cigar_blocks), [2, 0, 0, 1, 1, 0, 0, 0, 0]);
7087        let read = it.next().unwrap().unwrap();
7088        let cigar_nucleotides = read.cigar_stats_nucleotides();
7089        assert_eq!(to_arr(cigar_nucleotides), [49, 0, 0, 1892, 2, 0, 0, 0, 0]);
7090        let cigar_blocks = read.cigar_stats_blocks();
7091        assert_eq!(to_arr(cigar_blocks), [2, 0, 0, 1, 1, 0, 0, 0, 0]);
7092        let read = it.next().unwrap().unwrap();
7093        let cigar_nucleotides = read.cigar_stats_nucleotides();
7094        assert_eq!(to_arr(cigar_nucleotides), [50, 0, 3, 2285, 1, 0, 0, 0, 0]);
7095        let cigar_blocks = read.cigar_stats_blocks();
7096        assert_eq!(to_arr(cigar_blocks), [3, 0, 1, 1, 1, 0, 0, 0, 0]);
7097        let read = it.next().unwrap().unwrap();
7098        let cigar_nucleotides = read.cigar_stats_nucleotides();
7099        assert_eq!(to_arr(cigar_nucleotides), [49, 0, 0, 14680, 2, 0, 0, 0, 0],);
7100        let cigar_blocks = read.cigar_stats_blocks();
7101        assert_eq!(to_arr(cigar_blocks), [3, 0, 0, 2, 1, 0, 0, 0, 0]);
7102        let read = it.next().unwrap().unwrap();
7103        let cigar_nucleotides = read.cigar_stats_nucleotides();
7104        assert_eq!(to_arr(cigar_nucleotides), [47, 0, 0, 4027, 4, 0, 0, 0, 0]);
7105        let cigar_blocks = read.cigar_stats_blocks();
7106        assert_eq!(to_arr(cigar_blocks), [3, 0, 0, 2, 1, 0, 0, 0, 0]);
7107    }
7108
7109    #[test]
7110    fn test_reference_positions() {
7111        let mut bam = bam::Reader::from_path("./test/test_spliced_reads.bam").unwrap();
7112        let mut it = bam.records();
7113
7114        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7115        assert_eq!(
7116            rp,
7117            vec![
7118                16050676, 16050677, 16050678, 16050679, 16050680, 16050681, 16050682, 16050683,
7119                16050684, 16050685, 16050686, 16050687, 16050688, 16050689, 16050690, 16050691,
7120                16050692, 16050693, 16050694, 16050695, 16050696, 16050697, 16050698, 16050699,
7121                16050700, 16050701, 16050702, 16050703, 16050704, 16050705, 16050706, 16050707,
7122                16050708, 16050709, 16050710, 16050711, 16050712, 16050713, 16050714, 16050715,
7123                16050716, 16050717, 16050718, 16050719, 16050720
7124            ]
7125        );
7126        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7127        assert_eq!(
7128            rp,
7129            vec![
7130                16096878, 16096879, 16096880, 16096881, 16096882, 16096883, 16096884, 16096887,
7131                16096888, 16096889, 16096890, 16096891, 16096892, 16096893, 16096894, 16096895,
7132                16096896, 16096897, 16096898, 16096899, 16096900, 16096901, 16096902, 16096903,
7133                16096904, 16096905, 16096906, 16096907, 16096908, 16096909, 16096910, 16096911,
7134                16096912, 16096913, 16096914, 16096915, 16096916, 16096917, 16096918, 16096919,
7135                16096920, 16096921, 16096922, 16096923, 16096924, 16096925, 16096926, 16096927,
7136                16096928, 16096929, 16096930
7137            ]
7138        );
7139        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7140        assert_eq!(
7141            rp,
7142            vec![
7143                16097145, 16097146, 16097147, 16097148, 16097149, 16097150, 16097151, 16097152,
7144                16097153, 16097154, 16097155, 16097156, 16097157, 16097158, 16097159, 16097160,
7145                16097161, 16097162, 16097163, 16097164, 16097165, 16097166, 16097167, 16097168,
7146                16097169, 16097170, 16097171, 16097172, 16097173, 16097176, 16097177, 16097178,
7147                16097179, 16097180, 16097181, 16097182, 16097183, 16097184, 16097185, 16097186,
7148                16097187, 16097188, 16097189, 16097190, 16097191, 16097192, 16097193, 16097194,
7149                16097195, 16097196, 16097197
7150            ]
7151        );
7152        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7153        assert_eq!(
7154            rp,
7155            vec![
7156                16117350, 16117351, 16117352, 16117353, 16117354, 16117355, 16117356, 16117357,
7157                16117358, 16117359, 16117360, 16117361, 16117362, 16117363, 16117364, 16117365,
7158                16117366, 16117367, 16117368, 16117369, 16117370, 16117371, 16117372, 16117373,
7159                16117374, 16117375, 16117376, 16117377, 16117378, 16117379, 16117380, 16117381,
7160                16117382, 16117383, 16117384, 16117385, 16117386, 16117387, 16117388, 16117389,
7161                16117390, 16117391, 16117392, 16117393, 16117394, 16117395, 16117396, 16117397,
7162                16117398, 16117399, 16117400
7163            ]
7164        );
7165        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7166        assert_eq!(
7167            rp,
7168            vec![
7169                16118483, 16118484, 16118485, 16118486, 16118487, 16118488, 16118489, 16118490,
7170                16118491, 16118492, 16118493, 16118494, 16118495, 16118496, 16118497, 16118498,
7171                16118499, 16118500, 16118501, 16118502, 16118503, 16118504, 16118505, 16118506,
7172                16118507, 16118508, 16118509, 16118510, 16118511, 16118512, 16118513, 16118514,
7173                16118515, 16118516, 16118517, 16118518, 16118519, 16118520, 16118521, 16118522,
7174                16118523, 16118524, 16118525, 16118526, 16118527, 16118528, 16118529, 16118530,
7175                16118531, 16118532, 16118533
7176            ]
7177        );
7178        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7179        assert_eq!(
7180            rp,
7181            vec![
7182                16118499, 16118500, 16118501, 16118502, 16118503, 16118504, 16118505, 16118506,
7183                16118507, 16118508, 16118509, 16118510, 16118511, 16118512, 16118513, 16118514,
7184                16118515, 16118516, 16118517, 16118518, 16118519, 16118520, 16118521, 16118522,
7185                16118523, 16118524, 16118525, 16118526, 16118527, 16118528, 16118529, 16118530,
7186                16118531, 16118532, 16118533, 16118534, 16118535, 16118536, 16118537, 16118538,
7187                16118539, 16118540, 16118541, 16118542, 16118543, 16118544, 16118545, 16118546,
7188                16118547, 16118548, 16118549
7189            ]
7190        );
7191        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7192        assert_eq!(
7193            rp,
7194            vec![
7195                16118499, 16118500, 16118501, 16118502, 16118503, 16118504, 16118505, 16118506,
7196                16118507, 16118508, 16118509, 16118510, 16118511, 16118512, 16118513, 16118514,
7197                16118515, 16118516, 16118517, 16118518, 16118519, 16118520, 16118521, 16118522,
7198                16118523, 16118524, 16118525, 16118526, 16118527, 16118528, 16118529, 16118530,
7199                16118531, 16118532, 16118533, 16118534, 16118535, 16118536, 16118537, 16118538,
7200                16118539, 16118540, 16118541, 16118542, 16118543, 16118544, 16118545, 16118546,
7201                16118547, 16118548, 16118549
7202            ]
7203        );
7204        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7205        assert_eq!(
7206            rp,
7207            vec![
7208                16118499, 16118500, 16118501, 16118502, 16118503, 16118504, 16118505, 16118506,
7209                16118507, 16118508, 16118509, 16118510, 16118511, 16118512, 16118513, 16118514,
7210                16118515, 16118516, 16118517, 16118518, 16118519, 16118520, 16118521, 16118522,
7211                16118523, 16118524, 16118525, 16118526, 16118527, 16118528, 16118529, 16118530,
7212                16118531, 16118532, 16118533, 16118534, 16118535, 16118536, 16118537, 16118538,
7213                16118539, 16118540, 16118541, 16118542, 16118543, 16118544, 16118545, 16118546,
7214                16118547, 16118548, 16118549
7215            ]
7216        );
7217        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7218        assert_eq!(
7219            rp,
7220            vec![
7221                16123411, 16123412, 16123413, 16123414, 16123415, 16123416, 16123417, 16123418,
7222                16123419, 16123420, 16123421, 16123422, 16123423, 16123424, 16123425, 16123426,
7223                16123427, 16123428, 16123429, 16123430, 16123431, 16123432, 16123433, 16123434,
7224                16123435, 16123436, 16123437, 16123438, 16123439, 16123440, 16123441, 16123442,
7225                16123443, 16123444, 16123445, 16123446, 16123447, 16123448, 16123449, 16123450,
7226                16123451, 16123452, 16123453, 16123454, 16123455, 16123456, 16123457, 16123458,
7227                16123459, 16123460, 16123461
7228            ]
7229        );
7230        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7231        assert_eq!(
7232            rp,
7233            vec![
7234                16123417, 16123418, 16123419, 16123420, 16123421, 16123422, 16123423, 16123424,
7235                16123425, 16123426, 16123427, 16123428, 16123429, 16123430, 16123431, 16123432,
7236                16123433, 16123434, 16123435, 16123436, 16123437, 16123438, 16123439, 16123440,
7237                16123441, 16123442, 16123443, 16123444, 16123445, 16123446, 16123447, 16123448,
7238                16123449, 16123450, 16123451, 16123452, 16123453, 16123454, 16123455, 16123456,
7239                16123457, 16123458, 16123459, 16123460, 16123461
7240            ]
7241        );
7242        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7243        assert_eq!(
7244            rp,
7245            vec![
7246                16165860, 16165861, 16165862, 16165863, 16165864, 16165865, 16165866, 16165867,
7247                16165868, 16165869, 16165870, 16165871, 16165872, 16165873, 16165874, 16165875,
7248                16165876, 16165877, 16165878, 16165879, 16165880, 16165881, 16165882, 16165883,
7249                16165884, 16165885, 16165886, 16165887, 16165888, 16165889, 16165890, 16165891,
7250                16165892, 16165893, 16165894, 16165895, 16165896, 16165897, 16165898, 16165899,
7251                16165900
7252            ]
7253        );
7254        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7255        assert_eq!(
7256            rp,
7257            vec![
7258                16180871, 16180872, 16180873, 16180874, 16180875, 16180876, 16180877, 16180878,
7259                16180879, 16180880, 16180881, 16180882, 16180883, 16180884, 16180885, 16180886,
7260                16180887, 16180888, 16180889, 16180890, 16180891, 16180892, 16180893, 16180894,
7261                16180895, 16180896, 16180897, 16180898, 16180899, 16180900, 16180901, 16180902,
7262                16180903, 16180904, 16180905, 16180906, 16180907, 16180908, 16180909, 16180910,
7263                16180911, 16180912, 16180913, 16180914, 16180915, 16180916, 16180917, 16180918,
7264                16180919, 16180920, 16180921
7265            ]
7266        );
7267        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7268        assert_eq!(
7269            rp,
7270            vec![
7271                16189705, 16189706, 16189707, 16189708, 16189709, 16189710, 16189711, 16189712,
7272                16189713, 16189714, 16189715, 16189716, 16189717, 16189718, 16189719, 16189720,
7273                16189721, 16189722, 16189723, 16189724, 16189725, 16189726, 16189727, 16189728,
7274                16189729, 16189730, 16189731, 16189732, 16189733, 16189734, 16189735, 16189736,
7275                16189737, 16189738, 16189739, 16189740, 16189741, 16189742, 16189743, 16189744,
7276                16189745, 16189746, 16189747, 16189748, 16189749, 16189750, 16189751, 16189752,
7277                16189753, 16189754, 16189755
7278            ]
7279        );
7280        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7281        assert_eq!(
7282            rp,
7283            vec![
7284                16231271, 16231272, 16231273, 16231274, 16231275, 16231276, 16231277, 16231278,
7285                16231279, 16231280, 16231281, 16231282, 16231283, 16231284, 16231285, 16231286,
7286                16231287, 16231288, 16231289, 16231290, 16231291, 16231292, 16231293, 16231294,
7287                16231295, 16231296, 16231297, 16231298, 16231299, 16231300, 16231301, 16231302,
7288                16231303, 16231304, 16231305, 16231306, 16231307, 16231308, 16231309, 16231310,
7289                16231311, 16231312, 16231313, 16231314, 16231315, 16231316, 16231317, 16231318,
7290                16231319, 16231320, 16231321
7291            ]
7292        );
7293        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7294        assert_eq!(
7295            rp,
7296            vec![
7297                16237657, 16237658, 16237659, 16237660, 16237661, 16237662, 16237663, 16237664,
7298                16237665, 16237666, 16237667, 16237668, 16237669, 16237670, 16237671, 16237672,
7299                16237673, 16237674, 16237675, 16237676, 16237677, 16237678, 16237679, 16237680,
7300                16237681, 16237682, 16237683, 16237684, 16237685, 16237686, 16237687, 16237688,
7301                16237689, 16237690, 16237691, 16237692, 16237693, 16237694, 16237695, 16237696,
7302                16237697, 16237698, 16237699, 16237700, 16237701, 16237702, 16237703, 16237704,
7303                16237705, 16237706, 16237707
7304            ]
7305        );
7306        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7307        assert_eq!(
7308            rp,
7309            vec![
7310                16255012, 16255013, 16255014, 16255015, 16255016, 16255017, 16255018, 16255019,
7311                16255020, 16255021, 16255022, 16255023, 16255024, 16255025, 16255026, 16255027,
7312                16255028, 16255029, 16255030, 16255031, 16255032, 16255033, 16255034, 16255035,
7313                16255036, 16255037, 16255038, 16255039, 16255040, 16255041, 16255042, 16255043,
7314                16255044, 16255045, 16255046, 16255047, 16255048, 16255049, 16255050, 16255051,
7315                16255052, 16255053
7316            ]
7317        );
7318        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7319        assert_eq!(
7320            rp,
7321            vec![
7322                16255391, 16255392, 16255393, 16255394, 16255395, 16255396, 16255397, 16255398,
7323                16255399, 16255400, 16255401, 16255402, 16255403, 16255404, 16255405, 16255406,
7324                16255407, 16255408, 16255409, 16255410, 16255411, 16255412, 16255413, 16255414,
7325                16255415, 16255416, 16255417, 16255418, 16255419, 16255420, 16255421, 16255422,
7326                16255423, 16255424, 16255425, 16255426, 16255427, 16255428, 16255429, 16255430,
7327                16255431, 16255432, 16255433, 16255434, 16255435, 16255436, 16255437, 16255438,
7328                16255439, 16255440, 16255441
7329            ]
7330        );
7331        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7332        assert_eq!(
7333            rp,
7334            vec![
7335                16255392, 16255393, 16255394, 16255395, 16255396, 16255397, 16255398, 16255399,
7336                16255400, 16255401, 16255402, 16255403, 16255404, 16255405, 16255406, 16255407,
7337                16255408, 16255409, 16255410, 16255411, 16255412, 16255413, 16255414, 16255415,
7338                16255416, 16255417, 16255418, 16255419, 16255420, 16255421, 16255422, 16255423,
7339                16255424, 16255425, 16255426, 16255427, 16255428, 16255429, 16255430, 16255431,
7340                16255432, 16255433, 16255434, 16255435, 16255436, 16255437, 16255438, 16255439,
7341                16255440, 16255441
7342            ]
7343        );
7344        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7345        assert_eq!(
7346            rp,
7347            vec![
7348                16256084, 16256085, 16256086, 16256087, 16256088, 16256089, 16256090, 16256091,
7349                16256092, 16256093, 16256094, 16256095, 16256096, 16256097, 16256098, 16256099,
7350                16256100, 16256101, 16256102, 16256103, 16256104, 16256105, 16256106, 16256107,
7351                16256108, 16256109, 16256110, 16256111, 16256112, 16256113, 16256114, 16256115,
7352                16256116, 16256117, 16256118, 16256119, 16256120, 16256121, 16256122, 16256123,
7353                16256124, 16256125, 16256126, 16256127, 16256128
7354            ]
7355        );
7356        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7357        assert_eq!(
7358            rp,
7359            vec![
7360                16256224, 16256225, 16256226, 16256227, 16256228, 16256229, 16256230, 16256231,
7361                16256232, 16256233, 16256234, 16256235, 16256236, 16256237, 16256238, 16256239,
7362                16256240, 16256241, 16256242, 16256243, 16256244, 16256245, 16256246, 16256247,
7363                16256248, 16256249, 16256250, 16256251, 16256252, 16256253, 16256254, 16256255,
7364                16256256, 16256257, 16256258, 16256259, 16256260, 16256261, 16256262, 16256263,
7365                16256264, 16256265, 16256266, 16256267, 16256268, 16256269, 16256270, 16256271
7366            ]
7367        );
7368        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7369        assert_eq!(
7370            rp,
7371            vec![
7372                16325199, 16325200, 16325201, 16325202, 16325203, 16325204, 16325205, 16325206,
7373                16325207, 16325208, 16325209, 16325210, 16325211, 16325212, 16325213, 16325214,
7374                16325215, 16325216, 16325217, 16325218, 16325219, 16325220, 16325221, 16325222,
7375                16325223, 16325224, 16325225, 16325226, 16325227, 16325228, 16325229, 16325230,
7376                16325231, 16325232, 16325233, 16325234, 16325235, 16325236, 16325237, 16325238,
7377                16325239, 16325240
7378            ]
7379        );
7380        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7381        assert_eq!(
7382            rp,
7383            vec![
7384                16352865, 16352866, 16352867, 16352868, 16352869, 16352870, 16352871, 16352872,
7385                16352873, 16352874, 16352875, 16352876, 16352877, 16352878, 16352879, 16352880,
7386                16352881, 16352882, 16352883, 16352884, 16352885, 16352886, 16352887, 16352888,
7387                16352889, 16352890, 16352891, 16352892, 16352893, 16352894, 16352895, 16352896,
7388                16352897, 16352898, 16352899, 16352900, 16352901, 16352902
7389            ]
7390        );
7391        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7392        assert_eq!(
7393            rp,
7394            vec![
7395                16352968, 16352969, 16352970, 16352971, 16352972, 16352973, 16352974, 16352975,
7396                16352976, 16352977, 16352978, 16352979, 16352980, 16352981, 16352982, 16352983,
7397                16352984, 16352985, 16352986, 16352987, 16352988, 16352989, 16352990, 16352991,
7398                16352992, 16352993, 16352994, 16352995, 16352996, 16352997, 16352998, 16352999,
7399                16353000, 16353001, 16353002, 16353003, 16353004, 16353005, 16353006, 16353007,
7400                16353008, 16353009, 16353010, 16353011
7401            ]
7402        );
7403        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7404        assert_eq!(
7405            rp,
7406            vec![
7407                16414998, 16414999, 16415000, 16415001, 16415002, 16415003, 16415004, 16415005,
7408                16415006, 16415007, 16415008, 16415009, 16415010, 16415011, 16415012, 16415013,
7409                16415014, 16415015, 16415016, 16415017, 16415018, 16415019, 16415020, 16415021,
7410                16415022, 16415023, 16415024, 16415025, 16415026, 16415027, 16415028, 16415029,
7411                16415030, 16415031, 16415032, 16415033, 16415034, 16415035, 16415036, 16415037,
7412                16415038, 16415039, 16415040, 16415041, 16415042, 16415043
7413            ]
7414        );
7415        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7416        assert_eq!(
7417            rp,
7418            vec![
7419                17031591, 17031592, 17031593, 17031594, 17031595, 17031596, 17031597, 17031598,
7420                17031599, 17031600, 17031601, 17031602, 17031603, 17031604, 17031605, 17031606,
7421                17031607, 17031608, 17031609, 17031610, 17031611, 17031612, 17031613, 17031614,
7422                17031615, 17031616, 17031617, 17031618, 17031619, 17031620, 17031621, 17031622,
7423                17031623, 17031624, 17031625, 17031626, 17031627, 17031628, 17031629, 17031630,
7424                17031631, 17031632, 17031633, 17031634, 17031635, 17031636, 17031637
7425            ]
7426        );
7427        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7428        assert_eq!(
7429            rp,
7430            vec![
7431                17057382, 17057383, 17057384, 17057385, 17057386, 17057387, 17057388, 17057389,
7432                17057390, 17057391, 17057392, 17057393, 17057394, 17057395, 17057396, 17057397,
7433                17057398, 17057399, 17057400, 17057401, 17057402, 17057403, 17057404, 17057405,
7434                17057406, 17057407, 17057408, 17057409, 17057410, 17057411, 17057412, 17057413,
7435                17057414, 17057415, 17057416, 17057417, 17057418, 17057419, 17057420, 17057421,
7436                17057422, 17057423, 17057424, 17057425, 17057426, 17057427, 17057428, 17057429,
7437                17057430, 17057431
7438            ]
7439        );
7440        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7441        assert_eq!(
7442            rp,
7443            vec![
7444                17092766, 17092767, 17092768, 17092769, 17092770, 17092771, 17092772, 17092773,
7445                17092774, 17092775, 17092776, 17092777, 17092778, 17092779, 17092780, 17092781,
7446                17092782, 17094966, 17094967, 17094968, 17094969, 17094970, 17094971, 17094972,
7447                17094973, 17094974, 17094975, 17094976, 17094977, 17094978, 17094979, 17094980,
7448                17094981, 17094982, 17094983, 17094984, 17094985, 17094986, 17094987, 17094988,
7449                17094989, 17094990, 17094991, 17094992, 17094993, 17094994, 17094995, 17094996,
7450                17094997, 17094998, 17094999
7451            ]
7452        );
7453        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7454        assert_eq!(
7455            rp,
7456            vec![
7457                17092782, 17094966, 17094967, 17094968, 17094969, 17094970, 17094971, 17094972,
7458                17094973, 17094974, 17094975, 17094976, 17094977, 17094978, 17094979, 17094980,
7459                17094981, 17094982, 17094983, 17094984, 17094985, 17094986, 17094987, 17094988,
7460                17094989, 17094990, 17094991, 17094992, 17094993, 17094994, 17094995, 17094996,
7461                17094997, 17094998, 17094999, 17095000, 17095001, 17095002, 17095003, 17095004,
7462                17095005, 17095006, 17095007, 17095008, 17095009, 17095010, 17095011, 17095012,
7463                17095013, 17095014, 17095015
7464            ]
7465        );
7466        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7467        assert_eq!(
7468            rp,
7469            vec![
7470                17092782, 17094966, 17094967, 17094968, 17094969, 17094970, 17094971, 17094972,
7471                17094973, 17094974, 17094975, 17094976, 17094977, 17094978, 17094979, 17094980,
7472                17094981, 17094982, 17094983, 17094984, 17094985, 17094986, 17094987, 17094988,
7473                17094989, 17094990, 17094991, 17094992, 17094993, 17094994, 17094995, 17094996,
7474                17094997, 17094998, 17094999, 17095000, 17095001, 17095002, 17095003, 17095004,
7475                17095005, 17095006, 17095007, 17095008, 17095009, 17095010, 17095011, 17095012,
7476                17095013, 17095014, 17095015
7477            ]
7478        );
7479        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7480        assert_eq!(
7481            rp,
7482            vec![
7483                17137287, 17137288, 17137289, 17137290, 17137291, 17137292, 17137293, 17137294,
7484                17137295, 17137296, 17137297, 17137298, 17137299, 17137300, 17137301, 17137302,
7485                17137303, 17137304, 17137305, 17137306, 17137307, 17137308, 17137309, 17137310,
7486                17137311, 17137312, 17137313, 17137314, 17137315, 17137316, 17137317, 17137318,
7487                17137319
7488            ]
7489        );
7490        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7491        assert_eq!(
7492            rp,
7493            vec![
7494                17306238, 17306239, 17306240, 17306241, 17306242, 17306243, 17306244, 17306245,
7495                17306246, 17306247, 17306248, 17306249, 17306250, 17306251, 17306252, 17306253,
7496                17306254, 17306255, 17306256, 17306257, 17306258, 17306259, 17306260, 17306261,
7497                17306262, 17306263, 17306264, 17306265, 17306266, 17306267, 17306268, 17306269,
7498                17306270, 17306271, 17306272, 17306273, 17306274, 17306275, 17306276, 17306277,
7499                17306278, 17306279, 17306280, 17306281, 17306282, 17306283, 17306284, 17306285
7500            ]
7501        );
7502        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7503        assert_eq!(
7504            rp,
7505            vec![
7506                17561868, 17561869, 17561870, 17561871, 17561872, 17561873, 17561874, 17561875,
7507                17561876, 17561877, 17561878, 17561879, 17561880, 17561881, 17561882, 17561883,
7508                17561884, 17561885, 17561886, 17561887, 17561888, 17561889, 17561890, 17561891,
7509                17561892, 17561893, 17561894, 17561895, 17561896, 17561897, 17561898, 17561899,
7510                17561900, 17561901, 17561902, 17561903, 17561904, 17561905, 17561906, 17561907,
7511                17561908, 17561909, 17561910, 17561911, 17561912
7512            ]
7513        );
7514        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7515        assert_eq!(
7516            rp,
7517            vec![
7518                17566078, 17566079, 17566080, 17566081, 17566082, 17566083, 17566084, 17566085,
7519                17566086, 17566087, 17566088, 17566089, 17566090, 17566091, 17566092, 17566093,
7520                17566094, 17566095, 17566096, 17566097, 17566098, 17566099, 17566100, 17566101,
7521                17566102, 17566103, 17566104, 17566105, 17566106, 17566107, 17566108, 17566109,
7522                17566110, 17566111, 17566112, 17566113, 17566114, 17566115, 17566116, 17566117,
7523                17566118, 17577951, 17577952, 17577953, 17577954, 17577955, 17577956, 17577957,
7524                17577958, 17577959, 17577960
7525            ]
7526        );
7527        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7528        assert_eq!(
7529            rp,
7530            vec![
7531                17566108, 17566109, 17566110, 17566111, 17566112, 17566113, 17566114, 17566115,
7532                17566116, 17566117, 17566118, 17577951, 17577952, 17577953, 17577954, 17577955,
7533                17577956, 17577957, 17577958, 17577959, 17577960, 17577961, 17577962, 17577963,
7534                17577964, 17577965, 17577966, 17577967, 17577968, 17577969, 17577970, 17577971,
7535                17577972, 17577973, 17577974, 17577975, 17578686, 17578687, 17578688, 17578689,
7536                17578690, 17578691, 17578692, 17578693, 17578694, 17578695, 17578696, 17578697,
7537                17578698, 17578699, 17578700
7538            ]
7539        );
7540        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7541        assert_eq!(
7542            rp,
7543            vec![
7544                17566111, 17566112, 17566113, 17566114, 17566115, 17566116, 17566117, 17566118,
7545                17577951, 17577952, 17577953, 17577954, 17577955, 17577956, 17577957, 17577958,
7546                17577959, 17577960, 17577961, 17577962, 17577963, 17577964, 17577965, 17577966,
7547                17577967, 17577968, 17577969, 17577970, 17577971, 17577972, 17577973, 17577974,
7548                17577975, 17578686, 17578687, 17578688, 17578689, 17578690, 17578691, 17578692,
7549                17578693, 17578694, 17578695, 17578696, 17578697, 17578698, 17578699, 17578700,
7550                17578701, 17578702, 17578703
7551            ]
7552        );
7553        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7554        assert_eq!(
7555            rp,
7556            vec![
7557                17566111, 17566112, 17566113, 17566114, 17566115, 17566116, 17566117, 17566118,
7558                17577951, 17577952, 17577953, 17577954, 17577955, 17577956, 17577957, 17577958,
7559                17577959, 17577960, 17577961, 17577962, 17577963, 17577964, 17577965, 17577966,
7560                17577967, 17577968, 17577969, 17577970, 17577971, 17577972, 17577973, 17577974,
7561                17577975, 17578686, 17578687, 17578688, 17578689, 17578690, 17578691, 17578692,
7562                17578693, 17578694, 17578695, 17578696, 17578697, 17578698, 17578699, 17578700,
7563                17578701, 17578702, 17578703
7564            ]
7565        );
7566        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7567        assert_eq!(
7568            rp,
7569            vec![
7570                17566111, 17566112, 17566113, 17566114, 17566115, 17566116, 17566117, 17566118,
7571                17577951, 17577952, 17577953, 17577954, 17577955, 17577956, 17577957, 17577958,
7572                17577959, 17577960, 17577961, 17577962, 17577963, 17577964, 17577965, 17577966,
7573                17577967, 17577968, 17577969, 17577970, 17577971, 17577972, 17577973, 17577974,
7574                17577975, 17578686, 17578687, 17578688, 17578689, 17578690, 17578691, 17578692,
7575                17578693, 17578694, 17578695, 17578696, 17578697, 17578698, 17578699, 17578700,
7576                17578701, 17578702, 17578703
7577            ]
7578        );
7579        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7580        assert_eq!(
7581            rp,
7582            vec![
7583                17566111, 17566112, 17566113, 17566114, 17566115, 17566116, 17566117, 17566118,
7584                17577951, 17577952, 17577953, 17577954, 17577955, 17577956, 17577957, 17577958,
7585                17577959, 17577960, 17577961, 17577962, 17577963, 17577964, 17577965, 17577966,
7586                17577967, 17577968, 17577969, 17577970, 17577971, 17577972, 17577973, 17577974,
7587                17577975, 17578686, 17578687, 17578688, 17578689, 17578690, 17578691, 17578692,
7588                17578693, 17578694, 17578695, 17578696, 17578697, 17578698, 17578699, 17578700,
7589                17578701, 17578702, 17578703
7590            ]
7591        );
7592        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7593        assert_eq!(
7594            rp,
7595            vec![
7596                17566112, 17566113, 17566114, 17566115, 17566116, 17566117, 17566118, 17577951,
7597                17577952, 17577953, 17577954, 17577955, 17577956, 17577957, 17577958, 17577959,
7598                17577960, 17577961, 17577962, 17577963, 17577964, 17577965, 17577966, 17577967,
7599                17577968, 17577969, 17577970, 17577971, 17577972, 17577973, 17577974, 17577975,
7600                17578686, 17578687, 17578688, 17578689, 17578690, 17578691, 17578692, 17578693,
7601                17578694, 17578695, 17578696, 17578697, 17578698, 17578699, 17578700, 17578701,
7602                17578702, 17578703, 17578704
7603            ]
7604        );
7605        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7606        assert_eq!(
7607            rp,
7608            vec![
7609                17566113, 17566114, 17566115, 17566116, 17566117, 17566118, 17577951, 17577952,
7610                17577953, 17577954, 17577955, 17577956, 17577957, 17577958, 17577959, 17577960,
7611                17577961, 17577962, 17577963, 17577964, 17577965, 17577966, 17577967, 17577968,
7612                17577969, 17577970, 17577971, 17577972, 17577973, 17577974, 17577975, 17578686,
7613                17578687, 17578688, 17578689, 17578690, 17578691, 17578692, 17578693, 17578694,
7614                17578695, 17578696, 17578697, 17578698, 17578699, 17578700, 17578701, 17578702,
7615                17578703, 17578704, 17578705
7616            ]
7617        );
7618        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7619        assert_eq!(
7620            rp,
7621            vec![
7622                17566113, 17566114, 17566115, 17566116, 17566117, 17566118, 17577951, 17577952,
7623                17577953, 17577954, 17577955, 17577956, 17577957, 17577958, 17577959, 17577960,
7624                17577961, 17577962, 17577963, 17577964, 17577965, 17577966, 17577967, 17577968,
7625                17577969, 17577970, 17577971, 17577972, 17577973, 17577974, 17577975, 17578686,
7626                17578687, 17578688, 17578689, 17578690, 17578691, 17578692, 17578693, 17578694,
7627                17578695, 17578696, 17578697, 17578698, 17578699, 17578700, 17578701, 17578702,
7628                17578703, 17578704, 17578705
7629            ]
7630        );
7631        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7632        assert_eq!(
7633            rp,
7634            vec![
7635                17579733, 17579734, 17579735, 17579736, 17579737, 17579738, 17579739, 17579740,
7636                17579741, 17579742, 17579743, 17579744, 17579745, 17579746, 17579747, 17579748,
7637                17579749, 17579750, 17579751, 17579752, 17579753, 17579754, 17579755, 17579756,
7638                17579757, 17579758, 17579759, 17579760, 17579761, 17579762, 17579763, 17579764,
7639                17579765, 17579766, 17579767, 17579768, 17579769, 17579770, 17579771, 17579772,
7640                17579773, 17579774, 17579775, 17579776, 17581244, 17581245, 17581246, 17581247,
7641                17581248, 17581249
7642            ]
7643        );
7644        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7645        assert_eq!(
7646            rp,
7647            vec![
7648                17581369, 17581370, 17582885, 17582886, 17582887, 17582888, 17582889, 17582890,
7649                17582891, 17582892, 17582893, 17582894, 17582895, 17582896, 17582897, 17582898,
7650                17582899, 17582900, 17582901, 17582902, 17582903, 17582904, 17582905, 17582906,
7651                17582907, 17582908, 17582909, 17582910, 17582911, 17582912, 17582913, 17582914,
7652                17582915, 17582916, 17582917, 17582918, 17582919, 17582920, 17582921, 17582922,
7653                17582923, 17582924, 17582925, 17582926, 17582927, 17582928, 17582929, 17582930,
7654                17582931, 17582932, 17583028
7655            ]
7656        );
7657        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7658        assert_eq!(
7659            rp,
7660            vec![
7661                17581370, 17582885, 17582886, 17582887, 17582888, 17582889, 17582890, 17582891,
7662                17582892, 17582893, 17582894, 17582895, 17582896, 17582897, 17582898, 17582899,
7663                17582900, 17582901, 17582902, 17582903, 17582904, 17582905, 17582906, 17582907,
7664                17582908, 17582909, 17582910, 17582911, 17582912, 17582913, 17582914, 17582915,
7665                17582916, 17582917, 17582918, 17582919, 17582920, 17582921, 17582922, 17582923,
7666                17582924, 17582925, 17582926, 17582927, 17582928, 17582929, 17582930, 17582931,
7667                17582932, 17583028, 17583029
7668            ]
7669        );
7670        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7671        assert_eq!(
7672            rp,
7673            vec![
7674                17581370, 17582885, 17582886, 17582887, 17582888, 17582889, 17582890, 17582891,
7675                17582892, 17582893, 17582894, 17582895, 17582896, 17582897, 17582898, 17582899,
7676                17582900, 17582901, 17582902, 17582903, 17582904, 17582905, 17582906, 17582907,
7677                17582908, 17582909, 17582910, 17582911, 17582912, 17582913, 17582914, 17582915,
7678                17582916, 17582917, 17582918, 17582919, 17582920, 17582921, 17582922, 17582923,
7679                17582924, 17582925, 17582926, 17582927, 17582928, 17582929, 17582930, 17582931,
7680                17582932, 17583028, 17583029
7681            ]
7682        );
7683        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7684        assert_eq!(
7685            rp,
7686            vec![
7687                17582911, 17582912, 17582913, 17582914, 17582915, 17582916, 17582917, 17582918,
7688                17582919, 17582920, 17582921, 17582922, 17582923, 17582924, 17582925, 17582926,
7689                17582927, 17582928, 17582929, 17582930, 17582931, 17582932, 17583028, 17583029,
7690                17583030, 17583031, 17583032, 17583033, 17583034, 17583035, 17583036, 17583037,
7691                17583038, 17583039, 17583040, 17583041, 17583042, 17583043, 17583044, 17583045,
7692                17583046, 17583047, 17583048, 17583049, 17583050, 17583051, 17583052, 17583053,
7693                17583054, 17583055
7694            ]
7695        );
7696        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7697        assert_eq!(
7698            rp,
7699            vec![
7700                17588621, 17588622, 17588623, 17588624, 17588625, 17588626, 17588627, 17588628,
7701                17588629, 17588630, 17588631, 17588632, 17588633, 17588634, 17588635, 17588636,
7702                17588637, 17588638, 17588639, 17588640, 17588641, 17588642, 17588643, 17588644,
7703                17588645, 17588646, 17588647, 17588648, 17588649, 17588650, 17588651, 17588652,
7704                17588653, 17588654, 17588655, 17588656, 17588657, 17589196, 17589197, 17589198,
7705                17589199, 17589200, 17589201, 17589202, 17589203, 17589204, 17589205, 17589206,
7706                17589207, 17589208
7707            ]
7708        );
7709        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7710        assert_eq!(
7711            rp,
7712            vec![
7713                17588621, 17588622, 17588623, 17588624, 17588625, 17588626, 17588627, 17588628,
7714                17588629, 17588630, 17588631, 17588632, 17588633, 17588634, 17588635, 17588636,
7715                17588637, 17588638, 17588639, 17588640, 17588641, 17588642, 17588643, 17588644,
7716                17588645, 17588646, 17588647, 17588648, 17588649, 17588650, 17588651, 17588652,
7717                17588653, 17588654, 17588655, 17588656, 17588657, 17589196, 17589197, 17589198,
7718                17589199, 17589200, 17589201, 17589202, 17589203, 17589204, 17589205, 17589206,
7719                17589207, 17589208
7720            ]
7721        );
7722        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7723        assert_eq!(
7724            rp,
7725            vec![
7726                17588621, 17588622, 17588623, 17588624, 17588625, 17588626, 17588627, 17588628,
7727                17588629, 17588630, 17588631, 17588632, 17588633, 17588634, 17588635, 17588636,
7728                17588637, 17588638, 17588639, 17588640, 17588641, 17588642, 17588643, 17588644,
7729                17588645, 17588646, 17588647, 17588648, 17588649, 17588650, 17588651, 17588652,
7730                17588653, 17588654, 17588655, 17588656, 17588657, 17589196, 17589197, 17589198,
7731                17589199, 17589200, 17589201, 17589202, 17589203, 17589204, 17589205, 17589206,
7732                17589207, 17589208
7733            ]
7734        );
7735        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7736        assert_eq!(
7737            rp,
7738            vec![
7739                17591770, 17591771, 17591772, 17591773, 17591774, 17591775, 17591776, 17591777,
7740                17591778, 17591779, 17591780, 17591781, 17591782, 17591783, 17591784, 17591785,
7741                17591786, 17591787, 17591788, 17591789, 17591790, 17591791, 17591792, 17591793,
7742                17591794, 17591796, 17591797, 17591798, 17591799, 17591800, 17591801, 17591802,
7743                17591803, 17591804, 17591805, 17591806, 17591807, 17591808, 17591809, 17591810,
7744                17591811, 17591812, 17591813, 17591814, 17591815, 17591816, 17591817, 17591818,
7745                17591819, 17591820
7746            ]
7747        );
7748        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7749        assert_eq!(
7750            rp,
7751            vec![
7752                17593855, 17593856, 17593857, 17593858, 17593859, 17593860, 17593861, 17593862,
7753                17593863, 17593864, 17593865, 17593866, 17593867, 17593868, 17593869, 17593870,
7754                17593871, 17593872, 17593873, 17593874, 17593875, 17593876, 17593877, 17593878,
7755                17593880, 17593881, 17593882, 17593883, 17593884, 17593885, 17593886, 17593887,
7756                17593888, 17593889, 17593890, 17593891, 17593892, 17593893, 17593894, 17593895,
7757                17593896, 17593897, 17593898, 17593899, 17593900, 17593901, 17593902, 17593903
7758            ]
7759        );
7760        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7761        assert_eq!(
7762            rp,
7763            vec![
7764                17593863, 17593864, 17593865, 17593866, 17593867, 17593868, 17593869, 17593870,
7765                17593871, 17593872, 17593873, 17593874, 17593875, 17593876, 17593877, 17593878,
7766                17593880, 17593881, 17593882, 17593883, 17593884, 17593885, 17593886, 17593887,
7767                17593888, 17593889, 17593890, 17593891, 17593892, 17593893, 17593894, 17593895,
7768                17593896, 17593897, 17593898, 17593899, 17593900, 17593901, 17593902, 17593903,
7769                17593904, 17593905, 17593906, 17593907
7770            ]
7771        );
7772        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7773        assert_eq!(
7774            rp,
7775            vec![
7776                17596476, 17596477, 17596478, 17596479, 17596480, 17596481, 17596482, 17596483,
7777                17596484, 17596485, 17596486, 17596487, 17596488, 17596489, 17596490, 17596491,
7778                17596492, 17596493, 17596494, 17596495, 17596496, 17596497, 17596498, 17596499,
7779                17596500, 17596501, 17596502, 17596503, 17596504, 17596505, 17596506, 17596507,
7780                17596508, 17596509, 17596510, 17596511, 17596512, 17596513, 17596514
7781            ]
7782        );
7783        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7784        assert_eq!(
7785            rp,
7786            vec![
7787                17624012, 17624013, 17624014, 17624015, 17624016, 17624017, 17624018, 17624019,
7788                17624020, 17625913, 17625914, 17625915, 17625916, 17625917, 17625918, 17625919,
7789                17625920, 17625921, 17625922, 17625923, 17625924, 17625925, 17625926, 17625927,
7790                17625928, 17625929, 17625930, 17625931, 17625932, 17625933, 17625934, 17625935,
7791                17625936, 17625937, 17625938, 17625939, 17625940, 17625941, 17625942, 17625943,
7792                17625944, 17625945, 17625946, 17625947, 17625948, 17625949
7793            ]
7794        );
7795        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7796        assert_eq!(
7797            rp,
7798            vec![
7799                17624012, 17624013, 17624014, 17624015, 17624016, 17624017, 17624018, 17624019,
7800                17624020, 17625913, 17625914, 17625915, 17625916, 17625917, 17625918, 17625919,
7801                17625920, 17625921, 17625922, 17625923, 17625924, 17625925, 17625926, 17625927,
7802                17625928, 17625929, 17625930, 17625931, 17625932, 17625933, 17625934, 17625935,
7803                17625936, 17625937, 17625938, 17625939, 17625940, 17625941, 17625942, 17625943,
7804                17625944, 17625945, 17625946, 17625947, 17625948, 17625949, 17625950, 17625951,
7805                17625952
7806            ]
7807        );
7808        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7809        assert_eq!(
7810            rp,
7811            vec![
7812                31796700, 31796701, 31796702, 31796703, 31796704, 31796705, 31796706, 31796710,
7813                31796711, 31796712, 31796713, 31796714, 31796715, 31796716, 31796717, 31796718,
7814                31796719, 31796720, 31796721, 31796722, 31796723, 31796724, 31796725, 31796726,
7815                31796727, 31796728, 31799014, 31799015, 31799016, 31799017, 31799018, 31799019,
7816                31799020, 31799021, 31799022, 31799023, 31799024, 31799025, 31799026, 31799027,
7817                31799028, 31799029, 31799030, 31799031, 31799032, 31799033, 31799034, 31799035,
7818                31799036, 31799037
7819            ]
7820        );
7821        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7822        assert_eq!(
7823            rp,
7824            vec![
7825                36722692, 36722693, 36722694, 36722695, 36722696, 36722697, 36722698, 36722699,
7826                36722700, 36722701, 36722702, 36722703, 36722704, 36722705, 36723505, 36723506,
7827                36723507, 36723508, 36723509, 36723510, 36723511, 36723512, 36723513, 36723514,
7828                36723515, 36723516, 36723517, 36723518, 36723519, 36723520, 36723521, 36723522,
7829                36723523, 36723524, 36723525, 36723526, 36723527, 36723528, 36723529, 36723530,
7830                36723531, 36723532, 36737414, 36737415, 36737416, 36737417, 36737418, 36737419,
7831                36737420
7832            ]
7833        );
7834        let rp: Vec<i64> = it.next().unwrap().unwrap().reference_positions().collect();
7835        assert_eq!(
7836            rp,
7837            vec![
7838                44587963, 44587964, 44587965, 44587966, 44587967, 44587968, 44587969, 44587970,
7839                44587971, 44587972, 44587973, 44587974, 44587975, 44587976, 44587977, 44587978,
7840                44587979, 44587980, 44587981, 44587982, 44587983, 44589680, 44589681, 44589682,
7841                44589683, 44589684, 44589685, 44589686, 44589687, 44589688, 44589689, 44589690,
7842                44589691, 44589692, 44589693, 44589694, 44589695, 44589696, 44589697, 44589698,
7843                44589699, 44589700, 44589701, 44589702, 44592034, 44592035, 44592036
7844            ]
7845        );
7846    }
7847
7848    #[test]
7849    fn test_reference_positions_full() {
7850        let mut bam = bam::Reader::from_path("./test/test_spliced_reads.bam").unwrap();
7851        let mut it = bam.records();
7852
7853        let rp: Vec<_> = it
7854            .next()
7855            .unwrap()
7856            .unwrap()
7857            .reference_positions_full()
7858            .collect();
7859        assert_eq!(
7860            rp,
7861            vec![
7862                None,
7863                None,
7864                None,
7865                None,
7866                None,
7867                None,
7868                Some(16050676),
7869                Some(16050677),
7870                Some(16050678),
7871                Some(16050679),
7872                Some(16050680),
7873                Some(16050681),
7874                Some(16050682),
7875                Some(16050683),
7876                Some(16050684),
7877                Some(16050685),
7878                Some(16050686),
7879                Some(16050687),
7880                Some(16050688),
7881                Some(16050689),
7882                Some(16050690),
7883                Some(16050691),
7884                Some(16050692),
7885                Some(16050693),
7886                Some(16050694),
7887                Some(16050695),
7888                Some(16050696),
7889                Some(16050697),
7890                Some(16050698),
7891                Some(16050699),
7892                Some(16050700),
7893                Some(16050701),
7894                Some(16050702),
7895                Some(16050703),
7896                Some(16050704),
7897                Some(16050705),
7898                Some(16050706),
7899                Some(16050707),
7900                Some(16050708),
7901                Some(16050709),
7902                Some(16050710),
7903                Some(16050711),
7904                Some(16050712),
7905                Some(16050713),
7906                Some(16050714),
7907                Some(16050715),
7908                Some(16050716),
7909                Some(16050717),
7910                Some(16050718),
7911                Some(16050719),
7912                Some(16050720)
7913            ]
7914        );
7915        let rp: Vec<_> = it
7916            .next()
7917            .unwrap()
7918            .unwrap()
7919            .reference_positions_full()
7920            .collect();
7921        assert_eq!(
7922            rp,
7923            vec![
7924                Some(16096878),
7925                Some(16096879),
7926                Some(16096880),
7927                Some(16096881),
7928                Some(16096882),
7929                Some(16096883),
7930                Some(16096884),
7931                Some(16096887),
7932                Some(16096888),
7933                Some(16096889),
7934                Some(16096890),
7935                Some(16096891),
7936                Some(16096892),
7937                Some(16096893),
7938                Some(16096894),
7939                Some(16096895),
7940                Some(16096896),
7941                Some(16096897),
7942                Some(16096898),
7943                Some(16096899),
7944                Some(16096900),
7945                Some(16096901),
7946                Some(16096902),
7947                Some(16096903),
7948                Some(16096904),
7949                Some(16096905),
7950                Some(16096906),
7951                Some(16096907),
7952                Some(16096908),
7953                Some(16096909),
7954                Some(16096910),
7955                Some(16096911),
7956                Some(16096912),
7957                Some(16096913),
7958                Some(16096914),
7959                Some(16096915),
7960                Some(16096916),
7961                Some(16096917),
7962                Some(16096918),
7963                Some(16096919),
7964                Some(16096920),
7965                Some(16096921),
7966                Some(16096922),
7967                Some(16096923),
7968                Some(16096924),
7969                Some(16096925),
7970                Some(16096926),
7971                Some(16096927),
7972                Some(16096928),
7973                Some(16096929),
7974                Some(16096930)
7975            ]
7976        );
7977        let rp: Vec<_> = it
7978            .next()
7979            .unwrap()
7980            .unwrap()
7981            .reference_positions_full()
7982            .collect();
7983        assert_eq!(
7984            rp,
7985            vec![
7986                Some(16097145),
7987                Some(16097146),
7988                Some(16097147),
7989                Some(16097148),
7990                Some(16097149),
7991                Some(16097150),
7992                Some(16097151),
7993                Some(16097152),
7994                Some(16097153),
7995                Some(16097154),
7996                Some(16097155),
7997                Some(16097156),
7998                Some(16097157),
7999                Some(16097158),
8000                Some(16097159),
8001                Some(16097160),
8002                Some(16097161),
8003                Some(16097162),
8004                Some(16097163),
8005                Some(16097164),
8006                Some(16097165),
8007                Some(16097166),
8008                Some(16097167),
8009                Some(16097168),
8010                Some(16097169),
8011                Some(16097170),
8012                Some(16097171),
8013                Some(16097172),
8014                Some(16097173),
8015                Some(16097176),
8016                Some(16097177),
8017                Some(16097178),
8018                Some(16097179),
8019                Some(16097180),
8020                Some(16097181),
8021                Some(16097182),
8022                Some(16097183),
8023                Some(16097184),
8024                Some(16097185),
8025                Some(16097186),
8026                Some(16097187),
8027                Some(16097188),
8028                Some(16097189),
8029                Some(16097190),
8030                Some(16097191),
8031                Some(16097192),
8032                Some(16097193),
8033                Some(16097194),
8034                Some(16097195),
8035                Some(16097196),
8036                Some(16097197)
8037            ]
8038        );
8039        let rp: Vec<_> = it
8040            .next()
8041            .unwrap()
8042            .unwrap()
8043            .reference_positions_full()
8044            .collect();
8045        assert_eq!(
8046            rp,
8047            vec![
8048                Some(16117350),
8049                Some(16117351),
8050                Some(16117352),
8051                Some(16117353),
8052                Some(16117354),
8053                Some(16117355),
8054                Some(16117356),
8055                Some(16117357),
8056                Some(16117358),
8057                Some(16117359),
8058                Some(16117360),
8059                Some(16117361),
8060                Some(16117362),
8061                Some(16117363),
8062                Some(16117364),
8063                Some(16117365),
8064                Some(16117366),
8065                Some(16117367),
8066                Some(16117368),
8067                Some(16117369),
8068                Some(16117370),
8069                Some(16117371),
8070                Some(16117372),
8071                Some(16117373),
8072                Some(16117374),
8073                Some(16117375),
8074                Some(16117376),
8075                Some(16117377),
8076                Some(16117378),
8077                Some(16117379),
8078                Some(16117380),
8079                Some(16117381),
8080                Some(16117382),
8081                Some(16117383),
8082                Some(16117384),
8083                Some(16117385),
8084                Some(16117386),
8085                Some(16117387),
8086                Some(16117388),
8087                Some(16117389),
8088                Some(16117390),
8089                Some(16117391),
8090                Some(16117392),
8091                Some(16117393),
8092                Some(16117394),
8093                Some(16117395),
8094                Some(16117396),
8095                Some(16117397),
8096                Some(16117398),
8097                Some(16117399),
8098                Some(16117400)
8099            ]
8100        );
8101        let rp: Vec<_> = it
8102            .next()
8103            .unwrap()
8104            .unwrap()
8105            .reference_positions_full()
8106            .collect();
8107        assert_eq!(
8108            rp,
8109            vec![
8110                Some(16118483),
8111                Some(16118484),
8112                Some(16118485),
8113                Some(16118486),
8114                Some(16118487),
8115                Some(16118488),
8116                Some(16118489),
8117                Some(16118490),
8118                Some(16118491),
8119                Some(16118492),
8120                Some(16118493),
8121                Some(16118494),
8122                Some(16118495),
8123                Some(16118496),
8124                Some(16118497),
8125                Some(16118498),
8126                Some(16118499),
8127                Some(16118500),
8128                Some(16118501),
8129                Some(16118502),
8130                Some(16118503),
8131                Some(16118504),
8132                Some(16118505),
8133                Some(16118506),
8134                Some(16118507),
8135                Some(16118508),
8136                Some(16118509),
8137                Some(16118510),
8138                Some(16118511),
8139                Some(16118512),
8140                Some(16118513),
8141                Some(16118514),
8142                Some(16118515),
8143                Some(16118516),
8144                Some(16118517),
8145                Some(16118518),
8146                Some(16118519),
8147                Some(16118520),
8148                Some(16118521),
8149                Some(16118522),
8150                Some(16118523),
8151                Some(16118524),
8152                Some(16118525),
8153                Some(16118526),
8154                Some(16118527),
8155                Some(16118528),
8156                Some(16118529),
8157                Some(16118530),
8158                Some(16118531),
8159                Some(16118532),
8160                Some(16118533)
8161            ]
8162        );
8163        let rp: Vec<_> = it
8164            .next()
8165            .unwrap()
8166            .unwrap()
8167            .reference_positions_full()
8168            .collect();
8169        assert_eq!(
8170            rp,
8171            vec![
8172                Some(16118499),
8173                Some(16118500),
8174                Some(16118501),
8175                Some(16118502),
8176                Some(16118503),
8177                Some(16118504),
8178                Some(16118505),
8179                Some(16118506),
8180                Some(16118507),
8181                Some(16118508),
8182                Some(16118509),
8183                Some(16118510),
8184                Some(16118511),
8185                Some(16118512),
8186                Some(16118513),
8187                Some(16118514),
8188                Some(16118515),
8189                Some(16118516),
8190                Some(16118517),
8191                Some(16118518),
8192                Some(16118519),
8193                Some(16118520),
8194                Some(16118521),
8195                Some(16118522),
8196                Some(16118523),
8197                Some(16118524),
8198                Some(16118525),
8199                Some(16118526),
8200                Some(16118527),
8201                Some(16118528),
8202                Some(16118529),
8203                Some(16118530),
8204                Some(16118531),
8205                Some(16118532),
8206                Some(16118533),
8207                Some(16118534),
8208                Some(16118535),
8209                Some(16118536),
8210                Some(16118537),
8211                Some(16118538),
8212                Some(16118539),
8213                Some(16118540),
8214                Some(16118541),
8215                Some(16118542),
8216                Some(16118543),
8217                Some(16118544),
8218                Some(16118545),
8219                Some(16118546),
8220                Some(16118547),
8221                Some(16118548),
8222                Some(16118549)
8223            ]
8224        );
8225        let rp: Vec<_> = it
8226            .next()
8227            .unwrap()
8228            .unwrap()
8229            .reference_positions_full()
8230            .collect();
8231        assert_eq!(
8232            rp,
8233            vec![
8234                Some(16118499),
8235                Some(16118500),
8236                Some(16118501),
8237                Some(16118502),
8238                Some(16118503),
8239                Some(16118504),
8240                Some(16118505),
8241                Some(16118506),
8242                Some(16118507),
8243                Some(16118508),
8244                Some(16118509),
8245                Some(16118510),
8246                Some(16118511),
8247                Some(16118512),
8248                Some(16118513),
8249                Some(16118514),
8250                Some(16118515),
8251                Some(16118516),
8252                Some(16118517),
8253                Some(16118518),
8254                Some(16118519),
8255                Some(16118520),
8256                Some(16118521),
8257                Some(16118522),
8258                Some(16118523),
8259                Some(16118524),
8260                Some(16118525),
8261                Some(16118526),
8262                Some(16118527),
8263                Some(16118528),
8264                Some(16118529),
8265                Some(16118530),
8266                Some(16118531),
8267                Some(16118532),
8268                Some(16118533),
8269                Some(16118534),
8270                Some(16118535),
8271                Some(16118536),
8272                Some(16118537),
8273                Some(16118538),
8274                Some(16118539),
8275                Some(16118540),
8276                Some(16118541),
8277                Some(16118542),
8278                Some(16118543),
8279                Some(16118544),
8280                Some(16118545),
8281                Some(16118546),
8282                Some(16118547),
8283                Some(16118548),
8284                Some(16118549)
8285            ]
8286        );
8287        let rp: Vec<_> = it
8288            .next()
8289            .unwrap()
8290            .unwrap()
8291            .reference_positions_full()
8292            .collect();
8293        assert_eq!(
8294            rp,
8295            vec![
8296                Some(16118499),
8297                Some(16118500),
8298                Some(16118501),
8299                Some(16118502),
8300                Some(16118503),
8301                Some(16118504),
8302                Some(16118505),
8303                Some(16118506),
8304                Some(16118507),
8305                Some(16118508),
8306                Some(16118509),
8307                Some(16118510),
8308                Some(16118511),
8309                Some(16118512),
8310                Some(16118513),
8311                Some(16118514),
8312                Some(16118515),
8313                Some(16118516),
8314                Some(16118517),
8315                Some(16118518),
8316                Some(16118519),
8317                Some(16118520),
8318                Some(16118521),
8319                Some(16118522),
8320                Some(16118523),
8321                Some(16118524),
8322                Some(16118525),
8323                Some(16118526),
8324                Some(16118527),
8325                Some(16118528),
8326                Some(16118529),
8327                Some(16118530),
8328                Some(16118531),
8329                Some(16118532),
8330                Some(16118533),
8331                Some(16118534),
8332                Some(16118535),
8333                Some(16118536),
8334                Some(16118537),
8335                Some(16118538),
8336                Some(16118539),
8337                Some(16118540),
8338                Some(16118541),
8339                Some(16118542),
8340                Some(16118543),
8341                Some(16118544),
8342                Some(16118545),
8343                Some(16118546),
8344                Some(16118547),
8345                Some(16118548),
8346                Some(16118549)
8347            ]
8348        );
8349        let rp: Vec<_> = it
8350            .next()
8351            .unwrap()
8352            .unwrap()
8353            .reference_positions_full()
8354            .collect();
8355        assert_eq!(
8356            rp,
8357            vec![
8358                Some(16123411),
8359                Some(16123412),
8360                Some(16123413),
8361                Some(16123414),
8362                Some(16123415),
8363                Some(16123416),
8364                Some(16123417),
8365                Some(16123418),
8366                Some(16123419),
8367                Some(16123420),
8368                Some(16123421),
8369                Some(16123422),
8370                Some(16123423),
8371                Some(16123424),
8372                Some(16123425),
8373                Some(16123426),
8374                Some(16123427),
8375                Some(16123428),
8376                Some(16123429),
8377                Some(16123430),
8378                Some(16123431),
8379                Some(16123432),
8380                Some(16123433),
8381                Some(16123434),
8382                Some(16123435),
8383                Some(16123436),
8384                Some(16123437),
8385                Some(16123438),
8386                Some(16123439),
8387                Some(16123440),
8388                Some(16123441),
8389                Some(16123442),
8390                Some(16123443),
8391                Some(16123444),
8392                Some(16123445),
8393                Some(16123446),
8394                Some(16123447),
8395                Some(16123448),
8396                Some(16123449),
8397                Some(16123450),
8398                Some(16123451),
8399                Some(16123452),
8400                Some(16123453),
8401                Some(16123454),
8402                Some(16123455),
8403                Some(16123456),
8404                Some(16123457),
8405                Some(16123458),
8406                Some(16123459),
8407                Some(16123460),
8408                Some(16123461)
8409            ]
8410        );
8411        let rp: Vec<_> = it
8412            .next()
8413            .unwrap()
8414            .unwrap()
8415            .reference_positions_full()
8416            .collect();
8417        assert_eq!(
8418            rp,
8419            vec![
8420                None,
8421                None,
8422                None,
8423                None,
8424                None,
8425                None,
8426                Some(16123417),
8427                Some(16123418),
8428                Some(16123419),
8429                Some(16123420),
8430                Some(16123421),
8431                Some(16123422),
8432                Some(16123423),
8433                Some(16123424),
8434                Some(16123425),
8435                Some(16123426),
8436                Some(16123427),
8437                Some(16123428),
8438                Some(16123429),
8439                Some(16123430),
8440                Some(16123431),
8441                Some(16123432),
8442                Some(16123433),
8443                Some(16123434),
8444                Some(16123435),
8445                Some(16123436),
8446                Some(16123437),
8447                Some(16123438),
8448                Some(16123439),
8449                Some(16123440),
8450                Some(16123441),
8451                Some(16123442),
8452                Some(16123443),
8453                Some(16123444),
8454                Some(16123445),
8455                Some(16123446),
8456                Some(16123447),
8457                Some(16123448),
8458                Some(16123449),
8459                Some(16123450),
8460                Some(16123451),
8461                Some(16123452),
8462                Some(16123453),
8463                Some(16123454),
8464                Some(16123455),
8465                Some(16123456),
8466                Some(16123457),
8467                Some(16123458),
8468                Some(16123459),
8469                Some(16123460),
8470                Some(16123461)
8471            ]
8472        );
8473        let rp: Vec<_> = it
8474            .next()
8475            .unwrap()
8476            .unwrap()
8477            .reference_positions_full()
8478            .collect();
8479        assert_eq!(
8480            rp,
8481            vec![
8482                Some(16165860),
8483                Some(16165861),
8484                Some(16165862),
8485                Some(16165863),
8486                Some(16165864),
8487                Some(16165865),
8488                Some(16165866),
8489                Some(16165867),
8490                Some(16165868),
8491                Some(16165869),
8492                Some(16165870),
8493                Some(16165871),
8494                Some(16165872),
8495                Some(16165873),
8496                Some(16165874),
8497                Some(16165875),
8498                Some(16165876),
8499                Some(16165877),
8500                Some(16165878),
8501                Some(16165879),
8502                Some(16165880),
8503                Some(16165881),
8504                Some(16165882),
8505                Some(16165883),
8506                Some(16165884),
8507                Some(16165885),
8508                Some(16165886),
8509                Some(16165887),
8510                Some(16165888),
8511                Some(16165889),
8512                Some(16165890),
8513                Some(16165891),
8514                Some(16165892),
8515                Some(16165893),
8516                Some(16165894),
8517                Some(16165895),
8518                Some(16165896),
8519                Some(16165897),
8520                Some(16165898),
8521                Some(16165899),
8522                Some(16165900),
8523                None,
8524                None,
8525                None,
8526                None,
8527                None,
8528                None,
8529                None,
8530                None,
8531                None,
8532                None
8533            ]
8534        );
8535        let rp: Vec<_> = it
8536            .next()
8537            .unwrap()
8538            .unwrap()
8539            .reference_positions_full()
8540            .collect();
8541        assert_eq!(
8542            rp,
8543            vec![
8544                Some(16180871),
8545                Some(16180872),
8546                Some(16180873),
8547                Some(16180874),
8548                Some(16180875),
8549                Some(16180876),
8550                Some(16180877),
8551                Some(16180878),
8552                Some(16180879),
8553                Some(16180880),
8554                Some(16180881),
8555                Some(16180882),
8556                Some(16180883),
8557                Some(16180884),
8558                Some(16180885),
8559                Some(16180886),
8560                Some(16180887),
8561                Some(16180888),
8562                Some(16180889),
8563                Some(16180890),
8564                Some(16180891),
8565                Some(16180892),
8566                Some(16180893),
8567                Some(16180894),
8568                Some(16180895),
8569                Some(16180896),
8570                Some(16180897),
8571                Some(16180898),
8572                Some(16180899),
8573                Some(16180900),
8574                Some(16180901),
8575                Some(16180902),
8576                Some(16180903),
8577                Some(16180904),
8578                Some(16180905),
8579                Some(16180906),
8580                Some(16180907),
8581                Some(16180908),
8582                Some(16180909),
8583                Some(16180910),
8584                Some(16180911),
8585                Some(16180912),
8586                Some(16180913),
8587                Some(16180914),
8588                Some(16180915),
8589                Some(16180916),
8590                Some(16180917),
8591                Some(16180918),
8592                Some(16180919),
8593                Some(16180920),
8594                Some(16180921)
8595            ]
8596        );
8597        let rp: Vec<_> = it
8598            .next()
8599            .unwrap()
8600            .unwrap()
8601            .reference_positions_full()
8602            .collect();
8603        assert_eq!(
8604            rp,
8605            vec![
8606                Some(16189705),
8607                Some(16189706),
8608                Some(16189707),
8609                Some(16189708),
8610                Some(16189709),
8611                Some(16189710),
8612                Some(16189711),
8613                Some(16189712),
8614                Some(16189713),
8615                Some(16189714),
8616                Some(16189715),
8617                Some(16189716),
8618                Some(16189717),
8619                Some(16189718),
8620                Some(16189719),
8621                Some(16189720),
8622                Some(16189721),
8623                Some(16189722),
8624                Some(16189723),
8625                Some(16189724),
8626                Some(16189725),
8627                Some(16189726),
8628                Some(16189727),
8629                Some(16189728),
8630                Some(16189729),
8631                Some(16189730),
8632                Some(16189731),
8633                Some(16189732),
8634                Some(16189733),
8635                Some(16189734),
8636                Some(16189735),
8637                Some(16189736),
8638                Some(16189737),
8639                Some(16189738),
8640                Some(16189739),
8641                Some(16189740),
8642                Some(16189741),
8643                Some(16189742),
8644                Some(16189743),
8645                Some(16189744),
8646                Some(16189745),
8647                Some(16189746),
8648                Some(16189747),
8649                Some(16189748),
8650                Some(16189749),
8651                Some(16189750),
8652                Some(16189751),
8653                Some(16189752),
8654                Some(16189753),
8655                Some(16189754),
8656                Some(16189755)
8657            ]
8658        );
8659        let rp: Vec<_> = it
8660            .next()
8661            .unwrap()
8662            .unwrap()
8663            .reference_positions_full()
8664            .collect();
8665        assert_eq!(
8666            rp,
8667            vec![
8668                Some(16231271),
8669                Some(16231272),
8670                Some(16231273),
8671                Some(16231274),
8672                Some(16231275),
8673                Some(16231276),
8674                Some(16231277),
8675                Some(16231278),
8676                Some(16231279),
8677                Some(16231280),
8678                Some(16231281),
8679                Some(16231282),
8680                Some(16231283),
8681                Some(16231284),
8682                Some(16231285),
8683                Some(16231286),
8684                Some(16231287),
8685                Some(16231288),
8686                Some(16231289),
8687                Some(16231290),
8688                Some(16231291),
8689                Some(16231292),
8690                Some(16231293),
8691                Some(16231294),
8692                Some(16231295),
8693                Some(16231296),
8694                Some(16231297),
8695                Some(16231298),
8696                Some(16231299),
8697                Some(16231300),
8698                Some(16231301),
8699                Some(16231302),
8700                Some(16231303),
8701                Some(16231304),
8702                Some(16231305),
8703                Some(16231306),
8704                Some(16231307),
8705                Some(16231308),
8706                Some(16231309),
8707                Some(16231310),
8708                Some(16231311),
8709                Some(16231312),
8710                Some(16231313),
8711                Some(16231314),
8712                Some(16231315),
8713                Some(16231316),
8714                Some(16231317),
8715                Some(16231318),
8716                Some(16231319),
8717                Some(16231320),
8718                Some(16231321)
8719            ]
8720        );
8721        let rp: Vec<_> = it
8722            .next()
8723            .unwrap()
8724            .unwrap()
8725            .reference_positions_full()
8726            .collect();
8727        assert_eq!(
8728            rp,
8729            vec![
8730                Some(16237657),
8731                Some(16237658),
8732                Some(16237659),
8733                Some(16237660),
8734                Some(16237661),
8735                Some(16237662),
8736                Some(16237663),
8737                Some(16237664),
8738                Some(16237665),
8739                Some(16237666),
8740                Some(16237667),
8741                Some(16237668),
8742                Some(16237669),
8743                Some(16237670),
8744                Some(16237671),
8745                Some(16237672),
8746                Some(16237673),
8747                Some(16237674),
8748                Some(16237675),
8749                Some(16237676),
8750                Some(16237677),
8751                Some(16237678),
8752                Some(16237679),
8753                Some(16237680),
8754                Some(16237681),
8755                Some(16237682),
8756                Some(16237683),
8757                Some(16237684),
8758                Some(16237685),
8759                Some(16237686),
8760                Some(16237687),
8761                Some(16237688),
8762                Some(16237689),
8763                Some(16237690),
8764                Some(16237691),
8765                Some(16237692),
8766                Some(16237693),
8767                Some(16237694),
8768                Some(16237695),
8769                Some(16237696),
8770                Some(16237697),
8771                Some(16237698),
8772                Some(16237699),
8773                Some(16237700),
8774                Some(16237701),
8775                Some(16237702),
8776                Some(16237703),
8777                Some(16237704),
8778                Some(16237705),
8779                Some(16237706),
8780                Some(16237707)
8781            ]
8782        );
8783        let rp: Vec<_> = it
8784            .next()
8785            .unwrap()
8786            .unwrap()
8787            .reference_positions_full()
8788            .collect();
8789        assert_eq!(
8790            rp,
8791            vec![
8792                None,
8793                None,
8794                None,
8795                None,
8796                None,
8797                None,
8798                None,
8799                None,
8800                None,
8801                Some(16255012),
8802                Some(16255013),
8803                Some(16255014),
8804                Some(16255015),
8805                Some(16255016),
8806                Some(16255017),
8807                Some(16255018),
8808                Some(16255019),
8809                Some(16255020),
8810                Some(16255021),
8811                Some(16255022),
8812                Some(16255023),
8813                Some(16255024),
8814                Some(16255025),
8815                Some(16255026),
8816                Some(16255027),
8817                Some(16255028),
8818                Some(16255029),
8819                Some(16255030),
8820                Some(16255031),
8821                Some(16255032),
8822                Some(16255033),
8823                Some(16255034),
8824                Some(16255035),
8825                Some(16255036),
8826                Some(16255037),
8827                Some(16255038),
8828                Some(16255039),
8829                Some(16255040),
8830                Some(16255041),
8831                Some(16255042),
8832                Some(16255043),
8833                Some(16255044),
8834                Some(16255045),
8835                Some(16255046),
8836                Some(16255047),
8837                Some(16255048),
8838                Some(16255049),
8839                Some(16255050),
8840                Some(16255051),
8841                Some(16255052),
8842                Some(16255053)
8843            ]
8844        );
8845        let rp: Vec<_> = it
8846            .next()
8847            .unwrap()
8848            .unwrap()
8849            .reference_positions_full()
8850            .collect();
8851        assert_eq!(
8852            rp,
8853            vec![
8854                Some(16255391),
8855                Some(16255392),
8856                Some(16255393),
8857                Some(16255394),
8858                Some(16255395),
8859                Some(16255396),
8860                Some(16255397),
8861                Some(16255398),
8862                Some(16255399),
8863                Some(16255400),
8864                Some(16255401),
8865                Some(16255402),
8866                Some(16255403),
8867                Some(16255404),
8868                Some(16255405),
8869                Some(16255406),
8870                Some(16255407),
8871                Some(16255408),
8872                Some(16255409),
8873                Some(16255410),
8874                Some(16255411),
8875                Some(16255412),
8876                Some(16255413),
8877                Some(16255414),
8878                Some(16255415),
8879                Some(16255416),
8880                Some(16255417),
8881                Some(16255418),
8882                Some(16255419),
8883                Some(16255420),
8884                Some(16255421),
8885                Some(16255422),
8886                Some(16255423),
8887                Some(16255424),
8888                Some(16255425),
8889                Some(16255426),
8890                Some(16255427),
8891                Some(16255428),
8892                Some(16255429),
8893                Some(16255430),
8894                Some(16255431),
8895                Some(16255432),
8896                Some(16255433),
8897                Some(16255434),
8898                Some(16255435),
8899                Some(16255436),
8900                Some(16255437),
8901                Some(16255438),
8902                Some(16255439),
8903                Some(16255440),
8904                Some(16255441)
8905            ]
8906        );
8907        let rp: Vec<_> = it
8908            .next()
8909            .unwrap()
8910            .unwrap()
8911            .reference_positions_full()
8912            .collect();
8913        assert_eq!(
8914            rp,
8915            vec![
8916                Some(16255392),
8917                Some(16255393),
8918                Some(16255394),
8919                Some(16255395),
8920                Some(16255396),
8921                Some(16255397),
8922                Some(16255398),
8923                Some(16255399),
8924                Some(16255400),
8925                Some(16255401),
8926                Some(16255402),
8927                Some(16255403),
8928                Some(16255404),
8929                Some(16255405),
8930                Some(16255406),
8931                Some(16255407),
8932                Some(16255408),
8933                Some(16255409),
8934                Some(16255410),
8935                Some(16255411),
8936                Some(16255412),
8937                Some(16255413),
8938                Some(16255414),
8939                Some(16255415),
8940                Some(16255416),
8941                Some(16255417),
8942                Some(16255418),
8943                Some(16255419),
8944                Some(16255420),
8945                Some(16255421),
8946                Some(16255422),
8947                Some(16255423),
8948                Some(16255424),
8949                Some(16255425),
8950                Some(16255426),
8951                Some(16255427),
8952                Some(16255428),
8953                Some(16255429),
8954                Some(16255430),
8955                Some(16255431),
8956                Some(16255432),
8957                Some(16255433),
8958                Some(16255434),
8959                Some(16255435),
8960                Some(16255436),
8961                Some(16255437),
8962                Some(16255438),
8963                Some(16255439),
8964                Some(16255440),
8965                Some(16255441),
8966                None
8967            ]
8968        );
8969        let rp: Vec<_> = it
8970            .next()
8971            .unwrap()
8972            .unwrap()
8973            .reference_positions_full()
8974            .collect();
8975        assert_eq!(
8976            rp,
8977            vec![
8978                Some(16256084),
8979                Some(16256085),
8980                Some(16256086),
8981                Some(16256087),
8982                Some(16256088),
8983                Some(16256089),
8984                Some(16256090),
8985                Some(16256091),
8986                Some(16256092),
8987                Some(16256093),
8988                Some(16256094),
8989                Some(16256095),
8990                Some(16256096),
8991                Some(16256097),
8992                Some(16256098),
8993                Some(16256099),
8994                Some(16256100),
8995                Some(16256101),
8996                Some(16256102),
8997                Some(16256103),
8998                Some(16256104),
8999                Some(16256105),
9000                Some(16256106),
9001                Some(16256107),
9002                Some(16256108),
9003                Some(16256109),
9004                Some(16256110),
9005                Some(16256111),
9006                Some(16256112),
9007                Some(16256113),
9008                Some(16256114),
9009                Some(16256115),
9010                Some(16256116),
9011                Some(16256117),
9012                Some(16256118),
9013                Some(16256119),
9014                Some(16256120),
9015                Some(16256121),
9016                Some(16256122),
9017                Some(16256123),
9018                Some(16256124),
9019                Some(16256125),
9020                Some(16256126),
9021                Some(16256127),
9022                Some(16256128),
9023                None,
9024                None,
9025                None,
9026                None,
9027                None,
9028                None
9029            ]
9030        );
9031        let rp: Vec<_> = it
9032            .next()
9033            .unwrap()
9034            .unwrap()
9035            .reference_positions_full()
9036            .collect();
9037        assert_eq!(
9038            rp,
9039            vec![
9040                None,
9041                None,
9042                None,
9043                Some(16256224),
9044                Some(16256225),
9045                Some(16256226),
9046                Some(16256227),
9047                Some(16256228),
9048                Some(16256229),
9049                Some(16256230),
9050                Some(16256231),
9051                Some(16256232),
9052                Some(16256233),
9053                Some(16256234),
9054                Some(16256235),
9055                Some(16256236),
9056                Some(16256237),
9057                Some(16256238),
9058                Some(16256239),
9059                Some(16256240),
9060                Some(16256241),
9061                Some(16256242),
9062                Some(16256243),
9063                Some(16256244),
9064                Some(16256245),
9065                Some(16256246),
9066                Some(16256247),
9067                Some(16256248),
9068                Some(16256249),
9069                Some(16256250),
9070                Some(16256251),
9071                Some(16256252),
9072                Some(16256253),
9073                Some(16256254),
9074                Some(16256255),
9075                Some(16256256),
9076                Some(16256257),
9077                Some(16256258),
9078                Some(16256259),
9079                Some(16256260),
9080                Some(16256261),
9081                Some(16256262),
9082                Some(16256263),
9083                Some(16256264),
9084                Some(16256265),
9085                Some(16256266),
9086                Some(16256267),
9087                Some(16256268),
9088                Some(16256269),
9089                Some(16256270),
9090                Some(16256271)
9091            ]
9092        );
9093        let rp: Vec<_> = it
9094            .next()
9095            .unwrap()
9096            .unwrap()
9097            .reference_positions_full()
9098            .collect();
9099        assert_eq!(
9100            rp,
9101            vec![
9102                Some(16325199),
9103                Some(16325200),
9104                Some(16325201),
9105                Some(16325202),
9106                Some(16325203),
9107                Some(16325204),
9108                Some(16325205),
9109                Some(16325206),
9110                Some(16325207),
9111                Some(16325208),
9112                Some(16325209),
9113                Some(16325210),
9114                Some(16325211),
9115                Some(16325212),
9116                Some(16325213),
9117                Some(16325214),
9118                Some(16325215),
9119                Some(16325216),
9120                Some(16325217),
9121                Some(16325218),
9122                Some(16325219),
9123                Some(16325220),
9124                Some(16325221),
9125                Some(16325222),
9126                Some(16325223),
9127                Some(16325224),
9128                Some(16325225),
9129                Some(16325226),
9130                Some(16325227),
9131                Some(16325228),
9132                Some(16325229),
9133                Some(16325230),
9134                Some(16325231),
9135                Some(16325232),
9136                Some(16325233),
9137                Some(16325234),
9138                Some(16325235),
9139                Some(16325236),
9140                Some(16325237),
9141                Some(16325238),
9142                Some(16325239),
9143                Some(16325240),
9144                None,
9145                None,
9146                None,
9147                None,
9148                None,
9149                None,
9150                None,
9151                None,
9152                None
9153            ]
9154        );
9155        let rp: Vec<_> = it
9156            .next()
9157            .unwrap()
9158            .unwrap()
9159            .reference_positions_full()
9160            .collect();
9161        assert_eq!(
9162            rp,
9163            vec![
9164                None,
9165                None,
9166                None,
9167                None,
9168                None,
9169                None,
9170                None,
9171                None,
9172                None,
9173                None,
9174                None,
9175                None,
9176                None,
9177                Some(16352865),
9178                Some(16352866),
9179                Some(16352867),
9180                Some(16352868),
9181                Some(16352869),
9182                Some(16352870),
9183                Some(16352871),
9184                Some(16352872),
9185                Some(16352873),
9186                Some(16352874),
9187                Some(16352875),
9188                Some(16352876),
9189                Some(16352877),
9190                Some(16352878),
9191                Some(16352879),
9192                Some(16352880),
9193                Some(16352881),
9194                Some(16352882),
9195                Some(16352883),
9196                Some(16352884),
9197                Some(16352885),
9198                Some(16352886),
9199                Some(16352887),
9200                Some(16352888),
9201                Some(16352889),
9202                Some(16352890),
9203                Some(16352891),
9204                Some(16352892),
9205                Some(16352893),
9206                Some(16352894),
9207                Some(16352895),
9208                Some(16352896),
9209                Some(16352897),
9210                Some(16352898),
9211                Some(16352899),
9212                Some(16352900),
9213                Some(16352901),
9214                Some(16352902)
9215            ]
9216        );
9217        let rp: Vec<_> = it
9218            .next()
9219            .unwrap()
9220            .unwrap()
9221            .reference_positions_full()
9222            .collect();
9223        assert_eq!(
9224            rp,
9225            vec![
9226                Some(16352968),
9227                Some(16352969),
9228                Some(16352970),
9229                Some(16352971),
9230                Some(16352972),
9231                Some(16352973),
9232                Some(16352974),
9233                Some(16352975),
9234                Some(16352976),
9235                Some(16352977),
9236                Some(16352978),
9237                Some(16352979),
9238                Some(16352980),
9239                Some(16352981),
9240                Some(16352982),
9241                Some(16352983),
9242                Some(16352984),
9243                Some(16352985),
9244                Some(16352986),
9245                Some(16352987),
9246                Some(16352988),
9247                Some(16352989),
9248                Some(16352990),
9249                Some(16352991),
9250                Some(16352992),
9251                Some(16352993),
9252                Some(16352994),
9253                Some(16352995),
9254                Some(16352996),
9255                Some(16352997),
9256                Some(16352998),
9257                Some(16352999),
9258                Some(16353000),
9259                Some(16353001),
9260                Some(16353002),
9261                Some(16353003),
9262                Some(16353004),
9263                Some(16353005),
9264                Some(16353006),
9265                Some(16353007),
9266                Some(16353008),
9267                Some(16353009),
9268                Some(16353010),
9269                Some(16353011),
9270                None,
9271                None,
9272                None,
9273                None,
9274                None,
9275                None,
9276                None
9277            ]
9278        );
9279        let rp: Vec<_> = it
9280            .next()
9281            .unwrap()
9282            .unwrap()
9283            .reference_positions_full()
9284            .collect();
9285        assert_eq!(
9286            rp,
9287            vec![
9288                None,
9289                None,
9290                None,
9291                None,
9292                None,
9293                Some(16414998),
9294                Some(16414999),
9295                Some(16415000),
9296                Some(16415001),
9297                Some(16415002),
9298                Some(16415003),
9299                Some(16415004),
9300                Some(16415005),
9301                Some(16415006),
9302                Some(16415007),
9303                Some(16415008),
9304                Some(16415009),
9305                Some(16415010),
9306                Some(16415011),
9307                Some(16415012),
9308                Some(16415013),
9309                Some(16415014),
9310                Some(16415015),
9311                Some(16415016),
9312                Some(16415017),
9313                Some(16415018),
9314                Some(16415019),
9315                Some(16415020),
9316                Some(16415021),
9317                Some(16415022),
9318                Some(16415023),
9319                Some(16415024),
9320                Some(16415025),
9321                Some(16415026),
9322                Some(16415027),
9323                Some(16415028),
9324                Some(16415029),
9325                Some(16415030),
9326                Some(16415031),
9327                Some(16415032),
9328                Some(16415033),
9329                Some(16415034),
9330                Some(16415035),
9331                Some(16415036),
9332                Some(16415037),
9333                Some(16415038),
9334                Some(16415039),
9335                Some(16415040),
9336                Some(16415041),
9337                Some(16415042),
9338                Some(16415043)
9339            ]
9340        );
9341        let rp: Vec<_> = it
9342            .next()
9343            .unwrap()
9344            .unwrap()
9345            .reference_positions_full()
9346            .collect();
9347        assert_eq!(
9348            rp,
9349            vec![
9350                Some(17031591),
9351                Some(17031592),
9352                Some(17031593),
9353                Some(17031594),
9354                Some(17031595),
9355                Some(17031596),
9356                Some(17031597),
9357                Some(17031598),
9358                Some(17031599),
9359                Some(17031600),
9360                Some(17031601),
9361                Some(17031602),
9362                Some(17031603),
9363                Some(17031604),
9364                Some(17031605),
9365                Some(17031606),
9366                Some(17031607),
9367                Some(17031608),
9368                Some(17031609),
9369                Some(17031610),
9370                Some(17031611),
9371                Some(17031612),
9372                Some(17031613),
9373                None,
9374                None,
9375                None,
9376                None,
9377                Some(17031614),
9378                Some(17031615),
9379                Some(17031616),
9380                Some(17031617),
9381                Some(17031618),
9382                Some(17031619),
9383                Some(17031620),
9384                Some(17031621),
9385                Some(17031622),
9386                Some(17031623),
9387                Some(17031624),
9388                Some(17031625),
9389                Some(17031626),
9390                Some(17031627),
9391                Some(17031628),
9392                Some(17031629),
9393                Some(17031630),
9394                Some(17031631),
9395                Some(17031632),
9396                Some(17031633),
9397                Some(17031634),
9398                Some(17031635),
9399                Some(17031636),
9400                Some(17031637)
9401            ]
9402        );
9403        let rp: Vec<_> = it
9404            .next()
9405            .unwrap()
9406            .unwrap()
9407            .reference_positions_full()
9408            .collect();
9409        assert_eq!(
9410            rp,
9411            vec![
9412                Some(17057382),
9413                Some(17057383),
9414                Some(17057384),
9415                Some(17057385),
9416                Some(17057386),
9417                Some(17057387),
9418                Some(17057388),
9419                Some(17057389),
9420                Some(17057390),
9421                Some(17057391),
9422                Some(17057392),
9423                Some(17057393),
9424                Some(17057394),
9425                Some(17057395),
9426                Some(17057396),
9427                Some(17057397),
9428                Some(17057398),
9429                Some(17057399),
9430                None,
9431                Some(17057400),
9432                Some(17057401),
9433                Some(17057402),
9434                Some(17057403),
9435                Some(17057404),
9436                Some(17057405),
9437                Some(17057406),
9438                Some(17057407),
9439                Some(17057408),
9440                Some(17057409),
9441                Some(17057410),
9442                Some(17057411),
9443                Some(17057412),
9444                Some(17057413),
9445                Some(17057414),
9446                Some(17057415),
9447                Some(17057416),
9448                Some(17057417),
9449                Some(17057418),
9450                Some(17057419),
9451                Some(17057420),
9452                Some(17057421),
9453                Some(17057422),
9454                Some(17057423),
9455                Some(17057424),
9456                Some(17057425),
9457                Some(17057426),
9458                Some(17057427),
9459                Some(17057428),
9460                Some(17057429),
9461                Some(17057430),
9462                Some(17057431)
9463            ]
9464        );
9465        let rp: Vec<_> = it
9466            .next()
9467            .unwrap()
9468            .unwrap()
9469            .reference_positions_full()
9470            .collect();
9471        assert_eq!(
9472            rp,
9473            vec![
9474                Some(17092766),
9475                Some(17092767),
9476                Some(17092768),
9477                Some(17092769),
9478                Some(17092770),
9479                Some(17092771),
9480                Some(17092772),
9481                Some(17092773),
9482                Some(17092774),
9483                Some(17092775),
9484                Some(17092776),
9485                Some(17092777),
9486                Some(17092778),
9487                Some(17092779),
9488                Some(17092780),
9489                Some(17092781),
9490                Some(17092782),
9491                Some(17094966),
9492                Some(17094967),
9493                Some(17094968),
9494                Some(17094969),
9495                Some(17094970),
9496                Some(17094971),
9497                Some(17094972),
9498                Some(17094973),
9499                Some(17094974),
9500                Some(17094975),
9501                Some(17094976),
9502                Some(17094977),
9503                Some(17094978),
9504                Some(17094979),
9505                Some(17094980),
9506                Some(17094981),
9507                Some(17094982),
9508                Some(17094983),
9509                Some(17094984),
9510                Some(17094985),
9511                Some(17094986),
9512                Some(17094987),
9513                Some(17094988),
9514                Some(17094989),
9515                Some(17094990),
9516                Some(17094991),
9517                Some(17094992),
9518                Some(17094993),
9519                Some(17094994),
9520                Some(17094995),
9521                Some(17094996),
9522                Some(17094997),
9523                Some(17094998),
9524                Some(17094999)
9525            ]
9526        );
9527        let rp: Vec<_> = it
9528            .next()
9529            .unwrap()
9530            .unwrap()
9531            .reference_positions_full()
9532            .collect();
9533        assert_eq!(
9534            rp,
9535            vec![
9536                Some(17092782),
9537                Some(17094966),
9538                Some(17094967),
9539                Some(17094968),
9540                Some(17094969),
9541                Some(17094970),
9542                Some(17094971),
9543                Some(17094972),
9544                Some(17094973),
9545                Some(17094974),
9546                Some(17094975),
9547                Some(17094976),
9548                Some(17094977),
9549                Some(17094978),
9550                Some(17094979),
9551                Some(17094980),
9552                Some(17094981),
9553                Some(17094982),
9554                Some(17094983),
9555                Some(17094984),
9556                Some(17094985),
9557                Some(17094986),
9558                Some(17094987),
9559                Some(17094988),
9560                Some(17094989),
9561                Some(17094990),
9562                Some(17094991),
9563                Some(17094992),
9564                Some(17094993),
9565                Some(17094994),
9566                Some(17094995),
9567                Some(17094996),
9568                Some(17094997),
9569                Some(17094998),
9570                Some(17094999),
9571                Some(17095000),
9572                Some(17095001),
9573                Some(17095002),
9574                Some(17095003),
9575                Some(17095004),
9576                Some(17095005),
9577                Some(17095006),
9578                Some(17095007),
9579                Some(17095008),
9580                Some(17095009),
9581                Some(17095010),
9582                Some(17095011),
9583                Some(17095012),
9584                Some(17095013),
9585                Some(17095014),
9586                Some(17095015)
9587            ]
9588        );
9589        let rp: Vec<_> = it
9590            .next()
9591            .unwrap()
9592            .unwrap()
9593            .reference_positions_full()
9594            .collect();
9595        assert_eq!(
9596            rp,
9597            vec![
9598                Some(17092782),
9599                Some(17094966),
9600                Some(17094967),
9601                Some(17094968),
9602                Some(17094969),
9603                Some(17094970),
9604                Some(17094971),
9605                Some(17094972),
9606                Some(17094973),
9607                Some(17094974),
9608                Some(17094975),
9609                Some(17094976),
9610                Some(17094977),
9611                Some(17094978),
9612                Some(17094979),
9613                Some(17094980),
9614                Some(17094981),
9615                Some(17094982),
9616                Some(17094983),
9617                Some(17094984),
9618                Some(17094985),
9619                Some(17094986),
9620                Some(17094987),
9621                Some(17094988),
9622                Some(17094989),
9623                Some(17094990),
9624                Some(17094991),
9625                Some(17094992),
9626                Some(17094993),
9627                Some(17094994),
9628                Some(17094995),
9629                Some(17094996),
9630                Some(17094997),
9631                Some(17094998),
9632                Some(17094999),
9633                Some(17095000),
9634                Some(17095001),
9635                Some(17095002),
9636                Some(17095003),
9637                Some(17095004),
9638                Some(17095005),
9639                Some(17095006),
9640                Some(17095007),
9641                Some(17095008),
9642                Some(17095009),
9643                Some(17095010),
9644                Some(17095011),
9645                Some(17095012),
9646                Some(17095013),
9647                Some(17095014),
9648                Some(17095015)
9649            ]
9650        );
9651        let rp: Vec<_> = it
9652            .next()
9653            .unwrap()
9654            .unwrap()
9655            .reference_positions_full()
9656            .collect();
9657        assert_eq!(
9658            rp,
9659            vec![
9660                None,
9661                None,
9662                None,
9663                None,
9664                None,
9665                None,
9666                None,
9667                None,
9668                None,
9669                Some(17137287),
9670                Some(17137288),
9671                Some(17137289),
9672                Some(17137290),
9673                Some(17137291),
9674                Some(17137292),
9675                Some(17137293),
9676                Some(17137294),
9677                Some(17137295),
9678                Some(17137296),
9679                Some(17137297),
9680                Some(17137298),
9681                Some(17137299),
9682                Some(17137300),
9683                Some(17137301),
9684                Some(17137302),
9685                Some(17137303),
9686                Some(17137304),
9687                Some(17137305),
9688                Some(17137306),
9689                Some(17137307),
9690                Some(17137308),
9691                Some(17137309),
9692                Some(17137310),
9693                Some(17137311),
9694                Some(17137312),
9695                Some(17137313),
9696                Some(17137314),
9697                Some(17137315),
9698                Some(17137316),
9699                Some(17137317),
9700                Some(17137318),
9701                Some(17137319),
9702                None,
9703                None,
9704                None,
9705                None,
9706                None,
9707                None,
9708                None,
9709                None,
9710                None
9711            ]
9712        );
9713        let rp: Vec<_> = it
9714            .next()
9715            .unwrap()
9716            .unwrap()
9717            .reference_positions_full()
9718            .collect();
9719        assert_eq!(
9720            rp,
9721            vec![
9722                None,
9723                None,
9724                Some(17306238),
9725                Some(17306239),
9726                Some(17306240),
9727                Some(17306241),
9728                Some(17306242),
9729                Some(17306243),
9730                Some(17306244),
9731                Some(17306245),
9732                Some(17306246),
9733                Some(17306247),
9734                Some(17306248),
9735                Some(17306249),
9736                Some(17306250),
9737                Some(17306251),
9738                Some(17306252),
9739                Some(17306253),
9740                Some(17306254),
9741                Some(17306255),
9742                Some(17306256),
9743                Some(17306257),
9744                Some(17306258),
9745                Some(17306259),
9746                Some(17306260),
9747                Some(17306261),
9748                Some(17306262),
9749                Some(17306263),
9750                Some(17306264),
9751                Some(17306265),
9752                Some(17306266),
9753                Some(17306267),
9754                Some(17306268),
9755                Some(17306269),
9756                Some(17306270),
9757                Some(17306271),
9758                Some(17306272),
9759                Some(17306273),
9760                Some(17306274),
9761                Some(17306275),
9762                Some(17306276),
9763                Some(17306277),
9764                Some(17306278),
9765                Some(17306279),
9766                Some(17306280),
9767                Some(17306281),
9768                Some(17306282),
9769                Some(17306283),
9770                Some(17306284),
9771                Some(17306285),
9772                None
9773            ]
9774        );
9775        let rp: Vec<_> = it
9776            .next()
9777            .unwrap()
9778            .unwrap()
9779            .reference_positions_full()
9780            .collect();
9781        assert_eq!(
9782            rp,
9783            vec![
9784                None,
9785                None,
9786                None,
9787                None,
9788                Some(17561868),
9789                Some(17561869),
9790                Some(17561870),
9791                Some(17561871),
9792                Some(17561872),
9793                Some(17561873),
9794                Some(17561874),
9795                Some(17561875),
9796                Some(17561876),
9797                Some(17561877),
9798                Some(17561878),
9799                Some(17561879),
9800                Some(17561880),
9801                Some(17561881),
9802                Some(17561882),
9803                Some(17561883),
9804                Some(17561884),
9805                Some(17561885),
9806                Some(17561886),
9807                Some(17561887),
9808                Some(17561888),
9809                Some(17561889),
9810                Some(17561890),
9811                Some(17561891),
9812                Some(17561892),
9813                Some(17561893),
9814                Some(17561894),
9815                Some(17561895),
9816                Some(17561896),
9817                Some(17561897),
9818                Some(17561898),
9819                Some(17561899),
9820                Some(17561900),
9821                Some(17561901),
9822                Some(17561902),
9823                Some(17561903),
9824                Some(17561904),
9825                Some(17561905),
9826                Some(17561906),
9827                Some(17561907),
9828                Some(17561908),
9829                Some(17561909),
9830                Some(17561910),
9831                Some(17561911),
9832                Some(17561912),
9833                None,
9834                None
9835            ]
9836        );
9837        let rp: Vec<_> = it
9838            .next()
9839            .unwrap()
9840            .unwrap()
9841            .reference_positions_full()
9842            .collect();
9843        assert_eq!(
9844            rp,
9845            vec![
9846                Some(17566078),
9847                Some(17566079),
9848                Some(17566080),
9849                Some(17566081),
9850                Some(17566082),
9851                Some(17566083),
9852                Some(17566084),
9853                Some(17566085),
9854                Some(17566086),
9855                Some(17566087),
9856                Some(17566088),
9857                Some(17566089),
9858                Some(17566090),
9859                Some(17566091),
9860                Some(17566092),
9861                Some(17566093),
9862                Some(17566094),
9863                Some(17566095),
9864                Some(17566096),
9865                Some(17566097),
9866                Some(17566098),
9867                Some(17566099),
9868                Some(17566100),
9869                Some(17566101),
9870                Some(17566102),
9871                Some(17566103),
9872                Some(17566104),
9873                Some(17566105),
9874                Some(17566106),
9875                Some(17566107),
9876                Some(17566108),
9877                Some(17566109),
9878                Some(17566110),
9879                Some(17566111),
9880                Some(17566112),
9881                Some(17566113),
9882                Some(17566114),
9883                Some(17566115),
9884                Some(17566116),
9885                Some(17566117),
9886                Some(17566118),
9887                Some(17577951),
9888                Some(17577952),
9889                Some(17577953),
9890                Some(17577954),
9891                Some(17577955),
9892                Some(17577956),
9893                Some(17577957),
9894                Some(17577958),
9895                Some(17577959),
9896                Some(17577960)
9897            ]
9898        );
9899        let rp: Vec<_> = it
9900            .next()
9901            .unwrap()
9902            .unwrap()
9903            .reference_positions_full()
9904            .collect();
9905        assert_eq!(
9906            rp,
9907            vec![
9908                Some(17566108),
9909                Some(17566109),
9910                Some(17566110),
9911                Some(17566111),
9912                Some(17566112),
9913                Some(17566113),
9914                Some(17566114),
9915                Some(17566115),
9916                Some(17566116),
9917                Some(17566117),
9918                Some(17566118),
9919                Some(17577951),
9920                Some(17577952),
9921                Some(17577953),
9922                Some(17577954),
9923                Some(17577955),
9924                Some(17577956),
9925                Some(17577957),
9926                Some(17577958),
9927                Some(17577959),
9928                Some(17577960),
9929                Some(17577961),
9930                Some(17577962),
9931                Some(17577963),
9932                Some(17577964),
9933                Some(17577965),
9934                Some(17577966),
9935                Some(17577967),
9936                Some(17577968),
9937                Some(17577969),
9938                Some(17577970),
9939                Some(17577971),
9940                Some(17577972),
9941                Some(17577973),
9942                Some(17577974),
9943                Some(17577975),
9944                Some(17578686),
9945                Some(17578687),
9946                Some(17578688),
9947                Some(17578689),
9948                Some(17578690),
9949                Some(17578691),
9950                Some(17578692),
9951                Some(17578693),
9952                Some(17578694),
9953                Some(17578695),
9954                Some(17578696),
9955                Some(17578697),
9956                Some(17578698),
9957                Some(17578699),
9958                Some(17578700)
9959            ]
9960        );
9961        let rp: Vec<_> = it
9962            .next()
9963            .unwrap()
9964            .unwrap()
9965            .reference_positions_full()
9966            .collect();
9967        assert_eq!(
9968            rp,
9969            vec![
9970                Some(17566111),
9971                Some(17566112),
9972                Some(17566113),
9973                Some(17566114),
9974                Some(17566115),
9975                Some(17566116),
9976                Some(17566117),
9977                Some(17566118),
9978                Some(17577951),
9979                Some(17577952),
9980                Some(17577953),
9981                Some(17577954),
9982                Some(17577955),
9983                Some(17577956),
9984                Some(17577957),
9985                Some(17577958),
9986                Some(17577959),
9987                Some(17577960),
9988                Some(17577961),
9989                Some(17577962),
9990                Some(17577963),
9991                Some(17577964),
9992                Some(17577965),
9993                Some(17577966),
9994                Some(17577967),
9995                Some(17577968),
9996                Some(17577969),
9997                Some(17577970),
9998                Some(17577971),
9999                Some(17577972),
10000                Some(17577973),
10001                Some(17577974),
10002                Some(17577975),
10003                Some(17578686),
10004                Some(17578687),
10005                Some(17578688),
10006                Some(17578689),
10007                Some(17578690),
10008                Some(17578691),
10009                Some(17578692),
10010                Some(17578693),
10011                Some(17578694),
10012                Some(17578695),
10013                Some(17578696),
10014                Some(17578697),
10015                Some(17578698),
10016                Some(17578699),
10017                Some(17578700),
10018                Some(17578701),
10019                Some(17578702),
10020                Some(17578703)
10021            ]
10022        );
10023        let rp: Vec<_> = it
10024            .next()
10025            .unwrap()
10026            .unwrap()
10027            .reference_positions_full()
10028            .collect();
10029        assert_eq!(
10030            rp,
10031            vec![
10032                Some(17566111),
10033                Some(17566112),
10034                Some(17566113),
10035                Some(17566114),
10036                Some(17566115),
10037                Some(17566116),
10038                Some(17566117),
10039                Some(17566118),
10040                Some(17577951),
10041                Some(17577952),
10042                Some(17577953),
10043                Some(17577954),
10044                Some(17577955),
10045                Some(17577956),
10046                Some(17577957),
10047                Some(17577958),
10048                Some(17577959),
10049                Some(17577960),
10050                Some(17577961),
10051                Some(17577962),
10052                Some(17577963),
10053                Some(17577964),
10054                Some(17577965),
10055                Some(17577966),
10056                Some(17577967),
10057                Some(17577968),
10058                Some(17577969),
10059                Some(17577970),
10060                Some(17577971),
10061                Some(17577972),
10062                Some(17577973),
10063                Some(17577974),
10064                Some(17577975),
10065                Some(17578686),
10066                Some(17578687),
10067                Some(17578688),
10068                Some(17578689),
10069                Some(17578690),
10070                Some(17578691),
10071                Some(17578692),
10072                Some(17578693),
10073                Some(17578694),
10074                Some(17578695),
10075                Some(17578696),
10076                Some(17578697),
10077                Some(17578698),
10078                Some(17578699),
10079                Some(17578700),
10080                Some(17578701),
10081                Some(17578702),
10082                Some(17578703)
10083            ]
10084        );
10085        let rp: Vec<_> = it
10086            .next()
10087            .unwrap()
10088            .unwrap()
10089            .reference_positions_full()
10090            .collect();
10091        assert_eq!(
10092            rp,
10093            vec![
10094                Some(17566111),
10095                Some(17566112),
10096                Some(17566113),
10097                Some(17566114),
10098                Some(17566115),
10099                Some(17566116),
10100                Some(17566117),
10101                Some(17566118),
10102                Some(17577951),
10103                Some(17577952),
10104                Some(17577953),
10105                Some(17577954),
10106                Some(17577955),
10107                Some(17577956),
10108                Some(17577957),
10109                Some(17577958),
10110                Some(17577959),
10111                Some(17577960),
10112                Some(17577961),
10113                Some(17577962),
10114                Some(17577963),
10115                Some(17577964),
10116                Some(17577965),
10117                Some(17577966),
10118                Some(17577967),
10119                Some(17577968),
10120                Some(17577969),
10121                Some(17577970),
10122                Some(17577971),
10123                Some(17577972),
10124                Some(17577973),
10125                Some(17577974),
10126                Some(17577975),
10127                Some(17578686),
10128                Some(17578687),
10129                Some(17578688),
10130                Some(17578689),
10131                Some(17578690),
10132                Some(17578691),
10133                Some(17578692),
10134                Some(17578693),
10135                Some(17578694),
10136                Some(17578695),
10137                Some(17578696),
10138                Some(17578697),
10139                Some(17578698),
10140                Some(17578699),
10141                Some(17578700),
10142                Some(17578701),
10143                Some(17578702),
10144                Some(17578703)
10145            ]
10146        );
10147        let rp: Vec<_> = it
10148            .next()
10149            .unwrap()
10150            .unwrap()
10151            .reference_positions_full()
10152            .collect();
10153        assert_eq!(
10154            rp,
10155            vec![
10156                Some(17566111),
10157                Some(17566112),
10158                Some(17566113),
10159                Some(17566114),
10160                Some(17566115),
10161                Some(17566116),
10162                Some(17566117),
10163                Some(17566118),
10164                Some(17577951),
10165                Some(17577952),
10166                Some(17577953),
10167                Some(17577954),
10168                Some(17577955),
10169                Some(17577956),
10170                Some(17577957),
10171                Some(17577958),
10172                Some(17577959),
10173                Some(17577960),
10174                Some(17577961),
10175                Some(17577962),
10176                Some(17577963),
10177                Some(17577964),
10178                Some(17577965),
10179                Some(17577966),
10180                Some(17577967),
10181                Some(17577968),
10182                Some(17577969),
10183                Some(17577970),
10184                Some(17577971),
10185                Some(17577972),
10186                Some(17577973),
10187                Some(17577974),
10188                Some(17577975),
10189                Some(17578686),
10190                Some(17578687),
10191                Some(17578688),
10192                Some(17578689),
10193                Some(17578690),
10194                Some(17578691),
10195                Some(17578692),
10196                Some(17578693),
10197                Some(17578694),
10198                Some(17578695),
10199                Some(17578696),
10200                Some(17578697),
10201                Some(17578698),
10202                Some(17578699),
10203                Some(17578700),
10204                Some(17578701),
10205                Some(17578702),
10206                Some(17578703)
10207            ]
10208        );
10209        let rp: Vec<_> = it
10210            .next()
10211            .unwrap()
10212            .unwrap()
10213            .reference_positions_full()
10214            .collect();
10215        assert_eq!(
10216            rp,
10217            vec![
10218                Some(17566112),
10219                Some(17566113),
10220                Some(17566114),
10221                Some(17566115),
10222                Some(17566116),
10223                Some(17566117),
10224                Some(17566118),
10225                Some(17577951),
10226                Some(17577952),
10227                Some(17577953),
10228                Some(17577954),
10229                Some(17577955),
10230                Some(17577956),
10231                Some(17577957),
10232                Some(17577958),
10233                Some(17577959),
10234                Some(17577960),
10235                Some(17577961),
10236                Some(17577962),
10237                Some(17577963),
10238                Some(17577964),
10239                Some(17577965),
10240                Some(17577966),
10241                Some(17577967),
10242                Some(17577968),
10243                Some(17577969),
10244                Some(17577970),
10245                Some(17577971),
10246                Some(17577972),
10247                Some(17577973),
10248                Some(17577974),
10249                Some(17577975),
10250                Some(17578686),
10251                Some(17578687),
10252                Some(17578688),
10253                Some(17578689),
10254                Some(17578690),
10255                Some(17578691),
10256                Some(17578692),
10257                Some(17578693),
10258                Some(17578694),
10259                Some(17578695),
10260                Some(17578696),
10261                Some(17578697),
10262                Some(17578698),
10263                Some(17578699),
10264                Some(17578700),
10265                Some(17578701),
10266                Some(17578702),
10267                Some(17578703),
10268                Some(17578704)
10269            ]
10270        );
10271        let rp: Vec<_> = it
10272            .next()
10273            .unwrap()
10274            .unwrap()
10275            .reference_positions_full()
10276            .collect();
10277        assert_eq!(
10278            rp,
10279            vec![
10280                Some(17566113),
10281                Some(17566114),
10282                Some(17566115),
10283                Some(17566116),
10284                Some(17566117),
10285                Some(17566118),
10286                Some(17577951),
10287                Some(17577952),
10288                Some(17577953),
10289                Some(17577954),
10290                Some(17577955),
10291                Some(17577956),
10292                Some(17577957),
10293                Some(17577958),
10294                Some(17577959),
10295                Some(17577960),
10296                Some(17577961),
10297                Some(17577962),
10298                Some(17577963),
10299                Some(17577964),
10300                Some(17577965),
10301                Some(17577966),
10302                Some(17577967),
10303                Some(17577968),
10304                Some(17577969),
10305                Some(17577970),
10306                Some(17577971),
10307                Some(17577972),
10308                Some(17577973),
10309                Some(17577974),
10310                Some(17577975),
10311                Some(17578686),
10312                Some(17578687),
10313                Some(17578688),
10314                Some(17578689),
10315                Some(17578690),
10316                Some(17578691),
10317                Some(17578692),
10318                Some(17578693),
10319                Some(17578694),
10320                Some(17578695),
10321                Some(17578696),
10322                Some(17578697),
10323                Some(17578698),
10324                Some(17578699),
10325                Some(17578700),
10326                Some(17578701),
10327                Some(17578702),
10328                Some(17578703),
10329                Some(17578704),
10330                Some(17578705)
10331            ]
10332        );
10333        let rp: Vec<_> = it
10334            .next()
10335            .unwrap()
10336            .unwrap()
10337            .reference_positions_full()
10338            .collect();
10339        assert_eq!(
10340            rp,
10341            vec![
10342                Some(17566113),
10343                Some(17566114),
10344                Some(17566115),
10345                Some(17566116),
10346                Some(17566117),
10347                Some(17566118),
10348                Some(17577951),
10349                Some(17577952),
10350                Some(17577953),
10351                Some(17577954),
10352                Some(17577955),
10353                Some(17577956),
10354                Some(17577957),
10355                Some(17577958),
10356                Some(17577959),
10357                Some(17577960),
10358                Some(17577961),
10359                Some(17577962),
10360                Some(17577963),
10361                Some(17577964),
10362                Some(17577965),
10363                Some(17577966),
10364                Some(17577967),
10365                Some(17577968),
10366                Some(17577969),
10367                Some(17577970),
10368                Some(17577971),
10369                Some(17577972),
10370                Some(17577973),
10371                Some(17577974),
10372                Some(17577975),
10373                Some(17578686),
10374                Some(17578687),
10375                Some(17578688),
10376                Some(17578689),
10377                Some(17578690),
10378                Some(17578691),
10379                Some(17578692),
10380                Some(17578693),
10381                Some(17578694),
10382                Some(17578695),
10383                Some(17578696),
10384                Some(17578697),
10385                Some(17578698),
10386                Some(17578699),
10387                Some(17578700),
10388                Some(17578701),
10389                Some(17578702),
10390                Some(17578703),
10391                Some(17578704),
10392                Some(17578705)
10393            ]
10394        );
10395        let rp: Vec<_> = it
10396            .next()
10397            .unwrap()
10398            .unwrap()
10399            .reference_positions_full()
10400            .collect();
10401        assert_eq!(
10402            rp,
10403            vec![
10404                None,
10405                Some(17579733),
10406                Some(17579734),
10407                Some(17579735),
10408                Some(17579736),
10409                Some(17579737),
10410                Some(17579738),
10411                Some(17579739),
10412                Some(17579740),
10413                Some(17579741),
10414                Some(17579742),
10415                Some(17579743),
10416                Some(17579744),
10417                Some(17579745),
10418                Some(17579746),
10419                Some(17579747),
10420                Some(17579748),
10421                Some(17579749),
10422                Some(17579750),
10423                Some(17579751),
10424                Some(17579752),
10425                Some(17579753),
10426                Some(17579754),
10427                Some(17579755),
10428                Some(17579756),
10429                Some(17579757),
10430                Some(17579758),
10431                Some(17579759),
10432                Some(17579760),
10433                Some(17579761),
10434                Some(17579762),
10435                Some(17579763),
10436                Some(17579764),
10437                Some(17579765),
10438                Some(17579766),
10439                Some(17579767),
10440                Some(17579768),
10441                Some(17579769),
10442                Some(17579770),
10443                Some(17579771),
10444                Some(17579772),
10445                Some(17579773),
10446                Some(17579774),
10447                Some(17579775),
10448                Some(17579776),
10449                Some(17581244),
10450                Some(17581245),
10451                Some(17581246),
10452                Some(17581247),
10453                Some(17581248),
10454                Some(17581249)
10455            ]
10456        );
10457        let rp: Vec<_> = it
10458            .next()
10459            .unwrap()
10460            .unwrap()
10461            .reference_positions_full()
10462            .collect();
10463        assert_eq!(
10464            rp,
10465            vec![
10466                Some(17581369),
10467                Some(17581370),
10468                Some(17582885),
10469                Some(17582886),
10470                Some(17582887),
10471                Some(17582888),
10472                Some(17582889),
10473                Some(17582890),
10474                Some(17582891),
10475                Some(17582892),
10476                Some(17582893),
10477                Some(17582894),
10478                Some(17582895),
10479                Some(17582896),
10480                Some(17582897),
10481                Some(17582898),
10482                Some(17582899),
10483                Some(17582900),
10484                Some(17582901),
10485                Some(17582902),
10486                Some(17582903),
10487                Some(17582904),
10488                Some(17582905),
10489                Some(17582906),
10490                Some(17582907),
10491                Some(17582908),
10492                Some(17582909),
10493                Some(17582910),
10494                Some(17582911),
10495                Some(17582912),
10496                Some(17582913),
10497                Some(17582914),
10498                Some(17582915),
10499                Some(17582916),
10500                Some(17582917),
10501                Some(17582918),
10502                Some(17582919),
10503                Some(17582920),
10504                Some(17582921),
10505                Some(17582922),
10506                Some(17582923),
10507                Some(17582924),
10508                Some(17582925),
10509                Some(17582926),
10510                Some(17582927),
10511                Some(17582928),
10512                Some(17582929),
10513                Some(17582930),
10514                Some(17582931),
10515                Some(17582932),
10516                Some(17583028)
10517            ]
10518        );
10519        let rp: Vec<_> = it
10520            .next()
10521            .unwrap()
10522            .unwrap()
10523            .reference_positions_full()
10524            .collect();
10525        assert_eq!(
10526            rp,
10527            vec![
10528                Some(17581370),
10529                Some(17582885),
10530                Some(17582886),
10531                Some(17582887),
10532                Some(17582888),
10533                Some(17582889),
10534                Some(17582890),
10535                Some(17582891),
10536                Some(17582892),
10537                Some(17582893),
10538                Some(17582894),
10539                Some(17582895),
10540                Some(17582896),
10541                Some(17582897),
10542                Some(17582898),
10543                Some(17582899),
10544                Some(17582900),
10545                Some(17582901),
10546                Some(17582902),
10547                Some(17582903),
10548                Some(17582904),
10549                Some(17582905),
10550                Some(17582906),
10551                Some(17582907),
10552                Some(17582908),
10553                Some(17582909),
10554                Some(17582910),
10555                Some(17582911),
10556                Some(17582912),
10557                Some(17582913),
10558                Some(17582914),
10559                Some(17582915),
10560                Some(17582916),
10561                Some(17582917),
10562                Some(17582918),
10563                Some(17582919),
10564                Some(17582920),
10565                Some(17582921),
10566                Some(17582922),
10567                Some(17582923),
10568                Some(17582924),
10569                Some(17582925),
10570                Some(17582926),
10571                Some(17582927),
10572                Some(17582928),
10573                Some(17582929),
10574                Some(17582930),
10575                Some(17582931),
10576                Some(17582932),
10577                Some(17583028),
10578                Some(17583029)
10579            ]
10580        );
10581        let rp: Vec<_> = it
10582            .next()
10583            .unwrap()
10584            .unwrap()
10585            .reference_positions_full()
10586            .collect();
10587        assert_eq!(
10588            rp,
10589            vec![
10590                Some(17581370),
10591                Some(17582885),
10592                Some(17582886),
10593                Some(17582887),
10594                Some(17582888),
10595                Some(17582889),
10596                Some(17582890),
10597                Some(17582891),
10598                Some(17582892),
10599                Some(17582893),
10600                Some(17582894),
10601                Some(17582895),
10602                Some(17582896),
10603                Some(17582897),
10604                Some(17582898),
10605                Some(17582899),
10606                Some(17582900),
10607                Some(17582901),
10608                Some(17582902),
10609                Some(17582903),
10610                Some(17582904),
10611                Some(17582905),
10612                Some(17582906),
10613                Some(17582907),
10614                Some(17582908),
10615                Some(17582909),
10616                Some(17582910),
10617                Some(17582911),
10618                Some(17582912),
10619                Some(17582913),
10620                Some(17582914),
10621                Some(17582915),
10622                Some(17582916),
10623                Some(17582917),
10624                Some(17582918),
10625                Some(17582919),
10626                Some(17582920),
10627                Some(17582921),
10628                Some(17582922),
10629                Some(17582923),
10630                Some(17582924),
10631                Some(17582925),
10632                Some(17582926),
10633                Some(17582927),
10634                Some(17582928),
10635                Some(17582929),
10636                Some(17582930),
10637                Some(17582931),
10638                Some(17582932),
10639                Some(17583028),
10640                Some(17583029)
10641            ]
10642        );
10643        let rp: Vec<_> = it
10644            .next()
10645            .unwrap()
10646            .unwrap()
10647            .reference_positions_full()
10648            .collect();
10649        assert_eq!(
10650            rp,
10651            vec![
10652                None,
10653                Some(17582911),
10654                Some(17582912),
10655                Some(17582913),
10656                Some(17582914),
10657                Some(17582915),
10658                Some(17582916),
10659                Some(17582917),
10660                Some(17582918),
10661                Some(17582919),
10662                Some(17582920),
10663                Some(17582921),
10664                Some(17582922),
10665                Some(17582923),
10666                Some(17582924),
10667                Some(17582925),
10668                Some(17582926),
10669                Some(17582927),
10670                Some(17582928),
10671                Some(17582929),
10672                Some(17582930),
10673                Some(17582931),
10674                Some(17582932),
10675                Some(17583028),
10676                Some(17583029),
10677                Some(17583030),
10678                Some(17583031),
10679                Some(17583032),
10680                Some(17583033),
10681                Some(17583034),
10682                Some(17583035),
10683                Some(17583036),
10684                Some(17583037),
10685                Some(17583038),
10686                Some(17583039),
10687                Some(17583040),
10688                Some(17583041),
10689                Some(17583042),
10690                Some(17583043),
10691                Some(17583044),
10692                Some(17583045),
10693                Some(17583046),
10694                Some(17583047),
10695                Some(17583048),
10696                Some(17583049),
10697                Some(17583050),
10698                Some(17583051),
10699                Some(17583052),
10700                Some(17583053),
10701                Some(17583054),
10702                Some(17583055)
10703            ]
10704        );
10705        let rp: Vec<_> = it
10706            .next()
10707            .unwrap()
10708            .unwrap()
10709            .reference_positions_full()
10710            .collect();
10711        assert_eq!(
10712            rp,
10713            vec![
10714                Some(17588621),
10715                Some(17588622),
10716                Some(17588623),
10717                Some(17588624),
10718                Some(17588625),
10719                Some(17588626),
10720                Some(17588627),
10721                Some(17588628),
10722                Some(17588629),
10723                Some(17588630),
10724                Some(17588631),
10725                Some(17588632),
10726                Some(17588633),
10727                Some(17588634),
10728                Some(17588635),
10729                Some(17588636),
10730                Some(17588637),
10731                Some(17588638),
10732                Some(17588639),
10733                Some(17588640),
10734                Some(17588641),
10735                Some(17588642),
10736                Some(17588643),
10737                Some(17588644),
10738                Some(17588645),
10739                Some(17588646),
10740                Some(17588647),
10741                Some(17588648),
10742                Some(17588649),
10743                Some(17588650),
10744                Some(17588651),
10745                Some(17588652),
10746                Some(17588653),
10747                Some(17588654),
10748                Some(17588655),
10749                Some(17588656),
10750                Some(17588657),
10751                Some(17589196),
10752                Some(17589197),
10753                Some(17589198),
10754                Some(17589199),
10755                Some(17589200),
10756                Some(17589201),
10757                Some(17589202),
10758                Some(17589203),
10759                Some(17589204),
10760                Some(17589205),
10761                Some(17589206),
10762                Some(17589207),
10763                Some(17589208),
10764                None
10765            ]
10766        );
10767        let rp: Vec<_> = it
10768            .next()
10769            .unwrap()
10770            .unwrap()
10771            .reference_positions_full()
10772            .collect();
10773        assert_eq!(
10774            rp,
10775            vec![
10776                Some(17588621),
10777                Some(17588622),
10778                Some(17588623),
10779                Some(17588624),
10780                Some(17588625),
10781                Some(17588626),
10782                Some(17588627),
10783                Some(17588628),
10784                Some(17588629),
10785                Some(17588630),
10786                Some(17588631),
10787                Some(17588632),
10788                Some(17588633),
10789                Some(17588634),
10790                Some(17588635),
10791                Some(17588636),
10792                Some(17588637),
10793                Some(17588638),
10794                Some(17588639),
10795                Some(17588640),
10796                Some(17588641),
10797                Some(17588642),
10798                Some(17588643),
10799                Some(17588644),
10800                Some(17588645),
10801                Some(17588646),
10802                Some(17588647),
10803                Some(17588648),
10804                Some(17588649),
10805                Some(17588650),
10806                Some(17588651),
10807                Some(17588652),
10808                Some(17588653),
10809                Some(17588654),
10810                Some(17588655),
10811                Some(17588656),
10812                Some(17588657),
10813                Some(17589196),
10814                Some(17589197),
10815                Some(17589198),
10816                Some(17589199),
10817                Some(17589200),
10818                Some(17589201),
10819                Some(17589202),
10820                Some(17589203),
10821                Some(17589204),
10822                Some(17589205),
10823                Some(17589206),
10824                Some(17589207),
10825                Some(17589208),
10826                None
10827            ]
10828        );
10829        let rp: Vec<_> = it
10830            .next()
10831            .unwrap()
10832            .unwrap()
10833            .reference_positions_full()
10834            .collect();
10835        assert_eq!(
10836            rp,
10837            vec![
10838                Some(17588621),
10839                Some(17588622),
10840                Some(17588623),
10841                Some(17588624),
10842                Some(17588625),
10843                Some(17588626),
10844                Some(17588627),
10845                Some(17588628),
10846                Some(17588629),
10847                Some(17588630),
10848                Some(17588631),
10849                Some(17588632),
10850                Some(17588633),
10851                Some(17588634),
10852                Some(17588635),
10853                Some(17588636),
10854                Some(17588637),
10855                Some(17588638),
10856                Some(17588639),
10857                Some(17588640),
10858                Some(17588641),
10859                Some(17588642),
10860                Some(17588643),
10861                Some(17588644),
10862                Some(17588645),
10863                Some(17588646),
10864                Some(17588647),
10865                Some(17588648),
10866                Some(17588649),
10867                Some(17588650),
10868                Some(17588651),
10869                Some(17588652),
10870                Some(17588653),
10871                Some(17588654),
10872                Some(17588655),
10873                Some(17588656),
10874                Some(17588657),
10875                Some(17589196),
10876                Some(17589197),
10877                Some(17589198),
10878                Some(17589199),
10879                Some(17589200),
10880                Some(17589201),
10881                Some(17589202),
10882                Some(17589203),
10883                Some(17589204),
10884                Some(17589205),
10885                Some(17589206),
10886                Some(17589207),
10887                Some(17589208),
10888                None
10889            ]
10890        );
10891        let rp: Vec<_> = it
10892            .next()
10893            .unwrap()
10894            .unwrap()
10895            .reference_positions_full()
10896            .collect();
10897        assert_eq!(
10898            rp,
10899            vec![
10900                None,
10901                Some(17591770),
10902                Some(17591771),
10903                Some(17591772),
10904                Some(17591773),
10905                Some(17591774),
10906                Some(17591775),
10907                Some(17591776),
10908                Some(17591777),
10909                Some(17591778),
10910                Some(17591779),
10911                Some(17591780),
10912                Some(17591781),
10913                Some(17591782),
10914                Some(17591783),
10915                Some(17591784),
10916                Some(17591785),
10917                Some(17591786),
10918                Some(17591787),
10919                Some(17591788),
10920                Some(17591789),
10921                Some(17591790),
10922                Some(17591791),
10923                Some(17591792),
10924                Some(17591793),
10925                Some(17591794),
10926                Some(17591796),
10927                Some(17591797),
10928                Some(17591798),
10929                Some(17591799),
10930                Some(17591800),
10931                Some(17591801),
10932                Some(17591802),
10933                Some(17591803),
10934                Some(17591804),
10935                Some(17591805),
10936                Some(17591806),
10937                Some(17591807),
10938                Some(17591808),
10939                Some(17591809),
10940                Some(17591810),
10941                Some(17591811),
10942                Some(17591812),
10943                Some(17591813),
10944                Some(17591814),
10945                Some(17591815),
10946                Some(17591816),
10947                Some(17591817),
10948                Some(17591818),
10949                Some(17591819),
10950                Some(17591820)
10951            ]
10952        );
10953        let rp: Vec<_> = it
10954            .next()
10955            .unwrap()
10956            .unwrap()
10957            .reference_positions_full()
10958            .collect();
10959        assert_eq!(
10960            rp,
10961            vec![
10962                Some(17593855),
10963                Some(17593856),
10964                Some(17593857),
10965                Some(17593858),
10966                Some(17593859),
10967                Some(17593860),
10968                Some(17593861),
10969                Some(17593862),
10970                Some(17593863),
10971                Some(17593864),
10972                Some(17593865),
10973                Some(17593866),
10974                Some(17593867),
10975                Some(17593868),
10976                Some(17593869),
10977                Some(17593870),
10978                Some(17593871),
10979                Some(17593872),
10980                Some(17593873),
10981                Some(17593874),
10982                Some(17593875),
10983                Some(17593876),
10984                Some(17593877),
10985                Some(17593878),
10986                Some(17593880),
10987                Some(17593881),
10988                Some(17593882),
10989                Some(17593883),
10990                Some(17593884),
10991                Some(17593885),
10992                Some(17593886),
10993                Some(17593887),
10994                Some(17593888),
10995                Some(17593889),
10996                Some(17593890),
10997                Some(17593891),
10998                Some(17593892),
10999                Some(17593893),
11000                Some(17593894),
11001                Some(17593895),
11002                Some(17593896),
11003                Some(17593897),
11004                Some(17593898),
11005                Some(17593899),
11006                Some(17593900),
11007                Some(17593901),
11008                Some(17593902),
11009                Some(17593903),
11010                None,
11011                None,
11012                None
11013            ]
11014        );
11015        let rp: Vec<_> = it
11016            .next()
11017            .unwrap()
11018            .unwrap()
11019            .reference_positions_full()
11020            .collect();
11021        assert_eq!(
11022            rp,
11023            vec![
11024                Some(17593863),
11025                Some(17593864),
11026                Some(17593865),
11027                Some(17593866),
11028                Some(17593867),
11029                Some(17593868),
11030                Some(17593869),
11031                Some(17593870),
11032                Some(17593871),
11033                Some(17593872),
11034                Some(17593873),
11035                Some(17593874),
11036                Some(17593875),
11037                Some(17593876),
11038                Some(17593877),
11039                Some(17593878),
11040                Some(17593880),
11041                Some(17593881),
11042                Some(17593882),
11043                Some(17593883),
11044                Some(17593884),
11045                Some(17593885),
11046                Some(17593886),
11047                Some(17593887),
11048                Some(17593888),
11049                Some(17593889),
11050                Some(17593890),
11051                Some(17593891),
11052                Some(17593892),
11053                Some(17593893),
11054                Some(17593894),
11055                Some(17593895),
11056                Some(17593896),
11057                Some(17593897),
11058                Some(17593898),
11059                Some(17593899),
11060                Some(17593900),
11061                Some(17593901),
11062                Some(17593902),
11063                Some(17593903),
11064                Some(17593904),
11065                Some(17593905),
11066                Some(17593906),
11067                Some(17593907),
11068                None,
11069                None,
11070                None,
11071                None,
11072                None,
11073                None,
11074                None
11075            ]
11076        );
11077        let rp: Vec<_> = it
11078            .next()
11079            .unwrap()
11080            .unwrap()
11081            .reference_positions_full()
11082            .collect();
11083        assert_eq!(
11084            rp,
11085            vec![
11086                None,
11087                None,
11088                None,
11089                None,
11090                None,
11091                None,
11092                None,
11093                None,
11094                None,
11095                None,
11096                None,
11097                Some(17596476),
11098                Some(17596477),
11099                Some(17596478),
11100                Some(17596479),
11101                Some(17596480),
11102                Some(17596481),
11103                Some(17596482),
11104                None,
11105                Some(17596483),
11106                Some(17596484),
11107                Some(17596485),
11108                Some(17596486),
11109                Some(17596487),
11110                Some(17596488),
11111                Some(17596489),
11112                Some(17596490),
11113                Some(17596491),
11114                Some(17596492),
11115                Some(17596493),
11116                Some(17596494),
11117                Some(17596495),
11118                Some(17596496),
11119                Some(17596497),
11120                Some(17596498),
11121                Some(17596499),
11122                Some(17596500),
11123                Some(17596501),
11124                Some(17596502),
11125                Some(17596503),
11126                Some(17596504),
11127                Some(17596505),
11128                Some(17596506),
11129                Some(17596507),
11130                Some(17596508),
11131                Some(17596509),
11132                Some(17596510),
11133                Some(17596511),
11134                Some(17596512),
11135                Some(17596513),
11136                Some(17596514)
11137            ]
11138        );
11139        let rp: Vec<_> = it
11140            .next()
11141            .unwrap()
11142            .unwrap()
11143            .reference_positions_full()
11144            .collect();
11145        assert_eq!(
11146            rp,
11147            vec![
11148                None,
11149                None,
11150                None,
11151                None,
11152                None,
11153                Some(17624012),
11154                Some(17624013),
11155                Some(17624014),
11156                Some(17624015),
11157                Some(17624016),
11158                Some(17624017),
11159                Some(17624018),
11160                Some(17624019),
11161                Some(17624020),
11162                Some(17625913),
11163                Some(17625914),
11164                Some(17625915),
11165                Some(17625916),
11166                Some(17625917),
11167                Some(17625918),
11168                Some(17625919),
11169                Some(17625920),
11170                Some(17625921),
11171                Some(17625922),
11172                Some(17625923),
11173                Some(17625924),
11174                Some(17625925),
11175                Some(17625926),
11176                Some(17625927),
11177                Some(17625928),
11178                Some(17625929),
11179                Some(17625930),
11180                Some(17625931),
11181                Some(17625932),
11182                Some(17625933),
11183                Some(17625934),
11184                Some(17625935),
11185                Some(17625936),
11186                Some(17625937),
11187                Some(17625938),
11188                Some(17625939),
11189                Some(17625940),
11190                Some(17625941),
11191                Some(17625942),
11192                Some(17625943),
11193                Some(17625944),
11194                Some(17625945),
11195                Some(17625946),
11196                Some(17625947),
11197                Some(17625948),
11198                Some(17625949)
11199            ]
11200        );
11201        let rp: Vec<_> = it
11202            .next()
11203            .unwrap()
11204            .unwrap()
11205            .reference_positions_full()
11206            .collect();
11207        assert_eq!(
11208            rp,
11209            vec![
11210                None,
11211                None,
11212                Some(17624012),
11213                Some(17624013),
11214                Some(17624014),
11215                Some(17624015),
11216                Some(17624016),
11217                Some(17624017),
11218                Some(17624018),
11219                Some(17624019),
11220                Some(17624020),
11221                Some(17625913),
11222                Some(17625914),
11223                Some(17625915),
11224                Some(17625916),
11225                Some(17625917),
11226                Some(17625918),
11227                Some(17625919),
11228                Some(17625920),
11229                Some(17625921),
11230                Some(17625922),
11231                Some(17625923),
11232                Some(17625924),
11233                Some(17625925),
11234                Some(17625926),
11235                Some(17625927),
11236                Some(17625928),
11237                Some(17625929),
11238                Some(17625930),
11239                Some(17625931),
11240                Some(17625932),
11241                Some(17625933),
11242                Some(17625934),
11243                Some(17625935),
11244                Some(17625936),
11245                Some(17625937),
11246                Some(17625938),
11247                Some(17625939),
11248                Some(17625940),
11249                Some(17625941),
11250                Some(17625942),
11251                Some(17625943),
11252                Some(17625944),
11253                Some(17625945),
11254                Some(17625946),
11255                Some(17625947),
11256                Some(17625948),
11257                Some(17625949),
11258                Some(17625950),
11259                Some(17625951),
11260                Some(17625952)
11261            ]
11262        );
11263        let rp: Vec<_> = it
11264            .next()
11265            .unwrap()
11266            .unwrap()
11267            .reference_positions_full()
11268            .collect();
11269        assert_eq!(
11270            rp,
11271            vec![
11272                None,
11273                Some(31796700),
11274                Some(31796701),
11275                Some(31796702),
11276                Some(31796703),
11277                Some(31796704),
11278                Some(31796705),
11279                Some(31796706),
11280                Some(31796710),
11281                Some(31796711),
11282                Some(31796712),
11283                Some(31796713),
11284                Some(31796714),
11285                Some(31796715),
11286                Some(31796716),
11287                Some(31796717),
11288                Some(31796718),
11289                Some(31796719),
11290                Some(31796720),
11291                Some(31796721),
11292                Some(31796722),
11293                Some(31796723),
11294                Some(31796724),
11295                Some(31796725),
11296                Some(31796726),
11297                Some(31796727),
11298                Some(31796728),
11299                Some(31799014),
11300                Some(31799015),
11301                Some(31799016),
11302                Some(31799017),
11303                Some(31799018),
11304                Some(31799019),
11305                Some(31799020),
11306                Some(31799021),
11307                Some(31799022),
11308                Some(31799023),
11309                Some(31799024),
11310                Some(31799025),
11311                Some(31799026),
11312                Some(31799027),
11313                Some(31799028),
11314                Some(31799029),
11315                Some(31799030),
11316                Some(31799031),
11317                Some(31799032),
11318                Some(31799033),
11319                Some(31799034),
11320                Some(31799035),
11321                Some(31799036),
11322                Some(31799037)
11323            ]
11324        );
11325        let rp: Vec<_> = it
11326            .next()
11327            .unwrap()
11328            .unwrap()
11329            .reference_positions_full()
11330            .collect();
11331        assert_eq!(
11332            rp,
11333            vec![
11334                Some(36722692),
11335                Some(36722693),
11336                Some(36722694),
11337                Some(36722695),
11338                Some(36722696),
11339                Some(36722697),
11340                Some(36722698),
11341                Some(36722699),
11342                Some(36722700),
11343                Some(36722701),
11344                Some(36722702),
11345                Some(36722703),
11346                Some(36722704),
11347                Some(36722705),
11348                Some(36723505),
11349                Some(36723506),
11350                Some(36723507),
11351                Some(36723508),
11352                Some(36723509),
11353                Some(36723510),
11354                Some(36723511),
11355                Some(36723512),
11356                Some(36723513),
11357                Some(36723514),
11358                Some(36723515),
11359                Some(36723516),
11360                Some(36723517),
11361                Some(36723518),
11362                Some(36723519),
11363                Some(36723520),
11364                Some(36723521),
11365                Some(36723522),
11366                Some(36723523),
11367                Some(36723524),
11368                Some(36723525),
11369                Some(36723526),
11370                Some(36723527),
11371                Some(36723528),
11372                Some(36723529),
11373                Some(36723530),
11374                Some(36723531),
11375                Some(36723532),
11376                Some(36737414),
11377                Some(36737415),
11378                Some(36737416),
11379                Some(36737417),
11380                Some(36737418),
11381                Some(36737419),
11382                Some(36737420),
11383                None,
11384                None
11385            ]
11386        );
11387        let rp: Vec<_> = it
11388            .next()
11389            .unwrap()
11390            .unwrap()
11391            .reference_positions_full()
11392            .collect();
11393        assert_eq!(
11394            rp,
11395            vec![
11396                None,
11397                None,
11398                None,
11399                None,
11400                Some(44587963),
11401                Some(44587964),
11402                Some(44587965),
11403                Some(44587966),
11404                Some(44587967),
11405                Some(44587968),
11406                Some(44587969),
11407                Some(44587970),
11408                Some(44587971),
11409                Some(44587972),
11410                Some(44587973),
11411                Some(44587974),
11412                Some(44587975),
11413                Some(44587976),
11414                Some(44587977),
11415                Some(44587978),
11416                Some(44587979),
11417                Some(44587980),
11418                Some(44587981),
11419                Some(44587982),
11420                Some(44587983),
11421                Some(44589680),
11422                Some(44589681),
11423                Some(44589682),
11424                Some(44589683),
11425                Some(44589684),
11426                Some(44589685),
11427                Some(44589686),
11428                Some(44589687),
11429                Some(44589688),
11430                Some(44589689),
11431                Some(44589690),
11432                Some(44589691),
11433                Some(44589692),
11434                Some(44589693),
11435                Some(44589694),
11436                Some(44589695),
11437                Some(44589696),
11438                Some(44589697),
11439                Some(44589698),
11440                Some(44589699),
11441                Some(44589700),
11442                Some(44589701),
11443                Some(44589702),
11444                Some(44592034),
11445                Some(44592035),
11446                Some(44592036)
11447            ]
11448        );
11449    }
11450
11451    #[test]
11452    fn test_reference_start_end() {
11453        let mut bam = bam::Reader::from_path("./test/test_spliced_reads.bam").unwrap();
11454        let mut it = bam.records();
11455        let read = it.next().unwrap().unwrap();
11456        assert_eq!(read.reference_start(), 16050676);
11457        assert_eq!(read.reference_end(), 16050721);
11458        let read = it.next().unwrap().unwrap();
11459        assert_eq!(read.reference_start(), 16096878);
11460        assert_eq!(read.reference_end(), 16096931);
11461        let read = it.next().unwrap().unwrap();
11462        assert_eq!(read.reference_start(), 16097145);
11463        assert_eq!(read.reference_end(), 16097198);
11464        let read = it.next().unwrap().unwrap();
11465        assert_eq!(read.reference_start(), 16117350);
11466        assert_eq!(read.reference_end(), 16117401);
11467        let read = it.next().unwrap().unwrap();
11468        assert_eq!(read.reference_start(), 16118483);
11469        assert_eq!(read.reference_end(), 16118534);
11470        let read = it.next().unwrap().unwrap();
11471        assert_eq!(read.reference_start(), 16118499);
11472        assert_eq!(read.reference_end(), 16118550);
11473        let read = it.next().unwrap().unwrap();
11474        assert_eq!(read.reference_start(), 16118499);
11475        assert_eq!(read.reference_end(), 16118550);
11476        let read = it.next().unwrap().unwrap();
11477        assert_eq!(read.reference_start(), 16118499);
11478        assert_eq!(read.reference_end(), 16118550);
11479        let read = it.next().unwrap().unwrap();
11480        assert_eq!(read.reference_start(), 16123411);
11481        assert_eq!(read.reference_end(), 16123462);
11482        let read = it.next().unwrap().unwrap();
11483        assert_eq!(read.reference_start(), 16123417);
11484        assert_eq!(read.reference_end(), 16123462);
11485        let read = it.next().unwrap().unwrap();
11486        assert_eq!(read.reference_start(), 16165860);
11487        assert_eq!(read.reference_end(), 16165901);
11488        let read = it.next().unwrap().unwrap();
11489        assert_eq!(read.reference_start(), 16180871);
11490        assert_eq!(read.reference_end(), 16180922);
11491        let read = it.next().unwrap().unwrap();
11492        assert_eq!(read.reference_start(), 16189705);
11493        assert_eq!(read.reference_end(), 16189756);
11494        let read = it.next().unwrap().unwrap();
11495        assert_eq!(read.reference_start(), 16231271);
11496        assert_eq!(read.reference_end(), 16231322);
11497        let read = it.next().unwrap().unwrap();
11498        assert_eq!(read.reference_start(), 16237657);
11499        assert_eq!(read.reference_end(), 16237708);
11500        let read = it.next().unwrap().unwrap();
11501        assert_eq!(read.reference_start(), 16255012);
11502        assert_eq!(read.reference_end(), 16255054);
11503        let read = it.next().unwrap().unwrap();
11504        assert_eq!(read.reference_start(), 16255391);
11505        assert_eq!(read.reference_end(), 16255442);
11506        let read = it.next().unwrap().unwrap();
11507        assert_eq!(read.reference_start(), 16255392);
11508        assert_eq!(read.reference_end(), 16255442);
11509        let read = it.next().unwrap().unwrap();
11510        assert_eq!(read.reference_start(), 16256084);
11511        assert_eq!(read.reference_end(), 16256129);
11512        let read = it.next().unwrap().unwrap();
11513        assert_eq!(read.reference_start(), 16256224);
11514        assert_eq!(read.reference_end(), 16256272);
11515        let read = it.next().unwrap().unwrap();
11516        assert_eq!(read.reference_start(), 16325199);
11517        assert_eq!(read.reference_end(), 16325241);
11518        let read = it.next().unwrap().unwrap();
11519        assert_eq!(read.reference_start(), 16352865);
11520        assert_eq!(read.reference_end(), 16352903);
11521        let read = it.next().unwrap().unwrap();
11522        assert_eq!(read.reference_start(), 16352968);
11523        assert_eq!(read.reference_end(), 16353012);
11524        let read = it.next().unwrap().unwrap();
11525        assert_eq!(read.reference_start(), 16414998);
11526        assert_eq!(read.reference_end(), 16415044);
11527        let read = it.next().unwrap().unwrap();
11528        assert_eq!(read.reference_start(), 17031591);
11529        assert_eq!(read.reference_end(), 17031638);
11530        let read = it.next().unwrap().unwrap();
11531        assert_eq!(read.reference_start(), 17057382);
11532        assert_eq!(read.reference_end(), 17057432);
11533        let read = it.next().unwrap().unwrap();
11534        assert_eq!(read.reference_start(), 17092766);
11535        assert_eq!(read.reference_end(), 17095000);
11536        let read = it.next().unwrap().unwrap();
11537        assert_eq!(read.reference_start(), 17092782);
11538        assert_eq!(read.reference_end(), 17095016);
11539        let read = it.next().unwrap().unwrap();
11540        assert_eq!(read.reference_start(), 17092782);
11541        assert_eq!(read.reference_end(), 17095016);
11542        let read = it.next().unwrap().unwrap();
11543        assert_eq!(read.reference_start(), 17137287);
11544        assert_eq!(read.reference_end(), 17137320);
11545        let read = it.next().unwrap().unwrap();
11546        assert_eq!(read.reference_start(), 17306238);
11547        assert_eq!(read.reference_end(), 17306286);
11548        let read = it.next().unwrap().unwrap();
11549        assert_eq!(read.reference_start(), 17561868);
11550        assert_eq!(read.reference_end(), 17561913);
11551        let read = it.next().unwrap().unwrap();
11552        assert_eq!(read.reference_start(), 17566078);
11553        assert_eq!(read.reference_end(), 17577961);
11554        let read = it.next().unwrap().unwrap();
11555        assert_eq!(read.reference_start(), 17566108);
11556        assert_eq!(read.reference_end(), 17578701);
11557        let read = it.next().unwrap().unwrap();
11558        assert_eq!(read.reference_start(), 17566111);
11559        assert_eq!(read.reference_end(), 17578704);
11560        let read = it.next().unwrap().unwrap();
11561        assert_eq!(read.reference_start(), 17566111);
11562        assert_eq!(read.reference_end(), 17578704);
11563        let read = it.next().unwrap().unwrap();
11564        assert_eq!(read.reference_start(), 17566111);
11565        assert_eq!(read.reference_end(), 17578704);
11566        let read = it.next().unwrap().unwrap();
11567        assert_eq!(read.reference_start(), 17566111);
11568        assert_eq!(read.reference_end(), 17578704);
11569        let read = it.next().unwrap().unwrap();
11570        assert_eq!(read.reference_start(), 17566112);
11571        assert_eq!(read.reference_end(), 17578705);
11572        let read = it.next().unwrap().unwrap();
11573        assert_eq!(read.reference_start(), 17566113);
11574        assert_eq!(read.reference_end(), 17578706);
11575        let read = it.next().unwrap().unwrap();
11576        assert_eq!(read.reference_start(), 17566113);
11577        assert_eq!(read.reference_end(), 17578706);
11578        let read = it.next().unwrap().unwrap();
11579        assert_eq!(read.reference_start(), 17579733);
11580        assert_eq!(read.reference_end(), 17581250);
11581        let read = it.next().unwrap().unwrap();
11582        assert_eq!(read.reference_start(), 17581369);
11583        assert_eq!(read.reference_end(), 17583029);
11584        let read = it.next().unwrap().unwrap();
11585        assert_eq!(read.reference_start(), 17581370);
11586        assert_eq!(read.reference_end(), 17583030);
11587        let read = it.next().unwrap().unwrap();
11588        assert_eq!(read.reference_start(), 17581370);
11589        assert_eq!(read.reference_end(), 17583030);
11590        let read = it.next().unwrap().unwrap();
11591        assert_eq!(read.reference_start(), 17582911);
11592        assert_eq!(read.reference_end(), 17583056);
11593        let read = it.next().unwrap().unwrap();
11594        assert_eq!(read.reference_start(), 17588621);
11595        assert_eq!(read.reference_end(), 17589209);
11596        let read = it.next().unwrap().unwrap();
11597        assert_eq!(read.reference_start(), 17588621);
11598        assert_eq!(read.reference_end(), 17589209);
11599        let read = it.next().unwrap().unwrap();
11600        assert_eq!(read.reference_start(), 17588621);
11601        assert_eq!(read.reference_end(), 17589209);
11602        let read = it.next().unwrap().unwrap();
11603        assert_eq!(read.reference_start(), 17591770);
11604        assert_eq!(read.reference_end(), 17591821);
11605        let read = it.next().unwrap().unwrap();
11606        assert_eq!(read.reference_start(), 17593855);
11607        assert_eq!(read.reference_end(), 17593904);
11608        let read = it.next().unwrap().unwrap();
11609        assert_eq!(read.reference_start(), 17593863);
11610        assert_eq!(read.reference_end(), 17593908);
11611        let read = it.next().unwrap().unwrap();
11612        assert_eq!(read.reference_start(), 17596476);
11613        assert_eq!(read.reference_end(), 17596515);
11614        let read = it.next().unwrap().unwrap();
11615        assert_eq!(read.reference_start(), 17624012);
11616        assert_eq!(read.reference_end(), 17625950);
11617        let read = it.next().unwrap().unwrap();
11618        assert_eq!(read.reference_start(), 17624012);
11619        assert_eq!(read.reference_end(), 17625953);
11620        let read = it.next().unwrap().unwrap();
11621        assert_eq!(read.reference_start(), 31796700);
11622        assert_eq!(read.reference_end(), 31799038);
11623        let read = it.next().unwrap().unwrap();
11624        assert_eq!(read.reference_start(), 36722692);
11625        assert_eq!(read.reference_end(), 36737421);
11626        let read = it.next().unwrap().unwrap();
11627        assert_eq!(read.reference_start(), 44587963);
11628        assert_eq!(read.reference_end(), 44592037);
11629    }
11630
11631    #[test]
11632    fn test_infer_seq_len() {
11633        use std::convert::TryFrom;
11634        let mut bam = bam::Reader::from_path("./test/test_spliced_reads.bam").unwrap();
11635        for read in bam.records() {
11636            let read = read.unwrap();
11637            assert_eq!(read.seq_len_from_cigar(false), 51);
11638            assert_eq!(read.seq_len_from_cigar(true), 51);
11639        }
11640
11641        let mut read = bam::Record::new();
11642        for (input_cigar, supposed_length_wo_hard_clip, supposed_length_with_hard_clip) in &[
11643            ("40M", 40, 40),
11644            ("40=", 40, 40),
11645            ("40X", 40, 40),
11646            ("20M5I20M", 45, 45),
11647            ("20M5D20M", 40, 40),
11648            ("5H", 0, 5),
11649            ("5H35M", 35, 40),
11650            ("5S35M", 40, 40),
11651            ("35M5H", 35, 40),
11652            ("35M5S", 40, 40),
11653            ("", 0, 0),
11654        ] {
11655            read.set(
11656                b"test",
11657                Some(&CigarString::try_from(*input_cigar).unwrap()),
11658                b"agtc",
11659                b"BBBB",
11660            );
11661            assert_eq!(
11662                &read.seq_len_from_cigar(false),
11663                supposed_length_wo_hard_clip
11664            );
11665            assert_eq!(
11666                &read.seq_len_from_cigar(true),
11667                supposed_length_with_hard_clip
11668            );
11669        }
11670    }
11671}