From 81419190644a9b73c78a09baee4c02681be24fb9 Mon Sep 17 00:00:00 2001 From: Tyler Date: Tue, 15 Jun 2021 11:06:36 -0700 Subject: [PATCH] Implements count=N - Adds tests for count=READS and count=BYTES. - Implements count logic for read count and bytes count limits. --- src/uu/dd/src/dd.rs | 243 +++++++++++------- .../src/dd_unit_tests/block_unblock_tests.rs | 2 + .../dd/src/dd_unit_tests/conv_sync_tests.rs | 1 + .../dd/src/dd_unit_tests/conversion_tests.rs | 4 + src/uu/dd/src/dd_unit_tests/mod.rs | 3 + src/uu/dd/src/dd_unit_tests/sanity_tests.rs | 162 +++++++++++- src/uu/dd/src/parseargs.rs | 22 ++ .../gnudd-deadbeef-first-12345.spec | 1 + .../gnudd-deadbeef-first-16k.spec | 1 + .../gnudd-random-first-32k.spec | Bin 0 -> 32768 bytes 10 files changed, 341 insertions(+), 98 deletions(-) create mode 100644 src/uu/dd/test-resources/gnudd-deadbeef-first-12345.spec create mode 100644 src/uu/dd/test-resources/gnudd-deadbeef-first-16k.spec create mode 100644 src/uu/dd/test-resources/gnudd-random-first-32k.spec diff --git a/src/uu/dd/src/dd.rs b/src/uu/dd/src/dd.rs index def82aafb..8d1c7121a 100644 --- a/src/uu/dd/src/dd.rs +++ b/src/uu/dd/src/dd.rs @@ -66,6 +66,17 @@ struct ReadStat reads_partial: u64, records_truncated: u32, } +impl std::ops::AddAssign for ReadStat +{ + fn add_assign(&mut self, other: Self) + { + *self = Self { + reads_complete: self.reads_complete + other.reads_complete, + reads_partial: self.reads_partial + other.reads_partial, + records_truncated: self.records_truncated + other.records_truncated, + } + } +} struct WriteStat { @@ -73,6 +84,17 @@ struct WriteStat writes_partial: u64, bytes_total: u128, } +impl std::ops::AddAssign for WriteStat +{ + fn add_assign(&mut self, other: Self) + { + *self = Self { + writes_complete: self.writes_complete + other.writes_complete, + writes_partial: self.writes_partial + other.writes_partial, + bytes_total: self.bytes_total + other.bytes_total, + } + } +} type Cbs = usize; @@ -150,6 +172,16 @@ pub enum StatusLevel None, } +/// The value of count=N +/// Defaults to Reads(N) +/// if iflag=count_bytes +/// then becomes Bytes(N) +pub enum CountType +{ + Reads(usize), + Bytes(usize), +} + #[derive(Debug)] enum InternalError { @@ -180,6 +212,7 @@ struct Input non_ascii: bool, ibs: usize, xfer_stats: Option, + count: Option, cflags: IConvFlags, iflags: IFlags, } @@ -194,12 +227,14 @@ impl Input let cflags = parseargs::parse_conv_flag_input(matches)?; let iflags = parseargs::parse_iflags(matches)?; let skip = parseargs::parse_skip_amt(&ibs, &iflags, matches)?; + let count = parseargs::parse_count(&iflags, matches)?; let mut i = Input { src: io::stdin(), non_ascii, ibs, xfer_stats, + count, cflags, iflags, }; @@ -225,6 +260,7 @@ impl Input let cflags = parseargs::parse_conv_flag_input(matches)?; let iflags = parseargs::parse_iflags(matches)?; let skip = parseargs::parse_skip_amt(&ibs, &iflags, matches)?; + let count = parseargs::parse_count(&iflags, matches)?; if let Some(fname) = matches.opt_str("if") { @@ -241,6 +277,7 @@ impl Input non_ascii, ibs, xfer_stats, + count, cflags, iflags, }; @@ -279,7 +316,7 @@ impl Read for Input impl Input { - /// Fills a given obs-sized buffer. + /// Fills a given buffer. /// Reads in increments of 'self.ibs'. /// The start of each ibs-sized read follows the previous one. fn fill_consecutive(&mut self, buf: &mut Vec) -> Result> @@ -317,7 +354,7 @@ impl Input }) } - /// Fills a given obs-sized buffer. + /// Fills a given buffer. /// Reads in increments of 'self.ibs'. /// The start of each ibs-sized read is aligned to multiples of ibs; remaing space is filled with the 'pad' byte. fn fill_blocks(&mut self, buf: &mut Vec, obs: usize, pad: u8) -> Result> @@ -375,23 +412,19 @@ impl Input } /// Force-fills a buffer, ignoring zero-length reads which would otherwise be - /// interpreted as EOF. Does not continue after errors. - /// Note: This may never return. - fn force_fill(&mut self, mut buf: &mut [u8], target_len: usize) -> Result<(), Box> + /// interpreted as EOF. + /// Note: This will not return unless the source (eventually) produces + /// enough bytes to meet target_len. + fn force_fill(&mut self, mut buf: &mut [u8], target_len: usize) -> Result> { - let mut total_len = 0; - - loop + let mut base_idx = 0; + while base_idx < target_len { - total_len += self.read(&mut buf)?; - - if total_len == target_len - { - return Ok(()); - } + base_idx += self.read(&mut buf[base_idx..target_len])?; } - } + Ok(base_idx) + } } struct Output @@ -602,7 +635,7 @@ impl Output /// Splits the content of buf into cbs-length blocks /// Appends padding as specified by conv=block and cbs=N -fn block(buf: Vec, cbs: usize, rstats: &mut ReadStat) -> Vec> +fn block(buf: Vec, cbs: usize, rstat: &mut ReadStat) -> Vec> { let mut blocks = buf.split(| &e | e == '\n' as u8) .fold(Vec::new(), | mut blocks, split | @@ -610,7 +643,7 @@ fn block(buf: Vec, cbs: usize, rstats: &mut ReadStat) -> Vec> let mut split = split.to_vec(); if split.len() > cbs { - rstats.records_truncated += 1; + rstat.records_truncated += 1; } split.resize(cbs, ' ' as u8); blocks.push(split); @@ -683,7 +716,7 @@ fn unblock(buf: Vec, cbs: usize) -> Vec .collect() } -fn conv_block_unblock_helper(mut buf: Vec, i: &mut Input, o: &Output, rstats: &mut ReadStat) -> Result, Box> +fn conv_block_unblock_helper(mut buf: Vec, i: &mut Input, o: &Output, rstat: &mut ReadStat) -> Result, Box> { // Local Predicate Fns ------------------------------------------------- #[inline] @@ -737,7 +770,7 @@ fn conv_block_unblock_helper(mut buf: Vec, i: &mut Input< { // ascii input so perform the block first let cbs = i.cflags.block.unwrap(); - let mut blocks = block(buf, cbs, rstats); + let mut blocks = block(buf, cbs, rstat); if let Some(ct) = i.cflags.ctable { @@ -762,7 +795,7 @@ fn conv_block_unblock_helper(mut buf: Vec, i: &mut Input< apply_ct(&mut buf, &ct); } - let blocks = block(buf, cbs, rstats) + let blocks = block(buf, cbs, rstat) .into_iter() .flatten() .collect(); @@ -860,7 +893,7 @@ fn read_helper(i: &mut Input, o: &mut Output, bsize: us { // Read let mut buf = vec![BUF_INIT_BYTE; bsize]; - let mut rstats = match i.cflags.sync + let mut rstat = match i.cflags.sync { Some(ch) => i.fill_blocks(&mut buf, o.obs, ch)?, @@ -868,9 +901,9 @@ fn read_helper(i: &mut Input, o: &mut Output, bsize: us i.fill_consecutive(&mut buf)?, }; // Return early if no data - if rstats.reads_complete == 0 && rstats.reads_partial == 0 + if rstat.reads_complete == 0 && rstat.reads_partial == 0 { - return Ok((rstats,buf)); + return Ok((rstat,buf)); } // Perform any conv=x[,x...] options @@ -880,12 +913,12 @@ fn read_helper(i: &mut Input, o: &mut Output, bsize: us } if is_conv(&i) || is_block(&i) || is_unblock(&i) { - let buf = conv_block_unblock_helper(buf, i, o, &mut rstats)?; - Ok((rstats, buf)) + let buf = conv_block_unblock_helper(buf, i, o, &mut rstat)?; + Ok((rstat, buf)) } else { - Ok((rstats, buf)) + Ok((rstat, buf)) } } } @@ -935,13 +968,13 @@ fn print_xfer_stats(update: &ProgUpdate) } -/// Generate a progress updater that tracks progress, receives updates, and TODO: responds to signals. +/// Generate a progress updater that tracks progress, receives updates, and responds to signals. fn gen_prog_updater(rx: mpsc::Receiver, xfer_stats: Option) -> impl Fn() -> () { // -------------------------------------------------------------- fn posixly_correct() -> bool { - !env::var("POSIXLY_CORRECT").is_err() + env::var("POSIXLY_CORRECT").is_ok() } // -------------------------------------------------------------- move || { @@ -951,7 +984,7 @@ fn gen_prog_updater(rx: mpsc::Receiver, xfer_stats: Option https://unix.stackexchange.com/questions/179481/siginfo-on-gnu-linux-arch-linux-missing // if let Err(e) = signal_hook::flag::register_usize(signal::SIGINFO, sigval.clone(), signal::SIGINFO as usize) // { @@ -980,12 +1013,9 @@ fn gen_prog_updater(rx: mpsc::Receiver, xfer_stats: Option - { - debug_println!("Internal dd Warning: Error in progress update thread\n\t{}", e); - - continue; - }, + (Err(_), _) => + // recv only fails permenantly + break, }; // Handle signals match sigval.load(Ordering::Relaxed) @@ -1014,17 +1044,64 @@ fn calc_bsize(ibs: usize, obs: usize) -> usize lcm } +/// Calculate the buffer size appropriate for this loop iteration, respecting +/// a count=N if present. +fn calc_loop_bsize(count: &Option, rstat: &ReadStat, wstat: &WriteStat, ibs: usize, ideal_bsize: usize) -> usize +{ + match count + { + Some(CountType::Reads(rmax)) => + { + let rmax: u64 = (*rmax).try_into().unwrap(); + let rsofar = rstat.reads_complete + rstat.reads_partial; + let rremain: usize = (rmax - rsofar).try_into().unwrap(); + cmp::min(ideal_bsize, rremain*ibs) + }, + Some(CountType::Bytes(bmax)) => + { + let bmax: u128 = (*bmax).try_into().unwrap(); + let bremain: usize = (bmax - wstat.bytes_total).try_into().unwrap(); + cmp::min(ideal_bsize, bremain) + }, + None => + ideal_bsize, + } +} + +/// Decide if the current progress is below a count=N limit or return +/// true if no such limit is set. +fn below_count_limit(count: &Option, rstat: &ReadStat, wstat: &WriteStat) -> bool +{ + match count + { + Some(CountType::Reads(n)) => + { + let n = (*n).try_into().unwrap(); + // debug_assert!(rstat.reads_complete + rstat.reads_partial >= n); + rstat.reads_complete + rstat.reads_partial <= n + }, + Some(CountType::Bytes(n)) => + { + let n = (*n).try_into().unwrap(); + // debug_assert!(wstat.bytes_total >= n); + wstat.bytes_total <= n + }, + None => + true, + } +} + /// Perform the copy/convert opertaions. Stdout version // Note: Some of dd's functionality depends on whether the output is actually a file. This breaks the Output abstraction, // and should be fixed in the future. fn dd_stdout(mut i: Input, mut o: Output) -> Result<(), Box> { - let mut rstats = ReadStat { + let mut rstat = ReadStat { reads_complete: 0, reads_partial: 0, records_truncated: 0, }; - let mut wstats = WriteStat { + let mut wstat = WriteStat { writes_complete: 0, writes_partial: 0, bytes_total: 0, @@ -1038,37 +1115,30 @@ fn dd_stdout(mut i: Input, mut o: Output) -> Result<(), tx }; - loop + while below_count_limit(&i.count, &rstat, &wstat) { // Read/Write - match read_helper(&mut i, &mut o, bsize)? + let loop_bsize = calc_loop_bsize(&i.count, &rstat, &wstat, i.ibs, bsize); + match read_helper(&mut i, &mut o, loop_bsize)? { (ReadStat { reads_complete: 0, reads_partial: 0, .. }, _) => break, (rstat_update, buf) => { - let wstats_update = o.write_blocks(buf)?; + let wstat_update = o.write_blocks(buf)?; - rstats = ReadStat { - reads_complete: rstats.reads_complete + rstat_update.reads_complete, - reads_partial: rstats.reads_partial + rstat_update.reads_partial, - records_truncated: rstats.records_truncated + rstat_update.records_truncated, - }; - wstats = WriteStat { - writes_complete: wstats.writes_complete + wstats_update.writes_complete, - writes_partial: wstats.writes_partial + wstats_update.writes_partial, - bytes_total: wstats.bytes_total + wstats_update.bytes_total, - }; - }, + rstat += rstat_update; + wstat += wstat_update; + }, }; // Update Prog prog_tx.send(ProgUpdate { - reads_complete: rstats.reads_complete, - reads_partial: rstats.reads_partial, - writes_complete: wstats.writes_complete, - writes_partial: wstats.writes_partial, - bytes_total: wstats.bytes_total, - records_truncated: rstats.records_truncated, + reads_complete: rstat.reads_complete, + reads_partial: rstat.reads_partial, + writes_complete: wstat.writes_complete, + writes_partial: wstat.writes_partial, + bytes_total: wstat.bytes_total, + records_truncated: rstat.records_truncated, duration: start.elapsed(), })?; } @@ -1088,12 +1158,12 @@ fn dd_stdout(mut i: Input, mut o: Output) -> Result<(), Some(StatusLevel::None) => {}, _ => print_xfer_stats(&ProgUpdate { - reads_complete: rstats.reads_complete, - reads_partial: rstats.reads_partial, - writes_complete: wstats.writes_complete, - writes_partial: wstats.writes_partial, - bytes_total: wstats.bytes_total, - records_truncated: rstats.records_truncated, + reads_complete: rstat.reads_complete, + reads_partial: rstat.reads_partial, + writes_complete: wstat.writes_complete, + writes_partial: wstat.writes_partial, + bytes_total: wstat.bytes_total, + records_truncated: rstat.records_truncated, duration: start.elapsed(), }), } @@ -1105,12 +1175,12 @@ fn dd_stdout(mut i: Input, mut o: Output) -> Result<(), // and should be fixed in the future. fn dd_fileout(mut i: Input, mut o: Output) -> Result<(), Box> { - let mut rstats = ReadStat { + let mut rstat = ReadStat { reads_complete: 0, reads_partial: 0, records_truncated: 0, }; - let mut wstats = WriteStat { + let mut wstat = WriteStat { writes_complete: 0, writes_partial: 0, bytes_total: 0, @@ -1124,37 +1194,30 @@ fn dd_fileout(mut i: Input, mut o: Output) -> Result<(), Box break, (rstat_update, buf) => { - let wstats_update = o.write_blocks(buf)?; + let wstat_update = o.write_blocks(buf)?; - rstats = ReadStat { - reads_complete: rstats.reads_complete + rstat_update.reads_complete, - reads_partial: rstats.reads_partial + rstat_update.reads_partial, - records_truncated: rstats.records_truncated + rstat_update.records_truncated, - }; - wstats = WriteStat { - writes_complete: wstats.writes_complete + wstats_update.writes_complete, - writes_partial: wstats.writes_partial + wstats_update.writes_partial, - bytes_total: wstats.bytes_total + wstats_update.bytes_total, - }; + rstat += rstat_update; + wstat += wstat_update; }, }; // Update Prog prog_tx.send(ProgUpdate { - reads_complete: rstats.reads_complete, - reads_partial: rstats.reads_partial, - writes_complete: wstats.writes_complete, - writes_partial: wstats.writes_partial, - bytes_total: wstats.bytes_total, - records_truncated: rstats.records_truncated, + reads_complete: rstat.reads_complete, + reads_partial: rstat.reads_partial, + writes_complete: wstat.writes_complete, + writes_partial: wstat.writes_partial, + bytes_total: wstat.bytes_total, + records_truncated: rstat.records_truncated, duration: start.elapsed(), })?; } @@ -1174,12 +1237,12 @@ fn dd_fileout(mut i: Input, mut o: Output) -> Result<(), Box {}, _ => print_xfer_stats(&ProgUpdate { - reads_complete: rstats.reads_complete, - reads_partial: rstats.reads_partial, - writes_complete: wstats.writes_complete, - writes_partial: wstats.writes_partial, - bytes_total: wstats.bytes_total, - records_truncated: rstats.records_truncated, + reads_complete: rstat.reads_complete, + reads_partial: rstat.reads_partial, + writes_complete: wstat.writes_complete, + writes_partial: wstat.writes_partial, + bytes_total: wstat.bytes_total, + records_truncated: rstat.records_truncated, duration: start.elapsed(), }), } diff --git a/src/uu/dd/src/dd_unit_tests/block_unblock_tests.rs b/src/uu/dd/src/dd_unit_tests/block_unblock_tests.rs index b0a1ba6fc..eba49f9d0 100644 --- a/src/uu/dd/src/dd_unit_tests/block_unblock_tests.rs +++ b/src/uu/dd/src/dd_unit_tests/block_unblock_tests.rs @@ -24,6 +24,7 @@ macro_rules! make_block_test ( non_ascii: false, ibs: 512, xfer_stats: None, + count: None, cflags: IConvFlags { ctable: None, block: $block, @@ -56,6 +57,7 @@ macro_rules! make_unblock_test ( non_ascii: false, ibs: 512, xfer_stats: None, + count: None, cflags: IConvFlags { ctable: None, block: None, diff --git a/src/uu/dd/src/dd_unit_tests/conv_sync_tests.rs b/src/uu/dd/src/dd_unit_tests/conv_sync_tests.rs index 070fdb217..959cb53fd 100644 --- a/src/uu/dd/src/dd_unit_tests/conv_sync_tests.rs +++ b/src/uu/dd/src/dd_unit_tests/conv_sync_tests.rs @@ -24,6 +24,7 @@ macro_rules! make_sync_test ( non_ascii: false, ibs: $ibs, xfer_stats: None, + count: None, cflags: IConvFlags { ctable: None, block: None, diff --git a/src/uu/dd/src/dd_unit_tests/conversion_tests.rs b/src/uu/dd/src/dd_unit_tests/conversion_tests.rs index b7d7ccb9b..f7ee7f92c 100644 --- a/src/uu/dd/src/dd_unit_tests/conversion_tests.rs +++ b/src/uu/dd/src/dd_unit_tests/conversion_tests.rs @@ -10,6 +10,7 @@ macro_rules! make_conv_test ( non_ascii: false, ibs: 512, xfer_stats: None, + count: None, cflags: icf!($ctable), iflags: DEFAULT_IFLAGS, }, @@ -35,6 +36,7 @@ macro_rules! make_icf_test ( non_ascii: false, ibs: 512, xfer_stats: None, + count: None, cflags: $icf, iflags: DEFAULT_IFLAGS, }, @@ -138,6 +140,7 @@ fn all_valid_ascii_ebcdic_ascii_roundtrip_conv_test() non_ascii: false, ibs: 128, xfer_stats: None, + count: None, cflags: icf!(Some(&ASCII_TO_EBCDIC)), iflags: DEFAULT_IFLAGS, }; @@ -160,6 +163,7 @@ fn all_valid_ascii_ebcdic_ascii_roundtrip_conv_test() non_ascii: false, ibs: 256, xfer_stats: None, + count: None, cflags: icf!(Some(&EBCDIC_TO_ASCII)), iflags: DEFAULT_IFLAGS, }; diff --git a/src/uu/dd/src/dd_unit_tests/mod.rs b/src/uu/dd/src/dd_unit_tests/mod.rs index 8904a2372..eb8af60df 100644 --- a/src/uu/dd/src/dd_unit_tests/mod.rs +++ b/src/uu/dd/src/dd_unit_tests/mod.rs @@ -95,6 +95,7 @@ macro_rules! make_spec_test ( non_ascii: false, ibs: 512, xfer_stats: None, + count: None, cflags: icf!(), iflags: DEFAULT_IFLAGS, }, @@ -116,11 +117,13 @@ macro_rules! make_spec_test ( dd_fileout($i,$o).unwrap(); let res = File::open($tmp_fname).unwrap(); + // Check test file isn't empty (unless spec file is too) assert_eq!(res.metadata().unwrap().len(), $spec.metadata().unwrap().len()); let spec = BufReader::new($spec); let res = BufReader::new(res); + // Check all bytes match for (b_res, b_spec) in res.bytes().zip(spec.bytes()) { assert_eq!(b_res.unwrap(), diff --git a/src/uu/dd/src/dd_unit_tests/sanity_tests.rs b/src/uu/dd/src/dd_unit_tests/sanity_tests.rs index 8724474a0..e9923b4b1 100644 --- a/src/uu/dd/src/dd_unit_tests/sanity_tests.rs +++ b/src/uu/dd/src/dd_unit_tests/sanity_tests.rs @@ -1,5 +1,25 @@ use super::*; +const DST_PLACEHOLDER: Vec = Vec::new(); + +macro_rules! make_io_test ( + ( $test_id:ident, $test_name:expr, $i:expr, $o:expr, $spec:expr ) => + { + make_spec_test!($test_id, + $test_name, + $i, + Output { + dst: File::create(format!("./test-resources/FAILED-{}.test", $test_name)).unwrap(), + obs: $o.obs, + cflags: $o.cflags, + oflags: $o.oflags, + }, + $spec, + format!("./test-resources/FAILED-{}.test", $test_name) + ); + }; +); + make_spec_test!( zeros_4k_test, "zeros-4k", @@ -24,7 +44,7 @@ make_spec_test!( File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap() ); -make_spec_test!( +make_io_test!( random_73k_test_not_a_multiple_obs_gt_ibs, "random-73k-not-a-multiple-obs-gt-ibs", Input { @@ -32,20 +52,20 @@ make_spec_test!( non_ascii: false, ibs: 521, xfer_stats: None, + count: None, cflags: icf!(), iflags: DEFAULT_IFLAGS, }, Output { - dst: File::create(format!("./test-resources/FAILED-{}.test", "random-73k-not-a-multiple-obs-gt-ibs")).unwrap(), + dst: DST_PLACEHOLDER, obs: 1031, cflags: DEFAULT_CFO, oflags: DEFAULT_OFLAGS, }, - File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap(), - format!("./test-resources/FAILED-{}.test", "random-73k-not-a-multiple-obs-gt-ibs") + File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap() ); -make_spec_test!( +make_io_test!( random_73k_test_obs_lt_not_a_multiple_ibs, "random-73k-obs-lt-not-a-multiple-ibs", Input { @@ -53,17 +73,143 @@ make_spec_test!( non_ascii: false, ibs: 1031, xfer_stats: None, + count: None, cflags: icf!(), iflags: DEFAULT_IFLAGS, }, Output { - dst: File::create(format!("./test-resources/FAILED-{}.test", "random-73k-obs-lt-not-a-multiple-ibs")).unwrap(), + dst: DST_PLACEHOLDER, obs: 521, cflags: DEFAULT_CFO, oflags: DEFAULT_OFLAGS, }, - File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap(), - format!("./test-resources/FAILED-{}.test", "random-73k-obs-lt-not-a-multiple-ibs") + File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap() +); + +make_io_test!( + deadbeef_all_32k_test_count_reads, + "deadbeef_all_32k_test_count_reads", + Input { + src: File::open("./test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test").unwrap(), + non_ascii: false, + ibs: 1024, + xfer_stats: None, + count: Some(CountType::Reads(32)), + cflags: icf!(), + iflags: DEFAULT_IFLAGS, + }, + Output { + dst: DST_PLACEHOLDER, + obs: 1024, + cflags: DEFAULT_CFO, + oflags: DEFAULT_OFLAGS, + }, + File::open("./test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test").unwrap() +); + +make_io_test!( + deadbeef_all_32k_test_count_bytes, + "deadbeef_all_32k_test_count_bytes", + Input { + src: File::open("./test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test").unwrap(), + non_ascii: false, + ibs: 531, + xfer_stats: None, + count: Some(CountType::Bytes(32*1024)), + cflags: icf!(), + iflags: DEFAULT_IFLAGS, + }, + Output { + dst: DST_PLACEHOLDER, + obs: 1031, + cflags: DEFAULT_CFO, + oflags: DEFAULT_OFLAGS, + }, + File::open("./test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test").unwrap() +); + +make_io_test!( + deadbeef_32k_to_16k_test_count_reads, + "deadbeef_32k_test_count_reads", + Input { + src: File::open("./test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test").unwrap(), + non_ascii: false, + ibs: 1024, + xfer_stats: None, + count: Some(CountType::Reads(16)), + cflags: icf!(), + iflags: DEFAULT_IFLAGS, + }, + Output { + dst: DST_PLACEHOLDER, + obs: 1031, + cflags: DEFAULT_CFO, + oflags: DEFAULT_OFLAGS, + }, + File::open("./test-resources/gnudd-deadbeef-first-16k.spec").unwrap() +); + +make_io_test!( + deadbeef_32k_to_12345_test_count_bytes, + "deadbeef_32k_to_12345_test_count_bytes", + Input { + src: File::open("./test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test").unwrap(), + non_ascii: false, + ibs: 531, + xfer_stats: None, + count: Some(CountType::Bytes(12345)), + cflags: icf!(), + iflags: DEFAULT_IFLAGS, + }, + Output { + dst: DST_PLACEHOLDER, + obs: 1031, + cflags: DEFAULT_CFO, + oflags: DEFAULT_OFLAGS, + }, + File::open("./test-resources/gnudd-deadbeef-first-12345.spec").unwrap() +); + +make_io_test!( + random_73k_test_count_reads, + "random-73k-test-count-reads", + Input { + src: File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap(), + non_ascii: false, + ibs: 1024, + xfer_stats: None, + count: Some(CountType::Reads(32)), + cflags: icf!(), + iflags: DEFAULT_IFLAGS, + }, + Output { + dst: DST_PLACEHOLDER, + obs: 1024, + cflags: DEFAULT_CFO, + oflags: DEFAULT_OFLAGS, + }, + File::open("./test-resources/gnudd-random-first-32k.spec").unwrap() +); + +make_io_test!( + random_73k_test_count_bytes, + "random-73k-test-count-bytes", + Input { + src: File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap(), + non_ascii: false, + ibs: 521, + xfer_stats: None, + count: Some(CountType::Bytes(32*1024)), + cflags: icf!(), + iflags: DEFAULT_IFLAGS, + }, + Output { + dst: DST_PLACEHOLDER, + obs: 1031, + cflags: DEFAULT_CFO, + oflags: DEFAULT_OFLAGS, + }, + File::open("./test-resources/gnudd-random-first-32k.spec").unwrap() ); // Test internal buffer size fn diff --git a/src/uu/dd/src/parseargs.rs b/src/uu/dd/src/parseargs.rs index 96e58ffa2..620f18250 100644 --- a/src/uu/dd/src/parseargs.rs +++ b/src/uu/dd/src/parseargs.rs @@ -3,6 +3,7 @@ mod unit_tests; use crate::conversion_tables::*; use crate::{ + CountType, IConvFlags, OConvFlags, StatusLevel, }; @@ -759,6 +760,27 @@ pub fn parse_seek_amt(obs: &usize, oflags: &OFlags, matches: &getopts::Matches) } } +/// Parse the value of count=N and the type of N implied by iflags +pub fn parse_count(iflags: &IFlags, matches: &getopts::Matches) -> Result, ParseError> +{ + if let Some(amt) = matches.opt_str("count") + { + let n = parse_bytes_with_opt_multiplier(amt)?; + if iflags.count_bytes + { + Ok(Some(CountType::Bytes(n))) + } + else + { + Ok(Some(CountType::Reads(n))) + } + } + else + { + Ok(None) + } +} + /// Parse whether the args indicate the input is not ascii pub fn parse_input_non_ascii(matches: &getopts::Matches) -> Result { diff --git a/src/uu/dd/test-resources/gnudd-deadbeef-first-12345.spec b/src/uu/dd/test-resources/gnudd-deadbeef-first-12345.spec new file mode 100644 index 000000000..c36c9ec7a --- /dev/null +++ b/src/uu/dd/test-resources/gnudd-deadbeef-first-12345.spec @@ -0,0 +1 @@ +­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­ \ No newline at end of file diff --git a/src/uu/dd/test-resources/gnudd-deadbeef-first-16k.spec b/src/uu/dd/test-resources/gnudd-deadbeef-first-16k.spec new file mode 100644 index 000000000..dbd247457 --- /dev/null +++ b/src/uu/dd/test-resources/gnudd-deadbeef-first-16k.spec @@ -0,0 +1 @@ +­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾­Þï¾ \ No newline at end of file diff --git a/src/uu/dd/test-resources/gnudd-random-first-32k.spec b/src/uu/dd/test-resources/gnudd-random-first-32k.spec new file mode 100644 index 0000000000000000000000000000000000000000..8f42c0a646b6dcc2d30935151dcd46b9125eb59c GIT binary patch literal 32768 zcmV(lK=i+i(^$GFVXlSjw3R8{V=KI?nI@jzfsnp6H#&|wrjYc#lsB54LAPAi~k(csZ0p#Fx2VRbE3gcN)dp(Y+i@DTL+|x z*AbmV=PX{GI)ZZ!AKbXrOHn$vLy2b}j{OhfXtGE_H-w^a@bpkklRM;1?E7l^Vsmne zwYNA!>m4zUC+Ow6LBQyW@wLKN_|ON!Uj^=HcP|s|bGr^D7!cUh;iN{R`8@-xbd|3@ zh1B-$A&V`x$(=ROZCv_Dz+^uQ`XyC!lJgZrfNXFDAW*ypzP6Wd8kc96rHW?5j=>kV zi?uIEHX=iEz8BrQv`ZJzDz$8}mrjW?EM7(k1_#sL1oC3!<{vWj*7?sl?26oIY1#g< zU#z;|z{TuNHjT<>o-|c=Sss z;LWOgcz0j8te6|MYY6w^I_$GM-)pa8LYFD-b=%+3CRK#!}aVNqEYnZbKV$W41F}YQ>3M1$x ze{)*U3u|vh+Paq5?FMc`IDVc*U`%swieHCs7#%P6opE@x1G>y78uxtcf0pTMNiEEU zFy3_~SQlg7vrj9_J9mIK;?Iq3ng^=YkQvFF^Inu(*_h>Y$!BAdW z8h?7IM>=_i=K+{$_B?Bu6F9fmik=RMioP9qS3w=ylah*+E6!yn7CtNPY5W-4wSm}_Eur^$rY&`~B=eRUI()-q5Le1z4u%DS zB#;D2Pt}cA#(D^inQmyy5R(dJ7bfM4v~PFfqWEE2|u~N7*c>drFT)m zbzFehtMj#JKfIQ4zulk_PAn!A0>prqoEd3PUb5DAl!5_t#ch%z%pAD=gu-L&-wrC~ zaMKaPM+MlGV2pUHC{699R1_~Gh*wHr(`GF3LEz%k@T2S1(%4(oD^tb&XVl() zkdQ`m_v`Pf`xXN(Ct

Ji%D(&yfz4w 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 Xdk2jvY8>chfs~4c@S%Q(e1s8~XtB1R literal 0 HcmV?d00001