From 434c51dec8e0df83ab1f3858284a7c77640a53e8 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Fri, 23 Oct 2026 10:06:24 +0200 Subject: [PATCH 1/6] + PEA (PeaZip) archives: read and create PEA had no descriptor, although three of the catalogue's reference sources list it. A PEA 1.x archive is a 10-byte archive header, one stream whose header names the compression (stored, or zlib 3/6/9 in independent 1 MiB blocks; a block that does not shrink is stored) and three checks - per object, for the stream and for the volume - then objects (name, time, attributes, size, data) and an end-of-archive trigger. Reader: single-volume archives with every check PeaZip offers (Adler-32, CRC-32, CRC-64, MD5, RIPEMD-160, SHA-1, SHA-256, SHA-512, Whirlpool, SHA3-256/512, BLAKE2s/b), all three levels verified; names relative to the objects' common directory, as unpea extracts them; Unix and DOS times. Encrypted streams and multi-stream/multi-volume archives are refused. Writer: PeaZip's Unix layout (absolute names under "/", Unix times, 1 MiB zlib blocks), CRC-32 objects, SHA-256 stream, CRC-32 volume by default. Oracle: seven archives PeaZip 11.4 wrote (every compression level, every check family, a three-block file) are committed and decode with every check verified; PeaZip's pea (run headless) extracts what we write byte for byte. The CRC-64 variant (ECMA-182, not reflected, all-ones init and xor-out, stored low dword first) was identified against those archives. Sourcing: rung 3 - the public-domain PEA format specification, with PeaZip's pea.pas / pea_utils.pas (LGPL-3.0) read for the field order; no code converted. --- Compression.Tests/Compression.Tests.csproj | 4 + Compression.Tests/Pea/PeaTests.cs | 139 ++++++ .../Pea/ReferenceVectors/README.md | 25 ++ .../Pea/ReferenceVectors/big.pea | Bin 0 -> 65677 bytes .../Pea/ReferenceVectors/deflate3.pea | Bin 0 -> 485 bytes .../Pea/ReferenceVectors/deflate6.pea | Bin 0 -> 417 bytes .../Pea/ReferenceVectors/deflate9.pea | Bin 0 -> 525 bytes .../Pea/ReferenceVectors/misc.pea | Bin 0 -> 733 bytes .../Pea/ReferenceVectors/sha3.pea | Bin 0 -> 777 bytes .../Pea/ReferenceVectors/store.pea | Bin 0 -> 13747 bytes .../FileFormats/FileFormat.Pea/PeaArchive.cs | 398 ++++++++++++++++++ .../FileFormat.Pea/PeaFormatDescriptor.cs | 70 +++ Hawkynt.FileFormats.Archives/README.md | 1 + docs/catalogue/our-registry.csv | 1 + docs/catalogue/reference-formats.csv | 2 +- 15 files changed, 639 insertions(+), 1 deletion(-) create mode 100644 Compression.Tests/Pea/PeaTests.cs create mode 100644 Compression.Tests/Pea/ReferenceVectors/README.md create mode 100644 Compression.Tests/Pea/ReferenceVectors/big.pea create mode 100644 Compression.Tests/Pea/ReferenceVectors/deflate3.pea create mode 100644 Compression.Tests/Pea/ReferenceVectors/deflate6.pea create mode 100644 Compression.Tests/Pea/ReferenceVectors/deflate9.pea create mode 100644 Compression.Tests/Pea/ReferenceVectors/misc.pea create mode 100644 Compression.Tests/Pea/ReferenceVectors/sha3.pea create mode 100644 Compression.Tests/Pea/ReferenceVectors/store.pea create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Pea/PeaArchive.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Pea/PeaFormatDescriptor.cs diff --git a/Compression.Tests/Compression.Tests.csproj b/Compression.Tests/Compression.Tests.csproj index 7bba71ab0..e9e35ae53 100644 --- a/Compression.Tests/Compression.Tests.csproj +++ b/Compression.Tests/Compression.Tests.csproj @@ -118,6 +118,10 @@ ZfsVectors.%(Filename)%(Extension) + + + PeaVectors.%(Filename)%(Extension) + DarVectors.%(Filename)%(Extension) diff --git a/Compression.Tests/Pea/PeaTests.cs b/Compression.Tests/Pea/PeaTests.cs new file mode 100644 index 000000000..371429f07 --- /dev/null +++ b/Compression.Tests/Pea/PeaTests.cs @@ -0,0 +1,139 @@ +using System.Reflection; +using System.Security.Cryptography; +using Compression.Registry; +using FileFormat.Pea; + +namespace Compression.Tests.Pea; + +/// +/// PEA: archives PeaZip 11.4 wrote with every compression level and most check algorithms +/// (Pea/ReferenceVectors), our writer, and PeaZip's own pea (headless) as the oracle for what we +/// write. +/// +[TestFixture] +public class PeaTests { + + private static readonly byte[] Fox = System.Text.Encoding.ASCII.GetBytes(string.Concat(Enumerable.Repeat("The quick brown fox jumps over the lazy dog.\n", 300))); + private static readonly byte[] Hello = "hello pea\n"u8.ToArray(); + private static readonly byte[] Nested = "nested\n"u8.ToArray(); + private static readonly DateTime SourceTime = new(2001, 2, 3, 4, 5, 6, DateTimeKind.Utc); + + private string _tmpDir = null!; + + [SetUp] + public void Setup() { + this._tmpDir = Path.Combine(Path.GetTempPath(), $"cwb_pea_{Guid.NewGuid():N}"); + Directory.CreateDirectory(this._tmpDir); + } + + [TearDown] + public void Teardown() { + try { Directory.Delete(this._tmpDir, true); } catch { /* best effort */ } + } + + [TestCase("store.pea")] // PCOMPRESS0, CRC32 volume/object, no stream check + [TestCase("deflate3.pea")] // PCOMPRESS1, Adler-32 volume, CRC-64 objects, SHA-256 stream + [TestCase("deflate6.pea")] // PCOMPRESS2, CRC32, CRC32, SHA-256 + [TestCase("deflate9.pea")] // PCOMPRESS3, SHA-1 volume, MD5 objects, SHA-512 stream + [TestCase("sha3.pea")] // SHA3-256 volume, SHA3-512 objects, BLAKE2b stream + [TestCase("misc.pea")] // RIPEMD-160 volume, Whirlpool objects, BLAKE2s stream + [Category("ThemVsUs")] + public void GivenArchiveWrittenByPeaZip_WhenRead_ThenEveryObjectAndCheckVerifies(string vector) { + var entries = PeaArchive.Read(new MemoryStream(LoadVector(vector))); + + Assert.That(entries.Select(e => (e.Path, e.IsDirectory)), Is.EquivalentTo(new[] { + ("hello.txt", false), ("fox.txt", false), ("empty.txt", false), ("sub", true), ("sub/n.txt", false) })); + Assert.That(entries.Single(e => e.Path == "hello.txt").Data, Is.EqualTo(Hello)); + Assert.That(entries.Single(e => e.Path == "fox.txt").Data, Is.EqualTo(Fox)); + Assert.That(entries.Single(e => e.Path == "empty.txt").Data, Is.Empty); + Assert.That(entries.Single(e => e.Path == "sub/n.txt").Data, Is.EqualTo(Nested)); + Assert.That(entries.Single(e => e.Path == "fox.txt").LastModified, Is.EqualTo(SourceTime)); + } + + [Test, Category("ThemVsUs")] + public void GivenMultiBlockArchiveWrittenByPeaZip_WhenRead_ThenAll3MiBDecode() { + var big = PeaArchive.Read(new MemoryStream(LoadVector("big.pea"))).Single(); + var expected = Enumerable.Range(0, 3_000_000).Select(i => (byte)((i * 131 + (i >> 7)) % 256)).ToArray(); + Assert.That(big.Path, Is.EqualTo("big.bin")); + Assert.That(big.Data, Is.EqualTo(expected)); + } + + [Test, Category("Exception")] + public void GivenFlippedDataByte_WhenRead_ThenAChecksumRefusesIt() { + var bytes = LoadVector("store.pea"); + var at = bytes.AsSpan().IndexOf("The quick"u8); + bytes[at + 5] ^= 0x01; + Assert.That(() => PeaArchive.Read(new MemoryStream(bytes)), Throws.InstanceOf()); + } + + [Test, Category("Exception")] + public void GivenEncryptedStreamHeader_WhenRead_ThenRefusedAsUnsupported() { + var bytes = LoadVector("deflate6.pea"); + bytes[18] = 0x31; // EAX + Assert.That(() => PeaArchive.Read(new MemoryStream(bytes)), Throws.InstanceOf()); + } + + [Test, Category("Exception")] + public void GivenNotPea_WhenRead_ThenRefused() + => Assert.That(() => PeaArchive.Read(new MemoryStream(new byte[64])), Throws.InstanceOf()); + + // ── our writer ────────────────────────────────────────────────────── + + private static List Inputs() => [ + new("hello.txt", Hello, SourceTime), + new("dir/fox.txt", Fox, SourceTime), + new("dir/deep/empty.bin", [], SourceTime), + new("big.bin", Enumerable.Range(0, 2_500_000).Select(i => (byte)(i * 7 + (i >> 9))).ToArray(), SourceTime), + ]; + + [TestCase(0, PeaArchive.Check.Crc32, PeaArchive.Check.None, PeaArchive.Check.Crc32)] + [TestCase(1, PeaArchive.Check.Crc64, PeaArchive.Check.Sha256, PeaArchive.Check.Adler32)] + [TestCase(2, PeaArchive.Check.Crc32, PeaArchive.Check.Sha256, PeaArchive.Check.Crc32)] + [TestCase(3, PeaArchive.Check.Md5, PeaArchive.Check.Sha512, PeaArchive.Check.Sha1)] + [Category("RoundTrip")] + public void GivenFiles_WhenWrittenAndRead_ThenEveryByteRoundTrips(int compression, PeaArchive.Check obj, PeaArchive.Check stream, PeaArchive.Check volume) { + using var ms = new MemoryStream(); + PeaArchive.Write(ms, Inputs(), compression, obj, stream, volume); + var entries = PeaArchive.Read(new MemoryStream(ms.ToArray())); + foreach (var input in Inputs()) + Assert.That(entries.Single(e => e.Path == input.Path).Data, Is.EqualTo(input.Data), input.Path); + Assert.That(entries.Where(e => e.IsDirectory).Select(e => e.Path), Is.EquivalentTo(new[] { "dir", "dir/deep" })); + } + + [Test, Category("Exception")] + public void GivenPassword_WhenCreated_ThenRefused() + => Assert.That(() => new PeaFormatDescriptor().Create(new MemoryStream(), [ArchiveInputInfo.InMemory("a", [1])], new FormatCreateOptions { Password = "x" }), + Throws.InstanceOf()); + + [Test, Category("ExternalInterop")] + public void GivenOurArchive_WhenPeaZipExtractsIt_ThenEveryFileMatches() { + var pea = RequirePea(); + var path = Path.Combine(this._tmpDir, "ours.pea"); + using (var f = File.Create(path)) + PeaArchive.Write(f, Inputs()); + var outDir = Path.Combine(this._tmpDir, "out"); + Directory.CreateDirectory(outDir); + + var r = FsInteropToolbox.RunWsl($"timeout 120 xvfb-run -a '{pea}' UNPEA '{FsInteropToolbox.WinToWsl(path)}' '{FsInteropToolbox.WinToWsl(outDir)}/' RESETDATE RESETATTR EXTRACT2DIR HIDDEN '' ''"); + Assert.That(r.ExitCode, Is.EqualTo(0), $"pea UNPEA failed:\n{r.StdOut}\n{r.StdErr}"); + var root = Path.Combine(outDir, "ours.pea"); + foreach (var input in Inputs()) + Assert.That(File.ReadAllBytes(Path.Combine(root, input.Path.Replace('/', Path.DirectorySeparatorChar))), Is.EqualTo(input.Data), input.Path); + } + + private static string RequirePea() { + if (OperatingSystem.IsWindows() && !FsInteropToolbox.WslAvailable) Assert.Ignore("WSL is not available."); + var pea = Environment.GetEnvironmentVariable("PEAZIP_PEA") ?? "/opt/cwb_peazip/peazip_portable-11.4.0.LINUX.GTK2.x86_64/pea"; + var probe = FsInteropToolbox.RunWsl($"test -x '{pea}' && command -v xvfb-run"); + if (probe.ExitCode != 0) Assert.Ignore($"PeaZip's pea is not at {pea} (set PEAZIP_PEA), or xvfb-run is missing."); + return pea; + } + + private static byte[] LoadVector(string name) { + using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"PeaVectors.{name}") + ?? throw new InvalidOperationException($"missing embedded vector {name}"); + using var ms = new MemoryStream(); + stream.CopyTo(ms); + return ms.ToArray(); + } +} diff --git a/Compression.Tests/Pea/ReferenceVectors/README.md b/Compression.Tests/Pea/ReferenceVectors/README.md new file mode 100644 index 000000000..a21a457ea --- /dev/null +++ b/Compression.Tests/Pea/ReferenceVectors/README.md @@ -0,0 +1,25 @@ +# PEA reference archives + +Written by PeaZip 11.4.0's `pea` (Linux GTK2 portable build, run headless under `xvfb-run` on +Ubuntu 24.04 / WSL), never by CompressionWorkbench. + +Source tree `/tmp/peasrc`: `hello.txt` (`hello pea\n`), `fox.txt` +(`The quick brown fox jumps over the lazy dog.\n` × 300), `empty.txt` (0 bytes), `sub/n.txt` +(`nested\n`), all with mtime 2001-02-03 04:05:06 UTC; `big.bin` is the 3,000,000 bytes +`(i * 131 + (i >> 7)) mod 256`. + +Every archive was made with +`pea PEA 0 HIDDEN FROMCL /tmp/peasrc/hello.txt /tmp/peasrc/fox.txt /tmp/peasrc/empty.txt /tmp/peasrc/sub`: + +| File | Compression | Volume | Object | Stream | +| --- | --- | --- | --- | --- | +| `store.pea` | PCOMPRESS0 | CRC32 | CRC32 | NOALGO | +| `deflate3.pea` | PCOMPRESS1 | ADLER32 | CRC64 | SHA256 | +| `deflate6.pea` | PCOMPRESS2 | CRC32 | CRC32 | SHA256 | +| `deflate9.pea` | PCOMPRESS3 | SHA1 | MD5 | SHA512 | +| `sha3.pea` | PCOMPRESS2 | SHA3_256 | SHA3_512 | BLAKE2B | +| `misc.pea` | PCOMPRESS2 | RIPEMD160 | WHIRLPOOL | BLAKE2S | +| `big.pea` | PCOMPRESS2 | CRC32 | CRC32 | SHA256 (input: `big.bin` only; three 1 MiB blocks) | + +`pea UNPEA / RESETDATE RESETATTR EXTRACT2DIR HIDDEN "" ""` extracts them under +`//`, relative to the objects' common directory. diff --git a/Compression.Tests/Pea/ReferenceVectors/big.pea b/Compression.Tests/Pea/ReferenceVectors/big.pea new file mode 100644 index 0000000000000000000000000000000000000000..3cae09bedecb6db0863d4b5b586d4e78700efe23 GIT binary patch literal 65677 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 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Pea/ReferenceVectors/deflate6.pea b/Compression.Tests/Pea/ReferenceVectors/deflate6.pea new file mode 100644 index 0000000000000000000000000000000000000000..c88bed70716ac4cacaef88af36bbc861d58df06f GIT binary patch literal 417 zcmaFG$i~EAY{00uAk4(TAiyBXpkI<(pkI)hSX`8>pOKoAldo4&QBu@g zZKVKI$_2zA0HVQ?3P6=yAl_`TuH(Wen$z+tkhShH0cm7l$OGbvId4y$W^6JLVc4)c zcn{~CW!wwILN0hQ+WYV;TR5Ea-1SUi`t6*{p{`BLlMSF^SE1xfntS{8O z`*A`_G(EroYC3CL)2HE^=5^D&m-%@i6N-B{Z2zDKi;H=3$B7owP;?g92PzV?R zWf_&{XrUSelFdUlh#hJYh|WtbE=f({0x=~*Qo0!!T>Tvxs+^pbO_yRQ-r<;a$b_@} ay2c&jgzvM$;>|0hPnWU!Wv49$~{e1@_B literal 0 HcmV?d00001 diff --git a/Compression.Tests/Pea/ReferenceVectors/deflate9.pea b/Compression.Tests/Pea/ReferenceVectors/deflate9.pea new file mode 100644 index 0000000000000000000000000000000000000000..ef9319ff4e0db70cd57c02d5772bbf4098792431 GIT binary patch literal 525 zcmaFG$R@;KY{00$AR@rPAiyBXpkI<(pkI)hSX`8>pOKoAldo4&QBu@g zZKVKI$_2zA0HVQ?3P6=yAl~v2mTrsh?Ll)>_imr)I{&CJia}}l70AZyF##FEz>o*T z6}R4=I?dQ*Ai}U=ckmw0Im@^gh=pA6Vzl?+SGI6C=eg^d#Pr)c`-64or*C;G{r&03 zS&Q}*_f|e%7+GJadH3Ull*nnRM4cxtNq8Yt)Q;tsj;%WT(G^(Fd za|=o;ksS+mDUjH2^`>to?=2PAbG0w^4s6vCK=EO5X_7uDlnj6>jSjr1f6@AO%9YYz z$KI|<Q`YW^4y-REu7+n1w8DzdZ z+TBrBGt)uAR)@YAiyBXpkI<(pkI)hSX`8>pOKoAldo4&QBu@g zZKVKI$_2zA0HVQ?3P6=yAYS3+rd!hMmM=&;{Q9Q-vuC`$VmulKD@x6et-9^O9g}Mt zw{OR5re(FKD^mA$i{IqbZx`2g(08ahzrbw5%EKq@CkvxkoR(jKZ0#NskfjU^c|cq- z=k2M}j7$U_@8O)YjC+At$OSJ(dmnyf3x{)_yPio*zrC|RSa*KXXmH?UzgGHOcR9yuKQ}GJk&K!5h05^xgiybmr5HbMx*mc90CL+&*R9 zi<$8|`BxOztiJl{u~L9BkFDF}PH*Nw0hACdE=|%0#hL-o7yssJDof_M(c}={Vy6;flpZBS%1;U~}U%JhEoF{KMm)_R4c>Rm3?m=;J*VgC; zp?Uyhavrh=*r7fE(Rr!GC8;S~Af`sjdzV!zKNoD;Bz?;K%grs!Q*YhlZ@=+2=at<|WZmJz8kt=q3 z;*C|SH(%_o3D^7;CHzR$uQzH|UFv;uASuqkAiyBXpkI<(pkI)hSX`8>pOKoAldo4&QBu@g zZKVKI$_2zA0HVQ?3P6=yAf8ZkWlrYiMdw$qdvZqMl+@Lv1MKCpc2^fDeEsOSLM6yk zs);Y;h2)(%p=DW)`n!4GtawnlJoVCn+i_11XU)mmlO~K}aaw)_vbB3mK$bEvKWyk~vp?gKV~Z*RcEO%J?5mg%242YF~aO|IMrA zRLaWfHIf2%0_E+4zCLsMYrp8*fr$dU-j)RZNLy6JJWJa9%pJ*vWtQ{m{C=T^X=-jk zNhPx9z&-;Km!=$W{d2&x&{|XA`r_1u2}Q@VUbanq{lQq}N%Y(8rvLj+3P|#492UO4 zYW}~|saBh|teg8stC02g`gJFoPF?#NCx8-y#idF5pja~in!F?R<*!_D{Gu3DI))5sRG0F8y?55FVog^J$9q~ t%QV{q?Qdg0C`4@ek$U6OwuKM&Je^@QBYPF&B-XlSZwA3H=?6c31^`IQMymh- literal 0 HcmV?d00001 diff --git a/Compression.Tests/Pea/ReferenceVectors/store.pea b/Compression.Tests/Pea/ReferenceVectors/store.pea new file mode 100644 index 0000000000000000000000000000000000000000..7501b9dc4387ad7685958f03e0314eeb06d69125 GIT binary patch literal 13747 zcmeI(Jx;?g6u|M94j?jBLM#l(s7xK|NHDP>!NAlGOl{#ai9e@jsfBdT%aSj z-~x!13*bPUI!4Fn7#*Wybc~MCF*-)a=olTNV|0v;(J?wk$LJUxqhoZ8j{m7+ zefr&LPDYs|bBp?z(`v{`WaDx6-fql873D}*^HY&e2|6#`=0a68tuM6xw^C{fXC`5E P{`w|z(m#@C{WOne object of a PEA archive. +public sealed class PeaEntry { + /// Gets the path relative to the archive's common root, '/'-separated. + public string Path { get; init; } = ""; + /// Gets the qualified name as stored (PEA stores absolute names). + public string StoredName { get; init; } = ""; + /// Gets whether the object is a directory. + public bool IsDirectory { get; init; } + /// Gets the uncompressed size. + public long Size { get; init; } + /// Gets the file attributes as stored. + public uint Attributes { get; init; } + /// Gets the modification time, when the archive's time encoding is known. + public DateTime? LastModified { get; init; } + /// Gets the decoded content (empty for directories). + public byte[] Data { get; init; } = []; +} + +/// +/// PEA (PeaZip's own format, version 1 revision 6): a 10-byte archive header, one stream with a +/// 10-byte header naming the compression (stored or zlib at level 3/6/9 in independent 1 MiB +/// blocks) and three integrity checks — per object, for the stream and for the volume — then +/// objects (name, time, attributes, size, data) and an end-of-archive trigger. This covers +/// single-volume archives with any of the hash or checksum controls; encrypted streams (EAX, +/// HMAC, Twofish, Serpent and their cascades) are refused. +/// +/// +/// Layout from the public-domain PEA file format specification and PeaZip's pea_utils.pas / +/// pea.pas (LGPL-3.0), measured against archives PeaZip 11.4 writes. +/// +public static class PeaArchive { + private const byte Magic = 0xEA; + private const int WriteBlockSize = 1 << 20; // WBUFSIZE in pea.pas + private const uint DirectoryAttribute = 0x10; + + /// A check algorithm by its PEA id. + public enum Check : byte { + /// No check. + None = 0x00, + /// Adler-32 (4 bytes, little-endian). + Adler32 = 0x01, + /// CRC-32 (4 bytes, little-endian). + Crc32 = 0x02, + /// CRC-64 ECMA-182, MSB-first, all-ones init and xor-out (8 bytes, little-endian). + Crc64 = 0x03, + /// MD5. + Md5 = 0x10, + /// RIPEMD-160. + Ripemd160 = 0x11, + /// SHA-1. + Sha1 = 0x12, + /// SHA-256. + Sha256 = 0x13, + /// SHA-512. + Sha512 = 0x14, + /// Whirlpool. + Whirlpool = 0x15, + /// SHA3-256. + Sha3_256 = 0x16, + /// SHA3-512. + Sha3_512 = 0x17, + /// BLAKE2s-256. + Blake2s = 0x18, + /// BLAKE2b-512. + Blake2b = 0x19, + } + + private static int TagSize(byte algo) => algo switch { + 0x00 => 0, + 0x01 or 0x02 => 4, + 0x03 => 8, + 0x10 => 16, + 0x11 or 0x12 => 20, + 0x13 or 0x16 or 0x18 => 32, + 0x14 or 0x15 or 0x17 or 0x19 => 64, + >= 0x30 => throw new NotSupportedException($"PEA stream control algorithm 0x{algo:X2} is encryption, which is not supported."), + _ => throw new InvalidDataException($"PEA check algorithm 0x{algo:X2} is unknown."), + }; + + private static byte[] Tag(byte algo, ReadOnlySpan data) => algo switch { + 0x00 => [], + 0x01 => Le32(Adler32Of(data)), + 0x02 => Le32(Compression.Core.Checksums.Crc32.Compute(data)), + 0x03 => Le64(Crc64We(data)), + 0x10 => MD5.HashData(data), + 0x11 => Ripemd160.Compute(data), + 0x12 => SHA1.HashData(data), + 0x13 => SHA256.HashData(data), + 0x14 => SHA512.HashData(data), + 0x15 => Whirlpool.Compute(data), + 0x16 => Sha3.Compute256(data), + 0x17 => Sha3.Compute512(data), + 0x18 => Blake2s.Compute(data), + 0x19 => Compression.Core.Checksums.Blake2b.Compute(data, 64), + _ => throw new NotSupportedException($"PEA check algorithm 0x{algo:X2} is not supported."), + }; + + private static byte[] Le32(uint v) { var b = new byte[4]; BinaryPrimitives.WriteUInt32LittleEndian(b, v); return b; } + private static byte[] Le64(ulong v) { var b = new byte[8]; BinaryPrimitives.WriteUInt64LittleEndian(b, v); return b; } + + private static uint Adler32Of(ReadOnlySpan data) { + uint a = 1, b = 0; + foreach (var x in data) { a = (a + x) % 65521; b = (b + a) % 65521; } + return (b << 16) | a; + } + + private static readonly ulong[] Crc64Table = BuildCrc64(); + + private static ulong[] BuildCrc64() { + const ulong poly = 0x42F0E1EBA9EA3693; + var t = new ulong[256]; + for (var i = 0; i < 256; ++i) { + var c = (ulong)i << 56; + for (var k = 0; k < 8; ++k) c = (c & 0x8000000000000000) != 0 ? (c << 1) ^ poly : c << 1; + t[i] = c; + } + return t; + } + + /// CRC-64 as PeaZip computes it (W. Ehrhardt's crc64: ECMA-182 polynomial, not reflected, init and xor-out all ones). + internal static ulong Crc64We(ReadOnlySpan data) { + var crc = ulong.MaxValue; + foreach (var b in data) crc = (crc << 8) ^ Crc64Table[(byte)(crc >> 56) ^ b]; + return ~crc; + } + + private static readonly Lazy Ansi = new(() => { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + return Encoding.GetEncoding(1252); // the format's "ANSI" character encoding (byte 7 = 1) + }); + + /// Reads and verifies a single-volume PEA archive. + /// Not a PEA archive, or a check fails. + /// Encrypted stream, newer revision, or unsupported compression. + public static List Read(Stream stream) { + ArgumentNullException.ThrowIfNull(stream); + if (stream.CanSeek) stream.Position = 0; + using var ms = new MemoryStream(); + stream.CopyTo(ms); + var b = ms.ToArray(); + if (b.Length < 20 || b[0] != Magic) throw new InvalidDataException("Not a PEA archive."); + if (b[1] > 1 || b[1] == 1 && b[2] > 6) throw new NotSupportedException($"PEA format {b[1]}.{b[2]} is newer than this reader."); + var volumeAlgo = b[3]; + var timeEncoding = b[6]; + if (!b.AsSpan(10, 6).SequenceEqual((ReadOnlySpan)[0, 0, (byte)'P', (byte)'O', (byte)'D', 0])) + throw new InvalidDataException("PEA stream header is missing."); + var compression = b[16]; + var streamAlgo = b[18]; + var objAlgo = b[19]; + if (compression > 3) throw new NotSupportedException($"PEA compression {compression} is not supported."); + int volumeTag = TagSize(volumeAlgo), streamTag = TagSize(streamAlgo), objTag = TagSize(objAlgo); + + // A single-volume archive ends with the volume check; everything before it is checked by it. + var end = b.Length - volumeTag; + if (end < 20) throw new InvalidDataException("PEA archive is truncated."); + if (volumeAlgo != 0 && !Tag(volumeAlgo, b.AsSpan(0, end)).AsSpan().SequenceEqual(b.AsSpan(end, volumeTag))) + throw new InvalidDataException("PEA volume check fails (damaged, or not the only volume)."); + + var p = 20; + var blockSize = 0; + if (compression != 0) { + blockSize = (int)ReadU32(b, ref p, end); + if (blockSize <= 0) throw new InvalidDataException("PEA compression block size is invalid."); + } + + var raw = new List<(string Name, uint Time, uint Attr, bool Dir, long Size, byte[] Data)>(); + while (true) { + var objStart = p; + var nameLength = ReadU16(b, ref p, end); + if (nameLength == 0) { + Need(b, p, 4, end); + var trigger = b.AsSpan(p, 4); + p += 4; + if (trigger.SequenceEqual("EOA\0"u8)) break; + throw new NotSupportedException($"PEA trigger '{Encoding.ASCII.GetString(trigger).TrimEnd('\0')}' (multiple streams) is not supported."); + } + Need(b, p, nameLength + 8, end); + var name = Ansi.Value.GetString(b, p, nameLength); + p += nameLength; + var time = BinaryPrimitives.ReadUInt32LittleEndian(b.AsSpan(p)); + var attr = BinaryPrimitives.ReadUInt32LittleEndian(b.AsSpan(p + 4)); + p += 8; + var objCheck = new MemoryStream(); + objCheck.Write(b, objStart, p - objStart); + var isDir = (attr & DirectoryAttribute) != 0; + long size = 0; + byte[] data = []; + if (!isDir) { + Need(b, p, 8, end); + size = BinaryPrimitives.ReadInt64LittleEndian(b.AsSpan(p)); + if (size < 0 || size > int.MaxValue) throw new NotSupportedException("PEA object exceeds the 2 GiB in-memory limit."); + objCheck.Write(b, p, 8); + p += 8; + data = new byte[size]; + if (size > 0) { + if (compression == 0) { + Need(b, p, (int)size, end); + b.AsSpan(p, (int)size).CopyTo(data); + objCheck.Write(b, p, (int)size); + p += (int)size; + } else { + var blocks = (size + blockSize - 1) / blockSize; + var o = 0; + for (var i = 0; i < blocks; ++i) { + var rawSize = i < blocks - 1 ? blockSize : (int)(size - (long)blockSize * (blocks - 1)); + var compSize = (int)ReadU32(b, ref p, end); + Need(b, p, compSize, end); + byte[] block; + if (compSize == rawSize) block = b.AsSpan(p, compSize).ToArray(); // stored: compression did not help + else block = ZlibStream.Decompress(b.AsSpan(p, compSize)); + if (block.Length != rawSize) throw new InvalidDataException($"PEA block of '{name}' has the wrong size."); + p += compSize; + objCheck.Write(Le32((uint)compSize)); + objCheck.Write(block); + block.CopyTo(data, o); + o += rawSize; + } + var last = ReadU32(b, ref p, end); + objCheck.Write(Le32(last)); + } + } + } + Need(b, p, objTag, end); + if (objAlgo != 0 && !Tag(objAlgo, objCheck.ToArray()).AsSpan().SequenceEqual(b.AsSpan(p, objTag))) + throw new InvalidDataException($"PEA object check fails for '{name}'."); + p += objTag; + raw.Add((name, time, attr, isDir, size, data)); + } + if (p + streamTag != end) throw new InvalidDataException("PEA archive has unexpected data after the end of the stream."); + if (streamAlgo != 0 && !Tag(streamAlgo, b.AsSpan(0, p)).AsSpan().SequenceEqual(b.AsSpan(p, streamTag))) + throw new InvalidDataException("PEA stream check fails."); + + var root = CommonRoot(raw.Select(r => r.Name)); + return raw.Select(r => new PeaEntry { + StoredName = r.Name, + Path = Relative(r.Name, root), + IsDirectory = r.Dir, + Size = r.Size, + Attributes = r.Attr, + LastModified = Time(r.Time, timeEncoding), + Data = r.Data, + }).ToList(); + } + + private static void Need(byte[] b, int p, int n, int end) { + if (n < 0 || p + n > end) throw new InvalidDataException("PEA archive is truncated."); + } + + private static uint ReadU32(byte[] b, ref int p, int end) { + Need(b, p, 4, end); + var v = BinaryPrimitives.ReadUInt32LittleEndian(b.AsSpan(p)); + p += 4; + return v; + } + + private static int ReadU16(byte[] b, ref int p, int end) { + Need(b, p, 2, end); + var v = BinaryPrimitives.ReadUInt16LittleEndian(b.AsSpan(p)); + p += 2; + return v; + } + + private static string Normalize(string name) => name.Replace('\\', '/'); + + /// The directory every stored name lives under; unpea extracts relative to it. + private static string CommonRoot(IEnumerable names) { + string? root = null; + foreach (var n in names.Select(Normalize)) { + var trimmed = n.TrimEnd('/'); + var slash = trimmed.LastIndexOf('/'); + var dir = slash < 0 ? "" : trimmed[..(slash + 1)]; + if (root is null) { root = dir; continue; } + while (root.Length > 0 && !dir.StartsWith(root, StringComparison.Ordinal)) { + var cut = root.TrimEnd('/').LastIndexOf('/'); + root = cut < 0 ? "" : root[..(cut + 1)]; + } + } + return root ?? ""; + } + + private static string Relative(string name, string root) { + var n = Normalize(name); + var rel = n.StartsWith(root, StringComparison.Ordinal) ? n[root.Length..] : n; + rel = rel.Trim('/'); + if (rel.Length >= 2 && rel[1] == ':') rel = rel[2..].TrimStart('/'); + var parts = rel.Split('/', StringSplitOptions.RemoveEmptyEntries).Where(s => s is not "." and not ".."); + var joined = string.Join('/', parts); + return joined.Length == 0 ? "_" : joined; + } + + private static DateTime? Time(uint value, byte encoding) { + try { + return encoding switch { + 0x30 => DateTimeOffset.FromUnixTimeSeconds(value).UtcDateTime, + 0x10 => DosTime(value), + _ => null, + }; + } catch (ArgumentOutOfRangeException) { + return null; + } + } + + private static DateTime? DosTime(uint v) { + var date = (int)(v >> 16); + var time = (int)(v & 0xFFFF); + if (date == 0) return null; + return new DateTime(1980 + (date >> 9), (date >> 5) & 15, date & 31, time >> 11, (time >> 5) & 63, (time & 31) * 2, DateTimeKind.Local); + } + + // ── writing ───────────────────────────────────────────────────────── + + /// An object to write. + public readonly record struct Input(string Path, byte[]? Data, DateTime LastModified); + + /// + /// Writes a single-volume PEA 1.6 archive the way PeaZip does on Unix: names are stored as + /// absolute paths under /, times as Unix seconds, zlib blocks of 1 MiB (a block that + /// does not shrink is stored), with the given object, stream and volume checks. + /// + /// 0 = stored, 1/2/3 = zlib level 3/6/9. + public static void Write(Stream output, IEnumerable inputs, int compression = 2, + Check objectCheck = Check.Crc32, Check streamCheck = Check.Sha256, Check volumeCheck = Check.Crc32) { + ArgumentNullException.ThrowIfNull(output); + if (compression is < 0 or > 3) throw new ArgumentOutOfRangeException(nameof(compression)); + var ms = new MemoryStream(); + // archive header: magic, version 1, revision 6, volume check, ECC 0, OS (Linux), time encoding (Unix), ANSI, CPU, iterations + ms.Write([Magic, 1, 6, (byte)volumeCheck, 0, 0x33, 0x30, 0x01, 0x21, 0x00]); + ms.Write([0, 0, (byte)'P', (byte)'O', (byte)'D', 0, (byte)compression, 0, (byte)streamCheck, (byte)objectCheck]); + if (compression != 0) ms.Write(Le32(WriteBlockSize)); + var level = compression switch { 1 => DeflateCompressionLevel.Fast, 3 => DeflateCompressionLevel.Maximum, _ => DeflateCompressionLevel.Default }; + + // Directories first are not required; keep the caller's order, adding parent directories once. + var seenDirs = new HashSet(StringComparer.Ordinal); + var objects = new List(); + foreach (var input in inputs) { + var path = input.Path.Replace('\\', '/').Trim('/'); + if (path.Length == 0) continue; + var parts = path.Split('/'); + for (var i = 1; i < parts.Length; ++i) { + var dir = string.Join('/', parts[..i]); + if (seenDirs.Add(dir)) objects.Add(new Input(dir, null, input.LastModified)); + } + if (input.Data is null) { if (seenDirs.Add(path)) objects.Add(input with { Path = path }); } + else objects.Add(input with { Path = path }); + } + + foreach (var obj in objects) { + var isDir = obj.Data is null; + var name = Ansi.Value.GetBytes("/" + obj.Path + (isDir ? "/" : "")); + if (name.Length > ushort.MaxValue) throw new NotSupportedException($"PEA names are at most 65535 bytes ('{obj.Path}')."); + var header = new MemoryStream(); + header.Write(Le32((uint)name.Length).AsSpan(0, 2)); + header.Write(name); + header.Write(Le32((uint)Math.Clamp(new DateTimeOffset(obj.LastModified.ToUniversalTime()).ToUnixTimeSeconds(), 0, uint.MaxValue))); + header.Write(Le32(isDir ? 0x30u : 0x20u)); + var objCheck = new MemoryStream(); + if (!isDir) header.Write(Le64((ulong)obj.Data!.Length)); + var headerBytes = header.ToArray(); + ms.Write(headerBytes); + objCheck.Write(headerBytes); + if (!isDir && obj.Data!.Length > 0) { + if (compression == 0) { + ms.Write(obj.Data); + objCheck.Write(obj.Data); + } else { + var lastSize = 0; + for (var offset = 0; offset < obj.Data.Length; offset += WriteBlockSize) { + var block = obj.Data.AsSpan(offset, Math.Min(WriteBlockSize, obj.Data.Length - offset)); + var packed = ZlibStream.Compress(block, level); + var stored = packed.Length >= block.Length; + var payload = stored ? block.ToArray() : packed; + ms.Write(Le32((uint)payload.Length)); + ms.Write(payload); + objCheck.Write(Le32((uint)payload.Length)); + objCheck.Write(block); + lastSize = block.Length; + } + ms.Write(Le32((uint)lastSize)); + objCheck.Write(Le32((uint)lastSize)); + } + } + ms.Write(Tag((byte)objectCheck, objCheck.ToArray())); + } + ms.Write([0, 0, (byte)'E', (byte)'O', (byte)'A', 0]); + ms.Write(Tag((byte)streamCheck, ms.GetBuffer().AsSpan(0, (int)ms.Length))); + ms.Write(Tag((byte)volumeCheck, ms.GetBuffer().AsSpan(0, (int)ms.Length))); + output.Write(ms.GetBuffer(), 0, (int)ms.Length); + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Pea/PeaFormatDescriptor.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Pea/PeaFormatDescriptor.cs new file mode 100644 index 000000000..eadd9a20d --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Pea/PeaFormatDescriptor.cs @@ -0,0 +1,70 @@ +using Compression.Registry; +using static Compression.Registry.FormatHelpers; + +namespace FileFormat.Pea; + +/// PEA archive (.pea), PeaZip's native format. +public sealed class PeaFormatDescriptor : IFormatDescriptor, IArchiveFormatOperations, IArchiveCreatable { + /// + public string Id => "Pea"; + /// + public string DisplayName => "PEA (PeaZip)"; + /// + public FormatCategory Category => FormatCategory.Archive; + /// + public FormatCapabilities Capabilities => + FormatCapabilities.CanList | FormatCapabilities.CanExtract | FormatCapabilities.CanCreate | FormatCapabilities.CanTest | + FormatCapabilities.SupportsMultipleEntries | FormatCapabilities.SupportsDirectories; + /// + public string DefaultExtension => ".pea"; + /// + public IReadOnlyList Extensions => [".pea"]; + /// + public IReadOnlyList CompoundExtensions => []; + // 0xEA, version 1, revision 0-6: three bytes so a stray 0xEA byte does not claim a file. + /// + public IReadOnlyList MagicSignatures => [.. Enumerable.Range(0, 7).Select(r => new MagicSignature([0xEA, 0x01, (byte)r], Confidence: 0.80))]; + /// + public IReadOnlyList Methods => [ + new("store", "PCOMPRESS0 (stored)"), new("fast", "PCOMPRESS1 (zlib 3)"), new("normal", "PCOMPRESS2 (zlib 6)"), new("best", "PCOMPRESS3 (zlib 9)"), + ]; + /// + public string? TarCompressionFormatId => null; + /// + public AlgorithmFamily Family => AlgorithmFamily.Archive; + /// + public string Description => "PeaZip's PEA archive: zlib blocks with per-object, stream and volume checks"; + + /// + public List List(Stream stream, string? password) + => PeaArchive.Read(stream).Select((e, i) => new ArchiveEntryInfo(i, e.Path, e.Size, -1, + e.IsDirectory ? "" : "PEA", e.IsDirectory, false, e.LastModified)).ToList(); + + /// + public void Extract(Stream stream, string outputDir, string? password, string[]? files) { + foreach (var e in PeaArchive.Read(stream)) { + if (e.IsDirectory || files is { Length: > 0 } && !MatchesFilter(e.Path, files)) continue; + WriteFile(outputDir, e.Path, e.Data); + } + } + + /// + public byte[] ExtractEntryToMemory(Stream archive, string entryName, string? password) + => PeaArchive.Read(archive).FirstOrDefault(e => !e.IsDirectory && string.Equals(e.Path, entryName, StringComparison.OrdinalIgnoreCase))?.Data ?? []; + + /// + public void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options) { + ArgumentNullException.ThrowIfNull(inputs); + if (!string.IsNullOrEmpty(options.Password)) + throw new NotSupportedException("PEA encryption (EAX / Twofish / Serpent with scrypt or PBKDF2) is not written."); + var compression = (options.MethodName ?? "normal").Trim().ToLowerInvariant() switch { + "store" or "pcompress0" => 0, + "fast" or "pcompress1" => 1, + "" or "normal" or "pcompress2" => 2, + "best" or "pcompress3" => 3, + var m => throw new NotSupportedException($"PEA method '{m}' is not supported."), + }; + PeaArchive.Write(output, inputs.Select(i => new PeaArchive.Input(i.ArchiveName, i.IsDirectory ? null : i.ReadContent(), + i.Metadata?.LastWriteTimeUtc?.UtcDateTime ?? DateTime.UtcNow)), compression); + } +} diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index d3f8c6198..5e0816a11 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -135,6 +135,7 @@ Every State, Test, Maintenance, Compress/Decompress and Demux/Mux/Remux cell is | [NuFX / ShrinkIt](https://en.wikipedia.org/wiki/ShrinkIt) | `NuFx` | `.shk` `.sdk` `.bxy` | R/W | ✅ | defrag · shrink · wipe | | [nulib.com](https://nulib.com/library/FTN.e08002.htm) | | PackDisk (Amiga) | `PackDisk` | `.pdsk` | WORM | ✅ | defrag | Whole-disk archiver: entries are track_NNN.raw | [Aminet](https://aminet.net) | | PackIt | `PackIt` | `.pit` | R/W | ✅ | defrag · wipe | | [GitHub](https://github.com/MacPaw/XADMaster) | +| [PEA](https://peazip.github.io/pea-file-format.html) | `Pea` | `.pea` | WORM | ✅ | — | Single-volume, unencrypted streams; every compression level and check algorithm | [peazip.github.io](https://peazip.github.io/pea-file-format.html) | | [RAR](https://en.wikipedia.org/wiki/RAR_(file_format)) | `Rar` | `.rar` | R/W | ✅ | wipe | v1–v5 readers; creation and edits emit RAR4/RAR5 without claiming WinRAR encoder parity | [rarlab.com](https://www.rarlab.com/technote.htm) | | [7z](https://en.wikipedia.org/wiki/7z) | `SevenZip` | `.7z` | R/W | ✅ | compress · wipe | | [7-zip.org](https://www.7-zip.org/7z.html) | | [SHAR](https://en.wikipedia.org/wiki/Shar) | `Shar` | `.shar` `.sh` | R/W | ✅ | defrag | Add appends in place; Remove re-emits the script from the survivors | [gnu.org](https://www.gnu.org/software/sharutils/) | diff --git a/docs/catalogue/our-registry.csv b/docs/catalogue/our-registry.csv index a8bf87611..12998c026 100644 --- a/docs/catalogue/our-registry.csv +++ b/docs/catalogue/our-registry.csv @@ -403,6 +403,7 @@ format,Pc98,NEC PC-98 DOS,Archive,Y,.hdm;.fdi;.d88,Y,Y,Y,Y format,Pcap,PCAP (libpcap capture),Archive,,.pcap;.cap,Y,Y,, format,Pcapng,PCAP Next Generation,Archive,,.pcapng;.ntar,Y,Y,, format,Pdf,PDF (Image Extraction),Archive,,.pdf,Y,Y,Y,Y +format,Pea,PEA (PeaZip),Archive,,.pea,Y,Y,Y, format,PeResources,PE Resources (Windows binary),Archive,,.dll;.exe;.ocx;.cpl;.sys;.mui;.mun,Y,Y,, format,Petite,Petite (Win32 PE),Archive,,,Y,Y,, format,Pfs0,Nintendo PartitionFS,Archive,,.nsp;.pfs0,Y,Y,Y,Y diff --git a/docs/catalogue/reference-formats.csv b/docs/catalogue/reference-formats.csv index ab231c065..44f4800b9 100644 --- a/docs/catalogue/reference-formats.csv +++ b/docs/catalogue/reference-formats.csv @@ -59,7 +59,7 @@ FreeArc,arc;cdx,archive,,,,,R,fmt/1096,Y,3,https://en.wikipedia.org/wiki/FreeArc ZPAQ,zpaq,archive,,,,,R,fmt/1097,RW,3,https://mattmahoney.net/dc/zpaq206.pdf,Zpaq,Y,Y,Y,PARTIAL,,reads only the stored blocks our own writer emits; ZPAQL-compressed blocks (every real zpaq level) throw (ZpaqReader.cs) PAQ (paq6/7/8 family),paq6;paq7;paq8;paq8l,archive,,,,,,,Y,1,https://mattmahoney.net/dc/paq.html,Paq8,Y,Y,,PARTIAL,,a single PAQ8 variant (.paq8l); the other PAQ versions are mutually incompatible KGB Archiver,kgb;kge,archive,,,,,R,,RW,2,,,,,,MISSING,, -PEA (PeaZip),pea,archive,,,,,R,fmt/1095,Y,3,,,,,,MISSING,,https://peazip.github.io/pea-file-format.html +PEA (PeaZip),pea,archive,,,,,R,fmt/1095,Y,3,https://peazip.github.io/pea-file-format.html,Pea,Y,Y,,PARTIAL,,encrypted streams (EAX/HMAC/Twofish/Serpent and cascades) and multi-volume archives unsupported; no in-place modify DGCA,dgc,archive,,,,,R,,Y,2,,,,,,MISSING,, GCA,gca,archive,,,,,,,Y,1,,,,,,MISSING,, BGA,bza;gza,archive,,,,,R,,,1,,,,,,MISSING,, From 7a19a9a293c807aa1639c96564c983d6c1944829 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Fri, 23 Oct 2026 14:17:31 +0200 Subject: [PATCH 2/6] # Whirlpool: a second final block once 32 or more tail bytes remain Whirlpool digests were wrong for every input whose length mod 64 is 31..55 (e.g. "The quick brown fox jumps over the lazy dog"): the padding reserved room for a SHA-style 64-bit length, but Whirlpool pads to 32 mod 64 and ends with a 256-bit length, so those tails need two final blocks. Found when PeaZip's Whirlpool object checks did not verify. Oracle: the ISO/NESSIE vectors and OpenSSL's legacy-provider Whirlpool. --- Compression.Tests/Hashing/WhirlpoolTests.cs | 23 +++++ .../Algorithms/Whirlpool.cs | 4 +- Hawkynt.FileFormats.Archives/README.md | 2 +- Hawkynt.FileFormats.Archives/REFERENCE.md | 88 +++++++++++++++++++ 4 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 Compression.Tests/Hashing/WhirlpoolTests.cs diff --git a/Compression.Tests/Hashing/WhirlpoolTests.cs b/Compression.Tests/Hashing/WhirlpoolTests.cs new file mode 100644 index 000000000..41543105a --- /dev/null +++ b/Compression.Tests/Hashing/WhirlpoolTests.cs @@ -0,0 +1,23 @@ +using Hawkynt.Algorithms.Hashing; + +namespace Compression.Tests.Hashing; + +/// +/// Whirlpool against the ISO/NESSIE vectors (cross-checked with OpenSSL's legacy provider), at the +/// tail lengths around its padding boundary: 0x80 plus a 256-bit length needs a second final block +/// once 32 or more message bytes are left over. +/// +[TestFixture] +public class WhirlpoolTests { + [TestCase("", "19fa61d75522a4669b44e39c1d2e1726c530232130d407f89afee0964997f7a73e83be698b288febcf88e3e03c4f0757ea8964e59b63d93708b138cc42a66eb3")] + [TestCase("abc", "4e2448a4c6f486bb16b6562c73b4020bf3043e3a731bce721ae1b303d97e6d4c7181eebdb6c57e277d0e34957114cbd6c797fc9d95d8b582d225292076d4eef5")] + [TestCase("The quick brown fox jumps over the lazy dog", "b97de512e91e3828b40d2b0fdce9ceb3c4a71f9bea8d88e75c4fa854df36725fd2b52eb6544edcacd6f8beddfea403cb55ae31f03ad62a5ef54e42ee82c3fb35")] + [Category("HappyPath")] + public void GivenReferenceInput_WhenHashed_ThenMatchesTheReferenceDigest(string input, string expected) + => Assert.That(Convert.ToHexStringLower(Whirlpool.Compute(System.Text.Encoding.ASCII.GetBytes(input))), Is.EqualTo(expected)); + + [Test, Category("Boundary")] + public void GivenOneBlockPlus41Bytes_WhenHashed_ThenTheTailNeedsTwoPaddingBlocks() + => Assert.That(Convert.ToHexStringLower(Whirlpool.Compute(Enumerable.Repeat((byte)'a', 105).ToArray())), + Is.EqualTo("d352ca65c7d77ae0c27a8e1ce3b8e887f05bef753e28c7b7c7ff112f1ff4c1bcaf83f749ad1e6e397d210ea14da44c4c5615a77831ad80a132e3a67cef2b1878")); +} diff --git a/Hawkynt.Algorithms.Hashing/Algorithms/Whirlpool.cs b/Hawkynt.Algorithms.Hashing/Algorithms/Whirlpool.cs index 4a2a892ff..70e796dff 100644 --- a/Hawkynt.Algorithms.Hashing/Algorithms/Whirlpool.cs +++ b/Hawkynt.Algorithms.Hashing/Algorithms/Whirlpool.cs @@ -43,7 +43,9 @@ public static byte[] Compute(ReadOnlySpan data) { } var remaining = data.Length - offset; - var finalBlocks = remaining + 1 > 56 ? 128 : 64; + // Whirlpool appends 0x80, pads to 32 mod 64 and ends with a 256-bit length: a second block is + // needed once the tail and the 0x80 leave fewer than 32 bytes. + var finalBlocks = remaining + 1 > 32 ? 128 : 64; var final = new byte[finalBlocks]; data[offset..].CopyTo(final); final[remaining] = 0x80; diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index 5e0816a11..2a6c4f409 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -549,7 +549,7 @@ Use it when a .NET process needs to enumerate, extract, test, create, edit or in -Every public and protected member of all 2578 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Hawkynt.FileFormats.Archives/REFERENCE.md). +Every public and protected member of all 2583 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Hawkynt.FileFormats.Archives/REFERENCE.md). diff --git a/Hawkynt.FileFormats.Archives/REFERENCE.md b/Hawkynt.FileFormats.Archives/REFERENCE.md index 4f6a3d7bd..7589664c1 100644 --- a/Hawkynt.FileFormats.Archives/REFERENCE.md +++ b/Hawkynt.FileFormats.Archives/REFERENCE.md @@ -25147,6 +25147,94 @@ Implements `IArchiveFormatOperations`, `IFormatDescriptor`. | `Extract` | `void Extract(Stream stream, string outputDir, string password, string[] files)` | Decodes the supplied input. | | `List` | `List List(Stream stream, string password)` | Lists the entries in the supplied container. | +### Namespace `FileFormat.Pea` + +[`PeaArchive`](#peaarchive) · [`PeaArchive.Check`](#peaarchivecheck) · [`PeaArchive.Input`](#peaarchiveinput) · [`PeaEntry`](#peaentry) · [`PeaFormatDescriptor`](#peaformatdescriptor) + +#### `PeaArchive` + +PEA (PeaZip's own format, version 1 revision 6): a 10-byte archive header, one stream with a 10-byte header naming the compression (stored or zlib at level 3/6/9 in independent 1 MiB blocks) and three integrity checks — per object, for the stream and for the volume — then objects (name, time, attributes, size, data) and an end-of-archive trigger. This covers single-volume archives with any of the hash or checksum controls; encrypted streams (EAX, HMAC, Twofish, Serpent and their cascades) are refused. + +| Member | Signature | Summary | +| --- | --- | --- | +| `Read` | `static List Read(Stream stream)` | Reads and verifies a single-volume PEA archive. | +| `Write` | `static void Write(Stream output, IEnumerable inputs, int compression = 2, Check objectCheck = 2, Check streamCheck = 19, Check volumeCheck = 2)` | Writes a single-volume PEA 1.6 archive the way PeaZip does on Unix: names are stored as absolute paths under `/`, times as Unix seconds, zlib blocks of 1 MiB (a block that does not shrink is stored), with the given object, stream and volume checks. | + +#### `PeaArchive.Check` + +A check algorithm by its PEA id. + +| Value | Numeric | Summary | +| --- | --- | --- | +| `None` | `0` | No check. | +| `Adler32` | `1` | Adler-32 (4 bytes, little-endian). | +| `Crc32` | `2` | CRC-32 (4 bytes, little-endian). | +| `Crc64` | `3` | CRC-64 ECMA-182, MSB-first, all-ones init and xor-out (8 bytes, little-endian). | +| `Md5` | `16` | MD5. | +| `Ripemd160` | `17` | RIPEMD-160. | +| `Sha1` | `18` | SHA-1. | +| `Sha256` | `19` | SHA-256. | +| `Sha512` | `20` | SHA-512. | +| `Whirlpool` | `21` | Whirlpool. | +| `Sha3_256` | `22` | SHA3-256. | +| `Sha3_512` | `23` | SHA3-512. | +| `Blake2s` | `24` | BLAKE2s-256. | +| `Blake2b` | `25` | BLAKE2b-512. | + +#### `PeaArchive.Input` + +An object to write. + +Implements `IEquatable`. + +| Member | Signature | Summary | +| --- | --- | --- | +| `Input` | `Input(string Path, byte[] Data, DateTime LastModified)` | An object to write. | +| `Data` | `byte[] Data { get; init; }` | | +| `LastModified` | `DateTime LastModified { get; init; }` | | +| `Path` | `string Path { get; init; }` | | + +#### `PeaEntry` + +One object of a PEA archive. + +| Member | Signature | Summary | +| --- | --- | --- | +| `PeaEntry` | `PeaEntry()` | | +| `Attributes` | `uint Attributes { get; init; }` | Gets the file attributes as stored. | +| `Data` | `byte[] Data { get; init; }` | Gets the decoded content (empty for directories). | +| `IsDirectory` | `bool IsDirectory { get; init; }` | Gets whether the object is a directory. | +| `LastModified` | `DateTime? LastModified { get; init; }` | Gets the modification time, when the archive's time encoding is known. | +| `Path` | `string Path { get; init; }` | Gets the path relative to the archive's common root, '/'-separated. | +| `Size` | `long Size { get; init; }` | Gets the uncompressed size. | +| `StoredName` | `string StoredName { get; init; }` | Gets the qualified name as stored (PEA stores absolute names). | + +#### `PeaFormatDescriptor` + +PEA archive (.pea), PeaZip's native format. + +Implements `IArchiveCreatable`, `IArchiveFormatOperations`, `IFormatDescriptor`. + +| Member | Signature | Summary | +| --- | --- | --- | +| `PeaFormatDescriptor` | `PeaFormatDescriptor()` | | +| `Capabilities` | `FormatCapabilities Capabilities { get; }` | | +| `Category` | `FormatCategory Category { get; }` | | +| `CompoundExtensions` | `IReadOnlyList CompoundExtensions { get; }` | | +| `DefaultExtension` | `string DefaultExtension { get; }` | | +| `Description` | `string Description { get; }` | | +| `DisplayName` | `string DisplayName { get; }` | | +| `Extensions` | `IReadOnlyList Extensions { get; }` | | +| `Family` | `AlgorithmFamily Family { get; }` | | +| `Id` | `string Id { get; }` | | +| `MagicSignatures` | `IReadOnlyList MagicSignatures { get; }` | | +| `Methods` | `IReadOnlyList Methods { get; }` | | +| `TarCompressionFormatId` | `string TarCompressionFormatId { get; }` | | +| `Create` | `void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options)` | | +| `ExtractEntryToMemory` | `byte[] ExtractEntryToMemory(Stream archive, string entryName, string password)` | | +| `Extract` | `void Extract(Stream stream, string outputDir, string password, string[] files)` | | +| `List` | `List List(Stream stream, string password)` | | + ### Namespace `FileFormat.Pickle` [`PickleFormatDescriptor`](#pickleformatdescriptor) From a70d4db5e9d5085df58226d1890bf31c665dc1cf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2026 13:08:33 +0000 Subject: [PATCH 3/6] * refresh the archive browser screenshot --- docs/screenshots/archive-browser.png | Bin 65657 -> 66521 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/screenshots/archive-browser.png b/docs/screenshots/archive-browser.png index e3795c0d04a8041389e0aaa3edc8cc5c89e36820..7f61ec5859b35268c9f99770f88bd9b4c1ed45ff 100644 GIT binary patch literal 66521 zcmeFZg;!kNmi9{=NC*`O5Ihy!9fCvQQn+gZ!2<+$h!l{Z!QI{6ErH;{T`Rb|`(5Om z)7`iG^u6C7@YOrUn;KQScI{ewt-0p>J zcfl)*(J^V@pO=P`N^leuS4tF=j|dc$bMVr~RTLBlW)zh5Hz+7P(I_Z*AL45j`M?_w z4P+!lQEqPkOK!*t14p7ri3+PYPj1dQX<&B}KH8P~h=N9p_43YrobQw*gTH3oS_)St zt|p#69xZ$9*f-1XhR09;bsX|oL&5JkFT>$1>~WKznjO)1h{Cho3m0eS(9TWc{oePS z){dnzsNfs_@8f@rz>gD=u*(mgdW;75kCgY#+S|?t#aAj}H=`X1H(L^r+v9V8y`zzG z4i7@P^Y_!2vEL!LcN_)fGL_lr`QK;B1I^)zf1jZU!TveY4)GAVSb?F9a|{F_!SweR zyf$47`pCBDXQ82?9NUDohuduC)1m<)w;v-%NZt(*{>d~?Q1~2`(+?PISmaU01gmwuiK^FSZiH?Zo!D(72f{TU)@&(oEtX0tmL8i_S95Z(>M)Nj znY5ODZca@NnsHOz8@Zcsy?CAAN;s89B}c-yf8v+ne{s0Er>mwxS}RgM)5-QCHa3=l zfnNLxse!RMtxJy64pKWhrc5LMyq+N-iN`YgAlb9Q^{xH`aQ%YRg!P0mOM|*6+GBQ9 zpCE%HvK6D2)r2vsbsX+p*N5u6z48-DsL<}ak=o`O0j&5&8D?j8STI<}*OcBRJLYWf zpZCt0G)v4IyWdk}Fj3w03-tHGA!4=e-8>(Xba_bjV~51St3x#B1$z2`&(uE)(8mzS4Ty0!GNf>Cl=H>+*DlT$f)IW8BcPYGG0 zX=~OUdIqQKUCJ_X<~5DjwlB_hc!`I)LUI=HT|_3oFu@(!J69D zE*C#o8E7b}p|LoXP4O6)r^4p-hsErhG%D_zni(D^+Zb+LMa2*Z7B)7Q-FAIP2Q{3b z=Zw*gX!CuyQ@dDSo*tJ~BA@MdEh<6i+tt;QsJ_I(k%64D6hZf@=C z$&nOYUV=cirLsQl`oqp46mwJfi;IgJO8I=qeQSLrmHa(Z_Sm3G$D76ms(`Bm@w8_! zB_-tLypqCW-oVljw;e4#6NOOXwP&Y ziKGABv))-^1MaV>`^2A*x*<3uN3k=o=F*6bF~+pK_>fUkj8ES_ZRooyR7ns7zeL2l zIVD1x6&C|I@l}UDULwi@3LQ_r1_mPQ4CBT!4tyRywCYwz^={^IJ2uKwTUlOC;IUmD z|9K_V*_k(5<4@wcyBo5RugS&7q#YaA7gP0;hjRO{gslB3vGd_#r-$GTk11b*9BF^m z$;if7PF-tjE0?%&OCyNG)N+-YAUk0=L<8+k z)~{b}ThmouNBbE9V}-qmoLk2Ub;t%w_4>kK0s$2{Ijhw_pVSL=nQr`pTI(&|HsVbM1y!j(^|4Yiy2ecM|#43Y?he=;)e!^k(YB z+JDu%-6Yn!wM?~VMpP6A^~&R~^Vd1aNWlYx0&z|@r#P!IiTOVCf4siqd2-F=VzBh` z{nQ_lKTbP){K&u!HMfh?=|;C53&BD~B?CPHC)e(WPS(hq-x$|z7+JQ?V+EIG-Z`E7 z6jtEl-!VWi{eju_u<0OnNAki#$j0)!Cx*#v0vX~(&WkP6CXe#Y>;cL&$8w}qxy72)5D>T?T3OwhB3&X} z7%%CL+eOXgOYFmRC9dxu5tEToj%$h8VZD$NdZVR9aJ0G$?PZXKN6UK8Hn=W7zHes& zS65UU9b1@~7#D4DQ|AfXj-BeMhU+1%lV1L#;{K=o59zz znwXf+pPT!Izp%2hD&I_b8X09ATP75`AYUQEBO+#Y_twU$oDwjO(95}rV3Lk%j)94~ z&k_4bc=QWGOv260n^QC>IcE?l7D43?qoCMWg5d5176;q2)+U>l5F$OWTt1#BVMr$p zNLhVhw?KtIPV?k?J?0t|(iQd1TAWs##B#I@XTm>;K7}MgPxr>>d!IZx;*gLv-~BDj z09KYMjx1rLWj7u?j2RA0Uwn>_kH5Z(0Y$VgJcEUXhH-Fkph4Hy^`8!~E-pTQ{ycl_ zGXmnnmsYHxz!f+)IQV|5ZEw9|19#b2y-0UwrmXJs=g)^M2VA5%&A z>bjk*tUPXRCd2KuyGqfHs{VnF?oWO{zIkLsx6WXq*W;qBv@{@&lUU&WSDP|pWQipR zPUI9+RU79!@{c@rka!6Nq7vE{7ARq>_O&EMex$g07TMp#??OdiQs*k9cqQr4jn(!g z9yg7pq;PZBBurHmm8IzAkcFZ_bIo%(Tpbl5s8FY!3t~YJN>0YYY;?G&$K9adU@Cpg+~K4)Op<=< zwJwg9_(u)yN3OH+njGdn2?ae}92=_P5ybDcEzC_#&CC+&>=nhtCbGZ%lt;@?E>?*B zSY>BxzOqRE9Nik(z-t-V9Y_~NoAtAT>^XXam2(pRUKN;cDxGCfOqj&nl+vhXs{h8%e4%`wXlty5BI92x2(z?kb)X>MkxVd5tQZ>@~E!EyFlGT*QB}mIS8T zVL*W3SpJblS=VSKhqCb8C51fF?F1G2p25+x@g*Ide;3-q8JeJLUeVLnYv05-&XuFU_Ha=tXTitW z_Nxu;{^ze99b(<;&v8ZuSniNSUBo$b_jql|%E-t_%gxprsuMo)-IvH)7g-?Q+*DCj z#l5NN>T1@pKgXttduwSH6P2{HwP0Z~6$=5s&hC8kjFewr1@1FeX=aSLX{< z@)fKg2OV>(y4}qPCL9GKooY5(j2CFYreM$0)UZ`5m@WC ztgLV6=2jT>QoD|hs?~6DwH-Hq|Nb4Ya&SVzcbQh@$^Z|+wGAVCtd2u;5_Jz}W zKjR_%bjY)TwsQ@XkT&rMvf!u_Ma1&c0~Rky%;yHkTtT;ZpeI4ag3<|yf_t}5cDNUh1_K^cYQ*4A*$yYif%#(lLPKHt-a%jHM zpk2BSO=e;~cDt*fQAPaYs{Z5q|8M|t_rD+E>1KVInX z@4W7>2)3JHm>XD_GD*3IB05-hFh=C{vbN4ZhYACSviWa8CMZY74LcQJ^w=(p+gTXQ ztAE_j>|^6zi>O06noeJ1YbZpX(#Wf~%VU7M742R{hNv1l$V)n6r-!2|W_ww{PP@K<1|hbUy7RVH7v3zX0E`)pOVth3Y5G zchwxXVWvWD4XL-9X6LZ7GB@~qN1^@UreA)elW~<$GWZ?eA)N1zmt9S^5elR^$b%uO zqlz5IknrJQ^`B6XJZ5BMbai$0#Bo%Z4#3pZ-pdy1)md4MHmAGT1;o)+-7Pxj6KwPt zeLXhw#dQ*6dr85F!y3uEx3`CYXliPLs9{0Zy$p|gMd*%;FM;|^riWyxfkIwp3HgLs zU`r5f&TFSF%Q)#6V=l{B+5e_L{=>=ANAr!}1oIjxi^nr=`%lE%kGHz;W~-Od3NzOi zS6?SvCnb?w4h{}B$tULO$fXTX240AqAF)@1Q4uRZgU)a@<_{>bl-RgEC3^A{gN}x# zgq@4@<|0~cR826|Wg$zBaGft(zesPMmWbbG|4&GhI=$|6mI-G46}VY1q0hr0v1>Ev z?oM>O3{X)K&4JvUpv7~Wy}ibh?YJt_xi=Qw1}t{Ac7pDwFR%&6hC3iFsajv$xSwn< zG50z+RS4d%VCJ$gwANQr!aCY+NV*||V_-ONaNPe6X_oJqb>RL{^MyOOV4waK ztDNu|`Wp9xxLyHU=Akn4E*H|I?K5T_1(kgY^?du?-HY7#O{tdO!;9PZnmC^xKY93t zwzI2ON>cXy!W(^g14c43HkZrS>&FR?Fc+6zY)$c8p?@jJ%z0@vo7x(=j7#;D^bHM- zcLSQB&9W?=MR2Wky#jT;V~d**Qb4_-@b98CeS&Aj!L3kt?_0^3?3( zHygW0yxQx9wXw058%&RI`t+*DQ#^PR3mKv0OiVkQtukH#BuA@jL&N3ezQH7d?uXGW z#$&!M#14jFqALlUkG(Hp35kf{uzpLhyQ%5w`Y-~5ix*YzjPsnBSXo0QJ*{A7bU;{2 z>KkN!&7t61qoAEB}eMpTfc26o}L58bU%m2~$nPz3S;>q3mx5r z;o;%(!zUD!Wgc~vV3xkMZua;04-5#HtguNRFvUtN+~#&-50>d!&N9Y^-4~+((_2!G zpy)`Qj4Nx^cy^Ji1^&Umid+1+Ddm7Of@zI6G&yrd8DKSfEr+jQzMs{(mqM`cdV1<^p>#?rx!@w6; zdqY{7;^O0WARMztBZ`A2;?~Tl+0dXP*RITDbaa3fRBN)Wsn2E@wr_66*CtU#ZXx9c zTL}17>8~#bEMFI!YD6rx+*BzZ_TO;og%>|uM}-E84-F2cN?(%j)6&qaP32|Pe{Rkj z`w12d<~lN1dUm$K3t3@D<-k$Vzq|Vg^U8~q`!i&)Oj{i$31Wn+c-zb)OcfQCSdS~6 z7sSLv;80bZk*rUjs@$yzIV{)tOp}EaoM)yk*rF`njf?INjj%lM*^J(1aMFDWA>Phw zoyYNXKb^rpC^s*89w^Sn!4l+t5h;x-guXW$HP{PZ~6I~Kk%5&k2iBNGGZbVujdx1%&?kir&`{z@;YsP zIN9ch!+XHYi>`jXa_7p7eX`G$F1v#56V1pd{??B|h19~#%%XN)_sw79ie!O-aot}0 z>oTaCTic2%D&ke;Uz=$qRdP9kwU9C#E=Eia9uTroAAC>qoT_ zUTv-IGSRHAtsCdrb0SNNi#|_DoR=n#&g_g0`@j~VfW&T=^Y^e&x%ug{ja+g;wr2?X ze@(NJ=|y|+;4Tc+e`2?9EonRK%4b+u?v%wx|Jq9VUSas-MzmmOY!YGAkd&c1r?vdt zR9V!{?(PdBVt&_CX38)r)RHPokNw{hzkka*I5@z*de?Ak%lJbK22xwQlhs|$&QcRo z2TWrL2yhvGry3fFqNRAp#6)INLVs1elvV8@c_$~jIy(V`sne` zvo&s2FPoCJs|x-6{4n<5^V4PJC6*3oP%2U?$t1|2X?X*0C8?l;Yek(K%%C(TXDvFU zh1bC}>2HM;KEW%K;uru({m+B`Ki zEd;i|f1pW^YuilfcaD)F^wRk`1aiou5!{|OV9H(N0unsDYdZxNDz2!m{^vM2*;t@P zg-M!8(LfggHW-6K0jC0R1_80Ol=GfVU+)GZ-r4zWJ2E^H0wWik>FY$BsE}QcJy@Tg zuBqV7c>+arzFXf|6Kn8je_KYDmKqSpQQ#g)i8k|dXk>|soVugi!tV7$SJ%G8CTd1T zDLE+{bLCb$Rc>-nu=6^ZlJ3qMr3fXb6k3^CWu_>?f01KivMGoC`3`yN+cPq7HsXl+ zo}u7@oo;rOv^6O*gHC;CwlP934I6fjan_gr3GoZDj|NRj(l8>%mH8%@wXtWPVf|$+ zkWi|#bF23HVn`TyaY7OA`4FTco->GD51n&2PgnViWdtP2WCu)bnb%z@g}J%;>4(=X zzO%g;+K|!{X)?5n*OS6>~L-Uo^L!L7-Sjg5_~%)-TWa@8(Ru)Yote8R!OKHGScoK~Q#qH?&|+GMh#tfC^@*8xHI zj_~R|Tu7&+lvHKf(=b0}F)OQkOKLv+5UmL_{Br2${);C*5fMupe;^CXJrNr8_dKp1 z1(WbjPL^u?4*30h44R_L)bP#UQ=Mx@hV(LTFsm1(=!`~?+`!U9N8u8PL;L=+oh!?5Ga#--m1HZ zYog7hw9Gxn!)vQJbQi_5+9BRE{f}5Ta|K_qt=tvrq}L4k;@4e zCl&1MQ#=&|gTtr0bB1PSX5MhtKNEJauZlHjElm~g&*p}FF-Zj@1Ye?osei-;b$^Bh zol~5OG)69I9%jM~Ijs|Ku05u&uTsM-!aqS$^oXPtNyBNk;i#jJrDyYo!v)lBv zOEk9Q4_xNMz=$B-=N+F+Q1O8!Xe}G{=OMK;$I5v@7%%6JFF&+j|CJ6lj$*Dkox;LH z5txJo6$Ag(C^7Q#@-7ZeL}3CC*jz@foOiLYTVO2@4>#zjsIv0X42_IjPOiUvx;h7M zbKIsCaSF9sG243I|rJA>uMR~`Z`R_-@Uf_ zy}Cc~QcNd-qdRJw-`RQlZWV|Xj0wCozgMME@p;YDFESbM81>EGnk!w?rvakPeSH#3 zVQXt!;8j*Lza-XU1VG0}YxSOAS)l5SttbyM7ONV&xgf+GkTN=z3KgiZt7vk!*1b+= z<&T^x9C(aM`nuy?H?EPzM*N>YRgZBM9^K2Mzg&9-`z-pC-bhHE}C0F zf1!lqEbvIZ&iP#-VJ-V)JTPaw+#K0gxRKeL$vis1WgwThlp&dEQ zTdL8=#;%C(9PQic9cT+mrIm>;3R^~0)mpSxX_HVOMuS2a1q+6f9jeM^*)*0!_q;9R zos>WpHT2g{Sv-)|mw{|SJY;bsc=8uToIx55|22?2HJu}DD!CU98$Rqa`y@q+aOv$vLlUlUEwx_@vxKp#u(S5SMd z`?gunyVEc){um=Av~$_D`tD!yaJi2*S3?;5i=Vxesc>Xe!DXh}%zS!!_*c4OBhNqx z|4Ps@dce*5k3BB2eXka}kPJ7}@-jxf5DEFF-DOvTW5NA-?2w&>jQojIZp;=OQA&6c zcd>QSovZU#w|uC{6?XbY9}5vNd;%U;c=A_7tfrG1)#u=>Nr$@>ix8fr-x(bN=|HPC;~l( zyGF#VQaBlW(RawTEfCA}ANT^=9Tgc#OGn3LJvy8!_E=L>HZ4NbVi9$X&h29M8z9Mu zj*brI7+FissljPknGIf@fJH#wmyH=@W4WwlODubbzJI9d1qT6cH)8N}%4rAWoy1c& zD}OEnwFTDAbLE19?wud!P}v+GH>73e4z|rUx|im*FHDq|T7^&L$CfHRdL)G;<9qTX zr<9M9)2i>&m!BzbDJUo+mzNj3NQb&6*Con7Tn?LwBs@CW7|Gig0jl)_0k=lO1Mx?0 zyoyWPx^)5gEJQnP;FlfIK{rb_kNZ3*aDvd)qTyOD56yJk>vtM1mKn5OkKb;F@zc`) zi~=GI^vqwy*~yoRKlhdT67Xhloyz;0r}G0FJaQDG!{RPD*9*qrJB-A6xO&8<4BsGyLo03>ePlTZ4DkK7)95sr9gv_ei!S!q)&v2ra6 zMtxpMK+&7Fdxb&ky_uEG{O+B|P^Iy>U2K!y^3vn%i{rf9?9J(_n{-PH9^$N4kbY&i zqrLS|SUOaEW&Ch$A?prhTMzN(`<%LUbMwjq%j~JUpZ=_sne1KOhkX?YURiy^)b|Dg z<7+6y-*x`hDYa&{)HrDtSx*`uZA;mIt{mINDZL7K=?va04vVv@eO)?|xBFsXp+ z@3&<@Hz(`K6> zQd&|IIsvCMGjwq&Z>;F^7hg;pHAOW!IjI_lsgn~$GP=ck0#4g)ZLQB>;Su4o0dY6R zS4*d}|Feb<)N_ll?C$G3IjmhawH~WCQ-*!LS)c;hxQFX;@_^}46PE=SF*`pQ8Drv3 zi7}3E4<+LDc%@^pC7eGziD}$xaaZJ~9jMi#3KZya3H6tk_auVO1zkhK z;-(7hsG?$q#;hl?{;N(Lv^k~xR@KApq;_S+=_=D{NuSF2-8(B}!^MREOM<}ilBy(L zw@klMR_MFUUo?OKJ@EAr7Z*1(H|uqZ5os8a8L|aalpN872*}TmpVnD0?#XpO-2U>Y zwA8lu-g#6+#Mzmk>u!IONmb#n$eg0$Or8Dc@NmFazx^6JlT*lwF+7gnZI6|PMpHXZ z1oc~h-@HvtAU)w+06_$w=jU|v_UlMn)t*?6K-UvSHaZ!&>d4MO8ZeVIHn?`tQP;Z? zZ@TSVCtqLDx;Gb=%0&ecmzCLd$>T>DtG?tHNRprVV_Wm!!2{JMCzV(oc-nw0Jb(<@ zn1R)-l(M_!i+QYH_SL*DqI;z0xVy8bTiKvw{>)t!$H)`*8Q>Rp*yo@ixurCbVKq%P zwaCN}o0FgSK)PToF0QFL@rg+VO+F_fsr&lM$Yi&G=2rIKJ`NSf_14RM#WdnJ&SF`Gr}-vReifr`%&PyU}GAgR6dd;D)+0>x0G+UcG+0kZi8#3;A z@d5&yXJajWj4tZ6hmVhd)YwXd<+d7>qC&ktH`mwK_YDjXPx64WhHY_i(^7k7aq*q; zbyib)4w(nX_r!g5m3j3HT0C|R&fcyrX*nqhsiHnDKgdZ$3dxIR>7`b zSLd`fW8D=nfk|?X4GUFPy1cxKs$uxEzFr#rTXQJ0t-amr{4yzCStsFFI{8hzd?b_B z`{DF&p`n9d%1-h~IUJTsj4@75PG(IW?%?( zwf_Y%v14O<@W4Ce%R{4g?=mwp{&~|B40&PM87Y|=DQcD+55yk8B=tN6{9AJm%{Y?e zvgo|{e@VcFZpi^HEfy@iJ0V|QN|T$3DG6d=Z0tC)p%n+a7(WGCmsN7n*y%%bUB!|^ zw|s#Af+4SpvcHGLNuYAu%^93Y04O~&GSWR$&=_<$k}QsvvRYY<{aYoGRT}jzYs|T; zE0FbV#y2~%sTYjlbXh@I=l)rF-SUzO-=oHsKRh`+Oyu`c)X@nAG-SA~WZ%x?oal;& zoSc`+*Bs5^tDdH2jh*lD9VR_o^!p&hMlKr@5U9q-`JS8Qtrm_2#tjBg{8uo5<8wz_ z#^R?A-g?2{RJ+q!*GOHJb;i&t;=8AaPef77_vrrooRC$<{}&ptn8YFoTxK<_?S@qW zchxuauux@CAlNq@KL~CoLx8+Nxg9amw2k^={|W4?kb>xvU#Rxe+mx>OrwqJLwz~ss zW<*83fK^aMT~$?0$@OOL-qAtyz6O1!0(JUw!82H?oh>RfwLav$Ub3^N)65`Qz96t= z)b--}Y9;zbm~jum(tUD#&brsMevns8blMt9Fw~H%b5^6c7m`hhUkmHk%zCIH-H^ur4FQ8~XgK@4r1Z!BB(Hm+2lamO@I-+foNDi(I3Y=Yki}yMHkv_3zWt6FcXcCX7Ds2K>Pp;4WqckVDLE01( z6T|db&*Sn?Q%qA+UE;z<=#8hau%6!R&_^MDlHfB3R}Im3?_dT>ic(S?aa^DV2bLv$ z!TVLHPceY#Y?U9SnP%Z}293NNTM+wQloV~I+EZU3ME%^@*hJ86Z-2%Y({ghQ6)H_1 z`Kj^xi$pLmQGm~Ze9~iQhKb>-@2w=70{~`2Y^(@aN_gI90+uVk@HhdjPt`^)I)(N1 zmkAe`<=pQbDrh-{(5^E6#SKE*M<@`x&eQ$HTzoUMPpKoqBO@asI$2(@vTK1NPs91O zDoNi;lQVvJLIQ9i03DnnBg4pu!+8#C@|cz!2q8s=b&d(Vj;K%EBL_Y#lWWJY=NuR9 zE79cS97NH(kvtC%3yX`2asmq(W{~P#6Z5~=18}aWj^QWs*60xcrYGIjuMB`QROW4ew{$M37cjMh>kInhE2LN=_ zx2F80>g&*ukb&h7gM&jk*kSwj4q(05)u@sqx}>F#9V<_+NN{m*&CSgT2sowWcuX zCD{7BD(sD2k^yE2KBrIG!otE)y$L$T_7sQ!Vva$Np~%NkMdi#KIqs2)&ph}G4}M$& zD+O*uzIMfY(Ttn8e6(!Z0MXW_j!EBlB6Kq?5ZHF}a+c{`n34q8EzFdcL{cq+0PxMt zvlyQkUme}OoI##U&aYVUg?^a$)-?vrhwlR+EhFQB!|WNlw2Vw&eAA!BRqDAFYM_#* zzKLvNz{gpcovBl7`kpdBTArgQ^Vq+Zh*~T}F@}&+bob0y$I4Oo4pdZ3F{C!H(wQaA z+iYQ+Bz==?-CzO%p;S(ZQ7l_irW#w~=%LVQy_gbf3`ROktG|S}ch-eR$s&6?(V@0Wwu0S;$FAn+fc?ZibDn8@fy{>o*oGsblA3P%=e%Vi zb$RThb#)7D>dOZQl?Ht1p@hHEr+rdK0pz$%mwq}$vvz$CE3=;A;d{kO!_B?F#Y@A4 zb46Cjpttm3b>jyxbh5k%2-=#wP9ExvX1Bhk;W-E9*a)xWQ(eYg234jiW(q{KO$`DP zQPh;3zTHLe;<9uK)4wzRtSKj|@Dlrc8Sd+7`QPoSz%fa=ojV~H^t4DsWVY$z$Iy`W zAJ)2z2#RN3Bb)nqJ$-l(SeJfl-DS9Ro)pRBej01Im=@20wzq0#*~ z99X9jdB#!t1qhln)j}v^Vv`;6y1~nmje`TA!mBM_CkkK(KLD43;z@&?`>LjBvv-jE z(kDNE73*n5wF-M71EVGz85z*m$mwNclSj7iA{8D3*~kr(*qD}DLn~UD0u<8~<>kpk zYoSH4TYPUm!s#q5KLW z`pccVxQL>O`_}U1_Ns+Cs&t}B%yS*_GJV^|B!J-=pUvF4XnW?_haVT6 zOoM-kWXR&@APhoLC6%aQOSUjBXMmiXzT-xnLOp;1z^N^MtD zdGpd#fmAkD!0ruF06=>&YH%EAa}Z(>YtN_;?EYiJJu(`wLWK>}VqX~%&ihZB%hO!% zJ9V$}f_FD@QJ-VU`~`0)Le4rtHf$bi>$vLGJ6mp40s@JUS5#Dag@tcT4Ab(`u85Ul z8$H&gKGb{cWas39()tER{Bw7+n9sxW!ZMSq>Z})n4wDKi!dI?Gxt9vE@23;*J^CWj z0_X;PPfz=e0B|L%5|^hmXXt?IB;b!%$$WcIYs0p_HPy8Q6203B<~i;wQH6Hk|E3Hk zlf!KpqY+uYvyS2;gXDxE^++S{K=q2iF(7vIn(BYol zB^ceBK&!B!;NOaGYkORv?JFTlNkPTM!n}J}Yn+@F6&@cR8#!7S7zXkre|6!30TypD zF_6z$5)%WXU^CgPwAltizGT4)P!h&JPE_{+NJLGER?w)tx;lNoG)YiG&Fv*Lk(YeIoq(*ZgBDfQZuk#VYu(TV&KrgGt)k z%Z~LXsHmzWJ$yL3Ut>93o^z1=>8|jcgY{0IPGQJfY@0qY)S8u*tX~Egq&(@_)u)X} zkxr)XT?`gf|HLP;D%vZVeU?BOk0roQXmB+QvYL&D*#67I z{}lSJqE13labT8s3iw}xiFoHK-CIk(Tx17TI}S}5Zkfy2vGF7@T6JXuBT^&D&Ta{| zp+q1%rxj!0>B+Ph)~JqUg6hU}nO$j><^CHB^Vyo4m#ZTi4s?EMy zsI#>_TjA71!)7e#ysEzyOEbStPDybl=vnGMV30-$2NCDt(azXtP9TEw*TEUsyzpvk zP0h^A?Oq?~8VjPK%3e$sM5KM<0;UPm+>A8S)fe=!r4az#524OlLWMeaAU6OtEnxo+^qf-@iHgTasg$Hf`ST>fW4%m;$DNV zQjZXwpg*Rt54xV1xPA?u=*)G27`E`+l9idL&#CiY<`5cw_Yg=(so$Ow6UFRSiV!SLG#TH2*h?hKvTA*mM~cB?X#y zbM@(c5B_bhDP;%3a_-H+!9hR}X}@F`?*m7Tvk4eW@rTOd8)^SQms!`qGX>}q7FJk1 z5plFErGKmW!YYIiFG^oQ!7~Jy?S7>%ItB%SPzBt2jzDp-?PTj0EjxwSWxr(MkO{}o ztHC>@Wj$X``~It(9wuol=lP4uvtTU$mjV9jhM@D|YdX5R^mK9xj**kuD^L&7nz37r zZo)-R0ohVsSmw}D^KAi=iRaB6S#X{V>fBy+%3EvaT2-Q_v@{G1baY{c%Nm{?5993RG$=cxCA`q8IfpMU&dG&Vvi z%>2f@>2b;s=*YC0D_yzgb#up~@$!lMe^@6B4HoX-6&8KBn7Tyg=a>81Co>~w5A-K= zF)>qcI9!Js^?msamc_yTexa+bjHGNiGZz4I^Xsdo7F7=BWu8NA@&haY9Np+NU7vO; zqgeu+)}&cAeL2=!US6KQxLCmJSYh)a``9D{q)Zr3gCL_4I6)xjZPwFLvcwDEo2IQg6L-W^~74Awhh(tjoWl;#;JcK#C!uk3U~-{T_vhT|H$ zETNYQ>dIx6rQsnVDI~0%oSwu4xtW=5ql38vrC>b+N~Yyn>r=}EMP%g>9#h757rcV1 zs410Jl{M^~6lWJJC@T;37fadNqC-Xhow31VgEzf;b zVU=|g2dvM^yn^S=hgau^0-omqAt@;?H8JaSkqq4DCpPL;t!w!Bz{JxYh~JaV-kktp zbsUyFfon7BG!8Zor(bG{PiSe0JUkS1IDhY~5?-v5T~t)%UJ?fy!ITO$|E=+XHU$Im z-62oyvcj!z6)g;8XlV%v8=Lsfc3@JsWyOk!{DVk*VfMiLCt1)HUZT@CSy=?#B;2;+ z3bbC`9lz_{kCFz+eAsYs#IhFpdV6dBtepX7ssgMbvh^`n2~ZA0B!jIVVhIq{W;YDZRGh2TP^8*dRH6&WxgkI)_8is9|6586h{xKmjXFTNPGVM>1&cE*vlsJ2`26sb68z;>vUDr|73jo`U zkxR2Va;}+}=+mqJrI`R`*`F*S*f_KO+BnOfGrPXL8wdeBxZAnU=64ywMIrHu=bxbVot?eP*BH8osuG!!9^soU-{p)_gK zy%H4Cqrcyh9Mn0wci=4{dg-xmFKHSLI=_P3w7mr zEBZ~ilvxh2ABD8s((Ef=0kZSwhG?D~|BJzY{#%=T0_U)cLX%ztQaEl4yl>c3#I?}%)2B;oeF z8*(Rr;xq_o`1#q%&hxvUyciR}%pCv5W&*(m=XTBB2EM$A2+Qen^(KLa<=@fb5$qhS zu>uaZOR@hTnSFpSqCvs<*x1@T6BF!T&pb*@oV^=0!B9Y-W1b`+c4K`UkG_PD9|H<( z&*N8L#mNBXUg=HDNzIo=#g zg#hhFJ_y8z*Y8(8-K*N3URrPvQ&m-k@l91Zpg+X`R{Fu=!T254_Mg3#?nw{%+&G=) z=J(-~HI`){aGafezLIzw-t^C>8*eJr8v@3YHxORp^MB1Nj%S+4YRrDt0)?0pY`-p64KXK3Q6`_w3D2&-X@V|j_eTg*G*bwips+?VA4eFX|*K66w%3;asMgOx&d3XcCOhyJ$Ib(|v zd*PKk_ugx1mPP*-6c3&+t{^!T#8L+e#=li9w~*>GS#kerz5SN`0sMW0$Vgm!9)8Be z8=lw0JtL~Ry71uk1QttaFs*3aKFMW)?#*+N`>+;=MYO6RrmYRkJV;xykpiGD$01=sRWF}nE z!GQxNDJ`AL>8qUfz(q%Qz*3iyi?FH8oJrKrt=?FMtUF^(k8R0kHLV z-HC$8I|MRqy!}VcuDE1;U%;!x3wbdDL6AgpKuDr)(6gMD3|j*$3XBN8MxR zinldH{KEE2i!t8w=RjmtO0oxSuYpBPwjsXO%(XX=EK>hp13aGIZSxypHdTjX}GC8zzaB`xP*s;8y>>UODe+@gfCLq_?+o zuW_r+<)RnO(5uK@?-9^!z%~&{%u9D)w98qIhK0p!HZ{Y4xkl}^YzOzbt!@Sk?2rNHMNSN@Vx@Pwv!69>u3@t_T*zCKTH3=0dJ;df6uKFa@^ z%x3dih&*aq3RL#}ux1q4i9%_2p!37()qt)5MTGCHX2>QK1 ze!nAFzhZM#X*HdE?7*o7{Ml*+rxquP1K5;9rtA{Dykirfw5;Xf0Syj2eIpj2JObeg zbVA^rQ`UE_Xf>I8Ut|`DhzF(gvJ#Ly8#t}42klC|1#ve5p8LPO4=5;LpdCYJ<@a+Z zv?7PR>%;MS%Z?6~_ndWJO#*Yzo|W3#*5>9awUw1Vx()`5Br0Enh8CQw)?gwu&5P8@ zK|4M%1Xx@?Oh*qqd3f(%!Ekj$|JF0m@$ouKE(s&p4=WP==;;4p@2#V%TDUcCY(PZ> zNeQ<|D@aT020=u+TclgMK?MY9ML@s}(%szx64KqFba&@B(euWAkN1A}j_==(;TY#Q z1U9U-_F8j3&oh5>D}>Po3>@XgGq?UX-ddHt4qQcs-Y^dPJC3{eZs{f6s#kQf95R4@^C35 z1%;8BS<}ph?FxT?xe>uPu(9C5)B*LZB29`!g{zujpvl{nteMc`9Zs1M=k-(U<&@`I~@q8QQ(*Z!ASkH)GB zEd>r)?UvK;PjHcfc&)7@4b8*frQ4UtKn2NmOivKkh4x=X&UH*Q zW9C`rQx(UMMJF$*sC%Lzw|ZO}*)Yt+&TK`zxAIYHo_%YEr_JafIka+D>YJuk-P;QL zjo2t1a7X&gMhqWnVgz_87FpT19lLRD&+_V4$3a>VA0MCn%QpEyVWLe`P^-o|3D>@D z$H?Vhlno50wGSmKii-Wwj+rno=J$NE{#)HW<%*cThcl+mmzvdzcCBCPpL0fRX-`yB zb5$L1*sd(0nxBDnF|=^o);QU5VQnU;uf}x%Te!Xs z#pApf25YYoW`i z)z?5)M1~?3%wL&87G~zcmC>Wc$Jl;CgZ)EoC|;SzN@0fcg=I0P8vVc5rY1vq1Ak9G z;vyMT*LfV*q=j@7l0`P`bM+#^34Q4A@`pV|M*O}0>}_a={&~Y*Qu2ha9B>cq3qRs7 z6MW{e+-~w53C#q15FWx93wKYDf>Lx8ogjpJTzq``zg6K`Nvg=3adR)s-_xF0*9?33G=(k>7YtNbFRZI=-{Xe9D5=fR z#{E89?(?B{1V9=2-2CC)_WBhfjNqP+Q;$!&axcVJ=V-7ZoDSolu%V?-jK32f5BaBW zGUO!jg{D(cfQ1QRG{3xBYO6g)mag`GrLOw3OK87@tEMO|KA2tE5?sgQut4IS}bN=liSm~@b{_8Yw0 zCUKCFl~;1|v)`Ast}{-GYQ!ZzXvb{!C(Sv*!s11Dth^(vR&Jvv!!%H8amDN#;TpZmrl=`VfJ@y zWJtO?MO$F0)%K?DwVj)zC#}*U?H3J76p`9A{@dF?0ZOW*#jS^{QzcwU)>J*+79Z{& zPjH~1$ng`7(wV`#j!eMHHcUyRD|XQpkDjf3>wR`hrba^ykVk^uDvpjr#P{SDB>eEM zkdF^nce{U=ogGQlt9W?dw$}U1}R+*m~|_e_oC*Qy9!t*J>K^uDWi< zszkhhFM_U_n@`7o8Pm_)X0*XEk2fdJf`Mz+Y9D9Bl-dHla z&CA2dH8J*FKyR5cH zVc*t7_1H*?4KYTq&?$tFSiU!`KX-a(%pcMoAK%M#6BtodgJk2T-7ryCg5=bPAxRSg zQO+z{4%5Bi)$M_T4!7^JNr$r>%Xi_q?2=OTv4i^z6JkXg1L1$q`oPv$-o%-)@|wfo zQ*{?|bc7n|6_=J>K8!1Q1v%QzNBhM>+S)pmYXdz!m3Nk|aB_lA+fn%AioK9#^g~&{ z`X0QI-YJV98EIE5BlscE5wx_)p!a!re)t_tw6?0q^ZT7mG%_@FIiTi}_`stiFdagy~=T?SWccP)}h*__pcbr|IQOI!R zxIbuUr^|GR>Z7h*Cq+1>hG zgyshHFt&qtLvJcD(9+PzD(&7g={*g+ZUHI?{pvN1(s>D_S9*(CYHvxG&TM*`%6G^w zt5YvkdJgG5i@@1k-1~gta)H_Km$bAy2rL|RyI`w-;|>irmY3MB^praWU(5c~9PM@~ zviv0z5Z`PAmdAUQOfFGUQT8MqjdRI9OZ4)y_wW7ZsMB+GXfzpWG#hcQ50gV^ScOD!p-mI2C z*^%t0-QnXqc&j?V_k6U!cin=y^7%_RI8hh*%w{GPV!Az|TT@O!0lCncyih!`@uhmq#y z*gMs=Y|?+qMoLHZGXMAP0cw0uscTzd$X0q=YtJuLXyF@`o0!nPm{35yiGfbBPQ5?S zi|qJZ0rm62jd9A5Qm_tEdIK4k(Gl<7iEQBCQ)6wDTep8E6J{n_DX?cd#;>>3)ly zW7^|gX|qDatI6yqWSN(1iQj4 z)ZS#z79{UgHOGEh4Iz5S098aP!z#Eik2zZ*Mdqz4Vk zmJ%DaLvrm;D&&)uut=ol09?>h*9h5Pc)WQ-*JQgmQXd$Miz2RYA^zRO)wXOJc@dA% zpZ!X8ju3KFk`(KhCsZ$(nLp?n9S2glk2-$txa1xv91wL_tj#q3t3g8B!cFi!en=n@ zCHPkdHM)7MFST-~_f4c?WtQ}_d=B$q{jz1Ln zXO|XDWA?j^bA2D^ZImTRqgrWhIiv0@>=)r>egW+iU-X5H()h{zeViY{^@nR+ud+DI zGBhe)Ztr$@B_&~vI3oDa9>#G(Z>jKelH9~3O_1_~#B&*J$481E*H)Z~60S4}zFvBz ze*U{EJ_DxHwp0DIAJ(>w?DyT|t`gfNX5DWu&tLk|i$vD=lki{1-%g0jgBgzR4VnUu zJG1IKEvNL6Qg(xRr_xm~FQD~cVO+(%fj_@i1jxplOy88$)yc|fj~r zK+f%$QRP$0>s_Q5FdYQOR0w;}R)N%N{!SxU@7-NS{%NGh@}&;7@U)z?@Oxt5D35rz zYqy8qdY$6k2s}QC!GeS?b6Juf+;%wFMZ0amP=n=b|8#;^s+TxdaF`zy6?orZn0%|C z1)PN9dn!y;t6v7X63zRS58cm`kCg^Q@+=J&<8sM9{T)!H#755;Syj()l-ESC2VAx6XgUYSzmd8P%>xaVVf+CN5rZR{*Pq5N-Z3k|sxMhb&ZyB|c46 zRaRA1ad+hia(vaE9v6xm-`1d`q@tPCLcUM-%h5a&6I06{<)xVoE@0RDmZf=;5WaVz zbbG1v#-WMFubTx0kKk z+E(_(%sSNNwMWO}B_c1j>$Acv`?0g51mOXZDV`pQ+SD;zGN`3F1$RV&D&c;LOWW8+Rv(I*A)9y=gGx9Wv%$&!2MR0SlF1c|Ub$CD}x$5px) z(tF7m2qq?TmYLSn`$^x}V*Lf^juz4l+#WL}?t5Wd^ehl>VY^j*!NTbcg7-RqlLVi# z#pW)?96bRj*wa(NC%D@2lePPI_9etO4`Qn|=6xuG`?6lnG2369*vD%_4HY=3l`_z2 z6j;bTd$#!g+<~da4l^_B=hAjDnj70oJqukkZ7?n*ZGBv9Gg6R$HK*$0)5xk%d^+o| zDO>?>Nyn4-CwE2Q8X2Djif!TTjE<<~2ImI8VEs1~pUq@{^f`Es6t4i>YunH^puc|? zw0(OuE;Ie-KMI^YBxwY{Mw=gy;06VL>Ms=zSoh#9v4J`kY}PN!>ZNnMCXJKa92vGN zgT+qyI;p)hv`maq+~qoMrG+b`<`U+AAjSrjMjIeNQuE$R{tHadgGo~KZ3SpNOsRiTo9Z_O3#bCTRY zoy=%q0;te+tVy999Z_gHX4;bzkL4*-fedC!UQbRXksS}0sz(GLZ}pZ`{TGDo*~8@{ z=a*5Fgvam{_?r0vn~c|Hc(C;~_6w7l=O!~*@FX`RU}|SE9?kRk=z7rsk2)JXj0@!s z<;ESifjZ{Q%NshN;r|Tsp<|A#&wJK&co;%!Ulg}S;@u?J0lX0&-jp~gmuk5U>NFxa zZ9P%<<;)S&3*rp0zx0iaqPT3uhxz)y_1pD7*Mr$OL5~{G2Zi_9G@0=ncILwvv71qB zYB2Ak5um51g}b#(ia1S0wT-!k4V}%%V1SrBn~9;5(_vy;hZj4mDY%^O*z78))k1N} z(eIDht`q;xlX-{?W}6=dwr5>numrpk(4u`aFU``yGh$%4`PrjKnzLUX!Ph1m7N!1vIc?Ecq;U^bX^)Y_!MQdxL?5{n7-qYVNAN7U5yFR}pxDtdWi zfFFShrg2kC$oV4-1lAG(<@(jZLA4J?kOk5n?a5gsN*XZjq z3JMhNadB}L{l-$!k~GgmB_K5zyF9P2z+}rs$>#B0R#NULM`x|*#f)kauxQyiPKWRA z*c$~`v<#l`jv~=To{GPR!5jbrb<&Xq4C(;I>FEZa+FI8E%Y}K+O%4jplAVuyZ+F&Jy{>xB z83dY-kdoX<~=jG;J==1k6f)8)rAg7S#M!=B!hn+XF@WY)RW}%vf@woy>Cafo>VWRbp z)m1+sf?VMYrDo47B&;U>O^ZZbbccqrNZDH6eAX5k>>Iu2PvV`*`D3cK^x){Vtp~XZ z&>RuzRG=y%)#;6l0$L(K0UjTpcpM}PoKr4q{gat_whksH00fBH6)hkO0g;46M~SbD z6}E+05-g8a@)K@6zUdKmau5Ybgu_hkg1>umJ^Ci#xWe>$`dUA56@l(_`!)r^J&i|K z$zBQh3dMrYeAKoT;d#Or`SJ5-RM3R;knP4c3K9_vdvQgOg9 z?3r?B^{}3P*7~LTqpG5oi7(T$VfG831_ViV`3e&BWbDmgjpIA8V@sW%- z?v-z8F<5N9F$U9z#V;%31oivl-Yt9%>r~w^8A;*iWjDLYY;h%`WqB-9!cNdV?X&Dm z)yZ~xPsgasSnHCo#OFv>6Cq8h_hbP>slq!p;wI>bznhS3kr~YT4^NIf1IkWTBkOyH zO3d8``;v2eD%AQF3&FM+DSK@Coz?*GWD5%E&zbR3?tWZ-n+wuDX ztX>AA@M(qOVc}4|ZDtJ3Mqgu$8N+gSO@b6`{d3J^slJ)(4P#CJz*1#nH8o4>HEL+X)~!Fhg- zNB+IfB4`w>aRqag z(X}w$FE~kXofC2S1tYo-^Km(2%}32Jnk>?aa*^0$LJo`FETBATK0L&fw)AlpkkP20 z#72hef8Q~x?UfG}Ry=(*G(Z+5Gq0rv(#VI9TSnj6ahqij12RNQ2o(imrs-pS=2_7| zA)7}cFP|-!uWpWaG9w#~yskK3eJre{gm>Wz;`DnwL@E~AERIev8zp=U_5ohO<;y4K z8j6atyIEPc6b4=rMzhe#CNwdJk(7GV>bO*8I3FzYuL7LnC_Q+KnS(=3jkGYnsfOaV zLYjK%i!Eh(Q6Cvs@|LEiq4JZj=PEq`0>WErt@eWp_FP=oioZ@ncU_2Ta>O|(BvJtx zd`Aaw?`?c?uC@xB)cc@lgy89q1a9&&39k!s-yP5~UuZI`YehDmgh;5TNlZ0fk<)VH zv!%Pipi-QYlr-D$+SxEA1-PPNrR__L@3bO@`)ccIL!y{VtZEz678iL>xd?eq%frsc z<2s((OZVl8OLCZTLZx;m)uvNtKd(<^YFS(v@a9TccOb@Ojr)}wgx6<~uF|TvT^tZa z&n~dM<^GI>Kf~FG{<{z1ED?@aGJh65u`JD#r{WbmKdMj>9R0@kkX{RmN=qeH2disA zFt;$3N_mG0(%r5t8#%8l$Pn7IKOPZM`U$v5%>@;PU87*3l)7I&j6^Nir!7sD-Cg;=f4*B6yA+MbWkbQHM)6|TDacKwQkpr4-uylRWWsW591IM z1Hq4gn9{<++WiN_M3oJ`o>D}`9`V8CjrZ<4@AHYOcyzQ#1BpHHGcHZr!ORj_67VR2F3T^>H$gLHkVVo`~6 zqP#k9uZTUq9y)cJ33#Q^BvFACy~%&;5DO#PUpx_O=|r`hii=9<7IqoNHCwe=d0AOO zbWJ0J3dfy_yu6Poz0uC4!A3v@-{b@w-+E8#wIg!PFRW+jymNT0?FH^#FzGq@{N{r{r!JI8{tslDk@Tw3x|L#Kxa?do6~=bhUn)q?agv4)xKYozHa7DJ@QF*1ogaFh?2Mm>*epJ5r$L^zl zF};5VFgb0maFmsIEUey>?&?fiB7xBzNHM_2KksW-KNyej>qx$G-7EbikFonNQQlSj zgFtrQ0*x3uT5`89V+7La2yAqy?L!!q(vqX4qFXmP89-RUM#5|XyJuIWS=5|NV*8vG ztlxP|!9_Klsa6U|EEtr55c_8y&9WA=baceOZg^}t%iH~Vd&9M&vI-TLPIPn$WGC4(Qi<1sP#2?-l&YImEP<4D+XQr;QW*{Z4z z=ioKgW6cE=3cli6wX`9G--iA~u2j~g*<*O;;IXScIo4GDXU1o)VvSEb-oJW(uKfYY z@xiBn6_lH!?O2gTaZ*yh$y^Rysvi;O?OppHKGXs1X)2cc!+Z4V>Rv(tXP zPlnnl!_kkFWq)>U!q0J)(OiY_kmqGzK{{UJ45RV~fFbM+housiiswB-vmwvBQstlqrb93`1d7AnI#KV!mqhg85{}+jjsVi8A znbRg%VV#ppcYTxS=g;dDSeVMpKokjwpkjoJ$bDmZn|uio)%hMJU2i8 z+_;B)jL$+^Mn)ms_8O)`e0mEJlkuk{)!_!fH~is_zXl-#_||}XzHg*i0<_3n{DfKJ zSB(tn+n*mSUz5?&LN**0Gq`yM?2?e0^v8)nucWQ5tfZo%qzF~g^$vaQjwhlL0e(J1 zB^?40H3;`S^DMK8=Mw1VDkVHTw=HVt^XcU?^KZ?H~doJJb72OjNLr+u~bSLksWi!)rJGS{R z8Q;4X#cdl^X*Uq}uBw-mJ796lNLLphZ>x8x{t^b_p-z~R67Y%fr>DC|V0;{0a@b3P zyF;6sm$xZqC#Yz*D>+jId2OG!Z%ayG*7jJyllpMYGdcMk&qULX?LVKpbehyIu?T}>opV-w9zJjiN_;aAalz}nP=ttczMrvq#FTfr2Nvg<>9hN_m;UF z!_ksTiX6bb#;Jjco4_{OyvP$1TXP~nY=jg2DsX2fU1k+G9CN1q_M1(@|^ql34 zL=?Bg$nsFCLZ~?Dbw45etHgdblV2++T**}mEGYRA9o5ao!~INZ+_o8#V#6v-`MBhq zPKt0KF%Va6^;$G@TUwMCM_r#!<;3e$=ae5@1NYm|_!%)jpH)>gnezcI5)||81AgJ;NaMT z{i%*~a~*Tt9sBi{`<#?YLPBp-Q$>Rp78Y=kIN(@2zk6FkEZ6${KCBl4T219}u-*;K z^X`HFtYM-&qP_|v`}HB}Lr+KNE#zMjNoGyKM4Jo;Pf_+X1-xZ9rBFR#!I7a+YBJLb zuBP6Mes+(U?YDx{U*me(UJ`kPZYBqmb}@FfW_jW z&zhtEvVW1%^m6iz@jt7}EkNDk`YhaH>X6gCX8LX6PA8s*P;IQEZ5+AU zM>AE`@Yia^pRsRGah>_{h{|0qoL5U|gg+S^V_@PUU);_gf-Pq8nDMHr3JRd2j8!@V zK@M*sS*mmTCA{Z4yI7Jw-)CS@UvHpgpuLXi0bP9eb>w@0xD^|ZsngtWIM{vmX}!|1 z&=l@Ix606_l9N*``WHEV{_K|842a^peEux%+E^q!aCylxA*(-RvngDMhgLCp}ZKk&u2S5<8U6mrSJqr)R2;2V2923bMBKf+@}HM!e%aaO8y zXXzRwnS0|cgKO%tM1m^H9Tgf1U`fa1a1T2=$3VsE8Q|6u=$WI8nB|(DR$nixmUxntlXuHKE1z|&+)+bWneIru?9ocv>5*I9^Eo_xqt~Wk zXFSSmUu}o)6A!ZhJw3dxKc$r&93DNY3bUMn5wE08k>8IGX99vkV-E}D6Tk5DX!#qK z{@C6OJpGN`N!2&FA|w)?AYCF8 z^(=%}eADZ+|3ew^n|wc!t-ICAdyvo;2~*DPNk9A=aj_v5~=`l7jo-S^F#7eBh`r!0y zW-0@s>~OD3DbpFh_)@7`8wCL|_dpC+U$y+!qvpNK5Y7=la+YmG*&U53IjSG&Z8_M^ zvs=Htz^_5h26M-1C22!hYkN(hgCwm*Oj<&IgyKB|`OXUkq@@?H-c(mreWBg2-E{Gq zp|1DG8X;9S^OjwIA0L$hBd^slSsf3T*}PyYoC>}A&nWT8H$zyG$2hg)sOM?UiV zZ>#iFzq-bMlOz6-P)5V4UYXs&z~#+6c2gIA`0MjuVc%BSks!M90~Qsi+@zO!=cna} zaT))cIySz}p`*rI+8So5=iEg!F#!xIFlP3sxd@n~h~G zE&K>vZSV?i3Q^nH&KNfSgFJJO9DClU4w@Y~ z(9`~ue_xH&wLL3TURI0N-Cf%hiCcf93AF`! z7=NG6>gx5V*x0KPtjVzX&lmRa7=c>7L(X@b*zYc}!Q5Q7xw#65gTCbh_dwY3V?wfs zfe7Bw!P(ZB8jI)7Gg6qs%8L{g5pgEPu{iF=xF>eHq++hCP7I{x4^YLGJMXx3d;NrY z4)?(80-m3FT@jRQauGG}E&99lt(+%*e6$$AoC*`kh94q-K-o^~ynZtVtgNDrlR)>u z#PnWYKUN75&T(3Q;Y_EXn?!tbvzWr(<8<5s^jOUxs+)zzdt=Q?%8&9Rg z#Kcfs+J*=8GQX4dGO{q2+P`CNGrX7DUA5HQvgzW^bW1pj$I@o5F?h$+9!6C#wlW>m zhDr9H?k&mSdj=0< z4{r*KTRm(3kILTjDLVbPVV&bQe~`jf@y|(8{C}(Z|9RTf2pDh*&!x9DJ|RNH9hw#b zUT%F!1R3IGO5zQ~52&$uUt(z7K5&Xm=!Go`Bp4-3qxMqkixiFZ^mSP4qK0>>>;d%%@{;%t7d9;w9k}W?i?HTgueT`?n z;Xuye<+OHVjA$>P0N3j`CYP*(l{dyOY=Baa3J-@6x15gX17n+W#8YDrEa0&W;625= zl=c^6p($f{Q&#P)UiFgCoz%|(yaeheY#lBzo_gwnjPVE?D9Y916E=-b}Bz|@{;G80To9Wh>{X6N83Y6honJGilf>6x+>bEoYR7?lLG^d zSRMJ`e-tFiJ1)Yyulb8^Rgee47F*S7V8Og_c77Z9X~4E2BgKWv>xSNq!A8Y!pegoE*?Qh;YxqEp26c8)rYi1_6Wztd%WE&CHa*ljiPjytfz6jzbn&YJN0m!fgvRYdEVJpF{T(Lw3=%2qi|J^HsnX01 zExH#c?PbJKPHuIiDbCSXmB;7RfjQ8OClPoTM^7c+_LseQIup``SrYC0zU~W&E6RM`e(9MVc z>KpP89bUYcFqG9G`M&kIOXM3{1W31Xyc|Lh9nH&QMKHY|w5_YFllJIG(vS`nuJl)w zOVVs^uZ7*8a@{cTNQf;3hJI`&inFOu*CC|4u3!TM{npzd*>{8WU%S5Qaqlepz4L<=d$jlPU``9@sKKQP0tYtqeHll)bC#y2%TuWe zO{LJG#J+MKrw|4=y7OnP|>8!i2-NhFb z6Z1<=bv&+)&)eLD)B}X4U^S}bTo7m|La_@63=F357<3OLX2U=;oS7j(+)%U23Qm^t zXu|2GS5;H%w)Yus?zWdh1g< zh63pWE4#YS#qj(FMi+|Jg~zQb>9MnUTry+y0PZniDR8F3HV8mYku5_1NfodaQD{QW zYb3jvlN278yj(*h4Sf_FHqnNFO1{ts;oHrFfVPdu7VAU<}_ zu|QV~tA^R=`xKP?_IpVDgdoC^o1Yyv!+h!VApXc2s6oM&7MF1`K|#n}zk7Wgj^_$< zqY9&;BE=^ub6ADT_W#zS%rBk;`AMlzb7CWu5y-9PT6Mm}OrKM7jShNExNWWyvzHYW zeQU`29&(ke`z{`>r(cobc=#IW?{=UCv!WCXp-E| zLO!?)>s>vtRDk_Q_F=~S@aCgcTAxh`Tz!Hr^s z!&JT8r99@%i#`U_jQoyPLwK)e9oH!W{}f-*>n+8*FBKA=GEcQ*&7Z-?+WWiJk#udp z{>u_NCFTG6+<#fAu(v{=hk@X)=0<*cJMDIhN}mx^lclpH324Of>~{=4@K$%LXf1P5yel)rGx$ zak`BI_ji#BC&{XOzs(6IV&ZJ+=s@vACOo{4O3mx8r=$5y_bBLr%5(hfx}pqZqIzwx z0KQE4{q%*v2GMh2^}NW^J7>kosdP~w{!y%&zld3y061Z z^R@DDq<~#M2Ipq|HV*z>uku@W8+UgquE@OAiTP@iq{adr?TwLZ?%0sNs*d^a(bt&R zFCjjolSYF=h`YNSetVIVh-1)yAYK|C{z=wO7JjUJqaFS}Gf3ya1v({)57Y0mNi5F( zKCr#nbYtc^^8DGVHW-T zm6%v?Qv!jB6I6+aG3Dz>p(7^K$yLpB2U|wkDt<-FPyTN%$|4m;&o{OSZU%-aw42;< z{G+00=D)TLI1fH3$UIb7lHOw?uozn*IGS>P@R8iI;{FjEE&XF*1A!vcZb1 zNHB;Q@6ri9L#t@(!`5s2PT%0;xVbu3@8q;XGF*C47u*DSV^h&k5k)!3J;fQYcw_n; z^A%}`iu%xzuviGLZhR$>ATv=coZc+nP$(Nst zD>Rq=W<#S+lYE-GXwT+$@jYs4Y6f5dHd~p?$!bUPTUXDN^z}2v!qU#sqC#Tx5hmA; z4=|DrP)F5rJ3dazskY2BFx1V7V1m`h6BQhp5uXU#!WW*3S--aseD{|tLwkvE^vM}w z%ipPGh@KMQ5#Zr_A7gGvZv>Ggc&@bgRfab0q^^cW9jdMm(mjg-E4XWyRtCjoL$-E6 zp6TYs#O!i?p6>2FYaRF_r$dDjZ(_ujRWbob#&&r?#ooQy0;Oj%)806mz4PkPr2vxn z3}f@PoSDG)v5%WT<~p8kr$QjItGT+mSnwH7a%BS4LH|;&FtnDpDR8&OL4q%%SKMkj z-)|2+7_2oW*zryw`938K>q07523((mKO|1deT|TL(cs~&w`ZJep+$mcN>+Q1oT`UU zC~tkh(MWf{qNu3Rv1%yHEAj~oD=4uHNjj7qdwc48LqlFpK|xNI9k>uN zYoxJ=jNfO2DLY#%f*9~z`Q}+|usx)yNmQck!OPtSXisbN5%+j`*%?fSS7P%yN$`VU z>#56*#t;SqE&_mhW+;~T4z~UTv4pY=g++dJkWqd>b!6rc;g2#M*=}iL>@Tub$vi#> zf+n=l>QjYN`?SA(9q0|g*WonYhW~+`R)HTrJVm!ZSax2CEZ>RfeQPH{F@wQ z&Ze*waC;dQ_=)Ce9fO0q!NiX*si`uW9+yLbp4w7wx8FU0TMx=;NV=j(utKpovY|S@ zX_ClyL4n8CbZFjsX}{2S60D?F6x&8*fGzYoAsMQ)%b0#>r%U2b4WzHu8Q$I&!FbHM zIUi)C0kWE03S=yZM8gCaSO}1cs2Bg#ovd|fhbMQrXa&?Bm$_SgE zl#xPbvNE(8=xaW(vlP2CT~v=;V+>ek@NR_5PbJ^@yJl`Y$zNw_jQK12uP(%JDN)U4 zd^UT6dwY@6U2%vL8%gC)-dB+yJo)&_=9PB|-F+7&S(Bt3-*R%ppcMk*8awrH4wm^= zZ*tjT*9lJqMMS~cOZDi$n%=qm|J{HkG0N2b^5Tv)i+4b}>UdWQ??&L~gNC(o!#InZoce z=d6^cjCw^`kfvkBj+6asv!6b_d2<%|1SF-DYA;Oz;p1b^A*VhF?E!_~%2;EKI_I5; z2=oF_-_B=LRPf0Gz*BCD>v!t-u}1vD!klx{6Z~|~eW{=?C4E@8%Av_oE3(?Fo(sa6 zm$W3cw6uIo$;ny#^l4fn+okOlVG8Z>Zi54xB~}h2sh^Hl|I|0Gsm1)d1Ii&$W5Rxi z&fQM{S18{L(7tOcV~&$6THx$1_Lt}kcn1?OI{K5clvpt2eKSD>BUMZ1%Ac=w!UU1z zn7zn`%~Lpxd(7Mve3269bG?aXdpeNu*^k1;K?2<5|71<6y{s8>obzUk9q%aT?!3m+ z$ibjqdPWHSy#)%b{T6ODT}vd>gdVRoPt?iE((W$A;-9}{eOhdPA(;q{dw#dv95XW; zDFUi}pOAZFAdI<{lgdb~!Lzu~)HQ5$pu3@=v9ohwaI5s%;l=G0g}v3-e|lV7nw0G9 zA#^ti#Z9mhzkIpH%j?!SH9kJh^dZ{C+spTvxX4_0Y-p19?x$?mLq6S#CK9Q4;VE>U zEiSlZqn(W(u-DhR^j<%F{=!(*-h>r7Jl&?n90t?V!yA3<9kvWp6)n*V02g-L?k}*U zj#(@J>*$Ab-DEclgGfn8!t~565Kuf}K()YRP*6}vL>wW6b<<&eGfbhX3f6n+vpVFP zC2G9c-g=&rk%5I0uXH_tD%sF&C=EDG+=V95rU!cm;Jbiu2_uuRE#vY`v2^lEe@Cp% z$`CmT@nE{>3|;Bhf0WdE?U}R zBWINJ`LQRDURQOBW3-LH^6$XXxVv@7eaJesaB zu!N}d3+YafiibEkq4ayFlK3Bi<>a~Ek8%sWp;3I^@2~JHK#%PfbxGRQ)@cZLzfa9G*%Guyst5@SN?Zb*1Iptg4oJw)Lm zg(-HuRum&GZFDC!t+1@$#nBx#)ke79lcj>tzS#T<8GBq(fsk?0-JfmD-|SbRycnx+ zOwCNJJjh%E7%m}+pR~ETh`4FRY(~P{l+S5*5x{$nOP~-$VgI33j@eh^vK}nbi9nec zojXcNv^8B^Oc}MXaG|{=1_EwF<_p7%*)CgLI~8u9^Yb|=-d?@zxN(t! zh&Tfr7%&~hQGB@%Z@sjzQp~j|pWFw#T}GQ(ue5b+F*`EcP3*`JP*KULsRM)k&Gfd- zS33gvh@oXtDj!9ah#kd^we<Bo$hP!&RywDEd*?M z7NQle7v`@$xw%iA55Gltc|p+v)MhsNW2?MEYWHWmT8prp8#2ZBIgHHbS7PNVQ1S(T z3|qJ*LiMV(s^V#U8^Bw70O7XrfV7PD!ieqM?LwGth_!`Au)?_w3oXCqFW%7`4evKR0*{V8T`5)N zGX6j0DVHOgg8dqaznG(eTffe9~eAbNzw`9;RHd()tz7 z-;FpVsK0bHwtg2CZ=z$MeXrLL%qa1+sk5&~T28m)J?^PU@HNx(ShRd_jQZJT*}lZo zIvnB3pG$rn?Owr{9#&j_$w?1UMzWj2iCwUgj5)^wbk&&iXzhfftD>R`8A?M5TGSBO zfj^}MOVgY308E6zcrVdxOhlaApHq^sgLMWTp5-w=F^vCz36frfUK@|GE=?g zLS{Gpjp_V(w1+wW(ZdUiXiVV!hilrMK?JU;vIz=i+R86s@mzHR^h#mA+5Ftw*QcD1k0=xjo z?%>uPb%64YdF>rZf9}G`(ul39Oy9xRwIDQ2`i4kr3b}8$(XmK+l!Zqe-&k>b4{^

wM@lt`IN$IGRzn>?1fVT8(0zeOX^{uCVp+r>4m@=48oELEq`%tP}P%QnuPVMmEK z0k#)d^}mE2>n@eZ8C5_j`4j@n-Ueb+x%v6&3WcVX73D^b4*2R^I^*scC~kw>9LGfi zY0xRQ;C}}EGVdp=BsPxE~5#ZoWmJM3SM64 zst@r@uwKv7QiausOLLL1C5qE|Uq*VwguA-WsSs8uPNuGDu$%Tv%GmABGLh#Q_05mq z2kb4~TkgxbqmZGtk)l>#U5#w>bGCN5IMb|=qdkmwP2b+B>-0Z$_~^ zu7qpt%m~-23`Q9m<4jwk#KY$uZCXY;)b4sm*+K{J#}3)KH9eUp-q18K#=5*+867E+ zYjV3@T3|MqB&i*Mx-W%$Vzaal;rXK*_CFSa>04`2QMu0%6mx7kx-X1jv2jPW>g_w% za&v-HhCe*rUKpY0+ur<6!EduLY~T6Oz;(DRIrqsy2bHd2zC&BZ5!~m8@v;;9dtEqP z?i%k&tEfbrapU8$IV`d8q#I`nO_GqPB?6*H}4HWw7l}fZ}{d|`WW_B*L$;Sd7lPken zql9dxWvUEg<<1MEC~k=BR)n();Pxf**Y*POMCGWZ5D@BTWefPB2%&KNn6dDZ%snn3rgz=PI<=U4DrunB0t2$(ep#n zRpVWMs>)?NP40I2xW2jgF^DL%Cg+2{4rNsPo_1ng$Y^*gWh}?ZA^q-z1TmXYN9xJf z%WG@lKW2YMuRvY}_9;%z_UBtBHic&Dk85NqceGc&E-tpuPmwFNo+Gh6K6`r9)vAVj z2RnNQb7JDdWa+-kPkvM%{q`+RAz&Hlb<=g&$#|l&?wf3yqULx}c41J^W$Hj>_>F?c z9E`MQ2}lPEBUoIcw`&Ps``sL?Joy1;%wub7-d=u6{(DY>IsGq9;XectrK)K1ZOQUenaNuWxf^r3$x8Gof>d z>|&;lO~H%Nm|7DqE5qTKsrKs>E5pU~?u1+~CJRC#9xnuU4peF(roL){QNf$Y>944v`igjk?F+FK7l;# zji<$BtJE`(!g-kHO*e&YC9ZVu#YK^x2=WdPU1!?NZFAZG`QuW?bDgCnw3$V;wbr|>QEjPn5@ z5z*FihjU+KdHhG?u>>(#u&~`0DN6@Qu?>Hb%sK>Zu2t_x>O5-ZLty zb=wwQOP30w!V(iAAgCZ&BuUm1M3Ep_vVi0yIa9hUkc{LcARr()=TJ(NERu7OoT13^ zj)^Ot?RKAc?|H4=_geD@Q01&y-~7TDee~W(wocicg27fmI!sFwRcupJlU0-FRQ7n& zJ}wBuec}1_lcDhwkVrD$eB(b_66U#$~y=)vl6q*4deyaXqv&Xq|KJ%o*iUCzYtZ z0GZCl_SI&A{i28f3+lC$!qCvd!p+%DoWS-*tVm!=)O!J0*CJ+PAk@XYVxCMw zM;_Vm#K=gVp>p$mJK%olB*be?{xUa5M{<#Wyf{N^+Z(nTJW7Z~f*6&D=EvnMe5>7} zfMl8iiv;Fb-n02j;BsWFQoKIJqtW$9Q}e3^skMa#v^us~yiGdQ0ZlNC`-OcrbaVtO zLBNW`EkB%=7!C~jvj6<(NoY$?%B{arYQG-Dr2ND{v*O8z`c?I3izcx(ImUx`@Pc@f>#GJ^0V!Gvpee8)g(f1 zMc-B-${QyY(^;94cwh;Kl)&a>h0~pvU;>dKu{oU(TeFPA?K;e$S2l+Rnbl6|4hiT~ zvk?>f*Q|+c8-)6W+0AY&T@euM>Fz#GdG7>i&uG6K>|x3GR`uiZF9(Vk*xIa2b>lW_ zC#{SIIu*9s8iOMItfp8`k?so1XGX@^J+Snsb|%`g#{V!AOyu&*G3Q^7*=}#v)I@d& zj%dWlW1P=2Dh$>nNZ!7!uwK(%CB!o~GUDeKmJ~VzO#K>Y9(Toduw%`-Kq`jPa1$hn7X%CTrzluaEb4Xp0;+G{ldTt3a1jC8Y>>2 zUcZqlrz36pmdg=5{t1mCypGi=deVa#rO~#}?t^_-URT8{g>&b|ukGIEt0~RY9q210 zIA=LMAWhA>rTh6Ut4_0`f^1thoJ?m?D+{f~=%@jd>oy_zFX)w8YlHHRw82N4srfNhZqMz!JAm=wop z!yJDW>4}qIGo&IU3%jv7D7l2y6kefFx!C-;G{bNDoEHJ*iXrg_gHWP#23Z zxrg%}`Biq49vL2b-}{C}Mgqt22Qm%hQ6ol;U->$W0Y~2U&NV1cl1;6HD76X z{LEavySDv>rUc{kyGKTb;id~n`EzG{iXW_UiQ zVrg&rK-2tseejH3`>&{-&CWq!kh2@KT~CadDBye(@g|6QZ{1dpCMH(vW~lsJ&-nQG z)=ENGkuyPqO2%UBosUp^Mh}Wiwr0O73|08*auPXUBx-W7K?pe@ab<#nP)RoBy+oBg z3CUM#aYZ(hH1uHsR_RvQJ1*@l)x-$A6c_iFXq)wroMm$SqAm?jv?t$4si2$YqRL!v zo@3Covx02OW5fO!Q%X#v(IK02%$tM1Mc;i@LdByoG4GmfYPvi->lL04qWe6<0nt=B z9}}YK4MtFOBOvaN46@KzKg&C&QhSdeCfw>$;!cMW^Ai)po~%{T+3s1xs?e@%^K%S4x{or(!RvpQ zcIT_Kl!{lB1Q=r03+Q&r;Yn^XuKQzm{322}*vE6mn++bg?z_5$Eg-KCD#_gE>t4<5grfbQT|kJF>X<$2IdCM(SGd z4NhNcZ+9c0jC}v_r^u#yuDkCYm!9zX&~c|{srWV^YyDGGfGR zyjAIi-AJX_sRGW5gvfPR&QEVDSmliruaaVj$cn5w+X8E!W?}_dLsSVM=!1wlH=84n z?jp&>-b z$YN8e{A+=OJg~GjkmEF`IhYa`J1Jr*E^zANttZnB-AdLN?3@C<#i!R^;T$H4SV%Y8 z^2;QELm7*GlQFk_GCn@u*<(qWq~tz*5QAcgq0j_5pSd|MNyf=wxQ}bzI1Pfl-Q)MK zo(3|a8by?Ev|5R;{a08UaM%2s4z5%*36jtES7@_EHt*PY+sC#SFEqX3VP5Owf;Ilu z33`!CC%VnFM)^%2r`+3|7|sezF2h$!4BdV9XtBV}f551wVkS0-H9>55 zt9Rijnq^1z9-KR}0w+!d)jqvuqA@?a`xBbKzGJ_~JBb=%nPwa#7bqLgH=`?yQ_=SVaVrR!EYJ3GEXnyb z>iGvL=uKYHp41?WJF0zjoLy{oCn}9JyfeKup{o!#0i`#`v1wUr&d$s$!W@gZb|%nb zY%I1mH%ACifIY5oW7r95GY9*uGb7)ywO)8Zs^AS?=t8y<{y|8lEduK@Cw03iX;bY5gzn3JcD68|mrU z?x7qGs|}`=Zh@*tK3UQ7>EsPH3JOY$VrnFtWzXcV74$M0Pfz>|A99(}pe0qAKG@^wpwEiB@ zr{8{!Nu^*YHNOvhhFAy>)R9Q&Ll%iGZx^5E964IQkwk07Z6#G{wBijt)3h;Q~XA ziy=BWZ+I-TR)VVpiqHPJr4+=O6#wg%!j&V>R2{fFdE}>`m}i-Jo+oH(8%x$n(efN9 zChBM^z}O-v*SX=|V0rbaODf1M+DM-+r;EOHVXu`HUE-9wWh)VMmEUI=@zq`-=T~$?nd= zAh!83vL`HBoajEHH9SE~gT^{+CVYAcX_K&O-Hh*{v%two@p~De2aI!DtZV&BDNpmlOw#>dg?JfuMjh|y4 z$!EGniN`#au|nCXc8JZTRDS;QxlUf=iJ{@#wW~+d+l(9Q>Tddxu#_NQqohuCnGaJh zm-YqwER9Y+PDWoq#MaKLuGX_&UEx7ZmY>9=LzcAWLled;S8(+Y)Y#!zui7@E7K>OL zibAt3rS@9q%yo4OWGF1wL@7fAiN|79{;pm=O+1pLqPH2l|Mqpwn)#%wZ*RHvynENz zxe2V+e z6krgBZ7D**k)__3wnK-J{zgLzC8PFuoklzS7L!DL1j%QP2P*FkhA8v8`qA7w%gB)Y zxT3V*S4xqT)#MkZ3mOOrvmjUrrfg zL9aDb_PSN6-c(G1G`l$zdzo2aAMnJWth6trTtu4{<%QYF^2vF6GkN&Z@t1fU?o;`C zhTh2Z%U%7*_v^CZW&ytcg)(GdRqHX&`dz&0<(%;;VG=kKQGUGhVzpExePmuyq3iyN z%8NvMS^^WAYY|=^kea1OM5Gdp)VIVItMjGqt>Oyl6V`Fs&|Mt}+>CR;F%yw)T zhvWXo`*SJU#26xqS0^rRZR*&i)x$CjAP4v`S$wVs<*M3W3}H1j^h!yTsgA%dnzs!D zpg=F1b&8B*)c@mMl8*;>hsE5udh7btTc3KH1^CwnXDGk^Bcc3&Q`znhICJ>$VI3Np z#+2~zaO%eiR&%!5+6<~?JA1p^?8)*Ay$SikUKfRun?r8eRtMC^jJ~Ry%uf44Tn-<| zP7KEe%Jt19Eqz5$&?a)sk5AVv!Xo`?QIQ%`b&xfHa&O~l* zZeeeUVicY{$^LLVSJCl0o&M*VC~}^im+*=p6{Ck`XvhWnKoPM_z_Pydnr7t7Uq1uT zS=gJ!wYjS<%y9ANI!k^Obg}yuP5kE}+~CMtJAL}F_ci2gB}eh2J0Ms_y*kyB4LcpDe4+zex=d04O`tnNeH|Z0 zCSLlnzOJ_RLIUw@cRu8ugAaqjf8DAdB#K+3wG+(BT{)KFygbE?_6uSc1;ptBk0aCEcA$pHp+v2FfD@Ha<1lqvBzG;|pan!FZ?)1($nd1~bNOajBJ#BW^wPJ^e=tX2aFi^`n7R);JR zE2}8?G^yH(7q|h1iSELG{m<8LKk|u_d^R4)?+=n9jS`(@8ZdMoOV7D`dV4#pzECJT!<4|;gweMKOhf_&0bGH%09G%sHT<(MVPDArfRN;F5-NZj*3=(+-(R(yUG zJ=v(vq&_u@3w>Stl$x3va&!vu!2SQUsZKwb+{+-2vtOqfXlK@k)6Mw|2hzoIu)){FELayhD!KHM#6y ziXR=TiHm=sCKm2QPf1BbGXZFduqR2fRN}wvEq3x`B5_%7-+uT~UjFIx;z-=X@O)!U z3=*x`XqCQU#q@BBw&C6{cjb$f*!-J359NBqTw5%htJrZOEiA!Pb!*o;!o5jc{7Tsc z4&#w`Xmb9Ql(81rU^WJwG+!TFnw@W)gmFSVf?-!{so7ZQaY&iGyXubMb>petw8Y}~ z+lJxO5_)qa}EE^r0O8Z``wl%;7G-J zY~6pzpVS^VZ=X0Z-JdO-K*;~35BWF<{za;&ow(gJB)jp4Z523kvrpfBc$Z$y?L}s0 zZt&|1&lr%A8DhVGP^mi0ZQ&Z}Y%W_^C^8mn8z&XVn<(>CL2jP%-OY${sk^MK_5u-4 zpk7D1v8h_*usNMOBkp~wl}3UeJzO52+B@3aZ8TtS@@2zRDp5u{MWOWrZfOa2n#|l> zG68Liil6o~iK$h}%q*94NB{_3Op><8ZCQGfBXGNO>1UxKUt zTU7f4PSNC=0evGzl$w==g@v7c*Sh0zd_%3ROp0Hwc6nFjV?1B~*rzGT&|IcuxQk>! zf!0BSxcX3$xAmZ$7fS{$|2LL zlD>!BUdcQ;&NIk7K|E+LYeOfWia~UcUWnO=>P-HMQD>V<+iuWdWv9w2!R=puq06G+ zd$m?qRggtq3Nyud_fOQKPRta!mq+3xW#SRJ09SBqo#U_?nmiyhg!>W60XBhr*auws zwOHhxzq=s)KBwV)kB2RLj zSj8qU((y*fnwmM?!bqJ4<+$#5$JBq+`lr4qX!mDr^_c||A!CLhEJc~ zU~NnrLLa*cvKe{eOF?2Q^sr-nN$(8N;;cbQxSz(8CquKN??Nrj&0BwA z$B$0-@W^`y3?C7Fx|avfAAi_`)o^hr%b>62Bc*`Aep7!j*q@+WD=P)X9%ZvZPerAh z&?d#UH6DfMhUq*I-`HrDj$(xON%5j0z8??YH@AC)muYTY*#XJ^OZU~)X?Y(9W%D+B?q^>OU2G-pFMrGSNr#Z0RNl`miy7kJDHtR%mi z@V`8IDumm7t%GdX#J*#M_F$&p$BPPVdWZ*QtiY+j7-xi87S5jCCDfiQhffyM>t#1E zU~fJDBmfyfn=7V1myjOi? z3uPO!)m4J$BaLRi#(8c0@=K7Er0<0^IW7J$&Ks;Z()BdJ-CIyS($cXDA8tCBOky}# znkCq2e|Kp98Gyu~-*e<MG|FRt0(nCF9n5Kkja~XK%>U}N<#y>~jU14~WT-PW| zN6|P*nZu+Z-9sbB2Z<_6!H#ugBqPgBDVkB@UWHN1x>7H0Fr zzxw z0z_nW7hqewJ$27}JFBTT7rQ@iU{2ui5UaN5G}B=>V6OVniQi$vC%VD)s}O2qB;`k_ zAnnCLl3z2Q?m09olJi*2kpsiPtl8MWz<{z6w8!Tfqm=T+$r5F@h7+Q~!@_3!vbfYD z1oWnJ-24+#l#2xMSk#vTj_vPc>vx~#QR;nvMOd>r(%@njh6OOm=Tc9fY7dBuM6x<2 zl}1Dml@I2ZVNDzxW1yQny8)JmWVgN|g<+vcRrA#=Zf@>L8RkS!UY_ll+?kmD^_hy4 z6gkGQSEn`|I(D4p(^aClboLs!a0b}9L~}F4(O_aHzOz?+?_VOj1i>_q?rpT2pj6KD zaf<5wJr6}{dON?xOh<5ebrI*h$-2O-P`KRCeG9f$!_QAPGAPf2s3(k!XxTLOr+osf z%FfqnvGeksEzuRzcI_>dq?{)TY^J_|%UZP$d24}sMU259Nv1V=lrX%*DOQhevngWU z@!0G@UUzLv=Hj*3s6a?mo_ms97u2<)jvm(ALn%vYpG{oZgwrhWMGweyK!5 z{Pn%rK>?HT696VyE%bA0%mx?d8|7tXokm^S82qX1Rb#Ps~g z`fOKH;!Qe>$Ad$J3;o49nwqiFSq3%U{HrBUn%-XHvbZ&Ev$D_D+g@rgQDmtfT(r9=dOe__S3Or7Rj-JTp? zPl*coBm^pFnvsR7fIyhIi2mOGD+T-Vzs}UKGZ1V_5(ArDI=S5~-=9qfZ>esi?=rOf z)Izs+b@zCalha{P_{aqXewx$iRL7rsi5kGk@t~uL&WAb}rtDHtd8`*{Wu9MDpY4-=Ns;b!bN( zlUm!Kft2xQ?XXx6#nHuD{r#=Uf>plnQ(D zoFwQ1$$QR6+d8RdULu?GU^M5vCX^~SC|(o`h23kuXZFLEJR2I)35ZBZ%oTzAK)>`eghs~`? zFMW}oE=moR_J$?@ef#vWVjv7`t@kx|>eQ_$z@E43IMXYW1b1KT*x7XaEJJe1m@0Yo zXuU0qqq1nuxO8)@yVX`zN|9106McC{j(#uG^5 zbz>l;k&#_GM9LY)ucL|@nS1l*4ZVE2cQ~6uoYXFj7j3jBfSq6Ooz!WJTJKE#rBJzS zVd$fp6W=wk_)4_EjYk3Q$nE%uE)XOHP#3s&^k^`X+CZ6kXRDD1zhlRgi$^w&XTb72 zgNoC_Kxsf*n^3(R+sZn#9fWVcW}2Y;oNWqGnOed&0Bqo>5>!PLie>1G)}3Y+`+u#8 zjpfNRzzOoLr%4N&kIUhjw~vN3sz7C$HDyo2rVfKhJ zZIW!Me&A=yqGW=>qD}0TF71JoP@x&c$B#uXaB7zqu zqmtej+sUCIlp?|xpyHr%Gi8m zDqEaWTRft~Vl1ibCBNVOt3NwAU2!?P@3Rk8#gt9sISS7GXQoyvKq47;ySbIV`_jsY z)3{p^Xmt5}d{OTwZic2r%140pnLd+)(a;P)B=gJW^AjwDbG+8mPcxZ)(cY1lDN8oo z9`$|6SCO`sTvv*C40$~?8Z#KoV-yfIi3HF$>iKP{br_^!)rSm`j@ zQQgNpihJ~aba}sebmUF|FH4fHxn9pE(Q_xwd2_c|21d+9^ZjzUW>1xmiPJA~kRF_EhV^ zm6erCaammjsi}+=2S6A8usIO~MyD^0&P`BI*eepddAOHYkMy zKg_L|miFk;qX5-~DR6Rfiro-SWZ)1#@KXkK?8He@-hvc)%FTUgPw!KwVCS%&A83E) ziWE?ucuOf5DnoTH^YOzY)mt*XR2_zD1tjqV`byEo5e2 zPdK5L(4^RL?k1@t0V&Tj3*^-yu?Kj`7_$$^8-{F${Unhe{zOI)2nEWv^=~|~SzjS< z|EW$B6%z2~ud40u?>KnvAbKHBt#Sxs4&*TyO6jrW6#>*PmG<+q0f^jf>NQ{U)6K zBrgR8dUN@#l2Y%I<~`06L%dg!PXw?=|39FCe@}Iabf>cXIxK;Y=4`GbpDqVXAtT~= zQ7)^E*Md~)1;`Zv1|k2!l%I?U3@tiOIuGD!X^|y`QnA{Cs-=GCIn>JZ01#2wfx^CK zWp&~J<-Lk&z5|tl`_EqIN1+{N^~A0+QQHYUe%#`>>gWKohc|r{$Yj&fDN@%A8Znt} znM71H!nFrdBcRH-0P3#Xk$l}@IKj;=b9vuH1Yo46Y{)%cmsef3$6Lj|$Y8K(ODVM8 z|M-fKVxZ96ddfY}69Mgi8ms#+Gna(la8kZCK3{+R1z;e6Lqg$M{WkJe1U2Mlrc{PD zdWX`^wBrpH6)vVEd(>~4lyx+%%?_mMvS@~i+6P}j-dytF-R!}Px*qla`dnpx1W*17 zA(;lC56Ep+V!x4xe0GuFhs3o08~7f{syTuj6C(cu9*4pYX#tlWB5$)fc^Z`p{?5*) z$YOLrkYSuAwW+I`C_^hjcUB=N&>k;QG$Etyb3?;`1Pwx86;sOBda7;Lv3!A3KR}0( zP;6&B3Vj5Q<5N?%b3LnfB_(?>&wv%~w}}H9+iX{^{j*8ePkhCx zsi~G1dB1~mL&^TebL86sqGb4z7A@K-i#-jI~8mHU0*QVwq zV_md;VMfMkFfq|4CJH6XC#@`S-PI)4q!bkQ_G^Je4Y_t935U(I(7Zv08yN~u-YTZ@ zpE=7u`BlP)Z0{qWgLu9HZ&DcjA@~Pc(7l7o7U#f2C&FkXK`53^Xl7758}!*k!J5AvWExBR}vKW`mwIz(_AC@6h0Twyev{m_D(sn0pDQKp=(`}trfCY&E0fcJk! zO21c#7|fZPn*Lh-hME-2MwK*|GXmV*E1%`k z;aW;wgubv9Bj!PSQz5rlLXNNg;77ch|Ct3wDfrzJVevfb1R2ZCEi@LGrO=)Od>x!F z-Gqs*TgR!_cYVIx`S0XA&MN>vB27O074nztcZpGfsA#|XeNumqW0K32?_->`&KeZt z^GMw?qo-7F$%3dJV{2!pT5PrZNG5=q@(k*d>yG+xUw3=5Y;TTbFNRjyn~eXe?|nHY z1qRHc~(KqYqiJ72zqeUki2eb932We!Gciryra+ z2Q-=D`S^<$F9OdaTr4n;b8!JNTqH$DdbJJ96~uD&&8ht-8X8iDwclsG3(tK4UlQTg2M-#=)KG{kh-h>h~HtUA71J`OnHxONdJ`7>Ql%#ccCxPCn&C*#IVwh}=6fb(~pxxbKS z#8CMSFOU7#aYm>UFott#{&Bs3l*4$LfvW=D361XS>Wb(qYFV#C6*)XKG)ShayH>CA zdW{+5_V8 z9mRZHP2&LZPiOu=Mf{P^`hQYN=5j~=$D-X;%(ZL(qt)XfVEA(w^#}QeP64I0@4X}p zG=_+8dyUZW%LZzvs$M?5Ek#l~`Vq#Y`yFjmz?+>r!N$J!R{+SnaKNg8{WZao6x%64 zDMNdPu5bs-QfNbTO~R8-@v&T{i+%AG=PSV9KgXz4W+fJqkT8)88X+Mez0;__f#VS= z47T-ob7?BrdCBZ}A`MXHm908{I*Lp{I5<216J1utTKeQkFCc0)GJ0xd6{%Vx2s9H? zc!${0ndmItV-AxZi-i|2zuxnLx!OfR!ezKP;du~CL$o6O!{BlIqRN|yiN>%@o6Tk5 z5_P7imYPHjkhAOSp5x-;*7vZS-}s10kN4csc--eqfB zm?)D>;NE>jN)L+RdB%hSTexNwZmTDd(!-jS{wHPQ->tE8N?GPLrwl-4C6}uo(UVJZ zaJs+)CH?mYCikz_oSbtJUdZPx#{d83sH9@v^lO1&bV?1#=E+iYxfF4{d^}@MtH&}@ z-f1e-(pd0!CuRyMbrm@Z_j*U{9u7w$&%oqP3=v?S7Bl_wN|z~FmdN&9tmpd}^A6~~ zB@a%h%}@U))@ZpeFoD3eLams(p|us)lRNV&CWaR@5+=P?wP2nz@)c-+1e8|yX7wf) z7Qjx|P~GJKpMjLj_c$oK{#gVWOkSazPYZPR5*$1mQZ!?n6des+I|~b)GezZq*r}4v zjlyGPZ9O&D11fT92$(>d7~au-~OzK4_XX}YiD&T6 zBNBwuWCfyrg)%w@$|WmkDDG6Im?)Ffek4o?K3EB>C%seU0m^kdLv`eT*|7eTc=7L6 zf&RJD-jdA{XAe+ULcxds+rxux=i2vH!Sfi81MP=#epAFM?E$gK-VdZ@Xn)%d}*x@{|p2i{Ix2cP|j{P#|M|3v_D5NBQ|aA9@|G-YXV)*;=t z(YwO`^NTncnX4|zvY|fXCmT*Q7=(3g&S0nc55KfqpKY0XNqB1!`OqgDQXPsv(s29* zLo7~>CYhNB)(PW8;zVqv5)P_fL!mlM(fI^MU#CR-!AT0mcaKc@eJiUIq&b3rRa^4FN5dFM& zQZZjYkv5N&N~3mX6AnMC*&e=I7J{RZ{T&@0e`boB-{{qPI(L72d1%HyP_?Q*H!H(; zviOj+wWG-DT>p$wvm(kB8g?x3TmY}-XW&oaewJ=ydsC&*N-UgcZL+65zs!e->Z) zl!Hk;GNRNJ7xb-E!*Xz`l6lo8lJc4|^%&0+e;1+|K!U#|KiiR8@1DWlX`*axZmCpg zfiDq&oYDYbvRNE}`6(&sXWEk{=1Q$6PR$uYiq$g(2eO7Zd1sS&1Y72_s%hC|%qfzF z16I}|weKIvmR-ca-RlhB<65ZI=@Y0a9IOhH6F&&N1T+b-k=#`;4np8gW=c_zr&OP7 ziV$f2^H0c2Fjfc1%D=FfxUIPVL;AHV4_)TD06K;=b~H&QmzVdR7hdYzRHA~#)cPP+ zC4UdKBP1m5T^w#u%wYrqXDvfRUY)()z!)5#@}1PwW~&dm>(=J^XxRZf1L$8GmokrI zMxmhwkGa9hnkt#Pb^h+L?X8U)`pB3D3}Q0g{fKSs*ukUo@wc{|mAP;Zxr`j;OuNR< z!&kh?x9-pd?wL)uEw*Udug|jFTp<8GU+;ql0++nGel^%$?=AUb(~1Yi32iJ^L#G$sRh7|Tj!f($C3g>=7eb_n#H+7 zO}QB8ryk2K<3~tX=^M73OB>vXo!d?Yem!_S+FLFJ`TB+iMXEk}bi=%<1S%z-$9G2< zt*t?{KHZ+=$nx|Vw2NJteGKhtUVr`-QDJ<^?gVW=@RrsW2AP#V^z}JxWJGs&cQ0Xg ztKTE(_oDKJvU$=BuzWZWhCTj14nO&eQfV*MbV8IOn}NQ%ahbWbAjE-lbF)yVT^QxD z=FTx#Z&PB?-Vqc&w*9H}SJ3I25@R)#k!b-a9sAk74AbtU8)Te zA<>{9><}}B0S38$cxYJ1YEs3)H+nQcT>e9rF%$jn(@#Voj*fjr)!5Krz0l9ISm6Uj zY}MKxMLgfIu<^;E#WO}=tr!*>s;Ho#r>&x*0tr}_V@=Q;57-BQgrvw~_)xe=;DucH zf+}yLM6O+9<0IkAkcVr2f>(C^8y89|}ekGzb z!Vwg(AjCKjKfEh{$W9oj{tg)}n|al35Mm(NVRlxQnUz`3uVpi;_gqlXNT38qbmK+# ztEX$BK_$S@SYZ2LDl4H_8IIm7q%vFu_4{ONN^y8{esJfTBLv`=4iXi;w3i1!OV(OZ zBxM`yLXpCOHDyL4T#A`bTSm0#xz{H{p;=hmvJ$~Wlc}}&Sro$b>*q8mQz$M&KfCWO zH8nrpQ)bi)u?Nc4wRAhaF)TGPt*~Fxy!b5i(5$@F#{0{F+O+L4L zywhvA!i<%B|3uH&mX6gVzjFnW*nHD zf>m~w*i6UlL9nmYnBicQ_6L9YF3GA!!v_AuS7w)APOhxuS_OAV*+TeCKISN7i;9UV zmGx?D5R|YSWH9*Zn~$!o$WB(37n)m8$(^NdisJJhMk0VAp^<-I$G|-_L3SCaYN-7N zS%2`r!LImUH^&d=ouHJ0iLl~>U|xU@XHOq!(D>Jo-+!v;%xwJ+5r#lZ5A*KccK%F< znk)AGr&@SuMxF6u*nv{Wbku@N^KEyF5|RtRw*zdI2*D93w7;nuz*>`Z9RK~ZiPVX9ZVaw6C^32O+TQdzKB|g z0}~(H%&CQyXEDvZtejP-E&KR|Bczmjv&&|8^$ z{?z{>4WZ`ig+T-k_|2QF09AXEve#t?2|xJwr&c!M%XVLi-q7a82HZkdPmebRYmxeM zG`JWU85v2`R9nq=-AR>;^5PKy=dD#p@D2B-y0QTg3juKEi}vuzmicyA%BI9LV-vva zVC{v@6?mq&X6$bQdxAOwPj%?s`=1%fA3L@>1>!nyG13h=WWw0dsjU+woq=X>svG{e z%VLoiEIGGgi)oHdJA7&O?o8b497NL$7PdyK6l;)DusWfj7Y*p?@*S~D#v*l zd$!jxw;ZWKA)mg&L15xa?dPr~L(vp?$?+2JUSr4|esYwoRX>3xm-)>z@ zLIUtkuqF9%M4D=u929o%-`MR;{(+l74WP!GLSXssJ8eera746Zuybo^YwQ10F6d2E z4%r&;JNUm_lxP|pG})}XL0Jj&2RNE1PoA7ZiuJYwmq4|@7#E0SPIW@43kQ{LnOpw~qz0yd z>KBv&P_5?nn2&!4V*Fb?TzcC5eSK_q#HeIydqjwX4@5gX(&{%gLvPXu_qzU_tu{A0 z`9Ac%h{!oqj(%s^Vv_&DRZfBvZ#WIAN5<+wVXKyHw_4_C2mG($ky&N7jb9woo~F8y zhF>6{G&2i;2_b+5HSXTdOgd|(j=jYU9cB@iir#8aNNoF1Sy=!F$$2JKhB&b~7v0%@ z^oP2-Bx@gXZl3H(r|WtZ?D*=#X-PP<&4cA);`HZXElVeFWo72hYw>=vn?v~6E0BWo zSTE?CMIw~!MYkS_ztq@`Iivd$`rKSxB5_}$(7cASnK9!1a2_@uI^3?m8vXwL9SXGF z>>?rPma2|M#Wll7nG_aB?F=%*+0S9J2K*?{q~WWH`ChyaQt=BHF9r?7k79Ln?!G#? zxhm6;aQ9W3Vo?t2NWIkBU0PBka~(=tA}^=8?0X;ft$gqt04xQXfsc=l_U+)B&#EV* zdCe-@tK#-}78)Y4;EuZstN9xb>>U?lJoY;Upol|2PG}523XGgBD8#{D1HMP(EZQj| zaopcUqB$NH4D?lDrUT+Ko3hDyICBIl1xK^G?Zypr8h%|t}MR1N8 ze2Sw4seny?!)kPq#;D{Q*Gm~|+TYl2H1_2hq>e)M4R1JBXH2l9J5`Ht6Hvg|y>aU? zwLf^?n6LKaQbtG9Ch7(D_n&VFHPY5rG<=khn=om9`!IG25~`zmRP5@Mq9yGiMy*e7}-Rgm3@FO@FCl#fmp67f?HuLc_6AEbpARe zO*nkTg1@nfde2*3h3uPx?XB8&o)Jla#4h?5Kn2_l3pvcjG?W#5R3XML-^)5|!>v7j zE{#rTE?9r^p8ey1D#Q6f`i2Nc?e*TVIn4E>sDq-yGKfyZJID??N`*^gx> z`^2fcV4a69Hr{pK@Nj=~3G6GZjCxjP`s=&8HY~gC!QR5Y$Q=Z9U3ph_h9djJx+MSX<(7Y|Ywyw9n;PN{uUoC~gSFh_Vjz2uv*f6_$To~+m zw3|XZ!F5S8T1}SBzPO@?7%puGE|1(D-x6lcEVN+*DuXW+nuw%B2awbaTSs=#w_C#2=%;hkjJRDA;jdv1X^Cl41~*EzaS}C=sWY-Q4GlQ~$f0VL4m*rz_$}J^!ZgmPk2c8Juu{W^(dgf& zxw`e}-9GMq@~6zG+$yVkf+u!ov!k4DZS2{n9)0EgsbOb*x&zt{ zpCDb{WEP+>Xx%Dxla8mpdNpkq8e|>Ca{TQ1XNaiy_)8D@)MSbS4T;SI*4M)N4tZ8pOxn-@!e? zGu;w}vs7)$=-dF2*wx*E($^CF+1c5|sF1L*n~}(z-3^>!#r(j4FJ|GmXustllF(2T zp1pl>jMl&P3P4D^lfA{Az`z1Oq@Mgi>lKPcK2fg%En9b67nN4d6U>X2@1LGiXDS&4J4PXP{LgcFMp$2f9H zW01&H4m`}j$&m8SVG8>~M8OYhSs3-(OZW$_312lO45%QLp)W6Y4@z11+Is!+P z`%@B}&JE6QU~cj~cLS&Z3%!*1JR#B%R`6%J7sm7Jiw=j?G)+ax5lEAkEiq$EE++^hiv#z_lmUj7bbc{|f zu=>GEaG|d>xz_eHF){l`8hrt13)o^IC54L@V{i4_7f77?y9SxtGW^I<4uTUh$?Z^^ zIO@1Fm02MW5)yKT)FFtUhx=B^*u2v+8e6%))?3oe>P!Ti3XKE1kpAV=g|C{rx{vL` z{q`dxPJ$;yr!-5{DY7E{DJd5wxWUDD1+N}W?hA(M0L}0JqQJpV>PLZt`8}lEy!fte zfdnH^DF0 zFF%?6G%V3$^BwV;M^Gr2(RAma6X%AT4=_SmLd!b$VMIA{WC8atGS0%kXh|@xGZSqcxA@%75?B>W>g@5d`(nF zn}jLLQUP*z=t1ys8~wdH#|P4drF9~XkU*JuzD1VQJhv_$zZn?W_|KuOT*f7_J#JMk&M)-gng;wl%6NA2@CUh z^@lFaG+rtTMLrl`on#s8b}k~06Qv!+<2))}#`^IKy>3(R?jC|E& ze{Yd%ef;XZBbkvXuCxp6eFf<+1GJ)ur5DB zi`@GjE#YzkMZ=0!;Oc7r4gUw|qBnf&pB*h1rY+9L`8Dj+JvS0tg4p?*K{>sV z{p~9?y<&3pk{moYacK0Y!$1j&l~9^M^MON*{@(C**h)%pl#m*lz<_nCy|~Z=U4mXU zHh%EY@}t!@)6<3G%gm+CEu3a0{ZAvsvsO}ej!3Rc>?iK9GIH|K52j}=?QIw)3T_nC zYwtfpKeD3p|tb+umTD$Tbap z;Tb)$RN>iz1ckPkps9lX_0#iXUiwD4S?O~=Se^Avj@+2UmGGbQ683NMZSCuvFWwCC z=?^qrO-l;*sroXIr&2Mmt)1*lL{{2ZJ=ata@J{Ny>t;WF?TKqqMk4laAED1YR(G-v ze`}eT*5MMJO6O2UyIa@a2cw#55Ux_X{h?Hf<<9PQUs_uCMn4H>tJyYNM#w;>RCt{A zam=ml{4eS5$e>8jbn_K%Rp!2VFqg_G_KwiJ%_-0ey?G@8fh6ufy7G_`keMnRWtTyYOE;XqLE{HT2}<&cn3xt2*Z4t6}LvMa60R?Bu+lIV8p zNtsLzRwC3pz6R!=Fpt1!pW>yRiuG3V@q`_J?2YL=U#F?_&K(VlnrRJG--} zl$R))HJWg2|9TtDl1wzc0oO%6(rz*u0qcjf^5-1T)9O7HJLBZ>VKy5In^nDZmM=2W zpM37Cu#g+w9o^nE)B5NhOQ@WBGP#FjERnzr=d3LIwvHagQPFAT#kVMGz=?Wh{i&?D z@y9fCGXwL))VLRb@u`Un=6gC5!7w!Mr8Y>PS1w6iNi{T7XGk5p%7Y8eItUgdtD2q} zz3y+J=Q1bkpQuMFt-Oh5jxK+KD4ZH==zc!V$9PzcxOUbjPZQRb>gC8}!RJR4Wg6 z1-y9Cor6TkTJi~h#(Rl~fZzE$gNR`|30 zW0I2^<+H|VUD>kXiprvMF*b+T`Mv`3I#NmV#L&?0@0$piDXGum==b5eAfgO?LR<4s8={uzbMQmklnk?lS&H(} z`jUb|;_+Kq&c{XK=xTOLThi_hjGnxoe4wk=>-YG(55qUyAEf)II)*HyE{}}sUpZw@ zvRk{*XTF+4E9;!w&(rxXr^`$?=y{u%WS>=)sXK>K-C4VFYiNaG{mKX4I5zH8T&9_M zJ`0ULkx(+H{Z#BAeDBL8)DBgyJ-GC_(i=)^=V|Ml<$nqu?~W4Fh{sDb|J=Qr7gc)Glz8_i^`8GHYo-`l}#eU?p8@Qd)LSqI*RJ;rApp@mw|G z=wI;yFKV!GSY4I&Nv|ULwO&|g1z40$W$>trM?cjR8tT4ik+_+`y}3M}rds{;u`}q7 zHV;pE*-(r74?=?n6;BkRYc~a43yn5R6*@3;tAc5hs}rXJ?ww41>vgSTs0GuM>2c-y z&u*q{d3KHqKr#~=*6QW0^{#Rq_z7BLJBGHx+h{-8v8qZw;dKVDbs)qGbY9JTw;O{z zAAxm2t;dRd&q&3w=N~_b-AgEMS0}Z7JQ<#`ic#(g7*@9)&8yeW-oWQ18?Sj)0R8uaceGt zyLS7a36(iZ9bUD%QK$v4z_w(dvvrbWgZr+0h^L?b)AR9MITln;%VwkIvK>xOYg08y z8$Q2I8F+XI-e@eGenq#EmX>}Vumi}Y{Obk4uLG|hdQhbZm4`n(gH+j&Z)7vl{^-7)UqP+Iczj)`&X+1b?^SvviNo5ym?c@EA z`DCE>WZ+6oWa^IKQPy5f+;YL7vi^5K!Ipl)xBoB#GA6{IuvHRc^o0+Bidh(r4kvtJ zy_4pQo4h4ls*mWp_+Exmk8u?91L=7juw=?<`efx(kyOV0K5N5qHgR^7Z?`lF0PN@+ z1x%=GL(M!Xwz|xducwn^N5A?e2r2BDAGfMckwPtsK5K=II3pb#l24?$)VIXFc3Vk#quuui^G! z4>4jAjKs5Ul#>xN0hN?n;50trI{4>Ha8A<;gNs-WdcMoJr>L}7+P)zwmIgsn&Qnvr zl$&?Hk+Jag@zMSZ3ea^)CwGS{d5P?#0(srxeUb9fwx{9r1O1BIBv#3d5X+{T;ErW| z!YyS;fJsG*+k!AyVQkO*kckJXaNw^5Fe(_hQo<}7u7eB8N>9Hp>0;ba4*?Rja4zd4(0zP-&pnLjpBzSdc0VD|^QcK$ zcy5xA$PqY_LOSn0i~V1Y{i1Mso)y0*VEJvhihAT^G{lbCam7n=I)vB*x-IE$Puoie zY+VK@Q3j8>R{qeXxc0gr!cn=2;|?cJW>3jLY>FZb`= z3mw&0dOBvg82p~x(9wnF`SI1z2pt14yVe4{2rN3#l(#4tijNM(D`4JdaypdyO$WjH z9m~Hpz<;lbX5aA(!1)DGY>xunNcF>-E6Gj+bFEm5=+(ujocuC-&;c?`np&8ssBEcv zZ>wh!i$Y0$+kyX^Q_#P4tuy@d1?yXnj)Nm%rPKoSQ^A&hd#*%~&ZKUSAxUD28O2P$ zT~hHiFV)%A-sho1xgh=sh=b&J^6w%J%#7B@g$9B=HBY-*v=s_)R>GW@=gDS+^)OK~ zDpRJu?1(gkpasRaO&o9LK!Lh4pfjpM$i-$-@3!*}3YhLja{3}TRfu@yX(opG&Ysf@ zODpT@z^O|%K)0wpCWgX=ktoc=d9dz^vgOe?!2X8QyM{PIxInNQ5AIa2&{j7fSGbsx z{qG%>L_tqJza1p!aWM8@c1+z)syMkiPtOH`x9IjT`JyG6+_GEkIvgsW5sB!w=&ml? z(S`QZNyfEuZX(o6)RVNDX|!U-`kjDm7xhOjDdI{(N`+vnWmn@p%CkAU!!bsfFAEGMw4v%k3CEr(KQT znLFN-k^-^=3mHgh`J4)pSOH>;P4r`(A_m;7KxE%AG5JXm@_YRJTwi~*;+IBBtbCly zWt80@#HRxj_Q;1l$e_hr#zlcfBVB{Qq=6yRC~1KR@)!F0;9OTp`sB%D$n0$8!L+Da zXzNS6Cn2l5)yGjZ#`E#@4yHL4;l!0sp3KdKa`IT9Rt(MX{)DB5!KNHj@^Eg*ybpbSURX4&k+W+i2g3@WTO z_dMLnPj4!FvP=;G!~r;^wnZ-Ds^^j4>Q1bAZgLnh`ln7xOT45N0z>;rqZFvcQp=6* z5Fk>0d)7@Qaf+VnurqWacKbmAQOjw@G#!5bEa_HdsU(*Sk8C-?}w^l_#6Ws{&BLF#fsT{LVEB|)n>3#rfUI11`(A?xTcdWdIX01m(*{e%y zq4_jK{bIo-tAuP#vQZ7Vjl0R3Vaa%RZPs*h_e}1_VydS{2CTv1^3c!CD+6dM`C#KN z$#hqlRvw#z(k+;?i?VG-ZEN@`*O7^dZ*+b70_R2PL`-Ewx}c|mToOE4303rk_aQf$BR{7Z>!$nU5?B-&)Yl2%paP;_Qzv2Yh^1||&4*%7?<=ERveE49 ztOX{(Og+^w^ya)C=P=vqKipBYD*51J4wl(niCulSFGldMR{*BkqM(~AJ{K=R`Qge( zZ6;nbxII=Zi(gJl)w_USx9%r%v$JPxY_ccVmO>nBBQy~~%#XzwBUAq2f6b3eopN&o zmj~q?EI6P=uK4qYp|fjGE<^28BTVyd2~LUYF#G`-eeQ!44abs0S$GV2{IGfSIHx~; zb?LB03aey36ctt4dwq3}RD5zWkV&h9cU-@=g!c(U3NxPwM!LSGo%W_J{&A=Lv)jCv1((`Z<#EOv z+MCC_um>~+&47r=L91?>A4kMDntS>gr?P=dv5ixi35#|+=Zc+AvmrYmpHrrJrNPV9&%DXXWGG(FF7_Q?;Ho=?48|q`KVg2X>nhRb_GseqPZ$U$ zD{8}7CF#r)V5)9W!11CP1qjrkIQy&Ux$I#B-mDA7xN9bBbZlVRyJZx<%?Fa|Z*-DN zgFL}KAi$M~Lj=6G+{YRAX15KH%TvGFGU%K<`@&0Fvb1WBU58uoWH%WAEyoTbJ$?sI z@4mek#A8dRmx4s2jA>Zq;a42D8r)IGgG3WwwoT@(;h2M6VWooDM10vv(y=#s^roih z9}l17X+iJXNAKrqnKK{h{!73rbSiXqDkxQ~Iz_2V#=urlLma?YtbdAyprhv9WTzqX zO%K9)^R20wWlAzI=yz9umJdegD7ypS`;Vu>WU8>2kk>;{M{ne>?OBY4U-y0A%LcjL ze)La$5BqFV*N4`7%)UwcN9VHfp6}R?bzfu&bD^8p-uwURCn#lQhozCUPrG%r+uDtp MnOdFALplHc-wBr8-~a#s literal 65657 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

J-t(C?D*vNbSd$Mpldw%6G^3`$t6)P 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 O*JNyHeySLKDeAvN*8HCU From 7cf7228558a5e3552f2f33f67250f49c06f271fa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2026 13:55:10 +0000 Subject: [PATCH 4/6] * refresh the application screenshot --- screenshots/main-window.png | Bin 66235 -> 66376 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshots/main-window.png b/screenshots/main-window.png index a9ceb7f7ce233693ac240e941d4af64380209648..2a058ead27892fdb76bbf4f91b5aa1feb0b1dbf2 100644 GIT binary patch delta 28024 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 Date: Wed, 28 Oct 2026 06:49:48 +0100 Subject: [PATCH 5/6] # reject ambiguous firmware payloads before writing an image Adding a second named payload to Intel HEX could silently discard a file because the shared image builder kept only the first payload in filesystem enumeration order. Reject multiple non-metadata payloads, including an empty first payload, before any output is written. Tests verify creation refusal and byte-preserving add refusal. Verified all three regressions fail before the fix and pass after it, 93 focused tests, 34280 required tests with 1582 skips and no failures, and three package documentation checks. --- .../FirmwareHex/FirmwareHexPayloadTests.cs | 37 +++++++++++++++++++ .../FirmwareHexWriter.cs | 5 ++- 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 Compression.Tests/FirmwareHex/FirmwareHexPayloadTests.cs diff --git a/Compression.Tests/FirmwareHex/FirmwareHexPayloadTests.cs b/Compression.Tests/FirmwareHex/FirmwareHexPayloadTests.cs new file mode 100644 index 000000000..bbbc898af --- /dev/null +++ b/Compression.Tests/FirmwareHex/FirmwareHexPayloadTests.cs @@ -0,0 +1,37 @@ +using Compression.Registry; +using FileFormat.FirmwareHex; + +namespace Compression.Tests.FirmwareHex; + +[TestFixture] +public sealed class FirmwareHexPayloadTests { + [TestCase(false)] + [TestCase(true)] + public void Create_RejectsMultiplePayloadsWithoutWritingOutput(bool emptyFirst) { + var descriptor = new IntelHexFormatDescriptor(); + using var output = new MemoryStream(); + var inputs = new[] { + ArchiveInputInfo.InMemory("first.bin", emptyFirst ? [] : [1, 2, 3]), + ArchiveInputInfo.InMemory("second.bin", [9, 8, 7]), + }; + + Assert.Throws(() => + ((IArchiveCreatable)descriptor).Create(output, inputs, new FormatCreateOptions())); + Assert.That(output.Length, Is.Zero); + } + + [Test] + public void Add_RejectsAnotherPayloadWithoutChangingTheArchive() { + var descriptor = new IntelHexFormatDescriptor(); + using var archive = new MemoryStream(); + ((IArchiveCreatable)descriptor).Create(archive, + [ArchiveInputInfo.InMemory("firmware.bin", [1, 2, 3])], new FormatCreateOptions()); + var original = archive.ToArray(); + archive.Position = 0; + + Assert.Throws(() => ((IArchiveModifiable)descriptor).Add(archive, + [ArchiveInputInfo.InMemory("ADD.BIN", [9, 8, 7])])); + Assert.That(archive.ToArray(), Is.EqualTo(original)); + } + +} diff --git a/Hawkynt.FileFormats.FileSystems/FileFormats/FileFormat.FirmwareHex/FirmwareHexWriter.cs b/Hawkynt.FileFormats.FileSystems/FileFormats/FileFormat.FirmwareHex/FirmwareHexWriter.cs index 6c7d4b452..1c9e17266 100644 --- a/Hawkynt.FileFormats.FileSystems/FileFormats/FileFormat.FirmwareHex/FirmwareHexWriter.cs +++ b/Hawkynt.FileFormats.FileSystems/FileFormats/FileFormat.FirmwareHex/FirmwareHexWriter.cs @@ -33,6 +33,7 @@ public static class FirmwareHexWriter { /// one the reader rendered. An input list with no payload describes an image /// with no data, which both formats can write. /// + /// More than one non-metadata payload is supplied. public static FirmwareImage ImageFrom(IReadOnlyList inputs, string sourceFormat) { ArgumentNullException.ThrowIfNull(inputs); @@ -53,7 +54,9 @@ public static FirmwareImage ImageFrom(IReadOnlyList inputs, st } // Any other single input is the payload, whatever it is called: a caller // converting a .bin into a .hex should not have to rename it first. - payload ??= input.ReadContent(); + if (payload is not null) + throw new InvalidDataException($"{sourceFormat} represents one logical firmware payload; multiple payload inputs are ambiguous."); + payload = input.ReadContent(); } List<(uint Address, byte[] Data)> segments; From 3bfa3ff940ece8edaa86ce1258785559340d8882 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Thu, 29 Oct 2026 08:00:52 +0100 Subject: [PATCH 6/6] # classify JPEG listing timing in the performance tier Required CI failed when a JPEG listing timing check took 104 ms against a 100 ms wall-clock budget. The test had no Performance category, so it ran in the required tier despite the repository policy for timing checks. Mark only that test as Performance; preserve its threshold and assertions, and leave the other JPEG metadata and extraction tests required. Release solution build and all five JPEG checks pass. Category discovery selects exactly the timing check in the Performance tier. --- Compression.Tests/PngCrushAdapters/JpegLazyMetadataTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Compression.Tests/PngCrushAdapters/JpegLazyMetadataTests.cs b/Compression.Tests/PngCrushAdapters/JpegLazyMetadataTests.cs index 7badab4ee..12489ba6f 100644 --- a/Compression.Tests/PngCrushAdapters/JpegLazyMetadataTests.cs +++ b/Compression.Tests/PngCrushAdapters/JpegLazyMetadataTests.cs @@ -60,7 +60,7 @@ public void Scanner_GracefullyHandlesNonJpegBytes() { Assert.That(meta, Is.EqualTo(new FrameMetadata(0, 0, 24, false))); } - [Test] + [Test, Category("Performance")] public void List_PaddedJpeg_CompletesUnderHundredMs_AndDoesNotDecodePixels() { // The legacy code path called JpegReader.FromStream from List(), which // forces a full pixel decode. To prove that path is dead, we build a JPEG