From 043fac364f29caa8765d780af09f653dfe1dcf1d Mon Sep 17 00:00:00 2001 From: Ed Seidl Date: Wed, 22 Apr 2026 16:53:17 -0700 Subject: [PATCH 1/6] fix for skipping delta packed files with non-standard block sizes --- parquet/src/encodings/decoding.rs | 8 +------ parquet/tests/arrow_reader/bad_data.rs | 22 +++++++++++++++++++- parquet/tests/arrow_reader/bigdelta.parquet | Bin 0 -> 38991 bytes 3 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 parquet/tests/arrow_reader/bigdelta.parquet diff --git a/parquet/src/encodings/decoding.rs b/parquet/src/encodings/decoding.rs index f7f4d9be4726..e90eeb5f8dd0 100644 --- a/parquet/src/encodings/decoding.rs +++ b/parquet/src/encodings/decoding.rs @@ -847,13 +847,7 @@ where self.values_left -= 1; } - let mini_block_batch_size = match T::T::PHYSICAL_TYPE { - Type::INT32 => 32, - Type::INT64 => 64, - _ => unreachable!(), - }; - - let mut skip_buffer = vec![T::T::default(); mini_block_batch_size]; + let mut skip_buffer = vec![T::T::default(); self.values_per_mini_block]; while skip < to_skip { if self.mini_block_remaining == 0 { self.next_mini_block()?; diff --git a/parquet/tests/arrow_reader/bad_data.rs b/parquet/tests/arrow_reader/bad_data.rs index 54c92976e41c..355b2ee121fc 100644 --- a/parquet/tests/arrow_reader/bad_data.rs +++ b/parquet/tests/arrow_reader/bad_data.rs @@ -18,6 +18,7 @@ //! Tests that reading invalid parquet files returns an error use arrow::util::test_util::parquet_test_data; +use bytes::Bytes; use parquet::arrow::arrow_reader::ArrowReaderBuilder; use parquet::errors::ParquetError; use std::collections::HashSet; @@ -147,11 +148,30 @@ fn read_file(name: &str) -> Result { Ok(num_rows) } +#[test] +fn non_standard_delta_blocks() { + let file = Bytes::from_static(include_bytes!("bigdelta.parquet")); + use parquet::arrow::arrow_reader::{RowSelection, RowSelector}; + + let selectors = vec![RowSelector::skip(1000), RowSelector::select(5)]; + + let selection: RowSelection = selectors.into(); + let reader = ArrowReaderBuilder::try_new(file) + .unwrap() + .with_row_selection(selection) + .build() + .unwrap(); + + for maybe_batch in reader { + let batch = maybe_batch.expect("skip should succeed"); + assert_eq!(batch.num_rows(), 5); + } +} + #[cfg(feature = "async")] #[tokio::test] #[allow(deprecated)] async fn bad_metadata_err() { - use bytes::Bytes; use parquet::file::metadata::ParquetMetaDataReader; let metadata_buffer = Bytes::from_static(include_bytes!("bad_raw_metadata.bin")); diff --git a/parquet/tests/arrow_reader/bigdelta.parquet b/parquet/tests/arrow_reader/bigdelta.parquet new file mode 100644 index 0000000000000000000000000000000000000000..42a1e7ce1c3ac321552091f235d35b26d73f451f GIT binary patch literal 38991 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 z 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 YOv6dC0-V|XpZtM3(Lo?Js0P>n2M5JHPyhe` literal 0 HcmV?d00001 From 855e8700c9a599894f03e4dcd1b0ef2a6da06415 Mon Sep 17 00:00:00 2001 From: Ed Seidl Date: Fri, 24 Apr 2026 10:42:02 -0700 Subject: [PATCH 2/6] lazy initialize skip_buffer, try to catch errors --- parquet/src/encodings/decoding.rs | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/parquet/src/encodings/decoding.rs b/parquet/src/encodings/decoding.rs index e90eeb5f8dd0..581bb03f14a0 100644 --- a/parquet/src/encodings/decoding.rs +++ b/parquet/src/encodings/decoding.rs @@ -518,6 +518,8 @@ where pub struct DeltaBitPackDecoder { bit_reader: BitReader, initialized: bool, + // buffer used when skipping records + skip_buffer: Vec, // Header info /// The number of values in each block @@ -565,6 +567,7 @@ where Self { bit_reader: BitReader::from(vec![]), initialized: false, + skip_buffer: vec![], block_size: 0, values_left: 0, mini_blocks_per_block: 0, @@ -847,7 +850,6 @@ where self.values_left -= 1; } - let mut skip_buffer = vec![T::T::default(); self.values_per_mini_block]; while skip < to_skip { if self.mini_block_remaining == 0 { self.next_mini_block()?; @@ -857,10 +859,13 @@ where self.check_bit_width(bit_width)?; let mini_block_to_skip = self.mini_block_remaining.min(to_skip - skip); + // see commentary in self.get() above regarding optimizations let min_delta = self.min_delta.as_i64()?; if bit_width == 0 { // All remainders are zero: every delta equals min_delta exactly. // Advance last_value by n * min_delta with no bit reads. + // When min_delta == 0 there is nothing to do: last_value is + // unchanged and no bytes are consumed from the bit reader. if min_delta != 0 { let total = min_delta.wrapping_mul(mini_block_to_skip as i64); let step = T::T::from_i64(total) @@ -869,10 +874,22 @@ where } // bit_width=0 payloads occupy zero bytes; no bit_reader advancement needed. } else { + // lazy initialization of skip_buffer + if self.skip_buffer.len() < self.values_per_mini_block { + let to_add = self.values_per_mini_block - self.skip_buffer.len(); + if self.skip_buffer.try_reserve_exact(to_add).is_err() { + return Err(general_err!( + "Cannot extend skip buffer to {} elements", + self.values_per_mini_block + )); + } + self.skip_buffer + .resize(self.values_per_mini_block, T::T::default()); + } // bw>0: must decode to track last_value for subsequent get() calls. let skip_count = self .bit_reader - .get_batch(&mut skip_buffer[0..mini_block_to_skip], bit_width); + .get_batch(&mut self.skip_buffer[0..mini_block_to_skip], bit_width); if skip_count != mini_block_to_skip { return Err(general_err!( @@ -883,12 +900,12 @@ where } if min_delta == 0 { - for v in &mut skip_buffer[0..skip_count] { + for v in &mut self.skip_buffer[0..skip_count] { *v = v.wrapping_add(&self.last_value); self.last_value = *v; } } else { - for v in &mut skip_buffer[0..skip_count] { + for v in &mut self.skip_buffer[0..skip_count] { *v = v .wrapping_add(&self.min_delta) .wrapping_add(&self.last_value); From 83dbfccf9f3c19f5ff1ac10d5813c6f14587745e Mon Sep 17 00:00:00 2001 From: Ed Seidl Date: Fri, 24 Apr 2026 15:52:36 -0700 Subject: [PATCH 3/6] revert changes and instead error when skipping --- parquet/src/encodings/decoding.rs | 39 ++++++++++++++------------ parquet/tests/arrow_reader/bad_data.rs | 13 +++++++-- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/parquet/src/encodings/decoding.rs b/parquet/src/encodings/decoding.rs index 581bb03f14a0..1099c4ca2c53 100644 --- a/parquet/src/encodings/decoding.rs +++ b/parquet/src/encodings/decoding.rs @@ -518,8 +518,6 @@ where pub struct DeltaBitPackDecoder { bit_reader: BitReader, initialized: bool, - // buffer used when skipping records - skip_buffer: Vec, // Header info /// The number of values in each block @@ -567,7 +565,6 @@ where Self { bit_reader: BitReader::from(vec![]), initialized: false, - skip_buffer: vec![], block_size: 0, values_left: 0, mini_blocks_per_block: 0, @@ -850,6 +847,24 @@ where self.values_left -= 1; } + // See https://github.com/apache/arrow-rs/pull/9794. + // The parquet spec actually allows for miniblock sizes other than 32 or 64, but + // no current writers use anything else. Using values_per_mini_block directly + // for the skip_buffer doesn't allow stack allocation and leads to a significant + // drop in performance. We'll settle for erroring out here and come up with a + // better fix if writers ever start getting creative with block sizes. + let mini_block_batch_size = match self.values_per_mini_block { + 32 => 32, + 64 => 64, + _ => { + return Err(general_err!( + "cannot skip miniblock of size {}", + self.values_per_mini_block + )); + } + }; + + let mut skip_buffer = vec![T::T::default(); mini_block_batch_size]; while skip < to_skip { if self.mini_block_remaining == 0 { self.next_mini_block()?; @@ -874,22 +889,10 @@ where } // bit_width=0 payloads occupy zero bytes; no bit_reader advancement needed. } else { - // lazy initialization of skip_buffer - if self.skip_buffer.len() < self.values_per_mini_block { - let to_add = self.values_per_mini_block - self.skip_buffer.len(); - if self.skip_buffer.try_reserve_exact(to_add).is_err() { - return Err(general_err!( - "Cannot extend skip buffer to {} elements", - self.values_per_mini_block - )); - } - self.skip_buffer - .resize(self.values_per_mini_block, T::T::default()); - } // bw>0: must decode to track last_value for subsequent get() calls. let skip_count = self .bit_reader - .get_batch(&mut self.skip_buffer[0..mini_block_to_skip], bit_width); + .get_batch(&mut skip_buffer[0..mini_block_to_skip], bit_width); if skip_count != mini_block_to_skip { return Err(general_err!( @@ -900,12 +903,12 @@ where } if min_delta == 0 { - for v in &mut self.skip_buffer[0..skip_count] { + for v in &mut skip_buffer[0..skip_count] { *v = v.wrapping_add(&self.last_value); self.last_value = *v; } } else { - for v in &mut self.skip_buffer[0..skip_count] { + for v in &mut skip_buffer[0..skip_count] { *v = v .wrapping_add(&self.min_delta) .wrapping_add(&self.last_value); diff --git a/parquet/tests/arrow_reader/bad_data.rs b/parquet/tests/arrow_reader/bad_data.rs index 355b2ee121fc..9ca29a6b61c7 100644 --- a/parquet/tests/arrow_reader/bad_data.rs +++ b/parquet/tests/arrow_reader/bad_data.rs @@ -163,8 +163,17 @@ fn non_standard_delta_blocks() { .unwrap(); for maybe_batch in reader { - let batch = maybe_batch.expect("skip should succeed"); - assert_eq!(batch.num_rows(), 5); + // TODO: uncomment if we ever allow skipping miniblocks > 64 elements + //let batch = maybe_batch.expect("skip should succeed"); + //assert_eq!(batch.num_rows(), 5); + assert!(maybe_batch.is_err()); + assert!( + maybe_batch + .unwrap_err() + .to_string() + .contains("cannot skip miniblock of size 128") + ); + break; } } From f497c2869a737189dc6b82c4d9a8b0749af5e2d8 Mon Sep 17 00:00:00 2001 From: Ed Seidl Date: Fri, 24 Apr 2026 16:04:45 -0700 Subject: [PATCH 4/6] clippy --- parquet/tests/arrow_reader/bad_data.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/parquet/tests/arrow_reader/bad_data.rs b/parquet/tests/arrow_reader/bad_data.rs index 9ca29a6b61c7..8c5d0fac7e08 100644 --- a/parquet/tests/arrow_reader/bad_data.rs +++ b/parquet/tests/arrow_reader/bad_data.rs @@ -162,7 +162,7 @@ fn non_standard_delta_blocks() { .build() .unwrap(); - for maybe_batch in reader { + if let Some(maybe_batch) = reader.into_iter().next() { // TODO: uncomment if we ever allow skipping miniblocks > 64 elements //let batch = maybe_batch.expect("skip should succeed"); //assert_eq!(batch.num_rows(), 5); @@ -173,7 +173,6 @@ fn non_standard_delta_blocks() { .to_string() .contains("cannot skip miniblock of size 128") ); - break; } } From 56c203d80ce251f537f1fc2249aecc0c4732fe7d Mon Sep 17 00:00:00 2001 From: Ed Seidl Date: Fri, 1 May 2026 08:42:14 -0700 Subject: [PATCH 5/6] enshrinken --- parquet/tests/arrow_reader/bigdelta.parquet | Bin 38991 -> 3660 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/parquet/tests/arrow_reader/bigdelta.parquet b/parquet/tests/arrow_reader/bigdelta.parquet index 42a1e7ce1c3ac321552091f235d35b26d73f451f..0fb270af8ffb1de3fc24c91511717cb70f3055c0 100644 GIT binary patch delta 368 zcmX@Vf$5A4OMqjL;pY3Cv22?^$h>0JmXs0W5Zxjv#=yV;WbTm^y(JD}i?T@Cc<>|^ z73G)57bj<=<|c}=On%d=z%JHNBq<}QGnsLMya0!%j3}EZmnahhgV;1fQL)Lf6O?WC zNFs@@F%*>m%I#tVYE$D7>oXJqStG&Y7!>3mZUr$|;t!)f2$%;tPQE+YuHMtp(b35l zNH{uy2;VB8oJAmr=?)@5AkZ@uM3n^qr3^qUFaRrebj$~GoH7%`Qwoyug3=<5EQ^5x zfsRgrj;@Z5{*I0o5OW>VL42UnbPx$9Ks-m2jB=0w&=ut%g+5R@m;#VdAm9Na62nam cB8>dXk|zI~t{|Wz!@vMU438KY7(k&60E@a|IRF3v delta 32617 zcmZ^Kb95wcu=d2ZZQHiFNjA1^Y_!S5wry{$jcwc5m>X`aZ+`cmd(J)Q>ptC6-Cgxm z)$`U{r+cPnig30b97#n?jSUMLYa|8?D~&7>5g$lO{vZY@Q4N5E4B`6+b_50shY05` z>0atC;SS?k?0PtsNFftP$QN{&W8r=}S11vVOvLZ*eE2VQhJKuk6sFo-6vo|$6vp)i z+8rdZRw~!SiNYwkp8^X0(=LY#N9LYCom&i%2y6!^6R2C;>U= zB^x;W*e?}1`IXQFFcQ+X2LT|OHnbB?hzli@kckE*aujvQL4%=8jafPhqBYyy21F)+pL6a%LbFa~ z$Y-olWRy|k2-Wxm3ME2*fy07e)5p^-(gC1tBAwZw!~JZbRDp`URN>r^*#Psz{fr7| zRI1S5ZqN}?`bVGHV0`s#!8twT!TpR^;l%)M=4?S4bQTh%*pnXQ*5MAPUMinTuTiC5 zsYZ1i`=9(b7~(&I`h%bluob`88#8L3YI0yRYO}g8Vj^HO;&y<+g05WZXMr>%aI%d1 zg93nCfdmk&k4bYkCdS&EQ@l9Cem9LvO60Jd%3w1aiNX6%NVH)yTaQu1%bK*DTI0-M zOGK+xI!rKuBxpdxO6o@qtOF@|xgLzf67V=~wYem1Is&)Mo)1Q3>4!jPBs(0pS~o#g zw?Wjw!q;2XZq){WHks zL)(5(?0ytHSro%st^L`5r#t$<5g6;6AwawTB*{MT`goTA>Tx`~>)E$!6fpU`*33*D^Z@y3@K25)K|7-itYdP353HrWEgl-EztzMOFGJ^WGdy z1CedBB7UkC9PQQGy zOeve&VWZh*u?#6!DLc%G+ksQ7+2%;;?|{Pw=g(%F_AH=MHq)-dh6G4=PicDDVdG`7 zSR|X<(wW-P3`oqq8$72`A+{Qa$T*2G73@9E4seLDBgH_oX0qVMYZk$aS4Y&z9@e5N7Amf74f0 zJQa(o41oA_&eU#fR#XdU0w3dhne;x!r9<|E+DaDbLmgHLBlnt<=Y)dJ+E=9RU7BkX zQU$1Dn*SV~EP=B@&S%U(sJ0Ag^V~Rgkn1$r&%k;SG2K6=%`n-=Q3N*yRu5+W5h5C) z4b8txI2?dXWUM#19DYassfd(VCrZRlRTn0YG$9a}{P%)6ze#TCNBxq`*hh>|YHA%q-$K*}Z!@yc$CNNTwHwI}Q1NA3q3?`&Y+D8*R8 zhX?TqXKvZb+6F~f)}V|+x$R(V?l+sIRM3Fs-@+h#At8GoN*_FX1uPu?we?K6kRn>o zfqU+bbS8BdlfM1e<0q4H%dB~^dlg?TPTdt0I45AG=nIc2nAnV2Z!c?Rndgdqub4yF z2K8@<-3iN-av%yGv#v_`4U?cw5`q+>L^J$8=TApLH53d_vm?8;R%Ho*T)H561y2RT z{kfe3A04#+M~_G!DR8tg2!i8S&)!uHOecMj+1U!^r=Mu^lq8crFE{_EGaGKFp(%=f zrP}*m;03^BnEAIXN{|o5VqyMR0vlSWsDFbBo|lDKfjc@3f7vanf6yRs@ppJm;3D;h zml>Iwv@LRE2Kyr_-6zAo4Gl8dy0|uNn)o55CAnm!-YbV|2=KXsqU8KptJGIddxo`h z@`+LNvE#G&@@OYBUX(K>%v;HY8^en|2XzI(dwyncU`tb5F4cXLHR-ur4~}>wHWK0o zikModKK%-5nwLQW#he`+4Cwx11{tdrN*^o26$|j+4jQxq&;Wo4S1{TZmJj0+a1VIE z05TatJrIl23`Q;ho$^!M_XQFfmQdFHxeZ>Bk6x%53_?l_C>_91XHUm)vKFRif6}`=QKf^6{91 zV#d*+eE!@!OE;VM*^N=eC!FT_bJ?rfz2b+E7!W`UYgw_^QkA7vA!DWzL}sSxiAHMP zuv{|Jm=D$leJQ&8+qQmr`4BA8o>sB`IV)HV^~CW0%HV=h*!14d%1J)-s0{s0DoZO(FGO;$F4Tk=+2fHFUTf zWQDO)rlfw!ZWvX4#(nNgXEoFX&2EqI=syTw8{qAKa>_BN{r}Lt`qcZXsgr_9;v$*a zmRCWF{rcAJ(BX>8oU&d59tZoI{;qdfZ>|B-0J;H27qm$t0zr(IjX_|=;Qa3>0RGP? zpt?*m0ro>tvHGZpz5s0~V5xM@@YJ5%>)D|UA(&i5Txz$T;W|NlmRP_HtlfZ$;*m=c zLQ5*bV_>WfoMpHUL{ZeW2{vh!F?3LTMNxW*@LvLUIP?&+q>8D(Ktl8aQZLwWR!H0d zR25hW02wSe8Yv_un7Ak!Ddr&C6t4~b2~z7)(RPj1lbWzPf$io)-oz9BID)UAx1get zwRgvJ+`YTuB4WAYF8hFjPkb7eGluMSfrx-he=eQ`yCV}``D}3G-|AfDLXl41jeTNf z&xs#Td*))vXXg9ez(+V=;;K{NYL@33@-mG&H^~fs`vk?*=Cq$DUX!RuwRBqAh3ll{ z%e+w`k*&~Y>}6MGzSu~Xhr=UQYgJf>i?$x&r{-!3)0yTEBFbZ-J=w>h4ZZ=$Ed%SB5%}gy z!wf?32#l$3m~5*de!9M9TouIlcFzXy?}K|kXSBSL_Yls|uKU9=?TlUSCg*v4Fe=l= zwkO^cG=vwhfwfx`L>nCWUW!9}Z*kP|{_&&GK~>x^d)EdCYqd{0?hxI{>3MAXtLt&o z9Ji?)SDF6n}YSzTH{v|J@(_ zHXes~faNBt|x zz74|9s}i{%_eZ2>_2LG42RHT zC(Nu?I-Av_i}$m=?OFtS?a|m*Je*%1ax=|yCI8#O~-I+6P~x)67snA4UGj`iGC1B^<%8l2WGW5F(jg z>O3cjN3;Aqo|)sZL{;Uad~iP7s^Z%(mBkohea~utmR^_fS)azU?=1!{wG#gSW<2K% zG`wuobiex7KBV-u^(woDXzk;WJ}SM)4ylclYxutz1HY`Vbl(;GkC4-r*4a* z7k zy3y~j4&A$zh#fGiJkr{^r-5C$6pZ2 zkPkgh-2T_`mnGrf5~Z!4d1AB8)9IoXsKsQ~!Gxm&=+^a<{-ZA(vUEufO3M%>AFx67 z{RDnBjON->JJunvHRU6JLh9#_@Ls)(>`BBFVAu+&!+tbkGbM&Z7&MSXgPS&9DU768 zCj2qzIADF^ALiuu?2(D?%x8o$)AnVT_IW%_F$sH-5lxd?mAeSOG<0gbi=m(KlEC%M zdpCIvJG zHdqoocx7b1jvM1(uknG7+eR5{r5hxVlXi-%k>#;7_TQ8qcC>9jvl9K?64|gWo z)oI0;g5NF?x;SDdzBr264;eTP%7)A$>Y6kAP9)71yb*pb4mT1!+ris1S*CS4Ez3D9 z=9q5t?z3z0De~_iF%({&&x+U?ARYy=@n8}}+gd@HnpfR7@>2lMzf2^(GXDS`k@U>a z@gRLQen8K`MJ5}6^DsC5jVUnnLmQcAIGX^XRlNCNkN}DEoP=GO_TlPlLL98x=Wlbp z7=B|3D^1Th$JvjF^6jA%iLau%qj$xHg&#{iN(n-^>i<^oKGB-mFeXOIB&J81)yL~n}wPl?){2J!`AjT?| zzNr=^Uoc=aC%)HRJ#kU^^41iPU#b}R0@8oi2?Kr)&g4l$jDjkf!T-QDt zf(GHk{GPbFZaqxw%s{}cp}lEX({UT!zjk)R@uAA=N0Pk(Ot$7bs$XaEjNbf|ey(|E zV5KTCAsHmj9!rT$l{I^6m>5|w$;jb&U5nk>>{}{GQ!se%*jEy0@hP=I6gl1L>v`CD zf$PhmY-(+GI>7IajMey6)+dCKEu85SlxTVYOU#hSA~h0^lt0vPT64Yrr&Z(oxi|^+ z0<-_*cF&a@5I$V9u8|BWCIG974*mPna_Y3^*qDZu3roaK7SFNB@k$SO5f^n8$|}8p zPp+Sfj!VNyc=Q16&Rac6ap!P~%u6HunnG4@clVBE#(iEVHY+qiy#FI&aj^8jpCKukb!LYry z?i#fa0VmdJQ7cUbn&`A1H#XR}|M-S6>jh3>-$Xv0`$u&ssmaWeNl@EfFrYzk-Y!9Z zzVq(FaXrHLwARmm%{@tLj1;T`yhog!cw*sQ?+FIH_@v{C2kLPt0%yeUr_&22m7`-nv&} z8aU=!wniwo!{a)f*k>j#SXOv5epS5xYYli)aPw7sj-SqijScK_)IFY%-lzH3F>U1i z=)g<-H(n{=szU7FZ|i?d^*jqccFfgz{f`#B3B|J%+UtUWSmcCsMVgn@L(<=;Gh={* z6^E_nqW&9N+&*UIuVt$lfVJ@xPw(1#yrZ$nV|Q#HL%9XpQa(4jN9gV^G4q%ZD_WCyS^Z~Gy8 zl+6iW0j+7mHvvWQQ^n?WGm+nC(WOAiRh1sQYY!cdMT8D;&<#pj4;WSe_y69YApf6- z(Fo>TI{?25FRC6G+~7x9Qj^s3AbK|kODi1Gq>1FiWVtl=X5KL|%rp&>9vS!2NN zzV5yNzL}`l{$u^=BH3R<)cpnEzhwwd=~5qe{!GB1;`yyn&K>Ab$VDmN&ZR%HYQMs( z8rvXoHwR~_Bs&A?@6ERWzG>GLUG}^6a z@mY5B7IsQ8C>*cnA!c_7{srW9%lTd_-7)$(U{j~{RKbzKS7)jo>AWr=(feuSaT%ss z*}y0<{@rZ)XVEvbkS^t?LPAcQTUG%?1tYy{%J73u{K|yBC6PQvJx&?U_QU=XiO%yxw@=8Oj5mZPIK$HKc;f-}xr6{W|FFLD+S16wn z3odTHq3148;p&uVQ+(O|G(nxJm+l*0&#$CPCJ6AdmJ4M1nbFrqC7}QW$G|nS z2mkHm1zP~y^{j($21~H}8D5CQaVb(lc8~6lyHHO8amQMJy>Y$qbtwVBlcT2h3AKvN zg1|5y+PeWIUWpQg4kv;*n0})`Q7hddM^UT3@#oQgfjO1?lA>Xu!|C-k;ovqqqsP&@@2Og&kjV;i)qo_Ha|=;o1FZqsQI-ly>b7$bZa-sJBIT zf?jD+$Z}-G3W;**4uiktcfzP0^w|(Fv3b~1L0b`IX&Y|2RYxz&0 zB=)tmr4dN%bsGKxVeSK;c4FU=zn+>hEbtVNg79N*p`Dz;v%s@~NIUkdBQTc6Q;lE; z-y-qf3k&P}adG-^50FL}>A7)%*4nnhoJ_a}C`g}kKdo6u7`Z^Qlqx0|s$K{(UKta6 zq#}V-dWl*(Ii{~vdS0noB6-Rw`kbBdnF0VtfyH>9VqoM+vS{@ngw}*rL$_~@?&?`9A!^_IuCxH@%(5 zJ*qcnPF7wnmu9S1Uk>^6bx)dp2-}=23gqX`(3Ia-&dYs#7d^V?j;7&h(wP!H+)aG% z%@=r|-v5eVv}6mVt>CC?Ork@lqm>mCTfkjJ6BS)|7A>8hgu&?RPmCzeN;{m3h=3#y zjDS>CPYME-BglI zQU$DRrk5}1E_x7Z81AL5$YTW&2?D|>l3-6*gIcSeTkM~-vU$dHmMCs^ZfX&>LiR_ng)j>kl5Bm#Ni^;dy7)FVkbBBr0>h=Ms$qcm>D7|Py+>e?%#o=%;#k&zzcST( z^-)MRlQ+GZh~rEoria;p@20FdCOlAw^90GncJ<$@U1abBX6N#@ye!mPLSm7w=FiM*!8KIw-qc+ z`0!Ju6#TNK?6KD}elKCgk}>s_Z<=WODtY+JuA?{F0|w zF_klsv2=E{LRb~vOG{TMTr7Mih2Kus!=wTtsKhQ8A}aQ+;9zoh2^Vf;2jzw0k&_^H zUf;bDp6-wJrMDa%k7HhsH~*N~Igr&PPy54LcR9B%Al3T`C2t!S=-@`$BcpEFfqY22 zyoL=e0Xv_as{hMp>0M<;`3`oZ+~&eCut`Ai;CCMyMh*$uz*9(D5gHA3pvw%@@7NEZ zHgUkC=afJsEpP8^M8Vt?Z_wNWDxsv~WJcFmfYduYju*q(p z8FcX+FCG61ZwVZE6(PCP286Rxp-=;Fl2L0Zl-w;zq`tM&)3G-8_*4hDl&hd;9)$I2 zy&r#BwsWM%b89l5Oo;2*YF!BAbCk)OK+aJqD>y2}TvfT}pVO%(=Zq+ICznK^0FTS^ zBo{95&hk6*D=XUXOVkKGN4tJ6c)PHrj83vZ%gt8FL7|rU&d9+J&CcTyD@wFuK>1_G z!*`(M+2UJSf%JpYIP|qhDs{PzOGnF8_G#+mHLT5Cj)sG|By-YYBzzbi?5T60L8z+v z4rcrt=KW}EkK0p^W0N4$l;|VSWxIc&R2@Enfm{XRxD5w21l@vsi7>Mg5x^@uys$2U z5&^D{qyEm2kpWp81atPB zp?Rbcw9dMYo0hMbdMW!MmBk%VHQfTp>`OoRV~kvUN(~()2^>)$bO#E0Gl@Mo7L&XOS7}uB6K{j2QDKq}xk{}uj zuPn|gRZOYisLl+W2Oc*FTAjeb4s#7Px2Nb!+H7x8+Geq3q>{YNM*CWPAS$^feehq> z2N)!HlaBSij+3X6el9}b0802R<0nf;=6=Cb_s(WowE2{l0fe-I%3+W67Br#vKQYny zFRB|jvsnzBP#Jhm3NXmM#_MS8M4vxS6DHDb`u|IsArPBG?60kMS&x|N!Y#=x_J$; z^gT3t99Bim{T!0h^Epm|CMgOvvcKXcLAfR}g?Zlg&?uJZoNh9AC>iX+gKGUDl)jwN zP^gU1%3ZDN7@W*ME5Vwv-vOTaE(~*=Bnw=4d2SWJyBwWt zY1#2iHFY6=UKCz|B2w`3{Z!KgUjr~}rE0VNL1^l&&7272hp+rt<8Ho?mCx3eb8g3s z4i{CVAX}M|h8fGhFcNInAEJi6x4}wmPgo79bQsT{O*#Q^7XA(7pXU)G==xI0iaC}( zTV;1r%-)Z4SMh9p4OkU+48 zhKmXto7V!qOg@AWYaJn}f(;V<{zK0=@nN&~dy-toF1JV`PT!zk+N(`aM#5CQ>(fvi z4W)^|G_R!Zl?=dV<7S6&T&fmEwIvp>`EN?NHQDuq&^1ZBmy>$>@QegjNPgbZKU_g8 zgRx2vN1ERqPBk#8%DmXTJWfCxfsrva;l5rejtCMM*0)B1WWBGSINGO)t!sa7XaScS zRxy4zu`_|nU$S$97a4n=tl)Aa8AZJZ>ljZEs_4H~-o`58cR}0Ww%KSShr-0U9OT^3 z!dUWK=x=?&oiJXBT+J(@=7R_YQNJJ7;2_y_LBO|(!9)jg8;w89$Q2nVjSBe1Xl4T% z14jEmr)k%A+jmm5I&b7rsGnE^;n?Ayo95_HtYodNe(6WhXS_M9kP-6_n1~Hd6PGa_ zQjnIO_cd^tc*1IBYrL}sWu>IM6VG@+2kL;~v0~Q{Y&W=F0K$$*?TFf-E+K@#98!4B z6;n|j_#ENfj_IRw)QyS>Tr(>gTvb%7M}a1g`%%^Vz9TmLmMj_Vg!_ART1o|)V-`57 zGP}C*(HIwbzO-3a7jv3hlFBbc0ME4ABD@J_cZ*C$!T7Fsv+$|Nm1P z8x0gSU<93upsy6^>+9>9r2cbfA_4uG1(=x4t;KzKK*2(V&In)zFaj=2itq{9Fkonw zd}^0`F3_$96CzLZA|fIpwQ0%OFt%Z|dh)C+O%uR_0I=13Pv>iPz7He%zJ3-{e8+}H zcy^x?`o7bcsF0$lkYe?QguMtds-hiz&nF4NnuJIn9c3Q%aKSV!}i3L38YK@iDjpGCa8^R z4?;B943>VQabI&MKn~)lScv7Llq-Z#gGbGH|WMTV3^EM|q@7mbQwGnbb9 zZ&{!`OGa!V?X%`jnptC!gB<|kyT#K^M%W#9s)q<_w+!+`Jn_QDe0QzBNmf`1wOCp> zbn@(NLgByeVvK|hSN6G?uZ(~N>wSTW(SA)f8PNev(2 z@Wef+rbEHG{1sc!8(k4~KBi4^;a5oke~x%TwRA;-j=&_+S4^CVLE!*I_dr!+0XMB| z1jBt7_r|di87?I;RB4nGi$3mW%p$L5Bx0>>rfWhhEeq1x|6;lYXI+n}9Pr}KlWQX& zpw=W)Jjyow!MI-?Mf5`Q{_KbqUAEb^;tHHi zOv)hkWEb-0p7Yv~8Qdt00x=}jM%=mNv_{7QF4eBcbe6iBPs2OGjx3wP!~>d(-q!WBkah(>s- zZ1Bd|vd?0+kP9g`GT*;^VO$+>lQ-rc57F@Vf-!MJO93?&Z=0siNcqb!eX0^7{18%} z0hVol@-&368?au&`Qn>Tqh-rvcqL0d2Y=cb*XYd7Jg6c5lS^f@Y@8iOgSch^mXD=g zQ(9psf)T(M#66aV#J=va)$gE29Iy2cr3O>0m;nQFRT@$$L@ zw_;t+9^(6sg>&>JGrIx(t;voIrf^K@O#0QJ+o++vS}aB?{RXl-ViU>%Sy{#!wk*TH z@Z3A5^QYxqiT1d9KaI1YXjA`6n{ylSSh9m~p3l~a={|2LuzXyr2cIoYKx5QII(G)% zZJ$MG?wmSTzS|!9KoIo9VM#x{ZNYmXf%1D%;A1ccbz6mZiJ2~XhMM31U6)0EIJFS zy(|=;EMZ2q^^538%xv7D?=OMO8?^EA-1ChofrNKQB2yZ^4^O`L4qbT5xQv28gph71 zH*drxEnRT#u+>W%bYtT_z$bGId)Y2kIe%cD0T*AM4Fjm-O?*IM-DQIR_iC(Zj|B(# zd1L3X04l2DDj3k0W~Idkay3$?)Mvay!ZyfN9#xosppQgjt8D=Te-h&zQ8RrgzPnND z5ov{xRXBRBwNw#I1KAMS3OU}IKs-m*ZQhPSt~)-NUn9eWi}94nI*?)Hx+A8*O7w$j zI*d&v$7PsKoowwVFArI$B|Y#xt{U6?0vl&L-<i}1QZ`4nuD>0&Iu_6i^_CemefDkp)f zu=c@1B`TA{ zi@OV%&!XkS2|07sh2inE{gV0yq6zx3U`&d{AG+nuS*>A7%0T2aR#rJ-<*H+foh^8L z@FqqTrW>uiPkwh|a_^)st0LYENfkY3o(2TJC~E2}I&VD(Byfp@efBi4%=|Q!F$^T7XL z5`(CRY}8#c*-bTnWVu=Q!fc=j3;R3BO_O4Dc;BczC?eBa>jN%pGN;xEJ6*YIj%pg+ zK_b&YCg8$X+wRTX@W67HzApc-J5@ZrFg@*IeY&4H>Wt!f)E;vLiIMc%Ab_IH5#BDe z{S`z#&oHQNw9I;3|5b|>IMns8Hk$o#MG!I2z3?j*GOO~YnT1!Zhear%ka%yqmuU(# zl;;IJwWoh-j64P- z4{N~c)+Px*T}bw*(4j!(NrnnZkAsDy(`QkY%1M#5d^qYSsf?DKKs+NgT%fBO$Z0Ly ze%i8}_!*hZFLkOu3!Wfm+xEaSxrWOGZpq+!p+SIv;0luEG7_sb7wlo-G(l7P z7fWFa3*VIoq!QMDvxqo12Dl{^1MS_v-0}VWk@2v|R0T0rQdh2N51u&>0o^u6fm*<-*I|5ITwKSFrNdE(wY!?P81AX`LCHve zeo+Qi+bBE6fHPOr^F4pANmKAf4jIohU%T8MY~N zpxF2ziU#QL77dOO#zc1NiKfb%XQjhIhK{*gUvDt5t{q^)C@$hl7wDG`jFVC{NL4gX_XFL`-6?Jvi3gc>~ zMXt6OR%?keVGTX^#HM%d))1i6CehU4>4h^oq=6q%PvGyl)xE)4cE3rMa`*vKbnc0X zCFHuGC>A55aI{&&-X3HUVz?LIO=OFKlbu!^usc!LLQA!t9^_pBX7(7^dU@R-ui-^r zR0ohRYe_0(rLJzU)9{{78~NryK>)|;Qzb~op{%-#J@vWU!D>KwQ7J;1kCglx5`BiX z{$P9IN_$4zC>#nY=93)~!9rb0N1_>|_-!l9V%lGuU)8>>x-DYL-)VCbYDA}rB<+CE znmQ?>NBZTdrKD9|gYWiVh5kYjo+IFS9O&i4lMUQpAjaVJcUy zK1tC$p!WMSo9-6_7v2tX{5bMvI@g=cG+PVE9mNabtz#t*`rq$H;TRCsZ|ouL>!_9b zT`vdY8{FSD)r{DCe{UOL*;r2dTQk^iAdFNEjeWautX$px4H{WqUhP{8SPN8qLbu!F z_>>}=gfpQ6xf|b2L)?=rs32e#9LcjlV2GeP)SqoNr}7+KkQ2Tpe?0N^!Tj0bY!ReK zR!~?(tZ@ELiw8H_$y{$Hxk5J}i?Ay=-lsBUXz1$y8B34_Ur10BD6BnB|@ed#q~jy%mx5$?}BEs;A+xv{r$E%15&&5 zQ#{HoM3IB!l)xQS&ILH z=kb@hkq$+s=(0OM;oz;R%U(({=_L$=`KFQ@9saLNK*phhHBYST)nF(T{>y4QL|=8` zkf@(PsErQv6XsIg#NA*45?FR`4`HB;Le{cI?=<)u%lAl$t<{EeIuY~vuAN0bpqV2dEZ_;Y@jt#Km-OGj~Xx&qt6T#wq_16%nH63 zK&l5($~A%-+8{bm<|d3e75O^r)na$-wL?yNC)h|*UA+Y77Se*K`Ho8OIXHX*8#pRO z7Q+<$uT}0v+J?HoK7mY!lUjC5=gq`8g)kZVk2FDa@4rpZHJav-g|$YR6$z32H_ir~ zIaW)~qu2%Iu>?mkr~-=R8k-dE6R0U)&6igYj<|>Y!{q~AZVg`PI3Ja!_jUIZ$dEBTH~lZF4%KT`G$>pOgWglnKFC;lW*7l+NoPUqQ;N5U7yuw4;qvjO$sM4p{%f{a6F-3|=6a*}9s$1*iW- zCHJfC@Ci`4NUgG@dz668ygQ@icb<%9hvF?~poFZxzz&Up4L9uDzY_{WXvmj;ps1P) zgm%`rq`)^u)5Jz9PG2~Tz^%=lo^yVn18U5H%%pAa|f}wt$?yky;%x!#;rVP=h$Ej)$3WQE2!o+%QA#9*gG6IZP0I3@&hRE-Rc)Op-8 zk0IF+&zpIbGCOHv+OLj^Ejem#ddTdbRQ?nw!uS<_$QD}b-+`&B8-%G94XV01ZBV#+ zj~SuRQBEnA1AW*fB@CoeSFU}|GgNBdEZvY>8As04mU-@2&z?@Am=LC1Jl;UK7p|*B^dmTh3U3n4kVGQ4tLt;X~ zHd8lal|L%LK&I%1P$|Mz#xQI)dZ)ucHI{2+J?ue`u7g-Xm7YSf1`9UbZsXfELfl3^ zB@m}YgW6a~1sf>{6s5|C^dT)(qH_Nj&gE!)#s?RJ7Kf^ zT6+i&oB_5Pj-q?9xE=Z#e?YhsxLX@O#Fd)JufREcLvU2^3)FVMoQnRmVU^gv!&#|6 zA(YkgfZBD{wV{Xl7zOj4F$k&yQ?Co}kkG(i|2es0QVbuPrVAcP8+Kj}c|ReiZq;E& zD#)VEK;4N5jD~9iWztw3eD;G;v`HcVKZ`}R8i_+_2e$L>wG+6f7uj?nTgM9%2jE5J zV`wzo1R5u3c8xN?Aiv)yGDq3{rEJ8I>-f0<=nG^cm1%2FCgqv0p#1IjayMIU^q)$$*~g4wfwkfSDIJw^PcR=zVKZp>QP08Y_L1S)nU> zhhG?OEIs@;0TkX3g~_@b9wq2(1TJOFbIWHJqjT-}RI!N#p&lPzV5(->44X_6|1$q` z7mTy>lMt{7=x~ut>`z@X_No5>&2QtP90#H0tsIB{z-7Z&bBpBgxU1LLWiR0ozJ3lx zrw8KWi+WP*Q|_!S(?f$gf}0@tAgeWNV=nYh>-}HgVlB#OrIBRuOuj(DVduU4cz3=# zoHX^3=237(h|@5AyFpOOe(yIRLow$zN1^4UDPz!t)2pqnL?cW>!_5apr+Om$evigf zlV*(HrwUgs;AN(TjikRz>o60EG7ahy=oxsR=%~QsRddNF*s!xe4TwH5H9sU)n2rQA zk$$5v$={6B0vW3+c4!^qusFLP)a~{Qr^2aSRly)YbP1B+nt?b_lhn<@mR&hS=GBPS}=T`AA zq9CW}j!2mvn!qyphkJ?g-JzY9q0^%JLVJy|+KUO;P*IMDPboXy{I32TFrpZLVC=q< zgin|X^wT3F9)e=cQ)o9<*dTrMg)k3`&xd${c?h02(q-37un{nZPy^e8n;oQ}V3iO$ zz$zu3<`P-XfrzfL?N#Qm@m2SdwZEn4s383stTGG62EoNm$?6S zBmJU>oViI)i(!+jBCH21tOV>ieoJEwv7Yskde9cWS-VC`U_w769P6cNU;^5V^QJ&8 zgKf?_Ar0N%EHnrFr$!agch;oS_B)Z?6^MLDvTTsq+id=i75U#>wKAf(`1q{}C14q(VG2+b@C zaKyrdqes^}_Y0nmcMhbMX%|(GS62be)Cx-IINd-1W&x_|TiS2aW0T-2Z@0Odrz+Bq zhNrYhMlSeZXb75yQO&rk zUHIFAP>rv(P6Y#UrP5;2VB}$@c@j@hg<#d_0x!28&WbJVM20KgOy9E(D{&Eruv)IL zyraQ^m))s8<_Z^A7iyHCFHPF18D*V9y>#^}?#-NPNx-sLt%0ntxU6@&x;fU4pg zsUK_Ec7X*Xr^rA|kBc z#93OB?tyocBxkUVl8cOF=r}RoK9OW%QLrFosATe2n8X5GFD0P5b%w{r(aCQG3J(f{ zcBr?6EZ`EG3p(~e2maCpOFGxTAE$DVY>ie^!7V$ythZfZ~*l#4Y~qHiGxM$yAbe;gzh zPm~;Uk3gg)<___S3Xg0qV{s07W2j6jeS`PgPZbGNXiYzX?RTgh8&OVR@j3 z@RG_xAlx3~o-IkbP(0HcC(9IlSB3MPiUe9nMOKmA*z13WEJ{rwznFB7gqKhktYa*b zurT8uWjK<@!jpEWca9X`u!G`TFIdGFvcSY~lV;T48i7Vi)VMbOcwA_+$%&o5Je)}{n`L|TMDy!%qMAOO8v7U|$CMh^i z&E8`{>Sd3k*B;wAd5Hj7xe-I6c)Z1Ystw(K@hFICvV#~lgaqYLdE2okZ^jxaEIi9o zUoEK*B4Czw2^3W5Ty@7d0(eMqhF-S;{@=g1>E9OTv%5%R>jVapu5pj*nXFETlEFn- zTUj4_#}UYXOik46xW?T0SCGLfSjw4Bs3QMC1?4L+%C-S49$mtN%A(R=#wdFH=vz}` z1lv7?Li0%;ui0Tfi}R`=E5Vm&1)0F&`t%PbT~{(0=Q$a#iyEalKPZQdlDG#5v2XN@ zBixA&m^(g%Rl0%7Og8b`0NW8Q?-r9_JTy+`()~|}a(Dw!{dmch?V`lgL`#DVz#rR_ zikV=5?#tdFA2XV(AX0NsVnBmSRQhfD9%&06eiFU*ilhrtu=1b!?A4|CU;yQ)PoJ z6h8V8M9wBKELBGvOI=y-ZhpGg35Q_OC?#Iv5G7eT&{)dr;kB1|#J0ZRIU2Q3 zW8iWnn-(fy7eUrr|q;KeB!FeZ?*K zapsm6PqtdN=SJy{we|x^%lFpfjW?H53@~~q=h~)x(65vMCtaAXq$4-?{2{9> zna!rr)|~f8$LvAloLA)#>5^_2K0g@+j-j!)!FJa0LvV~mqj0*U8HVNY5ZR18S?<=_ zKHU0*Sc)*98QSz<3ijd=u_C9*ZvXn$xK*}GG666J%rX~7Ga5F|tiljEJ`GATDj;ze zMfO7_gQuKXN!2cFJ*~1}hhujac{*3a+(FRP?3NhPc*IXeZ-1ZVuJ7%dEatneYlyo& zwMEx!=7OhY?eH~((z$HIk&&QWz^iqVk#ys#wTr^?H$+i4N7BnyWrkTaXgwlQ<84*w zfMUW6)ZU^YlXSc+wC$o>{@P|<|8#q*FR>~f!Y5a}k1#R?-MEA2qcO8Xe=oV_XmHiH zA^g%z7oQWOaZHUsI;X{l=s5(KsmOvFvzXmiMVIHq_z@NPhLd5-tL3H>*en9F^fDx* z=K7j`%(T2WI(8Ac^b4X1^yHB6apPtHuBFrnefP;J+Uej6l^RS!u7%6mIp9POYC|Fv zPp_wxwuuA)D3Yt?|dP552EqYn;|!`$#}jKjhH!Ra6pO1M8Z`DAlxh=&s$YpkbA zJa3Vg^2H=GPeiSLrTlZb;OOyahEdX`?1J}uS{bkz&j#RTuuwIeppGqJsM`jZ-B;n& zUN&!}Uw=`R2AioVssok3z&`*fvUgPm%?&pU&ZsV}e)Y6Yt-$23No(-3RnBrosTNG4 zb>0lrT}inS599q#ALh61F#2M>HmrphZw$nUuBmrj7aT6c2d$(CVv7?nJp4jMV0x^> zBdaD;*1R^A$w44B1|;peK9iRddVSHJnl`m=|I##@%Ee*e!D+Hu@(QSBVzmopU(b~%SIK~sF5yUrvx3+u+W3I=*<==&xz3ZR8P9$jpX#%H7d(81H?Fz>J% zS;Bbq_);B_6!~2EBXOu`I~CZ`Ye8;&O4~+aF{`W!(GmX4-bR>KB?rqCdn;L-iZhUH zhK&n^UEA6x=A0;f{xLF_M>ewlfr4hT!)4tyoM7|$A4y`~ej7Bei!(nn$jZy)p)ivD;Sq@=Oxxa-%s z2a}tvNmm?FJ-Hh;4H0l`Bm742SLZ(Qvmf<=pJ@}qX*j?Slq>!XZ$Wd8~wJ3XI**Y&+H zi^=+7v~FH2nl0#TXIXOoIs(rMPHG#aX!>%UJ^*hYD$pQq2dv!B{GMHocz)WmZfXp#bjYEtD5JpF<2U_ZnqJp zMo>k99cbZBdy%;eg{?W@Eu|vO8bw6Zjn_Ql6|#4Y?uR@o=@f>*1i#IfeJQg`{Q_H&kXz(#myluRmi1ZapE-T!WU6!*Xwp>^*1JG!S+H+%McF80X zI(c-T9(>*SLe*t`?L=W^1eB@rAiSs?;e=5s-@zgAwHBT>)x|%X*>pzt5Y)MV3y@5t zPUVcd>mmzGMpdC^ul2-N zpooC|-2p4g6+r7?`|DFf7I!`Y1Dl$o@of>F^afCz#_pVih=|Bl$&*)G$>k7}1%^id z46+m-LdLI|z@XZ${WE6UXthC^z$v3@6JG#&6m@UCYo$SfV2Dj{vipuemn<5*FcNXcyX+S;|q8Rlr>Vif}wX`g`7ne=dbcBCeX zXg{ma-EJpaziCfyj3dvk&SaUcN&JHLltECO!|c#jF3XIxCSdSm>Gd z0=us6As}rE&z1FTyhGK6NgG5t#5QCWf8X0D_<6J(TH(x$D3+THcVkAnKt*p<3cFY0 zIFBZsu>r;-xEp8#IrHH`GPO?$r)j60&3?UN(x}Q`w>_R%unpmET^iMl#8o0vONz7mAaw^FJGS=}HVNQy-5jdn(rKns&DjMF0bHi<) z1ZIv@XpYBs`MwN^)`qJ`O=z^bPM1s!OPlQ;hn6Z4bJ-i>m_js6h0s}O_2oT7K3M>; zn(u9hW5NVN6gN&L8kzm{)|q{oRPunTXFZ^=dYU4GLUARZph5Beg5d_<>;Rb&)G@kf zaId&NmCwA}298EYm?nTODkLKCQbZ;crDHC~d5-tLp8@ID@N@Pq2q(-Klx-9R(=d`+ zLIZ(6(;OWLRo}ETEaUvdu&i=4kTwmAyIe1;%+pyxGQH|l|>KhP0 z98+2nq^?ALL+(pX8Uu&Xa>hmPTPr1#n33+}YkGsAb7Q1gPe3svntD*IK<1ksXmQ?d zwB880{t?-R_s@!VSU(QQN(j|D(;C4^MlWNS^jaR9@E(x)7Z}2NEG?8ZBB?8bUS~OUnI;2Fr)}_Cz#shR{14f!>;n#J@~zWpmRcbzcxPPUTC_ILmG` z^9H9Qv-mK6GobI{U33N-cF!u@IA#Q`qgu zPEyuGEQst}yHu#dQz<7pZbn^nA4eSw+5_|4?s~MB7IfTr^7;5HT~7?31kT^F*}8tT z4O_y(NO=fLZmsV#D_|{4uT!`dkNxH^;33W-vrK556X?&9C#Z4e{OsqPfE` zq)4z66Z#4|L~5Bu$D&4yIig#%`DxP9J8egB%8mNn3+iT`R^pn0up$xEwuFb9WIT408mmg&psE+2g6kBI^kkJ7Y8Zp(_%H&{L0QS{dj^U* zaQ7bw(>{?EoIIL>-``cQMv+vKBL1?RI+-!LL&lo)X)GE?tSLXy>MskD`j2nk(!58$ z7*4=gYIGDV8K4(QsL|pIo%4!Hvl#y135MLgcmvGWtnF2BUBP6~ZJBg0Wid}y;vRp0)JPM{;BLIRSxQPv_7W(R`t&dcl z*4L=biW;`{ixb&gS9RsaXT=C@GX1OIcbzinUnrLs65D)6;v5|(EAPj_#AT1q_(sOCS^i)&l?MINpHL0QpJvnMc&v^!luu|GJY_t?A#|}T&O0^%gf48Bv z-C=}%unQc;K`3+DBpN#EKryusD98rA$vM1?I{oRsKyP$A(vxI<=VQo12H z>XV|>)?5Bim=N^hHlf8$=8~2(U}~_ztFk>JPtMPnSu~d`?Q&NorWrlpJCh5QMc{X) ziz(O~e-}Xz^?`wTH@k+3JZ;Mkj-=x`#)*Sh7v=S|ww)4wD)tPvlU_QOu6T>2^7{{7 zMLe!*k1&j?x7{)9IB4>R87_?#eeR+5!m6L)@7ffiZCy>mobpL9aCRcM2DlB54~o^2 znp@Mn3`I0Qh8Toy(s>@;UZi70KpZnyB7)W1Ry8yEUiOy@xfbTH2c$nIq4=4W z;j^!<6{YU=CW5q8*;xbk@jgQeu9CFU2*w;_beHndL4Avs%!9y7))7g)J~E-y*v7G< zXN-pUTpwhk9rPemtGQPx0Wdf(UX?qqn#enaGIzcY;Zahn91HC%i+-@l6xppxFT-;B zJr4qA!=oViARAp^5Ys8MGjYyhsS~Eb4q^T9%jW}-YWo`mQh2>|{`M0}gE;75dJ<(Q{b7yKwK zgVe3J1V5V*8{>h0+T8Qpo8$vwcGw*0^S7bsj9->Ku-W6RKh0+SAgoCTgEPQd4+dvn zNtaxFt`aNG9{{6+(YN12-QCr%GJ156ffJe)2J`q>M3cCnsU5I@}hS;{^5HYZuH_CnfIU3rL zG7u0nQa#9_}_fs6ayt2}Xr zZ>wv5SkaI-4FQy8UvAVGw7wpG!-i@9Ci~7)vsQp$_5>>liJOH(dN8x{LGR0BRSD-W z7;7uXt|k5M>{ut+$ePh20dxH_7nhL!W(%KZG~@%Owg(u}uZg3d6usJutF~fMnp=FI z(uHYc{$dZlIjo#^TlOTN^)>r?d)^ZvzcVQ@sq}!PP4tY9AY_cAFt}IL34!~ySLouD zg#n}Mpi&L^Ohq%v&izmq86ow>?vEqNx80KNt$omQ!@>wM@@CPz?za%-RB_U`KBAoV zNH^rx(%rO&x>_khepr&pv2TjE2aU?!u&O|_fbki47a;4{iS#Ou=*z0dC&fOqaJnlU3>x&vZDvgt``*06L7L8O~hQ7 z<+D8m--L0Al#1X&@0vVlXrD`fB;KY|K1?6_V;z}0lESw93UurZo**m(IaiTq3~d!&bzBmh)kx-vs!8H?ME&; zIAE`duZlMdI@n2}(Tk7NT})g-ZIaYfNd=So-T0)WQ~Y4SvoS?_QzedZle7ExX2{!l zo}PVoVhuUI#Jb*H#org7rG|;eDY0@52#%O`g{nqz0-c(l-s^b2o2xCgSP|5`bMm!k zfH1R@i9&W|d{WE~TkJ%#4`Oa&$>*+w$;jx*^pcRIH+X#PEKRidNc=DbHynD%m8$$$ zO;SYE&MLqTb-_u`pb)z@y&?u7BhDf$2?Qqj&zqqChiMvy+MD;7RTX8WClBw zlyD-!z70IZ)z8J5PVqof*f@P{f+d-D{1-DuVt|VD!`T&OW50xerdLlfYzx&^h}*Cm z(+a!?ldNy0y=@B+q4>H5ji?5}$RA7p^;{B$S3Fi6#uO9!HT=#U*;|Jg+>_MU8!IZG zRO1ir@B#cY=i6S%=g zl}lDx=xYy&+kda6RdBnm)I!|3n&!f>;vplR#o9_3o^Rq<=+~Z)rLFGdTlYpy9>)$4 z8%zP+Df5R*68<4Kx;1T7x{mtp@3+xZ+jjyrYbEsG3w;&TSVzMrwWv}xw>u2IX?N|7 z{brJEN}?&Gy%tK@&(V4X5wE_JdQA7?JHc-J)!gJ@K}ECvD(~>?;jO~9dPWwNrWU_O z+XXsiNeP{A76C7O70BiEf<{Ip3vnvNTOFE!g*Dv1mhk?cR;~|*Prn5#=KCs~QrP{B zYtVYSX`DFGJ@A+cdRPAz*>S~ZTt?$G4qZ`F4*V>q4_XlX)4(2TnjvOKxwmw?JaheQ zib=fJ8e7NOe{QL70X6Js@0FZCXf1TU_}MqF*grR-MAu*T;5i+yW`VClP!aPTvRA5V zdcfB>U%m^14nt}@Sx0cVs5nRa9QACr^bgDHQmzMU!7n9n2lzgD)3!BD|M*DT+jBv- zmyfHZ_)=omBsP-6S25J-w85=}E0*n&jDvw}oM*1D5WX{XhYsO&2_h$Sk83z?Ogi*u z2d%lu`g4jyyjgy3JZpb0d!5SV=B{ZS5a)7s+TkT-W#r+1Q@g+7fc>R}Q&i*$p6h%1 zK#^59*;_^-Va+MPoq7GAeJ!GT>uh(5YN88Hs;DMrNVLXdzLJMxSNJMy4r-lBn>4Zp z;d_eEXUIj(EDm+#*0F;ktnkc~oT+y~gMU>~CB4VO8cQDfjC9lC!Wm&qOVHV@Er2O*(|(o^Xm-Z5N&=vbJR^;&r5cVA9#*5UmJi;>8n* z$8iwLQ%7suY2R}WGR1GfYXQ2RYZ))6THe@Md;`@Ka=)T%GI3x!mwO6oF|msL>2w!e zFx*>hITRhp`8f==^(;p@P8)B?SY!sKGQv|Ii8lh}dB&;8wH7~`eL?AsT5gq48`r)=h3M(G_KY!C5BZ7`oIZe{FK~cWU$5N+B`^24BhL(fFq`Vw(g?d zb6gF2%0cFEPrCbS$(l`SnZ}-QT;{{WhcPigZ2b!b?C;l)+ii4;JS?l{tfi|7bHnhK zdWeavHAhFEa-9Yi@Xpc>e>V|pd|~pq%Kamxo_Vm$sYvngYb?yB_5I^29=uNLG7Ja7 z2mDjF6b}ndem0c_(%L&n2GlW`1BCc>WyTy{;ueWpjDf1x$O0bD6@7M^UlRql6T1=qcqn*+x6xcNGILhpbc5mPgE=7Tz$&*F>sR{gdU{y|4_oFVp1yt0P~v;CPYd*xJW+y~5F zJ>Mq@e6c+zuUH9(|%H{)^U5c*E^m8tamQy|e>wMjdB(bhOQs&#b zA=LOkjlAt4WdgzWnxhzuDYe>6@aZyB{LMH&i9oaX%ypDjVvyl;{WOgB5ri zsvWx#k@Y+*ZQu20HmpRNaCdW(s1DSsaB6H1zc}U`+o_ok_$GNAk0=%1k_=jka#}>M zd@AIJd)Mp~yal2IZV|lm&&888!#=_Gknmpv-FK(6x*}i-xp58}m^e5U?Wb|9OH*96 zu1n=f6W^2!8Yf@ku%O!PmR=p2k7ge#tq4_d0mn|2BnwwV^vnmc>Do@ch)bt3Dj(4= z*$p?;DP=8x;O*$uyv8+zO)SH@5=ssMBVxzDq(}sGd)2&_ithzqvNjl_BpFruQoA(- z;cq>~q_UB+goc93!(!&o#J{)hP}WMP zr)+O&(WZj^dN>Pe(}Xmzq-;BviB!Kkf9QJsA}~1ICWr$!`R3h@XR;KLme1loV8yV5 zZ&Cxz!Ih7;5WUQ;QeO`eJ9p+X9C zC2vwWlIgW?mc7{P)eY#++p7mK^asrK&nzQ{9Jr&7^eFNh^C)C$dq82@ zJ2ZDjw31dw?b#ur&4^(?PQ1(z0@enC*(W$HSZ0wnE7SF^GD3+FwFWG!ES%0?Y?S#= zi549~k1-QK_y8l@qG8QaD#|iXhTVjUW^e4#v3>m5JOhlb*X4_S#JjcHn+t>E0Qjz+ zrcT6r%>>^kufQj*iM>bHXq6arl1csje5FVb7VNz5Qdz(UrP8iEDEM@C`whct9Y~Hv z;4}DS=$%0RLQX*9xeLhs4RRIC9;Tdpf8qq>CxbT?%{n_TlUl(W@Tj@|*X5=@k)B4S z#JZT7YA|jVvL~R0d6d|nfovonu?+pe7k0mcPXa#=BBhlrP4&x2Uw%ZrMJU`eFRW|* zBTO@gD>QseQ*MczG~Aj1d}6FDf;gX>;7*Nr5)Keqo{6j3t?ZKBW|bW{k*$$IpL^>l zOs9NtnciKThF>u4Bt81q-lCSqnK;(~!vuKyE*&%W&39fUJb!r^_{2z72tM?wm=1_A z%VH_-)2)M#Jg-O|x2pr2LWee`UorGg<*b;y?1?8{bR> zKm6$px6&hxpzI&U4F{mCifmQYv^8S}0H{FwzkT-&>`7w)pFf7G@up3}o7~L6vev2Y z-ku;LoUo$=D2Y+zIrxS_*#mdMk@s2itqPb zCU|3WeIyY|pAt?Mt?ZnabB^XUrz}XZtlVbrZx0t zQdAVrc%b*N^pqCo>(3gWWC}@XoP0fXjjxE=3=!(pnEYZOB1zP4@=)t7m)%yv8@``3 zoWiu##UBQo2Bj~+EySFpM|W~2jhm8cQ**%GNd!*Q19sJ6RXw@@7tz1Io~kLm*m@8Q zj4bbR*)iwD!GAuG&%r&7I1CIeXsHm51jE%xNO@w;=|je<`aWvv^1=1UkP;mcY+hb` z)km~~F}x9m%xPI!@3Fp;ND)eDK9M!7N|PYz41?I%Td-ndCH906qFs-q#X@SvSQ18{ zk>iIZ*`#(?VtvzAIuA&v$w(J8UU^0jB$Z3*3_)u0*`=O`%jfl}z4ACd#w?7h>7TTw zl72UsOSv>l9B71P(Dk}~!E#1O@f1ma4L!SMvY36=HpWk}4(C&@`X}9cJ#h!47h-OM zvKtcENY#j>CIvLIZ%6JLp($dxG3M74eP{LC0B#7B zTxcCYSd56H-yRSeBcC8+yo$Se z)ToFpQGDJD=lLZ1v%ok`Ghb|(;ECJ;zCn-G1>w^yeL@W!A1v&^!PPfxwH=g|=NV&| zK+Fe$_a#j$K{+)dYT99{MAo-DZCiqDxT6(KOpl_Lr&RYUEK*WqFbjcb#@a$lar>`6 z6y#n%wmEP|*{zmMG9V5P*aX}#Yn;&DL9|L$Ub%vv|xJF3y4%A5wUfKOs3b-EES~U-T}By-T&V z5pgo1jruU@W0C5n63_*Z_oyoFFHlhOz8hzux)4FjThS3`;L)Uv=1asR8U66Y(JPCJ zhFFIYkpk^yXc@J*Pesu;TW^LT&L}@S+rA-tx%N%|A%;L=0o{R&0<3gWac^Uu<_%Hz z_`@gR(qY%N0?o`h{K8}yTdDAGBD}9>N!=2-nRtNL!zF5YGcyJg;NloYusz}JWricT zVmG-3Id`}6HaE$3(0-uDW|7{Ww=2>ZvUqs=49@Opx`}H(S}QDFiSc$bcdzls_MlQw zR|cnpv*Uh~<9?k9udtzM1KCo3t4zl53%uBlzaDZl)An2A|Zoeg35if1>))7={2#84Lq^WZ4Nr^GOA%yzOQo#t+i+LFSLnaJ@uvXvtL(OuD5 zF;2)iz8OM*KtQ`aSOr9vQ+I}w(}}+<&7V_0Bc*O)v>`vQ2GW=tE+|L)?%8Fkiz40M z+N%tPoOUTWcPo*VUuHP`$aDVSs~U<+aX#J942$5Ue5Xt3AztUwtnPR9 z@@;EJCuVB9CV|xL-ntG>Lfvg4Au$u@7h^oTCB7<^4M!U>gzE*`bb|Z1%~j&D4G`i{ z5qf_IVkxY|J;0PY@#sb`#_TADteTq}(V!^p+(pb#Zk%<#siY`jizR zeVQx&sf(>h9Wt-fC-V40gBhs>?6$~jY)L1EWsFN1(!j%e!VWwd1DNAS@jdpmbUtzq74uAshsW{P+6=;GsZ-2QK8wS}U``jSx?J4R7<9Uh-e>f{<`OB2THxn#M% z(e7!&rTh*3Tw;Zv87qmeH7jtMmd{?xv!^*bM!{$Gi9L<^WnNwFS(M8~nn9vU7^I*J1 zCqKR!%eQpANHnV-FPrPy zg#~6PU5g7ok}#p$jJHXzYg)P=?-9ULI|0wZ1JGuUzp6xGdM7sFgK-=GsBqVz zkTtB3t)Wd2FW8V0)BDLiz8l-DOXBl}F|jW!YZ$6@xO~0VzZ-da5xV{m*V*A+ZJ*Yy zYI(UqK81!LZ#DekV|r

2HMwy|k7|2hk;rQzW_JnqgRI#wWC^Q~=j|14(|vN+5VXLjr@zxhB+uh(wuvGN3N4BxPP(i&$f?_EWnS_cL<4&k(} z{#S;yPlPC1VZ{{XdmS&FywXYnP46{IGyz&c3@wEAlUg|^&uC;%4L3uD613Y|V|-~2 zBom#bah#A2PA$ir1}&tDy(`W)sAHN*e!6yjbu`ZAy;ko|IhQd)z9jyM*ZbL_G-UcF zt+rzSH!UR(`qy^dk+B+lngW_=frsO(yXK9N!_S#+{j~_WAEGF`W*a&%a?kv2i%A`@ zmldFEZsuP(4rj+RJpI_)!J5OtWaRoBhrAX3lP(dt_~sxsTIX|E?x4dSv8{o1f<{_7 zUx*LBnOzi5!-sJUcg1V+jh_|dN-S%%(!Wo?{+@Fx8-J&C)I4>Uu3JF;biN?m^g?HV zH+5W{NwwVk{rmR^i@0B`>Gsv1Odh1u0Q3IvCV@Ki5`#?t>q+wDTJpx^*f|b-)@Y?@ zjN*%pOH>$MH(`5 zjyr_g>PCQK?V zcq7Kd5xOzix&ws39=80W6`STAo4Gdx!-ua63Y%{A%wD5z>4^N`N7VfZX=b`BhpXfc z=!F|g$BqfMs9TKJ&{ib~MJOo9umhwzF7%|L+l}(}AL(4Y&aEL)O=F`@;=-lH=o;wp z?Ta#VDyJn)0m;rt&+CPQb{WYEJWxH;XanN+Wg*ND?GA|FOv^Fbn0kb{VJsRQ#tb%Y zruG?m$ksQeJ`&i$c|tM%DO;0f;=(PyVf9nzxm=;9Hfd9Ir?eFr&v&U@997@}v5tiD zZF~w6nVYOc)hz`*`=fG@vVyO6HYUjq+dQRJ4KKpC)06sBjZ< zKmKlSarScA?v-3mIr`D14=l5>;(>m_EY;-4QorWxlZu3?X4)srpYVFgDz7`}TPJOY zI(IrmObGjymw$_yQ;%Oknp8>xRG;|oyZPh1QfxkG#>O0Mk}W<(XUfxOGTF2BAW4Sc zLI2y%Y9#J?%|B|tgrKF&5*k4CNHcrF;;=AFals!Yj5RGOZz|`yTd9Jq; z!8ydUu4eEjZ*WLTkkHT2VV>{KC!a<;2C8Ut)|U-_C{P{9&EJZ-9`!6%RS}mr<#Qw< zF-%p;oq*-{Oa*_k>`ni?$sVjj&i)Sq;>%@PM2Rc!zs`KyZ%#Gnh={`RJx(%$ z#f)2+Tu^QHJI@MD(^HsYz_7p%!-2x2lkv&vX{}yDAQo5O5m`$EfkMzA=!6j3CEmw) zsLu!^hD}_3UQP}A2Mh>3<_)rHrjMhxxK>8`QI=6;wbMqtVTCelTsl90y6YB-x!!Ch zh7k6b=)91YxG1cxY41vQUa&gn;cmJ^UEIJ)OBkNaR*JrmCU~=Um>{ zB*BJ*g{{~W`m^Mhj4~Xumnrlnf_9jXm(8HM?iz^C>JY$c5sL`p=i`LaN;~WT0m=R; znAig;OFFKmywJ+MaMx{2a$+=c1O@~=z+d515C{y791dY)2EUgIa@7X~JD|}2Z2cpF z0}B3M`oOQ;_z$@Mn;pA`{ZIK2kgA>CP2_)K|B(m#u`^Kz_->!ne+}a0 z<3at1frI$?c?9@)_;~+w43rnNS?oVsu^|@x9(4(%M4%+Z(U!i*`Ww-Ij=^|;?aGt$ z;4iQb_%~N#K(B1Wzz2W*s~{B|8#YP@M|D!cXXs$Nn7_;IEU0?p9|0)v1B zY%6zn7jtWO7qDFrtmFAOx&=78`JkGZZmL$0V1wU!_Dcre+tt#=f#ZV>H*73@Y|XuWyd2%^ukazN;1q_yP<^=n z-HZV?6Zkl~+Iss~x_Y1lT;hqTZh;cN31I}-T6&?l0cZ$JS9dob2M9dIi=2vlkr_e- zhKvadmmFm&3?FQUU&KS3T}QOel`&SJqh4=``V&nh6NLg1%NmU@%lu>*JVBY)IKT8RiwZ9KAMt?6b z|Fr&#`TuaMy+RxW5f!iei%rf10fY6=%=~ToAUeF8j2TQokTPm*y7Dg&f|?C~S3~}2 z0B6`g8iqj)6!4_#KmNu2rQu)Z`Y#n1N!Q@d>6yW_25tJayy;8*%^s!czghvv|5mwi zrE(Bd`O7GLaAIF4|F3NNrFXO)3U3r<1{V<2O#FMzL}33}NdH)M9c2}2b@_GmfWR*S zP!A(KspdcQ{7Yv3Qt>OVV3|V99+-x>UG&?_J`0zL{t|5^=xL;qTSeqlc&fk&V-gR3wI zj=FdtuC62~?0;(ii?%iV1O%smM}R3T3W1kYlYz??Gd8^bB?c*YCE!F5`FT0|*m`lh zy4%>gaJyN$+9F{5+kpD z4B+=a0Z>AUE-prfzo130 z<>Y05D+N8GgzA^|LxTDhv>j{|^zA_90hR_rZif8o_pE*oxN_8$pHPx=vR8FgP$`cn zSpVbDD+10|0{V_tAkJ^{T1aUlR9rNWNKsS_!NdMnoTRTjVtv&F>X%0P|8bEK7%8N} zKjHfoCor<$SZP-)1u+L3c`+v|{$CcMX3;N#f8^z4t}ND+<>28F`-P7>UpWw|f+`xh zy10Qx^8PXsoKAoyi1I%t4bmB<;E#>J=NM8NrCY(p_YV={|D(LL9!ma?34i3TLZGPb zV`Sj(jUod4VFJd)`fq_>E&?_Ewn!-u>=ONl%P)&mQ5M;NWNZ!oA;fz{=*lC1PeN%2 z)W}~47z&Wn6#xp)33Q3rJ*$6lE7+@t3K*DKntu=c6~L>s`kRH8(p3z>kb#P{kTQP1 mCdA+UzoLx_JIZ6u$P}vUw0w);P1gU*52PIz0?|Zj^ZkDV%!m&F From 0f488635128e7c1b61a55fa85b7923a027f774f6 Mon Sep 17 00:00:00 2001 From: Ed Seidl Date: Fri, 1 May 2026 08:44:18 -0700 Subject: [PATCH 6/6] remove redundant check for err --- parquet/tests/arrow_reader/bad_data.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/parquet/tests/arrow_reader/bad_data.rs b/parquet/tests/arrow_reader/bad_data.rs index 8c5d0fac7e08..d9b0d89e2c5f 100644 --- a/parquet/tests/arrow_reader/bad_data.rs +++ b/parquet/tests/arrow_reader/bad_data.rs @@ -166,7 +166,6 @@ fn non_standard_delta_blocks() { // TODO: uncomment if we ever allow skipping miniblocks > 64 elements //let batch = maybe_batch.expect("skip should succeed"); //assert_eq!(batch.num_rows(), 5); - assert!(maybe_batch.is_err()); assert!( maybe_batch .unwrap_err()