Repository: vla/BloomFilter.NetCore Branch: main Commit: c2885f904b7e Files: 147 Total size: 1.1 MB Directory structure: gitextract_745aaz2k/ ├── .gitignore ├── BloomFilter.NetCore.sln ├── Directory.Build.props ├── Directory.Packages.props ├── LICENSE ├── README.md ├── README.zh-CN.md ├── VERSION ├── build.cmd ├── build.sh ├── nuget_push.cmd ├── sign.snk ├── src/ │ ├── BloomFilter/ │ │ ├── Annotations.cs │ │ ├── AsyncLock.cs │ │ ├── BinaryHelper.cs │ │ ├── BloomFilter.csproj │ │ ├── BloomFilterConstValue.cs │ │ ├── BloomFilterExtensions.cs │ │ ├── Configurations/ │ │ │ ├── BloomFilterOptions.cs │ │ │ ├── FilterMemoryOptions.cs │ │ │ ├── FilterMemoryOptionsExtension.cs │ │ │ └── IBloomFilterOptionsExtension.cs │ │ ├── DefaultBloomFilterFactory.cs │ │ ├── DefaultFilterMemorySerializer.cs │ │ ├── Filter.cs │ │ ├── FilterBuilder.cs │ │ ├── FilterMemory.cs │ │ ├── FilterMemorySerializerParam.cs │ │ ├── FilterRedisBase.cs │ │ ├── HashAlgorithms/ │ │ │ ├── Adler32.cs │ │ │ ├── Crc32.cs │ │ │ ├── Crc64.cs │ │ │ ├── HashCrypto.cs │ │ │ ├── Internal/ │ │ │ │ ├── Adler32.cs │ │ │ │ ├── Crc32.Arm.cs │ │ │ │ ├── Crc32.Table.cs │ │ │ │ ├── Crc32.Vectorized.cs │ │ │ │ ├── Crc32.cs │ │ │ │ ├── Crc64.Table.cs │ │ │ │ ├── Crc64.Vectorized.cs │ │ │ │ ├── Crc64.cs │ │ │ │ ├── FNV1.cs │ │ │ │ ├── FNV1a.cs │ │ │ │ ├── ModifiedFNV1.cs │ │ │ │ ├── Murmur128BitsX64.State.cs │ │ │ │ ├── Murmur128BitsX64.cs │ │ │ │ ├── Murmur128BitsX86.State.cs │ │ │ │ ├── Murmur128BitsX86.cs │ │ │ │ ├── Murmur32BitsX86.State.cs │ │ │ │ ├── Murmur32BitsX86.cs │ │ │ │ ├── NonCryptoHashAlgorithm.cs │ │ │ │ ├── ThrowHelper.cs │ │ │ │ ├── VectorHelper.cs │ │ │ │ ├── XxHash128.cs │ │ │ │ ├── XxHash3.cs │ │ │ │ ├── XxHash32.State.cs │ │ │ │ ├── XxHash32.cs │ │ │ │ ├── XxHash64.State.cs │ │ │ │ ├── XxHash64.cs │ │ │ │ └── XxHashShared.cs │ │ │ ├── LCGWithFNV.cs │ │ │ ├── Murmur128BitsX64.cs │ │ │ ├── Murmur128BitsX86.cs │ │ │ ├── Murmur32BitsX86.cs │ │ │ ├── RNGWithFNV.cs │ │ │ ├── XXHash128.cs │ │ │ ├── XXHash3.cs │ │ │ ├── XXHash32.cs │ │ │ └── XXHash64.cs │ │ ├── HashFunction.cs │ │ ├── HashMethod.cs │ │ ├── IBloomFilter.cs │ │ ├── IBloomFilterFactory.cs │ │ ├── IFilterMemorySerializer.cs │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── ServiceCollectionExtensions.cs │ │ └── StringSpanExtensions.cs │ ├── BloomFilter.CSRedis/ │ │ ├── BloomFilter.CSRedis.csproj │ │ ├── Configurations/ │ │ │ ├── FilterCSRedisOptions.cs │ │ │ ├── FilterCSRedisOptionsExtension.cs │ │ │ └── ServiceCollectionExtensions.cs │ │ ├── FilterCSRedis.cs │ │ └── FilterCSRedisBuilder.cs │ ├── BloomFilter.EasyCaching/ │ │ ├── BloomFilter.EasyCaching.csproj │ │ ├── Configurations/ │ │ │ ├── FilterEasyCachingRedisExtension.cs │ │ │ ├── FilterEasyCachingRedisOptions.cs │ │ │ └── ServiceCollectionExtensions.cs │ │ ├── FilterEasyCachingBuilder.cs │ │ └── FilterEasyCachingRedis.cs │ ├── BloomFilter.FreeRedis/ │ │ ├── BloomFilter.FreeRedis.csproj │ │ ├── Configurations/ │ │ │ ├── FilterFreeRedisOptions.cs │ │ │ ├── FilterFreeRedisOptionsExtension.cs │ │ │ └── ServiceCollectionExtensions.cs │ │ ├── FilterFreeRedis.cs │ │ └── FilterFreeRedisBuilder.cs │ └── BloomFilter.Redis/ │ ├── BloomFilter.Redis.csproj │ ├── Configurations/ │ │ ├── FilterRedisOptions.cs │ │ ├── FilterRedisOptionsExtension.cs │ │ └── ServiceCollectionExtensions.cs │ ├── FilterRedis.cs │ ├── FilterRedisBuilder.cs │ ├── IRedisBitOperate.cs │ └── RedisBitOperate.cs └── test/ ├── BenchmarkTest/ │ ├── BenchmarkTest.csproj │ ├── FreeRedisBenchmark.cs │ ├── Helper.cs │ ├── MemoryBenchmark.cs │ ├── Program.cs │ └── RedisBenchmark.cs ├── BloomFilter.Redis.Test/ │ ├── BloomFilter.Redis.Test.csproj │ ├── BloomFilterCSRedisTest.cs │ ├── BloomFilterEasyCachingRedisTest.cs │ ├── BloomFilterFreeRedisTest.cs │ ├── BloomFilterRedisTest.cs │ ├── ConfigurationsTest.cs │ ├── RedisBitOperateTest.cs │ └── Utilitiy.cs ├── BloomFilterTest/ │ ├── AsyncLockTests.cs │ ├── BloomFilterTest.cs │ ├── BloomFilterTest.csproj │ ├── ConfigurationsTest.cs │ ├── FluentFilterBuilderTest.cs │ ├── HashAlgorithms/ │ │ ├── Adler32Test.cs │ │ ├── CrcTest.cs │ │ ├── FNVTest.cs │ │ ├── Murmur3Test.cs │ │ ├── TestPayloadParameter.cs │ │ └── XxHashTest.cs │ ├── ImportExportTest.cs │ ├── IssuesTest.cs │ ├── SerializerTest.cs │ ├── Utilitiy.cs │ ├── ValueTypeTest.cs │ └── xunit.runner.json ├── Demo/ │ ├── BloomFilterMemory.cs │ ├── BloomFilterRedis.cs │ ├── Demo.csproj │ ├── Program.cs │ └── TestExcute.cs └── PerformanceTest/ ├── GeneralPerformance.cs ├── HashErrRate.cs ├── HashSpeed.cs ├── Helper.cs ├── Issues_2.cs ├── PerformanceTest.csproj ├── Program.cs └── TestExcute.cs ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ # Build results [Dd]ebug/ [Rr]elease/ x64/ app.publish/ [Bb]in/ [Oo]bj/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* # Visual Studio *.suo *.user *.sln.docstates *.sln.ide/ project.lock.json # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm #GhostDoc *.GhostDoc.xml # NuGet Packages Directory packages/ # Windows image file caches Thumbs.db ehthumbs.db # Folder config file Desktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ # Mac crap .DS_Store #################### # # Current Project # #################### .vs/ artifacts/ *.log /test/BenchmarkTest/BenchmarkDotNet.Artifacts ================================================ FILE: BloomFilter.NetCore.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{8D22B289-3A76-4399-BDA3-FD1B699B2F13}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{BFDF8E72-A7F7-4894-8782-74BB34438F99}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Demo", "test\Demo\Demo.csproj", "{42A8F6A2-7CE7-493F-B3A7-07A1753F5285}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BloomFilter", "src\BloomFilter\BloomFilter.csproj", "{E9FB2A60-8EFE-49E9-98FE-D75A076CAD0F}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BloomFilterTest", "test\BloomFilterTest\BloomFilterTest.csproj", "{24193FBE-88A5-4C26-9996-341DEBE0CA80}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PerformanceTest", "test\PerformanceTest\PerformanceTest.csproj", "{D46EEAAF-36FD-4297-9381-1845C93D13C4}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BloomFilter.Redis", "src\BloomFilter.Redis\BloomFilter.Redis.csproj", "{4A858860-7405-43F4-9132-0DF40BADBDAD}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BloomFilter.Redis.Test", "test\BloomFilter.Redis.Test\BloomFilter.Redis.Test.csproj", "{C02DC47A-7258-4B59-AAB4-DFA208DE9B36}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkTest", "test\BenchmarkTest\BenchmarkTest.csproj", "{CFB47A7F-580A-4F4B-940D-03D99EE70C41}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BloomFilter.CSRedis", "src\BloomFilter.CSRedis\BloomFilter.CSRedis.csproj", "{903B0A3A-1753-47CA-ADBC-B4379FF8F372}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BloomFilter.EasyCaching", "src\BloomFilter.EasyCaching\BloomFilter.EasyCaching.csproj", "{C4AFDCB8-077D-463A-9EF9-D2F8723F01F4}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BloomFilter.FreeRedis", "src\BloomFilter.FreeRedis\BloomFilter.FreeRedis.csproj", "{311303FD-7ABA-4C7D-AA5C-90E265FA04A7}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {42A8F6A2-7CE7-493F-B3A7-07A1753F5285}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {42A8F6A2-7CE7-493F-B3A7-07A1753F5285}.Debug|Any CPU.Build.0 = Debug|Any CPU {42A8F6A2-7CE7-493F-B3A7-07A1753F5285}.Release|Any CPU.ActiveCfg = Release|Any CPU {42A8F6A2-7CE7-493F-B3A7-07A1753F5285}.Release|Any CPU.Build.0 = Release|Any CPU {E9FB2A60-8EFE-49E9-98FE-D75A076CAD0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E9FB2A60-8EFE-49E9-98FE-D75A076CAD0F}.Debug|Any CPU.Build.0 = Debug|Any CPU {E9FB2A60-8EFE-49E9-98FE-D75A076CAD0F}.Release|Any CPU.ActiveCfg = Release|Any CPU {E9FB2A60-8EFE-49E9-98FE-D75A076CAD0F}.Release|Any CPU.Build.0 = Release|Any CPU {24193FBE-88A5-4C26-9996-341DEBE0CA80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {24193FBE-88A5-4C26-9996-341DEBE0CA80}.Debug|Any CPU.Build.0 = Debug|Any CPU {24193FBE-88A5-4C26-9996-341DEBE0CA80}.Release|Any CPU.ActiveCfg = Release|Any CPU {24193FBE-88A5-4C26-9996-341DEBE0CA80}.Release|Any CPU.Build.0 = Release|Any CPU {D46EEAAF-36FD-4297-9381-1845C93D13C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D46EEAAF-36FD-4297-9381-1845C93D13C4}.Debug|Any CPU.Build.0 = Debug|Any CPU {D46EEAAF-36FD-4297-9381-1845C93D13C4}.Release|Any CPU.ActiveCfg = Release|Any CPU {D46EEAAF-36FD-4297-9381-1845C93D13C4}.Release|Any CPU.Build.0 = Release|Any CPU {4A858860-7405-43F4-9132-0DF40BADBDAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4A858860-7405-43F4-9132-0DF40BADBDAD}.Debug|Any CPU.Build.0 = Debug|Any CPU {4A858860-7405-43F4-9132-0DF40BADBDAD}.Release|Any CPU.ActiveCfg = Release|Any CPU {4A858860-7405-43F4-9132-0DF40BADBDAD}.Release|Any CPU.Build.0 = Release|Any CPU {C02DC47A-7258-4B59-AAB4-DFA208DE9B36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C02DC47A-7258-4B59-AAB4-DFA208DE9B36}.Debug|Any CPU.Build.0 = Debug|Any CPU {C02DC47A-7258-4B59-AAB4-DFA208DE9B36}.Release|Any CPU.ActiveCfg = Release|Any CPU {C02DC47A-7258-4B59-AAB4-DFA208DE9B36}.Release|Any CPU.Build.0 = Release|Any CPU {CFB47A7F-580A-4F4B-940D-03D99EE70C41}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CFB47A7F-580A-4F4B-940D-03D99EE70C41}.Debug|Any CPU.Build.0 = Debug|Any CPU {CFB47A7F-580A-4F4B-940D-03D99EE70C41}.Release|Any CPU.ActiveCfg = Release|Any CPU {CFB47A7F-580A-4F4B-940D-03D99EE70C41}.Release|Any CPU.Build.0 = Release|Any CPU {903B0A3A-1753-47CA-ADBC-B4379FF8F372}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {903B0A3A-1753-47CA-ADBC-B4379FF8F372}.Debug|Any CPU.Build.0 = Debug|Any CPU {903B0A3A-1753-47CA-ADBC-B4379FF8F372}.Release|Any CPU.ActiveCfg = Release|Any CPU {903B0A3A-1753-47CA-ADBC-B4379FF8F372}.Release|Any CPU.Build.0 = Release|Any CPU {C4AFDCB8-077D-463A-9EF9-D2F8723F01F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C4AFDCB8-077D-463A-9EF9-D2F8723F01F4}.Debug|Any CPU.Build.0 = Debug|Any CPU {C4AFDCB8-077D-463A-9EF9-D2F8723F01F4}.Release|Any CPU.ActiveCfg = Release|Any CPU {C4AFDCB8-077D-463A-9EF9-D2F8723F01F4}.Release|Any CPU.Build.0 = Release|Any CPU {311303FD-7ABA-4C7D-AA5C-90E265FA04A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {311303FD-7ABA-4C7D-AA5C-90E265FA04A7}.Debug|Any CPU.Build.0 = Debug|Any CPU {311303FD-7ABA-4C7D-AA5C-90E265FA04A7}.Release|Any CPU.ActiveCfg = Release|Any CPU {311303FD-7ABA-4C7D-AA5C-90E265FA04A7}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {42A8F6A2-7CE7-493F-B3A7-07A1753F5285} = {BFDF8E72-A7F7-4894-8782-74BB34438F99} {E9FB2A60-8EFE-49E9-98FE-D75A076CAD0F} = {8D22B289-3A76-4399-BDA3-FD1B699B2F13} {24193FBE-88A5-4C26-9996-341DEBE0CA80} = {BFDF8E72-A7F7-4894-8782-74BB34438F99} {D46EEAAF-36FD-4297-9381-1845C93D13C4} = {BFDF8E72-A7F7-4894-8782-74BB34438F99} {4A858860-7405-43F4-9132-0DF40BADBDAD} = {8D22B289-3A76-4399-BDA3-FD1B699B2F13} {C02DC47A-7258-4B59-AAB4-DFA208DE9B36} = {BFDF8E72-A7F7-4894-8782-74BB34438F99} {CFB47A7F-580A-4F4B-940D-03D99EE70C41} = {BFDF8E72-A7F7-4894-8782-74BB34438F99} {903B0A3A-1753-47CA-ADBC-B4379FF8F372} = {8D22B289-3A76-4399-BDA3-FD1B699B2F13} {C4AFDCB8-077D-463A-9EF9-D2F8723F01F4} = {8D22B289-3A76-4399-BDA3-FD1B699B2F13} {311303FD-7ABA-4C7D-AA5C-90E265FA04A7} = {8D22B289-3A76-4399-BDA3-FD1B699B2F13} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {12D6ACDC-31C9-4A69-BE24-76E0F73E48A6} EndGlobalSection EndGlobal ================================================ FILE: Directory.Build.props ================================================ $(Ver) $(Ver) 2019-2023 v.la v.la@live.cn A bloom filter implementation bloom filter $(MSBuildThisFileDirectory)/artifacts Bloom;Filter;bloom-filter latest false icon.png https://github.com/vla/BloomFilter.NetCore MIT MIT git://github.com/vla/BloomFilter.NetCore git master true true True False $(MSBuildThisFileDirectory)/sign.snk ================================================ FILE: Directory.Packages.props ================================================ true false ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2018 v.la@live.cn Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # BloomFilter.NetCore [![License MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://opensource.org/licenses/MIT) [![.NET](https://img.shields.io/badge/.NET-6.0%20|%207.0%20|%208.0%20|%209.0%20|%2010.0-blue.svg)](https://dotnet.microsoft.com/) A high-performance, feature-complete Bloom filter library for .NET, supporting both in-memory and distributed Redis backends. [中文文档](README.zh-CN.md) ## Table of Contents - [Overview](#overview) - [Key Features](#key-features) - [Packages & Status](#packages--status) - [Architecture](#architecture) - [Core Functionality](#core-functionality) - [Installation](#installation) - [Quick Start](#quick-start) - [Usage Examples](#usage-examples) - [In-Memory Mode](#in-memory-mode) - [Dependency Injection](#dependency-injection) - [Redis Distributed Mode](#redis-distributed-mode) - [Hash Algorithms](#hash-algorithms) - [Performance Benchmarks](#performance-benchmarks) - [Advanced Usage](#advanced-usage) - [API Reference](#api-reference) - [Contributing](#contributing) - [License](#license) ## Overview BloomFilter.NetCore is an enterprise-grade Bloom filter library designed for the .NET ecosystem. A Bloom filter is a space-efficient probabilistic data structure used to test whether an element is a member of a set. Its core characteristics are: - **Space Efficient**: Extremely small memory footprint compared to traditional HashSets - **O(1) Time Complexity**: Both add and query operations execute in constant time - **Probabilistic**: May return false positives but never false negatives This project provides two major implementation types: 1. **In-Memory Bloom Filter (FilterMemory)**: BitArray-based in-memory implementation, suitable for single-process scenarios 2. **Distributed Bloom Filter (FilterRedis series)**: Redis-backed distributed implementation, supports concurrent access from multiple applications ### Primary Use Cases - **Cache Penetration Protection**: Prevent malicious queries for non-existent data from bypassing cache - **Deduplication**: URL deduplication, email deduplication, user ID deduplication, etc. - **Recommendation Systems**: Check if a user has seen specific content - **Web Crawlers**: Check if URLs have been crawled - **Distributed Systems**: Share state checks across multiple service instances - **Big Data**: Existence checks for massive datasets ## Key Features ### 🎯 Flexible Configuration - **Fully Configurable Parameters**: Bit array size (m), number of hash functions (k) - **Automatic Parameter Calculation**: Automatically calculate optimal parameters based on tolerable false positive rate (p) and expected element count (n) - **20+ Hash Algorithms**: Support for CRC, MD5, SHA, Murmur, LCGs, xxHash, or custom algorithms ### ⚡ High Performance - **Fast Generation**: Bloom filter generation and operations are extremely fast - **Optimized Implementation**: Uses Span, ReadOnlyMemory for zero-copy operations - **Unsafe Code Optimization**: Uses unsafe code blocks in performance-critical paths - **Rejection Sampling**: Implements rejection sampling and hash chaining, considering avalanche effect for improved hash quality ### 🔒 Concurrency Safe - **Thread-Safe**: Uses AsyncLock mechanism for safe multi-threaded concurrent access - **Async Support**: Comprehensive async/await support with async versions of all operations - **Distributed Locking**: Redis implementations support concurrent access across applications ### 🌐 Multiple Backend Support - **StackExchange.Redis**: Officially recommended Redis client - **CSRedisCore**: High-performance Redis client - **FreeRedis**: Lightweight Redis client - **EasyCaching**: Supports EasyCaching abstraction layer, switchable cache providers ### 📦 Modern .NET Support - **Multi-Framework Support**: net462, netstandard2.0, net6.0, net7.0, net8.0, net9.0, net10.0 - **Dependency Injection**: Native support for Microsoft.Extensions.DependencyInjection - **Nullable Reference Types**: Enabled for improved code safety ## Packages & Status | Package | NuGet | Description | |---------|-------|-------------| |**BloomFilter.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.NetCore)| Core package with in-memory Bloom filter | |**BloomFilter.Redis.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.Redis.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.Redis.NetCore)| StackExchange.Redis implementation | |**BloomFilter.CSRedis.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.CSRedis.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.CSRedis.NetCore)| CSRedisCore implementation | |**BloomFilter.FreeRedis.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.FreeRedis.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.FreeRedis.NetCore)| FreeRedis implementation | |**BloomFilter.EasyCaching.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.EasyCaching.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.EasyCaching.NetCore)| EasyCaching integration | ## Architecture ### Core Interface Layer ``` IBloomFilter (Interface) ├── Add / AddAsync - Add elements ├── Contains / ContainsAsync - Check elements ├── All / AllAsync - Batch check ├── Clear / ClearAsync - Clear filter └── ComputeHash - Compute hash values ``` ### Implementation Hierarchy ``` Filter (Abstract Base Class) ├── FilterMemory (In-Memory) │ └── Uses BitArray storage │ └── Redis Series (Distributed) ├── FilterRedis (StackExchange.Redis) ├── FilterCSRedis (CSRedisCore) ├── FilterFreeRedis (FreeRedis) └── FilterEasyCachingRedis (EasyCaching) ``` ### Configuration System ``` BloomFilterOptions ├── FilterMemoryOptions - In-memory mode configuration ├── FilterRedisOptions - StackExchange.Redis configuration ├── FilterCSRedisOptions - CSRedisCore configuration ├── FilterFreeRedisOptions - FreeRedis configuration └── FilterEasyCachingOptions - EasyCaching configuration ``` ## Core Functionality ### Mathematical Model BloomFilter.NetCore implements the complete Bloom filter mathematical model: #### 1. Optimal Bit Array Size (m) Given expected element count `n` and false positive rate `p`, calculate optimal bit array size: ``` m = -(n * ln(p)) / (ln(2)^2) ``` #### 2. Optimal Number of Hash Functions (k) Given element count `n` and bit array size `m`, calculate optimal number of hash functions: ``` k = (m / n) * ln(2) ``` #### 3. Actual False Positive Rate (p) Given inserted element count, number of hash functions, and bit array size, calculate actual false positive rate: ``` p = (1 - e^(-k*n/m))^k ``` These calculations are provided by static methods in the `Filter` base class: ```csharp // Calculate optimal bit array size long m = Filter.BestM(expectedElements, errorRate); // Calculate optimal number of hash functions int k = Filter.BestK(expectedElements, capacity); // Calculate optimal element count long n = Filter.BestN(hashes, capacity); // Calculate actual false positive rate double p = Filter.BestP(hashes, capacity, insertedElements); ``` ### Storage Mechanisms #### In-Memory Storage - **BitArray**: Uses .NET's BitArray as underlying storage - **Bucketing Strategy**: Automatically splits into multiple BitArrays when capacity exceeds 2GB (MaxInt = 2,147,483,640) - **Serialization Support**: Supports serialization/deserialization for persistence or transfer #### Redis Storage - **SETBIT/GETBIT**: Uses Redis bit operation commands - **Distributed Access**: Multiple application instances can concurrently access the same filter - **Persistence**: Leverages Redis persistence mechanisms for data safety ### Concurrency Control ```csharp // AsyncLock ensures thread safety public class AsyncLock { private readonly SemaphoreSlim _semaphore = new(1, 1); public async ValueTask LockAsync() { await _semaphore.WaitAsync(); return new Release(_semaphore); } } ``` ## Installation ### Install via NuGet **In-Memory Mode (Core Package):** ```bash dotnet add package BloomFilter.NetCore ``` **Redis Distributed Mode (Choose One):** ```bash # StackExchange.Redis dotnet add package BloomFilter.Redis.NetCore # CSRedisCore dotnet add package BloomFilter.CSRedis.NetCore # FreeRedis dotnet add package BloomFilter.FreeRedis.NetCore # EasyCaching dotnet add package BloomFilter.EasyCaching.NetCore ``` ## Quick Start ### Simplest Example ```csharp using BloomFilter; // Create a Bloom filter: expect 10 million elements, 1% false positive rate var bf = FilterBuilder.Build(10_000_000, 0.01); // Add elements bf.Add("user:123"); bf.Add("user:456"); // Check element existence Console.WriteLine(bf.Contains("user:123")); // True Console.WriteLine(bf.Contains("user:789")); // False (very small probability of True) // Clear filter bf.Clear(); ``` ### Async Operations ```csharp // Async add await bf.AddAsync(Encoding.UTF8.GetBytes("user:123")); // Async check bool exists = await bf.ContainsAsync(Encoding.UTF8.GetBytes("user:123")); // Batch async operations var users = new[] { Encoding.UTF8.GetBytes("user:1"), Encoding.UTF8.GetBytes("user:2"), Encoding.UTF8.GetBytes("user:3") }; await bf.AddAsync(users); var results = await bf.ContainsAsync(users); ``` ### Fluent API (New in v3.0) v3.0 introduces a modern fluent API for building Bloom filters with improved discoverability and expressiveness: ```csharp // In-Memory Fluent API var filter = FilterBuilder.Create() .WithName("UserFilter") .ExpectingElements(10_000_000) .WithErrorRate(0.001) .UsingHashMethod(HashMethod.XXHash3) .BuildInMemory(); // Redis Fluent API (StackExchange.Redis) var redisFilter = FilterRedisBuilder.Create() .WithRedisConnection("localhost:6379") .WithRedisKey("bloom:users") .WithName("UserFilter") .ExpectingElements(10_000_000) .WithErrorRate(0.001) .BuildRedis(); // CSRedis Fluent API var csredisFilter = FilterCSRedisBuilder.Create() .WithRedisClient(csredisClient) .WithRedisKey("bloom:users") .ExpectingElements(10_000_000) .BuildCSRedis(); // FreeRedis Fluent API var freeRedisFilter = FilterFreeRedisBuilder.Create() .WithRedisClient(redisClient) .WithRedisKey("bloom:users") .ExpectingElements(10_000_000) .BuildFreeRedis(); // EasyCaching Fluent API var easyCachingFilter = FilterEasyCachingBuilder.Create() .WithRedisCachingProvider(provider) .WithRedisKey("bloom:users") .ExpectingElements(10_000_000) .BuildEasyCaching(); // All common configuration methods: // - WithName(string) - Set filter name // - ExpectingElements(long) - Set expected element count // - WithErrorRate(double) - Set false positive rate (0-1) // - UsingHashMethod(HashMethod) - Use predefined hash algorithm // - UsingCustomHash(HashFunction) - Use custom hash function // - WithSerializer(IFilterMemorySerializer) - Set custom serializer (memory only) ``` **Why use Fluent API?** - 🔍 Better discoverability with IntelliSense - 📖 More readable and self-documenting code - ⛓️ Chainable method calls - 🎯 Type-safe configuration - ✅ Backward compatible - old static methods still work! ## Usage Examples ### In-Memory Mode #### Basic Usage ```csharp using BloomFilter; public class UserService { // Static shared Bloom filter private static readonly IBloomFilter _bloomFilter = FilterBuilder.Build(10_000_000, 0.01); public void AddUser(string userId) { // Add user ID _bloomFilter.Add(userId); } public bool MayExistUser(string userId) { // Check if user may exist return _bloomFilter.Contains(userId); } } ``` #### Custom Configuration ```csharp using BloomFilter; // Method 1: Specify hash algorithm var bf1 = FilterBuilder.Build( expectedElements: 1_000_000, errorRate: 0.001, hashMethod: HashMethod.Murmur3 ); // Method 2: Use custom hash function var hashFunction = new Murmur128BitsX64(); var bf2 = FilterBuilder.Build( expectedElements: 1_000_000, errorRate: 0.001, hashFunction: hashFunction ); // Method 3: Manually specify parameters (advanced usage) var bf3 = FilterBuilder.Build( capacity: 9585059, // Bit array size hashes: 10, // Number of hash functions hashMethod: HashMethod.XXHash3 ); // Method 4: Use configuration object var options = new FilterMemoryOptions { Name = "MyFilter", ExpectedElements = 5_000_000, ErrorRate = 0.01, Method = HashMethod.Murmur3 }; var bf4 = FilterBuilder.Build(options); ``` ### Dependency Injection #### ASP.NET Core Integration ```csharp using BloomFilter; using Microsoft.Extensions.DependencyInjection; public class Startup { public void ConfigureServices(IServiceCollection services) { // Register Bloom filter service services.AddBloomFilter(setupAction => { setupAction.UseInMemory(options => { options.Name = "MainFilter"; options.ExpectedElements = 10_000_000; options.ErrorRate = 0.01; options.Method = HashMethod.Murmur3; }); }); services.AddControllers(); } } // Use in controller or service public class UserController : ControllerBase { private readonly IBloomFilter _bloomFilter; public UserController(IBloomFilter bloomFilter) { _bloomFilter = bloomFilter; } [HttpPost("users/{userId}")] public IActionResult CheckUser(string userId) { if (_bloomFilter.Contains(userId)) { // User may exist, continue to query database return Ok("User may exist"); } else { // User definitely doesn't exist, no need to query database return NotFound("User doesn't exist"); } } } ``` #### Multiple Filter Instances ```csharp services.AddBloomFilter(setupAction => { // User filter setupAction.UseInMemory(options => { options.Name = "UserFilter"; options.ExpectedElements = 10_000_000; options.ErrorRate = 0.01; }); // Email filter setupAction.UseInMemory(options => { options.Name = "EmailFilter"; options.ExpectedElements = 5_000_000; options.ErrorRate = 0.001; }); }); // Use factory to get specific filter public class MyService { private readonly IBloomFilter _userFilter; private readonly IBloomFilter _emailFilter; public MyService(IBloomFilterFactory factory) { _userFilter = factory.Get("UserFilter"); _emailFilter = factory.Get("EmailFilter"); } } ``` ### Redis Distributed Mode #### StackExchange.Redis ```csharp using BloomFilter; // Method 1: Direct build var bf = FilterRedisBuilder.Build( redisHost: "localhost:6379", name: "DistributedFilter", expectedElements: 5_000_000, errorRate: 0.001 ); bf.Add("item:123"); Console.WriteLine(bf.Contains("item:123")); // True // Method 2: Dependency injection services.AddBloomFilter(setupAction => { setupAction.UseRedis(new FilterRedisOptions { Name = "UserFilter", RedisKey = "BloomFilter:Users", Endpoints = new List { "localhost:6379" }, Database = 0, ExpectedElements = 10_000_000, ErrorRate = 0.01, Method = HashMethod.Murmur3 }); }); // Method 3: Advanced configuration (master-slave, sentinel, cluster) services.AddBloomFilter(setupAction => { setupAction.UseRedis(new FilterRedisOptions { Name = "ProductFilter", RedisKey = "BloomFilter:Products", Endpoints = new List { "redis-master:6379", "redis-slave1:6379", "redis-slave2:6379" }, Password = "your-redis-password", Ssl = true, ConnectTimeout = 5000, SyncTimeout = 3000, ExpectedElements = 20_000_000, ErrorRate = 0.001 }); }); ``` #### CSRedisCore ```csharp services.AddBloomFilter(setupAction => { setupAction.UseCSRedis(new FilterCSRedisOptions { Name = "OrderFilter", RedisKey = "BloomFilter:Orders", ConnectionStrings = new List { "localhost:6379,password=123456,defaultDatabase=0,poolsize=50,prefix=myapp:" }, ExpectedElements = 5_000_000, ErrorRate = 0.01 }); }); ``` #### FreeRedis ```csharp services.AddBloomFilter(setupAction => { setupAction.UseFreeRedis(new FilterFreeRedisOptions { Name = "CartFilter", RedisKey = "BloomFilter:Carts", ConnectionStrings = new List { "localhost:6379,password=123456" }, ExpectedElements = 1_000_000, ErrorRate = 0.01 }); }); ``` #### EasyCaching Integration EasyCaching provides a unified caching abstraction layer, allowing you to easily switch underlying cache implementations: ```csharp using EasyCaching.Core.Configurations; using Microsoft.Extensions.DependencyInjection; var services = new ServiceCollection(); // 1. Configure EasyCaching services.AddEasyCaching(options => { // Configure Redis provider options.UseRedis(config => { config.DBConfig.Endpoints.Add(new ServerEndPoint("127.0.0.1", 6379)); config.DBConfig.Database = 0; }, "redis-provider-1"); // Can configure multiple providers options.UseRedis(config => { config.DBConfig.Endpoints.Add(new ServerEndPoint("127.0.0.1", 6379)); config.DBConfig.Database = 1; }, "redis-provider-2"); }); // 2. Configure BloomFilter services.AddBloomFilter(setupAction => { // Use first Redis provider setupAction.UseEasyCachingRedis(new FilterEasyCachingRedisOptions { Name = "BF1", RedisKey = "BloomFilter1", ProviderName = "redis-provider-1", ExpectedElements = 10_000_000, ErrorRate = 0.01 }); // Use second Redis provider setupAction.UseEasyCachingRedis(new FilterEasyCachingRedisOptions { Name = "BF2", RedisKey = "BloomFilter2", ProviderName = "redis-provider-2", ExpectedElements = 5_000_000, ErrorRate = 0.001 }); }); var provider = services.BuildServiceProvider(); // Use default filter var bf = provider.GetService(); bf.Add("value1"); // Use named filter var factory = provider.GetService(); var bf1 = factory.Get("BF1"); var bf2 = factory.Get("BF2"); bf1.Add("item1"); bf2.Add("item2"); ``` ### Real-World Application Scenarios #### 1. Cache Penetration Protection ```csharp public class ProductService { private readonly IBloomFilter _bloomFilter; private readonly ICache _cache; private readonly IProductRepository _repository; public ProductService( IBloomFilter bloomFilter, ICache cache, IProductRepository repository) { _bloomFilter = bloomFilter; _cache = cache; _repository = repository; } public async Task GetProductAsync(string productId) { // First layer: Bloom filter if (!_bloomFilter.Contains(productId)) { // Product definitely doesn't exist, return null directly return null; } // Second layer: Cache var cached = await _cache.GetAsync(productId); if (cached != null) { return cached; } // Third layer: Database var product = await _repository.GetByIdAsync(productId); if (product != null) { await _cache.SetAsync(productId, product); } return product; } public async Task CreateProductAsync(Product product) { // Save to database await _repository.SaveAsync(product); // Add to Bloom filter _bloomFilter.Add(product.Id); // Update cache await _cache.SetAsync(product.Id, product); } } ``` #### 2. URL Deduplication (Web Crawler) ```csharp public class WebCrawler { private readonly IBloomFilter _visitedUrls; private readonly Queue _urlQueue; public WebCrawler(IBloomFilter bloomFilter) { _visitedUrls = bloomFilter; _urlQueue = new Queue(); } public async Task CrawlAsync(string startUrl) { _urlQueue.Enqueue(startUrl); while (_urlQueue.Count > 0) { var url = _urlQueue.Dequeue(); // Check if already visited if (_visitedUrls.Contains(url)) { continue; // Skip already visited URLs } // Mark as visited _visitedUrls.Add(url); // Download page var page = await DownloadPageAsync(url); // Process page await ProcessPageAsync(page); // Extract new URLs var newUrls = ExtractUrls(page); foreach (var newUrl in newUrls) { if (!_visitedUrls.Contains(newUrl)) { _urlQueue.Enqueue(newUrl); } } } } } ``` #### 3. Distributed Deduplication (Multiple Instances) ```csharp // Configure distributed Bloom filter services.AddBloomFilter(setupAction => { setupAction.UseRedis(new FilterRedisOptions { Name = "GlobalDeduplication", RedisKey = "BF:Dedup", Endpoints = new List { "redis-cluster:6379" }, ExpectedElements = 100_000_000, ErrorRate = 0.0001 }); }); // Use across multiple service instances public class MessageProcessor { private readonly IBloomFilter _bloomFilter; public async Task ProcessMessageAsync(Message message) { // All instances share the same Redis Bloom filter if (await _bloomFilter.ContainsAsync(message.Id)) { // Message already processed by another instance return; } // Mark as processed await _bloomFilter.AddAsync(message.Id); // Process message await HandleMessageAsync(message); } } ``` ## Hash Algorithms BloomFilter.NetCore supports 20+ hash algorithms, choose based on performance and accuracy requirements: ### Algorithm Categories | Category | Algorithms | Characteristics | Use Cases | |----------|-----------|-----------------|-----------| | **LCG-based** | LCGWithFNV1
LCGWithFNV1a
LCGModifiedFNV1 | Extremely fast, lower quality | Extremely high performance requirements, can tolerate high false positive rates | | **RNG-based** | RNGWithFNV1
RNGWithFNV1a
RNGModifiedFNV1 | High quality, slower | Scenarios requiring high accuracy | | **Checksum** | CRC32
CRC64
Adler32 | Balanced performance and quality | General scenarios | | **Murmur Family** | Murmur3
Murmur32BitsX86
Murmur128BitsX64
Murmur128BitsX86 | **Recommended**, good performance, high quality | Recommended for production | | **Cryptographic** | SHA1
SHA256
SHA384
SHA512 | Highest quality, slowest | Scenarios requiring extreme security | | **XXHash Family** | XXHash32
XXHash64
XXHash3
XXHash128 | **Fastest**, excellent quality | First choice for high performance | ### Selection Recommendations ```csharp // Recommended: Default Murmur3 for production (balanced performance and quality) var bf1 = FilterBuilder.Build(10_000_000, 0.01, HashMethod.Murmur3); // High Performance: Choose XXHash3 for extreme performance requirements var bf2 = FilterBuilder.Build(10_000_000, 0.01, HashMethod.XXHash3); // High Precision: Choose SHA256 + lower errorRate for minimal false positive rate var bf3 = FilterBuilder.Build(10_000_000, 0.0001, HashMethod.SHA256); // Distributed: Recommend XXHash64 for Redis (fast and good cross-language support) var bf4 = FilterRedisBuilder.Build( "localhost:6379", "MyFilter", 10_000_000, 0.01, HashMethod.XXHash64 ); ``` ## Performance Benchmarks ### Test Environment ``` BenchmarkDotNet=v0.13.5 OS: Windows 11 (10.0.22621.1778/22H2) CPU: AMD Ryzen 7 5800X, 1 CPU, 16 logical cores, 8 physical cores .NET SDK: 7.0.304 Runtime: .NET 7.0.7 (7.0.723.27404), X64 RyuJIT AVX2 ``` ### Performance Rankings (64-byte data) | Rank | Algorithm | Mean Time | Relative Speed | |------|-----------|-----------|----------------| | 🥇 1 | XXHash3 | 33.14 ns | Baseline (Fastest) | | 🥈 2 | XXHash128 | 36.01 ns | 1.09x | | 🥉 3 | CRC64 | 38.83 ns | 1.17x | | 4 | XXHash64 | 50.62 ns | 1.53x | | 5 | Murmur3 | 70.98 ns | 2.14x | | ... | ... | ... | ... | | 28 | SHA512 | 1,368.20 ns | 41.28x (Slowest) | ### Complete Performance Data
Click to expand full benchmark results #### 64-byte Data | Algorithm | Mean Time | Error | StdDev | Allocated | |-----------|-----------|-------|--------|-----------| | XXHash3 | 33.14 ns | 0.295 ns | 0.276 ns | 80 B | | XXHash128 | 36.01 ns | 0.673 ns | 0.749 ns | 80 B | | CRC64 | 38.83 ns | 0.399 ns | 0.333 ns | 80 B | | XXHash64 | 50.62 ns | 0.756 ns | 0.670 ns | 80 B | | Murmur3 | 70.98 ns | 1.108 ns | 1.036 ns | 80 B | | XXHash32 | 73.15 ns | 0.526 ns | 0.466 ns | 80 B | | Murmur128BitsX64 | 80.15 ns | 0.783 ns | 0.653 ns | 120 B | | Murmur128BitsX86 | 82.73 ns | 1.211 ns | 1.011 ns | 120 B | | LCGWithFNV1 | 91.27 ns | 1.792 ns | 2.134 ns | 80 B | | CRC32 | 145.63 ns | 1.528 ns | 1.429 ns | 328 B | | Adler32 | 150.07 ns | 0.664 ns | 0.589 ns | 336 B | | RNGWithFNV1 | 445.32 ns | 8.463 ns | 9.747 ns | 384 B | | SHA256 | 922.30 ns | 4.478 ns | 3.739 ns | 496 B | | SHA1 | 1,045.67 ns | 6.411 ns | 5.997 ns | 464 B | | SHA384 | 1,173.67 ns | 5.050 ns | 3.942 ns | 456 B | | SHA512 | 1,368.20 ns | 10.967 ns | 9.722 ns | 504 B | #### 1 MB Data | Algorithm | Mean Time | |-----------|-----------| | XXHash3 | 30,258.92 ns (~30 μs) | | XXHash128 | 33,778.68 ns (~34 μs) | | CRC64 | 56,321.74 ns (~56 μs) | | XXHash64 | 100,570.79 ns (~101 μs) | | Murmur128BitsX64 | 163,915.44 ns (~164 μs) | | ... | ... | | SHA1 | 3,381,425.73 ns (~3.4 ms) |
### Performance Recommendations 1. **General Scenarios**: Use `Murmur3` (default), balanced performance and quality 2. **Extreme Performance**: Use `XXHash3`, 2x faster than Murmur3 3. **Large Data**: Use `XXHash128` or `Murmur128BitsX64`, 128-bit output reduces collisions 4. **Avoid**: LCG series (poor quality), SHA series (too slow) ## Advanced Usage ### Serialization and Deserialization ```csharp // Export Bloom filter state var bf = FilterBuilder.Build(1_000_000, 0.01); bf.Add("item1"); bf.Add("item2"); // Get internal state (for persistence) var memory = (FilterMemory)bf; var buckets = memory.Buckets; // BitArray[] var bucketBytes = memory.BucketBytes; // byte[][] // Restore Bloom filter from state var options = new FilterMemoryOptions { Name = "RestoredFilter", ExpectedElements = 1_000_000, ErrorRate = 0.01, Buckets = buckets // Or use BucketBytes }; var restoredBf = FilterBuilder.Build(options); Console.WriteLine(restoredBf.Contains("item1")); // True ``` ### Batch Operations ```csharp // Batch add var items = Enumerable.Range(1, 10000) .Select(i => Encoding.UTF8.GetBytes($"user:{i}")) .ToArray(); var addResults = bf.Add(items); Console.WriteLine($"Successfully added: {addResults.Count(r => r)} elements"); // Batch check var checkResults = bf.Contains(items); Console.WriteLine($"Exist: {checkResults.Count(r => r)} elements"); // Check if all elements exist bool allExist = bf.All(items); // Async batch operations var asyncAddResults = await bf.AddAsync(items); var asyncCheckResults = await bf.ContainsAsync(items); bool asyncAllExist = await bf.AllAsync(items); ``` ### Custom Hash Function ```csharp using BloomFilter.HashAlgorithms; // Implement custom hash algorithm public class MyCustomHash : HashFunction { public override long ComputeHash(ReadOnlySpan data) { // Custom hash logic long hash = 0; foreach (var b in data) { hash = hash * 31 + b; } return hash; } } // Use custom hash var customHash = new MyCustomHash(); var bf = FilterBuilder.Build(1_000_000, 0.01, customHash); ``` ### Calculate Actual False Positive Rate ```csharp var bf = FilterBuilder.Build(100_000, 0.01); // Add 50,000 elements for (int i = 0; i < 50_000; i++) { bf.Add($"item:{i}"); } // Calculate theoretical false positive rate var filter = (Filter)bf; double theoreticalErrorRate = Filter.BestP( filter.Hashes, filter.Capacity, 50_000 ); Console.WriteLine($"Theoretical error rate: {theoreticalErrorRate:P4}"); // Test actual false positive rate int falsePositives = 0; int testCount = 100_000; for (int i = 50_000; i < 50_000 + testCount; i++) { if (bf.Contains($"item:{i}")) { falsePositives++; } } double actualErrorRate = (double)falsePositives / testCount; Console.WriteLine($"Actual error rate: {actualErrorRate:P4}"); Console.WriteLine($"False positives: {falsePositives} / {testCount}"); ``` ### Monitoring and Statistics ```csharp public class BloomFilterMonitor { private readonly IBloomFilter _filter; private long _addCount; private long _hitCount; private long _missCount; public BloomFilterMonitor(IBloomFilter filter) { _filter = filter; } public bool Add(string item) { Interlocked.Increment(ref _addCount); return _filter.Add(item); } public bool Contains(string item) { var result = _filter.Contains(item); if (result) Interlocked.Increment(ref _hitCount); else Interlocked.Increment(ref _missCount); return result; } public void PrintStats() { Console.WriteLine($"Total adds: {_addCount}"); Console.WriteLine($"Hits: {_hitCount}"); Console.WriteLine($"Misses: {_missCount}"); Console.WriteLine($"Hit rate: {(double)_hitCount / (_hitCount + _missCount):P2}"); } } ``` ## API Reference ### IBloomFilter Interface ```csharp public interface IBloomFilter : IDisposable { // Properties string Name { get; } // Synchronous methods bool Add(ReadOnlySpan data); IList Add(IEnumerable elements); bool Contains(ReadOnlySpan element); IList Contains(IEnumerable elements); bool All(IEnumerable elements); void Clear(); long[] ComputeHash(ReadOnlySpan data); // Asynchronous methods ValueTask AddAsync(ReadOnlyMemory data); ValueTask> AddAsync(IEnumerable elements); ValueTask ContainsAsync(ReadOnlyMemory element); ValueTask> ContainsAsync(IEnumerable elements); ValueTask AllAsync(IEnumerable elements); ValueTask ClearAsync(); } ``` ### Filter Base Class ```csharp public abstract class Filter : IBloomFilter { // Properties public string Name { get; } public HashFunction Hash { get; } public long Capacity { get; } public int Hashes { get; } public long ExpectedElements { get; } public double ErrorRate { get; } // Static methods (mathematical calculations) public static long BestM(long n, double p); public static int BestK(long n, long m); public static long BestN(int k, long m); public static double BestP(int k, long m, long insertedElements); } ``` ### FilterBuilder ```csharp public static class FilterBuilder { // Using expected elements and error rate public static IBloomFilter Build(long expectedElements, double errorRate); public static IBloomFilter Build(long expectedElements, double errorRate, HashMethod method); public static IBloomFilter Build(long expectedElements, double errorRate, HashFunction hash); // Using capacity and number of hash functions public static IBloomFilter Build(long capacity, int hashes, HashMethod method); public static IBloomFilter Build(long capacity, int hashes, HashFunction hash); // Using configuration object public static IBloomFilter Build(FilterMemoryOptions options); } ``` ### FilterRedisBuilder ```csharp public static class FilterRedisBuilder { public static IBloomFilter Build( string redisHost, string name, long expectedElements, double errorRate, HashMethod method = HashMethod.Murmur3); } ``` ### Extension Methods ```csharp // Service registration public static class ServiceCollectionExtensions { public static IServiceCollection AddBloomFilter( this IServiceCollection services, Action setupAction); } // Configuration extensions public static class BloomFilterOptionsExtensions { public static BloomFilterOptions UseInMemory( this BloomFilterOptions options, Action setup = null); public static BloomFilterOptions UseRedis( this BloomFilterOptions options, FilterRedisOptions setup); public static BloomFilterOptions UseCSRedis( this BloomFilterOptions options, FilterCSRedisOptions setup); public static BloomFilterOptions UseFreeRedis( this BloomFilterOptions options, FilterFreeRedisOptions setup); public static BloomFilterOptions UseEasyCachingRedis( this BloomFilterOptions options, FilterEasyCachingRedisOptions setup); } ``` ## Frequently Asked Questions (FAQ) ### 1. What is the false positive rate of a Bloom filter? The false positive rate is determined by the `errorRate` parameter you specify when creating the filter. For example: ```csharp // 1% false positive rate var bf = FilterBuilder.Build(1_000_000, 0.01); // 0.1% false positive rate (more accurate, but uses more memory) var bf2 = FilterBuilder.Build(1_000_000, 0.001); ``` **Note**: Lower error rates require more memory space. ### 2. How to choose expectedElements? `expectedElements` should be set to the number of elements you expect to add. If the actual number exceeds this, the false positive rate will increase. Recommendations: - Estimate actual element count - Add 20%-50% buffer - Monitor actual false positive rate regularly ### 3. In-Memory vs Redis Mode - How to Choose? | Scenario | Recommended Mode | Reason | |----------|-----------------|---------| | Single-instance application | In-Memory | Highest performance, no network overhead | | Multi-instance application | Redis | Shared state, distributed support | | Persistence required | Redis | Redis provides persistence | | Temporary deduplication | In-Memory | Simple and fast | | Cross-service sharing | Redis | Multi-language access support | ### 4. How to clear a Bloom filter? ```csharp // Synchronous clear bf.Clear(); // Asynchronous clear await bf.ClearAsync(); ``` **Note**: Clear operation deletes all data, use with caution! ### 5. How much memory does a Bloom filter use? Memory usage depends on capacity (m): ``` Memory (bytes) = m / 8 ``` Example calculation: ```csharp // 10 million elements, 1% false positive rate var bf = FilterBuilder.Build(10_000_000, 0.01); var filter = (Filter)bf; // Calculate memory usage long bits = filter.Capacity; long bytes = bits / 8; double mb = bytes / (1024.0 * 1024.0); Console.WriteLine($"Bit array size: {bits:N0} bits"); Console.WriteLine($"Memory usage: {bytes:N0} bytes ({mb:F2} MB)"); // Output: approximately 11.4 MB ``` ### 6. Can elements be deleted? **No**. Standard Bloom filters do not support deletion because: - Multiple elements may map to the same bits - Deleting one element may affect detection of other elements If deletion is needed, consider: - Counting Bloom Filter - Cuckoo Filter ### 7. Is it thread-safe? Yes, BloomFilter.NetCore is thread-safe: ```csharp // Multi-threaded concurrent access var bf = FilterBuilder.Build(10_000_000, 0.01); Parallel.For(0, 1000, i => { bf.Add($"item:{i}"); // Thread-safe }); Parallel.For(0, 1000, i => { var exists = bf.Contains($"item:{i}"); // Thread-safe }); ``` ### 8. How to monitor Redis connections? ```csharp // Use StackExchange.Redis connection monitoring services.AddBloomFilter(setupAction => { setupAction.UseRedis(new FilterRedisOptions { Name = "MyFilter", RedisKey = "BF:Key", Endpoints = new List { "localhost:6379" }, // Enable connection logging AbortOnConnectFail = false, ConnectTimeout = 5000, ConnectRetry = 3 }); }); // Get Redis connection information var bf = serviceProvider.GetService(); if (bf is FilterRedis redisFilter) { var connection = redisFilter.Connection; Console.WriteLine($"Connection status: {connection.IsConnected}"); Console.WriteLine($"Endpoints: {string.Join(", ", connection.GetEndPoints())}"); } ``` ## Contributing We welcome community contributions! ### How to Contribute 1. Fork this repository 2. Create a feature branch (`git checkout -b feature/amazing-feature`) 3. Commit your changes (`git commit -m 'Add amazing feature'`) 4. Push to the branch (`git push origin feature/amazing-feature`) 5. Create a Pull Request ### Development Guidelines ```bash # Clone repository git clone https://github.com/vla/BloomFilter.NetCore.git cd BloomFilter.NetCore # Restore dependencies dotnet restore # Build project dotnet build # Run tests dotnet test # Run benchmarks cd test/BenchmarkTest dotnet run -c Release ``` ### Code Standards - Follow C# coding conventions - Add XML documentation comments - Write unit tests - Update relevant documentation ## Acknowledgments Thanks to all developers who contributed to this project! Special thanks to: - .NET Foundation - StackExchange.Redis team - All dependency library authors If this project helps you, please give us a ⭐️ Star! ================================================ FILE: README.zh-CN.md ================================================ # BloomFilter.NetCore [![License MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://opensource.org/licenses/MIT) [![.NET](https://img.shields.io/badge/.NET-6.0%20|%207.0%20|%208.0%20|%209.0%20|%2010.0-blue.svg)](https://dotnet.microsoft.com/) 一个高性能、功能完整的 .NET 布隆过滤器实现库,支持内存存储和多种 Redis 分布式后端。 ## 目录 - [项目概述](#项目概述) - [主要特性](#主要特性) - [包和状态](#包和状态) - [整体架构](#整体架构) - [核心功能](#核心功能) - [安装](#安装) - [快速开始](#快速开始) - [使用示例](#使用示例) - [内存模式](#内存模式) - [依赖注入配置](#依赖注入配置) - [Redis 分布式模式](#redis-分布式模式) - [哈希算法](#哈希算法) - [性能基准测试](#性能基准测试) - [高级用法](#高级用法) - [API 参考](#api-参考) - [贡献指南](#贡献指南) - [许可证](#许可证) ## 项目概述 BloomFilter.NetCore 是一个企业级的布隆过滤器库,专为 .NET 生态系统设计。布隆过滤器是一种空间效率极高的概率型数据结构,用于测试一个元素是否属于一个集合。它的核心特点是: - **空间高效**: 相比传统的 HashSet,占用空间极小 - **时间复杂度 O(1)**: 添加和查询操作都是常数时间 - **允许一定误报率**: 可能返回假阳性(false positive),但绝不会出现假阴性(false negative) 本项目提供了两大类实现: 1. **内存布隆过滤器 (FilterMemory)**: 基于 BitArray 的内存实现,适用于单进程场景 2. **分布式布隆过滤器 (FilterRedis 系列)**: 基于 Redis 的分布式实现,支持多应用程序并发访问 ### 主要用途 - **缓存穿透防护**: 防止恶意查询不存在的数据导致缓存击穿 - **去重场景**: URL 去重、邮箱去重、用户 ID 去重等 - **推荐系统**: 判断用户是否已看过某个内容 - **爬虫系统**: 判断 URL 是否已被爬取 - **分布式系统**: 多服务实例间共享状态判断 - **大数据场景**: 海量数据的存在性判断 ## 主要特性 ### 🎯 灵活配置 - **参数完全可配置**: 位数组大小 (m)、哈希函数数量 (k) - **自动参数计算**: 根据容忍的误报率 (p) 和预期元素数量 (n) 自动计算最优参数 - **20+ 种哈希算法**: 支持 CRC、MD5、SHA、Murmur、LCGs、xxHash 等或自定义算法 ### ⚡ 高性能 - **快速生成**: 布隆过滤器的生成和操作都极快 - **优化实现**: 使用 Span、ReadOnlyMemory 等零拷贝技术 - **不安全代码优化**: 在性能关键路径使用 unsafe 代码块 - **拒绝采样**: 实现了拒绝采样和哈希链,考虑雪崩效应以提高哈希质量 ### 🔒 并发安全 - **线程安全**: 使用 AsyncLock 机制确保多线程并发访问安全 - **异步支持**: 全面的 async/await 支持,所有操作都有异步版本 - **分布式锁**: Redis 实现支持跨应用程序的并发访问 ### 🌐 多后端支持 - **StackExchange.Redis**: 官方推荐的 Redis 客户端 - **CSRedisCore**: 高性能的 Redis 客户端 - **FreeRedis**: 轻量级 Redis 客户端 - **EasyCaching**: 支持 EasyCaching 抽象层,可切换多种缓存提供程序 ### 📦 现代 .NET 支持 - **多框架支持**: net462, netstandard2.0, net6.0, net7.0, net8.0, net9.0, net10.0 - **依赖注入**: 原生支持 Microsoft.Extensions.DependencyInjection - **可空引用类型**: 启用可空引用类型,提高代码安全性 ## 包和状态 | 包名 | NuGet | 说明 | |------|-------|------| |**BloomFilter.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.NetCore)| 核心包,提供内存布隆过滤器 | |**BloomFilter.Redis.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.Redis.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.Redis.NetCore)| StackExchange.Redis 实现 | |**BloomFilter.CSRedis.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.CSRedis.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.CSRedis.NetCore)| CSRedisCore 实现 | |**BloomFilter.FreeRedis.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.FreeRedis.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.FreeRedis.NetCore)| FreeRedis 实现 | |**BloomFilter.EasyCaching.NetCore**|[![nuget](https://img.shields.io/nuget/v/BloomFilter.EasyCaching.NetCore.svg?style=flat-square)](https://www.nuget.org/packages/BloomFilter.EasyCaching.NetCore)| EasyCaching 集成 | ## 整体架构 ### 核心接口层 ``` IBloomFilter (接口) ├── Add / AddAsync - 添加元素 ├── Contains / ContainsAsync - 检查元素 ├── All / AllAsync - 批量检查 ├── Clear / ClearAsync - 清空过滤器 └── ComputeHash - 计算哈希值 ``` ### 实现层次结构 ``` Filter (抽象基类) ├── FilterMemory (内存实现) │ └── 使用 BitArray 存储 │ └── Redis 系列 (分布式实现) ├── FilterRedis (StackExchange.Redis) ├── FilterCSRedis (CSRedisCore) ├── FilterFreeRedis (FreeRedis) └── FilterEasyCachingRedis (EasyCaching) ``` ### 配置系统 ``` BloomFilterOptions ├── FilterMemoryOptions - 内存模式配置 ├── FilterRedisOptions - StackExchange.Redis 配置 ├── FilterCSRedisOptions - CSRedisCore 配置 ├── FilterFreeRedisOptions - FreeRedis 配置 └── FilterEasyCachingOptions - EasyCaching 配置 ``` ## 核心功能 ### 数学模型 BloomFilter.NetCore 实现了完整的布隆过滤器数学模型: #### 1. 最优位数组大小 (m) 给定预期元素数 `n` 和误报率 `p`,计算最优的位数组大小: ``` m = -(n * ln(p)) / (ln(2)^2) ``` #### 2. 最优哈希函数数量 (k) 给定元素数 `n` 和位数组大小 `m`,计算最优的哈希函数数量: ``` k = (m / n) * ln(2) ``` #### 3. 实际误报率 (p) 给定已插入元素数、哈希函数数量和位数组大小,计算实际误报率: ``` p = (1 - e^(-k*n/m))^k ``` 这些计算由 `Filter` 基类提供的静态方法实现: ```csharp // 计算最优位数组大小 long m = Filter.BestM(expectedElements, errorRate); // 计算最优哈希函数数量 int k = Filter.BestK(expectedElements, capacity); // 计算最优元素数量 long n = Filter.BestN(hashes, capacity); // 计算实际误报率 double p = Filter.BestP(hashes, capacity, insertedElements); ``` ### 存储机制 #### 内存存储 - **BitArray**: 使用 .NET 的 BitArray 作为底层存储 - **分桶策略**: 当容量超过 2GB (MaxInt = 2,147,483,640) 时,自动分成多个 BitArray - **序列化支持**: 支持序列化/反序列化以持久化或传输过滤器状态 #### Redis 存储 - **SETBIT/GETBIT**: 使用 Redis 的位操作命令 - **分布式访问**: 多个应用实例可以并发访问同一个过滤器 - **持久化**: 利用 Redis 的持久化机制保证数据安全 ### 并发控制 ```csharp // AsyncLock 确保线程安全 public class AsyncLock { private readonly SemaphoreSlim _semaphore = new(1, 1); public async ValueTask LockAsync() { await _semaphore.WaitAsync(); return new Release(_semaphore); } } ``` ## 安装 ### 通过 NuGet 安装 **内存模式 (核心包):** ```bash dotnet add package BloomFilter.NetCore ``` **Redis 分布式模式 (选择一个):** ```bash # StackExchange.Redis dotnet add package BloomFilter.Redis.NetCore # CSRedisCore dotnet add package BloomFilter.CSRedis.NetCore # FreeRedis dotnet add package BloomFilter.FreeRedis.NetCore # EasyCaching dotnet add package BloomFilter.EasyCaching.NetCore ``` ## 快速开始 ### 最简单的示例 ```csharp using BloomFilter; // 创建一个布隆过滤器:预期 1000 万元素,1% 误报率 var bf = FilterBuilder.Build(10_000_000, 0.01); // 添加元素 bf.Add("user:123"); bf.Add("user:456"); // 检查元素是否存在 Console.WriteLine(bf.Contains("user:123")); // True Console.WriteLine(bf.Contains("user:789")); // False (可能极小概率为 True) // 清空过滤器 bf.Clear(); ``` ### 异步操作 ```csharp // 异步添加 await bf.AddAsync(Encoding.UTF8.GetBytes("user:123")); // 异步检查 bool exists = await bf.ContainsAsync(Encoding.UTF8.GetBytes("user:123")); // 批量异步操作 var users = new[] { Encoding.UTF8.GetBytes("user:1"), Encoding.UTF8.GetBytes("user:2"), Encoding.UTF8.GetBytes("user:3") }; await bf.AddAsync(users); var results = await bf.ContainsAsync(users); ``` ### Fluent API(v3.0 新增) v3.0 引入了现代化的流式 API,提供更好的可发现性和表达力: ```csharp // 内存模式 Fluent API var filter = FilterBuilder.Create() .WithName("UserFilter") .ExpectingElements(10_000_000) .WithErrorRate(0.001) .UsingHashMethod(HashMethod.XXHash3) .BuildInMemory(); // Redis Fluent API (StackExchange.Redis) var redisFilter = FilterRedisBuilder.Create() .WithRedisConnection("localhost:6379") .WithRedisKey("bloom:users") .WithName("UserFilter") .ExpectingElements(10_000_000) .WithErrorRate(0.001) .BuildRedis(); // CSRedis Fluent API var csredisFilter = FilterCSRedisBuilder.Create() .WithRedisClient(csredisClient) .WithRedisKey("bloom:users") .ExpectingElements(10_000_000) .BuildCSRedis(); // FreeRedis Fluent API var freeRedisFilter = FilterFreeRedisBuilder.Create() .WithRedisClient(redisClient) .WithRedisKey("bloom:users") .ExpectingElements(10_000_000) .BuildFreeRedis(); // EasyCaching Fluent API var easyCachingFilter = FilterEasyCachingBuilder.Create() .WithRedisCachingProvider(provider) .WithRedisKey("bloom:users") .ExpectingElements(10_000_000) .BuildEasyCaching(); // 所有通用配置方法: // - WithName(string) - 设置过滤器名称 // - ExpectingElements(long) - 设置预期元素数量 // - WithErrorRate(double) - 设置误报率 (0-1) // - UsingHashMethod(HashMethod) - 使用预定义哈希算法 // - UsingCustomHash(HashFunction) - 使用自定义哈希函数 // - WithSerializer(IFilterMemorySerializer) - 设置自定义序列化器(仅内存模式) ``` **为什么使用 Fluent API?** - 🔍 通过 IntelliSense 更好的可发现性 - 📖 代码更易读、更自文档化 - ⛓️ 可链式调用方法 - 🎯 类型安全的配置 - ✅ 向后兼容 - 旧的静态方法仍然可用! ## 使用示例 ### 内存模式 #### 基本用法 ```csharp using BloomFilter; public class UserService { // 静态共享的布隆过滤器 private static readonly IBloomFilter _bloomFilter = FilterBuilder.Build(10_000_000, 0.01); public void AddUser(string userId) { // 添加用户 ID _bloomFilter.Add(userId); } public bool MayExistUser(string userId) { // 检查用户是否可能存在 return _bloomFilter.Contains(userId); } } ``` #### 自定义配置 ```csharp using BloomFilter; // 方式 1: 指定哈希算法 var bf1 = FilterBuilder.Build( expectedElements: 1_000_000, errorRate: 0.001, hashMethod: HashMethod.Murmur3 ); // 方式 2: 使用自定义哈希函数 var hashFunction = new Murmur128BitsX64(); var bf2 = FilterBuilder.Build( expectedElements: 1_000_000, errorRate: 0.001, hashFunction: hashFunction ); // 方式 3: 手动指定参数 (高级用法) var bf3 = FilterBuilder.Build( capacity: 9585059, // 位数组大小 hashes: 10, // 哈希函数数量 hashMethod: HashMethod.XXHash3 ); // 方式 4: 使用配置对象 var options = new FilterMemoryOptions { Name = "MyFilter", ExpectedElements = 5_000_000, ErrorRate = 0.01, Method = HashMethod.Murmur3 }; var bf4 = FilterBuilder.Build(options); ``` ### 依赖注入配置 #### ASP.NET Core 集成 ```csharp using BloomFilter; using Microsoft.Extensions.DependencyInjection; public class Startup { public void ConfigureServices(IServiceCollection services) { // 注册布隆过滤器服务 services.AddBloomFilter(setupAction => { setupAction.UseInMemory(options => { options.Name = "MainFilter"; options.ExpectedElements = 10_000_000; options.ErrorRate = 0.01; options.Method = HashMethod.Murmur3; }); }); services.AddControllers(); } } // 在控制器或服务中使用 public class UserController : ControllerBase { private readonly IBloomFilter _bloomFilter; public UserController(IBloomFilter bloomFilter) { _bloomFilter = bloomFilter; } [HttpPost("users/{userId}")] public IActionResult CheckUser(string userId) { if (_bloomFilter.Contains(userId)) { // 用户可能存在,继续查询数据库 return Ok("用户可能存在"); } else { // 用户一定不存在,无需查询数据库 return NotFound("用户不存在"); } } } ``` #### 多个过滤器实例 ```csharp services.AddBloomFilter(setupAction => { // 用户过滤器 setupAction.UseInMemory(options => { options.Name = "UserFilter"; options.ExpectedElements = 10_000_000; options.ErrorRate = 0.01; }); // 邮箱过滤器 setupAction.UseInMemory(options => { options.Name = "EmailFilter"; options.ExpectedElements = 5_000_000; options.ErrorRate = 0.001; }); }); // 使用工厂获取指定过滤器 public class MyService { private readonly IBloomFilter _userFilter; private readonly IBloomFilter _emailFilter; public MyService(IBloomFilterFactory factory) { _userFilter = factory.Get("UserFilter"); _emailFilter = factory.Get("EmailFilter"); } } ``` ### Redis 分布式模式 #### StackExchange.Redis ```csharp using BloomFilter; // 方式 1: 直接构建 var bf = FilterRedisBuilder.Build( redisHost: "localhost:6379", name: "DistributedFilter", expectedElements: 5_000_000, errorRate: 0.001 ); bf.Add("item:123"); Console.WriteLine(bf.Contains("item:123")); // True // 方式 2: 依赖注入 services.AddBloomFilter(setupAction => { setupAction.UseRedis(new FilterRedisOptions { Name = "UserFilter", RedisKey = "BloomFilter:Users", Endpoints = new List { "localhost:6379" }, Database = 0, ExpectedElements = 10_000_000, ErrorRate = 0.01, Method = HashMethod.Murmur3 }); }); // 方式 3: 高级配置 (主从、哨兵、集群) services.AddBloomFilter(setupAction => { setupAction.UseRedis(new FilterRedisOptions { Name = "ProductFilter", RedisKey = "BloomFilter:Products", Endpoints = new List { "redis-master:6379", "redis-slave1:6379", "redis-slave2:6379" }, Password = "your-redis-password", Ssl = true, ConnectTimeout = 5000, SyncTimeout = 3000, ExpectedElements = 20_000_000, ErrorRate = 0.001 }); }); ``` #### CSRedisCore ```csharp services.AddBloomFilter(setupAction => { setupAction.UseCSRedis(new FilterCSRedisOptions { Name = "OrderFilter", RedisKey = "BloomFilter:Orders", ConnectionStrings = new List { "localhost:6379,password=123456,defaultDatabase=0,poolsize=50,prefix=myapp:" }, ExpectedElements = 5_000_000, ErrorRate = 0.01 }); }); ``` #### FreeRedis ```csharp services.AddBloomFilter(setupAction => { setupAction.UseFreeRedis(new FilterFreeRedisOptions { Name = "CartFilter", RedisKey = "BloomFilter:Carts", ConnectionStrings = new List { "localhost:6379,password=123456" }, ExpectedElements = 1_000_000, ErrorRate = 0.01 }); }); ``` #### EasyCaching 集成 EasyCaching 提供了统一的缓存抽象层,允许您轻松切换底层缓存实现: ```csharp using EasyCaching.Core.Configurations; using Microsoft.Extensions.DependencyInjection; var services = new ServiceCollection(); // 1. 配置 EasyCaching services.AddEasyCaching(options => { // 配置 Redis 提供程序 options.UseRedis(config => { config.DBConfig.Endpoints.Add(new ServerEndPoint("127.0.0.1", 6379)); config.DBConfig.Database = 0; }, "redis-provider-1"); // 可以配置多个提供程序 options.UseRedis(config => { config.DBConfig.Endpoints.Add(new ServerEndPoint("127.0.0.1", 6379)); config.DBConfig.Database = 1; }, "redis-provider-2"); }); // 2. 配置 BloomFilter services.AddBloomFilter(setupAction => { // 使用第一个 Redis 提供程序 setupAction.UseEasyCachingRedis(new FilterEasyCachingRedisOptions { Name = "BF1", RedisKey = "BloomFilter1", ProviderName = "redis-provider-1", ExpectedElements = 10_000_000, ErrorRate = 0.01 }); // 使用第二个 Redis 提供程序 setupAction.UseEasyCachingRedis(new FilterEasyCachingRedisOptions { Name = "BF2", RedisKey = "BloomFilter2", ProviderName = "redis-provider-2", ExpectedElements = 5_000_000, ErrorRate = 0.001 }); }); var provider = services.BuildServiceProvider(); // 使用默认过滤器 var bf = provider.GetService(); bf.Add("value1"); // 使用指定名称的过滤器 var factory = provider.GetService(); var bf1 = factory.Get("BF1"); var bf2 = factory.Get("BF2"); bf1.Add("item1"); bf2.Add("item2"); ``` ### 实际应用场景 #### 1. 防止缓存穿透 ```csharp public class ProductService { private readonly IBloomFilter _bloomFilter; private readonly ICache _cache; private readonly IProductRepository _repository; public ProductService( IBloomFilter bloomFilter, ICache cache, IProductRepository repository) { _bloomFilter = bloomFilter; _cache = cache; _repository = repository; } public async Task GetProductAsync(string productId) { // 第一层防护: 布隆过滤器 if (!_bloomFilter.Contains(productId)) { // 商品一定不存在,直接返回 null return null; } // 第二层: 缓存 var cached = await _cache.GetAsync(productId); if (cached != null) { return cached; } // 第三层: 数据库 var product = await _repository.GetByIdAsync(productId); if (product != null) { await _cache.SetAsync(productId, product); } return product; } public async Task CreateProductAsync(Product product) { // 保存到数据库 await _repository.SaveAsync(product); // 添加到布隆过滤器 _bloomFilter.Add(product.Id); // 更新缓存 await _cache.SetAsync(product.Id, product); } } ``` #### 2. URL 去重 (爬虫系统) ```csharp public class WebCrawler { private readonly IBloomFilter _visitedUrls; private readonly Queue _urlQueue; public WebCrawler(IBloomFilter bloomFilter) { _visitedUrls = bloomFilter; _urlQueue = new Queue(); } public async Task CrawlAsync(string startUrl) { _urlQueue.Enqueue(startUrl); while (_urlQueue.Count > 0) { var url = _urlQueue.Dequeue(); // 检查是否已访问 if (_visitedUrls.Contains(url)) { continue; // 跳过已访问的 URL } // 标记为已访问 _visitedUrls.Add(url); // 抓取页面 var page = await DownloadPageAsync(url); // 处理页面 await ProcessPageAsync(page); // 提取新的 URL var newUrls = ExtractUrls(page); foreach (var newUrl in newUrls) { if (!_visitedUrls.Contains(newUrl)) { _urlQueue.Enqueue(newUrl); } } } } } ``` #### 3. 分布式去重 (多实例) ```csharp // 配置分布式布隆过滤器 services.AddBloomFilter(setupAction => { setupAction.UseRedis(new FilterRedisOptions { Name = "GlobalDeduplication", RedisKey = "BF:Dedup", Endpoints = new List { "redis-cluster:6379" }, ExpectedElements = 100_000_000, ErrorRate = 0.0001 }); }); // 在多个服务实例中使用 public class MessageProcessor { private readonly IBloomFilter _bloomFilter; public async Task ProcessMessageAsync(Message message) { // 所有实例共享同一个 Redis 布隆过滤器 if (await _bloomFilter.ContainsAsync(message.Id)) { // 消息已被其他实例处理 return; } // 标记为已处理 await _bloomFilter.AddAsync(message.Id); // 处理消息 await HandleMessageAsync(message); } } ``` ## 哈希算法 BloomFilter.NetCore 支持 20+ 种哈希算法,可根据性能和准确性需求选择: ### 算法分类 | 类别 | 算法 | 特点 | 适用场景 | |------|------|------|----------| | **LCG 类** | LCGWithFNV1
LCGWithFNV1a
LCGModifiedFNV1 | 极快,但质量较低 | 性能要求极高,可容忍高误报率 | | **RNG 类** | RNGWithFNV1
RNGWithFNV1a
RNGModifiedFNV1 | 质量高,但较慢 | 对准确性要求高的场景 | | **校验和** | CRC32
CRC64
Adler32 | 平衡性能和质量 | 通用场景 | | **Murmur 系列** | Murmur3
Murmur32BitsX86
Murmur128BitsX64
Murmur128BitsX86 | **推荐**,性能好,质量高 | 生产环境推荐 | | **加密哈希** | SHA1
SHA256
SHA384
SHA512 | 质量最高,但最慢 | 安全性要求极高的场景 | | **XXHash 系列** | XXHash32
XXHash64
XXHash3
XXHash128 | **最快**,质量优秀 | 高性能场景首选 | ### 选择建议 ```csharp // 推荐: 生产环境默认选择 Murmur3 (平衡性能和质量) var bf1 = FilterBuilder.Build(10_000_000, 0.01, HashMethod.Murmur3); // 高性能: 对性能要求极高,选择 XXHash3 var bf2 = FilterBuilder.Build(10_000_000, 0.01, HashMethod.XXHash3); // 高精度: 对误报率要求极低,选择 SHA256 + 更低的 errorRate var bf3 = FilterBuilder.Build(10_000_000, 0.0001, HashMethod.SHA256); // 分布式: Redis 场景推荐 XXHash64 (速度快且跨语言支持好) var bf4 = FilterRedisBuilder.Build( "localhost:6379", "MyFilter", 10_000_000, 0.01, HashMethod.XXHash64 ); ``` ## 性能基准测试 ### 测试环境 ``` BenchmarkDotNet=v0.13.5 OS: Windows 11 (10.0.22621.1778/22H2) CPU: AMD Ryzen 7 5800X, 1 CPU, 16 logical cores, 8 physical cores .NET SDK: 7.0.304 Runtime: .NET 7.0.7 (7.0.723.27404), X64 RyuJIT AVX2 ``` ### 性能排名 (64 字节数据) | 排名 | 算法 | 平均时间 | 相对速度 | |------|------|----------|----------| | 🥇 1 | XXHash3 | 33.14 ns | 基准 (最快) | | 🥈 2 | XXHash128 | 36.01 ns | 1.09x | | 🥉 3 | CRC64 | 38.83 ns | 1.17x | | 4 | XXHash64 | 50.62 ns | 1.53x | | 5 | Murmur3 | 70.98 ns | 2.14x | | ... | ... | ... | ... | | 28 | SHA512 | 1,368.20 ns | 41.28x (最慢) | ### 完整性能数据
点击展开完整基准测试结果 #### 64 字节数据 | 算法 | 平均时间 | 误差 | 标准差 | 内存分配 | |------|---------|------|--------|---------| | XXHash3 | 33.14 ns | 0.295 ns | 0.276 ns | 80 B | | XXHash128 | 36.01 ns | 0.673 ns | 0.749 ns | 80 B | | CRC64 | 38.83 ns | 0.399 ns | 0.333 ns | 80 B | | XXHash64 | 50.62 ns | 0.756 ns | 0.670 ns | 80 B | | Murmur3 | 70.98 ns | 1.108 ns | 1.036 ns | 80 B | | XXHash32 | 73.15 ns | 0.526 ns | 0.466 ns | 80 B | | Murmur128BitsX64 | 80.15 ns | 0.783 ns | 0.653 ns | 120 B | | Murmur128BitsX86 | 82.73 ns | 1.211 ns | 1.011 ns | 120 B | | LCGWithFNV1 | 91.27 ns | 1.792 ns | 2.134 ns | 80 B | | CRC32 | 145.63 ns | 1.528 ns | 1.429 ns | 328 B | | Adler32 | 150.07 ns | 0.664 ns | 0.589 ns | 336 B | | RNGWithFNV1 | 445.32 ns | 8.463 ns | 9.747 ns | 384 B | | SHA256 | 922.30 ns | 4.478 ns | 3.739 ns | 496 B | | SHA1 | 1,045.67 ns | 6.411 ns | 5.997 ns | 464 B | | SHA384 | 1,173.67 ns | 5.050 ns | 3.942 ns | 456 B | | SHA512 | 1,368.20 ns | 10.967 ns | 9.722 ns | 504 B | #### 1 MB 数据 | 算法 | 平均时间 | |------|---------| | XXHash3 | 30,258.92 ns (~30 μs) | | XXHash128 | 33,778.68 ns (~34 μs) | | CRC64 | 56,321.74 ns (~56 μs) | | XXHash64 | 100,570.79 ns (~101 μs) | | Murmur128BitsX64 | 163,915.44 ns (~164 μs) | | ... | ... | | SHA1 | 3,381,425.73 ns (~3.4 ms) |
### 性能建议 1. **通用场景**: 使用 `Murmur3` (默认),性能和质量平衡 2. **极限性能**: 使用 `XXHash3`,比 Murmur3 快 2 倍 3. **大数据**: 使用 `XXHash128` 或 `Murmur128BitsX64`,128 位输出减少碰撞 4. **避免使用**: LCG 系列 (质量差)、SHA 系列 (太慢) ## 高级用法 ### 序列化和反序列化 ```csharp // 导出布隆过滤器状态 var bf = FilterBuilder.Build(1_000_000, 0.01); bf.Add("item1"); bf.Add("item2"); // 获取内部状态 (用于持久化) var memory = (FilterMemory)bf; var buckets = memory.Buckets; // BitArray[] var bucketBytes = memory.BucketBytes; // byte[][] // 从状态恢复布隆过滤器 var options = new FilterMemoryOptions { Name = "RestoredFilter", ExpectedElements = 1_000_000, ErrorRate = 0.01, Buckets = buckets // 或使用 BucketBytes }; var restoredBf = FilterBuilder.Build(options); Console.WriteLine(restoredBf.Contains("item1")); // True ``` ### 批量操作 ```csharp // 批量添加 var items = Enumerable.Range(1, 10000) .Select(i => Encoding.UTF8.GetBytes($"user:{i}")) .ToArray(); var addResults = bf.Add(items); Console.WriteLine($"成功添加: {addResults.Count(r => r)} 个元素"); // 批量检查 var checkResults = bf.Contains(items); Console.WriteLine($"存在: {checkResults.Count(r => r)} 个元素"); // 检查所有元素是否都存在 bool allExist = bf.All(items); // 异步批量操作 var asyncAddResults = await bf.AddAsync(items); var asyncCheckResults = await bf.ContainsAsync(items); bool asyncAllExist = await bf.AllAsync(items); ``` ### 自定义哈希函数 ```csharp using BloomFilter.HashAlgorithms; // 实现自定义哈希算法 public class MyCustomHash : HashFunction { public override long ComputeHash(ReadOnlySpan data) { // 自定义哈希逻辑 long hash = 0; foreach (var b in data) { hash = hash * 31 + b; } return hash; } } // 使用自定义哈希 var customHash = new MyCustomHash(); var bf = FilterBuilder.Build(1_000_000, 0.01, customHash); ``` ### 计算实际误报率 ```csharp var bf = FilterBuilder.Build(100_000, 0.01); // 添加 50,000 个元素 for (int i = 0; i < 50_000; i++) { bf.Add($"item:{i}"); } // 计算理论误报率 var filter = (Filter)bf; double theoreticalErrorRate = Filter.BestP( filter.Hashes, filter.Capacity, 50_000 ); Console.WriteLine($"理论误报率: {theoreticalErrorRate:P4}"); // 测试实际误报率 int falsePositives = 0; int testCount = 100_000; for (int i = 50_000; i < 50_000 + testCount; i++) { if (bf.Contains($"item:{i}")) { falsePositives++; } } double actualErrorRate = (double)falsePositives / testCount; Console.WriteLine($"实际误报率: {actualErrorRate:P4}"); Console.WriteLine($"误报数量: {falsePositives} / {testCount}"); ``` ### 监控和统计 ```csharp public class BloomFilterMonitor { private readonly IBloomFilter _filter; private long _addCount; private long _hitCount; private long _missCount; public BloomFilterMonitor(IBloomFilter filter) { _filter = filter; } public bool Add(string item) { Interlocked.Increment(ref _addCount); return _filter.Add(item); } public bool Contains(string item) { var result = _filter.Contains(item); if (result) Interlocked.Increment(ref _hitCount); else Interlocked.Increment(ref _missCount); return result; } public void PrintStats() { Console.WriteLine($"总添加: {_addCount}"); Console.WriteLine($"命中: {_hitCount}"); Console.WriteLine($"未命中: {_missCount}"); Console.WriteLine($"命中率: {(double)_hitCount / (_hitCount + _missCount):P2}"); } } ``` ## API 参考 ### IBloomFilter 接口 ```csharp public interface IBloomFilter : IDisposable { // 属性 string Name { get; } // 同步方法 bool Add(ReadOnlySpan data); IList Add(IEnumerable elements); bool Contains(ReadOnlySpan element); IList Contains(IEnumerable elements); bool All(IEnumerable elements); void Clear(); long[] ComputeHash(ReadOnlySpan data); // 异步方法 ValueTask AddAsync(ReadOnlyMemory data); ValueTask> AddAsync(IEnumerable elements); ValueTask ContainsAsync(ReadOnlyMemory element); ValueTask> ContainsAsync(IEnumerable elements); ValueTask AllAsync(IEnumerable elements); ValueTask ClearAsync(); } ``` ### Filter 基类 ```csharp public abstract class Filter : IBloomFilter { // 属性 public string Name { get; } public HashFunction Hash { get; } public long Capacity { get; } public int Hashes { get; } public long ExpectedElements { get; } public double ErrorRate { get; } // 静态方法 (数学计算) public static long BestM(long n, double p); public static int BestK(long n, long m); public static long BestN(int k, long m); public static double BestP(int k, long m, long insertedElements); } ``` ### FilterBuilder ```csharp public static class FilterBuilder { // 使用预期元素数和误报率 public static IBloomFilter Build(long expectedElements, double errorRate); public static IBloomFilter Build(long expectedElements, double errorRate, HashMethod method); public static IBloomFilter Build(long expectedElements, double errorRate, HashFunction hash); // 使用容量和哈希函数数量 public static IBloomFilter Build(long capacity, int hashes, HashMethod method); public static IBloomFilter Build(long capacity, int hashes, HashFunction hash); // 使用配置对象 public static IBloomFilter Build(FilterMemoryOptions options); } ``` ### FilterRedisBuilder ```csharp public static class FilterRedisBuilder { public static IBloomFilter Build( string redisHost, string name, long expectedElements, double errorRate, HashMethod method = HashMethod.Murmur3); } ``` ### 扩展方法 ```csharp // 服务注册 public static class ServiceCollectionExtensions { public static IServiceCollection AddBloomFilter( this IServiceCollection services, Action setupAction); } // 配置扩展 public static class BloomFilterOptionsExtensions { public static BloomFilterOptions UseInMemory( this BloomFilterOptions options, Action setup = null); public static BloomFilterOptions UseRedis( this BloomFilterOptions options, FilterRedisOptions setup); public static BloomFilterOptions UseCSRedis( this BloomFilterOptions options, FilterCSRedisOptions setup); public static BloomFilterOptions UseFreeRedis( this BloomFilterOptions options, FilterFreeRedisOptions setup); public static BloomFilterOptions UseEasyCachingRedis( this BloomFilterOptions options, FilterEasyCachingRedisOptions setup); } ``` ## 常见问题 (FAQ) ### 1. 布隆过滤器的误报率是多少? 误报率由您在创建时指定的 `errorRate` 参数决定。例如: ```csharp // 1% 误报率 var bf = FilterBuilder.Build(1_000_000, 0.01); // 0.1% 误报率 (更准确,但占用更多内存) var bf2 = FilterBuilder.Build(1_000_000, 0.001); ``` **注意**: 误报率越低,需要的内存空间越大。 ### 2. 如何选择 expectedElements? `expectedElements` 应设置为您预期要添加的元素数量。如果实际添加的元素超过这个数量,误报率会增加。 建议: - 估算实际元素数量 - 留出 20%-50% 的冗余 - 定期监控实际误报率 ### 3. 内存模式 vs Redis 模式如何选择? | 场景 | 推荐模式 | 原因 | |------|---------|------| | 单实例应用 | 内存模式 | 性能最高,无网络开销 | | 多实例应用 | Redis 模式 | 共享状态,支持分布式 | | 需要持久化 | Redis 模式 | Redis 提供持久化 | | 临时去重 | 内存模式 | 简单快速 | | 跨服务共享 | Redis 模式 | 支持多语言访问 | ### 4. 如何清空布隆过滤器? ```csharp // 同步清空 bf.Clear(); // 异步清空 await bf.ClearAsync(); ``` **注意**: 清空操作会删除所有数据,谨慎使用! ### 5. 布隆过滤器占用多少内存? 内存占用取决于容量 (m): ``` 内存 (字节) = m / 8 ``` 示例计算: ```csharp // 1000 万元素, 1% 误报率 var bf = FilterBuilder.Build(10_000_000, 0.01); var filter = (Filter)bf; // 计算内存占用 long bits = filter.Capacity; long bytes = bits / 8; double mb = bytes / (1024.0 * 1024.0); Console.WriteLine($"位数组大小: {bits:N0} bits"); Console.WriteLine($"内存占用: {bytes:N0} bytes ({mb:F2} MB)"); // 输出: 约 11.4 MB ``` ### 6. 可以删除元素吗? **不可以**。标准布隆过滤器不支持删除操作,因为: - 多个元素可能映射到相同的位 - 删除一个元素可能影响其他元素的检测 如果需要删除功能,考虑使用: - Counting Bloom Filter (计数布隆过滤器) - Cuckoo Filter (布谷鸟过滤器) ### 7. 线程安全吗? 是的,BloomFilter.NetCore 是线程安全的: ```csharp // 多线程并发访问 var bf = FilterBuilder.Build(10_000_000, 0.01); Parallel.For(0, 1000, i => { bf.Add($"item:{i}"); // 线程安全 }); Parallel.For(0, 1000, i => { var exists = bf.Contains($"item:{i}"); // 线程安全 }); ``` ### 8. 如何监控 Redis 连接? ```csharp // 使用 StackExchange.Redis 的连接监控 services.AddBloomFilter(setupAction => { setupAction.UseRedis(new FilterRedisOptions { Name = "MyFilter", RedisKey = "BF:Key", Endpoints = new List { "localhost:6379" }, // 启用连接日志 AbortOnConnectFail = false, ConnectTimeout = 5000, ConnectRetry = 3 }); }); // 获取 Redis 连接信息 var bf = serviceProvider.GetService(); if (bf is FilterRedis redisFilter) { var connection = redisFilter.Connection; Console.WriteLine($"连接状态: {connection.IsConnected}"); Console.WriteLine($"端点: {string.Join(", ", connection.GetEndPoints())}"); } ``` ## 贡献指南 我们欢迎社区贡献! ### 如何贡献 1. Fork 本仓库 2. 创建特性分支 (`git checkout -b feature/amazing-feature`) 3. 提交更改 (`git commit -m 'Add amazing feature'`) 4. 推送到分支 (`git push origin feature/amazing-feature`) 5. 创建 Pull Request ### 开发指南 ```bash # 克隆仓库 git clone https://github.com/vla/BloomFilter.NetCore.git cd BloomFilter.NetCore # 还原依赖 dotnet restore # 构建项目 dotnet build # 运行测试 dotnet test # 运行基准测试 cd test/BenchmarkTest dotnet run -c Release ``` ### 代码规范 - 遵循 C# 编码规范 - 添加 XML 文档注释 - 编写单元测试 - 更新相关文档 ## 致谢 感谢所有为本项目做出贡献的开发者! 特别感谢: - .NET Foundation - StackExchange.Redis 团队 - 所有依赖库的作者 如果这个项目对您有帮助,请给我们一个 ⭐️ Star! ================================================ FILE: VERSION ================================================ 3.0.0 ================================================ FILE: build.cmd ================================================ set artifacts=%~dp0artifacts if exist %artifacts% rd /q /s %artifacts% set /p ver=Specifies that null is allowed as an input even if the corresponding type disallows it. [AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false)] internal sealed class AllowNullAttribute : Attribute { } /// Specifies that null is disallowed as an input even if the corresponding type allows it. [AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property, Inherited = false)] internal sealed class DisallowNullAttribute : Attribute { } /// Specifies that an output may be null even if the corresponding type disallows it. [AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false)] internal sealed class MaybeNullAttribute : Attribute { } /// Specifies that an output will not be null even if the corresponding type allows it. [AttributeUsage(AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, Inherited = false)] internal sealed class NotNullAttribute : Attribute { } /// Specifies that when a method returns , the parameter may be null even if the corresponding type disallows it. [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] internal sealed class MaybeNullWhenAttribute : Attribute { /// Initializes the attribute with the specified return value condition. /// /// The return value condition. If the method returns this value, the associated parameter may be null. /// public MaybeNullWhenAttribute(bool returnValue) => ReturnValue = returnValue; /// Gets the return value condition. public bool ReturnValue { get; } } /// Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] internal sealed class NotNullWhenAttribute : Attribute { /// Initializes the attribute with the specified return value condition. /// /// The return value condition. If the method returns this value, the associated parameter will not be null. /// public NotNullWhenAttribute(bool returnValue) => ReturnValue = returnValue; /// Gets the return value condition. public bool ReturnValue { get; } } /// Specifies that the output will be non-null if the named parameter is non-null. [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.ReturnValue, AllowMultiple = true, Inherited = false)] internal sealed class NotNullIfNotNullAttribute : Attribute { /// Initializes the attribute with the associated parameter name. /// /// The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null. /// public NotNullIfNotNullAttribute(string parameterName) => ParameterName = parameterName; /// Gets the associated parameter name. public string ParameterName { get; } } /// Applied to a method that will never return under any circumstance. [AttributeUsage(AttributeTargets.Method, Inherited = false)] internal sealed class DoesNotReturnAttribute : Attribute { } /// Specifies that the method will not return if the associated Boolean parameter is passed the specified value. [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] internal sealed class DoesNotReturnIfAttribute : Attribute { /// Initializes the attribute with the specified parameter value. /// /// The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to /// the associated parameter matches this value. /// public DoesNotReturnIfAttribute(bool parameterValue) => ParameterValue = parameterValue; /// Gets the condition parameter value. public bool ParameterValue { get; } } /// Specifies that the method or property will ensure that the listed field and property members have not-null values. [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] internal sealed class MemberNotNullAttribute : Attribute { /// Initializes the attribute with a field or property member. /// /// The field or property member that is promised to be not-null. /// public MemberNotNullAttribute(string member) => Members = new[] { member }; /// Initializes the attribute with the list of field and property members. /// /// The list of field and property members that are promised to be not-null. /// public MemberNotNullAttribute(params string[] members) => Members = members; /// Gets field or property member names. public string[] Members { get; } } /// Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition. [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] internal sealed class MemberNotNullWhenAttribute : Attribute { /// Initializes the attribute with the specified return value condition and a field or property member. /// /// The return value condition. If the method returns this value, the associated parameter will not be null. /// /// /// The field or property member that is promised to be not-null. /// public MemberNotNullWhenAttribute(bool returnValue, string member) { ReturnValue = returnValue; Members = new[] { member }; } /// Initializes the attribute with the specified return value condition and list of field and property members. /// /// The return value condition. If the method returns this value, the associated parameter will not be null. /// /// /// The list of field and property members that are promised to be not-null. /// public MemberNotNullWhenAttribute(bool returnValue, params string[] members) { ReturnValue = returnValue; Members = members; } /// Gets the return value condition. public bool ReturnValue { get; } /// Gets field or property member names. public string[] Members { get; } } #endif #if NETSTANDARD2_1 namespace System.Diagnostics.CodeAnalysis; /// Specifies that the method or property will ensure that the listed field and property members have not-null values. [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] internal sealed class MemberNotNullAttribute : Attribute { /// Initializes the attribute with a field or property member. /// /// The field or property member that is promised to be not-null. /// public MemberNotNullAttribute(string member) => Members = new[] { member }; /// Initializes the attribute with the list of field and property members. /// /// The list of field and property members that are promised to be not-null. /// public MemberNotNullAttribute(params string[] members) => Members = members; /// Gets field or property member names. public string[] Members { get; } } /// Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition. [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] internal sealed class MemberNotNullWhenAttribute : Attribute { /// Initializes the attribute with the specified return value condition and a field or property member. /// /// The return value condition. If the method returns this value, the associated parameter will not be null. /// /// /// The field or property member that is promised to be not-null. /// public MemberNotNullWhenAttribute(bool returnValue, string member) { ReturnValue = returnValue; Members = new[] { member }; } /// Initializes the attribute with the specified return value condition and list of field and property members. /// /// The return value condition. If the method returns this value, the associated parameter will not be null. /// /// /// The list of field and property members that are promised to be not-null. /// public MemberNotNullWhenAttribute(bool returnValue, params string[] members) { ReturnValue = returnValue; Members = members; } /// Gets the return value condition. public bool ReturnValue { get; } /// Gets field or property member names. public string[] Members { get; } } #endif ================================================ FILE: src/BloomFilter/AsyncLock.cs ================================================ using System; using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; namespace BloomFilter; /// /// AsyncLock /// internal readonly struct AsyncLock : IDisposable { private readonly SemaphoreSlim _semaphore; private readonly Releaser _releaser; private readonly Task _releaserTask; public int MaxCount { get; } public AsyncLock() : this(1) { } public AsyncLock(int maxCount = 1) { MaxCount = maxCount; _semaphore = new SemaphoreSlim(maxCount); _releaser = new Releaser(_semaphore); _releaserTask = Task.FromResult(_releaser); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public Releaser Acquire() { _semaphore.Wait(); return _releaser; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public Task AcquireAsync(bool continueOnCapturedContext = false) { var acquireAsync = _semaphore.WaitAsync(); return Return(acquireAsync, continueOnCapturedContext); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Dispose() => _semaphore.Dispose(); [MethodImpl(MethodImplOptions.AggressiveInlining)] private Task Return(Task acquireAsync, bool continueOnCapturedContext) { return acquireAsync.Status == TaskStatus.RanToCompletion ? _releaserTask : WaitForAcquireAsync(acquireAsync, continueOnCapturedContext); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private async Task WaitForAcquireAsync(Task acquireAsync, bool continueOnCapturedContext) { await acquireAsync.ConfigureAwait(continueOnCapturedContext); return _releaser; } public readonly struct Releaser(SemaphoreSlim? semaphore) : IDisposable { [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Dispose() => semaphore?.Release(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public int GetRemainingCount() { return MaxCount - _semaphore.CurrentCount; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public int GetCurrentCount() { return _semaphore.CurrentCount; } } ================================================ FILE: src/BloomFilter/BinaryHelper.cs ================================================ using System; using System.Collections; using System.Numerics; using System.Runtime.CompilerServices; #if NET6_0_OR_GREATER using System.Buffers.Binary; #endif namespace BloomFilter; internal class BinaryHelper { public static int BitToIntOne(BitArray bit, int from, int to) { const int size = 32; int len = to - from; int bitCount = bit.Count; int result = 0; for (int i = 0; i < len && i < bitCount && i < size; i++) { result = bit[i + from] ? result + (1 << i) : result; } return result; } /// /// Perform rejection sampling on a 32-bit, /// https://en.wikipedia.org/wiki/Rejection_sampling /// /// The random. /// integer output range. /// public static long Rejection(long random, long m) { var intMax = (long)uint.MaxValue; random = Math.Abs(random); if (random > (intMax - intMax % m) || random == uint.MinValue) return -1; return random % m; } public static uint NumberOfTrailingZeros(uint i) { // HD, Figure 5-14 uint y; if (i == 0) return 32; uint n = 31; y = i << 16; if (y != 0) { n -= 16; i = y; } y = i << 8; if (y != 0) { n -= 8; i = y; } y = i << 4; if (y != 0) { n -= 4; i = y; } y = i << 2; if (y != 0) { n -= 2; i = y; } return n - ((i << 1) >> 31); } public static uint NumberOfLeadingZeros(uint i) { // HD, Figure 5-6 if (i == 0) return 32; uint n = 1; if (i >> 16 == 0) { n += 16; i <<= 16; } if (i >> 24 == 0) { n += 8; i <<= 8; } if (i >> 28 == 0) { n += 4; i <<= 4; } if (i >> 30 == 0) { n += 2; i <<= 2; } n -= i >> 31; return n; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int RotateLeft(int i, int distance) { #if NET6_0_OR_GREATER return (int)BitOperations.RotateLeft((uint)i, distance); #else return (i << distance) | (int)((uint)i >> -distance); #endif } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static uint RotateLeft(uint i, int distance) { #if NET6_0_OR_GREATER return BitOperations.RotateLeft(i, distance); #else return (i << distance) | (i >> -distance); #endif } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int RotateRight(int i, int distance) { #if NET6_0_OR_GREATER return (int)BitOperations.RotateRight((uint)i, distance); #else return (int)((uint)i >> distance) | (i << -distance); #endif } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static uint RotateRight(uint i, int distance) { #if NET6_0_OR_GREATER return BitOperations.RotateRight(i, distance); #else return (i >> distance) | (i << -distance); #endif } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long RotateLeft(long i, int distance) { #if NET6_0_OR_GREATER return (long)BitOperations.RotateLeft((ulong)i, distance); #else return (i << distance) | (long)((ulong)i >> -distance); #endif } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong RotateLeft(ulong i, int distance) { #if NET6_0_OR_GREATER return BitOperations.RotateLeft(i, distance); #else return (i << distance) | (i >> -distance); #endif } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long RotateRight(long i, int distance) { #if NET6_0_OR_GREATER return (long)BitOperations.RotateRight((ulong)i, distance); #else return (long)((ulong)i >> distance) | (i << -distance); #endif } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong RotateRight(ulong i, int distance) { #if NET6_0_OR_GREATER return BitOperations.RotateRight(i, distance); #else return (i >> distance) | (i << -distance); #endif } public static int RightMove(int value, int pos) { if (pos != 0) { var mask = 0x7fffffff; value >>= 1; value &= mask; value >>= pos - 1; } return value; } public static long RightMove(long value, int pos) { if (pos != 0) { var mask = 0x7fffffff; value >>= 1; value &= mask; value >>= pos - 1; } return value; } public static uint RightMove(uint value, int pos) { if (pos != 0) { uint mask = 0x7fffffff; value >>= 1; value &= mask; value >>= pos - 1; } return value; } } ================================================ FILE: src/BloomFilter/BloomFilter.csproj ================================================  BloomFilter BloomFilter BloomFilter.NetCore net462;netstandard2.0;net6.0;net7.0;net8.0;net9.0;net10.0 true true enable true $(NoWarn);CS1591 ================================================ FILE: src/BloomFilter/BloomFilterConstValue.cs ================================================ namespace BloomFilter; public class BloomFilterConstValue { /// /// The default name of the in-memory. /// public const string DefaultInMemoryName = "DefaultInMemory"; /// /// The default name of the redis. /// public const string DefaultRedisName = "DefaultRedis"; } ================================================ FILE: src/BloomFilter/BloomFilterExtensions.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BloomFilter; /// /// BloomFilterExtensions /// public static class BloomFilterExtensions { #region Byte public static bool Add(this IBloomFilter bloomFilter, byte data) => bloomFilter.Add(new[] { data }); public static ValueTask AddAsync(this IBloomFilter bloomFilter, byte data) => bloomFilter.AddAsync(new[] { data }); public static bool Contains(this IBloomFilter bloomFilter, byte data) => bloomFilter.Contains(new[] { data }); public static ValueTask ContainsAsync(this IBloomFilter bloomFilter, byte data) => bloomFilter.ContainsAsync(new[] { data }); public static IList Add(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Add(elements.Select(data => new byte[] { data })); public static ValueTask> AddAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AddAsync(elements.Select(data => new byte[] { data })); public static IList Contains(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Contains(elements.Select(data => new byte[] { data })); public static ValueTask> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.ContainsAsync(elements.Select(data => new byte[] { data })); public static bool All(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.All(elements.Select(data => new byte[] { data })); public static ValueTask AllAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AllAsync(elements.Select(data => new byte[] { data })); #endregion Byte #region String public static bool Add(this IBloomFilter bloomFilter, string data) => bloomFilter.Add(Encoding.UTF8.GetBytes(data)); public static ValueTask AddAsync(this IBloomFilter bloomFilter, string data) => bloomFilter.AddAsync(Encoding.UTF8.GetBytes(data)); public static bool Contains(this IBloomFilter bloomFilter, string data) => bloomFilter.Contains(Encoding.UTF8.GetBytes(data)); public static ValueTask ContainsAsync(this IBloomFilter bloomFilter, string data) => bloomFilter.ContainsAsync(Encoding.UTF8.GetBytes(data)); public static IList Add(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Add(elements.Select(data => Encoding.UTF8.GetBytes(data))); public static ValueTask> AddAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AddAsync(elements.Select(data => Encoding.UTF8.GetBytes(data))); public static IList Contains(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Contains(elements.Select(data => Encoding.UTF8.GetBytes(data))); public static ValueTask> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.ContainsAsync(elements.Select(data => Encoding.UTF8.GetBytes(data))); public static bool All(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.All(elements.Select(data => Encoding.UTF8.GetBytes(data))); public static ValueTask AllAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AllAsync(elements.Select(data => Encoding.UTF8.GetBytes(data))); #endregion String #region ReadOnlySpan public static bool Add(this IBloomFilter bloomFilter, ReadOnlySpan data) => bloomFilter.Add(data.ToUtf8().Span); public static ValueTask AddAsync(this IBloomFilter bloomFilter, ReadOnlyMemory data) => bloomFilter.AddAsync(data.Span.ToUtf8()); public static bool Contains(this IBloomFilter bloomFilter, ReadOnlySpan data) => bloomFilter.Contains(data.ToUtf8().Span); public static ValueTask ContainsAsync(this IBloomFilter bloomFilter, ReadOnlyMemory data) => bloomFilter.ContainsAsync(data.Span.ToUtf8()); #endregion String #region Double public static bool Add(this IBloomFilter bloomFilter, double data) => bloomFilter.Add(BitConverter.GetBytes(data)); public static ValueTask AddAsync(this IBloomFilter bloomFilter, double data) => bloomFilter.AddAsync(BitConverter.GetBytes(data)); public static bool Contains(this IBloomFilter bloomFilter, double data) => bloomFilter.Contains(BitConverter.GetBytes(data)); public static ValueTask ContainsAsync(this IBloomFilter bloomFilter, double data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data)); public static IList Add(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> AddAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data))); public static IList Contains(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data))); public static bool All(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask AllAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data))); #endregion Double #region Single public static bool Add(this IBloomFilter bloomFilter, float data) => bloomFilter.Add(BitConverter.GetBytes(data)); public static ValueTask AddAsync(this IBloomFilter bloomFilter, float data) => bloomFilter.AddAsync(BitConverter.GetBytes(data)); public static bool Contains(this IBloomFilter bloomFilter, float data) => bloomFilter.Contains(BitConverter.GetBytes(data)); public static ValueTask ContainsAsync(this IBloomFilter bloomFilter, float data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data)); public static IList Add(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> AddAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data))); public static IList Contains(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data))); public static bool All(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask AllAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data))); #endregion Single #region Int16 public static bool Add(this IBloomFilter bloomFilter, short data) => bloomFilter.Add(BitConverter.GetBytes(data)); public static ValueTask AddAsync(this IBloomFilter bloomFilter, short data) => bloomFilter.AddAsync(BitConverter.GetBytes(data)); public static bool Contains(this IBloomFilter bloomFilter, short data) => bloomFilter.Contains(BitConverter.GetBytes(data)); public static ValueTask ContainsAsync(this IBloomFilter bloomFilter, short data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data)); public static IList Add(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> AddAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data))); public static IList Contains(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data))); public static bool All(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask AllAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data))); #endregion Int16 #region Int32 public static bool Add(this IBloomFilter bloomFilter, int data) => bloomFilter.Add(BitConverter.GetBytes(data)); public static ValueTask AddAsync(this IBloomFilter bloomFilter, int data) => bloomFilter.AddAsync(BitConverter.GetBytes(data)); public static bool Contains(this IBloomFilter bloomFilter, int data) => bloomFilter.Contains(BitConverter.GetBytes(data)); public static ValueTask ContainsAsync(this IBloomFilter bloomFilter, int data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data)); public static IList Add(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> AddAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data))); public static IList Contains(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data))); public static bool All(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask AllAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data))); #endregion Int32 #region Int64 public static bool Add(this IBloomFilter bloomFilter, long data) => bloomFilter.Add(BitConverter.GetBytes(data)); public static ValueTask AddAsync(this IBloomFilter bloomFilter, long data) => bloomFilter.AddAsync(BitConverter.GetBytes(data)); public static bool Contains(this IBloomFilter bloomFilter, long data) => bloomFilter.Contains(BitConverter.GetBytes(data)); public static ValueTask ContainsAsync(this IBloomFilter bloomFilter, long data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data)); public static IList Add(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> AddAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data))); public static IList Contains(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data))); public static bool All(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask AllAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data))); #endregion Int64 #region UInt16 public static bool Add(this IBloomFilter bloomFilter, ushort data) => bloomFilter.Add(BitConverter.GetBytes(data)); public static ValueTask AddAsync(this IBloomFilter bloomFilter, ushort data) => bloomFilter.AddAsync(BitConverter.GetBytes(data)); public static bool Contains(this IBloomFilter bloomFilter, ushort data) => bloomFilter.Contains(BitConverter.GetBytes(data)); public static ValueTask ContainsAsync(this IBloomFilter bloomFilter, ushort data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data)); public static IList Add(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> AddAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data))); public static IList Contains(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data))); public static bool All(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask AllAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data))); #endregion UInt16 #region UInt32 public static bool Add(this IBloomFilter bloomFilter, uint data) => bloomFilter.Add(BitConverter.GetBytes(data)); public static ValueTask AddAsync(this IBloomFilter bloomFilter, uint data) => bloomFilter.AddAsync(BitConverter.GetBytes(data)); public static bool Contains(this IBloomFilter bloomFilter, uint data) => bloomFilter.Contains(BitConverter.GetBytes(data)); public static ValueTask ContainsAsync(this IBloomFilter bloomFilter, uint data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data)); public static IList Add(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> AddAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data))); public static IList Contains(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data))); public static bool All(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask AllAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data))); #endregion UInt32 #region UInt64 public static bool Add(this IBloomFilter bloomFilter, ulong data) => bloomFilter.Add(BitConverter.GetBytes(data)); public static ValueTask AddAsync(this IBloomFilter bloomFilter, ulong data) => bloomFilter.AddAsync(BitConverter.GetBytes(data)); public static bool Contains(this IBloomFilter bloomFilter, ulong data) => bloomFilter.Contains(BitConverter.GetBytes(data)); public static ValueTask ContainsAsync(this IBloomFilter bloomFilter, ulong data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data)); public static IList Add(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> AddAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data))); public static IList Contains(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data))); public static bool All(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data))); public static ValueTask AllAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data))); #endregion UInt64 #region DateTime public static bool Add(this IBloomFilter bloomFilter, DateTime data) => bloomFilter.Add(BitConverter.GetBytes(data.Ticks)); public static ValueTask AddAsync(this IBloomFilter bloomFilter, DateTime data) => bloomFilter.AddAsync(BitConverter.GetBytes(data.Ticks)); public static bool Contains(this IBloomFilter bloomFilter, DateTime data) => bloomFilter.Contains(BitConverter.GetBytes(data.Ticks)); public static ValueTask ContainsAsync(this IBloomFilter bloomFilter, DateTime data) => bloomFilter.ContainsAsync(BitConverter.GetBytes(data.Ticks)); public static IList Add(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Add(elements.Select(data => BitConverter.GetBytes(data.Ticks))); public static ValueTask> AddAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AddAsync(elements.Select(data => BitConverter.GetBytes(data.Ticks))); public static IList Contains(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.Contains(elements.Select(data => BitConverter.GetBytes(data.Ticks))); public static ValueTask> ContainsAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.ContainsAsync(elements.Select(data => BitConverter.GetBytes(data.Ticks))); public static bool All(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.All(elements.Select(data => BitConverter.GetBytes(data.Ticks))); public static ValueTask AllAsync(this IBloomFilter bloomFilter, IEnumerable elements) => bloomFilter.AllAsync(elements.Select(data => BitConverter.GetBytes(data.Ticks))); #endregion DateTime } ================================================ FILE: src/BloomFilter/Configurations/BloomFilterOptions.cs ================================================ using System; using System.Collections.Generic; namespace BloomFilter.Configurations; /// /// BloomFilterOptions /// public class BloomFilterOptions { /// /// Gets the extensions. /// /// The extensions. internal IList Extensions { get; } = new List(); /// /// Registers the extension. /// /// Extension. public void RegisterExtension(IBloomFilterOptionsExtension extension) { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(extension); #else if (extension == null) throw new ArgumentNullException(nameof(extension)); #endif Extensions.Add(extension); } } ================================================ FILE: src/BloomFilter/Configurations/FilterMemoryOptions.cs ================================================ using System.Collections; using System.Collections.Generic; namespace BloomFilter.Configurations; public class FilterMemoryOptions { /// /// The Name /// public string Name { get; set; } = BloomFilterConstValue.DefaultInMemoryName; /// /// The expected elements /// public long ExpectedElements { get; set; } = 1_000_000; /// /// The error rate /// public double ErrorRate { get; set; } = 0.01; /// /// The Hash Method /// public HashMethod Method { get; set; } = HashMethod.Murmur3; /// /// Multiple bitmap /// public BitArray[]? Buckets { get; set; } /// /// Multiple bitmap from bytes /// public IList? BucketBytes { get; set; } } ================================================ FILE: src/BloomFilter/Configurations/FilterMemoryOptionsExtension.cs ================================================ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; namespace BloomFilter.Configurations; public class FilterMemoryOptionsExtension : IBloomFilterOptionsExtension { private readonly FilterMemoryOptions _options; private readonly Type? _serializerType; /// /// Initializes a new instance of the class. /// /// Configure. /// public FilterMemoryOptionsExtension(FilterMemoryOptions options, Type? serializerType = null) { _options = options; _serializerType = serializerType; } public void AddServices(IServiceCollection services) { services.TryAddSingleton(); if (_serializerType is null) { services.TryAddSingleton(); } else { services.TryAddSingleton(typeof(IFilterMemorySerializer), _serializerType); } services.AddSingleton(x => { return new FilterMemory(_options, x.GetRequiredService()); }); } } ================================================ FILE: src/BloomFilter/Configurations/IBloomFilterOptionsExtension.cs ================================================ using Microsoft.Extensions.DependencyInjection; namespace BloomFilter.Configurations; /// /// BloomFilter options extension. /// public interface IBloomFilterOptionsExtension { /// /// Adds the services. /// /// Services. void AddServices(IServiceCollection services); } ================================================ FILE: src/BloomFilter/DefaultBloomFilterFactory.cs ================================================ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; namespace BloomFilter; public class DefaultBloomFilterFactory : IBloomFilterFactory { private readonly IEnumerable _bloomFilters; public DefaultBloomFilterFactory(IEnumerable bloomFilters) { _bloomFilters = bloomFilters; } public IBloomFilter Get(string name) { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(name); #else if (name == null) throw new ArgumentNullException(nameof(name)); #endif var filter = _bloomFilters.FirstOrDefault(x => x.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); if (filter == null) throw new ArgumentException("can not find a match BloomFilter"); return filter; } public bool TryGet(string name, #if NET5_0_OR_GREATER [MaybeNullWhen(false)] #endif out IBloomFilter bloomFilter) { bloomFilter = _bloomFilters.FirstOrDefault(x => x.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); return bloomFilter != null; } } ================================================ FILE: src/BloomFilter/DefaultFilterMemorySerializer.cs ================================================ using System; using System.Collections; using System.IO; using System.Text; using System.Threading.Tasks; namespace BloomFilter; public class DefaultFilterMemorySerializer : IFilterMemorySerializer { public async ValueTask SerializeAsync(FilterMemorySerializerParam param, Stream stream) { byte[] nameBytes = Encoding.UTF8.GetBytes(param.Name ?? string.Empty); await stream.WriteAsync(BitConverter.GetBytes(nameBytes.Length), 0, 4); await stream.WriteAsync(nameBytes, 0, nameBytes.Length); await stream.WriteAsync(BitConverter.GetBytes(param.ExpectedElements), 0, 8); await stream.WriteAsync(BitConverter.GetBytes(param.ErrorRate), 0, 8); await stream.WriteAsync(BitConverter.GetBytes((int)param.Method), 0, 4); await stream.WriteAsync(BitConverter.GetBytes(param.Buckets.Length), 0, 4); foreach (var bucket in param.Buckets) { byte[] bucketBytes = new byte[bucket.Length / 8 + Mod(bucket.Length)]; bucket.CopyTo(bucketBytes, 0); await stream.WriteAsync(BitConverter.GetBytes(bucketBytes.Length), 0, 4).ConfigureAwait(false); await stream.WriteAsync(bucketBytes, 0, bucketBytes.Length).ConfigureAwait(false); } } public async ValueTask DeserializeAsync(Stream stream) { byte[] lengthBytes = new byte[4]; byte[] int64Bytes = new byte[8]; // Read name await ReadExactlyAsync(stream, lengthBytes); int nameLength = BitConverter.ToInt32(lengthBytes, 0); byte[] nameBytes = new byte[nameLength]; await ReadExactlyAsync(stream, nameBytes); string name = Encoding.UTF8.GetString(nameBytes); // Read expected elements await ReadExactlyAsync(stream, int64Bytes); long expectedElements = BitConverter.ToInt64(int64Bytes, 0); // Read error rate await ReadExactlyAsync(stream, int64Bytes); double errorRate = BitConverter.ToDouble(int64Bytes, 0); // Read method await ReadExactlyAsync(stream, lengthBytes); HashMethod method = (HashMethod)BitConverter.ToInt32(lengthBytes, 0); // Read buckets await ReadExactlyAsync(stream, lengthBytes); int bucketsLength = BitConverter.ToInt32(lengthBytes, 0); var buckets = new BitArray[bucketsLength]; for (int i = 0; i < bucketsLength; i++) { await ReadExactlyAsync(stream, lengthBytes); int bitArrayLength = BitConverter.ToInt32(lengthBytes, 0); byte[] bucketBytes = new byte[bitArrayLength]; await ReadExactlyAsync(stream, bucketBytes); buckets[i] = new BitArray(bucketBytes); } // Create param with object initializer (compatible with init properties) return new FilterMemorySerializerParam { Name = name, ExpectedElements = expectedElements, ErrorRate = errorRate, Method = method, Buckets = buckets }; } private async Task ReadExactlyAsync(Stream stream, byte[] data) { #if NET7_0_OR_GREATER await stream.ReadExactlyAsync(data, 0, data.Length).ConfigureAwait(false); #else await stream.ReadAsync(data, 0, data.Length).ConfigureAwait(false); #endif } private int Mod(int len) => len % 8 > 0 ? 1 : 0; } ================================================ FILE: src/BloomFilter/Filter.cs ================================================ using System; using System.Collections.Generic; using System.Threading.Tasks; namespace BloomFilter; /// /// Represents a Bloom filter and provides /// /// public abstract class Filter : IBloomFilter { //256MB protected const int MaxInt = 2_147_483_640; /// /// Gets the name specified by BloomFilter. /// public string Name { get; } /// /// /// public HashFunction Hash { get; private set; } /// /// the Capacity of the Bloom filter /// public long Capacity { get; private set; } /// /// number of hash functions /// public int Hashes { get; private set; } /// /// the expected elements. /// public long ExpectedElements { get; private set; } /// /// the number of expected elements /// public double ErrorRate { get; private set; } /// /// Initializes a new instance of the class. /// /// /// The expected elements. /// The error rate. /// The hash function. /// /// expectedElements - expectedElements must be > 0 /// or /// errorRate /// /// hashFunction public Filter(string name, long expectedElements, double errorRate, HashFunction hashFunction) { if (expectedElements < 1) throw new ArgumentOutOfRangeException("expectedElements", expectedElements, "expectedElements must be > 0"); if (errorRate >= 1 || errorRate <= 0) throw new ArgumentOutOfRangeException("errorRate", errorRate, string.Format("errorRate must be between 0 and 1, exclusive. Was {0}", errorRate)); #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(hashFunction); #else if (hashFunction == null) throw new ArgumentNullException(nameof(hashFunction)); #endif Name = name; ExpectedElements = expectedElements; ErrorRate = errorRate; Hash = hashFunction; Capacity = BestM(expectedElements, errorRate); Hashes = BestK(expectedElements, Capacity); } /// /// Initializes a new instance of the class. /// /// /// The capacity. /// The hashes. /// The hash function. /// /// capacity - capacity must be > 0 /// or /// hashes - hashes must be > 0 /// /// hashFunction public Filter(string name, long capacity, int hashes, HashFunction hashFunction) { if (capacity < 1) throw new ArgumentOutOfRangeException("capacity", capacity, "capacity must be > 0"); if (hashes < 1) throw new ArgumentOutOfRangeException("hashes", hashes, "hashes must be > 0"); #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(hashFunction); #else if (hashFunction == null) throw new ArgumentNullException(nameof(hashFunction)); #endif Name = name; Capacity = capacity; Hashes = hashes; Hash = hashFunction; ExpectedElements = BestN(hashes, capacity); ErrorRate = BestP(hashes, capacity, ExpectedElements); } protected void SetFilterParam(long expectedElements, double errorRate, HashMethod method) { if (expectedElements < 1) throw new ArgumentOutOfRangeException("expectedElements", expectedElements, "expectedElements must be > 0"); if (errorRate >= 1 || errorRate <= 0) throw new ArgumentOutOfRangeException("errorRate", errorRate, string.Format("errorRate must be between 0 and 1, exclusive. Was {0}", errorRate)); ExpectedElements = expectedElements; ErrorRate = errorRate; Hash = HashFunction.Functions[method]; Capacity = BestM(expectedElements, errorRate); Hashes = BestK(expectedElements, Capacity); } /// /// Adds the passed value to the filter. /// /// /// public abstract bool Add(ReadOnlySpan data); /// /// Async Adds the passed value to the filter. /// /// /// public abstract ValueTask AddAsync(ReadOnlyMemory data); /// /// Adds the specified elements. /// /// The elements. /// public abstract IList Add(IEnumerable elements); /// /// Async Adds the specified elements. /// /// The elements. /// public abstract ValueTask> AddAsync(IEnumerable elements); /// /// Removes all elements from the filter /// public abstract void Clear(); /// /// Async Removes all elements from the filter /// public abstract ValueTask ClearAsync(); /// /// Tests whether an element is present in the filter /// /// /// public abstract bool Contains(ReadOnlySpan element); /// /// Async Tests whether an element is present in the filter /// /// /// public abstract ValueTask ContainsAsync(ReadOnlyMemory element); /// /// Tests whether an elements is present in the filter /// /// /// public abstract IList Contains(IEnumerable elements); /// /// Async Tests whether an elements is present in the filter /// /// /// public abstract ValueTask> ContainsAsync(IEnumerable elements); /// /// Alls the specified elements. /// /// The elements. /// public abstract bool All(IEnumerable elements); /// /// Async Alls the specified elements. /// /// The elements. /// public abstract ValueTask AllAsync(IEnumerable elements); /// /// Hashes the specified value. /// /// /// public long[] ComputeHash(ReadOnlySpan data) { return Hash.ComputeHash(data, Capacity, Hashes); } /// /// Calculates the optimal size of the bloom filter in bits given expectedElements (expected /// number of elements in bloom filter) and falsePositiveProbability (tolerable false positive rate). /// /// Expected number of elements inserted in the bloom filter /// Tolerable false positive rate /// the optimal siz of the bloom filter in bits public static long BestM(long n, double p) { return (long)Math.Ceiling(-1 * (n * Math.Log(p)) / Math.Pow(Math.Log(2), 2)); } /// /// Calculates the optimal hashes (number of hash function) given expectedElements (expected number of /// elements in bloom filter) and size (size of bloom filter in bits). /// /// Expected number of elements inserted in the bloom filter /// The size of the bloom filter in bits. /// the optimal amount of hash functions hashes public static int BestK(long n, long m) { return (int)Math.Ceiling((Math.Log(2) * m) / n); } /// /// Calculates the amount of elements a Bloom filter for which the given configuration of size and hashes is optimal. /// /// number of hashes /// The size of the bloom filter in bits. /// mount of elements a Bloom filter for which the given configuration of size and hashes is optimal public static long BestN(int k, long m) { return (long)Math.Ceiling((Math.Log(2) * m) / k); } /// /// Calculates the best-case (uniform hash function) false positive probability. /// /// number of hashes /// The size of the bloom filter in bits. /// number of elements inserted in the filter /// The calculated false positive probability public static double BestP(int k, long m, double insertedElements) { return Math.Pow((1 - Math.Exp(-k * insertedElements / m)), k); } public override string ToString() { return $"Capacity:{Capacity},Hashes:{Hashes},ExpectedElements:{ExpectedElements},ErrorRate:{ErrorRate}"; } protected static int LogMaxInt(long number, out int mod) { mod = (int)(number % MaxInt); return (int)(number / MaxInt); } /// /// Dispose /// public abstract void Dispose(); } ================================================ FILE: src/BloomFilter/FilterBuilder.cs ================================================ using System; using BloomFilter.Configurations; namespace BloomFilter; /// /// BloomFilter Builder - Supports both static factory methods and fluent API /// /// /// Static API: /// /// var filter = FilterBuilder.Build(10_000_000, 0.001); /// /// /// Fluent API: /// /// var filter = FilterBuilder.Create() /// .WithName("UserFilter") /// .ExpectingElements(10_000_000) /// .WithErrorRate(0.001) /// .UsingHashMethod(HashMethod.XXHash3) /// .BuildInMemory(); /// /// public partial class FilterBuilder { #region Fluent API - Instance Members protected string _name = BloomFilterConstValue.DefaultInMemoryName; protected long _expectedElements = 1_000_000; protected double _errorRate = 0.01; protected HashMethod _method = HashMethod.Murmur3; protected HashFunction? _customHashFunction; protected IFilterMemorySerializer? _customSerializer; /// /// Protected constructor for fluent API pattern and inheritance /// protected FilterBuilder() { } /// /// Creates a new Fluent Builder for Bloom Filter construction /// /// A new FilterBuilder instance public static FilterBuilder Create() => new(); /// /// Sets the name for the Bloom Filter /// /// The filter name /// The builder for method chaining /// Thrown when name is null or whitespace public FilterBuilder WithName(string name) { #if NET8_0_OR_GREATER ArgumentException.ThrowIfNullOrWhiteSpace(name); #else if (string.IsNullOrWhiteSpace(name)) throw new ArgumentException("Name cannot be null or whitespace", nameof(name)); #endif _name = name; return this; } /// /// Sets the expected number of elements to be added to the filter /// /// The expected element count (must be > 0) /// The builder for method chaining /// Thrown when count is less than or equal to 0 public FilterBuilder ExpectingElements(long count) { if (count <= 0) throw new ArgumentOutOfRangeException(nameof(count), count, "Expected elements must be greater than 0"); _expectedElements = count; return this; } /// /// Sets the acceptable false positive rate (probability) /// /// The error rate (must be between 0 and 1, exclusive) /// The builder for method chaining /// Thrown when rate is not between 0 and 1 public FilterBuilder WithErrorRate(double rate) { if (rate <= 0 || rate >= 1) throw new ArgumentOutOfRangeException(nameof(rate), rate, "Error rate must be between 0 and 1 (exclusive)"); _errorRate = rate; return this; } /// /// Sets the hash method to use for hashing elements /// /// The hash method /// The builder for method chaining public FilterBuilder UsingHashMethod(HashMethod method) { _method = method; _customHashFunction = null; return this; } /// /// Uses a custom hash function for hashing elements /// /// The custom hash function /// The builder for method chaining /// Thrown when hashFunction is null public FilterBuilder UsingCustomHash(HashFunction hashFunction) { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(hashFunction); #else if (hashFunction == null) throw new ArgumentNullException(nameof(hashFunction)); #endif _customHashFunction = hashFunction; return this; } /// /// Uses a custom serializer for persisting the Bloom Filter /// /// The custom serializer /// The builder for method chaining /// Thrown when serializer is null public FilterBuilder WithSerializer(IFilterMemorySerializer serializer) { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(serializer); #else if (serializer == null) throw new ArgumentNullException(nameof(serializer)); #endif _customSerializer = serializer; return this; } /// /// Builds an in-memory Bloom Filter with the configured settings /// /// A new IBloomFilter instance public IBloomFilter BuildInMemory() { var hashFunction = _customHashFunction ?? HashFunction.Functions[_method]; var serializer = _customSerializer ?? new DefaultFilterMemorySerializer(); return new FilterMemory(_name, _expectedElements, _errorRate, hashFunction, serializer); } /// /// Builds an in-memory Bloom Filter with explicit capacity and hash count (advanced usage) /// /// The bit array capacity /// The number of hash functions /// A new IBloomFilter instance public IBloomFilter BuildInMemoryWithCapacity(long capacity, int hashes) { var hashFunction = _customHashFunction ?? HashFunction.Functions[_method]; var serializer = _customSerializer ?? new DefaultFilterMemorySerializer(); return new FilterMemory(_name, capacity, hashes, hashFunction, serializer); } #endregion #region Static Factory Methods (Legacy API - Backward Compatible) /// /// Creates a BloomFilter for the specified expected element /// /// /// public static IBloomFilter Build(FilterMemoryOptions options) { return new FilterMemory(options, new DefaultFilterMemorySerializer()); } /// /// Creates a BloomFilter for the specified expected element /// /// /// /// public static IBloomFilter Build(FilterMemoryOptions options, IFilterMemorySerializer filterMemorySerializer) { return new FilterMemory(options, filterMemorySerializer); } /// /// Creates a BloomFilter for the specified expected element /// /// The expected elements. /// /// public static IBloomFilter Build(long expectedElements, string name = BloomFilterConstValue.DefaultInMemoryName) { return Build(expectedElements, 0.01, name); } /// ///Creates a BloomFilter for the specified expected element /// /// The expected elements. /// The hash method. /// /// public static IBloomFilter Build(long expectedElements, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultInMemoryName) { return Build(expectedElements, 0.01, hashMethod, name); } /// /// Creates a BloomFilter for the specified expected element /// /// The expected elements. /// The hash function. /// /// public static IBloomFilter Build(long expectedElements, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultInMemoryName) { return Build(expectedElements, 0.01, hashFunction, name); } /// /// Creates a BloomFilter for the specified expected element /// /// The expected elements. /// The error rate. /// /// public static IBloomFilter Build(long expectedElements, double errorRate, string name = BloomFilterConstValue.DefaultInMemoryName) { return Build(expectedElements, errorRate, HashFunction.Functions[HashMethod.Murmur3], name); } /// /// Creates a BloomFilter for the specified expected element /// /// The expected elements. /// The error rate. /// The hash method. /// /// /// public static IBloomFilter Build(long expectedElements, double errorRate, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultInMemoryName, IFilterMemorySerializer? filterMemorySerializer = null) { return new FilterMemory(name, expectedElements, errorRate, HashFunction.Functions[hashMethod], filterMemorySerializer ?? new DefaultFilterMemorySerializer()); } /// /// Creates a BloomFilter for the specified expected element /// /// The expected elements. /// The error rate. /// The hash function. /// /// /// public static IBloomFilter Build(long expectedElements, double errorRate, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultInMemoryName, IFilterMemorySerializer? filterMemorySerializer = null) { return new FilterMemory(name, expectedElements, errorRate, hashFunction, filterMemorySerializer ?? new DefaultFilterMemorySerializer()); } #endregion } ================================================ FILE: src/BloomFilter/FilterMemory.cs ================================================ using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Threading.Tasks; using BloomFilter.Configurations; namespace BloomFilter; /// /// Bloom Filter In Mempory Implement /// public class FilterMemory : Filter { //The upper limit per bucket is 2147483640 private BitArray[] _buckets; private readonly AsyncLock _asyncLock = new(); private readonly IFilterMemorySerializer _filterMemorySerializer; private static readonly ValueTask Empty = new(); /// /// Initializes a new instance of the class. /// /// /// public FilterMemory(FilterMemoryOptions options, IFilterMemorySerializer filterMemorySerializer) : base(options.Name, options.ExpectedElements, options.ErrorRate, HashFunction.Functions[options.Method]) { _filterMemorySerializer = filterMemorySerializer; if (options.Buckets is not null) { Import(options.Buckets); } else if (options.BucketBytes is not null) { Import(options.BucketBytes); } else { Init(); } } /// /// Initializes a new instance of the class. /// /// /// The expected elements. /// The error rate. /// The hash function. /// public FilterMemory(string name, long expectedElements, double errorRate, HashFunction hashFunction, IFilterMemorySerializer filterMemorySerializer) : base(name, expectedElements, errorRate, hashFunction) { _filterMemorySerializer = filterMemorySerializer; Init(); } /// /// Initializes a new instance of the class. /// /// /// The size. /// The hashes. /// The hash function. /// public FilterMemory(string name, long size, int hashes, HashFunction hashFunction, IFilterMemorySerializer filterMemorySerializer) : base(name, size, hashes, hashFunction) { _filterMemorySerializer = filterMemorySerializer; Init(); } [MemberNotNull(nameof(_buckets))] private void Init() { var bits = new List(); var m = Capacity; while (m > 0) { if (m > MaxInt) { bits.Add(new BitArray(MaxInt)); m -= MaxInt; } else { bits.Add(new BitArray((int)m)); break; } } _buckets = bits.ToArray(); } /// /// Serialize to a stream /// /// /// /// /// This method holds the lock during the entire serialization process (including I/O). /// This ensures data consistency but will block other operations (Add/Contains) during serialization. /// The BitArray is cloned to ensure immutability during serialization. /// public async ValueTask SerializeAsync(Stream stream) { using var _ = await _asyncLock.AcquireAsync(); await _filterMemorySerializer.SerializeAsync(new FilterMemorySerializerParam { Name = Name, Method = Hash.Method, ExpectedElements = ExpectedElements, ErrorRate = ErrorRate, Buckets = _buckets.Select(s => new BitArray(s)).ToArray() // Clone to ensure immutability }, stream); } /// /// Deserialize from the stream /// /// /// public async ValueTask DeserializeAsync(Stream stream) { var param = await _filterMemorySerializer.DeserializeAsync(stream); #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(param.Buckets); #else if (param.Buckets is null) throw new ArgumentNullException(nameof(FilterMemorySerializerParam.Buckets)); #endif if (param.Buckets.Length == 0) throw new ArgumentOutOfRangeException($"The length must greater than 0", nameof(FilterMemorySerializerParam.Buckets)); SetFilterParam(param.ExpectedElements, param.ErrorRate, param.Method); if (Capacity > param.Buckets.Sum(s => (long)s.Length)) { throw new ArgumentOutOfRangeException($"The length must less than or equal to {Capacity}", nameof(FilterMemorySerializerParam.Buckets)); } using var _ = await _asyncLock.AcquireAsync(); _buckets = new BitArray[param.Buckets.Length]; for (int i = 0; i < param.Buckets.Length; i++) { _buckets[i] = new BitArray(param.Buckets[i]); } } /// /// Importing bitmap /// /// Sets the multiple bitmap [MemberNotNull(nameof(_buckets))] public void Import(BitArray[] buckets) { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(buckets); #else if (buckets is null) throw new ArgumentNullException(nameof(buckets)); #endif if (buckets.Length == 0) throw new ArgumentOutOfRangeException($"The length must greater than 0", nameof(buckets)); if (Capacity > buckets.Sum(s => (long)s.Length)) { throw new ArgumentOutOfRangeException($"The length must less than or equal to {Capacity}", nameof(buckets)); } using var _ = _asyncLock.Acquire(); _buckets = new BitArray[buckets.Length]; for (int i = 0; i < buckets.Length; i++) { _buckets[i] = new BitArray(buckets[i]); } } /// /// Importing bitmap /// /// Sets the multiple bitmaps [MemberNotNull(nameof(_buckets))] public void Import(IList bucketBytes) { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(bucketBytes); #else if (bucketBytes is null) throw new ArgumentNullException(nameof(bucketBytes)); #endif if (bucketBytes.Count == 0) throw new ArgumentOutOfRangeException($"The length must greater than 0", nameof(bucketBytes)); Import(bucketBytes.Select(s => new BitArray(s)).ToArray()); } /// /// Exporting bitmap /// public BitArray[] Export() { using var _ = _asyncLock.Acquire(); return _buckets.Select(s => new BitArray(s)).ToArray(); } /// /// Exporting bitmap /// public IList ExportToBytes() { int Mod(int len) => len % 8 > 0 ? 1 : 0; var result = new List(); using var _ = _asyncLock.Acquire(); foreach (var bucket in _buckets) { var bits = new byte[bucket.Length / 8 + Mod(bucket.Length)]; bucket.CopyTo(bits, 0); result.Add(bits); } return result; } /// /// Adds the passed value to the filter. /// /// /// public override bool Add(ReadOnlySpan data) { bool added = false; var positions = ComputeHash(data); using var _ = _asyncLock.Acquire(); foreach (var position in positions) { if (!Get(position)) { added = true; Set(position); } } return added; } /// /// Adds the passed value to the filter. /// /// /// public override ValueTask AddAsync(ReadOnlyMemory data) { return new ValueTask(Add(data.Span)); } public override IList Add(IEnumerable elements) { // Pre-allocate capacity if possible var elementsList = elements as IList ?? elements.ToList(); var hashes = new List(elementsList.Count * Hashes); foreach (var element in elementsList) { hashes.AddRange(ComputeHash(element)); } var processResults = new bool[hashes.Count]; using (var _ = _asyncLock.Acquire()) { for (var i = 0; i < hashes.Count; i++) { if (!Get(hashes[i])) { Set(hashes[i]); processResults[i] = false; } else { processResults[i] = true; } } } IList results = new List(elementsList.Count); bool wasAdded = false; int processed = 0; //For each value check, if all bits in ranges of hashes bits are set foreach (var item in processResults) { if (!item) wasAdded = true; if ((processed + 1) % Hashes == 0) { results.Add(wasAdded); wasAdded = false; } processed++; } return results; } public override ValueTask> AddAsync(IEnumerable elements) { return new ValueTask>(Add(elements)); } /// /// Tests whether an element is present in the filter /// /// /// public override bool Contains(ReadOnlySpan element) { var positions = ComputeHash(element); using var _ = _asyncLock.Acquire(); foreach (var position in positions) { if (!Get(position)) return false; } return true; } public override ValueTask ContainsAsync(ReadOnlyMemory element) { return new ValueTask(Contains(element.Span)); } public override IList Contains(IEnumerable elements) { // Pre-allocate capacity if possible var elementsList = elements as IList ?? elements.ToList(); var hashes = new List(elementsList.Count * Hashes); foreach (var element in elementsList) { hashes.AddRange(ComputeHash(element)); } var processResults = new bool[hashes.Count]; using (var _ = _asyncLock.Acquire()) { for (var i = 0; i < hashes.Count; i++) { processResults[i] = Get(hashes[i]); } } IList results = new List(elementsList.Count); bool isPresent = true; int processed = 0; //For each value check, if all bits in ranges of hashes bits are set foreach (var item in processResults) { if (!item) isPresent = false; if ((processed + 1) % Hashes == 0) { results.Add(isPresent); isPresent = true; } processed++; } return results; } public override ValueTask> ContainsAsync(IEnumerable elements) { return new ValueTask>(Contains(elements)); } public override bool All(IEnumerable elements) { return Contains(elements).All(e => e); } public override ValueTask AllAsync(IEnumerable elements) { return new ValueTask(All(elements)); } /// /// Removes all elements from the filter /// public override void Clear() { using var _ = _asyncLock.Acquire(); foreach (var item in _buckets) { item.SetAll(false); } } public override ValueTask ClearAsync() { Clear(); return Empty; } private void Set(long index) { int idx = LogMaxInt(index, out int mod); _buckets[idx].Set(mod, true); } public bool Get(long index) { int idx = LogMaxInt(index, out int mod); return _buckets[idx].Get(mod); } public override void Dispose() { _asyncLock.Dispose(); } } ================================================ FILE: src/BloomFilter/FilterMemorySerializerParam.cs ================================================ using System.Collections; namespace BloomFilter; /// /// FilterMemorySerializerParam /// public class FilterMemorySerializerParam { /// /// Gets the name specified by BloomFilter. /// #if NET5_0_OR_GREATER public string Name { get; init; } = default!; #else public string Name { get; set; } = default!; #endif /// /// /// #if NET5_0_OR_GREATER public HashMethod Method { get; init; } #else public HashMethod Method { get; set; } #endif /// /// the expected elements. /// #if NET5_0_OR_GREATER public long ExpectedElements { get; init; } #else public long ExpectedElements { get; set; } #endif /// /// the number of expected elements /// #if NET5_0_OR_GREATER public double ErrorRate { get; init; } #else public double ErrorRate { get; set; } #endif /// /// bitmap /// #if NET5_0_OR_GREATER public BitArray[] Buckets { get; init; } = default!; #else public BitArray[] Buckets { get; set; } = default!; #endif } ================================================ FILE: src/BloomFilter/FilterRedisBase.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace BloomFilter; /// /// Abstract base class for Redis-based Bloom Filter implementations. /// Encapsulates common batch operation logic shared across all Redis implementations. /// public abstract class FilterRedisBase : Filter { protected FilterRedisBase(string name, long expectedElements, double errorRate, HashFunction hashFunction) : base(name, expectedElements, errorRate, hashFunction) { } protected FilterRedisBase(string name, long capacity, int hashes, HashFunction hashFunction) : base(name, capacity, hashes, hashFunction) { } // Abstract methods - to be implemented by concrete Redis client implementations /// /// Sets a bit at the specified position in the Redis bitmap. /// /// The bit position. /// The previous value of the bit (true if it was set, false otherwise). protected abstract bool SetBit(long position); /// /// Gets the bit value at the specified position in the Redis bitmap. /// /// The bit position. /// The value of the bit (true if set, false otherwise). protected abstract bool GetBit(long position); /// /// Asynchronously sets a bit at the specified position in the Redis bitmap. /// /// The bit position. /// The previous value of the bit. protected abstract Task SetBitAsync(long position); /// /// Asynchronously gets the bit value at the specified position in the Redis bitmap. /// /// The bit position. /// The value of the bit. protected abstract Task GetBitAsync(long position); /// /// Sets multiple bits at the specified positions in the Redis bitmap. /// /// Array of bit positions. /// Array of previous bit values. protected abstract bool[] SetBits(long[] positions); /// /// Gets multiple bits at the specified positions in the Redis bitmap. /// /// Array of bit positions. /// Array of bit values. protected abstract bool[] GetBits(long[] positions); /// /// Asynchronously sets multiple bits at the specified positions in the Redis bitmap. /// /// Array of bit positions. /// Array of previous bit values. protected abstract Task SetBitsAsync(long[] positions); /// /// Asynchronously gets multiple bits at the specified positions in the Redis bitmap. /// /// Array of bit positions. /// Array of bit values. protected abstract Task GetBitsAsync(long[] positions); /// /// Clears all bits in the Redis bitmap. /// protected abstract void ClearBits(); /// /// Asynchronously clears all bits in the Redis bitmap. /// protected abstract Task ClearBitsAsync(); // Common implementations - shared by all Redis implementations public override IList Add(IEnumerable elements) { // Pre-allocate capacity if possible var elementsList = elements as IList ?? elements.ToList(); var hashes = new List(elementsList.Count * Hashes); foreach (var element in elementsList) { hashes.AddRange(ComputeHash(element)); } var processResults = SetBits(hashes.ToArray()); return ProcessBatchResults(processResults, Hashes, trackAdded: true); } public override async ValueTask> AddAsync(IEnumerable elements) { // Pre-allocate capacity if possible var elementsList = elements as IList ?? elements.ToList(); var hashes = new List(elementsList.Count * Hashes); foreach (var element in elementsList) { hashes.AddRange(ComputeHash(element)); } var processResults = await SetBitsAsync(hashes.ToArray()); return ProcessBatchResults(processResults, Hashes, trackAdded: true); } public override IList Contains(IEnumerable elements) { // Pre-allocate capacity if possible var elementsList = elements as IList ?? elements.ToList(); var hashes = new List(elementsList.Count * Hashes); foreach (var element in elementsList) { hashes.AddRange(ComputeHash(element)); } var processResults = GetBits(hashes.ToArray()); return ProcessBatchResults(processResults, Hashes, trackAdded: false); } public override async ValueTask> ContainsAsync(IEnumerable elements) { // Pre-allocate capacity if possible var elementsList = elements as IList ?? elements.ToList(); var hashes = new List(elementsList.Count * Hashes); foreach (var element in elementsList) { hashes.AddRange(ComputeHash(element)); } var processResults = await GetBitsAsync(hashes.ToArray()); return ProcessBatchResults(processResults, Hashes, trackAdded: false); } public override bool All(IEnumerable elements) => Contains(elements).All(e => e); public override ValueTask AllAsync(IEnumerable elements) => new(Contains(elements).All(e => e)); public override void Clear() => ClearBits(); public override async ValueTask ClearAsync() => await ClearBitsAsync(); /// /// Processes batch operation results, converting bit-level results to element-level results. /// /// Bit-level operation results (from Redis). /// Number of hash functions (bits per element). /// If true, tracks additions (wasAdded logic); if false, tracks presence (isPresent logic). /// Element-level results. protected static IList ProcessBatchResults(bool[] processResults, int hashes, bool trackAdded) { var results = new List(processResults.Length / hashes); bool flag = trackAdded ? false : true; int processed = 0; foreach (var item in processResults) { if (trackAdded && !item) flag = true; // Add: any bit not previously set = new addition if (!trackAdded && !item) flag = false; // Contains: any bit not set = not present if ((processed + 1) % hashes == 0) { results.Add(flag); flag = trackAdded ? false : true; } processed++; } return results; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Adler32.cs ================================================ using System; namespace BloomFilter.HashAlgorithms; public class Adler32 : HashFunction { public override HashMethod Method => HashMethod.Adler32; private const int seed32 = 89_478_583; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { long[] positions = new long[k]; int hashes = 0; int salt = 0; var adler32 = new Internal.Adler32(); while (hashes < k) { adler32.Append(data); adler32.Append(BitConverter.GetBytes(hashes + salt++ + seed32)); var adlerValue = adler32.GetCurrentHashAsUInt32(); adler32.Reset(); long hash = BinaryHelper.Rejection(adlerValue, m); if (hash != -1) { positions[hashes++] = hash; } } return positions; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Crc32.cs ================================================ using System; namespace BloomFilter.HashAlgorithms; public partial class Crc32 : HashFunction { public override HashMethod Method => HashMethod.CRC32; private const int seed32 = 89_478_583; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { long[] positions = new long[k]; int hashes = 0; int salt = 0; var crc32 = new Internal.Crc32(); while (hashes < k) { crc32.Append(data); crc32.Append(BitConverter.GetBytes(hashes + salt++ + seed32)); var crc = crc32.GetCurrentHashAsUInt32(); crc32.Reset(); long hash = BinaryHelper.Rejection(crc, m); if (hash != -1) { positions[hashes++] = hash; } } return positions; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Crc64.cs ================================================ using System; namespace BloomFilter.HashAlgorithms; public partial class Crc64 : HashFunction { public override HashMethod Method => HashMethod.CRC64; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { long[] positions = new long[k]; var hash = Internal.Crc64.HashToUInt64(data); uint hash1 = (uint)hash; uint hash2 = (uint)(hash >> 32); for (int i = 0; i < k; i++) { positions[i] = ((hash1 + (i * hash2)) % m); } return positions; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/HashCrypto.cs ================================================ using System; using System.Collections; using System.Security.Cryptography; namespace BloomFilter.HashAlgorithms; public class HashCryptoSHA1 : HashCrypto { public override HashMethod Method => HashMethod.SHA1; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { using var hashAlgorithm = SHA1.Create(); return ComputeHash(hashAlgorithm, data, m, k); } } public class HashCryptoSHA256 : HashCrypto { public override HashMethod Method => HashMethod.SHA256; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { using var hashAlgorithm = SHA256.Create(); return ComputeHash(hashAlgorithm, data, m, k); } } public class HashCryptoSHA384 : HashCrypto { public override HashMethod Method => HashMethod.SHA384; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { using var hashAlgorithm = SHA384.Create(); return ComputeHash(hashAlgorithm, data, m, k); } } public class HashCryptoSHA512 : HashCrypto { public override HashMethod Method => HashMethod.SHA512; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { using var hashAlgorithm = SHA512.Create(); return ComputeHash(hashAlgorithm, data, m, k); } } public abstract class HashCrypto : HashFunction { protected long[] ComputeHash(HashAlgorithm hashAlgorithm, ReadOnlySpan data, long m, int k) { long[] positions = new long[k]; int computedHashes = 0; byte[] digest = new byte[hashAlgorithm.HashSize / 8]; byte[] output = new byte[hashAlgorithm.HashSize / 8]; #if !NET6_0_OR_GREATER var bytes = data.ToArray(); #endif while (computedHashes < k) { hashAlgorithm.TransformBlock(digest, 0, digest.Length, output, 0); #if NET6_0_OR_GREATER hashAlgorithm.TryComputeHash(data, digest, out int bytesWritten); #else digest = hashAlgorithm.ComputeHash(bytes, 0, bytes.Length); #endif BitArray hashed = new(digest); int filterSize = 32 - (int)BinaryHelper.NumberOfLeadingZeros((uint)m); for (int split = 0; split < (hashAlgorithm.HashSize / filterSize) && computedHashes < k; split++) { int from = split * filterSize; int to = ((split + 1) * filterSize); int intHash = BinaryHelper.BitToIntOne(hashed, from, to); if (intHash < m) { positions[computedHashes] = (uint)intHash; computedHashes++; } } } return positions; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/Adler32.cs ================================================ using System; using System.Buffers.Binary; using System.Runtime.InteropServices; #if NET6_0_OR_GREATER using System.Runtime.Intrinsics; using System.Runtime.Intrinsics.X86; #endif namespace BloomFilter.HashAlgorithms.Internal; /// /// Adler32 algorithm /// internal sealed partial class Adler32 : NonCryptoHashAlgorithm { private const int Size = sizeof(uint); private uint _adler; private uint _alderInitial; // largest prime smaller than 65536 private const int MOD32 = 65_521; // NMAX32 is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 private const int NMAX32 = 5_552; /// /// Initializes a new instance of the class. /// public Adler32(uint adler = 1) : base(Size) { _alderInitial = adler; _adler = adler; } /// /// Appends the contents of to the data already /// processed for the current hash computation. /// /// The data to process. public override void Append(ReadOnlySpan source) { _adler = Update(_adler, source); } /// /// Resets the hash computation to the initial state. /// public override void Reset() { _adler = _alderInitial; } /// /// Writes the computed hash value to /// without modifying accumulated state. /// /// The buffer that receives the computed hash value. protected override void GetCurrentHashCore(Span destination) { BinaryPrimitives.WriteUInt32LittleEndian(destination, _adler); } /// /// Writes the computed hash value to /// then clears the accumulated state. /// protected override void GetHashAndResetCore(Span destination) { BinaryPrimitives.WriteUInt32LittleEndian(destination, _adler); _adler = _alderInitial; } /// Gets the current computed hash value without modifying accumulated state. /// The hash value for the data already provided. public uint GetCurrentHashAsUInt32() => _adler; private static uint Update(uint adler, ReadOnlySpan source) { #if NET6_0_OR_GREATER if (Ssse3.IsSupported) { return GetSse(source, adler); } #endif return GetSimple(source, adler); } internal static uint GetSimple(ReadOnlySpan source, uint adler) { var count = source.Length; uint s1 = adler & 0xFFFF; uint s2 = adler >> 16; int offset = 0; while (count > 0) { int n = NMAX32; if (n > count) { n = count; } count -= n; while (--n >= 0) { s1 = s1 + (uint)(source[offset++] & 0xff); s2 = s2 + s1; } s1 %= MOD32; s2 %= MOD32; } adler = (s2 << 16) | s1; return adler; } #if NET6_0_OR_GREATER internal static unsafe uint GetSse(ReadOnlySpan buffer, uint adler) { const int BLOCK_SIZE = 32; uint s1 = adler & 0xFFFF; uint s2 = adler >> 16; uint len = (uint)buffer.Length; uint blocks = len / BLOCK_SIZE; len = len - blocks * BLOCK_SIZE; Vector128 tap1 = Vector128.Create(32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17); Vector128 tap2 = Vector128.Create(16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1); Vector128 zero = Vector128.Zero; Vector128 ones = Vector128.Create(1, 1, 1, 1, 1, 1, 1, 1); fixed (byte* bufPtr = &MemoryMarshal.GetReference(buffer)) { var buf = bufPtr; while (blocks != 0) { uint n = NMAX32 / BLOCK_SIZE; if (n > blocks) { n = blocks; } blocks -= n; // Process n blocks of data. At most NMAX data bytes can be // processed before s2 must be reduced modulo BASE. Vector128 v_ps = Vector128.Create(0, 0, 0, s1 * n); Vector128 v_s2 = Vector128.Create(0, 0, 0, s2); Vector128 v_s1 = Vector128.Create(0u, 0, 0, 0); do { // Load 32 input bytes. Vector128 bytes1 = Sse2.LoadVector128(&buf[0]); Vector128 bytes2 = Sse2.LoadVector128(&buf[16]); // Add previous block byte sum to v_ps. v_ps = Sse2.Add(v_ps, v_s1); // Horizontally add the bytes for s1, multiply-adds the // bytes by [ 32, 31, 30, ... ] for s2. Vector128 sad1 = Sse2.SumAbsoluteDifferences(bytes1, zero); v_s1 = Sse2.Add(v_s1, sad1.AsUInt32()); Vector128 mad11 = Ssse3.MultiplyAddAdjacent(bytes1, tap1); Vector128 mad12 = Sse2.MultiplyAddAdjacent(mad11, ones); v_s2 = Sse2.Add(v_s2, mad12.AsUInt32()); Vector128 sad2 = Sse2.SumAbsoluteDifferences(bytes2, zero); v_s1 = Sse2.Add(v_s1, sad2.AsUInt32()); Vector128 mad21 = Ssse3.MultiplyAddAdjacent(bytes2, tap2); Vector128 mad22 = Sse2.MultiplyAddAdjacent(mad21, ones); v_s2 = Sse2.Add(v_s2, mad22.AsUInt32()); buf += BLOCK_SIZE; n--; } while (n != 0); var shift = Sse2.ShiftLeftLogical(v_ps, 5); v_s2 = Sse2.Add(v_s2, shift); // Sum epi32 ints v_s1(s2) and accumulate in s1(s2). // A B C D -> B A D C const int S2301 = 2 << 6 | 3 << 4 | 0 << 2 | 1; // A B C D -> C D A B const int S1032 = 1 << 6 | 0 << 4 | 3 << 2 | 2; v_s1 = Sse2.Add(v_s1, Sse2.Shuffle(v_s1, S2301)); v_s1 = Sse2.Add(v_s1, Sse2.Shuffle(v_s1, S1032)); s1 += Sse2.ConvertToUInt32(v_s1); v_s2 = Sse2.Add(v_s2, Sse2.Shuffle(v_s2, S2301)); v_s2 = Sse2.Add(v_s2, Sse2.Shuffle(v_s2, S1032)); s2 = Sse2.ConvertToUInt32(v_s2); s1 %= MOD32; s2 %= MOD32; } if (len > 0) { if (len >= 16) { s2 += (s1 += *buf++); s2 += (s1 += *buf++); s2 += (s1 += *buf++); s2 += (s1 += *buf++); s2 += (s1 += *buf++); s2 += (s1 += *buf++); s2 += (s1 += *buf++); s2 += (s1 += *buf++); s2 += (s1 += *buf++); s2 += (s1 += *buf++); s2 += (s1 += *buf++); s2 += (s1 += *buf++); s2 += (s1 += *buf++); s2 += (s1 += *buf++); s2 += (s1 += *buf++); s2 += (s1 += *buf++); len -= 16; } while (len-- > 0) { s2 += (s1 += *buf++); } if (s1 >= MOD32) { s1 -= MOD32; } s2 %= MOD32; } return s1 | (s2 << 16); } } #endif } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/Crc32.Arm.cs ================================================ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. #if NET6_0_OR_GREATER using System; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using ArmCrc = System.Runtime.Intrinsics.Arm.Crc32; namespace BloomFilter.HashAlgorithms.Internal; internal partial class Crc32 { private static uint UpdateScalarArm64(uint crc, ReadOnlySpan source) { Debug.Assert(ArmCrc.Arm64.IsSupported, "ARM CRC support is required."); // Compute in 8 byte chunks if (source.Length >= sizeof(ulong)) { ref byte ptr = ref MemoryMarshal.GetReference(source); int longLength = source.Length & ~0x7; // Exclude trailing bytes not a multiple of 8 for (int i = 0; i < longLength; i += sizeof(ulong)) { crc = ArmCrc.Arm64.ComputeCrc32(crc, Unsafe.ReadUnaligned(ref Unsafe.Add(ref ptr, i))); } source = source.Slice(longLength); } // Compute remaining bytes for (int i = 0; i < source.Length; i++) { crc = ArmCrc.ComputeCrc32(crc, source[i]); } return crc; } private static uint UpdateScalarArm32(uint crc, ReadOnlySpan source) { Debug.Assert(ArmCrc.IsSupported, "ARM CRC support is required."); // Compute in 4 byte chunks if (source.Length >= sizeof(uint)) { ref byte ptr = ref MemoryMarshal.GetReference(source); int intLength = source.Length & ~0x3; // Exclude trailing bytes not a multiple of 4 for (int i = 0; i < intLength; i += sizeof(uint)) { crc = ArmCrc.ComputeCrc32(crc, Unsafe.ReadUnaligned(ref Unsafe.Add(ref ptr, i))); } source = source.Slice(intLength); } // Compute remaining bytes for (int i = 0; i < source.Length; i++) { crc = ArmCrc.ComputeCrc32(crc, source[i]); } return crc; } } #endif ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/Crc32.Table.cs ================================================ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; namespace BloomFilter.HashAlgorithms.Internal; internal partial class Crc32 : NonCryptoHashAlgorithm { /// CRC-32 transition table /// /// While this implementation is based on the standard CRC-32 polynomial, /// x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x1 + x0, /// this version uses reflected bit ordering, so 0x04C11DB7 becomes 0xEDB88320 /// private static ReadOnlySpan CrcLookup => new uint[] { // Generated by GenerateTable(0xEDB88320u): // // static uint[] GenerateTable(uint reflectedPolynomial) // { // uint[] table = new uint[256]; // for (int i = 0; i < table.Length; i++) // { // uint val = (uint)i; // for (int j = 0; j < 8; j++) // { // if ((val & 0b0000_0001) == 0) // { // val >>= 1; // } // else // { // val = (val >> 1) ^ reflectedPolynomial; // } // } // table[i] = val; // } // return table; // } 0x0, 0x77073096, 0xEE0E612C, 0x990951BA, 0x76DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0xEDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x9B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x1DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x6B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0xF00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x86D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x3B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x4DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0xD6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0xA00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x26D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x5005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0xCB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0xBDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D, }; } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/Crc32.Vectorized.cs ================================================ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. #if NET7_0_OR_GREATER using System.Diagnostics; using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; using System.Runtime.InteropServices; using System; using static BloomFilter.HashAlgorithms.Internal.VectorHelper; namespace BloomFilter.HashAlgorithms.Internal { internal partial class Crc32 { // We check for little endian byte order here in case we're ever on ARM in big endian mode. // All of these checks except the length check are elided by JIT, so the JITted implementation // will be either a return false or a length check against a constant. This means this method // should be inlined into the caller. private static bool CanBeVectorized(ReadOnlySpan source) => BitConverter.IsLittleEndian && VectorHelper.IsSupported // Vectorization can process spans as short as a single vector (16 bytes), but if ARM intrinsics are supported they // seem to be more performant for spans less than 8 vectors (128 bytes). && source.Length >= Vector128.Count * (System.Runtime.Intrinsics.Arm.Crc32.IsSupported ? 8 : 1); // Processes the bytes in source in 64 byte chunks using carryless/polynomial multiplication intrinsics, // followed by processing 16 byte chunks, and then processing remaining bytes individually. Requires // little endian byte order and support for PCLMULQDQ intrinsics on Intel architecture or AES and // AdvSimd intrinsics on ARM architecture. Based on the algorithm put forth in the Intel paper "Fast CRC // Computation for Generic Polynomials Using PCLMULQDQ Instruction" in December, 2009. // https://github.com/intel/isa-l/blob/33a2d9484595c2d6516c920ce39a694c144ddf69/crc/crc32_ieee_by4.asm // https://github.com/SixLabors/ImageSharp/blob/f4f689ce67ecbcc35cebddba5aacb603e6d1068a/src/ImageSharp/Formats/Png/Zlib/Crc32.cs#L80 private static uint UpdateVectorized(uint crc, ReadOnlySpan source) { Debug.Assert(CanBeVectorized(source), "source cannot be vectorized."); // Work with a reference to where we're at in the ReadOnlySpan and a local length // to avoid extraneous range checks. ref byte srcRef = ref MemoryMarshal.GetReference(source); int length = source.Length; Vector128 kConstants; Vector128 x1; // Accumulator for the new CRC Vector128 x2; if (length >= Vector128.Count * 8) { x1 = Vector128.LoadUnsafe(ref srcRef).AsUInt64(); x2 = Vector128.LoadUnsafe(ref srcRef, 16).AsUInt64(); Vector128 x3 = Vector128.LoadUnsafe(ref srcRef, 32).AsUInt64(); Vector128 x4 = Vector128.LoadUnsafe(ref srcRef, 48).AsUInt64(); srcRef = ref Unsafe.Add(ref srcRef, Vector128.Count * 4); length -= Vector128.Count * 4; // Load and XOR the initial CRC value x1 ^= Vector128.CreateScalar(crc).AsUInt64(); kConstants = Vector128.Create(0x0154442bd4UL, 0x01c6e41596UL); // k1, k2 // Parallel fold blocks of 64, if any. do { Vector128 y5 = Vector128.LoadUnsafe(ref srcRef).AsUInt64(); Vector128 y6 = Vector128.LoadUnsafe(ref srcRef, 16).AsUInt64(); Vector128 y7 = Vector128.LoadUnsafe(ref srcRef, 32).AsUInt64(); Vector128 y8 = Vector128.LoadUnsafe(ref srcRef, 48).AsUInt64(); x1 = FoldPolynomialPair(y5, x1, kConstants); x2 = FoldPolynomialPair(y6, x2, kConstants); x3 = FoldPolynomialPair(y7, x3, kConstants); x4 = FoldPolynomialPair(y8, x4, kConstants); srcRef = ref Unsafe.Add(ref srcRef, Vector128.Count * 4); length -= Vector128.Count * 4; } while (length >= Vector128.Count * 4); // Fold into 128-bits. kConstants = Vector128.Create(0x01751997d0UL, 0x00ccaa009eUL); // k3, k4 x1 = FoldPolynomialPair(x2, x1, kConstants); x1 = FoldPolynomialPair(x3, x1, kConstants); x1 = FoldPolynomialPair(x4, x1, kConstants); } else { // For shorter sources just load the first vector and XOR with the CRC Debug.Assert(length >= 16); x1 = Vector128.LoadUnsafe(ref srcRef).AsUInt64(); x1 ^= Vector128.CreateScalar(crc).AsUInt64(); srcRef = ref Unsafe.Add(ref srcRef, Vector128.Count); length -= Vector128.Count; } // Single fold blocks of 16, if any. while (length >= Vector128.Count) { x1 = FoldPolynomialPair(Vector128.LoadUnsafe(ref srcRef).AsUInt64(), x1, Vector128.Create(0x01751997d0UL, 0x00ccaa009eUL)); srcRef = ref Unsafe.Add(ref srcRef, Vector128.Count); length -= Vector128.Count; } // Fold 128 bits to 64 bits. Vector128 bitmask = Vector128.Create(~0, 0, ~0, 0).AsUInt64(); x1 = ShiftRightBytesInVector(x1, 8) ^ CarrylessMultiplyLower(x1, Vector128.CreateScalar(0x00ccaa009eUL)); x1 = CarrylessMultiplyLower(x1 & bitmask, Vector128.CreateScalar(0x0163cd6124UL)) ^ // k5, k0 ShiftRightBytesInVector(x1, 4); // Reduce to 32 bits. kConstants = Vector128.Create(0x01db710641UL, 0x01f7011641UL); // polynomial x2 = CarrylessMultiplyLeftLowerRightUpper(x1 & bitmask, kConstants) & bitmask; x2 = CarrylessMultiplyLower(x2, kConstants); x1 ^= x2; // Process the remaining bytes, if any uint result = x1.AsUInt32().GetElement(1); return length > 0 ? UpdateScalar(result, MemoryMarshal.CreateReadOnlySpan(ref srcRef, length)) : result; } } } #endif ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/Crc32.cs ================================================ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Buffers.Binary; namespace BloomFilter.HashAlgorithms.Internal; /// /// Provides an implementation of the CRC-32 algorithm, as used in /// ITU-T V.42 and IEEE 802.3. /// /// /// /// For methods that return byte arrays or that write into spans of bytes, this implementation /// emits the answer in the Little Endian byte order so that the CRC residue relationship /// (CRC(message concat CRC(message))) is a fixed value) holds. /// For CRC-32 this stable output is the byte sequence { 0x1C, 0xDF, 0x44, 0x21 }, /// the Little Endian representation of 0x2144DF1C. /// /// /// There are multiple, incompatible, definitions of a 32-bit cyclic redundancy /// check (CRC) algorithm. When interoperating with another system, ensure that you /// are using the same definition. The definition used by this implementation is not /// compatible with the cyclic redundancy check described in ITU-T I.363.5. /// /// internal partial class Crc32 : NonCryptoHashAlgorithm { private const uint InitialState = 0xFFFF_FFFFu; private const int Size = sizeof(uint); private uint _crc = InitialState; public Crc32() : base(Size) { } public override void Append(ReadOnlySpan source) { _crc = Update(_crc, source); } public override void Reset() { _crc = InitialState; } protected override void GetCurrentHashCore(Span destination) { BinaryPrimitives.WriteUInt32LittleEndian(destination, ~_crc); } protected override void GetHashAndResetCore(Span destination) { BinaryPrimitives.WriteUInt32LittleEndian(destination, ~_crc); _crc = InitialState; } public uint GetCurrentHashAsUInt32() => ~_crc; private static uint Update(uint crc, ReadOnlySpan source) { #if NET7_0_OR_GREATER if (CanBeVectorized(source)) { return UpdateVectorized(crc, source); } #endif return UpdateScalar(crc, source); } private static uint UpdateScalar(uint crc, ReadOnlySpan source) { #if NET6_0_OR_GREATER // Use ARM intrinsics for CRC if available. This is used for the trailing bytes on the vectorized path // and is the primary method if the vectorized path is unavailable. if (System.Runtime.Intrinsics.Arm.Crc32.Arm64.IsSupported) { return UpdateScalarArm64(crc, source); } if (System.Runtime.Intrinsics.Arm.Crc32.IsSupported) { return UpdateScalarArm32(crc, source); } #endif ReadOnlySpan crcLookup = CrcLookup; for (int i = 0; i < source.Length; i++) { crc = crcLookup[(byte)(crc ^ source[i])] ^ (crc >> 8); } return crc; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/Crc64.Table.cs ================================================ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; namespace BloomFilter.HashAlgorithms.Internal; internal sealed partial class Crc64 : NonCryptoHashAlgorithm { /// CRC-64 transition table. private static ReadOnlySpan CrcLookup => new ulong[256] { // Generated by GenerateTable(0x42F0E1EBA9EA3693): // // static ulong[] GenerateTable(ulong polynomial) // { // var table = new ulong[256]; // for (int i = 0; i < table.Length; i++) // { // ulong val = (ulong)i << 56; // for (int j = 0; j < 8; j++) // { // if ((val & 0x8000_0000_0000_0000) == 0) // { // val <<= 1; // } // else // { // val = (val << 1) ^ polynomial; // } // } // table[i] = val; // } // return table; // } 0x0, 0x42F0E1EBA9EA3693, 0x85E1C3D753D46D26, 0xC711223CFA3E5BB5, 0x493366450E42ECDF, 0xBC387AEA7A8DA4C, 0xCCD2A5925D9681F9, 0x8E224479F47CB76A, 0x9266CC8A1C85D9BE, 0xD0962D61B56FEF2D, 0x17870F5D4F51B498, 0x5577EEB6E6BB820B, 0xDB55AACF12C73561, 0x99A54B24BB2D03F2, 0x5EB4691841135847, 0x1C4488F3E8F96ED4, 0x663D78FF90E185EF, 0x24CD9914390BB37C, 0xE3DCBB28C335E8C9, 0xA12C5AC36ADFDE5A, 0x2F0E1EBA9EA36930, 0x6DFEFF5137495FA3, 0xAAEFDD6DCD770416, 0xE81F3C86649D3285, 0xF45BB4758C645C51, 0xB6AB559E258E6AC2, 0x71BA77A2DFB03177, 0x334A9649765A07E4, 0xBD68D2308226B08E, 0xFF9833DB2BCC861D, 0x388911E7D1F2DDA8, 0x7A79F00C7818EB3B, 0xCC7AF1FF21C30BDE, 0x8E8A101488293D4D, 0x499B3228721766F8, 0xB6BD3C3DBFD506B, 0x854997BA2F81E701, 0xC7B97651866BD192, 0xA8546D7C558A27, 0x4258B586D5BFBCB4, 0x5E1C3D753D46D260, 0x1CECDC9E94ACE4F3, 0xDBFDFEA26E92BF46, 0x990D1F49C77889D5, 0x172F5B3033043EBF, 0x55DFBADB9AEE082C, 0x92CE98E760D05399, 0xD03E790CC93A650A, 0xAA478900B1228E31, 0xE8B768EB18C8B8A2, 0x2FA64AD7E2F6E317, 0x6D56AB3C4B1CD584, 0xE374EF45BF6062EE, 0xA1840EAE168A547D, 0x66952C92ECB40FC8, 0x2465CD79455E395B, 0x3821458AADA7578F, 0x7AD1A461044D611C, 0xBDC0865DFE733AA9, 0xFF3067B657990C3A, 0x711223CFA3E5BB50, 0x33E2C2240A0F8DC3, 0xF4F3E018F031D676, 0xB60301F359DBE0E5, 0xDA050215EA6C212F, 0x98F5E3FE438617BC, 0x5FE4C1C2B9B84C09, 0x1D14202910527A9A, 0x93366450E42ECDF0, 0xD1C685BB4DC4FB63, 0x16D7A787B7FAA0D6, 0x5427466C1E109645, 0x4863CE9FF6E9F891, 0xA932F745F03CE02, 0xCD820D48A53D95B7, 0x8F72ECA30CD7A324, 0x150A8DAF8AB144E, 0x43A04931514122DD, 0x84B16B0DAB7F7968, 0xC6418AE602954FFB, 0xBC387AEA7A8DA4C0, 0xFEC89B01D3679253, 0x39D9B93D2959C9E6, 0x7B2958D680B3FF75, 0xF50B1CAF74CF481F, 0xB7FBFD44DD257E8C, 0x70EADF78271B2539, 0x321A3E938EF113AA, 0x2E5EB66066087D7E, 0x6CAE578BCFE24BED, 0xABBF75B735DC1058, 0xE94F945C9C3626CB, 0x676DD025684A91A1, 0x259D31CEC1A0A732, 0xE28C13F23B9EFC87, 0xA07CF2199274CA14, 0x167FF3EACBAF2AF1, 0x548F120162451C62, 0x939E303D987B47D7, 0xD16ED1D631917144, 0x5F4C95AFC5EDC62E, 0x1DBC74446C07F0BD, 0xDAAD56789639AB08, 0x985DB7933FD39D9B, 0x84193F60D72AF34F, 0xC6E9DE8B7EC0C5DC, 0x1F8FCB784FE9E69, 0x43081D5C2D14A8FA, 0xCD2A5925D9681F90, 0x8FDAB8CE70822903, 0x48CB9AF28ABC72B6, 0xA3B7B1923564425, 0x70428B155B4EAF1E, 0x32B26AFEF2A4998D, 0xF5A348C2089AC238, 0xB753A929A170F4AB, 0x3971ED50550C43C1, 0x7B810CBBFCE67552, 0xBC902E8706D82EE7, 0xFE60CF6CAF321874, 0xE224479F47CB76A0, 0xA0D4A674EE214033, 0x67C58448141F1B86, 0x253565A3BDF52D15, 0xAB1721DA49899A7F, 0xE9E7C031E063ACEC, 0x2EF6E20D1A5DF759, 0x6C0603E6B3B7C1CA, 0xF6FAE5C07D3274CD, 0xB40A042BD4D8425E, 0x731B26172EE619EB, 0x31EBC7FC870C2F78, 0xBFC9838573709812, 0xFD39626EDA9AAE81, 0x3A28405220A4F534, 0x78D8A1B9894EC3A7, 0x649C294A61B7AD73, 0x266CC8A1C85D9BE0, 0xE17DEA9D3263C055, 0xA38D0B769B89F6C6, 0x2DAF4F0F6FF541AC, 0x6F5FAEE4C61F773F, 0xA84E8CD83C212C8A, 0xEABE6D3395CB1A19, 0x90C79D3FEDD3F122, 0xD2377CD44439C7B1, 0x15265EE8BE079C04, 0x57D6BF0317EDAA97, 0xD9F4FB7AE3911DFD, 0x9B041A914A7B2B6E, 0x5C1538ADB04570DB, 0x1EE5D94619AF4648, 0x2A151B5F156289C, 0x4051B05E58BC1E0F, 0x87409262A28245BA, 0xC5B073890B687329, 0x4B9237F0FF14C443, 0x962D61B56FEF2D0, 0xCE73F427ACC0A965, 0x8C8315CC052A9FF6, 0x3A80143F5CF17F13, 0x7870F5D4F51B4980, 0xBF61D7E80F251235, 0xFD913603A6CF24A6, 0x73B3727A52B393CC, 0x31439391FB59A55F, 0xF652B1AD0167FEEA, 0xB4A25046A88DC879, 0xA8E6D8B54074A6AD, 0xEA16395EE99E903E, 0x2D071B6213A0CB8B, 0x6FF7FA89BA4AFD18, 0xE1D5BEF04E364A72, 0xA3255F1BE7DC7CE1, 0x64347D271DE22754, 0x26C49CCCB40811C7, 0x5CBD6CC0CC10FAFC, 0x1E4D8D2B65FACC6F, 0xD95CAF179FC497DA, 0x9BAC4EFC362EA149, 0x158E0A85C2521623, 0x577EEB6E6BB820B0, 0x906FC95291867B05, 0xD29F28B9386C4D96, 0xCEDBA04AD0952342, 0x8C2B41A1797F15D1, 0x4B3A639D83414E64, 0x9CA82762AAB78F7, 0x87E8C60FDED7CF9D, 0xC51827E4773DF90E, 0x20905D88D03A2BB, 0x40F9E43324E99428, 0x2CFFE7D5975E55E2, 0x6E0F063E3EB46371, 0xA91E2402C48A38C4, 0xEBEEC5E96D600E57, 0x65CC8190991CB93D, 0x273C607B30F68FAE, 0xE02D4247CAC8D41B, 0xA2DDA3AC6322E288, 0xBE992B5F8BDB8C5C, 0xFC69CAB42231BACF, 0x3B78E888D80FE17A, 0x7988096371E5D7E9, 0xF7AA4D1A85996083, 0xB55AACF12C735610, 0x724B8ECDD64D0DA5, 0x30BB6F267FA73B36, 0x4AC29F2A07BFD00D, 0x8327EC1AE55E69E, 0xCF235CFD546BBD2B, 0x8DD3BD16FD818BB8, 0x3F1F96F09FD3CD2, 0x41011884A0170A41, 0x86103AB85A2951F4, 0xC4E0DB53F3C36767, 0xD8A453A01B3A09B3, 0x9A54B24BB2D03F20, 0x5D45907748EE6495, 0x1FB5719CE1045206, 0x919735E51578E56C, 0xD367D40EBC92D3FF, 0x1476F63246AC884A, 0x568617D9EF46BED9, 0xE085162AB69D5E3C, 0xA275F7C11F7768AF, 0x6564D5FDE549331A, 0x279434164CA30589, 0xA9B6706FB8DFB2E3, 0xEB46918411358470, 0x2C57B3B8EB0BDFC5, 0x6EA7525342E1E956, 0x72E3DAA0AA188782, 0x30133B4B03F2B111, 0xF7021977F9CCEAA4, 0xB5F2F89C5026DC37, 0x3BD0BCE5A45A6B5D, 0x79205D0E0DB05DCE, 0xBE317F32F78E067B, 0xFCC19ED95E6430E8, 0x86B86ED5267CDBD3, 0xC4488F3E8F96ED40, 0x359AD0275A8B6F5, 0x41A94CE9DC428066, 0xCF8B0890283E370C, 0x8D7BE97B81D4019F, 0x4A6ACB477BEA5A2A, 0x89A2AACD2006CB9, 0x14DEA25F3AF9026D, 0x562E43B4931334FE, 0x913F6188692D6F4B, 0xD3CF8063C0C759D8, 0x5DEDC41A34BBEEB2, 0x1F1D25F19D51D821, 0xD80C07CD676F8394, 0x9AFCE626CE85B507, }; } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/Crc64.Vectorized.cs ================================================ #if NET7_0_OR_GREATER using System; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; using System.Runtime.InteropServices; using static BloomFilter.HashAlgorithms.Internal.VectorHelper; namespace BloomFilter.HashAlgorithms.Internal; internal partial class Crc64 { [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Vector128 LoadFromSource(ref byte source, nuint elementOffset) { Vector128 vector = Vector128.LoadUnsafe(ref source, elementOffset); if (BitConverter.IsLittleEndian) { // Reverse the byte order. // SSSE3 is required to get PSHUFB acceleration for Vector128.Shuffle on x86/x64. // However, the gains from vectorizing the rest of the operations seem to to be // greater than the added cost of emulating the shuffle, so we don't require SSSE3 support. vector = Vector128.Shuffle(vector, Vector128.Create((byte)0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00)); } return vector.AsUInt64(); } // All of these checks except the length check are elided by JIT, so the JITted implementation // will be either a return false or a length check against a constant. This means this method // should be inlined into the caller. private static bool CanBeVectorized(ReadOnlySpan source) => VectorHelper.IsSupported && source.Length >= Vector128.Count; // Processes the bytes in source in 128 byte chunks using intrinsics, followed by processing 16 // byte chunks, and then processing remaining bytes individually. Requires at least 16 bytes of data. // Requires little endian byte order and support for PCLMULQDQ intrinsics on Intel architecture // or AES and AdvSimd intrinsics on ARM architecture. Based on the algorithm put forth in the Intel paper // "Fast CRC Computation for Generic Polynomials Using PCLMULQDQ Instruction" in December, 2009 and the // Intel reference implementation. // https://github.com/intel/isa-l/blob/33a2d9484595c2d6516c920ce39a694c144ddf69/crc/crc64_ecma_norm_by8.asm private static ulong UpdateVectorized(ulong crc, ReadOnlySpan source) { Debug.Assert(CanBeVectorized(source), "source cannot be vectorized."); // Work with a reference to where we're at in the ReadOnlySpan and a local length // to avoid extraneous range checks. ref byte srcRef = ref MemoryMarshal.GetReference(source); int length = source.Length; Vector128 x7; // Accumulator for the new CRC Vector128 kConstants; // Used to store reused constants if (length >= Vector128.Count * 16) // At least 256 bytes { // Load the first 128 bytes Vector128 x0 = LoadFromSource(ref srcRef, 0); Vector128 x1 = LoadFromSource(ref srcRef, 16); Vector128 x2 = LoadFromSource(ref srcRef, 32); Vector128 x3 = LoadFromSource(ref srcRef, 48); Vector128 x4 = LoadFromSource(ref srcRef, 64); Vector128 x5 = LoadFromSource(ref srcRef, 80); Vector128 x6 = LoadFromSource(ref srcRef, 96); x7 = LoadFromSource(ref srcRef, 112); srcRef = ref Unsafe.Add(ref srcRef, Vector128.Count * 8); length -= Vector128.Count * 8; // Load and XOR the initial CRC value // CRC value does not need to be byte-reflected, but it needs to be moved to the high part of the register. // because data will be byte-reflected and will align with initial crc at correct place. x0 ^= ShiftLowerToUpper(Vector128.CreateScalar(crc)); kConstants = Vector128.Create(0x5cf79dea9ac37d6UL, 0x001067e571d7d5c2UL); // k3, k4 // Parallel fold blocks of 128 do { Vector128 y1 = LoadFromSource(ref srcRef, 0); Vector128 y2 = LoadFromSource(ref srcRef, 16); x0 = FoldPolynomialPair(y1, x0, kConstants); x1 = FoldPolynomialPair(y2, x1, kConstants); y1 = LoadFromSource(ref srcRef, 32); y2 = LoadFromSource(ref srcRef, 48); x2 = FoldPolynomialPair(y1, x2, kConstants); x3 = FoldPolynomialPair(y2, x3, kConstants); y1 = LoadFromSource(ref srcRef, 64); y2 = LoadFromSource(ref srcRef, 80); x4 = FoldPolynomialPair(y1, x4, kConstants); x5 = FoldPolynomialPair(y2, x5, kConstants); y1 = LoadFromSource(ref srcRef, 96); y2 = LoadFromSource(ref srcRef, 112); x6 = FoldPolynomialPair(y1, x6, kConstants); x7 = FoldPolynomialPair(y2, x7, kConstants); srcRef = ref Unsafe.Add(ref srcRef, Vector128.Count * 8); length -= Vector128.Count * 8; } while (length >= Vector128.Count * 8); // Fold into 128-bits in x7 x7 = FoldPolynomialPair(x7, x0, Vector128.Create(0xe464f4df5fb60ac1UL, 0xb649c5b35a759cf2UL)); // k9, k10 x7 = FoldPolynomialPair(x7, x1, Vector128.Create(0x9af04e1eff82d0ddUL, 0x6e82e609297f8fe8UL)); // k11, k12 x7 = FoldPolynomialPair(x7, x2, Vector128.Create(0x97c516e98bd2e73UL, 0xb76477b31e22e7bUL)); // k13, k14 x7 = FoldPolynomialPair(x7, x3, Vector128.Create(0x5f6843ca540df020UL, 0xddf4b6981205b83fUL)); // k15, k16 x7 = FoldPolynomialPair(x7, x4, Vector128.Create(0x54819d8713758b2cUL, 0x4a6b90073eb0af5aUL)); // k17, k18 x7 = FoldPolynomialPair(x7, x5, Vector128.Create(0x571bee0a227ef92bUL, 0x44bef2a201b5200cUL)); // k19, k20 x7 = FoldPolynomialPair(x7, x6, Vector128.Create(0x5f5c3c7eb52fab6UL, 0x4eb938a7d257740eUL)); // k1, k2 } else { // For shorter sources just load the first vector and XOR with the CRC Debug.Assert(length >= 16); x7 = LoadFromSource(ref srcRef, 0); // Load and XOR the initial CRC value // CRC value does not need to be byte-reflected, but it needs to be moved to the high part of the register. // because the data will be byte-reflected and will align with initial crc at correct place. x7 ^= ShiftLowerToUpper(Vector128.CreateScalar(crc)); srcRef = ref Unsafe.Add(ref srcRef, Vector128.Count); length -= Vector128.Count; } // Single fold blocks of 16, if any, into x7 while (length >= Vector128.Count) { x7 = FoldPolynomialPair(LoadFromSource(ref srcRef, 0), x7, Vector128.Create(0x5f5c3c7eb52fab6UL, 0x4eb938a7d257740eUL)); // k1, k2 srcRef = ref Unsafe.Add(ref srcRef, Vector128.Count); length -= Vector128.Count; } // Compute CRC of a 128-bit value and fold to the upper 64-bits x7 = CarrylessMultiplyLeftUpperRightLower(x7, Vector128.CreateScalar(0x5f5c3c7eb52fab6UL)) ^ // k5 ShiftLowerToUpper(x7); // Barrett reduction kConstants = Vector128.Create(0x578d29d06cc4f872UL, 0x42f0e1eba9ea3693UL); // k7, k8 Vector128 temp = x7; x7 = CarrylessMultiplyLeftUpperRightLower(x7, kConstants) ^ (x7 & Vector128.Create(0UL, ~0UL)); x7 = CarrylessMultiplyUpper(x7, kConstants); x7 ^= temp; // Process the remaining bytes, if any ulong result = x7.GetElement(0); return length > 0 ? UpdateScalar(result, MemoryMarshal.CreateReadOnlySpan(ref srcRef, length)) : result; } } #endif ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/Crc64.cs ================================================  // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Buffers.Binary; namespace BloomFilter.HashAlgorithms.Internal; /// /// Provides an implementation of the CRC-64 algorithm as described in ECMA-182, Annex B. /// /// /// /// For methods that return byte arrays or that write into spans of bytes, /// this implementation emits the answer in the Big Endian byte order so that /// the CRC residue relationship (CRC(message concat CRC(message))) is a fixed value) holds. /// For CRC-64 this stable output is the byte sequence /// { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }. /// /// /// There are multiple, incompatible, definitions of a 64-bit cyclic redundancy /// check (CRC) algorithm. When interoperating with another system, ensure that you /// are using the same definition. The definition used by this implementation is not /// compatible with the cyclic redundancy check described in ISO 3309. /// /// internal sealed partial class Crc64 : NonCryptoHashAlgorithm { private const ulong InitialState = 0UL; private const int Size = sizeof(ulong); private ulong _crc = InitialState; /// /// Initializes a new instance of the class. /// public Crc64() : base(Size) { } /// /// Appends the contents of to the data already /// processed for the current hash computation. /// /// The data to process. public override void Append(ReadOnlySpan source) { _crc = Update(_crc, source); } /// /// Resets the hash computation to the initial state. /// public override void Reset() { _crc = InitialState; } /// /// Writes the computed hash value to /// without modifying accumulated state. /// /// The buffer that receives the computed hash value. protected override void GetCurrentHashCore(Span destination) { BinaryPrimitives.WriteUInt64BigEndian(destination, _crc); } /// /// Writes the computed hash value to /// then clears the accumulated state. /// protected override void GetHashAndResetCore(Span destination) { BinaryPrimitives.WriteUInt64BigEndian(destination, _crc); _crc = InitialState; } /// Gets the current computed hash value without modifying accumulated state. /// The hash value for the data already provided. public ulong GetCurrentHashAsUInt64() => _crc; public static ulong HashToUInt64(ReadOnlySpan source) => Update(InitialState, source); private static ulong Update(ulong crc, ReadOnlySpan source) { #if NET7_0_OR_GREATER if (CanBeVectorized(source)) { return UpdateVectorized(crc, source); } #endif return UpdateScalar(crc, source); } private static ulong UpdateScalar(ulong crc, ReadOnlySpan source) { ReadOnlySpan crcLookup = CrcLookup; for (int i = 0; i < source.Length; i++) { ulong idx = (crc >> 56); idx ^= source[i]; crc = crcLookup[(int)idx] ^ (crc << 8); } return crc; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/FNV1.cs ================================================ using System; using System.Buffers.Binary; namespace BloomFilter.HashAlgorithms.Internal; /// /// FNV1 algorithm /// internal partial class FNV1 : NonCryptoHashAlgorithm { private const int Size = sizeof(uint); private uint _current; private const uint Prime = 16_777_619; private const uint InitialState = 2_166_136_261; /// /// Initializes a new instance of the class. /// public FNV1() : base(Size) { Reset(); } /// /// Appends the contents of to the data already /// processed for the current hash computation. /// /// The data to process. public override void Append(ReadOnlySpan source) { _current = Update(_current, source); } /// /// Resets the hash computation to the initial state. /// public override void Reset() { _current = InitialState; } /// /// Writes the computed hash value to /// without modifying accumulated state. /// /// The buffer that receives the computed hash value. protected override void GetCurrentHashCore(Span destination) { BinaryPrimitives.WriteUInt32LittleEndian(destination, _current); } /// /// Writes the computed hash value to /// then clears the accumulated state. /// protected override void GetHashAndResetCore(Span destination) { BinaryPrimitives.WriteUInt32LittleEndian(destination, _current); _current = InitialState; } /// Gets the current computed hash value without modifying accumulated state. /// The hash value for the data already provided. public uint GetCurrentHashAsUInt32() => _current; /// Computes the FNV1 hash of the provided data. /// The data to hash. /// The computed FNV1 hash. public static uint HashToUInt32(ReadOnlySpan source) => Update(InitialState, source); private static uint Update(uint current, ReadOnlySpan source) { for (int i = 0; i < source.Length; i++) { current *= Prime; current ^= source[i]; } return current; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/FNV1a.cs ================================================ using System; using System.Buffers.Binary; namespace BloomFilter.HashAlgorithms.Internal; /// /// FNV1a algorithm /// internal class FNV1a : NonCryptoHashAlgorithm { private const int Size = sizeof(uint); private uint _current; private const uint Prime = 16_777_619; private const uint InitialState = 2_166_136_261; /// /// Initializes a new instance of the class. /// public FNV1a() : base(Size) { Reset(); } /// /// Appends the contents of to the data already /// processed for the current hash computation. /// /// The data to process. public override void Append(ReadOnlySpan source) { _current = Update(_current, source); } /// /// Resets the hash computation to the initial state. /// public override void Reset() { _current = InitialState; } /// /// Writes the computed hash value to /// without modifying accumulated state. /// /// The buffer that receives the computed hash value. protected override void GetCurrentHashCore(Span destination) { BinaryPrimitives.WriteUInt32LittleEndian(destination, _current); } /// /// Writes the computed hash value to /// then clears the accumulated state. /// protected override void GetHashAndResetCore(Span destination) { BinaryPrimitives.WriteUInt32LittleEndian(destination, _current); _current = InitialState; } /// Gets the current computed hash value without modifying accumulated state. /// The hash value for the data already provided. public uint GetCurrentHashAsUInt32() => _current; /// Computes the FNV1 hash of the provided data. /// The data to hash. /// The computed FNV1 hash. public static uint HashToUInt32(ReadOnlySpan source) => Update(InitialState, source); private static uint Update(uint current, ReadOnlySpan source) { for (int i = 0; i < source.Length; i++) { current ^= source[i]; current *= Prime; } return current; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/ModifiedFNV1.cs ================================================ using System; using System.Buffers.Binary; namespace BloomFilter.HashAlgorithms.Internal; /// /// Implements a modified FNV hash. Provides better distribution than FNV1 but it's only 32 bit long. /// internal class ModifiedFNV1 : NonCryptoHashAlgorithm { private const int Size = sizeof(uint); private uint _current; private const uint Prime = 16_777_619; private const uint InitialState = 2_166_136_261; /// /// Initializes a new instance of the class. /// public ModifiedFNV1() : base(Size) { Reset(); } /// /// Appends the contents of to the data already /// processed for the current hash computation. /// /// The data to process. public override void Append(ReadOnlySpan source) { _current = Update(_current, source); } /// /// Resets the hash computation to the initial state. /// public override void Reset() { _current = InitialState; } /// /// Writes the computed hash value to /// without modifying accumulated state. /// /// The buffer that receives the computed hash value. protected override void GetCurrentHashCore(Span destination) { _current = GetCurrentHashAsUInt32(); BinaryPrimitives.WriteUInt32LittleEndian(destination, _current); } /// /// Writes the computed hash value to /// then clears the accumulated state. /// protected override void GetHashAndResetCore(Span destination) { _current = GetCurrentHashAsUInt32(); BinaryPrimitives.WriteUInt32LittleEndian(destination, _current); _current = InitialState; } /// Gets the current computed hash value without modifying accumulated state. /// The hash value for the data already provided. public uint GetCurrentHashAsUInt32() { return Finalization(_current); } /// Computes the FNV1 hash of the provided data. /// The data to hash. /// The computed FNV1 hash. public static uint HashToUInt32(ReadOnlySpan source) => Finalization(Update(InitialState, source)); private static uint Update(uint current, ReadOnlySpan source) { for (int i = 0; i < source.Length; i++) { current ^= source[i]; current *= Prime; } return current; } private static uint Finalization(uint current) { current += current << 13; current ^= current >> 7; current += current << 3; current ^= current >> 17; current += current << 5; return current; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/Murmur128BitsX64.State.cs ================================================ using System; using System.Buffers.Binary; using System.Runtime.CompilerServices; namespace BloomFilter.HashAlgorithms.Internal; internal partial class Murmur128BitsX64 { private struct State { private const ulong C1 = 0x87c37b91114253d5UL; private const ulong C2 = 0x4cf5ad432745937fUL; private ulong _hash1; private ulong _hash2; internal State(uint seed) { _hash1 = _hash2 = seed; } internal unsafe void ProcessBlock(ReadOnlySpan source) { source = source.Slice(0, BlockSize); ulong k1 = BinaryPrimitives.ReadUInt64LittleEndian(source); ulong k2 = BinaryPrimitives.ReadUInt64LittleEndian(source.Slice(sizeof(ulong))); // a variant of original algorithm optimized for processor instruction pipelining k1 *= C1; k1 = BinaryHelper.RotateLeft(k1, 31); k1 *= C2; _hash1 ^= k1; _hash1 = BinaryHelper.RotateLeft(_hash1, 27); _hash1 += _hash2; _hash1 = _hash1 * 5 + 0x52dce729; k2 *= C2; k2 = BinaryHelper.RotateLeft(k2, 33); k2 *= C1; _hash2 ^= k2; _hash2 = BinaryHelper.RotateLeft(_hash2, 31); _hash2 += _hash1; _hash2 = _hash2 * 5 + 0x38495ab5; } internal readonly ulong[] Tail(int length, ReadOnlySpan remaining) { ulong hash1 = _hash1; ulong hash2 = _hash2; ulong k1 = 0, k2 = 0; // determine how many bytes we have left to work with based on length switch (length & 15) { case 15: k2 ^= (ulong)remaining[14] << 48; goto case 14; case 14: k2 ^= (ulong)remaining[13] << 40; goto case 13; case 13: k2 ^= (ulong)remaining[12] << 32; goto case 12; case 12: k2 ^= (ulong)remaining[11] << 24; goto case 11; case 11: k2 ^= (ulong)remaining[10] << 16; goto case 10; case 10: k2 ^= (ulong)remaining[9] << 8; goto case 9; case 9: k2 ^= (ulong)remaining[8] << 0; goto case 8; case 8: k1 ^= (ulong)remaining[7] << 56; goto case 7; case 7: k1 ^= (ulong)remaining[6] << 48; goto case 6; case 6: k1 ^= (ulong)remaining[5] << 40; goto case 5; case 5: k1 ^= (ulong)remaining[4] << 32; goto case 4; case 4: k1 ^= (ulong)remaining[3] << 24; goto case 3; case 3: k1 ^= (ulong)remaining[2] << 16; goto case 2; case 2: k1 ^= (ulong)remaining[1] << 8; goto case 1; case 1: k1 ^= (ulong)remaining[0] << 0; break; } hash2 ^= BinaryHelper.RotateLeft(k2 * C2, 33) * C1; hash1 ^= BinaryHelper.RotateLeft(k1 * C1, 31) * C2; return Finalization(length, hash1, hash2); } private static ulong[] Finalization(int length, ulong hash1, ulong hash2) { var H1 = hash1; var H2 = hash2; ulong len = (ulong)length; H1 ^= len; H2 ^= len; H1 += H2; H2 += H1; H1 = FMix(H1); H2 = FMix(H2); H1 += H2; H2 += H1; return new[] { H1, H2 }; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static ulong FMix(ulong h) { h = (h ^ (h >> 33)) * 0xff51afd7ed558ccd; h = (h ^ (h >> 33)) * 0xc4ceb9fe1a85ec53; return (h ^ (h >> 33)); } } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/Murmur128BitsX64.cs ================================================ using System; using System.Buffers.Binary; namespace BloomFilter.HashAlgorithms.Internal; /// /// Provides an implementation of the MurmurHash 128 bits x64 algorithm. /// https://en.wikipedia.org/wiki/MurmurHash /// internal partial class Murmur128BitsX64 : NonCryptoHashAlgorithm { private const int HashSize = sizeof(ulong) * 2; private const int BlockSize = sizeof(ulong) * 2; private readonly uint _seed; private State _state; private byte[]? _holdback; private int _length; public Murmur128BitsX64() : base(HashSize) { } public Murmur128BitsX64(uint seed) : base(HashSize) { _seed = seed; Reset(); } public override void Reset() { _state = new State(_seed); _length = 0; } public override void Append(ReadOnlySpan source) { int held = _length & 0x0F; if (held != 0) { int remain = BlockSize - held; if (source.Length >= remain) { source.Slice(0, remain).CopyTo(_holdback.AsSpan(held)); _state.ProcessBlock(_holdback); source = source.Slice(remain); _length += remain; } else { source.CopyTo(_holdback.AsSpan(held)); _length += source.Length; return; } } while (source.Length >= BlockSize) { _state.ProcessBlock(source); source = source.Slice(BlockSize); _length += BlockSize; } if (source.Length > 0) { _holdback ??= new byte[BlockSize]; source.CopyTo(_holdback); _length += source.Length; } } protected override void GetCurrentHashCore(Span destination) { ulong[] hash = GetCurrentHashAsUInt128Array(); Fill(destination, ref hash); } #if NET7_0_OR_GREATER /// Gets the current computed hash value without modifying accumulated state. /// The hash value for the data already provided. public UInt128 GetCurrentHashAsUInt128() { ulong[] current = GetCurrentHashAsUInt128Array(); return new UInt128(current[1], current[2]); } #endif /// Gets the current computed hash value without modifying accumulated state. /// The hash value for the data already provided. public ulong[] GetCurrentHashAsUInt128Array() { int remainingLength = _length & 0x0F; ReadOnlySpan remaining = ReadOnlySpan.Empty; if (remainingLength > 0) { remaining = new ReadOnlySpan(_holdback, 0, remainingLength); } return _state.Tail(_length, remaining); } public static ulong[] HashToUInt128Array(ReadOnlySpan source, uint seed = 0) { int totalLength = source.Length; State state = new(seed); while (source.Length >= BlockSize) { state.ProcessBlock(source); source = source.Slice(BlockSize); } return state.Tail(totalLength, source); } private static void Fill(Span destination, ref ulong[] hash) { BinaryPrimitives.WriteUInt64LittleEndian(destination, hash[0]); BinaryPrimitives.WriteUInt64LittleEndian(destination.Slice(sizeof(ulong)), hash[1]); } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/Murmur128BitsX86.State.cs ================================================ using System; using System.Buffers.Binary; using System.Runtime.CompilerServices; namespace BloomFilter.HashAlgorithms.Internal; internal partial class Murmur128BitsX86 { private struct State { private const uint C1 = 0x239b961b; private const uint C2 = 0xab0e9789; private const uint C3 = 0x38b34ae5; private const uint C4 = 0xa1e38b93; private uint _hash1; private uint _hash2; private uint _hash3; private uint _hash4; internal State(uint seed) { _hash1 = _hash2 = _hash3 = _hash4 = seed; } internal unsafe void ProcessBlock(ReadOnlySpan source) { source = source.Slice(0, BlockSize); uint k1 = BinaryPrimitives.ReadUInt32LittleEndian(source); uint k2 = BinaryPrimitives.ReadUInt32LittleEndian(source.Slice(sizeof(uint))); uint k3 = BinaryPrimitives.ReadUInt32LittleEndian(source.Slice(sizeof(uint) * 2)); uint k4 = BinaryPrimitives.ReadUInt32LittleEndian(source.Slice(sizeof(uint) * 3)); k1 *= C1; k1 = BinaryHelper.RotateLeft(k1, 15); k1 *= C2; _hash1 ^= k1; _hash1 = BinaryHelper.RotateLeft(_hash1, 19); _hash1 += _hash2; _hash1 = _hash1 * 5 + 0x561ccd1b; k2 *= C2; k2 = BinaryHelper.RotateLeft(k2, 16); k2 *= C3; _hash2 ^= k2; _hash2 = BinaryHelper.RotateLeft(_hash2, 17); _hash2 += _hash3; _hash2 = _hash2 * 5 + 0x0bcaa747; k3 *= C3; k3 = BinaryHelper.RotateLeft(k3, 17); k3 *= C4; _hash3 ^= k3; _hash3 = BinaryHelper.RotateLeft(_hash3, 15); _hash3 += _hash4; _hash3 = _hash3 * 5 + 0x96cd1c35; k4 *= C4; k4 = BinaryHelper.RotateLeft(k4, 18); k4 *= C1; _hash4 ^= k4; _hash4 = BinaryHelper.RotateLeft(_hash4, 13); _hash4 += _hash1; _hash4 = _hash4 * 5 + 0x32ac3b17; } internal readonly uint[] Tail(int length, ReadOnlySpan remaining) { uint h1 = _hash1; uint h2 = _hash2; uint h3 = _hash3; uint h4 = _hash4; uint k1 = 0; uint k2 = 0; uint k3 = 0; uint k4 = 0; // determine how many bytes we have left to work with based on length switch (length & 15) { case 15: k4 ^= (uint)remaining[14] << 16; goto case 14; case 14: k4 ^= (uint)remaining[13] << 8; goto case 13; case 13: k4 ^= (uint)remaining[12] << 0; goto case 12; case 12: k3 ^= (uint)remaining[11] << 24; goto case 11; case 11: k3 ^= (uint)remaining[10] << 16; goto case 10; case 10: k3 ^= (uint)remaining[9] << 8; goto case 9; case 9: k3 ^= (uint)remaining[8] << 0; goto case 8; case 8: k2 ^= (uint)remaining[7] << 24; goto case 7; case 7: k2 ^= (uint)remaining[6] << 16; goto case 6; case 6: k2 ^= (uint)remaining[5] << 8; goto case 5; case 5: k2 ^= (uint)remaining[4] << 0; goto case 4; case 4: k1 ^= (uint)remaining[3] << 24; goto case 3; case 3: k1 ^= (uint)remaining[2] << 16; goto case 2; case 2: k1 ^= (uint)remaining[1] << 8; goto case 1; case 1: k1 ^= (uint)remaining[0] << 0; break; } h4 ^= BinaryHelper.RotateLeft(k4 * C4, 18) * C1; h3 ^= BinaryHelper.RotateLeft(k3 * C3, 17) * C4; h2 ^= BinaryHelper.RotateLeft(k2 * C2, 16) * C3; h1 ^= BinaryHelper.RotateLeft(k1 * C1, 15) * C2; return Finalization(length, h1, h2, h3, h4); } private static uint[] Finalization(int length, uint h1, uint h2, uint h3, uint h4) { uint len = (uint)length; // pipelining friendly algorithm h1 ^= len; h2 ^= len; h3 ^= len; h4 ^= len; h1 += (h2 + h3 + h4); h2 += h1; h3 += h1; h4 += h1; h1 = FMix(h1); h2 = FMix(h2); h3 = FMix(h3); h4 = FMix(h4); h1 += (h2 + h3 + h4); h2 += h1; h3 += h1; h4 += h1; return new[] { h1, h2, h3, h4 }; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static uint FMix(uint h) { h = (h ^ (h >> 16)) * 0x85ebca6b; h = (h ^ (h >> 13)) * 0xc2b2ae35; return h ^ (h >> 16); } } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/Murmur128BitsX86.cs ================================================ using System; using System.Buffers.Binary; namespace BloomFilter.HashAlgorithms.Internal; /// /// Provides an implementation of the MurmurHash 128 bits x86 algorithm. /// https://en.wikipedia.org/wiki/MurmurHash /// internal partial class Murmur128BitsX86 : NonCryptoHashAlgorithm { private const int HashSize = sizeof(uint) * 4; private const int BlockSize = sizeof(uint) * 4; private readonly uint _seed; private State _state; private byte[]? _holdback; private int _length; public Murmur128BitsX86() : base(HashSize) { } public Murmur128BitsX86(uint seed) : base(HashSize) { _seed = seed; Reset(); } public override void Reset() { _state = new State(_seed); _length = 0; } public override void Append(ReadOnlySpan source) { int held = _length & 0x0F; if (held != 0) { int remain = BlockSize - held; if (source.Length >= remain) { source.Slice(0, remain).CopyTo(_holdback.AsSpan(held)); _state.ProcessBlock(_holdback); source = source.Slice(remain); _length += remain; } else { source.CopyTo(_holdback.AsSpan(held)); _length += source.Length; return; } } while (source.Length >= BlockSize) { _state.ProcessBlock(source); source = source.Slice(BlockSize); _length += BlockSize; } if (source.Length > 0) { _holdback ??= new byte[BlockSize]; source.CopyTo(_holdback); _length += source.Length; } } protected override void GetCurrentHashCore(Span destination) { uint[] hash = GetCurrentHashAsUInt128Array(); Fill(destination, ref hash); } /// Gets the current computed hash value without modifying accumulated state. /// The hash value for the data already provided. public uint[] GetCurrentHashAsUInt128Array() { int remainingLength = _length & 0x0F; ReadOnlySpan remaining = ReadOnlySpan.Empty; if (remainingLength > 0) { remaining = new ReadOnlySpan(_holdback, 0, remainingLength); } return _state.Tail(_length, remaining); } public static uint[] HashToUInt128Array(ReadOnlySpan source, uint seed = 0) { int totalLength = source.Length; State state = new(seed); while (source.Length >= BlockSize) { state.ProcessBlock(source); source = source.Slice(BlockSize); } return state.Tail(totalLength, source); } private static void Fill(Span destination, ref uint[] hash) { BinaryPrimitives.WriteUInt32LittleEndian(destination, hash[0]); BinaryPrimitives.WriteUInt32LittleEndian(destination.Slice(sizeof(uint)), hash[1]); BinaryPrimitives.WriteUInt32LittleEndian(destination.Slice(sizeof(uint) * 2), hash[2]); BinaryPrimitives.WriteUInt32LittleEndian(destination.Slice(sizeof(uint) * 3), hash[3]); } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/Murmur32BitsX86.State.cs ================================================ using System; using System.Buffers.Binary; using System.Runtime.CompilerServices; namespace BloomFilter.HashAlgorithms.Internal; internal partial class Murmur32BitsX86 { private struct State { /// /// First hash multiplication constant. /// private const uint C1 = 0xCC9E2D51U; /// /// Second hash multiplication constant. /// private const uint C2 = 0x1B873593U; /// /// The hash value. /// private uint _hash; internal State(uint seed) { _hash = seed; } internal unsafe void ProcessBlock(ReadOnlySpan source) { source = source.Slice(0, BlockSize); _hash ^= C2 * BinaryHelper.RotateLeft(C1 * BinaryPrimitives.ReadUInt32LittleEndian(source), 15); _hash = (5 * BinaryHelper.RotateLeft(_hash, 13)) + 0xE6546B64; } internal readonly uint Tail(int length, ReadOnlySpan remaining) { uint k1 = 0x00000000U; var position = 0; uint hash = _hash; switch (length & 3) { case 3: k1 ^= (uint)remaining[position + 2] << 16; k1 ^= (uint)remaining[position + 1] << 8; k1 ^= remaining[position]; hash ^= C2 * BinaryHelper.RotateLeft(C1 * k1, 15); break; case 2: k1 ^= (uint)remaining[position + 1] << 8; k1 ^= remaining[position]; hash ^= C2 * BinaryHelper.RotateLeft(C1 * k1, 15); break; case 1: k1 ^= remaining[position]; hash ^= C2 * BinaryHelper.RotateLeft(C1 * k1, 15); break; } return Finalization(hash ^ (uint)length); } /// /// Finalization mix - force all bits of a hash block to avalanche. /// /// The value to mix. /// The mixed value. [MethodImpl(MethodImplOptions.AggressiveInlining)] private static uint Finalization(in uint k) { uint k1 = 0x85EBCA6BU * (k ^ (k >> 16)); uint k2 = 0xC2B2AE35U * (k1 ^ (k1 >> 13)); return k2 ^ (k2 >> 16); } } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/Murmur32BitsX86.cs ================================================ using System; using System.Buffers.Binary; namespace BloomFilter.HashAlgorithms.Internal; /// /// Provides an implementation of the MurmurHash 32 bits x86 algorithm. /// https://en.wikipedia.org/wiki/MurmurHash /// internal partial class Murmur32BitsX86 : NonCryptoHashAlgorithm { private const int HashSize = sizeof(uint); private const int BlockSize = sizeof(uint); private readonly uint _seed; private State _state; private byte[]? _holdback; private int _length; public Murmur32BitsX86() : base(HashSize) { } public Murmur32BitsX86(uint seed) : base(HashSize) { _seed = seed; Reset(); } public override void Reset() { _state = new State(_seed); _length = 0; } public override void Append(ReadOnlySpan source) { int held = _length & 0x03; if (held != 0) { int remain = BlockSize - held; if (source.Length >= remain) { source.Slice(0, remain).CopyTo(_holdback.AsSpan(held)); _state.ProcessBlock(_holdback); source = source.Slice(remain); _length += remain; } else { source.CopyTo(_holdback.AsSpan(held)); _length += source.Length; return; } } while (source.Length >= BlockSize) { _state.ProcessBlock(source); source = source.Slice(BlockSize); _length += BlockSize; } if (source.Length > 0) { _holdback ??= new byte[BlockSize]; source.CopyTo(_holdback); _length += source.Length; } } protected override void GetCurrentHashCore(Span destination) { uint hash = GetCurrentHashAsUInt32(); BinaryPrimitives.WriteUInt32LittleEndian(destination, hash); } /// Gets the current computed hash value without modifying accumulated state. /// The hash value for the data already provided. public uint GetCurrentHashAsUInt32() { int remainingLength = _length & 0x03; ReadOnlySpan remaining = ReadOnlySpan.Empty; if (remainingLength > 0) { remaining = new ReadOnlySpan(_holdback, 0, remainingLength); } return _state.Tail(_length, remaining); } public static uint HashToUInt32(ReadOnlySpan source, uint seed = 0) { int totalLength = source.Length; State state = new(seed); while (source.Length >= BlockSize) { state.ProcessBlock(source); source = source.Slice(BlockSize); } return state.Tail(totalLength, source); } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/NonCryptoHashAlgorithm.cs ================================================ using System; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; namespace BloomFilter.HashAlgorithms.Internal; /// /// 表示非加密散列算法。 /// internal abstract class NonCryptoHashAlgorithm { /// /// 获取由此散列算法产生的字节数。 /// /// 这个散列算法产生的字节数。 public int HashLengthInBytes { get; } protected NonCryptoHashAlgorithm(int hashLengthInBytes) { if (hashLengthInBytes < 1) throw new ArgumentOutOfRangeException(nameof(hashLengthInBytes)); HashLengthInBytes = hashLengthInBytes; } public abstract void Append(ReadOnlySpan source); public abstract void Reset(); protected abstract void GetCurrentHashCore(Span destination); public void Append(byte[] source) { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(source); #else if (source is null) { throw new ArgumentNullException(nameof(source)); } #endif Append(new ReadOnlySpan(source)); } protected virtual void GetHashAndResetCore(Span destination) { Debug.Assert(destination.Length == HashLengthInBytes); GetCurrentHashCore(destination); Reset(); } #if NET6_0_OR_GREATER [DoesNotReturn] #endif protected static void ThrowDestinationTooShort() => throw new ArgumentException("Destination is too short.", "destination"); } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/ThrowHelper.cs ================================================ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; namespace BloomFilter.HashAlgorithms.Internal; internal static partial class ThrowHelper { #if NET7_0_OR_GREATER [DoesNotReturn] internal static void ThrowUnreachableException() => throw new UnreachableException(); #endif } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/VectorHelper.cs ================================================ #if NET7_0_OR_GREATER using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; using System.Runtime.Intrinsics.Arm; using System.Runtime.Intrinsics.X86; using System.Runtime.Intrinsics; using Aes = System.Runtime.Intrinsics.Arm.Aes; namespace BloomFilter.HashAlgorithms.Internal; // Helpers which provide equivalent intrinsics for Intel and ARM architectures. Should only be used // if the intrinsics are available. internal static class VectorHelper { // Pclmulqdq implies support for SSE2 public static bool IsSupported => Pclmulqdq.IsSupported || (Aes.IsSupported && AdvSimd.IsSupported); // Performs carryless multiplication of the upper pairs of source and constants and the lower pairs of source and constants, // then folds them into target using carryless addition. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Vector128 FoldPolynomialPair(Vector128 target, Vector128 source, Vector128 constants) { target ^= CarrylessMultiplyUpper(source, constants); target ^= CarrylessMultiplyLower(source, constants); return target; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Vector128 CarrylessMultiplyLower(Vector128 left, Vector128 right) { if (Pclmulqdq.IsSupported) { return Pclmulqdq.CarrylessMultiply(left, right, 0x00); } if (Aes.IsSupported) { return Aes.PolynomialMultiplyWideningLower(left.GetLower(), right.GetLower()); } ThrowHelper.ThrowUnreachableException(); return default; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Vector128 CarrylessMultiplyUpper(Vector128 left, Vector128 right) { if (Pclmulqdq.IsSupported) { return Pclmulqdq.CarrylessMultiply(left, right, 0x11); } if (Aes.IsSupported) { return Aes.PolynomialMultiplyWideningUpper(left, right); } ThrowHelper.ThrowUnreachableException(); return default; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Vector128 CarrylessMultiplyLeftUpperRightLower(Vector128 left, Vector128 right) { if (Pclmulqdq.IsSupported) { return Pclmulqdq.CarrylessMultiply(left, right, 0x01); } if (Aes.IsSupported) { return Aes.PolynomialMultiplyWideningLower(left.GetUpper(), right.GetLower()); } ThrowHelper.ThrowUnreachableException(); return default; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Vector128 CarrylessMultiplyLeftLowerRightUpper(Vector128 left, Vector128 right) { if (Pclmulqdq.IsSupported) { return Pclmulqdq.CarrylessMultiply(left, right, 0x10); } if (Aes.IsSupported) { return Aes.PolynomialMultiplyWideningLower(left.GetLower(), right.GetUpper()); } ThrowHelper.ThrowUnreachableException(); return default; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Vector128 ShiftRightBytesInVector(Vector128 operand, [ConstantExpected(Max = (byte)15)] byte numBytesToShift) { if (Sse2.IsSupported) { return Sse2.ShiftRightLogical128BitLane(operand, numBytesToShift); } if (AdvSimd.IsSupported) { return AdvSimd.ExtractVector128(operand.AsByte(), Vector128.Zero, numBytesToShift).AsUInt64(); } ThrowHelper.ThrowUnreachableException(); return default; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Vector128 ShiftLowerToUpper(Vector128 operand) { if (Sse2.IsSupported) { return Sse2.ShiftLeftLogical128BitLane(operand, 8); } if (AdvSimd.IsSupported) { return AdvSimd.ExtractVector128(Vector128.Zero, operand.AsByte(), 8).AsUInt64(); } ThrowHelper.ThrowUnreachableException(); return default; } } #endif ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/XxHash128.cs ================================================ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // Based on the XXH128 implementation from https://github.com/Cyan4973/xxHash. using System; using System.Buffers.Binary; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using static BloomFilter.HashAlgorithms.Internal.XxHashShared; namespace BloomFilter.HashAlgorithms.Internal; /// Provides an implementation of the XXH128 hash algorithm for generating a 128-bit hash. /// /// For methods that persist the computed numerical hash value as bytes, /// the value is written in the Big Endian byte order. /// internal sealed unsafe class XxHash128 : NonCryptoHashAlgorithm { /// XXH128 produces 16-byte hashes. private new const int HashLengthInBytes = 16; private State _state; /// Initializes a new instance of the class using the default seed value 0. public XxHash128() : this(0) { } /// Initializes a new instance of the class using the specified seed. public XxHash128(ulong seed) : base(HashLengthInBytes) { Initialize(ref _state, seed); } /// Computes the XXH128 hash of the provided data using the optionally provided . /// The data to hash. /// The seed value for this hash computation. The default is zero. /// The XXH128 128-bit hash code of the provided data. public static byte[] Hash(ReadOnlySpan source, ulong seed = 0) { byte[] result = new byte[HashLengthInBytes]; Hash(source, result, seed); return result; } /// Computes the XXH128 hash of the provided data into the provided using the optionally provided . /// The data to hash. /// The buffer that receives the computed 128-bit hash code. /// The seed value for this hash computation. The default is zero. /// The number of bytes written to . /// is shorter than (8 bytes). public static int Hash(ReadOnlySpan source, Span destination, ulong seed = 0) { if (!TryHash(source, destination, out int bytesWritten, seed)) { ThrowDestinationTooShort(); } return bytesWritten; } /// Attempts to compute the XXH128 hash of the provided data into the provided using the optionally provided . /// The data to hash. /// The buffer that receives the computed 128-bit hash code. /// When this method returns, contains the number of bytes written to . /// The seed value for this hash computation. The default is zero. /// if is long enough to receive the computed hash value (8 bytes); otherwise, . public static bool TryHash(ReadOnlySpan source, Span destination, out int bytesWritten, ulong seed = 0) { if (destination.Length >= sizeof(ulong) * 2) { Hash128 hash = HashToHash128(source, seed); WriteBigEndian128(hash, destination); bytesWritten = HashLengthInBytes; return true; } bytesWritten = 0; return false; } internal static Hash128 HashToHash128(ReadOnlySpan source, ulong seed = 0) { uint length = (uint)source.Length; fixed (byte* sourcePtr = &MemoryMarshal.GetReference(source)) { if (length <= 16) { return HashLength0To16(sourcePtr, length, seed); } if (length <= 128) { return HashLength17To128(sourcePtr, length, seed); } if (length <= MidSizeMaxBytes) { return HashLength129To240(sourcePtr, length, seed); } return HashLengthOver240(sourcePtr, length, seed); } } /// Resets the hash computation to the initial state. public override void Reset() { XxHashShared.Reset(ref _state); } /// Appends the contents of to the data already processed for the current hash computation. /// The data to process. public override void Append(ReadOnlySpan source) { XxHashShared.Append(ref _state, source); } /// Writes the computed 128-bit hash value to without modifying accumulated state. /// The buffer that receives the computed hash value. protected override void GetCurrentHashCore(Span destination) { Hash128 current = GetCurrentHashAsHash128(); WriteBigEndian128(current, destination); } internal Hash128 GetCurrentHashAsHash128() { Hash128 current; if (_state.TotalLength > MidSizeMaxBytes) { // Digest on a local copy to ensure the accumulators remain unaltered. ulong* accumulators = stackalloc ulong[AccumulatorCount]; CopyAccumulators(ref _state, accumulators); fixed (byte* secret = _state.Secret) { DigestLong(ref _state, accumulators, secret); current = new Hash128( low64: MergeAccumulators(accumulators, secret + SecretMergeAccsStartBytes, _state.TotalLength * Prime64_1), high64: MergeAccumulators(accumulators, secret + SecretLengthBytes - AccumulatorCount * sizeof(ulong) - SecretMergeAccsStartBytes, ~(_state.TotalLength * Prime64_2))); } } else { fixed (byte* buffer = _state.Buffer) { current = HashToHash128(new ReadOnlySpan(buffer, (int)_state.TotalLength), _state.Seed); } } return current; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void WriteBigEndian128(in Hash128 hash, Span destination) { ulong low = hash.Low64; ulong high = hash.High64; if (BitConverter.IsLittleEndian) { low = BinaryPrimitives.ReverseEndianness(low); high = BinaryPrimitives.ReverseEndianness(high); } ref byte dest0 = ref MemoryMarshal.GetReference(destination); Unsafe.WriteUnaligned(ref dest0, high); Unsafe.WriteUnaligned(ref Unsafe.AddByteOffset(ref dest0, new IntPtr(sizeof(ulong))), low); } private static Hash128 HashLength0To16(byte* source, uint length, ulong seed) { if (length > 8) { return HashLength9To16(source, length, seed); } if (length >= 4) { return HashLength4To8(source, length, seed); } if (length != 0) { return HashLength1To3(source, length, seed); } const ulong BitFlipL = DefaultSecretUInt64_8 ^ DefaultSecretUInt64_9; const ulong BitFlipH = DefaultSecretUInt64_10 ^ DefaultSecretUInt64_11; return new Hash128(XxHash64.Avalanche(seed ^ BitFlipL), XxHash64.Avalanche(seed ^ BitFlipH)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Hash128 HashLength1To3(byte* source, uint length, ulong seed) { Debug.Assert(length >= 1 && length <= 3); // When source.Length == 1, c1 == source[0], c2 == source[0], c3 == source[0] // When source.Length == 2, c1 == source[0], c2 == source[1], c3 == source[1] // When source.Length == 3, c1 == source[0], c2 == source[1], c3 == source[2] byte c1 = *source; byte c2 = source[length >> 1]; byte c3 = source[length - 1]; uint combinedl = ((uint)c1 << 16) | ((uint)c2 << 24) | c3 | (length << 8); uint combinedh = BinaryHelper.RotateLeft(BinaryPrimitives.ReverseEndianness(combinedl), 13); const uint SecretXorL = (unchecked((uint)DefaultSecretUInt64_0) ^ (uint)(DefaultSecretUInt64_0 >> 32)); const uint SecretXorH = (unchecked((uint)DefaultSecretUInt64_1) ^ (uint)(DefaultSecretUInt64_1 >> 32)); ulong bitflipl = SecretXorL + seed; ulong bitfliph = SecretXorH - seed; ulong keyedLo = combinedl ^ bitflipl; ulong keyedHi = combinedh ^ bitfliph; return new Hash128(XxHash64.Avalanche(keyedLo), XxHash64.Avalanche(keyedHi)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Hash128 HashLength4To8(byte* source, uint length, ulong seed) { Debug.Assert(length >= 4 && length <= 8); seed ^= (ulong)BinaryPrimitives.ReverseEndianness((uint)seed) << 32; uint inputLo = ReadUInt32LE(source); uint inputHi = ReadUInt32LE(source + length - 4); ulong input64 = inputLo + ((ulong)inputHi << 32); ulong bitflip = (DefaultSecretUInt64_2 ^ DefaultSecretUInt64_3) + seed; ulong keyed = input64 ^ bitflip; ulong m128High = Multiply64To128(keyed, Prime64_1 + (length << 2), out ulong m128Low); m128High += (m128Low << 1); m128Low ^= (m128High >> 3); m128Low = XorShift(m128Low, 35); m128Low *= 0x9FB21C651E98DF25UL; m128Low = XorShift(m128Low, 28); m128High = Avalanche(m128High); return new Hash128(m128Low, m128High); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Hash128 HashLength9To16(byte* source, uint length, ulong seed) { Debug.Assert(length >= 9 && length <= 16); ulong bitflipl = (DefaultSecretUInt64_4 ^ DefaultSecretUInt64_5) - seed; ulong bitfliph = (DefaultSecretUInt64_6 ^ DefaultSecretUInt64_7) + seed; ulong inputLo = ReadUInt64LE(source); ulong inputHi = ReadUInt64LE(source + length - 8); ulong m128High = Multiply64To128(inputLo ^ inputHi ^ bitflipl, Prime64_1, out ulong m128Low); m128Low += (ulong)(length - 1) << 54; inputHi ^= bitfliph; m128High += sizeof(void*) < sizeof(ulong) ? (inputHi & 0xFFFFFFFF00000000UL) + Multiply32To64((uint)inputHi, Prime32_2) : inputHi + Multiply32To64((uint)inputHi, Prime32_2 - 1); m128Low ^= BinaryPrimitives.ReverseEndianness(m128High); ulong h128High = Multiply64To128(m128Low, Prime64_2, out ulong h128Low); h128High += m128High * (ulong)Prime64_2; h128Low = Avalanche(h128Low); h128High = Avalanche(h128High); return new Hash128(h128Low, h128High); } private static Hash128 HashLength17To128(byte* source, uint length, ulong seed) { Debug.Assert(length >= 17 && length <= 128); ulong accLow = length * Prime64_1; ulong accHigh = 0; switch ((length - 1) / 32) { default: // case 3 Mix32Bytes(ref accLow, ref accHigh, source + 48, source + length - 64, DefaultSecretUInt64_12, DefaultSecretUInt64_13, DefaultSecretUInt64_14, DefaultSecretUInt64_15, seed); goto case 2; case 2: Mix32Bytes(ref accLow, ref accHigh, source + 32, source + length - 48, DefaultSecretUInt64_8, DefaultSecretUInt64_9, DefaultSecretUInt64_10, DefaultSecretUInt64_11, seed); goto case 1; case 1: Mix32Bytes(ref accLow, ref accHigh, source + 16, source + length - 32, DefaultSecretUInt64_4, DefaultSecretUInt64_5, DefaultSecretUInt64_6, DefaultSecretUInt64_7, seed); goto case 0; case 0: Mix32Bytes(ref accLow, ref accHigh, source, source + length - 16, DefaultSecretUInt64_0, DefaultSecretUInt64_1, DefaultSecretUInt64_2, DefaultSecretUInt64_3, seed); break; } return AvalancheHash(accLow, accHigh, length, seed); } private static Hash128 HashLength129To240(byte* source, uint length, ulong seed) { Debug.Assert(length >= 129 && length <= 240); ulong accLow = length * Prime64_1; ulong accHigh = 0; Mix32Bytes(ref accLow, ref accHigh, source + (32 * 0), source + (32 * 0) + 16, DefaultSecretUInt64_0, DefaultSecretUInt64_1, DefaultSecretUInt64_2, DefaultSecretUInt64_3, seed); Mix32Bytes(ref accLow, ref accHigh, source + (32 * 1), source + (32 * 1) + 16, DefaultSecretUInt64_4, DefaultSecretUInt64_5, DefaultSecretUInt64_6, DefaultSecretUInt64_7, seed); Mix32Bytes(ref accLow, ref accHigh, source + (32 * 2), source + (32 * 2) + 16, DefaultSecretUInt64_8, DefaultSecretUInt64_9, DefaultSecretUInt64_10, DefaultSecretUInt64_11, seed); Mix32Bytes(ref accLow, ref accHigh, source + (32 * 3), source + (32 * 3) + 16, DefaultSecretUInt64_12, DefaultSecretUInt64_13, DefaultSecretUInt64_14, DefaultSecretUInt64_15, seed); accLow = Avalanche(accLow); accHigh = Avalanche(accHigh); uint bound = ((length - (32 * 4)) / 32); if (bound != 0) { Mix32Bytes(ref accLow, ref accHigh, source + (32 * 4), source + (32 * 4) + 16, DefaultSecret3UInt64_0, DefaultSecret3UInt64_1, DefaultSecret3UInt64_2, DefaultSecret3UInt64_3, seed); if (bound >= 2) { Mix32Bytes(ref accLow, ref accHigh, source + (32 * 5), source + (32 * 5) + 16, DefaultSecret3UInt64_4, DefaultSecret3UInt64_5, DefaultSecret3UInt64_6, DefaultSecret3UInt64_7, seed); if (bound == 3) { Mix32Bytes(ref accLow, ref accHigh, source + (32 * 6), source + (32 * 6) + 16, DefaultSecret3UInt64_8, DefaultSecret3UInt64_9, DefaultSecret3UInt64_10, DefaultSecret3UInt64_11, seed); } } } Mix32Bytes(ref accLow, ref accHigh, source + length - 16, source + length - 32, 0x4F0BC7C7BBDCF93F, 0x59B4CD4BE0518A1D, 0x7378D9C97E9FC831, 0xEBD33483ACC5EA64, 0 - seed); return AvalancheHash(accLow, accHigh, length, seed); } private static Hash128 HashLengthOver240(byte* source, uint length, ulong seed) { Debug.Assert(length > 240); fixed (byte* defaultSecret = &MemoryMarshal.GetReference(DefaultSecret)) { byte* secret = defaultSecret; if (seed != 0) { byte* customSecret = stackalloc byte[SecretLengthBytes]; DeriveSecretFromSeed(customSecret, seed); secret = customSecret; } ulong* accumulators = stackalloc ulong[AccumulatorCount]; InitializeAccumulators(accumulators); HashInternalLoop(accumulators, source, length, secret); return new Hash128( low64: MergeAccumulators(accumulators, secret + SecretMergeAccsStartBytes, length * Prime64_1), high64: MergeAccumulators(accumulators, secret + SecretLengthBytes - AccumulatorCount * sizeof(ulong) - SecretMergeAccsStartBytes, ~(length * Prime64_2))); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Hash128 AvalancheHash(ulong accLow, ulong accHigh, uint length, ulong seed) { ulong h128Low = accLow + accHigh; ulong h128High = (accLow * Prime64_1) + (accHigh * Prime64_4) + ((length - seed) * Prime64_2); h128Low = Avalanche(h128Low); h128High = 0ul - Avalanche(h128High); return new Hash128(h128Low, h128High); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void Mix32Bytes(ref ulong accLow, ref ulong accHigh, byte* input1, byte* input2, ulong secret1, ulong secret2, ulong secret3, ulong secret4, ulong seed) { accLow += Mix16Bytes(input1, secret1, secret2, seed); accLow ^= ReadUInt64LE(input2) + ReadUInt64LE(input2 + 8); accHigh += Mix16Bytes(input2, secret3, secret4, seed); accHigh ^= ReadUInt64LE(input1) + ReadUInt64LE(input1 + 8); } [DebuggerDisplay("Low64: {" + nameof(Low64) + "}, High64: {" + nameof(High64) + "}")] internal readonly struct Hash128 { public readonly ulong Low64; public readonly ulong High64; public Hash128(ulong low64, ulong high64) { Low64 = low64; High64 = high64; } } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/XxHash3.cs ================================================ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // Based on the XXH3 implementation from https://github.com/Cyan4973/xxHash. using System; using System.Buffers.Binary; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using static BloomFilter.HashAlgorithms.Internal.XxHashShared; namespace BloomFilter.HashAlgorithms.Internal; /// Provides an implementation of the XXH3 hash algorithm for generating a 64-bit hash. /// /// For methods that persist the computed numerical hash value as bytes, /// the value is written in the Big Endian byte order. /// internal sealed unsafe class XxHash3 : NonCryptoHashAlgorithm { /// XXH3 produces 8-byte hashes. private new const int HashLengthInBytes = 8; private State _state; /// Initializes a new instance of the class using the default seed value 0. public XxHash3() : this(0) { } /// Initializes a new instance of the class using the specified seed. public XxHash3(ulong seed) : base(HashLengthInBytes) { Initialize(ref _state, seed); } /// Computes the XXH3 hash of the provided data. /// The data to hash. /// The seed value for this hash computation. /// The computed XXH3 hash. public static ulong HashToUInt64(ReadOnlySpan source, ulong seed = 0) { uint length = (uint)source.Length; fixed (byte* sourcePtr = &MemoryMarshal.GetReference(source)) { if (length <= 16) { return HashLength0To16(sourcePtr, length, seed); } if (length <= 128) { return HashLength17To128(sourcePtr, length, seed); } if (length <= MidSizeMaxBytes) { return HashLength129To240(sourcePtr, length, seed); } return HashLengthOver240(sourcePtr, length, seed); } } /// Resets the hash computation to the initial state. public override void Reset() { XxHashShared.Reset(ref _state); } /// Appends the contents of to the data already processed for the current hash computation. /// The data to process. public override void Append(ReadOnlySpan source) { XxHashShared.Append(ref _state, source); } /// Writes the computed 64-bit hash value to without modifying accumulated state. /// The buffer that receives the computed hash value. protected override void GetCurrentHashCore(Span destination) { ulong hash = GetCurrentHashAsUInt64(); BinaryPrimitives.WriteUInt64BigEndian(destination, hash); } /// Gets the current computed hash value without modifying accumulated state. /// The hash value for the data already provided. public ulong GetCurrentHashAsUInt64() { ulong current; if (_state.TotalLength > MidSizeMaxBytes) { // Digest on a local copy to ensure the accumulators remain unaltered. ulong* accumulators = stackalloc ulong[AccumulatorCount]; CopyAccumulators(ref _state, accumulators); fixed (byte* secret = _state.Secret) { DigestLong(ref _state, accumulators, secret); current = MergeAccumulators(accumulators, secret + SecretMergeAccsStartBytes, _state.TotalLength * Prime64_1); } } else { fixed (byte* buffer = _state.Buffer) { current = HashToUInt64(new ReadOnlySpan(buffer, (int)_state.TotalLength), _state.Seed); } } return current; } private static ulong HashLength0To16(byte* source, uint length, ulong seed) { if (length > 8) { return HashLength9To16(source, length, seed); } if (length >= 4) { return HashLength4To8(source, length, seed); } if (length != 0) { return HashLength1To3(source, length, seed); } const ulong SecretXor = DefaultSecretUInt64_7 ^ DefaultSecretUInt64_8; return XxHash64.Avalanche(seed ^ SecretXor); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static ulong HashLength1To3(byte* source, uint length, ulong seed) { Debug.Assert(length >= 1 && length <= 3); // When source.Length == 1, c1 == source[0], c2 == source[0], c3 == source[0] // When source.Length == 2, c1 == source[0], c2 == source[1], c3 == source[1] // When source.Length == 3, c1 == source[0], c2 == source[1], c3 == source[2] byte c1 = *source; byte c2 = source[length >> 1]; byte c3 = source[length - 1]; uint combined = ((uint)c1 << 16) | ((uint)c2 << 24) | c3 | (length << 8); const uint SecretXor = unchecked((uint)DefaultSecretUInt64_0) ^ (uint)(DefaultSecretUInt64_0 >> 32); return XxHash64.Avalanche(combined ^ (SecretXor + seed)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static ulong HashLength4To8(byte* source, uint length, ulong seed) { Debug.Assert(length >= 4 && length <= 8); seed ^= (ulong)BinaryPrimitives.ReverseEndianness((uint)seed) << 32; uint inputLow = ReadUInt32LE(source); uint inputHigh = ReadUInt32LE(source + length - sizeof(uint)); const ulong SecretXor = DefaultSecretUInt64_1 ^ DefaultSecretUInt64_2; ulong bitflip = SecretXor - seed; ulong input64 = inputHigh + (((ulong)inputLow) << 32); return Rrmxmx(input64 ^ bitflip, length); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static ulong HashLength9To16(byte* source, uint length, ulong seed) { Debug.Assert(length >= 9 && length <= 16); const ulong SecretXorL = DefaultSecretUInt64_3 ^ DefaultSecretUInt64_4; const ulong SecretXorR = DefaultSecretUInt64_5 ^ DefaultSecretUInt64_6; ulong bitflipLow = SecretXorL + seed; ulong bitflipHigh = SecretXorR - seed; ulong inputLow = ReadUInt64LE(source) ^ bitflipLow; ulong inputHigh = ReadUInt64LE(source + length - sizeof(ulong)) ^ bitflipHigh; return Avalanche( length + BinaryPrimitives.ReverseEndianness(inputLow) + inputHigh + Multiply64To128ThenFold(inputLow, inputHigh)); } private static ulong HashLength17To128(byte* source, uint length, ulong seed) { Debug.Assert(length >= 17 && length <= 128); ulong hash = length * Prime64_1; switch ((length - 1) / 32) { default: // case 3 hash += Mix16Bytes(source + 48, DefaultSecretUInt64_12, DefaultSecretUInt64_13, seed); hash += Mix16Bytes(source + length - 64, DefaultSecretUInt64_14, DefaultSecretUInt64_15, seed); goto case 2; case 2: hash += Mix16Bytes(source + 32, DefaultSecretUInt64_8, DefaultSecretUInt64_9, seed); hash += Mix16Bytes(source + length - 48, DefaultSecretUInt64_10, DefaultSecretUInt64_11, seed); goto case 1; case 1: hash += Mix16Bytes(source + 16, DefaultSecretUInt64_4, DefaultSecretUInt64_5, seed); hash += Mix16Bytes(source + length - 32, DefaultSecretUInt64_6, DefaultSecretUInt64_7, seed); goto case 0; case 0: hash += Mix16Bytes(source, DefaultSecretUInt64_0, DefaultSecretUInt64_1, seed); hash += Mix16Bytes(source + length - 16, DefaultSecretUInt64_2, DefaultSecretUInt64_3, seed); break; } return Avalanche(hash); } private static ulong HashLength129To240(byte* source, uint length, ulong seed) { Debug.Assert(length >= 129 && length <= 240); ulong hash = length * Prime64_1; hash += Mix16Bytes(source + (16 * 0), DefaultSecretUInt64_0, DefaultSecretUInt64_1, seed); hash += Mix16Bytes(source + (16 * 1), DefaultSecretUInt64_2, DefaultSecretUInt64_3, seed); hash += Mix16Bytes(source + (16 * 2), DefaultSecretUInt64_4, DefaultSecretUInt64_5, seed); hash += Mix16Bytes(source + (16 * 3), DefaultSecretUInt64_6, DefaultSecretUInt64_7, seed); hash += Mix16Bytes(source + (16 * 4), DefaultSecretUInt64_8, DefaultSecretUInt64_9, seed); hash += Mix16Bytes(source + (16 * 5), DefaultSecretUInt64_10, DefaultSecretUInt64_11, seed); hash += Mix16Bytes(source + (16 * 6), DefaultSecretUInt64_12, DefaultSecretUInt64_13, seed); hash += Mix16Bytes(source + (16 * 7), DefaultSecretUInt64_14, DefaultSecretUInt64_15, seed); hash = Avalanche(hash); switch ((length - (16 * 8)) / 16) { default: // case 7 Debug.Assert((length - 16 * 8) / 16 == 7); hash += Mix16Bytes(source + (16 * 14), DefaultSecret3UInt64_12, DefaultSecret3UInt64_13, seed); goto case 6; case 6: hash += Mix16Bytes(source + (16 * 13), DefaultSecret3UInt64_10, DefaultSecret3UInt64_11, seed); goto case 5; case 5: hash += Mix16Bytes(source + (16 * 12), DefaultSecret3UInt64_8, DefaultSecret3UInt64_9, seed); goto case 4; case 4: hash += Mix16Bytes(source + (16 * 11), DefaultSecret3UInt64_6, DefaultSecret3UInt64_7, seed); goto case 3; case 3: hash += Mix16Bytes(source + (16 * 10), DefaultSecret3UInt64_4, DefaultSecret3UInt64_5, seed); goto case 2; case 2: hash += Mix16Bytes(source + (16 * 9), DefaultSecret3UInt64_2, DefaultSecret3UInt64_3, seed); goto case 1; case 1: hash += Mix16Bytes(source + (16 * 8), DefaultSecret3UInt64_0, DefaultSecret3UInt64_1, seed); goto case 0; case 0: hash += Mix16Bytes(source + length - 16, 0x7378D9C97E9FC831, 0xEBD33483ACC5EA64, seed); // DefaultSecret[119], DefaultSecret[127] break; } return Avalanche(hash); } private static ulong HashLengthOver240(byte* source, uint length, ulong seed) { Debug.Assert(length > 240); fixed (byte* defaultSecret = &MemoryMarshal.GetReference(DefaultSecret)) { byte* secret = defaultSecret; if (seed != 0) { byte* customSecret = stackalloc byte[SecretLengthBytes]; DeriveSecretFromSeed(customSecret, seed); secret = customSecret; } ulong* accumulators = stackalloc ulong[AccumulatorCount]; InitializeAccumulators(accumulators); HashInternalLoop(accumulators, source, length, secret); return MergeAccumulators(accumulators, secret + 11, length * Prime64_1); } } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/XxHash32.State.cs ================================================ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Buffers.Binary; using System.Diagnostics; using System.Runtime.CompilerServices; using static BloomFilter.HashAlgorithms.Internal.XxHashShared; // Implemented from the specification at // https://github.com/Cyan4973/xxHash/blob/f9155bd4c57e2270a4ffbb176485e5d713de1c9b/doc/xxhash_spec.md namespace BloomFilter.HashAlgorithms.Internal; internal sealed partial class XxHash32 { private struct State { private uint _acc1; private uint _acc2; private uint _acc3; private uint _acc4; private readonly uint _smallAcc; private bool _hadFullStripe; internal State(uint seed) { _acc1 = seed + unchecked(Prime32_1 + Prime32_2); _acc2 = seed + Prime32_2; _acc3 = seed; _acc4 = seed - Prime32_1; _smallAcc = seed + Prime32_5; _hadFullStripe = false; } internal unsafe void ProcessStripe(ReadOnlySpan source) { Debug.Assert(source.Length >= StripeSize); source = source.Slice(0, StripeSize); _acc1 = ApplyRound(_acc1, source); _acc2 = ApplyRound(_acc2, source.Slice(sizeof(uint))); _acc3 = ApplyRound(_acc3, source.Slice(2 * sizeof(uint))); _acc4 = ApplyRound(_acc4, source.Slice(3 * sizeof(uint))); _hadFullStripe = true; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private readonly uint Converge() { return BinaryHelper.RotateLeft(_acc1, 1) + BinaryHelper.RotateLeft(_acc2, 7) + BinaryHelper.RotateLeft(_acc3, 12) + BinaryHelper.RotateLeft(_acc4, 18); } private static uint ApplyRound(uint acc, ReadOnlySpan lane) { acc += BinaryPrimitives.ReadUInt32LittleEndian(lane) * Prime32_2; acc = BinaryHelper.RotateLeft(acc, 13); acc *= Prime32_1; return acc; } internal readonly uint Complete(int length, ReadOnlySpan remaining) { uint acc = _hadFullStripe ? Converge() : _smallAcc; acc += (uint)length; while (remaining.Length >= sizeof(uint)) { uint lane = BinaryPrimitives.ReadUInt32LittleEndian(remaining); acc += lane * Prime32_3; acc = BinaryHelper.RotateLeft(acc, 17); acc *= Prime32_4; remaining = remaining.Slice(sizeof(uint)); } for (int i = 0; i < remaining.Length; i++) { uint lane = remaining[i]; acc += lane * Prime32_5; acc = BinaryHelper.RotateLeft(acc, 11); acc *= Prime32_1; } acc ^= (acc >> 15); acc *= Prime32_2; acc ^= (acc >> 13); acc *= Prime32_3; acc ^= (acc >> 16); return acc; } } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/XxHash32.cs ================================================ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Buffers.Binary; // Implemented from the specification at // https://github.com/Cyan4973/xxHash/blob/f9155bd4c57e2270a4ffbb176485e5d713de1c9b/doc/xxhash_spec.md namespace BloomFilter.HashAlgorithms.Internal; /// /// Provides an implementation of the XxHash32 algorithm. /// /// /// For methods that persist the computed numerical hash value as bytes, /// the value is written in the Big Endian byte order. /// internal sealed partial class XxHash32 : NonCryptoHashAlgorithm { private const int HashSize = sizeof(uint); private const int StripeSize = 4 * sizeof(uint); private readonly uint _seed; private State _state; private byte[]? _holdback; private int _length; /// /// Initializes a new instance of the class. /// /// /// The XxHash32 algorithm supports an optional seed value. /// Instances created with this constructor use the default seed, zero. /// public XxHash32() : this(0) { } /// /// Initializes a new instance of the class with /// a specified seed. /// /// /// The hash seed value for computations from this instance. /// public XxHash32(uint seed) : base(HashSize) { _seed = seed; Reset(); } /// /// Resets the hash computation to the initial state. /// public override void Reset() { _state = new State(_seed); _length = 0; } /// /// Appends the contents of to the data already /// processed for the current hash computation. /// /// The data to process. public override void Append(ReadOnlySpan source) { // Every time we've read 16 bytes, process the stripe. // Data that isn't perfectly mod-16 gets stored in a holdback // buffer. int held = _length & 0x0F; if (held != 0) { int remain = StripeSize - held; if (source.Length >= remain) { source.Slice(0, remain).CopyTo(_holdback.AsSpan(held)); _state.ProcessStripe(_holdback); source = source.Slice(remain); _length += remain; } else { source.CopyTo(_holdback.AsSpan(held)); _length += source.Length; return; } } while (source.Length >= StripeSize) { _state.ProcessStripe(source); source = source.Slice(StripeSize); _length += StripeSize; } if (source.Length > 0) { _holdback ??= new byte[StripeSize]; source.CopyTo(_holdback); _length += source.Length; } } /// /// Writes the computed hash value to /// without modifying accumulated state. /// protected override void GetCurrentHashCore(Span destination) { uint hash = GetCurrentHashAsUInt32(); BinaryPrimitives.WriteUInt32BigEndian(destination, hash); } /// Gets the current computed hash value without modifying accumulated state. /// The hash value for the data already provided. public uint GetCurrentHashAsUInt32() { int remainingLength = _length & 0x0F; ReadOnlySpan remaining = ReadOnlySpan.Empty; if (remainingLength > 0) { remaining = new ReadOnlySpan(_holdback, 0, remainingLength); } return _state.Complete(_length, remaining); } /// Computes the XxHash32 hash of the provided data. /// The data to hash. /// The seed value for this hash computation. The default is zero. /// The computed XxHash32 hash. public static uint HashToUInt32(ReadOnlySpan source, uint seed = 0) { int totalLength = source.Length; State state = new State(seed); while (source.Length >= StripeSize) { state.ProcessStripe(source); source = source.Slice(StripeSize); } return state.Complete(totalLength, source); } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/XxHash64.State.cs ================================================ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Buffers.Binary; using System.Diagnostics; using System.Runtime.CompilerServices; using static BloomFilter.HashAlgorithms.Internal.XxHashShared; // Implemented from the specification at // https://github.com/Cyan4973/xxHash/blob/f9155bd4c57e2270a4ffbb176485e5d713de1c9b/doc/xxhash_spec.md namespace BloomFilter.HashAlgorithms.Internal; internal sealed partial class XxHash64 { [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static ulong Avalanche(ulong hash) { hash ^= hash >> 33; hash *= Prime64_2; hash ^= hash >> 29; hash *= Prime64_3; hash ^= hash >> 32; return hash; } private struct State { private ulong _acc1; private ulong _acc2; private ulong _acc3; private ulong _acc4; private readonly ulong _smallAcc; private bool _hadFullStripe; internal State(ulong seed) { _acc1 = seed + unchecked(Prime64_1 + Prime64_2); _acc2 = seed + Prime64_2; _acc3 = seed; _acc4 = seed - Prime64_1; _smallAcc = seed + Prime64_5; _hadFullStripe = false; } internal void ProcessStripe(ReadOnlySpan source) { Debug.Assert(source.Length >= StripeSize); source = source.Slice(0, StripeSize); _acc1 = ApplyRound(_acc1, source); _acc2 = ApplyRound(_acc2, source.Slice(sizeof(ulong))); _acc3 = ApplyRound(_acc3, source.Slice(2 * sizeof(ulong))); _acc4 = ApplyRound(_acc4, source.Slice(3 * sizeof(ulong))); _hadFullStripe = true; } private static ulong MergeAccumulator(ulong acc, ulong accN) { acc ^= ApplyRound(0, accN); acc *= Prime64_1; acc += Prime64_4; return acc; } private readonly ulong Converge() { ulong acc = BinaryHelper.RotateLeft(_acc1, 1) + BinaryHelper.RotateLeft(_acc2, 7) + BinaryHelper.RotateLeft(_acc3, 12) + BinaryHelper.RotateLeft(_acc4, 18); acc = MergeAccumulator(acc, _acc1); acc = MergeAccumulator(acc, _acc2); acc = MergeAccumulator(acc, _acc3); acc = MergeAccumulator(acc, _acc4); return acc; } private static ulong ApplyRound(ulong acc, ReadOnlySpan lane) { return ApplyRound(acc, BinaryPrimitives.ReadUInt64LittleEndian(lane)); } private static ulong ApplyRound(ulong acc, ulong lane) { acc += lane * Prime64_2; acc = BinaryHelper.RotateLeft(acc, 31); acc *= Prime64_1; return acc; } internal readonly ulong Complete(long length, ReadOnlySpan remaining) { ulong acc = _hadFullStripe ? Converge() : _smallAcc; acc += (ulong)length; while (remaining.Length >= sizeof(ulong)) { ulong lane = BinaryPrimitives.ReadUInt64LittleEndian(remaining); acc ^= ApplyRound(0, lane); acc = BinaryHelper.RotateLeft(acc, 27); acc *= Prime64_1; acc += Prime64_4; remaining = remaining.Slice(sizeof(ulong)); } // Doesn't need to be a while since it can occur at most once. if (remaining.Length >= sizeof(uint)) { ulong lane = BinaryPrimitives.ReadUInt32LittleEndian(remaining); acc ^= lane * Prime64_1; acc = BinaryHelper.RotateLeft(acc, 23); acc *= Prime64_2; acc += Prime64_3; remaining = remaining.Slice(sizeof(uint)); } for (int i = 0; i < remaining.Length; i++) { ulong lane = remaining[i]; acc ^= lane * Prime64_5; acc = BinaryHelper.RotateLeft(acc, 11); acc *= Prime64_1; } return Avalanche(acc); } } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/XxHash64.cs ================================================ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Buffers.Binary; // Implemented from the specification at // https://github.com/Cyan4973/xxHash/blob/f9155bd4c57e2270a4ffbb176485e5d713de1c9b/doc/xxhash_spec.md namespace BloomFilter.HashAlgorithms.Internal; /// /// Provides an implementation of the XxHash64 algorithm. /// /// /// For methods that persist the computed numerical hash value as bytes, /// the value is written in the Big Endian byte order. /// internal sealed partial class XxHash64 : NonCryptoHashAlgorithm { private const int HashSize = sizeof(ulong); private const int StripeSize = 4 * sizeof(ulong); private readonly ulong _seed; private State _state; private byte[]? _holdback; private long _length; /// /// Initializes a new instance of the class. /// /// /// The XxHash64 algorithm supports an optional seed value. /// Instances created with this constructor use the default seed, zero. /// public XxHash64() : this(0) { } /// /// Initializes a new instance of the class with /// a specified seed. /// /// /// The hash seed value for computations from this instance. /// public XxHash64(ulong seed) : base(HashSize) { _seed = seed; Reset(); } /// /// Resets the hash computation to the initial state. /// public override void Reset() { _state = new State(_seed); _length = 0; } /// /// Appends the contents of to the data already /// processed for the current hash computation. /// /// The data to process. public override void Append(ReadOnlySpan source) { // Every time we've read 32 bytes, process the stripe. // Data that isn't perfectly mod-32 gets stored in a holdback // buffer. int held = (int)_length & 0x1F; if (held != 0) { int remain = StripeSize - held; if (source.Length >= remain) { source.Slice(0, remain).CopyTo(_holdback.AsSpan(held)); _state.ProcessStripe(_holdback); source = source.Slice(remain); _length += remain; } else { source.CopyTo(_holdback.AsSpan(held)); _length += source.Length; return; } } while (source.Length >= StripeSize) { _state.ProcessStripe(source); source = source.Slice(StripeSize); _length += StripeSize; } if (source.Length > 0) { _holdback ??= new byte[StripeSize]; source.CopyTo(_holdback); _length += source.Length; } } /// /// Writes the computed hash value to /// without modifying accumulated state. /// protected override void GetCurrentHashCore(Span destination) { ulong hash = GetCurrentHashAsUInt64(); BinaryPrimitives.WriteUInt64BigEndian(destination, hash); } /// Gets the current computed hash value without modifying accumulated state. /// The hash value for the data already provided. public ulong GetCurrentHashAsUInt64() { int remainingLength = (int)_length & 0x1F; ReadOnlySpan remaining = ReadOnlySpan.Empty; if (remainingLength > 0) { remaining = new ReadOnlySpan(_holdback, 0, remainingLength); } return _state.Complete(_length, remaining); } /// Computes the XxHash64 hash of the provided data. /// The data to hash. /// The seed value for this hash computation. /// The computed XxHash64 hash. public static ulong HashToUInt64(ReadOnlySpan source, ulong seed = 0) { int totalLength = source.Length; State state = new State(seed); while (source.Length >= StripeSize) { state.ProcessStripe(source); source = source.Slice(StripeSize); } return state.Complete((uint)totalLength, source); } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Internal/XxHashShared.cs ================================================ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Buffers.Binary; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; #if NET7_0_OR_GREATER using System.Runtime.Intrinsics; using System.Runtime.Intrinsics.Arm; using System.Runtime.Intrinsics.X86; #endif namespace BloomFilter.HashAlgorithms.Internal; /// Shared implementation of the XXH3 hash algorithm for 64-bit in and version. internal static unsafe class XxHashShared { public const int StripeLengthBytes = 64; public const int SecretLengthBytes = 192; public const int SecretSizeMin = 136; public const int SecretLastAccStartBytes = 7; public const int SecretConsumeRateBytes = 8; public const int SecretMergeAccsStartBytes = 11; public const int NumStripesPerBlock = (SecretLengthBytes - StripeLengthBytes) / SecretConsumeRateBytes; public const int AccumulatorCount = StripeLengthBytes / sizeof(ulong); public const int MidSizeMaxBytes = 240; public const int InternalBufferStripes = InternalBufferLengthBytes / StripeLengthBytes; public const int InternalBufferLengthBytes = 256; /// The default secret for when no seed is provided. /// This is the same as a custom secret derived from a seed of 0. public static ReadOnlySpan DefaultSecret => new byte[] { 0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, // DefaultSecretUInt64_0 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c, // DefaultSecretUInt64_1 0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, // DefaultSecretUInt64_2 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, // DefaultSecretUInt64_3 0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, // DefaultSecretUInt64_4 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21, // DefaultSecretUInt64_5 0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, // DefaultSecretUInt64_6 0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c, // DefaultSecretUInt64_7 0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, // DefaultSecretUInt64_8 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3, // DefaultSecretUInt64_9 0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, // DefaultSecretUInt64_10 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8, // DefaultSecretUInt64_11 0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, // DefaultSecretUInt64_12 0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d, // DefaultSecretUInt64_13 0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, // DefaultSecretUInt64_14 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64, // DefaultSecretUInt64_15 0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, // DefaultSecretUInt64_16 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb, // DefaultSecretUInt64_17 0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, // DefaultSecretUInt64_18 0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e, // DefaultSecretUInt64_19 0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, // DefaultSecretUInt64_20 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce, // DefaultSecretUInt64_21 0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, // DefaultSecretUInt64_22 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e, // DefaultSecretUInt64_23 }; // Cast of DefaultSecret byte[] => ulong[] (See above for the correspondence) public const ulong DefaultSecretUInt64_0 = 0xBE4BA423396CFEB8; public const ulong DefaultSecretUInt64_1 = 0x1CAD21F72C81017C; public const ulong DefaultSecretUInt64_2 = 0xDB979083E96DD4DE; public const ulong DefaultSecretUInt64_3 = 0x1F67B3B7A4A44072; public const ulong DefaultSecretUInt64_4 = 0x78E5C0CC4EE679CB; public const ulong DefaultSecretUInt64_5 = 0x2172FFCC7DD05A82; public const ulong DefaultSecretUInt64_6 = 0x8E2443F7744608B8; public const ulong DefaultSecretUInt64_7 = 0x4C263A81E69035E0; public const ulong DefaultSecretUInt64_8 = 0xCB00C391BB52283C; public const ulong DefaultSecretUInt64_9 = 0xA32E531B8B65D088; public const ulong DefaultSecretUInt64_10 = 0x4EF90DA297486471; public const ulong DefaultSecretUInt64_11 = 0xD8ACDEA946EF1938; public const ulong DefaultSecretUInt64_12 = 0x3F349CE33F76FAA8; public const ulong DefaultSecretUInt64_13 = 0x1D4F0BC7C7BBDCF9; public const ulong DefaultSecretUInt64_14 = 0x3159B4CD4BE0518A; public const ulong DefaultSecretUInt64_15 = 0x647378D9C97E9FC8; // Cast of DefaultSecret offset by 3 bytes, byte[] => ulong[] public const ulong DefaultSecret3UInt64_0 = 0x81017CBE4BA42339; public const ulong DefaultSecret3UInt64_1 = 0x6DD4DE1CAD21F72C; public const ulong DefaultSecret3UInt64_2 = 0xA44072DB979083E9; public const ulong DefaultSecret3UInt64_3 = 0xE679CB1F67B3B7A4; public const ulong DefaultSecret3UInt64_4 = 0xD05A8278E5C0CC4E; public const ulong DefaultSecret3UInt64_5 = 0x4608B82172FFCC7D; public const ulong DefaultSecret3UInt64_6 = 0x9035E08E2443F774; public const ulong DefaultSecret3UInt64_7 = 0x52283C4C263A81E6; public const ulong DefaultSecret3UInt64_8 = 0x65D088CB00C391BB; public const ulong DefaultSecret3UInt64_9 = 0x486471A32E531B8B; public const ulong DefaultSecret3UInt64_10 = 0xEF19384EF90DA297; public const ulong DefaultSecret3UInt64_11 = 0x76FAA8D8ACDEA946; public const ulong DefaultSecret3UInt64_12 = 0xBBDCF93F349CE33F; public const ulong DefaultSecret3UInt64_13 = 0xE0518A1D4F0BC7C7; public const ulong Prime64_1 = 0x9E3779B185EBCA87UL; public const ulong Prime64_2 = 0xC2B2AE3D27D4EB4FUL; public const ulong Prime64_3 = 0x165667B19E3779F9UL; public const ulong Prime64_4 = 0x85EBCA77C2B2AE63UL; public const ulong Prime64_5 = 0x27D4EB2F165667C5UL; public const uint Prime32_1 = 0x9E3779B1U; public const uint Prime32_2 = 0x85EBCA77U; public const uint Prime32_3 = 0xC2B2AE3DU; public const uint Prime32_4 = 0x27D4EB2FU; public const uint Prime32_5 = 0x165667B1U; #if DEBUG static XxHashShared() { // Make sure DefaultSecret is the custom secret derived from a seed of 0. byte* secret = stackalloc byte[SecretLengthBytes]; DeriveSecretFromSeed(secret, 0); Debug.Assert(new Span(secret, SecretLengthBytes).SequenceEqual(DefaultSecret)); // Validate some relationships. Debug.Assert(InternalBufferLengthBytes % StripeLengthBytes == 0); ReadOnlySpan defaultSecretUInt64 = MemoryMarshal.Cast(DefaultSecret); Debug.Assert(ReadLE64(defaultSecretUInt64[0]) == DefaultSecretUInt64_0); Debug.Assert(ReadLE64(defaultSecretUInt64[1]) == DefaultSecretUInt64_1); Debug.Assert(ReadLE64(defaultSecretUInt64[2]) == DefaultSecretUInt64_2); Debug.Assert(ReadLE64(defaultSecretUInt64[3]) == DefaultSecretUInt64_3); Debug.Assert(ReadLE64(defaultSecretUInt64[4]) == DefaultSecretUInt64_4); Debug.Assert(ReadLE64(defaultSecretUInt64[5]) == DefaultSecretUInt64_5); Debug.Assert(ReadLE64(defaultSecretUInt64[6]) == DefaultSecretUInt64_6); Debug.Assert(ReadLE64(defaultSecretUInt64[7]) == DefaultSecretUInt64_7); Debug.Assert(ReadLE64(defaultSecretUInt64[8]) == DefaultSecretUInt64_8); Debug.Assert(ReadLE64(defaultSecretUInt64[9]) == DefaultSecretUInt64_9); Debug.Assert(ReadLE64(defaultSecretUInt64[10]) == DefaultSecretUInt64_10); Debug.Assert(ReadLE64(defaultSecretUInt64[11]) == DefaultSecretUInt64_11); Debug.Assert(ReadLE64(defaultSecretUInt64[12]) == DefaultSecretUInt64_12); Debug.Assert(ReadLE64(defaultSecretUInt64[13]) == DefaultSecretUInt64_13); Debug.Assert(ReadLE64(defaultSecretUInt64[14]) == DefaultSecretUInt64_14); Debug.Assert(ReadLE64(defaultSecretUInt64[15]) == DefaultSecretUInt64_15); ReadOnlySpan defaultSecret3UInt64 = MemoryMarshal.Cast(DefaultSecret.Slice(3)); Debug.Assert(ReadLE64(defaultSecret3UInt64[0]) == DefaultSecret3UInt64_0); Debug.Assert(ReadLE64(defaultSecret3UInt64[1]) == DefaultSecret3UInt64_1); Debug.Assert(ReadLE64(defaultSecret3UInt64[2]) == DefaultSecret3UInt64_2); Debug.Assert(ReadLE64(defaultSecret3UInt64[3]) == DefaultSecret3UInt64_3); Debug.Assert(ReadLE64(defaultSecret3UInt64[4]) == DefaultSecret3UInt64_4); Debug.Assert(ReadLE64(defaultSecret3UInt64[5]) == DefaultSecret3UInt64_5); Debug.Assert(ReadLE64(defaultSecret3UInt64[6]) == DefaultSecret3UInt64_6); Debug.Assert(ReadLE64(defaultSecret3UInt64[7]) == DefaultSecret3UInt64_7); Debug.Assert(ReadLE64(defaultSecret3UInt64[8]) == DefaultSecret3UInt64_8); Debug.Assert(ReadLE64(defaultSecret3UInt64[9]) == DefaultSecret3UInt64_9); Debug.Assert(ReadLE64(defaultSecret3UInt64[10]) == DefaultSecret3UInt64_10); Debug.Assert(ReadLE64(defaultSecret3UInt64[11]) == DefaultSecret3UInt64_11); Debug.Assert(ReadLE64(defaultSecret3UInt64[12]) == DefaultSecret3UInt64_12); Debug.Assert(ReadLE64(defaultSecret3UInt64[13]) == DefaultSecret3UInt64_13); static ulong ReadLE64(ulong data) => BitConverter.IsLittleEndian ? data : BinaryPrimitives.ReverseEndianness(data); } #endif public static void Initialize(ref State state, ulong seed) { state.Seed = (ulong)seed; fixed (byte* secret = state.Secret) { if (seed == 0) { DefaultSecret.CopyTo(new Span(secret, SecretLengthBytes)); } else { DeriveSecretFromSeed(secret, (ulong)seed); } } Reset(ref state); } public static void Reset(ref State state) { state.BufferedCount = 0; state.StripesProcessedInCurrentBlock = 0; state.TotalLength = 0; fixed (ulong* accumulators = state.Accumulators) { InitializeAccumulators(accumulators); } } /// "This is a stronger avalanche, preferable when input has not been previously mixed." [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong Rrmxmx(ulong hash, uint length) { hash ^= BinaryHelper.RotateLeft(hash, 49) ^ BinaryHelper.RotateLeft(hash, 24); hash *= 0x9FB21C651E98DF25; hash ^= (hash >> 35) + length; hash *= 0x9FB21C651E98DF25; return XorShift(hash, 28); } public static void HashInternalLoop(ulong* accumulators, byte* source, uint length, byte* secret) { Debug.Assert(length > 240); const int StripesPerBlock = (SecretLengthBytes - StripeLengthBytes) / SecretConsumeRateBytes; const int BlockLen = StripeLengthBytes * StripesPerBlock; int blocksNum = (int)((length - 1) / BlockLen); Accumulate(accumulators, source, secret, StripesPerBlock, true, blocksNum); int offset = BlockLen * blocksNum; int stripesNumber = (int)((length - 1 - offset) / StripeLengthBytes); Accumulate(accumulators, source + offset, secret, stripesNumber); Accumulate512(accumulators, source + length - StripeLengthBytes, secret + (SecretLengthBytes - StripeLengthBytes - SecretLastAccStartBytes)); } public static void ConsumeStripes(ulong* accumulators, ref ulong stripesSoFar, ulong stripesPerBlock, byte* source, ulong stripes, byte* secret) { Debug.Assert(stripes <= stripesPerBlock); // can handle max 1 scramble per invocation Debug.Assert(stripesSoFar < stripesPerBlock); ulong stripesToEndOfBlock = stripesPerBlock - stripesSoFar; if (stripesToEndOfBlock <= stripes) { // need a scrambling operation ulong stripesAfterBlock = stripes - stripesToEndOfBlock; Accumulate(accumulators, source, secret + ((int)stripesSoFar * SecretConsumeRateBytes), (int)stripesToEndOfBlock); ScrambleAccumulators(accumulators, secret + (SecretLengthBytes - StripeLengthBytes)); Accumulate(accumulators, source + ((int)stripesToEndOfBlock * StripeLengthBytes), secret, (int)stripesAfterBlock); stripesSoFar = stripesAfterBlock; } else { Accumulate(accumulators, source, secret + ((int)stripesSoFar * SecretConsumeRateBytes), (int)stripes); stripesSoFar += stripes; } } public static void Append(ref State state, ReadOnlySpan source) { Debug.Assert(state.BufferedCount <= InternalBufferLengthBytes); state.TotalLength += (uint)source.Length; fixed (byte* buffer = state.Buffer) { // Small input: just copy the data to the buffer. if (source.Length <= InternalBufferLengthBytes - state.BufferedCount) { source.CopyTo(new Span(buffer + state.BufferedCount, source.Length)); state.BufferedCount += (uint)source.Length; return; } fixed (byte* secret = state.Secret) fixed (ulong* accumulators = state.Accumulators) fixed (byte* sourcePtr = &MemoryMarshal.GetReference(source)) { // Internal buffer is partially filled (always, except at beginning). Complete it, then consume it. int sourceIndex = 0; if (state.BufferedCount != 0) { int loadSize = InternalBufferLengthBytes - (int)state.BufferedCount; source.Slice(0, loadSize).CopyTo(new Span(buffer + state.BufferedCount, loadSize)); sourceIndex = loadSize; ConsumeStripes(accumulators, ref state.StripesProcessedInCurrentBlock, NumStripesPerBlock, buffer, InternalBufferStripes, secret); state.BufferedCount = 0; } Debug.Assert(sourceIndex < source.Length); // Large input to consume: ingest per full block. if (source.Length - sourceIndex > NumStripesPerBlock * StripeLengthBytes) { ulong stripes = (ulong)(source.Length - sourceIndex - 1) / StripeLengthBytes; Debug.Assert(NumStripesPerBlock >= state.StripesProcessedInCurrentBlock); // Join to current block's end. ulong stripesToEnd = NumStripesPerBlock - state.StripesProcessedInCurrentBlock; Debug.Assert(stripesToEnd <= stripes); Accumulate(accumulators, sourcePtr + sourceIndex, secret + ((int)state.StripesProcessedInCurrentBlock * SecretConsumeRateBytes), (int)stripesToEnd); ScrambleAccumulators(accumulators, secret + (SecretLengthBytes - StripeLengthBytes)); state.StripesProcessedInCurrentBlock = 0; sourceIndex += (int)stripesToEnd * StripeLengthBytes; stripes -= stripesToEnd; // Consume entire blocks. while (stripes >= NumStripesPerBlock) { Accumulate(accumulators, sourcePtr + sourceIndex, secret, NumStripesPerBlock); ScrambleAccumulators(accumulators, secret + (SecretLengthBytes - StripeLengthBytes)); sourceIndex += NumStripesPerBlock * StripeLengthBytes; stripes -= NumStripesPerBlock; } // Consume complete stripes in the last partial block. Accumulate(accumulators, sourcePtr + sourceIndex, secret, (int)stripes); sourceIndex += (int)stripes * StripeLengthBytes; Debug.Assert(sourceIndex < source.Length); // at least some bytes left state.StripesProcessedInCurrentBlock = stripes; // Copy the last stripe into the end of the buffer so it is available to GetCurrentHashCore when processing the "stripe from the end". source.Slice(sourceIndex - StripeLengthBytes, StripeLengthBytes).CopyTo(new Span(buffer + InternalBufferLengthBytes - StripeLengthBytes, StripeLengthBytes)); } else if (source.Length - sourceIndex > InternalBufferLengthBytes) { // Content to consume <= block size. Consume source by a multiple of internal buffer size. do { ConsumeStripes(accumulators, ref state.StripesProcessedInCurrentBlock, NumStripesPerBlock, sourcePtr + sourceIndex, InternalBufferStripes, secret); sourceIndex += InternalBufferLengthBytes; } while (source.Length - sourceIndex > InternalBufferLengthBytes); // Copy the last stripe into the end of the buffer so it is available to GetCurrentHashCore when processing the "stripe from the end". source.Slice(sourceIndex - StripeLengthBytes, StripeLengthBytes).CopyTo(new Span(buffer + InternalBufferLengthBytes - StripeLengthBytes, StripeLengthBytes)); } // Buffer the remaining input. Span remaining = new Span(buffer, source.Length - sourceIndex); Debug.Assert(sourceIndex < source.Length); Debug.Assert(remaining.Length <= InternalBufferLengthBytes); Debug.Assert(state.BufferedCount == 0); source.Slice(sourceIndex).CopyTo(remaining); state.BufferedCount = (uint)remaining.Length; } } } public static void CopyAccumulators(ref State state, ulong* accumulators) { fixed (ulong* stateAccumulators = state.Accumulators) { #if NET7_0_OR_GREATER if (Vector256.IsHardwareAccelerated) { Vector256.Store(Vector256.Load(stateAccumulators), accumulators); Vector256.Store(Vector256.Load(stateAccumulators + 4), accumulators + 4); } else if (Vector128.IsHardwareAccelerated) { Vector128.Store(Vector128.Load(stateAccumulators), accumulators); Vector128.Store(Vector128.Load(stateAccumulators + 2), accumulators + 2); Vector128.Store(Vector128.Load(stateAccumulators + 4), accumulators + 4); Vector128.Store(Vector128.Load(stateAccumulators + 6), accumulators + 6); } else #endif { for (int i = 0; i < 8; i++) { accumulators[i] = stateAccumulators[i]; } } } } public static void DigestLong(ref State state, ulong* accumulators, byte* secret) { Debug.Assert(state.BufferedCount > 0); fixed (byte* buffer = state.Buffer) { byte* accumulateData; if (state.BufferedCount >= StripeLengthBytes) { uint stripes = (state.BufferedCount - 1) / StripeLengthBytes; ulong stripesSoFar = state.StripesProcessedInCurrentBlock; ConsumeStripes(accumulators, ref stripesSoFar, NumStripesPerBlock, buffer, stripes, secret); accumulateData = buffer + state.BufferedCount - StripeLengthBytes; } else { byte* lastStripe = stackalloc byte[StripeLengthBytes]; int catchupSize = StripeLengthBytes - (int)state.BufferedCount; new ReadOnlySpan(buffer + InternalBufferLengthBytes - catchupSize, catchupSize).CopyTo(new Span(lastStripe, StripeLengthBytes)); new ReadOnlySpan(buffer, (int)state.BufferedCount).CopyTo(new Span(lastStripe + catchupSize, (int)state.BufferedCount)); accumulateData = lastStripe; } Accumulate512(accumulators, accumulateData, secret + (SecretLengthBytes - StripeLengthBytes - SecretLastAccStartBytes)); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void InitializeAccumulators(ulong* accumulators) { #if NET7_0_OR_GREATER if (Vector256.IsHardwareAccelerated) { Vector256.Store(Vector256.Create(Prime32_3, Prime64_1, Prime64_2, Prime64_3), accumulators); Vector256.Store(Vector256.Create(Prime64_4, Prime32_2, Prime64_5, Prime32_1), accumulators + 4); } else if (Vector128.IsHardwareAccelerated) { Vector128.Store(Vector128.Create(Prime32_3, Prime64_1), accumulators); Vector128.Store(Vector128.Create(Prime64_2, Prime64_3), accumulators + 2); Vector128.Store(Vector128.Create(Prime64_4, Prime32_2), accumulators + 4); Vector128.Store(Vector128.Create(Prime64_5, Prime32_1), accumulators + 6); } else #endif { accumulators[0] = Prime32_3; accumulators[1] = Prime64_1; accumulators[2] = Prime64_2; accumulators[3] = Prime64_3; accumulators[4] = Prime64_4; accumulators[5] = Prime32_2; accumulators[6] = Prime64_5; accumulators[7] = Prime32_1; } } public static ulong MergeAccumulators(ulong* accumulators, byte* secret, ulong start) { ulong result64 = start; result64 += Multiply64To128ThenFold(accumulators[0] ^ ReadUInt64LE(secret), accumulators[1] ^ ReadUInt64LE(secret + 8)); result64 += Multiply64To128ThenFold(accumulators[2] ^ ReadUInt64LE(secret + 16), accumulators[3] ^ ReadUInt64LE(secret + 24)); result64 += Multiply64To128ThenFold(accumulators[4] ^ ReadUInt64LE(secret + 32), accumulators[5] ^ ReadUInt64LE(secret + 40)); result64 += Multiply64To128ThenFold(accumulators[6] ^ ReadUInt64LE(secret + 48), accumulators[7] ^ ReadUInt64LE(secret + 56)); return Avalanche(result64); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong Mix16Bytes(byte* source, ulong secretLow, ulong secretHigh, ulong seed) => Multiply64To128ThenFold( ReadUInt64LE(source) ^ (secretLow + seed), ReadUInt64LE(source + sizeof(ulong)) ^ (secretHigh - seed)); /// Calculates a 32-bit to 64-bit long multiply. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong Multiply32To64(uint v1, uint v2) => (ulong)v1 * v2; /// "This is a fast avalanche stage, suitable when input bits are already partially mixed." [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong Avalanche(ulong hash) { hash = XorShift(hash, 37); hash *= 0x165667919E3779F9; hash = XorShift(hash, 32); return hash; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong Multiply64To128(ulong left, ulong right, out ulong lower) { #if NET5_0_OR_GREATER return Math.BigMul(left, right, out lower); #else ulong lowerLow = Multiply32To64((uint)left, (uint)right); ulong higherLow = Multiply32To64((uint)(left >> 32), (uint)right); ulong lowerHigh = Multiply32To64((uint)left, (uint)(right >> 32)); ulong higherHigh = Multiply32To64((uint)(left >> 32), (uint)(right >> 32)); ulong cross = (lowerLow >> 32) + (higherLow & 0xFFFFFFFF) + lowerHigh; ulong upper = (higherLow >> 32) + (cross >> 32) + higherHigh; lower = (cross << 32) | (lowerLow & 0xFFFFFFFF); return upper; #endif } /// Calculates a 64-bit to 128-bit multiply, then XOR folds it. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong Multiply64To128ThenFold(ulong left, ulong right) { ulong upper = Multiply64To128(left, right, out ulong lower); return lower ^ upper; } public static void DeriveSecretFromSeed(byte* destinationSecret, ulong seed) { fixed (byte* defaultSecret = &MemoryMarshal.GetReference(DefaultSecret)) { #if NET7_0_OR_GREATER if (Vector256.IsHardwareAccelerated && BitConverter.IsLittleEndian) { Vector256 seedVec = Vector256.Create(seed, 0u - seed, seed, 0u - seed); for (int i = 0; i < SecretLengthBytes; i += Vector256.Count) { Vector256.Store(Vector256.Load((ulong*)(defaultSecret + i)) + seedVec, (ulong*)(destinationSecret + i)); } } else if (Vector128.IsHardwareAccelerated && BitConverter.IsLittleEndian) { Vector128 seedVec = Vector128.Create(seed, 0u - seed); for (int i = 0; i < SecretLengthBytes; i += Vector128.Count) { Vector128.Store(Vector128.Load((ulong*)(defaultSecret + i)) + seedVec, (ulong*)(destinationSecret + i)); } } else #endif { for (int i = 0; i < SecretLengthBytes; i += sizeof(ulong) * 2) { WriteUInt64LE(destinationSecret + i, ReadUInt64LE(defaultSecret + i) + seed); WriteUInt64LE(destinationSecret + i + 8, ReadUInt64LE(defaultSecret + i + 8) - seed); } } } } /// Optimized version of looping over . [MethodImpl(MethodImplOptions.NoInlining)] private static void Accumulate(ulong* accumulators, byte* source, byte* secret, int stripesToProcess, bool scramble = false, int blockCount = 1) { byte* secretForAccumulate = secret; byte* secretForScramble = secret + (SecretLengthBytes - StripeLengthBytes); #if NET7_0_OR_GREATER if (Vector256.IsHardwareAccelerated && BitConverter.IsLittleEndian) { Vector256 acc1 = Vector256.Load(accumulators); Vector256 acc2 = Vector256.Load(accumulators + Vector256.Count); for (int j = 0; j < blockCount; j++) { secret = secretForAccumulate; for (int i = 0; i < stripesToProcess; i++) { Vector256 secretVal = Vector256.Load((uint*)secret); acc1 = Accumulate256(acc1, source, secretVal); source += Vector256.Count; secretVal = Vector256.Load((uint*)secret + Vector256.Count); acc2 = Accumulate256(acc2, source, secretVal); source += Vector256.Count; secret += SecretConsumeRateBytes; } if (scramble) { acc1 = ScrambleAccumulator256(acc1, Vector256.Load((ulong*)secretForScramble)); acc2 = ScrambleAccumulator256(acc2, Vector256.Load((ulong*)secretForScramble + Vector256.Count)); } } Vector256.Store(acc1, accumulators); Vector256.Store(acc2, accumulators + Vector256.Count); } else if (Vector128.IsHardwareAccelerated && BitConverter.IsLittleEndian) { Vector128 acc1 = Vector128.Load(accumulators); Vector128 acc2 = Vector128.Load(accumulators + Vector128.Count); Vector128 acc3 = Vector128.Load(accumulators + Vector128.Count * 2); Vector128 acc4 = Vector128.Load(accumulators + Vector128.Count * 3); for (int j = 0; j < blockCount; j++) { secret = secretForAccumulate; for (int i = 0; i < stripesToProcess; i++) { Vector128 secretVal = Vector128.Load((uint*)secret); acc1 = Accumulate128(acc1, source, secretVal); source += Vector128.Count; secretVal = Vector128.Load((uint*)secret + Vector128.Count); acc2 = Accumulate128(acc2, source, secretVal); source += Vector128.Count; secretVal = Vector128.Load((uint*)secret + Vector128.Count * 2); acc3 = Accumulate128(acc3, source, secretVal); source += Vector128.Count; secretVal = Vector128.Load((uint*)secret + Vector128.Count * 3); acc4 = Accumulate128(acc4, source, secretVal); source += Vector128.Count; secret += SecretConsumeRateBytes; } if (scramble) { acc1 = ScrambleAccumulator128(acc1, Vector128.Load((ulong*)secretForScramble)); acc2 = ScrambleAccumulator128(acc2, Vector128.Load((ulong*)secretForScramble + Vector128.Count)); acc3 = ScrambleAccumulator128(acc3, Vector128.Load((ulong*)secretForScramble + Vector128.Count * 2)); acc4 = ScrambleAccumulator128(acc4, Vector128.Load((ulong*)secretForScramble + Vector128.Count * 3)); } } Vector128.Store(acc1, accumulators); Vector128.Store(acc2, accumulators + Vector128.Count); Vector128.Store(acc3, accumulators + Vector128.Count * 2); Vector128.Store(acc4, accumulators + Vector128.Count * 3); } else #endif { for (int j = 0; j < blockCount; j++) { for (int i = 0; i < stripesToProcess; i++) { Accumulate512Inlined(accumulators, source, secret + (i * SecretConsumeRateBytes)); source += StripeLengthBytes; } if (scramble) { ScrambleAccumulators(accumulators, secretForScramble); } } } } [MethodImpl(MethodImplOptions.NoInlining)] public static void Accumulate512(ulong* accumulators, byte* source, byte* secret) { Accumulate512Inlined(accumulators, source, secret); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void Accumulate512Inlined(ulong* accumulators, byte* source, byte* secret) { #if NET7_0_OR_GREATER if (Vector256.IsHardwareAccelerated && BitConverter.IsLittleEndian) { for (int i = 0; i < AccumulatorCount / Vector256.Count; i++) { Vector256 accVec = Accumulate256(Vector256.Load(accumulators), source, Vector256.Load((uint*)secret)); Vector256.Store(accVec, accumulators); accumulators += Vector256.Count; secret += Vector256.Count; source += Vector256.Count; } } else if (Vector128.IsHardwareAccelerated && BitConverter.IsLittleEndian) { for (int i = 0; i < AccumulatorCount / Vector128.Count; i++) { Vector128 accVec = Accumulate128(Vector128.Load(accumulators), source, Vector128.Load((uint*)secret)); Vector128.Store(accVec, accumulators); accumulators += Vector128.Count; secret += Vector128.Count; source += Vector128.Count; } } else #endif { for (int i = 0; i < AccumulatorCount; i++) { ulong sourceVal = ReadUInt64LE(source + (8 * i)); ulong sourceKey = sourceVal ^ ReadUInt64LE(secret + (i * 8)); accumulators[i ^ 1] += sourceVal; // swap adjacent lanes accumulators[i] += Multiply32To64((uint)sourceKey, (uint)(sourceKey >> 32)); } } } #if NET7_0_OR_GREATER [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Vector256 Accumulate256(Vector256 accVec, byte* source, Vector256 secret) { Vector256 sourceVec = Vector256.Load((uint*)source); Vector256 sourceKey = sourceVec ^ secret; // TODO: Figure out how to unwind this shuffle and just use Vector256.Multiply Vector256 sourceKeyLow = Vector256.Shuffle(sourceKey, Vector256.Create(1u, 0, 3, 0, 5, 0, 7, 0)); Vector256 sourceSwap = Vector256.Shuffle(sourceVec, Vector256.Create(2u, 3, 0, 1, 6, 7, 4, 5)); Vector256 sum = accVec + sourceSwap.AsUInt64(); Vector256 product = Avx2.IsSupported ? Avx2.Multiply(sourceKey, sourceKeyLow) : (sourceKey & Vector256.Create(~0u, 0u, ~0u, 0u, ~0u, 0u, ~0u, 0u)).AsUInt64() * (sourceKeyLow & Vector256.Create(~0u, 0u, ~0u, 0u, ~0u, 0u, ~0u, 0u)).AsUInt64(); accVec = product + sum; return accVec; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Vector128 Accumulate128(Vector128 accVec, byte* source, Vector128 secret) { Vector128 sourceVec = Vector128.Load((uint*)source); Vector128 sourceKey = sourceVec ^ secret; // TODO: Figure out how to unwind this shuffle and just use Vector128.Multiply Vector128 sourceSwap = Vector128.Shuffle(sourceVec, Vector128.Create(2u, 3, 0, 1)); Vector128 sum = accVec + sourceSwap.AsUInt64(); Vector128 product = MultiplyWideningLower(sourceKey); accVec = product + sum; return accVec; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Vector128 MultiplyWideningLower(Vector128 source) { if (AdvSimd.IsSupported) { Vector64 sourceLow = Vector128.Shuffle(source, Vector128.Create(0u, 2, 0, 0)).GetLower(); Vector64 sourceHigh = Vector128.Shuffle(source, Vector128.Create(1u, 3, 0, 0)).GetLower(); return AdvSimd.MultiplyWideningLower(sourceLow, sourceHigh); } else { Vector128 sourceLow = Vector128.Shuffle(source, Vector128.Create(1u, 0, 3, 0)); return Sse2.IsSupported ? Sse2.Multiply(source, sourceLow) : (source & Vector128.Create(~0u, 0u, ~0u, 0u)).AsUInt64() * (sourceLow & Vector128.Create(~0u, 0u, ~0u, 0u)).AsUInt64(); } } #endif private static void ScrambleAccumulators(ulong* accumulators, byte* secret) { #if NET7_0_OR_GREATER if (Vector256.IsHardwareAccelerated && BitConverter.IsLittleEndian) { for (int i = 0; i < AccumulatorCount / Vector256.Count; i++) { Vector256 accVec = ScrambleAccumulator256(Vector256.Load(accumulators), Vector256.Load((ulong*)secret)); Vector256.Store(accVec, accumulators); accumulators += Vector256.Count; secret += Vector256.Count; } } else if (Vector128.IsHardwareAccelerated && BitConverter.IsLittleEndian) { for (int i = 0; i < AccumulatorCount / Vector128.Count; i++) { Vector128 accVec = ScrambleAccumulator128(Vector128.Load(accumulators), Vector128.Load((ulong*)secret)); Vector128.Store(accVec, accumulators); accumulators += Vector128.Count; secret += Vector128.Count; } } else #endif { for (int i = 0; i < AccumulatorCount; i++) { ulong xorShift = XorShift(*accumulators, 47); ulong xorWithKey = xorShift ^ ReadUInt64LE(secret); *accumulators = xorWithKey * Prime32_1; accumulators++; secret += sizeof(ulong); } } } #if NET7_0_OR_GREATER [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Vector256 ScrambleAccumulator256(Vector256 accVec, Vector256 secret) { Vector256 xorShift = accVec ^ Vector256.ShiftRightLogical(accVec, 47); Vector256 xorWithKey = xorShift ^ secret; accVec = xorWithKey * Vector256.Create((ulong)Prime32_1); return accVec; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static Vector128 ScrambleAccumulator128(Vector128 accVec, Vector128 secret) { Vector128 xorShift = accVec ^ Vector128.ShiftRightLogical(accVec, 47); Vector128 xorWithKey = xorShift ^ secret; accVec = xorWithKey * Vector128.Create((ulong)Prime32_1); return accVec; } #endif [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong XorShift(ulong value, int shift) { Debug.Assert(shift >= 0 && shift < 64); return value ^ (value >> shift); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static uint ReadUInt32LE(byte* data) => BitConverter.IsLittleEndian ? Unsafe.ReadUnaligned(data) : BinaryPrimitives.ReverseEndianness(Unsafe.ReadUnaligned(data)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong ReadUInt64LE(byte* data) => BitConverter.IsLittleEndian ? Unsafe.ReadUnaligned(data) : BinaryPrimitives.ReverseEndianness(Unsafe.ReadUnaligned(data)); [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void WriteUInt64LE(byte* data, ulong value) { if (!BitConverter.IsLittleEndian) { value = BinaryPrimitives.ReverseEndianness(value); } Unsafe.WriteUnaligned(data, value); } [StructLayout(LayoutKind.Auto)] public struct State { /// The accumulators. Length is . internal fixed ulong Accumulators[AccumulatorCount]; /// Used to store a custom secret generated from a seed. Length is . internal fixed byte Secret[SecretLengthBytes]; /// The internal buffer. Length is . internal fixed byte Buffer[InternalBufferLengthBytes]; /// The amount of memory in . internal uint BufferedCount; /// Number of stripes processed in the current block. internal ulong StripesProcessedInCurrentBlock; /// Total length hashed. internal ulong TotalLength; /// The seed employed (possibly 0). internal ulong Seed; }; } ================================================ FILE: src/BloomFilter/HashAlgorithms/LCGWithFNV.cs ================================================ using System; namespace BloomFilter.HashAlgorithms; /// /// Implements an Linear Congruential Generator With FNV1a hash algorithm. /// public class LCGWithFNV1a : LCGWithFNV { public override HashMethod Method => HashMethod.LCGWithFNV1a; public override long Hash(ReadOnlySpan data) { return Internal.FNV1a.HashToUInt32(data); } } /// /// Implements an Linear Congruential Generator With modified FNV hash. Provides better distribution than FNV1 but it's only 32 bit long. /// public class LCGModifiedFNV1 : LCGWithFNV1a { public override HashMethod Method => HashMethod.LCGModifiedFNV1; public override long Hash(ReadOnlySpan data) { return Internal.ModifiedFNV1.HashToUInt32(data); } } /// /// Implements an Linear Congruential Generator With FNV1 hash algorithm. /// public class LCGWithFNV : HashFunction { public override HashMethod Method => HashMethod.LCGWithFNV1; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { long multiplier = 0x5DEECE66DL; long addend = 0xBL; long mask = (1L << 48) - 1; // Generate int from byte Array using the FNV hash long reduced = Math.Abs(Hash(data)); // Make number positive // Handle the special case: smallest negative number is itself as the // absolute value if (reduced == int.MaxValue) reduced = 42; // Calculate hashes numbers iteratively long[] positions = new long[k]; long seed = reduced; for (int i = 0; i < k; i++) { //http://en.wikipedia.org/wiki/Linear_congruential_generator // LCG formula: x_i+1 = (multiplier * x_i + addend) mod mask seed = (seed * multiplier + addend) & mask; positions[i] = BinaryHelper.RightMove(seed, (48 - 30)) % m; } return positions; } public virtual long Hash(ReadOnlySpan data) { return Internal.FNV1.HashToUInt32(data); } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Murmur128BitsX64.cs ================================================ using System; namespace BloomFilter.HashAlgorithms; public class Murmur128BitsX64 : HashFunction { public override HashMethod Method => HashMethod.Murmur128BitsX64; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { long[] positions = new long[k]; var uint128 = Internal.Murmur128BitsX64.HashToUInt128Array(data); var hash1 = (uint)uint128[0]; var hash2 = (uint)(uint128[1] >> 32); for (int i = 0; i < k; i++) { positions[i] = (hash1 + i * hash2) % m; } return positions; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Murmur128BitsX86.cs ================================================ using System; namespace BloomFilter.HashAlgorithms; public class Murmur128BitsX86 : HashFunction { public override HashMethod Method => HashMethod.Murmur128BitsX86; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { long[] positions = new long[k]; var uint128 = Internal.Murmur128BitsX86.HashToUInt128Array(data); var hash1 = uint128[0]; var hash2 = uint128[1]; for (int i = 0; i < k; i++) { positions[i] = (hash1 + i * hash2) % m; } return positions; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/Murmur32BitsX86.cs ================================================ using System; namespace BloomFilter.HashAlgorithms; /// /// Building a Better Bloom Filter" by Adam Kirsch and Michael Mitzenmacher, /// https://www.eecs.harvard.edu/~michaelm/postscripts/tr-02-05.pdf /// public class Murmur32BitsX86 : HashFunction { public override HashMethod Method => HashMethod.Murmur32BitsX86; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { long[] positions = new long[k]; var hash1 = Internal.Murmur32BitsX86.HashToUInt32(data); var hash2 = Internal.Murmur32BitsX86.HashToUInt32(data, hash1); for (int i = 0; i < k; i++) { positions[i] = (hash1 + i * hash2) % m; } return positions; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/RNGWithFNV.cs ================================================ using System; namespace BloomFilter.HashAlgorithms; /// /// Implements an Random With FNV1a hash algorithm. /// public class RNGWithFNV1a : RNGWithFNV1 { public override HashMethod Method => HashMethod.RNGWithFNV1a; public override long Hash(ReadOnlySpan data) { return Internal.FNV1a.HashToUInt32(data); } } /// /// Implements an Random With modified FNV hash. Provides better distribution than FNV1 but it's only 32 bit long. /// public class RNGModifiedFNV1 : RNGWithFNV1a { public override HashMethod Method => HashMethod.RNGModifiedFNV1; public override long Hash(ReadOnlySpan data) { return Internal.ModifiedFNV1.HashToUInt32(data); } } /// /// Implements an Random With FNV1 hash algorithm. /// public class RNGWithFNV1 : HashFunction { public override HashMethod Method => HashMethod.RNGWithFNV1; protected const long Prime = 16_777_619; protected const long Init = 2_166_136_261; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { long[] positions = new long[k]; Random r = new((int)Hash(data)); for (int i = 0; i < k; i++) { #if NET6_0_OR_GREATER positions[i] = r.NextInt64(m); #else positions[i] = r.Next((int)m); #endif } return positions; } public virtual long Hash(ReadOnlySpan data) { return Internal.FNV1.HashToUInt32(data); } } ================================================ FILE: src/BloomFilter/HashAlgorithms/XXHash128.cs ================================================ using System; using System.Buffers.Binary; namespace BloomFilter.HashAlgorithms; public class XXHash128 : HashFunction { public override HashMethod Method => HashMethod.XXHash128; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { long[] positions = new long[k]; #if NET7_0_OR_GREATER var hash = Internal.XxHash128.HashToHash128(data); var hash1 = (uint)hash.High64; var hash2 = (uint)(hash.High64 >> 32); #else ReadOnlySpan hash = Internal.XxHash128.Hash(data); var hash1 = BinaryPrimitives.ReadUInt32BigEndian(hash); var hash2 = BinaryPrimitives.ReadUInt32BigEndian(hash.Slice(4)); #endif for (int i = 0; i < k; i++) { positions[i] = ((hash1 + i * hash2) % m); } return positions; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/XXHash3.cs ================================================ using System; namespace BloomFilter.HashAlgorithms; public class XXHash3 : HashFunction { public override HashMethod Method => HashMethod.XXHash3; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { long[] positions = new long[k]; var hash = Internal.XxHash3.HashToUInt64(data, 0); uint hash1 = (uint)hash; uint hash2 = (uint)(hash >> 32); for (int i = 0; i < k; i++) { positions[i] = ((hash1 + i * hash2) % m); } return positions; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/XXHash32.cs ================================================ using System; namespace BloomFilter.HashAlgorithms; public class XXHash32 : HashFunction { public override HashMethod Method => HashMethod.XXHash32; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { long[] positions = new long[k]; uint hash1 = Internal.XxHash32.HashToUInt32(data, 0); uint hash2 = Internal.XxHash32.HashToUInt32(data, hash1); for (int i = 0; i < k; i++) { positions[i] = ((hash1 + (i * hash2)) % m); } return positions; } } ================================================ FILE: src/BloomFilter/HashAlgorithms/XXHash64.cs ================================================ using System; namespace BloomFilter.HashAlgorithms; public class XXHash64 : HashFunction { public override HashMethod Method => HashMethod.XXHash64; public override long[] ComputeHash(ReadOnlySpan data, long m, int k) { long[] positions = new long[k]; var hash = Internal.XxHash64.HashToUInt64(data, 0); uint hash1 = (uint)hash; uint hash2 = (uint)(hash >> 32); for (int i = 0; i < k; i++) { positions[i] = ((hash1 + (i * hash2)) % m); } return positions; } } ================================================ FILE: src/BloomFilter/HashFunction.cs ================================================ using BloomFilter.HashAlgorithms; using System; using System.Collections.Generic; namespace BloomFilter; /// /// An implemented to provide custom hash functions. /// public abstract class HashFunction { /// /// The hash functions /// public static readonly IReadOnlyDictionary Functions = new Dictionary { { HashMethod.LCGWithFNV1,new LCGWithFNV() }, { HashMethod.LCGWithFNV1a,new LCGWithFNV1a() }, { HashMethod.LCGModifiedFNV1,new LCGModifiedFNV1() }, { HashMethod.RNGWithFNV1,new RNGWithFNV1() }, { HashMethod.RNGWithFNV1a,new RNGWithFNV1a() }, { HashMethod.RNGModifiedFNV1,new RNGModifiedFNV1() }, { HashMethod.CRC32,new Crc32() }, { HashMethod.CRC64,new Crc64() }, { HashMethod.Adler32,new Adler32() }, { HashMethod.Murmur3,new Murmur32BitsX86() }, { HashMethod.Murmur32BitsX86,new Murmur32BitsX86() }, { HashMethod.Murmur128BitsX64,new Murmur128BitsX64() }, { HashMethod.Murmur128BitsX86,new Murmur128BitsX86() }, { HashMethod.SHA1,new HashCryptoSHA1() }, { HashMethod.SHA256,new HashCryptoSHA256() }, { HashMethod.SHA384,new HashCryptoSHA384() }, { HashMethod.SHA512,new HashCryptoSHA512() }, { HashMethod.XXHash32,new XXHash32() }, { HashMethod.XXHash64,new XXHash64() }, { HashMethod.XXHash3,new XXHash3() }, { HashMethod.XXHash128,new XXHash128() }, }; /// /// Hash Method /// public abstract HashMethod Method { get; } /// /// Hashes the specified value. /// /// The data. /// integer output range. /// number of hashes to be computed. /// /// int array of hashes hash values /// public abstract long[] ComputeHash(ReadOnlySpan data, long m, int k); } ================================================ FILE: src/BloomFilter/HashMethod.cs ================================================ namespace BloomFilter; /// /// Hash Methods /// public enum HashMethod : int { LCGWithFNV1 = 0, LCGWithFNV1a = 1, LCGModifiedFNV1 = 2, RNGWithFNV1 = 100, RNGWithFNV1a = 101, RNGModifiedFNV1 = 102, CRC32 = 200, CRC64 = 201, Adler32 = 202, Murmur3 = 300, Murmur32BitsX86 = 301, Murmur128BitsX64 = 302, Murmur128BitsX86 = 303, SHA1 = 400, SHA256 = 401, SHA384 = 402, SHA512 = 403, XXHash32 = 500, XXHash64 = 501, XXHash3 = 502, XXHash128 = 503, } ================================================ FILE: src/BloomFilter/IBloomFilter.cs ================================================ using System; using System.Collections.Generic; using System.Threading.Tasks; namespace BloomFilter; /// /// Represents a Bloom filter. /// public interface IBloomFilter : IDisposable { /// /// Gets the name specified by BloomFilter. /// string Name { get; } /// /// Adds the passed value to the filter. /// /// /// bool Add(ReadOnlySpan data); /// /// Async Adds the passed value to the filter. /// /// /// ValueTask AddAsync(ReadOnlyMemory data); /// /// Adds the specified elements. /// /// The elements. /// IList Add(IEnumerable elements); /// /// Async Adds the specified elements. /// /// The elements. /// ValueTask> AddAsync(IEnumerable elements); /// /// Tests whether an element is present in the filter /// /// /// bool Contains(ReadOnlySpan element); /// /// Async Tests whether an element is present in the filter /// /// /// ValueTask ContainsAsync(ReadOnlyMemory element); /// /// Tests whether an elements is present in the filter /// /// /// IList Contains(IEnumerable elements); /// /// Async Tests whether an elements is present in the filter /// /// /// ValueTask> ContainsAsync(IEnumerable elements); /// /// Alls the specified elements. /// /// The elements. /// bool All(IEnumerable elements); /// /// Async Alls the specified elements. /// /// The elements. /// ValueTask AllAsync(IEnumerable elements); /// /// Removes all elements from the filter /// void Clear(); /// /// Async Removes all elements from the filter /// ValueTask ClearAsync(); /// /// Hashes the specified value. /// /// /// long[] ComputeHash(ReadOnlySpan data); } ================================================ FILE: src/BloomFilter/IBloomFilterFactory.cs ================================================ using System.Diagnostics.CodeAnalysis; namespace BloomFilter; /// /// BloomFilter Factory /// public interface IBloomFilterFactory { /// /// Gets the /// /// The bloomFilter. /// Name. IBloomFilter Get(string name); /// /// Try Gets the /// /// Name. /// The bloomFilter /// bool TryGet(string name, #if NET5_0_OR_GREATER [MaybeNullWhen(false)] #endif out IBloomFilter bloomFilter); } ================================================ FILE: src/BloomFilter/IFilterMemorySerializer.cs ================================================ using System.IO; using System.Threading.Tasks; namespace BloomFilter; /// /// Represents a serialization interface /// public interface IFilterMemorySerializer { /// /// Serialize to a stream /// /// /// /// ValueTask SerializeAsync(FilterMemorySerializerParam param, Stream stream); /// /// Deserialize from the stream /// /// /// ValueTask DeserializeAsync(Stream stream); } ================================================ FILE: src/BloomFilter/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("931DFF3C-9F5A-4551-B36C-2300844DDDC2")] #if NETSTANDARD2_1 || NET6_0_OR_GREATER || NETSTANDARD2_0 || NET40 [assembly: AllowPartiallyTrustedCallers] #endif #if NETSTANDARD2_1 || NET6_0_OR_GREATER || NETSTANDARD2_0 || NET40 || NET45 [assembly: SecurityRules(SecurityRuleSet.Level1)] #endif [assembly: InternalsVisibleTo("BloomFilterTest, PublicKey=00240000048000009400000006020000002400005253413100040000010001004dd575590e774ea5ea5b02c96ec45feb8720721159f7d7a463680d1dcca3ddc5c5f52dd0e3f7086a6504df00571f9816545ac9ad6d402370bd6f9a395e08a9fe7ff26ce99318bab6a7fdc8233e9ce22c81d7fd75508d79bb7a93f6440656282bd7c95a3f891258075626eea022d03d0859954641424cbb15e031b6fec15541d3")] [assembly: InternalsVisibleTo("PerformanceTest, PublicKey=00240000048000009400000006020000002400005253413100040000010001004dd575590e774ea5ea5b02c96ec45feb8720721159f7d7a463680d1dcca3ddc5c5f52dd0e3f7086a6504df00571f9816545ac9ad6d402370bd6f9a395e08a9fe7ff26ce99318bab6a7fdc8233e9ce22c81d7fd75508d79bb7a93f6440656282bd7c95a3f891258075626eea022d03d0859954641424cbb15e031b6fec15541d3")] [assembly: InternalsVisibleTo("BenchmarkTest, PublicKey=00240000048000009400000006020000002400005253413100040000010001004dd575590e774ea5ea5b02c96ec45feb8720721159f7d7a463680d1dcca3ddc5c5f52dd0e3f7086a6504df00571f9816545ac9ad6d402370bd6f9a395e08a9fe7ff26ce99318bab6a7fdc8233e9ce22c81d7fd75508d79bb7a93f6440656282bd7c95a3f891258075626eea022d03d0859954641424cbb15e031b6fec15541d3")] ================================================ FILE: src/BloomFilter/ServiceCollectionExtensions.cs ================================================ using System; using BloomFilter; using BloomFilter.Configurations; namespace Microsoft.Extensions.DependencyInjection { public static class ServiceCollectionExtensions { /// /// Adds the BloomFilter. /// /// Services. /// Setup action. public static IServiceCollection AddBloomFilter(this IServiceCollection services, Action setupAction) { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(setupAction); #else if (setupAction == null) throw new ArgumentNullException(nameof(setupAction)); #endif //Options and extension service var options = new BloomFilterOptions(); setupAction(options); foreach (var serviceExtension in options.Extensions) { serviceExtension.AddServices(services); } services.AddSingleton(options); return services; } /// /// Uses the in-memory. /// /// Options. /// /// public static BloomFilterOptions UseInMemory(this BloomFilterOptions options, string name = BloomFilterConstValue.DefaultInMemoryName, Action? setupActions = null) { var filterMemoryOptions = new FilterMemoryOptions { Name = name }; setupActions?.Invoke(filterMemoryOptions); options.RegisterExtension(new FilterMemoryOptionsExtension(filterMemoryOptions)); return options; } /// /// Uses the in-memory. /// /// Options. /// public static BloomFilterOptions UseInMemory(this BloomFilterOptions options, FilterMemoryOptions filterMemoryOptions) { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(filterMemoryOptions); #else if (filterMemoryOptions == null) throw new ArgumentNullException(nameof(filterMemoryOptions)); #endif options.RegisterExtension(new FilterMemoryOptionsExtension(filterMemoryOptions)); return options; } /// /// Uses the in-memory. /// /// Options. /// /// public static BloomFilterOptions UseInMemoryWithSerializer(this BloomFilterOptions options, string name = BloomFilterConstValue.DefaultInMemoryName, Action? setupActions = null) where TSerializer : IFilterMemorySerializer { var filterMemoryOptions = new FilterMemoryOptions { Name = name }; setupActions?.Invoke(filterMemoryOptions); options.RegisterExtension(new FilterMemoryOptionsExtension(filterMemoryOptions, typeof(TSerializer))); return options; } /// /// Uses the in-memory. /// /// Options. /// public static BloomFilterOptions UseInMemoryWithSerializer(this BloomFilterOptions options, FilterMemoryOptions filterMemoryOptions) where TSerializer : IFilterMemorySerializer { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(filterMemoryOptions); #else if (filterMemoryOptions == null) throw new ArgumentNullException(nameof(filterMemoryOptions)); #endif options.RegisterExtension(new FilterMemoryOptionsExtension(filterMemoryOptions, typeof(TSerializer))); return options; } } } ================================================ FILE: src/BloomFilter/StringSpanExtensions.cs ================================================ using System; using System.Text; namespace BloomFilter; internal static class StringSpanExtensions { public static ReadOnlyMemory ToUtf8(this ReadOnlySpan value) { #if NET6_0_OR_GREATER Memory bytes = new byte[Encoding.UTF8.GetByteCount(value)]; var bytesWritten = Encoding.UTF8.GetBytes(value, bytes.Span); return bytes.Slice(0, bytesWritten); #else var chars = value.ToArray(); var bytes = new byte[Encoding.UTF8.GetByteCount(chars)]; var bytesWritten = Encoding.UTF8.GetBytes(chars, 0, value.Length, bytes, 0); return new ReadOnlyMemory(bytes, 0, bytesWritten); #endif } public static ReadOnlyMemory FromUtf8(this ReadOnlySpan source) { #if NET6_0_OR_GREATER source = source.WithoutBom(); Memory chars = new char[Encoding.UTF8.GetCharCount(source)]; var charsWritten = Encoding.UTF8.GetChars(source, chars.Span); return chars.Slice(0, charsWritten); #else var bytes = source.WithoutBom().ToArray(); var chars = new char[Encoding.UTF8.GetCharCount(bytes)]; var charsWritten = Encoding.UTF8.GetChars(bytes, 0, bytes.Length, chars, 0); return new ReadOnlyMemory(chars, 0, charsWritten); #endif } public static byte[] ToUtf8Bytes(this ReadOnlySpan value) { return ToUtf8(value).ToArray(); } public static ReadOnlySpan WithoutBom(this ReadOnlySpan value) { return value.Length > 0 && value[0] == 65279 ? value.Slice(1) : value; } public static ReadOnlySpan WithoutBom(this ReadOnlySpan value) { return value.Length > 3 && value[0] == 0xEF && value[1] == 0xBB && value[2] == 0xBF ? value.Slice(3) : value; } } ================================================ FILE: src/BloomFilter.CSRedis/BloomFilter.CSRedis.csproj ================================================  BloomFilter.CSRedis BloomFilter.CSRedis BloomFilter.CSRedis.NetCore net462;netstandard2.0;net6.0;net7.0;net8.0;net9.0;net10.0 true true enable true $(NoWarn);CS1591 ================================================ FILE: src/BloomFilter.CSRedis/Configurations/FilterCSRedisOptions.cs ================================================ using BloomFilter.Configurations; using CSRedis; using System; using System.Collections.Generic; namespace BloomFilter.CSRedis.Configurations { public class FilterCSRedisOptions : FilterMemoryOptions { /// /// The Name /// public new string Name { get; set; } = BloomFilterConstValue.DefaultRedisName; /// /// The Redis Key /// public string RedisKey { get; set; } = "BloomFilter.Core"; /// /// Gets or sets the node rule. /// public Func? NodeRule { get; set; } /// /// Gets or sets the connection strings. /// public List? ConnectionStrings { get; set; } /// /// Gets or sets the sentinels settings. /// public List? Sentinels { get; set; } /// /// Gets or sets the read write setting for sentinel mode. /// public bool ReadOnly { get; set; } /// /// Shared CSRedisClient /// public CSRedisClient? Client { get; set; } } } ================================================ FILE: src/BloomFilter.CSRedis/Configurations/FilterCSRedisOptionsExtension.cs ================================================ using BloomFilter.Configurations; using CSRedis; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using System.Linq; using System; namespace BloomFilter.CSRedis.Configurations { public class FilterCSRedisOptionsExtension : IBloomFilterOptionsExtension { private readonly FilterCSRedisOptions _options; /// /// Initializes a new instance of the class. /// /// Configure. public FilterCSRedisOptionsExtension(FilterCSRedisOptions options) { _options = options; } public void AddServices(IServiceCollection services) { services.TryAddSingleton(); services.AddSingleton(x => { FilterCSRedis createFilter(CSRedisClient client) { return new FilterCSRedis( _options.Name, client, _options.RedisKey, _options.ExpectedElements, _options.ErrorRate, HashFunction.Functions[_options.Method]); } if (_options.Client != null) { return createFilter(_options.Client); } if (_options.ConnectionStrings == null || _options.ConnectionStrings.Count == 0) { throw new ArgumentException($"{nameof(FilterCSRedisOptions.ConnectionStrings)} is Empty!"); } if (_options.Sentinels != null && _options.Sentinels.Any()) { var redisClient = new CSRedisClient(_options.ConnectionStrings[0], _options.Sentinels.ToArray(), _options.ReadOnly); return createFilter(redisClient); } if (_options.ConnectionStrings.Count == 1) { var redisClient = new CSRedisClient(_options.ConnectionStrings[0]); return createFilter(redisClient); } else { if (_options.NodeRule == null) { throw new ArgumentNullException(nameof(FilterCSRedisOptions.NodeRule)); } var redisClient = new CSRedisClient(_options.NodeRule, _options.ConnectionStrings.ToArray()); return createFilter(redisClient); } }); } } } ================================================ FILE: src/BloomFilter.CSRedis/Configurations/ServiceCollectionExtensions.cs ================================================ using BloomFilter; using BloomFilter.Configurations; using BloomFilter.CSRedis.Configurations; using System; namespace Microsoft.Extensions.DependencyInjection { public static class ServiceCollectionExtensions { /// /// Uses the redis. /// /// Options. /// /// public static BloomFilterOptions UseCSRedis(this BloomFilterOptions options, string name = BloomFilterConstValue.DefaultRedisName, Action? setupActions = null) { var filterRedisOptions = new FilterCSRedisOptions { Name = name }; setupActions?.Invoke(filterRedisOptions); options.RegisterExtension(new FilterCSRedisOptionsExtension(filterRedisOptions)); return options; } /// /// Uses the redis. /// /// Options. /// public static BloomFilterOptions UseCSRedis(this BloomFilterOptions options, FilterCSRedisOptions filterRedisOptions) { if (filterRedisOptions == null) throw new ArgumentNullException(nameof(filterRedisOptions)); options.RegisterExtension(new FilterCSRedisOptionsExtension(filterRedisOptions)); return options; } } } ================================================ FILE: src/BloomFilter.CSRedis/FilterCSRedis.cs ================================================ using CSRedis; using System; using System.Linq; using System.Threading.Tasks; namespace BloomFilter.CSRedis; /// /// Bloom Filter Redis Implementation using CSRedisCore /// public class FilterCSRedis : FilterRedisBase { private readonly CSRedisClient _client; private readonly string _redisKey; /// /// Initializes a new instance of the class. /// /// /// The . /// The redisKey. /// The expected elements. /// The error rate. /// The hash function. public FilterCSRedis(string name, CSRedisClient client, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction) : base(name, expectedElements, errorRate, hashFunction) { if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey)); _client = client ?? throw new ArgumentNullException(nameof(client)); _redisKey = redisKey; } /// /// Initializes a new instance of the class. /// /// /// The . /// The redisKey. /// The capacity. /// The hashes. /// The hash function. public FilterCSRedis(string name, CSRedisClient client, string redisKey, long capacity, int hashes, HashFunction hashFunction) : base(name, capacity, hashes, hashFunction) { if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey)); _client = client ?? throw new ArgumentNullException(nameof(client)); _redisKey = redisKey; } // Implement abstract methods - CSRedis specific operations protected override bool SetBit(long position) => _client.SetBit(_redisKey, (uint)position, true); protected override bool GetBit(long position) => _client.GetBit(_redisKey, (uint)position); protected override async Task SetBitAsync(long position) => await _client.SetBitAsync(_redisKey, (uint)position, true); protected override async Task GetBitAsync(long position) => await _client.GetBitAsync(_redisKey, (uint)position); protected override bool[] SetBits(long[] positions) { // Use pipeline for batch execution using var pipe = _client.StartPipe(); for (int i = 0; i < positions.Length; i++) { pipe.SetBit(_redisKey, (uint)positions[i], true); } var pipeResults = pipe.EndPipe(); var results = new bool[positions.Length]; for (int i = 0; i < pipeResults.Length; i++) { results[i] = Convert.ToBoolean(pipeResults[i]); } return results; } protected override bool[] GetBits(long[] positions) { // Use pipeline for batch execution using var pipe = _client.StartPipe(); for (int i = 0; i < positions.Length; i++) { pipe.GetBit(_redisKey, (uint)positions[i]); } var pipeResults = pipe.EndPipe(); var results = new bool[positions.Length]; for (int i = 0; i < pipeResults.Length; i++) { results[i] = Convert.ToBoolean(pipeResults[i]); } return results; } protected override async Task SetBitsAsync(long[] positions) { // Execute all operations in parallel var tasks = new Task[positions.Length]; for (int i = 0; i < positions.Length; i++) { tasks[i] = _client.SetBitAsync(_redisKey, (uint)positions[i], true); } await Task.WhenAll(tasks).ConfigureAwait(false); var results = new bool[tasks.Length]; for (int i = 0; i < tasks.Length; i++) { results[i] = tasks[i].Result; } return results; } protected override async Task GetBitsAsync(long[] positions) { // Execute all operations in parallel var tasks = new Task[positions.Length]; for (int i = 0; i < positions.Length; i++) { tasks[i] = _client.GetBitAsync(_redisKey, (uint)positions[i]); } await Task.WhenAll(tasks).ConfigureAwait(false); var results = new bool[tasks.Length]; for (int i = 0; i < tasks.Length; i++) { results[i] = tasks[i].Result; } return results; } protected override void ClearBits() => _client.Del(_redisKey); protected override async Task ClearBitsAsync() => await _client.DelAsync(_redisKey); // Single element operations public override bool Add(ReadOnlySpan data) { var positions = ComputeHash(data); return SetBits(positions).Any(a => !a); } public override async ValueTask AddAsync(ReadOnlyMemory data) { var positions = ComputeHash(data.Span); var results = await SetBitsAsync(positions); return results.Any(a => !a); } public override bool Contains(ReadOnlySpan element) { var positions = ComputeHash(element); return GetBits(positions).All(a => a); } public override async ValueTask ContainsAsync(ReadOnlyMemory element) { var positions = ComputeHash(element.Span); var results = await GetBitsAsync(positions); return results.All(a => a); } public override void Dispose() { _client.Dispose(); } } ================================================ FILE: src/BloomFilter.CSRedis/FilterCSRedisBuilder.cs ================================================ using CSRedis; using System; namespace BloomFilter.CSRedis; /// /// BloomFilter CSRedis Builder - Supports both static factory methods and fluent API /// /// /// Fluent API: /// /// var filter = FilterCSRedisBuilder.Create() /// .WithRedisClient(csredisClient) /// .WithRedisKey("bloom:users") /// .WithName("UserFilter") /// .ExpectingElements(10_000_000) /// .WithErrorRate(0.001) /// .UsingHashMethod(HashMethod.XXHash3) /// .BuildCSRedis(); /// /// public class FilterCSRedisBuilder : FilterBuilder { #region Fluent API - Instance Members private string? _redisKey; private CSRedisClient? _client; /// /// Sets the Redis key for the Bloom Filter /// /// The Redis key /// The builder for method chaining /// Thrown when redisKey is null or whitespace public FilterCSRedisBuilder WithRedisKey(string redisKey) { if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException("Redis key cannot be null or whitespace", nameof(redisKey)); _redisKey = redisKey; return this; } /// /// Sets the CSRedis client /// /// The CSRedisClient instance /// The builder for method chaining /// Thrown when client is null public FilterCSRedisBuilder WithRedisClient(CSRedisClient client) { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(client); #else if (client == null) throw new ArgumentNullException(nameof(client)); #endif _client = client; return this; } /// /// Builds a CSRedis-backed Bloom Filter with the configured settings /// /// A new IBloomFilter instance backed by CSRedis /// Thrown when required configuration is missing public IBloomFilter BuildCSRedis() { if (string.IsNullOrWhiteSpace(_redisKey)) throw new InvalidOperationException("Redis key must be specified using WithRedisKey()"); if (_client == null) throw new InvalidOperationException("CSRedis client must be specified using WithRedisClient()"); // Get hash function from base class configuration var hashFunction = _customHashFunction ?? HashFunction.Functions[_method]; return new FilterCSRedis(_name, _client, _redisKey!, _expectedElements, _errorRate, hashFunction); } /// /// Builds a CSRedis-backed Bloom Filter with explicit capacity and hash count (advanced usage) /// /// The bit array capacity /// The number of hash functions /// A new IBloomFilter instance backed by CSRedis /// Thrown when required configuration is missing public IBloomFilter BuildCSRedisWithCapacity(long capacity, int hashes) { if (string.IsNullOrWhiteSpace(_redisKey)) throw new InvalidOperationException("Redis key must be specified using WithRedisKey()"); if (_client == null) throw new InvalidOperationException("CSRedis client must be specified using WithRedisClient()"); // Get hash function from base class configuration var hashFunction = _customHashFunction ?? HashFunction.Functions[_method]; return new FilterCSRedis(_name, _client, _redisKey!, capacity, hashes, hashFunction); } #endregion } ================================================ FILE: src/BloomFilter.EasyCaching/BloomFilter.EasyCaching.csproj ================================================  BloomFilter.EasyCaching BloomFilter.EasyCaching BloomFilter.EasyCaching.NetCore net462;netstandard2.0;net6.0;net7.0;net8.0;net9.0;net10.0 true true enable true $(NoWarn);CS1591 False ================================================ FILE: src/BloomFilter.EasyCaching/Configurations/FilterEasyCachingRedisExtension.cs ================================================ using BloomFilter.Configurations; using BloomFilter.EasyCaching; using EasyCaching.Core; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; namespace BloomFilter.CSRedis.Configurations { public class FilterEasyCachingRedisExtension : IBloomFilterOptionsExtension { private readonly FilterEasyCachingRedisOptions _options; /// /// Initializes a new instance of the class. /// /// Configure. public FilterEasyCachingRedisExtension(FilterEasyCachingRedisOptions options) { _options = options; } public void AddServices(IServiceCollection services) { services.TryAddSingleton(); services.AddSingleton(x => { var provider = x.GetRequiredService(); if (!string.IsNullOrWhiteSpace(_options.ProviderName)) { var factory = x.GetRequiredService(); provider = factory.GetRedisProvider(_options.ProviderName); } return new FilterEasyCachingRedis( _options.Name, provider, _options.RedisKey, _options.ExpectedElements, _options.ErrorRate, HashFunction.Functions[_options.Method]); }); } } } ================================================ FILE: src/BloomFilter.EasyCaching/Configurations/FilterEasyCachingRedisOptions.cs ================================================ using BloomFilter.Configurations; using EasyCaching.Core; namespace BloomFilter.CSRedis.Configurations { public class FilterEasyCachingRedisOptions : FilterMemoryOptions { /// /// The Name /// public new string Name { get; set; } = BloomFilterConstValue.DefaultRedisName; /// /// The Redis Key /// public string RedisKey { get; set; } = "BloomFilter.Core"; /// /// The Name /// public string? ProviderName { get; set; } } } ================================================ FILE: src/BloomFilter.EasyCaching/Configurations/ServiceCollectionExtensions.cs ================================================ using BloomFilter; using BloomFilter.Configurations; using BloomFilter.CSRedis.Configurations; using System; namespace Microsoft.Extensions.DependencyInjection { public static class ServiceCollectionExtensions { /// /// Uses the EasyCaching redis. /// /// Options. /// /// public static BloomFilterOptions UseEasyCachingRedis(this BloomFilterOptions options, string name = BloomFilterConstValue.DefaultRedisName, Action? setupActions = null) { var filterRedisOptions = new FilterEasyCachingRedisOptions { Name = name }; setupActions?.Invoke(filterRedisOptions); options.RegisterExtension(new FilterEasyCachingRedisExtension(filterRedisOptions)); return options; } /// /// Uses the EasyCaching redis. /// /// Options. /// public static BloomFilterOptions UseEasyCachingRedis(this BloomFilterOptions options, FilterEasyCachingRedisOptions filterRedisOptions) { if (filterRedisOptions == null) throw new ArgumentNullException(nameof(filterRedisOptions)); options.RegisterExtension(new FilterEasyCachingRedisExtension(filterRedisOptions)); return options; } } } ================================================ FILE: src/BloomFilter.EasyCaching/FilterEasyCachingBuilder.cs ================================================ using EasyCaching.Core; using System; namespace BloomFilter.EasyCaching; /// /// BloomFilter EasyCaching Builder - Supports both static factory methods and fluent API /// /// /// Fluent API: /// /// var filter = FilterEasyCachingBuilder.Create() /// .WithRedisCachingProvider(provider) /// .WithRedisKey("bloom:users") /// .WithName("UserFilter") /// .ExpectingElements(10_000_000) /// .WithErrorRate(0.001) /// .UsingHashMethod(HashMethod.XXHash3) /// .BuildEasyCaching(); /// /// public class FilterEasyCachingBuilder : FilterBuilder { #region Fluent API - Instance Members private string? _redisKey; private IRedisCachingProvider? _provider; /// /// Sets the Redis key for the Bloom Filter /// /// The Redis key /// The builder for method chaining /// Thrown when redisKey is null or whitespace public FilterEasyCachingBuilder WithRedisKey(string redisKey) { if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException("Redis key cannot be null or whitespace", nameof(redisKey)); _redisKey = redisKey; return this; } /// /// Sets the EasyCaching Redis caching provider /// /// The IRedisCachingProvider instance /// The builder for method chaining /// Thrown when provider is null public FilterEasyCachingBuilder WithRedisCachingProvider(IRedisCachingProvider provider) { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(provider); #else if (provider == null) throw new ArgumentNullException(nameof(provider)); #endif _provider = provider; return this; } /// /// Builds an EasyCaching-backed Bloom Filter with the configured settings /// /// A new IBloomFilter instance backed by EasyCaching /// Thrown when required configuration is missing public IBloomFilter BuildEasyCaching() { if (string.IsNullOrWhiteSpace(_redisKey)) throw new InvalidOperationException("Redis key must be specified using WithRedisKey()"); if (_provider == null) throw new InvalidOperationException("Redis caching provider must be specified using WithRedisCachingProvider()"); // Get hash function from base class configuration var hashFunction = _customHashFunction ?? HashFunction.Functions[_method]; return new FilterEasyCachingRedis(_name, _provider, _redisKey!, _expectedElements, _errorRate, hashFunction); } /// /// Builds an EasyCaching-backed Bloom Filter with explicit capacity and hash count (advanced usage) /// /// The bit array capacity /// The number of hash functions /// A new IBloomFilter instance backed by EasyCaching /// Thrown when required configuration is missing public IBloomFilter BuildEasyCachingWithCapacity(long capacity, int hashes) { if (string.IsNullOrWhiteSpace(_redisKey)) throw new InvalidOperationException("Redis key must be specified using WithRedisKey()"); if (_provider == null) throw new InvalidOperationException("Redis caching provider must be specified using WithRedisCachingProvider()"); // Get hash function from base class configuration var hashFunction = _customHashFunction ?? HashFunction.Functions[_method]; return new FilterEasyCachingRedis(_name, _provider, _redisKey!, capacity, hashes, hashFunction); } #endregion } ================================================ FILE: src/BloomFilter.EasyCaching/FilterEasyCachingRedis.cs ================================================ using EasyCaching.Core; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace BloomFilter.EasyCaching; /// /// Bloom Filter Redis Implementation using EasyCaching /// public class FilterEasyCachingRedis : FilterRedisBase { private readonly string _redisKey; private readonly IRedisCachingProvider _provider; /// /// Initializes a new instance of the class. /// /// /// The . /// The redisKey. /// The expected elements. /// The error rate. /// The hash function. public FilterEasyCachingRedis(string name, IRedisCachingProvider provider, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction) : base(name, expectedElements, errorRate, hashFunction) { if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey)); _provider = provider ?? throw new ArgumentNullException(nameof(provider)); _redisKey = redisKey; } /// /// Initializes a new instance of the class. /// /// /// The . /// The redisKey. /// The capacity. /// The hashes. /// The hash function. public FilterEasyCachingRedis(string name, IRedisCachingProvider provider, string redisKey, long capacity, int hashes, HashFunction hashFunction) : base(name, capacity, hashes, hashFunction) { if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey)); _provider = provider ?? throw new ArgumentNullException(nameof(provider)); _redisKey = redisKey; } // Implement abstract methods - EasyCaching specific operations protected override bool SetBit(long position) { var result = _provider.Eval("return redis.call('SETBIT', KEYS[1], ARGV[1], 1)", _redisKey, new object[] { position }.ToList()); return result.ToString() == "1"; } protected override bool GetBit(long position) { var result = _provider.Eval("return redis.call('GETBIT', KEYS[1], ARGV[1])", _redisKey, new object[] { position }.ToList()); return result.ToString() == "1"; } protected override async Task SetBitAsync(long position) { var result = await _provider.EvalAsync("return redis.call('SETBIT', KEYS[1], ARGV[1], 1)", _redisKey, new object[] { position }.ToList()).ConfigureAwait(false); return result.ToString() == "1"; } protected override async Task GetBitAsync(long position) { var result = await _provider.EvalAsync("return redis.call('GETBIT', KEYS[1], ARGV[1])", _redisKey, new object[] { position }.ToList()).ConfigureAwait(false); return result.ToString() == "1"; } protected override bool[] SetBits(long[] positions) { // Use Lua script for batch execution const string luaScript = @" local results = {} for i, pos in ipairs(ARGV) do results[i] = redis.call('SETBIT', KEYS[1], pos, 1) end return results"; var result = _provider.Eval(luaScript, _redisKey, positions.Cast().ToList()); if (result is object[] resultArray) { var results = new bool[resultArray.Length]; for (int i = 0; i < resultArray.Length; i++) { results[i] = resultArray[i].ToString() == "1"; } return results; } // Fallback: if Lua script fails, use sequential execution var fallbackResults = new bool[positions.Length]; for (int i = 0; i < positions.Length; i++) { var singleResult = _provider.Eval("return redis.call('SETBIT', KEYS[1], ARGV[1], 1)", _redisKey, new object[] { positions[i] }.ToList()); fallbackResults[i] = singleResult.ToString() == "1"; } return fallbackResults; } protected override bool[] GetBits(long[] positions) { // Use Lua script for batch execution const string luaScript = @" local results = {} for i, pos in ipairs(ARGV) do results[i] = redis.call('GETBIT', KEYS[1], pos) end return results"; var result = _provider.Eval(luaScript, _redisKey, positions.Cast().ToList()); if (result is object[] resultArray) { var results = new bool[resultArray.Length]; for (int i = 0; i < resultArray.Length; i++) { results[i] = resultArray[i].ToString() == "1"; } return results; } // Fallback: if Lua script fails, use sequential execution var fallbackResults = new bool[positions.Length]; for (int i = 0; i < positions.Length; i++) { var singleResult = _provider.Eval("return redis.call('GETBIT', KEYS[1], ARGV[1])", _redisKey, new object[] { positions[i] }.ToList()); fallbackResults[i] = singleResult.ToString() == "1"; } return fallbackResults; } protected override async Task SetBitsAsync(long[] positions) { // Use Lua script for batch execution const string luaScript = @" local results = {} for i, pos in ipairs(ARGV) do results[i] = redis.call('SETBIT', KEYS[1], pos, 1) end return results"; var result = await _provider.EvalAsync(luaScript, _redisKey, positions.Cast().ToList()).ConfigureAwait(false); if (result is object[] resultArray) { var results = new bool[resultArray.Length]; for (int i = 0; i < resultArray.Length; i++) { results[i] = resultArray[i].ToString() == "1"; } return results; } // Fallback: if Lua script fails, use parallel execution var tasks = new Task[positions.Length]; for (int i = 0; i < positions.Length; i++) { tasks[i] = _provider.EvalAsync("return redis.call('SETBIT', KEYS[1], ARGV[1], 1)", _redisKey, new object[] { positions[i] }.ToList()); } await Task.WhenAll(tasks).ConfigureAwait(false); var fallbackResults = new bool[tasks.Length]; for (int i = 0; i < tasks.Length; i++) { fallbackResults[i] = tasks[i].Result.ToString() == "1"; } return fallbackResults; } protected override async Task GetBitsAsync(long[] positions) { // Use Lua script for batch execution const string luaScript = @" local results = {} for i, pos in ipairs(ARGV) do results[i] = redis.call('GETBIT', KEYS[1], pos) end return results"; var result = await _provider.EvalAsync(luaScript, _redisKey, positions.Cast().ToList()).ConfigureAwait(false); if (result is object[] resultArray) { var results = new bool[resultArray.Length]; for (int i = 0; i < resultArray.Length; i++) { results[i] = resultArray[i].ToString() == "1"; } return results; } // Fallback: if Lua script fails, use parallel execution var tasks = new Task[positions.Length]; for (int i = 0; i < positions.Length; i++) { tasks[i] = _provider.EvalAsync("return redis.call('GETBIT', KEYS[1], ARGV[1])", _redisKey, new object[] { positions[i] }.ToList()); } await Task.WhenAll(tasks).ConfigureAwait(false); var fallbackResults = new bool[tasks.Length]; for (int i = 0; i < tasks.Length; i++) { fallbackResults[i] = tasks[i].Result.ToString() == "1"; } return fallbackResults; } protected override void ClearBits() => _provider.KeyDel(_redisKey); protected override async Task ClearBitsAsync() => await _provider.KeyDelAsync(_redisKey); // Single element operations public override bool Add(ReadOnlySpan element) { var positions = ComputeHash(element); return SetBits(positions).Any(a => !a); } public override async ValueTask AddAsync(ReadOnlyMemory data) { var positions = ComputeHash(data.Span); var results = await SetBitsAsync(positions); return results.Any(a => !a); } public override bool Contains(ReadOnlySpan element) { var positions = ComputeHash(element); return GetBits(positions).All(a => a); } public override async ValueTask ContainsAsync(ReadOnlyMemory element) { var positions = ComputeHash(element.Span); var results = await GetBitsAsync(positions); return results.All(a => a); } public override void Dispose() { } } ================================================ FILE: src/BloomFilter.FreeRedis/BloomFilter.FreeRedis.csproj ================================================  BloomFilter.FreeRedis BloomFilter.FreeRedis BloomFilter.FreeRedis.NetCore net462;netstandard2.0;net6.0;net7.0;net8.0;net9.0;net10.0 true true enable true $(NoWarn);CS1591 ================================================ FILE: src/BloomFilter.FreeRedis/Configurations/FilterFreeRedisOptions.cs ================================================ using BloomFilter.Configurations; using FreeRedis; using System; using System.Collections.Generic; namespace BloomFilter.FreeRedis.Configurations { public class FilterFreeRedisOptions : FilterMemoryOptions { /// /// The Name /// public new string Name { get; set; } = BloomFilterConstValue.DefaultRedisName; /// /// The Redis Key /// public string RedisKey { get; set; } = "BloomFilter.Core"; /// /// Gets or sets the connection strings. /// public List? ConnectionStrings { get; set; } /// /// Gets or sets the sentinels settings. /// public List? Sentinels { get; set; } /// /// Gets or sets the read write setting for sentinel mode. /// public bool ReadOnly { get; set; } /// /// Shared CSRedisClient /// public RedisClient? Client { get; set; } } } ================================================ FILE: src/BloomFilter.FreeRedis/Configurations/FilterFreeRedisOptionsExtension.cs ================================================ using BloomFilter.Configurations; using FreeRedis; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using System; using System.Linq; namespace BloomFilter.FreeRedis.Configurations { public class FilterFreeRedisOptionsExtension : IBloomFilterOptionsExtension { private readonly FilterFreeRedisOptions _options; /// /// Initializes a new instance of the class. /// /// Configure. public FilterFreeRedisOptionsExtension(FilterFreeRedisOptions options) { _options = options; } public void AddServices(IServiceCollection services) { services.TryAddSingleton(); services.AddSingleton(x => { FilterFreeRedis createFilter(RedisClient client) { return new FilterFreeRedis( _options.Name, client, _options.RedisKey, _options.ExpectedElements, _options.ErrorRate, HashFunction.Functions[_options.Method]); } if (_options.Client != null) { return createFilter(_options.Client); } if (_options.ConnectionStrings == null || _options.ConnectionStrings.Count == 0) { throw new ArgumentException($"{nameof(FilterFreeRedisOptions.ConnectionStrings)} is Empty!"); } if (_options.Sentinels != null && _options.Sentinels.Any()) { var redisClient = new RedisClient(_options.ConnectionStrings[0], _options.Sentinels.ToArray(), _options.ReadOnly); return createFilter(redisClient); } if (_options.ConnectionStrings.Count == 1) { var redisClient = new RedisClient(_options.ConnectionStrings[0]); return createFilter(redisClient); } else { var redisClient = new RedisClient(_options.ConnectionStrings.Select(a => (ConnectionStringBuilder)a).ToArray()); return createFilter(redisClient); } }); } } } ================================================ FILE: src/BloomFilter.FreeRedis/Configurations/ServiceCollectionExtensions.cs ================================================ using BloomFilter; using BloomFilter.Configurations; using BloomFilter.FreeRedis.Configurations; using System; namespace Microsoft.Extensions.DependencyInjection { public static class ServiceCollectionExtensions { /// /// Uses the redis. /// /// Options. /// /// public static BloomFilterOptions UseFreeRedis(this BloomFilterOptions options, string name = BloomFilterConstValue.DefaultRedisName, Action? setupActions = null) { var filterRedisOptions = new FilterFreeRedisOptions { Name = name }; setupActions?.Invoke(filterRedisOptions); options.RegisterExtension(new FilterFreeRedisOptionsExtension(filterRedisOptions)); return options; } /// /// Uses the redis. /// /// Options. /// public static BloomFilterOptions UseFreeRedis(this BloomFilterOptions options, FilterFreeRedisOptions filterRedisOptions) { if (filterRedisOptions == null) throw new ArgumentNullException(nameof(filterRedisOptions)); options.RegisterExtension(new FilterFreeRedisOptionsExtension(filterRedisOptions)); return options; } } } ================================================ FILE: src/BloomFilter.FreeRedis/FilterFreeRedis.cs ================================================ using FreeRedis; using System; using System.Linq; using System.Threading.Tasks; namespace BloomFilter.FreeRedis; /// /// Bloom Filter Redis Implementation using FreeRedis /// public class FilterFreeRedis : FilterRedisBase { private readonly RedisClient _client; private readonly string _redisKey; /// /// Initializes a new instance of the class. /// /// /// The . /// The redisKey. /// The expected elements. /// The error rate. /// The hash function. public FilterFreeRedis(string name, RedisClient client, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction) : base(name, expectedElements, errorRate, hashFunction) { if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey)); _client = client ?? throw new ArgumentNullException(nameof(client)); _redisKey = redisKey; } /// /// Initializes a new instance of the class. /// /// /// The . /// The redisKey. /// The capacity. /// The hashes. /// The hash function. public FilterFreeRedis(string name, RedisClient client, string redisKey, long capacity, int hashes, HashFunction hashFunction) : base(name, capacity, hashes, hashFunction) { if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey)); _client = client ?? throw new ArgumentNullException(nameof(client)); _redisKey = redisKey; } // Implement abstract methods - FreeRedis specific operations protected override bool SetBit(long position) => _client.SetBit(_redisKey, position, true) == 1; protected override bool GetBit(long position) => _client.GetBit(_redisKey, position); protected override async Task SetBitAsync(long position) => await _client.SetBitAsync(_redisKey, position, true) == 1; protected override async Task GetBitAsync(long position) => await _client.GetBitAsync(_redisKey, position); protected override bool[] SetBits(long[] positions) { // Use pipeline for batch execution using var pipe = _client.StartPipe(); for (int i = 0; i < positions.Length; i++) { pipe.SetBit(_redisKey, positions[i], true); } var pipeResults = pipe.EndPipe(); var results = new bool[positions.Length]; for (int i = 0; i < pipeResults.Length; i++) { results[i] = Convert.ToInt64(pipeResults[i]) == 1; } return results; } protected override bool[] GetBits(long[] positions) { // Use pipeline for batch execution using var pipe = _client.StartPipe(); for (int i = 0; i < positions.Length; i++) { pipe.GetBit(_redisKey, positions[i]); } var pipeResults = pipe.EndPipe(); var results = new bool[positions.Length]; for (int i = 0; i < pipeResults.Length; i++) { results[i] = Convert.ToBoolean(pipeResults[i]); } return results; } protected override async Task SetBitsAsync(long[] positions) { // Execute all operations in parallel var tasks = new Task[positions.Length]; for (int i = 0; i < positions.Length; i++) { tasks[i] = _client.SetBitAsync(_redisKey, positions[i], true); } await Task.WhenAll(tasks).ConfigureAwait(false); var results = new bool[tasks.Length]; for (int i = 0; i < tasks.Length; i++) { results[i] = tasks[i].Result == 1; } return results; } protected override async Task GetBitsAsync(long[] positions) { // Execute all operations in parallel var tasks = new Task[positions.Length]; for (int i = 0; i < positions.Length; i++) { tasks[i] = _client.GetBitAsync(_redisKey, positions[i]); } await Task.WhenAll(tasks).ConfigureAwait(false); var results = new bool[tasks.Length]; for (int i = 0; i < tasks.Length; i++) { results[i] = tasks[i].Result; } return results; } protected override void ClearBits() => _client.Del(_redisKey); protected override async Task ClearBitsAsync() => await _client.DelAsync(_redisKey); // Single element operations public override bool Add(ReadOnlySpan data) { var positions = ComputeHash(data); return SetBits(positions).Any(a => !a); } public override async ValueTask AddAsync(ReadOnlyMemory data) { var positions = ComputeHash(data.Span); var results = await SetBitsAsync(positions); return results.Any(a => !a); } public override bool Contains(ReadOnlySpan element) { var positions = ComputeHash(element); return GetBits(positions).All(a => a); } public override async ValueTask ContainsAsync(ReadOnlyMemory element) { var positions = ComputeHash(element.Span); var results = await GetBitsAsync(positions); return results.All(a => a); } public override void Dispose() { _client.Dispose(); } } ================================================ FILE: src/BloomFilter.FreeRedis/FilterFreeRedisBuilder.cs ================================================ using FreeRedis; using System; namespace BloomFilter.FreeRedis; /// /// BloomFilter FreeRedis Builder - Supports both static factory methods and fluent API /// /// /// Fluent API: /// /// var filter = FilterFreeRedisBuilder.Create() /// .WithRedisClient(redisClient) /// .WithRedisKey("bloom:users") /// .WithName("UserFilter") /// .ExpectingElements(10_000_000) /// .WithErrorRate(0.001) /// .UsingHashMethod(HashMethod.XXHash3) /// .BuildFreeRedis(); /// /// public class FilterFreeRedisBuilder : FilterBuilder { #region Fluent API - Instance Members private string? _redisKey; private RedisClient? _client; /// /// Sets the Redis key for the Bloom Filter /// /// The Redis key /// The builder for method chaining /// Thrown when redisKey is null or whitespace public FilterFreeRedisBuilder WithRedisKey(string redisKey) { if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException("Redis key cannot be null or whitespace", nameof(redisKey)); _redisKey = redisKey; return this; } /// /// Sets the FreeRedis client /// /// The RedisClient instance /// The builder for method chaining /// Thrown when client is null public FilterFreeRedisBuilder WithRedisClient(RedisClient client) { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(client); #else if (client == null) throw new ArgumentNullException(nameof(client)); #endif _client = client; return this; } /// /// Builds a FreeRedis-backed Bloom Filter with the configured settings /// /// A new IBloomFilter instance backed by FreeRedis /// Thrown when required configuration is missing public IBloomFilter BuildFreeRedis() { if (string.IsNullOrWhiteSpace(_redisKey)) throw new InvalidOperationException("Redis key must be specified using WithRedisKey()"); if (_client == null) throw new InvalidOperationException("FreeRedis client must be specified using WithRedisClient()"); // Get hash function from base class configuration var hashFunction = _customHashFunction ?? HashFunction.Functions[_method]; return new FilterFreeRedis(_name, _client, _redisKey!, _expectedElements, _errorRate, hashFunction); } /// /// Builds a FreeRedis-backed Bloom Filter with explicit capacity and hash count (advanced usage) /// /// The bit array capacity /// The number of hash functions /// A new IBloomFilter instance backed by FreeRedis /// Thrown when required configuration is missing public IBloomFilter BuildFreeRedisWithCapacity(long capacity, int hashes) { if (string.IsNullOrWhiteSpace(_redisKey)) throw new InvalidOperationException("Redis key must be specified using WithRedisKey()"); if (_client == null) throw new InvalidOperationException("FreeRedis client must be specified using WithRedisClient()"); // Get hash function from base class configuration var hashFunction = _customHashFunction ?? HashFunction.Functions[_method]; return new FilterFreeRedis(_name, _client, _redisKey!, capacity, hashes, hashFunction); } #endregion } ================================================ FILE: src/BloomFilter.Redis/BloomFilter.Redis.csproj ================================================  BloomFilter.Redis BloomFilter.Redis BloomFilter.Redis.NetCore net462;netstandard2.0;net6.0;net7.0;net8.0;net9.0;net10.0 true true enable true $(NoWarn);CS1591 ================================================ FILE: src/BloomFilter.Redis/Configurations/FilterRedisOptions.cs ================================================ using BloomFilter.Configurations; using StackExchange.Redis; using System.Collections.Generic; namespace BloomFilter.Redis.Configurations { public class FilterRedisOptions : FilterMemoryOptions { /// /// The Name /// public new string Name { get; set; } = BloomFilterConstValue.DefaultRedisName; /// /// The Redis Key /// public string RedisKey { get; set; } = "BloomFilter.Core"; /// /// Gets or sets the Redis database index the cache will use. /// public int Database { get; set; } = 0; /// /// Gets or sets the username to be used to connect to the Redis server. /// public string? Username { get; set; } /// /// Gets or sets the password to be used to connect to the Redis server. /// public string? Password { get; set; } /// /// Gets or sets a value indicating whether to use SSL encryption. /// public bool IsSsl { get; set; } = false; /// /// Gets or sets the SSL Host. /// If set, it will enforce this particular host on the server's certificate. /// public string? SslHost { get; set; } /// /// Gets or sets the timeout for any connect operations. /// public int ConnectionTimeout { get; set; } = 5_000; /// /// Gets the list of endpoints to be used to connect to the Redis server. /// see: IP:Port /// public IList Endpoints { get; set; } = new List(); /// /// Gets or sets a value indicating whether this FilterRedisOptions /// allow admin. /// public bool AllowAdmin { get; set; } = false; /// /// Gets or sets the string configuration. /// public string? Configuration { get; set; } /// /// Shared IConnectionMultiplexer /// public IConnectionMultiplexer? Connection { get; set; } /// /// Gets or sets a value indicating whether this FilterRedisOptions /// abort on connect fail. /// public bool AbortOnConnectFail { get; set; } = false; } } ================================================ FILE: src/BloomFilter.Redis/Configurations/FilterRedisOptionsExtension.cs ================================================ using BloomFilter.Configurations; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using StackExchange.Redis; namespace BloomFilter.Redis.Configurations { public class FilterRedisOptionsExtension : IBloomFilterOptionsExtension { private readonly FilterRedisOptions _options; /// /// Initializes a new instance of the class. /// /// Configure. public FilterRedisOptionsExtension(FilterRedisOptions options) { _options = options; } public void AddServices(IServiceCollection services) { services.TryAddSingleton(); services.AddSingleton(x => { IRedisBitOperate redisBitOperate; if (_options.Connection != null) { redisBitOperate = new RedisBitOperate(_options.Connection); } else if (!string.IsNullOrWhiteSpace(_options.Configuration)) { redisBitOperate = new RedisBitOperate(_options.Configuration!); } else { var configurationOptions = new ConfigurationOptions { ConnectTimeout = _options.ConnectionTimeout, User = _options.Username, Password = _options.Password, Ssl = _options.IsSsl, SslHost = _options.SslHost, AllowAdmin = _options.AllowAdmin, DefaultDatabase = _options.Database, AbortOnConnectFail = _options.AbortOnConnectFail, }; foreach (var endpoint in _options.Endpoints) { configurationOptions.EndPoints.Add(endpoint); } redisBitOperate = new RedisBitOperate(configurationOptions); } return new FilterRedis( _options.Name, redisBitOperate, _options.RedisKey, _options.ExpectedElements, _options.ErrorRate, HashFunction.Functions[_options.Method]); }); } } } ================================================ FILE: src/BloomFilter.Redis/Configurations/ServiceCollectionExtensions.cs ================================================ using BloomFilter; using BloomFilter.Configurations; using BloomFilter.Redis.Configurations; using System; namespace Microsoft.Extensions.DependencyInjection { public static class ServiceCollectionExtensions { /// /// Uses the redis. /// /// Options. /// /// public static BloomFilterOptions UseRedis(this BloomFilterOptions options, string name = BloomFilterConstValue.DefaultRedisName, Action? setupActions = null) { var filterRedisOptions = new FilterRedisOptions { Name = name }; setupActions?.Invoke(filterRedisOptions); options.RegisterExtension(new FilterRedisOptionsExtension(filterRedisOptions)); return options; } /// /// Uses the redis. /// /// Options. /// public static BloomFilterOptions UseRedis(this BloomFilterOptions options, FilterRedisOptions filterRedisOptions) { if (filterRedisOptions == null) throw new ArgumentNullException(nameof(filterRedisOptions)); options.RegisterExtension(new FilterRedisOptionsExtension(filterRedisOptions)); return options; } } } ================================================ FILE: src/BloomFilter.Redis/FilterRedis.cs ================================================ using System; using System.Linq; using System.Threading.Tasks; namespace BloomFilter.Redis; /// /// Bloom Filter Redis Implementation using StackExchange.Redis /// public class FilterRedis : FilterRedisBase { private readonly IRedisBitOperate _redisBitOperate; private readonly string _redisKey; /// /// Initializes a new instance of the class. /// /// /// The redis bit operate. /// The redisKey. /// The expected elements. /// The error rate. /// The hash function. public FilterRedis(string name, IRedisBitOperate redisBitOperate, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction) : base(name, expectedElements, errorRate, hashFunction) { if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey)); _redisBitOperate = redisBitOperate ?? throw new ArgumentNullException(nameof(redisBitOperate)); _redisKey = redisKey; } /// /// Initializes a new instance of the class. /// /// /// The redis bit operate. /// The redisKey. /// The capacity. /// The hashes. /// The hash function. public FilterRedis(string name, IRedisBitOperate redisBitOperate, string redisKey, long capacity, int hashes, HashFunction hashFunction) : base(name, capacity, hashes, hashFunction) { if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException(nameof(redisKey)); _redisBitOperate = redisBitOperate ?? throw new ArgumentNullException(nameof(redisBitOperate)); _redisKey = redisKey; } // Implement abstract methods - StackExchange.Redis specific operations protected override bool SetBit(long position) => _redisBitOperate.Set(_redisKey, position, true); protected override bool GetBit(long position) => _redisBitOperate.Get(_redisKey, position); protected override async Task SetBitAsync(long position) => await _redisBitOperate.SetAsync(_redisKey, position, true); protected override async Task GetBitAsync(long position) => await _redisBitOperate.GetAsync(_redisKey, position); protected override bool[] SetBits(long[] positions) => _redisBitOperate.Set(_redisKey, positions, true); protected override bool[] GetBits(long[] positions) => _redisBitOperate.Get(_redisKey, positions); protected override async Task SetBitsAsync(long[] positions) => await _redisBitOperate.SetAsync(_redisKey, positions, true); protected override async Task GetBitsAsync(long[] positions) => await _redisBitOperate.GetAsync(_redisKey, positions); protected override void ClearBits() => _redisBitOperate.Clear(_redisKey); protected override async Task ClearBitsAsync() => await _redisBitOperate.ClearAsync(_redisKey); // Single element operations (not part of base class - keep existing implementation) /// /// Adds the passed value to the filter. /// /// /// public override bool Add(ReadOnlySpan data) { var positions = ComputeHash(data); var results = _redisBitOperate.Set(_redisKey, positions, true); return results.Any(a => !a); } public override async ValueTask AddAsync(ReadOnlyMemory data) { var positions = ComputeHash(data.Span); var results = await _redisBitOperate.SetAsync(_redisKey, positions, true); return results.Any(a => !a); } /// /// Tests whether an element is present in the filter /// /// /// public override bool Contains(ReadOnlySpan element) { var positions = ComputeHash(element); var results = _redisBitOperate.Get(_redisKey, positions); return results.All(a => a); } public override async ValueTask ContainsAsync(ReadOnlyMemory element) { var positions = ComputeHash(element.Span); var results = await _redisBitOperate.GetAsync(_redisKey, positions); return results.All(a => a); } public override void Dispose() { _redisBitOperate.Dispose(); } } ================================================ FILE: src/BloomFilter.Redis/FilterRedisBuilder.cs ================================================ using StackExchange.Redis; using System; namespace BloomFilter.Redis; /// /// BloomFilter Redis Builder - Supports both static factory methods and fluent API /// /// /// Static API: /// /// var filter = FilterRedisBuilder.Build(connectionString, "bloom:users", 10_000_000, 0.001); /// /// /// Fluent API: /// /// var filter = FilterRedisBuilder.Create() /// .WithRedisConnection(connectionString) /// .WithRedisKey("bloom:users") /// .WithName("UserFilter") /// .ExpectingElements(10_000_000) /// .WithErrorRate(0.001) /// .UsingHashMethod(HashMethod.XXHash3) /// .BuildRedis(); /// /// public class FilterRedisBuilder : FilterBuilder { #region Fluent API - Instance Members private string? _redisKey; private IRedisBitOperate? _redisBitOperate; private string? _connectionString; private ConfigurationOptions? _configurationOptions; private IConnectionMultiplexer? _connectionMultiplexer; /// /// Sets the Redis key for the Bloom Filter /// /// The Redis key /// The builder for method chaining /// Thrown when redisKey is null or whitespace public FilterRedisBuilder WithRedisKey(string redisKey) { if (string.IsNullOrWhiteSpace(redisKey)) throw new ArgumentException("Redis key cannot be null or whitespace", nameof(redisKey)); _redisKey = redisKey; return this; } /// /// Sets the Redis connection using a connection string /// /// The Redis connection string /// The builder for method chaining /// Thrown when connectionString is null or whitespace public FilterRedisBuilder WithRedisConnection(string connectionString) { if (string.IsNullOrWhiteSpace(connectionString)) throw new ArgumentException("Connection string cannot be null or whitespace", nameof(connectionString)); _connectionString = connectionString; _configurationOptions = null; _connectionMultiplexer = null; _redisBitOperate = null; return this; } /// /// Sets the Redis connection using ConfigurationOptions /// /// The Redis configuration options /// The builder for method chaining /// Thrown when options is null public FilterRedisBuilder WithRedisConnection(ConfigurationOptions options) { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(options); #else if (options == null) throw new ArgumentNullException(nameof(options)); #endif _configurationOptions = options; _connectionString = null; _connectionMultiplexer = null; _redisBitOperate = null; return this; } /// /// Sets the Redis connection using an existing IConnectionMultiplexer /// /// The Redis connection multiplexer /// The builder for method chaining /// Thrown when connection is null public FilterRedisBuilder WithRedisConnection(IConnectionMultiplexer connection) { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(connection); #else if (connection == null) throw new ArgumentNullException(nameof(connection)); #endif _connectionMultiplexer = connection; _connectionString = null; _configurationOptions = null; _redisBitOperate = null; return this; } /// /// Sets a custom IRedisBitOperate implementation /// /// The Redis bit operate implementation /// The builder for method chaining /// Thrown when redisBitOperate is null public FilterRedisBuilder WithRedisBitOperate(IRedisBitOperate redisBitOperate) { #if NET6_0_OR_GREATER ArgumentNullException.ThrowIfNull(redisBitOperate); #else if (redisBitOperate == null) throw new ArgumentNullException(nameof(redisBitOperate)); #endif _redisBitOperate = redisBitOperate; _connectionString = null; _configurationOptions = null; _connectionMultiplexer = null; return this; } /// /// Builds a Redis-backed Bloom Filter with the configured settings /// /// A new IBloomFilter instance backed by Redis /// Thrown when required configuration is missing public IBloomFilter BuildRedis() { if (string.IsNullOrWhiteSpace(_redisKey)) throw new InvalidOperationException("Redis key must be specified using WithRedisKey()"); // Get hash function from base class configuration var hashFunction = _customHashFunction ?? HashFunction.Functions[_method]; // Determine Redis bit operate instance IRedisBitOperate bitOperate; if (_redisBitOperate != null) { bitOperate = _redisBitOperate; } else if (_connectionMultiplexer != null) { bitOperate = new RedisBitOperate(_connectionMultiplexer); } else if (_configurationOptions != null) { bitOperate = new RedisBitOperate(_configurationOptions); } else if (!string.IsNullOrWhiteSpace(_connectionString)) { bitOperate = new RedisBitOperate(_connectionString!); } else { throw new InvalidOperationException("Redis connection must be specified using WithRedisConnection() or WithRedisBitOperate()"); } return new FilterRedis(_name, bitOperate, _redisKey!, _expectedElements, _errorRate, hashFunction); } /// /// Builds a Redis-backed Bloom Filter with explicit capacity and hash count (advanced usage) /// /// The bit array capacity /// The number of hash functions /// A new IBloomFilter instance backed by Redis /// Thrown when required configuration is missing public IBloomFilter BuildRedisWithCapacity(long capacity, int hashes) { if (string.IsNullOrWhiteSpace(_redisKey)) throw new InvalidOperationException("Redis key must be specified using WithRedisKey()"); // Get hash function from base class configuration var hashFunction = _customHashFunction ?? HashFunction.Functions[_method]; // Determine Redis bit operate instance IRedisBitOperate bitOperate; if (_redisBitOperate != null) { bitOperate = _redisBitOperate; } else if (_connectionMultiplexer != null) { bitOperate = new RedisBitOperate(_connectionMultiplexer); } else if (_configurationOptions != null) { bitOperate = new RedisBitOperate(_configurationOptions); } else if (!string.IsNullOrWhiteSpace(_connectionString)) { bitOperate = new RedisBitOperate(_connectionString!); } else { throw new InvalidOperationException("Redis connection must be specified using WithRedisConnection() or WithRedisBitOperate()"); } return new FilterRedis(_name, bitOperate, _redisKey!, capacity, hashes, hashFunction); } #endregion #region Static Factory Methods (Legacy API - Backward Compatible) /// /// Creates a BloomFilter Redis for the specified expected element /// /// The configuration. /// The redis key. /// The expected elements. /// /// public static IBloomFilter Build(string configuration, string redisKey, long expectedElements, string name = BloomFilterConstValue.DefaultRedisName) { return Build(configuration, redisKey, expectedElements, 0.01, name); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The configuration. /// The redis key. /// The expected elements. /// The hash method. /// /// public static IBloomFilter Build(string configuration, string redisKey, long expectedElements, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName) { return Build(configuration, redisKey, expectedElements, 0.01, hashMethod, name); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The configuration. /// The redis key. /// The expected elements. /// The hash function. /// /// public static IBloomFilter Build(string configuration, string redisKey, long expectedElements, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName) { return Build(configuration, redisKey, expectedElements, 0.01, hashFunction, name); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The configuration. /// The redis key. /// The expected elements. /// The error rate. /// /// public static IBloomFilter Build(string configuration, string redisKey, long expectedElements, double errorRate, string name = BloomFilterConstValue.DefaultRedisName) { return Build(configuration, redisKey, expectedElements, errorRate, HashFunction.Functions[HashMethod.Murmur3], name); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The configuration. /// The redis key. /// The expected elements. /// The error rate. /// The hash method. /// /// public static IBloomFilter Build(string configuration, string redisKey, long expectedElements, double errorRate, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName) { return new FilterRedis(name, new RedisBitOperate(configuration), redisKey, expectedElements, errorRate, HashFunction.Functions[hashMethod]); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The configuration. /// The redis key. /// The expected elements. /// The error rate. /// The hash function. /// /// public static IBloomFilter Build(string configuration, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName) { return new FilterRedis(name, new RedisBitOperate(configuration), redisKey, expectedElements, errorRate, hashFunction); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The configuration. /// The redis key. /// The expected elements. /// /// public static IBloomFilter Build(ConfigurationOptions configuration, string redisKey, long expectedElements, string name = BloomFilterConstValue.DefaultRedisName) { return Build(configuration, redisKey, expectedElements, 0.01, name); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The configuration. /// The redis key. /// The expected elements. /// The hash method. /// /// public static IBloomFilter Build(ConfigurationOptions configuration, string redisKey, long expectedElements, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName) { return Build(configuration, redisKey, expectedElements, 0.01, hashMethod, name); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The configuration. /// The redis key. /// The expected elements. /// The hash function. /// /// public static IBloomFilter Build(ConfigurationOptions configuration, string redisKey, long expectedElements, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName) { return Build(configuration, redisKey, expectedElements, 0.01, hashFunction, name); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The configuration. /// The redis key. /// The expected elements. /// The error rate. /// /// public static IBloomFilter Build(ConfigurationOptions configuration, string redisKey, long expectedElements, double errorRate, string name = BloomFilterConstValue.DefaultRedisName) { return Build(configuration, redisKey, expectedElements, errorRate, HashFunction.Functions[HashMethod.Murmur3], name); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The configuration. /// The redis key. /// The expected elements. /// The error rate. /// The hash method. /// /// public static IBloomFilter Build(ConfigurationOptions configuration, string redisKey, long expectedElements, double errorRate, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName) { return new FilterRedis(name, new RedisBitOperate(configuration), redisKey, expectedElements, errorRate, HashFunction.Functions[hashMethod]); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The configuration. /// The redis key. /// The expected elements. /// The error rate. /// The hash function. /// /// public static IBloomFilter Build(ConfigurationOptions configuration, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName) { return new FilterRedis(name, new RedisBitOperate(configuration), redisKey, expectedElements, errorRate, hashFunction); } /// /// Builds the specified connection. /// /// The connection. /// The redis key. /// The expected elements. /// The hash method. /// /// public static IBloomFilter Build(IConnectionMultiplexer connection, string redisKey, long expectedElements, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName) { return Build(connection, redisKey, expectedElements, 0.01, hashMethod, name); } /// /// Builds the specified connectionn. /// /// The connectionn. /// The redis key. /// The expected elements. /// The hash function. /// /// public static IBloomFilter Build(IConnectionMultiplexer connectionn, string redisKey, long expectedElements, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName) { return Build(connectionn, redisKey, expectedElements, 0.01, hashFunction, name); } /// /// Builds the specified connection. /// /// The connection. /// The redis key. /// The expected elements. /// The error rate. /// /// public static IBloomFilter Build(IConnectionMultiplexer connection, string redisKey, long expectedElements, double errorRate, string name = BloomFilterConstValue.DefaultRedisName) { return Build(connection, redisKey, expectedElements, errorRate, HashFunction.Functions[HashMethod.Murmur3], name); } /// /// Builds the specified connection. /// /// The connection. /// The redis key. /// The expected elements. /// /// public static IBloomFilter Build(IConnectionMultiplexer connection, string redisKey, long expectedElements, string name = BloomFilterConstValue.DefaultRedisName) { return Build(connection, redisKey, expectedElements, 0.01, HashFunction.Functions[HashMethod.Murmur3], name); } /// /// Builds the specified connection. /// /// The connection. /// The redis key. /// The expected elements. /// The error rate. /// The hash method. /// /// public static IBloomFilter Build(IConnectionMultiplexer connection, string redisKey, long expectedElements, double errorRate, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName) { return new FilterRedis(name, new RedisBitOperate(connection), redisKey, expectedElements, errorRate, HashFunction.Functions[hashMethod]); } /// /// Builds the specified connection. /// /// The connection. /// The redis key. /// The expected elements. /// The error rate. /// The hash function. /// /// public static IBloomFilter Build(IConnectionMultiplexer connection, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName) { return new FilterRedis(name, new RedisBitOperate(connection), redisKey, expectedElements, errorRate, hashFunction); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The redis bit operate. /// The redis key. /// The expected elements. /// The hash method. /// /// public static IBloomFilter Build(IRedisBitOperate redisBitOperate, string redisKey, long expectedElements, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName) { return Build(redisBitOperate, redisKey, expectedElements, 0.01, hashMethod, name); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The redis bit operate. /// The redis key. /// The expected elements. /// The hash function. /// /// public static IBloomFilter Build(IRedisBitOperate redisBitOperate, string redisKey, long expectedElements, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName) { return Build(redisBitOperate, redisKey, expectedElements, 0.01, hashFunction, name); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The redis bit operate. /// The redis key. /// The expected elements. /// The error rate. /// /// public static IBloomFilter Build(IRedisBitOperate redisBitOperate, string redisKey, long expectedElements, double errorRate, string name = BloomFilterConstValue.DefaultRedisName) { return Build(redisBitOperate, redisKey, expectedElements, errorRate, HashFunction.Functions[HashMethod.Murmur3], name); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The redis bit operate. /// The redis key. /// The expected elements. /// /// public static IBloomFilter Build(IRedisBitOperate redisBitOperate, string redisKey, long expectedElements, string name = BloomFilterConstValue.DefaultRedisName) { return Build(redisBitOperate, redisKey, expectedElements, 0.01, HashFunction.Functions[HashMethod.Murmur3], name); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The redis bit operate. /// The redis key. /// The expected elements. /// The error rate. /// The hash method. /// /// public static IBloomFilter Build(IRedisBitOperate redisBitOperate, string redisKey, long expectedElements, double errorRate, HashMethod hashMethod, string name = BloomFilterConstValue.DefaultRedisName) { return new FilterRedis(name, redisBitOperate, redisKey, expectedElements, errorRate, HashFunction.Functions[hashMethod]); } /// /// Creates a BloomFilter Redis for the specified expected element /// /// The redis bit operate. /// The redis key. /// The expected elements. /// The error rate. /// The hash function. /// /// public static IBloomFilter Build(IRedisBitOperate redisBitOperate, string redisKey, long expectedElements, double errorRate, HashFunction hashFunction, string name = BloomFilterConstValue.DefaultRedisName) { return new FilterRedis(name, redisBitOperate, redisKey, expectedElements, errorRate, hashFunction); } #endregion } ================================================ FILE: src/BloomFilter.Redis/IRedisBitOperate.cs ================================================ using System; using System.Threading.Tasks; namespace BloomFilter.Redis; /// /// Redis BitMap operate Interface /// public interface IRedisBitOperate : IDisposable { bool[] Set(string redisKey, long[] positions, bool value); Task SetAsync(string redisKey, long[] positions, bool value); bool Set(string redisKey, long position, bool value); Task SetAsync(string redisKey, long position, bool value); bool Get(string redisKey, long position); Task GetAsync(string redisKey, long position); bool[] Get(string redisKey, long[] positions); Task GetAsync(string redisKey, long[] positions); void Clear(string redisKey); Task ClearAsync(string redisKey); } ================================================ FILE: src/BloomFilter.Redis/RedisBitOperate.cs ================================================ using StackExchange.Redis; using System; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace BloomFilter.Redis; /// /// Redis Bit Operate /// /// public class RedisBitOperate : IRedisBitOperate { private volatile IConnectionMultiplexer? _connection; private readonly ConfigurationOptions? _configurationOptions; private readonly SemaphoreSlim _connectionLock = new(initialCount: 1, maxCount: 1); //allow the release of connection private bool allowRelease; private const int TimeoutMilliseconds = 5 * 1000; /// /// Initializes a new instance of the class. /// /// The configuration. public RedisBitOperate(string configuration) : this(ConfigurationOptions.Parse(configuration)) { } /// /// Initializes a new instance of the class. /// /// The options. public RedisBitOperate(ConfigurationOptions configurationOptions) { _configurationOptions = configurationOptions ?? throw new ArgumentNullException(nameof(configurationOptions)); } /// /// Initializes a new instance of the class. /// /// The . public RedisBitOperate(IConnectionMultiplexer connection) { _connection = connection; } public void Clear(string redisKey) { Database().KeyDelete(redisKey); } public async Task ClearAsync(string redisKey) { var db = await DatabaseAsync(); await db.KeyDeleteAsync(redisKey).ConfigureAwait(false); } public bool Get(string redisKey, long position) { return Database().StringGetBit(redisKey, position); } public bool[] Get(string redisKey, long[] positions) { var results = new Task[positions.Length]; var batch = Database().CreateBatch(); for (int i = 0; i < positions.Length; i++) { results[i] = batch.StringGetBitAsync(redisKey, positions[i]); } batch.Execute(); if (!Task.WaitAll(results, TimeoutMilliseconds)) throw new TimeoutException(); return results.Select(r => r.Result).ToArray(); } public async Task GetAsync(string redisKey, long position) { var db = await DatabaseAsync(); return await db.StringGetBitAsync(redisKey, position).ConfigureAwait(false); } public async Task GetAsync(string redisKey, long[] positions) { var db = await DatabaseAsync().ConfigureAwait(false); // Use batch for pipeline execution var batch = db.CreateBatch(); var tasks = new Task[positions.Length]; for (int i = 0; i < positions.Length; i++) { tasks[i] = batch.StringGetBitAsync(redisKey, positions[i]); } batch.Execute(); await Task.WhenAll(tasks).ConfigureAwait(false); var results = new bool[tasks.Length]; for (int i = 0; i < tasks.Length; i++) { results[i] = tasks[i].Result; } return results; } public bool[] Set(string redisKey, long[] positions, bool value) { var results = new Task[positions.Length]; var batch = Database().CreateBatch(); for (int i = 0; i < positions.Length; i++) { results[i] = batch.StringSetBitAsync(redisKey, positions[i], value); } batch.Execute(); if (!Task.WaitAll(results, TimeoutMilliseconds)) throw new TimeoutException(); return results.Select(r => r.Result).ToArray(); } public async Task SetAsync(string redisKey, long[] positions, bool value) { var db = await DatabaseAsync().ConfigureAwait(false); // Use batch for pipeline execution var batch = db.CreateBatch(); var tasks = new Task[positions.Length]; for (int i = 0; i < positions.Length; i++) { tasks[i] = batch.StringSetBitAsync(redisKey, positions[i], value); } batch.Execute(); await Task.WhenAll(tasks).ConfigureAwait(false); var results = new bool[tasks.Length]; for (int i = 0; i < tasks.Length; i++) { results[i] = tasks[i].Result; } return results; } public bool Set(string redisKey, long position, bool value) { return Database().StringSetBit(redisKey, position, value); } public async Task SetAsync(string redisKey, long position, bool value) { var db = await DatabaseAsync(); return await db.StringSetBitAsync(redisKey, position, value).ConfigureAwait(false); } public void Dispose() { if (allowRelease) { _connection?.Dispose(); } } private IDatabase Database(int? db = null) { return GetConnection().GetDatabase(db ?? -1); } private async Task DatabaseAsync(int? db = null) { var conn = await GetConnectionAsync(); return conn.GetDatabase(db ?? -1); } private IConnectionMultiplexer GetConnection() { if (_connection != null && _connection.IsConnected) return _connection; try { _connectionLock.Wait(); if (_connection != null && _connection.IsConnected) return _connection; //Create a new connection instance if (_connection == null) { _connection = ConnectionMultiplexer.Connect(_configurationOptions!); allowRelease = true; } else { if (allowRelease) { _connection.Dispose(); } //If the constructor parameter USES ConnectionMultiplexer, //the configuration of ConnectionMultiplexer is reused _connection = ConnectionMultiplexer.Connect(_connection.Configuration); allowRelease = true; } } finally { _connectionLock.Release(); } return _connection; } private async Task GetConnectionAsync() { if (_connection != null && _connection.IsConnected) return _connection; await _connectionLock.WaitAsync(); try { if (_connection != null && _connection.IsConnected) return _connection; if (_connection == null) { _connection = await ConnectionMultiplexer.ConnectAsync(_configurationOptions!); allowRelease = true; } else { if (allowRelease) { _connection.Dispose(); } _connection = await ConnectionMultiplexer.ConnectAsync(_connection.Configuration); allowRelease = true; } } finally { _connectionLock.Release(); } return _connection; } } ================================================ FILE: test/BenchmarkTest/BenchmarkTest.csproj ================================================  Exe net8.0;net9.0;net10.0 latest ================================================ FILE: test/BenchmarkTest/FreeRedisBenchmark.cs ================================================ using BenchmarkDotNet.Attributes; using BloomFilter; using BloomFilter.FreeRedis; using FreeRedis; using System.Threading.Tasks; namespace BenchmarkTest { [RPlotExporter, RankColumn] [MinColumn, MaxColumn] [MemoryDiagnoser] public class FreeRedisBenchmark { private const int B = 64; private const int KB = 1024; private const int MB = 1024 * KB; private IBloomFilter filter; private byte[] data; [Params(B, KB, MB)] public int DataSize; [GlobalSetup] public void Setup() { uint n = 1000000; var errRate = 0.01; data = Helper.GenerateBytes(DataSize); var client = new RedisClient("localhost"); filter = new FilterFreeRedis( BloomFilterConstValue.DefaultRedisName, client, "BloomFilter.Core", n, errRate, HashFunction.Functions[HashMethod.Murmur3]); filter.Clear(); } [Benchmark] public void Add() { filter.Add(data); } [Benchmark] public async ValueTask AddAsync() { await filter.AddAsync(data); } } } ================================================ FILE: test/BenchmarkTest/Helper.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; namespace BenchmarkTest { class Helper { private static readonly RandomNumberGenerator Rng = RandomNumberGenerator.Create(); private const string Base62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static string GenerateString(int length) { if (length < 0) throw new ArgumentOutOfRangeException($"{nameof(length)} is {length}."); var random = new Random(Guid.NewGuid().GetHashCode()); return new string( Enumerable.Repeat(Base62, length) .Select(s => s[random.Next(s.Length)]) .ToArray()); } public static byte[] GenerateBytes(int size = 4) { if (size < 0) throw new ArgumentOutOfRangeException($"{nameof(size)} is {size}."); var buff = new byte[size]; Rng.GetBytes(buff); return buff; } public static IList GenerateData(int n) { var random = new Random(Guid.NewGuid().GetHashCode()); var set = new HashSet(); var list = new List(n); for (int i = 0; i < n; i++) { var data = GenerateBytes(random.Next(32, 512)); if (!set.Contains(data)) { list.Add(data); } set.Add(data); } return list; } } } ================================================ FILE: test/BenchmarkTest/MemoryBenchmark.cs ================================================ using BenchmarkDotNet.Attributes; using BloomFilter; namespace BenchmarkTest { [RPlotExporter, RankColumn] [MinColumn, MaxColumn] [MemoryDiagnoser] public class MemoryBenchmark { private const int B = 64; private const int KB = 1024; private const int MB = 1024 * KB; private IBloomFilter filter; private byte[] data; [ParamsAllValues] public HashMethod Method; [Params(B, KB, MB)] public int DataSize; [GlobalSetup] public void Setup() { data = Helper.GenerateBytes(DataSize); uint n = 1000000; var errRate = 0.01; filter = FilterBuilder.Build(n, errRate, Method); } [Benchmark] public void Add() { filter.Add(data); } } } ================================================ FILE: test/BenchmarkTest/Program.cs ================================================ using System; using System.Reflection; using BenchmarkDotNet.Configs; using BenchmarkDotNet.Running; namespace BenchmarkTest { class Program { static void Main(string[] args) { var summary = new BenchmarkSwitcher(typeof(Program).Assembly).Run(args, ManualConfig .Create(DefaultConfig.Instance) .WithOptions(ConfigOptions.JoinSummary | ConfigOptions.DisableLogFile | ConfigOptions.DisableOptimizationsValidator)); //var summary = BenchmarkRunner.Run(); Console.Read(); } } } ================================================ FILE: test/BenchmarkTest/RedisBenchmark.cs ================================================ using BenchmarkDotNet.Attributes; using BloomFilter; using BloomFilter.Redis; using System.Threading.Tasks; namespace BenchmarkTest { [RPlotExporter, RankColumn] [MinColumn, MaxColumn] [MemoryDiagnoser] public class RedisBenchmark { private const int B = 64; private const int KB = 1024; private const int MB = 1024 * KB; private IBloomFilter filter; private byte[] data; [Params(B, KB, MB)] public int DataSize; [GlobalSetup] public void Setup() { uint n = 1000000; var errRate = 0.01; data = Helper.GenerateBytes(DataSize); filter = FilterRedisBuilder.Build("localhost", "RedisBloomFilterTest", n, errRate, HashMethod.Murmur3); filter.Clear(); } [Benchmark] public void Add() { filter.Add(data); } [Benchmark] public async ValueTask AddAsync() { await filter.AddAsync(data); } } } ================================================ FILE: test/BloomFilter.Redis.Test/BloomFilter.Redis.Test.csproj ================================================  net10.0 all runtime; build; native; contentfiles; analyzers False False ================================================ FILE: test/BloomFilter.Redis.Test/BloomFilterCSRedisTest.cs ================================================ using BloomFilter.CSRedis.Configurations; using CSRedis; using Microsoft.Extensions.DependencyInjection; using System.Linq; using Xunit; namespace BloomFilter.Redis.Test { public class BloomFilterCSRedisTest { [Fact] public void RedisOptionsTest() { var services = new ServiceCollection(); services.AddBloomFilter(setupAction => { setupAction.UseCSRedis(new FilterCSRedisOptions { Name = "Redis1", RedisKey = "CSRedis1", ConnectionStrings = new[] { "localhost" }.ToList() }); }); var provider = services.BuildServiceProvider(); Test(provider.GetService()); } [Fact] public void RedisOptionsConfigurationTest() { var services = new ServiceCollection(); services.AddBloomFilter(setupAction => { setupAction.UseCSRedis(new FilterCSRedisOptions { Name = "Redis2", RedisKey = "CSRedis2", ConnectionStrings = new[] { "localhost" }.ToList() }); }); var provider = services.BuildServiceProvider(); Test(provider.GetService()); } [Fact] public void RedisOptionsSharedTest() { var services = new ServiceCollection(); var clint = new CSRedisClient("localhost"); services.AddBloomFilter(setupAction => { setupAction.UseCSRedis(new FilterCSRedisOptions { Name = "Redis3", RedisKey = "CSRedis3", Client = clint }); setupAction.UseCSRedis(new FilterCSRedisOptions { Name = "Redis4", RedisKey = "CSRedis4", Client = clint }); }); var provider = services.BuildServiceProvider(); var factory = provider.GetService(); Test(provider.GetService()); Test(factory.Get("Redis3")); Test(factory.Get("Redis4")); } private void Test(IBloomFilter bf) { var len = 10; var array = new string[len]; for (int i = 0; i < len; i++) { array[i] = Utilitiy.GenerateString(10); } Assert.All(bf.Add(array), r => Assert.True(r)); Assert.All(bf.Contains(array), r => Assert.True(r)); Assert.True(bf.All(array)); bf.Clear(); Assert.All(bf.Contains(array), r => Assert.False(r)); Assert.False(bf.All(array)); } } } ================================================ FILE: test/BloomFilter.Redis.Test/BloomFilterEasyCachingRedisTest.cs ================================================ using BloomFilter.CSRedis.Configurations; using BloomFilter.EasyCaching; using CSRedis; using EasyCaching.Core.Serialization; using EasyCaching.CSRedis; using EasyCaching.Serialization.Json; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using System.Linq; using System.Xml.Linq; using Xunit; namespace BloomFilter.Redis.Test { public class BloomFilterEasyCachingRedis { [Fact] public void RedisOptionsTest() { var services = new ServiceCollection(); services.AddEasyCaching(setupAction => { setupAction.WithJson(); setupAction.UseCSRedis(configure => { configure.SerializerName = "json"; configure.DBConfig = new CSRedisDBOptions { ConnectionStrings = new System.Collections.Generic.List { "127.0.0.1,defaultDatabase=0,poolsize=10" } }; }, "BloomFilter1"); setupAction.UseCSRedis(configure => { configure.SerializerName = "json"; configure.DBConfig = new CSRedisDBOptions { ConnectionStrings = new System.Collections.Generic.List { "127.0.0.1,defaultDatabase=1,poolsize=10" } }; }, "BloomFilter2"); }); services.AddBloomFilter(setupAction => { setupAction.UseEasyCachingRedis(new FilterEasyCachingRedisOptions { Name = "BF1", RedisKey = "EasyCaching1", ProviderName = "BloomFilter1" }); //BloomFilter2 setupAction.UseEasyCachingRedis(new FilterEasyCachingRedisOptions { Name = "BF2", RedisKey = "EasyCaching1", }); }); var provider = services.BuildServiceProvider(); var factory = provider.GetService(); Test(provider.GetService()); Test(factory.Get("BF1")); Test(factory.Get("BF2")); } private void Test(IBloomFilter bf) { var len = 10; var array = new string[len]; for (int i = 0; i < len; i++) { array[i] = Utilitiy.GenerateString(10); } Assert.All(bf.Add(array), r => Assert.True(r)); Assert.All(bf.Contains(array), r => Assert.True(r)); Assert.True(bf.All(array)); bf.Clear(); Assert.All(bf.Contains(array), r => Assert.False(r)); Assert.False(bf.All(array)); } } } ================================================ FILE: test/BloomFilter.Redis.Test/BloomFilterFreeRedisTest.cs ================================================ using BloomFilter.FreeRedis.Configurations; using FreeRedis; using Microsoft.Extensions.DependencyInjection; using System.Linq; using Xunit; namespace BloomFilter.Redis.Test { public class BloomFilterFreeRedisTest { [Fact] public void RedisOptionsTest() { var services = new ServiceCollection(); services.AddBloomFilter(setupAction => { setupAction.UseFreeRedis(new FilterFreeRedisOptions { Name = "Redis1", RedisKey = "FreeRedis1", ConnectionStrings = new[] { "localhost" }.ToList() }); }); var provider = services.BuildServiceProvider(); Test(provider.GetService()); } [Fact] public void RedisOptionsConfigurationTest() { var services = new ServiceCollection(); services.AddBloomFilter(setupAction => { setupAction.UseFreeRedis(new FilterFreeRedisOptions { Name = "Redis2", RedisKey = "FreeRedis2", ConnectionStrings = new[] { "localhost" }.ToList() }); }); var provider = services.BuildServiceProvider(); Test(provider.GetService()); } [Fact] public void RedisOptionsSharedTest() { var services = new ServiceCollection(); var clint = new RedisClient("localhost"); services.AddBloomFilter(setupAction => { setupAction.UseFreeRedis(new FilterFreeRedisOptions { Name = "Redis3", RedisKey = "FreeRedis3", Client = clint }); setupAction.UseFreeRedis(new FilterFreeRedisOptions { Name = "Redis4", RedisKey = "FreeRedis4", Client = clint }); }); var provider = services.BuildServiceProvider(); var factory = provider.GetService(); Test(provider.GetService()); Test(factory.Get("Redis3")); Test(factory.Get("Redis4")); } private void Test(IBloomFilter bf) { var len = 10; var array = new string[len]; for (int i = 0; i < len; i++) { array[i] = Utilitiy.GenerateString(10); } Assert.All(bf.Add(array), r => Assert.True(r)); Assert.All(bf.Contains(array), r => Assert.True(r)); Assert.True(bf.All(array)); bf.Clear(); Assert.All(bf.Contains(array), r => Assert.False(r)); Assert.False(bf.All(array)); } } } ================================================ FILE: test/BloomFilter.Redis.Test/BloomFilterRedisTest.cs ================================================ using System; using System.Collections.Generic; using System.Security.Cryptography; using System.Threading.Tasks; using BloomFilter; using BloomFilter.Redis; using StackExchange.Redis; using Xunit; namespace BloomFilter.Redis.Test { public class BloomFilterRedisTest { [Theory] [InlineData(HashMethod.LCGWithFNV1)] [InlineData(HashMethod.LCGWithFNV1a)] [InlineData(HashMethod.LCGModifiedFNV1)] [InlineData(HashMethod.RNGWithFNV1)] [InlineData(HashMethod.RNGWithFNV1a)] [InlineData(HashMethod.RNGModifiedFNV1)] [InlineData(HashMethod.CRC32)] [InlineData(HashMethod.CRC64)] [InlineData(HashMethod.Adler32)] [InlineData(HashMethod.Murmur3)] [InlineData(HashMethod.Murmur128BitsX64)] [InlineData(HashMethod.Murmur128BitsX86)] [InlineData(HashMethod.SHA1)] [InlineData(HashMethod.SHA256)] [InlineData(HashMethod.SHA384)] [InlineData(HashMethod.SHA512)] [InlineData(HashMethod.XXHash32)] [InlineData(HashMethod.XXHash64)] [InlineData(HashMethod.XXHash3)] [InlineData(HashMethod.XXHash128)] public void NormalTest(HashMethod hashMethod) { var bf = FilterRedisBuilder.Build("localhost", "NormalTest", 10000, 0.01, hashMethod); var len = 10; var array = new string[len]; for (int i = 0; i < len; i++) { array[i] = Utilitiy.GenerateString(10); } Assert.All(bf.Add(array), r => Assert.True(r)); Assert.All(bf.Contains(array), r => Assert.True(r)); Assert.True(bf.All(array)); bf.Clear(); Assert.All(bf.Contains(array), r => Assert.False(r)); Assert.False(bf.All(array)); } [Theory] [InlineData(HashMethod.LCGWithFNV1)] [InlineData(HashMethod.LCGWithFNV1a)] [InlineData(HashMethod.LCGModifiedFNV1)] [InlineData(HashMethod.RNGWithFNV1)] [InlineData(HashMethod.RNGWithFNV1a)] [InlineData(HashMethod.RNGModifiedFNV1)] [InlineData(HashMethod.CRC32)] [InlineData(HashMethod.CRC64)] [InlineData(HashMethod.Adler32)] [InlineData(HashMethod.Murmur3)] [InlineData(HashMethod.Murmur128BitsX64)] [InlineData(HashMethod.Murmur128BitsX86)] [InlineData(HashMethod.SHA1)] [InlineData(HashMethod.SHA256)] [InlineData(HashMethod.SHA384)] [InlineData(HashMethod.SHA512)] [InlineData(HashMethod.XXHash32)] [InlineData(HashMethod.XXHash64)] [InlineData(HashMethod.XXHash3)] [InlineData(HashMethod.XXHash128)] public async Task NormalTestAsync(HashMethod hashMethod) { var bf = FilterRedisBuilder.Build("localhost", "NormalTestAsync", 10000, 0.01, hashMethod); var len = 10; var array = new string[len]; for (int i = 0; i < len; i++) { array[i] = Utilitiy.GenerateString(10); } Assert.All(await bf.AddAsync(array), r => Assert.True(r)); Assert.All(await bf.ContainsAsync(array), r => Assert.True(r)); Assert.True(await bf.AllAsync(array)); await bf.ClearAsync(); Assert.All(await bf.ContainsAsync(array), r => Assert.False(r)); Assert.False(await bf.AllAsync(array)); } [Theory] [InlineData(HashMethod.LCGWithFNV1)] [InlineData(HashMethod.LCGWithFNV1a)] [InlineData(HashMethod.LCGModifiedFNV1)] [InlineData(HashMethod.RNGWithFNV1)] [InlineData(HashMethod.RNGWithFNV1a)] [InlineData(HashMethod.RNGModifiedFNV1)] [InlineData(HashMethod.CRC32)] [InlineData(HashMethod.CRC64)] [InlineData(HashMethod.Adler32)] [InlineData(HashMethod.Murmur3)] [InlineData(HashMethod.Murmur128BitsX64)] [InlineData(HashMethod.Murmur128BitsX86)] [InlineData(HashMethod.SHA1)] [InlineData(HashMethod.SHA256)] [InlineData(HashMethod.SHA384)] [InlineData(HashMethod.SHA512)] [InlineData(HashMethod.XXHash32)] [InlineData(HashMethod.XXHash64)] [InlineData(HashMethod.XXHash3)] [InlineData(HashMethod.XXHash128)] public void BytesArrayTest(HashMethod hashMethod) { var bf = FilterRedisBuilder.Build("localhost", "BytesArrayTest", 10000, 0.01, hashMethod); var rng = RandomNumberGenerator.Create(); var len = 10; var list = new List(len); for (int i = 0; i < len; i++) { var data = new byte[1024]; rng.GetBytes(data); list.Add(data); } Assert.All(bf.Add(list), r => Assert.True(r)); Assert.All(bf.Contains(list), r => Assert.True(r)); Assert.True(bf.All(list)); bf.Clear(); Assert.All(bf.Contains(list), r => Assert.False(r)); Assert.False(bf.All(list)); } [Fact] public void IntTest() { var config = ConfigurationOptions.Parse("localhost"); var bf = FilterRedisBuilder.Build(config, "IntTest", 10000, 0.01); var len = 10; var array = new int[len]; for (int i = 0; i < len; i++) { array[i] = i; } Assert.All(bf.Add(array), r => Assert.True(r)); Assert.All(bf.Contains(array), r => Assert.True(r)); Assert.True(bf.All(array)); bf.Clear(); Assert.All(bf.Contains(array), r => Assert.False(r)); Assert.False(bf.All(array)); } [Fact] public async Task IntTestAsync() { var config = ConfigurationOptions.Parse("localhost"); var bf = FilterRedisBuilder.Build(config, "IntTestAsync", 10000, 0.01); var len = 10; var array = new int[len]; for (int i = 0; i < len; i++) { array[i] = i; } Assert.All(await bf.AddAsync(array), r => Assert.True(r)); Assert.All(await bf.ContainsAsync(array), r => Assert.True(r)); Assert.True(await bf.AllAsync(array)); await bf.ClearAsync(); Assert.All(await bf.ContainsAsync(array), r => Assert.False(r)); Assert.False(await bf.AllAsync(array)); } [Fact] public void BuildTest() { var hashFun = new HashAlgorithms.HashCryptoSHA256(); var config = ConfigurationOptions.Parse("localhost"); var conn = ConnectionMultiplexer.Connect(config); var operate = new RedisBitOperate(conn); buildTest(FilterRedisBuilder.Build(config, "BuildTest", 10000)); buildTest(FilterRedisBuilder.Build(config, "BuildTest", 10000, hashFun)); buildTest(FilterRedisBuilder.Build(config, "BuildTest", 10000, HashMethod.Adler32)); buildTest(FilterRedisBuilder.Build(config, "BuildTest", 10000, 0.01)); buildTest(FilterRedisBuilder.Build(config, "BuildTest", 10000, 0.01, hashFun)); buildTest(FilterRedisBuilder.Build(config, "BuildTest", 10000, 0.01, HashMethod.Adler32)); buildTest(FilterRedisBuilder.Build("localhost", "BuildTest", 10000)); buildTest(FilterRedisBuilder.Build("localhost", "BuildTest", 10000, hashFun)); buildTest(FilterRedisBuilder.Build("localhost", "BuildTest", 10000, HashMethod.Adler32)); buildTest(FilterRedisBuilder.Build("localhost", "BuildTest", 10000, 0.01)); buildTest(FilterRedisBuilder.Build("localhost", "BuildTest", 10000, 0.01, hashFun)); buildTest(FilterRedisBuilder.Build("localhost", "BuildTest", 10000, 0.01, HashMethod.Adler32)); buildTest(FilterRedisBuilder.Build(conn, "BuildTest", 10000)); buildTest(FilterRedisBuilder.Build(conn, "BuildTest", 10000, hashFun)); buildTest(FilterRedisBuilder.Build(conn, "BuildTest", 10000, HashMethod.Adler32)); buildTest(FilterRedisBuilder.Build(conn, "BuildTest", 10000, 0.01)); buildTest(FilterRedisBuilder.Build(conn, "BuildTest", 10000, 0.01, hashFun)); buildTest(FilterRedisBuilder.Build(conn, "BuildTest", 10000, 0.01, HashMethod.Adler32)); buildTest(FilterRedisBuilder.Build(operate, "BuildTest", 10000)); buildTest(FilterRedisBuilder.Build(operate, "BuildTest", 10000, hashFun)); buildTest(FilterRedisBuilder.Build(operate, "BuildTest", 10000, HashMethod.Adler32)); buildTest(FilterRedisBuilder.Build(operate, "BuildTest", 10000, 0.01)); buildTest(FilterRedisBuilder.Build(operate, "BuildTest", 10000, 0.01, hashFun)); buildTest(FilterRedisBuilder.Build(operate, "BuildTest", 10000, 0.01, HashMethod.Adler32)); conn.Dispose(); } void buildTest(IBloomFilter bf) { var len = 20; var array = new string[len]; for (int i = 0; i < len; i++) { array[i] = Utilitiy.GenerateString(10); } Assert.All(bf.Add(array), r => Assert.True(r)); Assert.All(bf.Contains(array), r => Assert.True(r)); Assert.True(bf.All(array)); bf.Clear(); Assert.All(bf.Contains(array), r => Assert.False(r)); Assert.False(bf.All(array)); } [Fact] public async Task BuildTestAsync() { var hashFun = new HashAlgorithms.HashCryptoSHA256(); var config = ConfigurationOptions.Parse("localhost"); var conn = ConnectionMultiplexer.Connect(config); var operate = new RedisBitOperate(conn); await buildTestAsync(FilterRedisBuilder.Build(config, "BuildTest", 10000)); await buildTestAsync(FilterRedisBuilder.Build(config, "BuildTest", 10000, hashFun)); await buildTestAsync(FilterRedisBuilder.Build(config, "BuildTest", 10000, HashMethod.Adler32)); await buildTestAsync(FilterRedisBuilder.Build(config, "BuildTest", 10000, 0.01)); await buildTestAsync(FilterRedisBuilder.Build(config, "BuildTest", 10000, 0.01, hashFun)); await buildTestAsync(FilterRedisBuilder.Build(config, "BuildTest", 10000, 0.01, HashMethod.Adler32)); await buildTestAsync(FilterRedisBuilder.Build("localhost", "BuildTest", 10000)); await buildTestAsync(FilterRedisBuilder.Build("localhost", "BuildTest", 10000, hashFun)); await buildTestAsync(FilterRedisBuilder.Build("localhost", "BuildTest", 10000, HashMethod.Adler32)); await buildTestAsync(FilterRedisBuilder.Build("localhost", "BuildTest", 10000, 0.01)); await buildTestAsync(FilterRedisBuilder.Build("localhost", "BuildTest", 10000, 0.01, hashFun)); await buildTestAsync(FilterRedisBuilder.Build("localhost", "BuildTest", 10000, 0.01, HashMethod.Adler32)); await buildTestAsync(FilterRedisBuilder.Build(conn, "BuildTest", 10000)); await buildTestAsync(FilterRedisBuilder.Build(conn, "BuildTest", 10000, hashFun)); await buildTestAsync(FilterRedisBuilder.Build(conn, "BuildTest", 10000, HashMethod.Adler32)); await buildTestAsync(FilterRedisBuilder.Build(conn, "BuildTest", 10000, 0.01)); await buildTestAsync(FilterRedisBuilder.Build(conn, "BuildTest", 10000, 0.01, hashFun)); await buildTestAsync(FilterRedisBuilder.Build(conn, "BuildTest", 10000, 0.01, HashMethod.Adler32)); await buildTestAsync(FilterRedisBuilder.Build(operate, "BuildTest", 10000)); await buildTestAsync(FilterRedisBuilder.Build(operate, "BuildTest", 10000, hashFun)); await buildTestAsync(FilterRedisBuilder.Build(operate, "BuildTest", 10000, HashMethod.Adler32)); await buildTestAsync(FilterRedisBuilder.Build(operate, "BuildTest", 10000, 0.01)); await buildTestAsync(FilterRedisBuilder.Build(operate, "BuildTest", 10000, 0.01, hashFun)); await buildTestAsync(FilterRedisBuilder.Build(operate, "BuildTest", 10000, 0.01, HashMethod.Adler32)); conn.Dispose(); } async Task buildTestAsync(IBloomFilter bf) { var len = 20; var array = new string[len]; for (int i = 0; i < len; i++) { array[i] = Utilitiy.GenerateString(10); } Assert.All(await bf.AddAsync(array), r => Assert.True(r)); Assert.All(await bf.ContainsAsync(array), r => Assert.True(r)); Assert.True(await bf.AllAsync(array)); await bf.ClearAsync(); Assert.All(await bf.ContainsAsync(array), r => Assert.False(r)); Assert.False(await bf.AllAsync(array)); } } } ================================================ FILE: test/BloomFilter.Redis.Test/ConfigurationsTest.cs ================================================ using BloomFilter.Redis.Configurations; using Microsoft.Extensions.DependencyInjection; using StackExchange.Redis; using System.Linq; using Xunit; namespace BloomFilter.Redis.Test { public class ConfigurationsTest { [Fact] public void RedisOptionsTest() { var services = new ServiceCollection(); services.AddBloomFilter(setupAction => { setupAction.UseRedis(new FilterRedisOptions { Name = "Redis1", RedisKey = "BloomFilter1", Endpoints = new[] { "localhost" }.ToList() }); }); var provider = services.BuildServiceProvider(); Test(provider.GetService()); } [Fact] public void RedisOptionsConfigurationTest() { var services = new ServiceCollection(); services.AddBloomFilter(setupAction => { setupAction.UseRedis(new FilterRedisOptions { Name = "Redis2", RedisKey = "BloomFilter2", Configuration = "localhost" }); }); var provider = services.BuildServiceProvider(); Test(provider.GetService()); } [Fact] public void RedisOptionsSharedTest() { var services = new ServiceCollection(); var connection = ConnectionMultiplexer.Connect(ConfigurationOptions.Parse("localhost")); services.AddBloomFilter(setupAction => { setupAction.UseRedis(new FilterRedisOptions { Name = "Redis3", RedisKey = "BloomFilter3", Connection = connection }); setupAction.UseRedis(new FilterRedisOptions { Name = "Redis4", RedisKey = "BloomFilter4", Connection = connection }); }); var provider = services.BuildServiceProvider(); var factory = provider.GetService(); Test(provider.GetService()); Test(factory.Get("Redis3")); Test(factory.Get("Redis4")); } private void Test(IBloomFilter bf) { var len = 10; var array = new string[len]; for (int i = 0; i < len; i++) { array[i] = Utilitiy.GenerateString(10); } Assert.All(bf.Add(array), r => Assert.True(r)); Assert.All(bf.Contains(array), r => Assert.True(r)); Assert.True(bf.All(array)); bf.Clear(); Assert.All(bf.Contains(array), r => Assert.False(r)); Assert.False(bf.All(array)); } } } ================================================ FILE: test/BloomFilter.Redis.Test/RedisBitOperateTest.cs ================================================ using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Xunit; namespace BloomFilter.Redis.Test { public class RedisBitOperateTest { [Fact] public void NormalTest() { var operate = new RedisBitOperate("localhost"); operate.Set("RB-NormalTest", 0, true); Assert.True(operate.Get("RB-NormalTest", 0)); operate.Dispose(); } [Fact] public async Task NormalTestAsync() { var operate = new RedisBitOperate("localhost"); await operate.SetAsync("RB-NormalTestAsync", 0, true); Assert.True(await operate.GetAsync("RB-NormalTestAsync", 0)); operate.Dispose(); } [Fact] public void Can_Connection_Has_Not_Close() { var conn = ConnectionMultiplexer.Connect("localhost"); Assert.True(conn.IsConnected); var operate = new RedisBitOperate(conn); operate.Set("Can_Connection_Has_Not_Close", 1, true); Assert.True(operate.Get("Can_Connection_Has_Not_Close", 1)); operate.Dispose(); Assert.True(conn.IsConnected); } [Fact] public async Task Can_Connection_Has_Not_CloseAsync() { var conn = ConnectionMultiplexer.Connect("localhost"); Assert.True(conn.IsConnected); var operate = new RedisBitOperate(conn); await operate.SetAsync("Can_Connection_Has_Not_CloseAsync", 1, true); Assert.True(await operate.GetAsync("Can_Connection_Has_Not_CloseAsync", 1)); operate.Dispose(); Assert.True(conn.IsConnected); } [Fact] public void Can_Close_With_New_Connection() { var conn = ConnectionMultiplexer.Connect("localhost"); Assert.True(conn.IsConnected); conn.Dispose(); Assert.False(conn.IsConnected); var operate = new RedisBitOperate(conn); operate.Set("Can_Close_With_New_Connection", 2, true); Assert.True(operate.Get("Can_Close_With_New_Connection", 2)); operate.Dispose(); } [Fact] public async Task Can_Close_With_New_ConnectionAsync() { var conn = ConnectionMultiplexer.Connect("localhost"); Assert.True(conn.IsConnected); conn.Dispose(); Assert.False(conn.IsConnected); var operate = new RedisBitOperate(conn); await operate.SetAsync("Can_Close_With_New_ConnectionAsync", 2, true); Assert.True(await operate.GetAsync("Can_Close_With_New_ConnectionAsync", 2)); operate.Dispose(); } [Fact] public void Can_The_Batch_Result() { var operate = new RedisBitOperate(ConfigurationOptions.Parse("localhost")); string key = "RB:Batch"; operate.Clear(key); var positions = new long[] { 5, 6, 7, 8, 9, 10, 11, 12 }; var results = operate.Set(key, positions, true); Assert.False(results.All(r => r)); results = operate.Set(key, positions, true); Assert.True(results.All(r => r)); results = operate.Get(key, positions); Assert.True(results.All(r => r)); operate.Clear(key); results = operate.Get(key, positions); Assert.False(results.All(r => r)); operate.Dispose(); } [Fact] public async Task Can_The_Batch_ResultAsync() { var operate = new RedisBitOperate(ConfigurationOptions.Parse("localhost")); string key = "RB:BatchAsync"; await operate.ClearAsync(key); var positions = new long[] { 5, 6, 7, 8, 9, 10, 11, 12 }; var results = await operate.SetAsync(key, positions, true); Assert.False(results.All(r => r)); results = await operate.SetAsync(key, positions, true); Assert.True(results.All(r => r)); results = await operate.GetAsync(key, positions); Assert.True(results.All(r => r)); await operate.ClearAsync(key); results = await operate.GetAsync(key, positions); Assert.False(results.All(r => r)); operate.Dispose(); } } } ================================================ FILE: test/BloomFilter.Redis.Test/Utilitiy.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace BloomFilter.Redis.Test { class Utilitiy { private const string Base62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static string GenerateString(int length) { if (length < 0) throw new ArgumentOutOfRangeException($"{nameof(length)} is {length}."); var random = new Random(Guid.NewGuid().GetHashCode()); return new string( Enumerable.Repeat(Base62, length) .Select(s => s[random.Next(s.Length)]) .ToArray()); } } } ================================================ FILE: test/BloomFilterTest/AsyncLockTests.cs ================================================ using BloomFilter; using Xunit; namespace BloomFilterTest { [Collection("AsyncLock Tests")] [CollectionDefinition("AsyncLock Tests", DisableParallelization = false)] public class AsyncLockTests { [Fact] public void TestMaxCount() { using var mutex = new AsyncLock(2); Assert.Equal(0, mutex.GetRemainingCount()); Assert.Equal(mutex.MaxCount, mutex.GetCurrentCount()); using (var myLock = mutex.Acquire()) { Assert.Equal(1, mutex.GetRemainingCount()); Assert.Equal(1, mutex.GetCurrentCount()); using var myLock2 = mutex.Acquire(); Assert.Equal(mutex.MaxCount, mutex.GetRemainingCount()); Assert.Equal(0, mutex.GetCurrentCount()); } Assert.Equal(0, mutex.GetRemainingCount()); Assert.Equal(mutex.MaxCount, mutex.GetCurrentCount()); } [Fact] public void TestLock() { var mutex = new AsyncLock(); Assert.Equal(0, mutex.GetRemainingCount()); Assert.Equal(1, mutex.GetCurrentCount()); using (var myLock = mutex.Acquire()) { Assert.Equal(1, mutex.GetRemainingCount()); Assert.Equal(0, mutex.GetCurrentCount()); } Assert.Equal(0, mutex.GetRemainingCount()); Assert.Equal(1, mutex.GetCurrentCount()); } } } ================================================ FILE: test/BloomFilterTest/BloomFilterTest.cs ================================================ using BloomFilter; using BloomFilter.HashAlgorithms; using System; using System.Collections.Generic; using System.Security.Cryptography; using Xunit; namespace BloomFilterTest { public class BloomFilterTest { [Theory] [InlineData(HashMethod.LCGWithFNV1)] [InlineData(HashMethod.LCGWithFNV1a)] [InlineData(HashMethod.LCGModifiedFNV1)] [InlineData(HashMethod.RNGWithFNV1)] [InlineData(HashMethod.RNGWithFNV1a)] [InlineData(HashMethod.RNGModifiedFNV1)] [InlineData(HashMethod.CRC32)] [InlineData(HashMethod.CRC64)] [InlineData(HashMethod.Adler32)] [InlineData(HashMethod.Murmur3)] [InlineData(HashMethod.Murmur128BitsX64)] [InlineData(HashMethod.Murmur128BitsX86)] [InlineData(HashMethod.SHA1)] [InlineData(HashMethod.SHA256)] [InlineData(HashMethod.SHA384)] [InlineData(HashMethod.SHA512)] [InlineData(HashMethod.XXHash32)] [InlineData(HashMethod.XXHash64)] [InlineData(HashMethod.XXHash3)] [InlineData(HashMethod.XXHash128)] public void NormalTest(HashMethod hashMethod) { var bf = FilterBuilder.Build(10000, 0.01, hashMethod); var len = 10; var array = new string[len]; for (int i = 0; i < len; i++) { array[i] = Utilitiy.GenerateString(10); } Assert.All(bf.Add(array), r => Assert.True(r)); Assert.All(bf.Contains(array), r => Assert.True(r)); Assert.True(bf.All(array)); bf.Clear(); Assert.All(bf.Contains(array), r => Assert.False(r)); Assert.False(bf.All(array)); } [Theory] [InlineData(HashMethod.LCGWithFNV1)] [InlineData(HashMethod.LCGWithFNV1a)] [InlineData(HashMethod.LCGModifiedFNV1)] [InlineData(HashMethod.RNGWithFNV1)] [InlineData(HashMethod.RNGWithFNV1a)] [InlineData(HashMethod.RNGModifiedFNV1)] [InlineData(HashMethod.CRC32)] [InlineData(HashMethod.CRC64)] [InlineData(HashMethod.Adler32)] [InlineData(HashMethod.Murmur3)] [InlineData(HashMethod.Murmur128BitsX64)] [InlineData(HashMethod.Murmur128BitsX86)] [InlineData(HashMethod.SHA1)] [InlineData(HashMethod.SHA256)] [InlineData(HashMethod.SHA384)] [InlineData(HashMethod.SHA512)] [InlineData(HashMethod.XXHash32)] [InlineData(HashMethod.XXHash64)] [InlineData(HashMethod.XXHash3)] [InlineData(HashMethod.XXHash128)] public void BytesArrayTest(HashMethod hashMethod) { var bf = FilterBuilder.Build(10000, 0.01, hashMethod); var rng = RandomNumberGenerator.Create(); var len = 10; var list = new List(len); for (int i = 0; i < len; i++) { var data = new byte[1024]; rng.GetBytes(data); list.Add(data); } Assert.All(bf.Add(list), r => Assert.True(r)); Assert.All(bf.Contains(list), r => Assert.True(r)); Assert.True(bf.All(list)); bf.Clear(); Assert.All(bf.Contains(list), r => Assert.False(r)); Assert.False(bf.All(list)); } [Fact] public void BuildTest() { var hashFun = new Crc32(); buildTest(FilterBuilder.Build(10000)); buildTest(FilterBuilder.Build(10000, hashFun)); buildTest(FilterBuilder.Build(10000, HashMethod.Adler32)); buildTest(FilterBuilder.Build(10000, 0.01)); buildTest(FilterBuilder.Build(10000, 0.01, hashFun)); buildTest(FilterBuilder.Build(10000, 0.01, HashMethod.Adler32)); } private void buildTest(IBloomFilter bf) { var len = 20; var array = new string[len]; for (int i = 0; i < len; i++) { array[i] = Utilitiy.GenerateString(10); } Assert.All(bf.Add(array), r => Assert.True(r)); Assert.All(bf.Contains(array), r => Assert.True(r)); Assert.True(bf.All(array)); bf.Clear(); Assert.All(bf.Contains(array), r => Assert.False(r)); Assert.False(bf.All(array)); } [Fact] public void FixMurmur3Test() { var bf = FilterBuilder.Build(10000, 0.01, HashMethod.Murmur3); var rng = RandomNumberGenerator.Create(); var data = new byte[1024]; rng.GetBytes(data); Assert.True(bf.Add(data)); Assert.True(bf.Contains(data)); } } } ================================================ FILE: test/BloomFilterTest/BloomFilterTest.csproj ================================================  net10.0 false all runtime; build; native; contentfiles; analyzers ================================================ FILE: test/BloomFilterTest/ConfigurationsTest.cs ================================================ using BloomFilter; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Xunit; namespace BloomFilterTest { public class ConfigurationsTest { [Fact] public void NormalTest() { var services = new ServiceCollection(); services.AddBloomFilter(setupAction => { setupAction.UseInMemory(); }); var provider = services.BuildServiceProvider(); var bf = provider.GetService(); var len = 10; var array = new string[len]; for (int i = 0; i < len; i++) { array[i] = Utilitiy.GenerateString(10); } Assert.All(bf.Add(array), r => Assert.True(r)); Assert.All(bf.Contains(array), r => Assert.True(r)); Assert.True(bf.All(array)); bf.Clear(); Assert.All(bf.Contains(array), r => Assert.False(r)); Assert.False(bf.All(array)); } [Fact] public void BloomFilterFactoryTest() { var services = new ServiceCollection(); services.AddBloomFilter(setupAction => { setupAction.UseInMemory(); setupAction.UseInMemory("CustomName"); }); var provider = services.BuildServiceProvider(); var factory = provider.GetService(); var bf1 = factory.Get(BloomFilterConstValue.DefaultInMemoryName); var bf2 = factory.Get("CustomName"); var bf3 = provider.GetService(); Assert.Equal(BloomFilterConstValue.DefaultInMemoryName, bf1.Name); Assert.Equal("CustomName", bf2.Name); Assert.Equal("CustomName", bf3.Name); } } } ================================================ FILE: test/BloomFilterTest/FluentFilterBuilderTest.cs ================================================ using BloomFilter; using System; using Xunit; namespace BloomFilterTest { public class FluentFilterBuilderTest { [Fact] public void Create_ReturnsNewBuilder() { var builder = FilterBuilder.Create(); Assert.NotNull(builder); } [Fact] public void BuildInMemory_WithDefaults_CreatesFilter() { var filter = FilterBuilder.Create() .BuildInMemory(); Assert.NotNull(filter); Assert.IsAssignableFrom(filter); } [Fact] public void WithName_SetsFilterName() { var filter = FilterBuilder.Create() .WithName("TestFilter") .BuildInMemory(); Assert.Equal("TestFilter", filter.Name); } [Fact] public void WithName_Null_ThrowsArgumentException() { var builder = FilterBuilder.Create(); // ArgumentException.ThrowIfNullOrWhiteSpace throws ArgumentNullException for null Assert.ThrowsAny(() => builder.WithName(null!)); } [Fact] public void WithName_EmptyOrWhitespace_ThrowsArgumentException() { var builder = FilterBuilder.Create(); Assert.ThrowsAny(() => builder.WithName("")); Assert.ThrowsAny(() => builder.WithName(" ")); } [Fact] public void ExpectingElements_SetsExpectedElements() { var filter = FilterBuilder.Create() .ExpectingElements(5_000_000) .BuildInMemory(); Assert.NotNull(filter); // Filter is created successfully with specified expected elements } [Fact] public void ExpectingElements_ZeroOrNegative_ThrowsArgumentOutOfRangeException() { var builder = FilterBuilder.Create(); Assert.Throws(() => builder.ExpectingElements(0)); Assert.Throws(() => builder.ExpectingElements(-1)); } [Fact] public void WithErrorRate_SetsErrorRate() { var filter = FilterBuilder.Create() .WithErrorRate(0.001) .BuildInMemory(); Assert.NotNull(filter); // Filter is created successfully with specified error rate } [Fact] public void WithErrorRate_InvalidRange_ThrowsArgumentOutOfRangeException() { var builder = FilterBuilder.Create(); Assert.Throws(() => builder.WithErrorRate(0)); Assert.Throws(() => builder.WithErrorRate(-0.1)); Assert.Throws(() => builder.WithErrorRate(1)); Assert.Throws(() => builder.WithErrorRate(1.5)); } [Fact] public void UsingHashMethod_SetsHashMethod() { var filter = FilterBuilder.Create() .UsingHashMethod(HashMethod.XXHash3) .BuildInMemory(); Assert.NotNull(filter); // Filter is created successfully with specified hash method } [Fact] public void UsingCustomHash_SetsCustomHashFunction() { var customHash = HashFunction.Functions[HashMethod.Murmur3]; var filter = FilterBuilder.Create() .UsingCustomHash(customHash) .BuildInMemory(); Assert.NotNull(filter); } [Fact] public void UsingCustomHash_Null_ThrowsArgumentNullException() { var builder = FilterBuilder.Create(); Assert.Throws(() => builder.UsingCustomHash(null!)); } [Fact] public void ChainedCalls_BuildsCorrectFilter() { var filter = FilterBuilder.Create() .WithName("ChainedFilter") .ExpectingElements(10_000_000) .WithErrorRate(0.001) .UsingHashMethod(HashMethod.XXHash3) .BuildInMemory(); Assert.NotNull(filter); Assert.Equal("ChainedFilter", filter.Name); } [Fact] public void BuildInMemory_FilterFunctionsCorrectly() { var filter = FilterBuilder.Create() .ExpectingElements(1000) .WithErrorRate(0.01) .BuildInMemory(); // Test basic functionality filter.Add("test1"); filter.Add("test2"); Assert.True(filter.Contains("test1")); Assert.True(filter.Contains("test2")); Assert.False(filter.Contains("test3")); } [Fact] public void BuildInMemoryWithCapacity_CreatesFilterWithSpecificCapacity() { var filter = FilterBuilder.Create() .WithName("CapacityFilter") .BuildInMemoryWithCapacity(capacity: 1000, hashes: 5); Assert.NotNull(filter); Assert.Equal("CapacityFilter", filter.Name); } [Fact] public void MultipleBuilds_EachBuildIsIndependent() { var builder = FilterBuilder.Create() .ExpectingElements(1000) .WithErrorRate(0.01); var filter1 = builder.BuildInMemory(); var filter2 = builder.BuildInMemory(); filter1.Add("test1"); Assert.True(filter1.Contains("test1")); Assert.False(filter2.Contains("test1")); // filter2 should be independent } [Fact] public void WithSerializer_UsesCustomSerializer() { var customSerializer = new DefaultFilterMemorySerializer(); var filter = FilterBuilder.Create() .WithSerializer(customSerializer) .BuildInMemory(); Assert.NotNull(filter); } [Fact] public void WithSerializer_Null_ThrowsArgumentNullException() { var builder = FilterBuilder.Create(); Assert.Throws(() => builder.WithSerializer(null!)); } [Fact] public void UsingHashMethod_OverridesCustomHash() { var customHash = HashFunction.Functions[HashMethod.Murmur3]; var filter = FilterBuilder.Create() .UsingCustomHash(customHash) .UsingHashMethod(HashMethod.XXHash3) // Should override custom hash .BuildInMemory(); Assert.NotNull(filter); } } } ================================================ FILE: test/BloomFilterTest/HashAlgorithms/Adler32Test.cs ================================================ using System; using System.Linq; using BloomFilter.HashAlgorithms.Internal; using Xunit; namespace BloomFilterTest.HashAlgorithms { public class Adler32Test { ////Make sure your local memory is large enough [Theory] [InlineData(1024, 3838443024)] [InlineData(1024 * 1024, 1185183625)] [InlineData(32 * 1024 * 1024, 2524836307)] [InlineData(128 * 1024 * 1024, 4178691958)] [InlineData(363898432, 3303655557)] [InlineData(1024 * 1024 * 1024, 3590863875)] public void Adler_Append(int size, uint expected) { var bytes = Enumerable.Range(0, size).Select(i => (byte)i).ToArray(); Span data = bytes; var a2 = new Adler32(); while (data.Length > 0) { var n = Random.Shared.Next(1, data.Length); var d = data.Slice(0, n); a2.Append(d); data = data.Slice(n); } uint actual = a2.GetCurrentHashAsUInt32(); Assert.Equal(expected, actual); } } } ================================================ FILE: test/BloomFilterTest/HashAlgorithms/CrcTest.cs ================================================ using System; using System.Collections.Generic; using BloomFilter.HashAlgorithms.Internal; using FluentAssertions; using Xunit; namespace BloomFilterTest.HashAlgorithms { public class CrcTest { private static readonly byte[] buffer = new byte[] { 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x6D, 0x69, 0x73, 0x74, 0x61, 0x6B, 0x65, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x69, 0x6E, 0x6B, 0x20, 0x79, 0x6F, 0x75, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x73, 0x6F, 0x6C, 0x76, 0x65, 0x20, 0x61, 0x6E, 0x79, 0x20, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x20, 0x70, 0x72, 0x6F, 0x62, 0x6C, 0x65, 0x6D, 0x73, 0x20, 0x6A, 0x75, 0x73, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x6F, 0x74, 0x61, 0x74, 0x6F, 0x65, 0x73 }; [Theory] [MemberData(nameof(Crc64TestData))] public void Crc64_Append(TestPayloadParameter parameter) { var range = parameter.TestRange; Crc64 crc = new(); Span data = parameter.TestPayload; if (!range.Equals(Range.All)) { data = parameter.TestPayload[range]; } while (data.Length > 0) { var n = Random.Shared.Next(1, data.Length); var d = data.Slice(0, n); crc.Append(d); data = data.Slice(n); } ulong actual = crc.GetCurrentHashAsUInt64(); var expected = (ulong)(object)parameter.ExpectedValue; $"0x{actual:X4}".Should().Be($"0x{expected:X4}"); } [Theory] [MemberData(nameof(Crc32TestData))] public void Crc32_Append(TestPayloadParameter parameter) { var range = parameter.TestRange; Crc32 crc = new(); Span data = parameter.TestPayload; if (!range.Equals(Range.All)) { data = parameter.TestPayload[range]; } while (data.Length > 0) { var n = Random.Shared.Next(1, data.Length); var d = data.Slice(0, n); crc.Append(d); data = data.Slice(n); } uint actual = crc.GetCurrentHashAsUInt32(); var expected = (uint)(object)parameter.ExpectedValue; $"0x{actual:X4}".Should().Be($"0x{expected:X4}"); } public static IEnumerable Crc64TestData() { yield return new object[] { new TestPayloadParameter(buffer, .., 4970656839403593224) { TestScenario = "CRC 64, Checksum of all bytes" } }; yield return new object[] { new TestPayloadParameter(buffer, 3..14, 7160332793041206217) { TestScenario = "CRC 64, Checksum of bytes 3-14" } }; yield return new object[] { new TestPayloadParameter(buffer, 9..14, 11684299407097624602) { TestScenario = "CRC 64, Checksum of bytes 9-14" } }; yield return new object[] { new TestPayloadParameter(buffer, 70..76, 7838111982916138213) { TestScenario = "CRC 64, Checksum of bytes 70-76" } }; } public static IEnumerable Crc32TestData() { yield return new object[] { new TestPayloadParameter(buffer, .., 0xCBE25E99) { TestScenario = "CRC 32, Checksum of all bytes" } }; yield return new object[] { new TestPayloadParameter(buffer, 3..14, 0xA0D118A0) { TestScenario = "CRC 32, Checksum of bytes 3-14" } }; yield return new object[] { new TestPayloadParameter(buffer, 9..14, 0xDEF4CFE9) { TestScenario = "CRC 32, Checksum of bytes 9-14" } }; yield return new object[] { new TestPayloadParameter(buffer, 70..76, 0xF373B43B) { TestScenario = "CRC 32, Checksum of bytes 70-76" } }; } } } ================================================ FILE: test/BloomFilterTest/HashAlgorithms/FNVTest.cs ================================================ using BloomFilter.HashAlgorithms.Internal; using System; using System.Collections.Generic; using Xunit; using Xunit.Abstractions; namespace BloomFilterTest.HashAlgorithms { public class FNVTest { private readonly ITestOutputHelper _testOutputHelper; public FNVTest(ITestOutputHelper testOutputHelper) { _testOutputHelper = testOutputHelper; } [Fact] public void FNV1_Test() { var tests = FNV1TestData(); foreach (var test in tests) { var hash = FNV1.HashToUInt32(test.Hex.FromHex()); Assert.Equal(test.Hash, hash); } } [Fact] public void FNV1_Append() { var tests = FNV1TestData(); foreach (var test in tests) { var fnv = new FNV1(); Span span = test.Hex.FromHex(); while (span.Length > 0) { var n = Random.Shared.Next(1, span.Length); var d = span.Slice(0, n); fnv.Append(d); span = span.Slice(n); } var hash2 = fnv.GetCurrentHashAsUInt32(); Assert.Equal(test.Hash, hash2); var hash3 = fnv.GetCurrentHashAsUInt32(); Assert.Equal(test.Hash, hash3); } } [Fact] public void FNV1a_Test() { var tests = FNV1aTestData(); foreach (var test in tests) { var hash = FNV1a.HashToUInt32(test.Hex.FromHex()); Assert.Equal(test.Hash, hash); } } [Fact] public void FNV1a_Append() { var tests = FNV1aTestData(); foreach (var test in tests) { var fnv = new FNV1a(); Span span = test.Hex.FromHex(); while (span.Length > 0) { var n = Random.Shared.Next(1, span.Length); var d = span.Slice(0, n); fnv.Append(d); span = span.Slice(n); } var hash2 = fnv.GetCurrentHashAsUInt32(); Assert.Equal(test.Hash, hash2); var hash3 = fnv.GetCurrentHashAsUInt32(); Assert.Equal(test.Hash, hash3); } } [Fact] public void ModifiedFNV1_Test() { var tests = ModifiedFNV1TestData(); foreach (var test in tests) { var hash = ModifiedFNV1.HashToUInt32(test.Hex.FromHex()); Assert.Equal(test.Hash, hash); } } [Fact] public void ModifiedFNV1_Append() { var tests = ModifiedFNV1TestData(); foreach (var test in tests) { var fnv = new ModifiedFNV1(); Span span = test.Hex.FromHex(); while (span.Length > 0) { var n = Random.Shared.Next(1, span.Length); var d = span.Slice(0, n); fnv.Append(d); span = span.Slice(n); } var hash2 = fnv.GetCurrentHashAsUInt32(); Assert.Equal(test.Hash, hash2); var hash3 = fnv.GetCurrentHashAsUInt32(); Assert.Equal(test.Hash, hash3); } } private static IEnumerable<(uint Hash, string Hex)> ModifiedFNV1TestData() { yield return (Hash: 771407592, Hex: "FF70"); yield return (Hash: 2685708795, Hex: "6B8DD4ACD7359836075840BCC31A6BEE1EBE83CC14EDFA99209A5A03E7D0F5AC72E9389FB005C03EDC410CCB61EF5D9DBB3A697B538C6912126978C173C69F3D8E2981D63EC4B693EB3E17813980D3EADD138DFEC6E6874245BF3CCA324F313392EC839644126B154BF67F6087F0C0D2A41CF3270D98BB"); yield return (Hash: 2131752732, Hex: "0478A6193853A3C662B815238CD65CC6A645CC4C5740E5B17D2780AFEE2B71BE765F5D7CE15FAEE60AC8F953C0999608231C6FD69027C7D9D8BF298B701E1171AB1057D6258B4CE7C1034B257E90BCCD247100FCC32227BD64"); yield return (Hash: 2862955741, Hex: "D7FF61563E0C229520"); yield return (Hash: 2601117268, Hex: "E2137581C9B9B9D7B7DADF40ECF92BD24B5E9162ACC10E271270D999DF0AF54CDE96D0B0"); yield return (Hash: 4262320966, Hex: "F0BF792566598B5FAB8ABC654C43ECDE024B7259415DCBDB06C295"); yield return (Hash: 397359451, Hex: "5C8C4299DAC69F60B2B3C1C305325443F39DBA791D3278948101105F4CC314A823F76B0710CA6A6D75C773A706924B9D1214F58B12E49CC76C9C7532160C3A0F15C1AB2BDE5E87A7E5901702F034E9F6A1BEAF395B1B9EA0716A6B483BEF8F2C1E566614863565243BCC7F20DE638D745D4D0260825298"); yield return (Hash: 314042805, Hex: "2AA2F3144AB0BEB5A58DAA826D6B477BF26FF644E6A64C1D7468B3B03C23753468"); yield return (Hash: 3436752930, Hex: "ED74AD4C481FEA3FB32D3EC3C54C55C3444A82D3DDBF672185739087B0278A3EE3A7A7893A6C8A6D533C8DF68BD818184EC2592A05454DF11F4A2251E91E8501A13F7048A09860C0FDC109454292B996237363FB4A3C9DDD923C1E9EC9674095BB574A222E34277090821B2D2711913553"); yield return (Hash: 2812754848, Hex: "67CABDF47446C7D7FA716BAD1B325083AA6B3550A508D75E44CFDF6ED4BB8C6908ADD9F5774D376B6654ADD84683F186A3F1B48FC6C0E562F93B13F83E967B"); yield return (Hash: 2379790101, Hex: "AFDDA841F7698DE45EA5B74660F23F1C1E21C840839B69EE9764E5173A761BF72F9D83077D4154BE782D8C1865403424F05DDC1BF751014E5B0944CBBB9138E56489EE35CB128DA2860A02BD4F2E24C6FEF87578C40FE80802ECFF260B9CE7BB15D6FC6A0A488210E4A64374A2A214B756D9A2926670D9DFA8845FE083"); yield return (Hash: 306391333, Hex: "48D9B36285C3DAE6DF0D80B3AEDC1642DC5007F87B118D72FBE67937EC90464C1D4461EBAF2664086C9764668180C3DCD61522EB30CD6AF78747D5E8C550FF2C47513F04B0D3513A796757D5CA53D4460BEE3A7FB58561D554F371883A43B9D975FB4ABB3099D57BEB58A3DF4F47"); yield return (Hash: 540193882, Hex: "8266139A68B57376C457092AB1238748D4B914BD35C265F5EF23E6C838DBFB0508D9332A75515DCD7BADBDA16F98728FB6E44F1E0ED1464D5C0FC2F9E39B699961318DC7A5C12F64D142DDBD450B7EAB19C15A75FE28DF51B85416B9646A81591E58D44004572DFAFB1D16A9"); yield return (Hash: 3122199454, Hex: "E41DD8B5E85EB76D3265CA3347A7FB56C507122BB771"); yield return (Hash: 3243637510, Hex: "E3FA987220606350F7B95660C98C4381B9CB58DE2E6F9876ED48E67B9FF095AA74606C1FE89A9A5FF521A04BD449934637EFBEC96D4611C6F1A6AB0EED31294D6DF82C174208CB6EAF772A3AE0042AF5BB3888DC6F5C8F74"); yield return (Hash: 2019755778, Hex: "4A3ED2231F1F9526F9CA73B7DB57E0F3A49D6F92D3FB9EAB7FEE896A5BE1210982932E4D"); yield return (Hash: 2742823170, Hex: "7EE9D43616D1C8DB60B09373E2619CD6FFC565D4E7957A30588F8320449783538B63F13B11A2409B81DD73BA6BA2D52F5260AE76396FAAC132BE13E962DA1BA9FDF80309E6D99E35B9AF7664293A01BF5DBD01D1BF3A0536FB9D216AC86DD345D0E704B598879F5BA9E957"); yield return (Hash: 3156521291, Hex: "E11789E60DB126B319253973EA08A43FC41CFD86C64B143CA8"); yield return (Hash: 455012644, Hex: "7EABEAF54E3191CFB9FB1DE4C84273700175F72B9BFD67A02E586EF27140ED681A5ED74A7E113960D9"); yield return (Hash: 795659620, Hex: "3FF966BE098073C9E5E7363E5D8F0F40D70D8711587F083ECD25870FFF07A235D90E95696686"); yield return (Hash: 2379202919, Hex: "5FC6B58D1505D258385AA5D064E8A1E36334"); yield return (Hash: 2933449609, Hex: "2B87FAFCF6AB56E3351D94D41D629E18E50C1429AF8543B463A93DD8D4430D272FD47EF6E31D97FEE519FE3A97"); yield return (Hash: 221896852, Hex: "D6E4DEF7A38608A0B5A83854D0FB84E1958122474BB4E1884CB4A116A18C5B4A4A129EF313540A4991B6F3CF8217131D9DD9E654FDC29E1392CF409E8720F359A122A91EC62D4A1D"); yield return (Hash: 3024224213, Hex: "630C47ADF331AFDE288802F9"); yield return (Hash: 3633626926, Hex: "3C731362A38E3664BB3981E6146F2213345771457EF288792849A00B4652F16F362F90F0814A0E392837A94A5B8CF420F99280BF640349A4408A0A2596573FD0DB732CA55C9354D2B1AD6809522D76CEB607D5"); yield return (Hash: 2381784309, Hex: "45E3AF51A99E2ED718"); yield return (Hash: 3435683190, Hex: "44358221E0044589177CBE2D4096F094E6CF467DE133A452D6A8CFACD8BD94F0151F95318B5F878D5018609024B18F778A97"); yield return (Hash: 2267301636, Hex: "91DA46548511B88BCB7C7E2A226BC15E1C0E5697"); yield return (Hash: 1111197284, Hex: "69F2AC0472287C23E0833301BC5C73BD67B617264135A229BA5AFDC6E11B634F9987CED2D1318B1031D5ADF069EA8B348C3C1C09F359332BBF7AB9029E82209BED2CAC1B59C640DB6573A564C7FA8EA8F4ABF3974DA852D16C3BF3CDD6AE0326EB73792FA73E158BF81D35A0D2C0657041FE0E7726F500A7FB8FE8AEAA"); yield return (Hash: 77317916, Hex: "6C42F63439436B5502F2F3408DAD65F84867C1F57ECA8010C7DC"); yield return (Hash: 2043351575, Hex: "19716228568ACDE1B35572A5393CD1EA6751856339A1DFB978533CCB45CB8868C51CC0FEF7A8C00BC1DBC52371406ED9180C21D6B966E10B9CED40748E05F9"); yield return (Hash: 2693191609, Hex: "C6EE536C7FA875245230C0FFE437150141EFB7AACC608DFEE4026C1AE03867BEA6A8D8B51FC1C9"); yield return (Hash: 1729792154, Hex: "4C8045B453E42AF7B145FC90AB4BB097B309F9D3A7B3447EE836DC803E340C1EF70E92A96A02E2D8D34A4C4B75D9FDE53AFE045A2CF2DCCAFBC66A3E84F848400F09A63FC09F0C7FFAD1069DF445F1B0B1ECF3CC281BB536EA3883049CB358EBC2D5AA106416697A2EAAB3C789D1A7546E64161930B0267985B616"); yield return (Hash: 3300453323, Hex: "36002BBEC6"); yield return (Hash: 1128662929, Hex: "6209A45E5E09F876F354F935C86956A73525B301099D3C1380B0F7CDC4D8D735AA7B142DC8F1B44DB844ECDD8C2031A3F220"); yield return (Hash: 1203037999, Hex: "D752D74C20AAFBA11D6B1AC9BF326414E577BBE0B15C61F0D721A7DDE248DDB312998D70E3D499D15BDA273B6D33536D8E81776C005D8BB885D0F33ABB86A4E5650D778E8E6678232437382DEC9902E50269"); yield return (Hash: 2253346941, Hex: "825B3ACCF2A497ADD9A2735F48D4D4CBFFB7B1628CBF13869FC3D11082612F95750315FB056683864C2F6E12488F4A0C"); yield return (Hash: 1690729144, Hex: "041BB9FCF5284FAEAF1D47EF4CD909746F868CC4DE46DF8B7640F3424AF88D21CD29C4FA4D8E96254BAE9F7BC9BBB1D0203CC95DA31FF8263C3351451D0169BDBD09CEF4B12A450DA7E0828F"); yield return (Hash: 1380856140, Hex: "B225E0A12E7F7B487CBA0446D73310011271DD35749EB6FB8331D31EA011A86A992F0CC2C9"); yield return (Hash: 2065327477, Hex: "DBA7DE7157A22AB05421413E003F90DEA866908A1EA2C12D7B0ED06A26BD5C9B5AEDEE70736311B0ACCAC590B3AD7B5CD374CC2E52A629CE9D70EF41749E8D5247CC84EFAD6CC97C2D"); yield return (Hash: 3496820726, Hex: "95832593D0680446E1B5F14A5795BDF8498F07D9E08B9664D3888283B196A68673837EAC199B2F28081427C9791BBE8E"); yield return (Hash: 1646959112, Hex: "462B9637185ADAD86C702291CD2E22059AB9EAD4D8B8628936997F0463BB0373302C9E72AF4BB15328315EA5BE0BF741AFAE"); yield return (Hash: 759505046, Hex: "9288E5CB965A08F55E504154A041D6763D7193AAC20D82E20F41DEF641EA5E108B31F4DCF5DBF7119A05D3DCF40A96BFAFE6D7DC60"); yield return (Hash: 1707217863, Hex: "0A445327FA7DC62AD627CB07EE2DE9CCA25FE70591FAC9AF512B6AAB310FB95D2D761F12D2142E988F423EF3784CC7EDC7439FA49F39587BDB17295F7DD7F156015D8007645B8697C98B9599F6E19B738C8E96D1"); yield return (Hash: 4204645367, Hex: "AC267A6BB0B5087131A95D96150CAC506094B3FC97E8388EFCFAA9500BA84B3B887C3BD9342DB3940D01B91E0A4E9BD7FFE07565C9FB18FAB553783C96464E87649E2FE8986126CF636677EDFF74A332F150B9B90DBA990193885A736126DF22CFC2"); yield return (Hash: 1936830277, Hex: "7990CADBDC1D459D6976540EA717E904AEDB3A89B92FAFD6F93803CEC58ED18A7390178DC00C9D00B49506633D50D08E4E61AA238F3C47D2FE124E2DD1799C121F1598CF228C09FBD970"); yield return (Hash: 3937308404, Hex: "5FE9D01869616F759C181AF49885D9D937533EBA8B2BD6C79B694549D94AC2A0FDCCEC73ED5A053A747AF87C506838699E286F2AA9ED1768868A1C6DC63448402680E4094415D8F2D2BB1067F4F071D8037C5457F11F0468977D54AE7C9E61F8D1813853DE660520CDF0CCB223294684927D829FE69DD0CC4328A6"); yield return (Hash: 222291166, Hex: "D228C2A65AD223FC7F68DB77B52C3A6D537CF68F499DB9B3B0143264AC95B48E85D66C0DC7A9210FBFD048801F25B80611DBA6B1DD2ACCC03F40A00D4D6AA390"); yield return (Hash: 2044130834, Hex: "560BF39689CE9CC32FAAB7DAD31E2F1CB2D3B243DCA00F9CAEFFD8C9C47140"); yield return (Hash: 1314214101, Hex: "BE37E2F2576AAABDD181DD2B3F80F99DDD1C4222CA9246C2CFE497F7301C3FD2E1C2DED55F"); } private static IEnumerable<(uint Hash, string Hex)> FNV1aTestData() { yield return (Hash: 1361456389, Hex: "C39F3471DD5B39EF0F1A1AE3F99E6B1AAD0B6DF07216C84AD21F4F8CE3B0F5B246E4D603BB7A6B479585B64F903504113F0F5650646A253E4946E0FF78B4A39843336C0C94507A121D81C02C45BF9AA57FFA9DE203E3"); yield return (Hash: 2608785184, Hex: "0EE9689771E018CBC14051613BE46D625A7E79C4785301DBF172CA972AAD44FB8F3E5BBC3E74009354C8E02BA480DBA04E77D0BC0E27D2DD14"); yield return (Hash: 2253803506, Hex: "786A2B79C92AA259D2F1DEC039C1B4C389FCC0C8B48C6B5126"); yield return (Hash: 2929817712, Hex: "250A3B188A377359666031FFE0EC9F67E344A1EF66A23E8A906996C55A0D9021AFE257C7BCD1079FB9AC3D4E227F6E6C5D47CF21B6A9C2B8DDF71FB6F0C710D2E24E6219A41CCD7ACB90"); yield return (Hash: 479938296, Hex: "8A59D34A7087B54B38C282A94801E094BA74EE8802DFB9A79E85449D59C7A57CD16FFC5113D20C9A9E9CD70B47983D2B1FD351ABE6B3F8BBD76E5295119157E5ABE16F20E6A578BEB9B3468E965F262DC48C841A0FFA399AF4E62EADDBEE5D5DE898C654584E39DD3BCC19C2BE722439C0E4424F3E62D47B"); yield return (Hash: 1987518212, Hex: "8D168C33A0A8C0649B8067D9826E5DE60EC048F39007DB564941B979888DEAE893FC55CD"); yield return (Hash: 1572158773, Hex: "35CCFADA7E6E76DCE4C3D9CCA720C9D98F62B585A78D9EB9A25D792A1C9C00B70246381E0333244D31980EE9D21138D517601F0ECA8006D2DFA49FC453776B5E8701BACBD439172BEFBD3102F6FA"); yield return (Hash: 3765341012, Hex: "DE614D883B9D73646A43C972159C68AAF4B3E5A1A128BA08C1E9EC5ADB8375DE4DE85109146D486C87FBA136EBB5402B24"); yield return (Hash: 350969713, Hex: "76C8A6661B6F0E6A61F2279747F2BB32FBAB2A360D25BAF5"); yield return (Hash: 2306635765, Hex: "AD6FF731FB82A92DD9CC7035EB0B2EEF5F8EBEB31FD36AED45EC7CB1EEA23021"); yield return (Hash: 662653619, Hex: "46A9F46BBC1D431C2DCDA104B560216202F90FE9F8429D8437847996B2524C80C12177469D99DA328E5617B2FD3EC46161D62BE38F9FC536405E2D43C0B82F84"); yield return (Hash: 1241428040, Hex: "073C1D12B397957411492E6663DE04CAD68AB7B4B0365B602F9A93C8D44E83D8628655E6C716B1842E22EF02E8A3470D56AB54D84D7BCA54A90ABFADD6CDA1F7BB0DBD2BA8A34E237D479E6CFCFFF3BEE5854470E6C0B6D4CB044E01B5E925B25E9DFE28568072EDA189FC641BAA54"); yield return (Hash: 372260000, Hex: "6F85C6ED599B457EB30D04A9304CA6349266AF829109E817E210E11324A362C09CDD85C56AD0BEA8945F97BD13068F448196142633A439DF405371A824F855FB372222C2"); yield return (Hash: 4255596770, Hex: "508F3C51EA379C751D"); yield return (Hash: 2147463074, Hex: "DDFCBB703A2AF2CFED9ED66C933A041AB8C5CA3B230A9D70BBCA37C9BF42"); yield return (Hash: 3811242695, Hex: "E8849FF1D2DB1BB9167A7EBBF09093C2480DBBF80EA511865D196FA65E9CDE36D1E8FFB67878D89A9C9E103AEB17F0D373AE968D5282F8EB21233CC291AA56974426C6BCFE59EC39BE89EF889409A284BD8ABED31C0D55A0102288A2909C3E8B26BBAF2DE641F7F2A04B18A9F001"); yield return (Hash: 3183583768, Hex: "894F3A002BD34221DC1C0E93C0ABD14215578EAF56DBF119FFE80A9A267D64A2FB37E9CA03AEA3"); yield return (Hash: 3093827160, Hex: "13E241CAEE3518A10E1086B1CA72E8C9CD4FDF24932F0B1D219976ECA13051E57D8CC82D7C131E3656B0DE4C9264CF7DEB831DFE31B96A64AD4B5168141E577C269925B0110B7651D0B8413EFD67AE118277B94B5870FC4937ED50D0FA9C259A6A74FD1A1848"); yield return (Hash: 1935616554, Hex: "10EC079A82855E84F8E1EA0B8132F0F00A0556E2858D93435CAD14F33990D04CEA9111DE8DF002488350320C5E9D0CC6C7CECC8FE212644E71947A7BDF53EAB03AB85FDE3CB1D605FE"); yield return (Hash: 1686441197, Hex: "5CF031F375B84008D26A2BC6B122051955F71E186F20CB3D3DCB4D5093C8740B1EF79D31C441AE3B5D11"); yield return (Hash: 2088135941, Hex: "A49B8A26B331C60EA389C77C793EC6F0BA85608FE532ED1E7FE978A740BC2E02ED22767490D40D"); yield return (Hash: 3416715355, Hex: "7DB3142D94B9BD9B8BC7DB720C34152742DA62648915C2A055C7375E37A1CD244C9FCD516D02C94B91C2D0FD71125276DA3825FAD882362F9FEC5E9E0C900B462F0F2C195C348E27C457842F333C698C9B4773CA3B4B3F49CF68284A7BDCBCEBCAF1FE2B42BEE9F20EF2E205"); yield return (Hash: 3693179735, Hex: "C682036D7F28F4BDFF41A86640727C8C0756678BB71BA1094B1E2FE5EE286D4B1490A1DA0E5C72EE28AB5292955A767F605F909D67395C8F54F5AFBF93CE499AF90B63F3132D4D43B0160C0AD527926F1FE32D50B9743443"); yield return (Hash: 2979101757, Hex: "CE895747E625352F7E8DB9242565"); yield return (Hash: 2339769124, Hex: "41B48C27B49FBB03247C3B9FD8D9FA798D98602B8ED5109FD15CC732CA5D5FA7751FE0E1248027E7AF7163DDE1AD6B1486D7729978510DA5D37DE4912CD4096C95CFB8AFD00F80FC94"); yield return (Hash: 4166965744, Hex: "7572B00418FA5F10991622E5F9F8F866BFDD19121C4C24B7BF91B6A8BF91F6B8"); yield return (Hash: 2941135003, Hex: "5E562D62D759AE2DAA62C5D1B0953C5007F1696A9BC512476F80C8D55C95F76EA118EF548410CDA00B034E801869BE43A66A1265E2CCD3A2358F660F8ABD147DCF61BF71F5AC01096C592D"); yield return (Hash: 2017351576, Hex: "98F91986961488039214A1B0DB538DDC5601983305D89C3E0E66D1605A964E51EC904F8B196081EF0C4CDE168E6438CECF4F38C76B260D99F0A7C2CD323D14E01E37BF179534BFF3E7C612E7AA3FFB90457DA21AB342236D8E6EDB2CEB1762339194FAB616E0B52EFE"); yield return (Hash: 4058281559, Hex: "BEFD3BB88FA6F97C88D7E60E950841DA3C7B784AACDB1820CF677E41AD9F7C40B95E7AA0C52080E7FF37538176A1E55A1561E3D513DC4DC058E2E4BE8939F81BA8357167F78A640B0E3B1269E2056BB96B91"); yield return (Hash: 312960025, Hex: "5C52C5F628CDC8EE19C93256CF3EBEC8A550B231AE070B9F0425D03BE9572D93E3F22A4BCDB2920211DE3F8CFBCF3AE81F3129A9A7A2CC6BB795C3AA7D372CEDBD2A25D8857370D8AFC7031CB55611C43645FC647431"); yield return (Hash: 3790049648, Hex: "FBFFE5F647144BC7161B9EAF76E0600187954DB8683C25B459B5637EFF3CB7E8CA66B3ECF6119CCA9C8A5E9B9BE5C521DB0B0C75754F40ECFE78ED9B2CDBE7EDC010EEA21605657A4B685620E48E97E5AD41124FEA651DF69AAB86CC00E8DCBE69F52F44570AD333F5"); yield return (Hash: 257192492, Hex: "B12CBD989818FD66284DB3FFE4DB2247F990BCD97B33935B9CFFD30C2B8C4CB7E373833C44103E31E60C536DD5B13201DCD9B91309E8A1B2770355380EE8CF3F6AEB8C8E9740E0FE5926A7B2C10D85B11089E73EAC8CA4F54DB9D20896CB1F2177418D66C497BA18C6BB1E21D9C37DBBDCD6C54E898E88F8CCEC"); yield return (Hash: 3337729486, Hex: "EAFE450B6D78E0F943299F7192D4E3E092931BBFBFE539F32298B4B1"); yield return (Hash: 3041093559, Hex: "413F52D0C30322D78770A6B5A10A233DFEE46C3E2E36C41B722270854E330511D61BB7F89822D598"); yield return (Hash: 2896722076, Hex: "F0D38D9F0FF2EBB3434144A66BAA14236BED2C3EC09324BE5BA3D9C48E11D9F800E98349DABE1EA895DC6CE22DD76B3269E44E8EC41EEA7AD4C009B0D12B72344AA69CD3F4E502EB86C6352DA5267C45FBC0058EE360"); yield return (Hash: 4046458705, Hex: "76E4EE676DFC87B5B7A04B828B647A01887B2F9947C5C794D4C1C3BE4C57D2734D2EC19F9FD557881CFEA751616138C46964827E2877A3804F60E19CEAEECDD07AE1673CCC234DDD2553F9E4CE3DAE7D82A398A861BF3FC6A5F54C9ABACF95BB794E610230A1D1B53CA6"); yield return (Hash: 1953775614, Hex: "0AF01B8BCA716549FC313110527578F9177782AE68767A3903B5C6C4B55A52FBCF599D7E00127EB7ADA0F488EBA7F734C37F911ADD6BE442D1291A2161F139D8AE"); yield return (Hash: 1061007274, Hex: "D51761B8905CFDB41F728987BA8F8C816BD9BFBF95BF57BE5A6DD648D26829B0D4241DD15D9AE5C54AA58DCA25105B05FA975357341E6AC5F8AEF3AD007D17D47F6B91A2104965B221E3"); yield return (Hash: 2885560163, Hex: "3C83A4CB8AC333E107D186B0353195F71B8409A21E2A2B94C4FAD2FE45445BA521BB7BE12920019D600A695A053638D79C5E890F05FA409AF651B691A657AC8079CFAA3741F9"); yield return (Hash: 367681258, Hex: "DA5D0394DFCAC82F5E5F3058E4F4788991000DCDC264A30B840F679CBBD690EB934A3803F2E7A7"); yield return (Hash: 1312982385, Hex: "74136CD375821064806D00FE71D7E665DD26A08C4E92FFBFF529417310CBADBC8FB0B65C314032B1D24947355B498615E4E2F2D2A39652400B4CB1024E00291E1A21B2D205273DE459D09BED90161561D9D7C92ABFF6CEDD52F0A0CF1D6B3970ECC83D18F2"); yield return (Hash: 357664514, Hex: "E6FAF7B32D"); yield return (Hash: 3850666108, Hex: "3541F4D9DBDCE2371A38941D3EB934B792AB489ECD9592A101510BC3628FFFA6907C8F829C6B263FD180C6DC3851087D55A12DCFC0F5D1546FD131343B118D95C3C08285"); yield return (Hash: 1319863581, Hex: "3766978FC68A2A9B59D4271ECB2E1B66BD56B5E393BB1F36C92310D59B573AD877B58F49C5AA9F7609E941E7C7539F07DA055E24EE5993A44347753A28E9238D76B930E0DD8A00E426AC657E833CC4B1BD9B61"); yield return (Hash: 1909597356, Hex: "C46F1FAF0CC34B1FAADFFE3FEE52BA9926A17BF35E975DC7828AC7BE5DACD58AB145DDA45E1E0CD642E38C1F2E5F33461D7BF7742C71C32664E97185F47A48ED655534B5EE627B69EC1AF7C1CCDD9273A898"); yield return (Hash: 1230143715, Hex: "87DAE7F7599C5B1F9F0151DBDA9EAE7697F503BD441D889EF048ABAB44D5BD3E248DC913D45D19006854EB3D7C1FE12481900D76F92C4D830AFD8451E8D876A3163F1CEDBA0986CF5FACC98BEFFF0DFC2A9D96A69D2341A4A4A67835025388205E952E38C39BB558A2938C6550D028E321E35B912B9BAEE54A0A"); yield return (Hash: 1517782810, Hex: "AF3383F543B6430F14F7D44651F2E732F73BE785A22F4FF250A84D2421853FAB312D11D2A601926C6FA19F976F154A3CC4047A13FDFED1E0353F9E5BF3A38AE7F215E8DCB698D7E033F69F94E2EEEC2CB5DEFFB0565413CDD9C3C22DAC4FBFF6CE57306FBD50AF4A33B68F70B44D2A4AC0315420F2781C6D657D84D2867B"); yield return (Hash: 3913863138, Hex: "36D15064DB2D07FF1D1C4F5F2FC7BD6B99199C65AFE7D77F53107BFCC91C87336E58572CF5525870E0EBE58E3FB359"); yield return (Hash: 1031960380, Hex: "E0EF15079E7631C869AE181CB3B729663EEE565449D5EF6DBA53D90C95056C83A21D7DDD682212B54C99EC3618A609A90D66424CAC7F4F1D12CA05E62D1699B0224ED3F19ECD98CC2C694ED5BB61E997C85FA7F2BFA248B09AB44451D163B7F743"); yield return (Hash: 2870556520, Hex: "6FBC04B1D3C4C2FBE69A58D96FD793FA5F9528429B3026EEB4C4AAAFC43E2F2535CA201DFB88CC0A964D1EEAB297972FE994F06CE4B2815039E8ABC182857E16103888A361302EE274E8FA6713743B3B3DF8CAC32FE8D79EC699069B36"); } private static IEnumerable<(uint Hash, string Hex)> FNV1TestData() { yield return (Hash: 2635463645, Hex: "118E53AC4261C1B2E2F3AA94F89130EA1B4807BCF664A78A16DAA00F59DB10D02657DEF2B8C1D5A1CE2BE8FF63EAE3986A8C08BB4678C37EC8C5EBA229F95A97223C2DE2EB88D06B81798049EF6EAB4C777C1CC811B8253489F27CD2B2CDF45A482E2379E9136053794DE3CCA821B71C68F39211AECDF4CB8EA0"); yield return (Hash: 3554551697, Hex: "E319A5CDEA34972F3E2D7B81C24583CA5E763DDA8591E904B9F9C1716769155A7C9FA9D17BF09AF2711F1E8CC6D32FF7FB133454A4ADC643699BD1C7AB484E098CAA95ECAC15A49F25E81AE357A7B9520589CD"); yield return (Hash: 3982721760, Hex: "6AE05848413566607872541ECC76D4AF4A"); yield return (Hash: 672705717, Hex: "A02207BD7349633F37845DC8BD3D4E"); yield return (Hash: 2990425823, Hex: "B9F7A582AC8682B5F7D86A8A7DC9CE47EF386D00BE7FD7F2648CAD082A9CF7CED9127883458B640DDBAC0A3FA03B8E9FA7559EE249E253D2CA64262835044AC9B030D863B857290B34D45B88792BA3E64BCB513D164E02C76D0F1F17"); yield return (Hash: 1617851715, Hex: "FB1A3ABAD624FBDE518919F90B0CBDC3D164AADA18AF04674900071045129AF10C0FC15B699F0DB0F54AA51E7499C0C2D5B1D41EA8A0A30DE5AF1281F7C8DE5FD117315B223177D3211A2EC7F9D384930CDE0403A450733AFCB6BE0B6B6BF8D0EC4969662D2E218DB7C4BCCDC887BE97F10AC9EAEB2E6D"); yield return (Hash: 1997689341, Hex: "B4A95302A89926C834D03E244023A4F19733C120"); yield return (Hash: 710844990, Hex: "D38D62FB42AD3A9E16221E7C57E6EDE8F66321E4E757015E30DCB794B34B435376D443651A48FD90"); yield return (Hash: 334089402, Hex: "DF6CEBFADD1BD0AE528F2A87D1DEB53648C4FF1204F0012C306EFF26108E7966F9734862801E1306FECB32040E94B27767B63C462CC7013908303A5B81D6C3C8E53802CF39FAE89868D506C31F0BE838160FA9"); yield return (Hash: 796899110, Hex: "11EBBE80570A9F8FD49945FA9C67294BF80A30E57708D2D03E5674AE83D71C55302221C0E15C75CEC29D51F88E8CBE4F8F00208E5C3412386423BAF6B24E"); yield return (Hash: 554746798, Hex: "E716A769AEAED214344BA64AE4D972CFD13A4A930B76FC5088DDC018D08337B02F35EB687800E8CDD91ACE22AF50067E13ED9B"); yield return (Hash: 2598448612, Hex: "1A6206EC89"); yield return (Hash: 3499195506, Hex: "E5DD75F87DCC85C3DA448636C10BE0F49EC647AFEDBA5453D7ACB2FC3F22CF7E56EABCE4D958BC734C55D7CEC29D5846354206748E308A29235B26EE08A8AE1B52DDC11A4ADA347BBD7C90F62239BC7C76BE159C6286CF5E05C5CC8F8762352E051B908846311A832FE147546CC0C48EDF92AFA10488"); yield return (Hash: 496228964, Hex: "764395328F06D7C708188A15E05D4C0F10B8AB3C49923293EC1BFD414723AEFAE5CA681E2CCD5855F015A318E243D33BE54B48DEB2A8774DFA16F7B6F44784E597A3648905B5A92A2E0F49BE1D3B50A2D40DF5550E08C0C32D9103633BDFA6C4C9AA93935CFEBB175129BEB96F0CA43EEA11F0"); yield return (Hash: 3708071514, Hex: "231C6FCDE0CCB5326DB0CE296AA1"); yield return (Hash: 1489016575, Hex: "4C29A62B7F71DAC0B3DA82CF16F66E95D8B1C1B089C881BD5CA55E67CDDCF78527F6717136"); yield return (Hash: 1285004468, Hex: "1A0F37C1FFDD6496B9B91497B83424338F1A50BE2CE52077C454324859BD8212F3EB8296618EE7B89A829E9C5D"); yield return (Hash: 2421629476, Hex: "35961DF93E43F8C5DABF6B47E32AB0B1930E331D22C8EA2DEC71EABAE40C2160A1DBD6133C6F32767F22349D631B2EA3483DD08AC2E5D7B7C8D6F60F17085144C4C171694B3D9733B83BC84A0BE6"); yield return (Hash: 718757354, Hex: "4987EF65D5F15275D96030819476DD88D294D01D11DF3CFAC427CA5ABEB8C3464B446063B49E60E399CD6EB039788B6C894A031A4BF7B683F9E2E11827D2A68829D78A538EE35F5AAD6C0D2D0078A69DD913DB535654621790F6AA7DDCAA55D1A688E97D894D938510468C297C2C31979CD2E1"); yield return (Hash: 2152987200, Hex: "97E816ED628705D91F057E63FB8D23186E8294D1E834DC758E5EE5D6820A13D07F85D29AFB15D36B772D5BA0ABB92BF91841C40E6FE36ED48F8E31D83E1BF740DC7FB18DC7C87931CF5CB252A58CE0B92E5A3FF32A0F5F702115B94E"); yield return (Hash: 1917736693, Hex: "FF7E577A035D979747EFAF9CA6A035C25E05E4F54A8397083EDF56A6A4379CE6D50C0692104697B5D03B3619851F0534EFBEAD2989E70E2B65F0D5D73858CFFD74564DAC101A6D58981307A066B726C6DA3422BBA260BF61B8876394D563183FEB9B"); yield return (Hash: 3944322793, Hex: "8FEB17B2F6F95D9A0DCD05E89E9C21E22706E511119F1A6AA46BF8895DE2E445383890A5267F4795A538B00382B0E00ADDDD728BE2AB20C4A00FE47AC821C1A4894B71A3B7F248B763814938F1DCC72A3D1BD271113718CD8D1781C9A322E79E2F7392C8F22881CABA0FBFD54D8BDDFCA91E1A22D0C754F8ED20"); yield return (Hash: 1786860816, Hex: "983738658879714AE00690EC5B5AB4C25142D431C61021CFC8271A07"); yield return (Hash: 3735522879, Hex: "D98945D23F62E1A51729E61C7E7E0F30D770553638262232D7CBC56E2AF19F5C824363268416F2D5F7C07DA866AABA32B8287EE0E051D7B5D7C6BCB82353BB729217C70F0FCA13A7E24E1B07E10A81AD1CCF50276814ABCD44F8EB"); yield return (Hash: 3276802671, Hex: "35BC70A9E9F63B9C"); yield return (Hash: 3581834553, Hex: "DFDF1338B3D512778092575D45D9FAAB355C2CC5F2D87F52B222927249D6DB10916D100C7394E199644B5A6C98DBEF9370D7E69EE33592E43B5F78AB5D"); yield return (Hash: 2682332667, Hex: "EF291C6D9E6E9A11A2365B730F8F"); yield return (Hash: 3167559903, Hex: "8F8FBF3942A204C4376A22ED45D4BCF767E536BC8627E6A7CF5AC9D8D7544B"); yield return (Hash: 1505748075, Hex: "5E302BFF6D2AEF77FB6B723AC3767D0D47CF2CF44C7782BECFF5334511114B2A45B488E8065DF9EC7832F2A677DEC15C64684FFAF0CADE088AD61DA95B5D9AFBF4FCFCA1037346208C8404967FA233"); yield return (Hash: 3445243446, Hex: "F96A7E5D703CA6A81F29C2DDADAAB9D517A02553F180E88A046E493C61F8156A36AF0DCA9B66D216EC48005FF1EDA46954EAB429BFAFE7B8DD540D859A5DD02C400BAAAE52665712583748E7DF166CA8F6219611DA738C5AC3AB7433BEB09A"); yield return (Hash: 1006732137, Hex: "4B7C67F1A7A758F88D617BD1428F894374A0459312432216BC95BFAE6A85D19514B5411833A3238B2D06375C"); yield return (Hash: 3113778847, Hex: "75EFF30CABD2"); yield return (Hash: 350882350, Hex: "225797E64D5B97598872AEFBF39F1000FD88B54F4EAA199BC43B871481B3E9050206A838D1809252299162FB41CC2A666070542FFF6A5D02EEF7"); yield return (Hash: 3347250713, Hex: "1AADCA83D0DE540483A7BCFE3649B3763F2B4C1AF717A16865C5731A376522874BA7FF8E392E1D984E7DF89D69795C48A5B8848FBDC0E7C6FA7F4A4ABA5704499A74B1047D9081F7E745229F3D56BB6A85CA82D46EEB6F0247EB2303CC23A379C45A1412DAE7711541DEC0"); yield return (Hash: 3820365861, Hex: "31658A5FBF3AF595603C20F31286B3280320C633C021B66BB20DCDA35AA5A7C17BB92B5D"); yield return (Hash: 4251210636, Hex: "3D6D9A80C4798BE2CE204A53ECED97990E24FC4109CFD4DC8572F8FA9C2DB7B83BD98FB9185AA00E382EA83A4117E5B04B8842DE5180AE60F9A1B13DDAA28A164D80FCE5"); yield return (Hash: 1004972091, Hex: "CBB5E2C7C003C0EB7B7CC139DDC7A744EB4C5970EB190777A970D39921847C4F825BC614D62EECA1F27A4D1AA2B7D893F344D185F17A5726629A291BCFF427D54083"); yield return (Hash: 1637392008, Hex: "BDEF7F398AE1DB30874ED3C7FA04F018B1C3ACC11FB711ECFB663DA6A620436049BCFFAC6B4064951EF53BC4AE218817F35170A6238F14D0352FD4501E4FC806BD7BC1F8E7BCE3781595811B0AC8DCE7CD978776ECD399C24B8F3CF874E8077427AD64823B3D69A7AD9A934F38F1CFB294653F7C7C49F08E0D69030B"); yield return (Hash: 4012815856, Hex: "3E53E58324020DF1"); yield return (Hash: 3766955629, Hex: "32802317BF6CD45754C8991E81F4A3627FADC7AB2AD81EE7E550D41834F93C2C33FCC4939B03CE9B22873000BD25DC6C2F1679524BB793B21C6821B4982BCF82B1D2EF987544C9EFD7329A78006568CC64F70E15A5FCC79768357D044BCB4D4A1A173DF3F8F029F94A5C732E38F4082E41F009B1AE"); yield return (Hash: 3827511978, Hex: "D6669415EB0BB4F657EACDEB18E44C2791AF251BD303F73B069BDA98A59E987EEBDB8872C905BA2F20BF49FA15208E033A72E55D35F1A1ACB47294252BE69701F5CD0D20E97C"); yield return (Hash: 1670646873, Hex: "4C2D28E32F4817289B67392319E76F084D5AF1E5F9585321D30D1ACED7FE3D52F3E3218B6021024A99BC205EAEE1E4770BDCC02571F102D15A0DB2EF469D1FBB2F400E20"); yield return (Hash: 3489845652, Hex: "5506700AC494CE0810F97074923CA577611BADFA038D24E97CE8AC07C371747899250A5A84966728BADE56F1996630052934FBE29F6C16F872CAB711953FEE460EBBC93C8203B54621E63357A4A982ACAEC820ABF2D64B694C74936224AE951B6B41FDD40EDB28360FF718FC6D0CCB7622DB"); yield return (Hash: 1048038136, Hex: "8BE86685ED8EEEF020848D6C19F9422815695F558F73BECDE8C24790C6358C8E7F561808FC87EBFBFAC0BC1155628ABB34C0FB7AF384FDA9AD243B0A8388998D8B533F55FCFF90294644F6631CE0308781D2CE99307314EE1B06BFEEC8C1AED00E5BF0B555D6AE7B460592082AAAA41D7BE415252A05"); yield return (Hash: 1877284463, Hex: "130725DBD49174511E9369BC598462CBEDD5201DD1F79DC5FAE3DD7B88377F9EFDCE21CFD69A25362137E328B2C56901F77AC651EEB3875F3FE68A7EB6E10BA02D616E"); yield return (Hash: 3012322111, Hex: "1522699E28DF16B5D7886373131E3829A0FE0F78A7043A2C6AEB5141A9ECDF"); yield return (Hash: 4014607478, Hex: "332152DE740D3C0850E7EDF50C16A56A29C39842B8726CAEE9F4FBCBA08C241772138E65457F35FFF50BD4F89041742ED26133AC89EE13D9F7AF199A6E456BB99862D827656FB84B276F3C2E770AFC2AC7F985EB73"); yield return (Hash: 157816068, Hex: "4D2936D4EDC732730A37C56E"); yield return (Hash: 281191578, Hex: "7585DEAD72C56152F8FC4E5D71EF812E48DE425C79164EF056FDE93BBCDC662BABFC2BB3BA909BA771FF2324885E25B61181CAAC347407C3A23E1313F5F3B8B30753460606492FEDACB4073A36EE9A9C5A399AC5E4A754AC750F05A50FFF75F1689AE2102FA66F974838EE7D53A10480B3A6E26142BC"); yield return (Hash: 441585460, Hex: "C6FEC97C7D5841B18CAFB59898A9AC09CA480594D8E6D02BC39604FEE2E02719EDDB845F27F88136BC67F63EBBA2312C212AB8E7B7CC06F81B9DC1CE018E9421CC8310A9E1362829D441ABC29289E86CD5"); } } } ================================================ FILE: test/BloomFilterTest/HashAlgorithms/Murmur3Test.cs ================================================ using BloomFilter.HashAlgorithms.Internal; using System; using System.Buffers.Binary; using System.Collections.Generic; using Xunit; namespace BloomFilterTest.HashAlgorithms { public class Murmur3Test { [Fact] public void Murmur32BitsX86_Hash() { var tests = Murmur32BitsX86TestData(); foreach (var test in tests) { var hash = Murmur32BitsX86.HashToUInt32(test.Hex.FromHex(), test.Seed); Assert.Equal(BitConverter.ToUInt32(test.Hash.FromHex()), hash); } } [Fact] public void Murmur32BitsX86_Append() { var tests = Murmur32BitsX86TestData(); foreach (var test in tests) { var murmurHash32 = new Murmur32BitsX86(test.Seed); Span span = test.Hex.FromHex(); while (span.Length > 0) { var n = Random.Shared.Next(1, span.Length); var d = span.Slice(0, n); murmurHash32.Append(d); span = span.Slice(n); } var hash2 = murmurHash32.GetCurrentHashAsUInt32(); Assert.Equal(BitConverter.ToUInt32(test.Hash.FromHex()), hash2); } } [Fact] public void MurMurHash128X64() { var tests = Murmur128BitsX64TestData(); foreach (var test in tests) { var hash = Murmur128BitsX64.HashToUInt128Array(test.Hex.FromHex(), test.Seed); var data = new byte[16]; var destination = data.AsSpan(); BinaryPrimitives.WriteUInt64LittleEndian(destination, hash[0]); BinaryPrimitives.WriteUInt64LittleEndian(destination.Slice(sizeof(ulong)), hash[1]); Assert.Equal(test.Hash, Convert.ToHexString(destination)); } } [Fact] public void MurMurHash128X64_Append() { var tests = Murmur128BitsX64TestData(); foreach (var test in tests) { var murmurHash = new Murmur128BitsX64(test.Seed); Span span = test.Hex.FromHex(); while (span.Length > 0) { var n = Random.Shared.Next(1, span.Length); var d = span.Slice(0, n); murmurHash.Append(d); span = span.Slice(n); } var hash = murmurHash.GetCurrentHashAsUInt128Array(); var data = new byte[16]; var destination = data.AsSpan(); BinaryPrimitives.WriteUInt64LittleEndian(destination, hash[0]); BinaryPrimitives.WriteUInt64LittleEndian(destination.Slice(sizeof(ulong)), hash[1]); Assert.Equal(test.Hash, Convert.ToHexString(destination)); } } [Fact] public void MurMurHash128X86() { var tests = Murmur128BitsX86TestData(); foreach (var test in tests) { var hash = Murmur128BitsX86.HashToUInt128Array(test.Hex.FromHex(), test.Seed); Assert.Equal(test.Hash, hash); } } [Fact] public void MurMurHash128X86_Append() { var tests = Murmur128BitsX86TestData(); foreach (var test in tests) { var murmurHash = new Murmur128BitsX86(test.Seed); Span span = test.Hex.FromHex(); while (span.Length > 0) { var n = Random.Shared.Next(1, span.Length); var d = span.Slice(0, n); murmurHash.Append(d); span = span.Slice(n); } var hash2 = murmurHash.GetCurrentHashAsUInt128Array(); Assert.Equal(test.Hash, hash2); } } private static IEnumerable<(uint[] Hash, uint Seed, string Hex)> Murmur128BitsX86TestData() { yield return (Hash: new uint[] { 2215698659, 3032003959, 3503290373, 4051986413 }, Seed: 624323927, Hex: "5AC76D60C892111F5122A371871E17D5993E732E9A670899D5A9660B106502C5A85630A6311A3D46146121B193"); yield return (Hash: new uint[] { 3154649860, 572048720, 4281386050, 1363778496 }, Seed: 1463608608, Hex: "7259177D8D8E5838D716ED561E6861B6EABCA2BFC600CF6CC7C2ECD01101C0F61E59A634B175B610CF547EA66B75A5A4F0FD81E2DDDB455099BE303CBD33DCE9C09C6254D6C7E02BBDB14E3E81AEBDE30A4D14C5BCC03D10C25D194DE9B48B164E1ACC53ADFE8E82EE0738EE7EA9E6C60EAD408CC004070982DC8D1BA560A6C27B881D9AF4406C5B900F754FB6EA4F535EDA15DC95494D21864FFE5C86C76810EB8147AC31347270C922827FDD940729944E82BC414ED1FDB16DF7B824040634A45512D37CAD2A589A7C77905DE05AD5580E0D9631386C0969668C5D5DF3791F58AB17DB3D2554714BF0E27F70CB8337A62B5CD9A2C5CE25248F1407862A890697A034E8BD23FC6EB25EE041DAD4687C92D745F9F85E82D0E6FB1BC0B93B975A4DAF1D7F259E09CF87542230CD0EA113D002A572919E67924C7EF4E3C1A42C868785CFDAEB9081CAEE31C297B6861896DFAFB3E922A581231BA9BE48"); yield return (Hash: new uint[] { 3396939834, 2586312543, 3441226297, 1709100437 }, Seed: 884763529, Hex: "7600090892A3FA6EC758678EA3DB4D0AE15B9B22374934F3DC3421EF9ABEA9D86AFEF497391C9BF3EB4CB238CAADCC8BFCE983E50699F850CDA8A4131A26DEADE23E046FCA47A51E5D949917C74DF7A50C7C2A1957E43C726C1107627E677F5FC50DF2033A36EEE0BF529CD63D061A0891821C21CB1959108C90F79CA428934CE1D728D64806056C15CD41F3F1BCC0D339BC57990EB08F2905085A75B9B7CA6DC7DE8D4B20B52B44EBE667FC85E3FDD2FB7AA0788746421E3EA1D3D4F956C91BC0EDE7E163BCAD1940DFF524E8E09CABC4C166016843D2B71D25BD39C429E0516CBB4883295A7CFE72673F01092D8CA0586372AC6C59FE8DB78A84B85294B03FA8F035DE9F777059B8AED320A47104AEA6340D000650F5A46A96AF9BE6DBF025B4EF59EFA88C009538B0E8314FD1B387E57531FB42F1010CF94C6E8927BAC6412D85B9B445E4F999D2DA09AA9F525DA0ACDD8AB37C204F5B5E9F3EEF875AEB29E2AF2692EEDBE9F0DD6AD64E7794A33C27FCDDC6CEDB13C4B6D3348E08B8C8F9B2399D18B19F0703F741230249F828B95DFEC555EA324E914FD4A903FFE259"); yield return (Hash: new uint[] { 1527664213, 633745573, 725028302, 3745625528 }, Seed: 1548519348, Hex: "A3BCDE6A573D1F07A8A445D0E36537B3A91ED1D5B279C848C21FDA3A75A5834DD1F120DE639DDA6BCF5B3F5CC27B4BCB50601EFEF973E0EBEE737E16E292D8C2BFF9D162D487EE26E7F0F4983509C71243DB46D3EBF1B40F75CC0DF04A33257053041EF3658AE5D3A03EC2EA84E70E12C02D9D09AADDBF1F28476EEA21C9A22BC23A6193C06EDAD02099AB4B341B90FA65C76F8E8185390F79BC92D97EEDCA0AFB579923541C739CAD114A05BE134A4F145898B84EA8F629C7DB098CFD00BEBFEC443266E93F94CC9683E8BEED8B0E07B53496A7AC8FEC180CDE059BCCA28FA9995C904B354AFFCC7231F48065BA3ECA30E6C5AA8A0216EB36BFECCD6EE78C55561EE9A159D431A8529670"); yield return (Hash: new uint[] { 2814272976, 2376951385, 871351497, 1880781378 }, Seed: 699095942, Hex: "91D4A9013ADA4B7BAF5BAE8DCB6A42A1E2A0CBCC51C19BF7E93C2B8C1FC52066F0592DA28426C49B28D886A42EE9E03580BD0C641CAE91870AE87AAEB76200E75B84453252D4740294835AAFA91BEC737DC13B3040523323AFE3179E015D99414D754523502509F962C6A5E7DFFF8D2AD928E7935F95BFECB29BACB2B1DC235975FA22B0757D0F2F286A11A42EDA34F697D04516B20B790CF10B6D99C30D8DAB4E68A9ED4B202FA2ED3F0EB8F7A3761CC009E7366B51C74A8209923DFF50BC054641200AFD0A042DE92D0164FBCCDA4A1C4B1BA38ABBE48C8D07BCADAF64383EBC42583E4AA5221010BBF156B5C294B5C366CD9D47055F8EED55663035EB5A74F829C758F1635725D4126B82E8EB7FDF8012B2789ED3D8239587F4D179B1875EDAB30CEA8259413D56A6EB7EB1EBC56DC59A123E76FA2066FEF93A8A2F4D26C458BC6B8E1189545019C60F0D4594E8A329D29BEF854C843A8C591B5E8DDB5719525BA16FFA"); yield return (Hash: new uint[] { 3157099896, 4253082395, 1731844123, 2146741131 }, Seed: 1077983759, Hex: "7C4D86E4FEA6565297803BA1BE27821A08F53A5F72D0409CB65527C1AF1D1CB0656AA92E2378808C7A787DD443BB0658A170C19FFAC7B52548F6C137AB0143578B80EC6BCE4F5FA8DBBB58E6D090C82B185352EE242BC2590EE8C4E9A5D124E592651BE42ECA7CFF20B86A02A38D0936BC0B9C504BDD957EEE17BDA61616772D5CF43F777B40697A5720872D2F0C3404D5907D658945E2F5EFA934328309067114AFFACF78EF40B9297DAB86F637C60AD3AD40F8703F954D9AB74C4F740B1EA8A390C3026A2CB630D722D3CDCC794DA74BD62C7246F89AB4C737EF04F14CD80FB043FA03055057C09D4C5C7DC6F1B52FBC14755A7D053376685BF0FE242EB067C190269BF6006E6CB407FA64C479641C10796299F3223AC61CB58BD55D4F1998EA430102053EDB9EF8AC914BC09607EE242566AB3288A98382D5E3D789E1B49249916E8FDFC336CB60FBBBE7E07D4216C7341A9E08E8A92A68E4F4DE515D8F68538CC36E36A6821BBACE98C666A2F0765A27E284D1AF4556E8EC2CF1C59D15A349BA1ED6F0B6ED64856AB04E5EC23ACB837C80F75526CAAFF2E574027158660A"); yield return (Hash: new uint[] { 3011620754, 1922841245, 757695589, 3009933068 }, Seed: 342502790, Hex: "7C421F7F92B6A97F4696236262C81518CC26E301EC239F55D5D8E93BEC85FFBE456E17C3A84550E629A0E2A78615153A3FA05BA260609B291F7CF8A8C5F2243865A51AE3FF5EEF41224D3835F77455388F122F50E935FF47EFA2CEFEDD4764C70450D2A1537B1ED1C0751996411EB813158FF156F58AEE08ABF02EB2CD640882EDBBC626951CD7FEC7C5DECC599F287138C2DFBE5854C005A9BF2A65E12B4076BAC3827FB191C32C6326A7BF4A2D438362D404ECB82CA93C9D7CED88BC08B1E65365DD38A2C95CBD1BC92F6662C47520AD3DDC33F2BE7642E8D73FDA1342D92B3FBC1DD947611CE242C78D870CBF8A882A34E2ED93BF7DA37C58248DE98114B1323831E02746FF42063291A7F3B270DD16E3F8EC44C9BF5D7252D893965545BF2EEDDA6E67BF2B011C155B45F969DCA35B3535EC75C3D95F018AC3CC5FD2711EE50C74D9A090C11F7AC92C88CA1DCF8774A3653A468917CE74138CAE29409D07FFE4F6DB18268F6AC90214EC7093A1C16C9DAFC8D6EBC9847564D5C98AC1951905AF8D4C6AC414D438E007FE112791B814CC93C040F59B0DC8B1B856044F5DE812EA8936D624B508D1CA48476BF645DF3053156E78902953075B2C411F5DFE6D83CC8A89E3C8BF5854262D4AFAB63FE677D8678AB04DE3B5E6C70FD5029FFB4097A3E8835021CC3681843C27243BBE0326F5A6057BD2E74C0AAC3B"); yield return (Hash: new uint[] { 1390625245, 1509992835, 3393821357, 905365800 }, Seed: 66510750, Hex: "23190504CC8D0E873E4F308B72070DF1BE692359AE0D8864C75ED64DCC5E67D74AB0CFEFB92A4FCA3CF7BC07EEBC4A9DA8C3EF1DF1442220279DC44821BD5D6A62996DA44146D19643487AE5CA6082314A2F5F2ECD09E354B9BA5F1F4C7B32ECEAFCECA95A41C2667D76C51690F9E2FD1B1C6C"); yield return (Hash: new uint[] { 2700877340, 2890106784, 2482240300, 3839655744 }, Seed: 1268474063, Hex: "D7877D9842609C596A1AAC41C8ABC98810292EECAA6345F178A6D47825BEC4FD86E1D328CC96A8E0F9715E6BE4E0AFCAA818FE2840F0423ABF8748CB8A5C275928358F44436C68A2ECC52B8F2D4AD309EF1370616A6181E7E73BF0F3489D277D24370A03525CE6CF9F88AF2D17329CB749A7132D1890E82325337F6CDE053619ED2D1ED34792F104F3DFC1B3DA5BC81D6FE2017DE3277403F86B488000C6CD815A19247576DB0EFA27FEB4598A9852BD3F0D09ABF34137A7C069FEBD28CEB2E0EE9DC23CE21C26061513D3C888C84ED5A4E4CAE2918B37BA2B04F751AF7D9EEC27E44D71D8019176456157E5ACE56F7A80DDCB4702D900E06A902B3A2039CBE22736B04E28219BFBA4A9B10BB9A19908D4B59AF2250122C378735D629D1053657D14E425E17F1CB5B50E559617221271F52CE5968AB35ABB6ABA69C2F963954A1967456613DAD186A8D7D7F54422D60235CE5B10AE8D1814321DC8DB520F579F6B0D1DAD505B32DEA04B60DF9FD44C59E66F21AA491B798BA3037CE605AFCF12"); yield return (Hash: new uint[] { 1371950926, 4217458030, 2481921480, 3800305645 }, Seed: 500631581, Hex: "6C55C9C761583F2E311199AE66172E43FDA107E4421E4163FE112391883CA3B45675AF360D38CEF99D5740B83FD73D77C083384157572F2E880A4C2C79A737AD105A391271A364632E52BDBE11CBDC4B4053A167CD1E6CDCEFDAB07FD091D2A718370D3238D32C131583F1482054CFC4C8C9B07FF6BD4AC1D67FEC69C553CA2DDC92599BE916AE211BE901FE62500391D2050BD0293CDB8AD35F64339A44ED4FACD362730025213604099957B1CCCD1E4F0B052037FDC1E6D99C4A2009AB100352D19071D38E5DA684E02B8E187AC91858DF0BB89982633418B6A825B11D4BC66AF7E7973444481DC38F0D5F8C50AC9D083F4135A7CA14279F1C721FC1A37E45358A7EEB67D2B3A88E01404023BB0A16A9D7736358714FC6F07FD7E81788F8190276281AB0677FA852F0F78C501ACBA5A2F038D5FC96088EC64C5C2DB3DC35F601A886896D856FCE452007C8101CBAA4DDD15769F263E2638275B31DFF3F1A623722BFDF"); yield return (Hash: new uint[] { 2502744574, 2541527050, 3786137451, 3730535590 }, Seed: 2017078500, Hex: "DD03646C268E1FA489E701B62CB1D3544524C24DA7B0747AAD89A1F348D760B3DF0EFDA67BAAC5CDE6CAC1EB6AEA067C1864CE5966F5891EC9D5CABD4C0A39BCDE326C7B8CB9CE9B967510CF28A3CB1780789CC57E7D013CC67A6066E0AF14787B4BC78203652531B8B2FFF8D3F4606D7E26ADC3440AF0B09C456759F9A6BD72735DF546F5809C9BD120FFB4E23D2DAB1C004DE3AF96C4F09970473D324EEF062FF0C5760E3EA8A26DDD8FC5D4FA2E21FC0BACE6779FA23525B5DD2DBB9B5383D22DA07F05BE93902DDBB38F1C30E7F5FDA657B6772D63951959A970106E2C79F4B6A012E6729C0FD94731864D6EB3800DFA6F77027D8BE9F5BF8DD8A5C8AA37023B49D0CE9A85499F73F1E6C5BB28C01038F19E02312273994101E7F659CC44F32DD42A434305C5A35A972F318B6D2E6F78F60F30EE1CDCDD6E3DCD75BCCB3EE7B0286F1EC5DF08C3EC92A67EEA22F06D00D153E1F71047B4A165D3C8D5C5BA584C97F1D14D2A08AC921F1E2FF60EC9B55A97689055FD269289E96F17C5"); yield return (Hash: new uint[] { 2084706682, 3003618727, 2202871765, 2456291953 }, Seed: 1359206343, Hex: "ED2E34FEF1FD289FBE02C19E342C315BD7733A34170C77382ADA6D30CB42A39D83A36A48DA0ACBE9D49FB7AC242A6C3ECD22D8E7E217F0A02934373FF65199D218AE0028AF7E7E81B3FB5B607B6A6431EFB66D57A982FD9D34603E4F72810C942ADC51EF96F1DFC4B87D15FAD11986E1FC553644F6D145BFD4A683B9C4E17D926705AB9F6A9A262341BE597739442C123815E8CBCEA49C46C14453D1810084C9496EDE3879FEF14A66948EC117BBE1BF4EB1EAD4FFCE9B53DCDB60AD6E6782AE0A1CD10F587C26CEC01194B48307AC691BF216DCE395A1F465F5B7FAC6B833F553CF8436BF6FDB45D708CC9EB9FBC3"); yield return (Hash: new uint[] { 3968703466, 3176451678, 1680514600, 3400969720 }, Seed: 1248119151, Hex: "B16F79380EA9187E2677FFE47AE1CB6687CF5F06A077533FD701D2EE52373E3BEBD74AD42E4A85CC57FDD22DBC091B4C51FA360F6355E9919DE7A3008CAD97D27AF3"); yield return (Hash: new uint[] { 218831155, 290265462, 4063675822, 1338631774 }, Seed: 1847767441, Hex: "A173A38C0B47746795554195B3C42E9B51141F8149E31433043F1CEBBDE295B0E49DDC95F420C52FF730F96F781DA4F46DDCA22D9883BAD51BF238A8D45DFCCDA799BCF1A86C001486324F1E966C02718EF08000DF46F77AEAE28CB10721B02ED91CF0C2F599BBD5D1FC79519D59764354456E7861A6E30FC7"); yield return (Hash: new uint[] { 3888190080, 3191944965, 2140792359, 1011439969 }, Seed: 170083408, Hex: "49C7437C56A3E7869A4266CD54F7D4A5CD922A9610421F6F66C6F5DF55644B0B5D38FF79BA40144F17A786A4F170D5080E35AD11D3CA5CC659DE0A3A98D54F6E0EFE64261FF85DD638B868C9970E51E94883282C60C7F8B5ACDDBAD857754CB8F61E9FCBC804EEF963C72371B67859CE5FE18DFA068994668FEA584D18FA4EE35267B9C3E5EE1B61DBBD0AC4EFBCEAE0AE98675AF9447E5CA0EA545E54AD06E663D3B8EC9D9579960DCF39C271D38A1620BD06F1111A70E4F8B26A585FFB6B1FF1DD6E0F91B85C75C0C3B8CBC08870EC5E187FA4BB93A25C655610CEBCD992FE4D50F555AB3DE8914A7AD529193B78907013E260E2F3B43E46ECBBBA344476F09CA4BC659B3EF84AD429EA28B3E83F16DD3D76E267708A4E1C9E8764E09B5F07689594F1793F1F8CF6F0A1FB0A837BCBD64FC1E85175AB0C9718B04D01F5D153EFF429F6B5E9CB408AE50DF1C4C7BAC7079E1ECA764F6A602450FA3EFFEBFB0F6A8C926D87796F3225DBC99C87497123D584D561622027B9C5A67AB6099D804827736A3344F28525E88A7D20FC5C21ADC322D41A26975794AF4582C055BC2A2CF8F174DAC802555B69F5"); yield return (Hash: new uint[] { 3076913453, 3819946539, 486773280, 2532186942 }, Seed: 366007005, Hex: "2730372170F74CEB133137F348349423C4E2AD4F23B74D7BC6F34FB60D87182ADE8D0E587C8742FFB664E10D0C17A99153B791822455682E771E1FC3FC1E44A685BFCF71EA4F5A41FCD6DD4BB02B3BBA8853560A4D683BB1B530F77678F6832D424225EC203CF9E71D14AA212F431A5ABAC4A4E4A70DF7AA5E98A13E9EB086982B2DF8E4006530125E797741E6989BD92F319A4DE8932B0EDEFA7040CDBE08DF79FD9EE823AAB9B3231273E1193540D5124F1209F0F6C68F9C65068F22C1CB62926CB3C237EDF1E141831A7F5CC66D6D1BB6C5818B08C2395E3D4F028B8269909F5100901EC5ED0F5E1646D4723134C95EC94A2458048FCA34DF42732032395CF36FD85FD3B9BD9F83C5C3FC9CCFB62149279B3C4731217003E8E494F9C9490BDE3A300BD7D15D0B97E7B1247C9FE9BC3B9DBA1B78096B56175A7D6A0D6F3FA8F9740FEB44167F5461BD99749AA87E57311575C0EFD951D79F7937C6BC2961DDD824BA849A27EC21AE5E3534E3766B522A098D5487AE45B4D3A6E314E46515F3E887FD77963725DDAD42163C04258EB46A3C62F06473E7688044BC392AE1E0058F37BF5D409254574F9D5DEF328AE0901F1B2223364C5B5349F15CC14C6E673F48"); yield return (Hash: new uint[] { 1547248121, 292558247, 728617438, 3236974133 }, Seed: 1976386952, Hex: "3E5D4462AA8B15D766C16D707BF299B6CE6A7BA7B52B4D333E1FF369FFBE138D56D1816194670EC08EC3028D009703B3D7284045D0CF3557E32C242998762C8B33A44AFE3D07A597E2A0A897E83EC2D38FAED7984C32D68E41F3B1A0E0B76008677C8454084681C9DC7A1C359AD54E6CA50425A2EBF1AD52AAF2B695CC6956E8E0D8A5393C861DC0036E156C188AFC94BEBEAF956624515FDAD66A53C417C915529A5778B6D1EC9C3E7D1E7A5D034FC1071B518B52EB110AB8DFC34CF179C248D52C690BD3DE1334413E03E855282EFB2D7B714EC9C49E7FA3ADCD7305791C4163451161E851EF974F0B7CDC20E0581098E88196801BFD81BFA560"); yield return (Hash: new uint[] { 2685149695, 3541348990, 2166120047, 3967730347 }, Seed: 1161970177, Hex: "814CF77C1D589AA6472C63EED3BD7C972DED30CAE9DBD42D9E104F2F362A34CF34F13A753E4783E63E20B7E143B877793EBE3BBA9344C3345E72F86AA9F2276C14E8AE51F8AE206F7663B301DFD9517B87955865D47753B5C53D87811D7617DFB2581C4B0AD1AAF21AC9950E964ED2DC1C24CBB6C364A65C13829340F9D9C5C91BF0CE4C6C90F7CDF51C0B8DC41A38AC0E2E5F66B947B74DDA98350718ABEDD9933D5A3FAD0F1A70EFD3D05845597C14C2B7198F874F5034630DFA6F446E05FD9E7490521102EE16D8DD1A02F75137FAD8A97212358851CD30AB5F20772BA1217E2418B72BAC2F9B24AEB6B88DAF1FE806C88397DB08F894BAC5202B4CBD0AE7B17AE3F1FF2870307D595D7752A4D65799E886DB0301C02445644921FCF24A9F34C920089F4D7078A1D24AC9C95DE78F7457086F622044"); yield return (Hash: new uint[] { 3588760812, 2400756979, 918717433, 2059809473 }, Seed: 344817061, Hex: "1788BBD5EDBD6511FDC3EBE9ED652B852C80F070968AFF8C16"); yield return (Hash: new uint[] { 4188097558, 1775794822, 1712369067, 130909042 }, Seed: 125827953, Hex: "EC3672F9FCC21D4D04089E32D4AB375E63B9B17BF8FE1E437B3E907D3ECE2F62C58A5CCB89A06132A99369A7745352E76CEE443F53CF9A0E335A6EAE79793D275E93CC5C9BDC17CF4E8F5F69520BBA07094353D6E03354220DBFA9AFB245291B3EFE91853CC34F3327B3B889498C938ABCFE0327198CB8EF3B2617FA2F9686A3E8BF0181799CB4E7810B0FFEAE180966CFEB427394C447228C4A2162A192884525A8D8771278A23A9425B77B8D3672CEDE62AA82D574240BEAC742254BB8B6961E3B5A46F77C8F788EE1A4DE34ADA9F1890E6B7F6BF99D10EA09E580E7BE5E0C2A53300C45BB500B0C562B912B3C0CE26FFBAE8968A89EAAB39ADC899B495CB741F8D08277568576E321086C5531135FD2"); yield return (Hash: new uint[] { 4252560320, 3746339192, 3419414874, 1383629698 }, Seed: 41509480, Hex: "C5BD77A1E507AAB28A01"); yield return (Hash: new uint[] { 1533037209, 2762704710, 2331645170, 4012620333 }, Seed: 219907122, Hex: "C8A68223CE197F7F333D55F3BC95E83BB49C92DC5B358A4FA1D5CC70CE53EEAF453ED2A47D365EFEB99CF9C7D899C2B6A9D4D1C6CF9F3EAEAAC7C56995A4C2DF372CDA5C1374775741DAD2AC08D7D3F75482CF71"); yield return (Hash: new uint[] { 2919651647, 1231075927, 2169873647, 2533174663 }, Seed: 1369583581, Hex: "B30F8D0503CC99397E66B61C2C819DD084C4F3D5EBB5A4B5BA44CCF5CFEF3E03C2C23DB7B810A3F9D1AE144EAE01103E8BBE0DF0477A78D1F6E804CE21FC332E92BCE7FA1839D2A8F29BBF7A7BF0F96FCB549160CE6B8221DECDD7321423C98960D6B14E0CE20DE82DADFB7D00368F5685E13FBC0795EE5FCBE203BEDD876B18D9A1505B8B40E22639BD701ED8D0C0243170D38BD5DFF3D38FFA9ED1E8A2200246C537CEBF3D86D5F1B015BAF522BD3C1F80E26DB4E8E5F4484812BC9B7F13D8121A2E8AF8A2E535FF33AED4A33D11E15784670BDA90C8034DA6B6796531B00375E18C8D2026A672FA62591B7EA36559710683E0DA4E1741AC31D74120F57743B961B8E539A9E0F564DDD59B93363C8CD63C61EF723EB4BF09D4626A5812E333A179CC47E4AB0EF27FD2475480CC9B807E7109C47528EEBC1DAB1F07DA23DEAB72E5"); yield return (Hash: new uint[] { 1943684651, 347605652, 3842601690, 1144224108 }, Seed: 1604295317, Hex: "EEB2F4275BB69C90B4432D206CA79544C3FA7EF1998EE55925E49F3648BE6A77BD128BD9304735EDBE67C5D57E90412852463E3898D27165C7588B85621795A219944FC703E2C8E16D2C96818152E0CC7DE8B11FF4ED1A6B07E2DAFA3C064997A8FEBEFD718C6C7201412C380005586A8469D9B1018C426D6D92485FE9247D7A9D590289D7A637B8437CE1FF9257935AB21C06FA9FD7FE78359960A7EA3A336C7195FE8700024A38E3DB2C09DD832D952D7403"); yield return (Hash: new uint[] { 2092665045, 3209674161, 2960122209, 163516595 }, Seed: 644067252, Hex: "D1D9184476176BFEF09DB462B592ABB039BA91CE96B70532EB4307D729426C3174505D4016B9B0A613C34367B1EE83E3450755909828C8BE2421D3C85883A2E2B7EDF5CFD6AB623DA31BD18614860CDCEB1876137242"); yield return (Hash: new uint[] { 4039824156, 4125754601, 160127724, 2948265886 }, Seed: 548718501, Hex: "2226B0A8F4E43C4C92046789814C8A217644C3127F5F31CCFBB65B81336440B8A7FD308E05246390BA0789078736CAF5D423F2782D9C95542AB221E7C17072721BE45EC9521369A60EB36EF49EFD73AD12904AF16188D3BD171ABF15D9F0AC141A6DD190AE4061D6F7DDF25CBAE2BBB89D4933FBE5842402A3D3112BF6F529F8F84DF7EBA65F28503576C25E70EF87438F3216FA53F0640C46346CB57ADBFA1079C3A561C7E96B2461EA7BE8BB36317E6A1A081547771346529EED4B50BAFDC4ADC78C3155956EB440CAB0F33E3824366AB534A628AA56758AD3D07B45E1D737205973A892EED9AF095842922B3060BBA7736F01FE6107CEAB381FD658FDFF92A38D1BD0F8BE8EC4BAC4002367D5108795CBAD7824BA233C75F92A689B3333B9DD2705F19CBEC9BFB7C707004A7ADB7E927E4669CA209DC775AA387689EDFA1906D20A63D93C1EC8DF8362FC53B695DF4FDB5C79EE"); yield return (Hash: new uint[] { 2731024591, 3195941253, 3195051858, 678394514 }, Seed: 280275997, Hex: "902EAF4170A69264F40F4A13C233A596A7839CB019116AFFF7E3D564B67D4FAC2C81CD4CAC14FDAD20C9A55696B906A5AAA2CA40682A00CB9EF12D4289CC58633103C4E981B0D5AED8FA1762BF647D4F05C27B9C0E60886C0C89395709C9C36E3F32A9412653D60BF4349302D8139C4845B41C4AB2D02BBE1C134657A4774BDAF00E6FB8D7747EB1FD1C76C1E2FEF109AC50722C42C5B97F9F8B3A5AA9C27CD24F29FE8C6290C79296E4453C279646621C1F6602CB97BC22DA90A5B43E2BF5B3C71023180F6AA479F81811A5A2A7DF6A11F776EED0054C17B64919AE943D8321F0BDA7FDD28C5469AA176F9F4A72E563B21D12F02896FDFCD94A0623BED7B821BBEBE326D8835F58E37EB6719EB4A79565961E80C65A9BC848023E42FA541E0F1334E99587A202D36B09382CB83A32D2FC6B2223AA4D3B42C9C80659AB134DB16E2223C70AFB05ACED61E7A6A46AE0D4501075BCBBF7E94A215F6D6D971BB84FBECB5E4D41A6C3EAB68DDEDD15635FDE641BF6F971EF9FB7BF18E1552F2F632FE47A80369D4C7AB866B04694C807AE0FA4E676861BE46F90F5EDB8FE9E2065ACF674E48BD72C24C4C010257AF43593C01CCF67F94CBD78D8BD092B13B9A9CC0AC4692DED5AB882D2B03F255F63"); yield return (Hash: new uint[] { 127008505, 4064281, 744888336, 2158463362 }, Seed: 2032427704, Hex: "B0B0EC8E61DE26D3A7D72B7DD0F2D25C281D5BCD31DC299F6BB52CA329230420ED08EA663E2A2BC6E101475DC991CB7B0B1BAD84216D8A826973CC01C7EF88846B43A8E94197384B82E933722F97691C9D565A471AC2A07DBFEC1B3A1F60C5D3B3C22CB165CA78F931191B80D1CD5FEC59E8D5FF9F163DF9E98BE96D30B5CB23C22EAB5E71A5EB6F0CFE26B7A83FCA36163C49232BDA67F0D2031027D3728A14C5B0D45CD4E5A98E9DEF27D33186E9F5A9F32147BEA5B30A56D23113A5587C89BC08B69766F05815E2357071B876A097D08ACC239467CDEA8AE3536A4A545B7BEA9AE55D9A439DE05960272DD929A7155F6FC41D995CA21E850B8F5FFDCCD74A5E013E897C85557166AA520C75794092DEA477ADEA4DBFF101034CCF603B546D6FCC3D28AC2C74368E8C2754D4E6F1DFB6454DC047CB78A5A6A908B3046F5E53F388A52F8211DEDA4F62961A314F25E9A277805216BE2D440961B3B0C477E87E035D195136268FDEDE854E0BD737CADFE3788828CF4FC6904A104A1D56CC08AFF281CD65F7548E6134C2B740547D5B01110CFBD639990C4EBCA1842AD0C5CD762D06288288FF7979225807E98C33D3E4E60F54F88E3C30A2D97F848B5A6FE0F64A94112767679AE56AB2CB25FC5573652757101880C3CAE2957D23E51250CCB4F65FFBE33FDA8C203E1D"); yield return (Hash: new uint[] { 291334284, 1097247301, 3992317059, 1932545580 }, Seed: 1364493586, Hex: "B8814BD9818F94AD93B3BD561DC26F29638E5304B72E2D71C068A0BCB71947CA799502AEB93005EB132D544307CFE37A9E4D8D9F0EDA4D317BADD4962230275C9D3FC23102BE8B3ED42AD89A3B11618F10787C0C0FDF43EE239362A3A428B9196F3D2B14F2E2128B9629D1F21C60F8CF768FBFCD6E629772837F787B73E1DB7908E6762A1EF0743B0C0597F1574FB2BC06E6BC8C943E6E6383FF3C187E5552AFAF98DA57E06D86DE4F59774A8B46C6619549CA4FD71F6DE0CED19E7FC93CD9D15E7AE4CC2C2B22BDEADF54BCAE1E4A49A5DFE688199961027515BE7228BA5E9956EA239B6B6335ED22625961DFA239B931087E07C41B6B5D5A8D188A8AFC2DAB5CCB6F7EC7BF64AF5B78DE3A79585402D0A351321F8C9346FCDCC5C3938CBEC2D3FCFD8A6664F9CE225A7ECF1996A714B1CC6832CBA126C88D76BD73EBFE1DEC82B5CA00A4D1FDF182B95C99769215354103C8F4E11A8A146AE5A4F73B61600B3E9C5321C729EC736871A07B461E5F517B45DF2155CDB5CC00D726AFBE24C8686CC3F889DA93730D6E934FF8E342DCDC8BB97E5B950456CEDF311746E98D3B"); yield return (Hash: new uint[] { 2125626829, 2892893507, 1021384483, 4119209963 }, Seed: 270958588, Hex: "713BF37292F534A9EFEBE42DA5DBD248D47B6ADD8FA8FB977D37A1446EFEA74D28A2D4A1FF6CE3721D30E17D3C5B38CC745A7157EA2029CE6A62AEC3FE247A4CE588968BCA1875AD"); yield return (Hash: new uint[] { 1892346040, 1896277397, 3255598943, 716267962 }, Seed: 124498910, Hex: "3B0852890A953C2288D90E2078B8E4CFA5939394DF4892921A0523EA257E3E309863583AAD947497A29AE9DD44B15A7A1B610ADEC8A4B4CC8182C70A3B556D129A1D4A36BB9CA864D11AB5E2B3ED2A43BB0189CC127152E68C1AC2CCB182D1D2E12A435CA36830556D6FEDB823D847573FEBA7BD4793EF28FF31F54A77E4AF266443BF12FE4F2249DB2386CD7DD2EB8CD4B64FA44B6E65401EC580BAF482713E2BB4836680BEB28AD4FD94102F5400A016017C806CEED5A7187FBA5D04D861415B355C888361393E95798CEC864DAECD0743FF0EAFAFC40A617B51A5C9E00BB2EB8005C25184F28BA946C5E1E486F53632CEE6D13268944A0C99D1A574BB860EE696FEF7E7875A00D662C57A1825E3C04869F2C9C9A908C28CC69FFC03A0FAEF91308C04EC8765809E05F9E4F484781B"); yield return (Hash: new uint[] { 2333932488, 2672844765, 1143670548, 1293057405 }, Seed: 262317786, Hex: "B83085707E0B6ABDE646A1B71A5EA6FC36F3987BFFAABD34D751186ADEE7742F71D9EE6D5F7A8A214EC5CCEC4F34D736A34F69FBA8E0CECFBCC328BCD9603A2930D289F598D23847BD99E17A6FBA198317202A9F40BDE08B7BDBF90B4E4B8C69CD86C013758ED5F3CF46ED541683341C945667393DFD6F36C6A9AF163049319910EDB60665B9D1DB36D30D87890335C1B2F51FF153CE996BF6675A2E49901879BF0011B4D4FA12293FD74186DE065F73207B07781C66A323AB36A384789EEDEDB070AE447A0992D2001938EAFE3CB1340F77897D57937F4A956FCFA6AA459BDC0A1D11452E163FBC75CDDC38BD081C3BE4C34411F57F44BDAA2DEAAF551CCFB8843140B2ACA8C697A83146F166A343F31540168AF4A4BD8F85E1E5FBE02B223057EF733ABCCA75232104DC5702AEDB495D4A0D596162A3648F12A73D1CD94966E24D9EC6BCB516EC7F7B61E6A01679F9"); yield return (Hash: new uint[] { 1775486688, 4042807914, 1359185069, 4157595113 }, Seed: 1560695038, Hex: "0A0765680E0B5C0FB1E483DF57FC3A61C1D25033123539715FD3DE07424BB59B36063AECB66AC57C27F35E396534C9BA2E1426578FD0738025F95E3434741C1EA182C858BB30BADD37ECA4521EA8E34C1F8B62E32D3FC7DE929247D87550C9F5F95FD54DA99C3337F43539D68F707025C9FA2676A29C0E944A0737C8055854678E844F13E4FC903B111713636E5CFD6FF010D40C94C34032F4F84696090B1FBC45EEB3DC7E676B800B3195D14DE5664BF2136DF02EA3BE4CED7CE0EE203787A688D56B7D1D3AF0C652625BD8AC3522833CBD843044D6FC143AFE0A7EA7FED19189FB2597DA7BE9EDB6C97553EFE9CB1F3032126E374B3571FF1C6B664989D828838D22C611B7658F4E70AD1231449563D735489677FA90563B925B4F9D5E1E7F3E24CCC3F6AC81A5A5DF36C490B53FF9E80C7A9A0C9F58A11CFCB91153B49D445F0F609ABA0DA6FD3A4BC54E9BC07B397FA985A642E09F993FDA9732EF94FB5EC8F2B779DA2A044FE2A3250D1D5907D48A8A9F1474745050F469A48100F7DF3A061E48E850F3E5E0FC2242CA3DEF5E49222D22CF1765A188ABAC4C457AE305F0DB1B915934992E1E620A057D996FCEF612FB2EA0117B6400176AECB6DE94B812E6A6BCCB3F0975C0C83783269CE594E90EBB88ADDC9B75CEB0B98363"); yield return (Hash: new uint[] { 3040311369, 1576115638, 934800120, 1139064769 }, Seed: 132359882, Hex: "DDCBB147918FC43132D6199A1261FD98D60C8292A254CD9FD50D1BCA786151B11CF098C9B4A7D8A0641FBBDA3EBFE9ADF74E2BAE632B19A18E42E4D2BCB3F0C1028B2AA18E08401B2152435F6983BFA5517F3E994F1E11357AFFCE2D77B1F566E8929D399257513005A88C0D608DAE87280C15EE99D4F8B265ED76C266CE72A8C5BCA745AA09554D295F9621FC594F2849E1FD8B6D39A7798488F9B569E6DA2583427A6F0047B03C870658D4BCFB110403AF5240478DBD95B00401A3E1183AE07E4CF14BCEA0A6091593DBC2D6A70C213FDBB85E8E7C0037884B0814B97711A2F3C11B9405C333362D45B671A3266566D84E28AEB0BBA8D2D43C0F2C4DC507"); yield return (Hash: new uint[] { 117510796, 495873045, 495873045, 495873045 }, Seed: 2094542525, Hex: "68F8"); yield return (Hash: new uint[] { 2216860844, 639474082, 234214536, 3739056031 }, Seed: 1296208561, Hex: "0286D3D5D597259145EA1AEA2F60A2FD276928DF13CEF42FC12996C975B101C9ACD04011F3823117D7FD7276969BE0BF45346BAECB9D161B4C5F383288C883A137EC32CB8A3A168C8C6712F8F9DCAA2962700BCE45CD2C268C76802962F4FE4B5402329AC20478F720ACC84C49242564578C1D28E0CA6B11E2187879364118F1FCFFBB1785018E33CC402F1A41EA5A505CD1628AC1F9895F79D534BFEF53D9CB6AC3F659CF1CF5B4B01BD5AE9C69F14C248EE95753E6964DA284584D2B6F754CB529A64714BC5E25505865218508ABD861484AD93284D49B13F378"); yield return (Hash: new uint[] { 369567647, 3770254201, 3450453930, 1494011398 }, Seed: 702699190, Hex: "B1FF5383F0A6B9987468106612BAE3358C5E63F7E49D74AE7009205AE972"); yield return (Hash: new uint[] { 4153751406, 3310923774, 560798096, 2692750275 }, Seed: 1229717985, Hex: "0236B7DAAEA6427D2A22B537F299E18AB546F7D1CD43EFDC9C2C1B2CA9FC124EDDBB146740E96F1991C608F75D5402BFDAC507C2EB472F63B340CE5A45E8BA06B69636C81EA9EE5A722726DEC8673CA58D59C279BD2FAA7819310F1A7BC86BB38B4B31565E244CE55D01E2AD6ACA93C7EDEC13FC2FDCDC917BD4DF8E4D58987A798406DB0D1AD9D1A4B24D9BAEF64926456EA42B6F654AE279314034175E023CFE43ACB0835BD088BFB84286BBEA4A5DCFF89F6903A2E6D56CBD8E51BF97CD73082BDD40224D2C8A7EC8BB4636678551EFD01CF261AA71B1B63359C238A1B634D4B5F47B0A6923887706D3F1A257801643A6D0D326A750A201B6706AACEC9387D68D7FE28AD4219DB5E32672049224C85417BCCE711CDACA605C63A2E029340C63178D1BCDBED7C5910267EE078025AA5E977EB335AA339AF04F6CF0949DD4576D403C0B67F9E8F592A44B3E1BD5FCA71097C5693A452D3CDB46241AFE49592ADEF9CEC9CEC4F13467F767E954045D35F8C3199BF8B32133D3E5B33F8A34FFB92BF54B645F3A87BC7C23D88975EA9282BAF2863DA2F5C04581A7CA16C471233B9F45A72D7C7278BC6D0E50EA12D42C4073FE78A0651DA6DE52"); yield return (Hash: new uint[] { 2035458687, 2825151559, 3872218602, 2335465966 }, Seed: 808303083, Hex: "54558ED52DEB14FC8D6EEC31D2EB7CA7C437950C43A94B28461C9EEEC24DD4B93003C4BB501AC40ACF2D68E8C95B34FA4BB62189A2755B1315001626701CB5EA7031FE9BDCD697C769A685653EF65F4AD59B1C9E3DD84A244CF187572B5E515B6ABF1C24F7F1665E98630E2B19D73AA5DAF04250D93631A9DB59AB439A8124C6614E1D3E9A0315A0A58128F1E431E45A0C456DC2008753B52F93883D84E8210FBD3F1AA6E02493BC305A247B38E215D42F7C6341C09B6B11FA7F06E342F6B61B320B6743E32916CB407CCD7E47D8600F419C7BD67CDE51BD84474930E6D34B03EF2D305361BE58871B0F4F8B93A1F25BB43E4781A7C97BD7A93917BA9D50BE2DE5153C9A4A57BB60416F1DA7A50137D812236A0A6CF949B0BAD3CB81200E59DB673B55E28A1FEE884D8C692C61204DBC9033CDD0C519B61F012A4E067B6096E1A2022DFD52D7565872D84035272AD7601EE38819B210AE498A43A19862681BFE5F990C38AD378B54C066C55826D5B24558C1403A323E2D385DADAA0446492242AE4EB7AB78A82ADBDC49B982F2E143E5F88166B73937FFFE1EF5F63E87622C0137ADFD6D70F4A99E864195F300D06D9F64310C9637CADB631B9DBCD8EFD9B84F0CB2D1340663EE7F37DF10AAC5B966246D9F5E5A46BAA24153BC9FA610C1F26D5E12241710"); yield return (Hash: new uint[] { 3869067115, 2327406371, 910667647, 3949052689 }, Seed: 446609978, Hex: "FFBE257BBE3B8F0B8E8069ED6C65826881844879456FA42210AC92DBE6E8FBB0DDF44F8ADD7B6C15654458AA1AB0C7FF"); yield return (Hash: new uint[] { 3560873020, 3476187122, 2630831519, 741958050 }, Seed: 1403741248, Hex: "8E876A88F673C4269B000672B8E31EF5E6B01289165C91AA6486EE39159E06C1B2C8889044FA4E0C96F3DAC7E36F38205A98FE584B369B8E5AE890BA2B59A965B27A73E5E8D8D60D6CC68532EEFD6D171C3ADE23BA6D68D290EDF496FA23BB131E767CBCB219D720EF93E87E75FC46C5A2AD0E51BF5F0AB1C5E9F85A5B8586EDB03DAC88EE492CD1119E3DB2E06340642B418D08AE65AE3B8D44751160F20295D12F4D1D34886B2808DCAD8397554B7D3F1AFB86828E20436F0D3BD5237A57DF659519B510547A94D885EE03AEF87E5AB18E136CE38E873BC416AA97F06A2D2CE56D1117E79F98594CF89C69005E18D1A9912991E68B117EF1D2C14D33B6FE07D984E470439608568EAE68CFED0812D855DF2D9A490CD178D7FB82288C355325142198525EA6BCABD9492404DC835936A4A32E9FE7E3AD68DEC85DE5777A9053EAB72AC3333D5B876F41077AE31986F7297517680022540F43E69B9B64BE7C62E0521EDF1F2F08EDCEFB71E4DF66ABC367F4E3089D926E848B5AFAE7F7B7E4D28652DA858B61A02CB3BDFE2BD234736D21E67F9F"); yield return (Hash: new uint[] { 2014785615, 4035250098, 1422993329, 393814755 }, Seed: 802618590, Hex: "D4F78DE49D31C3EC52026904C35F9AE2A30C203389EAFC600EF2A9CAEB9B013DF180D915D51951143076D08E1C26F0E4437E0A53851A87E76C97C235A200EC4B673FD9B47323D6D9C0C39BC2C5DD58ECBD76A9855C9B421EC5374F0F61196BAF15B8924DFC085B3F528715ED9E91029EFDFF16E4613C51ACEB85EC3921D5D6FA2841BB6DD12E2C85D3499AACAF6DFAC4F471B580CD6A92B360BA5872395C90BDE270A63FB24569ECABDBD6A67397C5ED759F36A5F98BBAE309F957316A6AF436E9C4283F12DFA1625DB93B54E35768251FC4EC2F9335C56482BCDDA554E9E1B98B9542F7F56A09D5A0AE569333ECDB3FE7AD15C922903C44B2B8B73B472D4FF2F31492A471FE5EFF5C69C084321349EAB793158327B153B56C423A2F603050AC05284FCDB5D111A0BBAB48C71400FBE7A866FD2BF00A8FE6670894D0CFA682F268B731AD981383B1FE0C391AE8D92D18FC26D893428F8FF22A67480C30565166FD27FF8F5579F1D38DAB57E131D91B787D2BA6131AA598E5D3B615E572BDB1E58D4EAC60D62809973573E4158301B55DDBD9944EDD76A52765E101E243122F969DC26EEA1E8794713F9EF31D6AF13E6B8256CC776D9006A29F30A2DB1E57E496D6C61C7DC32F9C5B42A7B50A73C3E515CF060AAE81430AAD"); yield return (Hash: new uint[] { 2828942937, 3451208637, 965542466, 2786067467 }, Seed: 40812548, Hex: "37F85202EDDC93150C1B7A03AC6EF48C960394F5334481B19FAA587281B4C18B0C5D03845B44CAE818038FFB0BD345B8AD34"); yield return (Hash: new uint[] { 3589956908, 3590500684, 3017987886, 3443978466 }, Seed: 410620752, Hex: "6564DE4783F22BBB50A4B95AAF0C6DEBEF1AA7C765CE8D54A0ABCE13E936DA2C26E01E0AE7CA6B32FD4CF246026C46BEB60FADCB63AA4F95974093A9CB55FF0BB515DA35BB4DD2F058958A49E9A7E9DE1A4CAC6AA2D2271CF8595B12DDAD02E12365BF7CB43D547EFE6FEFEE5624BE9BF497A471AD92ECA4F70A8A1A6BF055188A993D349F82255F1D4941625249149BBE3306065D"); yield return (Hash: new uint[] { 3924202163, 1178504917, 1449920568, 3374255278 }, Seed: 279326167, Hex: "E259C396542B4745504E23C429D82D5E272A48F6452DCAEA52B17F88F3C0B62DEFD35CA45B89FD6E9AEC8D48633E37D242A1A9CAAEA3603ADF6C71B4F9D2B03233B3AA7BDF2C17A94BC370C34A47040026596E681631364F8F1F45B7BACAA98EB11F88E82B071563C29642AAD16B3AACD800BE37A1D6551F3D008A8561B4D3A4CD89F1E7498A0B0BFBA3565ED21AAE8E4995A249C374567DC3A697A894608AF2F0DE7E9EC9B474E294856750463B5D72840220EA5DBCE1EC2DD359F923A13F66012C257060D6DB37EC32C518ECEC0712E4F50475A0B08189C431D0759E9D619072"); yield return (Hash: new uint[] { 658929427, 4284387, 1171624776, 2656296460 }, Seed: 781735847, Hex: "3D9BEAA6EB3548524DA75C250382C4A46474DA25270C0BE63CFB73D4026F836006D3D3E032C686B700A02F159F34AF3B19C463C304CAC313FE44AC931ED11264981996EE6089E3CB122151229E03C4C86181856E15DF020EB231C263D2B8CBDAB5B065AE7569D4EDA225F314DC2DFBD40722DA812AEFE15F561959B89C9C4DE6EE7DB3B14E477BA99BB9A0146E5663D6A66358B755B4ACB2DB7AEBA779B9FB36E4206A3E1FE559DAA3DFF243B8CD32551EF9E249615AB84C889127190348F9312C17384BFFF1FF11FF882915E90E9D6B4BD1C4E779562D54EEB4AC3909BB304150E6C9BECAA2DDD70029D3CA9B70F7D131D73376A80EE5C28E029E8570F5CF02F19C6549A09E6F8AE7A2B25F8C15EFF2AAE4FB29DEA6DBF3AC4A"); yield return (Hash: new uint[] { 229356069, 4282221916, 783138451, 3594098843 }, Seed: 1329735537, Hex: "43A9A2A5C1E12C0353959C26FE4A6351B8A5D4110C43B692EB1D11BB976941D185D05AF9247F7A64245721D7230760C808667395D9C3ED5917FC46759B6D31475190CD0F2F2708620CDDF47B8FE6F51149E94479F1A62C6E0A1E70E737D6B4CB79E028C59149EA3EA4F4221B17FAB801512CBBA78800A4386360EC9B2D71A70F086FE6D8DFB78ED869283895747116F4366BF572471C77307D8D60CE5629FABEE84AE5F1A7EDC92722F1740364AA903C74D5435CA46DFFDEF6960AC5B8EC784C33C6B2C649932D0CF26B663FCE72FF125087A1E62B9D9983FF05A69B5E1607D4A0F7155C1189368E6D2B999CB81601040902D9FAB338DDD0241FD6F51DA713196456CCE2969221AF1A8FEFDC73FAC383CB1C970CAAC6436E74BC3D7CA0A3F82B583BA7EBC6F2F8DBCEBF6F5C"); yield return (Hash: new uint[] { 2665586332, 693715827, 131939404, 89401860 }, Seed: 1332482916, Hex: "85FE086462FAD83EF81C017C53F8E4D75A531D29710E703CFB039FC76623180FF242A08CA8AFA1A0781BCFCCC7EDED845EB65A0651B1A557F65EE67894364AC0E3CF96530D37FBA53B20D0AE3A6A9B2F8DF584555BBDAE6BC256C1D3C437A89BEFFAB12974BC9224CFE3F94EACF89909A6BF4358AC5014CE6EBA9BDDF4B9FB0094DE3AF939BCCC816BDBF21DFD9FF5F7C240A7CA8DE8B5DD907D88DF7F97F3BC94F9A8756558B3BF67720F56950F4EC4BFA3E875BC05EFA12C8C4AE12C3E7900444B29DD657D3207C37C128DAB2F3AAEDFFFB1FB052AB2024B15AE3035E2C421A962EBDA1278498F61769367677D6A1B48F4BF4C9FE1F94ADF36B7AAD72ADB5984A758A6EFDBE248466E11F32333773FD020BFD60B7BBA78625DBFE4A2E025DDC3542B782F22CFF778803879803F25D553806DA736AA096888B7C04C9C4B8EB06ED6780A50942263291D4D5CC9A93DB91EE535BD854E1EBDAE01607351434377177E28217AD188A3E34B26D686C8BF3942771A433D36BAE9C8550E1C902A7A015ED239DD6C5F4182FB6061D32A143F34D0F8CAB7BDB138CB609258951731C2B50B2C53B603678B"); yield return (Hash: new uint[] { 3063202361, 1617707121, 1106014897, 3911292597 }, Seed: 269828696, Hex: "C5B6CDAAA26705A4EAEDA105016F1147D0FA02AF6AD865E75849146D7E7C6F11913745ACED5F06C63CF0FE4F369EE9A09FF57EBC572621834B3EBE8D1CC77F4216BD96DDA1302D2284FB3F4A1ED79C48C7E4A1AB61DE335AFC689BF8D1B0CDC82415090F21CD55BF2DC4FC4B04A73D8AE8EB745B24A6C173F46C625DC90F5839D8BCFE972797B191224676B32F58C71FCE61F9D6EBD32B07FD5F80A4737873459F9C5B06ABE8092CA486ED5E5AF446E96B03363B1819E59EB23C691759ABD8A91348F9CFA4959A2A7614DC94E99987DBD4214725C51890C90AF67D36694AB1B880098CA314FCC193B624EA58C67B3417EE20BA1A4B34191F76DFA5FA0697310DCF68503B15E87B58E9527722E19C330A67719393425BC325BB8795AAD156245A0899B5C39E95BE7171CF54"); yield return (Hash: new uint[] { 3061186929, 3371300943, 2953555265, 121144900 }, Seed: 204993781, Hex: "ACF0A1E3EF6776B9616ACF11030467A4095328B26F2CD0C8214D99F9FA32E9159692F6149F3C7843B49244372A47FBACDEF7F244D574FFB1DA7A08551B9D2BC5C066F0153C4D01A64ACCF8A465E42D2B378F85C429FCD9721C3E305A8EEEA8FB7173FAE8DD64E5F3C99E165E8C1ACEF8F06B9D4B6C8FAB4672A2D14B8E0BB4CE0E8E573E2E82F9E1DA55E9A624B2339BF7EC81B960F8ECF886B1B43C171CC13CBDEA4A0D8D35A8FA32EE37E858481A44924C7CC76CDD66933CAC53744A7AF072467C7875B02CA401346E28E9DA6A9C0335A3A08BDDEC74BA40772AA283C167416B47B1CE7D8AD57501D86A8E68AC77F2C7BB0B8A067DC6916A0B9F75666E3396F97750D5EA4B608CC7F4288E0F9C238DCFF1882E39B8EC16597B9EBA124EBA6DB525951DCD53CDCFADFBB28E50C96F902B4316C9C8575CC5E9B488E8"); } private static IEnumerable<(string Hash, uint Seed, string Hex)> Murmur128BitsX64TestData() { yield return (Hash: "053E220738B54D6A0E2D2CBEFB3755E4", Seed: 442104284, Hex: "33D3E409C6A5F766B2675345179928DA639B33B18CC8F76B839FFA5897307CF94A780B7389B1777B0FB5CEFDCAE376FD36DA61D33E95C597E1581D29C9BD285D725A5A8D0A66D6D1EAAE714E8D0A0A22B8"); yield return (Hash: "FB42757A2D248AF3E7D1A34E639285A4", Seed: 1357460742, Hex: "8AE07F8C2D9BE3564BFA33838CF30F91ABB68A3129C0C51C9990BCE5074E6E9A219D03D2D01EDFC95E8699095359A0AB03192B2AF38112BB875C5F8FA0D28DF35BE4CDD03E8181A1CBF8011F8D27D4050B5D39BF3E44A255DF932AD8789570404A564D84B295562D1C268DC441D390C94D11850679AD2322C8F53CDE63D292D3C64569DB5CE7521CF14C1F7F5224027FE5E60618B3CE88821246280017CD481644149D848D335A05A672186DE213A9E4D36BAFA371A080EFE26228E462BBA89DF21AE1AA5133EB79E08FB07B89FD3DF0BB34978386A40C09B9A39E4E6BA4C3833694A8605BBC8AC21DA33FC868C86CCBA32DEE52223A5EE91B2F813EA0C276E3263E29EAD8F05790956251EEBA27F8F7A3B2F7F891B6E50500CBA5DB20E8BBB9E470A2B9E0DE7B8AAC179D74CC22009DB0E8016FB16F2852B613E293117585AE26A244C20951B5FF9193FA3A0497BED924C272E619FBB7FF21281E51B4B8B1902E226DE246806A937F90D0C1C6DDAC6E8FBA8E11B61B3D9C6E9374B716697B3769D3BE7FE5BC5B8A9025D5281719C39E64B0"); yield return (Hash: "65955D97D57B6CB2E181EFFD6AC9E986", Seed: 177303879, Hex: "CC75604675EB86E2379D60B87162DE477D39B033294860BBE70E5E25554CE1A7EA4A70A32B8F704964DF63273F00BFEBFBC20610A24D185D638F4577A7F342C2DE1CD05465473F947B469B2E1D77C6DAFB8EB7F08CC8CBC40E36371D06F9204706005EC93E19DBF004A1F1B800E0FDDB48F887B6C89422850DF66C023681DE66B50F9B73FF9B2FF219C648DB9602C65C4C7FB17636A305370EBA840E2E61797A9C070B36E0DB60D3635FC0A94085609C708CADB20BA1DBA5A8A24FDD644CAB1C38A5006FCA3CDAC1D46547FBE77874775A7213E3DB03BD421B33993B88E6C799164746446C47E3006D36321DBF1542C7B64F216E77FB5D93376EA1DED3F254F6EC07F47F44B8149328A1627CE1260B9368"); yield return (Hash: "642F38B89D723B6C28B0643E08098E7A", Seed: 774843835, Hex: "F846A840228EFA362CAB1D2B0FEA2E861A552CE52F846DB939B351DD150D0C349316A8464E11CBDCEC1C6394C1EA5491C0939E434824A54EB21F645846BC8CCB43D1291419B7E9FE54F714088370B64713B2196B978A51A69E7E084382828EE806DB5CB3DD5D201BCBE240F66FE64777C0493DAB45FA30594D551C8A4897FA49E771EFAC9D7410D7F0436D5FA62B4A63D24F6C5F6CCEA8FC19720575C72A512AFB71C24EB1E471C69D4817B92AE613FF0A8F08634B308217657DF0E3694A79B2884BFDC78B4F9F8A033C4531D6FFC50293D2973AE1A9AB22D5BC179309C3B60B1B87808454E366FC3308E9BACCCA6752BE34A1E3EA2D99607BB8FD2D4A89A4B305F7B2F4CA4C837B2B4143CF376003B3012AD4B863FC3A4F2960AFA632C049A2DC5AA4DBF0778D1ABFDE45448BA596B8C726704087D7A208289DF5DEB90F48D9D0B3D3C4EC471FA0E3A2E349AB70C2D3EE70A1E592E8B53D74E17E035E49809A"); yield return (Hash: "55E46A80040DFE4BE7EC46199A994CD9", Seed: 667854458, Hex: "FEBDE4BB5289BA34ED37C8D2B15620AD37225C4E05F4E4EA50D5FCD8129A931B95413C70A68F51BD1C66111790ADDC7169101A634454009C7C0C658435E12DC47542CBDBCA1CCFC4C8B95FEF25FA370F76BF1B4887A3D0E31498618D6C645B2982AFDEB4896E311A1ED20060221FA9827326284AFD01399A9EFD450988F03DC5F5B039C10A29DC26D788C38A86E1F604C887AAFEDF5FC0F8C2227F331A81034205DF2C6AF700BFA9A41526126818885B6613ACB55A9CF9DCF3E13B7E54022756FBEC1042D0335EAA9805C45681102C3A9BBC59F3472C058045AB5F5B1576052F308D66B60A241F155816276F8EDCA216DBAD818236D64081144DFA6FD0D0204A9D0BA2F58C4DCF5C316C80F469FA339D3DFB2917E6A6A41580D801DF89CF83AED9CDBBA74210959551F795032126296ACB1EF80363DB2A2A1929F1C1E0266C96B0AB8C5A0FCF3437DBABC3B63CAA331D4285C1"); yield return (Hash: "BBC25A303874607CFF5ADF7FA1323EDD", Seed: 1251568209, Hex: "6005A591F59B669A760DC46402FE50E0FB55A020B1511E10EA4DE2A0327E4ED80F3F8B28BDD63175D226E915A0EEA0D026A67165622D793D6C15A3DAB0116A5A5704122B570BE2B2BFD3CEEEC5486AC18565C929C1996281"); yield return (Hash: "705C6FF31137DC8238076C549D6086BB", Seed: 2007753322, Hex: "E9C99D0E189B2E7366A176A4A508874F81CA701D8D23302398B94D27ACF55C56DAD4AF522D71F9DF300779CF2A7AAE73B7D10333EF79CA1BBFDC8359695E222054612F646C5C60615F7E22756BC589D072DC72E7EB41C3322DDF4BF2C2F31962DDC8C97C5230F6B50E03455060C6E3BCFF07266C099C61C24733DE1ADF8F886F78CCC24D817632781E370A81C3DB8750908D92B6845A9469667B597995ECA958A8F42B988BD4341F789B84658658729068590A32AF315320325F9401FE89399FC2EA13ECDD968A523EB3F1DA564DA8F8F539289AE7397307AFE35E3E5B8A5D0CACB5CD1407DD41729278B8BE576A7614"); yield return (Hash: "1B88673DB34BB250E24149AAD02658A7", Seed: 1127642991, Hex: "56F46746F65C925521263C5667EEB04290FA1F2DF8000EF9616A804AD6F9ABC220357FE268ED5BF1727759392FD39178F37C2E24631FC6453ADEE360350690781A1236EBB0125C2FEADCC5E34CE7CCDB9DCF6644095BB4271B3224F51539E1E64480667518AE2F34EE2B256C789D19B08803DA42EC23233BC31979401E482FEB8698D6CB21444BC0056FF34D1405A1A097B526293C999A7048E6DE585B981F6E4C893695ACC851EF8D683289894F2EF98B60823F5064627119282D67C276B5C8C0D42D837C0E80FAB2680F902FCB27D9011D3B6BEA0CF31CF41F8E08DD2F69258572B1790AEEFE724E26FC0ABB17018AF862330F494A993D976E051B6DF8BF62DFF752394161D68AFFD8EC9E9167400808164A4975ADDBE7D3525335D10308AA280733C6686B685DC37F5A18E6274BE2FD57DAA0E6D19976151BA3FDCE1BB94B06F5D481B44F943A39915BF1DED258417D964DE6BD02B963E906AC1E9733867D725C97EED4439EE6A5171C2C7BC490070EE9B59B51F5CAECD1127DD7D688F4D3951A"); yield return (Hash: "CF3DBEE65230DA5335C4D06E50691FE0", Seed: 1681892219, Hex: "B2CD16A8E752C6B2E89EF4558EFC3AD826588C99789B6D0E509860533192939B9511E5C85221032268791B42C3BA91FD730DE45B0050ABA221E3246590B53E71BAC943F4F0E5C32CE8CACD6B7ECF0AEE3F136E1EFA830D64EEE63E81B1F631B6DD0012003C926F24E8F05393D8C1EF8C64DF8E25D76F9D0DA242D124AD905D5101708311AFD4ED365B0AA9670F970C6D7887CAEC08010A1A0B3FBA17947FBF8C1AE82D7D2D24A7677D64986DEAD40B9D8C9F20E4561C0FCF950C058289B978962A9FEC37624DB19C688142C9D4A0484D7430B9F892B90EA709B7227B4D5FF13D"); yield return (Hash: "1DA6E12FB17F8BFFA43DCD47E73172BE", Seed: 1624408977, Hex: "7F68D77FEDA8EC5E6A83C4B7F9FE35019840BA3AFDBE8399FD7F4DBB3D21DB960F494DD0AD8096DC1FD6123D06AAD31FF03CC1C718C1EBC1CEB59C82F7B90D12F95F39FA52A30AF75E441DB781E5919505E51A15379FBB1F83647A7307A87D9B6A08FDA718F94996A75D657CDED46C1543D208DBD3B77521AFE373B7E9CFB742044FDFD10D1F5AD53A8549685F9E81548B4386A1E0553A6C84944C511541450C53441E74E73E46B19A0D4D05A58F734BFB190993E9633CC5FF7B6235AE7B92A330464CF6ED140863759EB785A2D39B3FFAF3124A6DF43E7292100F72FBDDE6099DD75AE2FCDB0240F7AD33FF7357913D47C04E0E8FBAFEA277CEC4D34ECB13AE6C1967D56598BBCA6A82D5C000B909843F0F72881DC54623952D10FA8F0239C58CE4ADF127082078DD1D339925DEFBBA3303C35F5B6D5E3BDB608D7B069F5D695D095F89F5E21FCEA6E524E5D54666B2866B8268F173C37D64527090E86C248AC0EA37F561B028C9CEA6D76B89C0FA5F1E5510EE9823B37B0FAB875C23ECE812B9BEBBDFA1A77FD21799778E3875A1"); yield return (Hash: "EF842534F0410748B1A7B5D26B4F3097", Seed: 1037422033, Hex: "A4C380E3AA2539BE03811B6B9CA8283017AE902135F51CB82192AAB9BC92BF38EA0106CAA1A4B5"); yield return (Hash: "D4F9FACAB5C40212B53517265DC04412", Seed: 1239400513, Hex: "12D21A64E3BD109194CEBCB0F4F5D4964D0DAFBE1A9D15B0FAA111021A35A571550F5D74996F6E801D7097FF2A8AB280C7C10CD85230FCFCB98908950C8BD0847BDE33C5B3C6517246CD20A7067980826B2AC3A7245DF38DCAF9F44EA27DFA4AA97DC32D01A499EE60CB57BF7B7086C4E060F6C6074A40787BBCF045FA2E234081703ADE2C10948396ADE5E9"); yield return (Hash: "BFEC9BDB9CBB637FCF89289DD060C8AE", Seed: 883283327, Hex: "7065FA8D1A5A8417399934BFC392DD6D0487B16CB95DDF2B185AF82C1947EF93FFDD09D7FE00FC026A9BC8DD27EF5FA877362C6D3E38419C68825661FDE20955CE6A9C7AC6C2F72F16143E34DF3DCC476CC76D6B7A42D9AF7F10D1192D2102101900120459B980EC9B6B56110D36C495567202B2FFBB4A79DC3F435457506BB70ABFC08D24EC7866A6C0B46E97C22D180972B54D0D1640092DB4CB5CDDF54CE3094403E858A741338D1976A395DA22CDA88699DADE75F3C171343B5ACCB9077C0126F68153B9178CDBA85C7BB0D5449CD152F46067507EBFA8F95EDA7C749583C30ACDC2D6AEDD5341DF129AB7E5808C022BAFF4D3C384D662F62DA85F1C3B9DDD5C5392B29084DDE9530CA35BF23531A35B0B8177FA2DDE8E3928C1B4B86F639FD08982EA72989DB14967E2D9E7C9E13D7735FDDF9475843F9693F70E84581BA71C74B25FD767EBC367AEA39A722074CAD71FC18DAF32C3EA977F1A6BDA73B3A4D240808718697544C2A11346C20CC045AF13BC215ABD603ED8E261A7CBE9B37CA647CFE257E44B5A2889575DE53321A1842F367121CE0F599AD1E8C088816D59"); yield return (Hash: "F215E79303822A07E30E23F215D036F8", Seed: 1929173452, Hex: "4554FFFEF1FA560DC7776DB345266C805FE06FD67929E0FC1CD02E7075C7CE6FC103BB9F36F87505031453A623C000C921C86171A93957431E2ADD7EB6573A44D38C5B05D1960CA0DAC91792B64B79E8D8E15362F08128F3DBDAC174DB3D736FADD1F4662B61BB96930F3EB01709490005D59B91A6624374F9DD0F17"); yield return (Hash: "11528C465BE2DBE7095DA64D91F95EBE", Seed: 1496881455, Hex: "44094D7A9C217EDE9AD267B5F1390A51C627897DC674E2B6A9992E56D657CC6CB51BC2A3F243545617F40119807929DE39B7FA49054C548B55B58C294CF7809424FE38D60889A6F2EAD48F88FF994B8146971B2D7B190A69DB2A291A65D046BC391FFFB287D9BDE41F1410B6F8274FD2B43BD85523AE617BC32E3BB34AE13AFBEDBE1C93EC678C77E6F2FD50A510F4C4E50FBEF1A631197F0F88C12804FF94F288C1CE527FF8CC1A55BA2B44067EF04955B5A5D1073A3678358EC351F389B67E9D4CE47D7E44ACD5E71370B29D447FC893E72F54D9054613305A2D104A2F5A7BB0EC327367FDFE759E5FDF8CB5D69B68628E911CB97C0DFA814BC1A6CBB416899F38E08BF7B1EBC4E6D35035A9A5C72F1FDE26EFCD40A5F61628036DD369E1CCB71DADF6008D70F1C53084BA00FCCD8FD9F8E9AA14967F"); yield return (Hash: "9A8203ED553457DBE4D3AAB6A5EB0E0E", Seed: 1671635939, Hex: "996D1DF16DF651D5296D22F3987FBDD5C78A261C5D3C309F3B0B3FE33AC6D46CAD7FCA407FD030BB61C97CDC6F67CD34EC0501E6890654420CE68130A68E0121213228994081263FAAC5B702F1084DBB337B4A5B769E2B79D2BFCF2F0E83C7D9EE06C1F673E4B90E6027FEBD7DAEAD809E2670168D660423FF89B0547BCE0D9F4DD6AB9BFC8624B5F817F6423263D1350FAA1287E7258BD169AE6498C071EA295D31808480AFEACF656C4461EDA17308E57FE57B1874BB0A785286523622E28BBAA6379BD4CEA30003057395A905E3D3A0A74EC64857E181696DCF312237F33791278DB84061B0521F5EE50CE3CE23F6B4229232B2D45C123DE86CE6437EC93D3481F914512A9A1B60365E3E5904871F4333E6D8A98F65DA"); yield return (Hash: "CE44AB656FBD993B3478FAC5A2A94839", Seed: 1389475359, Hex: "D829927B1773DE05486F968E7ADE39E7DABF1B9D836AD3C8CEF9D61BAA3C585698D2BFB8"); yield return (Hash: "52CB576B4A741D30CE9182B086C41360", Seed: 759328755, Hex: "149340F6789ECA9DC4B99A9F3EF26D051F598C5068240899F5B9EBA3036693F7D47CE9F7D07B2E3226FE481247C318CD6714EC4CC23D6C7075A03A22FD9148EB2E08C92C7B84086EA6A242C7120E81DDA0B7749BC01D18FE966DD3E3CC2F0BAA573E007F5628A128085AD4D5824187A97B8BB5CDE5CB4AF0AAF508E71184159990E5C6745F5023181BC2BDC7D7BCCB302F06F8DCE8705182F0CD034F37893E501A6FD3DB62852E401E257B5A6B0867FE046A677E404966254AC30F7CC06DA838381551F91567AF3630A25526F3CD3DCBA600543284CAD1DF9C2EEA23965C09C6F22FFB9A1CAEE068454755AFAAA975B362190B6A7B389E2C833E9A37A0B3FB5D008D18B0F3B957737BB93C766ADAF5CAB03C1D1B63706D2D93FF6AB65F5ADD904B4EC3A95E1109B75D05EC4D08FF0157ED1440B7359A983374FD5CBB7A155B253945DE7EA72373E91987EC0FBECAE9F96B9D8DBB155923B3118E830016738D2C076FCA553892935955F9EDC4F60238AC5C8D63242983EA29CD03365E2564BD4099198A4CA119935317D09BBDBC16"); yield return (Hash: "589686298090DCBAD62E78BA742AFB8C", Seed: 146894225, Hex: "FB4441A6FDDFABE3CC8AA2B6A8301CD2DCF08F6C08BF8FEE4D51680954C0DB1BC7F6793BED0D72052478BBBA1291FE243EFF7662CCF76FCF780B4995D7149A1B3BEFE4278D8481B63E25B35D7D5F9106DF1611F0017C60A14F65C99C7B7903815C500EAEB10607E312E0EB0B71A8DDE129FCEBB964DD39BF81FC57AA4271A7D0CB21F20A845273AF186908C9B291F034902671B8133BBA15B0E8AA4E4CA5A8C18378FB034F38A36F68D3E55636965F4F1D85C0A4230F0FE4A57165DE1EB76FFDFAB071CBD0C791D26BE3D93672014DE8E590168330CBFCE3C28BFF3E550A964309DDB1CDC62BE1751114F6F8528AA18A52422A69103B92D0749E2685CE99FDC46E1FC0322DC82252E6B6E08E793331670C0D0803ECD4C9663D4599A7326F32E9205B8B5804944DA8A69C2CE0B51233AB3FABC77B2056CF2C8D648E35A9E5FA90A243DD73FD1D7931564C58987798F5D854E5F0878E796FE9105640EB133664BCD0BC9FDB86EBE0E8FCD44DF0CB0A3011A71BB12FFB0E9E00CDA2D53586A1E3BD346DC2B2C7CCB9B83E4D9D4EB15C1A2CD5A0FEBA0B81D9C14AAEF4975DEE54BCE524B034E7605F7A5E88968131403BF0F716CFAF62F13C8657449B1136A18A8A41770F440033D5"); yield return (Hash: "72FDDF833E28A3BF414E99B39A03BBC1", Seed: 609010140, Hex: "7BD618E3E0010A5A7AA30FCA2F52907BA322E44CB3D436728724601F6E21C24155E26E55F37AD9E87E1216CB1862E94C8AC54C397F9DFDC49AC9E20CDE5EBA377FFCD7D277A8235FE6FECCDA00A5C3191F3C0AF215A2F92CC1698C14F39F936B33E0C73B69362A8B36D3993521CA1254138122613EC3FBE6036A069A2D61A6646C942E5C638A1EB54FDFF0F1C0921C572FBA9C49AC41E693FDE23AD150DDC59DEDAF68ABCC3BBB74492D1117933EE2FC586FA27FF62B2CDA052617393423CBD33B0A150CDB4ADB5AE01DBD95612F189B6E69F9BDD7E6F5659A1A92E33A1D66086929F476E03E8F813138F4C749EE550CDAD8D10A7B7A"); yield return (Hash: "0B1007134DB0427E8CE40D947C084D61", Seed: 1450199109, Hex: "64C644A6BCACCE07DE37219B5983E8ED023E4BA1F0633981DB20C25255CD7F9D9E2180C9429F9DDBF8EEDC389C3380AF79B5B7439C42A07DCB5E47FCD3CA13FC8339B7F284E8E061C64047C221ED5A0D3EB121EE2A91B831E233678254274059BA088B02F6317BEC129EA7120F773A5F469519C18BACD3DC5DF9CFE02BA346AB289BDA5AD2390DB1B452290F8D2B24B89B29CC2C33CB887D5AB00AD0DA326B0EDFC53AD5C92B3093264B9F1554EC1391A39C1BEFA4EE332A1902F85856AFEB354618B634CFBB35032C8FCB143A21CA8C9C5A02937C577CF910D991C2058E86B91607AF8E59856D484994370E0AC63BB989E426B42EB5AC72B3A5797283C799A9851467958E13848370F4DC80E5DE7FBA1CF2141BC62D9EF6C3833E1453EF0ECDE90CAE4EEAD55FCE44369697CB7606271C4A3331CA1F6E8442C3255556ED73F988DC2AD005050582B34886FA80260BC49C52E847E247BDAD8F27C0542E83C189760110DBAA0057BD95184C41A4849DC7BAAE8082B1ED3E18C0BC994852CF450E793C0CA23FE0CE92E7B0160EDBFC62F3189E74520F79A3F0CFFA6EFEC0F9C5220FF8A8E383D0135015651A7AE2A77509F334BE890E9A75EFC23A0779F253CE2D5720DB54395941EE1CE1A71C4A6C4444CF98"); yield return (Hash: "E4FA8D30EAA2D945A1F2C11D54B162EB", Seed: 882253130, Hex: "E00254ADE52C7EF13AEAFA728995D86848C29FC6F56F2F64143B286735245A13E01D437D8F6F61F399F3AFAE42A838E79FB0D946CD16C54DA7679B87B1B8038B97A99FC8570FE3D3C7BE8417A7056B340D1198830C4EE7D95FE7760F4062A33285766819C1D79F7BEBFA2F4FF7781DBAC2DC14646FA37AADA4E7EEA2113085CDAE7E01F7D89B9ECC167FC8F4773887879B6A3F12DE756FF3412C0B3E2D5C3B620F19B4A6D43CFB52A7DC928CDC5048F6A72F82C98EDC3AD789CA18B38DB25C4FD3F5A4A6254F73EA207DA9ACABEC1B5779DD61050ACA0F40D3BA2DAC3B4DB1AC45E8397389325D662D94AC27AAE2FA4583EF9386A38265D70F8784F01FD537A1B8B6B3225FD202719C5E64C7C697EDB2480DCD10A7F0E584517C94386AB89A85990CDE7E04E6237EB91BF3717BA13C287EF53D7B3F59C01E53D62733DA694399BF7727D9E364483B90396B515F5E30D07D2C6467E4ABB8F0AC109503C24A2CAB6BD7A31273B7157399CBFF89BC3274A5DEAB9013D41CF1D9DC54299AD7AD81C75851146402CC9C008710E9E915AFFC8527F72B"); yield return (Hash: "133616C38F1F5D58633D9796F7914312", Seed: 1680432040, Hex: "36676480E44C8CD45787863C7F77668C65B0EAC82F0ABF50F9126320FDF6DD3160E992EF570BB7D60469F8C11BD9C2D11279D80E0FB1A232F53EAFC573D506BDC3FEC1E70A6AF9D8799BDA2200B43D72048C41A938C21EE670B6F726F63E351672D13C954B56FDA64FA56D7F4FE79B2FC7CE7E5089A6C15F5C6602FDA820695ADD09DFCA233C8110D5162629D9161554F820290E3A5DA33FF75B89A9F56A92AC4282B196ACD2FEBBAB9FF4F8717F9BCAA1752D24AE32A3D93F699B51F2A5560B6BD5C411D496AA704E06522425D6E87FBD76F430B75CB912D02E0BC9C2D6130439A45ACE377926F0A32DB4AF2F5436017E2E09857AD17F8ADAFCB59FADCDC37BDCBD93714505E8EAE5A8B72FB25C9F3B2565A4422A0B3A6FDE321D8F2B30E3398F469C2EF8979A76AD4C37AD0C8515B28E27FED7449F877994224CAFE25AA36468220C6F9C2E3FE81FF39F8F2503EF0F780C23CF948DC3339964AC0BA3B3D3330746986ED7DCB632DF5985000E987B813B43CCCDAC1F638FD32C44DB82F67F1A300C5AECB3F23ECD6758D535AB4B3B042DD80F1B8CD308EEC14F7D8D5436D03A2C9611285E40958804460B2B5A29E7690700069AE80CF7513A488077FFF843C70333010A66E5DE39E75D188664E0E4D17B4A812C0D721564ACD955FF898AF593D9CE937366"); yield return (Hash: "F520644E451B24D627E05D6A27915DF4", Seed: 745299780, Hex: "E8E9FF27E3631E970B690B149957CBB4461418C203CC9161FF6116C372438C92AEACAC54D745A1C2D4CC7224A53254C95CC788A7EAE11AA0F134AD646CBBE716B894A8CD7CAA30CBD3"); yield return (Hash: "2D58D37F66704BB19CE9D8375F3357DD", Seed: 798309683, Hex: "39E0B10CBE34A4AC06E84F1747C7CF7A715BCA736E59E25E7778108220AA9A17B6399D7B4A302990C997ECAC5C76E6944F7A2B7E77CD8736EDCB953F6D2FC4D839D4BDB67206DE2B0AD394DC4387ED3EE77844571E0ABB99DA6699EE190D794C79BD1F3B7434319A56250DB87C2E2A9CC543E1D0BABC0FAD4A65C0648BB68631317CA04EC5936FA321E38AB1ECBB39E405672E6ED3D17F89263DB0FDA33BE12E76B08213FBFC538AD4FE05422F768B8FD36D914FEAC37D0B5A8A57862763B7CAEB94BF81D8A0DEEC0DE54255A7891FB64F1CFA89F883B0EEEE3A289EF18071B0CDC64CCD4604A7F1B4757A2B900F64087A812B3147ACF7126C0CF0FC85D75A87869F545AEE65B9912E8B3E5810D0D4C7DEF05A62D2BFDA18F05163EA839924B1AAC49BBE09B4A68EBC0B3BD1F354963E48D4F49A077D152A67FD1203039F30BE5949551E6A50D346BBEA11DD4BE26702DA23288399111B6B168535A156E05B936D3624B27FAA5F4B4B01FCB9119E53D1A617E33F27F510449A505653E9B2F86745E8489B845E8F7143CB84A2457F218A6792740E"); yield return (Hash: "179724F010611F00A811961600C43B5C", Seed: 293123950, Hex: "75B6A11AE000B76F7AC86BE98D4F2892C9ACF54FE10CD949F3A64F07694CBBAFF9EAB1353164427B534D4E0F964A5410E20E7B5F76F504AB6CA7563A79EF78738ED837B0D760877582ADA753D5284938430AC37448A65872C01F39131D5DAC265A20BA9447749CAF9750997496B6BFA5BAA2C2E195E0940F948139898B7C2F1A8F0AD148D0F603C330F5295067F68672ED20BBBA6DBD2F064500EAB89D2BE7AA67814FAD61E54CD7DDED7BDFB5C796D6083852F591DE546AB51F4B1CE808C3C8425C7C583A2E8224458679D94EC11B63C806375465307C673B616E57B370656BA97FEF750D8789CB6E2F62EB654BF0F826AA8163949494B12ED4D3618323BA69935DFA8321E1C76E3D4D7CE162D8D00F95AD0D5C70D9B3AB50F6792FB949486BBEF91CE43037D8135CB300D4DCD6278C370E1F496191B79BB9180D2369E4DFF239A80A88BFD66A973EF4B1C05E34CDC78597BBF3F102DADA550871A05D90C0041FF07093E4EFA158AAF6743880ECD1B91C33A76535F87A7D519970504DD20100502D5BD2C5F6580736253712E1B842EE277D30343ADD2013EC36A7D8DAE5373ACFE9489BFF4462BCAE543AFCACE4B7487ACC80E76EA12A88AA"); yield return (Hash: "EB966730FB43011CE96BDEE9FDCF9E7E", Seed: 1867967606, Hex: "E251FA5CF42376BA33F2025F6268FC20B65F4644B1DE6FE2485F21AB6E947383DF2E07EBA16C6A22D76DB3849171506DD5500DE36A1BCD2A983476E93AD062CE478FE144817F26B439CFDF2530030D36EE46C0E33B82217CB2A4BC43369DB8591E0BB6BB0B0FC619A813C70B91"); yield return (Hash: "F60A163B9CA0AD0533DB35072037427B", Seed: 2036398956, Hex: "066228F9D6BB33281EC2B000D317383B5F94E8664A83BB88E37BA052FF0BAD64D67543F1ABF396571A233795465CA3D4D88D25A4CB3E52A19CF46ABF2C39CD9012E7E89550509AE804BBA72D10464C21B1A76B1A9BF484C14D5816103BD3ECC72674865CEB2F59F0078C5A57B5CCECC3A2773890F0D95A691C3B7AEFE012238E325B14924841E6D187025ED390BA851A7D383F07ED891B3624E742449429EFD6C05623CBDA4421AE3907453ADD7D35B6F90611AB4926366BC7CE8BE38319D8701288DB9F11437E73BE863CC27DC2D860BF35DF549A52B6DB7E3B96D6F178EE5A5954FC8CB664FAA8D0ABF6718E044DC2489EF8F092ABA15FA2C593CEC24E00B216C088ED29AE33443CDC060B26E3A4A1CFEE6FFC5188219EA4CD506AC80670FCCF2A5B2F15CCD662D803EEF0511E8E8E089D1A6F8A7E57F2EFADF8E843777E6D82944C4B129D99FD370700C985419FEECD46BAAC6DADCAFB28D877E648EC4A195801D1C9F2A4207A5B341180D6CC31694D1CE5E932889AA5"); yield return (Hash: "1A1F3A12426BBD3CBF1D756A39490083", Seed: 890454222, Hex: "C54219FBFACBB4F065F9A89CDED542EE0659D9440478F7C484A89D3154D648B9FF8E0C34A55712697328BA04E229C29200B29B9C77CFE47F3F9A8F93F94FD2D4B657F273446DEC323FD4785D10D181F92155A1251F02E8BCCD8832C452D51FCB7BB480FA9C37D8114E6C879277ED6A72CB8E03D13E5BE0DB4E3300EED4887F39F260B3DF926DBEF89AE35255BCF2BFF027DD895B11275107F38F2F54E1354AC66BE4EF09AEA9C6CDE2AEE5825477160AB049F82667C3D43912F012754E6785F4C73B295911000B913AF81226B597631FECF819AA25D2A9555D16B61FA808FDD614D0453E5227F189DFC32D153CF57E84CAE8AC556E7003702792DEE3F88A491F88509827D6CE365CF5F05DFA1A4ED130B860A804CBBE60"); yield return (Hash: "7D7006C179E094FEEDE44D91C57F0CA7", Seed: 8475956, Hex: "6037DC70BA0DE2E8AAD0CFD08775FB327C6351934085E73E8DFE543C2EF908F4FB2F27F465B4B29F007B78B0D2D6D52B028988F7B597429ADD0B36EBF7406D92702AE84336673B2CE59ADC090B1798C91A40EAD60B1F7EF1BE1872A5C9FBE66675EE88D9FF67FAC23F4307B27CFC42288990340A009C4B12A1425E3DA13775F6758A4A68B4D748041B5CBEF295F6F4AB4678B52BB1BCE7814D05D1E6EA037992A1DCDBB2503C206BE54DDC3D05FB0C69D8409434CFDD73B425EB059251DB339979FA6DAF364B1A8B2EE4DC28999D184D"); yield return (Hash: "438B4961F2E200CEDE1B0BF0C8337F27", Seed: 501492696, Hex: "E292B22E6A54CE234AFB4C13CA7E791F8D2373B55BF147DEBF9B1C4D6A53CDD28959D7D4267F4C3DA1585C038AC5C48A43405A2F675570D1143E5DDF572FF731186FB1869D5F84F0F3D4B058F9F08661022BEE04CEB598F97E75646640E4FF621B511476CD4FF7D6D8E25626EFE682E02767394B48F1CBCFE57CFEEC4DF396C9C4F371C7849A9A8503840ADA9491B9CC8FFE91758A8722F2A0C0318C133F81D9D41B41858A1E4B6BC8E1035943A85D2161B2785C0865E05442C158EC26D1AACF74FE3EF1586DD29D0BC927CB8A9343B960F6CEDEDD8192524E8964682DD0101875495ECBD20774EC08C4DFBDB7D3973A79606F94CFA869F67E148965F8212B69DB37B71D0B5572AD80FB01987367218ADF025793F501967E7EDE7BFF583801CB08E69CB5CE468E6806D9B06399166958C4001290184AD3B3413CA90CB1B97098384AAE278EF993F71AA8FA87B5"); yield return (Hash: "EADA4E03AE7070B8EA6B94C9647B20AA", Seed: 339517188, Hex: "F12BCA7B24A283B1399098CEFA8024776EBF0088E431A016D4A945BE20D13377F1EA909E6B394260431EC82C9972A2D5C29467649F24EAB43F395D82BD188469264C84C5C03A5D36C26A9C58BB837DC1401383974D569961DF501F7F3CBF6249C4D59E12AB900D5583F5438F586135179348C0676E660B652EFC4EB479EDD92890E01D9309723B2E3F59B4FAD64242FCA58B1E840AB9353B78626780593F4A8A95FAA6D91EB6F53B0A301DE8C0B53676ED9592794A9A762CC73731F0EB30B9F7C57974594A5BFE95CB5D64EF74FE1CCF2FDBAF0C2EB6F1D0A9536CCA13598F126385DBC5D1EDC5B9A3DF594434EB0CCABC94E143681F5711820CAB2AB838BE7B85C46C27F757A9A9B5E17AFFB2379D2B36B236FC86669D3F7F237877E5725514DC6E5EA31FEE19B78A918686DC38443F4EB4209CDA2A542377FC12B3633C80E3B31B26AF4BF0DC29F5A76D53C84655573F28E2732632C527E1738440742394B75EB5ED1CC2918C910F1C3E0C46B4DE62AF8BBD0664CA25283178A262F7603F2E9EC38B3AFF4BCBF00537D2EA0F04536CBFAFFE98DE4694BA80C109D563E0BE75A7ADD8B3A6E8B305CC"); yield return (Hash: "543CB8D3E46ABD6144C886C1E2D8047E", Seed: 731757412, Hex: "17EC0FD230A10FAE61416FE16CCA5A6EC66DDB0216C88478CAB70BD10F2CE128C3A61E30A97BCA07C7B1B5A51352CBDACF92AC592ADD76FDFED1708D55"); yield return (Hash: "F80FAD62EC259069CC0373CB6A808548", Seed: 1054431549, Hex: "5C166D36ADEA2875D1A371D1A8BED349316BFAA57175CC46BD0DDBD79028A674659E4DEF5BC469FBC1CDD1790F89FC78AA63D95F0AF442A9194B36F5CDE41BABFAF0CAB5366916A2593B469663AD5EF54D85349CFA1E8202B826EF216F969EBE84D02EF6001397CFD1613DA70454BEA69B824E98AC8FD4699439A427D4AB80BDE968776E80A58FC94AB2EEAAB262702EA914188A642E96E390856538E48A9916E126FE3AA64323C232A1193B669F3A66B88B78235E823463BC07B9BA844AB58D527EE69FC406D40EC10AE6D0D3065EFD28D59420AA13B104449F382E7960B40981613473F6D0828C7C8EDBC9A6825F485F1C2E8055F6CAEFFBBD446F1714443D01D583F1C45F93409AF0AB6A6B671D732BE4BE69ACA2E623D0777B6D5D790AF74EAF2C3401D4AE0D781206CFFC44ADA7F87DD2D4AA2F133DAE45A5909F50AEC085FE7A5C11D45D2545975B51CF3955D55FEBFEF289A3BFBB9177D2600465F196F28706D080AD10CBB267879DD6997E98E4BA604B4B6082C289DC7D04BDEF219B07DE60FEB76195AAF01829FD7319C065F1B42AFD5713CD155465BEA0968712CAC544D70C869524FADACD1A68D8E21D30507AFDDEFA2EDA1D6010BA6EED9D82"); yield return (Hash: "B6B77C0BF72F7E788431CC148A98ED1D", Seed: 793190462, Hex: "A1F9424500DD1737978FDBDDA389A0D7473B458190E7A85DED614E960DEDA0759BBC5273830CA948DECAC4312AF2"); yield return (Hash: "3A489DC58B1C4C3C532D157B5C511DAD", Seed: 1955206138, Hex: "51392193F66B32C878A4425E1D1EE2EB3097D4E13A71F4437E4881E58E4B09DF98FEDA35A7301589CDDC298266631D5B0E132155B71DCD40EEF6300C5358A2C9613409B5409DA98140EB8DE4DA8AEBDAB7DFD11399F76ABEB37805CF4496DAF14E4EBC4B3643ABFF0DEE2B465E84D2EEA37F7B0408E8F26F94D9333256A04044B2DE1A45623856B6289B47FEDCD89222A5D90347D370DA5331F3E76EC937EBD58AF3CCC2E96D94F3A7C53699C46765B80C6A2A1B722B21ABCF4FAB43BEB43D29C19F0617AA8CE32C070CDBCDB67843490DDCE4B96B0A23109F1FC1DDB0944418223B0858CCBF1D749CAC77D62EA31AE7B38211AECFAF1BAC3799E8B235E443577633898D27DE0934C3E0FDBE9FDB827CF93DC3BD4403203E726C0354D2424A916453E368B3E6E6C7E6D60C2E61957BE21ED81013875D306C19B29C6DCAFA6A03A7DDCA8EA5984584ED0342C7B41A8290FA4945CBD0BF9F2DCA74D46DDB01732DCACC28BA6B8991299AEB85D2C01FD7D7B497DD590C3B31C52EBA72FF89DABA665A6B9E47A2783F978B25AC57CCA6229B621C8A15232C8561FEB2FB0F5128AE7BF9B2E4A68BDF55428150EB9A3A7DDD9C8953852764F830F42B57952B"); yield return (Hash: "70A0C83C5C734BA2D2EB5A4B257C0FE4", Seed: 266936576, Hex: "24E66EE187958ABECDA7B32943B457141B8A8B2872B8E5A32D60219C4F0C8A51A1B17DECCA660C02B7FBCAA356802DA29C9F245618A9F19C63B30C9767D6CE58049C811B58C9A069A5C2ACD1A3B96CACFEDD47FFC3C5AF2711FA4C54DEA6670BAAC04FD383287DD48AA208838DB3D38D606ABB9CB7601A3C1ADA3BBED76F0B8FC9E34849B3E16CC94C492BBFF233CAA4B1406511ADC3CED05502C416004A2EFBA85AFD8733002C4E8671190313"); yield return (Hash: "E34136F1C60BFDB77945F9DCF724A5EA", Seed: 292193617, Hex: "6EBA7BF68EF353310B3A0EFA217625EA6562B03B213D6C99AE86B982F88E769E32C3B85DB489"); yield return (Hash: "A1E5373A9BFD1FB2613518D275F1FABA", Seed: 187007621, Hex: "A28894F958F82461DB49B940024131CB1660A9CA26111EF52A8C23C482217D5A6D207841BB40F894539F1D4D05787199BBE666A8A3C223629B6A6BB1A2EEAEB580057ED086FCC152533302C3B628EE7A17D2CEADA9A1A01F3F57B52184B81178B57A2256E324DB9058B8B647E2E73385FFB85F80A771A4E1D12B6AD9CB6D527D6DDC2D0AB5348A4165A67A08A8B9959B8DE683E1600AFC15A1E80692C04D3675957DE818B89840BB2A70AA16A958A8EE3CB50680D34C63CA662A921055697B47F770EF2FEDB9443922680D85D47EB5A06A1E844AF9BB1F5409A2F2A77031D3C61245B69F30654FA905776297E27AA53BEBBBADCE972C00E8DCE26323A8AF6C8DB40D2087E9923BF96C7BE63872595962CCEE5578F66ADF3598226169545394043D716971A0EA7328D00CA1BD1B560D2C55C1F9D1292E660B4C63245397D5E438AF2209529F1DAFAAC02573572E11C9D659709018F91F651A5CDA1FEA5FA0532BDF6607887A9CFD67C2BCF30014934F24A1AA047EC1716AACB500847F8969F4AB2E4879658D3A230A674052B3B58E193A5057725690E80B95CA7DEB184C4E706B5852BDBE2530E0BE6587EA3C9098ABC1060DC449C357301F19CB4D33319768E5C95768781373CEBF3014242E"); yield return (Hash: "BAEDD366E4E621B6A4089145A9019ADF", Seed: 1848660263, Hex: "7699C90DFDF94842A7D5A0FE0EB74CF241FE8104749A2D0E170B527E3D17E0105123594DA43856C61EAC70B47EEDFC0197E5F27CBE0D2B8AA9ACD88A505D85D86BC4D443CA12219BBCBE12696CE28376DFE84F394112B5752167D3BD3F97AAAA78C18A"); yield return (Hash: "13EA1A9F928A3C1E916E6756F31AC5D5", Seed: 1847583846, Hex: "9B0BD49CEFDBF6E611B15A36174E207B05EC2776312D2945CD9E78371391E533E87D35FD728CBAA308EE6FB41BB822484011244DDA3E063D16AE711C7C307B9DAABB25C41FD57B8FFBB49311FE4CFA0B8636EA946F82441F85928D2616163857ACC9AEB64972"); yield return (Hash: "F651F2257CFE64E1F2B6B8F82895C844", Seed: 726554, Hex: "769A819CE7EAEE18DEC4CA2E30D17E2BFFA78BEB87B87F3BEEE753B9ECDFBB23BC446632B1A0C753AF5A0DAAD4FFBFEF0554DACDC4F04C4E4523E5141439602C2A6EB49A0566C17E397E010F693EE18B6F9E4186CA2293BAE1A61691D8E9E24BBAA76B374FE3DFDDCBEE463D40AE1FEDA77E54AC7E598033C2DC485457988670A27DF4FA506825293A7E71A3155CFC70FCDFCFB610EA3EA8C6F58E496B73C9D32DAFCD768C10DFF3420465A714760F7F6A8219F9E7576116B0A1E949576546DD"); yield return (Hash: "F3794F955F5ED05D0F9E02AC09A03FD1", Seed: 1761839230, Hex: "B7CC7930A309B048CAFEEB40675E6E652E6D670747F2DD49502A9AB4606A59AE0DDE3B4EF9D9A6253DCE7F1FC5F7A74080FA75E5402EE28563D4C35FA1AA2AC8248A7108FCACB7F343F60E2702FBA183C87CC50EA28DAE7AE73A1EB8FD8A84970D56C48449AD0E9B36A22CC58A0E352E7CA5EA8B2D9BAB92AB19730AF0DEBC490AC4CB4C415DD78D9725428A5D6365A058697EF538E88F80E643451EDD8C3A9B2E740332"); yield return (Hash: "52B7B8885C3FEE5FA4663C1283FB8BFE", Seed: 1830390006, Hex: "30C4FACE7805F079013BF45B2A53DCAF8DC3EEAF53632140BACE8FACA4EA80B7C049D21C0CEA1AED33B9C95281D739DAF106D00A2418ED49D657804048BC75A6018930E08DCDAA4AC615CE7F4F3EDBB610FCE2377E730D4910DB0996FB15D04EC5CD80BB5A81988839603B5DCE68D37826F5A5EDA5709CECB389046AC2AE225A32257B403A0626C5E495D67693E60A2025220306FBA8D45A434140E4E628BB5A61E6D5973354675078C756D17DD47A2DA487F3493F7AF1B3E8550E1AF8B2D81C6692B715863551F62F23A603053ADFBD9F2F7A442EBC1CB42647535B52A3"); yield return (Hash: "093100A8154593FC4826719FEA39819B", Seed: 106964303, Hex: "397E833DD6147245A17DE2A8D6B097D6C8474B7A9A79B97C53D33ED475670E966BA30294E09DA4845F4C308BBDD3EC674D75BB20299C45B5C740BD80EFA7150546178211B5121E85AC49BE10EEB7CF5C74B498EF24412EE856596B1A9C074C8D2DCCA6FCA7EDED1DA6CCE9D815EF20F03B365080A192420C30086F8F38D303261B2AF24069F4004AFCA9F3D7915E38D77A5EC675E390E94D3458B9431589A4212AAE5475DBC6BB4A85F2AE8DAFCCBADA7E9F58641775E0658296DD2242E332AE67B9CFF9FF375A3612FBB88A"); yield return (Hash: "9A36AAD0E82356BE98F4F51548F008A5", Seed: 1561701609, Hex: "6FC5C8E110560E6249A06141526B8B479F7E6968FEDFF7ED14B8296EE7529C25B124CA6567D69926BDF50CB56A0DB71B03E798070E585606142040EB751AFD675CBEAD85C8311D98FA3CD2285854F0C52F16141764F333432766C3FC"); yield return (Hash: "46D424ABCECB85C1DF35E746270FF34A", Seed: 693213250, Hex: "65C0D959584640865F774AD10DBBD75B1A4374F3ABFB6D136F78B0BC9B5CAC64D28109E8A400923F45E0F806BA7AB04484FD5EF091F63BA90584D455F156D9222EF86A357C31FC6A82ECA6E5D27016DD39430658C33E9E6E1CD27D56F008F26E4E2E60B331F68F1FD45ED3B3D8946F57C2DA4AF6E8BD7132302A6359391EE66264F4D18A1B8E0967132FE18DDF454886B095239A162FA9E668F124908810387450741E16BA58A20C8C69DDBB76BD70AFFDD3FBBBC989538B33CCDD2D89E96732CCF6E4497152488462C8F58F76EB1324D5E83DA3593A66F1D23B"); yield return (Hash: "A703A597FFF8225734D078498FDD61D6", Seed: 1521464178, Hex: "1FA90B9BDA4AC7C15E8C6C64D996F33DD8E515A783F5DC966A41457E35D2A7D435F8C2F3974B6F3A4023F7AEFC25D15CE862942B4467931DCF9B9FBC0B7C45B51A095D2B614A48C4BACFB0B11127DF0013DE6E0E861F07992C0366B9394015F099DCFEC0C5F6991F0F99716E361479093285DC34ACB733FAF1E15CBFA79E49519FF4BB1B47E9AF5B56BB296FE3F5B564A23DCD2C"); yield return (Hash: "A93376F50FBB9DB5163F0A9994ED0B56", Seed: 1072264960, Hex: "292AB77BCB393B098EDA59322F077A5EF9F725C78E4B5A79FD927808499A1B802C2BB13886516B6AE9BBBEE534DF057C710D202D9C63A2149DEE9524BBD6AEB63C48AE0F1F913A00795BD46B6C79C52C16DC7145785B7F2090E36DA211E2851D443FB44E335C14378756979EDDC6DD4C4E528B033E6CC96CAC1F48C97BE0CD391DAE438E40F8319F7A4927C07FDF9145A1041E112209B35717E64CF4F72FAB9ECA4BED93B1B637464A93E7B3DA1455274B95934A477DD6E30077B3024E4D550F4F8DD36FE2A2E427DF15C21D690665B020B972B3DFA436710DD6EFDEE1F56663F3C62BCD67B3A52CFB0C5786599593CAAAF4A3F5403D35F0532449FC80D073E4F5B67551AA3F8EE4F94B63F44797ACADFE61A97A7C6D2A26FC3974036D759660C4A2E7EBC4BC2B7F659D826EF6E74AC0"); yield return (Hash: "6FF1A93692A866E2A43EEEA435CD4A26", Seed: 1351448939, Hex: "80172DAD5A54493ED85094DF1B4DB61EC7E945A2530EB538AE84FCCC1E9EB12E2CA5B21B29B888849C178E6BB6290AB17BE9DB4868B9312457D2E3CB03460D967B48652058B48013EF854078F2839EE4DEB6B637BDE8F1A8715CE69CDFDB7118517F08D905BBC74CF9E76113D329D0253ACF8DE6129A7D2812095A6BCB27F553B8862CA953D182C8DF3F4BA9C409FC52EBD5666D2847FA98AD72EE21E5EF24D59E0A215C67E2FF51390F314CEFB84535D16112D7FC4BBD66F74AFCFB65F382A97FA85E55AB0BF701DC651FDE0B490F9A97DF93BA59BCC5F58D014984004F28994EC077BC80C695EFEF2BB887C4D6A801098038A83EB73ACB40D6E8B663FB94E1CD33FA4CD74F0D6DF67559CEDE9522D46FDD2353CFC83CF9B191F470DCF0108A1605621BAA2891347FE9729E88EDE2A239E18363E8B595108EA58CCA9877A420B37D4DD2DB44253EB6BE65E34A3D90F7446A2E8107B6076D4F789BFD8792EA8DDF67DFCAEAE2475E47FA160F0DB3EAC24D31D23FA3214F0EC1C748DC2465619E0D563C9A8EA8051E8C9F44BECAFDB501DDA8ECE06B32164B4F6DD3D8B0BC18CDFAB4BBA05DE0751A5AD1DEB143B13304"); } private static IEnumerable<(string Hash, uint Seed, string Hex)> Murmur32BitsX86TestData() { yield return (Hash: "D53A67C0", Seed: 170723556, Hex: "21B97398C15CFCB20CE12BE0BCE68FD2705976AAC94CD51CB3774323EED798"); yield return (Hash: "67B59E61", Seed: 975387919, Hex: "6F67C38642BE8989F8CD9FDA458434E93BC53A0EE7F69AC931AB1C8162F16263C84B57BDC0EF1793CFDE38BA913C298BC92015D638449E080F034D6902ED38B32D0B71901C0ECAEB5963A6A243C7C41EEB16EF33772759632F4AD635A68E02F9248BE522AE069FC6634123526E307340FEAE5926009C65C667A260B10EE6F32259B3CB1E97BF2048887447727EB27B1B1E5C8F75C24F63EEBC22F012"); yield return (Hash: "28B6B788", Seed: 625721906, Hex: "7FB5304ADBF27E57B64E9E453371C03BD2211C7CD4798138D73B21725D02669929FA4866DF421F050847ACAF427C805A08D71F9DA0AFF1A18CA0985A9BFAA65E2F0E69F8F88A3592A6C44AB454A26010EDC79E44319E8442437F5C5C6C5A7690C7CAFBB61B285334CDD25BC54EAA6E856CC70A60B8566A80308E65909B91477A53008616D0EE9E45BE9DC2AB202D0BBB45D59D939361AA680354D04A0D9CE2526F085AF6BFB0227573768A9F52F7F2BF9DCDE3B619F1E870E835E5F2B03184F2D77CCCD49FA4A3A8D705D734C63849E9BBAC73C72DD6B7324C86F5857F34C469301129AE8DAE7545C9F1585E21946CBD1E9021B70BE46CB1CC4D7E80761532BB0A75DEC3CE63426CA9829EA00031329D108A55FEAA1AD867FB05A47E4CE3FDDF53B8BEDABAA579C74C0DE94BBD48AAF45A55242B1380891C3F223DE093888B9F50A398D80AB97509349774E1E21AEE79B86130AB83A28B29BC2169A41437D7E86104ABD3EC2A88915DBC3B0797381A28C54D92D52FAF3BC8D25C946E51EC74445A0906B1FDA9E873FF30917CD69ED742C10D26B9BE75171ABB433565344EFA5B127DC8E44D1CB4AEE2B69A08BC718025EBE327FA0F7082A4B9EDB1B5FB092BEB44E6"); yield return (Hash: "E0A93CCF", Seed: 1402226386, Hex: "FFF7A3687F3742C932B39F1AD5D7616629967FAF983CE6FD35D87D10B9A301B4DA15F5F7DE66BCC5EB1AB22D4C2697187CDDF6863AB52A64FA4A9CE1153CD7EEE49E68CB13B5A548E6BDE676E2C5"); yield return (Hash: "2C949609", Seed: 966406493, Hex: "39ADA114554E1A9E3EC4C13E079A117B0FED1536B25D3CCCD625C2C49E68CDB984FC2A0E54652FF6D99FC5C68B8919BD9EB5DB4CBC6CF151A9936397D2E919EFC1A851F757988FFAE9643E3E856B5A4A4C08BD94BFDF3B19090985338F5BE2F924AB04D5C361A80934C4F96DF69CE437692179D8E5E17334DCF6AD6550970438C6EEA1558F03471EBB7F3C286E36061659A65F06A197571440D7290C3C4DFE72B7773E042458DD3E6BB27523E548131B48545A419AEF5213DE63657728BE7D2D7F21544F5D97EA38BC635EA6FB077FBEA9888EB9C1A4EFAA3B221B4CE7F524E6DC63231CFF11257A80A8FDF6E96D6B428C8AC37912BB1FCD8A99FFF6D781AF85C9CDAD544481C36C0AA6D7A966A7AB1661DCB19F2525CEC99DFFCA88BCAD0ED9C0D8882F0CC718496EF438D56893A103244622DEFAE73A6DE96AED60A4245FB48706285C3DC850D169CC3A125D63E24101B18F4FD3DCE9EF6DBC69C6C74F3EDBF714481AA6271FB4A553335303FA20A3C3A7D069F7D470EFF2AB7646D7548B41191DCEF823BB4171BE7941"); yield return (Hash: "BF39B38A", Seed: 438798508, Hex: "06D3B33CFC0737A8B8D053AA488721B0D346B0ECBE07182CCDB7528D60178A621510"); yield return (Hash: "4C2E01F2", Seed: 1900650905, Hex: "658FBD79F58DE3E8877176F67FF8B0FA1CE63E39E9F2E9D99875248B38DDC355A4E378C0A8F7577A1BF774DEAF368A1599B864679BE9A8CC53B27A9FFE17B6ED53CDA4B6F8A19CB6DF9BAD3AE942BB0543250DE69440ED53756D8809CF011E59E3B26E1F944794C42BC813D8F3EC0536B6B31428053D73D668DB909AFDABDA0EA1E97B4E7DD76102B55B3E7327BAF0F9967A49DE36E665D02290A28297A1060092D6961CA714BB5FC2A14A9BFC5CA70D339F61384993A9290F272CD529F000B63C4285664600D14405AB288F2F807C330992431DB97112702C92758F48F5ABDC09059509213C097BBAD94232EF972289245AB4A0608B849092BE15D77D3B16664CCE71C9339C6A0D"); yield return (Hash: "FA7697C8", Seed: 989050899, Hex: "2908E68E04834F40A63C78BF62B91905F1573E5375E8AA1C3CA8468EF131D4A90579B5326D61A5EAE23B43DCFD3D193CE4783579113B846C1DE785372A17FC8AD990CEFF91720A48AC611BB450BD34864658E3FD4D3C897B0437A6FBA9164653D6CCD94ABE3EFB12E27CA1585D0EFEDD497771997D520D7AB261CC64567171FB141F1119D22CE694F4A248E476677D4C22C8C8954A73A07BB180184BC0B2657E49C68A01BC6CB1E5CA11DD3B9A770CCF15D8BF878217492770740267AEBA3756DC4FABC7EDBD071BCA76BBEBF719E8E898FF2EF19AC1DD73ABDC6746A433CA66D8658E1E8783D4A1719C6E8AEE31CE5D4EDE4BCCB86975B93D2F561F4E1A96DF6C1DD531A9FDBD948A441463EF88EF95A7AFC0D8A7024FB0E19EF929E54909AC2316368C56E94EE3A82B9A80AEACD02B78293E21DADA2DB94393D43CE4A92ED64BC34A8BF8FD3A553BEDFE4440B193F0C2E70E441512A37F3E570BA095C6532B3126F6079E3D04E8AC4907"); yield return (Hash: "236CEC11", Seed: 81726960, Hex: "A14A5B8B1422F08D9C53EA30F54980C69C99231443CA2B556EE7D5340AE81C41BEDC65AF3D562F66E65C6CBD77DBAA340F6BFCB505CEF3ADFDFCD799665FC3AD74E3528F1F43875169719DC21F71EF42C7DF2EA64945DBBC6EB80E4D33957AC571CE7B12743BE1D294256EB7F8D9D0D1143AE3474D9BB3DF5AEE1FB99F20884B285371B4035B99C8DE83B8A3AFFA08DDBB6B6D85604CE4BAA7090E72836C77C8C10FF6D55482802769A30D37567B1A0E44C79DC158460A8F41106449958DC107CD3660B6255DE78E76031C3F742BE1035DB27C4879CE4BE4885772DC3FC4DB4CB36A4CC1F13729CD5251782E235AA233854F734C"); yield return (Hash: "E67D23FC", Seed: 1816018064, Hex: "9BD5184983CC5006FE6160BFD25F0B40A46249753A85F236752C253531563D79DBC86555354C0647FEAD0367AF984C0AB669AD61D2D9AFA64A1EA75DD5FD3A4D363477C69025D27E159A54A374DDEC7D"); yield return (Hash: "50553A80", Seed: 1041377529, Hex: "2D70759023927560E578715C2D52E1F49A2E43AFB63465CCBCB389A0BAEB221E8B89A996EFCB51B9A6C94520F381A9D594F5AFAE7153686B4121320A5E0CBCC2771FDD24EC6C2F91D0A063ABD7411DCA158592DD109FEB01F4EB003188A913B074D3DAABF501E04AC7D882B28A853D71B611957ACEC5B2EF775C5CCA7D3D54BE7243F0CB2CF6EF029EADD140D4881F0492A392025C98452B9CE26385CD8A50F3A309F93A5F994D3CA0E8FC9795618D9E55D85667F668EA68B62605BD4A99B4414987DD4AD69C91A8AF6E62185CD1239481B5C71052B6B7367909B01F0688CAA0E39B2D2B99001B4BB01422AAEA572BA0E8D3E72BD8E2F3779E140C335AF64037E3FDE0E5617FC7411195CC09289F034D3E44D281FB0A47DEE811E4937895428B67BF747A4222E7EA6C8FFE35348F4E9F672C7D2DC7DC3093ACAAAC0FA899BFAF5A13EAEE1EFBAE018E6440C6551BBAEEC23536E728799D2BECDD3B388CB2B9018BB77A2930B8A134C27D29724C9AEA9CA5"); yield return (Hash: "F438D9D7", Seed: 671833021, Hex: "24A368434F35CC1DBD1136CF1DADB380D44615369AAB4E4CFF6C313EF4C283F8A89EEDA391D8F2BD62001F8219C3EC371719B2DFB0DCF1D25C7515CDEF5626F1E8E2C1323A4CA57E4A30A88715BD266D361542AAED1750230352A4C09C7F651A3A9FDF1B582214DABEAC7FA1EDDE58CF7B0888AF49BE6990D3D800F4571AF262BAE01965F68F05AC0DFF5788D4113DE2955B4603E9B590AC2F5933AD60C2B83F44034657CFAC481D8237B3D84F15DCAB8985B66E8C4F6D279EDC9D33A546DD9F6B55E7521F5FB8C4FE8582A965411E2E76231FCDDE29138B613CE66E4CF1BFE86D8D10F94E4A10EE7D0DD60DDF635014C66EA2CBDFDC0028443915D26A5999494FEFD1CE4F9BB0A87A86784316BB8B0112EF671114DA1C22317329387AFDD227EB53965E155DFCC5464B1225FC4ED9C313EFCAC5842B046FA1B4F11044F7E00D7E9A6D126FF140D89B4D726CD0E246526223E68BE0A0DEB992B6D78C1EA3A65010CDAFB501B5"); yield return (Hash: "5B35F031", Seed: 151857919, Hex: "5D5E19BD6FDE1F558CE2508422AA39B6F6FD12BFB26BD8BD19108688504465DFA9C59BD90856019CA183F79A40655D234E0666191BE799D3439FEC7A2F6FA7801C14106002CE29BEF93356551E0AEF5C6EB3DC92B6BC3D063B9F42E05BC9A66010C7C6254AC8B3654E6CDDAEE4DAF9B2F8B697FD0E209C5BAE0B3DEC41D788C2CDBAE0521057A526B7A2FDD6DB36A2CFC1526CC759511BFA62E55D5EBA3C4024E759F15191CA8E6636CD588844F53F5353BD1DDF9E2BEC09CC7E521D433159FF64F998F3302076D3D7DBC9132C675E6550E8B16D30B47213951DFB30624271537872DF38DAD4031167E811242437DD3E4F41DE98758FAE8F2AD7A5053010BEB32324017CE3CE21FEACE4314E014336554BFEA7B6D28A691971FE35C78ED2A9A0593EBFA1DE4902AFFEA41232F468E171E5C461C9D21B8390B65311415E0BB554161CFA6BC18D662CDB577060EEA8E2909ABCF23C6DC3AE1628B99E9F10B23CC079ADD69B23E1B41C600E0495C07D2856375214505073DE7CC3A1CD26AE777FE2A19B0E38B8A75CDD781AA0B9776910272675E90F7FD66C3E384F92D932F78B945CCDA5FD1427F5FC9B94B22A66A38D76EB8A65BFD70203C059748CA68470CEBBB0501D9823B91311501057796687B87AAC7BBCD68850EA0DAA101E9A2840812AF93D6D9D85"); yield return (Hash: "0AEF7351", Seed: 1257387532, Hex: "7A3AD2683142DCDED1F761D03D54983C83323F4BA24AADD9B5D42F174FFDF7045DFC66E94DC4716D6753B67009FF0BC9232F82C31F21285F65964FC979C0367CD1050BADA55EAEEBEBDDF47B4F500DB5B93EB4E679ABE982E86B874BFF4E6860159840E4FAB89E9675882BC5E337061584F0A18CA94250AFBA7B49FED03490E3BB66F09EBAD65E0739724993E606112532B413A6005E50272C6CDD326E42F3B1EF40B3CC582FAFF3A7DFC920ED6C70F4903454BB5225361F8DFC0567CCA97C276538C6958087EA51F1D9EBF66D04F796F0735A6DDBA0CDD7DE42194D9CCC504F86BE4736AEFD277BC8DB1E157A836D830CBA24904DE3EA0F6CFEA466B4DE688CD3"); yield return (Hash: "626A20AA", Seed: 1971886244, Hex: ""); yield return (Hash: "58062C45", Seed: 1473444627, Hex: "C8C772CA762C18AFCF6EDE17CA046625B49853FCA54104ACD123FF9C5CBDC98068C756D0F672EC2EE7DFFE7DB798D5AADAF01B79FF06210B8732CFC0F7AD6361CB7BC0CD2CB9F63D43E820B9B45BC629855695390FE216C98542A91C3404AF8BB9C0EA"); yield return (Hash: "615D36FF", Seed: 1199943458, Hex: "1EC75C1138E63C81FCF3D1AD572B6EF25FC3EC47FB2950D8FE117B990024FA101C0A438B8A57C6A637FF186B68728E6B46F54A563FBC0706655ED43011D30C2C92C79AA41D1E1AD0240B8E979029D5FD572C17965DE07A291E0DD9A244CCC644009D8727DEB6FADC8BEAC26BDA133D44575B13D98DF256B4AA499051FA71758633D30D8EC8233934C6F4F01DB4B42AB201976C4C5DC80C8B536485F80B6DB7EACC4AF4A427EB70F2F394DAEA846D62003AECD0A5DFC98E0427CDC6B84FEE7828CAB3B03024E431266E9247E5BF859D4B40973BD30813D894EF90CA355F77CCE0C9644386C676B2E8D622DAA1CCEB1AA758C3EDD64485A9A57DA7638AD131115047DA9DBBCC383E0A1EB460298FB4EA18"); yield return (Hash: "7E51594B", Seed: 1180383412, Hex: "FB1C84ED7BEED80D423BF420CCD10CBF8959EEB56C0CF9B1608AA4F6BAAE54274501901660D9A79606B4B07F3FB4A67EC1F11F7EB18D83808E866BC5AE4A5CF0A0829483955E2538447FF8765E388F0872807829B02F5257C16920FAB4A8D0340C15E4269D8C9CEF31730902EC597C059DFCFA44AA9A4D8F99032FE1DA54868ABC2A7B05593F5D2F47704216F572B4D1F48F2E14F92E1279A4D53449DF4BB2B714FE8D61677AFF1D15D070C8D4CFE6A32F4E7C129172CBA4B1DC8679F503ED8D0B87F6A55B2982080BC7533860243824B71CF2FFDAABA6A814FC49B233BA075AEB618BE31E3810E2F8BDA3F91860388EA3A23765C4D7F40C9C2324730330C75527AE893AD103993AFC5BB9F908FC6545C5D3BC973F297B61F35CAE7A2B7CD6D97E64EBBC025B5F9FEA5446989356A6F79578C70E4A423C8C4BDAE9A40B03526FCE57C88DD65EEE0969315B22AA74C196A06C8CAE6A50CE54F52DE9A1CFDA6D4DF2E20D2A38CD640C35FCA72FA3BB33C120E22C140E56462B67F13D5D38FC91536942A0497AB3BB15B8C1371F7B1A31CAFA47B1590BA4EFD7CFA15C6969E23B1049DC189F53156F7219E9CF31F98263EBFE8315FCF550FBFDC8C93C1E9D688C96A76242367B730F2B2878B2BE5911EC5D50B7408CFF8A1D55BC04A5930669D7C895D6A89324CCEBBE1085A7CA8E8D6BA60570C48E3A"); yield return (Hash: "FCB8A112", Seed: 1807159516, Hex: "546C54FBB231427D5C7905143DFCD5B09B29D5E3FBE43B0F1CCA350D696813700B19483B1F9458E868B519BC8D6092F8D4CA8009F46F0EC584147CA215946D75485C505B453F919ECCEA7A1573B60382D5D7346C909AAE6CDE26DF17FB7DC1BB733875DB21ED6DCB6C37938764D48737CB6D83AF850B85F94229111112011B65F4FA9D50FA961994E3FA300E797A2008FC765CDA4E5400A5330730528F0DD932049C8B1C37F03AB846F5D5AA96C807DDA619468CDF5F73B24E26444B4E112BBA4490C75D50F6FF6BF3769CB8A307D1C67DD55931FDBB44B292802E554078EBF1E19103F30F54AF7AD863A4313A81BD592B1730A384A09F255838541A251F1BCCA2DEA35724932A6139A12DB7F38635CCE30F3696504F3BCF08C575C192A767BF32C50C3C36FDBA6E24E251C46C506E25EB440D6D598D293C2A8F85BB1C399AA70133EAA2B50945CD6CF303723F7E3D7BD729521E745FB30B45568AB93301BBEA062BB9FDD8FBCCC16786A13666353B1DAFC35DAA4E470037FB3403ACFC2D2A505BD9EF6E09E9C0AE6C433433EA804851D44492F7F0541887356CF2234AB0102A9E6D6904A9"); yield return (Hash: "292A8460", Seed: 1510874838, Hex: "BB420B654BAB218E1387AF3B375B8914F01B59BB14B7F84689611BDDB58013F88AB6B5736DECF79B3D47B6"); yield return (Hash: "5B769E81", Seed: 2083387948, Hex: "4B9FDD56AF8AFF384E1CCACA1430BF53DDFED32052C32DD1A08B3851004D32BD49B5AF9A3475185F149F186E6B85D54D69A36FDD27A2246CF23817DCA81F65F4249F75CD82DA6C142483311D63F6452AB38C09F09F2EF49F307279C1FBD9345A2E830CDEBD02651AB861C2A4AA6CB513BC0D20EC81319B7EC31C2F97CA7E2ECAEC2F86886F131FFA24F605FFA80ADEFC3B902B0E2B7151DBA47F97D73E5578D187EBADB4CE264C713733E734E04F856E7AA0EFD4E9EB9CF3F444FFA7A2E3BAEAFC2DD1A66A561B40694979CB01BD66A62972327B58D072B6541DE1F962724C153F2930CC94EE40293C091EEA8835AA7507E29343DE8D3DEE142D25E82440B0FDA336DF5422EB80DCD6DE5C7BA3E980"); yield return (Hash: "D5D56A25", Seed: 1997473818, Hex: "BC0290C957E7D4AAA6886E9B0E65C855C1A5D67B05681B9960747915A3EBC2DAC29A25B442BDF59277544B7861E89DFC5378E8A2C47E9F24777CF9116B23CE46C957BEE2D5B181200F53CE1A616647ED28EDBBD6B4B18AB1F04ED993836D756949CD3B5DF26B1DBB34B9647389A2A24D61E491556A1D02AD4959F71F0BB6D6D7AFBF8C65941022CB25A8593C548F7012FAB3AD0E188FE4D56028D390F07B0A21C27B03E9E205CB4C4E1919B22A7F828A2FC12AE87BF90F290729ADC98E8A0837ACEE94DE3D83E952F07D361CBEB2F5A99B6BB07EE46C0CB1E757D93F22EBC4C0BB9A61D58DD4B3E9BB2067E52D"); yield return (Hash: "63A3E2FF", Seed: 688400552, Hex: "0D4E903F204FA4E179F530B5C5234E7BEAA53122EC820FF5D68CB9C9468BD212043D50DDAD39525C8873C5B838227752032879EE11A194B784"); yield return (Hash: "D870D72B", Seed: 32617930, Hex: "1BC897386E56FB1694B9B06966027CC8A3123395E00709C5AF74180963E81BA14D1D09BCAA9204D0A2EC7DCA4641B07246C152A70A9B3D5BA87785785570197720C1BC6EEDB118E45F1BB20FF435B7B9135283C806F36DE28FE2F86E70956CD859B6404134F56D47ACB577648AA63710363FBC33A2437AF2A7777E75195674167977982764D2EAB8BA8041B6527F1A303219D802E47BCC2862D2F659BA47F8ACB242EA619BBBB08FED0B43DB223C87E1B45544EB65ECF161EAC1EFCBEFF18CAE81553BFFFE81D930F62426620433F9F69CEB2D46D9795EB05907E5CC82E35140DC2197E6DBDCDC8D57F13E18578870B74A8F2E8A5CC9318D9C5FDCA531453D1D00F20089E5B506A4347C4D1B92EB64ED01163BE4318376CEE5A596B577BED3C8E5D9CC30CD35F322ABDA21AC537C22FC"); yield return (Hash: "7C56E79E", Seed: 1947383842, Hex: "897A87B55E042359C15CFC6471CB7F9CDF818DC4C24D4FDEFF6919ECFED62B484AA996E33932C9CD515CE65A18D19C5777DA8D3A09372BF53B86B23FDADA6C7903869FD72866172E336A1CC1174345A067D2ACB0D374AE8B64E759CAF47D86B225D48B071B7DAD1A4F7C4D06C74A4D13C559F974EAA3D4F74DEEAA15B88860B2A90EE31313FD2D57FC2A98802CDBBBA4F3"); yield return (Hash: "A80E1928", Seed: 1821412684, Hex: "B09F09348CDAE0B5B40AA991A19734559AD88A5A2353C0F478B7C13D37F68C710E2F78455AD0816E6EF88D14054406F92D45DB9320D32B46F8B2C0927DDFE6268851BF4B8CE74643BBA64246F6AF96B8CB8BE53176486BC60344B0D775A4AE68F7D4222709665B79B69A973061B9843F5ED1329D431B124F77504483CF68FD809D80C1485D9A85D65DAE4E37C94A32B0F5641579A52719F464225FDE1E73309DA438DE32A9D5A163B6456C04D00BC3E76CBFF1E03E382A6C377844092B2B3FE9160584E1034C332183EF70057FBD1DC9F25125259A0A1B3E6C9E87B45E72F2C3033C6F9FB04A1F7CBF1F46A34F8C78B93D1A1711F924ADA306BA1B691A9CB3AED8A84220BE6BF8AA0E88E19F1A6E56E07113AA14FFA13489C2AE0CF7E5EDB256DC8F91B774832398731FFC21CBA3D2B70841D7E499ACBDE0FEEA81C2F253ABAAA942D0A2B75EC03AA9331C3CF7E4"); yield return (Hash: "E5FC50D0", Seed: 283028967, Hex: "926C7F04CB52790196492E3B8D53597410E90C18F73C04B3D342820B0D8AC455F97EA43279AA22CC9391594B2B363EE7236E56588C33E2707A5E56716C6262B3BBAFC95D58D457E9B727804DCA23E721811CD30BD16763548A5A078E52D4686EBFD306E86065763DDE1EFC44E6B8F5BB571A1E606D971E2C86C2E44978422A62AAAE4D8AD9A06B433795AF2D905C34C29F54A0839D67666873D3221E89F62175F0AE9E6B4FA0A29AB6801A172114F59207E64B90467A424F"); yield return (Hash: "E5293797", Seed: 1658208092, Hex: "FA4D6E9FBBC1A59831CBBEFAB85B3EE48628A1E9627EF59CD083758C15C37E48BF856BEC4D0EF656138ECD788C488AA100DE625A40065A2DE5ACD45AF5CFDEB1A65F20FF51B264909EBEABC29C778A85AB342765FC22D9C864516F9EAF8C0A9A58A5F718ECBD779E653BDAB7D7F27473786592314DD149D98D255D619A9B5DC4D903FB7BE09D4DEAD653100950BDBEB4AD6E36DA5D075713391888155C8AB70214CFB155EEA2BE4E907D06C465EFC1D02AB35051A1A2"); yield return (Hash: "ADB80986", Seed: 151473691, Hex: "E86C4A7BD069A83F4E4A3823DE67972E84D802114482069354BC8651E5BC099D9871BABF29"); yield return (Hash: "925450F0", Seed: 1968520370, Hex: "C5E8A1E4932EC948018F33F395BBAAFA3470F2BF2709A3E66470A75E8D9A77E3F7DA781D6493BE766CA072C202C94C54BFB59357327D3BFC5C10F5F4A7DBC567A311A9BE6BB9B3840D10A1E58056D790486CDC39D8EEFEC27F52E4399FAA3EB1C2359B24913D94AFBD7A777C690C6784C7E50CB0B7AAD7A69480B5B90AB9B0115FE1C43AEA454F51E8437010DA55DCC2AEB1173D375BC7292BB766445703526748CC410F07C881F415F99F45C7A645EF2C8978B00E3012C68A4B"); yield return (Hash: "70A0E0F2", Seed: 1354163587, Hex: "2EFFB8CCAE6C53073E6B786B00406A1D66CCEFEEF65DF10571BB4FCC4E291EDFB06332669DF8D22F2A91DBCB565A75493D28188953517B3BEF2EEEAE759B3631250A8DAAF355CB8157D1FCEE4AC13753BEB3E9A012C52FEF2AA9A8C6050692F840D704CD0BAAEF4F182C9F00"); yield return (Hash: "2DD43C8D", Seed: 932212120, Hex: "558581FD7613F793B5647064D7E98E2B57AAD87564CD0AB17749CEC6253ACC64FCB57BEA89FEDB84C173D766214B994F74DAE24B9D75299D5C1843B638721D61F267F48355FE72D2061F7C807D8203C18D43B20DBCD3DD02D09B05F7D6AA8FFD71FE871B63CA3DB98F2A9670AE7EFD96091C6DF652A1874DD7517CFA5E7C7754F7140598A31C0B9B920001D8A4B04FF8B5EB1836AA67FE87A33E61E311692788BA56FF833E70EAA238B4231AC886BA"); yield return (Hash: "25ABBB60", Seed: 73970258, Hex: "150DE8F81925C40C6677C68827CFB8B72FE8BA22A47AAC8053DA16909E936BB20DB79BEFD7EB172BE1E259F7941802ABED7E7D4F2CF114A1A2A5E33429258E33DF8982A3D88953831E4E21FB21F95EC12FACBAFA0BD177812671579E65C63F3250069C2D3F8D245D892CB110C493514345A09E686AE856611E54608B4B56E6C5A9C1D15DDB438ADB1C678F061CAD982168FDC50D3EFF10C487608A454B48552B78B4E944D28744D49905802EEFCD2A7FA87BE3EEEF56B43DD310F1EF85B5AF8E6E5763F096AE6B0957FB34DBA1DF9B1BDAE9666F7981B250B3B8D826000F6B7FFB564392554B2559BB6A2B3DBD878054614C355D99CBB9E9DA8A43DEB08CBDE3330B53A38E4CFF4A88DA8B8530E8B0C25EF9D1BEFFE1B9E65A8050CE5B18671A896D3E9FD75F818FC98765DBC90C3D4E0C14D097EFC38810995776DA7EC5A1288AFBD2F474E079DB36BA98DEBC24FF9CE6ABC79D46BAE2E98EC0B80A3BFC11D0742D4651545CDD1C73ACE763EEC8FEF15BACE78B2F77BBDECB27537388DFA63C3E9E08D0FC26F375C5A7529BBB41FB57666144315B88EAE5D7A2752CBB1AC4CD5A7FE01A73AD1803DAE43CE0C46FADE16D6355E46C205A39AA69C39EF73C1A900956CF7F508203A0C686EA8FB0DD2BBE7C76521582D19C9181BCA48ABCCEBE121C3C"); yield return (Hash: "2EF59F26", Seed: 1360755479, Hex: "AAEBAD944AFB98245C69AD9048B7557C28F54DBE16BA2DFD3F105643975C59ABB119812703DD24561F32331058BDF9AFA72DBC3A52FA999D6B4FF76DFF4FDAA841925803F6E09DE01D6D816F6D83CDF35853B039C87A52739244E79ACD4CD061C666661B2E3491ADBEE37D4CB26342F74D700F189C62"); yield return (Hash: "9F41E669", Seed: 1496991496, Hex: "E105B257841EB3D0C115CEAEDD8CC6625E1E1B9853F74B5BFE7B5D853B08F1B2273028F2BEA6ACC2835749F5E306FF0DB6B2DEEF2D64CBA680500489A9FD63B26AE4"); yield return (Hash: "85D9CD6F", Seed: 1181809664, Hex: "D1EE302FAB76698C0F463E899FEB611D3CFFE45A5A9B065F12FC0F0729EAE546AD524E4198F6E0AB0EC9E37D822637EF930488A69BAE5BC08E6018499FDD5AD0A14F273C8F9E25CE8249FBB048C788F1AC59538D3D8E37B686BADF013344400971C19512440BCA2A50F6DD78868478399D821412FD93F58EF7A6A7E63CE2B70717490422EE269CECFF610CA9690D5B434C459C69943E238B73E4053DB64807114D66AB3F5DAF804F8AAF75ADD23EDA4081C3D847EC91F73FB0F746620DD89D48902A2C458C1E30B76B4281B15F2F0C816B0D7C0B5FB889F4E88EE5C34167CDC4805EAF31085F8BACD63D21DCE68544AF801997F7E8A41CAA86E91443EB4BF019DB119DD0A9F7E3140DE163DA9E8ACEBBE9433ED14212F65FCD7BC72C31B76ACE559B0588ABE93E294B4154C9C52DA1706B0559D73DA159C57C7DAC60E6172E5063BC42A8EA32705CDC95D57DAA4FB3C64F9F6CD07B6A5C236D91CAD7BBFE2727A9B01192674B58ACEF81C3C5E0F3F600E6F5C1E85064D2EC60E454DC2FA2"); yield return (Hash: "B1CE51A8", Seed: 798402160, Hex: "B4215E44B0BA0F3A3D05D226B1BD9A5B10F93A11D77460CD2CA62CBB8F06CF0011008A8F4E076E09AE0341F455FF872F1B9FF9F81BC73536AE69B437EF6E97CBFC52E2B33BC6C23E50EB45CA5E884186E6AAD5933DC546D077B0B0FE859AA8DE7C7DF89FED6BCA3A810248F5DD3FC423606683A30CB9CD82A1DE3239211AE975EA10FA8D9CAB8AFE5EFE45ACDE3AC527F54E9F1F089EACAA67B03BE7B78B2C712A77FB669AEFACCB8E0CF2289239691D14DD79D302BC2B4C31B415F5BE93B23296EF2A46354DFF1386BBFF8A5CEC430AA91765ECCDF38F525B53346EF693514FC05804181058EA731930DB7B60284089931E7FC6E56C0DF8A3C61CA581AFB94C985416877144455F7F374EB5D80235824555C491DE52E9B6B9D91856DC79AE36215FB4E4E8F99DAF54A14C7C0D091B406579F203E6FAA515DEDF11DC0B5EF802C9E0300D29DBF8405B690148BEF2784B4F9CB6D0AB"); yield return (Hash: "E5BD6AA6", Seed: 1500831520, Hex: "C45B59595490940E41A798F5774C236CCC248EE4837A042109BFFBF7732556C9C0E595265469164B9D0B84C5A7F341756B040930AEA78F902958635180DC6966906671584C6944D635F3BDFCCBFF22CBFDEFA2D25DB16B20DA2E6CB4A17C37699366A1611873E86826CE17138ED8BD6C7FBB6011540586A47C31B73D63DF3BB774B6BB9E5A14392DA195877B88E304B2A455D2ED2DB30988A991E60F148B1C5B9FDF004B23968AB1FD19D699EF4EBCEA045A117B5391DB01B914E0074F766B2746AFA4CD0AAB6EBAB6CB352259A9EC2DEEF1ECA7ADAAECB5BE6BC121D28DE942B8E9413D7B9C8184BAF1A53084F3FD7BB60E61D45E70FFA12D49814171024EDD6DF407123EC93BC2812D793432A4514ADAB2604D503EDE2354F84BC0D1AEA2BFFC342EA74891E22EFF746C44A3AFF93DBBB626C3DFE9CDDE09077A35A9B8CE9BBE73779EA52FAED0AC2BA67F5B94AD442A1D3F02D65B1767539481F47424D137976E743425B0039CCECEFD591E840B1D81E20F4A897BB6B82A65C797965D9E826B177D60AF1B1AB3CADF5C17D08168A74AB50B6EFA70CC62828A151AD949A19AA1E77837B0AD7E6776EE"); yield return (Hash: "63F46031", Seed: 1197644485, Hex: "75B4EC72660ED95500CF4A01B0BC2B1A73FEA32190140317B6AF1922340201CFB39FA10FC0EA274EF0D03B3F846FC1A0AD1F5D123C573631678FABD591E86CF537EA5722F6F8DA5C7D5B1AD36731D8A0E39F125CE5CC25E327A4477CC891B9C3510C29075ECA3BA7EC524489FED71FDB40B687C5CA03CA393F1544BF6EDF66DF5B066C7F466DE845CD68ED5862E16D45EAE128A40D46715DDB02F35AD5C16A2AC17D9B98644EC2F7C27AD92F5D7D04F1FF95770347547C62C89564383B46D9BE4ACC4EE1DC3C8454DF47021DCC39764D7355424AFC835F4980EDB25B92716F1FAA385C0FD2698B9919A80D5D315DB8C1DD601740DA98F91928B0F512EA9F66C7517EF1B7CC24880D9890345FC4E6C2334E"); yield return (Hash: "327A5D60", Seed: 1080919065, Hex: "53798142C8CC651C86AFCA9BC751"); yield return (Hash: "6BFEA156", Seed: 886511778, Hex: "9CAAFF841356D5D867B1DCCB21221E003AE567BB574514290DB03FE779DE022852738AF0EC0949258FAAF5D0925EFF67C9398FBA349D89909CA98EEEEDCF769A0FD8B8B4AB36163F5949BE1D7E784D360F53AF3F96424A42E6E475F046416E22951B29DF04C5F876CC1318AD70C657BB3E64A67E5FD4B9D7A83A0818BAC699EB5E2039B005B017ED43052CCF10011193CD66DFE0DDB7AD6236"); yield return (Hash: "D2AB3F17", Seed: 360836487, Hex: "D2E6209229D4F97315D2835A5134663C20F7ADE1A22C134B63B96752F4649D89DF7D9A2AD56CE29F6811A95C74F3B66A18A38C62007707E921822C128AA5DC6BBCDC635FBB6BA370B6873EAA4F174EC2F2CEFC8935EB5CF58FC2A3563BC3D80AD13F353BA510F74B34A6C7187BA5644154C3396CD796A09B730E7A3805355BB7474C243342417479B24A74F4F0B4F5B775670B95E0585EDBEEB955057A152396B988816F92264BC269E7F0F52633789EB9F506B2728F816D2CA1D3140A075F3282EBFC15E0D5AD68470631494E9148B84B3BDF65275B37ECBB56ED134DCA89986474FE7DF2502CC959ADA1C230A0B1099EB6D3B7808923CCEC89BFAB8DCC36EBC2820897DB6F5E5757EAFEC8F545360B446DA4B26E4E6AAC6E14A5960DEB9C45B7C294A30C3645DCAA61D6743F93627D7D13D940F81FE0522385A3602DD528F5ED0016C066A5950CCF8FD86649B3128AB0D2"); yield return (Hash: "A8F98BF7", Seed: 1179355484, Hex: "DF76A97E1ABA6D5154F5B462D353C079175114CBAE0A9793D2528B22A8A860F5D6CEA2D141FF6F1C7B8402BB6E2ABA23C159D967099180DB9160BEE81FF4918347B167EA69E66B6A18185AA73E75D77C956CD2B9A78B14D29CC50F7AB77927319FC07360D4070D3BD0F7B1BE017AC99C5FB66722451B4E206F36398F84FB6E57E17290B63591B860D8E9350FF8072E8C062D2960DFB504DEF85E64A38ECF8527D9ECA8BDCB0B33DEDBDF2B1D218C8019974BFAA6B12384E4B6021508CE07DAD1A45804831AAF9B66DF798EE1905BD26370FE3322F4039C9CDA5CA929D46D5FD26DAFFF765D2F5D09537F95B42D598616787C9A2F3F5BC39F138F3C1A7992A071825FDC7EBB9082C70C6841A61A7CA38C30451B"); yield return (Hash: "AE18DA2C", Seed: 234268553, Hex: "B00AA548A4448D0D1DB2EF8AB558DF49B99FD8A0C9A51C598C3A9CE06A4CDFE470163B108E6A14"); yield return (Hash: "98E7A60D", Seed: 1545982443, Hex: "5CC053544D892B23B013E0974D88368B7BA5B98389F2DA77A331592A95B77434FCB811204B5CE02C4C7A7FCBE622B49DC472D7F7F716049538037F052E34449AB616B8C4F7F9F0298FD3AB28628E10AA9293BA65E212705118DE591AC39E1ABAF7FF39EB6640A9B05346D2599A2EAFC21670D42600B91881E42C57FB1488DAB8BADB0C801A3E9F98DB1B688AD2AFF71E11BAC63FAD659E467E432153DF410A3BC9A403094954C7221585C5F012F0AD1587084197B0675C662FF836B47C6F3C44BDFA1242B016DE746F02968DECD952EB50FAABD690BB0FC3D323AB29BFAC4B1BF87153739D81781C898AF31459F14725300DBE53A5B9A4EA98A7B5058489B1354728EA7F1B35301FC6E7BA5512F88AC6721080329E4E8E6B843E5188393ADB9D2308B087783E06874E5F76AF07A892EB809B6B22C29E00C7F18E8FC800B3F2ADE33F11742366468045221A8C35EEF84682743D201FBF509A4268A4C8EF9F4F019270E5046734A6018728CDFE82717903CC73867F0A7600C94E5FA0120FA3E14769D19536EF515C9CCA7F29B0683953210F66C2DF7BD5BEB1C9CAE94AF628A181"); yield return (Hash: "FB9E6C40", Seed: 886675031, Hex: "D767AD8DE0C110CBFA0E063D06DF38595D81025CAEED5D773484810C41B11F2006D3CD8077008FD3CE69CCBBCE483FE5521733011285DC471641053D319DA66388066C6A9C50B09A5C6502108E3B412D1FC937FE82F8C987C4EA2D"); yield return (Hash: "31E8248A", Seed: 878547745, Hex: "DF5C9EE1D2783B56122ED59D094187D8B45021DBE8DAEE0D54248A97B5A251BA55E50B7657C66BCEFDADC10917F0F13487138FAF3D7015E1B75748C4960687D41E9B14F9E09BED13EF0836A51DCBBFA1859A9844AB5FA5639EACC9C6C9ED0C1396F555E818990C3F077A3D19C149F957B0201917D0F398179DB2ED3AE64F5536743BA8B25D5546C37A0C6CFEF86219788205649DABD3C97A20FA1F1D180FFB180970E61E9ECA280FE89D3DBD7330509CC4C12FE998410DEC501B62BE3E05CFF3834B8011A0D1C9D907DA2470135BFBE35CBCFBE11B15AF4C8B10DBAEB0CF3AA7B1C0E83B28B77B560639A80360D46229B21148445026EA503FCD315A589F551C7950E9EF855C84A221A81E94EACFCC342B4DE249686DF9486E8C27D832FE3792C4E661A7F027D9CFBABB21FA56587E6C3B92F400B9CAC50EA4B4CA4C10B9DEF504833E71F64927092FB50FFA0DE29F9783709DF671B05BE83064E92714742B3EFF25B439CD4379C43AB399421053B5C02D38F6720B3E606B04644099E89CF958A99EDCF2B011F853E27CBBE2CA991B00682F3EDB6CD8485E8EB2FF3FEFC2AFEE051E4120A111055E19579493DD81D0C18196A46B221220852DDD40297F3EA123D8F79A613553947A15003F54756FF6EC5F3A1883C0CA9D41335A73B5A8DDD4D59E330E6C25"); yield return (Hash: "81172AAE", Seed: 1073801165, Hex: "A236CE9B844ED217BDA00767828F35517155DF5E67C459906D96BA1C3886BC15423DD72F9B0C391F4A79C68C697D145CA172FDEC72E99A22D5C8AD8B8CABBBDBDD3C1AAA7708EFDCEBD30DA0063026749BC910E46803671DE931704FCE4C4F0A7237ACE4A28C03B1CEFEE1031CDEB09E349B6E73E31F4FF5E21FEA275FD212D25BF45D6AB986EB11EBEA4F174CB1F9A51225CD27F2E5AF9283368C66773E7C31BA74246F526394B0D2DB20A16F79201F53AE05B89CC71E6F1A3CB9"); yield return (Hash: "06BFF63C", Seed: 2124737180, Hex: "642901807F73DB249024C104DF41D700E27A01BE527B9E5F9A7DFAB8698ACCC66F3ADDE5101817B891FF8FDEA66810FD4CFB0903AE0130D21CE7E110EB06F2922ECB9E66209A40358B918A3743AFB50D49757E703974D3B149537D9A8B31ACDBED2EB6B136EE11C8FA61B614966CF4A73811B0029CCB6FFCA1C4D98EC3C600036C774B14105FD6E53671EAEB7A2429FC3971D3BF08D392B7FBEF752440CB188B4F48C1F099488449ADC76EE4BEA7A3D09738266919259B662F8BB85DB8827571784B88A0A0126859097168821C770061D884535576588B01F3E8A62E4256DF617D2B98F6CAD74C6B83A3A529BA81C4C46E5064F3EE187917D0E6B418E77968F1920181D41B34E39BC650B860DAD38DA3501A9EAE420A8082EFC17EA0E2E59399B90438E63CC10BC116742437BDF04D6759D587CE48B75E95138A769AB2076C3EBE99BF2DEBB9585BA27DFC9A25536A3E4D2E307908ADCF659F93CD5C067310363B92DFB9C5333BE6A81BDC6FA8764479AD865513F6B0EA8387"); yield return (Hash: "AB6A52FF", Seed: 124698114, Hex: "F46856C173F1A208DBACFD4B218F7977CEC3DF7BA0F00B5F51507A41DC6C8064B44B0A1945AEBF02CC4E69E1DEF8C5DA2416F18AB118EE"); } } } ================================================ FILE: test/BloomFilterTest/HashAlgorithms/TestPayloadParameter.cs ================================================ using System; namespace BloomFilterTest.HashAlgorithms { public class TestPayloadParameter { public byte[] TestPayload { get; set; } public Range TestRange { get; set; } public TExpected ExpectedValue { get; set; } public string TestScenario { get; set; } public TestPayloadParameter(byte[] payload, Range range, TExpected expected) { TestPayload = payload; TestRange = range; ExpectedValue = expected; TestScenario = ""; } public TestPayloadParameter(byte[] payload, TExpected expected) { TestPayload = payload; TestRange = Range.All; ExpectedValue = expected; TestScenario = ""; } } } ================================================ FILE: test/BloomFilterTest/HashAlgorithms/XxHashTest.cs ================================================ using System; using System.Collections.Generic; using BloomFilter.HashAlgorithms.Internal; using FluentAssertions; using Xunit; namespace BloomFilterTest.HashAlgorithms { public class XxHashTest { [Theory] [MemberData(nameof(XxHash32TestData))] public void XxHash32_ToUInt32(TestPayloadParameter parameter) { var range = parameter.TestRange; uint actual; if (range.Equals(Range.All)) { actual = XxHash32.HashToUInt32(parameter.TestPayload); } else { actual = XxHash32.HashToUInt32(parameter.TestPayload[range]); } var expected = (string)(object)parameter.ExpectedValue; $"0x{actual:X4}".Should().Be($"0x{expected}"); } [Theory] [MemberData(nameof(XxHash32TestData))] public void XxHash32_Append(TestPayloadParameter parameter) { var range = parameter.TestRange; XxHash32 hash = new(); Span data = parameter.TestPayload; if (!range.Equals(Range.All)) { data = parameter.TestPayload[range]; } while (data.Length > 0) { var n = Random.Shared.Next(1, data.Length); var d = data.Slice(0, n); hash.Append(d); data = data.Slice(n); } uint actual = hash.GetCurrentHashAsUInt32(); var expected = (string)(object)parameter.ExpectedValue; $"0x{actual:X4}".Should().Be($"0x{expected}"); } [Theory] [MemberData(nameof(XxHash64TestData))] public void XxHash64_ToUInt64(TestPayloadParameter parameter) { var range = parameter.TestRange; ulong actual; if (range.Equals(Range.All)) { actual = XxHash64.HashToUInt64(parameter.TestPayload); } else { actual = XxHash64.HashToUInt64(parameter.TestPayload[range]); } var expected = (string)(object)parameter.ExpectedValue; $"0x{actual:X4}".Should().Be($"0x{expected}"); } [Theory] [MemberData(nameof(XxHash64TestData))] public void XxHash64_Append(TestPayloadParameter parameter) { var range = parameter.TestRange; XxHash64 hash = new(); Span data = parameter.TestPayload; if (!range.Equals(Range.All)) { data = parameter.TestPayload[range]; } while (data.Length > 0) { var n = Random.Shared.Next(1, data.Length); var d = data.Slice(0, n); hash.Append(d); data = data.Slice(n); } ulong actual = hash.GetCurrentHashAsUInt64(); var expected = (string)(object)parameter.ExpectedValue; $"0x{actual:X4}".Should().Be($"0x{expected}"); } [Fact] public void XxHash3_ToUInt64() { var tests = XxHash3TestData(); foreach (var test in tests) { var data = test.Ascii.ToUtf8Bytes(); var actual = XxHash3.HashToUInt64(data, test.Seed); Assert.Equal(test.Hash, actual); } } [Fact] public void XxHash3_Append() { var tests = XxHash3TestData(); foreach (var test in tests) { Span data = test.Ascii.ToUtf8Bytes(); XxHash3 hash = new(test.Seed); while (data.Length > 0) { var n = Random.Shared.Next(1, data.Length); var d = data.Slice(0, n); hash.Append(d); data = data.Slice(n); } Assert.Equal(test.Hash, hash.GetCurrentHashAsUInt64()); } } [Fact] public void XxHash128_ToUInt64() { var tests = XxHash128TestData(); foreach (var test in tests) { var data = test.Ascii.ToUtf8Bytes(); var actual = XxHash128.HashToHash128(data, test.Seed); Assert.Equal(new XxHash128.Hash128(test.HashLow, test.HashHigh), actual); } } [Fact] public void XxHash128_Append() { var tests = XxHash128TestData(); foreach (var test in tests) { Span data = test.Ascii.ToUtf8Bytes(); XxHash128 hash = new(test.Seed); while (data.Length > 0) { var n = Random.Shared.Next(1, data.Length); var d = data.Slice(0, n); hash.Append(d); data = data.Slice(n); } Assert.Equal(new XxHash128.Hash128(test.HashLow, test.HashHigh), hash.GetCurrentHashAsHash128()); } } public static IEnumerable XxHash32TestData() { yield return new object[] { new TestPayloadParameter("abc"u8.ToArray(), "32D153FF") }; yield return new object[] { new TestPayloadParameter("313233343536".FromHex(), "B7014066") }; yield return new object[] { new TestPayloadParameter("3132333435363738393031323334353637383930".FromHex(), "2D0C3D1B") }; yield return new object[] { new TestPayloadParameter("313233343536373839303132333435363738393031".FromHex(), "8ED1B04E") }; } public static IEnumerable XxHash64TestData() { yield return new object[] { new TestPayloadParameter("abc"u8.ToArray(), "44BC2CF5AD770999") }; yield return new object[] { new TestPayloadParameter("313233343536".FromHex(), "2B2DC38AAA53C322") }; yield return new object[] { new TestPayloadParameter("31323334353637383930313233343536373839303132333435363738393031323334353637383930".FromHex(), "5F3AF5E23EEB431D") }; yield return new object[] { new TestPayloadParameter("3132333435363738393031323334353637383930313233343536373839303132333435363738393031".FromHex(), "45A03ED59AB5CAD6") }; } #region XxHash3TestData private static IEnumerable<(ulong Hash, ulong Seed, string Ascii)> XxHash3TestData() { yield return (Hash: 0x2d06800538d394c2UL, Seed: 0x0000000000000000L, Ascii: ""); yield return (Hash: 0x0f99783e68de7322UL, Seed: 0x00000000000013f0L, Ascii: ""); yield return (Hash: 0x75ab6ee9a6901973UL, Seed: 0x00000000000008baL, Ascii: ""); yield return (Hash: 0xa278b85b25fb1092UL, Seed: 0x0000000000001bc1L, Ascii: ""); yield return (Hash: 0x2753d05a8f320003UL, Seed: 0x0000000000000000L, Ascii: "Z"); yield return (Hash: 0x826ed41a6e3413f3UL, Seed: 0x5a7a3a6dd84a445fL, Ascii: "f"); yield return (Hash: 0xb92fbf351dd100eeUL, Seed: 0x0000000000001c09L, Ascii: "C"); yield return (Hash: 0xec9a584c5994b0fbUL, Seed: 0x761747debc4bf2fdL, Ascii: "e"); yield return (Hash: 0x123a6f50f1ca0359UL, Seed: 0x0000000000001cf4L, Ascii: "V4"); yield return (Hash: 0x30a9330b3de18584UL, Seed: 0x27f065e4850461f5L, Ascii: "HA"); yield return (Hash: 0xccdf6c02b23ec3fcUL, Seed: 0x00000000000017e0L, Ascii: "KP"); yield return (Hash: 0xe90908587fefc64dUL, Seed: 0x000000000000200bL, Ascii: "5O"); yield return (Hash: 0x0c3efabfc49a356eUL, Seed: 0x0000000000000840L, Ascii: "H4p"); yield return (Hash: 0x5ab2c95dccb3f945UL, Seed: 0x00000000000009d0L, Ascii: "9Vj"); yield return (Hash: 0x9a892645f137e437UL, Seed: 0x000000000000198cL, Ascii: "ajB"); yield return (Hash: 0xf917a1f0983dac91UL, Seed: 0x6f3502011f621a64L, Ascii: "kLi"); yield return (Hash: 0x17ac41dfec94111fUL, Seed: 0x0000000000000499L, Ascii: "KdjE"); yield return (Hash: 0x4d5538d13e22c840UL, Seed: 0x0000000000000000L, Ascii: "fCiJ"); yield return (Hash: 0x9dcf0899dd62c721UL, Seed: 0x0000000000000f04L, Ascii: "HZOD"); yield return (Hash: 0xc9ad4f8ad28e7a34UL, Seed: 0x0000000000000353L, Ascii: "d9v6"); yield return (Hash: 0x0d934c8220ddb29cUL, Seed: 0x0000000000000000L, Ascii: "Zx63J"); yield return (Hash: 0x26783423f8cddda3UL, Seed: 0x00000000000019fcL, Ascii: "mosH8"); yield return (Hash: 0x590582dbd7951c71UL, Seed: 0x0000000000000faaL, Ascii: "QDajZ"); yield return (Hash: 0xcec252314949cad9UL, Seed: 0x00000000000008baL, Ascii: "DNHWf"); yield return (Hash: 0x08aa5f0f720ae20eUL, Seed: 0x0000000000001062L, Ascii: "yyaFtP"); yield return (Hash: 0x6fb29121762e6cafUL, Seed: 0x0000000000001d89L, Ascii: "kXzedT"); yield return (Hash: 0x96512f40427e1ac0UL, Seed: 0x4ef78ad67d7e2c8fL, Ascii: "E27wiW"); yield return (Hash: 0xce7488a13f8d420eUL, Seed: 0x0000000000000007L, Ascii: "M2sgd4"); yield return (Hash: 0x06d440b83bb784dcUL, Seed: 0x3d065f4429458c97L, Ascii: "ZTCkePQ"); yield return (Hash: 0x4800a99607b5dd43UL, Seed: 0x0000000000000064L, Ascii: "klpn67g"); yield return (Hash: 0x8af732c34a639748UL, Seed: 0x000000000000158cL, Ascii: "lPOSwvf"); yield return (Hash: 0xea66f11e39e4f703UL, Seed: 0x0000000000000000L, Ascii: "SbmPVuZ"); yield return (Hash: 0x20497948da5b72d9UL, Seed: 0x00000000000025daL, Ascii: "TLRDvLvS"); yield return (Hash: 0x4ec57c9f55c9ace9UL, Seed: 0x0000000000001a31L, Ascii: "5kKXT8hE"); yield return (Hash: 0x62157038eaeb8c3eUL, Seed: 0x0000000000002051L, Ascii: "UHj4U70w"); yield return (Hash: 0xcdbeb38547e4b777UL, Seed: 0x000000000000095fL, Ascii: "YYiJtbOe"); yield return (Hash: 0x04661f74a752afb2UL, Seed: 0x00000000000006d1L, Ascii: "EGM4yxHgk"); yield return (Hash: 0x44dd2b3ae480a960UL, Seed: 0x00000000000014b2L, Ascii: "ixKUUt5pO"); yield return (Hash: 0xb41154e8ba2baabfUL, Seed: 0x00000000000022b1L, Ascii: "s6aMbUVkK"); yield return (Hash: 0xed6cfa6cf621b996UL, Seed: 0x70cb1cd220fe3a09L, Ascii: "SsNiqNqBf"); yield return (Hash: 0x0d22de1c27057d50UL, Seed: 0x00000000000011e0L, Ascii: "Ov4zwcvLx0"); yield return (Hash: 0x4e63d12e391a9a8aUL, Seed: 0x00000000000009e3L, Ascii: "bM7sIUkRTp"); yield return (Hash: 0xa5054a02a7f16c39UL, Seed: 0x0000000000002313L, Ascii: "sitCYl1zu2"); yield return (Hash: 0xe54c8a2fccdb7591UL, Seed: 0x0000000000000d3bL, Ascii: "Ck3S0qy5xH"); yield return (Hash: 0x0a0e6440ed0570ecUL, Seed: 0x0000000000000bbcL, Ascii: "Y4lXHPbJCix"); yield return (Hash: 0x4e64c242787c849aUL, Seed: 0x00000000000022bcL, Ascii: "yD0Ex2vQ9zW"); yield return (Hash: 0xaf35b06df6c0deb4UL, Seed: 0x0000000000000000L, Ascii: "uOnyD2tQQ7v"); yield return (Hash: 0xd4099716d18b65feUL, Seed: 0x5539de8caf41e41aL, Ascii: "vTU3yFsqOQ6"); yield return (Hash: 0x0dc3040691a8cc19UL, Seed: 0x00000000000013d1L, Ascii: "Hy3emis1M7eV"); yield return (Hash: 0x61108305768a1ec8UL, Seed: 0x0000000000000647L, Ascii: "ZuXRMHrPQHtz"); yield return (Hash: 0x9a8ea6134e5461e6UL, Seed: 0x00000000000017ebL, Ascii: "TsKvY0FLKoQf"); yield return (Hash: 0xd2b05b5c183fa6b8UL, Seed: 0x0000000000002512L, Ascii: "s9hk0ogUPKf1"); yield return (Hash: 0x03de059a47bfbfdeUL, Seed: 0x00000000000013fbL, Ascii: "kdFgtjHcConq5"); yield return (Hash: 0x4ccfe5fd6a859e60UL, Seed: 0x0000000000000000L, Ascii: "PfI6lstr0ZLWG"); yield return (Hash: 0x61ff51beb0b90df3UL, Seed: 0x00000000000023e6L, Ascii: "0ryRPmjP1mSun"); yield return (Hash: 0x9c8c9676c44a36c0UL, Seed: 0x0000000000000000L, Ascii: "XEjB6XqOe5ymx"); yield return (Hash: 0x2ff10b4f7a6f229dUL, Seed: 0x000000000000139aL, Ascii: "64WbTFxlWe3U2k"); yield return (Hash: 0x6476707f23af49b8UL, Seed: 0x268e74fe41033efbL, Ascii: "He08m7cz6BVUKB"); yield return (Hash: 0xaa6bfbd9cd147f56UL, Seed: 0x0000000000001fb0L, Ascii: "Ij5MBfLKVkAFYF"); yield return (Hash: 0xe1a273836f10f13eUL, Seed: 0x0000000000000000L, Ascii: "VSVb2538wGyeRM"); yield return (Hash: 0x1da17de175e75458UL, Seed: 0x0000000000000a27L, Ascii: "hueNVzaX9p7JdKL"); yield return (Hash: 0x592f09e9c3566debUL, Seed: 0x511ca41ca4193614L, Ascii: "kpx0STYilb7EM88"); yield return (Hash: 0xa11baa85f15a7499UL, Seed: 0x0000000000001cf5L, Ascii: "dvmStMmz8Uhj4G0"); yield return (Hash: 0xd5e01daaeb4f38feUL, Seed: 0x0000000000002464L, Ascii: "8csqW0j3hptGCwO"); yield return (Hash: 0x0429af28bc6f6ffbUL, Seed: 0x27ea2fd22273f024L, Ascii: "fcuQxJ1a7XHWjOak"); yield return (Hash: 0x2431d2099731aad5UL, Seed: 0x0000000000001d88L, Ascii: "cTXadjhxzktQVtPW"); yield return (Hash: 0x80679dd3f86ae2cbUL, Seed: 0x00000000000011ddL, Ascii: "VdnhfZNlPd5zBO9G"); yield return (Hash: 0xd5763efdea456f1bUL, Seed: 0x00000000000001f1L, Ascii: "sRcoac2Z1XKinWsY"); yield return (Hash: 0x34722478aff47051UL, Seed: 0x00000000000019c9L, Ascii: "4pgR1N0LgL2QpoaNc"); yield return (Hash: 0x4c0ac7afe9a5226cUL, Seed: 0x1e18b9a7c8f02d7dL, Ascii: "ZJaCUfU0OXHoLCEfw"); yield return (Hash: 0x9ba45202a6afcac5UL, Seed: 0x00000000000012abL, Ascii: "uUFLXT60uVkCOXvPj"); yield return (Hash: 0xc2b5a839acdee53dUL, Seed: 0x0000000000000a7aL, Ascii: "uLLdztp6cDZ1pL9BR"); yield return (Hash: 0x2614fe7c344553d6UL, Seed: 0x0000000000001962L, Ascii: "LuOyAcRwmGEH8z6k6m"); yield return (Hash: 0x67eebe861528b20eUL, Seed: 0x0000000000000000L, Ascii: "KDuzVTjAQ4xNGS3WF6"); yield return (Hash: 0x9e5bc927cf383a51UL, Seed: 0x0000000000000ebeL, Ascii: "A1ihuWZ2uERWycZxPa"); yield return (Hash: 0xe50d6f0e787320deUL, Seed: 0x00000000000009c2L, Ascii: "3Ux0vVy8UG3pLbfakF"); yield return (Hash: 0x08360533a677c793UL, Seed: 0x0000000000000000L, Ascii: "kZADmGnOFWl6Phiu8tE"); yield return (Hash: 0x61f6649c1ab518d7UL, Seed: 0x16580c02347e75b6L, Ascii: "86PTDY6UXtSuJUe22wA"); yield return (Hash: 0xa4560f70262473dcUL, Seed: 0x00000000000007eeL, Ascii: "PVFVy0kMDJgMo593sxl"); yield return (Hash: 0xe4d1e6d36023f575UL, Seed: 0x0000000000001571L, Ascii: "aerl20lkguiB4Gf3T9R"); yield return (Hash: 0x057b70e73f6feeebUL, Seed: 0x55babd76a130f515L, Ascii: "aGfZbBNKvUGfWCu34gub"); yield return (Hash: 0x4c77121359ed6b7aUL, Seed: 0x0000000000000000L, Ascii: "VMkxhcMDr321w7YjThXV"); yield return (Hash: 0xbae9f139b3529d39UL, Seed: 0x0000000000000ddaL, Ascii: "DmBC0bnc4kQOA6YCsPpe"); yield return (Hash: 0xde20a5d93eea1fc1UL, Seed: 0x000000000000074dL, Ascii: "RBwHqQrG3cyoDw0eLlT3"); yield return (Hash: 0x403f37484e27af18UL, Seed: 0x0000000000000d19L, Ascii: "HpsRBCVOx5SkugteBIbaQ"); yield return (Hash: 0x75d397a0198bc05dUL, Seed: 0x0000000000002214L, Ascii: "G9YRrhLX02ReHdMSPJhsn"); yield return (Hash: 0xacdcd5b5c59a703eUL, Seed: 0x0000000000000000L, Ascii: "x35LiatiPGJa74outlVGU"); yield return (Hash: 0xe91b05011de3fa0fUL, Seed: 0x000000000000188eL, Ascii: "AsHWiTENK1HPZr0XPVA9m"); yield return (Hash: 0x2ba03c29455e3a6aUL, Seed: 0x000000000000245bL, Ascii: "ocWWrY4XvGhWB3fRZfuOHP"); yield return (Hash: 0x5da13c420b8e89b9UL, Seed: 0x0000000000000000L, Ascii: "Fjc59qu4SZWLuTuklHLxk1"); yield return (Hash: 0x8f9eefad3576e7faUL, Seed: 0x00000000000018b1L, Ascii: "oqcVab4jAR21vhNpsbp2AT"); yield return (Hash: 0xba1e0b99acecb848UL, Seed: 0x0000000000000000L, Ascii: "ymXSTaCeolI6VjlQgh6cMl"); yield return (Hash: 0x099202df4b39be46UL, Seed: 0x000000000000070cL, Ascii: "ug3aKCkY08yMF2Iz86ig55v"); yield return (Hash: 0x5f87925ff0097ef6UL, Seed: 0x0000000000002535L, Ascii: "rDC2FcItWoHusdg0fedMIB3"); yield return (Hash: 0x945edb7bc82646d6UL, Seed: 0x0000000000000000L, Ascii: "9vM6157UG2KPMPYg8bicb1e"); yield return (Hash: 0xdd7b4d4929182d16UL, Seed: 0x00000000000015b3L, Ascii: "Z8LQMWuVPsXAB6IuP15y25c"); yield return (Hash: 0x127740d090c82baaUL, Seed: 0x000000000000252fL, Ascii: "C7tG9KNrvX7GP5Fb4AONOkLt"); yield return (Hash: 0x52c8cc12015f61edUL, Seed: 0x0000000000001587L, Ascii: "YOI0xGx2Ge1jdh6k6KsXCFXI"); yield return (Hash: 0x94635c7dddc8fabaUL, Seed: 0x0000000000000000L, Ascii: "7iOlOMeM6UmJnavHzgMSUdZ9"); yield return (Hash: 0xd30bf4d0dba16b6aUL, Seed: 0x0000000000000000L, Ascii: "CbxYsDsDPFbc4H0qmKCvXr3m"); yield return (Hash: 0x0df80cb457801da2UL, Seed: 0x0000000000000000L, Ascii: "kcvageMDWBf8N6f4QRjW8492m"); yield return (Hash: 0x4c79f80af77b5840UL, Seed: 0x000000000000107bL, Ascii: "3hatHgqJ43eeWMVabG3ZmGH2E"); yield return (Hash: 0x77ce822cd1c1073fUL, Seed: 0x00000000000014f9L, Ascii: "GZZO2HsROBhSwPibHjl3C9K9r"); yield return (Hash: 0xd0555d7093b858e1UL, Seed: 0x00000000000003d8L, Ascii: "sy5RrooAbS2a4spp3UT3g3B8s"); yield return (Hash: 0x02670b0870103b6fUL, Seed: 0x0000000000000cc8L, Ascii: "GjnKAVokRisPBwjCceOHrVnR9M"); yield return (Hash: 0x5b7593ea439230f9UL, Seed: 0x011a75bcd188cfd0L, Ascii: "5qzewuqd4RMJJVBTbd7z4vEv5Q"); yield return (Hash: 0x9f6aac7b239f2b8fUL, Seed: 0x0000000000002085L, Ascii: "cDjSOSHGn8nM839nFvNqPc0oLw"); yield return (Hash: 0xecc9c9db6cad174aUL, Seed: 0x00000000000025e7L, Ascii: "zZWOvuCOQ7S78PmteXs9orf1sW"); yield return (Hash: 0x672aabfd2f0b4085UL, Seed: 0x0000000000001df7L, Ascii: "Equb0NmabCbKGaEmh6dE8gjfL1E"); yield return (Hash: 0x7e86e983230b0159UL, Seed: 0x00000000000012b5L, Ascii: "X7vd0dgpT9eRzMHx3LDgjvEQwE4"); yield return (Hash: 0xa051089a6817d0abUL, Seed: 0x0000000000002370L, Ascii: "H8QsGBXFPf89x5Q47qSBj4AhT3u"); yield return (Hash: 0xd56abc34b1f205d9UL, Seed: 0x0000000000000000L, Ascii: "8TRix56rWbRPISXdMbdtjKAeZRZ"); yield return (Hash: 0x3b546053f97b22edUL, Seed: 0x3f54eddf60ada18bL, Ascii: "icq9LPMDvmULotIweEESeEDVi0HN"); yield return (Hash: 0x6d702a18e1da1a10UL, Seed: 0x0000000000000000L, Ascii: "i6PCFvzKoWZ2qkeiCTA2r8rywUkZ"); yield return (Hash: 0x99d4d5f72c5eb24bUL, Seed: 0x0000000000000a63L, Ascii: "b7zmpPTGOXWgpxCGNrLdGrjgpUkp"); yield return (Hash: 0xe2fe210bda3b56adUL, Seed: 0x0000000000000f88L, Ascii: "7ER0gY3jYRTc7UuQX0jy4ILm0QxP"); yield return (Hash: 0x1548e8ff243cc27cUL, Seed: 0x000000000000064dL, Ascii: "srmanGgb2muidgoV99SSZDXii7Gf2"); yield return (Hash: 0x2540e9769cb8473aUL, Seed: 0x0000000000000000L, Ascii: "SkZnT9dHnEaafaU0YQIBnB735xYcl"); yield return (Hash: 0x70d7833e87378050UL, Seed: 0x000000000000162aL, Ascii: "dl5ZP6cffXfE3l0PAWd51TBvSsG9S"); yield return (Hash: 0xcab5c24ca2ff0806UL, Seed: 0x0000000000000f18L, Ascii: "CSQBwJqxtVJeMOv5mqzH6g7ZGnPyh"); yield return (Hash: 0x25bf4077891193d9UL, Seed: 0x000000000000222cL, Ascii: "tTGa8TJUETEztj5zsfDWU2BwGmB6Ky"); yield return (Hash: 0x57a61f0b582ba1e4UL, Seed: 0x00000000000000d1L, Ascii: "ZakSEMaZxYJnhoj40dgW0Od1dBrpBd"); yield return (Hash: 0xd9d0475602625ac7UL, Seed: 0x0000000000000000L, Ascii: "b7k1mN7utrKrm0UCDOArIhg6D1xEg9"); yield return (Hash: 0xfbef4b2e4411617cUL, Seed: 0x2ed1256a014f6d46L, Ascii: "ECJ4VLtsuggTR4wcLJjTm8x6DXFhTB"); yield return (Hash: 0x229c0bf438c8da38UL, Seed: 0x00000000000026e6L, Ascii: "DiRtMWxnI3qkMdYanz82e6bfpp8VUTw"); yield return (Hash: 0xbfc14691671de964UL, Seed: 0x113a1735f166548bL, Ascii: "4gIXXrYOrAJpQZtb2lYLqsqzrRBdRh3"); yield return (Hash: 0xe09c1376466cb2c4UL, Seed: 0x0000000000001d1cL, Ascii: "RuxoiJfBipXTwGRnMLXS9UiaQDLYy35"); yield return (Hash: 0xefafa5858404da47UL, Seed: 0x0000000000000000L, Ascii: "Z0KHCqxcHGVVuwQUDbQMSqYJcBl9y6U"); yield return (Hash: 0x152be6c70f087d72UL, Seed: 0x0000000000000000L, Ascii: "Tc8otaCWJhcl5Nz5CDz7vFJX6zsYPl4I"); yield return (Hash: 0x5c9088739d896821UL, Seed: 0x0000000000001162L, Ascii: "H3tw59bhz1T1nnR3phpWiSkdwEpOuz5s"); yield return (Hash: 0x92583c591336cb07UL, Seed: 0x0000000000000000L, Ascii: "xB0c6wK9bmxwnzf2jvZNxOYJNM2fGL0r"); yield return (Hash: 0xcb6af9e609dd6d67UL, Seed: 0x0000000000000b0eL, Ascii: "lDzIPQrmi2UvgSSWTe0sMEXWNQX1t3ZC"); yield return (Hash: 0x28f28fffbaa365bcUL, Seed: 0x23eaccb8f24a289dL, Ascii: "6Dj7XpVnlDS3iskE2RiCX7f46L3pxayir"); yield return (Hash: 0x3c803ff73386886fUL, Seed: 0x00000000000014a7L, Ascii: "k2TsCmhgBSoOIYeZduUoVjR377OQE1JfY"); yield return (Hash: 0x5cc468d1bb02773dUL, Seed: 0x00000000000024acL, Ascii: "aOR7hd3xbGoB0FQGYZ2ufM2ueyyDV0L93"); yield return (Hash: 0x9b1dd59595474167UL, Seed: 0x0000000000000978L, Ascii: "L9E196PbLYnr7TKQb44d2jPAjLDuE2xMq"); yield return (Hash: 0x250eb2532a17a05cUL, Seed: 0x00000000000015d7L, Ascii: "X1a9zapq9YvpqtP0LQwkXCacvz8TTJrR5m"); yield return (Hash: 0x63e2bbf8b8b0118bUL, Seed: 0x2ba124b4f3ead0deL, Ascii: "o5t9IPouVvQ7Anqa8b96M0JKZEQer4Io87"); yield return (Hash: 0x97f403f9055d5aa7UL, Seed: 0x0000000000000000L, Ascii: "vRTbTeQP2nIh2u5LeK5w4s2Pa1kjw73Vwk"); yield return (Hash: 0xcc696c60fb619b50UL, Seed: 0x0000000000000000L, Ascii: "30vfO7V1QAAifNBsjia1qbCIP80KqjvqGf"); yield return (Hash: 0x14b5a81e02ec30d2UL, Seed: 0x3ffe7d86a697da93L, Ascii: "FAIUOWamAotqfoHv4Ie6Iib8Z59ZSO3nmkd"); yield return (Hash: 0x386bdddd2c078a05UL, Seed: 0x00000000000014c6L, Ascii: "XS8b1YF7ljMz6H6XcUtNA5VTQ2noYWTSHDj"); yield return (Hash: 0x51c613ef1538fd3cUL, Seed: 0x0000000000000000L, Ascii: "yFgI3MX0SsxIReDPO67ELAEPam8KZB38hK3"); yield return (Hash: 0xde9d7d5dc939e29bUL, Seed: 0x00000000000014b4L, Ascii: "Zj6tDKmocGIFyyCmDJf2u91Sabx3pLiQ5Bi"); yield return (Hash: 0x2c94e3882d1a04cfUL, Seed: 0x10ec20959d09dd55L, Ascii: "xOwM20yHXHCf6d6a3KbbQfLGeSLZASkWILAs"); yield return (Hash: 0x54b4df8cfa3d0c83UL, Seed: 0x0000000000000a20L, Ascii: "TZAxr2MOi7t5U4bY7ViTVRFHW2k6GLa03a0X"); yield return (Hash: 0x954b3ec784afebe6UL, Seed: 0x00000000000019b7L, Ascii: "04bBCjlbOURXBpQWFXiyqnpijPdMBjSQLY9Y"); yield return (Hash: 0xd096080f7473373fUL, Seed: 0x0000000000000418L, Ascii: "4OQFyXv26youfQn4z9uBe4dEcqxXuvmA5FZh"); yield return (Hash: 0x06f49b83f5ee68c5UL, Seed: 0x6aaaeac1e226ce06L, Ascii: "eFdnTZwHdKvPkPQ8Bo5bivEk6mHC4tNjoZ7l3"); yield return (Hash: 0x4b300ae419a18d19UL, Seed: 0x0000000000000bfbL, Ascii: "WOnlojc8sZner4PjtLzhHkh3Y4OGqromTrsWx"); yield return (Hash: 0xd1ed88c59d79c41dUL, Seed: 0x0000000000000000L, Ascii: "7W1tr4qALkdKhiOwtFHbNxWh949TA6fRPNAED"); yield return (Hash: 0xe6f3df2739d23499UL, Seed: 0x0000000000000000L, Ascii: "GjIC9TfpZS187U5qnS0m5BjlFYIlCb65drVYx"); yield return (Hash: 0x237691202aeda700UL, Seed: 0x0000000000002096L, Ascii: "rq1m7dsJynO2hnuN29L032MvweATJteQzb5s9m"); yield return (Hash: 0x31a702a70da83707UL, Seed: 0x0000000000002531L, Ascii: "pcop6coqVECPZ6Ywdfw0tf97F2gIUIQSIlYsGR"); yield return (Hash: 0x5eafc9710eeaae4fUL, Seed: 0x0000000000002612L, Ascii: "V0tLcpF0mLBRLatMz67ME7g2R0uZVsFUG7HWC0"); yield return (Hash: 0x9694dd8f834c08eeUL, Seed: 0x0000000000000e20L, Ascii: "FgTTUKngL13WKXstwuSKGAsEmrKxmRm29WD86d"); yield return (Hash: 0x246663478abad07dUL, Seed: 0x00000000000014f9L, Ascii: "VSnKYX4NmxyAAoVJAS5YzzqqwtJp5DjL9ogkvaY"); yield return (Hash: 0x5a792535e570b41dUL, Seed: 0x0000000000000a69L, Ascii: "dXgaJgKCJ849AED2FyHLi2Hjd4wU7n02iEk3Haf"); yield return (Hash: 0xbe902a5ce92bc49bUL, Seed: 0x0000000000000b25L, Ascii: "yTQVdgm7uIuiAaz1qknDpajdBTNMXMCbNZR4MFX"); yield return (Hash: 0xec6ced4acadeffdbUL, Seed: 0x0000000000000000L, Ascii: "CTiZlNvCQ3UGNvemq0dPvPKqyhMn316cDcPJSqG"); yield return (Hash: 0x210ebc3c4827de7cUL, Seed: 0x7b510ad4c9cd1f2bL, Ascii: "vQMOlSQtz9Zs9EX3iUUVdabSsD1GVaXEf99LFt08"); yield return (Hash: 0x6152a880449937bfUL, Seed: 0x3c2edddf6ae3473aL, Ascii: "VfPMDOuJiYd7K35LzrckzjaCaEhY1YqtrdModUEb"); yield return (Hash: 0x9c3e336220670dfdUL, Seed: 0x0000000000000625L, Ascii: "bdtPfyPoSB65mUWrLWvDQ9YcPmf3aYDbTAP3qTiv"); yield return (Hash: 0xe63f355460e07a2bUL, Seed: 0x000000000000248eL, Ascii: "a5zgDNpHWC0CvOccqiABGDcnyZwwRxbD2bpj90vl"); yield return (Hash: 0x23c91f84057a396bUL, Seed: 0x000000000000183bL, Ascii: "sACG5HtreqQdQ4H9yXLk81UfD2Av3aSTcZdqClt6R"); yield return (Hash: 0x54050682b947e4beUL, Seed: 0x00000000000002c3L, Ascii: "nFIS8engjL85yGKk6CHIBoi2XVSGnO0SazJEcomqb"); yield return (Hash: 0x785cf9bf502cac9bUL, Seed: 0x0000000000000000L, Ascii: "gJrLLQoUXbZrVIrC8hVi3JCvxDNnxmXJ8B0WpcbHc"); yield return (Hash: 0xe66ea6dd2dc85660UL, Seed: 0x00000000000005c1L, Ascii: "57C715ySXk7ymep2B4o0MNRiGEsK6esgnTQhv5q4P"); yield return (Hash: 0x2b4db8b91d2cf41fUL, Seed: 0x0000000000000000L, Ascii: "7zCrwP8ISCDHpoTWQLygqG6deBqXmQggsreOQWxxXw"); yield return (Hash: 0x5f942ef992774194UL, Seed: 0x000000000000212bL, Ascii: "KKQzNTI5jMtHVROqR85d8I4rpldY23KcCqVYMJvFIl"); yield return (Hash: 0x8986c4368e995da2UL, Seed: 0x0000000000002281L, Ascii: "9QvlFSi8AOwfwzdY2DVPEtKkysr2E5ec98EZ7laNm8"); yield return (Hash: 0xa038d64ccfbcd427UL, Seed: 0x0000000000000dd8L, Ascii: "tdZwMxNh2wMQDQCjrJAcUvbwnfoGGmDKgRxGu0Eanv"); yield return (Hash: 0x41b1a01030d411f1UL, Seed: 0x0000000000001e5dL, Ascii: "8eQws6NnMzpSfvW69EJnkg1gYSLKiuJrT5UVsQnrsmR"); yield return (Hash: 0x938fc57e3520f7fbUL, Seed: 0x3269ffabf9fe4912L, Ascii: "Edxrm8YOHQ69GcaJFDBDMS4t1tL1huF1C4l0YlTMa5j"); yield return (Hash: 0xabb8b78eeb0245c6UL, Seed: 0x00000000000001b2L, Ascii: "iIb3TJacRk5lTmjUVwb50hrGdnI9GbrJIZLDbzdxiEz"); yield return (Hash: 0xcaa1c81ee9662cd9UL, Seed: 0x45bc9445ec98a116L, Ascii: "QNGZnwuSJxE9w5GbecA65ajidWuNQWH9i7DD14PZQmq"); yield return (Hash: 0x0b5c29236b8e04d5UL, Seed: 0x0000000000000000L, Ascii: "TmQKZZKn5GUyOJDneWKHBkNtFHc0PfDRsUWTsdfvpnmB"); yield return (Hash: 0x279dd90b59974c7dUL, Seed: 0x2c6d4115a33ec2b1L, Ascii: "2esyriPaAO5FmQd0K8PqkjuQLUfw0rYxn2tpfkoRW5PO"); yield return (Hash: 0xb1a629596b0a1607UL, Seed: 0x0000000000001d98L, Ascii: "LMEKV14ZqsFpOq0izrKQphMbQ9JEmLuzLEMuJGKhUlUd"); yield return (Hash: 0xeed056dc1ad7432aUL, Seed: 0x000000000000147bL, Ascii: "uTrlb8pId8MuDzBBHgrSYiBWto8oIRcq25j6mHHOPnk5"); yield return (Hash: 0x0c9fa3956a4b5964UL, Seed: 0x7c45ea4a6dba9f4bL, Ascii: "Zld7gfG0QSNQTJXR0ejdBjJX6CcBrMUH09fe0CdkdWt9W"); yield return (Hash: 0x51ad8f684d9f5c9dUL, Seed: 0x0000000000000000L, Ascii: "6S17ZBT7gAnKSmTHLQZhVYvz9x7qJQSFXwg2TAgLN8o5Y"); yield return (Hash: 0x6fb6b9a59a3484d4UL, Seed: 0x0000000000000531L, Ascii: "zgOcPuSSNhWP4mtIsengVnbgCwP81Jn2Ywt0DvlYZGdAY"); yield return (Hash: 0xeafb12f4d904869fUL, Seed: 0x00000000000025f6L, Ascii: "Kf46oy6paO5m0BITkQBNDFj4IZB69QwyLLX9KQWj2naSZ"); yield return (Hash: 0x2ce310fad5126d78UL, Seed: 0x0000000000000000L, Ascii: "7yUQsmy2PUSXBj7wZ6gMyYhMYyeaOX7TZA1dKfYTWZ3lkX"); yield return (Hash: 0x5b06c0c82e6a7739UL, Seed: 0x1b789758fc51f4ffL, Ascii: "wsXMtF0seyh9Wq3TnVSOLCfrBOZGCr0YJZd3sBxJQgCyyD"); yield return (Hash: 0x89ade0e7de6cbb97UL, Seed: 0x0000000000000c0aL, Ascii: "0ruKjbSl8wBTihQRn41GAXbvYwGUo4OWGFLa2TwDJjCCg9"); yield return (Hash: 0xd2e36a5162ea6be4UL, Seed: 0x00000000000018a9L, Ascii: "4a32HpJhxXIvX8hUclomupa3QNdcc1pxnVowIs7zEiXj0p"); yield return (Hash: 0x18a939275b26692aUL, Seed: 0x0000000000001178L, Ascii: "JNBl17xyqUmKZljoCxnoKP1D5voTAdLpHJtF6jZVLz68xLv"); yield return (Hash: 0x55721402fbc56129UL, Seed: 0x0000000000000a7bL, Ascii: "xOTg2nw9GbYX5pPg0SzxC8q6IEybp1GZmMPyLzbtL7UYZcK"); yield return (Hash: 0xa453728744c56b8fUL, Seed: 0x0000000000001894L, Ascii: "EZRi4XK7jJTrgPKRA5SHoz0Q4sif7cQIHKFokZY8SSVEyrh"); yield return (Hash: 0xdfce499ed2f17145UL, Seed: 0x0000000000001c4cL, Ascii: "7OrNWNJR2u89m4WipmIbRlyNBOh01gpw7nerBk8R9L3tCrH"); yield return (Hash: 0x1ebbfd6cc2ff9c6bUL, Seed: 0x0000000000000000L, Ascii: "Ij6Ag30H4NcF6qeJEz3Wsz5l6Dq8l4mhhKBirBq3vIaqRRQV"); yield return (Hash: 0x8d910fff635a5915UL, Seed: 0x0000000000000000L, Ascii: "IDOWgPqCXnvFdmWDzqacG7q4o1A27CIXzbexey5B4UgPJJBB"); yield return (Hash: 0x9e57344142b8cfaeUL, Seed: 0x00000000000003d4L, Ascii: "2099xOkn9wkKjKY5CDlkDdHwi8D4TQJl5gS4d1hcvyR2RQtf"); yield return (Hash: 0xe7a258fddd719822UL, Seed: 0x0e6a5f795944f2abL, Ascii: "oeDsxodqj2WWr7Muiq077o5VrVaP5K2adfs2u5CzVgGHi3zI"); yield return (Hash: 0x2907c6b2b2112473UL, Seed: 0x79ac05cd3e7e0747L, Ascii: "CLWOfGOevFJeoegPEWvCPNhABOE0RwTyFxm3CQaFuhUFZE8Fb"); yield return (Hash: 0x741bec58ed14c0cbUL, Seed: 0x0000000000000000L, Ascii: "LGcQ0YebgP5cfln0Fd758gcv71YusgWgLF5pPPRQFKjnlrmR5"); yield return (Hash: 0xa3704fc90279d6e0UL, Seed: 0x0000000000001c8fL, Ascii: "lzi6j73dq8g9jSQWe8JiNsQBZvg28u4eefXWB0aZAnd1sAQEX"); yield return (Hash: 0xee496d532d7b8262UL, Seed: 0x0000000000001e43L, Ascii: "C2g2lYC0KNSl5ogPIeHDMPPIdTfAMX83NFOLTvzNCMOcjybVU"); yield return (Hash: 0x21c59a32b56c7294UL, Seed: 0x000000000000202dL, Ascii: "LfZcvbaYnMc7ilNCiIfqBMIUDq6nPZdbZADb7uLmeG4fZMgHcf"); yield return (Hash: 0x3b6f5f98bcec4addUL, Seed: 0x0000000000000f7aL, Ascii: "Ye9VF3LmVIom3at1cJeyEfEJ0FZNMMvkATqvW02AWyGSswPLDh"); yield return (Hash: 0x5f8a82bc935947adUL, Seed: 0x0000000000001a4aL, Ascii: "ZqWK3ZqTGNSC62HuKNbQnhU4iPL1AIaBsRKH46Hk2dekaEZbK9"); yield return (Hash: 0xeb49e50ae5e96c29UL, Seed: 0x0000000000000000L, Ascii: "IzxO16cucXkJxNAdGLv1vlEbpbvLh59hxMIDOKyiRHT29qo3Jx"); yield return (Hash: 0x09b9104bc3aafeaeUL, Seed: 0x0000000000000000L, Ascii: "Ls6VWKVpKBWkLqLn2Dcz7M9X3SyAd3pIgl7l1rk1sFe0OBxz8ig"); yield return (Hash: 0x5e1f4dd12187d568UL, Seed: 0x000000000000150eL, Ascii: "a9HXkqKa63WKbhvtg0ZBs9I8sF98C7VLpajeWEZ7qfcAKn9x2u4"); yield return (Hash: 0xa02534406ce14948UL, Seed: 0x19364680b7cfae64L, Ascii: "QxZmg62MBpJkk3hzweVPW7WuBg5O3lg5gogVKg7EvgcX5gFZg0j"); yield return (Hash: 0xdb6693e2ed622d0fUL, Seed: 0x0000000000000000L, Ascii: "ro9oxAxTDXRNROpQfAwZ6NEptKRF1SOkiHTeUuygMCgydNyONd8"); yield return (Hash: 0x2619adf9b9463783UL, Seed: 0x0000000000000000L, Ascii: "VgBPITWUgUJHF7eKLDrfatEay6LggqLL9PmXfmwYlBvfqU45s2QC"); yield return (Hash: 0x773cf7a08f6b6934UL, Seed: 0x0000000000000146L, Ascii: "AcnQHNqJ9CbnxgYAeqhpNvxTSviImLq98dZtTjXg3Ull81cKBASt"); yield return (Hash: 0x9f223dacdfc02fc3UL, Seed: 0x0000000000001941L, Ascii: "v1pEcieRUyQnEkrkxfCEgdhMuZ5ZJTCX9pygddRcQ98Flh00YOt9"); yield return (Hash: 0xe9f0aeb1d0691516UL, Seed: 0x000000000000098cL, Ascii: "kW8S6p5FaD0SWxtfn6rNgk6j0wVvJEt6jDz0pojRELPyrynVUyew"); yield return (Hash: 0x14d78e65f45f7d81UL, Seed: 0x0000000000000000L, Ascii: "gGTtJkt3jWNXV77yMOLHgWh2wpgK8qFcMs5MX1SdN35RNt8XzC8it"); yield return (Hash: 0x3914044fcdd7e268UL, Seed: 0x41d3b15754067041L, Ascii: "DiNDfLboOnvczVWhwRR7UPDsljgYz3mJazI037LfMMPVx4NUoArV5"); yield return (Hash: 0x8c0701194f1164b3UL, Seed: 0x0000000000000985L, Ascii: "vTQ7jBRVAlRRUjQVADVtixvS5QlaqFhs6Gq7aDjmVZIpge5abpjZq"); yield return (Hash: 0xccc87259d135706dUL, Seed: 0x000000000000258bL, Ascii: "JIgjs2RG2EA6NN56sZCE7hKybrSGCf9BgatWqRbp4XQVbtbIMKhhO"); yield return (Hash: 0x0be674f9c6b485e7UL, Seed: 0x000000000000081bL, Ascii: "ml82dtCvI9dWohM3KqakVqbrDVihy4ihUZwrf0RU8CC0qGJk2hi3Xe"); yield return (Hash: 0x31655750cfc19844UL, Seed: 0x74b9e97496068171L, Ascii: "9Q3Bp5kfmgzShiQhH7knhi65LLdxoEy2WmOR1eI7rvsnABhbF8DbP4"); yield return (Hash: 0xb0b7c544680889e5UL, Seed: 0x00000000000013d5L, Ascii: "0VYRaLR75oh74pxV3IlOWn2I3la5pjPqvFo1XqpSo3fiaQ66J5gXej"); yield return (Hash: 0xf74a468b1d2cfc69UL, Seed: 0x0000000000002278L, Ascii: "WEaHPT5CFIgnYDGEAbVomBtvu1LhyejKcwpzKXrPJRDWRHQ8UQrLR3"); yield return (Hash: 0x1a15bafe86cc1598UL, Seed: 0x00000000000013b5L, Ascii: "nGS6WGHxSo8vPLfVgA4dgokSCV6ojBbUu35fpVQuGVjkHGvYd6PlZ3w"); yield return (Hash: 0x60933a1e4e010b2cUL, Seed: 0x0000000000000a8aL, Ascii: "LpeQUOYVWJZ4CFpEGC9An1gSaE9j7FMjG5nhX8duWZD2hKaGrSXIg1D"); yield return (Hash: 0x8c3895115d651298UL, Seed: 0x0000000000000576L, Ascii: "AMFxrECxyQHyBnIGcz1m6cqwJ9nNuF5WrJgMNF548ajy4o0OVJAJzph"); yield return (Hash: 0xbfde3b8fa98088d5UL, Seed: 0x0000000000001641L, Ascii: "Z7dYLz1eVa1zrPrAL19mFtmz4EfWNxIu4omhJO0Gfg23KXYpU3IpVfw"); yield return (Hash: 0x34790610cada5714UL, Seed: 0x00000000000022c4L, Ascii: "SSwQgScmLMY2diX01UVpg2v2bnAgs6ZpsWv5PbDM4IwHslW8mWgUORIW"); yield return (Hash: 0x5d129cd6ab2c9b55UL, Seed: 0x00000000000010c3L, Ascii: "2tlEXjmV8Uiuf0c0wnSb9QvQobIYsg4BhbHOYnsj7Ry7WizG4lODAa8d"); yield return (Hash: 0xa675f861e32eb4c8UL, Seed: 0x0000000000000edbL, Ascii: "YQyUWpSRyow0JDpO9iE2niSNsrV4i4n9T2phg5AyGNoCufSHwIcjXPX1"); yield return (Hash: 0xd4d8a718dd24c500UL, Seed: 0x000000000000217fL, Ascii: "qChqIWMKTD93cd25eOcPmsXDPJN5doh1sweE2IOUeMHVtEzV2X6xAM8I"); yield return (Hash: 0x421a290dc3731d13UL, Seed: 0x0000000000000000L, Ascii: "48o2hjGrFlqK9fWKtPaGO0yeS7EinKtpCrW1pJTNZP8FdyNWRtRq7hLsy"); yield return (Hash: 0x7f6ba93f1df37e1bUL, Seed: 0x00000000000001daL, Ascii: "UxbCoJqztrbLN4tXQMN1Ub13Pb1LtlRHZxFpJqjxIyNeL9k2zbj2XtiMe"); yield return (Hash: 0xabd6ad65e378f14bUL, Seed: 0x5e11ec7ccdae524bL, Ascii: "zFuPfgSUIJrUVkfOItIrV9AkQrEc9lWOJREQIhSoCrilCPOlCoBbxXPr4"); yield return (Hash: 0xe896841cadc57bc9UL, Seed: 0x5519a7394afe885bL, Ascii: "hMVfSoFYmNPvgczhngnL2nmAdLM77JnCd5OzB4ZZxLd2GKCGyDgMCGld2"); yield return (Hash: 0x1cb213d2c8720866UL, Seed: 0x2f50b68dd1216820L, Ascii: "bDcIN878DQrQwGWieIjIRzucEWCxdqkmNsUetKNBo3Fc2dGHvLptSMbL0A"); yield return (Hash: 0x4e19910e07a80533UL, Seed: 0x3022ec39e9bbb80fL, Ascii: "5kGjt6moDX5CGU8My6gK8e0ia212HfJlIv6tmzLu57b6LlgbsQamVrqeWK"); yield return (Hash: 0x999d616b08af00b8UL, Seed: 0x000000000000180eL, Ascii: "C4gSolKgHsQLi8oQ7625q0cVMNSgrhkYKJkyvKAjydg6CkKEFzxCqxjbNA"); yield return (Hash: 0xb37742158c17501dUL, Seed: 0x0000000000001918L, Ascii: "GS0YDzYitXptN53db5eprQxfCof7LvTmC8PnvMb1h1NPxjpQUUcDkR3wMr"); yield return (Hash: 0x2972aa344aeb7821UL, Seed: 0x000000000000259aL, Ascii: "QHoMl8c7TxBkBCVhSwpMW0XlQUnetmkwEjEW1sbBMygvmWPnmkdrYp7Dx6P"); yield return (Hash: 0x7351056b994c6a0dUL, Seed: 0x0000000000000000L, Ascii: "qpWiY8KnV7C9gd0XrPZKIJQxgsGrMeFawP6jOy6EsCr2WhnBNc33wMHjkQw"); yield return (Hash: 0x8ea6045dd6d64064UL, Seed: 0x00000000000011b7L, Ascii: "dgqIgOoGQ70Vn5DHxW5ljVjhHW5XszxVMEjlfnKUgEJkJlql3UPxX4zArkA"); yield return (Hash: 0xdddb6e26f236c94eUL, Seed: 0x0000000000000000L, Ascii: "d3zh7ciWb42tmd8GVOFIQFlvRaJFd04AWJQgLZ8uEXYlYdxwuhyYMMDBFqZ"); yield return (Hash: 0x11b32d9e43c17489UL, Seed: 0x0000000000000000L, Ascii: "iFcgmFMBZmi4M91evoCByqY6lZDHtG08qMLgQqOMrMjjzlzPerTY5XiE0p3C"); yield return (Hash: 0x55793d5dfce1976dUL, Seed: 0x00000000000014b5L, Ascii: "CUnB8aP78JwmdOzqsHCOMkVXWbcrcNrGGmRaedmFnONXsBk2auUae3vxjQlB"); yield return (Hash: 0x9e4a3c3a5d348d7fUL, Seed: 0x00000000000003b3L, Ascii: "CgjMVFpO2wAny4P0SId20EJDrHUKPKwhXkYLf8TMSvetL75Hbd8UeSkjiRoR"); yield return (Hash: 0xdacf77121c781d0fUL, Seed: 0x38f31597a69f595dL, Ascii: "NLU14nP7C72v3yTjzULrMTgNWyxwNnGc9UC9fXLOxzmjcAi67X6nzAZXxK9m"); yield return (Hash: 0x2801aa99bfb2decdUL, Seed: 0x14ae24b2073113f2L, Ascii: "Vy6ZyYEuXWrz7Quv1BR2MRUCeCXiXnh3ZGuNncajoO9OInkaXHfWYGEtcxtbG"); yield return (Hash: 0x51bc4970694f0f55UL, Seed: 0x0454617a8f747ce4L, Ascii: "G2A72g8ejMhySFBmSH0CuvAEEjXbaFKmyicWp43YVgygrbq3FpUS024Io30zR"); yield return (Hash: 0x8bc5ef0d1660b3afUL, Seed: 0x000000000000140bL, Ascii: "ETo4HYuNApzBgyaagRiEwNlXGninxHyLcsW7vu8p4HqLsHmUoZ2wxIzrXo9HN"); yield return (Hash: 0xd4939b0068ad3002UL, Seed: 0x0000000000002233L, Ascii: "mswFyfJ4YTrRr5DnUhl1f9o8YjRsRhYL2nEqoGQz8iDamdkU8dRj4GNrM1QqZ"); yield return (Hash: 0x1345ce78ebc56934UL, Seed: 0x00000000000023f7L, Ascii: "rR2Cc5Tan4C1RpIXm4Vqbk0hQ44bcJT8FaPC68YYoVZqD8AYm4FNLFmWXK4w9u"); yield return (Hash: 0x559b7a6d65837634UL, Seed: 0x0000000000002484L, Ascii: "cDr9lGyW06vlulQKmPYUrm1q0XvRKBkz5LHvVfejtWjGovbtV3Ssttyop2SFRJ"); yield return (Hash: 0x8b452c9a7257c33cUL, Seed: 0x0000000000000000L, Ascii: "aTSzxIuznzTgF8UMqJc70DDDKWguVRuXJOtdAiCBnlg38XcmrD23HEZm3yviH2"); yield return (Hash: 0xd6b589b67c01f79fUL, Seed: 0x49a9d98fa20a1fccL, Ascii: "Af9PJlbMfGS19PiYKRS7MYyDlXB1xBdihQtv3PPPUQsDghsLrKnTIhPUuakcE8"); yield return (Hash: 0x123d42e2185764edUL, Seed: 0x0000000000000becL, Ascii: "dChRHLmoLX3g2ZOqvhHheCcz4Pc7Qipaz9hRhIVPogE48DjMDDs5aNDdwYrf9la"); yield return (Hash: 0x3f396384ced3c48fUL, Seed: 0x0000000000001cfbL, Ascii: "E2KhIsi9hBmz20c9ljrFZrHI0FzzXbhvDJCjYOovgj9bcncjPrLCMhOzOOHUV7j"); yield return (Hash: 0x84cd838237c7d8edUL, Seed: 0x000000000000048bL, Ascii: "IsI2YiVzaCDbfL33z1lO72OhvvfcCyFrLuDBZTgI64V7GFEinbuAMDA30ZFauvS"); yield return (Hash: 0xbc820aeb39d15c8cUL, Seed: 0x7fac3c7a00d71af5L, Ascii: "Ae8sZwZzuLjWxRzS8Xvw3erSRWskQCxSLZ0o5XrABGJN2e1LByA28esW9caWILS"); yield return (Hash: 0x12c999733414041fUL, Seed: 0x0000000000000000L, Ascii: "TvExjicqiLQwVII8NV5YKv9VKavvOsQOpsUgdDHQXBcWygTFFcfe4uhWRRxRnCNC"); yield return (Hash: 0x69753cd2983fd92dUL, Seed: 0x0000000000001897L, Ascii: "XPqxjOibm1bP65xGaaRsetVdaPzr44WYu4pBFBNyPiD8XOfb5UDhFVEoLercZco9"); yield return (Hash: 0x84ddd5d04c6e29cbUL, Seed: 0x0000000000000c25L, Ascii: "i0ZFqvtSlIKdXfPuKoZTeTEb9L8WLptyzEq4FZWznuBban1DwTWhy8KFTNS287KZ"); yield return (Hash: 0xc3fb0f2dc686dd0eUL, Seed: 0x0000000000001edeL, Ascii: "FrSgpf1CccjeB6aIMtu0YyDhnD8YVF0Jz8zo7tDGOVzhKwEYrbEVfhYVsVAuURQr"); yield return (Hash: 0x144f5a4fb507fe48UL, Seed: 0x332504d827fe35ffL, Ascii: "UV15wti7vDPvp5vdZDqLsOmiSiBymdWYH8uw5TjPqV4QpEXDy42REJAkj6PiWi8SE"); yield return (Hash: 0x3f8a8ae63eab87dfUL, Seed: 0x0000000000000000L, Ascii: "v4n0tGBDBWlHljIM0I3XM3oKIBTT8Y4kSWkT42r7PyoD5I2iSJyrUclS3n8h6Xmzg"); yield return (Hash: 0xa99011c00fa8c6a3UL, Seed: 0x0000000000001b2aL, Ascii: "9kQUYZUF3VA20kgGgNujYD22HiU5onoxWxvQFmMlxlu0fzEv7962PSTejq8gwfvrk"); yield return (Hash: 0xb4ec41725d31b11fUL, Seed: 0x00000000000021dbL, Ascii: "Felb7yzSkykG2IkOlrcubpQRnw2eoG8OVsB3cs4MKKeaQiyl5WVbLKeajEuH2R5cA"); yield return (Hash: 0x0ac357be59fe1826UL, Seed: 0x2d5b9a19d86072e2L, Ascii: "m5VOpDrDiurU62bcoqXWfzW75UUtAYcL9uh5SmOubsGBCL9lHeSAeQ7l4oh80nuHa7"); yield return (Hash: 0x3f9547e24f011de3UL, Seed: 0x0000000000001413L, Ascii: "YA3eHmH7HwBnvh9kNXMlv1RZck99qhkZ6fJyUaUnehTIEd4gIWNhaUU06MrbwKt5ox"); yield return (Hash: 0x9d78ac8a01950097UL, Seed: 0x0000000000001de9L, Ascii: "pgOW10uGa4dqCcNvrYlYMGErIwRX2kjIQvutKi7br1O87xo2aq6Sy8Odqr9TF6mI3W"); yield return (Hash: 0xded572bebc745376UL, Seed: 0x0000000000002584L, Ascii: "OKBXjBXOXm0mmdORpNwqdwY2oItFNEn0plGPXWyWRR8fzVJLvdhOBO1jQ5XeoIdCPu"); yield return (Hash: 0x3ef07d2e8f7e0ce2UL, Seed: 0x0000000000001676L, Ascii: "2mueH2ma9BTIgNpadxRCb0RFafKa3j91pRC5on1RmRfjBZEpn63mQ0CLuLJwIqnZMFZ"); yield return (Hash: 0x86f20b74b8b59527UL, Seed: 0x778837d41e84868aL, Ascii: "oFIt4hmqFm5YkhRSlf8egNhotDP3rpgIcsUK4bJjrxErvjVjFOkqZOLeBnSSEoDIi5d"); yield return (Hash: 0xb26b0ea7adec6243UL, Seed: 0x57c7768f23d56971L, Ascii: "MH8bsvNnxc9zlZbxu3xpSPvEdAH7T2XPG4X8SPbu0fHxTGozYB4OM3f4QCnMYqxPPKk"); yield return (Hash: 0xf03659116b400e37UL, Seed: 0x0000000000001ed5L, Ascii: "qoaBsrdaeTH8fkhlC7cdQip2rfta3FFf0wlzKcFT4dBDvogACjVRLx2e0vQ8X8zogB3"); yield return (Hash: 0x0246063df8883c5aUL, Seed: 0x0000000000000000L, Ascii: "ryH9tH9CiBS8W0mFlB7lSmjxAtjZ8hVCpRr0SHzX1nqlAnD8LZqV8Jt2bGnwvr97NEdo"); yield return (Hash: 0x55f88ef61f570868UL, Seed: 0x00000000000025bcL, Ascii: "khdx087Y0Ha75yBiMVEsIpvhpyAc5kUd5yl0nK9oSbSudDzAP6aS7rwZJvdeQaKWoCkL"); yield return (Hash: 0xb2f04eae0dbf2d1bUL, Seed: 0x0000000000000f5aL, Ascii: "ag6kjPG4042HDDC1Y3G1HQLJkglVR7d7Fcd2lsuGieXX4jcURYltTkKybdec9GMw5PKs"); yield return (Hash: 0xe8e74b5c82234140UL, Seed: 0x000000000000208bL, Ascii: "8TVDv9CQaAsdESpuhUWT6fkqCBTE5y8wovp81YSEdTchBLcoA6sjVtB9BYR0WPHamt7U"); yield return (Hash: 0x11ba44c21db0900fUL, Seed: 0x0000000000000d1fL, Ascii: "iKJJLsCO8sDlFFzEKAUATO1jWDEQgfrufqdnZU66xbma8LqFrac7kHqiayzPuP94udCv8"); yield return (Hash: 0x68049fd7058672aaUL, Seed: 0x0000000000000796L, Ascii: "ndk6VGpA9umWEGNVU3i07c5CnUCotxkuWgCECgKnpevbEZu5RCCvqOoP9S4lv5fvwhxN0"); yield return (Hash: 0xa7176e82cab215e8UL, Seed: 0x4d98cad46acb947bL, Ascii: "crOzxbA8fTVCM38ypXFpKIJieKY9IxwIToT4JhTstdb7RV2jlZXfwJu1gMYmxTjfQO3nN"); yield return (Hash: 0xcca4b8f0da02fe82UL, Seed: 0x0000000000001f8fL, Ascii: "JWBq1w2WqWsRY51JvcLnPI5ceeEdop3e7pxZASclMAglJh8dg9UKS6LzMB1ekr7gprpuw"); yield return (Hash: 0x2d17cca2ebba3d6dUL, Seed: 0x60e925ed68699381L, Ascii: "spTdj3N5564MmYgvK9tKn4cZfPlp3Fjksyfy33TBH6UwwgYIc0asipqBXrjVlyP8GNibWD"); yield return (Hash: 0x5dc630e382622b20UL, Seed: 0x0000000000000703L, Ascii: "C30wXszDqwix9JqtvRST0YzM2j1W47KYRJHeIPMYbsDx32JnVHysFYui34Qaz3xHyXlQmR"); yield return (Hash: 0x877bc115426c20edUL, Seed: 0x00000000000023beL, Ascii: "V3cBt2iuYUdhvnnTDjqRE01fAHn133BGUZVNXeP2Az5zvyLv9OCEiu5DQYWhYHaLpUNWTJ"); yield return (Hash: 0xd1cacc82fee9273fUL, Seed: 0x0000000000001c61L, Ascii: "xz2M3W2nRYKXusjtGRHvjmvQqPLPXXamYCn9EcOni72EpzD2yQ5qnkQ7PzwbwQCCTIFUPF"); yield return (Hash: 0x0ca7b863463b53ffUL, Seed: 0x00000000000023f8L, Ascii: "hE01bC95EVZV34bnQKpKn0Pkr3bZA5ZNZRS7qNZLi19zAS8lgBliLIlLAhEe13KmsspLeye"); yield return (Hash: 0x3e104f85baae61beUL, Seed: 0x000000000000257fL, Ascii: "6e2BkJaZwEy5ufx6acaXPli5MEpECXo1aDiiOwprDIdiBU5TgiHydJ2dSmqpTXzaS3f7voM"); yield return (Hash: 0x84b34b7437c095f3UL, Seed: 0x3d589af0acce8d16L, Ascii: "BVt798Xm1REq9bzq5Xgn0Hr46JkvgCbJtCPViGhz7zKVhoLofiTDVNpagnGwLDBCDLgKLH2"); yield return (Hash: 0xd7662aa000e1cc06UL, Seed: 0x0ca51c7b9a233d1eL, Ascii: "AliAeUYgonrjyqZWlDRdNBefJW6QWqPo9rKKhPL6PMYoUfqi2vjEbejADiT4wRkbVnJjDUX"); yield return (Hash: 0x11403cd8f7c78a2cUL, Seed: 0x000000000000104cL, Ascii: "L5Jx44k6L0rtSagbPrytT3X6tEmYwKF0mN8oZgTAq3RSUWzrxHHL9VMdSDLFUVmRv5KrlNfr"); yield return (Hash: 0x42c3af0c15f780c3UL, Seed: 0x0000000000000000L, Ascii: "kXdFhAz02ox0GuVeSPsaVLcKMJePZkLQXbcN3kzmFMgWA8WpLfuJDj5rS1KGmwBqyh0Inl5D"); yield return (Hash: 0x9b89f98cf687756dUL, Seed: 0x0000000000000000L, Ascii: "ttMF9MSoQC8ubvtmrxKFbn9EPg5aYzJY6jvVjvaCgK68cmC7me1ikVRYqs4biHGwOpNKsqpn"); yield return (Hash: 0xb5c452884af39b04UL, Seed: 0x0000000000000cffL, Ascii: "HH7EP8PtwXPiJEcLrGXMYmyUc4ESerMA0mwIWj8esmTlUph4IIv3AHAmOcPxImannSodYltW"); yield return (Hash: 0x1ca06db322628221UL, Seed: 0x0000000000000000L, Ascii: "GrkDeCbWqUEesxt9uf1hLN9bixDxAYsgIMc50DFyteH7INNFLP5jgAFkBgrGHIhmpVQxeY1a9"); yield return (Hash: 0x371234e9bfb3f51cUL, Seed: 0x0000000000000000L, Ascii: "Teff5S6uVmhge4MmwnYTRRMLgStlo2StE4v5TGXWGVz27pM36vzOqTqTObKFrY47uCHn9YAZr"); yield return (Hash: 0x8ccfd33aa10a6e9eUL, Seed: 0x000000000000111dL, Ascii: "0ENitpVTcRiZ8Wf5NyvmcgMJODJq3j4HtomCzkGQAhh4HDCn6QUNSxpYOqk8g1ddyErIS4ekJ"); yield return (Hash: 0xc7a2281ceb834f78UL, Seed: 0x00000000000021abL, Ascii: "Dl5V5SLtpMUiJJgdLRXWBzRWbf7FIosJ2KyFd8LAm84AfusyRbhJJhF4NKmzcJ7yTyH89GuwJ"); yield return (Hash: 0x1e71e538ed5cb5fbUL, Seed: 0x576729e915b125bdL, Ascii: "AR4lc0CsPcQMjn3Rc7FQnWU2jsFwkSimhBZtYtOKSo7GPQ3T3Fl4jzIuVYTrBGT2gXIxeQudoK"); yield return (Hash: 0x281ce1683b49e0a6UL, Seed: 0x0000000000000000L, Ascii: "5jdoyrUYoR169zYY9rUMIKy940a5LRnhbY5s6zExO3PCmfvL2bpDPIY3LIwynXg2APdkgNSWSL"); yield return (Hash: 0x762ec45eba3b41f7UL, Seed: 0x00000000000002e2L, Ascii: "knIJ4zeR6ftmVtUOoKtpCWRKmdLxJdQCAevdcw4afpzeGaM3GJ7EhPUSDW0ncbATlKSur50xmZ"); yield return (Hash: 0xbd2e41589233acc7UL, Seed: 0x0000000000001470L, Ascii: "Y9P6C3lY0DnxGxipk30OhIE5JIzjmMHzjOe7BYdhBrRoEooQsEL5TdQpUlc2UkB2FyMzt3lERW"); yield return (Hash: 0x2cff8b03aa9a3094UL, Seed: 0x0000000000000000L, Ascii: "g5Bsfq3p8iytDC69UBlTn0sYVCLesPEX4Yje3nMyh46YkUkFlJlI1zh2fQwtApwjdVu0l2y569Y"); yield return (Hash: 0x6973192c0b15018aUL, Seed: 0x00000000000007c9L, Ascii: "ed8guoucGjtPkhLP5M6ukfYlfZ9nCrvKdSpJU9no7BqyYG9JbF34J7Ld4mFvvcWWMXA6R1tnEey"); yield return (Hash: 0xb525ae1b76e7d944UL, Seed: 0x0000000000001e87L, Ascii: "9gh52nsaHapnqgccLo9C9lukB5Uvn70il79LwLlIKDbwOmtsPePhm94wqtJ7Z534GHTEOz5mt09"); yield return (Hash: 0xe53b99a77d004afcUL, Seed: 0x0a558d8bdefcd2f3L, Ascii: "AIS4D1HaMvqRq6c2goG6qVXtmauWzSBHjXuURz7oUb93cYi1TRO33CgSnTQldVcyAEvXiN9hv88"); yield return (Hash: 0x1a016c5b0b693d79UL, Seed: 0x0000000000000d63L, Ascii: "4gLhTmcXNAjO5hzjFaNyJwZQA0xgvgXqY4YktLe5jBqXktO4ljSRIuSInx2jiYnMvyVQQDlSCCga"); yield return (Hash: 0x65eacdbf5d144b05UL, Seed: 0x0000000000000000L, Ascii: "yICRSATk9jlBrmGQkmpVq0ZTyIFbrqBYjoLaKxEKixNAfof1wwEHTuPYnDdaQkpwiqFyGDH0QO8m"); yield return (Hash: 0x96ebff8e3c422609UL, Seed: 0x0000000000000000L, Ascii: "shbkpE7GQJehIvAcFb4NpuoJT7ax8nJEBaDOCa6cwp4Mi60W59t8Nfzsp16QFABa4C6KNoRl8Ufe"); yield return (Hash: 0xe5183aa46b2ce88eUL, Seed: 0x0000000000001cf7L, Ascii: "2Xuzb0FSCOTN910D26le5DFMx9qJEPqugm6TZ202MUExumgdOSvpo0d7DG0vtaZUFeRBK006io2l"); yield return (Hash: 0x21eea2adc5771f43UL, Seed: 0x64436f175308030aL, Ascii: "q7sxIPRAM2Og77sNTXWkQWVdHicRlPFhWfyxtVlbcj6UgWWg25EiZ2PP3qrR7SHnOqZlySIYWJo03"); yield return (Hash: 0x7bbeaa1592093a4dUL, Seed: 0x0000000000000e83L, Ascii: "loMRiwlZaYhfjwHuBEPYjtNxS75MA6vLS6EGZmj0XNmMdHAHaPAq8ERDFQi9orBkT8rWBgKNsYkJj"); yield return (Hash: 0xc00f016790c67d44UL, Seed: 0x00000000000019f9L, Ascii: "4vAi26eGZ5TlYTqznrLKYcpxKJ4Y7883pgHBDOoGActgK5ZbrqppP150qbmNytnA1vqc7l8eT8oEW"); yield return (Hash: 0xea989546b4676299UL, Seed: 0x0bcc809852294e09L, Ascii: "rROwD6YwvSMx86Y5MmCqNKmUtIWMtMOXtLClOksIdal8lDboxqFWSSVKmwqdVBDoDR7elRYYM4PLD"); yield return (Hash: 0x196710b15bc54ab2UL, Seed: 0x057a5a6ff3541340L, Ascii: "bB3lurVvoz64fwEouyj9AsGxsnLdy1NDOAEA2n4Mj7tzENnt3WQNlfD78Vz02IhytA1bcoVn8KXQL8"); yield return (Hash: 0x3ba9fcd3c3e4b4f7UL, Seed: 0x0000000000000d6bL, Ascii: "sfZiQdoIaLFkM1XS159ya1TGvv8SrE2ahJP1D5fxelGzvPndJC4l47HyPyZ5hOxgff2SuuqbIhdKPr"); yield return (Hash: 0x897bcd832fc1c949UL, Seed: 0x0000000000000000L, Ascii: "jxRWEK6LJazWynCNTJLyg8nWsWnB38nYXq6cvSIzOtW091yMZEfgHaz5O05oI59UL7m00Lw6FYyGZ1"); yield return (Hash: 0xb4f941105c37d63dUL, Seed: 0x0000000000000ef9L, Ascii: "ZaxQFYVo7FOe51lc596Dvvtll8dQuWWcPS0mfBVENDWxNHvXhMQm4vfW0sauM4uE3qdeOUiDI6Ndqd"); yield return (Hash: 0x08e32e6a7424978eUL, Seed: 0x0965aee13d012a9cL, Ascii: "JtXkLq3fXKJ3yzMHbr3LbgpnKSdktDHkmD2v6yljj9eT6p5gbAAFPMQKrQMaxxiSYkutYamf45cW1Ar"); yield return (Hash: 0x18c8c3c456e8680eUL, Seed: 0x1d7c540438c70dd9L, Ascii: "HxYHgpI1GuU1GBvUCDV84DJXd08NA5pxEWQZbTknnZhw5pWVFLyBv8jS5UP31xUa5iwrgbTskSDcbG9"); yield return (Hash: 0x9782f0656a1877d1UL, Seed: 0x0000000000000000L, Ascii: "W2NSFrUjANeP4FVIhnoGVFe3MS48y7q61jghNQzH29cDqocuaTjAdPwgIaWjcQea7D8puxKPF2Re6ES"); yield return (Hash: 0xc00a1964ce2d40c9UL, Seed: 0x2850993126a7f996L, Ascii: "xKnvXs7ULC5O0on8tr8Cys8FbUehnJLCiETUAFRNiXvCE9SAnl1yF1lmkgv87lMG8KDdAbyX9QimPQO"); yield return (Hash: 0x27db8c13dfe1490aUL, Seed: 0x00000000000020beL, Ascii: "1xOzPHzGQiqo1SQqDzFB1gTdAoAo2MEmNdtYO1NeQ48mBWG6F5owFO9aLVlVLDHzcZEkpAon20g3xOF2"); yield return (Hash: 0x5f526fa64614ac60UL, Seed: 0x0000000000000000L, Ascii: "1CLclXs7CcEU5wHEhO9ENbeP6XItnXoAmc1dP1uWNiakHyAiY6FFL3z34V9iPRltZw36ACYev0eEukf5"); yield return (Hash: 0xbe5cd8581d18682bUL, Seed: 0x00000000000024d5L, Ascii: "9XiE8okSHwClRCIEt3FEOU07BDEB9CgAC8Adltc5jOGVeFnNktQu9aszHFgVGX3PZ9ILBMucYwOAxYYX"); yield return (Hash: 0xe5dc0ea039f9a32aUL, Seed: 0x0000000000000573L, Ascii: "wgMLhX7QoJbXANDELpVj95pKNQKAoYdB5cVO5Nv73p4373iciCh1fU0TacEEXyDzO1tgFUfKUKu1kgpA"); yield return (Hash: 0x298907e22b5c320dUL, Seed: 0x0000000000000000L, Ascii: "Y2K1guD2KTnldiKASvOepwIC4pPCLKVitKGNfXv1qNsCgPoe6DoqKlFAT73NZB7BALAFv5GWbtoT2MG8h"); yield return (Hash: 0x6a3a3d2ac078a59cUL, Seed: 0x0000000000001a72L, Ascii: "IUnCEf9bGM1nbosXqMT7AKto4tW8Me4AdiSc4YuxBukkt6AyWgXAWJMnxMzX8B7rAzf7DzfsIPX8TiFGz"); yield return (Hash: 0xa607fb1f3425413eUL, Seed: 0x388ec634c9324d40L, Ascii: "kHjJnGo4IJKuiK6TvKKTm9IomXlTSKoUmXKRGjdq2Iw4y57NsORDkhGtfCylmlA6n7murXdpuZEU8YlVn"); yield return (Hash: 0xdb1700e996a8efecUL, Seed: 0x0000000000001a30L, Ascii: "CD7bQOQNV2YZFCRsUp4ss4G0bwASuowA1gZIwx9q8k5IQ8MKQN0vQVmTJnvsYp6Gs0RSX34Mr4qbg9joj"); yield return (Hash: 0x2ed04fb35df32948UL, Seed: 0x0000000000000e05L, Ascii: "dtSPsb0jJzCZ1JrmsLMXJVXuyyDDTBW36P9ngdyM7VVc9ZXIBmVPyU13Cxx8uiSeMRgc2NvFuWbQf7MZ5O"); yield return (Hash: 0x582fa2cc4dc2123bUL, Seed: 0x0000000000000000L, Ascii: "JDMrnJeFOCgc3r2GJYyDJ4UwkWeZaU68lLVpygpyYos3C5t2yBxhes7YepAURnhmf4PouTq3ghDk22J4VT"); yield return (Hash: 0xa7eba5e8b81aef2dUL, Seed: 0x00000000000014d2L, Ascii: "RSuevETNns05LTDdUoiqtCSmB59b5mdJIhwGHYhmggWXvOHLc3s86ZpugUmMVQMJkMFdy6DrcbDTqnOBCy"); yield return (Hash: 0xf5fb58234f775212UL, Seed: 0x0000000000000667L, Ascii: "WmfzdvD8CMaFfI8fLcEjCialZSDn7lyQNmiQleDA0fX9WLGKWeRaCXM7gFJW25L5HGupr1RxYkRcqBGnrC"); yield return (Hash: 0x17355a460ca7bc07UL, Seed: 0x0000000000000e8fL, Ascii: "0vyTy1PsyfMtOSsWEORfWH2hJjF8mqhrAZKvhNTFPCEi4B6xu6ANDRnhR16eFNFA8AMkYri8PdNOeN3NNxi"); yield return (Hash: 0x67272d51a9c8a4ddUL, Seed: 0x49379dc49721786fL, Ascii: "DQPjKzXQJ9RHiloP3yzIo1mPn95mEf6NeNfJCghHj8NKyKS1IoBM1pexRmViojfnnmDaOtQ1UKkJ1ry0tdu"); yield return (Hash: 0x9311804959de2917UL, Seed: 0x0000000000000000L, Ascii: "GU8ISi5OBIWYBeK2RZnNscT6DEYN0uB11BpgKekeh56vm3ksjXA7YYE6jNiJ2jhgFHYupsUqW6GzAdPyhUv"); yield return (Hash: 0xe3f0f4e01fc34a55UL, Seed: 0x0000000000001609L, Ascii: "VjsOLFvsdyj2l7KrrZ9fyLsqc0f5w9ALbFPV0LYTiugCdip8R9WCs9DrpgxtgRlUvFGUnQUTx1KSySnOfbO"); yield return (Hash: 0x2304a89883520ae3UL, Seed: 0x631139e5539f35e3L, Ascii: "3E3UtumllL6ZlbDR30TvTbYn9SHqxRpnG7d6GyjSIcNB5PvcQaZd1IRFbSzgUom3rKQzIDqCrywuO3hLNnME"); yield return (Hash: 0x56308ea08dc75459UL, Seed: 0x02ab9de80a052f42L, Ascii: "LF1Yr3508zzhL4or5VAh0H9ztfDeHysy5gM45eOgWLDmIo5dZ4QuRWDWzx0pJos2oZUiTZQpcf8nF2MQBCOV"); yield return (Hash: 0x969469da4d9b13e3UL, Seed: 0x0000000000000d6eL, Ascii: "jeS5hvqlGabtRxiAyPQhQWMmnoRzZ6QMlaMsOodS82kdmKXGm0XfyglRCLutG6ZXI7l7vqIbTdLz0nvGLMm1"); yield return (Hash: 0xcb8da21dcf29690fUL, Seed: 0x00000000000019ffL, Ascii: "cpUbKnjYjWCEp4VqvJ7X3cBsiPYVLKOXDc5ZHAyQWh4z48YNFYbu1YExQKDo8aR2zdaYLRvntqFko8wRCBio"); yield return (Hash: 0x0bde0cbce76e4befUL, Seed: 0x0000000000001532L, Ascii: "jrS8UsCkonNS7kj6IpzzbIIZbHpJBsREwk5IC9rNyjklOm1PCvrmTBZK9eys51G7HMZIZZBjSCcWHn6nCOkHx"); yield return (Hash: 0x5298f5290f9b3e53UL, Seed: 0x42375fa6978a8ce0L, Ascii: "dd73diYCxIP1ws4uZjCgSMDSosJ94thLDPduo0jTqwdKZunPjMAupanYsSdm64zpN6NeQ1LGEKuG4wt6Y3SVU"); yield return (Hash: 0xa16f57258ce63e9cUL, Seed: 0x0000000000000d6aL, Ascii: "8qRe9e6PjnuT6dAQ8P1KdWwafr2NmdOaUqnCHrX8BoxHAPPr06gM4rSurQ4wO5btRSvdaAOkdgWSpQL3LmWwQ"); yield return (Hash: 0xbe5002449c5afd59UL, Seed: 0x0000000000000000L, Ascii: "Ys2i2ULXx10I95yTezfu5fMxIxY2lKI23rjhPzB0tSSR1mmCVfNk0MylEWDLrLJKDm6zwoaf5dW3lWs1gvOvn"); yield return (Hash: 0x1b22ffa874aa62a6UL, Seed: 0x0000000000001467L, Ascii: "RTsWdlmUBgkRcvDDd6NP4GyFgarm1I9nqAEyD84zhOylaT7JSxayq9eEPaDRCjXSZ4fittmekdaz2SNpMPnVOw"); yield return (Hash: 0x4cb7b95275b52414UL, Seed: 0x0000000000000967L, Ascii: "WzUnFL0OucevcOamRIuPYS07D125Qle6Lq6xT8y0oRJj6pcZfrTde5KDSt1g7IuvAVR34wD6TRqcdsi3Ul5SUk"); yield return (Hash: 0x83d1079074aeaf83UL, Seed: 0x34710ce41037c450L, Ascii: "HOqOvCuFWK5zJrbPrTuqRmS1Gu5iJnsy10GCBEqfd21vB6yhJX4UE44UIXxHiWaTd8kVZb98TstXHPpsbY9cnI"); yield return (Hash: 0xa17c4e08e4349f16UL, Seed: 0x0000000000000020L, Ascii: "pznGNp5jjnmpUPCia2hhUcCNifekLJ7j8WrBlDDMaeeWKEVAcnkezBSpeLIMu1Ug6ddZDdrKgB4vTKgATvuJr0"); yield return (Hash: 0x0caeae29d25ea5deUL, Seed: 0x60e2dfb361ec07a6L, Ascii: "icHYkTi8vGXsvjXjbKI00iY06R927cl8tByHNmk7oXIDCZF2Hv2qwpp0eQFP8BpXRXPKS7kZqF9LIOAUHPJarVc"); yield return (Hash: 0x46c9cd1a30dd820fUL, Seed: 0x00000000000005ffL, Ascii: "PV5W9JFi16GN7eVIGpPgyCjhaWBMGPmZgvdvTWJdLK6XcySgEbpvO1NMN37TaHGs4pQsZDPCIX70Iu6bo97TeTo"); yield return (Hash: 0x7fa1d9f84a987ab6UL, Seed: 0x0000000000001258L, Ascii: "oWBsc5EmYQwmbCptYMN4hmpN1pyeIhS1yL4dFajXbhfmgrxVmT3YfdCZeefAQkcxEAqxScBVDLVB3dP9xIpzg8J"); yield return (Hash: 0xbe7ad921af2a5da6UL, Seed: 0x30d1280a2255cff0L, Ascii: "Fdmm0omXgPBESo0geVOZuT28dNiz0haDn2DX4NYyfTEzSu3XKmtg8Ppbwrkw2YTe6Jpc6HAb9uTiMln31GaUTzd"); yield return (Hash: 0x226482ad0a2c2f1aUL, Seed: 0x0000000000000ca6L, Ascii: "msE9S2EKEiEI0Ckcv2tlMykdR2hAwu7bKOocWKj6JT1vkuHitZT6ltdUVKw6xzHrCgHDMCd7pDZlTyBddDq73OB1"); yield return (Hash: 0x428b0b9ea4b1c6d3UL, Seed: 0x00000000000001e4L, Ascii: "eN66tT6yA5bkLXKxju7LhsVsDCXh9b2nKAcxUMlLk6kOG9hgwf90jmR24jnufoW2Mhy4inON8yFz59jIWUWQiIAe"); yield return (Hash: 0x7359fcca541066d3UL, Seed: 0x00000000000009c4L, Ascii: "T9XJsRN6EtJFuhAnOfJmc4ebq50rHPxhO7BIVuqZzMmyIB5e34HAMU4gZHmKI5i3f2LXd8agHjiv9txK5EoCaCgX"); yield return (Hash: 0xbd706fc291828469UL, Seed: 0x5745190cbbf503feL, Ascii: "3b6fCjZVHW3sGOBouCLm9qnQhu2mqWDXLaiWZ3AULlb38LYnnpaY3BUUcFlOz6FQtjdjIFrlH04ht8fd1WTmaM7G"); yield return (Hash: 0x1cab1caa20a63b8fUL, Seed: 0x000000000000119aL, Ascii: "1h5xhrLp5Pm4aUTB2VxKj4tt622qO9eBswifEsh6AyOhoKUokwRMjVhIuiM3kPqXElD7yh2U9XyfxbR7gqUMVgXSA"); yield return (Hash: 0x67723ba0770dc63bUL, Seed: 0x000000000000042bL, Ascii: "CMMnPlYPFfpMQ2GFAxEzzBR6SYlEemynU4iiOkxcQnJ0gQOsA1HI4zOqCx0p5xdWvw6KKCT6SznlV9Rb8Pmfc3ret"); yield return (Hash: 0x8b655ec79b658b59UL, Seed: 0x0000000000001dd3L, Ascii: "805Kt79f2xIrEgaoLoYb2fukowtErK9PdjHeqTZNVxPVEHod0KSJVjSzNPYKP0hJmiALt65FpIFUUBsu5XZJqzr3H"); yield return (Hash: 0xc18e84aa38fae6e7UL, Seed: 0x0000000000001c59L, Ascii: "hrfOJ94OlRphBxBnrfLRNW30oUiDf8S8mLJL2CLnwga3PDxaZKuTK98GwP1Rr3mRFlRj2WXR69knsqmY60CeaC3a4"); yield return (Hash: 0x09d16f7ff0ed09fcUL, Seed: 0x54cb3bfe8ca3fa31L, Ascii: "mncxHLZA2MOTR3FQ2O9VAXPekOvJwy4qwis7dztqNGDz6rIhubuBrTwgD9MXwgdN9nmdAs8JvmZzMEodiaHVI4aJJx"); yield return (Hash: 0x389fd001cc7be725UL, Seed: 0x0000000000001494L, Ascii: "tkUoWSt4GsMaFYvzDYB1eKymiyFlW0kYGpWCH3RR3bKhGerJ7ZD7nKeTfyonVau3Q0XDbs2YufUVDKpbyo5K4pqHar"); yield return (Hash: 0x5bf48ce4ec08ffe6UL, Seed: 0x00000000000012cbL, Ascii: "QCH1shq4UBmQW8lq68B8Nk1sIBLqoRRqCpC6tSYQoxNZtvrVVyL32ziy5tFoJQYedW39KrycO8Bz7EMUoCIAvpdd9k"); yield return (Hash: 0xec13fdbd7318eabcUL, Seed: 0x0000000000002142L, Ascii: "A5PjqMnYlEFIsdQY3D6w34CLQRDC18OgGRwg1ojrsTg3S1xloYXDzoaM5qxzEU4sOSCW03BWyrLV9orKJYUowrwVWi"); yield return (Hash: 0x452f1c52dee0a2ebUL, Seed: 0x0000000000001da9L, Ascii: "RJWlnW50Y596v38EioTodlxPOyjRhs4aXZfuuQnNmRkcno0j7Wlas5fCBBKHADdQ357mzP16uNcsE9ZoqVKBj55hR0f"); yield return (Hash: 0x5f10befe82e567e4UL, Seed: 0x000000000000078fL, Ascii: "sxfHb96ETfH1gsllblJmHJ419swjLnVPGNh9L8kSdNgFNeK4SObPrb1YiHiP6q2GVWuuB7tDIDTTCT8Mw4Rv0StywGH"); yield return (Hash: 0x94877f733cc71902UL, Seed: 0x0ca925d9e177c363L, Ascii: "fxPzz16TkqExxzvWxgmVTppXlpxTpRnBdmGNTCmJT5Mv3JDlZGuUfhWmOmkBu7Vh2t4isZiJ48jIr556Ut2IfZDOWjm"); yield return (Hash: 0xcee906862dc4a784UL, Seed: 0x0000000000001ed6L, Ascii: "plbKTkmoJKnv4zlCt9IsROTrT4pkR0AdiU38pDjI2nlXdixf2uZW07InGOSI6E4Evn6LMqkUGuvzpeFkjIUB7OlqRdR"); yield return (Hash: 0x0614087ffd6ca8bbUL, Seed: 0x0000000000000602L, Ascii: "bsz8XLhzwmbIaM690caHhkWWxzXs8VUinQQLhQ9JfAe3lwPttXOcqf1eSngar4T3Ut6IVMWwfW43ENQneTjuuIwOWS3p"); yield return (Hash: 0x2b598e9c129c5d16UL, Seed: 0x0000000000000eeaL, Ascii: "QtnJzyD0qIHgIFuhTa95GWjzsMtz8EWYsGi5Kg5uY95A2ucHKibo8kr2ymepSYC8fKt8yivOVriciCagMB8wHORKO38o"); yield return (Hash: 0x9b8151c029009113UL, Seed: 0x0000000000000387L, Ascii: "UpXLB8btnEY2reXU3HGbjZ1viz1cyhkrVYn4BpSRwrFSesbm9uJvE3LQ3emRWt02X0eIQUAnUSA630GSrp97uWs8XIkC"); yield return (Hash: 0xdb29ddde0611246cUL, Seed: 0x0000000000000000L, Ascii: "p2ZHDFlKSGEH1FHyi8VL71p0mX6FConLxy0Jhaiy0tj6JMIWA62SxUw3jW3uluBBUtPyiyHCV7SFjFRmgTZK93VpIeWX"); yield return (Hash: 0x04f0914eed2fe118UL, Seed: 0x27d35b7ad1dbb2d9L, Ascii: "v6MgHS6LMB7OgVENx4TbtYMd1kcVwyvKNAXxsv4h7Pz67utR3mGj8hgxqFlC4jzIXPDQeJVNARK05tQ2mpUEQIqTjwM8b"); yield return (Hash: 0x2a1c3f49c55ddaccUL, Seed: 0x0000000000001da4L, Ascii: "sk5J8Df1UtxtOeUYFieEwdlc19AuNdW8wFkgFFFhAYBLHRjbQXbZjRug9jpWrwCNdo3gW6LdS5mHzyDi5UD1y2qpquCdr"); yield return (Hash: 0x46a1a4f2145641edUL, Seed: 0x0000000000000000L, Ascii: "AecznQe8iEMZeWWTmpTPQSXOWJGea9f7LtndRQ4phOtCM1PbAQip1QNIGqng8YPweeZHN0JBggBNiLe1UCTsJz1XLyhLZ"); yield return (Hash: 0xe88b880280c592c6UL, Seed: 0x0000000000001e9fL, Ascii: "yV7nZTSS6GgjMkj1npv2Z8rtqA1tOeQw7D4xyLL2lUYppZ9j42cazdHhf0kbyhpKtwYrFQ9mMcAdFwm74S2mpJAcII7FI"); yield return (Hash: 0x11cf49be976874bcUL, Seed: 0x6f88fd13e34392a1L, Ascii: "1Q2UdjUFr1gBxskQDm4Rla2CmaXbimwoMVnVqGP0MbpTIR5oor1dcTSlldIV5iP3PTwUoICH26X4gBnhg6I1t5fLIYvYOd"); yield return (Hash: 0x87670f2eab7cbef0UL, Seed: 0x0000000000000000L, Ascii: "O58pvF3a8YRtgya9zzl01iZ7QObwQNJ1Zk5FlsQmApHVXMtyugINWuw2gOzBNwMTa9CYemEDEJUqTE5bLojrHONUi6BQgr"); yield return (Hash: 0xcfe511f77cd77b5fUL, Seed: 0x0000000000001700L, Ascii: "GhtLuZMyG1XQnAyyIa7RCqT5sMQrywQfcjehPBvYWra9XHYq2l6ARUdod0Sa8FeTLSX05eiERBM23MmVdsA2OKLScV1OBx"); yield return (Hash: 0xec7c228e580274e1UL, Seed: 0x00000000000026acL, Ascii: "SZSYg617FijnkY3bDV4fXvrWGk88t78nvfURjMdp8c5HCGZMB8uVXEVYXdfqcrCofd4OF7gC4Vkr9i0tW7HwaHFl3jFPsI"); yield return (Hash: 0x17e490b092d5f12fUL, Seed: 0x0ca6fa8ccee7f53bL, Ascii: "dBaNLClzLlWyHovtJt6GhPRW0xZpaTFsHIt8dBUvezPPrGkqkgoBZ3TZ1KdgMjGCD4U9fODbDcahLmSnLgg4GDRBA90vPIh"); yield return (Hash: 0x4c04462a95dfdf58UL, Seed: 0x000000000000112eL, Ascii: "VfqlsjAkcKGLKdn3Uaw7CqBBsM97ZbBdtmCYeqtSDKSkw5F7Jsj7Hog0zQdRslNVL5jsjEYBTSJSHdQ1D9yeenW9SfvE1KP"); yield return (Hash: 0x96fd16abc09847a9UL, Seed: 0x000000000000109eL, Ascii: "2Ek7E3bnqhTtPcWwGmqBTU2SCXsfq5FPUl5huI1S0ybZi20XzG9GLjFJNa33NV3ymgwkMVZKBur8KHbEnuaHhDfbIbarc94"); yield return (Hash: 0xb72a8cd0e91edcb3UL, Seed: 0x0000000000000000L, Ascii: "Az7ehWUO16NwvRHyVdIJXEliFvTFhSnh4xxU2tZzZa1c7hlFZaS0ogKlYUSbmlGV79UGZkXNaWKFnhyNhP0n36MNWLv3gWX"); yield return (Hash: 0x1b90993abc429a56UL, Seed: 0x00000000000004d5L, Ascii: "aDsLKOX8ej6wfnhD0RZledxUxAepdUjpVTnQfWwi9fx6nOY9VzhsI33fQKusiX6FipsaiKoeAb708o8q29PgACXUnndM2BK3"); yield return (Hash: 0x586b472186a33b85UL, Seed: 0x0000000000000fc0L, Ascii: "DlXZF0c4JMLqt1lfVbCwp36tpCs2Hni4DaAiuAdXjQJLT4IfijfPusvPaOZOXujM3gPNOJCfQJloybPl4lmmVVnJABVAphzR"); yield return (Hash: 0x84f7b324e9911c2dUL, Seed: 0x0000000000002340L, Ascii: "enTD8N3YsFrowNU6lIBkYvdIOJlzAm17C88wWa8NLrWeUDwF9mASo1Wc4r7lZ5x5Hk59TaAYW5xFfFoCZeP9hEk0fUbSJCXw"); yield return (Hash: 0xc983a6024a05331bUL, Seed: 0x0000000000001d7aL, Ascii: "byZ3cRkWHTmzZYK2uWWYNI4wiCktVbi63lZWLgNzwWpOfEORLlzG6Nyqy9Bl1G3YmgwEIMbwXFXTpZ8krRkTC8NutauCE3aP"); yield return (Hash: 0x147bb10c876c3f3aUL, Seed: 0x0000000000001c7fL, Ascii: "YhKrs3ZYmrSa5VSRZGM4V8OYvXckAvoQNPtV07iCUJeKDmYOk1fNmkVLwSlBWrjslzkib2pRljteQWICxd4nR3iBhRu2SOHjE"); yield return (Hash: 0x5023f2dd584a7ef5UL, Seed: 0x0000000000000b83L, Ascii: "8xNVKxaxHKCpuyN99eRUFC7J0aUjryo19gTm0DTe3uClUzIAMQ5s3GRZtm0yYvLoMv24ZQDb5Eoe4BlX0vFfkFekryVZbnHhp"); yield return (Hash: 0x9aa4fbae84568311UL, Seed: 0x0000000000000000L, Ascii: "lEeV9huQLVCi6UVI2b97K1o5ELJHCm2sWBSUC8IVFGZavNez0OGxkIJblx2WowrsVJoL5xLAr8rLfOX6J8B3wSJaPzM3RsjrV"); yield return (Hash: 0xeb4b8246daf6b081UL, Seed: 0x00000000000009c4L, Ascii: "DIoXdkmKdPkqgmD754zIBJhvXejvnEVzCQVg3i51ShwxkvfsWK9VIkVqIROx5wpav0PyEyWWtfQ0M7pbVsLM9cOgowZQ8BR2A"); yield return (Hash: 0x1de7529838e86b6dUL, Seed: 0x00000000000014d3L, Ascii: "q1JfFrO90sN7C9FSs5fdL1jQqiQblGaKd6r4hc2exz9MSjBZ0AZi6tA7QK88Yp3lclgjP02GCS83QBhCfBeITWoA9bpz4tzDwV"); yield return (Hash: 0x45fa0d4685c2ebb0UL, Seed: 0x1b540f1754eabeb5L, Ascii: "muZJfTugpL1NztwGkqgXUcEZmNxJOEMCB7itdUP1vKp4d29NVA1SIWZAefELEt88YRZngUBsczSgCdojJfwk5b8XSkoNortOfg"); yield return (Hash: 0x99a5a51d4a282b94UL, Seed: 0x3f25c8cbbe8d8cecL, Ascii: "dJOhJRCO3QObtEcE37h7boKXSFBuyKkEVoPsU69Yy8jOJbBD8ImjW7AqvHYUtGk4FlJlTK1h2XzRgtXpIUxMUNeH9KQCeXgGIx"); yield return (Hash: 0xe78112a8b92738fcUL, Seed: 0x0000000000000351L, Ascii: "RUju8gCDfD28Gh28UsjsteaYN7c7PmnabjqBLgCvM8jzMfpFMF7OakYmtMAx9VBC7Xta4iT5Gr1sn4l0mLvhL9gEe8BMSuFFL4"); yield return (Hash: 0x0eed250fb56d235aUL, Seed: 0x0000000000001448L, Ascii: "lGWvIexcyBKiKnUMvSQzo9BceGBuAf4WmAqdgKgppmhSrvmdOdEVyxvxq7GftnfRx2HxoiPARdO3DK1bzPKMbclWs9NEM4oQB08"); yield return (Hash: 0x8381613f03281997UL, Seed: 0x0000000000000399L, Ascii: "P4cbUGRzgVYZQQVJSR9DnankJ5dWEAiQfnt8RMIfWaObfrrPTc3QU2IqL7Mp4oNtAydl0XGoFQbF2hJr3utSZclmSMieRJNGHOL"); yield return (Hash: 0xa74460383890ca93UL, Seed: 0x0000000000000000L, Ascii: "FiQri1z7OnyQOHXTum3o9AAZCz8iMWsIdADPtrIp6nHWgf0kf04CiWTdTEfhupYVt23z3UzycQzkV6rOg0uZvcK3gGA0ShYmnuR"); yield return (Hash: 0xdf4bbc8c3cb72979UL, Seed: 0x0000000000001382L, Ascii: "1MJLEsLLvs1aM8KICum2XF7Z148NFlYwPnqmoZ8SmLyqogW9SKtgI7VdK0HSQM3bHig4K5w3NXIRCd8BQ7kbW0hWkBszY9pWca3"); yield return (Hash: 0x0ee2d04e985273b6UL, Seed: 0x0000000000000b98L, Ascii: "KoKne76FGJfH1TokABK1wmFqwzJetkU6OO9umoiMoCBbnJywDbWEZF71TwAlVxp2HgXCIR5x7O9d5RRisvzHD4kwe9wal69kWFs4"); yield return (Hash: 0x8d7ab8aa221002b5UL, Seed: 0x5676131a5b81e39cL, Ascii: "vMsWYScvCxCi5txDAf4i2Abg6mnQpY4SMAxJ74eIelYZlAvN2ZzinYbCsNDcBAnFcnoR8EDsxdd2dKB78pSx6QdoejvoGNxXE7sv"); yield return (Hash: 0xda5ba3da92a42e0bUL, Seed: 0x0000000000001345L, Ascii: "xl8l6PuZIF5k8eBlRdhsvXElTOuMCRtKNSeNRdmnzYr5WSCkNsCMu31fYZkg0UImOkJmNKtaXno8rVFSpRz27aIFJbzBTJ9o7PGa"); yield return (Hash: 0xe9ab593426301e7cUL, Seed: 0x0000000000000afaL, Ascii: "CixcGldVkzXHsgO9NFfeEtr7uJAIyby5k2HTskxIkjbOL4mirmkUlcy5lrzRuhGJFpzEYfAutGqKGAYdnx9UkhApx5eDMzEYRG5b"); yield return (Hash: 0x203f2c07c44fe1ecUL, Seed: 0x0000000000000f93L, Ascii: "VJ2gEMmhpR0G2oN1nuX9wvYKu2e9cWenEgN3KQOk2Lp91TzB1T2gJTVgzH5HV3jR02rXLsVjHGCsPer4tzru56uUk3LVLsGWZ14gO"); yield return (Hash: 0x58f729f3e80eefb6UL, Seed: 0x00000000000012f6L, Ascii: "M8zzd22RD965pkcs1LVUciCYntDxLPJqlUB6S6mpCfkB2qAvrVA80oMMYHFKk8DkiKZIqJzKz48mdkZDES48Q1m3NIFRWWdqewFmL"); yield return (Hash: 0x876b3b0b29ffe55bUL, Seed: 0x000000000000191eL, Ascii: "4j4ol2DDiy5k4o1zbXj2dDJwsh4d9uL3MiWkDtwiHMrM2lDoE1HuGCG5nuL90ZTzeVvD3VMAYa1qTTFBaT8ksK0aLbyJg13zhO3VN"); yield return (Hash: 0xcbfe84163ddb8516UL, Seed: 0x000000000000118cL, Ascii: "2MCeN6Wy4zmwOjfQVMqcfO0kMtiVN3wsYBolyqurxKLHDkHkzVUfNBu7xcvxOkoIjMymYvd0O0YODxC0fB2HIqwm3JGYODHAkgkdg"); yield return (Hash: 0x3158aa5aabc9d13eUL, Seed: 0x00c8c7ed5cb31073L, Ascii: "dNpfYJyD1cl3a7bTG1S7GBtBnOFTsZgbk74LrZlcwmBP09aLuW5CeYaFHVKAAken0PyXel7YFNLPTUiz8KVgMffK2mWux6dHcqYqGh"); yield return (Hash: 0x6dbb34cdb0046dc9UL, Seed: 0x00000000000017c1L, Ascii: "dv2CvYIaluVrrg2Qpa9sUipj9yD6VmOhp21RA6XDibYrrnOFvIlIeG1IbVj1I9AGMsfQQHtXxBat3RTz33akQ1WEtimP3dp2n6l58g"); yield return (Hash: 0xa7988f23ec9413a4UL, Seed: 0x0000000000000000L, Ascii: "vRnEYJ42n6Lb8vaIhDfQQBgs15GstAYyqb1K1JKBPr4dfgjWxDxHgxThFgASYVtkNBaqnJRlSo8bLQHNbrPHj6sE4KcPwa9IrrSLPs"); yield return (Hash: 0xd9ea0490dda36fccUL, Seed: 0x13a1b6117c92c32aL, Ascii: "konuMUTcPb4YcE8rPUlrBKyQs3VyhESFAKajW61QircmO1PZSylIAsN7Rydpmixc2VAhOVoRrwjJMLFN6OynVC0eJA08YcatYivyq8"); yield return (Hash: 0x0fa2b0e5d742b210UL, Seed: 0x0000000000000000L, Ascii: "9at4zzJbKSkzZ7QzpC8XQBfTxNCKVfm4BNIQQJ3mXOVItuuthILZoLXv063v16nUkwAbZ35IhCHtDISPaaqyN3BvkduXr8A8JIKnicQ"); yield return (Hash: 0x5665847680d15edcUL, Seed: 0x00000000000018ecL, Ascii: "Tq05bClJTAUlpR1BybMz0tR8O8Qba1tK5riABfzBzw3jYJUrngZD5n0cOWax4pNn6aBFAnfATk2N20lOlJ6Pl1wnbV2LPcCG0fliz44"); yield return (Hash: 0xc32ea538ed53f799UL, Seed: 0x0000000000002702L, Ascii: "RDtQGbzGx5lMpq5BRzZS3LRw6SyG94SVcWAiAHcP8zxwKAmI7AL4styZHcFDV8wEBVbWj5i74QFitVpmXJ6qMwtpZ6X91zz6Sg7zYv4"); yield return (Hash: 0xdd71ddce940ac878UL, Seed: 0x430c6bfa730ca3acL, Ascii: "wcmuStaaAqHZT55kNk0cPMn6Ss4bfZqrNljRvHTWLdJdPpnJVp3NvumEQnyDjUk7w4XDMWZnijh7eSDRQvXBkKCb1OjmJhqJzIuzWLQ"); yield return (Hash: 0x198281582b5924a1UL, Seed: 0x0000000000000000L, Ascii: "4NV18d9gEA2fWXahWTEpIHIm2yvtgzALIxerEHBdgdw0OqLFTmh8OCws89kcUhqn76dgvTNKKO3Vez3GMjy5wfvXsR6sMbv1mQoPAv1w"); yield return (Hash: 0x38fa79cc2d2472bbUL, Seed: 0x0000000000000000L, Ascii: "NA1JBZi1MP272ObONjM8pPiSEgpjV1CKdr2cQctD2KMCKH7BwhJPubNEfOnI4UZ5gRSywtYE7VIcz35Q6ptCEHzieGQguFxtYTRM5HwH"); yield return (Hash: 0x80cb8013c3ec5cceUL, Seed: 0x000000000000012dL, Ascii: "lah5ogTyrmN1wV3Sk2RCYngrQ0eaHQHij9G7yaLSkF4ccmvBqlEPAyGJUZfnb47Ur1qKLhCnpsX7beYb9VtDTrjUmRaUWVtpEBLoOHs1"); yield return (Hash: 0xc24dfddeb995cf67UL, Seed: 0x000000000000021eL, Ascii: "c7jOJNcVq66FO6Zsa3lijt1DzXFlH9Vq6IImFxw9fILZRhoyUt4baGcO6BwB1HoPBgimCNB4mcUzTdB8IzmUPCnlds03TsT0NUx2SeMf"); yield return (Hash: 0x21134d044a9b37b3UL, Seed: 0x125e614646dae5a6L, Ascii: "VUqqX9d4m02E3ZrqFVjjYEYUQWTb5nyICzCBehfzYujhDz8enZhbuqOl6aEf6LLlmqVKT7oDLi7rgQX4ov5LMEmROFNkOTUICQ437uzUk"); yield return (Hash: 0x97171ee302edc140UL, Seed: 0x0000000000001183L, Ascii: "wEy7HTHaOEMIqhXWHC06r3D7GbWfEDtLspXQXf24nzuLegqU7fbLogdbtMwwnO9oMpVMLM2gAN0MrwNs5jNzTI9C5gEghpDXjgvb1SnB7"); yield return (Hash: 0xc802b73a20aaf6dfUL, Seed: 0x0000000000000a65L, Ascii: "BTgr0thLDUNJWUHBpLNclyIGUK3wFqtAjV5qRIA2Tis26GOpS9daJCSAmSAnNtINFXPqQyXud7Yvk0oyZMaFvLWI1h8i7FT7sHq74jLho"); yield return (Hash: 0xd19df667dd4576b1UL, Seed: 0x0000000000000000L, Ascii: "6MUY5w78z1s4HJSrSHxYbsssWba85V4dHlw4m6BIovgyRF1kcPcAcrptVplsZ1QxTsWqJcTaJluJuT10ErL3LWVbRq7E0kSiSkXuxU7yy"); yield return (Hash: 0x0820f2bd728d2e64UL, Seed: 0x0000000000001764L, Ascii: "mrcfUdgjly8Q3Hozf82396puLhdh6rPb9YR7YYehjKgzzlaacbUkCNPEl9SZJ4nyhM1F3EqkQgrFspmF1olnGhYqErbk6Td6Hjq4X7ukZP"); yield return (Hash: 0x2f4edbda49e07dbeUL, Seed: 0x000000000000115dL, Ascii: "Bem3uWWi7UrkICxMyg5QjHRfiEK2MEeLyhRi8BE6EtZFMYCJdCJ0ISICUKjaS5OPOifKFMVUE4eWQ7rJ44neh6oKSYJaweeaV9Xt5q91o7"); yield return (Hash: 0x8e35d367ff38db36UL, Seed: 0x0c82a4507bdb4368L, Ascii: "Ws5KhyfRqtoo1z2eNAWJlIafgLV3QD0D06MRISpT8eIUNLkzJ37ZhYbXS5LkAAWidw4cKrJFIT7vRy70ugveCvEDlBZxds31ZkgGDmyaHT"); yield return (Hash: 0xbeb965119996f3bcUL, Seed: 0x0000000000001610L, Ascii: "ttvDZ7Y7FO1cbhVVL4qAYBJ9gfvjTvTdk3e4nbLVKtfnINNRPZgcw9psemLB1mdE4M4rh3LzSfQ8atHh8Zrbymsyxn2yw5hzq7uvSmBKgN"); yield return (Hash: 0x04ca424534e7a326UL, Seed: 0x000000000000186cL, Ascii: "m1v6gn9c24FcnmfrDUirtQnKMbI3aVrGwks3P7mE6lUpYgEkRrlJde46plOPzqMC67JBfwvbGYNdtXSZdGEJ4RLUeG9YAfjbSXO1p2vqYHn"); yield return (Hash: 0x268f0477f332eea3UL, Seed: 0x06432474765b54a0L, Ascii: "Q4YVo8pphP5tR2lRq0hUuV5x3DU7uSUcdENYNYtb7rGVnqkrK5sNjbYawVWMDIDwMXslrl8UMM0WIXh1L1vO3uV12nwixlrfv3e8O8N0PxJ"); yield return (Hash: 0x7758c4b2b857fd99UL, Seed: 0x0000000000001648L, Ascii: "ynkXthgDExjk58lj18xS52kRMXRza6m2Ef3fI2yWa1Zsttg5jPVVrbdwO2L3JM04fGX4rBkjPnhlYiTBTMLTLk1XSgrBicNa45yPTijloTU"); yield return (Hash: 0xe213a8cf7c8ada2eUL, Seed: 0x000000000000088aL, Ascii: "Mbm2N6Ql3AcvccjzCM5JJcqPiqbJwBAJbfLpdmUtvY6GFoHGhlOoY6DABNDWmB2c8bsEIKdDlqyknbrLzqJny0MksQMv1N7tGqZrrfKx7bE"); yield return (Hash: 0x2f4b4fad3c139743UL, Seed: 0x0000000000000000L, Ascii: "ilbYweKSYLsZjZ396Qms3bqxt3uPshmTRvvHmGF4Bw2pAFbtoErKRdZTGUGh0ZNi5X0MsU8zGBVUo6JvsYMx5hnFfurjcobbaXjAgI0hk4gW"); yield return (Hash: 0x695961eb1362986cUL, Seed: 0x0000000000000537L, Ascii: "S6X5lplz4f0v4fyu9ZfZzWhDknI945mHyW4yI7lSwJRjdc5drcIqHSKQutfVpVAEBJ83uAl9X8JELAQBstSOXkYTg0nB215XYZeGv9LYmYRu"); yield return (Hash: 0xbe2cfbd93fdae242UL, Seed: 0x0000000000001514L, Ascii: "DZVFRcVzfvRveuyKN4KwzoEflsy0ejkjY1VeMsnd54920VkRdnP8sLeue0LxNPRjOqeCPdperH6wCfQiuEGXsZK1nCdc4eB193GwL40FrUUr"); yield return (Hash: 0xeedc1c01479a9084UL, Seed: 0x2aa91d47fa101199L, Ascii: "545eAVBh4b7h8aehQQEg1dLzfuxwMUWHyaIWVGcIu5BAvfPq7SKZDTvcZwuI6TyJCXQDw6U5Rj6DSHD0UOdEKfsQdnFfu4biL2sJF9PLboRZ"); yield return (Hash: 0x26936c891adfb591UL, Seed: 0x0000000000001cb4L, Ascii: "7g7zhlNtdOEzZU1fed9IlHXbHhucy1rr2SCXnDs4tqAJK8x4aOVICZnFGRkICrQp7AFVY2LnYEttVsr95qnh8Z7fzpUlvEkLOPpPXLx4y7fih"); yield return (Hash: 0x8ad761040068411fUL, Seed: 0x0000000000001a3dL, Ascii: "dxcMi9u4rCVHP33GxxszNRHc3ZrHRHfAdHCuLlNkrwNqcAHY571SEeNtywxxMLz5RRt0UDWQcUBoOoHDgHFTt60B372nKOIYgwk8lVETPJ5Nd"); yield return (Hash: 0xab6667dfb4090e8aUL, Seed: 0x0000000000000901L, Ascii: "aajuMfDbNWoyon6w0jFUp5tBkzzxJolEMVPcQLGL61OjH5IVlxLcC9c9FCXS4B8GUIRFlB0WCgHZ7frwBKSAiruI4mi2VBhmSu2KC4paVBSPj"); yield return (Hash: 0xc9cb7ea74e72235aUL, Seed: 0x27a315498513d45dL, Ascii: "HG0QpHMCdIRTDLZ9ZWWyCrbpRNPibPTr0I0Tsg9ghDLIp5thiynBVmdxOrf27XA3n6YWHWEXNgarBNXJKethif5911W8ltsfDPoHTku3soCHz"); yield return (Hash: 0x6447b5df3e24c18bUL, Seed: 0x0000000000000966L, Ascii: "7JWbki9hlTEOHarwjE9nxy9f4XEp2rdxNnm2LannA48ZYsvuc2ROx9cEMJXSmVfgiUDWCYkdRKb0G4Jati75y5u4xs9J9Mtl9c7bzFvwNm4YrF"); yield return (Hash: 0x976051f0c760a3e8UL, Seed: 0x00000000000009d5L, Ascii: "l8hv8CxLrilgAOYRQoWzTeyA7AcDE3rp8rbW00GwdrTgBHA0xr1gGdvtQhfWEvkdHrJunoHhQzl2mjTwOZWqCiQyaJqLoCFOnDIJk2ZYmOVLKt"); yield return (Hash: 0xc2e0940485878d77UL, Seed: 0x4a7ce3b9fd7be6f9L, Ascii: "jRMZhON2Jod0b5Eate6ICumrjHrrveYzKyqjlodKS8cGP4y8x7YXs688roH6JcmsCZBT6tDmteF6kCaQTqGgF7cb1O9XpknH1kqa7jV6TaHYav"); yield return (Hash: 0xe88e34640f6b5cabUL, Seed: 0x0000000000000211L, Ascii: "SemvpZAtfvyZ6eMvyWnLy7mRF77zttNn0rd1jv3lo9dEHcaCNdZsKMs2p70EtPokO0GR8gESY2wCUAiJuumvaObDz3XXABc3UKVMjHVxBA97GJ"); yield return (Hash: 0x0f1df503bffdb3c4UL, Seed: 0x00000000000025aaL, Ascii: "Zg5R4Ht8dmz3Tc5WHr1Rk2ObqEmfxFyfRW88nuLstcddmAzqMbswIDUWQkP6Fiwhp5LHE7y2q73ibaZgyILICNu00a6UARbEJjws3MtYjPGO4o1"); yield return (Hash: 0x1b0c297bcfc9285bUL, Seed: 0x0000000000001c8aL, Ascii: "uxS3iI0HXjLRuGbFQQrouJfQ9g0POnrQdxeO0Fo5Os9vpsMbrbFuuOS051HilwLGi5bIxGIvdO5qcV1omPywnSMgz1FCFhnQGcWov98gVkoWYDz"); yield return (Hash: 0x67a34a335a2c54afUL, Seed: 0x00000000000017ddL, Ascii: "5ELV3bT55nI5e39OaEHYw4tukRZRQg5wKhvGvJAV4r2GOFKpyg13UmrFVzBEfapjOsUeiY4jNFhlU8a4kKhHoxqPwl5OfyaUsxLYNPBXvewFZzD"); yield return (Hash: 0xdbeeebd50869cb06UL, Seed: 0x28575846a38e23a0L, Ascii: "TmnJlRfYqwg7y8zX4aRywJF4lhL6zdVJBUWbAXwZXhEzTgkHfd8eOehqKZ7sbwpzGIBjaAcRRGPOzXTlsudNUhFKQiPEbEy31oEjtPDkaAp4DNU"); yield return (Hash: 0x2182b49e4cc4acdeUL, Seed: 0x0000000000000000L, Ascii: "y7mSkgmgATyI6RrBQiwinhZOGEyNq4gDPtMIfauXlKv7nOgdkXo8nygfTbkiedQzxC5rYO7Q224tQdX3pHIOYa1uhjAIEfIAKu2AFIMO0zJObPZn"); yield return (Hash: 0x56fc18243147280bUL, Seed: 0x0000000000001733L, Ascii: "kvpSpqD7jHbHTlP9jZ73lSxfaFPUR06eWj9YuKOEuURLkqOEzlKRtNtlehWOqHBRvN5Ja8Ndrx65sBoHqiB0vP8vw3W9hM9FiKsRXSyVziJdMtf1"); yield return (Hash: 0x8734cae7e1cfb3f9UL, Seed: 0x000000000000117cL, Ascii: "ACvVLJN4YvbvrWlIBkloqpy0sEgxiXWyO4bkk2DdWG1sZ5fQZurYRjEIPHCRwNkMZSBoPzdSoFqyS3nMDAb5roZhCIA4LHNk4NqpywMI3eaBrqc3"); yield return (Hash: 0xebafbd7a454adbcaUL, Seed: 0x00000000000004fdL, Ascii: "JcvgEjRAnVnbr3vargAeaaBNli2QIDEWyo2jqLhB8c8vzALUYqqnkJh7dmW5fky6x8NL6hUFtAJ7kxVc8wOtlOjpZWqM8z3OWD35xmih3RW9e3PW"); yield return (Hash: 0x0a5c30fd19ef1600UL, Seed: 0x0000000000000000L, Ascii: "1osqpwzvEYMXBhwDCKUPlSjMVRW2qy8AKv6Hp9PugG0cLhwUztcjrEb506Bm6UPmS8i4icbB8xhu92MT9hff9xuLKKZg2qkEgDWm5PILwVpT9E8KJ"); yield return (Hash: 0x532a97fb1bbf9811UL, Seed: 0x0000000000001457L, Ascii: "sbkapE0QobFzNZ0QWsj1cMmPoGT7QGOUzoMDpgmwLkF9MsfnPT8GStThbxRaHsDr64pQ7vfdpDzylFP604F1aH6S2CGT51FdUKrdJ3BLMsd7B1eoJ"); yield return (Hash: 0xa246174133a90683UL, Seed: 0x1f9194b29973d7c9L, Ascii: "hf3UyHA316qMnV3ZWvZYKjmdaCgv8mNkqICISTU5S9AnuN8r68HrMrrY8nUSQ631LdpF1mfxP88I4uienZJNhaOOzfB5s20JexuxlRyLu6pUDqHRi"); yield return (Hash: 0xe473bb0b18dad561UL, Seed: 0x0000000000000000L, Ascii: "Mb1fTHyhvQNuCur14DwDIPky7QP9kdi9AUEcqJTeGbShRh1Qf2AB36QPbQe17mKzmfeNun1qisQzu2Y8YI4dlw44TFh0otAltgRHe6EKemPhRxUk5"); yield return (Hash: 0x15fabb2a978ce118UL, Seed: 0x00000000000013bcL, Ascii: "suvm9A69ZT4fDwAv8bb5qSoRq4wdLW0RQLgM6wNjzqSl3eeaIcPfk2jQy5wsyub23Vvqxp30cSxrzV1jECsTBYt9HGr7CQSssF4WtAJR1TzxsTZVBo"); yield return (Hash: 0x479c639a1553c6aeUL, Seed: 0x0000000000002688L, Ascii: "LTioJY66DooZXeELJKOZIOM94DnJS3xNqNT28mm6QofQTPIal2TtE188cOD5MxeUaMPxhnmb0MNfqybyp81ighJzODQzwH6LFlky3dObQ6ooeX6WQW"); yield return (Hash: 0x6ca0f26ae8c1d331UL, Seed: 0x7ddd0fea86fc4155L, Ascii: "PiRkx5zRiTzKmFEnS5CdpKiVR8BR7MC8SLdsJoUztXAprDJ9WSJ8i7SdEq0W6vZarlUWGux0b7eM7V7ioMGDxIDUkyYQLgJIdB2Biv9rXjbP9OT32s"); yield return (Hash: 0xe0e79bac6592c4abUL, Seed: 0x0000000000000000L, Ascii: "ez4oz0YxL2Jkn22gSC8bOB3pwGxJyTZ87OGkKQ30OgnGRIWHCFiujT7iDHczTW17niBoOg1vMMYjJWvPABRNKAE0M45PbLX2cqwmdSd4vjRKM78icV"); yield return (Hash: 0x070315afe44b9339UL, Seed: 0x150ecd8202ec6f94L, Ascii: "CdCswqltKhXEh2cz1bslQvLDyBwBg30jJf2PXuYMHrm0ttCaBhuG91QSq2pZDNMZYycOACbaBdaqm40WBoJqxKFoWGfaIkxlcY9gngw0HVjSMHLujt1"); yield return (Hash: 0x656d3c3cd61dce52UL, Seed: 0x0000000000000570L, Ascii: "J0iF4oPqTEEeQ5jwZxbBzeZtcCezbXoWuLOMdYpwA6lF3pQ4BGoKJ0aHSnwCxuWneUZFXmtM4qzCSzg4F8Cz8zncHfX8fcV36MrhxIayngvR0LzlWBH"); yield return (Hash: 0x9a69e00c1c7e12e2UL, Seed: 0x0000000000000000L, Ascii: "0Q4RacmwfaS9Z7YoJZvdV5NDXk1jWA0Dh8yj2cRQhAXYTx6MVrV65doHvtcJJ7zYqHnIXLmi3WhyrMPHpVwZyTPdtqAjw4yZ5ZDcTAxqVI0CewVB3F4"); yield return (Hash: 0xc71cd837dbc94afcUL, Seed: 0x00000000000001edL, Ascii: "JLMeBXM88Aoo6xrvTosLJdBkU6YYzKoNsopKfAdTxGq1EauEoOxSWQiJLNIvlFGgHmWaFaPNFjmLbq4OrKbD6lpk7mfTEcDVbNvji4yCzWDlkVQX0d4"); yield return (Hash: 0x089fd886d3de3b94UL, Seed: 0x16571a16bbbcecdbL, Ascii: "uKn1dndpEJ3N2bkSfnioYt447xio5E85vu2Oyx7rPqFPq6IGfu3ldNjppkfdSjaUXkAAcEYAxDNevOl6OOZoAyizIG6DPTZuAmq9kNf8m9bzxjlfDtX1"); yield return (Hash: 0x5c3022fac6b1723fUL, Seed: 0x000000000000084aL, Ascii: "lJzhKyv3xdb65vVwrdbpoS81txrDUsNRoNH5t4CgvjSLXvsrWu4iUW1LYJLZT4KldWJ34cIswprinL0ngFrcRkI3Sf1gkPSbIA1FVtctnOsPZS1y74Ov"); yield return (Hash: 0xc73232c19baa0505UL, Seed: 0x51629b40fb407cdfL, Ascii: "ZJ1nQjq9SRgzB9MRmv8D2iUazO7MYBoTqppTPl0zQLVyi24brxU1BVDrqGtQbgbOXrGNugUbqngR79vUjLnN51j9rSHWbTQt96K7cMiaRbJXzhCk3SSF"); yield return (Hash: 0xf215115b86a2819cUL, Seed: 0x0000000000000000L, Ascii: "eggHdD0JKgUjFttO86f8m4VUzNbRchbFvC5egeOyjZPtKCIjTEYiLurYBzhMs4lbDsdUolcKKmPhZ6QNb1yDgnJKzMvU7d7oPH1MK49uWnXrLap1y2De"); yield return (Hash: 0x2169ed2234514636UL, Seed: 0x00000000000012e3L, Ascii: "T08gMFR4dwi6dLgRYjNwJeXKCsMEy3MfEb5dtoKV7y2q1ABDOI9kEojlQZZ4pmD08k84F3tjZdVwEnzTdqdsddnrJWYhg80HeVCL7Xddr9J7DFyf5jX83"); yield return (Hash: 0x5b845cd3e5abdea8UL, Seed: 0x0000000000001bedL, Ascii: "gxVJPhh7jsSGrEmXquVDpC8Fyl0vZv2OLeEgiN19qmbVtnobg4ZzHLRxqcvAWF0CjvMD70MzVFI49CiXDLQ5N0lpENAA1G6ZU3tr13N7GeUCh9mDKBRuV"); yield return (Hash: 0x746a054a23fa7727UL, Seed: 0x0000000000000000L, Ascii: "j88XCe0gssrKv89sNDavDX3o8lo6PA9wi6PTYVm7wQLT5HUtVVf9rvx995f7BYPzuAwf1Vz9w8NvWTpqVWxRe8ODOTgPGc6Rm1qyHgJZ47nUfSSTeIceK"); yield return (Hash: 0xc6aad5033c672074UL, Seed: 0x1deb3f9bc2d7fab5L, Ascii: "dxT7avcylPgJJDwzume0GTP5OemkAhvVdMCryi5GOjimReS4wZfx3JjoJKhUPapov8DlmP3bRXoLdRfCvGnZk8AOwWtXcBOihM6FELk3PwQshwTnOjsoH"); yield return (Hash: 0x20574bc491f9e1baUL, Seed: 0x0000000000000000L, Ascii: "mw5M8OrwUXWPR8jYBNcyQKd74sB5OmpPdIfvG0zwbxRtJxk7Zp7mOrxI6u7Wi6H4augaat3De9MsxwEvbCXJb6OKjAalJaxh9xGgsbkf7hxRqXuWpVQJQ5"); yield return (Hash: 0x7001a8ba4d87db44UL, Seed: 0x0000000000002378L, Ascii: "D3DALUgqg5sSHA7y38PHxoPYC7ZAGba87jdK165Sf3LKhk6BdKMSBRFMIbMJ39qjDTyemqfXB4ngJ0TqvJFiWmnwHrsZaUebNgTA7Ie3kXWhQEZkyYxNAX"); yield return (Hash: 0x900091edf042be43UL, Seed: 0x0000000000002426L, Ascii: "BW3FTDpTd0ti3BlqKR9JTywoyzEaDtZ4SpUflwMoYyPNb6NNdkWjhh478Mz5zhEQColgpTfct6YwltR5aXbOkVH0WQL6JEV20eqF28QTibW4W5YaOidIdU"); yield return (Hash: 0xdd6515369691aa63UL, Seed: 0x00000000000022bdL, Ascii: "R95ufGUuwozutwJyHugFA1LD6LRebVMEYTRBCJX7F66FALs65ZctZkztFtuWHv6ZJK5F8GeAr83PJA9VH99WIDGxzpnJnrbRX6ac5BQBU5traRMmFnNmI5"); yield return (Hash: 0x06253f841c936c22UL, Seed: 0x0000000000001b08L, Ascii: "fa9PFmPkwourA0w8kgqtYOC4pzLZpmRZupeJQ3zxpqizARB9zDTxyIcaKJhzdEYDzR9D2f6sHDevG5RwSOuiw3bRRsHztjIvfBtentMUXB0FnvNr7cPfFUL"); yield return (Hash: 0x4353e7506cb4fab9UL, Seed: 0x0000000000002578L, Ascii: "nWjpSNomqnBRgLxX1XIEZOokQljYqGg47rasLRu6ik4HUDK2J33u68joIae5EKevMOWFpyEFLz0xwwWfHRk5zZOEFIhtvbRXCKVv6J1ySihD6VURmhEITAu"); yield return (Hash: 0xadbb7aff6ce1b556UL, Seed: 0x0000000000000000L, Ascii: "fEkGIcqyImaJ6a5XkoHR7hNfFBMQqwUiqDc2qVenrbXBRzDR6JlEXvHVrUQlpoUgLigNv20E5JB036PTL7P5cvke3cfffpfyRRpOZCmID4ah4wXgjqJZxDL"); yield return (Hash: 0xec5d9884752bb987UL, Seed: 0x0000000000000000L, Ascii: "h0dmpmYdBfkDgzSMVwwgbFHztjHm3LAtmzplqJBWiyIEmvAQmDp3yOWe4r0yk3La9oQQObEurfUwjHD17jBhFh9wYdgk0K4FSzVztfUA59vPvkYMMCedcxj"); yield return (Hash: 0x1eb0fa46371b9e7aUL, Seed: 0x6ef0b80e82afb6e6L, Ascii: "DYZbrjzRA49CJxbgbtMGholC08uAZwMx80APLGsHyAeWg4we170Y9bbvQ9ZJaOyoHMZ8Cm9npmac2moX7477HmhbSFJ9SGwrZwzM8XNFri7pW32jeiC7r0QE"); yield return (Hash: 0x5049994dd302ba9dUL, Seed: 0x22b9503c0be28addL, Ascii: "a7WZkZdJNAo8YoZSEPykILtVSKnmofkQDPKbmn3z7KV3WCRnBLY1nMzIUcmYhc9y694NwkqEfcB6gYgxWSmIVhcnb6ajl3xuWaSi4a5NTTfVXb1MJ2ZNTZOX"); yield return (Hash: 0x944be9d4a6bba0ecUL, Seed: 0x25d77c238fae0965L, Ascii: "ZVMmHy9A0KeocuovOZk1Tcdra0LYFTahBKJp1ZqBKz4S5ud0bp5SfWiFSFjU49wMYNxklCwpsqN404V3qQIhoxwPcAzk8p9Pc5LS976t0t0OaIFyVeMMD23K"); yield return (Hash: 0xb9695ac6326a8ad9UL, Seed: 0x0000000000000000L, Ascii: "Yb5xDwVr49RumOz0TTNCo9UI4g9beuUiNAXdOgtnt2Ac4e0uSPeLDb0jDz0E7shdlBaNXYQqxhk8mXuDCp2TFdFu9sAidqgx3fzFg0lV6XTxiw7quTxq4YqQ"); yield return (Hash: 0x039f6923e00d8ea0UL, Seed: 0x0000000000000000L, Ascii: "2dM2EworvyZsPrddBQeV1Fy4nglGaNmb3AMx5XXdtB7JKMvWJ5FkmQK9TX5nZSsaOJ4ejodmbcXS3ouItsJyEgJDCVFye1Hsbmc9PlIvDvMMIUtM2K6tOY8Bb"); yield return (Hash: 0x313a951ea288cd74UL, Seed: 0x0000000000002500L, Ascii: "SDHTckez9eTizt2778eK2avXdb8ZPXTB2DUd5TxKqmjMTIGtGI7BF2p0JlnIWYsqzd3xn8JhpmnT2oWxWy3U2bw8NbE4aHp3vBPGaaUm2xpV6yaVsTTxuKfmk"); yield return (Hash: 0x940d618d2de4b77aUL, Seed: 0x0000000000001d58L, Ascii: "efKBPphMEfx7NKuSPiEvxsNMBR4k9ehqo2YR8HgCAK1ZMAacELKQnjr4zniqLfauvLkV3M4eYK0hWd6ITDIxCjbOkTpvNz9f4L4tjzNCP5oW8hjrZwA9PtLFk"); yield return (Hash: 0xc0a675e47892aae1UL, Seed: 0x0000000000000000L, Ascii: "LB1wzaDyYNckrwL8ZqlTzqvwYKpK1L2Su5GwqGTyE895mzsFsPmetCadr9gXd3I7eZNzqR25oMnERLrMjSTmKYxRcLDLlFwSUeE3nN1Mxh6jOSdHlpASZKhDK"); yield return (Hash: 0x3b021c66d1cef83cUL, Seed: 0x0000000000000000L, Ascii: "to0CMhNGgBNfmXsMx0db0UgVSfhwPn8kCuHbC05UOU9Pir7fwTkNS2D0WUBkk8TtlnRd4kPQa5HbAtE3sSeBYv6gOZnCfBSmzQBe84nYQLz0npj8C8P87CFnvi"); yield return (Hash: 0x4d206fb9c95585feUL, Seed: 0x00000000000008d2L, Ascii: "Syjto1ID4pcwx4rmLfn0nL8tFwb5rRudN4fG6PsCLp7viesuyYUFXdtC9M3QXPHz2vLhm3OboqIczqjl77PxRrc36whJ5xOvi3pepo3yZwGgjhGmlqdtBm43vv"); yield return (Hash: 0xaf66d3c74e3ced25UL, Seed: 0x0000000000000220L, Ascii: "6q6JUmGZeVs2S88i0qKiyOOqEEIm5bAJbVshthBolDkLtalZVll1O5ZT2iogZoCZkjJm5pEGaL2OCqP3hTXNznY7d1YW4jPAR6A5R50JnqPQC6it7yDl0B7rxg"); yield return (Hash: 0xf114025e07dc50f8UL, Seed: 0x0000000000000000L, Ascii: "eZH1fd8pO6EDmo0o1Bmuwt22D1fZvYqLhx7PztSU5IE8HWDK7tBAijYG1gBt07Uk3AJ71WkUEkormEdLK02RsY7MYNAeM3xJatJcohbylxgaT2hGKJ4Qw16Kux"); yield return (Hash: 0x16d0fc484a5c1535UL, Seed: 0x119cc06277f49604L, Ascii: "4bUBTIsAjWzJoPYajd4sb71W9lF2zlcR1pNclTQJ9QGUQUcvLan3btn4FYEbpIJJ9tUdGC5ieQyzsuVMu51Ic76bdpkBSzPsJGPFlRUACXs6Ej3McXc7k7aJZv8"); yield return (Hash: 0x7d63a2fb19195e0cUL, Seed: 0x0000000000001df1L, Ascii: "n2vm68ZfMpgFzBAwg5IJdnWppUe8y1rjtQ9j5QPAhAhqg0JviKLmq89E8GzYL7Sa23lwPgGXLfC21obN8cSKoobNMEfXlFKsxvrmfazgAKio47bLpjLp9KugkD8"); yield return (Hash: 0xb852fc7deb1c54d6UL, Seed: 0x00000000000000feL, Ascii: "BPPIpwzff9njaLQhRKebBeLCJ6O3kpXA7K72KBYDERPNrhDpDXxk1a1O9f74cjxoEftOh98wFT750ZOhhBq1zlRUUDKHYofmUWzAXlpUaHLNbHo2EnQvW5xOhz0"); yield return (Hash: 0xce474266f5ef119eUL, Seed: 0x0000000000001befL, Ascii: "9PSFC6Dtq23t1AXLeyaTEXkBbXRT8haIPej07DlsEFFisvp6Bkx9lK0nNeWGF56y8Zl9XmTIyF1hOQ2wFBAW4hEvL9bjGLbznPxmxVxi5AGOK4DwB4oCpYgnXY9"); yield return (Hash: 0x2684d72747653e0fUL, Seed: 0x000000000000195bL, Ascii: "11rvPCNSxDfVupdWAD4cGbgX5aTY4vtgtY0pgZAoKDL4GNXtidM2QOIfRSQbGriGyYyce6HEb0kqrXU3CAjBKlkz995WXc3iCidZQGDCGtJMvlxpaCYYOao106UU"); yield return (Hash: 0x53bc12d6425296cdUL, Seed: 0x0000000000000000L, Ascii: "kh5Yj9RxyD2LupLfmbE2ohuldqEEqIZaQ1brSKZcDPuh7OFGA6rOVS78CwPyPKh1EB2U0JZpkiqXXRoZQX1y6nGQZBgXj6FlF7cSJEE58TuRv47ECFvlKwioRN2N"); yield return (Hash: 0xa346225053b32166UL, Seed: 0x0000000000000c7aL, Ascii: "sy8HXdhWMyH6zELpNiBlFOVKcoisLkAwK3Vs2wMsvIihYwKCdrgP1SLYQ9VcTr9qjPdJllZ7KwDG7AzW1i6d4eUHlNhNHaCTqD4DqzMCnL4g4ObPAEFNMu5hES2F"); yield return (Hash: 0xed5cd1edd318fbfaUL, Seed: 0x6e791466d1b71ecfL, Ascii: "GVbT6QpqMbG6CD5PkyXhhgb2pj38HYJ3leVQhwRkuGuBjtGpBxKmLTfDCUZ4UcUPvR8pGW5ARTcYVWKqklFQ5R0pK0gDsLCurNBeeH8DPJmpK1XwZwRbL075ICfP"); yield return (Hash: 0x118e487babcd3c43UL, Seed: 0x0000000000002009L, Ascii: "ID04vto7CdUYgg14K0WbVzHmCas3lw1adGRN4UWp6llYwReFUI0xjOyOU4Nuf5r3iGuOWcmj0R8njVApDh0Xyn0s9af7yWRwBP06UsJOAFpSIaXjuGt9axkZX5ZFt"); yield return (Hash: 0x4ad8032784ffc76bUL, Seed: 0x00000000000016adL, Ascii: "yicaI21xPFetRXBMXg048VnQ2B4ojMHQka58NDzE4PTKkmaOf0D2yGOb5kxbSLgqD7FBJCNPhXaUn04kcZOpJjgWLKhKkE93SeOgMq08038CrWlOAXCOBGbam69SF"); yield return (Hash: 0xc064076bb8f8a040UL, Seed: 0x000000000000110dL, Ascii: "aN36fVjiCSVWe4rhyn40Yn9uHRo6sfVNJCKz6vDLX41mdZg4H0LbCerAxI189qQGElgXzLEFO1uaUFT7OIhxmPO8v8XiH3eSk0nCHrzVHuBOwr4dNje4Zvd8IAPLv"); yield return (Hash: 0xddd54ec70c170e9eUL, Seed: 0x00000000000011f1L, Ascii: "WSObRIFudcaaiIma8jovld92hz8yf1isyIefqjV1DPWsdb2Mb0sbyBCXIciTdRMbMXdO6CTF7jjPhZ83qqLRngpWv5l2Yqm1Owy3EqVFgktelIxnDnoTVho9NGOD1"); yield return (Hash: 0x02b411cd8cba3576UL, Seed: 0x000000000000213bL, Ascii: "jDPUahItRlZneDoujRspI55yhCATOZbRMzp0sZwmMshcE84vugA4inws20JIeWSZSYcPqGNvwGqa6Ygzv6sZYS6eMEOwtLKuz93nb48uBhay2aWtMPdNuRxmzZaUBu"); yield return (Hash: 0x3e8265b2a8811811UL, Seed: 0x0000000000000000L, Ascii: "kuVv7vsS9fsPOCZgTVeeYMJAumM3XuGdLwd13XhqOgNqGeLpcdgugmwtNyijl41CtQROLCx8to8nzvocNUeATjUfu3puYiZxyHmSsupADY8iQbMtpKUCAL5dm88WML"); yield return (Hash: 0x5e366ac827714c6bUL, Seed: 0x7541e104150588ddL, Ascii: "7mJOM91tJRrFgnTzxpXD3A1fRWj9unBPhs60v2F6FqWB57sUWFJc7N6UG0WKnVVfVuWVD3L28GwguQMi1Fvw1GtoZToXiTsvpcnRqFeTVNp5eSrYHMHHBiF54qoCD6"); yield return (Hash: 0xcf4558b5b9858a68UL, Seed: 0x0000000000001f1bL, Ascii: "yYEfhCPqNBZFil1tkG12vU3882dn9YL8HiAlvwmM80K6OVUWveM9MNBM0Nkgp3RfsXSR6Tz9V6vCnXwjrabwJ6xGPJTqz2ApkoJWN6cs1jKp4y2m0RoR15LsSLupUp"); yield return (Hash: 0x1c42e0158e79ecb7UL, Seed: 0x0000000000001fbcL, Ascii: "jbLVx0sDosYXshOWv1Qh0mQTfxenkKM0puoQSTg0Y0ur3UzB846mgGj6dqIG5pgMCs30I1VYYDTBMfuBQ9JejRkvcKQ33lDDtOQDQRJjNm6GcnFhXAhoCK4PVAdIWy4"); yield return (Hash: 0x5c288ccb7aa33f7dUL, Seed: 0x282bbf957aa4124bL, Ascii: "Iii5uebDxGwxHV6VURGxShQkPPcBfZgJTT1L2hQuoGyNfhmSm8oVPKce9APyZdnRuDpcjfmhyIgbCxEbxgxyl6HH2BXdGxTzJaCGsJGeiBquN6aahfkaE5xItLcMLds"); yield return (Hash: 0xaea9827ac3258ad4UL, Seed: 0x0000000000001da5L, Ascii: "1J8qWDXA1bTBa0zp81ZCm0gAG4OvOGKlK3sHCmDCBNJvE45oYhnw9uVI54Kqz5OazJIHpqSvMQ3UnQccSyjszKe9olSUukOEEzS6NOHQreuuDseYzQApdf2rkV2M0LZ"); yield return (Hash: 0xddc8f4ef4e76abb2UL, Seed: 0x4e0078473dd91e60L, Ascii: "vJ75E3w5rzh5rpH7GP83uzRRIkx0mFuBOUjDnQfsXcjHIc4FVId4CjFRBXMtNDW3K6iNwgM9kWapyxMQj5WXfOk9zcxpANSdizfvliKn9J9c4L1jdiFL5pZeNkmHkXp"); yield return (Hash: 0x194fc2536870f29dUL, Seed: 0x00000000000024dfL, Ascii: "60vnJXQlyQfa1Ab3P5PHfLbq3uN7ZJ3lN7Wr1jEFweUHKIBbQbvmfoRtxFlEpkJF3BSX05Mcw0s4acFNBeiScjKyd91eICkXmCbqN0jME8gyu73qBUN5lvP3mLMDY7W2"); yield return (Hash: 0x43ff546888da9cb1UL, Seed: 0x414a0e4285faeb0bL, Ascii: "0oXm4Ua8BSFugTc0jjJP7qqgKqqmAM5pjKx0fH1lsN5JOoUWwlSkpjiXDpWUWcakDbLN5HnomU7pfKLfGu4jVZCOdLs8IhkCm6KtidMd6VpvE3rveNgput5Wl15SnJxG"); yield return (Hash: 0x934cb865922a035cUL, Seed: 0x000000000000258dL, Ascii: "rDbjGANGnoqP1OyE1jS2Nh9u2jCe3I2aylK9AxrwWrX9eWeZktCCM1zHEWZyy3nkayGTMlZYrPUz3BV8aXmzH08XVJq9CONAa3gGInx8ul2oukX7gMVzn6HIktSVlrnf"); yield return (Hash: 0xcc9b79209b2d8a92UL, Seed: 0x0000000000000719L, Ascii: "Vb9DqE75q7FoDNwXC5z7JXv8MClHWVlP46ZM2DEpcnESepjjCoPc3A0SB3sdD5Qf5WFVZZD5eMK3d72wIatzLikDYdAkjGB2TBYELWnh9sbn1Ei9neg1wTkMj3CGM1a7"); yield return (Hash: 0xe822ad7ac402f592UL, Seed: 0x0000000000001b1dL, Ascii: "uqMPHc9Ks7bAPG6zdpkbSjcqkVXzOGBSyBXTvbzQlpdQ6Zv362rdkRlzBIbV7nPyLOGutx6Q4YD2wksGcsC6GapRBMT5QOQq3Vt6NkobpxENMG3anX1cChirvogNtnej8"); yield return (Hash: 0x66cc88026dacc728UL, Seed: 0x54cca3d4fa3790bcL, Ascii: "9MR7gE7doHNszhTm9YvMpUSOYiQL98mr6xXzYLVVDxzFT0jG5Xpy0n52wk62MwX6uIOY7NzoZzJrQeoyUPOX0qrfYSCiSgDmgs62yJkZLPKYHW671T9JHEzKtyZ08l9Ev3"); yield return (Hash: 0xfd29abbe7517e39aUL, Seed: 0x0000000000000000L, Ascii: "U4MVPYsUfMzMZLh1554Kp8ro4m0CYRTG581ZSciQVu4pkps8pL3mrGW11rBxqWq1QAG2IjmYMpj3jYhIbFFNT8Ni0rIgGBtk8R6cS35Dy4NIlzPZZ3VeSNka3YbQH2JsQI"); yield return (Hash: 0x4faff7a0824403bcUL, Seed: 0x0000000000000000L, Ascii: "9nN4HswXHi16IpInViwg08zARLQWPteDT7PGZ8rEm7jAxT6m1tjIfbOQWy3hBtg6QXGFpj0qKjUvdEmeGgN12hrI5eZMxQTZsbTIPpo1iNxkawtpeQFj8y7gfSgz1vZPPwP"); yield return (Hash: 0x8c80de8f83b49475UL, Seed: 0x00000000000003eeL, Ascii: "OG3H6jQJUMEKuS6ScLLdUEKaOl7CAKC7wRrzyvFQJPl5kSTYtFzycrybLpLwRoQ3LSPEHWQtvnVA8vDoSaAc7qEo4CO4e1FvQ3gmAQps2FtPq8GG9q95S30uCHJwVuUSaiW"); yield return (Hash: 0xb3bccbbb76cca1c6UL, Seed: 0x0000000000000000L, Ascii: "gPdhSSq4nip27S7b4skjCs3Rvu7oKnzUY5IIpMEDYomFC7QhpRlRqBEJcllvmhtsSBZHe9T7VktR4zRpilfa9DSj4EiyDrBpEX2eYqAAuzvgh9XAZ1S8L09Ua6YyddvEocO"); yield return (Hash: 0xe75ecdac1ebfb1f9UL, Seed: 0x00000000000020daL, Ascii: "jmiaRf4pl6y5mvJCawW9V8coo1w5P47Z7kLL6SqTnnX87gEAZA6V4lBmVyMxZmGHI19aFVCOXTvimQjpgyMZ0sKriuhdbO0IwR7pjln2RfZwOExrNAzcCiEHnEPKzMt7yQ2"); yield return (Hash: 0x230053106e20bcdeUL, Seed: 0x00000000000011fcL, Ascii: "3NRVB5oUvOnIHozic5qU9QUQn9tGPz3F3A7ziKLusgsABEx3Q0UbnUjoiSURpumSCdjksxSE2Xbu4v5LRLsimqYSivFcmgia9j006UtTeANVrqZHo0PvwhI7wHfCZUM3fasY"); yield return (Hash: 0x58249eb0c54fefecUL, Seed: 0x0000000000000000L, Ascii: "16U0mZVdknAxLjDYnszfD6Wl5VJaS1hq3e3riTqyHibOSueGwXi4Chv3cdlyeUOUjpHTjRrSa7akVQM7VzQ6I8waMVpt4ndYDyiwx9Wqivsec3qQak9h8EawBbKVpA1LIYvk"); yield return (Hash: 0xda3ea0cbe6c1c178UL, Seed: 0x1f8d4a4ce16cd022L, Ascii: "WfPOMwQe8Yc0pW4Lzvijp4M6ySmHzteHVAgeTq01IMD8kyEZQPLq9tEmuiHM6WHDSf8ML9IVorqTQgFhAaiUXal72dEREUa1WWeusot7i3OMr3NOnyXc4itXjGC3Rbrtlzie"); yield return (Hash: 0xff66b2d6a253944cUL, Seed: 0x0000000000000000L, Ascii: "pkEpdDVhUfUMS3ASIvA5FAgWcJaf7hn2j5lNpjwJKRDSTSkKK2g80S7TbtqYgcdK9FNcCCaSI5uAT2JIDyIx3S1X4DgcEg7A9FO3zVrLwrh8hqQrS1xB7yIIqelfKBSTNg6a"); yield return (Hash: 0x1e850a9309f1a52cUL, Seed: 0x0000000000000c61L, Ascii: "8qgkEfNDcw0Fe4YA4JxGVZetLthMJ3OpR2xIZITaPR4F0nZW1xLvEGu4Ast6RMP8d9NY17Y85sqIuLI7QPSx7mj8ZwvJDcTMVlhuja6sJFwY4lwYMkrdiUyrzCt8ABJNohxWO"); yield return (Hash: 0x6f677f24fa799336UL, Seed: 0x0000000000001769L, Ascii: "F5cSZPLTlGxNoHDCfRYxxHfRjZobExObDlBdY6XgfUlQn41Ep9I6469ErOlgDAOxLknh7SbJeHWzMWRlNjdDQABmquDPPvunf3bmiTXwBojvDQheknbkqTJq5enJ5MDwkUdhs"); yield return (Hash: 0x97685500530ef660UL, Seed: 0x000000000000135fL, Ascii: "H1V6q9I6hIdiK5yGBsBSGLkKMGpcvTOUeKj1W0qHLgG8liwikP0EPL4R83BM199VTrIafmXA28fDpQQnMlQyMGEpDHXChYkAXjEKiz5xiRHAJoELpjOMA0VSqUZ4LyzSx3DWM"); yield return (Hash: 0xf27d88b6780748ecUL, Seed: 0x000000000000103eL, Ascii: "M0Vir8hbKd9ycWn7Ex9YTPSdN2jUxe8Od7R5FzVv1BCTIw5kM3lTkrE91oPc8DHQ2ze7Rdv1r2PGJaV9gqvcCSfDwA5vbEciCLEOqwFkClzNHKUtzDxlFHPjjqpkX7j8Gd9g3"); yield return (Hash: 0x22405845ffbf3445UL, Seed: 0x00000000000022f4L, Ascii: "UyI3ZMRVJ6IdKKyaO0hTImJM80Z3w66JktmiQ4YOAxEaSzoRibkmoZHAX2LyupgOWmoTol8ZXffaghlN1D967JKQlnZW1KzxzrbXBW13b6LiBQbCtC45hHBzhBHNJH96egKqH6"); yield return (Hash: 0x6757efbdf5998abaUL, Seed: 0x0000000000001a3eL, Ascii: "B0yiozgg7CMWHU3rQc8u87BRSB77mmFfo5dRJfnPLU1hCdrZtfFptYIlBv5mcDJRXfJ7YxnpSq6reI6oWnJoSi8kHIFOyiqePaS9auXA2KkD5XZMHVRae72F0fPdIXRAh6qmAc"); yield return (Hash: 0xbba337148f53a438UL, Seed: 0x0000000000002551L, Ascii: "rXNLAbMWlaSEJtHZg7KcdKwVhN0tirSYXfSH6LtsZ8X2aBKHLC5KkJCQuTDKJIym3AW4Fy0LqUVbyoPo0EF2xfh8pVwG4h0bSgKCfAIduI8A9D45Fm8WMuV5wd8uR4DomM1Tvf"); yield return (Hash: 0xe3ed43e158c8cfd7UL, Seed: 0x0000000000000000L, Ascii: "O9SUvMx6NYYU1i9iKK3dVYwU4mOB6tsBAOzlBgv1nObsPf91OVQoYHXLiZTIYELA8uJKhbgcKKGJ7OWqJ5Pf43dkpTQZoi1QpC7OAfGtFuqeiHT87LKnsv6w4YzI8aj0a7pDZ9"); yield return (Hash: 0x2e0f4567991ad4f8UL, Seed: 0x0000000000000000L, Ascii: "k9qB2FUXd3TaZuIivj58Wshydm0OfxdJZu6llqoWjEu6et1ObBscfKjQ1axmf69Yu9Xn3n1D5L8fNCuMBWWijGRIk0qLKgnJ0r5MCRIlmPm6nXSYh4ucLASRjENHZwqyWW5K2cI"); yield return (Hash: 0x93bf789de9bbae68UL, Seed: 0x00000000000000b2L, Ascii: "Hoi7QDtELUdDFqVnamEQAh3BFz37L2U96Yc9bVQMjHtzpGRiqCS8P4vM5UyCQYPDgaR6xcLfHzpEDwx2NLmEuVqTBXyBRfn2rRPoViuh0yanJpbbugRhXsTkdfUBV7WrVkodMc9"); yield return (Hash: 0xb8197fda5febb203UL, Seed: 0x0000000000000ad0L, Ascii: "HYpEYSzz4djNcmGn816C9VFfbbb5IWjxRxtp1oBSgRymSEOosG2d8UbqsNakdoBuNecS5TXW9XjebX8h0gXNhEmhakMttmLerjQog2Yhf8uPYUqhb5YRnN57pNW3voiA3Gl8hGy"); yield return (Hash: 0xff09b44d4f2ac75cUL, Seed: 0x0000000000001cafL, Ascii: "J0O182AfCRPaOO51XlQaRktTQvkFW8ASaYAmqIuz7tjQ1ViWtk1NAuUQwTL0k51Ph9YmTj7nF6MPoBnryzfTUN9OCbcYCKUm98cBvjhJXZOPTJt4h3fCkSJ1EClyMAwVyQRRoZY"); yield return (Hash: 0x3ae5d2dc4e5a938eUL, Seed: 0x0000000000000bbeL, Ascii: "OdsE4rVr8LKy8AXhYgzQYwIU7F70FGaFY3SZwNYnkgQW2iW9d220JUIiYTfkG3MWdzfBsdTAggmH8yZwAyKaF3Zl5gLHm8ajax9s0twPFEcHgrGpTQmtqdXtetop1vEE1ysDxm9x"); yield return (Hash: 0x783d8cfb736d8f64UL, Seed: 0x0000000000000000L, Ascii: "83rTxhOPcDzcCyO5EoZkbc0NErhb4mWZ1NC98aK1AbC5bisvsmDfQQAWAmHCkb76jwFRTKuorGmugdrUyO9VMLMpIn6XY2V9Rr7VY3kShTTd2QpUgJxcigy3AAZ6uaXt2cNT1gcH"); yield return (Hash: 0xb7c67c715c66e415UL, Seed: 0x0000000000000000L, Ascii: "0bvwRn5eaAx7Yd4fv9ZAw1IuwIpO9eQescxy3S784602dan9jmjKfqRwTiYF6vhkGjN3w0JPlxlyiyrY4julxexONinlGVLqsH92m5e3wxXEPMjmlozY5Ru7ecuZn1TWTBgipcGm"); yield return (Hash: 0xfae06beb0933ee42UL, Seed: 0x0000000000000000L, Ascii: "Zj8ZXsJcjfcOKSvGAu53hSYTLXBxgAft3WIWmhYGti15rzRDaXmWYIwsgZxTdGQX4nktfzfP02kb6s0FxnAJCWN9pLRwZicDjHhrur3trefUjRROE3HQ5tI6ALMXiz5PHXjjC3W8"); yield return (Hash: 0x5c6816040ce09bb3UL, Seed: 0x0000000000002089L, Ascii: "nqlcFmZYVA2UnbzyUj25rR20uy9XRUYMIn25uF8ld2HkKHrzTZpHwVuLcieb8bTsIRMBTyZ0D7uDLf1JCde2GN2QAcX7aKMMyPakmaRKnRGMzVVEvwc2edrvLmty79vGMu2jAZFtE"); yield return (Hash: 0x90d185c99ceaec17UL, Seed: 0x0000000000002118L, Ascii: "50eWLaSIzVFSAE1y2jxPu4pXhbUn5fbrZ2ISzjeWXClpH7pYI3fbYbZ2fWLkKt4LbAUtQ91o0B3oJGAQdIXlvcB0zao8KNRcThuSfT135gRNdukfDjmpINltxRSafuoxDRHIgKfS5"); yield return (Hash: 0xb75b787b0828666bUL, Seed: 0x0000000000001fd2L, Ascii: "XAdZWNfdjveSGCbiQoUzRIVRpTRw38a4si2uK1ujrUi8x9XOLgn0EIMDdTTnPYGyT6YCID6jjIiuaj1ljvEG1POgWmcTXpISyIU7fv5deBztXiicZDbL61NcH6ktStaLByZI9MDCW"); yield return (Hash: 0xf534d76a19240f9bUL, Seed: 0x0000000000000000L, Ascii: "QHuDIZ23SZ00UrLu1Augid9QqPRPW3YF2yNX2Jb1bWwmRJnaGnD8W36z2g2u7EeU0oynrKLT1S6zAL1v9MgqbdfDOdPJpABxGz5UIXkf5YJCbMLD8u7ifiFipSTmkw2cqhBnBcbSP"); yield return (Hash: 0x8d8817b3704e9810UL, Seed: 0x000000000000065aL, Ascii: "vTJfi86OzxCEBZIgdnuoNwRsN5myyrktrH6CmxCNnqidWYYqIqOTrWPT8A8vXkqExoex7mJu7xfvG8FIHLVExk8pmqsD9CWx7jOvQm9OS3wsoIAeOyRrQ3zeRBKKLbXwgw5Sv6O8EK"); yield return (Hash: 0xa960192dacf06dd5UL, Seed: 0x00000000000025c9L, Ascii: "aeR4Ikfbab1jcP3xOZKbQncSKqTteyRRI47ndwQ2lAVlKXe6T9qrjQMTOMNHl5Z2TpVexHZfxk3TGOmK6c08EmCk2KhJ7Hbk6MR4pzvfGh0jba7cKKQ4FjzFKUgoGkTLEIUCpjRRDZ"); yield return (Hash: 0xc5217d1597dc3935UL, Seed: 0x1b913e9ede6d5cc2L, Ascii: "7Y8uKD0vmUdO5BNaHvDCBZfJv47KNbDIRWnmPgGYUh50RzTkEqoe1eBr9vauaV16bvZcusbjs5ruqQ5xQDNIEU1UG4Nu2BTA2e9D8TxrtXH6zjDxiRTtY6K2bHhWG0xKA634jTqxvr"); yield return (Hash: 0xffbc2f29019360b4UL, Seed: 0x0000000000002128L, Ascii: "FS4Q7RAFeTyOz5nyYF9WRtUsrhKcslqBwdSIowySyxNxIeJRd2PIiDKGF2MUGOvoHx4FpA44kcxRJeVzfjUOjKDR8OiUjGZlVpFBYrCB6OTDPnuGhFkba0innKsQF5ZgjEvlX49EJI"); yield return (Hash: 0x5374de0d540ded85UL, Seed: 0x57fb342f893572acL, Ascii: "LABT9OF4MVWIPO2nxE6RYLjq5svbYkH9KLUDI8kpKb6CItxG73SCMAPRSk64Geyc8tHDMjwkWkyNiT8idQ82r8nL7It228YlhePGw8jkuxChsnNFmsDGDgy7xAjMgO04XrEhPBjpAdy"); yield return (Hash: 0x95b461c4a3090d64UL, Seed: 0x0000000000000236L, Ascii: "oYxflnPgurDiUW6nnQnZGDzw3CC3WUNWlhLbHgpZJm76oTBJlqTUrcMomp5MAfjTaUTlREu8DUL2wjtl4gp0ZlZ0sRHEEAqFTgZOyKe90kZ1NIIzCRQO0QTaTMNaP7bipyIA7Yz8cv1"); yield return (Hash: 0xadd4602b3cf2442aUL, Seed: 0x5aeb29b2d48b91eaL, Ascii: "i08q4MC0QpQ92tpeqTUgtf0V4NMrgf6Ui6XryC2zNrNSuQN6edxj9d74OnnwiZO5cZCLwAKKz3Mupafzka1DxhoCD5huf1OV63JlJogojViYyXKo0CPPKbjGCOw84rHRaG4x77QNHOU"); yield return (Hash: 0xcb8085a0caa23cffUL, Seed: 0x0000000000001bd1L, Ascii: "0c8W21X9nZ6HEZBDWIPFCvaCKLR0ExjIsMprL61MqO4GLJ4DSxcA5IhNKRgIHS33BCVWMISftY9fImhGe6wduMTEKXSHITqMx94CKxuFDm8psPe2qdA317K52dMZYPQcGWIMI9ZQur2"); yield return (Hash: 0x282b8e5ae8a71370UL, Seed: 0x000000000000219eL, Ascii: "RQncXAONa98LllMBK9qAt9ms19zNIVMrJrVcuOhcokwFmyMF0geyJeUZkVMmhbzbzujQPC4kNcwN1Vdt70KzagMvhIT7wSOHBMu1NUGIaBZXqxyE0EDaocrK44y2uOxkHz3bbFbFWyLy"); yield return (Hash: 0x4f071e66c1f36511UL, Seed: 0x76c7dd87ed6bae92L, Ascii: "koRmL1gHtX7WUX86WV2fnTtWrlLUw2KrMkTcsCtpiacCPsSqnPMlP8e3IB6LZf2AGSRYJ30GrfwdM03KPCnsDwGxd6xkIGAeiQhbQl3zqk1NhebSmfAdBi67SVOyWBD1HknGEd80zPtN"); yield return (Hash: 0xb3b161b08af5e61fUL, Seed: 0x0000000000000000L, Ascii: "6U3RW7QvEd28xpKj5AXhaxt9SzNlaAfen6667b9wnCig729J3UnOKoYaSRi2f14aXDEQpYTgdsXE7zBm0yKb0QfpbSX0n1TLlFFnTU32ebIUmdWFQDX9i8k8r3PMBY4SXsmByI5xnP2Q"); yield return (Hash: 0xede55e4601310dc6UL, Seed: 0x1b03d5aeaa9f87dfL, Ascii: "cJz36xeOEDL4lWkNyVDoVB3xg8W4rbZ6pgnDpecDuUQhsy0GwIufGOz2g5QkMhoMyv4wjkSOI1h6TmnD6840w54weVTGJJAto3j4lY2KcyNiftl5NKVVh3bpLeHUlTSTs0vUYELw0t1a"); yield return (Hash: 0x647c88fb4c0629f3UL, Seed: 0x0000000000001122L, Ascii: "LRr0gGIKPbSYSzJ6dkhAawEUcaexhjB3mRmOdqleUevzPNqBJaaXnhh0D9tnvwaKYLnbK7IYfElrPVlvIbbZK5yPtHfMxkmis1yfBmiu7xml6sNmZt5CisV1RjEl9gjj1Vx9zhsh66pNT"); yield return (Hash: 0x8b4e610e47622cbbUL, Seed: 0x000000000000266bL, Ascii: "INqvwfmkN70mrx1CLzDvgyLMaIDeqAt3rKqLp9j0dKfPfyUenN0fHVC7axbd85i9CRcuN81ENMlTlA4pdM1Z0EJBEi11drzCAr1Qaw2CMQhvJCmft35NVMoBfn6dBnx9RZP2zqdW1ZK8r"); yield return (Hash: 0xb164055cee652a92UL, Seed: 0x0000000000001827L, Ascii: "ueBA0AtMdwP2kkOh9BHBYJnFQ8UjWieCTRMmkRbNVM0Cs8wpAWEKF8U5w35K09tyHkvH8SAAYiOJbJxDbf6mKWmT34WWpon65Ps0wSj0fc3hb7ArItHHh0yEV0orcwXTvCCSBgIUf9WPF"); yield return (Hash: 0xf2d81cfb40f7f773UL, Seed: 0x0000000000001e98L, Ascii: "XrQz5QVeOXyGV4REu5ZBI1qeHiYFoZYnzaL9c9HBlXiMSJISAc0Ix0X6K2AdfbvaeHlI79HBT4OGDtSG3gUntptaPELq3rhiQeIPQKZnHlDVtQMTdMqEwv190P5NvbTnq9MiNd4V2OtkE"); yield return (Hash: 0x39a37edae06f068eUL, Seed: 0x0f8be7479eb05133L, Ascii: "YCeS8ejYuPJYOsEsvse6xfCKgZ4rDBIfCsEuThLeS1vRxNabzC5WGEMrWt96EYwGvWtStxbEcqeuzDjco3iieSt23euOIHodAkLeH6fYaEdJ9wg1c3kaxjBy76xcUUvUgQdNeyIgixjJBb"); yield return (Hash: 0x77ffb0a94d462148UL, Seed: 0x0000000000000000L, Ascii: "NZRIvp7eLAe9SoC5Furbk3IWXNR4GrOA8smVblKjNBj62ArLuReMOOiXQkRn964AnCNcYAJl2eKXuVCmYchYUN31we4dCcTqNXSZr6Yq4hCgKY4Uj8WeboayZ95mwAaChaLFlAlLP38DvH"); yield return (Hash: 0x9a9e4dd739fd02c0UL, Seed: 0x0000000000000000L, Ascii: "bnbwbxBNUrVu2O9WdVObgmXRNk91ddPOcrfjgUpP2Qhg8ug3W63Kd0Gs0nc30h4kcjI8wtRYhlmsDKLdLRrCHtPnrlNOttBIcL3tls5kzgoHriyk1TyIcb6Z3z9OdNokTghPnqp5bTfigN"); yield return (Hash: 0xe2db931cf7fdf620UL, Seed: 0x0000000000000d05L, Ascii: "tzlNV7L4NVKgZpn6e6Aq8BqTNug8x1ryUYqTG3TadfPFmYboOPqgUIY0NJNMgqdxRUaUe2U2kaVHMuddKztIeX2gU7qEeb9XRFxeHZAVaIZ6lYLUXv1gzYDmw9trFYenp5EnyOzvutTdYN"); yield return (Hash: 0x3b355b9952341b71UL, Seed: 0x00000000000014d3L, Ascii: "ZGwLelMo5hB8lZAJEImVcUlqaSuWYvHq1XBIAagwJ2Mq0hM5bbj7r9yyDj8m1dRQeGch2Sv7gZNWKghhbOLckJ07kEF2YPR8gwp3PgNXE0dNMUEiin7725FcnSTY2bOuRO3arZTjwLjwsaG"); yield return (Hash: 0x80bf6bbe377a6f36UL, Seed: 0x0000000000001cd8L, Ascii: "2vECEMJDes34YpXzV1BUUYtVPPcd92N7tg88CUw1oMj5W4eiZIQ6cXi1tQos5T1kLpH2oixJSeSqLu5h8LxganABgUzFPYOjIWL9uOEuDfUMsgktgQ4bU0cHw2nC8hFlCZDxqtnnhTrQjVR"); yield return (Hash: 0xd11b1f2de80c2e48UL, Seed: 0x7661f00871943a00L, Ascii: "4kNidsgh1ULYzj0rbKMjQMCimtXWVjt18nxVpMP4F9KxA59c3nniCIXKbCvq5HXeqxE59L9W8uHEBBhHX1ahTR3p9LEnCXtPM4m8WWNW542LJTQFCtyZ5IR1kqB75Wdehw3ZYdYTci9AUvz"); yield return (Hash: 0xede3cee50b2fa435UL, Seed: 0x0000000000000000L, Ascii: "xSnYEnPY0DFcZXjabmJZZv11XR63GM6Ukf9aPmjQxRwmlOED837tCB521Tv6zNowcu7aRCx3u6FkE0tHF5jbHIzUD6cJTMwKLnhjSQ89qwNLmNQUdCd3BMnmShmoQ14dj7Xxo8nE3pvQQMV"); yield return (Hash: 0x36feae0ba73193edUL, Seed: 0x0000000000001608L, Ascii: "16TEUrYwuNZN7nXydHKcqgL7J8NXZCHc5AHRNtTYEB0wXHtkOWORDf0TRUuOSqj9orOgHyr7VETWFWcy11fChAROkyXXpYe7RkBbhERdMBmdaSMRSLpvZ4HkiX3d1F2iwGTBKipzpy5J4qmB"); yield return (Hash: 0x65730275bc9d4215UL, Seed: 0x0000000000001b7aL, Ascii: "nGVDgcQ6ZW8W2bokBryEg8Z3m7grx6B6s7iSXcnHNuEpp3fd9vKnt697JFlrV5JFLc8cZ83bSJWm4Xn4T1OfEzKl6cXg43qFJgYY410R7yxKX5r8XClgz3ZyyzrSqxiVjk12sZA85vFXm5EE"); yield return (Hash: 0xbe60e242356af54dUL, Seed: 0x0000000000001471L, Ascii: "uW1clwZEqFxakgn0ExK0TYbfjv4FCVpWP65T2wy0eA7iS50iztHqIYuTOsoPpcYIVunRjBOcMG3OfFY94uWDqHxwGwzssHzCO61MtCLBvTxIZ8J410bL1YgRNoLgZKEdIC93Hb6YvTSP3Adj"); yield return (Hash: 0xee54284aef8ffe0eUL, Seed: 0x0000000000001550L, Ascii: "QBkETJmofm4YRD3TQddoKvpyjzm3LMjsCkOoIBlbr6yzDBe0xT8PE2Hx4cHPub6P3O4oAv5sqGH79yHxJPyugMpmczKCKtFR4nbBWklfgQzZDoNv2i6816YDIAjKWjjpKtAMCrKTVmw0xkFO"); yield return (Hash: 0x42619dde2ea3d269UL, Seed: 0x0000000000000000L, Ascii: "h7vxY18IBFufeMfQEF0uvNH441g0xOK3jfM7J6R3pTgiYmzyX8rp6LGUvUMCNZzi6AefpdtWcHn1SX7E036pJZFRSemmpaBhUoQbBm5hA8g0DEx8NFcPNJ1ur5AaywSC0DTTteFXG6tBmkzmw"); yield return (Hash: 0x741be231109da99dUL, Seed: 0x0000000000001455L, Ascii: "XM5roMXpfUT6yezGaKFFvx2CWI28KXu0jfWo3VKvIoB62dd9cOMt7DHs5xSxWjwYjkqKBnOZMExbv28liPpEQ8stFg2cMy3o0fQIFnt8poRKfmvCrREGuq71m63FTa2rQmGJUyTK1UAuUlTEe"); yield return (Hash: 0xbb35c094a4cf5a55UL, Seed: 0x000000000000248dL, Ascii: "MkD2kzabFivfDIm1DUFFVje69UYx4KP7zb4gM9dDlT4vTDX9Boo7YloTU2Lm402XU84QenglLDDyCF00z0D27lteqzYRmXkH1CbmdFRoAamtW4wILybXYQeYGGKXivPFpzkfPsWhzz9j4wnhP"); yield return (Hash: 0xf0790ae00793a69bUL, Seed: 0x0000000000000000L, Ascii: "lZh19faRQKjevEwNpVH02ADNfnLL6hceJP5yPxo5Bkd8irhjrRa227eaMlfrqwsAF1GsmH9tSDQJRGi7CGA0icgHUlcogKoYHIiglBHwLFNY74bbY8anenvnp88VfZsORihIwh3Ip8lhfLssf"); yield return (Hash: 0x4652e52817c878caUL, Seed: 0x5053e8563b8e105bL, Ascii: "mji9X45Kg2ieBWzBIJgKlAVI5xu3jNoLaFju9cRpNZs59VUvR3bxxBbb6AUMUFgDm6uXJY07m76VMUhGjuNQfJL1Rek2WarSzKIf8ZXnKVOHAoEgoOV04W6rBBsRoKCaMaXyUy2HAF078IYhWz"); yield return (Hash: 0x678ba742d1429411UL, Seed: 0x0000000000001c68L, Ascii: "QhdEgUvMnNhbiiKccrmrE11Xrrp2HiPhTIKyFWJb51zUEWc7Hwszj3KH7tbvuVcaPsrfogRgsXeO3GlBkZ6iXqRccHPVdSZcKZWHjS2nrgwbzZXKuxvb3st2xZuRctBTbKeRWlmyApmwyhZNXE"); yield return (Hash: 0xccaf7b0c73ffecebUL, Seed: 0x0000000000000000L, Ascii: "C6NSXfV5l88vvycmtINmb3FQ9DqTA7stdWvF1ZGmZzn8IOT9PkLRYwu29xBGz3u64DtOqhcWs29TWacrLo3htPrg9GobyClvNHHEq0o0OAmihp8K45cJb3tdeiXTZIY1Czrcpj0VABvZn6mkGO"); yield return (Hash: 0xf63e999a1a8e1a6fUL, Seed: 0x0000000000001718L, Ascii: "kbeaxNxCAOMaJZG4ndPplTGKwdw2UIukSbkSuWxFyFnVp5rfUw7RMAfIjgsE1lFaigGI3ALU5gyTXEMo0xlzFz74GZ7PzraAIyEHpW4yMeltmndUlnj21LBiXRWTCkriVH2uNupXBS2XC43OmR"); yield return (Hash: 0x3cac3383548cccdcUL, Seed: 0x00000000000002aaL, Ascii: "lRDPYl0Iv939jZw9iglpNKD9uNKxoK26xOG3XmFMAOPKSl6a2ZHc4NCFVHP4jCxwVXskI3buxPZr3yFXt8oqCaA7gZxKCgREcIDoUJEMiIq50OQoIfCr3okNQPDM7zzg5cqZRQhn520ghcYTiAk"); yield return (Hash: 0x81327d8c8d6d9180UL, Seed: 0x6cafbbc0d4d9d448L, Ascii: "2SE1OL9I2HXxFeZ9cwpG1bvHORfMYzlHqH4O2DMqPiDBQNssznaruH0lD5ggyyixdtdr0LIUyOdywEFJbtsdpRZloOJHNyGvRZ13AKfbnp1d0cI4OBDSEtljyVPKwYff7bT1UMD5Qb7GSCHD8yy"); yield return (Hash: 0xb6a86158a730a0ecUL, Seed: 0x0000000000001d92L, Ascii: "VrmLgJssGQMypADPBHCcZzfAf02WEAVfmDdX3ROFbBxUKu57jQEaPDv6yF1yuZrUM1GmrwWj7jpZfF5xPbVBD8G6HBKjhXj7lZuzEfn1HTFzWvvhRCm4lsO16zhYIYt2kdDguWTBUTxz8jE5ciW"); yield return (Hash: 0xfaa8955b60ce58d3UL, Seed: 0x0000000000000483L, Ascii: "YqLOaCkvunkE6MNqJpIbwvfcQhkUGG6JEewerE7rHH6797Ln4KzEelspi45h4SmHAjdNDNcM3Cvm0F6AbNhnhqtBFdFaby7GEPeeQaWMqAQ8Q0ig1BN1juCwfflybwbLaA8Jokd9ZXVwA2W3SKw"); yield return (Hash: 0x3c62bda192d33aefUL, Seed: 0x000000000000015dL, Ascii: "wdwPvtZuwFk2xZz5ILImhDQoCQzoWDgkUnWLJiqAg2UHh171FoHHRZHVuFPAAUBeBC7g0rTzFtEbvPjmAuph55JHMPJ66PzXSg6oKj1GE6l2sM4v41TV1S17c3rOr36P0VXDpzJrDqNjYefaDcrD"); yield return (Hash: 0x6a844164a076f1f9UL, Seed: 0x0000000000000000L, Ascii: "Ca21pwuAz4ChrAWVQCQaGiGufxKTd2Juom4dcuPa7vML1kzz87lAQ4Sr4Pspv09YfvAyPzKltoBE2VxxvkkDgrRQxJ9NhGoZbFj9yVyMvpMSsqgGHVCsUuWhROOQJt6Lw9PcL45lHWCcheDrQejt"); yield return (Hash: 0xb0fffd1f732ee3ccUL, Seed: 0x000000000000150bL, Ascii: "KnSIM1z4E2EkYDzGqSxyMxy8kkxwQbdCYOloyzm2pKQ7wjDs6znbxIbeXx5T5jFaPv6D0rwbywt7RBaAd094bSl82if1n3bea8tTzKaWHrHyztPRvdIOyjYmJUwLXEAFTnsIfU4w7tkD6wP7hrgP"); yield return (Hash: 0xfe4e30c7cbd58fdcUL, Seed: 0x00000000000003d6L, Ascii: "YlEO2h05Ro9uZTDjpeVVHBcBYTyrarAQyNaUboQ2F48CmEFhcd78JPfhMD8IPgSDBR6gZzwTnd0AEIpWOhFyHxQTWT95EtRbky7XPXq74npH9zDWUO5Oa5wwOZXLRNTNwDuZARcmmf1kJEgNTnpH"); yield return (Hash: 0x19fd8ee13d25243cUL, Seed: 0x0000000000000ffbL, Ascii: "RiWtMv91x0z3MJi9YfUq8rJcpeBCwIMyaCMGjuaunyQRUMg7f2ySvTu8wIpg50dpyUWCBskBErrOSFveIvWoVfV1085dXHrG7nUEwl8IrMKendmmfz1yhJ6akVYk5cFoQam96fzyvsQD8BB6GimHE"); yield return (Hash: 0x53fbefe463bc20d7UL, Seed: 0x00000000000011f1L, Ascii: "mnv36rJDzm1Zochb46MhGXcLeDZbKSZ5WK1jSa8i4IluVBGOgfAJHSF2AS7YHZANxDCLJVVloSLxeVL0PGrrwQxmdIXNYbTuRT2xUmAg74oJh832LD6D6IfO3J5DEsmDc1B99aIGMpgatVj6z8hIW"); yield return (Hash: 0xb0d71db1db164306UL, Seed: 0x0000000000001a75L, Ascii: "31nAhSK6lKwLUMflSqSxLBWCfoRlfKPDWo9XTOOFnwdFoPPsrkYXXFpE5toYNUzmEFZ0xC5KeYBIa9xeVJ8w0nGi6ISL8PDhl8mBeaaHn68WvOr5SsdMP5l5IDmaxsftmmBs37NtG0fHuh6ICifl5"); yield return (Hash: 0xfac54ef497946b16UL, Seed: 0x0000000000000d44L, Ascii: "ANpgMiMNheGfrkOHwYj27tY1XBzItUDmuyCRjfuazR702hViGWK89PD0QxDdWJDxgvY2UY9IjluyUiHpMBoycE0d4nS88MUwF2vov0gjvJ4LJ1cUfCYvptYhPQHVyfpRxXZ24yJNnbjmbrb3EMFXa"); yield return (Hash: 0x5f7c6a0c978c2cc5UL, Seed: 0x00000000000017caL, Ascii: "P86XZCtYQO4z23K3Os2V1deOCsWdEEJI2APQ83oDSn51Na4hioDJzhkVK51cIPJC71l0tTcWx9uZmdOzOCni8x79irZUZXaJokHlEf2rloZ0TehEIH7wObIuH09lIkQocRRBJR5M6PSYVAoU7MiFPQ"); yield return (Hash: 0x885c3a5db33828ddUL, Seed: 0x0000000000000000L, Ascii: "506lXaeVt1PN957la0rgUiKtGxB4Ki2hqgTK832nY1vtUkXcdwQVvWIaDrn28WvMUAR8AoZcxIxcYsNfT1iXgNohzJbDSSnkNTCj6rAgsZOWxpsPJiUlbEJNZi5gsZBGt5UMb3XuHAXf6cKIhk2izS"); yield return (Hash: 0xc6c2bf26888cfb9eUL, Seed: 0x74422383d0621306L, Ascii: "5RR4CrqvBsonK7drBXlhL1VUQxm6cX4UKtYg8zZOW9pRFaJCM2BjEBAjN5NGBNUq3UVyHF5XQOtU88ZkpMwoAkrekG4UlpOdm4DmB6P1UVpSCuAcAJNO3HSkYyG4jMnxLrWZsoN54ZSm3ZC7Fd7b9q"); yield return (Hash: 0xf9159dd87beb4982UL, Seed: 0x00000000000020d3L, Ascii: "Zca6ISTkVdarTdiYoiCtulPQhB4szxFmw7GGTptQqyCEdDxaCdTTwHoHRncshyTHadwJC5Xpnmx6HHVedezqatsCtOGGq0rvk4umVLdvqgNcJsjx2EVbK9xIWgWIoxIYFqh4HbROxI958uXMBP4KEw"); yield return (Hash: 0x71a6714374c91803UL, Seed: 0x00000000000025a8L, Ascii: "7CwoN6n1mk3yjMN70v2BIbDP0DxSxSrmEkAh26csqE5MIdD0bDQ8CHVF1t8MlQENE9Usv77bCm23GGSJO1zwWBwMfw77H9jONyFhh9IxyTkiFDiPyJZHPAFAI7Khh5BWeS69XSROUDkCYEr2w3wMD7J"); yield return (Hash: 0xc0322a4517bd885bUL, Seed: 0x0000000000001e3fL, Ascii: "mWYT7sChygmozGjDYHiRHOKCIZ5MpMOINswQw5rMn7aNT927s43Fu1VbDFCI65WuzfJFQdH5T3B5V5azx7iewhxIEAyxQ8LMkyIfwgrGaN968Eo3lQ85LWk3dP5vcYsD6e6WuCpxVQ9ehN1oNyGBUFh"); yield return (Hash: 0xcd5b158cf57a21edUL, Seed: 0x1eadf009cbf8ac7dL, Ascii: "FVIs5vdoGlQH8mO7gwIr6dzuitt7tCLlto3j9ISwyo2ccMZVwfFgpmI52ZSzMHxd1jk9gUu0ap2qRVMQoY8EQan7tTGO0UJeYChSsgLmsA6N19adBoUG0Jl2aLuAUpJOxkUwWtnqBweYzskBihqeeeK"); yield return (Hash: 0xfec8c5bb7a86869eUL, Seed: 0x0000000000000286L, Ascii: "9r7sdylVeJ6UPrid18hQRVGKD9aHkJg0MgrpFQBiJL1LyS7GKbg53W3dpFpZX4VKDtqVU22QdAtuhkBRG0ARJ2CvJcvhG85kiS3xRiOjtRr1LyBAhmP0Sc7qDxZGVRz4c8xX2Uxqk6lKugvHSDqm1rD"); yield return (Hash: 0x42c0aeda421f54a9UL, Seed: 0x000000000000248aL, Ascii: "f1CzSvUf7nMOhfG0aLlFfETuxIA8g2DHzWv48KA1gg9up1gdB4IpWMwOBlon2i0iAma3p9t4otplwQqGkcdwLKI1CBu0PZhNDihtsBTnvsIXM3CnA8XGZ352FYJ4aMyRVMFFse5fAOXwM1Zw6u7yhyKE"); yield return (Hash: 0x7575d317e9fe51a6UL, Seed: 0x0000000000000065L, Ascii: "zZKL0OlySsRishB74cl4RGBN2d9OWsFhWNZWdeFUisBNX2UwuLWHR784AKOeIDSxMkvN5AthRuxjClrO76vQl8OBozvGWUMKeSqlLNR9vywn8orNrBp354Edxc9ByHPT2toJUniK6ZJBy0MibcxrQ7CG"); yield return (Hash: 0xaac55f372efc702aUL, Seed: 0x0000000000000000L, Ascii: "0cMGeRh3IXvLixGzdMVb9xBGjA6kEu4IamxKrYBh4e66zsoCJKZqorkk70vMXiiU8HDAZ3L0hQafI8AXRGUt52gIFbx52etqU36ye7ZZA05WwURAxSfohBVJR4CyHgAwtvZPnAIQTYqUVabcuvpVMNlO"); yield return (Hash: 0xfdfbea9aa2861367UL, Seed: 0x575d01e52051c5cdL, Ascii: "RASyAErgK2cfd8LnRO5t0PyCVNbsfcru6yQkeyNQ3MWQ3T48eMowT4HFcE2ZppMsBXZm1e29iIsPpIzcOM9ZWEf5GVOlO5Xjyb1yuzHVtgPXEKbAvJJGjeuKpNtIriONajKOn1TdWUnT2jcoQpexBmUD"); yield return (Hash: 0x42e23c02616745c4UL, Seed: 0x00000000000023a3L, Ascii: "63iWiybDwerjql22wHy5iLaIkJA6yU4pbimzlndJqI3pHt1RoVud6cmtgxc1V2Lzg77Ij2ozFJ4OewXmcLus9dVxiD1nn8iHtl73mce7FD6rzJhZAm7LYfqn3W6u3dwnZl1JYHSeHtwrhZBRLhVbDYp7O"); yield return (Hash: 0x658338c1e0b044caUL, Seed: 0x0000000000000014L, Ascii: "ACkIGaxRIZMiLn6IKDnj2TQKLxoO9FFCkpwHqiBjTEP5HlIzbJxfwfU2iRFT83QNJg7JsrFNb6euxR3Q3AhRgNLblJD7A74H7Dr31dqs0FujW8l9WcizDpfUVpS9A8lsll1uZqZmk83kpxOmt0UyDlnu1"); yield return (Hash: 0xbe2c7e6207c2ec42UL, Seed: 0x0000000000001dc5L, Ascii: "pDWf5Nm5aVeWCKqWj0ZzCuCG41CG3uMD4K7HbVfsyRHBb8PPxlUaZZafBNw5PzReVrZInVGGz7J1B0gHcXBgWi67bFD8JKjGRGUhHrEs1GP18TmFxQYnsugA71HtbNZMTkrQmKEmOEcDUbQVsQOivL5T8"); yield return (Hash: 0xf689ed08aa0c5123UL, Seed: 0x00000000000002d3L, Ascii: "hQ5invCoIPWENdwevPniAqnrcOX59VfELHjdysQntRUyXVEcPrb0jhprmY1MiAbfsYrqsAkjqR3allmcIuRwzub6yBu3H5IFl9Y31ZbbPZ2QLKRlXFurlrRaHjNtiOjNT0YqW6JLixmNBFMw6xAfdPArk"); yield return (Hash: 0x36744e2d0baedaecUL, Seed: 0x000000000000155dL, Ascii: "Y4JbTln4lJObiJ7EQRU2CPLoLhwGf2Lk6jJnoUhQrS6nEcn5EbEJiHmaXI3aXr9Bm2STZlA1uaV4AMXeCvtdbHKePn0lPjgII0WX6fOnpYpOGjXjPSt6ad14XlSFI4YwmqLsA9lrYJa5R0bkkAi62E8rMn"); yield return (Hash: 0x78b3d4065d5eeedcUL, Seed: 0x0000000000001102L, Ascii: "VrD0o8djpXMDKYuKitrNnCC83Q5ijSNlCAuyIql4CHAuBxC8LklWurywYciPmaarWef5zacECokLWd02dKXG2jHRwHFzEkkgjky94CZHJsEUAoIRTvbXSMPZA2880UbkIbQ2Sm5zrXQsoMoGwrQZaKxugm"); yield return (Hash: 0xa0d2af6cef2e71adUL, Seed: 0x384c038aecc68846L, Ascii: "xMEm4HPPaNLsqoqtloLN8ygMjf5O9hbLEVuSG6X61BzNShJWDtRxzRXZ5sKhxASjBmweXMrkoG9s7ri3Lv9CRZ0H74L4HNR8GPQQlX8sqXy1TBAaeRUXkZadZtNwyjXNULCuAsLgfCDjndDr8sGVtL1OBJ"); yield return (Hash: 0xf35e4935eb9a8244UL, Seed: 0x0000000000001c35L, Ascii: "eHjiuI0JzxZSiHdZetVhEqyWE2AoxnU9W2aUNEehVlwoTlW8ca9Z9IRWc17NE3DEvBormfTJOjwUKXdv6OI1u1nspYUHJ8qY9zJVgFSVf6nQl09sG2TOVHrgspV0WFTgzOGfsvhJoHsRYRgh96BuS1hY0S"); yield return (Hash: 0x2ad0b2a2424dc608UL, Seed: 0x0000000000000000L, Ascii: "yfPiKy0htYoBIT0XWK9OCGJFZ89aknaEG2iTdxMCUl4MBt8u4zTucKtg55gUVGSpqT7Ui8oayu0qJLyeu6YeT9GjEKz7ymcl1nI1jR204GL0Vgi7TAxCraZDGzu9KQE80S1Yzxb1dY07MyZhUL7oyWoXnm4"); yield return (Hash: 0x7b7de330f64bb9acUL, Seed: 0x00000000000015eeL, Ascii: "Hb1ulxeUfjEalMMwNcgWGvRKc8U47rPPUOc8dgfbfIEpFOV3NX6IEPGhnzNK6jOiDlssWFdeaL9vLOCWloY0Hx1MPUzNpPx1N7p5Y1d6CtrK97ciOXarxEJz5aFU5v1KqCfC4JdJiomACEOp2MCsnmJz1xg"); yield return (Hash: 0x957d096734b7e937UL, Seed: 0x0000000000000cf1L, Ascii: "m6FxWVVTtTVJgteLjAr1UnxEQoTJiVg8ULaj2L7O91gfbBe5olfO2xwDsLcTpidQmhMyGCtOBr1hVO3Ugnl678jn89UdDu7B06yBTg93y08gD6P671JBkRqgQV3vNN5o76DaandiNfg8QJrwkmidGHHYhaA"); yield return (Hash: 0xf4716f8b4c68b1d4UL, Seed: 0x000000000000095cL, Ascii: "wzLjHXCGSajJWmj95VcIHoLZ9lP4xydL1tJsTsM7hNhD8vTFwvzteCmxBd9QTHul40VzyucnIlZpt7IXE5mbuRNTD8xqdg76uXGzPYCBx8H1Apydw9zOHpRJRhIz89HEsP74ePBYAaETTxwgNLlKApt3zOe"); yield return (Hash: 0x3dca7d1c5404cce0UL, Seed: 0x0000000000000c55L, Ascii: "u1urrFActQ6OHUkGPZkVZBOKcJGu7WAGe0VU8x61gM4HqUI6Cbdq3WKewjzneNl3zvxZ9qylzwZ6iyaz9DjmfsPBB9VJfKC0XOBFGRHsEghTwFwmdeXs2O78quvRFP0vEXD9rzctYXYPzqvMcNQBs29tWMsA"); yield return (Hash: 0x5763830da07fef17UL, Seed: 0x000000000000241fL, Ascii: "MB19edtYkCHPdZKlQpdLnzpRI0G73IN2djAIZPAnQEgoyQYNaTLJiG3XuoW5Br6nE3TcfzZsOfwIf4iOu5rzts0UjmOQXM2NTOQAfXqsAW6hHzS94BgHfjyOlOjrjR5qGorJxx3eNY24hgKNVH686b6rb6Sa"); yield return (Hash: 0x75365e3921368b84UL, Seed: 0x0000000000002499L, Ascii: "MfKVGmZXEkUCm5FWOBPCmQnjgqK40oZsjdZjUfiyVlT51MDRNN1M8Igm46TLUmehoj8FvjMwQBZMZ2f307c4VHq9XJSHrlzleZ2pu2WXkQxlVM8bYKSgX0c0dITSgilVBWYb05uzKdxDXdt05SdI6GoEaFR5"); yield return (Hash: 0xccfaa33fa0308c6bUL, Seed: 0x0000000000000da6L, Ascii: "ydXxM6vIjrISOJL7dQVQUvuIfjOdyiptXUuWcHgFIQwyhmUGeEdVEIdICVUSzuRlMwatIE9scF85DNJZjksaYGblCeaawoBgDylTFIdlipgQ10BGxVbrpbRGAE2vshvgbLRmyteU7yt0CKOkZDIxdW3QF39G"); yield return (Hash: 0x13eb5557dd798044UL, Seed: 0x50cc1ea8563a34c9L, Ascii: "Tubapz3FQuUbljkXjfqs94japLyuOfNYxMXcwosPdRM8udnzFzivbsa9ovq35KJ7Kqc1fTN83wajhIG01T3JLfGl2hV2R4eoWzgJvTdqzDs6Co9PVHRqPIIycaEUwA7SrxiVvcoHXJm5KITZI3QznRShpZqOL"); yield return (Hash: 0x59dd4b4ef303a058UL, Seed: 0x25ce729810d4079bL, Ascii: "Vs2XzwmoUIY89K94OPUdTm8JiYJ8QMyf9DseOZDlP4M5nnJEBIzpHyToV5wY3NwOjfscaPTB2mhVgIHvs0O1WtELXX2KyLyP8u0ynBdPWKCQzwl6GAkC1yfx1BYRMr82X9rLDYW4nfObG4XKAhIEZd3MCzEua"); yield return (Hash: 0xb8d171bb19196210UL, Seed: 0x1e01bf58a2995f69L, Ascii: "3Qw7U87hMFvrz9vXTV3cq6wulh5uZgo0XzyZLMgLNpNeYBeKCXi3GpVuTjSiiXm9hiL7YJ5ZK93V3SsrWhK3CrIXBhm7m69kGBwgxY7aF9idxWcPiCwJru66lI11Ep1gUGdUmyyCqmurzqpv1uE4ZbXITcvRt"); yield return (Hash: 0xed51eae73d2149b0UL, Seed: 0x0000000000001b7aL, Ascii: "teilLoRmzlGc5Ebm3B3ArhH6f1sZ2qAyVXyiurRzZ2Sy9yoBrN8SktjjlU2TWHr5NUPC9zz1zX0FW8sk6xobnfSdsdet0JgidHflK4IeQLhWeGJTg04jEei5YiFt6abmfyGvIddICdNtDtN93IZBKou35UYxN"); yield return (Hash: 0x1728faf6ca5e2a7bUL, Seed: 0x23fd58b8d01cf794L, Ascii: "HMAPg9YS9ggf6OGW8eQzUFvysR7jmGcwAjMltQ8mXMiN0nrCtKqhRaQQyc8WiBZpgLtTsgvBaKfPglRA2HPLNzu28Q6xNG2UEvhdS1qJRYBglRDBItcN1pwjIyCeewM00wTToh03nXXP9xUS2Odv1S4CAzxeKG"); yield return (Hash: 0x5d8bc07581b88812UL, Seed: 0x00000000000007a7L, Ascii: "rEcZMF0bj2imyLVxiuOUlM6pMlC6gwo5fWlYNx1UjDb8RyGf2JUrYbvDz9SpUzeJ0EE7e83PSVVtUKPE6wioBQ3DiH3b9nRXD37LstFYriMdcT5omHHZxZvR08yqitrpRIJtTVFFTUAIgoRZxpgJGW8ssAkmY9"); yield return (Hash: 0xa117c21c65665f75UL, Seed: 0x0000000000000607L, Ascii: "VUAU8d9A9JaJxsMHWm9DSsa3fU0LX1HVe0pGTZoVGcQMrtikk4fAJPUi1Zl9U6Vy5lkkwY94EdxY31VPcKfm94kviQ9a3uelIligqUQ9KtachOw6wm1sCTnJ3dDmZGzbUafyFOe2TgIQf2iORP8BzOPwt4pn87"); yield return (Hash: 0xe5c5b5c506000103UL, Seed: 0x3c2902e3451cc760L, Ascii: "KjchkxMHEzdw2pPGSaSMmmnTtUJmzf0XkICXwpEaC0W8Jsfm0At8azF9hdcoZnYSGD0DXASpWQvLCBQH9bJP17gRsJvH56shCfgTzp7ns9NYYEao2tJj0zIjbQMmMTo5cNEtfQl6xGZENSWwqfXUn6WLd1NM7P"); yield return (Hash: 0x357585d2312cf1e4UL, Seed: 0x0000000000000000L, Ascii: "IiBxrgW2w6mBZzsR6GeF9sB3l7I34uKW95L9NvrwMl85aUozrXwYXHxb6UE6EjasVcMOOFxSkH2gUxWeWb5Frf5HmadebjNQmbe76g8NGqnGpNEOhmwwbH9areTGnF1dzck6cZRbuwAOdBndLxzp8CXqwQtXpmM"); yield return (Hash: 0x6991a8f8be9dfd56UL, Seed: 0x0000000000000000L, Ascii: "1NceKUaAZTYZ0iecBTH3JkOcsfT71BIsuY0AuyMA2fxlaoe8e26upSR9vGKl97oBMgZKPw5lTPSb5UCemUoGNYqHSVNUmqsRrNezeFXS5L8mnAhfgYa2i1VCoYnRP1wtwYFHdJ7wqZNNmHkxUmqGMuQdJu71axT"); yield return (Hash: 0xc28ed98f57eb5c8cUL, Seed: 0x6777505caa5b9166L, Ascii: "lIrKpXvXKWI16oZEvS9Fs7BWiwjrFVDdEW4zVb9gt1WiIodsSfXtqu20Z2WlCdQEsEMKi6aL4IhOtG3u603nRTb86R77S1eiAaOjDTdAxVmCeTzQLGz1LnMtNmyC6n82mOt0dD5qsA76opQZmA1VjnYB4TGuIbu"); yield return (Hash: 0xea02d5acd4277c92UL, Seed: 0x00000000000018acL, Ascii: "QtxcQDjjVqymMG4ESynWyEtG5J48iGfFg8DYczpwOo6MoeEYwqTtAVOpdCLFhJkiAnaAxvGy3YOJxnoMrk9ubOSWeWAKx0OmuQMtQBuJAtZyWuIYfngKLAfWVcfbbKfz2HJFNbbJILQhjVwvkI05Fr7xnfPMB5e"); yield return (Hash: 0x2e98bd05bc36804dUL, Seed: 0x1c8c8928397043ebL, Ascii: "Y7fXUKQipnEtMzOFxH3rZojzw9HUw0pko7wNGm8IqYruxttgBScSAgj6uN9x40EYFq0DNdetX4eqplZRFaayvPlR70XlvX55JQu2ClGpveMdHbh3LDJInlIJbvGzc50jluJ6xWnPThMRK70ifM69obKUh8QEuLMX"); yield return (Hash: 0x4ff365959c1f5b72UL, Seed: 0x0000000000000000L, Ascii: "HzVRodZLoIsR7yjNoOvev7Hx23M4zXYylsuJMgxVPZ2kDdCsyG7JopItDEqZJk1TVHX71xDAvogeOO6fhC9TTZWYm2KtMZCKlYqdDKNvkzXDcHpJcOsDSHxMbkb8BMBZSEzp3PSpk5lbjhsthpKwqCTHyenbTOMB"); yield return (Hash: 0x857b8517c0958f4dUL, Seed: 0x3760d5c09f8db647L, Ascii: "ZfRUlMvz6ihV0GtOaUEC6pVp6a6OA59nNTBlt9CtrZ6RKz8317XC0AKWm5PnxVidImQeeX0pRDkuFXmfi5U256QffEbmJdw2NvYvyOQYZmGDWp6UlbwgRVRp2srwEl5dWpuUfMVeyNBMJW1hV4nAgxpAOHYtxTp7"); yield return (Hash: 0xdad0eb15f9f78d54UL, Seed: 0x0000000000000000L, Ascii: "ao4zfgApzSbgG4Ftq9wf5QgDZirSVqA1PPK546x3LOgNG2JQHhjT65oby3dgQ1Byaqo87dAHtvhbSoMJKJ6gXpEG1ZaGMtDU11jw28rbqkNkPRGhFFA65ZEcTPtiKAHggYfJjxEPQ66UqJrLlYa3GW459GVPeoFo"); yield return (Hash: 0x4e3cc55cc22b85c3UL, Seed: 0x79e642717fbf5a27L, Ascii: "8soJhddrb3vn3BzioBaOmKi0Fo0mbjpFyrpcc5mJ0VnCWjS0YyBOswiRTMoVQYxoNdN2k2wzkJX23QwpXACid2h86nv27YnPS1L5rpIhFqdTROgS5r6mNFRTxbQFAvbqu00nCzxKgw5GJu4qvB7ipXbnpWjWu9SWB"); yield return (Hash: 0x6d3c7a3243b5ee78UL, Seed: 0x0000000000000000L, Ascii: "uCTbnQFcR82L2E59yMlIT8LsKURuLM0RZUlCODP8ArNwhlkRAetszECVonCjW1QSVB4xYvzusAb164DU66ElcODEaV15ufuztpD6tT82Sj9R6tcdLYOBC6aNMvnimakXTYkNvi091QRpPST1jOoNlJWWOUtYYE0lp"); yield return (Hash: 0x88b3c3e69fac5507UL, Seed: 0x000000000000047bL, Ascii: "MvbXwjtP6WnGNEVx4iJ61MGaEwTZIAfCBwHX9WKOXCl1UAP0h84AhcG9iz6WZOme36zlkXdrJkDa1UQNZmcg0JrX9oNXPLha84UD4o8TNCSkbEitP3L70Aasn1Jjyw5UbFvcSNHMNBhEgBBF7b3olBorHCCSzYaGX"); yield return (Hash: 0xfa1f52a262e9da4cUL, Seed: 0x00000000000021b6L, Ascii: "HjFuXIJSeEXBU445lsex6x1BJeMOmD0OlaqLRwQIJSnBbwfAUv3muHK5t5kH9Dr1oDbSzs4zJ84D5UDoFvKBwMUJWZc5jGTE5gtpTznhVoTRXIKtAzIzysg8pA2aTvUeoYTTo0DNUHwYddlvMriG3HPEOuwPZDs9W"); yield return (Hash: 0x3ec4aacf029396e0UL, Seed: 0x0000000000000000L, Ascii: "0gABXgE7m768NXW5kMNQ8ouE7LuSq4ncHhBP2jblEAqHn2rFhuLSNoD4LXmhvfYlDpEueh9IIps1UXmwEEUfoRCZLXwMwJd86nyFcA2finm7MsVOKCbAnGnsHh0aXcgcB9bJ7UZc6xlrSAbyzESkeyQOY4mWKyJhyf"); yield return (Hash: 0x5fb2f926876d91c0UL, Seed: 0x00000000000026e2L, Ascii: "m46SbDPvUCuopzRosoOzoh1svBy4yg7SU4XYnJOmD9bLDdTFx6Tfkf7BHOmaJcx445mUtBHw1NpuyMYCUfp8kD3CUDpN3oDGmzpnvS1ei2r78tQn2rPSu70n75s4wXQukEvbtkQVE3zbSCl0h1h0vmjy4vGqz1T9sZ"); yield return (Hash: 0x9e5532342ae49a98UL, Seed: 0x0000000000002674L, Ascii: "Otm5vGmVV6jF8TLUAHeHnxtSvH667GG88QdLrHzvJFdsmhiAZotqgmidTP3skJIf7YgM904PRVEGntlT0F0vAP5883qPKINAB1lj5NDGYTlU8UTkjM1eDziygtyKTaoftVW0JXVvZOldbL9K9f1p95YyzGxHxdeQER"); yield return (Hash: 0xefef8daff017c1cdUL, Seed: 0x0000000000000000L, Ascii: "4oiCjBB9RQvl2aEzhG6Mq2J5kxxzj0xuJQfd4OXoOkOPT3Wfbg1E4Dvi3ch5VN8Zni4udCQlQqEOvhORazvnulCyZme9t5OoAIVxB48wWdJWhZuHOsPsziX1Hi5DMRCnyuphm8IHtUP6eE9XUoaPn7DCiEujVnusWJ"); yield return (Hash: 0x28977f7c0ddb32a6UL, Seed: 0x0000000000000000L, Ascii: "ay05ztOO6vxffFs5jon3nuCYOE5RrLdooRRDibetaLfWwMYgkSuj4wZLQeLSFDIy9UdhSLRjGN6AkSxUuDxNaZmvXboqH6ox7WOM0SvRur6fsVaHgkZ2yM4X9ybQRSQK43kWEsIwOJn81YXgMLrA2G0Jl1BWtbSDTsq"); yield return (Hash: 0x81353337d0c23b2eUL, Seed: 0x0000000000000fc6L, Ascii: "0TC1betJD5n0UTWOYp9KG3stDTCK4IRpCzPPdLjIQlmgweMdDtRQDJq6RwTVHZEMVOxmaEttgkuxKI0LyA9VM1CBIeZuVK6w1wAai6LGTIh5S2qcYiZkFRKrurNLie89NfRM1gGuiz5SWpkMih3sWhOL51fKRxSK9aB"); yield return (Hash: 0xc091e14905806220UL, Seed: 0x0000000000000fb9L, Ascii: "7tBqI0zFhDi2TI7n2fVF6t7tfaisgpZNTEzJK8XBO6TDX2oGNERANFK5EzzA2npjI63vefCaDtNBHPQJVUhenNWwjMJ8rVdeerM7PlZyJqTBnXIEnFpfSnWCg55PsDXsQo4tX8LgxM1HYiwhab8FB5o9tdCpwWjsGa7"); yield return (Hash: 0xddad847a4ba1db8dUL, Seed: 0x000000000000019bL, Ascii: "ogI7UGx94eVJAUXcfXLLAip89FeiJNgZhSLyctvpO0WAPpVbLqmB8aY2pbdMrDIaJJGQ63OCp5vj53b5AhuU9qeun2C43v5F0fBFaeuCs9g5e7X5w3PC50IHNm3dt0NDZNiesyt8YtrYhFuVyW3Gwiyn9lQnkQOFRJG"); yield return (Hash: 0x3e66fed17f48f182UL, Seed: 0x0000000000000000L, Ascii: "d3OblcFTEllzMGUk7FKNQM4yuV9i9PzQQtPs3G9bxbseeHRfnywdCkvv3btlshYExqVG3fFh39Wqqp0re0umNfJhdQDn3aKix002yzbWaqsBifnYMbSoPg6GyzOIRpSE9Ev7qtB8AtOPi3Ehvcs0t17rLS1oEPXEfjwJ"); yield return (Hash: 0x7132fd637350951bUL, Seed: 0x0000000000000595L, Ascii: "39a2kzihtWSooZlSR0E6zMij0MRIGFOoP1AVVPtxT7l28cUUStWSYzkmtAj7fdHaoYkF6IamxRE9d9RJ66bgcvxE7PtwXYEwE90aQ4Dzg7OeBX7EdUw4jWNtPpi0aLRQDzGqLk0sCrqDxDAfyu7rJufUSHxB6dEa0Fwj"); yield return (Hash: 0x9aaf355775ab0a7dUL, Seed: 0x000000000000144bL, Ascii: "nqNm2Z9wJ53A0uCS5at6v1SLNTQKxldOhyLTaAAsqwuUCxqz5AwEr94jklUcI5ewVWc048aDkoaumWZVkq4PDQWn3uuBb77tJ6QrOHsT1lTu7XPrxuDnumG6Io2qyJkVKoQ3pfNLPs59fTbCLyCsXkoBt7XUPtTbs31S"); yield return (Hash: 0xfd9b30aab2e39e29UL, Seed: 0x0000000000001b64L, Ascii: "VFFUtoHwiGTiDo5Ce8wpCGFcpwREf6m9CfWejh9KcqlekxNxhlsShqOfY79Y6rbBdhYKIf6lQKO7lkwFlvSGWQV2tCZH9sUz6NVVcuogH1RtzmNfnGILLHpwFU3NAI1eAOhmXqPoMVvWbTzQ5vgIEKZ4Vhk5kDL9FO6M"); yield return (Hash: 0x22e21a5836ff7d30UL, Seed: 0x0000000000000ec4L, Ascii: "EYWylwmIZryh8ywRf9p7fGwyl6auKZm2B5DUfvG9Tp58RmcISiDmaGhQFbPVp2sAe4xQQi7eixU4m73nB6iKhJCQJjtoNssxWwoWCQpA0r0K1L37pGyMf6toUC31c50oyVwJfppdO0g4vBAECaBoHAMVoqA5xtnLlYrFJ"); yield return (Hash: 0x79ecee65abfc89d2UL, Seed: 0x5f0f8f008cb448ccL, Ascii: "TSGEoEUeacXsHOsAUHFL5Ya5zEVOnMgtYZyBYOI8d5euiYw7PavCK7xAIhGJ1EaMtNrKQLzaZS2y4jyfvGXWedGHClfC04zhGPRbsvVKIa7aXGMFaIq3Stzj65D3brutKMvcQZYOIK90LXL47LyLUIZN3DHSrzOOgmm4P"); yield return (Hash: 0xaa004366564d7b94UL, Seed: 0x20f0f02e5f401aebL, Ascii: "JxyYsERzBkehNnCb8CrNUJ8vomqJQ3AvKUW9xczR6nZBCRQ70OoLMFag4sd9uUO2iaMfpej7iP1X72WtH8htlavohdGxefkScgi2iZVRD1S5s6E5JP0XaIFJ2whK28hrumfLRbwQBh2eCgK4OGNM2Vm866u7m5N7IsBQn"); yield return (Hash: 0xf18d357fc6b3d1ebUL, Seed: 0x0000000000001295L, Ascii: "mGHQ0u4zgPiTK747dKXZmbfNi9ysFykGTrJmSRpCE4s7gow05r971UvrqDWNGPKjjZZcJg0ZvvhV0lslVsZ6a3yw3AXHS06Wp2QSpQuskJrMLiAnzu6LgKGKMc21D8O7hnr4820P506ZiGzVfeO0CeB4toFYNd7PVB96l"); yield return (Hash: 0x4f7964452dccb474UL, Seed: 0x00000000000008cfL, Ascii: "B2ODuv3lFxt3qofD7lNmxvzpINollwlEZodmWjMPYHn29b2RsUCMGjMkYcxJKUpF4LNC14283aowzsqa2VrtUuQUyQFCIC5qcUcj0ABEDnhzUkk5rHnLVs17rhUeaCQfijc9ubvFzT6dVPasAYFu1ERHMiXctm21kwKuaC"); yield return (Hash: 0x856edde88a5ec715UL, Seed: 0x0000000000001246L, Ascii: "bKUMbezUjDvlxfV2DrfYQZrIef9tk9zupc8xyyq9LK0zQ0U1BgM7s6JAafSQXmK9lVYLLckbaULYxmhnaVjvwLStHZrld0g5W5UDgIygHvoBeXB6OYsuUbfjmP4LrHzFr28kBmqzmfhYJSv3PnBArSleZxfLoSU0lfh8Fl"); yield return (Hash: 0xab9fe09855ef1c04UL, Seed: 0x1b007726071e7058L, Ascii: "4KW4aAYsR6GkllK4WGt6RkzTPVw6arqy6tVMmra4diCo7iIoCxwAICkGpMITGYt5NXWYxNGwekswGjPU2oNA38EiWGWohCCR0NJMX3NAzbn85kq3G1ntdVWpV2CxK0QVbkCRsVymxKuD58qPblbD5NMq1tGZWPTY8PNlw4"); yield return (Hash: 0xf04b7b549ba07472UL, Seed: 0x0000000000000a11L, Ascii: "uFwcXzidGnJX0g1fRClmTSHrfpB2p7ZriGoq9a5GkMiqmdihUfOg3cC5WbYVWnWSU2szmeeolCLnT62oWrNNeIyQE3xAebkWRjQ0wJMvFNCZtkhDcZxX5nHT0pkMDk2W7xmT8MgN4bYO0Ze3ToN7oONG4JVPAYODqS3HTu"); yield return (Hash: 0x58cbdba3472c069bUL, Seed: 0x0000000000001c19L, Ascii: "FAuCN3mA3XboKGeskyl2jzyDFlcRwrtSUuih2vLkE5nELy3xGKB4bSnzhkyHMBCjvfpyqsqohAr5HmwdEacCZ5TWa0aym063UJpDnFN9EUErtqFARiq1Bgv6BxBaQiIDB0InavI1cKbznOUddVxS6uPXPt1RM3Ae2eqWwZP"); yield return (Hash: 0x7341786a33b3d91eUL, Seed: 0x0000000000000ea8L, Ascii: "DmmRYqWD0NqRtiUbaLLodxyDMcmFavA6AYfaN75Xu4WbVALfC0pGrM82bX8zG63Jbd4Jf08qTi1EyVohXkiqCcavOE0i1txTl2fpIOtYuIXL9sc2eonjbuLjoxG8Y6BQWEaqP0h4AZFcFYD7edvqZpek4s7JI5gUpRgQmzF"); yield return (Hash: 0xa97e79c65ec907c1UL, Seed: 0x0000000000001e25L, Ascii: "oLpP6h4aqJFX2oEbIMGtrKEHJu9K1mZsv5C1COJdEsHraUyHBKJJjWaaSaqy5YErcJFosnEBvOL9fi196BhwNzPm7tc88Dv2ZuARvIffOZkuzB640TND6To0lUmar92iTs0tHshgbzscV4qSkKoAWwuieAonG8CUOVaYvqv"); yield return (Hash: 0xeb39b2c494cf5e59UL, Seed: 0x0000000000001eefL, Ascii: "EiFDWQoocRk2oLlnRbTa90CrcSPfE9pHuMEuzw1V6PNk2TEmW596EgXfyAbramxQxDQ6nfLnJi7SK1CXNySz5sXKcSOLWI6bNIbbIO146PIDDKQUeP3UE7jOU9oWiLkd3t8OASON1HmDOMVIFJFDJKQW1eeFeKc8F14buT6"); yield return (Hash: 0x37b1e7c9c97eb677UL, Seed: 0x0000000000001686L, Ascii: "G46BeGhk3L6lIhNk20fRI6NHp8t5Y53kfn7UV0F1ZIkjKpsXsGtKw57alhPdT7nTC4QrH2Y9byKZUckDWYO5fdcMhmNlbwjblpXwLsNlqEG1wH9s8wOrdgGZliuLcoqQHXN8aSRNg0v8WHr2IRjyjwKQx392I1Qg36m3tDGW"); yield return (Hash: 0x6d87ee053123d89dUL, Seed: 0x7ee96f72c661a920L, Ascii: "lXCf0G9tGPCiFzFhhJPNwavhc81yh3imEgZwfBTzdWqD1Ehg0mSFGDZKa7onMP9QPaEkdv5xkX4Ozc2H9v6RQjVdzq7s9KeM9BuPqllVAvZl0RUs5jq1omWntpf7QG5dBz8GD8eoVMX0RfG0f1FJ2bc3z6WWtCSNGLsoXkG1"); yield return (Hash: 0xb3d7e4f91939fa6eUL, Seed: 0x0000000000000000L, Ascii: "DV3Mg3Jhs0IdFiNXmyHyV8WG0bRMEJrzNMgQuUlrEozWsJY4FwzYoiro2xv1Cuv3VhlkLfj2Zzjw4ssWF0jpnEp60iUXF6L7JxXE8Q5ZmcuoxbeIaqiJMUFu1HYjHnwtQY1YA9JmEbAUtbQyjRwr6U2n0So95SY0dhzcnWAg"); yield return (Hash: 0xf52bb5bd9fc5956dUL, Seed: 0x0000000000000000L, Ascii: "UFYQ6EksaCxSOFR9IBWTaqOlTPWBamLYhNOJ2bSRjTrYwNJqbgqYdPF2VnzyyKDd7hmJP3JSaCtDscRlCIUTVImZvPeLKwYzaMjiWAoaAKf5U47OrSWfCvlCWWaMtkTBRjlVguOEPiw0piqbp4v1BnPkO53qofFOSyFS9hU2"); yield return (Hash: 0x4190eebf6eb65028UL, Seed: 0x0000000000000736L, Ascii: "Ycfm5RRicse1McJ3pUaQasVQCBPB4fMn4UFJnkZGy2Jz3qU3rmTWldgtsQqqNlNewIBsXBWbCKVw6rnCxsOTkUwpSt94mRQBUzgng9c8K0txX7sDUkQfQ2obbhyCeMChfhDyv9iYb32hfLDc2qTwiyjAqe7mIBa2YBac5YLMa"); yield return (Hash: 0x65f30d08b22a012bUL, Seed: 0x0000000000000000L, Ascii: "TGrNfG6t279sfcTxZwhV8q4w5qWLjC4fCHAxc2BybPffMlwUA6SbAhiYRnJ1FSX2Ve9ycbDKM8ndkJf1G4BWfxispDLNAFDqeZnG8GyfelRK0njYMQgqCcYlIeYXhkLw2TNR3HiR0vKNDeo0PjHFTB2aCHEPG5ZZ3yoGwYaGX"); yield return (Hash: 0xb0e6863075f4b03aUL, Seed: 0x0000000000001099L, Ascii: "byYoDNAqkwTTjOJzPNGT1QjYBHXqSGpMBXFika3fsMjPm4WIUSBX8RzfAYsntzlZv22amjp8LpyQmHwK5YceDrZe2D8ZNLplxeQ1cAOQRwNJG7wIVZDS6OBWJakx9dwXdTLtIul8jicOX6YwCkgneMI8qG9AeqB7oPPSSRbAJ"); yield return (Hash: 0xf0add7461bcceb7aUL, Seed: 0x0000000000000000L, Ascii: "eFvEvT511W4r8irHUFyq5xVn0CqRS6w3UaLXKTXjTfRDrOtidaDnlJ7n5BxsBPqs8wJYqsy2xKs0c2xpcOMQuY2eM7XKbeXlwCnKbfGMsjOoBx702j5CISzowT8lA9hVLHTOLT5ptWOprU2Cazt7SlhXvQpjCutzWxQNbwm4f"); yield return (Hash: 0x36ca983f42f69a0cUL, Seed: 0x0000000000000000L, Ascii: "69t4PnV9HZjqxyd614OpQ4UUVFaLwLZjHwswUVhd9w5WRpOOkgLHwinBSOTBdBGdzVcD5LlQ8rfEfG0PUPY8OpcXvxLFSp5y690sQPgisz3dsZQkPGwTfRWXniGtLugTEV9DvBqe26JsflgQ3WrAgL61pesPLqUjGQOjTZ1SOs"); yield return (Hash: 0x522dca075c269911UL, Seed: 0x5b6591895d28d90dL, Ascii: "7LoO3KeIOyuTzZUVLLhkpHHDk73ESMrTtrgAvb8u43USMk6oWdez3ltcbz5dufMfnBRJG1oTNFArxx2YJqO3i8UVdkAA6Xar24iigoQIN4wYHZGJ1HKJJkcVunTR0rQrcwaKTxxgDqo0wd4YdAxx85mNT59P3uRpGpHIhYBFzo"); yield return (Hash: 0xc795d6b7546dacf0UL, Seed: 0x0000000000000f3dL, Ascii: "yphlsnEFmkZwrMKri2QCAhHbNnMViBQuLV06ja42hK7D68O8Y9TkFO5mwYVZVAqnbEw5i3D1XNcmsyfyk5CmKQHq74h6YSN8291cBDvQ8lCdUeVRPxE8Jqds47truLtYK2xPMuYoY2I0aQcRNdWR5JIdtQe7KSBEzyR3qgVmYc"); yield return (Hash: 0xf10dc3d150a874d9UL, Seed: 0x0000000000000a6bL, Ascii: "RNjhtZxCyOOjXrJABHwbEp3oXQIfeYijz2H6a965ITyBXArhkw49dtRSmpdakArrBtgMLRpzG7FPn8aKdCTh6bbxcMTUYfUH8HVAAtedFqyX7jJ9jyI4FrkPOKSiEjXpL06mlyJFGZV4wXNMlygi579Dl6EF9I1cItF5Y4zrhx"); yield return (Hash: 0x2d75cddb344b694bUL, Seed: 0x4bbf94d0e3316a9eL, Ascii: "Ve5FS4djrjD7bhCuXFhvQceTEKnr1ILCeEyfEmznIfIfDLxNBB5teSTP7EIQM9AxNe9GqivC7aU0e84LHgJcbURShbVfJ74rs1VbkLB1jKFqkq2dGmNyKJJMBTd7NhSoe8Xxo0a7zV7173HbVSotvDmcZkroJQWFLXidem3vpNn"); yield return (Hash: 0x6e67c029a56900ddUL, Seed: 0x00000000000008a1L, Ascii: "SxYJKtcy22X2DlPHAXXvX8H8dwsHH2s2BDp0KMWaF6gBut1nEArXUoHGKOq9aMhBHYr7zjWJ0ANdPVFsZQBVsxuJ39K6rQGrI2NJNwikoCL0cLSa8rLGSyu735qpa42kgaigj6RmDgnc47p7HfHPyvudYV18oqK8cDiBdEJ160B"); yield return (Hash: 0xb2fa4054a4b468b9UL, Seed: 0x00000000000016caL, Ascii: "t7J7gMiUNjRyVclvZ4jDA5GLmxDLHR0Nz3JaLBoNq6mWPYUp5QNCEMOZ4qDnjHT9Mo2RgdKtGGeT8axHb0lrM5WhQX31Lzh5nITkU1WUpKhKXAnVvXvpPC5FjRexZRwgjAkE1lgNlMZBA3MNr3sagaJLrZQoREGAJq8EVYcWror"); yield return (Hash: 0xf8683f75cbd46eceUL, Seed: 0x0000000000001d40L, Ascii: "f9Sl7veXY1JwUr5KTQaQauyOVxeD6iuWp7KzhBsUI07Qp69jUqlpqPG1propVwt9pAcghPpr3vOkuHPWdtCcpsQ17YTC1MrZqv1vUs21zHHono4ITzSP4vCXzguU2SiMd3zltIi1O4MOb9nEyduJGDzy0aIJA6V6moDBYykyxft"); yield return (Hash: 0x717008abe4b0bf95UL, Seed: 0x0000000000002639L, Ascii: "DPFLTNJwyO15kY2flHP2CJjYhGs7cCxhIdiXdOvScO4JY1HAyqyjrzN1W4AKXCkVTQnNoD8p3QvisKTeK1jFRPMrplnoxyDti2f9vFLkIadn43txwZtwudaqzixWHdj26LHvQKYdHo67lEaxWOqxV5R6nXYChKDZm382oeW4Avbx"); yield return (Hash: 0x88624998ffafaec5UL, Seed: 0x0000000000000b97L, Ascii: "li8b9ODwJRG7oQ2xanuTE1TdLAGxVNqexRDdsN5yvD5vwcgkF09F8Z3e4jQZcPKsQ7Rse1k14tm91z34vTxBHbBhhht2s9UuYr0RgmZP1t14hCtxxHGbfn7iXTxxce1RDMzyOBjV8TD1L2uiev7XK4QfigJZ8ZbJ6ZkBjea3r7zN"); yield return (Hash: 0xa8ebacf86d4efd20UL, Seed: 0x41e37724bae99a43L, Ascii: "QXIZfwWkXQkRwZOCC1Rn52AN29lLufsyDdtWMgkN37yUHN8QSTgU23DMke9zphultPnjiXSmuZG4FxAMNkm2Cxvbw2KBUq4lQl2WtW4FY8f2MLu1XYcdwTYRFBDt8EVZRI5OngKLTHB6koRF2NZ1l609ESGyR5WN2lDzlz4heq5U"); yield return (Hash: 0xfb5bf37c47cc2415UL, Seed: 0x0000000000000000L, Ascii: "JN0f75tX7QOtnnD5Uewz0xVY5l9pnTuNBCXQjd62JKAkbqYOGLOKN4qM482gC6TmNyWbjNlVndw4hopzHGJB2thEoNO1d43R5bSDc77jvXeZ8zPp5mfbIAAoTnsFbCFjDVfVtCYHHMz49JE8IWThoguCwoSQDQxLc8e7QRl3hEAh"); yield return (Hash: 0x15ac367cc39f8d7eUL, Seed: 0x00000000000006a7L, Ascii: "Si5ePHomZqzQcU8dkfDQsnLpQA4Ys0eUuJQnLnAGU533xVzVwr3i4OR7ajLCR7DOX2Xn91pUCZgQ5yyJ8nfDU6YRBnaSywnkDdrpYp619DpZCBLlzqyCnaCCVPMVOthcXm5o4goGS3yaGxJfRYCnMoy8whFGgM4OREQFbFFF9frAK"); yield return (Hash: 0x486f6211841bb665UL, Seed: 0x0000000000000000L, Ascii: "qgVnQMzRNPkx4wFffJKN5iSPLgOQwRl9Qxo4oa5Ayi2KaMIB0K03LtzfNYBkKLbj1AbJkTHVlnvtvlNReKJCMmwn3NXSEwp54qNO2lwWQO64u27Moqg0vq5gS5DXfIS9FTOYkWVka6jNfn846s6yQa3iE5sBSeazk4domSEjjw7iF"); yield return (Hash: 0xcc3cfcf1263409bcUL, Seed: 0x00000000000008fbL, Ascii: "yCh3xyhOIarvSlLsPB54PQ4EoqkQH69UQrhwgUDD8IV6HrCxu5EQMMiWYpeSfnXhtNCGzU5xbsSrK3LxYq7AkZqycazjplStIbeD8IUuaY70dRLh9RGToYfHEJpVKiBRN3Ei4uIksoYq3eM66pZyUag908THDQsFsJrrmqqChdorH"); yield return (Hash: 0xfba75e796a53b26dUL, Seed: 0x7f55f3730aa104d1L, Ascii: "OpIHHgp1poW3DqK0flDsZbExyh8odgUdC5KGUIHPZbRp8gxKauoOcdrfuWrwHIz4K4q2QVHIXqCjP5jbCM237CJDSmEXBQm5Xe0fsTgzE7XlPRdeS3QSdrkWEE38FFiTsSlqlQbzCTzI8nREphY9dxViO63kxDkWOKZ1NIeKuUrFC"); yield return (Hash: 0x3c673eb521026781UL, Seed: 0x00000000000022c9L, Ascii: "zaA4n2ZzbeHZICkmWLOUqOo6DSpcGaknEnZmULFYD5clAyrvkEkpbktQiYjjs6CgYnd1q5tn5kgAlRKg5IB7jhcD2uEJRNT5AMXvon83GrX64c9cxRsIPNgBODuzvdsFBJOPikJ2IaQgH2O6eoO7mLQw41pQFbVSWvJUnwsWoco1dQ"); yield return (Hash: 0x603db37eab4c07d9UL, Seed: 0x6adc8b669bd6311bL, Ascii: "TBrNqFvW930t1B0Cf7nNX2jvcnnTyuLYHhinwCkeKplwLBZlVtiA3PAqHPtcX5KBT9yvhJtoBMHw0dYhSsSNx8LKHFqe1RrSfjMmp6BLUYrOtbykkf5Zf5dKo8Cw2BY87RoTC04RRsDEMB5s0f2Idyc63aP8wDJ5BqisAH1GSSSG86"); yield return (Hash: 0x9e123782edec08d7UL, Seed: 0x00000000000017d2L, Ascii: "TQuxURhF6DjeDoo9sGcQt9pTeyy3O709uT8FBfjZZTBiuXl8KPSnJzK0aKWFgHCwu7PMGCkZQw7bWfV5MUGdywz0WUE0twTBeKcmGoCe5XR18R0X1w0XbkC9sFKGZIaTKwbXqeFB46Xrb5CiZnZ9hGVBJKqac8dWO8yVgNzWvsZzWL"); yield return (Hash: 0xff6844373b05a80aUL, Seed: 0x0000000000002194L, Ascii: "ZbzTdTGpIRbfH14hhoaoq8swak0oK0wYRImyQ06Gospcns9avJo7aAxY1xHo1gMrKW6f9ZXqqrkaNB4xx3CZP5egAyN1NNwLz7BLdBlWrpxJWRg7IqSdqsGAVWKt5iNmyTaN8Fhw6yUpxVqruGJyCHQ5zkM8rW6xFSr4gXDIrNzmWC"); yield return (Hash: 0x3bc425099ec0b3d5UL, Seed: 0x0000000000000000L, Ascii: "a3zegmCznlfo8ePYK3gLwiSR0viat3PIjkjl7oyt5xQ3QJE4MYrqAW5AJwwCJpNWIO6WpYZsA5EchW8qD0iVec5hRv8NEKDTPopzR8ttgGXtjcO2MFwrR413qxfK3NxxWtdJ5cfJBCzAuSxrdQNYBLfLMy0HaAQ11855fhSvKJ7kQ2z"); yield return (Hash: 0x6645ec87aaec7b51UL, Seed: 0x0000000000000000L, Ascii: "h8cEn1EWrsatjwjYT9bwKJz6Axxs7pQ6f1lvydrOqtkP0UHjyxR1INj5Z3HV089qdMQNxlrKwnGhrlq4I4iKxlTJIvVFM8HzgEaqoh8QQqDABobpN9lbfQsjlbJNM3gH4FSUDrLfNcr6cSAIjqlYEdv1Md0YaDlqsul53iXwpVPgC0c"); yield return (Hash: 0xa93a2819b4fefdc7UL, Seed: 0x0000000000002589L, Ascii: "viOHAyJJSBIki64hUgbwyguF2MhMloJgbw7dAy5pijA3zbJObpRolOrFr7aG4Mx3vXGfr97eHvN5EOaYS85daM70YM7vm0SDijlYdr3C95kfSavEnx5TZlpQuMfwxX7MxfbWUZkxTeJfQVpQos6wBHNIG1kv2f1yIB6gTdZC9CP6Qql"); yield return (Hash: 0xeb66f9cfbef6e71aUL, Seed: 0x0000000000002343L, Ascii: "RN2Ed0iusynRxoH9LTGfbhEB0VE1aE6grVGPqCatvVazhxoTzz4XH6Tfun9YEVLoHnEYGN5ofv7F303wGv06LvwnZQ1HiukdekVchbdcNSeVN3tplqxZERR7HBqJPzOdBkrXcjlrtWKQkEgKRliMpcFxgEj16EDV7Cu8PIvAch3c4oh"); yield return (Hash: 0x628e2ac8cffa3025UL, Seed: 0x0000000000000887L, Ascii: "C6d4lvLwj6L4OtadVcgzbHHXeZnXHHTNwJnlz2ORtfiSiZ5jAKDC5BnOyGuGjMc7wX3JY7TJh00PeCEVoxHn0yF1Nn68OdHnWhjzVoyjOjuG0tFm7Yk9sQbXkPqbCa47fkxQbjXna2qenclMYTSfng0yauu2xMxnQY3qcKbrpSrdED65"); yield return (Hash: 0x955ed174883a1043UL, Seed: 0x00000000000017a3L, Ascii: "dZhFolrz3cgY7Bcq6joKumrEi9JNFY70F2CFIMe2SxObMQYGf52odirMHQcfPCiV60WnFOWJmJBd3rPXdDrcoBdwObFRvCudXHaAWcujfw8c15DGZHlWLk1nZUGIIDR6XYnhgrJ3WETHGQ4877JEWt5I0qVenQyQezpDz09mX6CK2zhx"); yield return (Hash: 0xb1446dc79bba3433UL, Seed: 0x000000000000230bL, Ascii: "dLsYLvmOQYnDDlxDUXalLzd1hFQggKxJBB1jtWnePp2t4GQUK8AvuEtXsih6rvdB4r85lthPIhkcDVcGmFrKLMuYfzm3N8eCSfab9WD1MztTJkUxckYzMSuynESDlLUVWbxlgeHSevClVjKvqpsHCa007dEsuSiIvswFmnH8a0mQUpRh"); yield return (Hash: 0xdc92c519ff918590UL, Seed: 0x0000000000000000L, Ascii: "J57JXjaL5JLObJQ3oUgLErePCRDzNmtkBDUmVsU1pwTtydAIDL1pGiAbRqimx2z3aUDtLp01F9NJgpBnTDtvNTSW7UGxL0qe3UhUiKbaAvEbUTWlPvTippmQBnf7yfnGCQCYXIRi3DyCXgvYWwqFR9eqB0ZTXg6WL371956TmsfNHgQQ"); yield return (Hash: 0x27912ec03fc5b479UL, Seed: 0x0000000000001dccL, Ascii: "Lq8p2D0n05LdsOWZSC1ZW525PgNUp5nPtzmH2alnzXQg5TZRnrP0aZacyeybvi2KHpPB84lCFZ8CBlk5hvrIbuWo5ji1cwON7QL3AQ3vqVCUbmvnmiO3ylX14r3huWVEtVxFRYVNBjNpv4icH8VoYzfHkmQ2qbamgTz0lmM93qbgIPLnJ"); yield return (Hash: 0x6511ebbaf4eedef6UL, Seed: 0x0000000000000000L, Ascii: "VkpCNWkIT5EJxuRljD0VJvqY5oN82jUPkHdXlBkSmHYDCuCuBxCdbZKS4pw93Pd2EohxIGFO06p4BBCsIceenb6IWVVdIiKZ8ikKjpm1gjr9RijjMxzvgvnW75l8VxNt1jAJ1Exyb58zNPP2nwz9rLqlSjEOaCItOQx2rQrnqXC2Lh3dz"); yield return (Hash: 0xb275f2c4494d93c8UL, Seed: 0x1c30f1d9689a88cdL, Ascii: "HW9zQM7NDJfQSwMCXH53n1SFltoHkx39AdTkKuwTPg8V2MIQcy6SKYtqYNFjiCQW1iDSTQxYLcPmZRarmj4aj4n2psQW2oiKX2Vhlc5KgEdApEXsc5qqYxcDqUzv8nHNDexnAmagY2Cgi5IHC3APhDwT6oEpBslz2gBBUyTfF3iz0g3pD"); yield return (Hash: 0xf58fdadf300c4fcfUL, Seed: 0x0000000000000000L, Ascii: "f0TDQc3ksKMeoz0XKg7ubWELhCTzvrtP8GwCVSJT7lSTo7ucoFlblH79GnkNvOv6gsFxCWWlKjKPFjo5wmOe27DMu9kZ9VXwnTbnGDriFtaH6S7BOR83KHvXm9Y3whL1GEWHQs6sY7XBDmCDwEjtXQmBfx4K22i9YdlU1B64e17JXP1Sd"); yield return (Hash: 0x2d63af624e8e6361UL, Seed: 0x0000000000000bd7L, Ascii: "NWqOsKqA2yneMRscJuSwCDRnCcJ8BRZdH5r0bKcFOJ85TB2Wsfx7p7ZIgjyApCuzWbpbqKDYEdwXeMC1n52dQkYehWUhFhi3oVQ6SCilf70cGE5zgktSFkuNbw1gUmXDRiGaXPBnxUZZPwapo05i0onEdQ3XxFV8cGBA0ScipSIujBfgve"); yield return (Hash: 0x5d1dc6bb86ad8f58UL, Seed: 0x00000000000020afL, Ascii: "eJmud8YcT1ocwrNQ2md1y8jenLAi7CXqWmp0yuPSZtTyHBEu9qMlIDiv64Df98NtF8jWJdNnM7FlYxc8HiLLm51Y9kEpsH6a79ARqNRa9EIR506YqLxQLWz7ai9pOD82iUrXQ3BAMluQk2KkhB7hYeOJ6ZjeWuLeiOndP0kKgJTRvx1U5x"); yield return (Hash: 0xafbe2d86821ec7ccUL, Seed: 0x0000000000002306L, Ascii: "18fhz9SuiXQoq8efCDhF9ey8dDrXUuripB3dgCC7aRA9JlmLfcpHcqqwFLXoqapfF2IWOPqvISuIfBU6imlz4eIGtdY2TIiX5B3XLX1LuDKhfrescbh8wZWYZyAgMqCq39gIhKLeDOp3FUwtpJ15bgyCcYfXCjZswksZbP82XKMi99Zz39"); yield return (Hash: 0xfafb9586f24f7421UL, Seed: 0x0000000000000059L, Ascii: "RSlDwXPk7QRaouwN3ZpDby96hMHm8Pdrchzs8N37NjQa2fhE23jUVBBMRauHxUV9XsHXQRNi4WYqCJqGOsGB3ebRIUKtfRmRCLdte5nYozGvhDB0itCZrLl2KW9YjbYQSylHawBo54P91CJJIyCfZBHtM31GvP4Kf54N9TmfJeHvolInO0"); yield return (Hash: 0x2a963c59c697ac1fUL, Seed: 0x0000000000001648L, Ascii: "MtdxsWT3aivOWEiFfI3rZeYfyhGraz5WRKGMUMFSew31QObTxntiBuaR5B1lCqHWmyrrMc9rjrKD9BmZ9kkMdrO2veSduNPiJ1E3k79doASJhCN6D4W41aHRUk1tk5d0WRtczms1b4xTQpXklrrPKyuOnD2w4jrIPdQdqhbOYIV9as53Ix6"); yield return (Hash: 0x75bce5359df38bd9UL, Seed: 0x0000000000000000L, Ascii: "dZvz5IhrziZVFIqSsMPsTYqm2yZXVlK16KRz9HOnoIVTXndJ9wXy8snmPBlmE4UVKMl43htrrMXmGHnn2uF5TbdXSyMDe4eM1I7nP73FZVj3qcTwyMm1E6Eqgrv6ueXkSDypLaJoO4c91lBehmBBQBfMMbzK12IhAe0oBFfYJNR89WrE2T2"); yield return (Hash: 0xb05dac9cc35ef7d0UL, Seed: 0x00000000000011c7L, Ascii: "3pZGgG0wdGRvQKX4q8EyvTnxuNREvdVOd19Oh04AW4cnzcp2rmM1848odP0Hz3MqXI7ZAoEfNv2Dzj4DTSHY8nCF91SZ5zGeWvJtaDcz3IPGAQ08NBb9QT7xXVC65Edx6g6wF93LSKJRemBCmcm4mKdPcV312XXuZeEoORzXUENzizlXQHQ"); yield return (Hash: 0xf55b83f4bfbffc09UL, Seed: 0x0000000000002462L, Ascii: "7960wj69aXsHI0qmPHgQzqQ5ZW8M9AcuYsUmmNX46uzwCvOx9Uu9KzpFUjhlDu2mwdbvdHfKMnx1td7hAKmLgMKYQ6kvYSevcSWfhNJZAUSVAe1ZzaEzgELBY9hAp4eLv3My39GdzsQPb9F3r0JvVL3B1hvgAGu0QEI8acrOlfcu5KQeFCA"); yield return (Hash: 0x3087a5ed4f5ac346UL, Seed: 0x00000000000016d5L, Ascii: "yW2PrCj4oEhwXiS3a3Ap1rsrOqXMwMFSngA5zZvYNHvjEQh1LP6XMFOuAUbUtDLRovZ3TCAtbAo49Bypi1VoKj63sVCe2EIgVb0YKWQs0L8tqRPbwRfrjdbqBqT74SipSqlUFGAD4KL4C9uKXCl7dWIvz8oyAUrmhBpat9teMSiRM80gWL8L"); yield return (Hash: 0x58e65a8690cbbae3UL, Seed: 0x0000000000000000L, Ascii: "tKkewASucUiCiFRIrqgHXnih6szxGRKOEe7jgyaepXGV38nRzcyXuvomMBRWW5XcIijG2I9J0VxJsida1PyIJK0evR3PZp8EQpMDmn7PmwFB6JzTRzRurD7YeIXcZFBfryGdpY0sLZQYn6MMbceeRqsxw17mYcs4t1V4wYsnu16iWpKX9olC"); yield return (Hash: 0xa33bc25ae3289bc1UL, Seed: 0x4e1c2997f7786979L, Ascii: "tx2gAcVeuWYTQnLACJk8GUGaeedDIblXsXQD8ITi9ZmyNNe383ByCRAeytfKe1SYWi1rXT6Y5tcJIqeab3H7NOnZnw3XhItAdbfKpBy2ENJiVyPtSMs1cLlaN2JqmRrdrThygetWxYeVdFxJmawobIdyzvtjnuykne6Pc4cEqthI6kmRe6LN"); yield return (Hash: 0xf7f53040d14a4cfdUL, Seed: 0x0000000000000177L, Ascii: "Pn1S7LvUboNX29kV6hDbNUY2mRLNUJwGqsTomTlo60bvXQEq7pJwdGNlJ5KTLV9RVD7NFegUF982RmmJxXIIQimj4fgvvUYq5jtAkT9OltBJvinqNuYneYRAWLSqh8Xoa9j4z3qiYXhegEJxuaoQ85ePlXcgDyljaPAWaFUZI1b2JCyYtzVp"); yield return (Hash: 0x41684896669cb7f1UL, Seed: 0x0000000000002484L, Ascii: "flBRRzYt1hrYXdrwGBey2oQuqX0Xe4FeGE0MUhMHnv48P0Tjkm7M9P8xWEp9Mnb4XTnyW7rtNZiodPyCmgS1QGEFeOFluj5m0Qu6YqZ8QEGmTln7Bck7AGhN0KQLwo4ZKTDEOz8GHJK46MEhoV1h47VRhnqwrp08v03FWLQgUub82bR9y2vwm"); yield return (Hash: 0x7d9843d48915fc54UL, Seed: 0x3aeda318187a8ceaL, Ascii: "xakiyYp1uPRDpENkGatZqaaVSCqSglYxE3EW75mb6ocRpXxyYtsE96glnTti6Ax34ocuI5kSKu1SUwXYNJeiXVcOR4c1ditIgbJOTWcdSjVVszT1SXkz7h0mX3zbwHkta81pf0yI1iqF0qVy7nbgcI23bOWymEFXFEwVWzqrsh3q0ZyxM0F0m"); yield return (Hash: 0xa133fe696c47a119UL, Seed: 0x0000000000000b95L, Ascii: "MAP4ZluXtkCysWGhXgNp8g5XJdAoZgQd69WwQ5kiKcNTJXDAau8YfoAh0wQp3Pt8xRTIwgqpXLibJPkPVWJrJ3a0iVFco3A1cMd9AUZeDlIngYbKUhVkDJ8ySPGymOowWR1bF1G3lJtckamNEcnflIfVUaofCBTJ1juuJgwHqOlYJsgaF9LS8"); yield return (Hash: 0xffa492e9b3fd677cUL, Seed: 0x00000000000023caL, Ascii: "pdI32M9n3BMoIz8POWSaaXprQtrNMbGttrQs1jJhm0dTx6MLRV58Y5Saa1FWxbHcWHlkymDo9VNVUI1KXqmlpZGPEvDcf16uxTkawDZvO8xAXvBaDyHqGNqldJQhsLtz2rRlm4N41SUhKB9Hl6oQjbfmRlRxXc4n4mO7qUdQfsjCjS4h8r4Nl"); yield return (Hash: 0x0d2cfee73bba5b44UL, Seed: 0x000000000000096dL, Ascii: "v2yB464jsFYA57ehyggHcHUIDgnlyy2iBToexISkax6CTrlf8haI8QqjZG1YL0hBWOc1JOAahb3IX7Jj8uSAFqKOCOwshDyuih5jisPPzNScDo1NP98EHsujAo5c7EUyDCucvDfyatwjMTDRy1z6NnpdrYKocXpOQfuLRM1RYg9QY2Xo5e6ahq"); yield return (Hash: 0x6eaa72ca62e5ce52UL, Seed: 0x0000000000001cebL, Ascii: "d6Z1rQHNfl4razuB91Z7dMCCqIbPUemIl1uCFwp1dkZddKBQ30fhbD2OCRby3hrUTkrG7rGqhOZ35qE0WltDskgeGPZZdkcGMISX41JwjxDXg00a6kDvKupwyQzK868kESLJ8SElB7G3XAu6fNbvwdTFhL43T872PKF7Y6wnkK1dq6fcGuIRNz"); yield return (Hash: 0xa7820938f2d423baUL, Seed: 0x144723cfee66f76bL, Ascii: "zTUm7XCHKUGnExdeHD4d3n00gJo1dDsJV880dRneEw12DxJQwbkf1kfge90GblTqRwyDEdEqL3ygOc77onaKIux5mSz5DI5O3Lc6r7ynQzOyJ4iBfZUu2IdBT89hdeo2FECqlN4qikHysfz66Cw8umK0xJ7AwJWZGgmt0KsSdm4KSgXDmQumj5"); yield return (Hash: 0xfec2c55ffeedc484UL, Seed: 0x000000000000030aL, Ascii: "a551YE3acidpdsBEAbKSVafw9T5oA2FlaXpDOjBILDTLOJsgqCqR396yARyFkvQWU90eu9lM2Ts14MBuD3ZG0gNHe2txRmCejSR7FPvcYQiqsoCSWE1XYEZqnM7MpNENmCyULgc9jahlaRZcHi6cjivtHBKMgK7GdjKEnhn0oGNG2aJF1Jlm2A"); yield return (Hash: 0x4b5ca143ae84563eUL, Seed: 0x0000000000000000L, Ascii: "N8zaWjtUPYwptlEtQHKytOaUXDLtti1azxEysaZMzVzXiF29t2gNjwM3DEHyBpRsO5tttioaLgXoLNYBGtmMyrobhVLpzSLlS6HlC44PpvCwimAiyduddCVUUq9giXLMLGNBtmRg5lxhrBfhLyyVTX3uE3u10gfNGnvixQ4sNwzXQVfBW982Fib"); yield return (Hash: 0x9a403a5278b9ede5UL, Seed: 0x0000000000000d47L, Ascii: "ca0CQsE9xvx5zoHANK3MHhVfwxuu07LZHeEuXwosS1y0ugSBa6pR8ac8SlnS5LB9wFCIUSiDiThnigKVi9UqSoXgFmJ5YN9l6NPJSfB10dCzz6Qxc5uJXhA7H3xqMVE548HLwaen8YQubkRCpVdHgnSPMHKssKchUZxUOlHHgGRbBaLoGIArnce"); yield return (Hash: 0xd58e4b4ee02c3e0dUL, Seed: 0x5568b6f89bac7088L, Ascii: "QixL5o3UG6iQCF2PplvydxVCtIjonJiKHCdZaEUD1RGjN1gqR4uGMwcB0MZP91IyEhUyu1Rx6DJmRyHGLdFZjLkXMtYAQdfms9G4wvO0QPzAYJbsz3Y5ap8ciOi6LX4aOJWAvf5ziD0uJ1TQWAqupVSpJmu2hsrT193iOYmTbXc1Lfgci75Ai8E"); yield return (Hash: 0xff563f92d385e8a3UL, Seed: 0x0000000000000000L, Ascii: "mnriVJXia45AHhEjsZeismFaGZnDH46U4Ipl07CN39zUsfwNguHdfumNQczQOjbCZjx5EzUGix1989IKEiIIbs19krp5JJRiVBsp6j2r7bwJwaPANOllxQGhzFs18scV8QoVDbG4amGu9LoKKJ5a059GcP3QrahRBfEH0LRLOa99ctrOkojZu3t"); yield return (Hash: 0x0f5c233973b5b574UL, Seed: 0x65ad2bc75727a669L, Ascii: "BLwpEgFYeGxJJb1qrdp975NnOy6AWRMj7LA842tJFqWLUUGaa3PsDCa9zOOIIgIiTNTYRJCvBTtPeoXOiTqvKsLs2n3XfNMTLjrBACeUO4J5LbrKToq5URAR9l6DRvsaIlYANAXAEbj4R4FaOFarRUuNt2n0svPqSMZWCQgSRtKmuTSWE4BRTKdg"); yield return (Hash: 0x648a34338cf909f6UL, Seed: 0x0000000000000000L, Ascii: "ZCMAzC4R4SolVuavlBOqxhSjlr4sRN8x5EWoKzxvN3H3jNjJ1Ckz0NrAdV9bp3tNxN9kwssCM56oEG1KHCTgJ1t0Z10Qes09k1JuO24swHp7Y1IySnK7SqjI0ZwETMCiQFL4qtsXt62ecCRzem3l5HiwXtfkYeBYu793tdJlcRy5V1PRSGkB843g"); yield return (Hash: 0xa835667cc5855661UL, Seed: 0x0000000000002279L, Ascii: "cHahV0PeKgS4onXHTJYVusiYLXtbgXBHgW36ziefpkCzVBnrhM7N75u7azuu2wIWqkVAoOD0LHhN8MWeFVQsg9ErppcUE22HaCHyXwJ3PKwKf6DylWXe3QXzWMmGMcNe935CA0vBoQvEDA9EawTdxa03SgwUApCF3KcVmYTCA3rfKgkKlyp42Nz7"); yield return (Hash: 0xfae537462b479731UL, Seed: 0x0000000000000db3L, Ascii: "21ZCWnU0rbsDyYJIgw7qcYmRCOGF6cT6Ovq4irqpQpU0ATCqh9NvrrW8izTwx1zemE9PS1dxROTOXDLkrSyGBaZDijLUKHjnpLzd5zacpW0H6TaT3HL1pLm5K3obvwavi9V14AOvQGQl0DpgHUHpd5RFFDiGsSM2urjP2yHZrChkjwuKh6cME6Ik"); yield return (Hash: 0x1e8c6978dc6e3678UL, Seed: 0x0000000000002345L, Ascii: "z1ioVlUCa5wzoh01a4WOUhY9uj4fNcA2T1HiowIKE5eKPqaJfFB4NSlH0HiWpObtpV55ESYNeVD5gLSp3TOYgRl7VylkpJDUPjniPLSlfHJHVbHN9SIzEPqXn915PIFzrn0LoyMOfWyduJH1vVG4jHgNFKDRNbzIiaznFYUDfGAjmdqusykzTlupo"); yield return (Hash: 0x4bd266ed0155ae0cUL, Seed: 0x50d6ef30cff0396fL, Ascii: "LHditi1jQVTporJKnT90iwBECIdcVV8SCfYL4SwEWYBQygOC523O4beSJERUb4FIszAvarFvFWUUW1ADGk6qiTKk8WJ6QVynphASLoBRP0Ns6KzNJGKBRYkm4MgFnD7klrBvmrMVrwndYNHcoiDiccHFX0tgX2v6dmYfdYmIA8JrpxxCS0F5rywav"); yield return (Hash: 0x6aa60c80336323d7UL, Seed: 0x0000000000000967L, Ascii: "aG7JhuytrqbKSBeGsw1M2HFyqPldvTVLlhKrLFZre5arHSuTe7lAdoQkSRGn6Cs2pZXhm4VItNqsjvBEyPatyoIFzxNWwxkuJerDGDDqdQe4ZaA3CtxkwvYeyM1rvP3sNiLbzngb7kbSfaYNUcfrZQSNDn6NOsjL9JQAt5bFYHpdyQmVzIBVicDTe"); yield return (Hash: 0xc7ea29632e8148e3UL, Seed: 0x000000000000127dL, Ascii: "O2FnWmdorQDXrcKFqb4LoICVEjePiqRfSoJj6g7bpQ7L8dIpKjAU1XYA5JYL7pSj04V1L4UZq8SNS51ngDYq8PE5zbMDflca7AIxsU6dVK7i0CusqTWOPU73I2XwjttAyhgO4eHLyIYkkd6rKMdYYAdKObsuLBOs3zDWkSXzEoUTjrcmAOnoSyAFT"); yield return (Hash: 0x5a4f7550a94399e4UL, Seed: 0x1f5466a634b2344fL, Ascii: "7UKc1xLfwgsT6EIWH7d9nJ71CZKIlK8f14bJrGtZw4kSj3sBbOi7Et14bEOSyJv7iEOEpUdZr80FOZaZLe21rLXCpEz3eJKhcv2GAc5LLCoHGLvhKT02BoUJYIsTZGy8pasoGSVZ3y5nkO7q43nlU1QyuyI9Tlbp6qxdqEp10ZBXExjttA2ms8EHdh"); yield return (Hash: 0x889cfeec46026d29UL, Seed: 0x5333704f0de8d057L, Ascii: "KmEMSK9wnBzxZZuLqHt3Rp7Ca8run5dGywtmJ82nnLwpgjF7ef82O7aiOuNtkOmIEPZVO2xGbZxWw6oLbarM6QuPLQxozommRgwfI9ANID1KlxyQfeIQCTZ6FxpjsysZhB06pTk8Ia7aSSq2y3E3z0fU7SRBZKdfbeNoG7V9TOEvgLaDvKMAjtkXS9"); yield return (Hash: 0xc4ee5654736bb04cUL, Seed: 0x0000000000000d61L, Ascii: "0sWIE1CjQRzucXici9FVQj1X5v15FH5TqDWr2mU9yBjiLg4wX1RzSREVeapJcqd3HOHXyc5WDbNawA8E5f1CNKobgNDvzudSN3B0DU8ThHCNpqeWJji8ZYOMomTzHfvJl7EfhauJEA2AbS6I2YrlLaJRnFsp1FxWZDP90wv35GjDSQgGfPQrXBDsPg"); yield return (Hash: 0xee3eace35dee0768UL, Seed: 0x0000000000000000L, Ascii: "j4DP169lyPbb2ngAcgQ8zhCwwZvp8rZpR04glQVUuv149TPFjbM3OFI4AaR9tZ6ywHjI1dj3DJA2cosLJCSdeaPf61tFrjqL1IpA1fmyfZtzUjOC34DZ1hGCKwra4pcwNKzwFtgtvMQBfkoHVCeoO3q43BPFJLxRET8vz1cHQFXVdEHGLTxgSCfO6c"); yield return (Hash: 0x26d14d85de2f43feUL, Seed: 0x0000000000000000L, Ascii: "QXvSj1TRkxyJ2oNPhfDScOxR1yysCzWx2xcZClxeQDXB6S76pQgMJ6frZW5WKRPoAfCrZ9qpycaWvRzxo56jBoaTaFcSMvAibeHRoQcSmKLMAX9cC8lY0T4gFjNkO2bqiRy5cUrbS1ksHotXiBQEuT7ukaj3z7qfTa49SfjY5M19c0HobFUAXl9LHZ8"); yield return (Hash: 0x83bdd7d0f3f97f0eUL, Seed: 0x000000000000063dL, Ascii: "WDiVQUckZZ9EdzM1Rr7X8Vy3lmiVQJjyHfXjptvM0ND8qvMrZU0mCCTs8JKCsxsRI0vJahOSxvJA2nmo1lBgv1WxMFdomur6rNmhnJT9BBoGNwvjkNWB1RaUW48pf8bjWHxQ5dSQCBurFIM0xSbzAMpD6fbldCHfs3rPCcM0Q5p5Tpg5qvMVMBq8YAS"); yield return (Hash: 0xc65a1b603a520ff4UL, Seed: 0x0f5a789a30d0d57fL, Ascii: "ERqJy7lwgnX8MtZwlGqJDKcBH0oD0qen7ZhM7IqzYTKBZJeHervu5svOIBYpX5QL6yGED1clTZZea20MH1Vqa7TxlBNHqvVQgogH4xPGK3cZVlqs0707DtyX3d90t7X70ZFQ0YrAsjTgFCtwUiqiWBHW6jtOFjX5guRs2AQoKPDQRvQprHJqTbaJpL5"); yield return (Hash: 0xfb455041082c38b1UL, Seed: 0x0000000000000b78L, Ascii: "8qwcfLY0YL8Rhev6F4Yh2UFvKUYFwRNolzqxZWEYKysMwH0SMQs0Q6L3zfvuyfYVf1zTtxmgtc4VaU9w9RBJkbapICbz7Su0IbJrlZj7g5QnJsfX1FlcD3DXJSwFcrbmzUQx5fTqRUingqagLNu74Hk3LdhonukC8qUf2KXxNKlGNHUcta6bD6PmuCD"); yield return (Hash: 0x2dec325d348b6ec1UL, Seed: 0x0000000000000000L, Ascii: "XYn3EnzSkomK6EzY1PaQaoWertGvTTEnrS92QSFEf7Yl0JHfQHdH0aDodYrK7NhJPXKJmC0nJIWucSR3z5O1rtPfZ3YKjcemEShMTZLY5Vo5QUGVfz3qJLR8OJEbFuiUF7lebMcA6n8vTrkxNnAWFq3LeCuW33cS6hgoen4mUsS3aNVNwjWZYPKcuIxU"); yield return (Hash: 0x40f26a114c6c59e5UL, Seed: 0x0000000000001c87L, Ascii: "psJi17TqMilZ9KIO1XVZap6eFczLL4WtHJiixM5ylMcrKiS2uWrZTnmsxTVAzzKEWN411xYRCtr7ZGIw35Mi7KBTH3TBULI5QCWYxucww28EZyUIC017YdDY1vZPt5H5je8qUux23YTXglhSqFdfDEyfDiN29q2LZFr8j7ro6rCW6k3qpqrzBzysE5iq"); yield return (Hash: 0x9dad1abd29096756UL, Seed: 0x000000000000023dL, Ascii: "3EiVYxYs1VPn5fzkC3gpXJfakAtoeKnmmIoE4MOVVUf1ZiaRhd26wB7kec6I4vMtacA94aVdoY9QUEs3xdSVXXABd3IjjCjWLk6OEugYzM66ZJxKIdrKHbZ9znh3tWErWhlGxGVTE3Yi32j8Rud6JGf6WFgi2EZGsaw9MdeGqoNZk69GNaiPXocfNiLD"); yield return (Hash: 0xf3a59d050e8eb128UL, Seed: 0x0000000000000000L, Ascii: "46FpeGnsUKlV4iqKU14iUoDneTxp9ZhoQCscrpXrDYyntdHUDNtIQWYodm9PqZFwm3Dznz97I7inlhxPFa9m9Jq6ee29IvxaRbOo0UwQ8KE9T1AQTVFttkhkn2pZ1l6TKPsPo6wtCL9m2jyEvIY2HcBDQaxKSesVbCTd5Ufy0xaUm6o9Q06ogzJkziAf"); yield return (Hash: 0x5cf7f902cb0a10c9UL, Seed: 0x0000000000000000L, Ascii: "JmNWKJBt4LH3rbfFyVyaPkNuwwwjTS2RQ62nwGQBwF41isH9GTTF8Wrwd6Y2gZbI5ybqIMxOFWnDWN3jmTIyjjTKxDteIRjP9iRtbFtQWNB9ptt7OzDnxVajIHrJI5Qqes4kMzc9FkUeVJ52iTHbaoczMksYsYCKPCGIXQN3zKtMRUhggHLP1wFVyAROF"); yield return (Hash: 0x7208ddf450256f2eUL, Seed: 0x0000000000000000L, Ascii: "W6trZ2sxJE5sR575xVY5Gr1RXdXkShRgfa3xyqt670Zy7OnWKXwmipmRqY5AujAYBJy2YpPy8GbqwB7EbyqAawtLFF9L8aQr4vAkQf1oyVhWkeJ2PExP3X6yAgPL6SrJVSaveoUJ9rWgSKrnQgvw8i8TaTd7c5WotRzZi5fUHvWyu2AHUkopnN25wDZPr"); yield return (Hash: 0xd4e78327e9abb16fUL, Seed: 0x00000000000003d2L, Ascii: "OoCx5frXeT5abvARZQF8DbdwrN3yZJlmd2l7HqH176vO2TzOeRnYnhsMygvpcp6LSJlY2XCTSp06uK4q6GLRnmpeRs5Wllft5WUMLqsXuT5hRrRGOzGQvM4iH5coaYMFn8YwvtB9sD6p9oMwOKaSVoVLHPLeUFLr65A9QXtF8Y1clukhKWepfc4EhTnbl"); yield return (Hash: 0xfb6fb8cb3c1b80e1UL, Seed: 0x0000000000000a72L, Ascii: "PBCC5mjFekV8Hndfcv6jgSDcrJuLDQhIg9R4XISyapqDdSmk21al9rtQZkDztkbKNi7LqQ8aDRJnnKTfia5J713I7znjER5h536BmTdIHqUblGISBJgNgN7cURT23SfrJ4jbfoYgGWzm1zLqUWMuyMRDsAgfnNNrQIYG3TTQxtZ7g0BejJPKgo7CVXwsQ"); yield return (Hash: 0x390d615dfe094a54UL, Seed: 0x75db5b20f097c469L, Ascii: "rvjxm10eoISk1JvBdZ0FtVfX3DZq0WIisqXILTnPOevfy9yxV6MRKg4DjaeT51OwU96vVMWD7lNDysWuJpnxO2hJrorItYjToF79P1eLRgOqApetmpDNxj7Dwuj2wjErduxt2AYZfduLB6LLFEjnvuegUPDnSR2QauVB79fTDvftTWzz73dIF29UO7F0U3"); yield return (Hash: 0x62702c228fcc946fUL, Seed: 0x00000000000006a1L, Ascii: "ql0avRT5wcDNIGMPGoFvAnVnAFgvm1dwRmk18ZzQVYRvuldA9NoqF7umL1UOJrx2xOts7Xc7dmuWnKCOkH7YhnpWhGwY2IVwh4T0IWRnkZfF1kJXwtleX6pgErY2vfux7kdmYrx7LNjH0sJ0JFtlrXUq5KHdVWpOKFD5oMY0PDMtaEfgXF79bQtYSDyYzZ"); yield return (Hash: 0xe360d7b016ce16beUL, Seed: 0x0000000000000000L, Ascii: "U3YUfYEra0YIs8gt5qsUVsSRx2swlTua0XpIgRwxlHFm2J8Dei6xEFxPA4BUkCSBvvQveo6wvtREcBRuHSeOmxgWecXsMQVzJXwdFiiYP5qWKIlNmNZGjvAvqPBFNzkfZmhR0BWMpwPMY7nB5RVKFyhAWHOeryTtdJkCrKxT8Z9y9Anhg139jjNeFl06cU"); yield return (Hash: 0xfa442996835d08c0UL, Seed: 0x7f92fda1109c7005L, Ascii: "UpkixotoQNGcONcTFsbtb4mcFM2w7hrashYpRpUc5F9uKI5h16RlvkqICfgyUEVwjvFfN8hFD6YRtV32c2KdLYWTX5di9tjhkWIBipThPPMmoSejZIWjE3Z1tjcgbbZb0pZFv020phWTeXxw3wlQpZWA8gFRckBL6tVY6oWtbV6gUGY7nJF69XXRbTCr1R"); yield return (Hash: 0x4241342cbf956021UL, Seed: 0x0000000000001263L, Ascii: "km4CV6neshlr0GzepVNIEnWXRi8hYyhmHiS3fJzHh4YbpdZAasUCg7cFr3mPMuQPqDDUYhZeqZhj0985eQQyE29kEUGSUqnxKUwVb4AGUIhIjRTGvocnEEF46MfmSh4vrmLz4aFn8toOYlpY4fZPAMziZOXEcSe1qXOUxypG4dkQFnxXU931Mf8qZzQZCD8"); yield return (Hash: 0x70bd28e3cdfc115dUL, Seed: 0x00000000000024d2L, Ascii: "iOPgLWdCy1lrEuxUcHiPPSIubuiBiihc22LKoOqH1nzCbjFnm5TUKqArnMgnvmdSHde04Fx6dgf1bZSD0fML5mJnNSahGcxQiD6ow9KayC7W2z7Pz7vmDhKxJ4OVMq13fkvXcEDAj1MBuVQIZ0dmUsirUdomFQnOZkpD5XTJ2Usz0Dzc4vDsksgBF2osLn8"); yield return (Hash: 0xd862750004a5d287UL, Seed: 0x4fb24495dffafc30L, Ascii: "Vleawe0EnlMWaznjUaZDoOjvEzt1iaWrmD33usV3KWps7BeoysYXDbl80iA2ZzjRMnjuN6YU8nSPRpSdJtdFwNSNiO7NguPGzGaGXbskQ6cduOS1LESdr1hEhQEuSMEmrhYkc8kETwwUn2fiHYA6yGxz86w9VRxMa2Z2zVtjrbT0Hx3kL4a32fXrao8C9Zl"); yield return (Hash: 0xf50b1108af921ad9UL, Seed: 0x0000000000000000L, Ascii: "1uRmqXqP3y7BezETYuqIb4eRq44oUDrQMiCzYu8Tl2eR3UcN04BRUljItKwjBSNV6ZKrwVTSqvHAjnUP4MSAMz2Rj6kuxj0NrXhsWonPPPeBgtgbyv7Efb4Y32nHHBwJv3eeHs51sEOpiqF2TJXRCsvzJ5lfqt7jicS3GEZ9PddVFSWohyvZITlL32y10J2"); yield return (Hash: 0x23e0e7887c53dda8UL, Seed: 0x0000000000000a75L, Ascii: "T0NKoiP1ejhTNTIjwlRjfhf8aRDsM8eOGcomBjvwm6NkdiS4Ap2okyONWEtU6ZB9btDnRChjgLLDikHqKdtDUCv7kkfATbaWxKsP9PXc2wQemb7azIxNqUtczT1BxMiOETCEz6AZ5YXmd8JRvvC8Ww3MUzfKK5jmFBeT8vCYBEVarhfHpK7PDZRn4u1brrlY"); yield return (Hash: 0x599784e58b23e552UL, Seed: 0x0000000000000974L, Ascii: "e2exMRoBFO0WrmVhccHLXi5eucVyumPed5UUYOsYSzk3tstsPBEkmQt7q893koyF96vJuXJ5VjXhnE9kSPLvqJag15ORzCPdi6eJtshBQRauvsnIkxssAOoMN6rvR26UAOfj4srMrvsLpKa4qNGGR7MP6IrVs45FznrCys1XuxCgKFrGP0i6CPK1AoTVI5xs"); yield return (Hash: 0xbaf799fe804fa9bfUL, Seed: 0x0000000000002073L, Ascii: "TSQqxL0dGMSGwcQhYaaoKOSeUZnATbGTJPrUhaa2MDMR1CWS0NFf0apxUP3YNPQwQXdtlaUmgMpIxEYuHWY2ZstR8CjtysIQbZKclsaTJC2ehp9MClfkRQTR0yGt8DwfFgicUMoNjF8bgfp9KuE5iBNBjpvVyyPw2Pnx98pWJCog3JyUCegTVSxO8cPoswgI"); yield return (Hash: 0xfd963126b5473e1fUL, Seed: 0x00000000000004f6L, Ascii: "iXTGoPucJks6tsvfmjnpmkzfnTkycGlJwcsQVqWsp5ReZEceZcXrHNVfUvn4uK5jm5i0pLwkgHjraNM02wlGZ5AwhXLSXhea32lcUL0G9ArAyF1VEysZZkiquHDeEjxr00yKHHFyjrMrZrt5xQS03Pq1WR8R5Tp49CLNa7AcOuR8wnIItmeMZI4kPwdQCEUH"); yield return (Hash: 0x3dc3434998973a06UL, Seed: 0x0000000000000270L, Ascii: "wJTg47sVQ9N39ZF5ibtniA8XB0rbEZTPoIsFfdKEVEeGaDAG8abDD5Fa8Sjv93Jk1iNNKjg02Rkv0Vre4KTMS0usJa5fH4kJVHxPbJt7wyzMtEZBSnHJlxcE3tm2rZfD1Fqtcs4JbOFry391CL6Y4SZkqM6AJXYliPzxRfnZXMACCLCtrdnxLqUqGXeMPvXTx"); yield return (Hash: 0x8f38075c4cf24661UL, Seed: 0x000000000000124dL, Ascii: "0BOwda1cclUajOSEMC2bGST5vm9ZtCE9ee32HgqtfIP6uA6rcS1P7aKFQRed2437Dlnpj87gY8xrDgraOmjf2ruJ6sQVo9XlbKRjmkvkg7RsoSIwelsoEBIXZ6MiadbyW65ynEf2m3vwD42DptkKBYBLqoTgAAyE8Egd3BspMQEh9OpYlpNnYZiDPJvZo8e3q"); yield return (Hash: 0xb1b9adf6596eeba3UL, Seed: 0x32563880bd11daecL, Ascii: "Mq86Fm66UGSkmfDadjSS3UQSbQxqR5Hn4AFy3wthh3PB9q0m4xyF9Ob1844LSQulwt43Yn2QTFsmSElfyPA0FO26NnSEhBQ6giIEsmCRTiRoav6gP4jNwK0UOr3zWlgprKpeDIzBDuavaEzLC8UImmoQd60CyOymdyQn1NEqnJypOC1HEVKENXIz8mrU514ON"); yield return (Hash: 0xdce7e73ae05c6ae0UL, Seed: 0x0000000000001de2L, Ascii: "50aHDDC2wpcxTjo82ukkjaWAak0xsVlYqeWABZwHSXB6EjsvTWPqxMUDLDk6IenJR1uErGD5CmFj0KkT1c4MWDoQjx3M2ooMmSe8Bg6iM0cO1EWxkFZZWvcmXh3w0dOJ411oZ5IHBx91mcmSomWr3OssJkqc0FkcJF2u3CM3ll4jMILl6Rj8FVqg6bNgSp1jB"); yield return (Hash: 0x150aa0915ed33048UL, Seed: 0x0000000000000000L, Ascii: "FTwBoP8usBBvjMziZZrDaZfnouXR6nenK0TgWmKfsPybU7Nz2wVwp2srQMoEUNsAI0OnmHl4oTj3LOrRXQlirr0ALGTROHyUizVVAKGJsKN4TBpAyZGrRbqF2pDrG9rLbqOWVfjwTRvZns6swXKyEtcQWW0jq19j4oHhf8Wr7jh4ixAsMgCVvmqhJiuoTlKJI7"); yield return (Hash: 0x590983366a6bbb13UL, Seed: 0x0000000000001686L, Ascii: "ZXLkd1gbDppBcMhsne20O40Y2xygpbv94455Jx84KmQhvRtJzG9DC6nW65C12uCTX6K7J8PDmRhNruHDy9mwV9EI5eTgLFvMTApz3UXaFGWqAHQzsul1TdyCSGvkKoZ8mX3P78Cs2IthvaubYsq2Oyt8oBgEVR3UxwbXGic4qfnMVLtHygRIhvn2AkkXkh0QSv"); yield return (Hash: 0x6bd51c4cba5ddf28UL, Seed: 0x2bc608cf2207aee5L, Ascii: "0jU730nzyIsZYmFFEKW7LqzjhNFOINPtcIrGKxIRn14R7DE6D0gV3Ujw5Tn3CHLpwlEucGcAH3DKhZOexmadErC4T3Ma1QC5TgvZ3qcwcpiuBgXbU6ifMdkTpgx618rHvyKkJG1n74HRwKcIJWgN7j7xrCPjOCBU9s40H8Xk2i4YnS6kR1wOiRaMeBame3evyo"); yield return (Hash: 0xd534b3a70e707d82UL, Seed: 0x00000000000009cfL, Ascii: "VlZBGeqf7vixsvJNQBhm6bYGwri41Zvpc4xzrWX51JjtrYRfOzxXMNDB4ZnyW807FNTmQodYQpULseqOopIMisipjHszqUoVWOTh1J2rBgTe3NiFGNC5mvLPqDrB4el08a88298Weg1LQZH4ZpCTgwgzS6VU0K45b0XSZwIusVykz2du8yW3NELg33X1mbWoNU"); yield return (Hash: 0x3b4b3e4279abfe0cUL, Seed: 0x00000000000013b2L, Ascii: "kfOh6LpJy1c0R9OfjpumomrPdrEQWkY4fEFsiCAqQpU88sCKRDHsRcCdXB6kZRnpL907YTb0Yb9JPPpDUlXsxWKQkntkjFOKURvxVWdPHNfV7hWG5OtmwfvKVJH6sQsbtlfRC7jGH7JqDUF7twv6rNcYH8xA9St74f4rINqRR3LzlyJ7dFqUwQNPAKK71vNgI4h"); yield return (Hash: 0x852537fa13c714b4UL, Seed: 0x059e6144ab7385c7L, Ascii: "E8LvErh2dHlbiDcIzaz4bTJBcPPnI4jREgmFX6i83SGvXG4ezYf1b19LWXqbDD6Drg6aUCIoLSh70F2wcNsbcviDrQr9DzazOLYYQNWBHWtrWji59OgLXu1dlJFQIdX9ZjQIKOskeexktDSixJ6fdfWZ1IH0cYbg4baMDzX8GmTPnBuIoxnj0X9JiWDCuyNjBPX"); yield return (Hash: 0xa5f01fcde34f4341UL, Seed: 0x00000000000022ffL, Ascii: "iTWosRgGzLwZXX7UUrqI7OLPrcNVZGDvf9f2u0TmkLLnRUvK1GdVoQrykfcUC0wraOEu3F5yDB6AEYSpsmek9kiPeLxkajuPkvIASVvF0VJj9PLhXwS6eGsvrrEDItewb4HxEKtQurBtqpIagjWkKSb3VfiEoW1EzHp46cNkcL7Exd4YG3N8Plixy0N4tHh8nrH"); yield return (Hash: 0xe9b896f32b758350UL, Seed: 0x0000000000000000L, Ascii: "zTPaxuYpXy0RMWlEPzUHHSud1xUz4zXnHIsxvn4u07SXkkVW6e4VkZV3u7KsNQaI7y7jYeoAXquNBzMrTfLfPEWoijoPGaMiPJ1127GwFT4yuadB9ehG9PXeFpq8js5eJCgMGKPJWoYT1xR5PAI9YyXNZX6PBPNJCJFV0uQnEoIWo1ZZIfoX6rl0XrkLUfyZiD0"); yield return (Hash: 0x6332fa265049bc8aUL, Seed: 0x0000000000001677L, Ascii: "okeRXrWl7WKE0rpSq2LjGbWDJjsNgHKRlF1a4DQ8M3gyhPQ9k7qsOhHcYXhHBHJxoa2WruDDtO2L9iONUpmW1jqARn8S1DTbk7TMM9YWtyeIgirAEKVyeQ4Ibd7FHKVls3AOtUYoH7aGrDFkLgPdjdtrjvVDBTODFI0vM9RUOYlAtuHUXredKtLaMlnRZYsLfj6n"); yield return (Hash: 0x873296682d960cfaUL, Seed: 0x0000000000000000L, Ascii: "mVQPVPD2S9zDg6im0K04xSDtxJXYSn0WBtOjAp3ZmosraMtSQ3EfOURnByQDAtCrUE0UZqbIFOORusqZmU00GP3VLD11JQ17GG9JwRd4Zr2rQiwmJF0nCyexH0vhUAAo3x99951cn9tpFM2tkZBnjSKalgh6gGPZNtrWFmMYZo37ClUPXgskdDGzilIwpUInzg5x"); yield return (Hash: 0xc2fa02b722f1a519UL, Seed: 0x0000000000001187L, Ascii: "SNsrE3l1LFCloXtSEZT3wmG8OmSxi8CLJG0Oyjxl7H5VkAMpgnfb0D5oXRq5eo0kIYTsgwVcyw3gx3GJZxWJ1UWZXGoc5tAGlURMqomHO0YqmIlWStQfa7oUi3qvcdGBAXwnRXkEvliAbx0X25fpTVhgEUJMSrR9PREGH0wJW1aThY0AUsEY4JRAcGMe5EVB5eo6"); yield return (Hash: 0xfd6766148b161ac6UL, Seed: 0x0000000000002448L, Ascii: "4gzo7Lxz1oPfOsfDiomHKGFIb5avvfVOQXtSN1KcefGd4QmabYXPDBN9Iq08jEIK52ZYHRIB35zrmhNMB7rVdqdH1uYdq8mQeFITakHEQQfUktQb51YLAFgoEWn47GKMLXHctmlNfCCmXHXCiMca1WHJrenVRnqF8Htyglc7pqK77wXLwKPcmOU2nK1C2vJlg3RZ"); yield return (Hash: 0x3d4e740f4bfa44d2UL, Seed: 0x0000000000000000L, Ascii: "gxD8dp9Es2jaH9Fp7sDhFo9O9dutlkzzf5lbY0DEeHANikDwZCuV57OAPebSXMfDg40gZCcAyWfj2J6zKb9kLyke0hAPK0CGGhSocwqQFOA2K7MZCFk9ljI2y7r0FdLsu7xcWy8S6lCAvNtxv0M6ftPQWDFQyRwehmpJUBwewOuFZ7VZbaGidfPt7j8AxSozVrocU"); yield return (Hash: 0x9eb7c7e89ebbbf85UL, Seed: 0x6bce3584ea311313L, Ascii: "xGVxFjsFy5GNRyTALes79BwSPskiYumMr1oNJ06heHqpdGUJHjqfuMp9HR4bXcnDTN5p1tdnLN6b7Wkoz87B2qrgN697oPS34WKkcACWbwHo7uawfjJagfG3GPrBbRCJJhOuRrw2288s0DSXZQVpTCjhAygQE3pdHOv08rvUnorPJgmChV4EOWbu5TYiBC4tDTjKV"); yield return (Hash: 0xcf3341652bcfa624UL, Seed: 0x0000000000001c2fL, Ascii: "EINQYV7PKpQRCBjwXJINeSzcigzh8DGR09DeVLvpmqp0sbcuPeQEjCugarM9tNOPb8kSSfrTe36xHrz2i4qL5ePIx6a4Aypzi4aMs1x5E32MKIyQtsrMLPWhy9hIvvYIB8xQYBEBDQFvzIKTJ1eoIR25cn0u6bzH3O4IPqGzecHbRm3mxIrCWq7CWgVLI3AHheMHU"); yield return (Hash: 0xfcc052815443cb84UL, Seed: 0x0000000000000da1L, Ascii: "st05R0wLsgNC1YYfCRgGe3r2HnQutl3h9R1Yxqdr2yDFcNZZYFOScEmrgjbnD63nMwrebYsunf2graifBydzdXW8boxF31oVA9gGkwNxPWRmzf3RdH3MFFt9DNK94uyF2cH0CEVA3hG8J4yhJLoz1BQHgHEK4p0sCkMeRK23XAp3xVSMnpaL0OCyZ8nGLYAUjVjhM"); yield return (Hash: 0x3aca7dadd273488aUL, Seed: 0x00000000000001f1L, Ascii: "eNVVlGptzIUZLWdU2T8l8zVxwo4NZGGMYVPQjHfHB1tD4CPxPuXvnBF5AVngIZRSiK4ZZXMbgBgsCIteJzkMlMUVz05ZsIRSpIQK5eFwLsDOGLfiaTb8Bf9tsvg5EijRqMSJUeJAwJ3JGIHRbvnWoVLv4kLvUwsjIXcEOGxSEUaUjO6g1JZhlj4nn1IbSniaeTrWuf"); yield return (Hash: 0x51b172c909dbdb8cUL, Seed: 0x0000000000001047L, Ascii: "0kv3KDl6zCMnofBv1kDEtL3Qo6F4pF3ojNuoUQDlTtbnz5AiF857PKJg1zwomMw6uNKJLDMYODmJ0s3x3KEmy9ueM99Wpmn9kVtniusi1caGOYAA8cOrpNtmlzZXR1R7RkS9bbj9zgWQVjoaUW3LGuOPOrHk7X06fev7ftKFJTUCYlBoCI7EehaSozTHM17c7M0DAs"); yield return (Hash: 0x988e2f94ba1d1393UL, Seed: 0x0000000000000000L, Ascii: "A4rHJS19TNCabgywUE0pljIza5JFJ9UOpYXI8g4x6AcgXFaTETYhF5dkO3lHBM9twkRhTeNVtgq64mrZqXXKZcE9JGgnIbp97BObIy6TfwqaHZGuKPYHMbxVd1SQaGrbPydcDqiYOuH0NBMCWf6tltxR587HPqX3hjNxbjVJM23dqA9OHygWm0X3PZ9mTcIHaCR5J3"); yield return (Hash: 0xed5393917da3c405UL, Seed: 0x6eaac083a09881cdL, Ascii: "9y3Te5AvOOJ76IxcjcZyCqWacELsegeusXL8p4JmCoiDk4x2afdSOFWLMcVYNT0MqtbewJmkuNYHVzDwd6unfbrtuXZ7YXrWrMteD2btijMlpKKy6DN3rOYsz5gEF652OiHAK2clHqegYzvWllL92h3AV68t3Ots7RIwxZpuwils66gpISYWGeZwzyUVe136OLZbBf"); yield return (Hash: 0x61e047d2fb9fc28bUL, Seed: 0x39b2708786296a3dL, Ascii: "77GKm15HN9YcPLaFCjgHNheN29NmvQdYGgwhrbMcjECG7bBMSvlf330O5maD00Necro281700cNgSb02HqAFTAqqgStbtcdgbiAiTgoEpTK7VixXjRxnUfGRV0nubNgamyP1gVxGLcXbLQJxm88Qlh5jYYuofHg59VOesQenJPBZtXSlPsTfsQP8GR54AWzhhndfUR1"); yield return (Hash: 0xa6b4faa7f7eb9911UL, Seed: 0x0000000000001c20L, Ascii: "prtgeiSM0Rr09rr90Q4i6lTfBQgI9pEB69QysRc4tkJVu83b7bNZKvLaWZxSZ5PngjF29h296rfKs7qzVNHXYjGvASFXmPRpB90DQdcXNFbUB3OEnvklMXyVLXizbjGlOSTRzqESiLYrOwwVWDurIedIRp3rBKYaecBrNAIzWlXv5sUPPTQDcM3fVuHIHmb5Eo6fVfh"); yield return (Hash: 0xd4d346c345f71003UL, Seed: 0x0000000000000000L, Ascii: "QFFMSp1luSh32MHpoTC24NHOfCyIGiBdyoHY9njPElMQnDXsNIfgtnVs1TjiSDn0MIi0d25cuVjdwEcYI4ZoTECHazYQcSkvzxn79LjuK21Urha09w0N2lCyv8pf6XpJBRBEyKQS0v5nSIQ48fVTaa32AlWGZRiTi8FbO5jYz4l4QVoXlXN4qzROPsjOQTg9o4LGsXH"); yield return (Hash: 0xfebe5025185880ceUL, Seed: 0x0000000000000000L, Ascii: "ic5H6y6VLOh3d8LxbBkaCsBnnK9DRm6BoqMJ2ty8pzdTq2S7vY7SIgTR7illK6360xrqSQrlh9asCEFlLm8cUUDVkPVSgjaZbtamCC2Bxcz4QghRYQlQUHjN5sOjLqN1LgLZLQFKszjHjQTJdj4NUr09tbW0zLA2rn4soutXq6tAix7JozDpLH7yXShybA4PiSRWDbs"); yield return (Hash: 0x78e77cc9eda19846UL, Seed: 0x0000000000000000L, Ascii: "n1bjmOYe7NMcghKYScBlGRVTtLTlEIODjxY9CULIHdnDRSTNxmfquaHDy9jpss9VKp5bDpxLPg28uUzs0ZdckeSNIfprYlQMGrUdgqDgRWLJjML01wIWkAa0ei7ngTCfpFWBX1WZIvpmgLzybv7ieU7uOzSeDFGAM1c1uP1sEkSvKPHDSUDa6qx7q9bdrDtqmg1TsE8b"); yield return (Hash: 0xd4476b279cf3878cUL, Seed: 0x0000000000000000L, Ascii: "ERu1x9IgVGUehmOv54iL0asx725pWMTcWZ1a7BykhIVyvkT6TvujesPBT7G9uqbxr0vPVIZKhQk3eoCWkN5jNaHorvyBzGu9TGGDIPLCNfICmvUoZQ3tCDtuU7a8uR77X0xPaJghT49EibKDv83ITUue1SXYKTOkyMcH5K9eEOy1q1zGwu1e7rl0DQaml7qMcRX584zx"); yield return (Hash: 0xefdfd1a555c7a686UL, Seed: 0x00000000000010ffL, Ascii: "XEOAfSCaBmxlGweXaEyY108UlYD2t8KbkJ2F6KtevwvZ6YuDq1WwmdsRodUygwFsPsJdNCzZXTznSFONEX2BAqxWSJCdAc1vRfu4ANZZB3gfXH87MqJCrY8A7945ikpWH0GqCXojfhX9QMhQz1JPOGyE1MP3cwCh5opqMc6t5vP2DUTjXmjXCWyiL2PS41S1Q9zI29Gz"); yield return (Hash: 0x43ab99af7c224be3UL, Seed: 0x0000000000001f51L, Ascii: "jdSPmVTMfYXDW1L1IkvTlrfNHQdV00qpWXy2yMr7Ivzqm2MmUiqTO5euIDTZ5k9VcaDccgnGKDwtCzpBr8INY1a501XfYXFqiK2fHoKWMplgHpEt2EefKvhyqOXL4JYslL9X8qCIhQ3dDPM8In6xHN2VNqPOs1CSb2fgoziJaXTQDFHSMIrZ4JQAIMG65FStArWr9pEQA"); yield return (Hash: 0x7a4ea0459b291937UL, Seed: 0x0000000000001497L, Ascii: "BMLA6WSGL5XzfLmZLxIhOVXEFbbnkzF6gdgBkYI2DDOSVrl03TfCLPKINF1G21TBUcWtSd21llrsskrvmxW4R3uX8nd45IebrxeiwEFRgnTg4iMNDibzHnUKqoitQTXPX9wHfVVLF3az5zHKPOY8Uoe2vdvLtAdKmXI6bfQNjFj5s4MO3QPOGBh6JpHvgWVEaeh7vd2Pi"); yield return (Hash: 0xb11b396e8f6c6043UL, Seed: 0x00000000000006f8L, Ascii: "D3BRDro1Gex78qmI3VE9RPAlgYIISaOXtIADxQ3T4K69WkIvXs3ohlE70uQ1Hyg3Pwf2c5tUCdy6ERnwtdQyZEBwLCoDhdTJ4guMEQxjlskIBRqiHPjijCH0pOnZcdkMMoHqeCLakLu4LZTvODHQmy9e2MD0gkpaf215cDvaL5kHTzPFK57yu489jjJmBYXcqjZ7DruRk"); yield return (Hash: 0x243a37a1acab15d3UL, Seed: 0x0000000000001bfdL, Ascii: "quTQG0dSEVNxGVWXbiSO1E4liYRLRJFVHEWjeXheBmgMTNqeUT4jRpb5KjsOB79xgHxWAAY7Aae8lzcBwvDP7WOtrhFAyMX7sfjqRcqWLALY25Qplxjla7H4XcC2byr5IzvEebp9g5pZcRRWAWWruRq60dIy5d5GArn3iuJ59KB2I4gnXGamTVObJfp9o9BJkT3sQcyxPa"); yield return (Hash: 0x3871ab91c1678cffUL, Seed: 0x0000000000000020L, Ascii: "44pAhedm716O8ozBEHOPHNzDvNXZg7bV27TZ2GwIAAm1qO8cSB2yY3ickIycyWxuJSjQb7561pLhMXnxyLvGQhtdSyaCoqld9e1xN88mMPpBTnk155HMcBiBiQxsWKDNLBfiZgv4xlvWYJIaqSfARp2ldGdR6k74GHqbwwUPz0jgbzNEk5oixnWmrC82SKxIm1kKp7MAJM"); yield return (Hash: 0x89c97c70ee0fe849UL, Seed: 0x000000000000006bL, Ascii: "Dam42yTDJxhGrApDgPFKv3n88kjSe9fKNB2M8MDOVQ2qFK4PM2wxwO1Eaa4ccnsdokM8Crx0u6pF4HdUt0bNld3eNZ3mIxw2JoeMFPM7xzUBVeKX8s5Dy4hYbUsqggVUn8geKzEHLnB0lxAkJH50lkjWnSluE5yYfZy0aJsV9BQdy0MpXON8lm5FFI3QDPYUjiSfpHzH2D"); yield return (Hash: 0xe00170ae224c1b2fUL, Seed: 0x6dc8185ac1bfab6bL, Ascii: "XMiqWzsuc4z7YaloyqlKs8vUVGd63MRjice3xtKUElzpdai4dtxqw2ji2vKYtR9qXYTGF5yATxO3C0ZJ67LXbuvgiR82hLgM3Fed2u4ak57qzPbIaZYRGP2zcJ6gzgCjSn9jEFlW0jdCXlhi8fxUAYbfIVZM489lRfYE40s6WDj0bN8UOrKQROzgmp1sjwqIbh0tdFgmJ2"); yield return (Hash: 0x47c7369af44b518bUL, Seed: 0x0000000000001febL, Ascii: "qwHb3J6hfCjldQULb2ziSsUpSBN5byCXfHa1Gj2OVQSw3qjnD24bTXYgJFbGEpPMXqrjguJ859Wi4DHQHxNROKFrq4tHbutxdKcgjIEwrPmhSSyNkJ61wTrjC3EFzM6aLdpnHkiOwy1kziYvQu0P9gKfnFw7d0iKxREUDZX2rKppgzQIvX2dAbtV0zgFIJtqBxxiV3nCUDW"); yield return (Hash: 0x5a60447a5611c8d6UL, Seed: 0x0000000000000000L, Ascii: "RtaMs90IiMkoFim8fC9ffiV9Wxq6kdyBztVIAZwg5Yo7SAaqvAeUNnV12gGDJ7FDpP2PnCuqP4mSnKdlDAonWCnWEtek3tvXpvcZvsOLdD15Q4UNXkcc0u2XZMVIukxWn6XXAGpfAW50iUxkRpxqzmQkdO67NN6JDRDLsDNmhnqB22dzfS60qEj2h4q46E9xitSLUvNP9yF"); yield return (Hash: 0xa44abdf12c61046aUL, Seed: 0x00000000000020edL, Ascii: "g7swABpjAHpeWeXxNzgoctMEw5GRPQV9NscbfeS93kOS2Puld6Ao9ZtOTHxiZJJK5UHxcxCMccpusRDjkOgkW8KggS0BA3dzN6TZyRoiGffvHLOUuArfNXapI5XWvxGfslvbtkbwNQSAd1w6luvIpBBV10Le9dKU32UfO0kaEsuCIHSnZBD113IC1Bu2P99wbnv4tNzmodR"); yield return (Hash: 0x035ce77203c7d3a4UL, Seed: 0x0000000000002162L, Ascii: "l3oVf4xHK4lGNoBzZY4r8Az54QI4TE1SRkWGBpTwcBQvZTxDikyKjk5DUjIdypZdQim114pyZoIgfogQfPSKjUtp5JRfh43YgMAK1SHydH9dqWe46t5htTcFdpB8rw4aXxMntkLXfj56KbTfy2ZwlVvFAIq3A0FGQHuxhbuM35JUOXjzBLdU9hzq5v6VReuw9NjxyDVoS0Ti"); yield return (Hash: 0x2c2e539bdd6cad0aUL, Seed: 0x0000000000000ff6L, Ascii: "BseKYldGrJmCBb9BIoiyKirniQwAk3arxPhWgiv7DZSA3RQLZsZGtRIbPn0w8Ql6Tph4kXbux4y8HWUTkQF6mbYMUDpZOIfg1KIbdg5xBkZ7LRAgIGJ0qa83A1Dc6qI9I5Xo56JiqIiB86hnla0M44FJICRxIhIQnKL3iQpF86WrsYphZ7zIOEocnrRr4YlHzY3kf2WQmK6O"); yield return (Hash: 0xa02116e1c6ca8023UL, Seed: 0x0000000000000000L, Ascii: "kE4ylCzKHAkVdJjliNIUitJhfmiGZkKwZS5yH32uUGbzSIMQnq8sy5ZgPGeYkR75RZkXoc3z2r7gfQe45eQLpq3ZhTDTQvjKnNYG6aLmLMp4VknmdFdrPVi1xz2QmHuSlX9ix5AdDr2D2SGxde61EJgLD6PZI45PxA2oiGyVTO2MNnCt6e1gLmd0O1HPeKTCr5eS7ZFKAW4W"); yield return (Hash: 0xf1660fef6a38a007UL, Seed: 0x0000000000000000L, Ascii: "6y5XD36CB0vckoWi5CI30UrvnzasdfUlE6cL2GnIZMktF2LOcZY1xLcwYh4owhjefTq6vhzMcVhnaBoUOla0rF0f69g9gkOdDM75tSaEuEVDH3QrdO4RKKJPOomEGKg6KJbr96T0TRn7Kv9T4GR9rhooOVcrUY4qb2q4ivf6iDFqjRHCPonujUrin6Z3njm4rBeTtYxcvcAE"); yield return (Hash: 0x282bea28a5a68593UL, Seed: 0x5ec61bc65ad53a22L, Ascii: "3uySfjNQ0zfwIUgov465LnZFIORkQKzY35QZq3KvBZtARcW2WcUCiqgnfFW6Oy7DpvdGOv7eyQgIUWO2zwGyuN40wJE8FfyawCNJQOb0gFfY3YxWESPm0ySzcfBLqtGbQF4xYh3iuiDtadAgJhQYVDSxeBNPBXeuElbH3uz70YVP221D8Yh5dfdLQzINOKMZWUKaHxsxCutbb"); yield return (Hash: 0x477f4691b888b47eUL, Seed: 0x0000000000000000L, Ascii: "qg5wjwRmiVRejyh71UouGPimOCCXJULeY24IamrLLSdzBnehynHY9SOMW1ME2Otvfi4Zg98XjpNeTvXRy6qGImq02Fgsx1TBnA94EhidIx1edpu01NOSJ1MtqqnaNeNapoLkcqsYWKaso36ExpO8dZ3McTfMEOaYJFeg03fx0GBvMc56kAO3uRDXsXQvy4xgzs81HQxVXoWDu"); yield return (Hash: 0xbedfb6370f201d62UL, Seed: 0x000000000000266aL, Ascii: "UOmbwzUUvwpnkCO5iSCT619bxqlBAaoK4zp57bEEiWz2jzVT6tgw5CFF9k8GeJjLiVaeW4EVckbjQ8CAChDBST9jdf9rYHfZdZuVqK8LKBgn3FoazV0mPK33ktH2FLDR5ySe0cNYZZBeb8c0WptKwUzcpZ2g16oa4D05tH8pdmAOaSOFEOZeFHCS6d4wsnl7tj6m95GJP6g8i"); yield return (Hash: 0x098ba30db76d5334UL, Seed: 0x0000000000000174L, Ascii: "8c94zFZDCvTGUQ5TzF9N5cuFHcvgnbGvqEF4cEIH7iThoTf6UFWkKZCRkW7Z5QanapN2v5WOK55wq8UDvvhIQMZJaEit3LftlHkS5kiDrctm5a9iADx5H0N907urfepAcqQTvAMMijIMoAICao6gmm1r6FbiLANoV9KlHGfjsTAXZKz1SEqGq3LXHzgJwM7y7LSOBHN3Irr2LK"); yield return (Hash: 0x4c38c6b411e1caddUL, Seed: 0x0000000000002707L, Ascii: "mX1PRUJrik1WmNpZI6Jtxmv9uGNI3sZtblIy5nk889Pi4Z4QVQBgy0zLoywAelB0AUAXgqKrGNlmuakSLGbYyvE1PpZFARPEmugjI2hCShCLKtAZrmpwfISacGQ5NY9UoW0YUXKzknxjwhIwrDtGMsaStLEpMjDUngoKCectL1rJWKMlxXZd4s0jfRQEFuClCALF7beEqJBHd4"); yield return (Hash: 0xb326dd3642f36affUL, Seed: 0x2e52512cc58aa935L, Ascii: "4ztdsJPql9TZC7rzDG91MxZjNO8ypBpxScJtI9c7NPkwNVK5idy4FWneFiKUl0kFcPl01oMV1lRU1ix1fUxPqfsIdGyWNROz0antbMTftAzRXc62KYUjGQ5vIVcKY96J9XIuMO9ObRku8xalFx5MW6PRjet7JqjsRyLDFDva6Gyfr5rxIczIwQtbqJ78rqbCvWaJVTvTmPudph"); yield return (Hash: 0xedf26767871cca94UL, Seed: 0x0000000000002591L, Ascii: "D0oqONFjsOhHnY2DTEA2ybfWknu3lb7mbrOqtkITu7BAw95U9lGAcRInCSrbDL0TPwwkMsgQnPd50LronyOjZ1ShT1CKx7MnYmFxFg3cajqwJQ33AIiT5ZmlQJBXhi16UCORA94bRzDWdiupox665G9CWRBKAJZNbfgdjVI5tEm54hBuwLM6QUXIz7FabRGAUJFaqu3tSA3O4W"); yield return (Hash: 0x064723c85fce01b1UL, Seed: 0x0000000000000368L, Ascii: "03cTK7C1gkwEQVwXlWcXh0ESkvbCrckJ7E6WoYuEDGCShmZ2xRCmlx2iQ48WcLseyvnP9wDbckI1O5VH5NIHT28ArVU7oby6xijPbXweKup3dpxUoI9LnXkr4TQaFLrWPXwuGgZDevkgtkBapBVYxuMlAnqf5tNb6U9RyXo1VFqAtMugNbUSxpGIzbJ2NQRO1k6ZpWsf6elRxMr"); yield return (Hash: 0x6553e22da519bdbdUL, Seed: 0x000000000000080dL, Ascii: "iPH0IO7cO678mdTWSaBwwVgJv3ttUh6aKXLsHdIAyjAw8smIujFRccrU1Es3uheBpwsjOAkwPUpJLkHpT1ffuAbURkMpCv3NmYkvQRw77EpHjp099t0iq8O6CBUF6yigFigCRV0gITw23SZOtfOPJuC2f9nPH19hvE8eeBy84nFHQkGhB6rSKnqivvszMFSO6qd4qRSibU3jS94"); yield return (Hash: 0x87ba0afa11e6eb08UL, Seed: 0x0000000000000112L, Ascii: "hW16QQ7Pv5H9UZK6FbXlLgBkAIBqO8YxOqamPOPBQ9SErhI9keLHzhRMVeL2kRpWTO2Jp7bKDZPgbZ60VImXtyplriAdLiLFTIyMWYDv3TTI0Zhr3bFsqrOoTqoiIdp1TdaeChOkb6fhjgeJmOnEQVxFHQVQE2Q7fRXucnTPIWRAs8L4PIQL6m5DlDtXKzv4zs0P7n4knxLj7pi"); yield return (Hash: 0x1468a1aed10dfefcUL, Seed: 0x00000000000019a7L, Ascii: "IXfuXoGOjZYCriurKgpliUAfWM0obqz7Z7WT1Iedk93lZhNtoyjbY9gij743SAAK4q9Cvr7pAsndmTQVwZip1aUc81kZ4ZKFNU8EURL46wAdlTgD97ZEEmYwKuRDzNGOctDGYwLovP3YE4Uaj6Xj24egfhyhr9dSoWYOxyq9Xex2TLDeiuzkb2T7fxgwCQPcvHPUuTG1khSobRtI"); yield return (Hash: 0x5d7174c0ed2cfc7dUL, Seed: 0x0000000000000adfL, Ascii: "n5jaccam8c7bd2y6zvSxJCEcLJxeQ7gRVcOsTtU5TMHTEINp2DayB2imv8ubvJLOjQ9XHej1haK5KXqoZysIsrGz0aYYTIU9ObfOgkzpED6kLPwI1PyjpMKCcOCD6TLHDZQsxs4e0ii2YQaNmRJpT7tZ7thOwdRv3KEk8SU52eAGGXyPc6IdC6OBhM6lfjRFxpUhuD0LNMjZztoP"); yield return (Hash: 0xc7c1ce5692e46609UL, Seed: 0x0000000000000000L, Ascii: "0B1Ow3HA7F7eGGzheBNspjxVM9vMWCdlU3WLZlePxFSsGP8X7vwDv6RaFxQXqdxsu1P6LpblAM6e0NAnYQKEa4Aao0HI2EpnXhj2rk61XKXBBnMg4fSC9uTedcfw8rOk9Rryy7mnEdp0Vb05Uj5cGVEtLVJtWsWriK4uYUmnjCxdb3EqYYMEiAebJf3Z5OevqvPThgbgLnYRDiXp"); yield return (Hash: 0xe3724d9eff634603UL, Seed: 0x00000000000020c4L, Ascii: "Y3qZo3vgY78iDqSAKtuYPdV5PSv83nq9ZbDgEmq1DXv4T88joZP7k1Cx717NvuHTaQmQcJKM9S7G2EMoFtTRCJMEahuNF3DAvZ64LJhupjwmLo3wy1DluDKZUPglYtNVA5qhjwkmE7ZTr7qWqjpXxeLRvcJMHUCtXblGhf55beQa4MDGiEztUmxmCMahOBHIBzzRPD2DuGlU8bk1"); yield return (Hash: 0x2c68a5bb2ed7067aUL, Seed: 0x30b52b853f3c90a8L, Ascii: "POkjcvdYJtZG5hdudDILMGlYffvT7puFwieMGzzFSo1cCmnFTQCxfZFKH5TEKdl003mluc7zjytqOD9VQtp0T1oa7wZKxdsJylmBmYlGTRUT3ltQNy65lyoFsHG2ElZe2ryiC8Og7SHdc7pgtL5PnrI6vgofq6WubtpCowKw640dbenk54ZXJxYmOKOS7NHMHUqXrlM8tguWNqwew"); yield return (Hash: 0x7ee9b58c5dbc8f64UL, Seed: 0x0000000000000728L, Ascii: "HdUWxTmWLMYxDvlS3g6lvPs6zdL6Z7759ymLuPG08UbKXWDfsvMuTVEprrR7HbCas48BmoQpgWtLEabIcApEE1c2pWmtuqanbA93PDjOW86R11YcCobMNJBrWHJqNpZjH0LlvIhS0C92t0D8Ej5uyJN7JHgzwwyTNLQncnGUkSMIBNTQ3YzCtBSPhKoHSfUBKEzk2fzy68pZGSi4X"); yield return (Hash: 0xbc216bbd1600c972UL, Seed: 0x0000000000001c2aL, Ascii: "dAN1SdBmr2gMNyALQrdDXfQ55t6DvouZbZu9cFXibXwHweIdgdFifK6CjnNnlvzlFCnNQDjSR56Qvj7f3QQbBMdaLN2hAh4SayCDBLlfFjU97lzoIHem1n2cOU627S3KMhFKDz7QnicmqKgEeYKAWCMZLh1i18jQDk9SvY9wz85clcFrwBJvULVEJYCIZQKy6qurTDitVFFnnzIvh"); yield return (Hash: 0x0fd930b138297004UL, Seed: 0x0000000000000389L, Ascii: "s4vBkb0vmkbjzA1CIzLGyOtb8Ers2LzuSbXvmPNjNulNzPG2OaGfU67UnMq3i1ubVydnzBdit01OxJ1JJTcxPjvxhkkCdRGIwxE9AvXzcrtPHwnJvCtwnJeJvO24yY6DnUCZ6P4in7fjyvZLEjJbf4lxSOzazHOxDKHKZitF2yQKFWAYc7mc6wov7DnwVYuhudXbdLsOWOIw1btvtj"); yield return (Hash: 0x32e2b25c14c66c59UL, Seed: 0x000000000000196aL, Ascii: "c4jJohV3gr10UmzwfQhRtE8dIdtPx9SGpNE1aSq0ZCQLDQzkUQAefMagUxE7uOdNIr6IWA9aXjapnUgDjWagND4CNHYgkk8FPYgSIiU239nI7qO4CkrxrffMJUVAh1EsS51pm6lmeAPixzx6ROCX6JUebS5SOQynqDvFxTh4ZALMiBZadkgC2achNnbA7KEnel85MGrsCYD8996Jul"); yield return (Hash: 0x58c49065edfb40c0UL, Seed: 0x0000000000000acfL, Ascii: "Cljyh41sippSYGQXUXTCELfcslOnjQgtAbhdENTD9h81WKugXpFsQVom21pW58m3SImLqlmKlR20RtvA6sSiPg2Ids0VkSzrHsiv5d6E4XtwQO2RMiJdbrjMShNAiEv12f7pWh1UZwZr0qOqoFsWvpuTLNiziwUXXJIyy2EYprN7E65MVXoXPmrrd9RwdfR7G7SDyis9XJDavdIQip"); yield return (Hash: 0x71c1c6f8cb34356cUL, Seed: 0x0000000000000000L, Ascii: "OJFu10AE0lILXYVyS0SnWq8bomiymsqnFXR9RBK2vfdQHBtxI4jzL2dQjEyP8Kow9Bm8shOTckKeisDHBPkF9bOa3WDKz5I2szl20rD77vmFepzzVCfnAuCMGxRXRHoWUmRCjDYN6b9HsRAs9xNPLeichB0rnSQ5mQWObL0j1Wz6eCnXHVfPNWw7jd4kFjSpCgoI7qT7DLQz75HjzV"); yield return (Hash: 0x6e5dcc4f3974adbbUL, Seed: 0x0000000000002386L, Ascii: "l9JXwaCxFbWwpmYCQHjcNUarJSQknk5wuWJrhnG2yqJOwbxG19Ut90ivq6paYtcaUC4BQ4NaeG98g8ixNTlqTuN6v7x1cG7FTf91lctBOqWkUdQKi7x0h4iKFTK0uqrYOAGV98g0mPQZlMPnYMWYqwlO2fIMfC9BDmRId2xpOH2td0ydnOFbw7QU7Ee99C5gZdW5zgRgZ1CAsuE8OQ2"); yield return (Hash: 0xa445fd3d1e2bd025UL, Seed: 0x0000000000000f22L, Ascii: "hFHhF4ptvamaEUcRYAVs7TkHdDkCYKyLzzQQdwwyHuiBmzaTw2yatG4OivT5zoBUozXNwizWKMybP7GciEQ70EikxxaZxLDEzL1dA54ncIhyROBQp9DXGCNds7ajaLZ5IjE3QGWlkqivvo8aOW3EBojz205favpRd8J5kihp16jsAY7FVOFpPm7m23hXchZTHyE2vxtQz1PWrbAhCPx"); yield return (Hash: 0xd7b0016e6b7e5aabUL, Seed: 0x0000000000001cdeL, Ascii: "THBuisT25JtpMf9WHebygRp7y3glzDksekJZTodZdrE0AlyjmKWigQRZXy0ysS2hzuXvAMecSQR758gncHc8uknFWyCBcKj9YVhPobrSrgmxeRkPPwDYFD2Jq15UKdKX0D3Vt50QJYPdTYyKAeNdBB9QHHh7zd0gno2BSNgY4Pph62SY3wtrURyTDWG1IrYd1C1LbVK42GppAUP2vBC"); yield return (Hash: 0x05e02548118c0ee5UL, Seed: 0x0000000000000000L, Ascii: "7aBu9nr9J4LDM72H7w6971aIssorqHAUeKcc5y1GwosXqTsCNnYAnm4rooC8takVhZPSQvJWMF8asKhjEz1tULAsMmrdnUGmKmOBWknWrbpVlWhAsuxPFmoi3YO3zWPxTkFhUYzTN2uPto7LbfHFpxrH6acx9NIvC7BqzMzWoEpxyw1LkZF1UwMqYANJbeTsQh3MBQVRjbys2JJP6Vhu"); yield return (Hash: 0x4590988ca1c581c0UL, Seed: 0x00000000000007e1L, Ascii: "5KBL51l4hNuRo0ySKbXnecgOY2O6cf8ncMfEN3rfEjsNOUpJ9NIP26L9x1ci97r8StvvGQeIXDSHvQGVJH6JMCCPdKDpcfKbupt8PbqacoiPLK0vo8wFOyqVz7E2N4sr4DoNVbtqXVjgeDHiF5F2qwsHI7qsUTNQjeEwqZtSJ5de2XnjJNcKl3f3uWac6XgyrsZjNInpn6xzK0Ph2slI"); yield return (Hash: 0xa7294091ba6559faUL, Seed: 0x0000000000001f1cL, Ascii: "Vpk9ceAicxUFUIS1highaulRcOoXA9XNESNyzocWCRjpVYFhp2BDj1dt3CKPziHJ9LiPl4pSr7DtKSROKJkoOFD2Bi1Ig5pjUqCOR0NUalZoVjytBukvD2l4v1366bPbo2CIPZ8E2tSB6AgSJY1nGvqHFojrHZJFQe9QQNjlvKyjmTzgSr39t7dcQn47AH4FgWtjIeQdsvKqafqFN470"); yield return (Hash: 0xe10b340ee3402775UL, Seed: 0x0000000000001485L, Ascii: "WsozAtXaFmiAIlDmKBH6QnjJqPQ3Y1yQCYOgWGf7mKA2U3LE45DGb0O1YDk6mSRP3doCSjqCRGPIjtarjFp9CMRnkmGPD2ezubhN1JXXbImNCuOYwWmxgiXPqm2ueVgPrN6WmRQFDKAzp4y5qnkFgtavCTWYjNS1VQI7o5X95rVm4ZhyNNZIpqki5wgcYBRCMQ0tJDx8hnxBEtUyWaVl"); yield return (Hash: 0x4e01e9ae79cfda12UL, Seed: 0x000000000000010eL, Ascii: "aVKyR92AaCBW0Lk0WjMia61RVhrECMDfG5luUnLSiyLoPEoockTbFllYK7LnEvEBWqjTNBLOAk16OdmzmKhZCEivvPI1RZQejG54M5kys6mR4ZZ3uBnAgscmFd0k8YTmmneyaNUSdvsLKGuZI46gqLnkn5CKIMQORwvmBseoQ1uzfTjzXGohAkepgzsWrv8CHeImc7052iYWnZ8NalBW6"); yield return (Hash: 0x96ca2f337093050dUL, Seed: 0x0000000000000000L, Ascii: "leqYs9WeGmmwoxgeZUplpxGTrNqHomntsxO4zdDuwSacUUi2d06ybw3xJZTxH2QEn6lagba0Dr0qQ0AulJOHUigJxGT2kxjWiRZuqVUrIJ76DpuYVORujv5pwsr072YHhXrX70V29wZVHfeZYf5Bz4AyzY64bixdXoAfJ9HMceEzvHxQNcFJsj4xLVOvzR2HIlYII7BBQyG0ik788LwUT"); yield return (Hash: 0xb89d8f2e6ffdc87eUL, Seed: 0x000000000000097fL, Ascii: "d70Snry8sIxRblM5EjJNu7QPmYLNq3GV6UGHlKpIQNBi1vvbuFDJYj9uIkmCyuAG6ZTh6eXfMZnR6BfClgq5z0i0hXipMnHW95Fn6zs1mCPVao4egkbkruY93D6OgkAeA67BL2R5s92HMmm0lOs0idIeGoD8RRR7ImbD16QTOYPLaPeghCAH6AjS99bJoIH0SPuGXZZNqrv8B55StJghF"); yield return (Hash: 0x0e5a220fe2d24fc4UL, Seed: 0x00000000000023a9L, Ascii: "gfOM0utqVsQRzcQ2aIyaXVtHFq7LG3fkEPedKgZEwIovPUEyZCbfyRuWAZPZ1Jo7g0IGkeslhR3XT0GyBFQL6X3YcCcad7fwTePhFSm6KVxDEiLpHh1dA9UWQ9x2xJh9Ky3F6RTMxeQEh9zM5GaHjK7vmqjvk3oE0CwUNXGXd3CxeYd6ULFlYRiS9QbHfGiBxWbvSRj2ymtHIxS8886lwJ"); yield return (Hash: 0x3f4183941bfd06bbUL, Seed: 0x0000000000000000L, Ascii: "lcBa3QpwhYbZq4HRypc8k5ULkpzue48yKXd6NzBSYTnWrakJGMW8GJEjbOFtqkp9IWKLBieoXgLwibggsY9E4J8OJVGdKS9BlpzxNPHWRwcGLP3B7UK2VOR3uvtCnW7YZSk6gqhJuNOy6zlurxRDt927OMzoWwGC7cyh0WlmCQpn0meRxe7Vha6ocNeA8yHlXPqgd6omqaph25XU9hKrn9"); yield return (Hash: 0x6207911eaedae1f1UL, Seed: 0x0000000000002255L, Ascii: "IjKVZoeHMlj9TRfbtrnSlFOiQvxLC8uz0gSpycAxRbywjWo97Xgzq1WGB6Ktn2B4zf4iBZEbo7FGVLRAhATBolA5nRqqgQEqycVY2yBmAdKQ7qkSQ0JRhsnBhYcNPZBb7nhtVPPubxKRyRPSAg2GDGgweoxFhRF0WImnAyxne0OvHhj3EBpwcVUZ4P7wu9wEQhW7VJugFmhA4iVeMAOUh3"); yield return (Hash: 0xdecb23a233179ca8UL, Seed: 0x0000000000002468L, Ascii: "z4eqekhdv34U2YYfDBGkSR85HW6IprKH1Lky7LKuGwGVARNNUDCVZ6kXXUagNdmRS2a4clYUs7GVHJ7wQ3dbNkyl4H0tq6TqCkDVSu5pLBbUhwrdx3xPfNfPMWv82bH0vPZNzYPt2Fei8C7OU3KbUm5KHOn9EfcaWgTbpqLsa5JgQm9o2sVilrPKNIhbK8KGy8hsiSgurUfmS0DHgBpv9D"); yield return (Hash: 0x34704364be064650UL, Seed: 0x0000000000001e3bL, Ascii: "rtCUv9vqzMDXQMtMTQcCAynQMczuLHldkkc6R9O06nIGIiI4q3ehCmHLHv9hNRbH02bo3TlzI5G8VUaW4PYzHqLj2dn7KuPF6PlRh0rSWEXfhHbjaWtMrJc7jPeGFTCl0kGIqADkw6Dw7LZ1vznTTITBX4yeIbS5NVqA3TnnlpRmeKR8JGxZpqzjOtR5ZdNESzlqZBiYmRqpCPykkjX0tBe"); yield return (Hash: 0x7d85c2737fe0536fUL, Seed: 0x00000000000009d7L, Ascii: "L6fREVHqM4d8B9Wy76v7yGbjCzpfhXvh2tNiwmMNFjKwr8rBPpwg74JrghKyBI7dr3SlCs5sH1NhePoZJEd0hkmcEfB8f20k9WWYmNpCtqUCWkOrWPywUT9KASvYUhGIYfJr39d3tuipvRt7cjbOdl1P37xKHrmWissbXfNsiGSEaUhRr1KjBP5PcUMLSY6VSZXrSQE65qwLOT4XLXCgWdz"); yield return (Hash: 0xc153b40aad630a08UL, Seed: 0x0000000000000000L, Ascii: "MWxfcALWJHfUT1laJANXHfshrogEiBVSsr1Mt73oaxVXdtBOZvw3lm9TqDgPn8U6sIro5oJiYDPaObAXJzZ6U1aqmM96jT6XuarIg24ME3iQJWofn1Unv3I59iquisA3958OuWYbXQldCbMQkt2pJShpS3eY1p5GTObknktBzgucOJJg2Wa1Mx1zUiC519aTgRm03s98RiWb759DApHlUtj"); yield return (Hash: 0x021a54aed692de80UL, Seed: 0x00000000000013e6L, Ascii: "v43KCmTFfV4m8izbNRwsKKvSCvb7eo0QyEZHDMN24W1bsocSGHegt5HmnqjtB0UebT2xvFkp7VFgCUkMT2797wwIpK3ovYXDtBfSTDNLjyRBkKDf8F1OmfPsrxU3bfuMLNvn67pFn81iY1aPh3LWM9DEwte7UpiTyu9cjZg3lWPkIdgijUfjSAaFw2wvpxolxp9XP3RgbaM3g6xSm5XoHGRP"); yield return (Hash: 0x36eafdcfe4d098cdUL, Seed: 0x0000000000000520L, Ascii: "Cv4acz39tU14kWL7FXMG6l3LdCdhZiNMsNctdM9O20zcWaYqZZbO3byAQA3LORByXU5K0HKsfpHwUVZ2FqdpaZNph9qbBjDtMt4oTztSAMO2XkUUBga3iwwrCsBDxRWWjfiRZSAwQ9UMtucNoPguHagnjgtLDExdjRnbbTqVxmlVJRs7QTCiv36YUGvJpPcMf0GH3WTM3950ACaasdI5lKSe"); yield return (Hash: 0x94b0b095e4057075UL, Seed: 0x0000000000000542L, Ascii: "2MVJdGUpZDznM8g2TVKVDhJCMQxwR2DVRNHP73F7w5WEHtcxxtMTZxAVdnGtEiXv3tg3fs3nqcuqvmIUQcgqb719xFxznuZXeSF66kfnpPuC7NELb3eOdcbDvgIscxslXN4kEEYnXAPcfBw5lMms8fEbGwD7YqAZCYyv7wYvom5h1duRsBPCMULDoVeqUTVOyo7jdq2TQqO5ZjIVcrZ6vfS4"); yield return (Hash: 0xabfbd8d5bb603233UL, Seed: 0x00000000000015ddL, Ascii: "eaKj2Wxvp03jvf8wxE4StW9KSzC7PWN9O9FqwHv7agGho9p91Nzkx84NNiskHnFzaAwOed93zlLH9aRSuO2MnggSm3EliYmRgYK795xdeb9FrtIRYqBBZSU23J9IhOMHIy3hitU4EvxrieJEuqp6xozpCxmTivsHwMva6K71wewc9HdSYiDoq4xv2x4JJeCyRNlRYAYyP0mqm1CTHKrgKqcV"); yield return (Hash: 0x8556365b2d798865UL, Seed: 0x0000000000000e15L, Ascii: "NZTFL4A3q60uKDcIdOkRSV8HZkziOyUuPBrfooNFrV2MA6JscKmA2MBGUsz275Gl8BbTVmrbnnK2fM0zpCXqxZSDXKDvOW0erPGjkUuW6ZWQLZAXSuSPlq3yDRJzPgTIB4VnTCQQyl13wQJ5DfnYdf4ScYXjxJup3BFhbEt0Hnq5v0X6kKbmPSkzuNenzlNBKfTu8hb7rncjDS6tgefyS3mOv"); yield return (Hash: 0xa5adca1b1c5f448eUL, Seed: 0x0000000000000991L, Ascii: "HqKZwK91tBYpPOl8o342vzvpM05Sgw5bGQDSR0jZMWuEGp2bzjN00wjn9fsF474WwXKtySnONtiqTKCn0tAVK6iXMfnPSeYNugcmVGelM6pymFoJPQxvZsrJjG0oAFQzwh5L8XZiD8UC4FndZuYpPOrffG43WebqwnEmFlJ1zZyN4sBSBflBDeCufIV3lcWDBUJD3ILsaepi4MUaV1zOmAHy6"); yield return (Hash: 0xe2b52189178b4a42UL, Seed: 0x000000000000140eL, Ascii: "1pTZnHAKgnUPv6pYmmhRFuyy2fXjAndgADY4ehcYAcHrkmKH1UVQObV0vFx33NdIbA9D2hP2FBXNJHzrfwXDOEHc6CLETKUxRxqZc3N0RhBWjibXXiChsLZ3XmTAQF0Q1Rz9YJXgiXHwgzNO5cWtvmNB5eq3xNbN6n9F3IarH7bwxnioCBj5uNQMahPgLu03TA6t6e00sSlFQEwgFwMNLPWWt"); yield return (Hash: 0x1c0f5ee8c64b5af1UL, Seed: 0x00000000000021c5L, Ascii: "4DC3Y6FtuATiCbFMTkXH4zWjn4tf8dahGDINMHJk8cw6E23iCe5WrocnMeEi0ka0YZt3LrNGUvWTaAMk6RoFtkspNRedvRHZuxCH48By38b94fTpMun56GBQg7OJiA39e7LY1prxJdzCb8vDTgzn3rPI0OUM3NNJ56A2WbXaQNkzgkEJuUodlCFxUniOmvuZBOWAY8N7MMqTnPUgR2O6qiQQnb"); yield return (Hash: 0x5a79f56ccc6c81dbUL, Seed: 0x0000000000000000L, Ascii: "UoQAMlKisK1Dd2QUq8O6rbseXSJAehbR0pRyo5wnH1sSMtmFOAgMH4dome2gORSovkCiifjYbVymxmK7pqedP5AzH5gYK8gAQPATdP7wEXt4EYn4X6RpJBkzvAVXaRLTTgBClXsW6VtqUtHQJUADgd0V267esMM1HbqoaISEsahDb3dbYyV59FpmCbClJc2GzK7DcMpj4Y3uF4cQU0I0nqBEQm"); yield return (Hash: 0x9a8b27a712725babUL, Seed: 0x000000000000143fL, Ascii: "627hgrPLCV1AHFX07JV3BY9dpY4q1gSUKGAau8oqxi4vDsUigISmsL0jm4arxli9YdJCN37sjExSRuLIJ7HpKI5JACKCi2Q7dYgP4BwvpwEQDmvF2t6mPT79S6FVmeHt6827kFh3vkVD4SmbviFIfhHb97p6JbuLNb2ilCrNDuuoCadTFkp1Rx882SKaVrzAPma5Lgir5ccGVWw7dqBwnzO4Y4"); yield return (Hash: 0xce6f926b2964d0c1UL, Seed: 0x479cc0ad776c4358L, Ascii: "roOfMBk01by3B3I87XgQBfha9NDfpLe4QDYiB8pupi9Kv6AqIC8FYpVmhcLWWMTliUsE5ZWhQ5BRN79vqEHlJUwC1hD3A1CBgxbUctJmposwuZ6gJiwaN8HOxOzYzHvd73fUgdnvxcT4PIRT9N15qrkvfBN1LegelSQOZkPdI0QAux8rj0FZ9yh4vqb1e0ulO7FqFLFFiwkhawEZK8kidyGETK"); yield return (Hash: 0x2b3685370f802952UL, Seed: 0x5836ea31e9bc3892L, Ascii: "bRhk9VWj3SVYdenBUrI9wPN67VTIhO8ZOtut63LlNhY9xw5igHP4HnCdFimHkhhbEmxwpLJKCygXyT22y3afMymVyXm1Wc5akyK9sHW3DAOLY3oVCi3YGkkNEJHDBLOXoYCPlLOG00VOk4ue92dAs6DfZpqtblUTlJlF7CL2GNFg0SCzS3LFbuZz90jz55AuTTdY1dLJOWwrqm4U3zwQerBSJ92"); yield return (Hash: 0x658cc2053ea2c9fcUL, Seed: 0x0000000000000728L, Ascii: "ZO5IkvVUUjpHBSm1D5xsnZ1IA8uCxaxr7j1CLxBbs65qCt2SxtJxwVzzDMKvKgxJgEKF4IsHD5jAkGqlBPweJ9tWX08KnlLPn6KSvtYmcWGWeY5fsmTsozhyRWLEH0pxVUWFqlgDhPt6B6zJ3lYZDKNUIdJgetOs51Z1Zbcz7n6wQGrym4MdovHNs7AZTxMoNDORopMbJz9ZeoOGMUE1X0ZlP3V"); yield return (Hash: 0xc91f57d2583d999fUL, Seed: 0x0000000000001bbbL, Ascii: "lExmEnuj4PbJuial7hsE3h15damh0vWA0nKDm6YzGX5vtZjpefvYA5fJciZ1wRlAOTxXNORsvoNfAvHFmGMevPGJY8OHLbNCN2hQFgGj8C8iYT3feJpAmJdiGMGzrQBps3CDCYK7Y2mjnSxmloPKarj7qWGWw9DsE3ObNqSQ2fOksIkMD5xOKF2WtoVvVCrVdszkEsmfyzxCh62yvAoiDjq7meH"); yield return (Hash: 0x04ff6921cf041a20UL, Seed: 0x0000000000000c19L, Ascii: "0XUrhozMrVQwExvzSvjTfSuPEqIwrxvmAO8TTcpaON3Yl1Ru21M8u6sFyBtyf6wCOuQQvic4b1kQjBlGuuJpaFM5Cnejw5viTM2VdFQNJIrup72Xb2CkvPk7R2CpOGc0SLdeLjtRjHV4LqskpX4ge3w27Q8rtX6k2MN3703vaOXe2axJXD7HW1btH3q9CuROgdfuU1iLW1crT1GpbLRsvosS0y8x"); yield return (Hash: 0x5eb31d07c3c15d20UL, Seed: 0x0000000000000000L, Ascii: "iK5YjBQqLtYY57nUaCwhUYOMgg2sZHjCn9Bbx1U5xIleBfIwxfHS4DC8VCXUgvuhIs2Fx0sJq7YZXC3NwNC6cBRX0tKTPP9RJeIhg77yPXETHOogEf78ZQTBisbfRwtBbM9KI3ibTyeTkjRP5aJ1GV3g1c5jVez1jQcZ87Gws5cLO1zrEacglwdmDU22MVAPNGC8BHyZseVj6pfWkUS3kEJ2Fd1I"); yield return (Hash: 0x99051eb1bb49adbbUL, Seed: 0x0000000000001bf2L, Ascii: "nD7cdBdnA0smbnr9ACDFAA1be4tpxONfBuNVsVTwYnzPhfCdpzibBjLHtHFfthHMiiRnaGusXRHOGn5OLff8Mr8Xkt29s2CezETI6Cqns7mVKopNdBSICuifMVFrzzQqaMyrYch28i5jNmfmKeX28yhAafViX1dYshTws0lpCbHR7EvpDJ2PH0NOsMFAODKDaofZ6Pbiv3pwejsfDW2DtwEIdIJ9"); yield return (Hash: 0xd5139e04100ad440UL, Seed: 0x0000000000000b51L, Ascii: "u7VtIagZe18tpDCAKDmCpW5WC4vqvVGH3goGq3qc0yGp4w9uYysET9XpF6MmNdSEfu4b6A1n36OupgQNTOtOVvihJHsMIjbpiEQoOFhvWA0fh1IG2XGudHHzSbcCB8NU6iJYrED0C8RgOwgkJ9ofgHwhZlk9sarsNkAoINnnFogd6DyYarOt3O6Q6TaY1nWQhnxNhOJjdZCAA4X2nx0CYGaqyGI8"); yield return (Hash: 0x4b063e2b937f880aUL, Seed: 0x0000000000002319L, Ascii: "pcW30Qxc5kKUnQnSKaiJ4BDaPbwUv6SIQg6XOzlw4mfglLy9m6MX5wQBoAXmz9363YKLM1MdaRCDDWOlCGO2sQbBUK6sZmWb8o3RJsNMRGEaTYrKDbgiwAecsrsCgeS3SupxFHeEGLgnMDPHEPm921IFpQY1JNNW1glWtmghuXoyMzWikot2m1ujaQ2yJA4D0TwBj95b16pgvrHugdS62DM9GL46X"); yield return (Hash: 0x908f697416a8c1b7UL, Seed: 0x0000000000000000L, Ascii: "F03wfhRNki4vgSPfDdFSZeNy8oyUMQwioqrRv3xsJk8Y4SqqLhE1YI2enghydmhIWttp4uLPwvq17OYcXcHMuBDyCwHaIpJLuSlSLP09nZOTWhJls3YJPP4kRyvTWONsEy6AaHIlNUIVH2mLSk5uPmJHK5js9V6OGxGG6XFMThIA4uSQyQSNXLeFuXvQ0QuQ5GWcxh21zQMu6UPEhOA0nDWRxa3QK"); yield return (Hash: 0xd7335467efc526f9UL, Seed: 0x0000000000000fc4L, Ascii: "BTxzhZqt5gg2Edi11DsiA7woNQXjS9FMm0Snii2pWcGUmVKHoHtu7YMJVjs5g20rhG5m5956dMOyqhSL1IKhdeogZWwASviEatgfrbC1xoqTzOUmKoYQY7etIvDS5jq6BV0DGICCHvAXexxtf9n6jv2IMOnVXopDgXaRGTVmr0TRVeeCLsCE0lU0IGPuXQsG701jUMoiaRkdIEak05Qk2Lh0o2VJC"); yield return (Hash: 0x10070d5c754bb6a0UL, Seed: 0x00000000000018cbL, Ascii: "oRYALytkrlDyGh86DFGGYPTJGNsSyhBn4fjkl60WSUebIptUTqbqXeCxX2tyRPHRtClA0gCqq8ufa8yqcFRjBqnGJ1hEm99xidjKlyQI9Efx6lW29IE3SaP6PlYuM4IlvtZnsXldLo42jbrvKR9OcGYjlQk2rsJHDgvQLz8Cvx3Ei8q8ISDUiFYlpA8sjh93JD6WCel57jNiXB14RtRtgDN8c2W4ua"); yield return (Hash: 0x33ff3684c2c9661dUL, Seed: 0x0000000000000000L, Ascii: "S9cbotxZR4B15Hjl2hKUdzIJkakuWMyGbFHGqgIB9PR8xocs1BRzi7MQ44lmFdmQDAmCgOqLWFR9LlGbaN0OQQGgBa6lEnmoqBukT7sIkoCJjHUi2HgfLRiKfeWD8sEE2a5RTVKvbNDmiuUgkUsxwuh6QiOjc0Pc2Du8euDHDzS8krhxePFW5ReIWtxlxxdqfbV0tANKpifFJXb5gZ6k26qkTDJv9X"); yield return (Hash: 0x8d3e3a28bb63a501UL, Seed: 0x5329a3b70d0f4a59L, Ascii: "9TK6ReBZeZ1K6IO9C4EYZuemID5jadSyEGvmxZZEWp7d6kWLCQIeieGMFRGUloj4Uont0qznglqe41GO3hh3U96nzYdpWFdiuehvL7q45L62sj3IYoQWCZk5SBNyVkmCGyJzRILWUzUiWJJVlK0ppbrcUVLUV4Jepw9ejLKucNU3P7hifLxvoNOYaXftmEKZH6KISwD3WdxKIE9OSWrcZp3fzatrU9"); yield return (Hash: 0xf2eaa5caa98a831aUL, Seed: 0x0000000000000b0eL, Ascii: "jufg2umT1RqPEeANom8xVhHAC5L42tMYhCpNXve8wUDhfrhWN4H422MskP6tBY2EmEqePlccygB9ZQVTpHQqiP9Ka5mQYyAGx77GUs2NMnU0euVywIO5CBx9ei6de9oCeDMZc7k3wXvSx64x5eZJGUDITcyTTlyDLR0Nw1YRxzxdRdKCzM02wsfJ62SlnYbTk8MPKpOnox0Yf1LyHGIdInWUVj3fyb"); yield return (Hash: 0x660cd203182f08c1UL, Seed: 0x00000000000006acL, Ascii: "GV1MgnpqvoSDspt8vNJkG6EhDYNzvaAO7tOH0PZvGGoXtmMjW7bi9bjis2s4rWHtfX2bza2xfKKI6LFpkjQLQK4uiVzUZrW0qChLjsmpWIZRdGVIGCtG6ioxs0WR6EPDYFrTNoj7o1VKJEmW8VV6BG2hcO0mwrIUnTCd39CfBPKIkTm60R5uiYU9XUhsf9spgu6w4wH1eHFzoVGsxkapM8xmcqWEDHU"); yield return (Hash: 0x840878cfca73a99fUL, Seed: 0x000000000000266eL, Ascii: "WGhakvdr5URzegxBalPiDzXEY1viANvoS4m0bZGAtcpjafxDA2fcud3OPkRiq2otDcndRgBMA5vKwxuaUdwIcy0SwhnQPvonKbIiH6ihAE0PDNP5wnNVoGwPhLxuC5M7rRqnm7jqnIevjTR5ZCc0NDMfeZWoEl94XZcixZurJgI8Gtq2ILUdqgrwL2iuoa4aPwh0YnZpkotBse8mUERANTf2EJfZrIZ"); yield return (Hash: 0xc19a10d548af45c3UL, Seed: 0x0000000000000530L, Ascii: "U3jiPo6HiD1tYHnCbrkOo0rZismuXvf2r2hKvELc7llbPvCJKDR7ekfiXWzImRBuViE97og5YCPzAXNEq7Ib81PaCxmN4vm6iBZkghhPUvjfcU2f0xUlkzu9G2UkhT99QOO2rFyCnN1qwuY8utUmmKrJf2W7FCdBm17b8yG9jegKTpKLbobuKWwLcmkotRcguOOv8qq4nNaE4EMMtMPssm5YzHXflJB"); yield return (Hash: 0x0fc9a215639e2042UL, Seed: 0x000000000000134bL, Ascii: "hrrLz2buLvxWkERcKPsq7YpYcyRzmV8GHdXV2ujmzVtrt4epM0wZclAhkSzP2yA2qokCFjp9FDJnwk3ev0K5qWwsMkulMNCs23x8KSChg73HeC9kjPDfvkFG98rF9lS9jPaTQp9t2ALqVV6AIFS4gHEroFKXVaHtgacNOpOYwaORIces1ENbq2AeYcIcmomXs3XyPGqaHmxizYRjchXEpHWvK5qv2l21"); yield return (Hash: 0x378f69eb9bc14376UL, Seed: 0x00000000000012d6L, Ascii: "33wNhFAj3b00HKKB93gYphsoEczhprR73uEMR4fR8rdMe9t11pI4Xjm1XK8YHWJoPtIDhwWhJThCvahs2gYEyAg3w8hFAwD49Din0hcv7D59FzlvMhLzeGwaicTUYXitXx2R6T160RkmDrVeNEFa4mSiWU5kPbYUO07l7nJbaduDA9Dg7YDIUZUmOjY36v7dnO8LRuHWVMxdiILVGMH7TqN732NuGBQv"); yield return (Hash: 0x9f94ad9c15d831c6UL, Seed: 0x0000000000000000L, Ascii: "HOQiALDlp6Q6srIQ8q02p9sZtYbDmMErff2Y7hw4gBBvWwcvEwkIY6UQeaGsRvG12x4S0PL6Q3xJmYiddO1SNcsDAhAz32wXQxBvisdQWkL8ifYJSL2gTqawFbWz5X8UqzSXb4zLEThzVT3iURoaebCdXC57jO2Vuy9FAZmc41I9l2YjMels27noGfwOsicYpKdkxR848Dys54b21T1evrtLHQF2pp5R"); yield return (Hash: 0xc521e08f9c85336aUL, Seed: 0x68cad26577bb3e37L, Ascii: "qXz5F7z9e2ctXtxxVFhUkJ2mgXPcQ3NXnkRxatRX6THQZTE7sdORZDZF3MQYYKc5XlQTVi0BeEeopicACLB0KokWNEF6F5AFzpB0rLLaDrCo4f2zssslxq7rTvkvE8VWcD0uBLppope0HmdjgXQCorCpihOeZNgEiMtwtjRABeVq71d040ZRcnsmtxDCMeK8w3GiTInjF7AHXjb9oAxoymrbpPP89hGd"); yield return (Hash: 0x296b9d55540ae039UL, Seed: 0x0000000000000000L, Ascii: "wDoaPoLLrmMPQVHhPuKys5igkxzDoVPKfdC5jAbIN2lzEFDTLdmKdXcvFHi3xKWsG2VUbFDV8G8K3l6GDKNGTpaH3pXOaXVFUp0eMtunD152PWSI0lDCAbo8sg9CMDdkjVOd90krfDXuK0QsZTRp5q3viK2XIcOcQazhlvgPpzR7EkZZt8ANXkECIICpaXE8AnLD3Du9GBNSaQq5u1ZBBqisCNz36cswY"); yield return (Hash: 0x5d596bfeecaa50aaUL, Seed: 0x0000000000001a6fL, Ascii: "0cowtHJveA5UlcfWWMaT0BlBwa6jb1zLYEtDo7tpwtuFQ0o5HHKepNwQbWKKnaf2Pm9tFUBXA5Z1JKDMew6IkLiESY1HFCbvnyeicMF5htD5azvoPZzM49yfn8gxtxdZ196R3z8Sf3fOi0o1OMWbxRSEzkfA7Co73Mh1YdbKW2LWzrligAGxhkKb4PlLi3NMWjZSKQShgLIf6EWd2usvqYAV9sy2tzSxU"); yield return (Hash: 0xb7ba26ae242adfbaUL, Seed: 0x0000000000000d2eL, Ascii: "gGr2S5o2nUvizSEiswmATeFJhu7Eq48wyK2H2fScS76BeL9Bxy803jsJaiLCoQn7WtZaURcgLRwh3lREBvFaqHkjG9xc70QDx5IJ4kgn9iKOwlEJzqAgke2Z4QHfwbG3i6058MjKDnVT7adVWRxapgq0HvgnxxvQC0IUW5QRa1jnF6NNfaaq5mXIwS4c6NPzy9ao3LVScS2nzXBknCwoyHRsUFTJFxRgA"); yield return (Hash: 0x0b551d70df994f2dUL, Seed: 0x0000000000000000L, Ascii: "Mg2Aa578qi3oKeFQ0XdDZV1Cyef1uIn25WwxmN0F9XaPms6fRuOZJ9YAitOMw0eBpbEBtNeYeCB98kWYHlvLVSJUc8vY6c1DxlEF5i4Os6GsXj1W6MBWP1W0zsxSewIWw4OhQEXOW6Yc1p0ox5euNviAtnhGeKSJRO5qBGDiBfYK0ZEQwu4tTFf6QRHEzz5UbzMjWTHTVjP5LrXGQ89WbquVcGv1akXFla"); yield return (Hash: 0x5c4a5f56d91cdfdaUL, Seed: 0x00000000000019e9L, Ascii: "90dXdie6aN17ABy652EGCdRAgJ3GyK87YkkL56gs8ts582dCH44SDG1zAQbL1B0Aygbg6PIehPzo7ftrIVaAyVPXqmy0FqzcGooZ4RcVgxgUApEzQbYwv6mfG0Z5DjX2uMalHMQAum3khSwxmxy5NrjnasUOaWp3Pgvtsdnk96za6ZhTiElU8ukznJRidGnLWQwuk0fFF3vr0JyVentetezX2kCTGgnkVK"); yield return (Hash: 0x967ca04fd0d8bc7eUL, Seed: 0x000000000000103dL, Ascii: "KoLiG5gWNCyjrekQ5dPdUm66ofTKFKMh2hxGQf3Jb4OBHZ8Jqyz3IU7lBKrFpzokB5kkQb4tCs1NeLvJGZCgWXU0iPlRVv3NOlLLbyfcWyG4HBcMGyNaYZjoOfLUwjsF5gV6ltLrEEr9ZhDN7UQbvRKUCwL7MKgqSug1D4DetkXVfXsiYFoCXQoxCswyqns3pnIqSn4rrnHreSRF76fjikfA1uSIWN0bz2"); yield return (Hash: 0xe179c0af16acf331UL, Seed: 0x000000000000066fL, Ascii: "oysBKVVZRJbhE5n0hyTfIO1IN1ssqnLBrfWge4bT8JhW9oxpl63nCtzliNCPe4OWwFlBo8B3bjbgW1PrNprj2J4FvRCTTmsyIRNqReKJZNs4bbzIXLpgExQNmQfVk8ohGkuFxUpEuBw70M5faz7XWHPNo2xWg4GNWaVndgG0d4Z3sE4c9Mx3jdgXHR2MoL05GvFInzQkgXFHekvYc5Iletzi3VEYJHn3ZN"); yield return (Hash: 0x1fa2267f5239017aUL, Seed: 0x0000000000001b12L, Ascii: "iqArWz0yyJSkrpEuRw827vrJUn8bdV63OFFF08kPfy0L0BXNtXU0X5KMbLmQR4SLh5nBETIsk0KNdV6MJl4tL6CJJuSr0MayRY9Aoe7VO7Lp8Aj7SDemgZ6CmqS9aUWy1UlKWIt2nNFYp1Hec3QiMLu1aXsDJfLhrLUxZXUcmPy11RPAP9z3whKL0FtLXrA0QZ6GgdgfYPEv0uzbzzlpYqj4kmSSCz1SLa6"); yield return (Hash: 0x750565e577a2d58fUL, Seed: 0x0000000000000248L, Ascii: "bQG0CwxjjRELQAdre7vEAPYgs0ZvlU9fgqLDOArJB4A9HNYmSMY4bbH8EiguwX31seg7sRxBnfHHk1jrfuL4IAwlOKhYpWX2eMKmJDrAOPSLpT3oev2c7WYB1lrL1XH9o2D2yZPOnYWW0RzmCMMnB0yUUuNWEgPFENSwotfD90kZtC3sGPPHAKikVHiZO11W6J2z3W7P8YmdQp6MENhsVjXsdHrzlAoklM3"); yield return (Hash: 0xbdce706c2e8f8adeUL, Seed: 0x0000000000000000L, Ascii: "0nZfUPdj3ewov9qOUFEai4Rz8U8KL5MfpqnxHnBG7eKYVLpYuCqlFBQ51pZ60QSg6w5AQsLxqThQWq8yF7GjG4eoJfEf7cFycOx72vLSc8lOPcufrmbeHpE5Bl8tvGVxWIuCXhVVmkqUpKhTQu0roVylcMK4V1jUBmGjAdyRnSedPxAzwT6F5tk1U0OZGxmgvZVpH0vP8KcXWTCSHSaOTA2mZnvvFVeVYuL"); yield return (Hash: 0x0a984c675e2137e9UL, Seed: 0x0000000000000ad8L, Ascii: "ZVIRu9Rob0qOuJSdtT6diIt8vfTaV20KZTNxiLiYdKfnvEVsYS3f5hMqYpWxz13FsksZgvg2z1YM4GmjRkzRXrUZFKvCf0R5JFqBflGQ0K7oriGjCZYgoSxhJSld3ke8APgGVcBnPBGghYoKPBBoF7mp7Z8HCciEj9V4fYUPpgc9mjAaaXChW0QeZFbHdAMdAlhFdQjQGTWgoW0EFJ7w41aGD6QTyUvmjv1I"); yield return (Hash: 0x5565987299559a97UL, Seed: 0x000000000000107fL, Ascii: "geRSNrQuZqWr5zPtwTnv8aNuLuJnDufynqqQmFH67hy7hTn0zyeX0VZrisMHm9gMkW5smugA0hjHtaSbriDB4G20IKrYyezXVN7pL0Zd3VNAPrU7t7SNJ5Jg9jlDRS69F5WLEEanb1AMXQZyuUla81lFSm5Bgugudly9JbF82NwpbZW8ZsN611xGzBVfHUqCXBH6VQh5yCr6GrQ5kWUmGTVYn76veuMpR4OO"); yield return (Hash: 0xbc7aa525702dbc9cUL, Seed: 0x000000000000075aL, Ascii: "QmY5yiBfM5iKcOcKBh1FhXXZcnHMXfHWWUQHJo97trTjWEqgHjr8Y1QYR3u6gaZKydIPUXXlGybBNnML7ia5FHB0E53K1VriIrGr0usuZyrP3d1zHkKKPCEdKxhWxs1bhzgwbUYdsKzUPiMVyVNlHKIYtQMF1ufn0EY9yt7crX70FRjafZ9xBI1PR0NEuHLv8khRtAMaimR5Sxb0xKZLASuc51jF31rmOYNW"); yield return (Hash: 0xd3b6e5eb0c791705UL, Seed: 0x0000000000000120L, Ascii: "ENUbVCQu3gZc63rKyJ9rF5h0pmk0K5fzfNCobpUnZCrSRwBhAGFUCPAEepGxVILklkEjyxSmla89sveifPgoqaSGDn94g0L4qgGbKfSQhE7qKncbGgaM9m5cSdxumPRkDrcBA7wJ41CoynKaYDP2f9Qdfbc6rtzPG17vPtKWeyRl3lnnzlMKF7B2jU9cAzDMTeZrdLA38LZPqFHazN0xsAI6QU79ty1cAR4B"); yield return (Hash: 0x3a761a90487ff11eUL, Seed: 0x00000000000015b3L, Ascii: "32fNLnH4iMH1yWxQjJ2HPAn0rGSYzU4hZlKsCsVZKYyFbQd5uM4exCun2TW3IkNPUHyQP3msMXPFegpssk2tBFbitkOaTEX6jKiDfHCjJ1BCbJOR8eetVs3VpNnf2kFzTPdNvZRpIXD1BnCUqwgi2IMEYLoLUwKibUY11cL7fLEeKKFwrot9x3DnUOvL69Mr3Ubmb4EkKtRUB4J08Y9VynHCQ6F1tFxJqhQnb"); yield return (Hash: 0x7cbcdc9399d9d7f4UL, Seed: 0x0000000000000496L, Ascii: "D3ItgWHDnRAYV18wCoBGjf3Ay7ensCZODX45bdKZ24lBI5F9JrEJoVTY8bk7J5izL4zrG1QjwJBnisdNVrAT5Q0SlHGROnGNMChG4lhbyCOwGDRKb4LarSDlRSI0vmTkGdCQ0oma6ijguL2g3QGGYPiMbom7Qb3MQbGo3u4GkTqnNWiPZKfxj7CV6BedzRA9WEfaTBkvSo3FNnc4Bo0ubeZabTfcesiO2zJ6G"); yield return (Hash: 0xb6737ffbb963d36bUL, Seed: 0x0000000000000000L, Ascii: "fBecYKgD7Wzw6TVIsxoegWUON8UlPGtDbx8evocil8TUN8JenRPZK07JStDLbp2eAhJfds0knxc1JdEYlhNM696ol0mKyeAimErejkrrJehHzqANEIt5LIvHXw8oC68SGBEGLcaRhstoDmdh5D4ulam0rUc0Z9KiesBCu0neindQwOLRA0Ej0vfeYBdhyNEiki6FYzCRaLWsrpPEOZALpZZmz5Y2is4ChSBTr"); yield return (Hash: 0x052bf6ee984a3ecdUL, Seed: 0x0000000000000000L, Ascii: "6h5WS7LLG1EOdfPLy5v5cgJvKHlmi7yZqzTGZeDECOpm7X1Ofy96jzIGPBbQqzl5qFE8JO4tNKrv9OFoJGBN6xWvVyHvPKq8lHCFkAFTKWcNM0KaUTrDmGp3fHyR9moZ0Jj050nBMfGr82jIMNlT3RFHjbhQ4Rmf4HG2ZW7cPKJvNDfGeJSIooX82A6L3fEdm219N4KYzbIHC7nZRzJjPtx4DJeLwGvpipwOWm"); yield return (Hash: 0x0ebdb69be7969798UL, Seed: 0x0000000000002702L, Ascii: "O21hsDzuNkt0terpCdAFFQJITRnVZInheD46IZZCMrsJrLnA9j9LWC0rBlWfApMWjHyFn3xlWLkUTQjaSAY1Fkk5Z3FXP6qJLNjR1IsPoZF5H67KK8w0Bp40rSkguilH3AYp9YpV3TI3GRlk0CaQAUc2dj8avN7a2bgB0OXh0T35oEnk2BO8ydKR5Qu9DJfPZsuF5lQUsdzyk8NTJECabDtb0ikuPhW1ZnzQmd"); yield return (Hash: 0x8ad48e559811ac53UL, Seed: 0x000000000000196fL, Ascii: "4NUz3yRrnE44DpvKA43wNKC00KkXFLxPwlhqz3Sn946nwjqKc3N1Z8Gl2qqV5EtBvZ6LCrty17v1Kn5aCI8j154J753wRiREtyGfAeYNHE2ulSBKKiLUpvtHJzQIhEjPwpz1rtP4rZi6H7yoz1mfG6dGqV6BhszaAYywJUwXrqhAoKWT5vOaxa9fvIeuKt3IGWdAd0b2XAEtljeVv1qXIPrYkRiFpWtstdCYU1"); yield return (Hash: 0xe43a5a2abd0b3641UL, Seed: 0x0000000000000112L, Ascii: "7oZ5NgmZh9J557vhCTsDJtgce835yhalytjn3NPcWpfg9EEKrzhXQhU6A91m2D5pPlLL0hr60wORRLrjpsZTFIEReKrqJ3RTpk7jTB8M1nBZy0LvFF6j8pILYS6IvpgtxSMn6yzySWv7u3oYYNUiCiq29wKNYDR29R46AwkAg4fLBkuriCYhbBkDbwQ4r1Xtrcx5fseAM9GhO7HrUsBhsGj10JAlew9vRXpphP"); yield return (Hash: 0x49ddee61412673a4UL, Seed: 0x0000000000001fd9L, Ascii: "isND9RcrdR1ITMnEIUV5wTjQ4lbFdThVBcxEvC4zp78k5JHPjPFwIfyQeNYU0oF9lZ9lZyDGU59C19YUA8PAsfiTIivWB9qvyntquc3GoPiNQzAxNaqUw7gRIINzQK3YNXmwzoBVNZW562u7DQk6h0KjaRZIQyEdJPUgvCsGTSNFAPTdgc4ChuO4YJihrdY9qrQkIAcJiU4OnaFFSDIsQ34abJ0kYy5LrHqk5HZ"); yield return (Hash: 0xad4f3ec0133de564UL, Seed: 0x000000000000174eL, Ascii: "j5hGuIZzpHZXY8V2jANqt5KqQVe5fjiOI5GLkM5PNpxeUvYnZDUdf8OPaYKWxsrs8Z01Zham5ChDz8sCutlDqCU0Vru567AMpwbSbnbiNGS0UuZ4AWNrXtwp7bShtQEjMuJlxYv3gy6V5B09OAhx0eyNKgxdMMX4FMEvsCWVg7Q56XTHOVHsRlbptSakG243LwopneNyNd9QOcszLOzp9lxg1AFJOgPoozvNOYR"); yield return (Hash: 0xc80b1532c3cc610bUL, Seed: 0x0000000000000000L, Ascii: "vyeHqoDe8ia5SXHl1CRqcr9cn52bCCM2jN0h0d8WXC62Y2hbhk25ig3UVynISL8H62zHnTtvl6MjhgIwBROKT1AUVlUq0UNLYHmgpgZ4AR2DnhWwscyJiUCJlG5gE8su4FsaFQteM5DW3qlyPQ9u7xvOaJk9YNaoR7IIvMbbGeqqvltPE408wCJQSZQ4ay5KQV0tOmylxj8jznPgSSy7xPf0M0wM9H91m8fUAnI"); yield return (Hash: 0x29d81c972505cf59UL, Seed: 0x0000000000000390L, Ascii: "7AKcE2gF94Hq9ygXiit8Y2wwWDQsygmCh3nPWwTDlexJyM6geusUORNjCGoqagQsDI1kSrY0pV2ftX86dTdRHjTNOcqXcHq4yUwlLvVYfJcVG7J8WttHQe8igkwO497yiGSHKkrpqLR94iteEs7ANQMRfM9SxRB0vxlTEPEocnFh0YROxPPBZ0KdT6eXtdxnbUBt76wG7W8A4kiul6Nidx6hvoAfEs4ff8hrOUPB"); yield return (Hash: 0x55d3d475b3cac570UL, Seed: 0x000000000000072eL, Ascii: "myXEIWnV1uW5B2AyOD6E6hs9YJnfHkQIwBnNM26Jd7AQVqWu1QEzJbJ2x2ZiUjaPS74RFwBpi15wsl9I1MkGUJj1xJJjIpmsMIQOGb9diyvvTRo8RmhYn280Uhu2gEWVtb4ZbD1Fz7QkdeRptgBISxS1XrI60tuDWxvBLssPNxKcneLVWw2Oop6M9Lcb13XLw5g1tiLNQR8gmmesML3L9YXLrjRAyHA2JQ4QF84e"); yield return (Hash: 0x89015902300e253dUL, Seed: 0x0000000000000000L, Ascii: "7AnVvxpxeUBaAeyTIk02DR7KLyfM03bxx1ENtgncWrLyLkiYbvOb9REGHXlc88iQ4v95JdLYVL6DLcnVqn6TsMM3HW4mmIfeDdHQNJTPXKiiRBt1hxx3N0T38sytGxwgjjNRHMeSt3sdEfkFm2ZGUg7UJCrsPtXC5zogxEH2M1NUeHNM3l2xFbEWG8Oy31f8FiMqKHHbnprqgk6B4ScNVu52D1A4ByWBJTnQOb4Z"); yield return (Hash: 0xe181395edd31de4fUL, Seed: 0x00000000000019d9L, Ascii: "xlbYnRAxf1QoDVc3WawSh7UOF98XvXnMUpW2UBedxdXMoOxwyN8ya5zAPXEsRi3YXmu22XqCIgaUe2WfpDBwNJf9ZOLfp67GY5Y9SzwZowZTjeiHz3OSop2nDNZ2TVybzLA9A904j5FVF3rPXZMAqRkrrh648gB88y0NH19Unzze5ogiXOjvGHHW51UAiCzUvx3TqZer53wCbtjVdxikS71q1s4QrYR7anJhmoPu"); yield return (Hash: 0x289ee67915395edbUL, Seed: 0x00000000000014deL, Ascii: "9ZZ0jTByvCFhgV4REwj0BX99tRoHRe4GwvI8qkZ6W9au2OPhP4anea7LuFOELlE01MC2ZALviOpZg27Y6jJnneLSVPGjgswjWkqxQZPIykGeuXZPYwetdEX4hqzVobvYw47NiGsqpCVaru552qOOQR2Uvs4Vls7DNyZVLo85bgmvjowJKRejb6Ju3IGl0kBAU2JRJ8ViVkuDxUpP5JIBrzSzmAUz5pqjSCD8dIUXo"); yield return (Hash: 0x88a9edc968187b1eUL, Seed: 0x00000000000008e3L, Ascii: "rUkprWbCHMids1dz2b17N3tHHvMd4B7QjuzzOnnuui52tXq8Zp2cWfRbuRp8eZexIDSIZOnpnJgvrt84ebnQKYbvG8omiLiGopIVnQDNRpd5Sa8vtqK9hlE4U31pEFrJOReK8qEY78XpDrbZMp2EvmKLqDtaTM3uJkULmPkYjXC2HgRfWtBrM5jbCpK8Cevt8rJKb3W4VcUxYpu5hhEGc4Zp5tr1vwm36axDHKefR"); yield return (Hash: 0xe49d7ba800c7fa3dUL, Seed: 0x0000000000000000L, Ascii: "vVshxkFpwcssocHgztFkbNSbxwCqBOKVuDQV2zmvnKHTCcgrwgiGcRqJu1F1RwVLcFzqSOs6RFsEeyPnMdxtOoexeu879rPBczE2sMbw7hSLj54YPsUUDRBbpkrEZ3CufODNiwMX5oxpqFDT959Nbb9odz3NrRkvEuiylVb4G6KkCH2Go4aPoPpgqd6cG9Waw89w7LtqcZf6kzIXn11WG4pBNAHWU1Oqrfex6kviZ"); yield return (Hash: 0x105a35bd3d346e1bUL, Seed: 0x00000000000011d3L, Ascii: "C4tWTBxJfptCCTMchfrhMAs9rjMpFuOZvkmIxHG23FLHrg1rkY8jwEnOqrK7EWxDUHWnjZcfr7tnNwUq9Jaf3A1qqYAihQYQGyZlLkzLaOuiU1j438TlTnLlp6t3vYPeHIcZwgRIc7eyIp73gQaoBgAeHbTEuONTKJ0iUTQQuiTvMN82T7SpIwjGMFKPcCKQqWtPilyM5N5VfreyLFW6DibHnx8snGKldAmVTDVzEp"); yield return (Hash: 0x7921c1ee16c04eccUL, Seed: 0x0000000000002121L, Ascii: "88zsKqhN7uandbNaTDhAKTnA5SajgVnACX2p3Vu2IekQIA2miHwCfmmjCjyy8lDq4qIC80exb0q6zbLaOMTzYGNqo5AvtEafsPmS8Ge9YDIq6hHwUS11pwjdf147SBFbdLuzBEZ7HW1doMgFsSPn4v4dANqVRZOxxrSbUUkPVhJpBbiI4QQLw0CtjAQFJHKWMiRWKKpnnmHxtXc1cbLZgJfbexucbUHUmZ6IgPbsnL"); yield return (Hash: 0xc065c760ab99d9c6UL, Seed: 0x0000000000001a91L, Ascii: "46oflCJXgfz8y1xwJy564zxDu29wdODudwT4lHMUCPExhMtoyLIupLwpw7J8dxRwrzsf0dLG12D3Rh7J3kpenSXQLLsAC4UKvuC3P9NAoIjRNFlXOmjYblIzIviA03qpzmIWvl4qJkzJsVbjFUCEWVKOtL5SlMXNc40tw4M76LbCn4oV2qpbN68wBLX4JBoV86x2VQcuiP3kC55gTtRdU9ekfdbCpaaZtgspSegSSl"); yield return (Hash: 0xe2e82f61777372e1UL, Seed: 0x0000000000000000L, Ascii: "8gvtplYsrLdFspMwUKfZeIJTtb5WXL4STd47kufbMfMWyb8B1PqhlWGnbhOYObNOhdpWaMggYiuBL6tjH2qabB52NbVwm0TJJ4zDUqVPVw1NFmsFftl1DJpnh9wFB1107wtPWdWSRlbf12eLabbGV8APtmRrVHT3DZADyW3h6z4S6YRoIeaU209Y9MA5YWpX5VpTyJ4BaEXPpATE4EX43gswKBUTfpMbis2tUQB2Gz"); yield return (Hash: 0x14441122493ecf09UL, Seed: 0x0000000000000000L, Ascii: "cNYvYuZsq06i7H7WLyfFupM0LMSPAl0YG9GIQlb2j1MpUEOHTJMNhSixgozom286SIRoWESHtQpqmpxQqL3M5gnNpbLetqfKr5XTrS0kZ85t4dnxHzRhnQ227DuqoTUlwPbHlsC68fSOUgR72IUSPH4tVAza8LKjYXDR32AyU6xosyqJjUOiGWTfCZvBoOgOxQtLKWcu0zbiGo9wuB5fuKQQhm9mHPQ1qUPr97UTvGC"); yield return (Hash: 0x6d2604e1db824db4UL, Seed: 0x39f52b1b0c535141L, Ascii: "Fg5rgyd7wAL8cmS5FUJ9DopvpyB0hbrMEq8KCrbVYWoZ5oGCc5zAZ01ICohJ7xxE39O9RIZU5IHns7A9WaoLatO1M8am7ymYr8yy6YslbcpdR1T7xMhN7uRHbF0TjTvtRGPzLv5vd4nRA6XrCXPAj4ctcXE7l7GpY3sfOK5m7ZpfYsL0NA917z1zR3Ljfx3qspHMnAP7LSCyw4Eb8EOBwdZ1fN9bRL8NOBkerIC7mha"); yield return (Hash: 0xa696df4de3201cbcUL, Seed: 0x0000000000001163L, Ascii: "0gY41Jalya9vYJjOXT5D0Cv1RCFCUzdzKYlttwov2v4ZJ5Q0qfKAvuQNYeTtsOKqMpbgStqsEiCaSTyPZ5rveLC8vxnHiiALJEFKwEyatTXJPs0onHxUFWCGN8cKIEE180cHtTlBQjDPmNGhH41lfK9smaVf4AKYWMRpNpI5KF5GNlkHIqDvh15GUdcb7oSdRr8Y4uvyCYDIIlNjA2hLmPmL2WPyIiVxzZLS2hF2F5g"); yield return (Hash: 0x2cad261c64c0741fUL, Seed: 0x000000000000083cL, Ascii: "lcweVocSaVB1nJiuE6h4ebmEKbN5OqNy6krCy1t9u0sYEVoP4pWOQis7qUf0BZYispUnrt09uVOPDmGFTIBNmF3lwWFhro0nRfuuhenbwibHy0KNy5LFMksHnC6r6wCf5JjfILEsZA6kIAjqxpUcs2i7tQyQM9wLWbVDwVNjxy03NlRrSKmjObfuYlxGlaCWARB41OmDS5kMJG4oyNmqMbAT1usQN8g5cSxN06XuUAd0"); yield return (Hash: 0x875c02334ac76fb1UL, Seed: 0x0000000000000c86L, Ascii: "Uhwt7Dz1vwYRowKUmx3n7eURaEJyDk9OFxdSp3NzqEG1g9BpBCwrEIVg8bXz9cZfPfkigdJN5W6i0F0vXclcpBxzcBdbj5hs5sEnOkLnYGsKQkKOXpD1ktgX5h2ByhukExqP0cXWyMpJYtOPJLOBkModEGOexc2gSlzDs13cEiG1jBD3069e2Y9dUxArwDjHQTTHadymOzp3TuynpFN9hcUT7IM2lYJor9SArYgvEJoZ"); yield return (Hash: 0xc42a03a10a61f10dUL, Seed: 0x0000000000001986L, Ascii: "T1CPelBwyTr1stvMqH5JLWhpnlnA8EZVoylEZ0IfCp2brdRRul0m5V79DjDVMO0iz33FHQ3zeIFf1GZzbSbW1W2dWgXgh6d9joqLWx0Al3DHhosynGNgzgvnOnIydpS3Jr6M3bmErEtKGCzldILfBwAmJEI3nBpFZGfYH8lWGq2uoBqJpNFqdY8EeC5YUI1CV9N2wQd9V8fo6FLUJ58jcUDTxFUly0TjoYoY9zjc5RrM"); yield return (Hash: 0xfd1600415f287875UL, Seed: 0x0000000000001bc2L, Ascii: "lbA1aER8HIbsbNTyXgYw2QdKrLJMOWv3Ns0SBIpBMCvWfsUUrFTmz3pTKQmWWbnrx2sjo3aZXAYoctJcXc5AjudoORKZefO7rTlv4PSJEoLLEtPsKDi7I3AiNjmAx5YCLaS7TWqPonVMe6ht3s1cEq91i8hsUTtbBqvHfoC6O0aZXlUYxG8QQyMhCXqlX3W1iV3HpLa8AwGHB72eVw3LQB6YECAlRz91rgUTmRgLSVyq"); yield return (Hash: 0x37f0ae10e10af6fbUL, Seed: 0x5ba05907e31eb021L, Ascii: "SuOT6LZK4c1gthmKUbRPawWdadQQ9GOR0vKQqlq6YYZTFIvdrZZyqEeeW7ZZ4WOL1sqydeehtV7AxM6uv90X0CnBwnasBFo7oYC9OT4ux9GSNmSbvhdvaBnEJQbhtsz9jfDYpKCFrnjMGTgHTRcIRf5KBEONkJCnBWFiOQOkfBh3MmNXPri6kmS1EmZRdMfPdiLXPN0fKSeEBrpLRTKfJOO1xd2I4PwJR10EeN7K3PxBs"); yield return (Hash: 0x838b5a92a460b885UL, Seed: 0x00000000000008e9L, Ascii: "0YOh4gh7ncDM7FmOF0mK53DkVfcO6LlAjbbxOAQEHHXzbwbDcc5pFiws4g0S9G2a0Y80hFjfEtryoByiebv75jVjlGQPtwZx67pefBo0AyJCZUbQb7TmBKAcOKGhgaC7pmF2dZPGzBrAiJpfMGd48B2UDTKZMNLXZZRc4rmvHCC2z6P9IZoOWymNoB3e3TK70oFRgpHiqG45aKxHatoGRq6jxYwjYMwQg7nZFRHrNGT9y"); yield return (Hash: 0xc18d56e1617fc38fUL, Seed: 0x000000000000065cL, Ascii: "wKalrN29JvUsm53gnqKjg8th3UVwiwrUNeSKwDuKpWJLUhJJi51Tm2vhU9fA5iKeyJIIGlvnPACouqplAyr91f7vD9wG8GCNtvveTkq75MfXgI68psQ8Cu8VNjsnNmctg81mrPnNUf2x9jsEWgAl7pnUMN0gEvhpSpkzHHAwLXuXKGAzFpTeiNkoToKJbXLesQq7vUieskQ9yB6uVq7nTzNyRjvwlzLkv7j8fPNQCBKEK"); yield return (Hash: 0x36ec39dd70f07fc0UL, Seed: 0x0000000000001245L, Ascii: "Rpp36ahhyCIgSWfeA7zHAAC1DzXYQZdSToI6F1WRlPDNotVy6AvrYYIu8Oki319xGhl3aSjQd5EmEUO2HgOh72Dv24wzulbiSo45qS73BxAYcZRZenk5oq0T1O4draIIGNChbyLpaVXk2oIEku7CixuAoKltwu14cfTikr3rWhNSGYgRLoS6OhRRsyqZyB8PQ6NqMc2yzidYXhlMoiyjwYY86oMSCJQPYYfJ7x2M3Tujow"); yield return (Hash: 0x94e6b66333fef306UL, Seed: 0x0000000000001894L, Ascii: "BxapM6Bj9U8ybZ7qGTDaBrVajPOUhCkFCrPyo1SjkcIJu9Nf9EbdVnwxLxqMuzfLAFI5FCmr2M6kf2lLn1QxNFWuGWI5zjCXklSWj6xUhAMSmfk92AKpTnTVgaAGvzkSQlcT7vGSpyFny8AeiNncSoc3PjuDbdqsWjLD6Sob8WCGO4faIuwohfhTec0yUALddr8oVgf2yDtIOxtsP2JyFOLLCOngEZbZqy8SL81DsXVfWa"); yield return (Hash: 0xc51f2b26056c9654UL, Seed: 0x0000000000000223L, Ascii: "ECtOyFI3zjPsJ3SjpmDSVV0oPkCmRB3CtYK1HIx7o6qDI5J7GXaZPr4YQ8UNILkLppiguZdiS0YmDTgDF8s2GUGLyYrpTfM2SOjCz4qBnnbnEbFuh7y6POH00gShC9p0FosAy7l3P8vYqCkeZQ1KjaRFGLnVw3Q0UkLeKWCbbI3fSSxU6apg2X4wSlTDPb6gzZrA5NGS3r3L68u8MhfgR1mnXVm1wOER3KOHf7iRYO0GQw"); yield return (Hash: 0xfbff40a24b9785aaUL, Seed: 0x0000000000001a92L, Ascii: "mma8l32S3LRF6fm7dYd9bhZsh9bO2FtCmBs2a8wOaNDVitVEuTiR3WTcwYMb6IvVIyb4RTT9IbW8R7rLTveJa2ZJrQfk2V5TZlsU7gULcs50QIkZst7dncj70d5HbjvNQGsW6NzrdcYmHDh2UL2C3ntic1iMv6Rnm83CfiuRkQQgUcdlMHbrXLHzn9FwBsc5j7HcCRBFfEgVAvSaLzvpVwFOUUONYNXrxQpig1ZbPbFh5Q"); yield return (Hash: 0x7a71a3d15b85195dUL, Seed: 0x0000000000000000L, Ascii: "1QzdPiIjLZsdR7JxhNnDCq79jAnpyHI4QtN03F6fMIfpkamA9dvnXsloBCAHt5SuhoLFYmEnpJa6rBA5PCemq6i4gpUdA5ROGVHlcoe7tSM94yrc4scqTZY8lXzSwF7FrfmfLVaW86qKCB82Ppj00TvStbgr3ZiWEUMdoJzNWfdUgAlUKWFwPV0g40G80aWDtbKNeB1dSO5tYOSVfNTFpIbWS44MOKKegPWQbXsqj2bqHJc"); yield return (Hash: 0x9d6211eb2da1555cUL, Seed: 0x0000000000001215L, Ascii: "UEVrGej4bdByOasGirKZMXe5lnOb1AjCjIrsS2gAw8OFOszvMM9zgFNYeiEEY99AUe46oWIMf98bsXX9UMiCLNF886dPtvzwpkz6k6DdW8UBYHLQdjKETvNZUAjw7ArGlv1uHJcPA4xZPoSCXdmDvUDqf2mZ5CUJ7cmXySCafuzUFq0eK996DoNM5L5DaTBM95QHXYaR34vsDFLE7KhfmBgoD03S9U8oizxHJkylOZavxVA"); yield return (Hash: 0xe8f190ebd14b60f9UL, Seed: 0x5612008dc6ed9806L, Ascii: "dsVmJjeoqmmID9IkVicCbJnEIZA1hxpj0wPlyCg7dCN4HFkeUmlF4n5GahSPdzKuC3VWvqUdYQcnymvqdHsvBvpgeAy6h4KUhlaQ3iM9EMKhWhH1DUzg4ZlDT9zYMBopdhgNjQsHxDbPDc5Bl3SD5wGeH3A38WyRU6x9QzeJc4fyjFD9uL8qJVbn3sSneFJQ6grobyzqLIZ4sLh6OjVcXbOWMWKzHGQ7K7HJarw787aB7hw"); yield return (Hash: 0x1c741f4740b3ac4aUL, Seed: 0x00000000000016bdL, Ascii: "FdKNc9fjo7dTluFwLxwuOTXSzmzMgj9ItywHo7T6HQ5Fg39kHSVqullshpruTdP0BrEEcx652xt5USD0wkSzC8FQFxX8OHJKgBle5w450uePgZOP4hfAvzh0sNXzMVyyW9wUL1JUsG59Y0KvahNyZxO2hXNRVslyhy1LP0BDgA7dd1KUqM4ACALQOLUHDiAHyKMfONwEgX1G0zlJU5D4vTzTvNyqYGbytrcO4znn4SntVStm"); yield return (Hash: 0x445bdb3d0736b2ecUL, Seed: 0x0000000000001c75L, Ascii: "x3TbzUpexub17sbjFpLsvGvyMLRjSF1gN0tiPUfFwyfEH1MQCKARAA4RPvI3WvbzUkfu97LNuon6kMlgdJE89UesIF8IoiADhKhovTybJsDaTK88RsV4VjYvI1a9HDP0eNTfFzCJhZ2mEKArqgXyjLIOIkQRCPI1a95p1HQxdbFlmwgubyli3WJFzdls07676LeCLKod7ZmsxqJhuRJ7khw6eWJzIpT0fLl25g0kyku8NUlj"); yield return (Hash: 0x7647de563edba8a3UL, Seed: 0x0000000000000e2cL, Ascii: "mvOuW5Er55j43BJSdhWYGEPxIBc8XLthVAFLhy60A4s3DZ98dlpnPWPA4JsDQCv7cgV8Z2Hyzaz1hErmHCWowCvxllLqdFSxQ2lQKMWaMTAAnUwcqxZdu5SzOzikRgf3X5zWUqvJPJXgsT8jsdJNJIYmaJqDVZCIpnBilqZiNoImlgM7LPMr9Wy5GLYrBdlNsHdHRbsk4k32UXUQUeiuxKlL2lZZhVZJnPA6O5xyV9iOpGfx"); yield return (Hash: 0xf7ac361bc2ea11dbUL, Seed: 0x0000000000002521L, Ascii: "KQ0ok3bAflZ1shhiIlX98i3I44BKFr4kqZmNITmCKCWnDn6sa8SEStoPYmFhAuFJJjdcgIVKa1gfUTq8GArzFpA43NaCTcXYRvH5jO5PNPXCTwGfd2J2tmtWGC0vIMR4sfCAIXrUHtEsLVEu5w0CeHRfBJZpGjSMgAD3WmIJgeTGrmnrWIJpiAgG46vKVz2tRaEmUpzbBFPiGR6JNlfNOVOo2u32NWRpYrlpQP1acQVbOE1d"); yield return (Hash: 0x2f37d7c5257055c5UL, Seed: 0x000000000000021fL, Ascii: "a2WBB5GKMkHnAySB7uXFtoT8z1GgX0MPgzX4Zu4QWjZ5sfUPXZq3UXFUbG74Fw8Jk55geWbT9PB35YSVEbtIizEgLcpOll09vmDXlLcR6MxmGl6apvXEAodsve1dgw4eq9Lsx8LLdd5kJY1HlJL7Sd4fckloMiVNR1n8UdOzUdyZa0T0iKRc9wYvpG6py0QWwevVqXlZjwEyYmSQsHoXEtwzjUaRL5Fx15E21ANuyugJVKk7S" + "gmi8CVrQYFQZbeF6e2POv5ZFzf1OgjLnYHp0xpfWDD8uOKH4zE882uBMshXjVSjFRY9Yv5rKdymxkR4VMTZTNPNgiuPJSKQlt0XU2NdzVdH7iTNZ3Hxt1vIyFEtqCqHjFGxXPNaPGJbioubL3hGCs5lqEOVPHHNQNxjhmzmyS3O2DsZrvXkFbD1HpLisgz6T4S3mEJ3tDhzWpAkC3UnitHpgaoJnyBa0EchtNbtekxnSBQ6yShQN3CktaPjfTfGWMmUzkYOZFoG2dYZ"); yield return (Hash: 0xda2ff091f3590e72UL, Seed: 0x0000000000001865L, Ascii: "USxLu2Huv2su0RCa7ZAFf0cMpMLk7oYmPAUhnDBXAQyRMWT8Eoryj3FWiuo6LaGF60OFmx5lUXL6jvD741QrSZ54Ik312oxZurB9bBdCwQVzfnM65KgPdW3Adl5EQCf2zY8v9KZmkSjp6hIBc0iBhJtB1Pj2keW35tvQQhTfMWhmIHM2ZpB4AwK8aPrax3EmoGvs2sjcaijbVZOBQu1SNff8QmAWK4k6FldD3a7oz0OYk1rxaT" + "ccT2qoouqwBbgNvYXcsRlkH8s0F9FLRTAXYmYKro224xjli6ZdsoegrhrJjoPsNERGh5xm9mBGdadQRo4ZHLPoEpGWRq2u8gX9bM9jcellAeT7jJDIjXfsc9CfdPzF454x7H8D2Duh6TdRVnE56strIx1urtfbfqK4uH23JUgzsD3S9zasTsyatKv2DdbNSBs1zqBTGIDxwRyOF6Y7Z1UIjP2U7oLLzI7IwdaOzZmdnTJWTGqGO1y6xjjv7o0dzjRCtkfN0HFWF6C4AWQkj15GfEopfbw3nohIo9d9LdAZ9beW3Wt0mMTkg3Uq" + "gtpcQad3uRQj3Qwo2hXfxSF4OI4o7CF353coopSScASXKxSgSOTKSp0txdPBHpEGjlBjfyaLWbb4KF3lfAyzcFOdHhIXw4X5OXKfP9CzvWsBX30dJYPUM0iqMo4LPKyK6SSVakfTnMhfnWCkyt0q9FI2yn0hVkTs9qQuqSkH9INxYNhnn1OTDScudPq1d01hYCry4RtaxAbGYfvyGCcaua6MyGo5NDkrr8o6mXROvpDtX5LSqRLE8ArgGDmYkWeQx6whRPK7l5JRhN9NLOpglAUmOF8mstzQEcVhV8hK9xfXs0AdQZMMUrEQXg" + "k2Qg1x02FNqKYbScPr5HWxxUc40fUHPhdllmC0f0CnrRE0xM8x9D1bgoVLkNBYQ34hATXuRd1wwKMXoOZ5Uw6lWAnUtpVB6e8Ns9XPYrJblJ61UD5RwHGczt4uv4Gla4SQ8zLLLq5rhRB2toDA3MiZc6wK"); yield return (Hash: 0x80eb9cc47d75ef79UL, Seed: 0x0000000000000000L, Ascii: "TI6XYevJji9MGqpXH8Wa3hChji5jt91W8MyhwuKrpPUEBwp9sqWdebdVvoOEfJ2vGg1lNZIvuLwmVDKd8Vou3qGCT5VcqI8goIxXDF0jZF0XDLAQXCFikOvcx0CvZZYJjBVqiY49rbSIAqw4CdR2ex3guwaubHERWWU1WL4AwBYvqM40BZVP52jArDymVhTEg7kjsEgOPQbYxHCOiE0OVgDxvOfvLfnOvbVHAbJtACeFR7EuTQ" + "hnYI7WrEPTjmbSLxdV62FAi1DYVdHLSmJm0gmyGTYI7oKrbv90hbIJgv4D5hUGi2S43rmLixssqtosdSUBhsH25qJvJx1FZ6rIhtYrajtDpaCNPS1pH5aAe4NtujDG9mqqmm9IFSqw19cAE6dGCTd8FgLlWCKt8Vdoqn5Wy39E15wkCzV4ZtpTd1tMfdiQtIf7LIZKOmPQUjkj62i1pLbam8EHradR8iF9ZskMU2u3W7e7e4IWdGFzubnoH266VZSTZPn9RcLhwN0yrE3AvNk9WjKW6vwRV6C0nl1n96ir7VKTD08l4Nh1RXop" + "C2ASGF2P72byEwdue5n8KjCvkoYSJdbif9QNiLeZoGMUB64ufVknWPjMGqxBRzUXuhhoXlsh2clxhSVycHYFc2WvldpGt11R4wgobPmtcrgQG6zjvGNKzVDQDnHxGN68c7Ij7CrghizJu14vZwfElUxoaPsdU1u0Uz8Re8XSR6O4NE7Rd3uo3EOSr3CVTjXTlKYMyheNzTTA3UsywfQJhK6W6aB2QZLrpwb27FBciHiXGsTGzJya3YeG1mCTRpCTNK0RY1EqBzzU6HI2rvHQhR6GLaVMVb4GXKqfi4NaSaj7h4kuFNc2M2Mu2V" + "rznLBmBZ53Le6YeKpET1U40DROIhFWetZjD7kswu5xduEB6CCQDhHz2ZQWzivVHu5970LFcMI5oxwdUuOoIpgBAit3QNlqaHcvRKK8dR2TNl84AkLlxFnGx6HQHA4hPsFvfPJbAoHycCL7YcJIQGgZlGKBByZdEP6ZSs0vp5MNmIjRxJU7fxuTfgGUj1uMX7AnHZOktctLuT0dqJZ4uLwX55RxnibG7N9KsBMW2ic4h9bCEUVh9NsWYK6SuWzm6q7xBL4tcLtTkdVotWlmEGfUHd5RBuUZW7HaizfB5obQMgkRt6M7U9zMhruY" + "Y1RYsQOCHpCrefvcYrMCu2oass3T3l08fMudGelG6E0wAnDhHlBzJ9ACn0zjS6bxxV8IGPW5DtUCxfq1sTMs9T05DLAWVIP2ldLoRSaShmjZ3WP0iA97qgBVcSReu53OLYmmcnCUz5WBvmUpbLdf5mcCoshyJUprc1NXMhVJtrrt7FUMrEsXjMyusQapvduAo1eIYF7YGHVgN63lnZ7xPNaDERPHaIgtF3inQSKDLg3SF1sBR5y7FcYUS5cq1HefxvgWyx55uNCyRHIq6a5QHLLZqnuMcM0BvRrrsQchEn6uTfBvsnhycJNhKA" + "UNbanKOKF95gNUEFIro7PHKB1sehxxAoa64oF3OctnFnSn5LintZDACNenvgwq3x2bCyE32zA7QHESF5f2TOmMzT0xKJOXShS2PcOThuFnsX5YIeS6N8BxX2C3wmld5Ka17I89K5msFZZnmhdk5y1iOyoeY3hP8bQgo5fNSaRgp6FIGpiU3z5sKTvEBJ8c6VmaS79PyDHYMHtNqv8FWRWmrY2cHlA3AFu9kyLwZpqIAWmiseRwZFRzFqF5rUtzPfwu0rxrxyJCVIbno4mrgjD5WP5CFXgAMrb9IxvvAteyEGmgs8Lvf5rLAqvy" + "xASEA6FboVWVTPbwSCCx4SaknSMQlpIueBfbQFPQAnvZWiqFTi5A8CER6hdngTvNDXs2HjlCpJYphlkT7DRwwA6LUP2BwtKHBVAo3gR7wwexkoy0oRbA5cHwZtt1peKLp7gj2L2R3lcgtecll4lpcDo1GvBrwJAgkhDXwNZCRbVaCypqszwzET6XMv9ehWsLM5XvIaRFG6Oxmx12YzsggT22tPZP3dz6hzflpGsS7GgD"); yield return (Hash: 0x58793064f61ffc57UL, Seed: 0x104dff97b01e2965L, Ascii: "OeWmLYqrzy5uyrJpXEdAKKylrcZqYQ3vcpqZ5qMNlhCR2cSVfKIImaObd0qLjRPXXtHA3Ql0vBXbWRKXcCTxLpVAiPRx39Rgc8F6tMTBhLKh3rIq3ZU8r21tsdsnsnmHfxFgdcRTjdacf3Ml8eQIH8eelifyq3po08CvFbR1WF4DCDuRNCBd8THV6eTVMumdzRG2L9Vr2qVDsRkSzaDKAghjfLrnhxbDxtcXJKA8Lw9aIFJSNo" + "zCtGDot21N92AXwf3kZvikQGhV5QZMDJ39WrI1SdjfCOlQZrPRjX85HM3tJIoaBwRw57w8nYCIxehAMCQ1fAWMgdb2AfLhE9soOJaiLpbf0XurnnQXqb3Uy5DVhBUFQ4MLxdwHEzhQRwcnjeOo5iDW81WPtqQCYp7OueHrRWifcINoafhfqS0A7QenNkMsKwCjsJmYRfcyqzu6P1FzBdr7QTIyINomxHE5uD6pgtGF0HoM3TnaVwsTOaEnniG7CiOsV1knedfzG65NDXYk4zauhOdr5kBORn1dkPwYXr1fZJ0FciuyauTpN7pS" + "WmpvihiUaiuNZsprWmENYhri5NT7GlrIdlMLyM2jztAiZI0ZCGV4It1WSv691Nlfc9TPBWFxaPK9Qibx16VY7JDheIxrDxw31F3NetfAytzINetjw28OYm8iiulIAqTrhZOoebesbnT2c2BkkWgCVVJpxmtR9RGDaiMag9fzQ6QTZK3Rh8vuKdJc8Gi7Nh1sK3DAqTcTzkW5LNNrQXSyLEbkxxEEvl3lm4RSoZ3GMXfjbwkKI22PMce4YXeLP9KtKopHvbgQpJ5JLw5X5QKDyhB64f8tbbnNMDdTYPka7ywOoVEsNzYhnT9mYf" + "wNR8sYrzqCFxWuwE8USYoXdzkvjzomC9lxLKO9N1s0cg2Dk0yUilnBHxmk49STdIaohJO3eA3Pja3Zrw0Ua2ZriE6rvIgBv2cZEb6JSalwDyYhCOSwYPN5SqQArXtG8MoQXfO0nhGzh3AMDuS4Go3BaEXHI6fcziqxna6gz3TOFO4a8XOFokCrDcPBArj6zlfAqfuAwD4wbjnmTUlTA8boOHPyZ0LFaKek5DOftarl7HO7XIzVZ23X0KgKNhxOHh3S439t6HpkUqxWb8nAf6jLSVDHKbPXVGHorGnMbSyZb49BQKGidNnHZQox" + "T2DOmQuhOJHs31cbriBIrQKAQZaAvsVLa2vn8YbjguekDWBFqk3Q4V26Xmrm4McUUuIwHG6pCUXDyGeYANgcy6r2Ngw6DrueDQo3tTJn2xO1258T82KQbmK73LKo1ZDdCt7S6plQ1tEsJYL9bDcr0e0DhZH51NGnEZcLhnG0z83NQmfoaj7eeijY0MehsOCfWKIZu9lemMwmblrVZrTlsWA8kvHRFgLWrKGjzjVaN30dEZFpp3nN5B3WQ54oqjqCRLMDJUUBW6oTa15sBBq8zljziyJRFlNlQJyVKViGB2ZJEZC4l3Td0LLsim" + "O2XyQKqq4rFZe7B6QVeG8xly84d3QfYatQqVqN1IkD9u2SUzfhs15Qmg9vGmtWLbbaTbjmYwTm58geEcBIQwTyUkl6HUdBGs1oaKL7kFevkXEGWjt1yOXLyUOwA0mi2XKOp3sXDZXZFeQYMC23UuA4RDvL4cyBNel9pTNOlw1UzR1kD5Mn36Mcmsm42i5lZrk1CoLpXanfS1aNuiK40ZcXyDvnszDQ3fOGCbRND8seacADmdpKFczhKe0f6dIJcMVNrWYUAuOjz29uyZfeALqc2OamzLV4LdpSbaebG4qDEcE5N4SQLRSvvdJv" + "BkbmdllZ1IEWE64Ol8Ti22jlWTsrT6BWyXhm4D08K3v5UDVCwVbRwLLeGdBvoG31AU3KOfJWmDWthtlLdIigz1hatt0TWSB4vmfp7H6gVzFjK4e9HhofapuVpbE7duSsMcHVGZsQeS2DucQdjogVEHOFJ4XqTsIK8v4qvRyeGnQf5LHXlp49tKfffvGSRlmQaniYIjKXEVKYOs3QNwCDmRMOUb1kRngiKwnWkmz5EveBidPy67bwr05B7MQxSVsh3eXfjIrWw2AiiYC33Lthhrs07S9ALFGlfDhv3L2tejbBQ7NjBe0AT8NV4U" + "1Q80quhJwCbybUWcLbf7GklusePDCzLURqrbn253MXP9vfgAedNniqRj4hks9XFoTd5pijUw6H1sxtYQsFXe4DcJyvRiS0tWOGxVJQrnZq6TEZPHo0Wj8xjIKtauJQihtOlU8ZRTdOdqiIcJf7f5erUBc3TDkKixLoxhh1fFYnLp9fPrc7I1ylCthBI3e3WFJGRZurCNwzBzCrhPQ0wLl7Z3fVz3cCfST4oaVsro55KRZ2RHgBx8JXMmaqLTFFp40d4JlPAE88HCzjX5TViHO1RNIVE2ajcGCVYB81pc4fgb9Dw3i8vIUpMYG0" + "6P2UDegFKVmsOR8gcfPwQOObdHDPSjBGK8uPgUd1NhbsgSGSV9KWlXciINbE5lqY0tticBerp7oS5lSag2UrAXizgVu1GaKSm9h98k5GZubwDDQbmSQ9jNyqg9u7CF6dpUoiF5rGVqps25Tg7B6vYYkydoaynDtvFf27XGw8N9XQUr5L7jxmYi50xCdQZhjxPpE76Wm5haYbTmrcqw2rm1tSFBk8x87f3cRrFjngfTA2aMD7bOENJyfPmHeFG9CpweDZSbzCb6Xasr0sGUmtDcb2gPoOV38BBOGkudVaK0jDgUXSy9a8sLJUHS" + "M3hRxlcAX8VKhcd827830yRK7uUj39Xwwhl7WwPcX9vyt1QH7IpcqqvSSsXuGQWheBmIRjjpViU7q5rGSJtn339cYmtwiHFOHN5m60Qx3rcu6nyAl8uTjBHcGxum4oNz7f168MPvtxvmY57WVzNkekJYMyDQIeZEvNJtyogE6V0Uq2wbJwjwwQ0lOveOj2Jm0qDltUU9yOsYzBT6Vl417IZ3ib9JfeaVep4A94PoiP5jhuKqTDSH7j87UcMBToMe3X1CB7u1XrSjdYe1YckTdVvWXAAr3JqzdxkCdLWaSTV2Dgzyna6BmPCnBv" + "pYuWeRdmqLDlMDY3CMnJzHxu7Dte0qm5K0o0gVEkfjcgQ2MUpf1KQQCpsR6vsbFezLcJcMOH0dmFmujKY1KLbkcCY7MofrD1jafg3Tdt9JiQCi7aiutMXBpAOow9WgUXqnPIm0mE4ypiyMLiMpzjPoM9KAQoOeEIfkRRuvberQhtmFPJXD0hvQ0amYuEICOJ7P7iAt7jW14yGO7zemL2MGJlgMf0Zxzj18d4mWgaBLGXyFIBbaCpItwvL9pNQmIJugOWYvqYZ7mTROxSAfKaFvWPLOiQrp5WqzJ8g7Qyv71aNpDhFNxUnwfBWX" + "lVNHKPSfLbTvmPhUpOrypMjE8x4Sk9V9sJpJ08DEg3nC5bLvmG0yMeoIWXQTOcQRyfCehc36HHvdoE7QYYlJ0YQrq9aDLTweLvpIpPBUOaEpWcaDmZV9xnOr4H9x12L7qevGx9KswaxATacXKvkR77FbeapXpEvvNqWEtP4zGbJ9UjbkgqM9s01SUCiiocFOkrZrvWaZrUxnhW9yenrI5P4px77cWAkqtFG1EbkcTNewS49UFnBEW3BTbgO5n9uWdfVS4L7eo8yyzdOSjWxXqXaxjHwrNEKz8TMTiwSe9a8j3Qtea0DiiYkkmh" + "em38E73c9pBqP1Yd95pRrHKQ4tILPgT1WdwAU2EmgdBNbqC8ypDWvvYB12CZwEuckDcx1D7uT3vCkNx2LBDKNFTe2TX0XmX2ei78dAlBmNbhPEHZD4TLkwg7OlzYHvd7RxcR9bMuz7kuonBLuvzR2UqxBWwXvtlX3t6XNFqAHRkvZLry7i6xFowXTEJzYnq97RaHvtc8Cs4qznIjONLsKMvtYDek3awCQoQVBeDdHUIxGtT7gmUXHKF3B87g3ZKHHhXTY4RGLwcGsIFEOUhSPCGhyiiN3SnBaeHCkcKSVs6RWh6zzC7pclGpGe" + "mjZ7mcYT4xZihIpdgpoGEBWcggLrWvVVm2HNszMSdxNIHremngBAl9JD7oV1d2BqZfw8sHUg2QHp3zLMdBQLtQ"); yield return (Hash: 0xc05b765025561928UL, Seed: 0x0000000000000000L, Ascii: "iyWHI6mdPnxxYq6y3OF9nYbygTqAT8PWWoFZtq7PntXBgqqwIhA6vYF4SLIQwN9to5YH2CYIXqJ6ZmTxbw1GJwnUfdOYDtUQgX3ZioRMKDlHdIwjlYPD4wEvPGu3aRl5R0sW9ppujWlpFO7I2CrNVXb4mBxCAgjbRCoONwDStGDirdQeU1Ug5KfwfWYDSUYr2rUfeBV3O4HcH36SgY7LlIqIvKBEBgBnUa9gUMeD5dAyNAlqvR" + "XYrN4IYq0Bmi4X7F5KZIrEcA7lwnQJe1MkYMDWVbChE5XyKqgTdKZey5vURvlboJMpZ1510Ltctp83CiUezqTVwxcZpHtvA05qHaueeMCCvjOsu8qLpvN2WRG7MrRPCZ5v8JlMsqLZ8MYbQxriqUV2K8BSFpJlYZfd86wMDaxDxRzUgDTn1KeLZFbbJtcVDsr87pPxgwl92xAosI1hbfc7iaeVGSqCJjmxnAGeevjcB14u7pjNhLUTT20N973vVGxevjPY9Nr8hUrXhHNpHIavdgdtIQSbOqa9If5rRY1maIHkO7idmUO3fqiu" + "6R5RxWTtTWs0pPwydmqEuqQzHcjvV7y8wrxjbgb5cHbqYTy549sT639zopUGjSMMwqjJzeVqME9n7XIrdQ23zlbq1LNCQ810XHJDx4FFuhpS70m1PclYztHdvOlkuHvI2JwUZgD4TnHwXj1IsGbFXW5ut4MujNZ1tha8nc5T6LmaYsu179wFCX5I1lqZqB4z2Y7nqFS0rkX4SJFBF5PQ0GLnmN3KJYztXC6KlhjFTkKW5HRJiyF9L7dbZQaSfxqVjAm6RzL142sSqlD1eKLfJcpfxTqxoLRnT2sp0adhLTO8jNHS0JPvlTxrWI" + "G0sl7tSc5n0TfhLQJIK8NDZp7nklRVayNRvfSRc0DB0JBPrOMTxmVUkzbKgB9xIgudR17EkhJZlkEGCIxVTPs526N8ULNqv8bqm2MM7CH3eyXUujaxXBHKVbMaUDIkbNVLzDt0k3NixMuRGLDAKujqFzNyre5IyNTbMqrG2PpuozrNAJUc2b6Qzvd3vqdNoG7vL89OjF6nRJY5E5kSGzNJbJOMzshVkT2KJYtRFe9kvLsLTlaTGb0sAYqeUMYpVF1cAS89xvBnO4bAMsiYXapLxOkw6EEyhd6nJWnnVX9bKzZYcHcbJwH4lPRz" + "FWa7VMb24lOGws9GCse0IFJ2zU2SszGEFMSjriAfcpSncVrscM5WFedYRtZNXwfGSl6xjcnq3e09ukHC2gtJ5r6l5tqNVAiZE7aolL1DaeXUsxAar9DaRErJ3IttkB2qa4pWNEnA9TKn5xMkx0UUBu7InIedxRlS2t3H6dDUxcOcdIOQ8ocWCNA1LyD84rt3PefPYcVQQuCgMSWcCxdkDr0oEAzhHo930FdF9xwEG4wKHq3h6hnBGlALvCO3Uy70KtpisTRgioIx2emw7EopNbMHKxzgzkyNewh2w9Z30Vm06joWe1qvzCm66S" + "Frmx6nPTHb2X3NU0M7ZW9wJ60agW3fj5NcuErPV8vtZzcPMWEtE8Kj0FX2OUq741UziApFgi8SIl3uw9NzvRxMNv8LZJjmqrWRcs2scrnnxqw9wohmPLYqOAbDRYr5Vqy7LynWwJR2usdgNOGvlc4rTXDYM4TggscpaBGGYgfnBC3JT5EcNa3M13JvQ8HVXt7CSbdZBdyQbrQwblsWEXan7JMNrkl0LZgE04ItpXtBP9Motv5ZpIpKdE0UbL3jQmhksPsARPQsqQ84F63dTc5x6pSnQDlDlWH6TSshc6N8Czc4i2QpPY8HkGt5" + "Xq0kxN0mQBy26cSmKceIKKAKh2tXYWRQS9usNZHYYn2u8wojmvcPFjE58xE43Gz9NgxiDjW5XVVvWxCsdDoGcPFh2KZtbCyosRJ7aJJr5dD2XqmhbAX6UG8QEsgcZQyTsfbzBC3zDfl5blXbyx1hhvra7MvNuK4uy4cnrj9qdL9YgQTyYZkZxQtuf6qPtwQKMbXvyBKD88Fpbzb0vXNItW1O23Y38DsPgB1L7UoNAc80EKuAJUaaj6tMVQeGgXQUQDYnTOkJXZPlrDtnrXLFUjYZdhw23ZFlTZNPkiCzQpg0ZarlBYrVELyoXs" + "FLbBO3HV6MHAISFNDpTsjN0FrgaGabTZzRVSr4KRuvT8Q8lZ1j0xft4narUuu8i8SiJK0f9qVxcQZDuUQSB5tvZPj1J4F0L1bJ44S775tGpjx5mUgI3xKyfBBUipgwPSW3X2rcQ20uljePYE4XuzjNLRKmbA7RhD4E8v5wJqiqGDqtEXOEFJFLHD8JAbjAbysd2SSuO4aEufjfyZjLfJ47kL4XvhrCD39X8buY5poRKqWdbHP8OmPEGsjypBijSd1fhaPGegkUAt8friWlEfEHtATfIa8kkF33WrTRpcVH2P64uQtSItVxtL4m" + "6mWeFQIhPe5h2sftSJPKRboiqOx2tkjmXFQxhccBHRkmt90Qpyj4vRR1Eh1UoMbyhhjwaC0j14307KTiz6us73rNotyDi6OjNhEPdID3ysSOJEIAAdrn8rBVGLBLKp16Cxqni49aHb9F5LlWfNjSggUt8RsqTPwSBM78xju6WVsQK8brbA1C7GtvnqYgt1zXRGAuYmHeEz6BhmYNNQVYql2vK4Z2LuYh66hjC4SWbOnk9LnohyyNyohvwF2Er61ZlqpGcsLuQGp5Xxf4JOJbQFnelM0Bk5iGeF4qbXpIN18yxWVoZXxtvehXmi" + "QE4fgEK5L5cIjl5r5wLGc6QtI1oddpLx5Rkpm9pxYstzO50psCEEAUU7KUSKpoapi2KUXoENi1g6PvnDpv6ItiH2MlIVUm514bd6wGO9A5yXZNTjeiDzgbCRI1nuXGapZ9yekZpqONJkKJxfuun2IKPzzD850m7YI87M5PQtU8qQNxYapk5aFlfWh49vHiTQDbEjnn4HveprIfcCMainMT4T4znAtToODoH12Hmu5UydcsoKLNNJAUiUAOIUmlEjYmXEgGEMLEF6kxkoCpncxf5aYo22BImbjAy5TGIo9wEfMuDes8L5EB7Giw" + "SjkleDErSdaakXXBOhCMT8Pb5EhQSlpSgERDUlCbV20E1GRa8xkGNWU3HiyMuXGrhBnlZGBd6t80DpOlptqhHnAYEsMPnDOSY0JrtsaS8SoaFDOjnFL3aLgKgvXnxDK7qALssTObpAz0LLrJ7UhSa7bqMJVFscMTWE5JpSUbQ343fhiKX6fAJWOBasJUOK2xKROH0MToYdYbY7W6NTeELi7S0d7tqPMAVCs4WJcKzUvK7PluHXifcxBsVLo46W0FIatYe5S1fQwUvi2Y4VwXfla84DxrwtFmknNLAq86Fxv5NqVsV1yCMduHbg" + "tI6XoeQ8ioUIx5jLiworGEh9jlnUJgN8cBYZyVgKjBgbE72AJFgSxKlp6tgmSSTkXxjBuY2t3fFJ6Aa8DuUHMwg6ZXPcgnMSNpszvXQyfig06rbvNKm0PhwAIYRrQ9kbNVx201Z5U9jYIuI8dgAG2wOibcKTkPmcWnUB2ijcm0xE6gXHihNPHmJexO9UeTV4m3MgQsSlE54bSL4tDE06nQJ2GsZDJPFAOlHKz2NyrMLg04MNzUfj89Un09afgqOLXoAa49deoqXGgTTT6iM8Fn2TDVMCFMO1t0zhy3mMKyilDSzPdGkSfQ29Jo" + "tOGboQ3UOUXlYpQTXyrZ36lvhSKqji3jE5TujbViQvOXsnARKvgxDLSXeSdapsx2DXm6KobxrpGKdbMzzIYtfFpxYFy6BUQrkCXDYnVp50WhVtIzJEuDiM0ZYEwRYFhPsormPVNEE90rw6nhL1cznDcKjxDdC3sxh6i4lhG7jdPMpG9RqLYdRsnseCCkJKHUdq55YMEneZpOYjfxdteK8ML8Z24RmMODn3H23ga7QtmboOPAJBG5ahMNQ6DWyGaHqMRz3IUvKfi5nU0Nfpm4j0TdZRh6a9Hu8BtySKHH5Y6NgFToSa6aeGulTI" + "pcik0KixeJgzeVRGpQ0KLHKS5WPfbNTXIUG0iGurgWWo3OSBgPowY50M9yrndhRjjZLLVOTJRZTn8rgdKz4v4cwpkOVXr35VWwsGmFKDqa4xv7d2eIHpGPz0d7Ix3NkDe4lVM3ye8qpvzTjdiFMNgDXrEDGYXf8pGigqSxfU0V5PV68gmTl3xyWE4ulMYgmrBPmTCbp7svSLOL9VFp60AAJFzLmrjfaYJikwhh6UkxDH91cLDs9VFFWBcxs9qQSKIoM5bn99HdG4sJovNAfJQIDxaG4DjSeC9RCrtvA7VYUdhiPV4E06sWCMe1" + "hl0pasyhCtgxUqRNA482aq1E2O6GTKrSxSh59HLcOIkKhFvEWmji8YoAQjqMm5rojIjwD2pnLIuSbwc9nOMdIHgRDQlmQhSQykduChqALN5D7lanlUnsR06IRLZrI5IqZTxERYFsnognsBauwdYjraY32mAoBe4cVZn259BDBfcQgxqAH2xoq11rd2hkbNuGozNIAuXu3DfCCEBJrQ7vdYiKKtd9yzk3mx3l3C8yPLLidJksnACUiaFWVke2rVHwULIZ2gH9IsqJIEbrjadgeC4AzC3EmsIGEDB56FOQfwiYxiZl4V7COQ2mvA" + "2s7BW4kXeOYz4N1Tk892b9WgKEZf4ZSUIrc1luqwiMkqjHW3KjvCyPSgsPyk2E8hivCNsX11x3Igu1xJsEBFMIqngYW9Hf44RVzZ9QC737yfKhZ8NIqFjdjXkdUC9nkORpsVGEwEtHDl4kex3mQfRU8XNQj7RpHfNLGuPKryQVX3RIob18ZBxIZzJc9myKAj5q7OMyNGNzwJI51E92weX72GKzfM3mqOe0Nzx6KznLuf4s2ltjSYEWNaezKQaggz7mxchYFXUHkJvoMB482oUTXfRuiIWfCYQw9D1FCQhwI3BHVvIi4y4R55jV" + "ThswFcY8JAJ98wRELFaqlICRC15pwfgdlDCdBDFSLpFLuNEXLIQPvncycPYzttF2wMks4YZU1oF5T210MmO7PiOarXeWoTpzFQWOfwEl390den99HoSrVy0egVTXP1jomOeBjpDeYqVyqp2LnXdc0TTvhkMJQmpTSzMSj6o1hGWoQDi4BAU5vfstgQcdgt4JvWU9wu0XtHfOtOmXRLkGIOoaR6JteOJ9EnTBt8dF6iMXFDb8V9v1Dtej07gSZA35GMesSOX6X2acTiUeS2LhGeWTGByPJwJMqe7u43noxXLZ4RFCQxv3OcOjvB" + "rTQrt3HUITud2RefPVVVHpdXF2DN3kwBjFnonceJP6pk6MbkVv42oV0tgI9JHGWDOF5CU4mBYYZbKNv4QFgmvZYif7fAiFpuPKa8hW6jsiqVcWGRoUnJXrMYZp9zykNHGS76BcIzCgfSlF1jnZqeZcL2unmjoeyonwyic24B9n7YkSiWSEUmIgLXrqzGp82VXrcq9SRX9BAcn53U9jDQD8L9rksklY158asKiVJwGhj3EQuWpNqTipySKrr8R3xWLebpNCAnAlXckYTJqLZcrl2evBj3YmpfJWgOWkKMfGsluotOAnyLhr6psI" + "e1PVNcYGUrilH1M6H9mF8LcWEuXvigL90roK4Kki3IDarCDSnc1mRzPf0I3v1ROuNNlgqbZNoMbL0TyMZDUq3wFzOf83emI8EHwhXagAd6LsfizcrSnVRraaOEYACDzqFBOjgtz1as0FKlaBSA67teTCKuoAp9XN4WBI0OsVPuY8NaiEkdvq3oPGahfqEHT988koGBqKJiv6GUeoTCQ3FsxOEXkVBlo46fimCNxIoqHKQKXoOoxfkJThKhGDrEK3R8iD4AyP5i3Whjakt0pmiLNTOoIrV0r7aqbvK7KA8NIZl8dXVjGQOtu1Vy" + "oLFfZ0nnWKMthJrroPqm83XcmulLWYxcG8lVGOLoilby0sxemMRDWveRqmrWx305h4n9y7wU5fYClZNlcsAC3xPPgDj5Mvf8bDEG4EIpZkvWGyUStN9vdkshPmm4vVMS9Fj25BTvPEix6ZL7MlRXYnQCOB1knysMTJsNPp7GN1YysFIFWRNvE4csYrJGkoeBKwMZVXvhLKgl2hqPyUfRJGGxBdTyuHItBHnQ2eXUtWuCqOXNktMOPReClFrP52DQlgQG3BDVHE0BZKc7qD7XTSAdpQmqkzWfT21xfHpwcWecFHDxacJPX97ULp" + "eVAmiP0I3Z1dcI7KqjSbr1shDzyjPspnHgulEvDDzT1a81B3JHADw4jv6rlwn2lFfy3AN2T8nZu5R4hnJcd0PjxV8ylVYStP0aEqQmR5haflXffyH2DHc3w5BjFq59jdZ0aN8D4yapVuOJUPHJIJmFvIhXiZZmoWjGFnF3dKPgUz2AZlnbTINRNbSCSUq2J9q0ZKo3IwdtqyonEH02yrFTn2WGoL1nfepY3vxdXX6FMFKaeLiFs22rXfZ6RkIv5tEZCtJTisJNT055bKWdCcLLCn9jY0s2j3YJs8dHLepjhxe7uAFMytTVq8Y0" + "SE65nhUV832leIZR9JrMmNsmdfI59ABGEh2f6CBJ3ZJFameh0co9BzYBtEtcsajgM6PCOElRJHO9d8xmBRIlmNhBhcGC4BH2oEtFo6tbRnC3FRPsTLsv2yiDNL9UJ3S6lBJfMhkbLdUXCgBjaEXz5TkbNQDaaujQWQkHAVMHIdQ0deOtlvMsYvBCszf9181qAoTDF2ahmDQAnTarUxEn9GN3MHumhjI8Eki3h0hLZzgtoo4ovZwCCZLBeeAX8ycud9oBnn2b6f17peUNURveHuFeAuFz7ZUtXez1BcoflaqyKoq6vh6MGVxnNt" + "hBArU4sBP352OLhXIFoEggIP2MGBGpj2LxsXSZhbHrHMRflHSAgrTDqkHKqfjRdSxdEHfXxMkdj4f0FVhZEgOf99IN00YXwXfet2gHQWHfRjsvjzkDTzLoZSy6HQPXYrKnIcgsoAtt4OGkO0LxKXoAZT8Lm9cF1eJHdsAWEMmssd73oV0WXA111iAhf2IOfQW65htyEvP2ljlN9BmA2PLXZGaq2EG0ozV6XqiZ1pgEyyQ2qxRdEoKv8VJQuoWSvK8j6at7V5RjChJVVwL96LdVgvxnSeinlRWWcf5jYljn7SvLPMV9F9fXGNhZ" + "GvvnQVfhU0cZtny8k7a1MO3gpnke0l1w03ZPgXVOMQH7DcIIy6IJSUNN5FqcubUATqdGWneXEi3HLYlcyO4CflRtGXO4vRSiAJSBla186vSiiJTe6L5t36t0G28hIIMkURDrAFjeB2VhLqVdqsmbDBxq4xxxrAi9KatciNCExmDk9JeHSrFeyjVkbw1SSb96Z4fSxtTyhpI7IiSP5vw9xqGBLUbpfewUaIfmXrwsAoLjurbE5W159x2bkL0b6XF9K0BMLsh7FJpl8Uh84XlDxYVUGYxL1jw9Cc29WAuy5uiCF6ThNw4p0NDlMs" + "lMMI6XJN4yz2bd7BJs4wlYFUwKqmwTVJAXoJIghgAX44ix9UxBcMjNWUqkIZa8Xaweh9pOrd7dhdWO2RMS25LD8yKSfan32deCGzcafjv6ZSy7MkiwYuviXpjlK4IJYd6wyitXts86MaP3ATXw472SHnnjLYJP9yBKuwBjdG5HfCUHGQwq5W6UQyoI7U5eszG62rJdr0YGkMuYbs0ayjWDf4gJxDz2UDwdkPH1fDOBIuQSiPcX8PRIELHfgwYseBhppC0PBDU6QAXjjxqRXz6iGHkNOOif67LS3tYOGif4jBPHEQLtbphuCCl2" + "rXnKiRkxQb2LwEeSZVbPnzqlh5cN28bSLiFYpae03M7Cl7zC7oDz3XvthwgqfdZX224veXJzaEjsVOdXZKtNWaI8pf1J55Mq6FH5VRsHgpry86wXMVRrkty9UepTvrvkkHHprBAWuGQAanubxH2TRQrO8FukHKH0XfxxySbvN124hMBBNHysfWUyOhSoHl52AzkoARYTOkMS22MIGpLhuc8i7C2UVUraAZ5C3AhQITe2iVK6tEPHEy7tLFqHxrKpuZGKrc60pdkScSbRXsyF1kIWbc2JNDk4qv2QySbWPIIIz5aL9Pp8kT97QU" + "iLFtdK8O2ghcHTFB8PqMKsg59Ex0Zlh2epGNCXqaqjkXjeMZxgLbqyrmfDMpNzOcgj4d66jhS0JwrFdoPAQOp1ODzJcLLP9eMhDl"); } #endregion XxHash3TestData #region XxHash128TestData private static IEnumerable<(ulong HashHigh, ulong HashLow, ulong Seed, string Ascii)> XxHash128TestData() { yield return (HashHigh: 0x99aa06d3014798d8UL, HashLow: 0x6001c324468d497fUL, Seed: 0x0000000000000000L, Ascii: ""); yield return (HashHigh: 0x4a807558806f6b31UL, HashLow: 0xeca8475b2cc08feeUL, Seed: 0x00000000000013f0L, Ascii: ""); yield return (HashHigh: 0xbecb6b41f8c7c702UL, HashLow: 0x8bcfeb4c4ff25443UL, Seed: 0x00000000000008baL, Ascii: ""); yield return (HashHigh: 0xa2a900ec02fd312fUL, HashLow: 0xa75380084c7b1df2UL, Seed: 0x0000000000001bc1L, Ascii: ""); yield return (HashHigh: 0xa26f5ff5290b016cUL, HashLow: 0x2753d05a8f320003UL, Seed: 0x0000000000000000L, Ascii: "Z"); yield return (HashHigh: 0x4623628864bd3461UL, HashLow: 0x826ed41a6e3413f3UL, Seed: 0x5a7a3a6dd84a445fL, Ascii: "f"); yield return (HashHigh: 0x764b216a6748e65bUL, HashLow: 0xb92fbf351dd100eeUL, Seed: 0x0000000000001c09L, Ascii: "C"); yield return (HashHigh: 0x506e248b0503589eUL, HashLow: 0xec9a584c5994b0fbUL, Seed: 0x761747debc4bf2fdL, Ascii: "e"); yield return (HashHigh: 0x71f1afcb4f6947d5UL, HashLow: 0x123a6f50f1ca0359UL, Seed: 0x0000000000001cf4L, Ascii: "V4"); yield return (HashHigh: 0x054d1416a8ac6149UL, HashLow: 0x30a9330b3de18584UL, Seed: 0x27f065e4850461f5L, Ascii: "HA"); yield return (HashHigh: 0x274c6130ae605b8aUL, HashLow: 0xccdf6c02b23ec3fcUL, Seed: 0x00000000000017e0L, Ascii: "KP"); yield return (HashHigh: 0x3248dd8b112b8de0UL, HashLow: 0xe90908587fefc64dUL, Seed: 0x000000000000200bL, Ascii: "5O"); yield return (HashHigh: 0xbb6d264f3da93569UL, HashLow: 0x0c3efabfc49a356eUL, Seed: 0x0000000000000840L, Ascii: "H4p"); yield return (HashHigh: 0xed353f9a3e2c25e3UL, HashLow: 0x5ab2c95dccb3f945UL, Seed: 0x00000000000009d0L, Ascii: "9Vj"); yield return (HashHigh: 0x6a500075fa490773UL, HashLow: 0x9a892645f137e437UL, Seed: 0x000000000000198cL, Ascii: "ajB"); yield return (HashHigh: 0x83b9766abe82fb07UL, HashLow: 0xf917a1f0983dac91UL, Seed: 0x6f3502011f621a64L, Ascii: "kLi"); yield return (HashHigh: 0xf29da7d603a9409fUL, HashLow: 0x90373b3f6da10e37UL, Seed: 0x0000000000000499L, Ascii: "KdjE"); yield return (HashHigh: 0xb6b99015d0e80f41UL, HashLow: 0x15ac2f7581d32767UL, Seed: 0x0000000000000000L, Ascii: "fCiJ"); yield return (HashHigh: 0x289387774d4702aeUL, HashLow: 0xa11bc364b3242dd0UL, Seed: 0x0000000000000f04L, Ascii: "HZOD"); yield return (HashHigh: 0xb26e407110fee12dUL, HashLow: 0x43701b3e9f856441UL, Seed: 0x0000000000000353L, Ascii: "d9v6"); yield return (HashHigh: 0x4da901296206362cUL, HashLow: 0x5b4171745fecbf51UL, Seed: 0x0000000000000000L, Ascii: "Zx63J"); yield return (HashHigh: 0x0cf89ac9cf9d9848UL, HashLow: 0xadda76a25f503d7dUL, Seed: 0x00000000000019fcL, Ascii: "mosH8"); yield return (HashHigh: 0x9c1809f990c624c0UL, HashLow: 0x8b38984e0b2c2f35UL, Seed: 0x0000000000000faaL, Ascii: "QDajZ"); yield return (HashHigh: 0x28cf7e977573bb64UL, HashLow: 0x01f54f45353730c9UL, Seed: 0x00000000000008baL, Ascii: "DNHWf"); yield return (HashHigh: 0xb9e61a5de2afbe81UL, HashLow: 0x753d475d0b87e693UL, Seed: 0x0000000000001062L, Ascii: "yyaFtP"); yield return (HashHigh: 0xd5911b46e493be09UL, HashLow: 0x3198541f3c02ef75UL, Seed: 0x0000000000001d89L, Ascii: "kXzedT"); yield return (HashHigh: 0xcfbfd6d5f49a2e56UL, HashLow: 0x26aa5e13f8a2a76eUL, Seed: 0x4ef78ad67d7e2c8fL, Ascii: "E27wiW"); yield return (HashHigh: 0xb9515a7b65af9257UL, HashLow: 0xbf40898c0f8a0f8cUL, Seed: 0x0000000000000007L, Ascii: "M2sgd4"); yield return (HashHigh: 0xb47c1a2be46a9038UL, HashLow: 0xcc05dcae7d590f01UL, Seed: 0x3d065f4429458c97L, Ascii: "ZTCkePQ"); yield return (HashHigh: 0xea8aca80dae26bb2UL, HashLow: 0xe254764fa5b83a1cUL, Seed: 0x0000000000000064L, Ascii: "klpn67g"); yield return (HashHigh: 0x519db5957ff6d25eUL, HashLow: 0x0b0e3e138a8cf5a4UL, Seed: 0x000000000000158cL, Ascii: "lPOSwvf"); yield return (HashHigh: 0x4dfc8bc32f60ec85UL, HashLow: 0xf2081fdcb4e7adc3UL, Seed: 0x0000000000000000L, Ascii: "SbmPVuZ"); yield return (HashHigh: 0x9ef5de9b23143fa1UL, HashLow: 0x99d532146c2c0a73UL, Seed: 0x00000000000025daL, Ascii: "TLRDvLvS"); yield return (HashHigh: 0x020829fc5ce20aabUL, HashLow: 0x5b59238c8cc116bfUL, Seed: 0x0000000000001a31L, Ascii: "5kKXT8hE"); yield return (HashHigh: 0xeb44c89e63652621UL, HashLow: 0xc84f4604987a580eUL, Seed: 0x0000000000002051L, Ascii: "UHj4U70w"); yield return (HashHigh: 0xf8413a924a279bd1UL, HashLow: 0xe1ad88ff626f786fUL, Seed: 0x000000000000095fL, Ascii: "YYiJtbOe"); yield return (HashHigh: 0xa98564b5fb852a84UL, HashLow: 0xdef8b6b70a62024cUL, Seed: 0x00000000000006d1L, Ascii: "EGM4yxHgk"); yield return (HashHigh: 0x16012a87e426b9cbUL, HashLow: 0x4082958cd43d6513UL, Seed: 0x00000000000014b2L, Ascii: "ixKUUt5pO"); yield return (HashHigh: 0x6367b1c4996543fcUL, HashLow: 0x761f04e10593209bUL, Seed: 0x00000000000022b1L, Ascii: "s6aMbUVkK"); yield return (HashHigh: 0x81b1195f861a569fUL, HashLow: 0xc4723ec01465266cUL, Seed: 0x70cb1cd220fe3a09L, Ascii: "SsNiqNqBf"); yield return (HashHigh: 0x2b8ed073c7d1a9a8UL, HashLow: 0x2a8b2106ac7829caUL, Seed: 0x00000000000011e0L, Ascii: "Ov4zwcvLx0"); yield return (HashHigh: 0x3a122b70036e904fUL, HashLow: 0x229f40d4a8e52ffdUL, Seed: 0x00000000000009e3L, Ascii: "bM7sIUkRTp"); yield return (HashHigh: 0x0b864bf7ff537160UL, HashLow: 0xc59daa13b10e606bUL, Seed: 0x0000000000002313L, Ascii: "sitCYl1zu2"); yield return (HashHigh: 0xfbcde1ed8641b470UL, HashLow: 0x75f88cb1362f1c2dUL, Seed: 0x0000000000000d3bL, Ascii: "Ck3S0qy5xH"); yield return (HashHigh: 0xa16e4736df3d24b2UL, HashLow: 0xec73bef56c57450dUL, Seed: 0x0000000000000bbcL, Ascii: "Y4lXHPbJCix"); yield return (HashHigh: 0xc696323ec62ad592UL, HashLow: 0x398891b92d8dd119UL, Seed: 0x00000000000022bcL, Ascii: "yD0Ex2vQ9zW"); yield return (HashHigh: 0x4fea8787fd490ddaUL, HashLow: 0x2c69900c70d19b04UL, Seed: 0x0000000000000000L, Ascii: "uOnyD2tQQ7v"); yield return (HashHigh: 0x9f999df17cd05310UL, HashLow: 0xe3aa72d1092ebb8fUL, Seed: 0x5539de8caf41e41aL, Ascii: "vTU3yFsqOQ6"); yield return (HashHigh: 0xd2e9f28209687ec1UL, HashLow: 0x4bce6fa0bf99412eUL, Seed: 0x00000000000013d1L, Ascii: "Hy3emis1M7eV"); yield return (HashHigh: 0x3c038688775fe64fUL, HashLow: 0x54000864b933726bUL, Seed: 0x0000000000000647L, Ascii: "ZuXRMHrPQHtz"); yield return (HashHigh: 0x575ac4345a1b6ad0UL, HashLow: 0x0f2087776d37810fUL, Seed: 0x00000000000017ebL, Ascii: "TsKvY0FLKoQf"); yield return (HashHigh: 0xb2675e6ad8339bd2UL, HashLow: 0xd69c359804383ca2UL, Seed: 0x0000000000002512L, Ascii: "s9hk0ogUPKf1"); yield return (HashHigh: 0x3c251a63e3d48d6fUL, HashLow: 0x038087b74c6e14dcUL, Seed: 0x00000000000013fbL, Ascii: "kdFgtjHcConq5"); yield return (HashHigh: 0x297175e758e86f57UL, HashLow: 0xcd7498d94a672885UL, Seed: 0x0000000000000000L, Ascii: "PfI6lstr0ZLWG"); yield return (HashHigh: 0xbb0c381e51998f64UL, HashLow: 0x57719f37134a266aUL, Seed: 0x00000000000023e6L, Ascii: "0ryRPmjP1mSun"); yield return (HashHigh: 0xc1ff2ee022be1ad2UL, HashLow: 0x2bd68a11c0606c5fUL, Seed: 0x0000000000000000L, Ascii: "XEjB6XqOe5ymx"); yield return (HashHigh: 0x05350b438700d9c8UL, HashLow: 0x461ea209cf21ebcaUL, Seed: 0x000000000000139aL, Ascii: "64WbTFxlWe3U2k"); yield return (HashHigh: 0x3eadb498d13a37d7UL, HashLow: 0x622e40b0d1df1d28UL, Seed: 0x268e74fe41033efbL, Ascii: "He08m7cz6BVUKB"); yield return (HashHigh: 0x5abdfbdcd245e260UL, HashLow: 0xa2a968262e882547UL, Seed: 0x0000000000001fb0L, Ascii: "Ij5MBfLKVkAFYF"); yield return (HashHigh: 0x10ba15135341f2efUL, HashLow: 0x38ae7fa8bdcba136UL, Seed: 0x0000000000000000L, Ascii: "VSVb2538wGyeRM"); yield return (HashHigh: 0x836653ac668d328bUL, HashLow: 0x134c845fa1140333UL, Seed: 0x0000000000000a27L, Ascii: "hueNVzaX9p7JdKL"); yield return (HashHigh: 0xc77cc4e476afa994UL, HashLow: 0x48075e4b92a682a4UL, Seed: 0x511ca41ca4193614L, Ascii: "kpx0STYilb7EM88"); yield return (HashHigh: 0xcfae3e25c13a277cUL, HashLow: 0xfa327321c32db69fUL, Seed: 0x0000000000001cf5L, Ascii: "dvmStMmz8Uhj4G0"); yield return (HashHigh: 0x66b801b19a8b3ec7UL, HashLow: 0x12935062325aa240UL, Seed: 0x0000000000002464L, Ascii: "8csqW0j3hptGCwO"); yield return (HashHigh: 0xbf9e3fce82fea007UL, HashLow: 0x51ae8dd7283b1328UL, Seed: 0x27ea2fd22273f024L, Ascii: "fcuQxJ1a7XHWjOak"); yield return (HashHigh: 0x04a18c598ec0b7e5UL, HashLow: 0x660762826fd6d2e4UL, Seed: 0x0000000000001d88L, Ascii: "cTXadjhxzktQVtPW"); yield return (HashHigh: 0xe4521ffc01debde3UL, HashLow: 0x65c22c1974720a41UL, Seed: 0x00000000000011ddL, Ascii: "VdnhfZNlPd5zBO9G"); yield return (HashHigh: 0xe70ae568494fc62cUL, HashLow: 0x2a9bbc733b7c639eUL, Seed: 0x00000000000001f1L, Ascii: "sRcoac2Z1XKinWsY"); yield return (HashHigh: 0x1f3ba7ee629b72e0UL, HashLow: 0x8e26be7440f5fc90UL, Seed: 0x00000000000019c9L, Ascii: "4pgR1N0LgL2QpoaNc"); yield return (HashHigh: 0xe414f6707f6ead9aUL, HashLow: 0xa7fcffec8f76f118UL, Seed: 0x1e18b9a7c8f02d7dL, Ascii: "ZJaCUfU0OXHoLCEfw"); yield return (HashHigh: 0x12235b54944449d9UL, HashLow: 0xbeb38a091327c173UL, Seed: 0x00000000000012abL, Ascii: "uUFLXT60uVkCOXvPj"); yield return (HashHigh: 0x2c733d5a026d4083UL, HashLow: 0x71ba1a2164870694UL, Seed: 0x0000000000000a7aL, Ascii: "uLLdztp6cDZ1pL9BR"); yield return (HashHigh: 0x5a7f341db512a31cUL, HashLow: 0x7e2e0349c0e69e6bUL, Seed: 0x0000000000001962L, Ascii: "LuOyAcRwmGEH8z6k6m"); yield return (HashHigh: 0x88312137dc4b6af8UL, HashLow: 0x6aae2cde1c9c88ceUL, Seed: 0x0000000000000000L, Ascii: "KDuzVTjAQ4xNGS3WF6"); yield return (HashHigh: 0xdb49e798a5203d13UL, HashLow: 0x8018da180b94a4efUL, Seed: 0x0000000000000ebeL, Ascii: "A1ihuWZ2uERWycZxPa"); yield return (HashHigh: 0x2b849e4e52aa0ed2UL, HashLow: 0xb95f9ca4526d0961UL, Seed: 0x00000000000009c2L, Ascii: "3Ux0vVy8UG3pLbfakF"); yield return (HashHigh: 0x0c80d091f072b327UL, HashLow: 0x71054be7717504f0UL, Seed: 0x0000000000000000L, Ascii: "kZADmGnOFWl6Phiu8tE"); yield return (HashHigh: 0x42ab70e912af4e15UL, HashLow: 0x5b08618751756b74UL, Seed: 0x16580c02347e75b6L, Ascii: "86PTDY6UXtSuJUe22wA"); yield return (HashHigh: 0xf66d33242d08959aUL, HashLow: 0x77cc4c45f50ce208UL, Seed: 0x00000000000007eeL, Ascii: "PVFVy0kMDJgMo593sxl"); yield return (HashHigh: 0x073c5989bf4fa6c0UL, HashLow: 0x526253288d710d17UL, Seed: 0x0000000000001571L, Ascii: "aerl20lkguiB4Gf3T9R"); yield return (HashHigh: 0x8f60190e04b20030UL, HashLow: 0x850448a147507baeUL, Seed: 0x55babd76a130f515L, Ascii: "aGfZbBNKvUGfWCu34gub"); yield return (HashHigh: 0xbb99ac16f4945cb4UL, HashLow: 0x918a3f7892a28c6aUL, Seed: 0x0000000000000000L, Ascii: "VMkxhcMDr321w7YjThXV"); yield return (HashHigh: 0xfff510bc9bf53685UL, HashLow: 0xc6f6c1b456e9bf6fUL, Seed: 0x0000000000000ddaL, Ascii: "DmBC0bnc4kQOA6YCsPpe"); yield return (HashHigh: 0x3a57a810cd4c8ae3UL, HashLow: 0x392cd4dadf5651b7UL, Seed: 0x000000000000074dL, Ascii: "RBwHqQrG3cyoDw0eLlT3"); yield return (HashHigh: 0x79bb83de1c692143UL, HashLow: 0x9bef365c4c43131fUL, Seed: 0x0000000000000d19L, Ascii: "HpsRBCVOx5SkugteBIbaQ"); yield return (HashHigh: 0x66097c1fc468d198UL, HashLow: 0x6f79ea3f021705c9UL, Seed: 0x0000000000002214L, Ascii: "G9YRrhLX02ReHdMSPJhsn"); yield return (HashHigh: 0x167dd8c10ad24ca7UL, HashLow: 0x24d10d5a8a573a31UL, Seed: 0x0000000000000000L, Ascii: "x35LiatiPGJa74outlVGU"); yield return (HashHigh: 0x5687c9578a8af662UL, HashLow: 0xb459433f882b2f5eUL, Seed: 0x000000000000188eL, Ascii: "AsHWiTENK1HPZr0XPVA9m"); yield return (HashHigh: 0xe5cc06711fd7125dUL, HashLow: 0x2793a1bc5ad230dcUL, Seed: 0x000000000000245bL, Ascii: "ocWWrY4XvGhWB3fRZfuOHP"); yield return (HashHigh: 0x01f71c3cd79a9cdbUL, HashLow: 0x47dfbc53c890099dUL, Seed: 0x0000000000000000L, Ascii: "Fjc59qu4SZWLuTuklHLxk1"); yield return (HashHigh: 0x9f4d0609fbcadf0aUL, HashLow: 0xc679f70fe1241040UL, Seed: 0x00000000000018b1L, Ascii: "oqcVab4jAR21vhNpsbp2AT"); yield return (HashHigh: 0xa9d517e93349e24fUL, HashLow: 0x1a17d204aaa740afUL, Seed: 0x0000000000000000L, Ascii: "ymXSTaCeolI6VjlQgh6cMl"); yield return (HashHigh: 0x33f2f3847bbbeaedUL, HashLow: 0x1eaa1999af974e6bUL, Seed: 0x000000000000070cL, Ascii: "ug3aKCkY08yMF2Iz86ig55v"); yield return (HashHigh: 0x5a50005621f22559UL, HashLow: 0x4b791432d34e3cd5UL, Seed: 0x0000000000002535L, Ascii: "rDC2FcItWoHusdg0fedMIB3"); yield return (HashHigh: 0x6627e0bcd66c1cf0UL, HashLow: 0x782a793594e27209UL, Seed: 0x0000000000000000L, Ascii: "9vM6157UG2KPMPYg8bicb1e"); yield return (HashHigh: 0x908e625821fb265dUL, HashLow: 0x23ecfb0247a16efaUL, Seed: 0x00000000000015b3L, Ascii: "Z8LQMWuVPsXAB6IuP15y25c"); yield return (HashHigh: 0xde9e607a15cf780aUL, HashLow: 0x06e5f9c3a56d5be5UL, Seed: 0x000000000000252fL, Ascii: "C7tG9KNrvX7GP5Fb4AONOkLt"); yield return (HashHigh: 0xbb1380c08962f0a1UL, HashLow: 0x582eff56047085eeUL, Seed: 0x0000000000001587L, Ascii: "YOI0xGx2Ge1jdh6k6KsXCFXI"); yield return (HashHigh: 0x087174e73e004842UL, HashLow: 0x8d1c18e99aa89f10UL, Seed: 0x0000000000000000L, Ascii: "7iOlOMeM6UmJnavHzgMSUdZ9"); yield return (HashHigh: 0xfca964a9d8ed87ccUL, HashLow: 0x7337acc5722afdb1UL, Seed: 0x0000000000000000L, Ascii: "CbxYsDsDPFbc4H0qmKCvXr3m"); yield return (HashHigh: 0x9a5a732bd08658ffUL, HashLow: 0x9e79227c2ec02ff5UL, Seed: 0x0000000000000000L, Ascii: "kcvageMDWBf8N6f4QRjW8492m"); yield return (HashHigh: 0xba2f21b61db2be15UL, HashLow: 0x67ab5a1dbd487895UL, Seed: 0x000000000000107bL, Ascii: "3hatHgqJ43eeWMVabG3ZmGH2E"); yield return (HashHigh: 0xa7585cc024226753UL, HashLow: 0x86fae8edb7c5382aUL, Seed: 0x00000000000014f9L, Ascii: "GZZO2HsROBhSwPibHjl3C9K9r"); yield return (HashHigh: 0x3523734739f92d53UL, HashLow: 0x1aec2232165bba8eUL, Seed: 0x00000000000003d8L, Ascii: "sy5RrooAbS2a4spp3UT3g3B8s"); yield return (HashHigh: 0xcf3696dec9e686f5UL, HashLow: 0xed4b05ab45d1e5c5UL, Seed: 0x0000000000000cc8L, Ascii: "GjnKAVokRisPBwjCceOHrVnR9M"); yield return (HashHigh: 0x5bc593b542c1b4b0UL, HashLow: 0xaa8508826938e7c0UL, Seed: 0x011a75bcd188cfd0L, Ascii: "5qzewuqd4RMJJVBTbd7z4vEv5Q"); yield return (HashHigh: 0xce1541a5cb7b5058UL, HashLow: 0xe0ba8df2e74fb66dUL, Seed: 0x0000000000002085L, Ascii: "cDjSOSHGn8nM839nFvNqPc0oLw"); yield return (HashHigh: 0x49dd6f8d88d5e61eUL, HashLow: 0x33d8f061f420b1e2UL, Seed: 0x00000000000025e7L, Ascii: "zZWOvuCOQ7S78PmteXs9orf1sW"); yield return (HashHigh: 0xa4c278de9a8a2135UL, HashLow: 0x828c7677d5f2345dUL, Seed: 0x0000000000001df7L, Ascii: "Equb0NmabCbKGaEmh6dE8gjfL1E"); yield return (HashHigh: 0x8984aa4098b7f9ffUL, HashLow: 0xdb3cc2ff3f14c5b8UL, Seed: 0x00000000000012b5L, Ascii: "X7vd0dgpT9eRzMHx3LDgjvEQwE4"); yield return (HashHigh: 0xf9f2a7cc3f59980dUL, HashLow: 0xd9e5bdb4c7c83da8UL, Seed: 0x0000000000002370L, Ascii: "H8QsGBXFPf89x5Q47qSBj4AhT3u"); yield return (HashHigh: 0x227255a30d2571b8UL, HashLow: 0xaab49a97ad9bd967UL, Seed: 0x0000000000000000L, Ascii: "8TRix56rWbRPISXdMbdtjKAeZRZ"); yield return (HashHigh: 0x4031fb88da3925e4UL, HashLow: 0x9c74e64f3b042834UL, Seed: 0x3f54eddf60ada18bL, Ascii: "icq9LPMDvmULotIweEESeEDVi0HN"); yield return (HashHigh: 0x423152c3b7ad40c6UL, HashLow: 0xd698982f494d629bUL, Seed: 0x0000000000000000L, Ascii: "i6PCFvzKoWZ2qkeiCTA2r8rywUkZ"); yield return (HashHigh: 0xfb87e9a91563cfbbUL, HashLow: 0x4156aac971d6b931UL, Seed: 0x0000000000000a63L, Ascii: "b7zmpPTGOXWgpxCGNrLdGrjgpUkp"); yield return (HashHigh: 0xfab2cb544fd820a2UL, HashLow: 0xc18dea55ed24bd6bUL, Seed: 0x0000000000000f88L, Ascii: "7ER0gY3jYRTc7UuQX0jy4ILm0QxP"); yield return (HashHigh: 0x2d1e39d5eaab2af0UL, HashLow: 0x2a70f2eeac683d0bUL, Seed: 0x000000000000064dL, Ascii: "srmanGgb2muidgoV99SSZDXii7Gf2"); yield return (HashHigh: 0xf2406cceeaf789b1UL, HashLow: 0x7f357e0d4b0dbd94UL, Seed: 0x0000000000000000L, Ascii: "SkZnT9dHnEaafaU0YQIBnB735xYcl"); yield return (HashHigh: 0xcab951ee4bbebc43UL, HashLow: 0x06925aaa2a673fb8UL, Seed: 0x000000000000162aL, Ascii: "dl5ZP6cffXfE3l0PAWd51TBvSsG9S"); yield return (HashHigh: 0x610ba5617e546152UL, HashLow: 0xacea3ce6524e43d4UL, Seed: 0x0000000000000f18L, Ascii: "CSQBwJqxtVJeMOv5mqzH6g7ZGnPyh"); yield return (HashHigh: 0x7f0e0f3aa7cf82f2UL, HashLow: 0xc493df64be1cb131UL, Seed: 0x000000000000222cL, Ascii: "tTGa8TJUETEztj5zsfDWU2BwGmB6Ky"); yield return (HashHigh: 0xdc64bf2a49682c98UL, HashLow: 0x0a5862b8f34eb2f0UL, Seed: 0x00000000000000d1L, Ascii: "ZakSEMaZxYJnhoj40dgW0Od1dBrpBd"); yield return (HashHigh: 0xef37b48c0dcf30faUL, HashLow: 0xf86a3d7c9c12f0e9UL, Seed: 0x0000000000000000L, Ascii: "b7k1mN7utrKrm0UCDOArIhg6D1xEg9"); yield return (HashHigh: 0x1e1346e62386e738UL, HashLow: 0x526793e7355d4fbeUL, Seed: 0x2ed1256a014f6d46L, Ascii: "ECJ4VLtsuggTR4wcLJjTm8x6DXFhTB"); yield return (HashHigh: 0x9a79d2b1024b18e7UL, HashLow: 0x355787a651015181UL, Seed: 0x00000000000026e6L, Ascii: "DiRtMWxnI3qkMdYanz82e6bfpp8VUTw"); yield return (HashHigh: 0xe45a5e4de60a1d29UL, HashLow: 0x8016c4e1f68959adUL, Seed: 0x113a1735f166548bL, Ascii: "4gIXXrYOrAJpQZtb2lYLqsqzrRBdRh3"); yield return (HashHigh: 0xac76c0f645ac910fUL, HashLow: 0x7fe76cc004fd8c41UL, Seed: 0x0000000000001d1cL, Ascii: "RuxoiJfBipXTwGRnMLXS9UiaQDLYy35"); yield return (HashHigh: 0x7e733bd5cc4a0fa5UL, HashLow: 0xd62a4d833bf0fd9cUL, Seed: 0x0000000000000000L, Ascii: "Z0KHCqxcHGVVuwQUDbQMSqYJcBl9y6U"); yield return (HashHigh: 0x0cb534f1fbd7ccbcUL, HashLow: 0x2fcd13cb42c47ad4UL, Seed: 0x0000000000000000L, Ascii: "Tc8otaCWJhcl5Nz5CDz7vFJX6zsYPl4I"); yield return (HashHigh: 0x121b8e2a654c5f04UL, HashLow: 0xe2ee0fbe65be642dUL, Seed: 0x0000000000001162L, Ascii: "H3tw59bhz1T1nnR3phpWiSkdwEpOuz5s"); yield return (HashHigh: 0x1912c33cd6bfe613UL, HashLow: 0x7af33ab3183bfbbcUL, Seed: 0x0000000000000000L, Ascii: "xB0c6wK9bmxwnzf2jvZNxOYJNM2fGL0r"); yield return (HashHigh: 0xf5266cebff992781UL, HashLow: 0xecfb92c488654a79UL, Seed: 0x0000000000000b0eL, Ascii: "lDzIPQrmi2UvgSSWTe0sMEXWNQX1t3ZC"); yield return (HashHigh: 0xd961769319c53b55UL, HashLow: 0x4d9b9dde38966881UL, Seed: 0x23eaccb8f24a289dL, Ascii: "6Dj7XpVnlDS3iskE2RiCX7f46L3pxayir"); yield return (HashHigh: 0x877a8a6f474d64f6UL, HashLow: 0x7c91a261d7a43c89UL, Seed: 0x00000000000014a7L, Ascii: "k2TsCmhgBSoOIYeZduUoVjR377OQE1JfY"); yield return (HashHigh: 0xbfe1f40d123aa39eUL, HashLow: 0x44d8d3ff9d79a493UL, Seed: 0x00000000000024acL, Ascii: "aOR7hd3xbGoB0FQGYZ2ufM2ueyyDV0L93"); yield return (HashHigh: 0x9a40d0438baa71a7UL, HashLow: 0x515cec6af4476090UL, Seed: 0x0000000000000978L, Ascii: "L9E196PbLYnr7TKQb44d2jPAjLDuE2xMq"); yield return (HashHigh: 0xb8bbce0684d1cc58UL, HashLow: 0xb291b3d9ef093c2aUL, Seed: 0x00000000000015d7L, Ascii: "X1a9zapq9YvpqtP0LQwkXCacvz8TTJrR5m"); yield return (HashHigh: 0x33d0ba6547a5482eUL, HashLow: 0x221f75763d2d15beUL, Seed: 0x2ba124b4f3ead0deL, Ascii: "o5t9IPouVvQ7Anqa8b96M0JKZEQer4Io87"); yield return (HashHigh: 0xaa517a80cac5f907UL, HashLow: 0x6b3b06d70695bc82UL, Seed: 0x0000000000000000L, Ascii: "vRTbTeQP2nIh2u5LeK5w4s2Pa1kjw73Vwk"); yield return (HashHigh: 0x7e3ed77059aaf4c0UL, HashLow: 0x8a98b186c5058cfbUL, Seed: 0x0000000000000000L, Ascii: "30vfO7V1QAAifNBsjia1qbCIP80KqjvqGf"); yield return (HashHigh: 0xd61757ac3d54dd3eUL, HashLow: 0x997e8d274c520f5cUL, Seed: 0x3ffe7d86a697da93L, Ascii: "FAIUOWamAotqfoHv4Ie6Iib8Z59ZSO3nmkd"); yield return (HashHigh: 0x8cc320d76d51ebd1UL, HashLow: 0x34fecb5247399ab5UL, Seed: 0x00000000000014c6L, Ascii: "XS8b1YF7ljMz6H6XcUtNA5VTQ2noYWTSHDj"); yield return (HashHigh: 0x518094b708e83606UL, HashLow: 0x5cb7f6052b0fa4caUL, Seed: 0x0000000000000000L, Ascii: "yFgI3MX0SsxIReDPO67ELAEPam8KZB38hK3"); yield return (HashHigh: 0xf5b7ad6fa7886447UL, HashLow: 0x314678c9b02c29cdUL, Seed: 0x00000000000014b4L, Ascii: "Zj6tDKmocGIFyyCmDJf2u91Sabx3pLiQ5Bi"); yield return (HashHigh: 0x3ac5eab6557b9523UL, HashLow: 0xe72fd486db472f6aUL, Seed: 0x10ec20959d09dd55L, Ascii: "xOwM20yHXHCf6d6a3KbbQfLGeSLZASkWILAs"); yield return (HashHigh: 0xecb2bbe9417426baUL, HashLow: 0x642b47da0f3cf681UL, Seed: 0x0000000000000a20L, Ascii: "TZAxr2MOi7t5U4bY7ViTVRFHW2k6GLa03a0X"); yield return (HashHigh: 0xe4a443da1d1ed626UL, HashLow: 0xd8d2a812c460f7d4UL, Seed: 0x00000000000019b7L, Ascii: "04bBCjlbOURXBpQWFXiyqnpijPdMBjSQLY9Y"); yield return (HashHigh: 0xd91c67238ac19941UL, HashLow: 0xe7dd77cf692df7e8UL, Seed: 0x0000000000000418L, Ascii: "4OQFyXv26youfQn4z9uBe4dEcqxXuvmA5FZh"); yield return (HashHigh: 0xa01cd6822701e7a8UL, HashLow: 0x72e52e54d2211b39UL, Seed: 0x6aaaeac1e226ce06L, Ascii: "eFdnTZwHdKvPkPQ8Bo5bivEk6mHC4tNjoZ7l3"); yield return (HashHigh: 0x9b66a9bbc70f3a37UL, HashLow: 0x52a8bd02e075939eUL, Seed: 0x0000000000000bfbL, Ascii: "WOnlojc8sZner4PjtLzhHkh3Y4OGqromTrsWx"); yield return (HashHigh: 0xec6a24e06f704a5cUL, HashLow: 0xa96d7eb152da7d98UL, Seed: 0x0000000000000000L, Ascii: "7W1tr4qALkdKhiOwtFHbNxWh949TA6fRPNAED"); yield return (HashHigh: 0x3f775a02f5d2c4afUL, HashLow: 0x375d3111d2c3eb00UL, Seed: 0x0000000000000000L, Ascii: "GjIC9TfpZS187U5qnS0m5BjlFYIlCb65drVYx"); yield return (HashHigh: 0x4dc1db88e720147eUL, HashLow: 0x0b6992192eb825daUL, Seed: 0x0000000000002096L, Ascii: "rq1m7dsJynO2hnuN29L032MvweATJteQzb5s9m"); yield return (HashHigh: 0xdeca67855f921396UL, HashLow: 0x969eec52b1ef1e1bUL, Seed: 0x0000000000002531L, Ascii: "pcop6coqVECPZ6Ywdfw0tf97F2gIUIQSIlYsGR"); yield return (HashHigh: 0xa3d581605880a96fUL, HashLow: 0x77638040f533d88aUL, Seed: 0x0000000000002612L, Ascii: "V0tLcpF0mLBRLatMz67ME7g2R0uZVsFUG7HWC0"); yield return (HashHigh: 0xec4cb38fc38cd0b5UL, HashLow: 0x8828cd3a01cb1986UL, Seed: 0x0000000000000e20L, Ascii: "FgTTUKngL13WKXstwuSKGAsEmrKxmRm29WD86d"); yield return (HashHigh: 0xe16bebcc35d56cdeUL, HashLow: 0xd5b3e889a6197c0cUL, Seed: 0x00000000000014f9L, Ascii: "VSnKYX4NmxyAAoVJAS5YzzqqwtJp5DjL9ogkvaY"); yield return (HashHigh: 0x61d4418aa94d7a3fUL, HashLow: 0x951328529534fdd3UL, Seed: 0x0000000000000a69L, Ascii: "dXgaJgKCJ849AED2FyHLi2Hjd4wU7n02iEk3Haf"); yield return (HashHigh: 0x2c71395ddc05d36eUL, HashLow: 0xff652db2ab78cfe3UL, Seed: 0x0000000000000b25L, Ascii: "yTQVdgm7uIuiAaz1qknDpajdBTNMXMCbNZR4MFX"); yield return (HashHigh: 0x6f0e1fc7c616fad1UL, HashLow: 0x606418b9cd175bb3UL, Seed: 0x0000000000000000L, Ascii: "CTiZlNvCQ3UGNvemq0dPvPKqyhMn316cDcPJSqG"); yield return (HashHigh: 0x32ddd82fba526c4dUL, HashLow: 0xcc1e40490a434cccUL, Seed: 0x7b510ad4c9cd1f2bL, Ascii: "vQMOlSQtz9Zs9EX3iUUVdabSsD1GVaXEf99LFt08"); yield return (HashHigh: 0x539fa3326625fcebUL, HashLow: 0x94e2742d73332d39UL, Seed: 0x3c2edddf6ae3473aL, Ascii: "VfPMDOuJiYd7K35LzrckzjaCaEhY1YqtrdModUEb"); yield return (HashHigh: 0xcccb08d970a1eaedUL, HashLow: 0x0112e76dadf8b80dUL, Seed: 0x0000000000000625L, Ascii: "bdtPfyPoSB65mUWrLWvDQ9YcPmf3aYDbTAP3qTiv"); yield return (HashHigh: 0x9f5ee7a4c7ab1531UL, HashLow: 0x27727101bbbc48e1UL, Seed: 0x000000000000248eL, Ascii: "a5zgDNpHWC0CvOccqiABGDcnyZwwRxbD2bpj90vl"); yield return (HashHigh: 0x742268a669b483afUL, HashLow: 0x8d56d65f71e6822eUL, Seed: 0x000000000000183bL, Ascii: "sACG5HtreqQdQ4H9yXLk81UfD2Av3aSTcZdqClt6R"); yield return (HashHigh: 0x6bd1293a3e5eb00eUL, HashLow: 0x961e59da7c442504UL, Seed: 0x00000000000002c3L, Ascii: "nFIS8engjL85yGKk6CHIBoi2XVSGnO0SazJEcomqb"); yield return (HashHigh: 0x4ce190a899713fceUL, HashLow: 0x91294c3c430f9284UL, Seed: 0x0000000000000000L, Ascii: "gJrLLQoUXbZrVIrC8hVi3JCvxDNnxmXJ8B0WpcbHc"); yield return (HashHigh: 0x97b85c55fce463acUL, HashLow: 0x130678f34a5e4cd5UL, Seed: 0x00000000000005c1L, Ascii: "57C715ySXk7ymep2B4o0MNRiGEsK6esgnTQhv5q4P"); yield return (HashHigh: 0xab46eded3b4537e5UL, HashLow: 0xcd635684ee04782cUL, Seed: 0x0000000000000000L, Ascii: "7zCrwP8ISCDHpoTWQLygqG6deBqXmQggsreOQWxxXw"); yield return (HashHigh: 0xf8e7e1c42bf85e61UL, HashLow: 0xf70a249888b1690dUL, Seed: 0x000000000000212bL, Ascii: "KKQzNTI5jMtHVROqR85d8I4rpldY23KcCqVYMJvFIl"); yield return (HashHigh: 0x46ed3e841fd03223UL, HashLow: 0xa5dc4f9d55e1fa6aUL, Seed: 0x0000000000002281L, Ascii: "9QvlFSi8AOwfwzdY2DVPEtKkysr2E5ec98EZ7laNm8"); yield return (HashHigh: 0x336250baebfdc728UL, HashLow: 0xfb636f937fb6165aUL, Seed: 0x0000000000000dd8L, Ascii: "tdZwMxNh2wMQDQCjrJAcUvbwnfoGGmDKgRxGu0Eanv"); yield return (HashHigh: 0x6e9a9da5144647b3UL, HashLow: 0xcf5ae98818f89351UL, Seed: 0x0000000000001e5dL, Ascii: "8eQws6NnMzpSfvW69EJnkg1gYSLKiuJrT5UVsQnrsmR"); yield return (HashHigh: 0xa879e41e507eaaeeUL, HashLow: 0x0916830d8d5aacf8UL, Seed: 0x3269ffabf9fe4912L, Ascii: "Edxrm8YOHQ69GcaJFDBDMS4t1tL1huF1C4l0YlTMa5j"); yield return (HashHigh: 0x6749fa3894bf85f1UL, HashLow: 0xed2a15d9e952672aUL, Seed: 0x00000000000001b2L, Ascii: "iIb3TJacRk5lTmjUVwb50hrGdnI9GbrJIZLDbzdxiEz"); yield return (HashHigh: 0x8cd9ed14e69319afUL, HashLow: 0x8e2fe5ac67d80e5fUL, Seed: 0x45bc9445ec98a116L, Ascii: "QNGZnwuSJxE9w5GbecA65ajidWuNQWH9i7DD14PZQmq"); yield return (HashHigh: 0x869d93e8126ade07UL, HashLow: 0xcf536b58b896f4d5UL, Seed: 0x0000000000000000L, Ascii: "TmQKZZKn5GUyOJDneWKHBkNtFHc0PfDRsUWTsdfvpnmB"); yield return (HashHigh: 0x51dba0f6c5dac14aUL, HashLow: 0x6bc35abf1badf620UL, Seed: 0x2c6d4115a33ec2b1L, Ascii: "2esyriPaAO5FmQd0K8PqkjuQLUfw0rYxn2tpfkoRW5PO"); yield return (HashHigh: 0x132e11c7e9161451UL, HashLow: 0x80e869d310ec28faUL, Seed: 0x0000000000001d98L, Ascii: "LMEKV14ZqsFpOq0izrKQphMbQ9JEmLuzLEMuJGKhUlUd"); yield return (HashHigh: 0x730d360f1adfc5a4UL, HashLow: 0x3b247667b9d4e4bfUL, Seed: 0x000000000000147bL, Ascii: "uTrlb8pId8MuDzBBHgrSYiBWto8oIRcq25j6mHHOPnk5"); yield return (HashHigh: 0x933f4977597b4b77UL, HashLow: 0x0f79283b8c41f610UL, Seed: 0x7c45ea4a6dba9f4bL, Ascii: "Zld7gfG0QSNQTJXR0ejdBjJX6CcBrMUH09fe0CdkdWt9W"); yield return (HashHigh: 0x1e62f68e9302a350UL, HashLow: 0x679d411a4ec9171fUL, Seed: 0x0000000000000000L, Ascii: "6S17ZBT7gAnKSmTHLQZhVYvz9x7qJQSFXwg2TAgLN8o5Y"); yield return (HashHigh: 0x64716f84aa728f87UL, HashLow: 0x42f463bc942fc31dUL, Seed: 0x0000000000000531L, Ascii: "zgOcPuSSNhWP4mtIsengVnbgCwP81Jn2Ywt0DvlYZGdAY"); yield return (HashHigh: 0x4a889bad6e46fbcaUL, HashLow: 0x0c301c9dd6e98d6aUL, Seed: 0x00000000000025f6L, Ascii: "Kf46oy6paO5m0BITkQBNDFj4IZB69QwyLLX9KQWj2naSZ"); yield return (HashHigh: 0xac909d0552c7c2bfUL, HashLow: 0xbb9aea0aa0c8ab8cUL, Seed: 0x0000000000000000L, Ascii: "7yUQsmy2PUSXBj7wZ6gMyYhMYyeaOX7TZA1dKfYTWZ3lkX"); yield return (HashHigh: 0x3ef0a97bb650c186UL, HashLow: 0x16c50f7ef0f0ddfeUL, Seed: 0x1b789758fc51f4ffL, Ascii: "wsXMtF0seyh9Wq3TnVSOLCfrBOZGCr0YJZd3sBxJQgCyyD"); yield return (HashHigh: 0x0f5bffb27e7bc948UL, HashLow: 0x97341e438244f44cUL, Seed: 0x0000000000000c0aL, Ascii: "0ruKjbSl8wBTihQRn41GAXbvYwGUo4OWGFLa2TwDJjCCg9"); yield return (HashHigh: 0xe591b1b5214f0fe3UL, HashLow: 0xd6c610ccbde124e1UL, Seed: 0x00000000000018a9L, Ascii: "4a32HpJhxXIvX8hUclomupa3QNdcc1pxnVowIs7zEiXj0p"); yield return (HashHigh: 0xd20d8eeafc240491UL, HashLow: 0xfb966c85baa85b97UL, Seed: 0x0000000000001178L, Ascii: "JNBl17xyqUmKZljoCxnoKP1D5voTAdLpHJtF6jZVLz68xLv"); yield return (HashHigh: 0x92c1f187c2f0d135UL, HashLow: 0x9371d6345bea4a60UL, Seed: 0x0000000000000a7bL, Ascii: "xOTg2nw9GbYX5pPg0SzxC8q6IEybp1GZmMPyLzbtL7UYZcK"); yield return (HashHigh: 0x633f4e0bf5f9dfabUL, HashLow: 0x0fefea424807590cUL, Seed: 0x0000000000001894L, Ascii: "EZRi4XK7jJTrgPKRA5SHoz0Q4sif7cQIHKFokZY8SSVEyrh"); yield return (HashHigh: 0x78b2d5348c951852UL, HashLow: 0x96fea78817684324UL, Seed: 0x0000000000001c4cL, Ascii: "7OrNWNJR2u89m4WipmIbRlyNBOh01gpw7nerBk8R9L3tCrH"); yield return (HashHigh: 0x269fd5ad49f480feUL, HashLow: 0x026805e30325e5d0UL, Seed: 0x0000000000000000L, Ascii: "Ij6Ag30H4NcF6qeJEz3Wsz5l6Dq8l4mhhKBirBq3vIaqRRQV"); yield return (HashHigh: 0xda0dcd307f2bafe2UL, HashLow: 0xcb066fd7c972d632UL, Seed: 0x0000000000000000L, Ascii: "IDOWgPqCXnvFdmWDzqacG7q4o1A27CIXzbexey5B4UgPJJBB"); yield return (HashHigh: 0x94677b46ddb4de7eUL, HashLow: 0x2c2f96e9c834e10cUL, Seed: 0x00000000000003d4L, Ascii: "2099xOkn9wkKjKY5CDlkDdHwi8D4TQJl5gS4d1hcvyR2RQtf"); yield return (HashHigh: 0x7329d242fad612b0UL, HashLow: 0x5684c46fffa544fbUL, Seed: 0x0e6a5f795944f2abL, Ascii: "oeDsxodqj2WWr7Muiq077o5VrVaP5K2adfs2u5CzVgGHi3zI"); yield return (HashHigh: 0xbd7f9a46b45b8014UL, HashLow: 0x165693a465fe120fUL, Seed: 0x79ac05cd3e7e0747L, Ascii: "CLWOfGOevFJeoegPEWvCPNhABOE0RwTyFxm3CQaFuhUFZE8Fb"); yield return (HashHigh: 0x9040744287a729a4UL, HashLow: 0x9eb02e5a4caac5f4UL, Seed: 0x0000000000000000L, Ascii: "LGcQ0YebgP5cfln0Fd758gcv71YusgWgLF5pPPRQFKjnlrmR5"); yield return (HashHigh: 0xe5eb72827700928aUL, HashLow: 0x4c52d406a5286aa0UL, Seed: 0x0000000000001c8fL, Ascii: "lzi6j73dq8g9jSQWe8JiNsQBZvg28u4eefXWB0aZAnd1sAQEX"); yield return (HashHigh: 0x988c6534f53d6ae0UL, HashLow: 0x59b7e58468a47a5bUL, Seed: 0x0000000000001e43L, Ascii: "C2g2lYC0KNSl5ogPIeHDMPPIdTfAMX83NFOLTvzNCMOcjybVU"); yield return (HashHigh: 0x806dd46b9dd40e7bUL, HashLow: 0x9bb428a5c8eef65bUL, Seed: 0x000000000000202dL, Ascii: "LfZcvbaYnMc7ilNCiIfqBMIUDq6nPZdbZADb7uLmeG4fZMgHcf"); yield return (HashHigh: 0x287382e233db2218UL, HashLow: 0xebb4f3d64427bf4aUL, Seed: 0x0000000000000f7aL, Ascii: "Ye9VF3LmVIom3at1cJeyEfEJ0FZNMMvkATqvW02AWyGSswPLDh"); yield return (HashHigh: 0xa80dacc39c04fd69UL, HashLow: 0x3368ca9b9c393388UL, Seed: 0x0000000000001a4aL, Ascii: "ZqWK3ZqTGNSC62HuKNbQnhU4iPL1AIaBsRKH46Hk2dekaEZbK9"); yield return (HashHigh: 0x3baff25a5910c038UL, HashLow: 0xcafc58419a2e2e53UL, Seed: 0x0000000000000000L, Ascii: "IzxO16cucXkJxNAdGLv1vlEbpbvLh59hxMIDOKyiRHT29qo3Jx"); yield return (HashHigh: 0x17381414137cf40aUL, HashLow: 0xa94116c1bae74ddbUL, Seed: 0x0000000000000000L, Ascii: "Ls6VWKVpKBWkLqLn2Dcz7M9X3SyAd3pIgl7l1rk1sFe0OBxz8ig"); yield return (HashHigh: 0xdc3de5453fc9334dUL, HashLow: 0xf3d5b88891bc5683UL, Seed: 0x000000000000150eL, Ascii: "a9HXkqKa63WKbhvtg0ZBs9I8sF98C7VLpajeWEZ7qfcAKn9x2u4"); yield return (HashHigh: 0xec3f47984bc5b8a6UL, HashLow: 0xf251ebe79aedf8b6UL, Seed: 0x19364680b7cfae64L, Ascii: "QxZmg62MBpJkk3hzweVPW7WuBg5O3lg5gogVKg7EvgcX5gFZg0j"); yield return (HashHigh: 0x2049999f3cce6282UL, HashLow: 0xfcdff39c5893a7faUL, Seed: 0x0000000000000000L, Ascii: "ro9oxAxTDXRNROpQfAwZ6NEptKRF1SOkiHTeUuygMCgydNyONd8"); yield return (HashHigh: 0xea57ddf5667ff2d8UL, HashLow: 0xb2717aebec50b432UL, Seed: 0x0000000000000000L, Ascii: "VgBPITWUgUJHF7eKLDrfatEay6LggqLL9PmXfmwYlBvfqU45s2QC"); yield return (HashHigh: 0xda3b4982116662bfUL, HashLow: 0xe8ea13131ee22388UL, Seed: 0x0000000000000146L, Ascii: "AcnQHNqJ9CbnxgYAeqhpNvxTSviImLq98dZtTjXg3Ull81cKBASt"); yield return (HashHigh: 0xbda70a81e8a95fbeUL, HashLow: 0x7719d2e47c378934UL, Seed: 0x0000000000001941L, Ascii: "v1pEcieRUyQnEkrkxfCEgdhMuZ5ZJTCX9pygddRcQ98Flh00YOt9"); yield return (HashHigh: 0x9e44aa970765e1deUL, HashLow: 0xefa181e9e00575c9UL, Seed: 0x000000000000098cL, Ascii: "kW8S6p5FaD0SWxtfn6rNgk6j0wVvJEt6jDz0pojRELPyrynVUyew"); yield return (HashHigh: 0x9ada43e6dbede79cUL, HashLow: 0x9801b4daf9442a01UL, Seed: 0x0000000000000000L, Ascii: "gGTtJkt3jWNXV77yMOLHgWh2wpgK8qFcMs5MX1SdN35RNt8XzC8it"); yield return (HashHigh: 0xed036d96a56ae643UL, HashLow: 0xe28ce840bbd646c0UL, Seed: 0x41d3b15754067041L, Ascii: "DiNDfLboOnvczVWhwRR7UPDsljgYz3mJazI037LfMMPVx4NUoArV5"); yield return (HashHigh: 0x26929f2dd87b324dUL, HashLow: 0x9fda9b678b73b9cbUL, Seed: 0x0000000000000985L, Ascii: "vTQ7jBRVAlRRUjQVADVtixvS5QlaqFhs6Gq7aDjmVZIpge5abpjZq"); yield return (HashHigh: 0x06b4cd6c5e3fc467UL, HashLow: 0x56be575ee6fa1d85UL, Seed: 0x000000000000258bL, Ascii: "JIgjs2RG2EA6NN56sZCE7hKybrSGCf9BgatWqRbp4XQVbtbIMKhhO"); yield return (HashHigh: 0x27285dc018de9219UL, HashLow: 0x7cd194b0615ad828UL, Seed: 0x000000000000081bL, Ascii: "ml82dtCvI9dWohM3KqakVqbrDVihy4ihUZwrf0RU8CC0qGJk2hi3Xe"); yield return (HashHigh: 0x726589d84cd8842eUL, HashLow: 0x73bd723d06f4be4dUL, Seed: 0x74b9e97496068171L, Ascii: "9Q3Bp5kfmgzShiQhH7knhi65LLdxoEy2WmOR1eI7rvsnABhbF8DbP4"); yield return (HashHigh: 0x85ee3327d20389e2UL, HashLow: 0x113170bbda455d40UL, Seed: 0x00000000000013d5L, Ascii: "0VYRaLR75oh74pxV3IlOWn2I3la5pjPqvFo1XqpSo3fiaQ66J5gXej"); yield return (HashHigh: 0xa733454846dae2b2UL, HashLow: 0x23b201ad49f2f557UL, Seed: 0x0000000000002278L, Ascii: "WEaHPT5CFIgnYDGEAbVomBtvu1LhyejKcwpzKXrPJRDWRHQ8UQrLR3"); yield return (HashHigh: 0x24d6877b1b867cacUL, HashLow: 0x127970fe898e86e6UL, Seed: 0x00000000000013b5L, Ascii: "nGS6WGHxSo8vPLfVgA4dgokSCV6ojBbUu35fpVQuGVjkHGvYd6PlZ3w"); yield return (HashHigh: 0xfc997aa8ed327795UL, HashLow: 0xacfad4f08b1b8036UL, Seed: 0x0000000000000a8aL, Ascii: "LpeQUOYVWJZ4CFpEGC9An1gSaE9j7FMjG5nhX8duWZD2hKaGrSXIg1D"); yield return (HashHigh: 0x7029e9558049f8b2UL, HashLow: 0x82c69a5efc7dbc17UL, Seed: 0x0000000000000576L, Ascii: "AMFxrECxyQHyBnIGcz1m6cqwJ9nNuF5WrJgMNF548ajy4o0OVJAJzph"); yield return (HashHigh: 0xc2d6647eb7d4f584UL, HashLow: 0xa5329c92ca78503cUL, Seed: 0x0000000000001641L, Ascii: "Z7dYLz1eVa1zrPrAL19mFtmz4EfWNxIu4omhJO0Gfg23KXYpU3IpVfw"); yield return (HashHigh: 0x4fa2e792fc67b61fUL, HashLow: 0x475d6b792978de1eUL, Seed: 0x00000000000022c4L, Ascii: "SSwQgScmLMY2diX01UVpg2v2bnAgs6ZpsWv5PbDM4IwHslW8mWgUORIW"); yield return (HashHigh: 0x8e2fb6a3958fd86fUL, HashLow: 0x66dfe2895b914d3dUL, Seed: 0x00000000000010c3L, Ascii: "2tlEXjmV8Uiuf0c0wnSb9QvQobIYsg4BhbHOYnsj7Ry7WizG4lODAa8d"); yield return (HashHigh: 0x0b9b77280fcbece7UL, HashLow: 0x5f18823657b4b79cUL, Seed: 0x0000000000000edbL, Ascii: "YQyUWpSRyow0JDpO9iE2niSNsrV4i4n9T2phg5AyGNoCufSHwIcjXPX1"); yield return (HashHigh: 0x649682da2374eecdUL, HashLow: 0x6d84ada66f79bc4aUL, Seed: 0x000000000000217fL, Ascii: "qChqIWMKTD93cd25eOcPmsXDPJN5doh1sweE2IOUeMHVtEzV2X6xAM8I"); yield return (HashHigh: 0x08382b76418565c7UL, HashLow: 0xab54d56cb850d9d8UL, Seed: 0x0000000000000000L, Ascii: "48o2hjGrFlqK9fWKtPaGO0yeS7EinKtpCrW1pJTNZP8FdyNWRtRq7hLsy"); yield return (HashHigh: 0x79111349f9281f76UL, HashLow: 0x3a75797b49ee8569UL, Seed: 0x00000000000001daL, Ascii: "UxbCoJqztrbLN4tXQMN1Ub13Pb1LtlRHZxFpJqjxIyNeL9k2zbj2XtiMe"); yield return (HashHigh: 0xecabee748a68ffc1UL, HashLow: 0x59f5725026099ebfUL, Seed: 0x5e11ec7ccdae524bL, Ascii: "zFuPfgSUIJrUVkfOItIrV9AkQrEc9lWOJREQIhSoCrilCPOlCoBbxXPr4"); yield return (HashHigh: 0xf5446c5fae78142aUL, HashLow: 0x02e36e8338721944UL, Seed: 0x5519a7394afe885bL, Ascii: "hMVfSoFYmNPvgczhngnL2nmAdLM77JnCd5OzB4ZZxLd2GKCGyDgMCGld2"); yield return (HashHigh: 0x823567a88fcd8dbdUL, HashLow: 0x5c1b8f98b2621cddUL, Seed: 0x2f50b68dd1216820L, Ascii: "bDcIN878DQrQwGWieIjIRzucEWCxdqkmNsUetKNBo3Fc2dGHvLptSMbL0A"); yield return (HashHigh: 0x35b745ed78267835UL, HashLow: 0xcc343a3d6e2ba718UL, Seed: 0x3022ec39e9bbb80fL, Ascii: "5kGjt6moDX5CGU8My6gK8e0ia212HfJlIv6tmzLu57b6LlgbsQamVrqeWK"); yield return (HashHigh: 0xce44bb2f7aa4f71eUL, HashLow: 0x64b301f9e8758900UL, Seed: 0x000000000000180eL, Ascii: "C4gSolKgHsQLi8oQ7625q0cVMNSgrhkYKJkyvKAjydg6CkKEFzxCqxjbNA"); yield return (HashHigh: 0xcd093e3296c0d0fdUL, HashLow: 0x0574c56f1dff7aefUL, Seed: 0x0000000000001918L, Ascii: "GS0YDzYitXptN53db5eprQxfCof7LvTmC8PnvMb1h1NPxjpQUUcDkR3wMr"); yield return (HashHigh: 0x4084b18c7c0837f3UL, HashLow: 0x7725a01c1c0e45adUL, Seed: 0x000000000000259aL, Ascii: "QHoMl8c7TxBkBCVhSwpMW0XlQUnetmkwEjEW1sbBMygvmWPnmkdrYp7Dx6P"); yield return (HashHigh: 0xbde00740480028a4UL, HashLow: 0x020771ef2a9b702aUL, Seed: 0x0000000000000000L, Ascii: "qpWiY8KnV7C9gd0XrPZKIJQxgsGrMeFawP6jOy6EsCr2WhnBNc33wMHjkQw"); yield return (HashHigh: 0x4156b45aa62a7133UL, HashLow: 0x3f01825dac720066UL, Seed: 0x00000000000011b7L, Ascii: "dgqIgOoGQ70Vn5DHxW5ljVjhHW5XszxVMEjlfnKUgEJkJlql3UPxX4zArkA"); yield return (HashHigh: 0x0d313481af88003cUL, HashLow: 0x7e28baa49714ec8dUL, Seed: 0x0000000000000000L, Ascii: "d3zh7ciWb42tmd8GVOFIQFlvRaJFd04AWJQgLZ8uEXYlYdxwuhyYMMDBFqZ"); yield return (HashHigh: 0xe86bde316c1f97b1UL, HashLow: 0x443e6886b63a9fc8UL, Seed: 0x0000000000000000L, Ascii: "iFcgmFMBZmi4M91evoCByqY6lZDHtG08qMLgQqOMrMjjzlzPerTY5XiE0p3C"); yield return (HashHigh: 0x9b5d41d2752d8d44UL, HashLow: 0xc16cc36b39155d47UL, Seed: 0x00000000000014b5L, Ascii: "CUnB8aP78JwmdOzqsHCOMkVXWbcrcNrGGmRaedmFnONXsBk2auUae3vxjQlB"); yield return (HashHigh: 0x89507679f46f5d05UL, HashLow: 0x836a8893fa8d6624UL, Seed: 0x00000000000003b3L, Ascii: "CgjMVFpO2wAny4P0SId20EJDrHUKPKwhXkYLf8TMSvetL75Hbd8UeSkjiRoR"); yield return (HashHigh: 0x17c82c0e67d429c4UL, HashLow: 0x80ce344684af0e34UL, Seed: 0x38f31597a69f595dL, Ascii: "NLU14nP7C72v3yTjzULrMTgNWyxwNnGc9UC9fXLOxzmjcAi67X6nzAZXxK9m"); yield return (HashHigh: 0x7962006fa372ee11UL, HashLow: 0xb46b2e1d8775e0acUL, Seed: 0x14ae24b2073113f2L, Ascii: "Vy6ZyYEuXWrz7Quv1BR2MRUCeCXiXnh3ZGuNncajoO9OInkaXHfWYGEtcxtbG"); yield return (HashHigh: 0x5618c2cdaafd2c95UL, HashLow: 0xb787439e2a246d8dUL, Seed: 0x0454617a8f747ce4L, Ascii: "G2A72g8ejMhySFBmSH0CuvAEEjXbaFKmyicWp43YVgygrbq3FpUS024Io30zR"); yield return (HashHigh: 0x516baf43bd10624bUL, HashLow: 0x2a00c2900ff5297eUL, Seed: 0x000000000000140bL, Ascii: "ETo4HYuNApzBgyaagRiEwNlXGninxHyLcsW7vu8p4HqLsHmUoZ2wxIzrXo9HN"); yield return (HashHigh: 0x8cf6c862bf45b9cdUL, HashLow: 0x9da377f58d050b2eUL, Seed: 0x0000000000002233L, Ascii: "mswFyfJ4YTrRr5DnUhl1f9o8YjRsRhYL2nEqoGQz8iDamdkU8dRj4GNrM1QqZ"); yield return (HashHigh: 0x4fd59ec51c8dd737UL, HashLow: 0x1f70ecab403dcae1UL, Seed: 0x00000000000023f7L, Ascii: "rR2Cc5Tan4C1RpIXm4Vqbk0hQ44bcJT8FaPC68YYoVZqD8AYm4FNLFmWXK4w9u"); yield return (HashHigh: 0xbf1fea5ffa0f20b2UL, HashLow: 0x29f4e52d9b1ab07aUL, Seed: 0x0000000000002484L, Ascii: "cDr9lGyW06vlulQKmPYUrm1q0XvRKBkz5LHvVfejtWjGovbtV3Ssttyop2SFRJ"); yield return (HashHigh: 0x24f687059c3653adUL, HashLow: 0x9d0e1708dace29aaUL, Seed: 0x0000000000000000L, Ascii: "aTSzxIuznzTgF8UMqJc70DDDKWguVRuXJOtdAiCBnlg38XcmrD23HEZm3yviH2"); yield return (HashHigh: 0x81b0d787f89770c9UL, HashLow: 0x3e6264041a341edbUL, Seed: 0x49a9d98fa20a1fccL, Ascii: "Af9PJlbMfGS19PiYKRS7MYyDlXB1xBdihQtv3PPPUQsDghsLrKnTIhPUuakcE8"); yield return (HashHigh: 0x9451584c5739cbb5UL, HashLow: 0xfa0fb8244b0fa8ddUL, Seed: 0x0000000000000becL, Ascii: "dChRHLmoLX3g2ZOqvhHheCcz4Pc7Qipaz9hRhIVPogE48DjMDDs5aNDdwYrf9la"); yield return (HashHigh: 0xac49326ddbfc83e1UL, HashLow: 0x9b215d645d69bbafUL, Seed: 0x0000000000001cfbL, Ascii: "E2KhIsi9hBmz20c9ljrFZrHI0FzzXbhvDJCjYOovgj9bcncjPrLCMhOzOOHUV7j"); yield return (HashHigh: 0x34b01ba4e7eef64aUL, HashLow: 0x891b9bd73dab9a6cUL, Seed: 0x000000000000048bL, Ascii: "IsI2YiVzaCDbfL33z1lO72OhvvfcCyFrLuDBZTgI64V7GFEinbuAMDA30ZFauvS"); yield return (HashHigh: 0xbd742cb486e440d4UL, HashLow: 0x299f0ab4fa69a6cdUL, Seed: 0x7fac3c7a00d71af5L, Ascii: "Ae8sZwZzuLjWxRzS8Xvw3erSRWskQCxSLZ0o5XrABGJN2e1LByA28esW9caWILS"); yield return (HashHigh: 0x27c0b5d6cb685cf5UL, HashLow: 0x073ff68dcba5fc45UL, Seed: 0x0000000000000000L, Ascii: "TvExjicqiLQwVII8NV5YKv9VKavvOsQOpsUgdDHQXBcWygTFFcfe4uhWRRxRnCNC"); yield return (HashHigh: 0xad7f6da929b98115UL, HashLow: 0xf8293c6b7c36bd7aUL, Seed: 0x0000000000001897L, Ascii: "XPqxjOibm1bP65xGaaRsetVdaPzr44WYu4pBFBNyPiD8XOfb5UDhFVEoLercZco9"); yield return (HashHigh: 0x7034c2cd355498c8UL, HashLow: 0x5621c29aed575106UL, Seed: 0x0000000000000c25L, Ascii: "i0ZFqvtSlIKdXfPuKoZTeTEb9L8WLptyzEq4FZWznuBban1DwTWhy8KFTNS287KZ"); yield return (HashHigh: 0x9d45aba34f8e2a8aUL, HashLow: 0x9b64d2419d87166cUL, Seed: 0x0000000000001edeL, Ascii: "FrSgpf1CccjeB6aIMtu0YyDhnD8YVF0Jz8zo7tDGOVzhKwEYrbEVfhYVsVAuURQr"); yield return (HashHigh: 0xa0f795c89f3f412eUL, HashLow: 0xb6d8083ed313742eUL, Seed: 0x332504d827fe35ffL, Ascii: "UV15wti7vDPvp5vdZDqLsOmiSiBymdWYH8uw5TjPqV4QpEXDy42REJAkj6PiWi8SE"); yield return (HashHigh: 0xefd9696109b7996bUL, HashLow: 0x65f719cb4f91dba9UL, Seed: 0x0000000000000000L, Ascii: "v4n0tGBDBWlHljIM0I3XM3oKIBTT8Y4kSWkT42r7PyoD5I2iSJyrUclS3n8h6Xmzg"); yield return (HashHigh: 0x0a3a42cc1bec7e58UL, HashLow: 0xb2e1964a2844c57cUL, Seed: 0x0000000000001b2aL, Ascii: "9kQUYZUF3VA20kgGgNujYD22HiU5onoxWxvQFmMlxlu0fzEv7962PSTejq8gwfvrk"); yield return (HashHigh: 0x662bbebf73761f2dUL, HashLow: 0x94a6d46c5ca08393UL, Seed: 0x00000000000021dbL, Ascii: "Felb7yzSkykG2IkOlrcubpQRnw2eoG8OVsB3cs4MKKeaQiyl5WVbLKeajEuH2R5cA"); yield return (HashHigh: 0x3f946b95f9853555UL, HashLow: 0x25735971d47c1577UL, Seed: 0x2d5b9a19d86072e2L, Ascii: "m5VOpDrDiurU62bcoqXWfzW75UUtAYcL9uh5SmOubsGBCL9lHeSAeQ7l4oh80nuHa7"); yield return (HashHigh: 0x44d64d2e7fa804b4UL, HashLow: 0x813485b7da343d49UL, Seed: 0x0000000000001413L, Ascii: "YA3eHmH7HwBnvh9kNXMlv1RZck99qhkZ6fJyUaUnehTIEd4gIWNhaUU06MrbwKt5ox"); yield return (HashHigh: 0xdf4f4c1bcdb46354UL, HashLow: 0xfc022fc6626d032eUL, Seed: 0x0000000000001de9L, Ascii: "pgOW10uGa4dqCcNvrYlYMGErIwRX2kjIQvutKi7br1O87xo2aq6Sy8Odqr9TF6mI3W"); yield return (HashHigh: 0x3cd26c3b1fed9ce3UL, HashLow: 0xd4ad389bb6d92331UL, Seed: 0x0000000000002584L, Ascii: "OKBXjBXOXm0mmdORpNwqdwY2oItFNEn0plGPXWyWRR8fzVJLvdhOBO1jQ5XeoIdCPu"); yield return (HashHigh: 0x4f3244ed4204034aUL, HashLow: 0x47729c59fa4a66ebUL, Seed: 0x0000000000001676L, Ascii: "2mueH2ma9BTIgNpadxRCb0RFafKa3j91pRC5on1RmRfjBZEpn63mQ0CLuLJwIqnZMFZ"); yield return (HashHigh: 0x8d5f8ab651869182UL, HashLow: 0x3977a319c0dc0b9dUL, Seed: 0x778837d41e84868aL, Ascii: "oFIt4hmqFm5YkhRSlf8egNhotDP3rpgIcsUK4bJjrxErvjVjFOkqZOLeBnSSEoDIi5d"); yield return (HashHigh: 0xf9da99f975cddc86UL, HashLow: 0xbb4e0b2f69d57640UL, Seed: 0x57c7768f23d56971L, Ascii: "MH8bsvNnxc9zlZbxu3xpSPvEdAH7T2XPG4X8SPbu0fHxTGozYB4OM3f4QCnMYqxPPKk"); yield return (HashHigh: 0xae525a13f7807c49UL, HashLow: 0xcaa0dc2628611468UL, Seed: 0x0000000000001ed5L, Ascii: "qoaBsrdaeTH8fkhlC7cdQip2rfta3FFf0wlzKcFT4dBDvogACjVRLx2e0vQ8X8zogB3"); yield return (HashHigh: 0xe4bd50a79f26360cUL, HashLow: 0x9f542f42be05fa45UL, Seed: 0x0000000000000000L, Ascii: "ryH9tH9CiBS8W0mFlB7lSmjxAtjZ8hVCpRr0SHzX1nqlAnD8LZqV8Jt2bGnwvr97NEdo"); yield return (HashHigh: 0xd1049488ccc7d2b7UL, HashLow: 0x3be25cbae5ad35e2UL, Seed: 0x00000000000025bcL, Ascii: "khdx087Y0Ha75yBiMVEsIpvhpyAc5kUd5yl0nK9oSbSudDzAP6aS7rwZJvdeQaKWoCkL"); yield return (HashHigh: 0x7cf1b340f68dd1d1UL, HashLow: 0x73db2e7b055102b7UL, Seed: 0x0000000000000f5aL, Ascii: "ag6kjPG4042HDDC1Y3G1HQLJkglVR7d7Fcd2lsuGieXX4jcURYltTkKybdec9GMw5PKs"); yield return (HashHigh: 0x9c316045c2e43cd2UL, HashLow: 0xd669fb672162800cUL, Seed: 0x000000000000208bL, Ascii: "8TVDv9CQaAsdESpuhUWT6fkqCBTE5y8wovp81YSEdTchBLcoA6sjVtB9BYR0WPHamt7U"); yield return (HashHigh: 0xe850c19ebcc9e68fUL, HashLow: 0x5f11d5d1cfb14fc8UL, Seed: 0x0000000000000d1fL, Ascii: "iKJJLsCO8sDlFFzEKAUATO1jWDEQgfrufqdnZU66xbma8LqFrac7kHqiayzPuP94udCv8"); yield return (HashHigh: 0x19ee95b0a514461fUL, HashLow: 0xa31f6de69bad3490UL, Seed: 0x0000000000000796L, Ascii: "ndk6VGpA9umWEGNVU3i07c5CnUCotxkuWgCECgKnpevbEZu5RCCvqOoP9S4lv5fvwhxN0"); yield return (HashHigh: 0x8018e61ec6dadfe5UL, HashLow: 0x621153c6e99db83bUL, Seed: 0x4d98cad46acb947bL, Ascii: "crOzxbA8fTVCM38ypXFpKIJieKY9IxwIToT4JhTstdb7RV2jlZXfwJu1gMYmxTjfQO3nN"); yield return (HashHigh: 0x73cad6b8f8c89518UL, HashLow: 0x45b6c28274569ad8UL, Seed: 0x0000000000001f8fL, Ascii: "JWBq1w2WqWsRY51JvcLnPI5ceeEdop3e7pxZASclMAglJh8dg9UKS6LzMB1ekr7gprpuw"); yield return (HashHigh: 0x656930d6b8c344cdUL, HashLow: 0xc4bf3e12608525c8UL, Seed: 0x60e925ed68699381L, Ascii: "spTdj3N5564MmYgvK9tKn4cZfPlp3Fjksyfy33TBH6UwwgYIc0asipqBXrjVlyP8GNibWD"); yield return (HashHigh: 0x42ff86309f0aa22aUL, HashLow: 0x6655208f444d54d8UL, Seed: 0x0000000000000703L, Ascii: "C30wXszDqwix9JqtvRST0YzM2j1W47KYRJHeIPMYbsDx32JnVHysFYui34Qaz3xHyXlQmR"); yield return (HashHigh: 0x24a1cc2f43a7fca8UL, HashLow: 0xdb9c20a5917874b6UL, Seed: 0x00000000000023beL, Ascii: "V3cBt2iuYUdhvnnTDjqRE01fAHn133BGUZVNXeP2Az5zvyLv9OCEiu5DQYWhYHaLpUNWTJ"); yield return (HashHigh: 0x0c3c0d87724cf1a9UL, HashLow: 0x676fdcbd5ac41358UL, Seed: 0x0000000000001c61L, Ascii: "xz2M3W2nRYKXusjtGRHvjmvQqPLPXXamYCn9EcOni72EpzD2yQ5qnkQ7PzwbwQCCTIFUPF"); yield return (HashHigh: 0xa7308d55801e9233UL, HashLow: 0x383b7b221004bebcUL, Seed: 0x00000000000023f8L, Ascii: "hE01bC95EVZV34bnQKpKn0Pkr3bZA5ZNZRS7qNZLi19zAS8lgBliLIlLAhEe13KmsspLeye"); yield return (HashHigh: 0x013a83b0a89bf177UL, HashLow: 0x20334151664ef3d1UL, Seed: 0x000000000000257fL, Ascii: "6e2BkJaZwEy5ufx6acaXPli5MEpECXo1aDiiOwprDIdiBU5TgiHydJ2dSmqpTXzaS3f7voM"); yield return (HashHigh: 0x6be4d6318546b9aeUL, HashLow: 0x674c4bda5f8c5d9eUL, Seed: 0x3d589af0acce8d16L, Ascii: "BVt798Xm1REq9bzq5Xgn0Hr46JkvgCbJtCPViGhz7zKVhoLofiTDVNpagnGwLDBCDLgKLH2"); yield return (HashHigh: 0x2e23f53cec9463b8UL, HashLow: 0x287bdc4928e9a9d2UL, Seed: 0x0ca51c7b9a233d1eL, Ascii: "AliAeUYgonrjyqZWlDRdNBefJW6QWqPo9rKKhPL6PMYoUfqi2vjEbejADiT4wRkbVnJjDUX"); yield return (HashHigh: 0xe42813127508a603UL, HashLow: 0xb6b4aad8440979ecUL, Seed: 0x000000000000104cL, Ascii: "L5Jx44k6L0rtSagbPrytT3X6tEmYwKF0mN8oZgTAq3RSUWzrxHHL9VMdSDLFUVmRv5KrlNfr"); yield return (HashHigh: 0x5041bde61f0224d0UL, HashLow: 0x39e4a99d9e239aa7UL, Seed: 0x0000000000000000L, Ascii: "kXdFhAz02ox0GuVeSPsaVLcKMJePZkLQXbcN3kzmFMgWA8WpLfuJDj5rS1KGmwBqyh0Inl5D"); yield return (HashHigh: 0x967232e425f95f5bUL, HashLow: 0x50de1f6f2f79a6d8UL, Seed: 0x0000000000000000L, Ascii: "ttMF9MSoQC8ubvtmrxKFbn9EPg5aYzJY6jvVjvaCgK68cmC7me1ikVRYqs4biHGwOpNKsqpn"); yield return (HashHigh: 0xd3309e7856c01260UL, HashLow: 0x300de539db1fafe3UL, Seed: 0x0000000000000cffL, Ascii: "HH7EP8PtwXPiJEcLrGXMYmyUc4ESerMA0mwIWj8esmTlUph4IIv3AHAmOcPxImannSodYltW"); yield return (HashHigh: 0xf6c1e33977408eedUL, HashLow: 0xaec18cb88a016bafUL, Seed: 0x0000000000000000L, Ascii: "GrkDeCbWqUEesxt9uf1hLN9bixDxAYsgIMc50DFyteH7INNFLP5jgAFkBgrGHIhmpVQxeY1a9"); yield return (HashHigh: 0xf28771de74a9860fUL, HashLow: 0xf32a36b2f95b0797UL, Seed: 0x0000000000000000L, Ascii: "Teff5S6uVmhge4MmwnYTRRMLgStlo2StE4v5TGXWGVz27pM36vzOqTqTObKFrY47uCHn9YAZr"); yield return (HashHigh: 0x25a4204a88044e76UL, HashLow: 0x38828f77cc0d07c1UL, Seed: 0x000000000000111dL, Ascii: "0ENitpVTcRiZ8Wf5NyvmcgMJODJq3j4HtomCzkGQAhh4HDCn6QUNSxpYOqk8g1ddyErIS4ekJ"); yield return (HashHigh: 0x758303871e694df5UL, HashLow: 0x01b8ce555cb43163UL, Seed: 0x00000000000021abL, Ascii: "Dl5V5SLtpMUiJJgdLRXWBzRWbf7FIosJ2KyFd8LAm84AfusyRbhJJhF4NKmzcJ7yTyH89GuwJ"); yield return (HashHigh: 0x7527bc28c988d8c3UL, HashLow: 0xf7b55b29dd76bb17UL, Seed: 0x576729e915b125bdL, Ascii: "AR4lc0CsPcQMjn3Rc7FQnWU2jsFwkSimhBZtYtOKSo7GPQ3T3Fl4jzIuVYTrBGT2gXIxeQudoK"); yield return (HashHigh: 0x871d66b12ac6d191UL, HashLow: 0xb47fd55b85b376efUL, Seed: 0x0000000000000000L, Ascii: "5jdoyrUYoR169zYY9rUMIKy940a5LRnhbY5s6zExO3PCmfvL2bpDPIY3LIwynXg2APdkgNSWSL"); yield return (HashHigh: 0x4574e29a58b80778UL, HashLow: 0xd7d3910d6fe449a3UL, Seed: 0x00000000000002e2L, Ascii: "knIJ4zeR6ftmVtUOoKtpCWRKmdLxJdQCAevdcw4afpzeGaM3GJ7EhPUSDW0ncbATlKSur50xmZ"); yield return (HashHigh: 0x6dd65f8547aafcb5UL, HashLow: 0xb9030cc384c7282bUL, Seed: 0x0000000000001470L, Ascii: "Y9P6C3lY0DnxGxipk30OhIE5JIzjmMHzjOe7BYdhBrRoEooQsEL5TdQpUlc2UkB2FyMzt3lERW"); yield return (HashHigh: 0xa546f8fdd36970aeUL, HashLow: 0x5bd4d823e1fd1e3dUL, Seed: 0x0000000000000000L, Ascii: "g5Bsfq3p8iytDC69UBlTn0sYVCLesPEX4Yje3nMyh46YkUkFlJlI1zh2fQwtApwjdVu0l2y569Y"); yield return (HashHigh: 0x9569712dc5d29dd8UL, HashLow: 0xf7e44b3e2cd0593eUL, Seed: 0x00000000000007c9L, Ascii: "ed8guoucGjtPkhLP5M6ukfYlfZ9nCrvKdSpJU9no7BqyYG9JbF34J7Ld4mFvvcWWMXA6R1tnEey"); yield return (HashHigh: 0x254b12991530b279UL, HashLow: 0x0be484d81decdb28UL, Seed: 0x0000000000001e87L, Ascii: "9gh52nsaHapnqgccLo9C9lukB5Uvn70il79LwLlIKDbwOmtsPePhm94wqtJ7Z534GHTEOz5mt09"); yield return (HashHigh: 0x0e23ce7c96252c7bUL, HashLow: 0x15336657740ef407UL, Seed: 0x0a558d8bdefcd2f3L, Ascii: "AIS4D1HaMvqRq6c2goG6qVXtmauWzSBHjXuURz7oUb93cYi1TRO33CgSnTQldVcyAEvXiN9hv88"); yield return (HashHigh: 0xb3317c9bc31bc1a1UL, HashLow: 0x78bf6bbecc423c4bUL, Seed: 0x0000000000000d63L, Ascii: "4gLhTmcXNAjO5hzjFaNyJwZQA0xgvgXqY4YktLe5jBqXktO4ljSRIuSInx2jiYnMvyVQQDlSCCga"); yield return (HashHigh: 0xd9286e690430b950UL, HashLow: 0xf3c3887725733b6eUL, Seed: 0x0000000000000000L, Ascii: "yICRSATk9jlBrmGQkmpVq0ZTyIFbrqBYjoLaKxEKixNAfof1wwEHTuPYnDdaQkpwiqFyGDH0QO8m"); yield return (HashHigh: 0x8f211ad1709cf312UL, HashLow: 0x594a888807fac3e9UL, Seed: 0x0000000000000000L, Ascii: "shbkpE7GQJehIvAcFb4NpuoJT7ax8nJEBaDOCa6cwp4Mi60W59t8Nfzsp16QFABa4C6KNoRl8Ufe"); yield return (HashHigh: 0x141e13e1a35b49caUL, HashLow: 0x8b0bdef6a1e1033bUL, Seed: 0x0000000000001cf7L, Ascii: "2Xuzb0FSCOTN910D26le5DFMx9qJEPqugm6TZ202MUExumgdOSvpo0d7DG0vtaZUFeRBK006io2l"); yield return (HashHigh: 0xcab76de0f506675fUL, HashLow: 0x8a2720222b7ed695UL, Seed: 0x64436f175308030aL, Ascii: "q7sxIPRAM2Og77sNTXWkQWVdHicRlPFhWfyxtVlbcj6UgWWg25EiZ2PP3qrR7SHnOqZlySIYWJo03"); yield return (HashHigh: 0xa72777f0a454d754UL, HashLow: 0x346747f97b62ed93UL, Seed: 0x0000000000000e83L, Ascii: "loMRiwlZaYhfjwHuBEPYjtNxS75MA6vLS6EGZmj0XNmMdHAHaPAq8ERDFQi9orBkT8rWBgKNsYkJj"); yield return (HashHigh: 0xa5e8e05cc58b2358UL, HashLow: 0x0cf288cda39a8c4bUL, Seed: 0x00000000000019f9L, Ascii: "4vAi26eGZ5TlYTqznrLKYcpxKJ4Y7883pgHBDOoGActgK5ZbrqppP150qbmNytnA1vqc7l8eT8oEW"); yield return (HashHigh: 0x49273f45a1268f1dUL, HashLow: 0xc1b1d4204b55a88eUL, Seed: 0x0bcc809852294e09L, Ascii: "rROwD6YwvSMx86Y5MmCqNKmUtIWMtMOXtLClOksIdal8lDboxqFWSSVKmwqdVBDoDR7elRYYM4PLD"); yield return (HashHigh: 0x7fa8662e4f6198c9UL, HashLow: 0x43eb0ba00cf98712UL, Seed: 0x057a5a6ff3541340L, Ascii: "bB3lurVvoz64fwEouyj9AsGxsnLdy1NDOAEA2n4Mj7tzENnt3WQNlfD78Vz02IhytA1bcoVn8KXQL8"); yield return (HashHigh: 0x7e63ba9a9c125384UL, HashLow: 0xe14d309ecef59917UL, Seed: 0x0000000000000d6bL, Ascii: "sfZiQdoIaLFkM1XS159ya1TGvv8SrE2ahJP1D5fxelGzvPndJC4l47HyPyZ5hOxgff2SuuqbIhdKPr"); yield return (HashHigh: 0xf689d7bd37bc5e29UL, HashLow: 0xb3154d844b44a137UL, Seed: 0x0000000000000000L, Ascii: "jxRWEK6LJazWynCNTJLyg8nWsWnB38nYXq6cvSIzOtW091yMZEfgHaz5O05oI59UL7m00Lw6FYyGZ1"); yield return (HashHigh: 0xf4e6f14b2de069dcUL, HashLow: 0xaee0383aeb3224bdUL, Seed: 0x0000000000000ef9L, Ascii: "ZaxQFYVo7FOe51lc596Dvvtll8dQuWWcPS0mfBVENDWxNHvXhMQm4vfW0sauM4uE3qdeOUiDI6Ndqd"); yield return (HashHigh: 0xbf469f1cb7b83fb1UL, HashLow: 0x5df1e0887af913b1UL, Seed: 0x0965aee13d012a9cL, Ascii: "JtXkLq3fXKJ3yzMHbr3LbgpnKSdktDHkmD2v6yljj9eT6p5gbAAFPMQKrQMaxxiSYkutYamf45cW1Ar"); yield return (HashHigh: 0x62da62072023f354UL, HashLow: 0x1bde6b7c1e5a4c69UL, Seed: 0x1d7c540438c70dd9L, Ascii: "HxYHgpI1GuU1GBvUCDV84DJXd08NA5pxEWQZbTknnZhw5pWVFLyBv8jS5UP31xUa5iwrgbTskSDcbG9"); yield return (HashHigh: 0x94be9830dd69f531UL, HashLow: 0x4b5f682e5dde7d95UL, Seed: 0x0000000000000000L, Ascii: "W2NSFrUjANeP4FVIhnoGVFe3MS48y7q61jghNQzH29cDqocuaTjAdPwgIaWjcQea7D8puxKPF2Re6ES"); yield return (HashHigh: 0xdb2ebd2bd3e57e0eUL, HashLow: 0xd675575222cbbe92UL, Seed: 0x2850993126a7f996L, Ascii: "xKnvXs7ULC5O0on8tr8Cys8FbUehnJLCiETUAFRNiXvCE9SAnl1yF1lmkgv87lMG8KDdAbyX9QimPQO"); yield return (HashHigh: 0x68a08d24212e9da5UL, HashLow: 0xea5f285345171dfeUL, Seed: 0x00000000000020beL, Ascii: "1xOzPHzGQiqo1SQqDzFB1gTdAoAo2MEmNdtYO1NeQ48mBWG6F5owFO9aLVlVLDHzcZEkpAon20g3xOF2"); yield return (HashHigh: 0xd45e849f19f8a977UL, HashLow: 0xa31f3dee8d585cedUL, Seed: 0x0000000000000000L, Ascii: "1CLclXs7CcEU5wHEhO9ENbeP6XItnXoAmc1dP1uWNiakHyAiY6FFL3z34V9iPRltZw36ACYev0eEukf5"); yield return (HashHigh: 0x2c84e5615200a066UL, HashLow: 0x00b12f310021fefaUL, Seed: 0x00000000000024d5L, Ascii: "9XiE8okSHwClRCIEt3FEOU07BDEB9CgAC8Adltc5jOGVeFnNktQu9aszHFgVGX3PZ9ILBMucYwOAxYYX"); yield return (HashHigh: 0x0b7bfe53855f3276UL, HashLow: 0x53b8ca3fb45c10fbUL, Seed: 0x0000000000000573L, Ascii: "wgMLhX7QoJbXANDELpVj95pKNQKAoYdB5cVO5Nv73p4373iciCh1fU0TacEEXyDzO1tgFUfKUKu1kgpA"); yield return (HashHigh: 0x1842f25d793df9feUL, HashLow: 0x8c5ce9b1c76520adUL, Seed: 0x0000000000000000L, Ascii: "Y2K1guD2KTnldiKASvOepwIC4pPCLKVitKGNfXv1qNsCgPoe6DoqKlFAT73NZB7BALAFv5GWbtoT2MG8h"); yield return (HashHigh: 0x9186c05896383d9dUL, HashLow: 0x8a8110a59846f1a2UL, Seed: 0x0000000000001a72L, Ascii: "IUnCEf9bGM1nbosXqMT7AKto4tW8Me4AdiSc4YuxBukkt6AyWgXAWJMnxMzX8B7rAzf7DzfsIPX8TiFGz"); yield return (HashHigh: 0x1f18ff2af4e9888dUL, HashLow: 0x940766b08c4a429eUL, Seed: 0x388ec634c9324d40L, Ascii: "kHjJnGo4IJKuiK6TvKKTm9IomXlTSKoUmXKRGjdq2Iw4y57NsORDkhGtfCylmlA6n7murXdpuZEU8YlVn"); yield return (HashHigh: 0x632cccb4332c2968UL, HashLow: 0x13b22d68676766b0UL, Seed: 0x0000000000001a30L, Ascii: "CD7bQOQNV2YZFCRsUp4ss4G0bwASuowA1gZIwx9q8k5IQ8MKQN0vQVmTJnvsYp6Gs0RSX34Mr4qbg9joj"); yield return (HashHigh: 0x5af39f9bbae4f81aUL, HashLow: 0xd093e13c1536ad5fUL, Seed: 0x0000000000000e05L, Ascii: "dtSPsb0jJzCZ1JrmsLMXJVXuyyDDTBW36P9ngdyM7VVc9ZXIBmVPyU13Cxx8uiSeMRgc2NvFuWbQf7MZ5O"); yield return (HashHigh: 0xb7868d55a03242c0UL, HashLow: 0xdff91124d56f9b38UL, Seed: 0x0000000000000000L, Ascii: "JDMrnJeFOCgc3r2GJYyDJ4UwkWeZaU68lLVpygpyYos3C5t2yBxhes7YepAURnhmf4PouTq3ghDk22J4VT"); yield return (HashHigh: 0x0345f31b311c330cUL, HashLow: 0x24ccb1d3f231ad25UL, Seed: 0x00000000000014d2L, Ascii: "RSuevETNns05LTDdUoiqtCSmB59b5mdJIhwGHYhmggWXvOHLc3s86ZpugUmMVQMJkMFdy6DrcbDTqnOBCy"); yield return (HashHigh: 0x28b4d8e543d45381UL, HashLow: 0x855a48bda8c3e8efUL, Seed: 0x0000000000000667L, Ascii: "WmfzdvD8CMaFfI8fLcEjCialZSDn7lyQNmiQleDA0fX9WLGKWeRaCXM7gFJW25L5HGupr1RxYkRcqBGnrC"); yield return (HashHigh: 0x915dc0c0b6505f5dUL, HashLow: 0x104d65e5cc50cd1dUL, Seed: 0x0000000000000e8fL, Ascii: "0vyTy1PsyfMtOSsWEORfWH2hJjF8mqhrAZKvhNTFPCEi4B6xu6ANDRnhR16eFNFA8AMkYri8PdNOeN3NNxi"); yield return (HashHigh: 0x07bdfa3c3f713399UL, HashLow: 0x3493c8f42eccc150UL, Seed: 0x49379dc49721786fL, Ascii: "DQPjKzXQJ9RHiloP3yzIo1mPn95mEf6NeNfJCghHj8NKyKS1IoBM1pexRmViojfnnmDaOtQ1UKkJ1ry0tdu"); yield return (HashHigh: 0x528b8bb1c0c86654UL, HashLow: 0x8cf42bfb51c03b1bUL, Seed: 0x0000000000000000L, Ascii: "GU8ISi5OBIWYBeK2RZnNscT6DEYN0uB11BpgKekeh56vm3ksjXA7YYE6jNiJ2jhgFHYupsUqW6GzAdPyhUv"); yield return (HashHigh: 0xa0ac2c857f33c4f2UL, HashLow: 0x8126fefa77148c22UL, Seed: 0x0000000000001609L, Ascii: "VjsOLFvsdyj2l7KrrZ9fyLsqc0f5w9ALbFPV0LYTiugCdip8R9WCs9DrpgxtgRlUvFGUnQUTx1KSySnOfbO"); yield return (HashHigh: 0x96f4a37cc4f8db8bUL, HashLow: 0x91c540795d6b46adUL, Seed: 0x631139e5539f35e3L, Ascii: "3E3UtumllL6ZlbDR30TvTbYn9SHqxRpnG7d6GyjSIcNB5PvcQaZd1IRFbSzgUom3rKQzIDqCrywuO3hLNnME"); yield return (HashHigh: 0x8bcefcdb74768654UL, HashLow: 0x5dfdd795e8663503UL, Seed: 0x02ab9de80a052f42L, Ascii: "LF1Yr3508zzhL4or5VAh0H9ztfDeHysy5gM45eOgWLDmIo5dZ4QuRWDWzx0pJos2oZUiTZQpcf8nF2MQBCOV"); yield return (HashHigh: 0x17c18f254bb48173UL, HashLow: 0x00342930e641f794UL, Seed: 0x0000000000000d6eL, Ascii: "jeS5hvqlGabtRxiAyPQhQWMmnoRzZ6QMlaMsOodS82kdmKXGm0XfyglRCLutG6ZXI7l7vqIbTdLz0nvGLMm1"); yield return (HashHigh: 0x6a778219c1f41f8dUL, HashLow: 0x9a5383245ed64680UL, Seed: 0x00000000000019ffL, Ascii: "cpUbKnjYjWCEp4VqvJ7X3cBsiPYVLKOXDc5ZHAyQWh4z48YNFYbu1YExQKDo8aR2zdaYLRvntqFko8wRCBio"); yield return (HashHigh: 0x170ce8869c5182a0UL, HashLow: 0xf081c9bbf5a6730dUL, Seed: 0x0000000000001532L, Ascii: "jrS8UsCkonNS7kj6IpzzbIIZbHpJBsREwk5IC9rNyjklOm1PCvrmTBZK9eys51G7HMZIZZBjSCcWHn6nCOkHx"); yield return (HashHigh: 0x618169c97024de71UL, HashLow: 0x6c2482293bfcb890UL, Seed: 0x42375fa6978a8ce0L, Ascii: "dd73diYCxIP1ws4uZjCgSMDSosJ94thLDPduo0jTqwdKZunPjMAupanYsSdm64zpN6NeQ1LGEKuG4wt6Y3SVU"); yield return (HashHigh: 0x45cf12292709aa13UL, HashLow: 0x44cdb4cf6ffe8084UL, Seed: 0x0000000000000d6aL, Ascii: "8qRe9e6PjnuT6dAQ8P1KdWwafr2NmdOaUqnCHrX8BoxHAPPr06gM4rSurQ4wO5btRSvdaAOkdgWSpQL3LmWwQ"); yield return (HashHigh: 0xca1783152e8f9fc7UL, HashLow: 0xc465a48486685404UL, Seed: 0x0000000000000000L, Ascii: "Ys2i2ULXx10I95yTezfu5fMxIxY2lKI23rjhPzB0tSSR1mmCVfNk0MylEWDLrLJKDm6zwoaf5dW3lWs1gvOvn"); yield return (HashHigh: 0xc1b52bbda2464d3eUL, HashLow: 0x6b63bad910131834UL, Seed: 0x0000000000001467L, Ascii: "RTsWdlmUBgkRcvDDd6NP4GyFgarm1I9nqAEyD84zhOylaT7JSxayq9eEPaDRCjXSZ4fittmekdaz2SNpMPnVOw"); yield return (HashHigh: 0xa1b72125226f4fa2UL, HashLow: 0x69762c2d3aa794eeUL, Seed: 0x0000000000000967L, Ascii: "WzUnFL0OucevcOamRIuPYS07D125Qle6Lq6xT8y0oRJj6pcZfrTde5KDSt1g7IuvAVR34wD6TRqcdsi3Ul5SUk"); yield return (HashHigh: 0xb5dd5aa5cda92562UL, HashLow: 0x800ecaeecc1b7c4aUL, Seed: 0x34710ce41037c450L, Ascii: "HOqOvCuFWK5zJrbPrTuqRmS1Gu5iJnsy10GCBEqfd21vB6yhJX4UE44UIXxHiWaTd8kVZb98TstXHPpsbY9cnI"); yield return (HashHigh: 0x6dc77d1f80ed4891UL, HashLow: 0x3000caec11163ab9UL, Seed: 0x0000000000000020L, Ascii: "pznGNp5jjnmpUPCia2hhUcCNifekLJ7j8WrBlDDMaeeWKEVAcnkezBSpeLIMu1Ug6ddZDdrKgB4vTKgATvuJr0"); yield return (HashHigh: 0x7368810912e098deUL, HashLow: 0x8ae8a6dbd0d48635UL, Seed: 0x60e2dfb361ec07a6L, Ascii: "icHYkTi8vGXsvjXjbKI00iY06R927cl8tByHNmk7oXIDCZF2Hv2qwpp0eQFP8BpXRXPKS7kZqF9LIOAUHPJarVc"); yield return (HashHigh: 0x29d9973dde617bd6UL, HashLow: 0xee5e48516fd2e3acUL, Seed: 0x00000000000005ffL, Ascii: "PV5W9JFi16GN7eVIGpPgyCjhaWBMGPmZgvdvTWJdLK6XcySgEbpvO1NMN37TaHGs4pQsZDPCIX70Iu6bo97TeTo"); yield return (HashHigh: 0x3178870acc7a84a4UL, HashLow: 0xf6f5087a44b74000UL, Seed: 0x0000000000001258L, Ascii: "oWBsc5EmYQwmbCptYMN4hmpN1pyeIhS1yL4dFajXbhfmgrxVmT3YfdCZeefAQkcxEAqxScBVDLVB3dP9xIpzg8J"); yield return (HashHigh: 0xcba0807f61a1b062UL, HashLow: 0x3479ae8ab0bf3142UL, Seed: 0x30d1280a2255cff0L, Ascii: "Fdmm0omXgPBESo0geVOZuT28dNiz0haDn2DX4NYyfTEzSu3XKmtg8Ppbwrkw2YTe6Jpc6HAb9uTiMln31GaUTzd"); yield return (HashHigh: 0xa7f0ca468eec77c2UL, HashLow: 0x6859c3963f7faa42UL, Seed: 0x0000000000000ca6L, Ascii: "msE9S2EKEiEI0Ckcv2tlMykdR2hAwu7bKOocWKj6JT1vkuHitZT6ltdUVKw6xzHrCgHDMCd7pDZlTyBddDq73OB1"); yield return (HashHigh: 0x0f8e3050421a83edUL, HashLow: 0xda8b768a60f3cec3UL, Seed: 0x00000000000001e4L, Ascii: "eN66tT6yA5bkLXKxju7LhsVsDCXh9b2nKAcxUMlLk6kOG9hgwf90jmR24jnufoW2Mhy4inON8yFz59jIWUWQiIAe"); yield return (HashHigh: 0x9c3d5fec5b1f90afUL, HashLow: 0x882d1a13b178dfbfUL, Seed: 0x00000000000009c4L, Ascii: "T9XJsRN6EtJFuhAnOfJmc4ebq50rHPxhO7BIVuqZzMmyIB5e34HAMU4gZHmKI5i3f2LXd8agHjiv9txK5EoCaCgX"); yield return (HashHigh: 0xc6ac9193dd9fc316UL, HashLow: 0x76f8e20206c5da87UL, Seed: 0x5745190cbbf503feL, Ascii: "3b6fCjZVHW3sGOBouCLm9qnQhu2mqWDXLaiWZ3AULlb38LYnnpaY3BUUcFlOz6FQtjdjIFrlH04ht8fd1WTmaM7G"); yield return (HashHigh: 0xfb331eb4eb3431fdUL, HashLow: 0x31a8ef86b87b96acUL, Seed: 0x000000000000119aL, Ascii: "1h5xhrLp5Pm4aUTB2VxKj4tt622qO9eBswifEsh6AyOhoKUokwRMjVhIuiM3kPqXElD7yh2U9XyfxbR7gqUMVgXSA"); yield return (HashHigh: 0x58ddc3d41dcdba8dUL, HashLow: 0x2c6b3f4671b39106UL, Seed: 0x000000000000042bL, Ascii: "CMMnPlYPFfpMQ2GFAxEzzBR6SYlEemynU4iiOkxcQnJ0gQOsA1HI4zOqCx0p5xdWvw6KKCT6SznlV9Rb8Pmfc3ret"); yield return (HashHigh: 0xaa88d4963f375c72UL, HashLow: 0xbde3d05118bf4068UL, Seed: 0x0000000000001dd3L, Ascii: "805Kt79f2xIrEgaoLoYb2fukowtErK9PdjHeqTZNVxPVEHod0KSJVjSzNPYKP0hJmiALt65FpIFUUBsu5XZJqzr3H"); yield return (HashHigh: 0xb7a2f516497fd605UL, HashLow: 0xa60e2c642d1a667fUL, Seed: 0x0000000000001c59L, Ascii: "hrfOJ94OlRphBxBnrfLRNW30oUiDf8S8mLJL2CLnwga3PDxaZKuTK98GwP1Rr3mRFlRj2WXR69knsqmY60CeaC3a4"); yield return (HashHigh: 0x23ea4bc18ababb57UL, HashLow: 0x1112ba61cbf0cf39UL, Seed: 0x54cb3bfe8ca3fa31L, Ascii: "mncxHLZA2MOTR3FQ2O9VAXPekOvJwy4qwis7dztqNGDz6rIhubuBrTwgD9MXwgdN9nmdAs8JvmZzMEodiaHVI4aJJx"); yield return (HashHigh: 0x942f78a93d14cbf6UL, HashLow: 0xf1ba9ec5bac55538UL, Seed: 0x0000000000001494L, Ascii: "tkUoWSt4GsMaFYvzDYB1eKymiyFlW0kYGpWCH3RR3bKhGerJ7ZD7nKeTfyonVau3Q0XDbs2YufUVDKpbyo5K4pqHar"); yield return (HashHigh: 0x2e07c8bfb2268b2cUL, HashLow: 0x5cb74d98056bb95eUL, Seed: 0x00000000000012cbL, Ascii: "QCH1shq4UBmQW8lq68B8Nk1sIBLqoRRqCpC6tSYQoxNZtvrVVyL32ziy5tFoJQYedW39KrycO8Bz7EMUoCIAvpdd9k"); yield return (HashHigh: 0x920622c9f36b56bcUL, HashLow: 0x10a70e9a0620c7aeUL, Seed: 0x0000000000002142L, Ascii: "A5PjqMnYlEFIsdQY3D6w34CLQRDC18OgGRwg1ojrsTg3S1xloYXDzoaM5qxzEU4sOSCW03BWyrLV9orKJYUowrwVWi"); yield return (HashHigh: 0x9c46fae26c81b37fUL, HashLow: 0x3f6392fb175a62a7UL, Seed: 0x0000000000001da9L, Ascii: "RJWlnW50Y596v38EioTodlxPOyjRhs4aXZfuuQnNmRkcno0j7Wlas5fCBBKHADdQ357mzP16uNcsE9ZoqVKBj55hR0f"); yield return (HashHigh: 0x61e4124e57cf026fUL, HashLow: 0x5993582b1ebd25c3UL, Seed: 0x000000000000078fL, Ascii: "sxfHb96ETfH1gsllblJmHJ419swjLnVPGNh9L8kSdNgFNeK4SObPrb1YiHiP6q2GVWuuB7tDIDTTCT8Mw4Rv0StywGH"); yield return (HashHigh: 0x15524c0b37de86b5UL, HashLow: 0x78d20ab6aea27ff1UL, Seed: 0x0ca925d9e177c363L, Ascii: "fxPzz16TkqExxzvWxgmVTppXlpxTpRnBdmGNTCmJT5Mv3JDlZGuUfhWmOmkBu7Vh2t4isZiJ48jIr556Ut2IfZDOWjm"); yield return (HashHigh: 0x212b74d3e29abe3bUL, HashLow: 0x5005403a4be89f03UL, Seed: 0x0000000000001ed6L, Ascii: "plbKTkmoJKnv4zlCt9IsROTrT4pkR0AdiU38pDjI2nlXdixf2uZW07InGOSI6E4Evn6LMqkUGuvzpeFkjIUB7OlqRdR"); yield return (HashHigh: 0xb9d447379f035183UL, HashLow: 0xbfeb293d6d9145d0UL, Seed: 0x0000000000000602L, Ascii: "bsz8XLhzwmbIaM690caHhkWWxzXs8VUinQQLhQ9JfAe3lwPttXOcqf1eSngar4T3Ut6IVMWwfW43ENQneTjuuIwOWS3p"); yield return (HashHigh: 0x04550a2eb4366501UL, HashLow: 0xdf427b26fc7d2895UL, Seed: 0x0000000000000eeaL, Ascii: "QtnJzyD0qIHgIFuhTa95GWjzsMtz8EWYsGi5Kg5uY95A2ucHKibo8kr2ymepSYC8fKt8yivOVriciCagMB8wHORKO38o"); yield return (HashHigh: 0x321254913e82237fUL, HashLow: 0x3ec8caf9d47fb80dUL, Seed: 0x0000000000000387L, Ascii: "UpXLB8btnEY2reXU3HGbjZ1viz1cyhkrVYn4BpSRwrFSesbm9uJvE3LQ3emRWt02X0eIQUAnUSA630GSrp97uWs8XIkC"); yield return (HashHigh: 0x683cd987ec805005UL, HashLow: 0x5fe9b95d1ca22b8cUL, Seed: 0x0000000000000000L, Ascii: "p2ZHDFlKSGEH1FHyi8VL71p0mX6FConLxy0Jhaiy0tj6JMIWA62SxUw3jW3uluBBUtPyiyHCV7SFjFRmgTZK93VpIeWX"); yield return (HashHigh: 0x97d6a759d614ef44UL, HashLow: 0x94c798407f15ea28UL, Seed: 0x27d35b7ad1dbb2d9L, Ascii: "v6MgHS6LMB7OgVENx4TbtYMd1kcVwyvKNAXxsv4h7Pz67utR3mGj8hgxqFlC4jzIXPDQeJVNARK05tQ2mpUEQIqTjwM8b"); yield return (HashHigh: 0x6af5c270ab71723eUL, HashLow: 0x9660c9265b8bed33UL, Seed: 0x0000000000001da4L, Ascii: "sk5J8Df1UtxtOeUYFieEwdlc19AuNdW8wFkgFFFhAYBLHRjbQXbZjRug9jpWrwCNdo3gW6LdS5mHzyDi5UD1y2qpquCdr"); yield return (HashHigh: 0x19898a18acfc4a04UL, HashLow: 0xd748028a5fdcd75cUL, Seed: 0x0000000000000000L, Ascii: "AecznQe8iEMZeWWTmpTPQSXOWJGea9f7LtndRQ4phOtCM1PbAQip1QNIGqng8YPweeZHN0JBggBNiLe1UCTsJz1XLyhLZ"); yield return (HashHigh: 0x95d84222c74042f0UL, HashLow: 0x0b5558daedf73398UL, Seed: 0x0000000000001e9fL, Ascii: "yV7nZTSS6GgjMkj1npv2Z8rtqA1tOeQw7D4xyLL2lUYppZ9j42cazdHhf0kbyhpKtwYrFQ9mMcAdFwm74S2mpJAcII7FI"); yield return (HashHigh: 0xe293dad6a891a0d5UL, HashLow: 0xc05e3c361468cc24UL, Seed: 0x6f88fd13e34392a1L, Ascii: "1Q2UdjUFr1gBxskQDm4Rla2CmaXbimwoMVnVqGP0MbpTIR5oor1dcTSlldIV5iP3PTwUoICH26X4gBnhg6I1t5fLIYvYOd"); yield return (HashHigh: 0xee815ae931a1e977UL, HashLow: 0x6cf075a40ea8a205UL, Seed: 0x0000000000000000L, Ascii: "O58pvF3a8YRtgya9zzl01iZ7QObwQNJ1Zk5FlsQmApHVXMtyugINWuw2gOzBNwMTa9CYemEDEJUqTE5bLojrHONUi6BQgr"); yield return (HashHigh: 0x321a1ae5d00f84d1UL, HashLow: 0xe1f0652e45f2e07bUL, Seed: 0x0000000000001700L, Ascii: "GhtLuZMyG1XQnAyyIa7RCqT5sMQrywQfcjehPBvYWra9XHYq2l6ARUdod0Sa8FeTLSX05eiERBM23MmVdsA2OKLScV1OBx"); yield return (HashHigh: 0xee6e68e834f8ebf0UL, HashLow: 0x2e5672e0594c719dUL, Seed: 0x00000000000026acL, Ascii: "SZSYg617FijnkY3bDV4fXvrWGk88t78nvfURjMdp8c5HCGZMB8uVXEVYXdfqcrCofd4OF7gC4Vkr9i0tW7HwaHFl3jFPsI"); yield return (HashHigh: 0x2f4437e100f689f9UL, HashLow: 0xca3141196da99169UL, Seed: 0x0ca6fa8ccee7f53bL, Ascii: "dBaNLClzLlWyHovtJt6GhPRW0xZpaTFsHIt8dBUvezPPrGkqkgoBZ3TZ1KdgMjGCD4U9fODbDcahLmSnLgg4GDRBA90vPIh"); yield return (HashHigh: 0x2f2ba8c754a72445UL, HashLow: 0x7052f911f07768b3UL, Seed: 0x000000000000112eL, Ascii: "VfqlsjAkcKGLKdn3Uaw7CqBBsM97ZbBdtmCYeqtSDKSkw5F7Jsj7Hog0zQdRslNVL5jsjEYBTSJSHdQ1D9yeenW9SfvE1KP"); yield return (HashHigh: 0xe3f11d71ce227e70UL, HashLow: 0x171a7fa319f2be42UL, Seed: 0x000000000000109eL, Ascii: "2Ek7E3bnqhTtPcWwGmqBTU2SCXsfq5FPUl5huI1S0ybZi20XzG9GLjFJNa33NV3ymgwkMVZKBur8KHbEnuaHhDfbIbarc94"); yield return (HashHigh: 0xe48f2814575fa7fcUL, HashLow: 0xcf3280b3d697fc20UL, Seed: 0x0000000000000000L, Ascii: "Az7ehWUO16NwvRHyVdIJXEliFvTFhSnh4xxU2tZzZa1c7hlFZaS0ogKlYUSbmlGV79UGZkXNaWKFnhyNhP0n36MNWLv3gWX"); yield return (HashHigh: 0x2e21dda526d1d199UL, HashLow: 0xf8e2351224f8af7bUL, Seed: 0x00000000000004d5L, Ascii: "aDsLKOX8ej6wfnhD0RZledxUxAepdUjpVTnQfWwi9fx6nOY9VzhsI33fQKusiX6FipsaiKoeAb708o8q29PgACXUnndM2BK3"); yield return (HashHigh: 0xf98d1081b7e97df7UL, HashLow: 0xf05ddb7db22a8904UL, Seed: 0x0000000000000fc0L, Ascii: "DlXZF0c4JMLqt1lfVbCwp36tpCs2Hni4DaAiuAdXjQJLT4IfijfPusvPaOZOXujM3gPNOJCfQJloybPl4lmmVVnJABVAphzR"); yield return (HashHigh: 0x9092e67279a8bdfeUL, HashLow: 0x16c10849bf7f6a46UL, Seed: 0x0000000000002340L, Ascii: "enTD8N3YsFrowNU6lIBkYvdIOJlzAm17C88wWa8NLrWeUDwF9mASo1Wc4r7lZ5x5Hk59TaAYW5xFfFoCZeP9hEk0fUbSJCXw"); yield return (HashHigh: 0xeb832d4974110b07UL, HashLow: 0x9784bba63cea8468UL, Seed: 0x0000000000001d7aL, Ascii: "byZ3cRkWHTmzZYK2uWWYNI4wiCktVbi63lZWLgNzwWpOfEORLlzG6Nyqy9Bl1G3YmgwEIMbwXFXTpZ8krRkTC8NutauCE3aP"); yield return (HashHigh: 0x9c2df00e35b52375UL, HashLow: 0x3bcbeb4935e89aa2UL, Seed: 0x0000000000001c7fL, Ascii: "YhKrs3ZYmrSa5VSRZGM4V8OYvXckAvoQNPtV07iCUJeKDmYOk1fNmkVLwSlBWrjslzkib2pRljteQWICxd4nR3iBhRu2SOHjE"); yield return (HashHigh: 0xd5ccc7c2d6ba64b4UL, HashLow: 0xc946e19397872b36UL, Seed: 0x0000000000000b83L, Ascii: "8xNVKxaxHKCpuyN99eRUFC7J0aUjryo19gTm0DTe3uClUzIAMQ5s3GRZtm0yYvLoMv24ZQDb5Eoe4BlX0vFfkFekryVZbnHhp"); yield return (HashHigh: 0x1f70c855c4f02a37UL, HashLow: 0x498f1ef6aa9bc0f0UL, Seed: 0x0000000000000000L, Ascii: "lEeV9huQLVCi6UVI2b97K1o5ELJHCm2sWBSUC8IVFGZavNez0OGxkIJblx2WowrsVJoL5xLAr8rLfOX6J8B3wSJaPzM3RsjrV"); yield return (HashHigh: 0xb3617ee62879db46UL, HashLow: 0x474081d31ae10344UL, Seed: 0x00000000000009c4L, Ascii: "DIoXdkmKdPkqgmD754zIBJhvXejvnEVzCQVg3i51ShwxkvfsWK9VIkVqIROx5wpav0PyEyWWtfQ0M7pbVsLM9cOgowZQ8BR2A"); yield return (HashHigh: 0x81d34192dc4414d4UL, HashLow: 0x3d9bcb70503e3be9UL, Seed: 0x00000000000014d3L, Ascii: "q1JfFrO90sN7C9FSs5fdL1jQqiQblGaKd6r4hc2exz9MSjBZ0AZi6tA7QK88Yp3lclgjP02GCS83QBhCfBeITWoA9bpz4tzDwV"); yield return (HashHigh: 0xd4afd63e89b116aeUL, HashLow: 0xd14b88e21c4cdf11UL, Seed: 0x1b540f1754eabeb5L, Ascii: "muZJfTugpL1NztwGkqgXUcEZmNxJOEMCB7itdUP1vKp4d29NVA1SIWZAefELEt88YRZngUBsczSgCdojJfwk5b8XSkoNortOfg"); yield return (HashHigh: 0x8a44b60c93c70c67UL, HashLow: 0x3beadc8c4c651c85UL, Seed: 0x3f25c8cbbe8d8cecL, Ascii: "dJOhJRCO3QObtEcE37h7boKXSFBuyKkEVoPsU69Yy8jOJbBD8ImjW7AqvHYUtGk4FlJlTK1h2XzRgtXpIUxMUNeH9KQCeXgGIx"); yield return (HashHigh: 0x521eb041a525c965UL, HashLow: 0xf0e39452ed2b6455UL, Seed: 0x0000000000000351L, Ascii: "RUju8gCDfD28Gh28UsjsteaYN7c7PmnabjqBLgCvM8jzMfpFMF7OakYmtMAx9VBC7Xta4iT5Gr1sn4l0mLvhL9gEe8BMSuFFL4"); yield return (HashHigh: 0x5c181f3e4a8440aaUL, HashLow: 0xd301a5b5c073c673UL, Seed: 0x0000000000001448L, Ascii: "lGWvIexcyBKiKnUMvSQzo9BceGBuAf4WmAqdgKgppmhSrvmdOdEVyxvxq7GftnfRx2HxoiPARdO3DK1bzPKMbclWs9NEM4oQB08"); yield return (HashHigh: 0x87457b5242582cd4UL, HashLow: 0x6e9f8881bdd18ca5UL, Seed: 0x0000000000000399L, Ascii: "P4cbUGRzgVYZQQVJSR9DnankJ5dWEAiQfnt8RMIfWaObfrrPTc3QU2IqL7Mp4oNtAydl0XGoFQbF2hJr3utSZclmSMieRJNGHOL"); yield return (HashHigh: 0x47119211ddc09755UL, HashLow: 0x2758dfba3fca74f9UL, Seed: 0x0000000000000000L, Ascii: "FiQri1z7OnyQOHXTum3o9AAZCz8iMWsIdADPtrIp6nHWgf0kf04CiWTdTEfhupYVt23z3UzycQzkV6rOg0uZvcK3gGA0ShYmnuR"); yield return (HashHigh: 0x46e8a00faae944c0UL, HashLow: 0x695b1cb5d398ab60UL, Seed: 0x0000000000001382L, Ascii: "1MJLEsLLvs1aM8KICum2XF7Z148NFlYwPnqmoZ8SmLyqogW9SKtgI7VdK0HSQM3bHig4K5w3NXIRCd8BQ7kbW0hWkBszY9pWca3"); yield return (HashHigh: 0xc09323868727f1a3UL, HashLow: 0xa5c31c47922d486eUL, Seed: 0x0000000000000b98L, Ascii: "KoKne76FGJfH1TokABK1wmFqwzJetkU6OO9umoiMoCBbnJywDbWEZF71TwAlVxp2HgXCIR5x7O9d5RRisvzHD4kwe9wal69kWFs4"); yield return (HashHigh: 0xb11377ea2e1cf86bUL, HashLow: 0x8ac8600a6490a4bfUL, Seed: 0x5676131a5b81e39cL, Ascii: "vMsWYScvCxCi5txDAf4i2Abg6mnQpY4SMAxJ74eIelYZlAvN2ZzinYbCsNDcBAnFcnoR8EDsxdd2dKB78pSx6QdoejvoGNxXE7sv"); yield return (HashHigh: 0xf709513ff59bd6eaUL, HashLow: 0x8c34128bf6531877UL, Seed: 0x0000000000001345L, Ascii: "xl8l6PuZIF5k8eBlRdhsvXElTOuMCRtKNSeNRdmnzYr5WSCkNsCMu31fYZkg0UImOkJmNKtaXno8rVFSpRz27aIFJbzBTJ9o7PGa"); yield return (HashHigh: 0xe57cc891e1b83d08UL, HashLow: 0x061be75c4be74698UL, Seed: 0x0000000000000afaL, Ascii: "CixcGldVkzXHsgO9NFfeEtr7uJAIyby5k2HTskxIkjbOL4mirmkUlcy5lrzRuhGJFpzEYfAutGqKGAYdnx9UkhApx5eDMzEYRG5b"); yield return (HashHigh: 0x3f4e7825ae54c76dUL, HashLow: 0x249d3ca32369e8e7UL, Seed: 0x0000000000000f93L, Ascii: "VJ2gEMmhpR0G2oN1nuX9wvYKu2e9cWenEgN3KQOk2Lp91TzB1T2gJTVgzH5HV3jR02rXLsVjHGCsPer4tzru56uUk3LVLsGWZ14gO"); yield return (HashHigh: 0x13c9c11bb14919a0UL, HashLow: 0x92e08401f58b3473UL, Seed: 0x00000000000012f6L, Ascii: "M8zzd22RD965pkcs1LVUciCYntDxLPJqlUB6S6mpCfkB2qAvrVA80oMMYHFKk8DkiKZIqJzKz48mdkZDES48Q1m3NIFRWWdqewFmL"); yield return (HashHigh: 0x4f4f17302f31347dUL, HashLow: 0xab71555ecd316796UL, Seed: 0x000000000000191eL, Ascii: "4j4ol2DDiy5k4o1zbXj2dDJwsh4d9uL3MiWkDtwiHMrM2lDoE1HuGCG5nuL90ZTzeVvD3VMAYa1qTTFBaT8ksK0aLbyJg13zhO3VN"); yield return (HashHigh: 0x9814f312e4091a78UL, HashLow: 0x4802c28390d48c3fUL, Seed: 0x000000000000118cL, Ascii: "2MCeN6Wy4zmwOjfQVMqcfO0kMtiVN3wsYBolyqurxKLHDkHkzVUfNBu7xcvxOkoIjMymYvd0O0YODxC0fB2HIqwm3JGYODHAkgkdg"); yield return (HashHigh: 0xb8e217d54ceb3a0eUL, HashLow: 0xd67a7d64e145587cUL, Seed: 0x00c8c7ed5cb31073L, Ascii: "dNpfYJyD1cl3a7bTG1S7GBtBnOFTsZgbk74LrZlcwmBP09aLuW5CeYaFHVKAAken0PyXel7YFNLPTUiz8KVgMffK2mWux6dHcqYqGh"); yield return (HashHigh: 0xf68f689237610442UL, HashLow: 0x1b83ce753d0b66cfUL, Seed: 0x00000000000017c1L, Ascii: "dv2CvYIaluVrrg2Qpa9sUipj9yD6VmOhp21RA6XDibYrrnOFvIlIeG1IbVj1I9AGMsfQQHtXxBat3RTz33akQ1WEtimP3dp2n6l58g"); yield return (HashHigh: 0xabaacc0702860bf7UL, HashLow: 0x8a1b6766f5140adaUL, Seed: 0x0000000000000000L, Ascii: "vRnEYJ42n6Lb8vaIhDfQQBgs15GstAYyqb1K1JKBPr4dfgjWxDxHgxThFgASYVtkNBaqnJRlSo8bLQHNbrPHj6sE4KcPwa9IrrSLPs"); yield return (HashHigh: 0x6510e895634870eaUL, HashLow: 0xcc8cc9af1e246147UL, Seed: 0x13a1b6117c92c32aL, Ascii: "konuMUTcPb4YcE8rPUlrBKyQs3VyhESFAKajW61QircmO1PZSylIAsN7Rydpmixc2VAhOVoRrwjJMLFN6OynVC0eJA08YcatYivyq8"); yield return (HashHigh: 0x7c70072fc7af32ecUL, HashLow: 0xe1a25b6589371810UL, Seed: 0x0000000000000000L, Ascii: "9at4zzJbKSkzZ7QzpC8XQBfTxNCKVfm4BNIQQJ3mXOVItuuthILZoLXv063v16nUkwAbZ35IhCHtDISPaaqyN3BvkduXr8A8JIKnicQ"); yield return (HashHigh: 0xe8aba689e6cd28ecUL, HashLow: 0x218e40cb19957a5bUL, Seed: 0x00000000000018ecL, Ascii: "Tq05bClJTAUlpR1BybMz0tR8O8Qba1tK5riABfzBzw3jYJUrngZD5n0cOWax4pNn6aBFAnfATk2N20lOlJ6Pl1wnbV2LPcCG0fliz44"); yield return (HashHigh: 0x372ce5c8309dea41UL, HashLow: 0xde56a9c0a9efa432UL, Seed: 0x0000000000002702L, Ascii: "RDtQGbzGx5lMpq5BRzZS3LRw6SyG94SVcWAiAHcP8zxwKAmI7AL4styZHcFDV8wEBVbWj5i74QFitVpmXJ6qMwtpZ6X91zz6Sg7zYv4"); yield return (HashHigh: 0xddc317722ef9b5d0UL, HashLow: 0xf1030fba877928ecUL, Seed: 0x430c6bfa730ca3acL, Ascii: "wcmuStaaAqHZT55kNk0cPMn6Ss4bfZqrNljRvHTWLdJdPpnJVp3NvumEQnyDjUk7w4XDMWZnijh7eSDRQvXBkKCb1OjmJhqJzIuzWLQ"); yield return (HashHigh: 0x10908ac52ff79b15UL, HashLow: 0x84a7bbf319f164dcUL, Seed: 0x0000000000000000L, Ascii: "4NV18d9gEA2fWXahWTEpIHIm2yvtgzALIxerEHBdgdw0OqLFTmh8OCws89kcUhqn76dgvTNKKO3Vez3GMjy5wfvXsR6sMbv1mQoPAv1w"); yield return (HashHigh: 0x44d000dd10a3f02dUL, HashLow: 0xc1b52516ea38c03dUL, Seed: 0x0000000000000000L, Ascii: "NA1JBZi1MP272ObONjM8pPiSEgpjV1CKdr2cQctD2KMCKH7BwhJPubNEfOnI4UZ5gRSywtYE7VIcz35Q6ptCEHzieGQguFxtYTRM5HwH"); yield return (HashHigh: 0x560771a9ad57f3e1UL, HashLow: 0x1b5e7435e2199c15UL, Seed: 0x000000000000012dL, Ascii: "lah5ogTyrmN1wV3Sk2RCYngrQ0eaHQHij9G7yaLSkF4ccmvBqlEPAyGJUZfnb47Ur1qKLhCnpsX7beYb9VtDTrjUmRaUWVtpEBLoOHs1"); yield return (HashHigh: 0x70e331007fd1f062UL, HashLow: 0x6978dd32c09db54eUL, Seed: 0x000000000000021eL, Ascii: "c7jOJNcVq66FO6Zsa3lijt1DzXFlH9Vq6IImFxw9fILZRhoyUt4baGcO6BwB1HoPBgimCNB4mcUzTdB8IzmUPCnlds03TsT0NUx2SeMf"); yield return (HashHigh: 0x50bfc7008737b47cUL, HashLow: 0x76251a2d0110b303UL, Seed: 0x125e614646dae5a6L, Ascii: "VUqqX9d4m02E3ZrqFVjjYEYUQWTb5nyICzCBehfzYujhDz8enZhbuqOl6aEf6LLlmqVKT7oDLi7rgQX4ov5LMEmROFNkOTUICQ437uzUk"); yield return (HashHigh: 0xe4a707bbaeee8af1UL, HashLow: 0xace8c42503de33c5UL, Seed: 0x0000000000001183L, Ascii: "wEy7HTHaOEMIqhXWHC06r3D7GbWfEDtLspXQXf24nzuLegqU7fbLogdbtMwwnO9oMpVMLM2gAN0MrwNs5jNzTI9C5gEghpDXjgvb1SnB7"); yield return (HashHigh: 0x2d99ddbd77a97bc8UL, HashLow: 0xe57bffaf201a8d8fUL, Seed: 0x0000000000000a65L, Ascii: "BTgr0thLDUNJWUHBpLNclyIGUK3wFqtAjV5qRIA2Tis26GOpS9daJCSAmSAnNtINFXPqQyXud7Yvk0oyZMaFvLWI1h8i7FT7sHq74jLho"); yield return (HashHigh: 0x1aca5bef7e7d808cUL, HashLow: 0xc8905111d46f9407UL, Seed: 0x0000000000000000L, Ascii: "6MUY5w78z1s4HJSrSHxYbsssWba85V4dHlw4m6BIovgyRF1kcPcAcrptVplsZ1QxTsWqJcTaJluJuT10ErL3LWVbRq7E0kSiSkXuxU7yy"); yield return (HashHigh: 0x3fe97784ecd32e9aUL, HashLow: 0xaea94129a9ae369cUL, Seed: 0x0000000000001764L, Ascii: "mrcfUdgjly8Q3Hozf82396puLhdh6rPb9YR7YYehjKgzzlaacbUkCNPEl9SZJ4nyhM1F3EqkQgrFspmF1olnGhYqErbk6Td6Hjq4X7ukZP"); yield return (HashHigh: 0x17e04ad99fc6738fUL, HashLow: 0x25c7608e13e68e23UL, Seed: 0x000000000000115dL, Ascii: "Bem3uWWi7UrkICxMyg5QjHRfiEK2MEeLyhRi8BE6EtZFMYCJdCJ0ISICUKjaS5OPOifKFMVUE4eWQ7rJ44neh6oKSYJaweeaV9Xt5q91o7"); yield return (HashHigh: 0x9b302c19f131298bUL, HashLow: 0xe502d01285583be6UL, Seed: 0x0c82a4507bdb4368L, Ascii: "Ws5KhyfRqtoo1z2eNAWJlIafgLV3QD0D06MRISpT8eIUNLkzJ37ZhYbXS5LkAAWidw4cKrJFIT7vRy70ugveCvEDlBZxds31ZkgGDmyaHT"); yield return (HashHigh: 0x4c08da5b3c91ffaaUL, HashLow: 0xfc172275b297a708UL, Seed: 0x0000000000001610L, Ascii: "ttvDZ7Y7FO1cbhVVL4qAYBJ9gfvjTvTdk3e4nbLVKtfnINNRPZgcw9psemLB1mdE4M4rh3LzSfQ8atHh8Zrbymsyxn2yw5hzq7uvSmBKgN"); yield return (HashHigh: 0xb45b4b8c492e3e3cUL, HashLow: 0x64bcb441802577f2UL, Seed: 0x000000000000186cL, Ascii: "m1v6gn9c24FcnmfrDUirtQnKMbI3aVrGwks3P7mE6lUpYgEkRrlJde46plOPzqMC67JBfwvbGYNdtXSZdGEJ4RLUeG9YAfjbSXO1p2vqYHn"); yield return (HashHigh: 0x380509810789dae0UL, HashLow: 0xee75ee0cfe44e7adUL, Seed: 0x06432474765b54a0L, Ascii: "Q4YVo8pphP5tR2lRq0hUuV5x3DU7uSUcdENYNYtb7rGVnqkrK5sNjbYawVWMDIDwMXslrl8UMM0WIXh1L1vO3uV12nwixlrfv3e8O8N0PxJ"); yield return (HashHigh: 0x60d628f1ea9c3f89UL, HashLow: 0x48ccadcfca1078cfUL, Seed: 0x0000000000001648L, Ascii: "ynkXthgDExjk58lj18xS52kRMXRza6m2Ef3fI2yWa1Zsttg5jPVVrbdwO2L3JM04fGX4rBkjPnhlYiTBTMLTLk1XSgrBicNa45yPTijloTU"); yield return (HashHigh: 0x82ad4448c0e8b50eUL, HashLow: 0x501cfe3720c9bcb0UL, Seed: 0x000000000000088aL, Ascii: "Mbm2N6Ql3AcvccjzCM5JJcqPiqbJwBAJbfLpdmUtvY6GFoHGhlOoY6DABNDWmB2c8bsEIKdDlqyknbrLzqJny0MksQMv1N7tGqZrrfKx7bE"); yield return (HashHigh: 0x41340ae885ffeb94UL, HashLow: 0xb0e62ecf3fd4acdcUL, Seed: 0x0000000000000000L, Ascii: "ilbYweKSYLsZjZ396Qms3bqxt3uPshmTRvvHmGF4Bw2pAFbtoErKRdZTGUGh0ZNi5X0MsU8zGBVUo6JvsYMx5hnFfurjcobbaXjAgI0hk4gW"); yield return (HashHigh: 0x8cb6abab60599871UL, HashLow: 0x7b70dcba2913456aUL, Seed: 0x0000000000000537L, Ascii: "S6X5lplz4f0v4fyu9ZfZzWhDknI945mHyW4yI7lSwJRjdc5drcIqHSKQutfVpVAEBJ83uAl9X8JELAQBstSOXkYTg0nB215XYZeGv9LYmYRu"); yield return (HashHigh: 0x2c02be06641086dbUL, HashLow: 0xc8677db5a5d9140fUL, Seed: 0x0000000000001514L, Ascii: "DZVFRcVzfvRveuyKN4KwzoEflsy0ejkjY1VeMsnd54920VkRdnP8sLeue0LxNPRjOqeCPdperH6wCfQiuEGXsZK1nCdc4eB193GwL40FrUUr"); yield return (HashHigh: 0xc15c142ddd90905aUL, HashLow: 0xcc299831ee08ff04UL, Seed: 0x2aa91d47fa101199L, Ascii: "545eAVBh4b7h8aehQQEg1dLzfuxwMUWHyaIWVGcIu5BAvfPq7SKZDTvcZwuI6TyJCXQDw6U5Rj6DSHD0UOdEKfsQdnFfu4biL2sJF9PLboRZ"); yield return (HashHigh: 0x72d91bb5844a33e4UL, HashLow: 0xc56622f95c09c99aUL, Seed: 0x0000000000001cb4L, Ascii: "7g7zhlNtdOEzZU1fed9IlHXbHhucy1rr2SCXnDs4tqAJK8x4aOVICZnFGRkICrQp7AFVY2LnYEttVsr95qnh8Z7fzpUlvEkLOPpPXLx4y7fih"); yield return (HashHigh: 0xaad41aacd138ce6fUL, HashLow: 0xbfcf77e37bdad3e7UL, Seed: 0x0000000000001a3dL, Ascii: "dxcMi9u4rCVHP33GxxszNRHc3ZrHRHfAdHCuLlNkrwNqcAHY571SEeNtywxxMLz5RRt0UDWQcUBoOoHDgHFTt60B372nKOIYgwk8lVETPJ5Nd"); yield return (HashHigh: 0x3448cf1a86af7c03UL, HashLow: 0x119760edc0c27736UL, Seed: 0x0000000000000901L, Ascii: "aajuMfDbNWoyon6w0jFUp5tBkzzxJolEMVPcQLGL61OjH5IVlxLcC9c9FCXS4B8GUIRFlB0WCgHZ7frwBKSAiruI4mi2VBhmSu2KC4paVBSPj"); yield return (HashHigh: 0x7d905412f0c138daUL, HashLow: 0x018b66bcb9cc141dUL, Seed: 0x27a315498513d45dL, Ascii: "HG0QpHMCdIRTDLZ9ZWWyCrbpRNPibPTr0I0Tsg9ghDLIp5thiynBVmdxOrf27XA3n6YWHWEXNgarBNXJKethif5911W8ltsfDPoHTku3soCHz"); yield return (HashHigh: 0x8122292c9d03f826UL, HashLow: 0xf61f1f260bd2a6d4UL, Seed: 0x0000000000000966L, Ascii: "7JWbki9hlTEOHarwjE9nxy9f4XEp2rdxNnm2LannA48ZYsvuc2ROx9cEMJXSmVfgiUDWCYkdRKb0G4Jati75y5u4xs9J9Mtl9c7bzFvwNm4YrF"); yield return (HashHigh: 0x99b66dd905f680a3UL, HashLow: 0x1f8a9d7b956cc152UL, Seed: 0x00000000000009d5L, Ascii: "l8hv8CxLrilgAOYRQoWzTeyA7AcDE3rp8rbW00GwdrTgBHA0xr1gGdvtQhfWEvkdHrJunoHhQzl2mjTwOZWqCiQyaJqLoCFOnDIJk2ZYmOVLKt"); yield return (HashHigh: 0x6e87914ed1b4fb06UL, HashLow: 0x14b7694119ad2251UL, Seed: 0x4a7ce3b9fd7be6f9L, Ascii: "jRMZhON2Jod0b5Eate6ICumrjHrrveYzKyqjlodKS8cGP4y8x7YXs688roH6JcmsCZBT6tDmteF6kCaQTqGgF7cb1O9XpknH1kqa7jV6TaHYav"); yield return (HashHigh: 0x9a97b4553334e600UL, HashLow: 0xa76c9193c8f68244UL, Seed: 0x0000000000000211L, Ascii: "SemvpZAtfvyZ6eMvyWnLy7mRF77zttNn0rd1jv3lo9dEHcaCNdZsKMs2p70EtPokO0GR8gESY2wCUAiJuumvaObDz3XXABc3UKVMjHVxBA97GJ"); yield return (HashHigh: 0x18cc4088bf3fdbb0UL, HashLow: 0x4ca210caf0f46016UL, Seed: 0x00000000000025aaL, Ascii: "Zg5R4Ht8dmz3Tc5WHr1Rk2ObqEmfxFyfRW88nuLstcddmAzqMbswIDUWQkP6Fiwhp5LHE7y2q73ibaZgyILICNu00a6UARbEJjws3MtYjPGO4o1"); yield return (HashHigh: 0xd931bc822470a14fUL, HashLow: 0x610fbd7714f3369aUL, Seed: 0x0000000000001c8aL, Ascii: "uxS3iI0HXjLRuGbFQQrouJfQ9g0POnrQdxeO0Fo5Os9vpsMbrbFuuOS051HilwLGi5bIxGIvdO5qcV1omPywnSMgz1FCFhnQGcWov98gVkoWYDz"); yield return (HashHigh: 0x0a5f3b47812bbc8eUL, HashLow: 0x0addd83fd46fde45UL, Seed: 0x00000000000017ddL, Ascii: "5ELV3bT55nI5e39OaEHYw4tukRZRQg5wKhvGvJAV4r2GOFKpyg13UmrFVzBEfapjOsUeiY4jNFhlU8a4kKhHoxqPwl5OfyaUsxLYNPBXvewFZzD"); yield return (HashHigh: 0xcf9337d403f5e324UL, HashLow: 0x5cb562eb2f281bf8UL, Seed: 0x28575846a38e23a0L, Ascii: "TmnJlRfYqwg7y8zX4aRywJF4lhL6zdVJBUWbAXwZXhEzTgkHfd8eOehqKZ7sbwpzGIBjaAcRRGPOzXTlsudNUhFKQiPEbEy31oEjtPDkaAp4DNU"); yield return (HashHigh: 0xcb2c95779b1890e7UL, HashLow: 0xcf35783ab9a81261UL, Seed: 0x0000000000000000L, Ascii: "y7mSkgmgATyI6RrBQiwinhZOGEyNq4gDPtMIfauXlKv7nOgdkXo8nygfTbkiedQzxC5rYO7Q224tQdX3pHIOYa1uhjAIEfIAKu2AFIMO0zJObPZn"); yield return (HashHigh: 0x06301baa975486a1UL, HashLow: 0x116026a1589ab849UL, Seed: 0x0000000000001733L, Ascii: "kvpSpqD7jHbHTlP9jZ73lSxfaFPUR06eWj9YuKOEuURLkqOEzlKRtNtlehWOqHBRvN5Ja8Ndrx65sBoHqiB0vP8vw3W9hM9FiKsRXSyVziJdMtf1"); yield return (HashHigh: 0xc8f8ccbcfe60ed24UL, HashLow: 0x7d3182eae3cd1eccUL, Seed: 0x000000000000117cL, Ascii: "ACvVLJN4YvbvrWlIBkloqpy0sEgxiXWyO4bkk2DdWG1sZ5fQZurYRjEIPHCRwNkMZSBoPzdSoFqyS3nMDAb5roZhCIA4LHNk4NqpywMI3eaBrqc3"); yield return (HashHigh: 0x20ced5dffc826629UL, HashLow: 0x5907de8887e36397UL, Seed: 0x00000000000004fdL, Ascii: "JcvgEjRAnVnbr3vargAeaaBNli2QIDEWyo2jqLhB8c8vzALUYqqnkJh7dmW5fky6x8NL6hUFtAJ7kxVc8wOtlOjpZWqM8z3OWD35xmih3RW9e3PW"); yield return (HashHigh: 0x9e7a47f5585bdaafUL, HashLow: 0x6eb06ce894224820UL, Seed: 0x0000000000000000L, Ascii: "1osqpwzvEYMXBhwDCKUPlSjMVRW2qy8AKv6Hp9PugG0cLhwUztcjrEb506Bm6UPmS8i4icbB8xhu92MT9hff9xuLKKZg2qkEgDWm5PILwVpT9E8KJ"); yield return (HashHigh: 0x9c97f2a877498fafUL, HashLow: 0x191f0cd801043dd4UL, Seed: 0x0000000000001457L, Ascii: "sbkapE0QobFzNZ0QWsj1cMmPoGT7QGOUzoMDpgmwLkF9MsfnPT8GStThbxRaHsDr64pQ7vfdpDzylFP604F1aH6S2CGT51FdUKrdJ3BLMsd7B1eoJ"); yield return (HashHigh: 0x9bb011a041c5ddc6UL, HashLow: 0x81d47d82578aa8e0UL, Seed: 0x1f9194b29973d7c9L, Ascii: "hf3UyHA316qMnV3ZWvZYKjmdaCgv8mNkqICISTU5S9AnuN8r68HrMrrY8nUSQ631LdpF1mfxP88I4uienZJNhaOOzfB5s20JexuxlRyLu6pUDqHRi"); yield return (HashHigh: 0x317b7c14373d61f1UL, HashLow: 0xb54071818147144dUL, Seed: 0x0000000000000000L, Ascii: "Mb1fTHyhvQNuCur14DwDIPky7QP9kdi9AUEcqJTeGbShRh1Qf2AB36QPbQe17mKzmfeNun1qisQzu2Y8YI4dlw44TFh0otAltgRHe6EKemPhRxUk5"); yield return (HashHigh: 0x24c43b5308fb36c0UL, HashLow: 0xfa21ae3fc5a23575UL, Seed: 0x00000000000013bcL, Ascii: "suvm9A69ZT4fDwAv8bb5qSoRq4wdLW0RQLgM6wNjzqSl3eeaIcPfk2jQy5wsyub23Vvqxp30cSxrzV1jECsTBYt9HGr7CQSssF4WtAJR1TzxsTZVBo"); yield return (HashHigh: 0xff8c1f3f2b523a3eUL, HashLow: 0x69bfe72c96a9974eUL, Seed: 0x0000000000002688L, Ascii: "LTioJY66DooZXeELJKOZIOM94DnJS3xNqNT28mm6QofQTPIal2TtE188cOD5MxeUaMPxhnmb0MNfqybyp81ighJzODQzwH6LFlky3dObQ6ooeX6WQW"); yield return (HashHigh: 0x812d7846bd90b4e7UL, HashLow: 0xe781cd1cbe09d441UL, Seed: 0x7ddd0fea86fc4155L, Ascii: "PiRkx5zRiTzKmFEnS5CdpKiVR8BR7MC8SLdsJoUztXAprDJ9WSJ8i7SdEq0W6vZarlUWGux0b7eM7V7ioMGDxIDUkyYQLgJIdB2Biv9rXjbP9OT32s"); yield return (HashHigh: 0x4223696d0e2672caUL, HashLow: 0x6e193da844cc6e52UL, Seed: 0x0000000000000000L, Ascii: "ez4oz0YxL2Jkn22gSC8bOB3pwGxJyTZ87OGkKQ30OgnGRIWHCFiujT7iDHczTW17niBoOg1vMMYjJWvPABRNKAE0M45PbLX2cqwmdSd4vjRKM78icV"); yield return (HashHigh: 0xc2e65ad7ba26273fUL, HashLow: 0x02118ec48f85a577UL, Seed: 0x150ecd8202ec6f94L, Ascii: "CdCswqltKhXEh2cz1bslQvLDyBwBg30jJf2PXuYMHrm0ttCaBhuG91QSq2pZDNMZYycOACbaBdaqm40WBoJqxKFoWGfaIkxlcY9gngw0HVjSMHLujt1"); yield return (HashHigh: 0x70e58b10cc2066e1UL, HashLow: 0xcda27aa66d48260dUL, Seed: 0x0000000000000570L, Ascii: "J0iF4oPqTEEeQ5jwZxbBzeZtcCezbXoWuLOMdYpwA6lF3pQ4BGoKJ0aHSnwCxuWneUZFXmtM4qzCSzg4F8Cz8zncHfX8fcV36MrhxIayngvR0LzlWBH"); yield return (HashHigh: 0xab4123fd3a8d17d7UL, HashLow: 0x8c58920dd09f3a61UL, Seed: 0x0000000000000000L, Ascii: "0Q4RacmwfaS9Z7YoJZvdV5NDXk1jWA0Dh8yj2cRQhAXYTx6MVrV65doHvtcJJ7zYqHnIXLmi3WhyrMPHpVwZyTPdtqAjw4yZ5ZDcTAxqVI0CewVB3F4"); yield return (HashHigh: 0x3441e60b537c2930UL, HashLow: 0xd1b4add7a0e160f0UL, Seed: 0x00000000000001edL, Ascii: "JLMeBXM88Aoo6xrvTosLJdBkU6YYzKoNsopKfAdTxGq1EauEoOxSWQiJLNIvlFGgHmWaFaPNFjmLbq4OrKbD6lpk7mfTEcDVbNvji4yCzWDlkVQX0d4"); yield return (HashHigh: 0xca5df5c55e7735f8UL, HashLow: 0xcf623fbca2293251UL, Seed: 0x16571a16bbbcecdbL, Ascii: "uKn1dndpEJ3N2bkSfnioYt447xio5E85vu2Oyx7rPqFPq6IGfu3ldNjppkfdSjaUXkAAcEYAxDNevOl6OOZoAyizIG6DPTZuAmq9kNf8m9bzxjlfDtX1"); yield return (HashHigh: 0xc53084a9d828a845UL, HashLow: 0xadaad5a3ab0478e4UL, Seed: 0x000000000000084aL, Ascii: "lJzhKyv3xdb65vVwrdbpoS81txrDUsNRoNH5t4CgvjSLXvsrWu4iUW1LYJLZT4KldWJ34cIswprinL0ngFrcRkI3Sf1gkPSbIA1FVtctnOsPZS1y74Ov"); yield return (HashHigh: 0xce92bece84e77a8eUL, HashLow: 0xbed4b4e73a9bf60dUL, Seed: 0x51629b40fb407cdfL, Ascii: "ZJ1nQjq9SRgzB9MRmv8D2iUazO7MYBoTqppTPl0zQLVyi24brxU1BVDrqGtQbgbOXrGNugUbqngR79vUjLnN51j9rSHWbTQt96K7cMiaRbJXzhCk3SSF"); yield return (HashHigh: 0x42a6585c10c26348UL, HashLow: 0x682367dfe51063b1UL, Seed: 0x0000000000000000L, Ascii: "eggHdD0JKgUjFttO86f8m4VUzNbRchbFvC5egeOyjZPtKCIjTEYiLurYBzhMs4lbDsdUolcKKmPhZ6QNb1yDgnJKzMvU7d7oPH1MK49uWnXrLap1y2De"); yield return (HashHigh: 0xe1fcdace9a4f11b5UL, HashLow: 0xe0bb9fdf86f3eb3fUL, Seed: 0x00000000000012e3L, Ascii: "T08gMFR4dwi6dLgRYjNwJeXKCsMEy3MfEb5dtoKV7y2q1ABDOI9kEojlQZZ4pmD08k84F3tjZdVwEnzTdqdsddnrJWYhg80HeVCL7Xddr9J7DFyf5jX83"); yield return (HashHigh: 0xd24e5c49789a3cffUL, HashLow: 0x4b315e53782a882eUL, Seed: 0x0000000000001bedL, Ascii: "gxVJPhh7jsSGrEmXquVDpC8Fyl0vZv2OLeEgiN19qmbVtnobg4ZzHLRxqcvAWF0CjvMD70MzVFI49CiXDLQ5N0lpENAA1G6ZU3tr13N7GeUCh9mDKBRuV"); yield return (HashHigh: 0x794472beb410cbd0UL, HashLow: 0xd1ad2b3b4bd625e5UL, Seed: 0x0000000000000000L, Ascii: "j88XCe0gssrKv89sNDavDX3o8lo6PA9wi6PTYVm7wQLT5HUtVVf9rvx995f7BYPzuAwf1Vz9w8NvWTpqVWxRe8ODOTgPGc6Rm1qyHgJZ47nUfSSTeIceK"); yield return (HashHigh: 0xf2653634dec2891fUL, HashLow: 0x04f083373aa7f7b1UL, Seed: 0x1deb3f9bc2d7fab5L, Ascii: "dxT7avcylPgJJDwzume0GTP5OemkAhvVdMCryi5GOjimReS4wZfx3JjoJKhUPapov8DlmP3bRXoLdRfCvGnZk8AOwWtXcBOihM6FELk3PwQshwTnOjsoH"); yield return (HashHigh: 0xfd95b3a8d33be2c3UL, HashLow: 0x6eb4ab134f545685UL, Seed: 0x0000000000000000L, Ascii: "mw5M8OrwUXWPR8jYBNcyQKd74sB5OmpPdIfvG0zwbxRtJxk7Zp7mOrxI6u7Wi6H4augaat3De9MsxwEvbCXJb6OKjAalJaxh9xGgsbkf7hxRqXuWpVQJQ5"); yield return (HashHigh: 0x60b299a950aaa60fUL, HashLow: 0x804c5b8aa25e590aUL, Seed: 0x0000000000002378L, Ascii: "D3DALUgqg5sSHA7y38PHxoPYC7ZAGba87jdK165Sf3LKhk6BdKMSBRFMIbMJ39qjDTyemqfXB4ngJ0TqvJFiWmnwHrsZaUebNgTA7Ie3kXWhQEZkyYxNAX"); yield return (HashHigh: 0x7b96d76993262dadUL, HashLow: 0xb509b02cc827fb9eUL, Seed: 0x0000000000002426L, Ascii: "BW3FTDpTd0ti3BlqKR9JTywoyzEaDtZ4SpUflwMoYyPNb6NNdkWjhh478Mz5zhEQColgpTfct6YwltR5aXbOkVH0WQL6JEV20eqF28QTibW4W5YaOidIdU"); yield return (HashHigh: 0xd2599f3edd089b9cUL, HashLow: 0xd8287c5751c0df66UL, Seed: 0x00000000000022bdL, Ascii: "R95ufGUuwozutwJyHugFA1LD6LRebVMEYTRBCJX7F66FALs65ZctZkztFtuWHv6ZJK5F8GeAr83PJA9VH99WIDGxzpnJnrbRX6ac5BQBU5traRMmFnNmI5"); yield return (HashHigh: 0xa76d7f05174ed3bbUL, HashLow: 0xb1b82a26ab1e0d73UL, Seed: 0x0000000000001b08L, Ascii: "fa9PFmPkwourA0w8kgqtYOC4pzLZpmRZupeJQ3zxpqizARB9zDTxyIcaKJhzdEYDzR9D2f6sHDevG5RwSOuiw3bRRsHztjIvfBtentMUXB0FnvNr7cPfFUL"); yield return (HashHigh: 0x6531efc97c6b2df9UL, HashLow: 0x6d902379429f32d7UL, Seed: 0x0000000000002578L, Ascii: "nWjpSNomqnBRgLxX1XIEZOokQljYqGg47rasLRu6ik4HUDK2J33u68joIae5EKevMOWFpyEFLz0xwwWfHRk5zZOEFIhtvbRXCKVv6J1ySihD6VURmhEITAu"); yield return (HashHigh: 0xc3b5c0891e6fad69UL, HashLow: 0x4acad820be9232eaUL, Seed: 0x0000000000000000L, Ascii: "fEkGIcqyImaJ6a5XkoHR7hNfFBMQqwUiqDc2qVenrbXBRzDR6JlEXvHVrUQlpoUgLigNv20E5JB036PTL7P5cvke3cfffpfyRRpOZCmID4ah4wXgjqJZxDL"); yield return (HashHigh: 0x923d440f71770b36UL, HashLow: 0x4275da2eafa9c67dUL, Seed: 0x0000000000000000L, Ascii: "h0dmpmYdBfkDgzSMVwwgbFHztjHm3LAtmzplqJBWiyIEmvAQmDp3yOWe4r0yk3La9oQQObEurfUwjHD17jBhFh9wYdgk0K4FSzVztfUA59vPvkYMMCedcxj"); yield return (HashHigh: 0xde063fc696385f50UL, HashLow: 0x1b85374207acf59dUL, Seed: 0x6ef0b80e82afb6e6L, Ascii: "DYZbrjzRA49CJxbgbtMGholC08uAZwMx80APLGsHyAeWg4we170Y9bbvQ9ZJaOyoHMZ8Cm9npmac2moX7477HmhbSFJ9SGwrZwzM8XNFri7pW32jeiC7r0QE"); yield return (HashHigh: 0x2680082ab8ceb373UL, HashLow: 0x5db11941e47b1c9dUL, Seed: 0x22b9503c0be28addL, Ascii: "a7WZkZdJNAo8YoZSEPykILtVSKnmofkQDPKbmn3z7KV3WCRnBLY1nMzIUcmYhc9y694NwkqEfcB6gYgxWSmIVhcnb6ajl3xuWaSi4a5NTTfVXb1MJ2ZNTZOX"); yield return (HashHigh: 0xb4b1b28cc6cabafaUL, HashLow: 0xfeeb09d20ba3a6f3UL, Seed: 0x25d77c238fae0965L, Ascii: "ZVMmHy9A0KeocuovOZk1Tcdra0LYFTahBKJp1ZqBKz4S5ud0bp5SfWiFSFjU49wMYNxklCwpsqN404V3qQIhoxwPcAzk8p9Pc5LS976t0t0OaIFyVeMMD23K"); yield return (HashHigh: 0x85c9e8adcc526728UL, HashLow: 0x804d1156fc444a37UL, Seed: 0x0000000000000000L, Ascii: "Yb5xDwVr49RumOz0TTNCo9UI4g9beuUiNAXdOgtnt2Ac4e0uSPeLDb0jDz0E7shdlBaNXYQqxhk8mXuDCp2TFdFu9sAidqgx3fzFg0lV6XTxiw7quTxq4YqQ"); yield return (HashHigh: 0xfd6008f8965f9bdfUL, HashLow: 0x822bf11f7c923541UL, Seed: 0x0000000000000000L, Ascii: "2dM2EworvyZsPrddBQeV1Fy4nglGaNmb3AMx5XXdtB7JKMvWJ5FkmQK9TX5nZSsaOJ4ejodmbcXS3ouItsJyEgJDCVFye1Hsbmc9PlIvDvMMIUtM2K6tOY8Bb"); yield return (HashHigh: 0xfbf500d2b085a299UL, HashLow: 0x06ac210f151b7287UL, Seed: 0x0000000000002500L, Ascii: "SDHTckez9eTizt2778eK2avXdb8ZPXTB2DUd5TxKqmjMTIGtGI7BF2p0JlnIWYsqzd3xn8JhpmnT2oWxWy3U2bw8NbE4aHp3vBPGaaUm2xpV6yaVsTTxuKfmk"); yield return (HashHigh: 0xaeed15cf03515788UL, HashLow: 0xd96f76dd21e0b5fbUL, Seed: 0x0000000000001d58L, Ascii: "efKBPphMEfx7NKuSPiEvxsNMBR4k9ehqo2YR8HgCAK1ZMAacELKQnjr4zniqLfauvLkV3M4eYK0hWd6ITDIxCjbOkTpvNz9f4L4tjzNCP5oW8hjrZwA9PtLFk"); yield return (HashHigh: 0xf4a66dbc18cf7da5UL, HashLow: 0x3be6de4330c1fd0bUL, Seed: 0x0000000000000000L, Ascii: "LB1wzaDyYNckrwL8ZqlTzqvwYKpK1L2Su5GwqGTyE895mzsFsPmetCadr9gXd3I7eZNzqR25oMnERLrMjSTmKYxRcLDLlFwSUeE3nN1Mxh6jOSdHlpASZKhDK"); yield return (HashHigh: 0x7c57caa46a9fc2d5UL, HashLow: 0x566aac607fa0e927UL, Seed: 0x0000000000000000L, Ascii: "to0CMhNGgBNfmXsMx0db0UgVSfhwPn8kCuHbC05UOU9Pir7fwTkNS2D0WUBkk8TtlnRd4kPQa5HbAtE3sSeBYv6gOZnCfBSmzQBe84nYQLz0npj8C8P87CFnvi"); yield return (HashHigh: 0x4fa5eb93bb896b8eUL, HashLow: 0xecc32559efe61ea5UL, Seed: 0x00000000000008d2L, Ascii: "Syjto1ID4pcwx4rmLfn0nL8tFwb5rRudN4fG6PsCLp7viesuyYUFXdtC9M3QXPHz2vLhm3OboqIczqjl77PxRrc36whJ5xOvi3pepo3yZwGgjhGmlqdtBm43vv"); yield return (HashHigh: 0xd73aaac1842a7b17UL, HashLow: 0xdf8bb19cff4b4826UL, Seed: 0x0000000000000220L, Ascii: "6q6JUmGZeVs2S88i0qKiyOOqEEIm5bAJbVshthBolDkLtalZVll1O5ZT2iogZoCZkjJm5pEGaL2OCqP3hTXNznY7d1YW4jPAR6A5R50JnqPQC6it7yDl0B7rxg"); yield return (HashHigh: 0x57bbeccdba6fb24dUL, HashLow: 0x7de92607e8bc5e2bUL, Seed: 0x0000000000000000L, Ascii: "eZH1fd8pO6EDmo0o1Bmuwt22D1fZvYqLhx7PztSU5IE8HWDK7tBAijYG1gBt07Uk3AJ71WkUEkormEdLK02RsY7MYNAeM3xJatJcohbylxgaT2hGKJ4Qw16Kux"); yield return (HashHigh: 0xda27ff604be54cf4UL, HashLow: 0xefab37213621eedbUL, Seed: 0x119cc06277f49604L, Ascii: "4bUBTIsAjWzJoPYajd4sb71W9lF2zlcR1pNclTQJ9QGUQUcvLan3btn4FYEbpIJJ9tUdGC5ieQyzsuVMu51Ic76bdpkBSzPsJGPFlRUACXs6Ej3McXc7k7aJZv8"); yield return (HashHigh: 0xd2be792d16d03a58UL, HashLow: 0x478448b6662d309fUL, Seed: 0x0000000000001df1L, Ascii: "n2vm68ZfMpgFzBAwg5IJdnWppUe8y1rjtQ9j5QPAhAhqg0JviKLmq89E8GzYL7Sa23lwPgGXLfC21obN8cSKoobNMEfXlFKsxvrmfazgAKio47bLpjLp9KugkD8"); yield return (HashHigh: 0xb9166484caf99320UL, HashLow: 0x7af84bff1450cac5UL, Seed: 0x00000000000000feL, Ascii: "BPPIpwzff9njaLQhRKebBeLCJ6O3kpXA7K72KBYDERPNrhDpDXxk1a1O9f74cjxoEftOh98wFT750ZOhhBq1zlRUUDKHYofmUWzAXlpUaHLNbHo2EnQvW5xOhz0"); yield return (HashHigh: 0x8f0f4bc9fd9e8c74UL, HashLow: 0x97572819e1af79eaUL, Seed: 0x0000000000001befL, Ascii: "9PSFC6Dtq23t1AXLeyaTEXkBbXRT8haIPej07DlsEFFisvp6Bkx9lK0nNeWGF56y8Zl9XmTIyF1hOQ2wFBAW4hEvL9bjGLbznPxmxVxi5AGOK4DwB4oCpYgnXY9"); yield return (HashHigh: 0xa5ba4bc3457a1e47UL, HashLow: 0x6e07977cd679868cUL, Seed: 0x000000000000195bL, Ascii: "11rvPCNSxDfVupdWAD4cGbgX5aTY4vtgtY0pgZAoKDL4GNXtidM2QOIfRSQbGriGyYyce6HEb0kqrXU3CAjBKlkz995WXc3iCidZQGDCGtJMvlxpaCYYOao106UU"); yield return (HashHigh: 0x421ed48dda1db2a1UL, HashLow: 0xcf3e570f5979bab8UL, Seed: 0x0000000000000000L, Ascii: "kh5Yj9RxyD2LupLfmbE2ohuldqEEqIZaQ1brSKZcDPuh7OFGA6rOVS78CwPyPKh1EB2U0JZpkiqXXRoZQX1y6nGQZBgXj6FlF7cSJEE58TuRv47ECFvlKwioRN2N"); yield return (HashHigh: 0xf8732516ab6a77f6UL, HashLow: 0x946283a0f9c6c92bUL, Seed: 0x0000000000000c7aL, Ascii: "sy8HXdhWMyH6zELpNiBlFOVKcoisLkAwK3Vs2wMsvIihYwKCdrgP1SLYQ9VcTr9qjPdJllZ7KwDG7AzW1i6d4eUHlNhNHaCTqD4DqzMCnL4g4ObPAEFNMu5hES2F"); yield return (HashHigh: 0x8eb142b851a11cc9UL, HashLow: 0xf734723bd77a90daUL, Seed: 0x6e791466d1b71ecfL, Ascii: "GVbT6QpqMbG6CD5PkyXhhgb2pj38HYJ3leVQhwRkuGuBjtGpBxKmLTfDCUZ4UcUPvR8pGW5ARTcYVWKqklFQ5R0pK0gDsLCurNBeeH8DPJmpK1XwZwRbL075ICfP"); yield return (HashHigh: 0xe2b63d3130c2cdb9UL, HashLow: 0x490d423b611644f8UL, Seed: 0x0000000000002009L, Ascii: "ID04vto7CdUYgg14K0WbVzHmCas3lw1adGRN4UWp6llYwReFUI0xjOyOU4Nuf5r3iGuOWcmj0R8njVApDh0Xyn0s9af7yWRwBP06UsJOAFpSIaXjuGt9axkZX5ZFt"); yield return (HashHigh: 0x0be651e910df272eUL, HashLow: 0xcd92ec687c41738fUL, Seed: 0x00000000000016adL, Ascii: "yicaI21xPFetRXBMXg048VnQ2B4ojMHQka58NDzE4PTKkmaOf0D2yGOb5kxbSLgqD7FBJCNPhXaUn04kcZOpJjgWLKhKkE93SeOgMq08038CrWlOAXCOBGbam69SF"); yield return (HashHigh: 0xfb994721deb39aa3UL, HashLow: 0xff474b99c52b1a29UL, Seed: 0x000000000000110dL, Ascii: "aN36fVjiCSVWe4rhyn40Yn9uHRo6sfVNJCKz6vDLX41mdZg4H0LbCerAxI189qQGElgXzLEFO1uaUFT7OIhxmPO8v8XiH3eSk0nCHrzVHuBOwr4dNje4Zvd8IAPLv"); yield return (HashHigh: 0x04db90bb35509330UL, HashLow: 0x2df49cfc5e66971fUL, Seed: 0x00000000000011f1L, Ascii: "WSObRIFudcaaiIma8jovld92hz8yf1isyIefqjV1DPWsdb2Mb0sbyBCXIciTdRMbMXdO6CTF7jjPhZ83qqLRngpWv5l2Yqm1Owy3EqVFgktelIxnDnoTVho9NGOD1"); yield return (HashHigh: 0x6de7d0074f94bccbUL, HashLow: 0x42e85be151993721UL, Seed: 0x000000000000213bL, Ascii: "jDPUahItRlZneDoujRspI55yhCATOZbRMzp0sZwmMshcE84vugA4inws20JIeWSZSYcPqGNvwGqa6Ygzv6sZYS6eMEOwtLKuz93nb48uBhay2aWtMPdNuRxmzZaUBu"); yield return (HashHigh: 0xa2584b5745534643UL, HashLow: 0xa88bbc1b7d1737c4UL, Seed: 0x0000000000000000L, Ascii: "kuVv7vsS9fsPOCZgTVeeYMJAumM3XuGdLwd13XhqOgNqGeLpcdgugmwtNyijl41CtQROLCx8to8nzvocNUeATjUfu3puYiZxyHmSsupADY8iQbMtpKUCAL5dm88WML"); yield return (HashHigh: 0x59d34b5a643a793aUL, HashLow: 0x0daf1f6bdf9a166aUL, Seed: 0x7541e104150588ddL, Ascii: "7mJOM91tJRrFgnTzxpXD3A1fRWj9unBPhs60v2F6FqWB57sUWFJc7N6UG0WKnVVfVuWVD3L28GwguQMi1Fvw1GtoZToXiTsvpcnRqFeTVNp5eSrYHMHHBiF54qoCD6"); yield return (HashHigh: 0xf11522ddb1bc96c9UL, HashLow: 0xe4269cdcbd2d6424UL, Seed: 0x0000000000001f1bL, Ascii: "yYEfhCPqNBZFil1tkG12vU3882dn9YL8HiAlvwmM80K6OVUWveM9MNBM0Nkgp3RfsXSR6Tz9V6vCnXwjrabwJ6xGPJTqz2ApkoJWN6cs1jKp4y2m0RoR15LsSLupUp"); yield return (HashHigh: 0xd287daf1c8212cb0UL, HashLow: 0x223172e1bb0fc548UL, Seed: 0x0000000000001fbcL, Ascii: "jbLVx0sDosYXshOWv1Qh0mQTfxenkKM0puoQSTg0Y0ur3UzB846mgGj6dqIG5pgMCs30I1VYYDTBMfuBQ9JejRkvcKQ33lDDtOQDQRJjNm6GcnFhXAhoCK4PVAdIWy4"); yield return (HashHigh: 0x733aa04ac5adb3a1UL, HashLow: 0x3e5e4267e0a59d46UL, Seed: 0x282bbf957aa4124bL, Ascii: "Iii5uebDxGwxHV6VURGxShQkPPcBfZgJTT1L2hQuoGyNfhmSm8oVPKce9APyZdnRuDpcjfmhyIgbCxEbxgxyl6HH2BXdGxTzJaCGsJGeiBquN6aahfkaE5xItLcMLds"); yield return (HashHigh: 0x50fa41e2e6d42047UL, HashLow: 0x0f4c763efe3f92e4UL, Seed: 0x0000000000001da5L, Ascii: "1J8qWDXA1bTBa0zp81ZCm0gAG4OvOGKlK3sHCmDCBNJvE45oYhnw9uVI54Kqz5OazJIHpqSvMQ3UnQccSyjszKe9olSUukOEEzS6NOHQreuuDseYzQApdf2rkV2M0LZ"); yield return (HashHigh: 0x88f31dece924dac6UL, HashLow: 0x7e691713defac1d6UL, Seed: 0x4e0078473dd91e60L, Ascii: "vJ75E3w5rzh5rpH7GP83uzRRIkx0mFuBOUjDnQfsXcjHIc4FVId4CjFRBXMtNDW3K6iNwgM9kWapyxMQj5WXfOk9zcxpANSdizfvliKn9J9c4L1jdiFL5pZeNkmHkXp"); yield return (HashHigh: 0xdb8a765db1353d02UL, HashLow: 0x5e12382e881064f7UL, Seed: 0x00000000000024dfL, Ascii: "60vnJXQlyQfa1Ab3P5PHfLbq3uN7ZJ3lN7Wr1jEFweUHKIBbQbvmfoRtxFlEpkJF3BSX05Mcw0s4acFNBeiScjKyd91eICkXmCbqN0jME8gyu73qBUN5lvP3mLMDY7W2"); yield return (HashHigh: 0x473464459a871ff6UL, HashLow: 0xef53b38ba91a93b0UL, Seed: 0x414a0e4285faeb0bL, Ascii: "0oXm4Ua8BSFugTc0jjJP7qqgKqqmAM5pjKx0fH1lsN5JOoUWwlSkpjiXDpWUWcakDbLN5HnomU7pfKLfGu4jVZCOdLs8IhkCm6KtidMd6VpvE3rveNgput5Wl15SnJxG"); yield return (HashHigh: 0xb91f001c9a9f6eebUL, HashLow: 0x647a8e09af8e7ffeUL, Seed: 0x000000000000258dL, Ascii: "rDbjGANGnoqP1OyE1jS2Nh9u2jCe3I2aylK9AxrwWrX9eWeZktCCM1zHEWZyy3nkayGTMlZYrPUz3BV8aXmzH08XVJq9CONAa3gGInx8ul2oukX7gMVzn6HIktSVlrnf"); yield return (HashHigh: 0x2491a7aa1060c4e1UL, HashLow: 0xdba0d6922f30bd0fUL, Seed: 0x0000000000000719L, Ascii: "Vb9DqE75q7FoDNwXC5z7JXv8MClHWVlP46ZM2DEpcnESepjjCoPc3A0SB3sdD5Qf5WFVZZD5eMK3d72wIatzLikDYdAkjGB2TBYELWnh9sbn1Ei9neg1wTkMj3CGM1a7"); yield return (HashHigh: 0xba597cb8756e411aUL, HashLow: 0xa7723549559c62ecUL, Seed: 0x0000000000001b1dL, Ascii: "uqMPHc9Ks7bAPG6zdpkbSjcqkVXzOGBSyBXTvbzQlpdQ6Zv362rdkRlzBIbV7nPyLOGutx6Q4YD2wksGcsC6GapRBMT5QOQq3Vt6NkobpxENMG3anX1cChirvogNtnej8"); yield return (HashHigh: 0x52a03823ed51021cUL, HashLow: 0xce6bd016f92cfee6UL, Seed: 0x54cca3d4fa3790bcL, Ascii: "9MR7gE7doHNszhTm9YvMpUSOYiQL98mr6xXzYLVVDxzFT0jG5Xpy0n52wk62MwX6uIOY7NzoZzJrQeoyUPOX0qrfYSCiSgDmgs62yJkZLPKYHW671T9JHEzKtyZ08l9Ev3"); yield return (HashHigh: 0xa2fbc68b28ca3619UL, HashLow: 0x919887092bbc53e9UL, Seed: 0x0000000000000000L, Ascii: "U4MVPYsUfMzMZLh1554Kp8ro4m0CYRTG581ZSciQVu4pkps8pL3mrGW11rBxqWq1QAG2IjmYMpj3jYhIbFFNT8Ni0rIgGBtk8R6cS35Dy4NIlzPZZ3VeSNka3YbQH2JsQI"); yield return (HashHigh: 0xd154e0ac11923be9UL, HashLow: 0x3452adce55076408UL, Seed: 0x0000000000000000L, Ascii: "9nN4HswXHi16IpInViwg08zARLQWPteDT7PGZ8rEm7jAxT6m1tjIfbOQWy3hBtg6QXGFpj0qKjUvdEmeGgN12hrI5eZMxQTZsbTIPpo1iNxkawtpeQFj8y7gfSgz1vZPPwP"); yield return (HashHigh: 0x7bf8e4aca0875fcfUL, HashLow: 0x94cf2d90c2727cb3UL, Seed: 0x00000000000003eeL, Ascii: "OG3H6jQJUMEKuS6ScLLdUEKaOl7CAKC7wRrzyvFQJPl5kSTYtFzycrybLpLwRoQ3LSPEHWQtvnVA8vDoSaAc7qEo4CO4e1FvQ3gmAQps2FtPq8GG9q95S30uCHJwVuUSaiW"); yield return (HashHigh: 0x45501ce0ea80325aUL, HashLow: 0xafdadb344df80b9dUL, Seed: 0x0000000000000000L, Ascii: "gPdhSSq4nip27S7b4skjCs3Rvu7oKnzUY5IIpMEDYomFC7QhpRlRqBEJcllvmhtsSBZHe9T7VktR4zRpilfa9DSj4EiyDrBpEX2eYqAAuzvgh9XAZ1S8L09Ua6YyddvEocO"); yield return (HashHigh: 0x2445bf5ea33092e7UL, HashLow: 0x2477a33bc4271565UL, Seed: 0x00000000000020daL, Ascii: "jmiaRf4pl6y5mvJCawW9V8coo1w5P47Z7kLL6SqTnnX87gEAZA6V4lBmVyMxZmGHI19aFVCOXTvimQjpgyMZ0sKriuhdbO0IwR7pjln2RfZwOExrNAzcCiEHnEPKzMt7yQ2"); yield return (HashHigh: 0xd0099560495820b3UL, HashLow: 0xd52b949f8e2e41d7UL, Seed: 0x00000000000011fcL, Ascii: "3NRVB5oUvOnIHozic5qU9QUQn9tGPz3F3A7ziKLusgsABEx3Q0UbnUjoiSURpumSCdjksxSE2Xbu4v5LRLsimqYSivFcmgia9j006UtTeANVrqZHo0PvwhI7wHfCZUM3fasY"); yield return (HashHigh: 0x76ca93a810156068UL, HashLow: 0x3f833e46f7fc9592UL, Seed: 0x0000000000000000L, Ascii: "16U0mZVdknAxLjDYnszfD6Wl5VJaS1hq3e3riTqyHibOSueGwXi4Chv3cdlyeUOUjpHTjRrSa7akVQM7VzQ6I8waMVpt4ndYDyiwx9Wqivsec3qQak9h8EawBbKVpA1LIYvk"); yield return (HashHigh: 0xba6e4dd8414b5c2cUL, HashLow: 0xcd4d7ec3a0bde018UL, Seed: 0x1f8d4a4ce16cd022L, Ascii: "WfPOMwQe8Yc0pW4Lzvijp4M6ySmHzteHVAgeTq01IMD8kyEZQPLq9tEmuiHM6WHDSf8ML9IVorqTQgFhAaiUXal72dEREUa1WWeusot7i3OMr3NOnyXc4itXjGC3Rbrtlzie"); yield return (HashHigh: 0x5dc48a8e6279f419UL, HashLow: 0x1a7a23f90e501821UL, Seed: 0x0000000000000000L, Ascii: "pkEpdDVhUfUMS3ASIvA5FAgWcJaf7hn2j5lNpjwJKRDSTSkKK2g80S7TbtqYgcdK9FNcCCaSI5uAT2JIDyIx3S1X4DgcEg7A9FO3zVrLwrh8hqQrS1xB7yIIqelfKBSTNg6a"); yield return (HashHigh: 0x7f5c3a9e40b94834UL, HashLow: 0x658564ad0a410ef5UL, Seed: 0x0000000000000c61L, Ascii: "8qgkEfNDcw0Fe4YA4JxGVZetLthMJ3OpR2xIZITaPR4F0nZW1xLvEGu4Ast6RMP8d9NY17Y85sqIuLI7QPSx7mj8ZwvJDcTMVlhuja6sJFwY4lwYMkrdiUyrzCt8ABJNohxWO"); yield return (HashHigh: 0x05218554e3f0045eUL, HashLow: 0x2cf2b47147c64501UL, Seed: 0x0000000000001769L, Ascii: "F5cSZPLTlGxNoHDCfRYxxHfRjZobExObDlBdY6XgfUlQn41Ep9I6469ErOlgDAOxLknh7SbJeHWzMWRlNjdDQABmquDPPvunf3bmiTXwBojvDQheknbkqTJq5enJ5MDwkUdhs"); yield return (HashHigh: 0xdc3e89f24178244bUL, HashLow: 0x0c8b54115eb4173fUL, Seed: 0x000000000000135fL, Ascii: "H1V6q9I6hIdiK5yGBsBSGLkKMGpcvTOUeKj1W0qHLgG8liwikP0EPL4R83BM199VTrIafmXA28fDpQQnMlQyMGEpDHXChYkAXjEKiz5xiRHAJoELpjOMA0VSqUZ4LyzSx3DWM"); yield return (HashHigh: 0xe2b7147ca84780d8UL, HashLow: 0x6e936a3c7dbc86f9UL, Seed: 0x000000000000103eL, Ascii: "M0Vir8hbKd9ycWn7Ex9YTPSdN2jUxe8Od7R5FzVv1BCTIw5kM3lTkrE91oPc8DHQ2ze7Rdv1r2PGJaV9gqvcCSfDwA5vbEciCLEOqwFkClzNHKUtzDxlFHPjjqpkX7j8Gd9g3"); yield return (HashHigh: 0x957948983d639781UL, HashLow: 0xbf66d81fc14edacaUL, Seed: 0x00000000000022f4L, Ascii: "UyI3ZMRVJ6IdKKyaO0hTImJM80Z3w66JktmiQ4YOAxEaSzoRibkmoZHAX2LyupgOWmoTol8ZXffaghlN1D967JKQlnZW1KzxzrbXBW13b6LiBQbCtC45hHBzhBHNJH96egKqH6"); yield return (HashHigh: 0xc9de4b6024f681abUL, HashLow: 0x850126bea5d5eea0UL, Seed: 0x0000000000001a3eL, Ascii: "B0yiozgg7CMWHU3rQc8u87BRSB77mmFfo5dRJfnPLU1hCdrZtfFptYIlBv5mcDJRXfJ7YxnpSq6reI6oWnJoSi8kHIFOyiqePaS9auXA2KkD5XZMHVRae72F0fPdIXRAh6qmAc"); yield return (HashHigh: 0xaaa039846de9d858UL, HashLow: 0x342cf78049f79426UL, Seed: 0x0000000000002551L, Ascii: "rXNLAbMWlaSEJtHZg7KcdKwVhN0tirSYXfSH6LtsZ8X2aBKHLC5KkJCQuTDKJIym3AW4Fy0LqUVbyoPo0EF2xfh8pVwG4h0bSgKCfAIduI8A9D45Fm8WMuV5wd8uR4DomM1Tvf"); yield return (HashHigh: 0xd16a907209a4656eUL, HashLow: 0x27b1515859939a09UL, Seed: 0x0000000000000000L, Ascii: "O9SUvMx6NYYU1i9iKK3dVYwU4mOB6tsBAOzlBgv1nObsPf91OVQoYHXLiZTIYELA8uJKhbgcKKGJ7OWqJ5Pf43dkpTQZoi1QpC7OAfGtFuqeiHT87LKnsv6w4YzI8aj0a7pDZ9"); yield return (HashHigh: 0x2f6a3b729b39fb53UL, HashLow: 0x2aeb1dcf7bf69f09UL, Seed: 0x0000000000000000L, Ascii: "k9qB2FUXd3TaZuIivj58Wshydm0OfxdJZu6llqoWjEu6et1ObBscfKjQ1axmf69Yu9Xn3n1D5L8fNCuMBWWijGRIk0qLKgnJ0r5MCRIlmPm6nXSYh4ucLASRjENHZwqyWW5K2cI"); yield return (HashHigh: 0x3f2813e97cb75496UL, HashLow: 0x354a521471755dcbUL, Seed: 0x00000000000000b2L, Ascii: "Hoi7QDtELUdDFqVnamEQAh3BFz37L2U96Yc9bVQMjHtzpGRiqCS8P4vM5UyCQYPDgaR6xcLfHzpEDwx2NLmEuVqTBXyBRfn2rRPoViuh0yanJpbbugRhXsTkdfUBV7WrVkodMc9"); yield return (HashHigh: 0x067d0df9cb56eb1aUL, HashLow: 0x174242594750774fUL, Seed: 0x0000000000000ad0L, Ascii: "HYpEYSzz4djNcmGn816C9VFfbbb5IWjxRxtp1oBSgRymSEOosG2d8UbqsNakdoBuNecS5TXW9XjebX8h0gXNhEmhakMttmLerjQog2Yhf8uPYUqhb5YRnN57pNW3voiA3Gl8hGy"); yield return (HashHigh: 0x99d0fc8e007d3e10UL, HashLow: 0xe75914d0abf15175UL, Seed: 0x0000000000001cafL, Ascii: "J0O182AfCRPaOO51XlQaRktTQvkFW8ASaYAmqIuz7tjQ1ViWtk1NAuUQwTL0k51Ph9YmTj7nF6MPoBnryzfTUN9OCbcYCKUm98cBvjhJXZOPTJt4h3fCkSJ1EClyMAwVyQRRoZY"); yield return (HashHigh: 0xe91262705d24d791UL, HashLow: 0xd4a950023a53258eUL, Seed: 0x0000000000000bbeL, Ascii: "OdsE4rVr8LKy8AXhYgzQYwIU7F70FGaFY3SZwNYnkgQW2iW9d220JUIiYTfkG3MWdzfBsdTAggmH8yZwAyKaF3Zl5gLHm8ajax9s0twPFEcHgrGpTQmtqdXtetop1vEE1ysDxm9x"); yield return (HashHigh: 0x44386292653ce4a0UL, HashLow: 0xa1e9f5dc1bf89cf4UL, Seed: 0x0000000000000000L, Ascii: "83rTxhOPcDzcCyO5EoZkbc0NErhb4mWZ1NC98aK1AbC5bisvsmDfQQAWAmHCkb76jwFRTKuorGmugdrUyO9VMLMpIn6XY2V9Rr7VY3kShTTd2QpUgJxcigy3AAZ6uaXt2cNT1gcH"); yield return (HashHigh: 0x8152a2ea2ec5c72aUL, HashLow: 0x6c7a47ec036d6667UL, Seed: 0x0000000000000000L, Ascii: "0bvwRn5eaAx7Yd4fv9ZAw1IuwIpO9eQescxy3S784602dan9jmjKfqRwTiYF6vhkGjN3w0JPlxlyiyrY4julxexONinlGVLqsH92m5e3wxXEPMjmlozY5Ru7ecuZn1TWTBgipcGm"); yield return (HashHigh: 0xcf6eae1abf46fef9UL, HashLow: 0x0a102546f3cfae9cUL, Seed: 0x0000000000000000L, Ascii: "Zj8ZXsJcjfcOKSvGAu53hSYTLXBxgAft3WIWmhYGti15rzRDaXmWYIwsgZxTdGQX4nktfzfP02kb6s0FxnAJCWN9pLRwZicDjHhrur3trefUjRROE3HQ5tI6ALMXiz5PHXjjC3W8"); yield return (HashHigh: 0x90bc03d216103cd0UL, HashLow: 0x17d577f06417ea21UL, Seed: 0x0000000000002089L, Ascii: "nqlcFmZYVA2UnbzyUj25rR20uy9XRUYMIn25uF8ld2HkKHrzTZpHwVuLcieb8bTsIRMBTyZ0D7uDLf1JCde2GN2QAcX7aKMMyPakmaRKnRGMzVVEvwc2edrvLmty79vGMu2jAZFtE"); yield return (HashHigh: 0x73369139f9a72bb4UL, HashLow: 0x49f9f84e61878049UL, Seed: 0x0000000000002118L, Ascii: "50eWLaSIzVFSAE1y2jxPu4pXhbUn5fbrZ2ISzjeWXClpH7pYI3fbYbZ2fWLkKt4LbAUtQ91o0B3oJGAQdIXlvcB0zao8KNRcThuSfT135gRNdukfDjmpINltxRSafuoxDRHIgKfS5"); yield return (HashHigh: 0xb693956317161676UL, HashLow: 0xb3d9ae214bae6196UL, Seed: 0x0000000000001fd2L, Ascii: "XAdZWNfdjveSGCbiQoUzRIVRpTRw38a4si2uK1ujrUi8x9XOLgn0EIMDdTTnPYGyT6YCID6jjIiuaj1ljvEG1POgWmcTXpISyIU7fv5deBztXiicZDbL61NcH6ktStaLByZI9MDCW"); yield return (HashHigh: 0x82aa3ed78dd761f3UL, HashLow: 0xcf9561e21705fbf6UL, Seed: 0x0000000000000000L, Ascii: "QHuDIZ23SZ00UrLu1Augid9QqPRPW3YF2yNX2Jb1bWwmRJnaGnD8W36z2g2u7EeU0oynrKLT1S6zAL1v9MgqbdfDOdPJpABxGz5UIXkf5YJCbMLD8u7ifiFipSTmkw2cqhBnBcbSP"); yield return (HashHigh: 0x46327ab1e629dea9UL, HashLow: 0xbab6c5cc7b4463f7UL, Seed: 0x000000000000065aL, Ascii: "vTJfi86OzxCEBZIgdnuoNwRsN5myyrktrH6CmxCNnqidWYYqIqOTrWPT8A8vXkqExoex7mJu7xfvG8FIHLVExk8pmqsD9CWx7jOvQm9OS3wsoIAeOyRrQ3zeRBKKLbXwgw5Sv6O8EK"); yield return (HashHigh: 0xf19335ff25be68b8UL, HashLow: 0x60c586415e0ea0b9UL, Seed: 0x00000000000025c9L, Ascii: "aeR4Ikfbab1jcP3xOZKbQncSKqTteyRRI47ndwQ2lAVlKXe6T9qrjQMTOMNHl5Z2TpVexHZfxk3TGOmK6c08EmCk2KhJ7Hbk6MR4pzvfGh0jba7cKKQ4FjzFKUgoGkTLEIUCpjRRDZ"); yield return (HashHigh: 0xc234cc07f4771acbUL, HashLow: 0x7e1275a17b505a4cUL, Seed: 0x1b913e9ede6d5cc2L, Ascii: "7Y8uKD0vmUdO5BNaHvDCBZfJv47KNbDIRWnmPgGYUh50RzTkEqoe1eBr9vauaV16bvZcusbjs5ruqQ5xQDNIEU1UG4Nu2BTA2e9D8TxrtXH6zjDxiRTtY6K2bHhWG0xKA634jTqxvr"); yield return (HashHigh: 0xcf396d47d97e68e8UL, HashLow: 0x387603d6583b9770UL, Seed: 0x0000000000002128L, Ascii: "FS4Q7RAFeTyOz5nyYF9WRtUsrhKcslqBwdSIowySyxNxIeJRd2PIiDKGF2MUGOvoHx4FpA44kcxRJeVzfjUOjKDR8OiUjGZlVpFBYrCB6OTDPnuGhFkba0innKsQF5ZgjEvlX49EJI"); yield return (HashHigh: 0x46d0e82fcee7e71fUL, HashLow: 0x2fef91b105aefadeUL, Seed: 0x57fb342f893572acL, Ascii: "LABT9OF4MVWIPO2nxE6RYLjq5svbYkH9KLUDI8kpKb6CItxG73SCMAPRSk64Geyc8tHDMjwkWkyNiT8idQ82r8nL7It228YlhePGw8jkuxChsnNFmsDGDgy7xAjMgO04XrEhPBjpAdy"); yield return (HashHigh: 0x149f3ed8949b442eUL, HashLow: 0x4b9d564fa69a10d8UL, Seed: 0x0000000000000236L, Ascii: "oYxflnPgurDiUW6nnQnZGDzw3CC3WUNWlhLbHgpZJm76oTBJlqTUrcMomp5MAfjTaUTlREu8DUL2wjtl4gp0ZlZ0sRHEEAqFTgZOyKe90kZ1NIIzCRQO0QTaTMNaP7bipyIA7Yz8cv1"); yield return (HashHigh: 0x906858abaa97f581UL, HashLow: 0x160d1edfcfd5f284UL, Seed: 0x5aeb29b2d48b91eaL, Ascii: "i08q4MC0QpQ92tpeqTUgtf0V4NMrgf6Ui6XryC2zNrNSuQN6edxj9d74OnnwiZO5cZCLwAKKz3Mupafzka1DxhoCD5huf1OV63JlJogojViYyXKo0CPPKbjGCOw84rHRaG4x77QNHOU"); yield return (HashHigh: 0x56ea46ab0c2269feUL, HashLow: 0x386f78c4ccb8e3abUL, Seed: 0x0000000000001bd1L, Ascii: "0c8W21X9nZ6HEZBDWIPFCvaCKLR0ExjIsMprL61MqO4GLJ4DSxcA5IhNKRgIHS33BCVWMISftY9fImhGe6wduMTEKXSHITqMx94CKxuFDm8psPe2qdA317K52dMZYPQcGWIMI9ZQur2"); yield return (HashHigh: 0xf6ed7ea3379ce478UL, HashLow: 0xe98892fd4a45e93eUL, Seed: 0x000000000000219eL, Ascii: "RQncXAONa98LllMBK9qAt9ms19zNIVMrJrVcuOhcokwFmyMF0geyJeUZkVMmhbzbzujQPC4kNcwN1Vdt70KzagMvhIT7wSOHBMu1NUGIaBZXqxyE0EDaocrK44y2uOxkHz3bbFbFWyLy"); yield return (HashHigh: 0x7a7ec28247cf1fd5UL, HashLow: 0x47841f890808095aUL, Seed: 0x76c7dd87ed6bae92L, Ascii: "koRmL1gHtX7WUX86WV2fnTtWrlLUw2KrMkTcsCtpiacCPsSqnPMlP8e3IB6LZf2AGSRYJ30GrfwdM03KPCnsDwGxd6xkIGAeiQhbQl3zqk1NhebSmfAdBi67SVOyWBD1HknGEd80zPtN"); yield return (HashHigh: 0x9d9adab41cb135b2UL, HashLow: 0xabaa9832ec798cc5UL, Seed: 0x0000000000000000L, Ascii: "6U3RW7QvEd28xpKj5AXhaxt9SzNlaAfen6667b9wnCig729J3UnOKoYaSRi2f14aXDEQpYTgdsXE7zBm0yKb0QfpbSX0n1TLlFFnTU32ebIUmdWFQDX9i8k8r3PMBY4SXsmByI5xnP2Q"); yield return (HashHigh: 0xdd6880902f07c83cUL, HashLow: 0xbfcb95237c2ffa17UL, Seed: 0x1b03d5aeaa9f87dfL, Ascii: "cJz36xeOEDL4lWkNyVDoVB3xg8W4rbZ6pgnDpecDuUQhsy0GwIufGOz2g5QkMhoMyv4wjkSOI1h6TmnD6840w54weVTGJJAto3j4lY2KcyNiftl5NKVVh3bpLeHUlTSTs0vUYELw0t1a"); yield return (HashHigh: 0x57bfb494f96671c3UL, HashLow: 0x8fed4887f4f2d7e9UL, Seed: 0x0000000000001122L, Ascii: "LRr0gGIKPbSYSzJ6dkhAawEUcaexhjB3mRmOdqleUevzPNqBJaaXnhh0D9tnvwaKYLnbK7IYfElrPVlvIbbZK5yPtHfMxkmis1yfBmiu7xml6sNmZt5CisV1RjEl9gjj1Vx9zhsh66pNT"); yield return (HashHigh: 0x7a1d6a7a5c8bf46cUL, HashLow: 0x8d9be3b69e03f6f2UL, Seed: 0x000000000000266bL, Ascii: "INqvwfmkN70mrx1CLzDvgyLMaIDeqAt3rKqLp9j0dKfPfyUenN0fHVC7axbd85i9CRcuN81ENMlTlA4pdM1Z0EJBEi11drzCAr1Qaw2CMQhvJCmft35NVMoBfn6dBnx9RZP2zqdW1ZK8r"); yield return (HashHigh: 0x4fc45455b9cb6222UL, HashLow: 0x37b4072ce231f1a6UL, Seed: 0x0000000000001827L, Ascii: "ueBA0AtMdwP2kkOh9BHBYJnFQ8UjWieCTRMmkRbNVM0Cs8wpAWEKF8U5w35K09tyHkvH8SAAYiOJbJxDbf6mKWmT34WWpon65Ps0wSj0fc3hb7ArItHHh0yEV0orcwXTvCCSBgIUf9WPF"); yield return (HashHigh: 0xe73461416c2c1ff8UL, HashLow: 0xfdc320a6041fbee7UL, Seed: 0x0000000000001e98L, Ascii: "XrQz5QVeOXyGV4REu5ZBI1qeHiYFoZYnzaL9c9HBlXiMSJISAc0Ix0X6K2AdfbvaeHlI79HBT4OGDtSG3gUntptaPELq3rhiQeIPQKZnHlDVtQMTdMqEwv190P5NvbTnq9MiNd4V2OtkE"); yield return (HashHigh: 0x9ecbfc7c98fde54eUL, HashLow: 0xbf0a0003d6615773UL, Seed: 0x0f8be7479eb05133L, Ascii: "YCeS8ejYuPJYOsEsvse6xfCKgZ4rDBIfCsEuThLeS1vRxNabzC5WGEMrWt96EYwGvWtStxbEcqeuzDjco3iieSt23euOIHodAkLeH6fYaEdJ9wg1c3kaxjBy76xcUUvUgQdNeyIgixjJBb"); yield return (HashHigh: 0xa5d69dbb3136ba43UL, HashLow: 0x8965623726f1cd76UL, Seed: 0x0000000000000000L, Ascii: "NZRIvp7eLAe9SoC5Furbk3IWXNR4GrOA8smVblKjNBj62ArLuReMOOiXQkRn964AnCNcYAJl2eKXuVCmYchYUN31we4dCcTqNXSZr6Yq4hCgKY4Uj8WeboayZ95mwAaChaLFlAlLP38DvH"); yield return (HashHigh: 0xe19268c0094ee61dUL, HashLow: 0x60eab39cb1c5fd27UL, Seed: 0x0000000000000000L, Ascii: "bnbwbxBNUrVu2O9WdVObgmXRNk91ddPOcrfjgUpP2Qhg8ug3W63Kd0Gs0nc30h4kcjI8wtRYhlmsDKLdLRrCHtPnrlNOttBIcL3tls5kzgoHriyk1TyIcb6Z3z9OdNokTghPnqp5bTfigN"); yield return (HashHigh: 0x57c68037d704a5fdUL, HashLow: 0xb8daaa7c4abbf90bUL, Seed: 0x0000000000000d05L, Ascii: "tzlNV7L4NVKgZpn6e6Aq8BqTNug8x1ryUYqTG3TadfPFmYboOPqgUIY0NJNMgqdxRUaUe2U2kaVHMuddKztIeX2gU7qEeb9XRFxeHZAVaIZ6lYLUXv1gzYDmw9trFYenp5EnyOzvutTdYN"); yield return (HashHigh: 0x88edaa2398e168c7UL, HashLow: 0x0a5e54cbd8db37ceUL, Seed: 0x00000000000014d3L, Ascii: "ZGwLelMo5hB8lZAJEImVcUlqaSuWYvHq1XBIAagwJ2Mq0hM5bbj7r9yyDj8m1dRQeGch2Sv7gZNWKghhbOLckJ07kEF2YPR8gwp3PgNXE0dNMUEiin7725FcnSTY2bOuRO3arZTjwLjwsaG"); yield return (HashHigh: 0x7f7412573832229cUL, HashLow: 0x61cf242bf6beae2bUL, Seed: 0x0000000000001cd8L, Ascii: "2vECEMJDes34YpXzV1BUUYtVPPcd92N7tg88CUw1oMj5W4eiZIQ6cXi1tQos5T1kLpH2oixJSeSqLu5h8LxganABgUzFPYOjIWL9uOEuDfUMsgktgQ4bU0cHw2nC8hFlCZDxqtnnhTrQjVR"); yield return (HashHigh: 0x8e74db8449204145UL, HashLow: 0xb5bd0e09129ef0c2UL, Seed: 0x7661f00871943a00L, Ascii: "4kNidsgh1ULYzj0rbKMjQMCimtXWVjt18nxVpMP4F9KxA59c3nniCIXKbCvq5HXeqxE59L9W8uHEBBhHX1ahTR3p9LEnCXtPM4m8WWNW542LJTQFCtyZ5IR1kqB75Wdehw3ZYdYTci9AUvz"); yield return (HashHigh: 0x5c69c4ee5489a887UL, HashLow: 0xe2aefd1975236a58UL, Seed: 0x0000000000000000L, Ascii: "xSnYEnPY0DFcZXjabmJZZv11XR63GM6Ukf9aPmjQxRwmlOED837tCB521Tv6zNowcu7aRCx3u6FkE0tHF5jbHIzUD6cJTMwKLnhjSQ89qwNLmNQUdCd3BMnmShmoQ14dj7Xxo8nE3pvQQMV"); yield return (HashHigh: 0x9e8802a2cb965361UL, HashLow: 0x7c75e321588b4f32UL, Seed: 0x0000000000001608L, Ascii: "16TEUrYwuNZN7nXydHKcqgL7J8NXZCHc5AHRNtTYEB0wXHtkOWORDf0TRUuOSqj9orOgHyr7VETWFWcy11fChAROkyXXpYe7RkBbhERdMBmdaSMRSLpvZ4HkiX3d1F2iwGTBKipzpy5J4qmB"); yield return (HashHigh: 0x9b443d5544cef0ceUL, HashLow: 0xb73ad12fa092570dUL, Seed: 0x0000000000001b7aL, Ascii: "nGVDgcQ6ZW8W2bokBryEg8Z3m7grx6B6s7iSXcnHNuEpp3fd9vKnt697JFlrV5JFLc8cZ83bSJWm4Xn4T1OfEzKl6cXg43qFJgYY410R7yxKX5r8XClgz3ZyyzrSqxiVjk12sZA85vFXm5EE"); yield return (HashHigh: 0xb59a299a00349adeUL, HashLow: 0x8f68ef6ec9a8e219UL, Seed: 0x0000000000001471L, Ascii: "uW1clwZEqFxakgn0ExK0TYbfjv4FCVpWP65T2wy0eA7iS50iztHqIYuTOsoPpcYIVunRjBOcMG3OfFY94uWDqHxwGwzssHzCO61MtCLBvTxIZ8J410bL1YgRNoLgZKEdIC93Hb6YvTSP3Adj"); yield return (HashHigh: 0x039806bab62ebf00UL, HashLow: 0x069841c8a7277c82UL, Seed: 0x0000000000001550L, Ascii: "QBkETJmofm4YRD3TQddoKvpyjzm3LMjsCkOoIBlbr6yzDBe0xT8PE2Hx4cHPub6P3O4oAv5sqGH79yHxJPyugMpmczKCKtFR4nbBWklfgQzZDoNv2i6816YDIAjKWjjpKtAMCrKTVmw0xkFO"); yield return (HashHigh: 0xd46fd39001c8dffcUL, HashLow: 0x699a5a5c7b0e8e5fUL, Seed: 0x0000000000000000L, Ascii: "h7vxY18IBFufeMfQEF0uvNH441g0xOK3jfM7J6R3pTgiYmzyX8rp6LGUvUMCNZzi6AefpdtWcHn1SX7E036pJZFRSemmpaBhUoQbBm5hA8g0DEx8NFcPNJ1ur5AaywSC0DTTteFXG6tBmkzmw"); yield return (HashHigh: 0x8f690e7c0d292b38UL, HashLow: 0xe6e76c1b01005b68UL, Seed: 0x0000000000001455L, Ascii: "XM5roMXpfUT6yezGaKFFvx2CWI28KXu0jfWo3VKvIoB62dd9cOMt7DHs5xSxWjwYjkqKBnOZMExbv28liPpEQ8stFg2cMy3o0fQIFnt8poRKfmvCrREGuq71m63FTa2rQmGJUyTK1UAuUlTEe"); yield return (HashHigh: 0xbbce0106605b3a5cUL, HashLow: 0xdfadec21f7e67cb9UL, Seed: 0x000000000000248dL, Ascii: "MkD2kzabFivfDIm1DUFFVje69UYx4KP7zb4gM9dDlT4vTDX9Boo7YloTU2Lm402XU84QenglLDDyCF00z0D27lteqzYRmXkH1CbmdFRoAamtW4wILybXYQeYGGKXivPFpzkfPsWhzz9j4wnhP"); yield return (HashHigh: 0x742b6275ee7ed929UL, HashLow: 0x43651530f20e227aUL, Seed: 0x0000000000000000L, Ascii: "lZh19faRQKjevEwNpVH02ADNfnLL6hceJP5yPxo5Bkd8irhjrRa227eaMlfrqwsAF1GsmH9tSDQJRGi7CGA0icgHUlcogKoYHIiglBHwLFNY74bbY8anenvnp88VfZsORihIwh3Ip8lhfLssf"); yield return (HashHigh: 0xae4c5f19ea44abedUL, HashLow: 0x0dbf7f3cb87e4e5eUL, Seed: 0x5053e8563b8e105bL, Ascii: "mji9X45Kg2ieBWzBIJgKlAVI5xu3jNoLaFju9cRpNZs59VUvR3bxxBbb6AUMUFgDm6uXJY07m76VMUhGjuNQfJL1Rek2WarSzKIf8ZXnKVOHAoEgoOV04W6rBBsRoKCaMaXyUy2HAF078IYhWz"); yield return (HashHigh: 0x6b80d81c159424e6UL, HashLow: 0x6d467762269203b1UL, Seed: 0x0000000000001c68L, Ascii: "QhdEgUvMnNhbiiKccrmrE11Xrrp2HiPhTIKyFWJb51zUEWc7Hwszj3KH7tbvuVcaPsrfogRgsXeO3GlBkZ6iXqRccHPVdSZcKZWHjS2nrgwbzZXKuxvb3st2xZuRctBTbKeRWlmyApmwyhZNXE"); yield return (HashHigh: 0xabb8300c450b606fUL, HashLow: 0xfac2e60a8daa2723UL, Seed: 0x0000000000000000L, Ascii: "C6NSXfV5l88vvycmtINmb3FQ9DqTA7stdWvF1ZGmZzn8IOT9PkLRYwu29xBGz3u64DtOqhcWs29TWacrLo3htPrg9GobyClvNHHEq0o0OAmihp8K45cJb3tdeiXTZIY1Czrcpj0VABvZn6mkGO"); yield return (HashHigh: 0x15dbac54c2a75015UL, HashLow: 0xef99ba1251b78649UL, Seed: 0x0000000000001718L, Ascii: "kbeaxNxCAOMaJZG4ndPplTGKwdw2UIukSbkSuWxFyFnVp5rfUw7RMAfIjgsE1lFaigGI3ALU5gyTXEMo0xlzFz74GZ7PzraAIyEHpW4yMeltmndUlnj21LBiXRWTCkriVH2uNupXBS2XC43OmR"); yield return (HashHigh: 0xabe2973c92d0f517UL, HashLow: 0x280c5be1560f7c1dUL, Seed: 0x00000000000002aaL, Ascii: "lRDPYl0Iv939jZw9iglpNKD9uNKxoK26xOG3XmFMAOPKSl6a2ZHc4NCFVHP4jCxwVXskI3buxPZr3yFXt8oqCaA7gZxKCgREcIDoUJEMiIq50OQoIfCr3okNQPDM7zzg5cqZRQhn520ghcYTiAk"); yield return (HashHigh: 0xeb3faf63d11ab3aaUL, HashLow: 0xe1c8e373561c33c0UL, Seed: 0x6cafbbc0d4d9d448L, Ascii: "2SE1OL9I2HXxFeZ9cwpG1bvHORfMYzlHqH4O2DMqPiDBQNssznaruH0lD5ggyyixdtdr0LIUyOdywEFJbtsdpRZloOJHNyGvRZ13AKfbnp1d0cI4OBDSEtljyVPKwYff7bT1UMD5Qb7GSCHD8yy"); yield return (HashHigh: 0xfe2d9aea8ed87e2eUL, HashLow: 0xa90547857addba86UL, Seed: 0x0000000000001d92L, Ascii: "VrmLgJssGQMypADPBHCcZzfAf02WEAVfmDdX3ROFbBxUKu57jQEaPDv6yF1yuZrUM1GmrwWj7jpZfF5xPbVBD8G6HBKjhXj7lZuzEfn1HTFzWvvhRCm4lsO16zhYIYt2kdDguWTBUTxz8jE5ciW"); yield return (HashHigh: 0x2e1410ae61645e3aUL, HashLow: 0x239d49e758cf2e6eUL, Seed: 0x0000000000000483L, Ascii: "YqLOaCkvunkE6MNqJpIbwvfcQhkUGG6JEewerE7rHH6797Ln4KzEelspi45h4SmHAjdNDNcM3Cvm0F6AbNhnhqtBFdFaby7GEPeeQaWMqAQ8Q0ig1BN1juCwfflybwbLaA8Jokd9ZXVwA2W3SKw"); yield return (HashHigh: 0xd7dac2de6f2eb1f4UL, HashLow: 0x1ce3d2d5b5fee8bdUL, Seed: 0x000000000000015dL, Ascii: "wdwPvtZuwFk2xZz5ILImhDQoCQzoWDgkUnWLJiqAg2UHh171FoHHRZHVuFPAAUBeBC7g0rTzFtEbvPjmAuph55JHMPJ66PzXSg6oKj1GE6l2sM4v41TV1S17c3rOr36P0VXDpzJrDqNjYefaDcrD"); yield return (HashHigh: 0x7952d8ec83229e0eUL, HashLow: 0x2a0523aad50caeceUL, Seed: 0x0000000000000000L, Ascii: "Ca21pwuAz4ChrAWVQCQaGiGufxKTd2Juom4dcuPa7vML1kzz87lAQ4Sr4Pspv09YfvAyPzKltoBE2VxxvkkDgrRQxJ9NhGoZbFj9yVyMvpMSsqgGHVCsUuWhROOQJt6Lw9PcL45lHWCcheDrQejt"); yield return (HashHigh: 0x66ca0eb368070887UL, HashLow: 0x44474726bbcb0ff4UL, Seed: 0x000000000000150bL, Ascii: "KnSIM1z4E2EkYDzGqSxyMxy8kkxwQbdCYOloyzm2pKQ7wjDs6znbxIbeXx5T5jFaPv6D0rwbywt7RBaAd094bSl82if1n3bea8tTzKaWHrHyztPRvdIOyjYmJUwLXEAFTnsIfU4w7tkD6wP7hrgP"); yield return (HashHigh: 0xca7f96ac9bf04d6eUL, HashLow: 0x8190fd1bfdcc3ffeUL, Seed: 0x00000000000003d6L, Ascii: "YlEO2h05Ro9uZTDjpeVVHBcBYTyrarAQyNaUboQ2F48CmEFhcd78JPfhMD8IPgSDBR6gZzwTnd0AEIpWOhFyHxQTWT95EtRbky7XPXq74npH9zDWUO5Oa5wwOZXLRNTNwDuZARcmmf1kJEgNTnpH"); yield return (HashHigh: 0xb6ac087a0d45e20dUL, HashLow: 0xc54c9518bb3d0a6dUL, Seed: 0x0000000000000ffbL, Ascii: "RiWtMv91x0z3MJi9YfUq8rJcpeBCwIMyaCMGjuaunyQRUMg7f2ySvTu8wIpg50dpyUWCBskBErrOSFveIvWoVfV1085dXHrG7nUEwl8IrMKendmmfz1yhJ6akVYk5cFoQam96fzyvsQD8BB6GimHE"); yield return (HashHigh: 0x628aba5d463f809cUL, HashLow: 0x21cd0e6bf33a336cUL, Seed: 0x00000000000011f1L, Ascii: "mnv36rJDzm1Zochb46MhGXcLeDZbKSZ5WK1jSa8i4IluVBGOgfAJHSF2AS7YHZANxDCLJVVloSLxeVL0PGrrwQxmdIXNYbTuRT2xUmAg74oJh832LD6D6IfO3J5DEsmDc1B99aIGMpgatVj6z8hIW"); yield return (HashHigh: 0xb62eff46e66790caUL, HashLow: 0x3adfedcfdd201812UL, Seed: 0x0000000000001a75L, Ascii: "31nAhSK6lKwLUMflSqSxLBWCfoRlfKPDWo9XTOOFnwdFoPPsrkYXXFpE5toYNUzmEFZ0xC5KeYBIa9xeVJ8w0nGi6ISL8PDhl8mBeaaHn68WvOr5SsdMP5l5IDmaxsftmmBs37NtG0fHuh6ICifl5"); yield return (HashHigh: 0x6803ee2e26725c30UL, HashLow: 0xe43ecf314a3a82d3UL, Seed: 0x0000000000000d44L, Ascii: "ANpgMiMNheGfrkOHwYj27tY1XBzItUDmuyCRjfuazR702hViGWK89PD0QxDdWJDxgvY2UY9IjluyUiHpMBoycE0d4nS88MUwF2vov0gjvJ4LJ1cUfCYvptYhPQHVyfpRxXZ24yJNnbjmbrb3EMFXa"); yield return (HashHigh: 0x7f8cc78f768070faUL, HashLow: 0xe2397c15cc54e954UL, Seed: 0x00000000000017caL, Ascii: "P86XZCtYQO4z23K3Os2V1deOCsWdEEJI2APQ83oDSn51Na4hioDJzhkVK51cIPJC71l0tTcWx9uZmdOzOCni8x79irZUZXaJokHlEf2rloZ0TehEIH7wObIuH09lIkQocRRBJR5M6PSYVAoU7MiFPQ"); yield return (HashHigh: 0x0e76a187aac9fac9UL, HashLow: 0xca0fc091795e03a9UL, Seed: 0x0000000000000000L, Ascii: "506lXaeVt1PN957la0rgUiKtGxB4Ki2hqgTK832nY1vtUkXcdwQVvWIaDrn28WvMUAR8AoZcxIxcYsNfT1iXgNohzJbDSSnkNTCj6rAgsZOWxpsPJiUlbEJNZi5gsZBGt5UMb3XuHAXf6cKIhk2izS"); yield return (HashHigh: 0x4acf974a7bfe9a5fUL, HashLow: 0x7f7f0b179b5df850UL, Seed: 0x74422383d0621306L, Ascii: "5RR4CrqvBsonK7drBXlhL1VUQxm6cX4UKtYg8zZOW9pRFaJCM2BjEBAjN5NGBNUq3UVyHF5XQOtU88ZkpMwoAkrekG4UlpOdm4DmB6P1UVpSCuAcAJNO3HSkYyG4jMnxLrWZsoN54ZSm3ZC7Fd7b9q"); yield return (HashHigh: 0xa2554fd13f900ddbUL, HashLow: 0xfbbc4658bb118caeUL, Seed: 0x00000000000020d3L, Ascii: "Zca6ISTkVdarTdiYoiCtulPQhB4szxFmw7GGTptQqyCEdDxaCdTTwHoHRncshyTHadwJC5Xpnmx6HHVedezqatsCtOGGq0rvk4umVLdvqgNcJsjx2EVbK9xIWgWIoxIYFqh4HbROxI958uXMBP4KEw"); yield return (HashHigh: 0x0f2680af7a218693UL, HashLow: 0x717537706f0ea759UL, Seed: 0x00000000000025a8L, Ascii: "7CwoN6n1mk3yjMN70v2BIbDP0DxSxSrmEkAh26csqE5MIdD0bDQ8CHVF1t8MlQENE9Usv77bCm23GGSJO1zwWBwMfw77H9jONyFhh9IxyTkiFDiPyJZHPAFAI7Khh5BWeS69XSROUDkCYEr2w3wMD7J"); yield return (HashHigh: 0x910b6eaf09d691c4UL, HashLow: 0x3702983700355d54UL, Seed: 0x0000000000001e3fL, Ascii: "mWYT7sChygmozGjDYHiRHOKCIZ5MpMOINswQw5rMn7aNT927s43Fu1VbDFCI65WuzfJFQdH5T3B5V5azx7iewhxIEAyxQ8LMkyIfwgrGaN968Eo3lQ85LWk3dP5vcYsD6e6WuCpxVQ9ehN1oNyGBUFh"); yield return (HashHigh: 0xe865d9d3c9509fdeUL, HashLow: 0x0a13d1d4770b26b1UL, Seed: 0x1eadf009cbf8ac7dL, Ascii: "FVIs5vdoGlQH8mO7gwIr6dzuitt7tCLlto3j9ISwyo2ccMZVwfFgpmI52ZSzMHxd1jk9gUu0ap2qRVMQoY8EQan7tTGO0UJeYChSsgLmsA6N19adBoUG0Jl2aLuAUpJOxkUwWtnqBweYzskBihqeeeK"); yield return (HashHigh: 0x035bd324b14e0973UL, HashLow: 0x64f04e9ebacb5cf8UL, Seed: 0x0000000000000286L, Ascii: "9r7sdylVeJ6UPrid18hQRVGKD9aHkJg0MgrpFQBiJL1LyS7GKbg53W3dpFpZX4VKDtqVU22QdAtuhkBRG0ARJ2CvJcvhG85kiS3xRiOjtRr1LyBAhmP0Sc7qDxZGVRz4c8xX2Uxqk6lKugvHSDqm1rD"); yield return (HashHigh: 0xdc81ff3582298a62UL, HashLow: 0xb47d5072f96dba1dUL, Seed: 0x000000000000248aL, Ascii: "f1CzSvUf7nMOhfG0aLlFfETuxIA8g2DHzWv48KA1gg9up1gdB4IpWMwOBlon2i0iAma3p9t4otplwQqGkcdwLKI1CBu0PZhNDihtsBTnvsIXM3CnA8XGZ352FYJ4aMyRVMFFse5fAOXwM1Zw6u7yhyKE"); yield return (HashHigh: 0x5f87bcb4478ba699UL, HashLow: 0xb3d241c78d5d87e3UL, Seed: 0x0000000000000065L, Ascii: "zZKL0OlySsRishB74cl4RGBN2d9OWsFhWNZWdeFUisBNX2UwuLWHR784AKOeIDSxMkvN5AthRuxjClrO76vQl8OBozvGWUMKeSqlLNR9vywn8orNrBp354Edxc9ByHPT2toJUniK6ZJBy0MibcxrQ7CG"); yield return (HashHigh: 0x18e6db40e10ad21dUL, HashLow: 0x8a5e5811e526a6dcUL, Seed: 0x0000000000000000L, Ascii: "0cMGeRh3IXvLixGzdMVb9xBGjA6kEu4IamxKrYBh4e66zsoCJKZqorkk70vMXiiU8HDAZ3L0hQafI8AXRGUt52gIFbx52etqU36ye7ZZA05WwURAxSfohBVJR4CyHgAwtvZPnAIQTYqUVabcuvpVMNlO"); yield return (HashHigh: 0x3ff386d2dbd478e5UL, HashLow: 0x53f2dd2465dc929eUL, Seed: 0x575d01e52051c5cdL, Ascii: "RASyAErgK2cfd8LnRO5t0PyCVNbsfcru6yQkeyNQ3MWQ3T48eMowT4HFcE2ZppMsBXZm1e29iIsPpIzcOM9ZWEf5GVOlO5Xjyb1yuzHVtgPXEKbAvJJGjeuKpNtIriONajKOn1TdWUnT2jcoQpexBmUD"); yield return (HashHigh: 0xb9916b8decc426f3UL, HashLow: 0x440287edfb38796eUL, Seed: 0x00000000000023a3L, Ascii: "63iWiybDwerjql22wHy5iLaIkJA6yU4pbimzlndJqI3pHt1RoVud6cmtgxc1V2Lzg77Ij2ozFJ4OewXmcLus9dVxiD1nn8iHtl73mce7FD6rzJhZAm7LYfqn3W6u3dwnZl1JYHSeHtwrhZBRLhVbDYp7O"); yield return (HashHigh: 0x75ceaf3cbe571522UL, HashLow: 0x015cbb373398be1cUL, Seed: 0x0000000000000014L, Ascii: "ACkIGaxRIZMiLn6IKDnj2TQKLxoO9FFCkpwHqiBjTEP5HlIzbJxfwfU2iRFT83QNJg7JsrFNb6euxR3Q3AhRgNLblJD7A74H7Dr31dqs0FujW8l9WcizDpfUVpS9A8lsll1uZqZmk83kpxOmt0UyDlnu1"); yield return (HashHigh: 0xd9b745edef8d46d5UL, HashLow: 0xa159928e9af71958UL, Seed: 0x0000000000001dc5L, Ascii: "pDWf5Nm5aVeWCKqWj0ZzCuCG41CG3uMD4K7HbVfsyRHBb8PPxlUaZZafBNw5PzReVrZInVGGz7J1B0gHcXBgWi67bFD8JKjGRGUhHrEs1GP18TmFxQYnsugA71HtbNZMTkrQmKEmOEcDUbQVsQOivL5T8"); yield return (HashHigh: 0x9ae0141c6bd9edb1UL, HashLow: 0xf48bd5b303b935caUL, Seed: 0x00000000000002d3L, Ascii: "hQ5invCoIPWENdwevPniAqnrcOX59VfELHjdysQntRUyXVEcPrb0jhprmY1MiAbfsYrqsAkjqR3allmcIuRwzub6yBu3H5IFl9Y31ZbbPZ2QLKRlXFurlrRaHjNtiOjNT0YqW6JLixmNBFMw6xAfdPArk"); yield return (HashHigh: 0xe052b33ac613296cUL, HashLow: 0xc28f3e77fa1d950fUL, Seed: 0x000000000000155dL, Ascii: "Y4JbTln4lJObiJ7EQRU2CPLoLhwGf2Lk6jJnoUhQrS6nEcn5EbEJiHmaXI3aXr9Bm2STZlA1uaV4AMXeCvtdbHKePn0lPjgII0WX6fOnpYpOGjXjPSt6ad14XlSFI4YwmqLsA9lrYJa5R0bkkAi62E8rMn"); yield return (HashHigh: 0x6993e62da22fcb52UL, HashLow: 0x468bd1a9f938bcf6UL, Seed: 0x0000000000001102L, Ascii: "VrD0o8djpXMDKYuKitrNnCC83Q5ijSNlCAuyIql4CHAuBxC8LklWurywYciPmaarWef5zacECokLWd02dKXG2jHRwHFzEkkgjky94CZHJsEUAoIRTvbXSMPZA2880UbkIbQ2Sm5zrXQsoMoGwrQZaKxugm"); yield return (HashHigh: 0xa2e617fec14cbf83UL, HashLow: 0xe238025be6e76cd1UL, Seed: 0x384c038aecc68846L, Ascii: "xMEm4HPPaNLsqoqtloLN8ygMjf5O9hbLEVuSG6X61BzNShJWDtRxzRXZ5sKhxASjBmweXMrkoG9s7ri3Lv9CRZ0H74L4HNR8GPQQlX8sqXy1TBAaeRUXkZadZtNwyjXNULCuAsLgfCDjndDr8sGVtL1OBJ"); yield return (HashHigh: 0x1d60f5062b0eaaf7UL, HashLow: 0xb32e85a98f9bac34UL, Seed: 0x0000000000001c35L, Ascii: "eHjiuI0JzxZSiHdZetVhEqyWE2AoxnU9W2aUNEehVlwoTlW8ca9Z9IRWc17NE3DEvBormfTJOjwUKXdv6OI1u1nspYUHJ8qY9zJVgFSVf6nQl09sG2TOVHrgspV0WFTgzOGfsvhJoHsRYRgh96BuS1hY0S"); yield return (HashHigh: 0xd0fb4506107a2b68UL, HashLow: 0x1d3166fed32819b7UL, Seed: 0x0000000000000000L, Ascii: "yfPiKy0htYoBIT0XWK9OCGJFZ89aknaEG2iTdxMCUl4MBt8u4zTucKtg55gUVGSpqT7Ui8oayu0qJLyeu6YeT9GjEKz7ymcl1nI1jR204GL0Vgi7TAxCraZDGzu9KQE80S1Yzxb1dY07MyZhUL7oyWoXnm4"); yield return (HashHigh: 0xbe7032384d0f3724UL, HashLow: 0x6818d4ee69d44f9eUL, Seed: 0x00000000000015eeL, Ascii: "Hb1ulxeUfjEalMMwNcgWGvRKc8U47rPPUOc8dgfbfIEpFOV3NX6IEPGhnzNK6jOiDlssWFdeaL9vLOCWloY0Hx1MPUzNpPx1N7p5Y1d6CtrK97ciOXarxEJz5aFU5v1KqCfC4JdJiomACEOp2MCsnmJz1xg"); yield return (HashHigh: 0x8d37639a76505f42UL, HashLow: 0xcff4abbbcf63b706UL, Seed: 0x0000000000000cf1L, Ascii: "m6FxWVVTtTVJgteLjAr1UnxEQoTJiVg8ULaj2L7O91gfbBe5olfO2xwDsLcTpidQmhMyGCtOBr1hVO3Ugnl678jn89UdDu7B06yBTg93y08gD6P671JBkRqgQV3vNN5o76DaandiNfg8QJrwkmidGHHYhaA"); yield return (HashHigh: 0x42a059387e6ac267UL, HashLow: 0xd9d2eef67e3ccabfUL, Seed: 0x000000000000095cL, Ascii: "wzLjHXCGSajJWmj95VcIHoLZ9lP4xydL1tJsTsM7hNhD8vTFwvzteCmxBd9QTHul40VzyucnIlZpt7IXE5mbuRNTD8xqdg76uXGzPYCBx8H1Apydw9zOHpRJRhIz89HEsP74ePBYAaETTxwgNLlKApt3zOe"); yield return (HashHigh: 0x806ba8fa309b06d5UL, HashLow: 0x0a60f6a4e1e98c3fUL, Seed: 0x0000000000000c55L, Ascii: "u1urrFActQ6OHUkGPZkVZBOKcJGu7WAGe0VU8x61gM4HqUI6Cbdq3WKewjzneNl3zvxZ9qylzwZ6iyaz9DjmfsPBB9VJfKC0XOBFGRHsEghTwFwmdeXs2O78quvRFP0vEXD9rzctYXYPzqvMcNQBs29tWMsA"); yield return (HashHigh: 0xf386b0b63b3345adUL, HashLow: 0xd25f8cb14232721cUL, Seed: 0x000000000000241fL, Ascii: "MB19edtYkCHPdZKlQpdLnzpRI0G73IN2djAIZPAnQEgoyQYNaTLJiG3XuoW5Br6nE3TcfzZsOfwIf4iOu5rzts0UjmOQXM2NTOQAfXqsAW6hHzS94BgHfjyOlOjrjR5qGorJxx3eNY24hgKNVH686b6rb6Sa"); yield return (HashHigh: 0xd6a88e83f520d4bcUL, HashLow: 0xdb5df31e841f366fUL, Seed: 0x0000000000002499L, Ascii: "MfKVGmZXEkUCm5FWOBPCmQnjgqK40oZsjdZjUfiyVlT51MDRNN1M8Igm46TLUmehoj8FvjMwQBZMZ2f307c4VHq9XJSHrlzleZ2pu2WXkQxlVM8bYKSgX0c0dITSgilVBWYb05uzKdxDXdt05SdI6GoEaFR5"); yield return (HashHigh: 0xc0a86717adfedfd9UL, HashLow: 0x0e21405a8fcafb86UL, Seed: 0x0000000000000da6L, Ascii: "ydXxM6vIjrISOJL7dQVQUvuIfjOdyiptXUuWcHgFIQwyhmUGeEdVEIdICVUSzuRlMwatIE9scF85DNJZjksaYGblCeaawoBgDylTFIdlipgQ10BGxVbrpbRGAE2vshvgbLRmyteU7yt0CKOkZDIxdW3QF39G"); yield return (HashHigh: 0x2036a451068584d0UL, HashLow: 0x10f79f60d94e4455UL, Seed: 0x50cc1ea8563a34c9L, Ascii: "Tubapz3FQuUbljkXjfqs94japLyuOfNYxMXcwosPdRM8udnzFzivbsa9ovq35KJ7Kqc1fTN83wajhIG01T3JLfGl2hV2R4eoWzgJvTdqzDs6Co9PVHRqPIIycaEUwA7SrxiVvcoHXJm5KITZI3QznRShpZqOL"); yield return (HashHigh: 0x710b20a1b5ef6239UL, HashLow: 0x8e179eca51c1099aUL, Seed: 0x25ce729810d4079bL, Ascii: "Vs2XzwmoUIY89K94OPUdTm8JiYJ8QMyf9DseOZDlP4M5nnJEBIzpHyToV5wY3NwOjfscaPTB2mhVgIHvs0O1WtELXX2KyLyP8u0ynBdPWKCQzwl6GAkC1yfx1BYRMr82X9rLDYW4nfObG4XKAhIEZd3MCzEua"); yield return (HashHigh: 0x167df0d01a3cb63eUL, HashLow: 0x9a9b65ef84871f14UL, Seed: 0x1e01bf58a2995f69L, Ascii: "3Qw7U87hMFvrz9vXTV3cq6wulh5uZgo0XzyZLMgLNpNeYBeKCXi3GpVuTjSiiXm9hiL7YJ5ZK93V3SsrWhK3CrIXBhm7m69kGBwgxY7aF9idxWcPiCwJru66lI11Ep1gUGdUmyyCqmurzqpv1uE4ZbXITcvRt"); yield return (HashHigh: 0x5e5e09b08ad55e90UL, HashLow: 0x714381efc5892d5bUL, Seed: 0x0000000000001b7aL, Ascii: "teilLoRmzlGc5Ebm3B3ArhH6f1sZ2qAyVXyiurRzZ2Sy9yoBrN8SktjjlU2TWHr5NUPC9zz1zX0FW8sk6xobnfSdsdet0JgidHflK4IeQLhWeGJTg04jEei5YiFt6abmfyGvIddICdNtDtN93IZBKou35UYxN"); yield return (HashHigh: 0xebece3096fdf3523UL, HashLow: 0x992b35c9a8d6e370UL, Seed: 0x23fd58b8d01cf794L, Ascii: "HMAPg9YS9ggf6OGW8eQzUFvysR7jmGcwAjMltQ8mXMiN0nrCtKqhRaQQyc8WiBZpgLtTsgvBaKfPglRA2HPLNzu28Q6xNG2UEvhdS1qJRYBglRDBItcN1pwjIyCeewM00wTToh03nXXP9xUS2Odv1S4CAzxeKG"); yield return (HashHigh: 0x0becceaf5fb196f9UL, HashLow: 0x2c82a10629b452a7UL, Seed: 0x00000000000007a7L, Ascii: "rEcZMF0bj2imyLVxiuOUlM6pMlC6gwo5fWlYNx1UjDb8RyGf2JUrYbvDz9SpUzeJ0EE7e83PSVVtUKPE6wioBQ3DiH3b9nRXD37LstFYriMdcT5omHHZxZvR08yqitrpRIJtTVFFTUAIgoRZxpgJGW8ssAkmY9"); yield return (HashHigh: 0x7eda0ab5418f5599UL, HashLow: 0x1abcf02977c08ef4UL, Seed: 0x0000000000000607L, Ascii: "VUAU8d9A9JaJxsMHWm9DSsa3fU0LX1HVe0pGTZoVGcQMrtikk4fAJPUi1Zl9U6Vy5lkkwY94EdxY31VPcKfm94kviQ9a3uelIligqUQ9KtachOw6wm1sCTnJ3dDmZGzbUafyFOe2TgIQf2iORP8BzOPwt4pn87"); yield return (HashHigh: 0x913992f5431498aaUL, HashLow: 0x55f6b082c3074b3cUL, Seed: 0x3c2902e3451cc760L, Ascii: "KjchkxMHEzdw2pPGSaSMmmnTtUJmzf0XkICXwpEaC0W8Jsfm0At8azF9hdcoZnYSGD0DXASpWQvLCBQH9bJP17gRsJvH56shCfgTzp7ns9NYYEao2tJj0zIjbQMmMTo5cNEtfQl6xGZENSWwqfXUn6WLd1NM7P"); yield return (HashHigh: 0xe53ff56ac0850865UL, HashLow: 0xd05a46c85431d126UL, Seed: 0x0000000000000000L, Ascii: "IiBxrgW2w6mBZzsR6GeF9sB3l7I34uKW95L9NvrwMl85aUozrXwYXHxb6UE6EjasVcMOOFxSkH2gUxWeWb5Frf5HmadebjNQmbe76g8NGqnGpNEOhmwwbH9areTGnF1dzck6cZRbuwAOdBndLxzp8CXqwQtXpmM"); yield return (HashHigh: 0x77f3acc4a79702d1UL, HashLow: 0x877817e65309e04aUL, Seed: 0x0000000000000000L, Ascii: "1NceKUaAZTYZ0iecBTH3JkOcsfT71BIsuY0AuyMA2fxlaoe8e26upSR9vGKl97oBMgZKPw5lTPSb5UCemUoGNYqHSVNUmqsRrNezeFXS5L8mnAhfgYa2i1VCoYnRP1wtwYFHdJ7wqZNNmHkxUmqGMuQdJu71axT"); yield return (HashHigh: 0x0010e3c1c07669aaUL, HashLow: 0x300983f5cfa705cfUL, Seed: 0x6777505caa5b9166L, Ascii: "lIrKpXvXKWI16oZEvS9Fs7BWiwjrFVDdEW4zVb9gt1WiIodsSfXtqu20Z2WlCdQEsEMKi6aL4IhOtG3u603nRTb86R77S1eiAaOjDTdAxVmCeTzQLGz1LnMtNmyC6n82mOt0dD5qsA76opQZmA1VjnYB4TGuIbu"); yield return (HashHigh: 0xd00279ab4df8a58cUL, HashLow: 0x776e20f501ef727fUL, Seed: 0x00000000000018acL, Ascii: "QtxcQDjjVqymMG4ESynWyEtG5J48iGfFg8DYczpwOo6MoeEYwqTtAVOpdCLFhJkiAnaAxvGy3YOJxnoMrk9ubOSWeWAKx0OmuQMtQBuJAtZyWuIYfngKLAfWVcfbbKfz2HJFNbbJILQhjVwvkI05Fr7xnfPMB5e"); yield return (HashHigh: 0x7191d5e0d74e2b30UL, HashLow: 0x02d407cf0a5dfdd1UL, Seed: 0x1c8c8928397043ebL, Ascii: "Y7fXUKQipnEtMzOFxH3rZojzw9HUw0pko7wNGm8IqYruxttgBScSAgj6uN9x40EYFq0DNdetX4eqplZRFaayvPlR70XlvX55JQu2ClGpveMdHbh3LDJInlIJbvGzc50jluJ6xWnPThMRK70ifM69obKUh8QEuLMX"); yield return (HashHigh: 0x31745183c4312c2bUL, HashLow: 0x29fc371ddbbc1270UL, Seed: 0x0000000000000000L, Ascii: "HzVRodZLoIsR7yjNoOvev7Hx23M4zXYylsuJMgxVPZ2kDdCsyG7JopItDEqZJk1TVHX71xDAvogeOO6fhC9TTZWYm2KtMZCKlYqdDKNvkzXDcHpJcOsDSHxMbkb8BMBZSEzp3PSpk5lbjhsthpKwqCTHyenbTOMB"); yield return (HashHigh: 0x8347a82729e1d1b1UL, HashLow: 0x047fd580bc62c034UL, Seed: 0x3760d5c09f8db647L, Ascii: "ZfRUlMvz6ihV0GtOaUEC6pVp6a6OA59nNTBlt9CtrZ6RKz8317XC0AKWm5PnxVidImQeeX0pRDkuFXmfi5U256QffEbmJdw2NvYvyOQYZmGDWp6UlbwgRVRp2srwEl5dWpuUfMVeyNBMJW1hV4nAgxpAOHYtxTp7"); yield return (HashHigh: 0x37c86788fe7254f4UL, HashLow: 0x34ac2aadc84772c0UL, Seed: 0x0000000000000000L, Ascii: "ao4zfgApzSbgG4Ftq9wf5QgDZirSVqA1PPK546x3LOgNG2JQHhjT65oby3dgQ1Byaqo87dAHtvhbSoMJKJ6gXpEG1ZaGMtDU11jw28rbqkNkPRGhFFA65ZEcTPtiKAHggYfJjxEPQ66UqJrLlYa3GW459GVPeoFo"); yield return (HashHigh: 0x702f9caa1fe83a57UL, HashLow: 0x1ad19dc0b1cb4298UL, Seed: 0x79e642717fbf5a27L, Ascii: "8soJhddrb3vn3BzioBaOmKi0Fo0mbjpFyrpcc5mJ0VnCWjS0YyBOswiRTMoVQYxoNdN2k2wzkJX23QwpXACid2h86nv27YnPS1L5rpIhFqdTROgS5r6mNFRTxbQFAvbqu00nCzxKgw5GJu4qvB7ipXbnpWjWu9SWB"); yield return (HashHigh: 0xb2da83048486a843UL, HashLow: 0x8fd1449b08d84631UL, Seed: 0x0000000000000000L, Ascii: "uCTbnQFcR82L2E59yMlIT8LsKURuLM0RZUlCODP8ArNwhlkRAetszECVonCjW1QSVB4xYvzusAb164DU66ElcODEaV15ufuztpD6tT82Sj9R6tcdLYOBC6aNMvnimakXTYkNvi091QRpPST1jOoNlJWWOUtYYE0lp"); yield return (HashHigh: 0x1fdd0173c6008b82UL, HashLow: 0x7cffe4234efae13aUL, Seed: 0x000000000000047bL, Ascii: "MvbXwjtP6WnGNEVx4iJ61MGaEwTZIAfCBwHX9WKOXCl1UAP0h84AhcG9iz6WZOme36zlkXdrJkDa1UQNZmcg0JrX9oNXPLha84UD4o8TNCSkbEitP3L70Aasn1Jjyw5UbFvcSNHMNBhEgBBF7b3olBorHCCSzYaGX"); yield return (HashHigh: 0x69c8483b197d2b3eUL, HashLow: 0x07b4631ff422cda1UL, Seed: 0x00000000000021b6L, Ascii: "HjFuXIJSeEXBU445lsex6x1BJeMOmD0OlaqLRwQIJSnBbwfAUv3muHK5t5kH9Dr1oDbSzs4zJ84D5UDoFvKBwMUJWZc5jGTE5gtpTznhVoTRXIKtAzIzysg8pA2aTvUeoYTTo0DNUHwYddlvMriG3HPEOuwPZDs9W"); yield return (HashHigh: 0xe96c1fb346eb09a0UL, HashLow: 0xab3dad0f03e04e52UL, Seed: 0x0000000000000000L, Ascii: "0gABXgE7m768NXW5kMNQ8ouE7LuSq4ncHhBP2jblEAqHn2rFhuLSNoD4LXmhvfYlDpEueh9IIps1UXmwEEUfoRCZLXwMwJd86nyFcA2finm7MsVOKCbAnGnsHh0aXcgcB9bJ7UZc6xlrSAbyzESkeyQOY4mWKyJhyf"); yield return (HashHigh: 0x13980da167fd31d4UL, HashLow: 0x55cdf4b576c9a190UL, Seed: 0x00000000000026e2L, Ascii: "m46SbDPvUCuopzRosoOzoh1svBy4yg7SU4XYnJOmD9bLDdTFx6Tfkf7BHOmaJcx445mUtBHw1NpuyMYCUfp8kD3CUDpN3oDGmzpnvS1ei2r78tQn2rPSu70n75s4wXQukEvbtkQVE3zbSCl0h1h0vmjy4vGqz1T9sZ"); yield return (HashHigh: 0xa4a7a2f1ed370b2aUL, HashLow: 0xd3420621784f50ecUL, Seed: 0x0000000000002674L, Ascii: "Otm5vGmVV6jF8TLUAHeHnxtSvH667GG88QdLrHzvJFdsmhiAZotqgmidTP3skJIf7YgM904PRVEGntlT0F0vAP5883qPKINAB1lj5NDGYTlU8UTkjM1eDziygtyKTaoftVW0JXVvZOldbL9K9f1p95YyzGxHxdeQER"); yield return (HashHigh: 0xc64d95640c1e4756UL, HashLow: 0xe6994773f20366adUL, Seed: 0x0000000000000000L, Ascii: "4oiCjBB9RQvl2aEzhG6Mq2J5kxxzj0xuJQfd4OXoOkOPT3Wfbg1E4Dvi3ch5VN8Zni4udCQlQqEOvhORazvnulCyZme9t5OoAIVxB48wWdJWhZuHOsPsziX1Hi5DMRCnyuphm8IHtUP6eE9XUoaPn7DCiEujVnusWJ"); yield return (HashHigh: 0xbfc74a714df51f94UL, HashLow: 0xbf2853c55f9d2fd5UL, Seed: 0x0000000000000000L, Ascii: "ay05ztOO6vxffFs5jon3nuCYOE5RrLdooRRDibetaLfWwMYgkSuj4wZLQeLSFDIy9UdhSLRjGN6AkSxUuDxNaZmvXboqH6ox7WOM0SvRur6fsVaHgkZ2yM4X9ybQRSQK43kWEsIwOJn81YXgMLrA2G0Jl1BWtbSDTsq"); yield return (HashHigh: 0x475e2118386c16c5UL, HashLow: 0x2d9b637b67eb6236UL, Seed: 0x0000000000000fc6L, Ascii: "0TC1betJD5n0UTWOYp9KG3stDTCK4IRpCzPPdLjIQlmgweMdDtRQDJq6RwTVHZEMVOxmaEttgkuxKI0LyA9VM1CBIeZuVK6w1wAai6LGTIh5S2qcYiZkFRKrurNLie89NfRM1gGuiz5SWpkMih3sWhOL51fKRxSK9aB"); yield return (HashHigh: 0x55d822ae3bf4c8e4UL, HashLow: 0xf0b4338f997ec38aUL, Seed: 0x0000000000000fb9L, Ascii: "7tBqI0zFhDi2TI7n2fVF6t7tfaisgpZNTEzJK8XBO6TDX2oGNERANFK5EzzA2npjI63vefCaDtNBHPQJVUhenNWwjMJ8rVdeerM7PlZyJqTBnXIEnFpfSnWCg55PsDXsQo4tX8LgxM1HYiwhab8FB5o9tdCpwWjsGa7"); yield return (HashHigh: 0xb177a7d281e70903UL, HashLow: 0x6642a1661e1dfe3eUL, Seed: 0x000000000000019bL, Ascii: "ogI7UGx94eVJAUXcfXLLAip89FeiJNgZhSLyctvpO0WAPpVbLqmB8aY2pbdMrDIaJJGQ63OCp5vj53b5AhuU9qeun2C43v5F0fBFaeuCs9g5e7X5w3PC50IHNm3dt0NDZNiesyt8YtrYhFuVyW3Gwiyn9lQnkQOFRJG"); yield return (HashHigh: 0x190e4cc15dbb84fcUL, HashLow: 0xa95602ea7a6b049bUL, Seed: 0x0000000000000000L, Ascii: "d3OblcFTEllzMGUk7FKNQM4yuV9i9PzQQtPs3G9bxbseeHRfnywdCkvv3btlshYExqVG3fFh39Wqqp0re0umNfJhdQDn3aKix002yzbWaqsBifnYMbSoPg6GyzOIRpSE9Ev7qtB8AtOPi3Ehvcs0t17rLS1oEPXEfjwJ"); yield return (HashHigh: 0x18b6817ecd7ba2cbUL, HashLow: 0x4981cbe58b07ada9UL, Seed: 0x0000000000000595L, Ascii: "39a2kzihtWSooZlSR0E6zMij0MRIGFOoP1AVVPtxT7l28cUUStWSYzkmtAj7fdHaoYkF6IamxRE9d9RJ66bgcvxE7PtwXYEwE90aQ4Dzg7OeBX7EdUw4jWNtPpi0aLRQDzGqLk0sCrqDxDAfyu7rJufUSHxB6dEa0Fwj"); yield return (HashHigh: 0xf60fe6319c931d14UL, HashLow: 0x1e46ffeeb3f98408UL, Seed: 0x000000000000144bL, Ascii: "nqNm2Z9wJ53A0uCS5at6v1SLNTQKxldOhyLTaAAsqwuUCxqz5AwEr94jklUcI5ewVWc048aDkoaumWZVkq4PDQWn3uuBb77tJ6QrOHsT1lTu7XPrxuDnumG6Io2qyJkVKoQ3pfNLPs59fTbCLyCsXkoBt7XUPtTbs31S"); yield return (HashHigh: 0x59cf6efb67a89104UL, HashLow: 0x1e69d10c8fdeff2bUL, Seed: 0x0000000000001b64L, Ascii: "VFFUtoHwiGTiDo5Ce8wpCGFcpwREf6m9CfWejh9KcqlekxNxhlsShqOfY79Y6rbBdhYKIf6lQKO7lkwFlvSGWQV2tCZH9sUz6NVVcuogH1RtzmNfnGILLHpwFU3NAI1eAOhmXqPoMVvWbTzQ5vgIEKZ4Vhk5kDL9FO6M"); yield return (HashHigh: 0xbc6133ee2a1394efUL, HashLow: 0x2ebad593f2de9e4aUL, Seed: 0x0000000000000ec4L, Ascii: "EYWylwmIZryh8ywRf9p7fGwyl6auKZm2B5DUfvG9Tp58RmcISiDmaGhQFbPVp2sAe4xQQi7eixU4m73nB6iKhJCQJjtoNssxWwoWCQpA0r0K1L37pGyMf6toUC31c50oyVwJfppdO0g4vBAECaBoHAMVoqA5xtnLlYrFJ"); yield return (HashHigh: 0x98ca9dbe5d8b2c46UL, HashLow: 0xe9a7b1743eaa5260UL, Seed: 0x5f0f8f008cb448ccL, Ascii: "TSGEoEUeacXsHOsAUHFL5Ya5zEVOnMgtYZyBYOI8d5euiYw7PavCK7xAIhGJ1EaMtNrKQLzaZS2y4jyfvGXWedGHClfC04zhGPRbsvVKIa7aXGMFaIq3Stzj65D3brutKMvcQZYOIK90LXL47LyLUIZN3DHSrzOOgmm4P"); yield return (HashHigh: 0xc52b091d5444c7ceUL, HashLow: 0x0571a3c218987ab1UL, Seed: 0x20f0f02e5f401aebL, Ascii: "JxyYsERzBkehNnCb8CrNUJ8vomqJQ3AvKUW9xczR6nZBCRQ70OoLMFag4sd9uUO2iaMfpej7iP1X72WtH8htlavohdGxefkScgi2iZVRD1S5s6E5JP0XaIFJ2whK28hrumfLRbwQBh2eCgK4OGNM2Vm866u7m5N7IsBQn"); yield return (HashHigh: 0xb0661164bc99dac2UL, HashLow: 0x0091985bb0faf198UL, Seed: 0x0000000000001295L, Ascii: "mGHQ0u4zgPiTK747dKXZmbfNi9ysFykGTrJmSRpCE4s7gow05r971UvrqDWNGPKjjZZcJg0ZvvhV0lslVsZ6a3yw3AXHS06Wp2QSpQuskJrMLiAnzu6LgKGKMc21D8O7hnr4820P506ZiGzVfeO0CeB4toFYNd7PVB96l"); yield return (HashHigh: 0x13d820a85079dbb8UL, HashLow: 0xc234d6da41754b85UL, Seed: 0x00000000000008cfL, Ascii: "B2ODuv3lFxt3qofD7lNmxvzpINollwlEZodmWjMPYHn29b2RsUCMGjMkYcxJKUpF4LNC14283aowzsqa2VrtUuQUyQFCIC5qcUcj0ABEDnhzUkk5rHnLVs17rhUeaCQfijc9ubvFzT6dVPasAYFu1ERHMiXctm21kwKuaC"); yield return (HashHigh: 0x156d55e92dd16559UL, HashLow: 0x3ad31a70b4169bbcUL, Seed: 0x0000000000001246L, Ascii: "bKUMbezUjDvlxfV2DrfYQZrIef9tk9zupc8xyyq9LK0zQ0U1BgM7s6JAafSQXmK9lVYLLckbaULYxmhnaVjvwLStHZrld0g5W5UDgIygHvoBeXB6OYsuUbfjmP4LrHzFr28kBmqzmfhYJSv3PnBArSleZxfLoSU0lfh8Fl"); yield return (HashHigh: 0x7e32224321d14130UL, HashLow: 0x0d4b0583fb4eb7f5UL, Seed: 0x1b007726071e7058L, Ascii: "4KW4aAYsR6GkllK4WGt6RkzTPVw6arqy6tVMmra4diCo7iIoCxwAICkGpMITGYt5NXWYxNGwekswGjPU2oNA38EiWGWohCCR0NJMX3NAzbn85kq3G1ntdVWpV2CxK0QVbkCRsVymxKuD58qPblbD5NMq1tGZWPTY8PNlw4"); yield return (HashHigh: 0x8489fe8da06167d5UL, HashLow: 0x1744abae93c39944UL, Seed: 0x0000000000000a11L, Ascii: "uFwcXzidGnJX0g1fRClmTSHrfpB2p7ZriGoq9a5GkMiqmdihUfOg3cC5WbYVWnWSU2szmeeolCLnT62oWrNNeIyQE3xAebkWRjQ0wJMvFNCZtkhDcZxX5nHT0pkMDk2W7xmT8MgN4bYO0Ze3ToN7oONG4JVPAYODqS3HTu"); yield return (HashHigh: 0x8263e3c2bf745f71UL, HashLow: 0x6780c6353f4b6f02UL, Seed: 0x0000000000001c19L, Ascii: "FAuCN3mA3XboKGeskyl2jzyDFlcRwrtSUuih2vLkE5nELy3xGKB4bSnzhkyHMBCjvfpyqsqohAr5HmwdEacCZ5TWa0aym063UJpDnFN9EUErtqFARiq1Bgv6BxBaQiIDB0InavI1cKbznOUddVxS6uPXPt1RM3Ae2eqWwZP"); yield return (HashHigh: 0xfd6841f2f18c5262UL, HashLow: 0x181b3f1fa4002141UL, Seed: 0x0000000000000ea8L, Ascii: "DmmRYqWD0NqRtiUbaLLodxyDMcmFavA6AYfaN75Xu4WbVALfC0pGrM82bX8zG63Jbd4Jf08qTi1EyVohXkiqCcavOE0i1txTl2fpIOtYuIXL9sc2eonjbuLjoxG8Y6BQWEaqP0h4AZFcFYD7edvqZpek4s7JI5gUpRgQmzF"); yield return (HashHigh: 0x93dc0aa6251be6b4UL, HashLow: 0x5e6c9a4de565a086UL, Seed: 0x0000000000001e25L, Ascii: "oLpP6h4aqJFX2oEbIMGtrKEHJu9K1mZsv5C1COJdEsHraUyHBKJJjWaaSaqy5YErcJFosnEBvOL9fi196BhwNzPm7tc88Dv2ZuARvIffOZkuzB640TND6To0lUmar92iTs0tHshgbzscV4qSkKoAWwuieAonG8CUOVaYvqv"); yield return (HashHigh: 0x964b3e78919b8a06UL, HashLow: 0x4979b4930dc50b4fUL, Seed: 0x0000000000001eefL, Ascii: "EiFDWQoocRk2oLlnRbTa90CrcSPfE9pHuMEuzw1V6PNk2TEmW596EgXfyAbramxQxDQ6nfLnJi7SK1CXNySz5sXKcSOLWI6bNIbbIO146PIDDKQUeP3UE7jOU9oWiLkd3t8OASON1HmDOMVIFJFDJKQW1eeFeKc8F14buT6"); yield return (HashHigh: 0xf4c9bab56f3c9fe1UL, HashLow: 0x3949c71ed7cd3354UL, Seed: 0x0000000000001686L, Ascii: "G46BeGhk3L6lIhNk20fRI6NHp8t5Y53kfn7UV0F1ZIkjKpsXsGtKw57alhPdT7nTC4QrH2Y9byKZUckDWYO5fdcMhmNlbwjblpXwLsNlqEG1wH9s8wOrdgGZliuLcoqQHXN8aSRNg0v8WHr2IRjyjwKQx392I1Qg36m3tDGW"); yield return (HashHigh: 0xb85f97bd5a7cf658UL, HashLow: 0xc1103d58a79a2f0bUL, Seed: 0x7ee96f72c661a920L, Ascii: "lXCf0G9tGPCiFzFhhJPNwavhc81yh3imEgZwfBTzdWqD1Ehg0mSFGDZKa7onMP9QPaEkdv5xkX4Ozc2H9v6RQjVdzq7s9KeM9BuPqllVAvZl0RUs5jq1omWntpf7QG5dBz8GD8eoVMX0RfG0f1FJ2bc3z6WWtCSNGLsoXkG1"); yield return (HashHigh: 0x48eba4a506993ce6UL, HashLow: 0x1ed7516893000976UL, Seed: 0x0000000000000000L, Ascii: "DV3Mg3Jhs0IdFiNXmyHyV8WG0bRMEJrzNMgQuUlrEozWsJY4FwzYoiro2xv1Cuv3VhlkLfj2Zzjw4ssWF0jpnEp60iUXF6L7JxXE8Q5ZmcuoxbeIaqiJMUFu1HYjHnwtQY1YA9JmEbAUtbQyjRwr6U2n0So95SY0dhzcnWAg"); yield return (HashHigh: 0x50fe8bea606cb254UL, HashLow: 0x83ad0668bfb57be3UL, Seed: 0x0000000000000000L, Ascii: "UFYQ6EksaCxSOFR9IBWTaqOlTPWBamLYhNOJ2bSRjTrYwNJqbgqYdPF2VnzyyKDd7hmJP3JSaCtDscRlCIUTVImZvPeLKwYzaMjiWAoaAKf5U47OrSWfCvlCWWaMtkTBRjlVguOEPiw0piqbp4v1BnPkO53qofFOSyFS9hU2"); yield return (HashHigh: 0xf9ed5d76217b133fUL, HashLow: 0xf4cac77651431689UL, Seed: 0x0000000000000736L, Ascii: "Ycfm5RRicse1McJ3pUaQasVQCBPB4fMn4UFJnkZGy2Jz3qU3rmTWldgtsQqqNlNewIBsXBWbCKVw6rnCxsOTkUwpSt94mRQBUzgng9c8K0txX7sDUkQfQ2obbhyCeMChfhDyv9iYb32hfLDc2qTwiyjAqe7mIBa2YBac5YLMa"); yield return (HashHigh: 0x50894f2aedd70fa3UL, HashLow: 0x893ec422e4e3d72dUL, Seed: 0x0000000000000000L, Ascii: "TGrNfG6t279sfcTxZwhV8q4w5qWLjC4fCHAxc2BybPffMlwUA6SbAhiYRnJ1FSX2Ve9ycbDKM8ndkJf1G4BWfxispDLNAFDqeZnG8GyfelRK0njYMQgqCcYlIeYXhkLw2TNR3HiR0vKNDeo0PjHFTB2aCHEPG5ZZ3yoGwYaGX"); yield return (HashHigh: 0xee498cdbf46484e1UL, HashLow: 0xde46f2caf14a94dfUL, Seed: 0x0000000000001099L, Ascii: "byYoDNAqkwTTjOJzPNGT1QjYBHXqSGpMBXFika3fsMjPm4WIUSBX8RzfAYsntzlZv22amjp8LpyQmHwK5YceDrZe2D8ZNLplxeQ1cAOQRwNJG7wIVZDS6OBWJakx9dwXdTLtIul8jicOX6YwCkgneMI8qG9AeqB7oPPSSRbAJ"); yield return (HashHigh: 0x020bcd0e20dc907cUL, HashLow: 0x6b049025463a099dUL, Seed: 0x0000000000000000L, Ascii: "eFvEvT511W4r8irHUFyq5xVn0CqRS6w3UaLXKTXjTfRDrOtidaDnlJ7n5BxsBPqs8wJYqsy2xKs0c2xpcOMQuY2eM7XKbeXlwCnKbfGMsjOoBx702j5CISzowT8lA9hVLHTOLT5ptWOprU2Cazt7SlhXvQpjCutzWxQNbwm4f"); yield return (HashHigh: 0x778d6ac68596886eUL, HashLow: 0x8b521faeaa7f0ae7UL, Seed: 0x0000000000000000L, Ascii: "69t4PnV9HZjqxyd614OpQ4UUVFaLwLZjHwswUVhd9w5WRpOOkgLHwinBSOTBdBGdzVcD5LlQ8rfEfG0PUPY8OpcXvxLFSp5y690sQPgisz3dsZQkPGwTfRWXniGtLugTEV9DvBqe26JsflgQ3WrAgL61pesPLqUjGQOjTZ1SOs"); yield return (HashHigh: 0x43b59cde0bd1ea06UL, HashLow: 0x976649111906d646UL, Seed: 0x5b6591895d28d90dL, Ascii: "7LoO3KeIOyuTzZUVLLhkpHHDk73ESMrTtrgAvb8u43USMk6oWdez3ltcbz5dufMfnBRJG1oTNFArxx2YJqO3i8UVdkAA6Xar24iigoQIN4wYHZGJ1HKJJkcVunTR0rQrcwaKTxxgDqo0wd4YdAxx85mNT59P3uRpGpHIhYBFzo"); yield return (HashHigh: 0x01e8375fdcf288fbUL, HashLow: 0xe6f047aeb8f4caaaUL, Seed: 0x0000000000000f3dL, Ascii: "yphlsnEFmkZwrMKri2QCAhHbNnMViBQuLV06ja42hK7D68O8Y9TkFO5mwYVZVAqnbEw5i3D1XNcmsyfyk5CmKQHq74h6YSN8291cBDvQ8lCdUeVRPxE8Jqds47truLtYK2xPMuYoY2I0aQcRNdWR5JIdtQe7KSBEzyR3qgVmYc"); yield return (HashHigh: 0x62fb0aae35603ceeUL, HashLow: 0x35e6a50dba0142d6UL, Seed: 0x0000000000000a6bL, Ascii: "RNjhtZxCyOOjXrJABHwbEp3oXQIfeYijz2H6a965ITyBXArhkw49dtRSmpdakArrBtgMLRpzG7FPn8aKdCTh6bbxcMTUYfUH8HVAAtedFqyX7jJ9jyI4FrkPOKSiEjXpL06mlyJFGZV4wXNMlygi579Dl6EF9I1cItF5Y4zrhx"); yield return (HashHigh: 0xcabfdbb5aa4bc3afUL, HashLow: 0x11ee1c6bfb6942e9UL, Seed: 0x4bbf94d0e3316a9eL, Ascii: "Ve5FS4djrjD7bhCuXFhvQceTEKnr1ILCeEyfEmznIfIfDLxNBB5teSTP7EIQM9AxNe9GqivC7aU0e84LHgJcbURShbVfJ74rs1VbkLB1jKFqkq2dGmNyKJJMBTd7NhSoe8Xxo0a7zV7173HbVSotvDmcZkroJQWFLXidem3vpNn"); yield return (HashHigh: 0xf167bc9f31d02ba4UL, HashLow: 0x8c659dcc845e0418UL, Seed: 0x00000000000008a1L, Ascii: "SxYJKtcy22X2DlPHAXXvX8H8dwsHH2s2BDp0KMWaF6gBut1nEArXUoHGKOq9aMhBHYr7zjWJ0ANdPVFsZQBVsxuJ39K6rQGrI2NJNwikoCL0cLSa8rLGSyu735qpa42kgaigj6RmDgnc47p7HfHPyvudYV18oqK8cDiBdEJ160B"); yield return (HashHigh: 0x0864011cfb8b65ddUL, HashLow: 0x3eba99ac53b9c432UL, Seed: 0x00000000000016caL, Ascii: "t7J7gMiUNjRyVclvZ4jDA5GLmxDLHR0Nz3JaLBoNq6mWPYUp5QNCEMOZ4qDnjHT9Mo2RgdKtGGeT8axHb0lrM5WhQX31Lzh5nITkU1WUpKhKXAnVvXvpPC5FjRexZRwgjAkE1lgNlMZBA3MNr3sagaJLrZQoREGAJq8EVYcWror"); yield return (HashHigh: 0x11a022f54ea382e9UL, HashLow: 0x0d6e442c556dd575UL, Seed: 0x0000000000001d40L, Ascii: "f9Sl7veXY1JwUr5KTQaQauyOVxeD6iuWp7KzhBsUI07Qp69jUqlpqPG1propVwt9pAcghPpr3vOkuHPWdtCcpsQ17YTC1MrZqv1vUs21zHHono4ITzSP4vCXzguU2SiMd3zltIi1O4MOb9nEyduJGDzy0aIJA6V6moDBYykyxft"); yield return (HashHigh: 0xfaae73443af8fbe1UL, HashLow: 0xa0bb3b31a76670d2UL, Seed: 0x0000000000002639L, Ascii: "DPFLTNJwyO15kY2flHP2CJjYhGs7cCxhIdiXdOvScO4JY1HAyqyjrzN1W4AKXCkVTQnNoD8p3QvisKTeK1jFRPMrplnoxyDti2f9vFLkIadn43txwZtwudaqzixWHdj26LHvQKYdHo67lEaxWOqxV5R6nXYChKDZm382oeW4Avbx"); yield return (HashHigh: 0xdcd41291711fc457UL, HashLow: 0x08dc9cbe1bc37ba8UL, Seed: 0x0000000000000b97L, Ascii: "li8b9ODwJRG7oQ2xanuTE1TdLAGxVNqexRDdsN5yvD5vwcgkF09F8Z3e4jQZcPKsQ7Rse1k14tm91z34vTxBHbBhhht2s9UuYr0RgmZP1t14hCtxxHGbfn7iXTxxce1RDMzyOBjV8TD1L2uiev7XK4QfigJZ8ZbJ6ZkBjea3r7zN"); yield return (HashHigh: 0x4362ea87528cf65fUL, HashLow: 0x1c02f7c9fd03623eUL, Seed: 0x41e37724bae99a43L, Ascii: "QXIZfwWkXQkRwZOCC1Rn52AN29lLufsyDdtWMgkN37yUHN8QSTgU23DMke9zphultPnjiXSmuZG4FxAMNkm2Cxvbw2KBUq4lQl2WtW4FY8f2MLu1XYcdwTYRFBDt8EVZRI5OngKLTHB6koRF2NZ1l609ESGyR5WN2lDzlz4heq5U"); yield return (HashHigh: 0x078010e4c09442d2UL, HashLow: 0xacc29fe09d2d618fUL, Seed: 0x0000000000000000L, Ascii: "JN0f75tX7QOtnnD5Uewz0xVY5l9pnTuNBCXQjd62JKAkbqYOGLOKN4qM482gC6TmNyWbjNlVndw4hopzHGJB2thEoNO1d43R5bSDc77jvXeZ8zPp5mfbIAAoTnsFbCFjDVfVtCYHHMz49JE8IWThoguCwoSQDQxLc8e7QRl3hEAh"); yield return (HashHigh: 0x5b4033774bac63d6UL, HashLow: 0xf4b90080241c673bUL, Seed: 0x00000000000006a7L, Ascii: "Si5ePHomZqzQcU8dkfDQsnLpQA4Ys0eUuJQnLnAGU533xVzVwr3i4OR7ajLCR7DOX2Xn91pUCZgQ5yyJ8nfDU6YRBnaSywnkDdrpYp619DpZCBLlzqyCnaCCVPMVOthcXm5o4goGS3yaGxJfRYCnMoy8whFGgM4OREQFbFFF9frAK"); yield return (HashHigh: 0x31d7ebea32534710UL, HashLow: 0x579b64df2a3d6e88UL, Seed: 0x0000000000000000L, Ascii: "qgVnQMzRNPkx4wFffJKN5iSPLgOQwRl9Qxo4oa5Ayi2KaMIB0K03LtzfNYBkKLbj1AbJkTHVlnvtvlNReKJCMmwn3NXSEwp54qNO2lwWQO64u27Moqg0vq5gS5DXfIS9FTOYkWVka6jNfn846s6yQa3iE5sBSeazk4domSEjjw7iF"); yield return (HashHigh: 0xeed387b84454392bUL, HashLow: 0xb2036982f03abbe7UL, Seed: 0x00000000000008fbL, Ascii: "yCh3xyhOIarvSlLsPB54PQ4EoqkQH69UQrhwgUDD8IV6HrCxu5EQMMiWYpeSfnXhtNCGzU5xbsSrK3LxYq7AkZqycazjplStIbeD8IUuaY70dRLh9RGToYfHEJpVKiBRN3Ei4uIksoYq3eM66pZyUag908THDQsFsJrrmqqChdorH"); yield return (HashHigh: 0x683fba73342a0c05UL, HashLow: 0x3b24b27a043aa11bUL, Seed: 0x7f55f3730aa104d1L, Ascii: "OpIHHgp1poW3DqK0flDsZbExyh8odgUdC5KGUIHPZbRp8gxKauoOcdrfuWrwHIz4K4q2QVHIXqCjP5jbCM237CJDSmEXBQm5Xe0fsTgzE7XlPRdeS3QSdrkWEE38FFiTsSlqlQbzCTzI8nREphY9dxViO63kxDkWOKZ1NIeKuUrFC"); yield return (HashHigh: 0x8d31f628ac99633aUL, HashLow: 0x042b00e0f610a5b7UL, Seed: 0x00000000000022c9L, Ascii: "zaA4n2ZzbeHZICkmWLOUqOo6DSpcGaknEnZmULFYD5clAyrvkEkpbktQiYjjs6CgYnd1q5tn5kgAlRKg5IB7jhcD2uEJRNT5AMXvon83GrX64c9cxRsIPNgBODuzvdsFBJOPikJ2IaQgH2O6eoO7mLQw41pQFbVSWvJUnwsWoco1dQ"); yield return (HashHigh: 0x714841c17a4c501fUL, HashLow: 0x98c9ebd473d1d33aUL, Seed: 0x6adc8b669bd6311bL, Ascii: "TBrNqFvW930t1B0Cf7nNX2jvcnnTyuLYHhinwCkeKplwLBZlVtiA3PAqHPtcX5KBT9yvhJtoBMHw0dYhSsSNx8LKHFqe1RrSfjMmp6BLUYrOtbykkf5Zf5dKo8Cw2BY87RoTC04RRsDEMB5s0f2Idyc63aP8wDJ5BqisAH1GSSSG86"); yield return (HashHigh: 0x0ecdc7721ef53c7aUL, HashLow: 0xce3e665b82fb0f60UL, Seed: 0x00000000000017d2L, Ascii: "TQuxURhF6DjeDoo9sGcQt9pTeyy3O709uT8FBfjZZTBiuXl8KPSnJzK0aKWFgHCwu7PMGCkZQw7bWfV5MUGdywz0WUE0twTBeKcmGoCe5XR18R0X1w0XbkC9sFKGZIaTKwbXqeFB46Xrb5CiZnZ9hGVBJKqac8dWO8yVgNzWvsZzWL"); yield return (HashHigh: 0xae86c7e6da343610UL, HashLow: 0x52c19a2b2aa26427UL, Seed: 0x0000000000002194L, Ascii: "ZbzTdTGpIRbfH14hhoaoq8swak0oK0wYRImyQ06Gospcns9avJo7aAxY1xHo1gMrKW6f9ZXqqrkaNB4xx3CZP5egAyN1NNwLz7BLdBlWrpxJWRg7IqSdqsGAVWKt5iNmyTaN8Fhw6yUpxVqruGJyCHQ5zkM8rW6xFSr4gXDIrNzmWC"); yield return (HashHigh: 0xbd4f02c75b23d00aUL, HashLow: 0xc7b67ca38825b072UL, Seed: 0x0000000000000000L, Ascii: "a3zegmCznlfo8ePYK3gLwiSR0viat3PIjkjl7oyt5xQ3QJE4MYrqAW5AJwwCJpNWIO6WpYZsA5EchW8qD0iVec5hRv8NEKDTPopzR8ttgGXtjcO2MFwrR413qxfK3NxxWtdJ5cfJBCzAuSxrdQNYBLfLMy0HaAQ11855fhSvKJ7kQ2z"); yield return (HashHigh: 0xeaa087b5d4869bc5UL, HashLow: 0xfcb0397e4d475450UL, Seed: 0x0000000000000000L, Ascii: "h8cEn1EWrsatjwjYT9bwKJz6Axxs7pQ6f1lvydrOqtkP0UHjyxR1INj5Z3HV089qdMQNxlrKwnGhrlq4I4iKxlTJIvVFM8HzgEaqoh8QQqDABobpN9lbfQsjlbJNM3gH4FSUDrLfNcr6cSAIjqlYEdv1Md0YaDlqsul53iXwpVPgC0c"); yield return (HashHigh: 0x6c8e0ffc04d27b5aUL, HashLow: 0xa843d4ab90b30bfdUL, Seed: 0x0000000000002589L, Ascii: "viOHAyJJSBIki64hUgbwyguF2MhMloJgbw7dAy5pijA3zbJObpRolOrFr7aG4Mx3vXGfr97eHvN5EOaYS85daM70YM7vm0SDijlYdr3C95kfSavEnx5TZlpQuMfwxX7MxfbWUZkxTeJfQVpQos6wBHNIG1kv2f1yIB6gTdZC9CP6Qql"); yield return (HashHigh: 0x52e291cde1ff3c70UL, HashLow: 0xbe53b4541430fe93UL, Seed: 0x0000000000002343L, Ascii: "RN2Ed0iusynRxoH9LTGfbhEB0VE1aE6grVGPqCatvVazhxoTzz4XH6Tfun9YEVLoHnEYGN5ofv7F303wGv06LvwnZQ1HiukdekVchbdcNSeVN3tplqxZERR7HBqJPzOdBkrXcjlrtWKQkEgKRliMpcFxgEj16EDV7Cu8PIvAch3c4oh"); yield return (HashHigh: 0xea176312a5391d3fUL, HashLow: 0x5796c33a93bcf090UL, Seed: 0x0000000000000887L, Ascii: "C6d4lvLwj6L4OtadVcgzbHHXeZnXHHTNwJnlz2ORtfiSiZ5jAKDC5BnOyGuGjMc7wX3JY7TJh00PeCEVoxHn0yF1Nn68OdHnWhjzVoyjOjuG0tFm7Yk9sQbXkPqbCa47fkxQbjXna2qenclMYTSfng0yauu2xMxnQY3qcKbrpSrdED65"); yield return (HashHigh: 0x77d149fb1c1bbb60UL, HashLow: 0xdf91f97615da47afUL, Seed: 0x00000000000017a3L, Ascii: "dZhFolrz3cgY7Bcq6joKumrEi9JNFY70F2CFIMe2SxObMQYGf52odirMHQcfPCiV60WnFOWJmJBd3rPXdDrcoBdwObFRvCudXHaAWcujfw8c15DGZHlWLk1nZUGIIDR6XYnhgrJ3WETHGQ4877JEWt5I0qVenQyQezpDz09mX6CK2zhx"); yield return (HashHigh: 0x0052ead23718fb97UL, HashLow: 0x2b20b26782f12dc2UL, Seed: 0x000000000000230bL, Ascii: "dLsYLvmOQYnDDlxDUXalLzd1hFQggKxJBB1jtWnePp2t4GQUK8AvuEtXsih6rvdB4r85lthPIhkcDVcGmFrKLMuYfzm3N8eCSfab9WD1MztTJkUxckYzMSuynESDlLUVWbxlgeHSevClVjKvqpsHCa007dEsuSiIvswFmnH8a0mQUpRh"); yield return (HashHigh: 0x2a8aa8329e17d7f2UL, HashLow: 0x01d0c60ac482e355UL, Seed: 0x0000000000000000L, Ascii: "J57JXjaL5JLObJQ3oUgLErePCRDzNmtkBDUmVsU1pwTtydAIDL1pGiAbRqimx2z3aUDtLp01F9NJgpBnTDtvNTSW7UGxL0qe3UhUiKbaAvEbUTWlPvTippmQBnf7yfnGCQCYXIRi3DyCXgvYWwqFR9eqB0ZTXg6WL371956TmsfNHgQQ"); yield return (HashHigh: 0xd81333e21dc966d2UL, HashLow: 0x75810237bcaf7e12UL, Seed: 0x0000000000001dccL, Ascii: "Lq8p2D0n05LdsOWZSC1ZW525PgNUp5nPtzmH2alnzXQg5TZRnrP0aZacyeybvi2KHpPB84lCFZ8CBlk5hvrIbuWo5ji1cwON7QL3AQ3vqVCUbmvnmiO3ylX14r3huWVEtVxFRYVNBjNpv4icH8VoYzfHkmQ2qbamgTz0lmM93qbgIPLnJ"); yield return (HashHigh: 0x426f8be8cabf80fdUL, HashLow: 0x9b1cf70dd5dc5f44UL, Seed: 0x0000000000000000L, Ascii: "VkpCNWkIT5EJxuRljD0VJvqY5oN82jUPkHdXlBkSmHYDCuCuBxCdbZKS4pw93Pd2EohxIGFO06p4BBCsIceenb6IWVVdIiKZ8ikKjpm1gjr9RijjMxzvgvnW75l8VxNt1jAJ1Exyb58zNPP2nwz9rLqlSjEOaCItOQx2rQrnqXC2Lh3dz"); yield return (HashHigh: 0x749253d468c1b764UL, HashLow: 0xf5ba8a765f3ed485UL, Seed: 0x1c30f1d9689a88cdL, Ascii: "HW9zQM7NDJfQSwMCXH53n1SFltoHkx39AdTkKuwTPg8V2MIQcy6SKYtqYNFjiCQW1iDSTQxYLcPmZRarmj4aj4n2psQW2oiKX2Vhlc5KgEdApEXsc5qqYxcDqUzv8nHNDexnAmagY2Cgi5IHC3APhDwT6oEpBslz2gBBUyTfF3iz0g3pD"); yield return (HashHigh: 0xfa76e5960557f0a5UL, HashLow: 0xf5644a5e1ef9c344UL, Seed: 0x0000000000000000L, Ascii: "f0TDQc3ksKMeoz0XKg7ubWELhCTzvrtP8GwCVSJT7lSTo7ucoFlblH79GnkNvOv6gsFxCWWlKjKPFjo5wmOe27DMu9kZ9VXwnTbnGDriFtaH6S7BOR83KHvXm9Y3whL1GEWHQs6sY7XBDmCDwEjtXQmBfx4K22i9YdlU1B64e17JXP1Sd"); yield return (HashHigh: 0x57da73c5d100d1eeUL, HashLow: 0x87dd5d00b9428d8dUL, Seed: 0x0000000000000bd7L, Ascii: "NWqOsKqA2yneMRscJuSwCDRnCcJ8BRZdH5r0bKcFOJ85TB2Wsfx7p7ZIgjyApCuzWbpbqKDYEdwXeMC1n52dQkYehWUhFhi3oVQ6SCilf70cGE5zgktSFkuNbw1gUmXDRiGaXPBnxUZZPwapo05i0onEdQ3XxFV8cGBA0ScipSIujBfgve"); yield return (HashHigh: 0xf35e60cbcfea325bUL, HashLow: 0x82c4ed84e5bfd752UL, Seed: 0x00000000000020afL, Ascii: "eJmud8YcT1ocwrNQ2md1y8jenLAi7CXqWmp0yuPSZtTyHBEu9qMlIDiv64Df98NtF8jWJdNnM7FlYxc8HiLLm51Y9kEpsH6a79ARqNRa9EIR506YqLxQLWz7ai9pOD82iUrXQ3BAMluQk2KkhB7hYeOJ6ZjeWuLeiOndP0kKgJTRvx1U5x"); yield return (HashHigh: 0x8efab55fbd06fbcaUL, HashLow: 0x730cfbb84773719eUL, Seed: 0x0000000000002306L, Ascii: "18fhz9SuiXQoq8efCDhF9ey8dDrXUuripB3dgCC7aRA9JlmLfcpHcqqwFLXoqapfF2IWOPqvISuIfBU6imlz4eIGtdY2TIiX5B3XLX1LuDKhfrescbh8wZWYZyAgMqCq39gIhKLeDOp3FUwtpJ15bgyCcYfXCjZswksZbP82XKMi99Zz39"); yield return (HashHigh: 0xfcfb1ed2ae9be467UL, HashLow: 0xc611816a7dbe53edUL, Seed: 0x0000000000000059L, Ascii: "RSlDwXPk7QRaouwN3ZpDby96hMHm8Pdrchzs8N37NjQa2fhE23jUVBBMRauHxUV9XsHXQRNi4WYqCJqGOsGB3ebRIUKtfRmRCLdte5nYozGvhDB0itCZrLl2KW9YjbYQSylHawBo54P91CJJIyCfZBHtM31GvP4Kf54N9TmfJeHvolInO0"); yield return (HashHigh: 0x8c591e9f650f65abUL, HashLow: 0x7b4807faff71aff8UL, Seed: 0x0000000000001648L, Ascii: "MtdxsWT3aivOWEiFfI3rZeYfyhGraz5WRKGMUMFSew31QObTxntiBuaR5B1lCqHWmyrrMc9rjrKD9BmZ9kkMdrO2veSduNPiJ1E3k79doASJhCN6D4W41aHRUk1tk5d0WRtczms1b4xTQpXklrrPKyuOnD2w4jrIPdQdqhbOYIV9as53Ix6"); yield return (HashHigh: 0x7a84dbe2229148e6UL, HashLow: 0x3c71ade5cccae1eeUL, Seed: 0x0000000000000000L, Ascii: "dZvz5IhrziZVFIqSsMPsTYqm2yZXVlK16KRz9HOnoIVTXndJ9wXy8snmPBlmE4UVKMl43htrrMXmGHnn2uF5TbdXSyMDe4eM1I7nP73FZVj3qcTwyMm1E6Eqgrv6ueXkSDypLaJoO4c91lBehmBBQBfMMbzK12IhAe0oBFfYJNR89WrE2T2"); yield return (HashHigh: 0x1c9ed20f10b15e85UL, HashLow: 0xab82598b27805beaUL, Seed: 0x00000000000011c7L, Ascii: "3pZGgG0wdGRvQKX4q8EyvTnxuNREvdVOd19Oh04AW4cnzcp2rmM1848odP0Hz3MqXI7ZAoEfNv2Dzj4DTSHY8nCF91SZ5zGeWvJtaDcz3IPGAQ08NBb9QT7xXVC65Edx6g6wF93LSKJRemBCmcm4mKdPcV312XXuZeEoORzXUENzizlXQHQ"); yield return (HashHigh: 0x9013f6cefbd7da90UL, HashLow: 0x8226f413a329f3ebUL, Seed: 0x0000000000002462L, Ascii: "7960wj69aXsHI0qmPHgQzqQ5ZW8M9AcuYsUmmNX46uzwCvOx9Uu9KzpFUjhlDu2mwdbvdHfKMnx1td7hAKmLgMKYQ6kvYSevcSWfhNJZAUSVAe1ZzaEzgELBY9hAp4eLv3My39GdzsQPb9F3r0JvVL3B1hvgAGu0QEI8acrOlfcu5KQeFCA"); yield return (HashHigh: 0x1e6f5beb7c2b5ddcUL, HashLow: 0x6ca379d33520d6daUL, Seed: 0x00000000000016d5L, Ascii: "yW2PrCj4oEhwXiS3a3Ap1rsrOqXMwMFSngA5zZvYNHvjEQh1LP6XMFOuAUbUtDLRovZ3TCAtbAo49Bypi1VoKj63sVCe2EIgVb0YKWQs0L8tqRPbwRfrjdbqBqT74SipSqlUFGAD4KL4C9uKXCl7dWIvz8oyAUrmhBpat9teMSiRM80gWL8L"); yield return (HashHigh: 0x595b6d555ebcb501UL, HashLow: 0x4ec3907a264fa28bUL, Seed: 0x0000000000000000L, Ascii: "tKkewASucUiCiFRIrqgHXnih6szxGRKOEe7jgyaepXGV38nRzcyXuvomMBRWW5XcIijG2I9J0VxJsida1PyIJK0evR3PZp8EQpMDmn7PmwFB6JzTRzRurD7YeIXcZFBfryGdpY0sLZQYn6MMbceeRqsxw17mYcs4t1V4wYsnu16iWpKX9olC"); yield return (HashHigh: 0xf727c8160703b060UL, HashLow: 0xe0e1f2f2c4c16976UL, Seed: 0x4e1c2997f7786979L, Ascii: "tx2gAcVeuWYTQnLACJk8GUGaeedDIblXsXQD8ITi9ZmyNNe383ByCRAeytfKe1SYWi1rXT6Y5tcJIqeab3H7NOnZnw3XhItAdbfKpBy2ENJiVyPtSMs1cLlaN2JqmRrdrThygetWxYeVdFxJmawobIdyzvtjnuykne6Pc4cEqthI6kmRe6LN"); yield return (HashHigh: 0x90274619609d3ad3UL, HashLow: 0x64e2fdb2a6393379UL, Seed: 0x0000000000000177L, Ascii: "Pn1S7LvUboNX29kV6hDbNUY2mRLNUJwGqsTomTlo60bvXQEq7pJwdGNlJ5KTLV9RVD7NFegUF982RmmJxXIIQimj4fgvvUYq5jtAkT9OltBJvinqNuYneYRAWLSqh8Xoa9j4z3qiYXhegEJxuaoQ85ePlXcgDyljaPAWaFUZI1b2JCyYtzVp"); yield return (HashHigh: 0xd0ce809f65d51a6cUL, HashLow: 0xf019e440b2a9f8b9UL, Seed: 0x0000000000002484L, Ascii: "flBRRzYt1hrYXdrwGBey2oQuqX0Xe4FeGE0MUhMHnv48P0Tjkm7M9P8xWEp9Mnb4XTnyW7rtNZiodPyCmgS1QGEFeOFluj5m0Qu6YqZ8QEGmTln7Bck7AGhN0KQLwo4ZKTDEOz8GHJK46MEhoV1h47VRhnqwrp08v03FWLQgUub82bR9y2vwm"); yield return (HashHigh: 0xa5386bf2da5d7ed9UL, HashLow: 0x9409f3e192df2f27UL, Seed: 0x3aeda318187a8ceaL, Ascii: "xakiyYp1uPRDpENkGatZqaaVSCqSglYxE3EW75mb6ocRpXxyYtsE96glnTti6Ax34ocuI5kSKu1SUwXYNJeiXVcOR4c1ditIgbJOTWcdSjVVszT1SXkz7h0mX3zbwHkta81pf0yI1iqF0qVy7nbgcI23bOWymEFXFEwVWzqrsh3q0ZyxM0F0m"); yield return (HashHigh: 0xd556eab56954012bUL, HashLow: 0x6349fc948903888bUL, Seed: 0x0000000000000b95L, Ascii: "MAP4ZluXtkCysWGhXgNp8g5XJdAoZgQd69WwQ5kiKcNTJXDAau8YfoAh0wQp3Pt8xRTIwgqpXLibJPkPVWJrJ3a0iVFco3A1cMd9AUZeDlIngYbKUhVkDJ8ySPGymOowWR1bF1G3lJtckamNEcnflIfVUaofCBTJ1juuJgwHqOlYJsgaF9LS8"); yield return (HashHigh: 0x7587bace1fed79a7UL, HashLow: 0x98694af975387964UL, Seed: 0x00000000000023caL, Ascii: "pdI32M9n3BMoIz8POWSaaXprQtrNMbGttrQs1jJhm0dTx6MLRV58Y5Saa1FWxbHcWHlkymDo9VNVUI1KXqmlpZGPEvDcf16uxTkawDZvO8xAXvBaDyHqGNqldJQhsLtz2rRlm4N41SUhKB9Hl6oQjbfmRlRxXc4n4mO7qUdQfsjCjS4h8r4Nl"); yield return (HashHigh: 0x9647f2ee2642fe11UL, HashLow: 0xf01004e49da8f6aeUL, Seed: 0x000000000000096dL, Ascii: "v2yB464jsFYA57ehyggHcHUIDgnlyy2iBToexISkax6CTrlf8haI8QqjZG1YL0hBWOc1JOAahb3IX7Jj8uSAFqKOCOwshDyuih5jisPPzNScDo1NP98EHsujAo5c7EUyDCucvDfyatwjMTDRy1z6NnpdrYKocXpOQfuLRM1RYg9QY2Xo5e6ahq"); yield return (HashHigh: 0x533eff4cf96fa0f4UL, HashLow: 0xe6330ac99d86b66bUL, Seed: 0x0000000000001cebL, Ascii: "d6Z1rQHNfl4razuB91Z7dMCCqIbPUemIl1uCFwp1dkZddKBQ30fhbD2OCRby3hrUTkrG7rGqhOZ35qE0WltDskgeGPZZdkcGMISX41JwjxDXg00a6kDvKupwyQzK868kESLJ8SElB7G3XAu6fNbvwdTFhL43T872PKF7Y6wnkK1dq6fcGuIRNz"); yield return (HashHigh: 0x76552d9af28b6515UL, HashLow: 0xd684e48cd98bf1e6UL, Seed: 0x144723cfee66f76bL, Ascii: "zTUm7XCHKUGnExdeHD4d3n00gJo1dDsJV880dRneEw12DxJQwbkf1kfge90GblTqRwyDEdEqL3ygOc77onaKIux5mSz5DI5O3Lc6r7ynQzOyJ4iBfZUu2IdBT89hdeo2FECqlN4qikHysfz66Cw8umK0xJ7AwJWZGgmt0KsSdm4KSgXDmQumj5"); yield return (HashHigh: 0x4bac13f22d9240c0UL, HashLow: 0x106e5a9b3a661a45UL, Seed: 0x000000000000030aL, Ascii: "a551YE3acidpdsBEAbKSVafw9T5oA2FlaXpDOjBILDTLOJsgqCqR396yARyFkvQWU90eu9lM2Ts14MBuD3ZG0gNHe2txRmCejSR7FPvcYQiqsoCSWE1XYEZqnM7MpNENmCyULgc9jahlaRZcHi6cjivtHBKMgK7GdjKEnhn0oGNG2aJF1Jlm2A"); yield return (HashHigh: 0x09c233be3425aad7UL, HashLow: 0x286f4e05c02a9cebUL, Seed: 0x0000000000000000L, Ascii: "N8zaWjtUPYwptlEtQHKytOaUXDLtti1azxEysaZMzVzXiF29t2gNjwM3DEHyBpRsO5tttioaLgXoLNYBGtmMyrobhVLpzSLlS6HlC44PpvCwimAiyduddCVUUq9giXLMLGNBtmRg5lxhrBfhLyyVTX3uE3u10gfNGnvixQ4sNwzXQVfBW982Fib"); yield return (HashHigh: 0xe9964ed4dca9b6c8UL, HashLow: 0x178a49d366adcaeeUL, Seed: 0x0000000000000d47L, Ascii: "ca0CQsE9xvx5zoHANK3MHhVfwxuu07LZHeEuXwosS1y0ugSBa6pR8ac8SlnS5LB9wFCIUSiDiThnigKVi9UqSoXgFmJ5YN9l6NPJSfB10dCzz6Qxc5uJXhA7H3xqMVE548HLwaen8YQubkRCpVdHgnSPMHKssKchUZxUOlHHgGRbBaLoGIArnce"); yield return (HashHigh: 0x704e7ae0402be062UL, HashLow: 0x3bbbc379ef25faadUL, Seed: 0x5568b6f89bac7088L, Ascii: "QixL5o3UG6iQCF2PplvydxVCtIjonJiKHCdZaEUD1RGjN1gqR4uGMwcB0MZP91IyEhUyu1Rx6DJmRyHGLdFZjLkXMtYAQdfms9G4wvO0QPzAYJbsz3Y5ap8ciOi6LX4aOJWAvf5ziD0uJ1TQWAqupVSpJmu2hsrT193iOYmTbXc1Lfgci75Ai8E"); yield return (HashHigh: 0x6c1a406264ff52f3UL, HashLow: 0x1b3a2fe87d7a903aUL, Seed: 0x0000000000000000L, Ascii: "mnriVJXia45AHhEjsZeismFaGZnDH46U4Ipl07CN39zUsfwNguHdfumNQczQOjbCZjx5EzUGix1989IKEiIIbs19krp5JJRiVBsp6j2r7bwJwaPANOllxQGhzFs18scV8QoVDbG4amGu9LoKKJ5a059GcP3QrahRBfEH0LRLOa99ctrOkojZu3t"); yield return (HashHigh: 0xaaad93ce1ce47555UL, HashLow: 0x80e7bc0b2b241da8UL, Seed: 0x65ad2bc75727a669L, Ascii: "BLwpEgFYeGxJJb1qrdp975NnOy6AWRMj7LA842tJFqWLUUGaa3PsDCa9zOOIIgIiTNTYRJCvBTtPeoXOiTqvKsLs2n3XfNMTLjrBACeUO4J5LbrKToq5URAR9l6DRvsaIlYANAXAEbj4R4FaOFarRUuNt2n0svPqSMZWCQgSRtKmuTSWE4BRTKdg"); yield return (HashHigh: 0x2566d9abe6562bcfUL, HashLow: 0x255888c202842eefUL, Seed: 0x0000000000000000L, Ascii: "ZCMAzC4R4SolVuavlBOqxhSjlr4sRN8x5EWoKzxvN3H3jNjJ1Ckz0NrAdV9bp3tNxN9kwssCM56oEG1KHCTgJ1t0Z10Qes09k1JuO24swHp7Y1IySnK7SqjI0ZwETMCiQFL4qtsXt62ecCRzem3l5HiwXtfkYeBYu793tdJlcRy5V1PRSGkB843g"); yield return (HashHigh: 0x2e704aa1e8413e4aUL, HashLow: 0x535c775b9828526fUL, Seed: 0x0000000000002279L, Ascii: "cHahV0PeKgS4onXHTJYVusiYLXtbgXBHgW36ziefpkCzVBnrhM7N75u7azuu2wIWqkVAoOD0LHhN8MWeFVQsg9ErppcUE22HaCHyXwJ3PKwKf6DylWXe3QXzWMmGMcNe935CA0vBoQvEDA9EawTdxa03SgwUApCF3KcVmYTCA3rfKgkKlyp42Nz7"); yield return (HashHigh: 0x052565cc459ed07cUL, HashLow: 0xa588a8a90b82d2edUL, Seed: 0x0000000000000db3L, Ascii: "21ZCWnU0rbsDyYJIgw7qcYmRCOGF6cT6Ovq4irqpQpU0ATCqh9NvrrW8izTwx1zemE9PS1dxROTOXDLkrSyGBaZDijLUKHjnpLzd5zacpW0H6TaT3HL1pLm5K3obvwavi9V14AOvQGQl0DpgHUHpd5RFFDiGsSM2urjP2yHZrChkjwuKh6cME6Ik"); yield return (HashHigh: 0xf612942c62c65ae6UL, HashLow: 0x38dc577e8251a098UL, Seed: 0x0000000000002345L, Ascii: "z1ioVlUCa5wzoh01a4WOUhY9uj4fNcA2T1HiowIKE5eKPqaJfFB4NSlH0HiWpObtpV55ESYNeVD5gLSp3TOYgRl7VylkpJDUPjniPLSlfHJHVbHN9SIzEPqXn915PIFzrn0LoyMOfWyduJH1vVG4jHgNFKDRNbzIiaznFYUDfGAjmdqusykzTlupo"); yield return (HashHigh: 0x7a86cb6d74f46f09UL, HashLow: 0xfc481702f833d969UL, Seed: 0x50d6ef30cff0396fL, Ascii: "LHditi1jQVTporJKnT90iwBECIdcVV8SCfYL4SwEWYBQygOC523O4beSJERUb4FIszAvarFvFWUUW1ADGk6qiTKk8WJ6QVynphASLoBRP0Ns6KzNJGKBRYkm4MgFnD7klrBvmrMVrwndYNHcoiDiccHFX0tgX2v6dmYfdYmIA8JrpxxCS0F5rywav"); yield return (HashHigh: 0x2426115c57801c4eUL, HashLow: 0x5a8ab15637d25c46UL, Seed: 0x0000000000000967L, Ascii: "aG7JhuytrqbKSBeGsw1M2HFyqPldvTVLlhKrLFZre5arHSuTe7lAdoQkSRGn6Cs2pZXhm4VItNqsjvBEyPatyoIFzxNWwxkuJerDGDDqdQe4ZaA3CtxkwvYeyM1rvP3sNiLbzngb7kbSfaYNUcfrZQSNDn6NOsjL9JQAt5bFYHpdyQmVzIBVicDTe"); yield return (HashHigh: 0xb89120874a5a751fUL, HashLow: 0xe4755f276a5fec43UL, Seed: 0x000000000000127dL, Ascii: "O2FnWmdorQDXrcKFqb4LoICVEjePiqRfSoJj6g7bpQ7L8dIpKjAU1XYA5JYL7pSj04V1L4UZq8SNS51ngDYq8PE5zbMDflca7AIxsU6dVK7i0CusqTWOPU73I2XwjttAyhgO4eHLyIYkkd6rKMdYYAdKObsuLBOs3zDWkSXzEoUTjrcmAOnoSyAFT"); yield return (HashHigh: 0x4a9437d7970c9ee6UL, HashLow: 0x34b2da479b63e462UL, Seed: 0x1f5466a634b2344fL, Ascii: "7UKc1xLfwgsT6EIWH7d9nJ71CZKIlK8f14bJrGtZw4kSj3sBbOi7Et14bEOSyJv7iEOEpUdZr80FOZaZLe21rLXCpEz3eJKhcv2GAc5LLCoHGLvhKT02BoUJYIsTZGy8pasoGSVZ3y5nkO7q43nlU1QyuyI9Tlbp6qxdqEp10ZBXExjttA2ms8EHdh"); yield return (HashHigh: 0x033043b997df9121UL, HashLow: 0xbfb495f480361250UL, Seed: 0x5333704f0de8d057L, Ascii: "KmEMSK9wnBzxZZuLqHt3Rp7Ca8run5dGywtmJ82nnLwpgjF7ef82O7aiOuNtkOmIEPZVO2xGbZxWw6oLbarM6QuPLQxozommRgwfI9ANID1KlxyQfeIQCTZ6FxpjsysZhB06pTk8Ia7aSSq2y3E3z0fU7SRBZKdfbeNoG7V9TOEvgLaDvKMAjtkXS9"); yield return (HashHigh: 0x8ce49661508b800fUL, HashLow: 0x104fb7405d4c12ffUL, Seed: 0x0000000000000d61L, Ascii: "0sWIE1CjQRzucXici9FVQj1X5v15FH5TqDWr2mU9yBjiLg4wX1RzSREVeapJcqd3HOHXyc5WDbNawA8E5f1CNKobgNDvzudSN3B0DU8ThHCNpqeWJji8ZYOMomTzHfvJl7EfhauJEA2AbS6I2YrlLaJRnFsp1FxWZDP90wv35GjDSQgGfPQrXBDsPg"); yield return (HashHigh: 0x5cf4819d192b144fUL, HashLow: 0x413a1370cb73c003UL, Seed: 0x0000000000000000L, Ascii: "j4DP169lyPbb2ngAcgQ8zhCwwZvp8rZpR04glQVUuv149TPFjbM3OFI4AaR9tZ6ywHjI1dj3DJA2cosLJCSdeaPf61tFrjqL1IpA1fmyfZtzUjOC34DZ1hGCKwra4pcwNKzwFtgtvMQBfkoHVCeoO3q43BPFJLxRET8vz1cHQFXVdEHGLTxgSCfO6c"); yield return (HashHigh: 0x4a60204af8fd5160UL, HashLow: 0x0b8fc132793e0973UL, Seed: 0x0000000000000000L, Ascii: "QXvSj1TRkxyJ2oNPhfDScOxR1yysCzWx2xcZClxeQDXB6S76pQgMJ6frZW5WKRPoAfCrZ9qpycaWvRzxo56jBoaTaFcSMvAibeHRoQcSmKLMAX9cC8lY0T4gFjNkO2bqiRy5cUrbS1ksHotXiBQEuT7ukaj3z7qfTa49SfjY5M19c0HobFUAXl9LHZ8"); yield return (HashHigh: 0xac74a766f3820941UL, HashLow: 0x5f5ac295cc8fb2beUL, Seed: 0x000000000000063dL, Ascii: "WDiVQUckZZ9EdzM1Rr7X8Vy3lmiVQJjyHfXjptvM0ND8qvMrZU0mCCTs8JKCsxsRI0vJahOSxvJA2nmo1lBgv1WxMFdomur6rNmhnJT9BBoGNwvjkNWB1RaUW48pf8bjWHxQ5dSQCBurFIM0xSbzAMpD6fbldCHfs3rPCcM0Q5p5Tpg5qvMVMBq8YAS"); yield return (HashHigh: 0x800543faf368d033UL, HashLow: 0x6fb501af8b02a5a4UL, Seed: 0x0f5a789a30d0d57fL, Ascii: "ERqJy7lwgnX8MtZwlGqJDKcBH0oD0qen7ZhM7IqzYTKBZJeHervu5svOIBYpX5QL6yGED1clTZZea20MH1Vqa7TxlBNHqvVQgogH4xPGK3cZVlqs0707DtyX3d90t7X70ZFQ0YrAsjTgFCtwUiqiWBHW6jtOFjX5guRs2AQoKPDQRvQprHJqTbaJpL5"); yield return (HashHigh: 0x60df6933e2b087b1UL, HashLow: 0x05b55899e6e495d5UL, Seed: 0x0000000000000b78L, Ascii: "8qwcfLY0YL8Rhev6F4Yh2UFvKUYFwRNolzqxZWEYKysMwH0SMQs0Q6L3zfvuyfYVf1zTtxmgtc4VaU9w9RBJkbapICbz7Su0IbJrlZj7g5QnJsfX1FlcD3DXJSwFcrbmzUQx5fTqRUingqagLNu74Hk3LdhonukC8qUf2KXxNKlGNHUcta6bD6PmuCD"); yield return (HashHigh: 0x05a220a112399858UL, HashLow: 0x61d378511b077d3dUL, Seed: 0x0000000000000000L, Ascii: "XYn3EnzSkomK6EzY1PaQaoWertGvTTEnrS92QSFEf7Yl0JHfQHdH0aDodYrK7NhJPXKJmC0nJIWucSR3z5O1rtPfZ3YKjcemEShMTZLY5Vo5QUGVfz3qJLR8OJEbFuiUF7lebMcA6n8vTrkxNnAWFq3LeCuW33cS6hgoen4mUsS3aNVNwjWZYPKcuIxU"); yield return (HashHigh: 0xeb34d7dd80c5a279UL, HashLow: 0xd67d7b4c5471d896UL, Seed: 0x0000000000001c87L, Ascii: "psJi17TqMilZ9KIO1XVZap6eFczLL4WtHJiixM5ylMcrKiS2uWrZTnmsxTVAzzKEWN411xYRCtr7ZGIw35Mi7KBTH3TBULI5QCWYxucww28EZyUIC017YdDY1vZPt5H5je8qUux23YTXglhSqFdfDEyfDiN29q2LZFr8j7ro6rCW6k3qpqrzBzysE5iq"); yield return (HashHigh: 0x27cc3347e65b7c04UL, HashLow: 0xe811b1b385409419UL, Seed: 0x000000000000023dL, Ascii: "3EiVYxYs1VPn5fzkC3gpXJfakAtoeKnmmIoE4MOVVUf1ZiaRhd26wB7kec6I4vMtacA94aVdoY9QUEs3xdSVXXABd3IjjCjWLk6OEugYzM66ZJxKIdrKHbZ9znh3tWErWhlGxGVTE3Yi32j8Rud6JGf6WFgi2EZGsaw9MdeGqoNZk69GNaiPXocfNiLD"); yield return (HashHigh: 0x8cc07daadcf457ddUL, HashLow: 0xf87fdb33c99717e8UL, Seed: 0x0000000000000000L, Ascii: "46FpeGnsUKlV4iqKU14iUoDneTxp9ZhoQCscrpXrDYyntdHUDNtIQWYodm9PqZFwm3Dznz97I7inlhxPFa9m9Jq6ee29IvxaRbOo0UwQ8KE9T1AQTVFttkhkn2pZ1l6TKPsPo6wtCL9m2jyEvIY2HcBDQaxKSesVbCTd5Ufy0xaUm6o9Q06ogzJkziAf"); yield return (HashHigh: 0xe10526f13c12ee60UL, HashLow: 0x93c6cbad90ce9eb2UL, Seed: 0x0000000000000000L, Ascii: "JmNWKJBt4LH3rbfFyVyaPkNuwwwjTS2RQ62nwGQBwF41isH9GTTF8Wrwd6Y2gZbI5ybqIMxOFWnDWN3jmTIyjjTKxDteIRjP9iRtbFtQWNB9ptt7OzDnxVajIHrJI5Qqes4kMzc9FkUeVJ52iTHbaoczMksYsYCKPCGIXQN3zKtMRUhggHLP1wFVyAROF"); yield return (HashHigh: 0x2f2551f1f7b7df8dUL, HashLow: 0x62a2a6153a624c4cUL, Seed: 0x0000000000000000L, Ascii: "W6trZ2sxJE5sR575xVY5Gr1RXdXkShRgfa3xyqt670Zy7OnWKXwmipmRqY5AujAYBJy2YpPy8GbqwB7EbyqAawtLFF9L8aQr4vAkQf1oyVhWkeJ2PExP3X6yAgPL6SrJVSaveoUJ9rWgSKrnQgvw8i8TaTd7c5WotRzZi5fUHvWyu2AHUkopnN25wDZPr"); yield return (HashHigh: 0xe11987cd53f3ee5aUL, HashLow: 0x956fe88548a6c503UL, Seed: 0x00000000000003d2L, Ascii: "OoCx5frXeT5abvARZQF8DbdwrN3yZJlmd2l7HqH176vO2TzOeRnYnhsMygvpcp6LSJlY2XCTSp06uK4q6GLRnmpeRs5Wllft5WUMLqsXuT5hRrRGOzGQvM4iH5coaYMFn8YwvtB9sD6p9oMwOKaSVoVLHPLeUFLr65A9QXtF8Y1clukhKWepfc4EhTnbl"); yield return (HashHigh: 0xfbfa6f369b67478fUL, HashLow: 0x481128de8006f74fUL, Seed: 0x0000000000000a72L, Ascii: "PBCC5mjFekV8Hndfcv6jgSDcrJuLDQhIg9R4XISyapqDdSmk21al9rtQZkDztkbKNi7LqQ8aDRJnnKTfia5J713I7znjER5h536BmTdIHqUblGISBJgNgN7cURT23SfrJ4jbfoYgGWzm1zLqUWMuyMRDsAgfnNNrQIYG3TTQxtZ7g0BejJPKgo7CVXwsQ"); yield return (HashHigh: 0xfc1a3a2ba998c77bUL, HashLow: 0x18d0a09d8933f273UL, Seed: 0x75db5b20f097c469L, Ascii: "rvjxm10eoISk1JvBdZ0FtVfX3DZq0WIisqXILTnPOevfy9yxV6MRKg4DjaeT51OwU96vVMWD7lNDysWuJpnxO2hJrorItYjToF79P1eLRgOqApetmpDNxj7Dwuj2wjErduxt2AYZfduLB6LLFEjnvuegUPDnSR2QauVB79fTDvftTWzz73dIF29UO7F0U3"); yield return (HashHigh: 0x3b2a3919ba67e333UL, HashLow: 0xfb1592fdd939111cUL, Seed: 0x00000000000006a1L, Ascii: "ql0avRT5wcDNIGMPGoFvAnVnAFgvm1dwRmk18ZzQVYRvuldA9NoqF7umL1UOJrx2xOts7Xc7dmuWnKCOkH7YhnpWhGwY2IVwh4T0IWRnkZfF1kJXwtleX6pgErY2vfux7kdmYrx7LNjH0sJ0JFtlrXUq5KHdVWpOKFD5oMY0PDMtaEfgXF79bQtYSDyYzZ"); yield return (HashHigh: 0xfa54c870d9f4161dUL, HashLow: 0x8b72dc86c8678a82UL, Seed: 0x0000000000000000L, Ascii: "U3YUfYEra0YIs8gt5qsUVsSRx2swlTua0XpIgRwxlHFm2J8Dei6xEFxPA4BUkCSBvvQveo6wvtREcBRuHSeOmxgWecXsMQVzJXwdFiiYP5qWKIlNmNZGjvAvqPBFNzkfZmhR0BWMpwPMY7nB5RVKFyhAWHOeryTtdJkCrKxT8Z9y9Anhg139jjNeFl06cU"); yield return (HashHigh: 0xdd54dcf0fb3fc438UL, HashLow: 0x9003a190f57b5789UL, Seed: 0x7f92fda1109c7005L, Ascii: "UpkixotoQNGcONcTFsbtb4mcFM2w7hrashYpRpUc5F9uKI5h16RlvkqICfgyUEVwjvFfN8hFD6YRtV32c2KdLYWTX5di9tjhkWIBipThPPMmoSejZIWjE3Z1tjcgbbZb0pZFv020phWTeXxw3wlQpZWA8gFRckBL6tVY6oWtbV6gUGY7nJF69XXRbTCr1R"); yield return (HashHigh: 0x4cea21f626653dd6UL, HashLow: 0x502ceb87c379b6b9UL, Seed: 0x0000000000001263L, Ascii: "km4CV6neshlr0GzepVNIEnWXRi8hYyhmHiS3fJzHh4YbpdZAasUCg7cFr3mPMuQPqDDUYhZeqZhj0985eQQyE29kEUGSUqnxKUwVb4AGUIhIjRTGvocnEEF46MfmSh4vrmLz4aFn8toOYlpY4fZPAMziZOXEcSe1qXOUxypG4dkQFnxXU931Mf8qZzQZCD8"); yield return (HashHigh: 0xe814d6f0e113b96fUL, HashLow: 0x21845c4bc1751820UL, Seed: 0x00000000000024d2L, Ascii: "iOPgLWdCy1lrEuxUcHiPPSIubuiBiihc22LKoOqH1nzCbjFnm5TUKqArnMgnvmdSHde04Fx6dgf1bZSD0fML5mJnNSahGcxQiD6ow9KayC7W2z7Pz7vmDhKxJ4OVMq13fkvXcEDAj1MBuVQIZ0dmUsirUdomFQnOZkpD5XTJ2Usz0Dzc4vDsksgBF2osLn8"); yield return (HashHigh: 0x49d5946ecce52836UL, HashLow: 0x264fab8ee4715ca0UL, Seed: 0x4fb24495dffafc30L, Ascii: "Vleawe0EnlMWaznjUaZDoOjvEzt1iaWrmD33usV3KWps7BeoysYXDbl80iA2ZzjRMnjuN6YU8nSPRpSdJtdFwNSNiO7NguPGzGaGXbskQ6cduOS1LESdr1hEhQEuSMEmrhYkc8kETwwUn2fiHYA6yGxz86w9VRxMa2Z2zVtjrbT0Hx3kL4a32fXrao8C9Zl"); yield return (HashHigh: 0x4960d28ad27aea08UL, HashLow: 0x73cafc7d21008410UL, Seed: 0x0000000000000000L, Ascii: "1uRmqXqP3y7BezETYuqIb4eRq44oUDrQMiCzYu8Tl2eR3UcN04BRUljItKwjBSNV6ZKrwVTSqvHAjnUP4MSAMz2Rj6kuxj0NrXhsWonPPPeBgtgbyv7Efb4Y32nHHBwJv3eeHs51sEOpiqF2TJXRCsvzJ5lfqt7jicS3GEZ9PddVFSWohyvZITlL32y10J2"); yield return (HashHigh: 0xe6fe970ffd59ac38UL, HashLow: 0x0575ae2d2d390520UL, Seed: 0x0000000000000a75L, Ascii: "T0NKoiP1ejhTNTIjwlRjfhf8aRDsM8eOGcomBjvwm6NkdiS4Ap2okyONWEtU6ZB9btDnRChjgLLDikHqKdtDUCv7kkfATbaWxKsP9PXc2wQemb7azIxNqUtczT1BxMiOETCEz6AZ5YXmd8JRvvC8Ww3MUzfKK5jmFBeT8vCYBEVarhfHpK7PDZRn4u1brrlY"); yield return (HashHigh: 0x1c43f33d2122e752UL, HashLow: 0x87e605489da106a4UL, Seed: 0x0000000000000974L, Ascii: "e2exMRoBFO0WrmVhccHLXi5eucVyumPed5UUYOsYSzk3tstsPBEkmQt7q893koyF96vJuXJ5VjXhnE9kSPLvqJag15ORzCPdi6eJtshBQRauvsnIkxssAOoMN6rvR26UAOfj4srMrvsLpKa4qNGGR7MP6IrVs45FznrCys1XuxCgKFrGP0i6CPK1AoTVI5xs"); yield return (HashHigh: 0x47660e95e2ae55b7UL, HashLow: 0x14fc34dab595ac5dUL, Seed: 0x0000000000002073L, Ascii: "TSQqxL0dGMSGwcQhYaaoKOSeUZnATbGTJPrUhaa2MDMR1CWS0NFf0apxUP3YNPQwQXdtlaUmgMpIxEYuHWY2ZstR8CjtysIQbZKclsaTJC2ehp9MClfkRQTR0yGt8DwfFgicUMoNjF8bgfp9KuE5iBNBjpvVyyPw2Pnx98pWJCog3JyUCegTVSxO8cPoswgI"); yield return (HashHigh: 0x860c1619cd22e4caUL, HashLow: 0xd532592a52ab9f87UL, Seed: 0x00000000000004f6L, Ascii: "iXTGoPucJks6tsvfmjnpmkzfnTkycGlJwcsQVqWsp5ReZEceZcXrHNVfUvn4uK5jm5i0pLwkgHjraNM02wlGZ5AwhXLSXhea32lcUL0G9ArAyF1VEysZZkiquHDeEjxr00yKHHFyjrMrZrt5xQS03Pq1WR8R5Tp49CLNa7AcOuR8wnIItmeMZI4kPwdQCEUH"); yield return (HashHigh: 0x3d660793218c261eUL, HashLow: 0x051b34110a3955baUL, Seed: 0x0000000000000270L, Ascii: "wJTg47sVQ9N39ZF5ibtniA8XB0rbEZTPoIsFfdKEVEeGaDAG8abDD5Fa8Sjv93Jk1iNNKjg02Rkv0Vre4KTMS0usJa5fH4kJVHxPbJt7wyzMtEZBSnHJlxcE3tm2rZfD1Fqtcs4JbOFry391CL6Y4SZkqM6AJXYliPzxRfnZXMACCLCtrdnxLqUqGXeMPvXTx"); yield return (HashHigh: 0x8eff2cd0bba2eb17UL, HashLow: 0x8aae0a364fc7203bUL, Seed: 0x000000000000124dL, Ascii: "0BOwda1cclUajOSEMC2bGST5vm9ZtCE9ee32HgqtfIP6uA6rcS1P7aKFQRed2437Dlnpj87gY8xrDgraOmjf2ruJ6sQVo9XlbKRjmkvkg7RsoSIwelsoEBIXZ6MiadbyW65ynEf2m3vwD42DptkKBYBLqoTgAAyE8Egd3BspMQEh9OpYlpNnYZiDPJvZo8e3q"); yield return (HashHigh: 0xbe464997daf45adfUL, HashLow: 0xfb70365ba36e2915UL, Seed: 0x32563880bd11daecL, Ascii: "Mq86Fm66UGSkmfDadjSS3UQSbQxqR5Hn4AFy3wthh3PB9q0m4xyF9Ob1844LSQulwt43Yn2QTFsmSElfyPA0FO26NnSEhBQ6giIEsmCRTiRoav6gP4jNwK0UOr3zWlgprKpeDIzBDuavaEzLC8UImmoQd60CyOymdyQn1NEqnJypOC1HEVKENXIz8mrU514ON"); yield return (HashHigh: 0xc8c19e2f58a8472fUL, HashLow: 0xa7b974bf25aa4c71UL, Seed: 0x0000000000001de2L, Ascii: "50aHDDC2wpcxTjo82ukkjaWAak0xsVlYqeWABZwHSXB6EjsvTWPqxMUDLDk6IenJR1uErGD5CmFj0KkT1c4MWDoQjx3M2ooMmSe8Bg6iM0cO1EWxkFZZWvcmXh3w0dOJ411oZ5IHBx91mcmSomWr3OssJkqc0FkcJF2u3CM3ll4jMILl6Rj8FVqg6bNgSp1jB"); yield return (HashHigh: 0x23220c656ae84b56UL, HashLow: 0x60bf84ebac2cbe62UL, Seed: 0x0000000000000000L, Ascii: "FTwBoP8usBBvjMziZZrDaZfnouXR6nenK0TgWmKfsPybU7Nz2wVwp2srQMoEUNsAI0OnmHl4oTj3LOrRXQlirr0ALGTROHyUizVVAKGJsKN4TBpAyZGrRbqF2pDrG9rLbqOWVfjwTRvZns6swXKyEtcQWW0jq19j4oHhf8Wr7jh4ixAsMgCVvmqhJiuoTlKJI7"); yield return (HashHigh: 0xfb2a4a921455d634UL, HashLow: 0xc774f948089c4fdaUL, Seed: 0x0000000000001686L, Ascii: "ZXLkd1gbDppBcMhsne20O40Y2xygpbv94455Jx84KmQhvRtJzG9DC6nW65C12uCTX6K7J8PDmRhNruHDy9mwV9EI5eTgLFvMTApz3UXaFGWqAHQzsul1TdyCSGvkKoZ8mX3P78Cs2IthvaubYsq2Oyt8oBgEVR3UxwbXGic4qfnMVLtHygRIhvn2AkkXkh0QSv"); yield return (HashHigh: 0x0dd9408580971eaaUL, HashLow: 0xc37815bbbf32af33UL, Seed: 0x2bc608cf2207aee5L, Ascii: "0jU730nzyIsZYmFFEKW7LqzjhNFOINPtcIrGKxIRn14R7DE6D0gV3Ujw5Tn3CHLpwlEucGcAH3DKhZOexmadErC4T3Ma1QC5TgvZ3qcwcpiuBgXbU6ifMdkTpgx618rHvyKkJG1n74HRwKcIJWgN7j7xrCPjOCBU9s40H8Xk2i4YnS6kR1wOiRaMeBame3evyo"); yield return (HashHigh: 0x7a5d13bd58ef273eUL, HashLow: 0xa8a9a52dcab75ee2UL, Seed: 0x00000000000009cfL, Ascii: "VlZBGeqf7vixsvJNQBhm6bYGwri41Zvpc4xzrWX51JjtrYRfOzxXMNDB4ZnyW807FNTmQodYQpULseqOopIMisipjHszqUoVWOTh1J2rBgTe3NiFGNC5mvLPqDrB4el08a88298Weg1LQZH4ZpCTgwgzS6VU0K45b0XSZwIusVykz2du8yW3NELg33X1mbWoNU"); yield return (HashHigh: 0x8475dd060f60fc69UL, HashLow: 0x0edad37e205c1287UL, Seed: 0x00000000000013b2L, Ascii: "kfOh6LpJy1c0R9OfjpumomrPdrEQWkY4fEFsiCAqQpU88sCKRDHsRcCdXB6kZRnpL907YTb0Yb9JPPpDUlXsxWKQkntkjFOKURvxVWdPHNfV7hWG5OtmwfvKVJH6sQsbtlfRC7jGH7JqDUF7twv6rNcYH8xA9St74f4rINqRR3LzlyJ7dFqUwQNPAKK71vNgI4h"); yield return (HashHigh: 0x3feebafc79c6e690UL, HashLow: 0x8bf036a3fc566396UL, Seed: 0x059e6144ab7385c7L, Ascii: "E8LvErh2dHlbiDcIzaz4bTJBcPPnI4jREgmFX6i83SGvXG4ezYf1b19LWXqbDD6Drg6aUCIoLSh70F2wcNsbcviDrQr9DzazOLYYQNWBHWtrWji59OgLXu1dlJFQIdX9ZjQIKOskeexktDSixJ6fdfWZ1IH0cYbg4baMDzX8GmTPnBuIoxnj0X9JiWDCuyNjBPX"); yield return (HashHigh: 0x7e134f3caab01aedUL, HashLow: 0x95545c39856041c9UL, Seed: 0x00000000000022ffL, Ascii: "iTWosRgGzLwZXX7UUrqI7OLPrcNVZGDvf9f2u0TmkLLnRUvK1GdVoQrykfcUC0wraOEu3F5yDB6AEYSpsmek9kiPeLxkajuPkvIASVvF0VJj9PLhXwS6eGsvrrEDItewb4HxEKtQurBtqpIagjWkKSb3VfiEoW1EzHp46cNkcL7Exd4YG3N8Plixy0N4tHh8nrH"); yield return (HashHigh: 0xa71f6378d079d547UL, HashLow: 0xd59af747daef2965UL, Seed: 0x0000000000000000L, Ascii: "zTPaxuYpXy0RMWlEPzUHHSud1xUz4zXnHIsxvn4u07SXkkVW6e4VkZV3u7KsNQaI7y7jYeoAXquNBzMrTfLfPEWoijoPGaMiPJ1127GwFT4yuadB9ehG9PXeFpq8js5eJCgMGKPJWoYT1xR5PAI9YyXNZX6PBPNJCJFV0uQnEoIWo1ZZIfoX6rl0XrkLUfyZiD0"); yield return (HashHigh: 0x983865a285dc7fc5UL, HashLow: 0xb21a62c104658163UL, Seed: 0x0000000000001677L, Ascii: "okeRXrWl7WKE0rpSq2LjGbWDJjsNgHKRlF1a4DQ8M3gyhPQ9k7qsOhHcYXhHBHJxoa2WruDDtO2L9iONUpmW1jqARn8S1DTbk7TMM9YWtyeIgirAEKVyeQ4Ibd7FHKVls3AOtUYoH7aGrDFkLgPdjdtrjvVDBTODFI0vM9RUOYlAtuHUXredKtLaMlnRZYsLfj6n"); yield return (HashHigh: 0x7163ac5b43bb2515UL, HashLow: 0x6e50aa0641caa241UL, Seed: 0x0000000000000000L, Ascii: "mVQPVPD2S9zDg6im0K04xSDtxJXYSn0WBtOjAp3ZmosraMtSQ3EfOURnByQDAtCrUE0UZqbIFOORusqZmU00GP3VLD11JQ17GG9JwRd4Zr2rQiwmJF0nCyexH0vhUAAo3x99951cn9tpFM2tkZBnjSKalgh6gGPZNtrWFmMYZo37ClUPXgskdDGzilIwpUInzg5x"); yield return (HashHigh: 0x6ab0824846cfaf8cUL, HashLow: 0x8e67e6058b55ebeaUL, Seed: 0x0000000000001187L, Ascii: "SNsrE3l1LFCloXtSEZT3wmG8OmSxi8CLJG0Oyjxl7H5VkAMpgnfb0D5oXRq5eo0kIYTsgwVcyw3gx3GJZxWJ1UWZXGoc5tAGlURMqomHO0YqmIlWStQfa7oUi3qvcdGBAXwnRXkEvliAbx0X25fpTVhgEUJMSrR9PREGH0wJW1aThY0AUsEY4JRAcGMe5EVB5eo6"); yield return (HashHigh: 0xbb7c982db9474694UL, HashLow: 0x545a0cf45fee623cUL, Seed: 0x0000000000002448L, Ascii: "4gzo7Lxz1oPfOsfDiomHKGFIb5avvfVOQXtSN1KcefGd4QmabYXPDBN9Iq08jEIK52ZYHRIB35zrmhNMB7rVdqdH1uYdq8mQeFITakHEQQfUktQb51YLAFgoEWn47GKMLXHctmlNfCCmXHXCiMca1WHJrenVRnqF8Htyglc7pqK77wXLwKPcmOU2nK1C2vJlg3RZ"); yield return (HashHigh: 0x0a15e68a034d9c7aUL, HashLow: 0x71ccd190e6b75777UL, Seed: 0x0000000000000000L, Ascii: "gxD8dp9Es2jaH9Fp7sDhFo9O9dutlkzzf5lbY0DEeHANikDwZCuV57OAPebSXMfDg40gZCcAyWfj2J6zKb9kLyke0hAPK0CGGhSocwqQFOA2K7MZCFk9ljI2y7r0FdLsu7xcWy8S6lCAvNtxv0M6ftPQWDFQyRwehmpJUBwewOuFZ7VZbaGidfPt7j8AxSozVrocU"); yield return (HashHigh: 0x8e9642b5e60ada61UL, HashLow: 0x3aa569a04ba548d9UL, Seed: 0x6bce3584ea311313L, Ascii: "xGVxFjsFy5GNRyTALes79BwSPskiYumMr1oNJ06heHqpdGUJHjqfuMp9HR4bXcnDTN5p1tdnLN6b7Wkoz87B2qrgN697oPS34WKkcACWbwHo7uawfjJagfG3GPrBbRCJJhOuRrw2288s0DSXZQVpTCjhAygQE3pdHOv08rvUnorPJgmChV4EOWbu5TYiBC4tDTjKV"); yield return (HashHigh: 0x5e32a28735e97926UL, HashLow: 0x0fbe4d9644d9e453UL, Seed: 0x0000000000001c2fL, Ascii: "EINQYV7PKpQRCBjwXJINeSzcigzh8DGR09DeVLvpmqp0sbcuPeQEjCugarM9tNOPb8kSSfrTe36xHrz2i4qL5ePIx6a4Aypzi4aMs1x5E32MKIyQtsrMLPWhy9hIvvYIB8xQYBEBDQFvzIKTJ1eoIR25cn0u6bzH3O4IPqGzecHbRm3mxIrCWq7CWgVLI3AHheMHU"); yield return (HashHigh: 0x35bfd4d027363204UL, HashLow: 0x572346097822beedUL, Seed: 0x0000000000000da1L, Ascii: "st05R0wLsgNC1YYfCRgGe3r2HnQutl3h9R1Yxqdr2yDFcNZZYFOScEmrgjbnD63nMwrebYsunf2graifBydzdXW8boxF31oVA9gGkwNxPWRmzf3RdH3MFFt9DNK94uyF2cH0CEVA3hG8J4yhJLoz1BQHgHEK4p0sCkMeRK23XAp3xVSMnpaL0OCyZ8nGLYAUjVjhM"); yield return (HashHigh: 0x5b16eebab182d6c0UL, HashLow: 0x5e343b99c20cc4b9UL, Seed: 0x00000000000001f1L, Ascii: "eNVVlGptzIUZLWdU2T8l8zVxwo4NZGGMYVPQjHfHB1tD4CPxPuXvnBF5AVngIZRSiK4ZZXMbgBgsCIteJzkMlMUVz05ZsIRSpIQK5eFwLsDOGLfiaTb8Bf9tsvg5EijRqMSJUeJAwJ3JGIHRbvnWoVLv4kLvUwsjIXcEOGxSEUaUjO6g1JZhlj4nn1IbSniaeTrWuf"); yield return (HashHigh: 0x8f4a34c6b345afecUL, HashLow: 0x0737329deb2c430cUL, Seed: 0x0000000000001047L, Ascii: "0kv3KDl6zCMnofBv1kDEtL3Qo6F4pF3ojNuoUQDlTtbnz5AiF857PKJg1zwomMw6uNKJLDMYODmJ0s3x3KEmy9ueM99Wpmn9kVtniusi1caGOYAA8cOrpNtmlzZXR1R7RkS9bbj9zgWQVjoaUW3LGuOPOrHk7X06fev7ftKFJTUCYlBoCI7EehaSozTHM17c7M0DAs"); yield return (HashHigh: 0x3fdfe9916d74b8a8UL, HashLow: 0x668cc92b915b5505UL, Seed: 0x0000000000000000L, Ascii: "A4rHJS19TNCabgywUE0pljIza5JFJ9UOpYXI8g4x6AcgXFaTETYhF5dkO3lHBM9twkRhTeNVtgq64mrZqXXKZcE9JGgnIbp97BObIy6TfwqaHZGuKPYHMbxVd1SQaGrbPydcDqiYOuH0NBMCWf6tltxR587HPqX3hjNxbjVJM23dqA9OHygWm0X3PZ9mTcIHaCR5J3"); yield return (HashHigh: 0xb858ebc7a33cfc1cUL, HashLow: 0x97eb03ed94b11bbeUL, Seed: 0x6eaac083a09881cdL, Ascii: "9y3Te5AvOOJ76IxcjcZyCqWacELsegeusXL8p4JmCoiDk4x2afdSOFWLMcVYNT0MqtbewJmkuNYHVzDwd6unfbrtuXZ7YXrWrMteD2btijMlpKKy6DN3rOYsz5gEF652OiHAK2clHqegYzvWllL92h3AV68t3Ots7RIwxZpuwils66gpISYWGeZwzyUVe136OLZbBf"); yield return (HashHigh: 0x87e19c32b0d78288UL, HashLow: 0x77e0cf47b61b8c13UL, Seed: 0x39b2708786296a3dL, Ascii: "77GKm15HN9YcPLaFCjgHNheN29NmvQdYGgwhrbMcjECG7bBMSvlf330O5maD00Necro281700cNgSb02HqAFTAqqgStbtcdgbiAiTgoEpTK7VixXjRxnUfGRV0nubNgamyP1gVxGLcXbLQJxm88Qlh5jYYuofHg59VOesQenJPBZtXSlPsTfsQP8GR54AWzhhndfUR1"); yield return (HashHigh: 0x6fbaa142f0df6237UL, HashLow: 0x9a7dcd73db310ffaUL, Seed: 0x0000000000001c20L, Ascii: "prtgeiSM0Rr09rr90Q4i6lTfBQgI9pEB69QysRc4tkJVu83b7bNZKvLaWZxSZ5PngjF29h296rfKs7qzVNHXYjGvASFXmPRpB90DQdcXNFbUB3OEnvklMXyVLXizbjGlOSTRzqESiLYrOwwVWDurIedIRp3rBKYaecBrNAIzWlXv5sUPPTQDcM3fVuHIHmb5Eo6fVfh"); yield return (HashHigh: 0xb46638f16268a657UL, HashLow: 0x0df797c69706bdccUL, Seed: 0x0000000000000000L, Ascii: "QFFMSp1luSh32MHpoTC24NHOfCyIGiBdyoHY9njPElMQnDXsNIfgtnVs1TjiSDn0MIi0d25cuVjdwEcYI4ZoTECHazYQcSkvzxn79LjuK21Urha09w0N2lCyv8pf6XpJBRBEyKQS0v5nSIQ48fVTaa32AlWGZRiTi8FbO5jYz4l4QVoXlXN4qzROPsjOQTg9o4LGsXH"); yield return (HashHigh: 0x36c92e2df52eb59cUL, HashLow: 0xe424e61f62f30bdeUL, Seed: 0x0000000000000000L, Ascii: "ic5H6y6VLOh3d8LxbBkaCsBnnK9DRm6BoqMJ2ty8pzdTq2S7vY7SIgTR7illK6360xrqSQrlh9asCEFlLm8cUUDVkPVSgjaZbtamCC2Bxcz4QghRYQlQUHjN5sOjLqN1LgLZLQFKszjHjQTJdj4NUr09tbW0zLA2rn4soutXq6tAix7JozDpLH7yXShybA4PiSRWDbs"); yield return (HashHigh: 0x6a2924e1a97dd7fcUL, HashLow: 0x13ed98dbc25604f7UL, Seed: 0x0000000000000000L, Ascii: "n1bjmOYe7NMcghKYScBlGRVTtLTlEIODjxY9CULIHdnDRSTNxmfquaHDy9jpss9VKp5bDpxLPg28uUzs0ZdckeSNIfprYlQMGrUdgqDgRWLJjML01wIWkAa0ei7ngTCfpFWBX1WZIvpmgLzybv7ieU7uOzSeDFGAM1c1uP1sEkSvKPHDSUDa6qx7q9bdrDtqmg1TsE8b"); yield return (HashHigh: 0x046c7ab74efd2742UL, HashLow: 0x8038692ca26033e3UL, Seed: 0x0000000000000000L, Ascii: "ERu1x9IgVGUehmOv54iL0asx725pWMTcWZ1a7BykhIVyvkT6TvujesPBT7G9uqbxr0vPVIZKhQk3eoCWkN5jNaHorvyBzGu9TGGDIPLCNfICmvUoZQ3tCDtuU7a8uR77X0xPaJghT49EibKDv83ITUue1SXYKTOkyMcH5K9eEOy1q1zGwu1e7rl0DQaml7qMcRX584zx"); yield return (HashHigh: 0xb5d837874a52973bUL, HashLow: 0x242c8ce2f79eb12aUL, Seed: 0x00000000000010ffL, Ascii: "XEOAfSCaBmxlGweXaEyY108UlYD2t8KbkJ2F6KtevwvZ6YuDq1WwmdsRodUygwFsPsJdNCzZXTznSFONEX2BAqxWSJCdAc1vRfu4ANZZB3gfXH87MqJCrY8A7945ikpWH0GqCXojfhX9QMhQz1JPOGyE1MP3cwCh5opqMc6t5vP2DUTjXmjXCWyiL2PS41S1Q9zI29Gz"); yield return (HashHigh: 0x85c31e633c183a0dUL, HashLow: 0x4f04b67ce498a52dUL, Seed: 0x0000000000001f51L, Ascii: "jdSPmVTMfYXDW1L1IkvTlrfNHQdV00qpWXy2yMr7Ivzqm2MmUiqTO5euIDTZ5k9VcaDccgnGKDwtCzpBr8INY1a501XfYXFqiK2fHoKWMplgHpEt2EefKvhyqOXL4JYslL9X8qCIhQ3dDPM8In6xHN2VNqPOs1CSb2fgoziJaXTQDFHSMIrZ4JQAIMG65FStArWr9pEQA"); yield return (HashHigh: 0x11fffd97f017a713UL, HashLow: 0x7dd53baa8a3ba4caUL, Seed: 0x0000000000001497L, Ascii: "BMLA6WSGL5XzfLmZLxIhOVXEFbbnkzF6gdgBkYI2DDOSVrl03TfCLPKINF1G21TBUcWtSd21llrsskrvmxW4R3uX8nd45IebrxeiwEFRgnTg4iMNDibzHnUKqoitQTXPX9wHfVVLF3az5zHKPOY8Uoe2vdvLtAdKmXI6bfQNjFj5s4MO3QPOGBh6JpHvgWVEaeh7vd2Pi"); yield return (HashHigh: 0x6f1eea0e31bc14a0UL, HashLow: 0x72175fdc15f3690bUL, Seed: 0x00000000000006f8L, Ascii: "D3BRDro1Gex78qmI3VE9RPAlgYIISaOXtIADxQ3T4K69WkIvXs3ohlE70uQ1Hyg3Pwf2c5tUCdy6ERnwtdQyZEBwLCoDhdTJ4guMEQxjlskIBRqiHPjijCH0pOnZcdkMMoHqeCLakLu4LZTvODHQmy9e2MD0gkpaf215cDvaL5kHTzPFK57yu489jjJmBYXcqjZ7DruRk"); yield return (HashHigh: 0x621cd36faba9990aUL, HashLow: 0x9183c4055827a563UL, Seed: 0x0000000000001bfdL, Ascii: "quTQG0dSEVNxGVWXbiSO1E4liYRLRJFVHEWjeXheBmgMTNqeUT4jRpb5KjsOB79xgHxWAAY7Aae8lzcBwvDP7WOtrhFAyMX7sfjqRcqWLALY25Qplxjla7H4XcC2byr5IzvEebp9g5pZcRRWAWWruRq60dIy5d5GArn3iuJ59KB2I4gnXGamTVObJfp9o9BJkT3sQcyxPa"); yield return (HashHigh: 0x292dd6d4c9151e40UL, HashLow: 0x771b6fbca83d29cdUL, Seed: 0x0000000000000020L, Ascii: "44pAhedm716O8ozBEHOPHNzDvNXZg7bV27TZ2GwIAAm1qO8cSB2yY3ickIycyWxuJSjQb7561pLhMXnxyLvGQhtdSyaCoqld9e1xN88mMPpBTnk155HMcBiBiQxsWKDNLBfiZgv4xlvWYJIaqSfARp2ldGdR6k74GHqbwwUPz0jgbzNEk5oixnWmrC82SKxIm1kKp7MAJM"); yield return (HashHigh: 0x264c7789459ae772UL, HashLow: 0x0e2b371ea14491b7UL, Seed: 0x000000000000006bL, Ascii: "Dam42yTDJxhGrApDgPFKv3n88kjSe9fKNB2M8MDOVQ2qFK4PM2wxwO1Eaa4ccnsdokM8Crx0u6pF4HdUt0bNld3eNZ3mIxw2JoeMFPM7xzUBVeKX8s5Dy4hYbUsqggVUn8geKzEHLnB0lxAkJH50lkjWnSluE5yYfZy0aJsV9BQdy0MpXON8lm5FFI3QDPYUjiSfpHzH2D"); yield return (HashHigh: 0xb5003afea35e4f7fUL, HashLow: 0x3becc1573cfb6078UL, Seed: 0x6dc8185ac1bfab6bL, Ascii: "XMiqWzsuc4z7YaloyqlKs8vUVGd63MRjice3xtKUElzpdai4dtxqw2ji2vKYtR9qXYTGF5yATxO3C0ZJ67LXbuvgiR82hLgM3Fed2u4ak57qzPbIaZYRGP2zcJ6gzgCjSn9jEFlW0jdCXlhi8fxUAYbfIVZM489lRfYE40s6WDj0bN8UOrKQROzgmp1sjwqIbh0tdFgmJ2"); yield return (HashHigh: 0x68b01827f4f7e838UL, HashLow: 0xc262473653102a4fUL, Seed: 0x0000000000001febL, Ascii: "qwHb3J6hfCjldQULb2ziSsUpSBN5byCXfHa1Gj2OVQSw3qjnD24bTXYgJFbGEpPMXqrjguJ859Wi4DHQHxNROKFrq4tHbutxdKcgjIEwrPmhSSyNkJ61wTrjC3EFzM6aLdpnHkiOwy1kziYvQu0P9gKfnFw7d0iKxREUDZX2rKppgzQIvX2dAbtV0zgFIJtqBxxiV3nCUDW"); yield return (HashHigh: 0xe23675cec8c70639UL, HashLow: 0x899bf435b566a0d1UL, Seed: 0x0000000000000000L, Ascii: "RtaMs90IiMkoFim8fC9ffiV9Wxq6kdyBztVIAZwg5Yo7SAaqvAeUNnV12gGDJ7FDpP2PnCuqP4mSnKdlDAonWCnWEtek3tvXpvcZvsOLdD15Q4UNXkcc0u2XZMVIukxWn6XXAGpfAW50iUxkRpxqzmQkdO67NN6JDRDLsDNmhnqB22dzfS60qEj2h4q46E9xitSLUvNP9yF"); yield return (HashHigh: 0x148d77e4199d5df3UL, HashLow: 0x0a501bddccc490c3UL, Seed: 0x00000000000020edL, Ascii: "g7swABpjAHpeWeXxNzgoctMEw5GRPQV9NscbfeS93kOS2Puld6Ao9ZtOTHxiZJJK5UHxcxCMccpusRDjkOgkW8KggS0BA3dzN6TZyRoiGffvHLOUuArfNXapI5XWvxGfslvbtkbwNQSAd1w6luvIpBBV10Le9dKU32UfO0kaEsuCIHSnZBD113IC1Bu2P99wbnv4tNzmodR"); yield return (HashHigh: 0x3a2c68dc00fa2e90UL, HashLow: 0x48eab1854370b089UL, Seed: 0x0000000000002162L, Ascii: "l3oVf4xHK4lGNoBzZY4r8Az54QI4TE1SRkWGBpTwcBQvZTxDikyKjk5DUjIdypZdQim114pyZoIgfogQfPSKjUtp5JRfh43YgMAK1SHydH9dqWe46t5htTcFdpB8rw4aXxMntkLXfj56KbTfy2ZwlVvFAIq3A0FGQHuxhbuM35JUOXjzBLdU9hzq5v6VReuw9NjxyDVoS0Ti"); yield return (HashHigh: 0x8b7f7c665e5d6e98UL, HashLow: 0xdf1e27cb971384fbUL, Seed: 0x0000000000000ff6L, Ascii: "BseKYldGrJmCBb9BIoiyKirniQwAk3arxPhWgiv7DZSA3RQLZsZGtRIbPn0w8Ql6Tph4kXbux4y8HWUTkQF6mbYMUDpZOIfg1KIbdg5xBkZ7LRAgIGJ0qa83A1Dc6qI9I5Xo56JiqIiB86hnla0M44FJICRxIhIQnKL3iQpF86WrsYphZ7zIOEocnrRr4YlHzY3kf2WQmK6O"); yield return (HashHigh: 0x4230960da9a7698fUL, HashLow: 0xd519f33cfc970895UL, Seed: 0x0000000000000000L, Ascii: "kE4ylCzKHAkVdJjliNIUitJhfmiGZkKwZS5yH32uUGbzSIMQnq8sy5ZgPGeYkR75RZkXoc3z2r7gfQe45eQLpq3ZhTDTQvjKnNYG6aLmLMp4VknmdFdrPVi1xz2QmHuSlX9ix5AdDr2D2SGxde61EJgLD6PZI45PxA2oiGyVTO2MNnCt6e1gLmd0O1HPeKTCr5eS7ZFKAW4W"); yield return (HashHigh: 0x559d70ec41355841UL, HashLow: 0x3a3133b9c19fbeddUL, Seed: 0x0000000000000000L, Ascii: "6y5XD36CB0vckoWi5CI30UrvnzasdfUlE6cL2GnIZMktF2LOcZY1xLcwYh4owhjefTq6vhzMcVhnaBoUOla0rF0f69g9gkOdDM75tSaEuEVDH3QrdO4RKKJPOomEGKg6KJbr96T0TRn7Kv9T4GR9rhooOVcrUY4qb2q4ivf6iDFqjRHCPonujUrin6Z3njm4rBeTtYxcvcAE"); yield return (HashHigh: 0x9f5d9465d7ad1839UL, HashLow: 0xff1317c5a7f84ad0UL, Seed: 0x5ec61bc65ad53a22L, Ascii: "3uySfjNQ0zfwIUgov465LnZFIORkQKzY35QZq3KvBZtARcW2WcUCiqgnfFW6Oy7DpvdGOv7eyQgIUWO2zwGyuN40wJE8FfyawCNJQOb0gFfY3YxWESPm0ySzcfBLqtGbQF4xYh3iuiDtadAgJhQYVDSxeBNPBXeuElbH3uz70YVP221D8Yh5dfdLQzINOKMZWUKaHxsxCutbb"); yield return (HashHigh: 0x002976652cabadf3UL, HashLow: 0x0280d170033eae14UL, Seed: 0x0000000000000000L, Ascii: "qg5wjwRmiVRejyh71UouGPimOCCXJULeY24IamrLLSdzBnehynHY9SOMW1ME2Otvfi4Zg98XjpNeTvXRy6qGImq02Fgsx1TBnA94EhidIx1edpu01NOSJ1MtqqnaNeNapoLkcqsYWKaso36ExpO8dZ3McTfMEOaYJFeg03fx0GBvMc56kAO3uRDXsXQvy4xgzs81HQxVXoWDu"); yield return (HashHigh: 0x3efcd7991ba24627UL, HashLow: 0x19a6366d750dd702UL, Seed: 0x000000000000266aL, Ascii: "UOmbwzUUvwpnkCO5iSCT619bxqlBAaoK4zp57bEEiWz2jzVT6tgw5CFF9k8GeJjLiVaeW4EVckbjQ8CAChDBST9jdf9rYHfZdZuVqK8LKBgn3FoazV0mPK33ktH2FLDR5ySe0cNYZZBeb8c0WptKwUzcpZ2g16oa4D05tH8pdmAOaSOFEOZeFHCS6d4wsnl7tj6m95GJP6g8i"); yield return (HashHigh: 0x82d14d147a7e0edbUL, HashLow: 0x548470ddccb70303UL, Seed: 0x0000000000000174L, Ascii: "8c94zFZDCvTGUQ5TzF9N5cuFHcvgnbGvqEF4cEIH7iThoTf6UFWkKZCRkW7Z5QanapN2v5WOK55wq8UDvvhIQMZJaEit3LftlHkS5kiDrctm5a9iADx5H0N907urfepAcqQTvAMMijIMoAICao6gmm1r6FbiLANoV9KlHGfjsTAXZKz1SEqGq3LXHzgJwM7y7LSOBHN3Irr2LK"); yield return (HashHigh: 0xcbf944231f0a207cUL, HashLow: 0x9f63d233df85f142UL, Seed: 0x0000000000002707L, Ascii: "mX1PRUJrik1WmNpZI6Jtxmv9uGNI3sZtblIy5nk889Pi4Z4QVQBgy0zLoywAelB0AUAXgqKrGNlmuakSLGbYyvE1PpZFARPEmugjI2hCShCLKtAZrmpwfISacGQ5NY9UoW0YUXKzknxjwhIwrDtGMsaStLEpMjDUngoKCectL1rJWKMlxXZd4s0jfRQEFuClCALF7beEqJBHd4"); yield return (HashHigh: 0x5ad4b7cfe6da1cdbUL, HashLow: 0xbd42184be21051f1UL, Seed: 0x2e52512cc58aa935L, Ascii: "4ztdsJPql9TZC7rzDG91MxZjNO8ypBpxScJtI9c7NPkwNVK5idy4FWneFiKUl0kFcPl01oMV1lRU1ix1fUxPqfsIdGyWNROz0antbMTftAzRXc62KYUjGQ5vIVcKY96J9XIuMO9ObRku8xalFx5MW6PRjet7JqjsRyLDFDva6Gyfr5rxIczIwQtbqJ78rqbCvWaJVTvTmPudph"); yield return (HashHigh: 0x6fd47ff27b6b3501UL, HashLow: 0xaf95d8843740717dUL, Seed: 0x0000000000002591L, Ascii: "D0oqONFjsOhHnY2DTEA2ybfWknu3lb7mbrOqtkITu7BAw95U9lGAcRInCSrbDL0TPwwkMsgQnPd50LronyOjZ1ShT1CKx7MnYmFxFg3cajqwJQ33AIiT5ZmlQJBXhi16UCORA94bRzDWdiupox665G9CWRBKAJZNbfgdjVI5tEm54hBuwLM6QUXIz7FabRGAUJFaqu3tSA3O4W"); yield return (HashHigh: 0xe5b4f03fc446e2b1UL, HashLow: 0x391ad12eadd57c56UL, Seed: 0x0000000000000368L, Ascii: "03cTK7C1gkwEQVwXlWcXh0ESkvbCrckJ7E6WoYuEDGCShmZ2xRCmlx2iQ48WcLseyvnP9wDbckI1O5VH5NIHT28ArVU7oby6xijPbXweKup3dpxUoI9LnXkr4TQaFLrWPXwuGgZDevkgtkBapBVYxuMlAnqf5tNb6U9RyXo1VFqAtMugNbUSxpGIzbJ2NQRO1k6ZpWsf6elRxMr"); yield return (HashHigh: 0xea149c8374140053UL, HashLow: 0x0a52f4eea9f8ef1cUL, Seed: 0x000000000000080dL, Ascii: "iPH0IO7cO678mdTWSaBwwVgJv3ttUh6aKXLsHdIAyjAw8smIujFRccrU1Es3uheBpwsjOAkwPUpJLkHpT1ffuAbURkMpCv3NmYkvQRw77EpHjp099t0iq8O6CBUF6yigFigCRV0gITw23SZOtfOPJuC2f9nPH19hvE8eeBy84nFHQkGhB6rSKnqivvszMFSO6qd4qRSibU3jS94"); yield return (HashHigh: 0x6ee146ebf3e805fcUL, HashLow: 0x00330c645129febbUL, Seed: 0x0000000000000112L, Ascii: "hW16QQ7Pv5H9UZK6FbXlLgBkAIBqO8YxOqamPOPBQ9SErhI9keLHzhRMVeL2kRpWTO2Jp7bKDZPgbZ60VImXtyplriAdLiLFTIyMWYDv3TTI0Zhr3bFsqrOoTqoiIdp1TdaeChOkb6fhjgeJmOnEQVxFHQVQE2Q7fRXucnTPIWRAs8L4PIQL6m5DlDtXKzv4zs0P7n4knxLj7pi"); yield return (HashHigh: 0x20c75f753a84e616UL, HashLow: 0x0a09fc82b525e063UL, Seed: 0x00000000000019a7L, Ascii: "IXfuXoGOjZYCriurKgpliUAfWM0obqz7Z7WT1Iedk93lZhNtoyjbY9gij743SAAK4q9Cvr7pAsndmTQVwZip1aUc81kZ4ZKFNU8EURL46wAdlTgD97ZEEmYwKuRDzNGOctDGYwLovP3YE4Uaj6Xj24egfhyhr9dSoWYOxyq9Xex2TLDeiuzkb2T7fxgwCQPcvHPUuTG1khSobRtI"); yield return (HashHigh: 0x8793ffbc57f0056fUL, HashLow: 0x8871175a6ad75119UL, Seed: 0x0000000000000adfL, Ascii: "n5jaccam8c7bd2y6zvSxJCEcLJxeQ7gRVcOsTtU5TMHTEINp2DayB2imv8ubvJLOjQ9XHej1haK5KXqoZysIsrGz0aYYTIU9ObfOgkzpED6kLPwI1PyjpMKCcOCD6TLHDZQsxs4e0ii2YQaNmRJpT7tZ7thOwdRv3KEk8SU52eAGGXyPc6IdC6OBhM6lfjRFxpUhuD0LNMjZztoP"); yield return (HashHigh: 0xed277518761d2400UL, HashLow: 0x6e98cea9d0f353d2UL, Seed: 0x0000000000000000L, Ascii: "0B1Ow3HA7F7eGGzheBNspjxVM9vMWCdlU3WLZlePxFSsGP8X7vwDv6RaFxQXqdxsu1P6LpblAM6e0NAnYQKEa4Aao0HI2EpnXhj2rk61XKXBBnMg4fSC9uTedcfw8rOk9Rryy7mnEdp0Vb05Uj5cGVEtLVJtWsWriK4uYUmnjCxdb3EqYYMEiAebJf3Z5OevqvPThgbgLnYRDiXp"); yield return (HashHigh: 0xe65fe3529f3aec6aUL, HashLow: 0x1bcd7610ed115cc8UL, Seed: 0x00000000000020c4L, Ascii: "Y3qZo3vgY78iDqSAKtuYPdV5PSv83nq9ZbDgEmq1DXv4T88joZP7k1Cx717NvuHTaQmQcJKM9S7G2EMoFtTRCJMEahuNF3DAvZ64LJhupjwmLo3wy1DluDKZUPglYtNVA5qhjwkmE7ZTr7qWqjpXxeLRvcJMHUCtXblGhf55beQa4MDGiEztUmxmCMahOBHIBzzRPD2DuGlU8bk1"); yield return (HashHigh: 0x7d7b5325457a383cUL, HashLow: 0x5b6f263ed3c74d3dUL, Seed: 0x30b52b853f3c90a8L, Ascii: "POkjcvdYJtZG5hdudDILMGlYffvT7puFwieMGzzFSo1cCmnFTQCxfZFKH5TEKdl003mluc7zjytqOD9VQtp0T1oa7wZKxdsJylmBmYlGTRUT3ltQNy65lyoFsHG2ElZe2ryiC8Og7SHdc7pgtL5PnrI6vgofq6WubtpCowKw640dbenk54ZXJxYmOKOS7NHMHUqXrlM8tguWNqwew"); yield return (HashHigh: 0xffb33f00093c3d3fUL, HashLow: 0x7c1141aeda8b9578UL, Seed: 0x0000000000000728L, Ascii: "HdUWxTmWLMYxDvlS3g6lvPs6zdL6Z7759ymLuPG08UbKXWDfsvMuTVEprrR7HbCas48BmoQpgWtLEabIcApEE1c2pWmtuqanbA93PDjOW86R11YcCobMNJBrWHJqNpZjH0LlvIhS0C92t0D8Ej5uyJN7JHgzwwyTNLQncnGUkSMIBNTQ3YzCtBSPhKoHSfUBKEzk2fzy68pZGSi4X"); yield return (HashHigh: 0x0a1a33a9f41976d7UL, HashLow: 0x4b54dfa63ebb3ccfUL, Seed: 0x0000000000001c2aL, Ascii: "dAN1SdBmr2gMNyALQrdDXfQ55t6DvouZbZu9cFXibXwHweIdgdFifK6CjnNnlvzlFCnNQDjSR56Qvj7f3QQbBMdaLN2hAh4SayCDBLlfFjU97lzoIHem1n2cOU627S3KMhFKDz7QnicmqKgEeYKAWCMZLh1i18jQDk9SvY9wz85clcFrwBJvULVEJYCIZQKy6qurTDitVFFnnzIvh"); yield return (HashHigh: 0x66fa22c9eec5fb5cUL, HashLow: 0xb70e79c506a105f0UL, Seed: 0x0000000000000389L, Ascii: "s4vBkb0vmkbjzA1CIzLGyOtb8Ers2LzuSbXvmPNjNulNzPG2OaGfU67UnMq3i1ubVydnzBdit01OxJ1JJTcxPjvxhkkCdRGIwxE9AvXzcrtPHwnJvCtwnJeJvO24yY6DnUCZ6P4in7fjyvZLEjJbf4lxSOzazHOxDKHKZitF2yQKFWAYc7mc6wov7DnwVYuhudXbdLsOWOIw1btvtj"); yield return (HashHigh: 0x47c690897547920bUL, HashLow: 0x8482dfc09c16d8d2UL, Seed: 0x000000000000196aL, Ascii: "c4jJohV3gr10UmzwfQhRtE8dIdtPx9SGpNE1aSq0ZCQLDQzkUQAefMagUxE7uOdNIr6IWA9aXjapnUgDjWagND4CNHYgkk8FPYgSIiU239nI7qO4CkrxrffMJUVAh1EsS51pm6lmeAPixzx6ROCX6JUebS5SOQynqDvFxTh4ZALMiBZadkgC2achNnbA7KEnel85MGrsCYD8996Jul"); yield return (HashHigh: 0xc6314b859faa8853UL, HashLow: 0xe99724e47261171bUL, Seed: 0x0000000000000acfL, Ascii: "Cljyh41sippSYGQXUXTCELfcslOnjQgtAbhdENTD9h81WKugXpFsQVom21pW58m3SImLqlmKlR20RtvA6sSiPg2Ids0VkSzrHsiv5d6E4XtwQO2RMiJdbrjMShNAiEv12f7pWh1UZwZr0qOqoFsWvpuTLNiziwUXXJIyy2EYprN7E65MVXoXPmrrd9RwdfR7G7SDyis9XJDavdIQip"); yield return (HashHigh: 0x2f153f57c056c664UL, HashLow: 0x60634c9f2e3382c6UL, Seed: 0x0000000000000000L, Ascii: "OJFu10AE0lILXYVyS0SnWq8bomiymsqnFXR9RBK2vfdQHBtxI4jzL2dQjEyP8Kow9Bm8shOTckKeisDHBPkF9bOa3WDKz5I2szl20rD77vmFepzzVCfnAuCMGxRXRHoWUmRCjDYN6b9HsRAs9xNPLeichB0rnSQ5mQWObL0j1Wz6eCnXHVfPNWw7jd4kFjSpCgoI7qT7DLQz75HjzV"); yield return (HashHigh: 0x1ba637efef510642UL, HashLow: 0xeab67d06fa529b4eUL, Seed: 0x0000000000002386L, Ascii: "l9JXwaCxFbWwpmYCQHjcNUarJSQknk5wuWJrhnG2yqJOwbxG19Ut90ivq6paYtcaUC4BQ4NaeG98g8ixNTlqTuN6v7x1cG7FTf91lctBOqWkUdQKi7x0h4iKFTK0uqrYOAGV98g0mPQZlMPnYMWYqwlO2fIMfC9BDmRId2xpOH2td0ydnOFbw7QU7Ee99C5gZdW5zgRgZ1CAsuE8OQ2"); yield return (HashHigh: 0x954e74ed75833687UL, HashLow: 0xf4c6a2fb81bf1c99UL, Seed: 0x0000000000000f22L, Ascii: "hFHhF4ptvamaEUcRYAVs7TkHdDkCYKyLzzQQdwwyHuiBmzaTw2yatG4OivT5zoBUozXNwizWKMybP7GciEQ70EikxxaZxLDEzL1dA54ncIhyROBQp9DXGCNds7ajaLZ5IjE3QGWlkqivvo8aOW3EBojz205favpRd8J5kihp16jsAY7FVOFpPm7m23hXchZTHyE2vxtQz1PWrbAhCPx"); yield return (HashHigh: 0x8b68f8b50cc18a3cUL, HashLow: 0xee7aa02fc6b950f9UL, Seed: 0x0000000000001cdeL, Ascii: "THBuisT25JtpMf9WHebygRp7y3glzDksekJZTodZdrE0AlyjmKWigQRZXy0ysS2hzuXvAMecSQR758gncHc8uknFWyCBcKj9YVhPobrSrgmxeRkPPwDYFD2Jq15UKdKX0D3Vt50QJYPdTYyKAeNdBB9QHHh7zd0gno2BSNgY4Pph62SY3wtrURyTDWG1IrYd1C1LbVK42GppAUP2vBC"); yield return (HashHigh: 0xffb380e0c7e0344bUL, HashLow: 0xfbc1808b36b6185fUL, Seed: 0x0000000000000000L, Ascii: "7aBu9nr9J4LDM72H7w6971aIssorqHAUeKcc5y1GwosXqTsCNnYAnm4rooC8takVhZPSQvJWMF8asKhjEz1tULAsMmrdnUGmKmOBWknWrbpVlWhAsuxPFmoi3YO3zWPxTkFhUYzTN2uPto7LbfHFpxrH6acx9NIvC7BqzMzWoEpxyw1LkZF1UwMqYANJbeTsQh3MBQVRjbys2JJP6Vhu"); yield return (HashHigh: 0x58a0b75fed72a784UL, HashLow: 0x47ba4a49a835f815UL, Seed: 0x00000000000007e1L, Ascii: "5KBL51l4hNuRo0ySKbXnecgOY2O6cf8ncMfEN3rfEjsNOUpJ9NIP26L9x1ci97r8StvvGQeIXDSHvQGVJH6JMCCPdKDpcfKbupt8PbqacoiPLK0vo8wFOyqVz7E2N4sr4DoNVbtqXVjgeDHiF5F2qwsHI7qsUTNQjeEwqZtSJ5de2XnjJNcKl3f3uWac6XgyrsZjNInpn6xzK0Ph2slI"); yield return (HashHigh: 0x7a61eb658a274ba8UL, HashLow: 0x84246e0e531d5581UL, Seed: 0x0000000000001f1cL, Ascii: "Vpk9ceAicxUFUIS1highaulRcOoXA9XNESNyzocWCRjpVYFhp2BDj1dt3CKPziHJ9LiPl4pSr7DtKSROKJkoOFD2Bi1Ig5pjUqCOR0NUalZoVjytBukvD2l4v1366bPbo2CIPZ8E2tSB6AgSJY1nGvqHFojrHZJFQe9QQNjlvKyjmTzgSr39t7dcQn47AH4FgWtjIeQdsvKqafqFN470"); yield return (HashHigh: 0xbc8a5a36ebf3b9d2UL, HashLow: 0x29c892378d82340aUL, Seed: 0x0000000000001485L, Ascii: "WsozAtXaFmiAIlDmKBH6QnjJqPQ3Y1yQCYOgWGf7mKA2U3LE45DGb0O1YDk6mSRP3doCSjqCRGPIjtarjFp9CMRnkmGPD2ezubhN1JXXbImNCuOYwWmxgiXPqm2ueVgPrN6WmRQFDKAzp4y5qnkFgtavCTWYjNS1VQI7o5X95rVm4ZhyNNZIpqki5wgcYBRCMQ0tJDx8hnxBEtUyWaVl"); yield return (HashHigh: 0xb9dc20dccafe3e8fUL, HashLow: 0x4bb3a39c5f5298c2UL, Seed: 0x000000000000010eL, Ascii: "aVKyR92AaCBW0Lk0WjMia61RVhrECMDfG5luUnLSiyLoPEoockTbFllYK7LnEvEBWqjTNBLOAk16OdmzmKhZCEivvPI1RZQejG54M5kys6mR4ZZ3uBnAgscmFd0k8YTmmneyaNUSdvsLKGuZI46gqLnkn5CKIMQORwvmBseoQ1uzfTjzXGohAkepgzsWrv8CHeImc7052iYWnZ8NalBW6"); yield return (HashHigh: 0x5e7e4892aa088536UL, HashLow: 0x4d045b24bff27927UL, Seed: 0x0000000000000000L, Ascii: "leqYs9WeGmmwoxgeZUplpxGTrNqHomntsxO4zdDuwSacUUi2d06ybw3xJZTxH2QEn6lagba0Dr0qQ0AulJOHUigJxGT2kxjWiRZuqVUrIJ76DpuYVORujv5pwsr072YHhXrX70V29wZVHfeZYf5Bz4AyzY64bixdXoAfJ9HMceEzvHxQNcFJsj4xLVOvzR2HIlYII7BBQyG0ik788LwUT"); yield return (HashHigh: 0x22314cc967309151UL, HashLow: 0xb87e4dc3e43e7058UL, Seed: 0x000000000000097fL, Ascii: "d70Snry8sIxRblM5EjJNu7QPmYLNq3GV6UGHlKpIQNBi1vvbuFDJYj9uIkmCyuAG6ZTh6eXfMZnR6BfClgq5z0i0hXipMnHW95Fn6zs1mCPVao4egkbkruY93D6OgkAeA67BL2R5s92HMmm0lOs0idIeGoD8RRR7ImbD16QTOYPLaPeghCAH6AjS99bJoIH0SPuGXZZNqrv8B55StJghF"); yield return (HashHigh: 0x807eb9bfeb1aee2dUL, HashLow: 0x4635b073d84964dcUL, Seed: 0x00000000000023a9L, Ascii: "gfOM0utqVsQRzcQ2aIyaXVtHFq7LG3fkEPedKgZEwIovPUEyZCbfyRuWAZPZ1Jo7g0IGkeslhR3XT0GyBFQL6X3YcCcad7fwTePhFSm6KVxDEiLpHh1dA9UWQ9x2xJh9Ky3F6RTMxeQEh9zM5GaHjK7vmqjvk3oE0CwUNXGXd3CxeYd6ULFlYRiS9QbHfGiBxWbvSRj2ymtHIxS8886lwJ"); yield return (HashHigh: 0x23a22f40dcefafb5UL, HashLow: 0xc4d19df58245ab26UL, Seed: 0x0000000000000000L, Ascii: "lcBa3QpwhYbZq4HRypc8k5ULkpzue48yKXd6NzBSYTnWrakJGMW8GJEjbOFtqkp9IWKLBieoXgLwibggsY9E4J8OJVGdKS9BlpzxNPHWRwcGLP3B7UK2VOR3uvtCnW7YZSk6gqhJuNOy6zlurxRDt927OMzoWwGC7cyh0WlmCQpn0meRxe7Vha6ocNeA8yHlXPqgd6omqaph25XU9hKrn9"); yield return (HashHigh: 0xd12975aa89e90225UL, HashLow: 0x0805534b4207665cUL, Seed: 0x0000000000002255L, Ascii: "IjKVZoeHMlj9TRfbtrnSlFOiQvxLC8uz0gSpycAxRbywjWo97Xgzq1WGB6Ktn2B4zf4iBZEbo7FGVLRAhATBolA5nRqqgQEqycVY2yBmAdKQ7qkSQ0JRhsnBhYcNPZBb7nhtVPPubxKRyRPSAg2GDGgweoxFhRF0WImnAyxne0OvHhj3EBpwcVUZ4P7wu9wEQhW7VJugFmhA4iVeMAOUh3"); yield return (HashHigh: 0x4fcd47932b5011d9UL, HashLow: 0xeb26b7438e5ac29bUL, Seed: 0x0000000000002468L, Ascii: "z4eqekhdv34U2YYfDBGkSR85HW6IprKH1Lky7LKuGwGVARNNUDCVZ6kXXUagNdmRS2a4clYUs7GVHJ7wQ3dbNkyl4H0tq6TqCkDVSu5pLBbUhwrdx3xPfNfPMWv82bH0vPZNzYPt2Fei8C7OU3KbUm5KHOn9EfcaWgTbpqLsa5JgQm9o2sVilrPKNIhbK8KGy8hsiSgurUfmS0DHgBpv9D"); yield return (HashHigh: 0x25bd7fa9f571fa68UL, HashLow: 0x911dd64b71fa03daUL, Seed: 0x0000000000001e3bL, Ascii: "rtCUv9vqzMDXQMtMTQcCAynQMczuLHldkkc6R9O06nIGIiI4q3ehCmHLHv9hNRbH02bo3TlzI5G8VUaW4PYzHqLj2dn7KuPF6PlRh0rSWEXfhHbjaWtMrJc7jPeGFTCl0kGIqADkw6Dw7LZ1vznTTITBX4yeIbS5NVqA3TnnlpRmeKR8JGxZpqzjOtR5ZdNESzlqZBiYmRqpCPykkjX0tBe"); yield return (HashHigh: 0x088637860322c4cdUL, HashLow: 0xc60e7b4e5a2fc706UL, Seed: 0x00000000000009d7L, Ascii: "L6fREVHqM4d8B9Wy76v7yGbjCzpfhXvh2tNiwmMNFjKwr8rBPpwg74JrghKyBI7dr3SlCs5sH1NhePoZJEd0hkmcEfB8f20k9WWYmNpCtqUCWkOrWPywUT9KASvYUhGIYfJr39d3tuipvRt7cjbOdl1P37xKHrmWissbXfNsiGSEaUhRr1KjBP5PcUMLSY6VSZXrSQE65qwLOT4XLXCgWdz"); yield return (HashHigh: 0x0bfe2786eccc643fUL, HashLow: 0x35615ce1371f2979UL, Seed: 0x0000000000000000L, Ascii: "MWxfcALWJHfUT1laJANXHfshrogEiBVSsr1Mt73oaxVXdtBOZvw3lm9TqDgPn8U6sIro5oJiYDPaObAXJzZ6U1aqmM96jT6XuarIg24ME3iQJWofn1Unv3I59iquisA3958OuWYbXQldCbMQkt2pJShpS3eY1p5GTObknktBzgucOJJg2Wa1Mx1zUiC519aTgRm03s98RiWb759DApHlUtj"); yield return (HashHigh: 0x85f86d5cd1de913eUL, HashLow: 0x774b240b2ef420dbUL, Seed: 0x00000000000013e6L, Ascii: "v43KCmTFfV4m8izbNRwsKKvSCvb7eo0QyEZHDMN24W1bsocSGHegt5HmnqjtB0UebT2xvFkp7VFgCUkMT2797wwIpK3ovYXDtBfSTDNLjyRBkKDf8F1OmfPsrxU3bfuMLNvn67pFn81iY1aPh3LWM9DEwte7UpiTyu9cjZg3lWPkIdgijUfjSAaFw2wvpxolxp9XP3RgbaM3g6xSm5XoHGRP"); yield return (HashHigh: 0xe706d5ccfb0059a4UL, HashLow: 0x7bbf01ede90844c7UL, Seed: 0x0000000000000520L, Ascii: "Cv4acz39tU14kWL7FXMG6l3LdCdhZiNMsNctdM9O20zcWaYqZZbO3byAQA3LORByXU5K0HKsfpHwUVZ2FqdpaZNph9qbBjDtMt4oTztSAMO2XkUUBga3iwwrCsBDxRWWjfiRZSAwQ9UMtucNoPguHagnjgtLDExdjRnbbTqVxmlVJRs7QTCiv36YUGvJpPcMf0GH3WTM3950ACaasdI5lKSe"); yield return (HashHigh: 0xdfe6f18b71ddb080UL, HashLow: 0x857115e3b50b936fUL, Seed: 0x0000000000000542L, Ascii: "2MVJdGUpZDznM8g2TVKVDhJCMQxwR2DVRNHP73F7w5WEHtcxxtMTZxAVdnGtEiXv3tg3fs3nqcuqvmIUQcgqb719xFxznuZXeSF66kfnpPuC7NELb3eOdcbDvgIscxslXN4kEEYnXAPcfBw5lMms8fEbGwD7YqAZCYyv7wYvom5h1duRsBPCMULDoVeqUTVOyo7jdq2TQqO5ZjIVcrZ6vfS4"); yield return (HashHigh: 0x49f01fd3ae387ab9UL, HashLow: 0xf7216d3ec902f94cUL, Seed: 0x00000000000015ddL, Ascii: "eaKj2Wxvp03jvf8wxE4StW9KSzC7PWN9O9FqwHv7agGho9p91Nzkx84NNiskHnFzaAwOed93zlLH9aRSuO2MnggSm3EliYmRgYK795xdeb9FrtIRYqBBZSU23J9IhOMHIy3hitU4EvxrieJEuqp6xozpCxmTivsHwMva6K71wewc9HdSYiDoq4xv2x4JJeCyRNlRYAYyP0mqm1CTHKrgKqcV"); yield return (HashHigh: 0x6231be7078c06e63UL, HashLow: 0x614924e04835ccb1UL, Seed: 0x0000000000000e15L, Ascii: "NZTFL4A3q60uKDcIdOkRSV8HZkziOyUuPBrfooNFrV2MA6JscKmA2MBGUsz275Gl8BbTVmrbnnK2fM0zpCXqxZSDXKDvOW0erPGjkUuW6ZWQLZAXSuSPlq3yDRJzPgTIB4VnTCQQyl13wQJ5DfnYdf4ScYXjxJup3BFhbEt0Hnq5v0X6kKbmPSkzuNenzlNBKfTu8hb7rncjDS6tgefyS3mOv"); yield return (HashHigh: 0x4b9896b948a3cbcaUL, HashLow: 0x834e88b055a1425aUL, Seed: 0x0000000000000991L, Ascii: "HqKZwK91tBYpPOl8o342vzvpM05Sgw5bGQDSR0jZMWuEGp2bzjN00wjn9fsF474WwXKtySnONtiqTKCn0tAVK6iXMfnPSeYNugcmVGelM6pymFoJPQxvZsrJjG0oAFQzwh5L8XZiD8UC4FndZuYpPOrffG43WebqwnEmFlJ1zZyN4sBSBflBDeCufIV3lcWDBUJD3ILsaepi4MUaV1zOmAHy6"); yield return (HashHigh: 0x010618b21543f69dUL, HashLow: 0x7ec8734ce44a1e78UL, Seed: 0x000000000000140eL, Ascii: "1pTZnHAKgnUPv6pYmmhRFuyy2fXjAndgADY4ehcYAcHrkmKH1UVQObV0vFx33NdIbA9D2hP2FBXNJHzrfwXDOEHc6CLETKUxRxqZc3N0RhBWjibXXiChsLZ3XmTAQF0Q1Rz9YJXgiXHwgzNO5cWtvmNB5eq3xNbN6n9F3IarH7bwxnioCBj5uNQMahPgLu03TA6t6e00sSlFQEwgFwMNLPWWt"); yield return (HashHigh: 0xbc24ba13fae92218UL, HashLow: 0x3879e964518a1221UL, Seed: 0x00000000000021c5L, Ascii: "4DC3Y6FtuATiCbFMTkXH4zWjn4tf8dahGDINMHJk8cw6E23iCe5WrocnMeEi0ka0YZt3LrNGUvWTaAMk6RoFtkspNRedvRHZuxCH48By38b94fTpMun56GBQg7OJiA39e7LY1prxJdzCb8vDTgzn3rPI0OUM3NNJ56A2WbXaQNkzgkEJuUodlCFxUniOmvuZBOWAY8N7MMqTnPUgR2O6qiQQnb"); yield return (HashHigh: 0x74754a8e20358c51UL, HashLow: 0x3fdffae6ed883539UL, Seed: 0x0000000000000000L, Ascii: "UoQAMlKisK1Dd2QUq8O6rbseXSJAehbR0pRyo5wnH1sSMtmFOAgMH4dome2gORSovkCiifjYbVymxmK7pqedP5AzH5gYK8gAQPATdP7wEXt4EYn4X6RpJBkzvAVXaRLTTgBClXsW6VtqUtHQJUADgd0V267esMM1HbqoaISEsahDb3dbYyV59FpmCbClJc2GzK7DcMpj4Y3uF4cQU0I0nqBEQm"); yield return (HashHigh: 0xddbfd58b5eda3c49UL, HashLow: 0x28f38c2eb19c0acaUL, Seed: 0x000000000000143fL, Ascii: "627hgrPLCV1AHFX07JV3BY9dpY4q1gSUKGAau8oqxi4vDsUigISmsL0jm4arxli9YdJCN37sjExSRuLIJ7HpKI5JACKCi2Q7dYgP4BwvpwEQDmvF2t6mPT79S6FVmeHt6827kFh3vkVD4SmbviFIfhHb97p6JbuLNb2ilCrNDuuoCadTFkp1Rx882SKaVrzAPma5Lgir5ccGVWw7dqBwnzO4Y4"); yield return (HashHigh: 0x595c616be6fb17ddUL, HashLow: 0xe16cddd7822d16b7UL, Seed: 0x479cc0ad776c4358L, Ascii: "roOfMBk01by3B3I87XgQBfha9NDfpLe4QDYiB8pupi9Kv6AqIC8FYpVmhcLWWMTliUsE5ZWhQ5BRN79vqEHlJUwC1hD3A1CBgxbUctJmposwuZ6gJiwaN8HOxOzYzHvd73fUgdnvxcT4PIRT9N15qrkvfBN1LegelSQOZkPdI0QAux8rj0FZ9yh4vqb1e0ulO7FqFLFFiwkhawEZK8kidyGETK"); yield return (HashHigh: 0xaaca3d8adc98bcd8UL, HashLow: 0xb04802a97e0ad4c8UL, Seed: 0x5836ea31e9bc3892L, Ascii: "bRhk9VWj3SVYdenBUrI9wPN67VTIhO8ZOtut63LlNhY9xw5igHP4HnCdFimHkhhbEmxwpLJKCygXyT22y3afMymVyXm1Wc5akyK9sHW3DAOLY3oVCi3YGkkNEJHDBLOXoYCPlLOG00VOk4ue92dAs6DfZpqtblUTlJlF7CL2GNFg0SCzS3LFbuZz90jz55AuTTdY1dLJOWwrqm4U3zwQerBSJ92"); yield return (HashHigh: 0xbdce848657fd93f3UL, HashLow: 0xa79fa38e868e84c4UL, Seed: 0x0000000000000728L, Ascii: "ZO5IkvVUUjpHBSm1D5xsnZ1IA8uCxaxr7j1CLxBbs65qCt2SxtJxwVzzDMKvKgxJgEKF4IsHD5jAkGqlBPweJ9tWX08KnlLPn6KSvtYmcWGWeY5fsmTsozhyRWLEH0pxVUWFqlgDhPt6B6zJ3lYZDKNUIdJgetOs51Z1Zbcz7n6wQGrym4MdovHNs7AZTxMoNDORopMbJz9ZeoOGMUE1X0ZlP3V"); yield return (HashHigh: 0x478b8dd9f9f83c94UL, HashLow: 0xbd5af4d77f06e61aUL, Seed: 0x0000000000001bbbL, Ascii: "lExmEnuj4PbJuial7hsE3h15damh0vWA0nKDm6YzGX5vtZjpefvYA5fJciZ1wRlAOTxXNORsvoNfAvHFmGMevPGJY8OHLbNCN2hQFgGj8C8iYT3feJpAmJdiGMGzrQBps3CDCYK7Y2mjnSxmloPKarj7qWGWw9DsE3ObNqSQ2fOksIkMD5xOKF2WtoVvVCrVdszkEsmfyzxCh62yvAoiDjq7meH"); yield return (HashHigh: 0x41b87801f5429c4eUL, HashLow: 0x9a9ec0e302eca6c4UL, Seed: 0x0000000000000c19L, Ascii: "0XUrhozMrVQwExvzSvjTfSuPEqIwrxvmAO8TTcpaON3Yl1Ru21M8u6sFyBtyf6wCOuQQvic4b1kQjBlGuuJpaFM5Cnejw5viTM2VdFQNJIrup72Xb2CkvPk7R2CpOGc0SLdeLjtRjHV4LqskpX4ge3w27Q8rtX6k2MN3703vaOXe2axJXD7HW1btH3q9CuROgdfuU1iLW1crT1GpbLRsvosS0y8x"); yield return (HashHigh: 0x5e213ff038c64f55UL, HashLow: 0x0a7619e69ef778ddUL, Seed: 0x0000000000000000L, Ascii: "iK5YjBQqLtYY57nUaCwhUYOMgg2sZHjCn9Bbx1U5xIleBfIwxfHS4DC8VCXUgvuhIs2Fx0sJq7YZXC3NwNC6cBRX0tKTPP9RJeIhg77yPXETHOogEf78ZQTBisbfRwtBbM9KI3ibTyeTkjRP5aJ1GV3g1c5jVez1jQcZ87Gws5cLO1zrEacglwdmDU22MVAPNGC8BHyZseVj6pfWkUS3kEJ2Fd1I"); yield return (HashHigh: 0xb298680297d19007UL, HashLow: 0xbc46d16914d04220UL, Seed: 0x0000000000001bf2L, Ascii: "nD7cdBdnA0smbnr9ACDFAA1be4tpxONfBuNVsVTwYnzPhfCdpzibBjLHtHFfthHMiiRnaGusXRHOGn5OLff8Mr8Xkt29s2CezETI6Cqns7mVKopNdBSICuifMVFrzzQqaMyrYch28i5jNmfmKeX28yhAafViX1dYshTws0lpCbHR7EvpDJ2PH0NOsMFAODKDaofZ6Pbiv3pwejsfDW2DtwEIdIJ9"); yield return (HashHigh: 0xeb686c408f9bbb78UL, HashLow: 0xe397002ee1eb67c1UL, Seed: 0x0000000000000b51L, Ascii: "u7VtIagZe18tpDCAKDmCpW5WC4vqvVGH3goGq3qc0yGp4w9uYysET9XpF6MmNdSEfu4b6A1n36OupgQNTOtOVvihJHsMIjbpiEQoOFhvWA0fh1IG2XGudHHzSbcCB8NU6iJYrED0C8RgOwgkJ9ofgHwhZlk9sarsNkAoINnnFogd6DyYarOt3O6Q6TaY1nWQhnxNhOJjdZCAA4X2nx0CYGaqyGI8"); yield return (HashHigh: 0x0c9881eb2566d48cUL, HashLow: 0x868a3c7b0190436dUL, Seed: 0x0000000000002319L, Ascii: "pcW30Qxc5kKUnQnSKaiJ4BDaPbwUv6SIQg6XOzlw4mfglLy9m6MX5wQBoAXmz9363YKLM1MdaRCDDWOlCGO2sQbBUK6sZmWb8o3RJsNMRGEaTYrKDbgiwAecsrsCgeS3SupxFHeEGLgnMDPHEPm921IFpQY1JNNW1glWtmghuXoyMzWikot2m1ujaQ2yJA4D0TwBj95b16pgvrHugdS62DM9GL46X"); yield return (HashHigh: 0x311f1e89964d87a6UL, HashLow: 0xb115adb0075ba3ecUL, Seed: 0x0000000000000000L, Ascii: "F03wfhRNki4vgSPfDdFSZeNy8oyUMQwioqrRv3xsJk8Y4SqqLhE1YI2enghydmhIWttp4uLPwvq17OYcXcHMuBDyCwHaIpJLuSlSLP09nZOTWhJls3YJPP4kRyvTWONsEy6AaHIlNUIVH2mLSk5uPmJHK5js9V6OGxGG6XFMThIA4uSQyQSNXLeFuXvQ0QuQ5GWcxh21zQMu6UPEhOA0nDWRxa3QK"); yield return (HashHigh: 0x533680f5d4810efcUL, HashLow: 0x6fd1aa103b4cb87fUL, Seed: 0x0000000000000fc4L, Ascii: "BTxzhZqt5gg2Edi11DsiA7woNQXjS9FMm0Snii2pWcGUmVKHoHtu7YMJVjs5g20rhG5m5956dMOyqhSL1IKhdeogZWwASviEatgfrbC1xoqTzOUmKoYQY7etIvDS5jq6BV0DGICCHvAXexxtf9n6jv2IMOnVXopDgXaRGTVmr0TRVeeCLsCE0lU0IGPuXQsG701jUMoiaRkdIEak05Qk2Lh0o2VJC"); yield return (HashHigh: 0xc5d8c9bf4fc9e603UL, HashLow: 0xd90549d20367443dUL, Seed: 0x00000000000018cbL, Ascii: "oRYALytkrlDyGh86DFGGYPTJGNsSyhBn4fjkl60WSUebIptUTqbqXeCxX2tyRPHRtClA0gCqq8ufa8yqcFRjBqnGJ1hEm99xidjKlyQI9Efx6lW29IE3SaP6PlYuM4IlvtZnsXldLo42jbrvKR9OcGYjlQk2rsJHDgvQLz8Cvx3Ei8q8ISDUiFYlpA8sjh93JD6WCel57jNiXB14RtRtgDN8c2W4ua"); yield return (HashHigh: 0x579dee60932c84a1UL, HashLow: 0x3b3d141e0a37b106UL, Seed: 0x0000000000000000L, Ascii: "S9cbotxZR4B15Hjl2hKUdzIJkakuWMyGbFHGqgIB9PR8xocs1BRzi7MQ44lmFdmQDAmCgOqLWFR9LlGbaN0OQQGgBa6lEnmoqBukT7sIkoCJjHUi2HgfLRiKfeWD8sEE2a5RTVKvbNDmiuUgkUsxwuh6QiOjc0Pc2Du8euDHDzS8krhxePFW5ReIWtxlxxdqfbV0tANKpifFJXb5gZ6k26qkTDJv9X"); yield return (HashHigh: 0x422962643711816dUL, HashLow: 0x1f87e1488ec1593dUL, Seed: 0x5329a3b70d0f4a59L, Ascii: "9TK6ReBZeZ1K6IO9C4EYZuemID5jadSyEGvmxZZEWp7d6kWLCQIeieGMFRGUloj4Uont0qznglqe41GO3hh3U96nzYdpWFdiuehvL7q45L62sj3IYoQWCZk5SBNyVkmCGyJzRILWUzUiWJJVlK0ppbrcUVLUV4Jepw9ejLKucNU3P7hifLxvoNOYaXftmEKZH6KISwD3WdxKIE9OSWrcZp3fzatrU9"); yield return (HashHigh: 0x215c0af71e12d4cdUL, HashLow: 0x97b70500e33fea28UL, Seed: 0x0000000000000b0eL, Ascii: "jufg2umT1RqPEeANom8xVhHAC5L42tMYhCpNXve8wUDhfrhWN4H422MskP6tBY2EmEqePlccygB9ZQVTpHQqiP9Ka5mQYyAGx77GUs2NMnU0euVywIO5CBx9ei6de9oCeDMZc7k3wXvSx64x5eZJGUDITcyTTlyDLR0Nw1YRxzxdRdKCzM02wsfJ62SlnYbTk8MPKpOnox0Yf1LyHGIdInWUVj3fyb"); yield return (HashHigh: 0x1b003552eba777eeUL, HashLow: 0x04514f8106a66ebcUL, Seed: 0x00000000000006acL, Ascii: "GV1MgnpqvoSDspt8vNJkG6EhDYNzvaAO7tOH0PZvGGoXtmMjW7bi9bjis2s4rWHtfX2bza2xfKKI6LFpkjQLQK4uiVzUZrW0qChLjsmpWIZRdGVIGCtG6ioxs0WR6EPDYFrTNoj7o1VKJEmW8VV6BG2hcO0mwrIUnTCd39CfBPKIkTm60R5uiYU9XUhsf9spgu6w4wH1eHFzoVGsxkapM8xmcqWEDHU"); yield return (HashHigh: 0xeb1dd3aebda8aa13UL, HashLow: 0x3cf14839ddc28fa8UL, Seed: 0x000000000000266eL, Ascii: "WGhakvdr5URzegxBalPiDzXEY1viANvoS4m0bZGAtcpjafxDA2fcud3OPkRiq2otDcndRgBMA5vKwxuaUdwIcy0SwhnQPvonKbIiH6ihAE0PDNP5wnNVoGwPhLxuC5M7rRqnm7jqnIevjTR5ZCc0NDMfeZWoEl94XZcixZurJgI8Gtq2ILUdqgrwL2iuoa4aPwh0YnZpkotBse8mUERANTf2EJfZrIZ"); yield return (HashHigh: 0x508db609e87ef946UL, HashLow: 0x2f5aa206eedef609UL, Seed: 0x0000000000000530L, Ascii: "U3jiPo6HiD1tYHnCbrkOo0rZismuXvf2r2hKvELc7llbPvCJKDR7ekfiXWzImRBuViE97og5YCPzAXNEq7Ib81PaCxmN4vm6iBZkghhPUvjfcU2f0xUlkzu9G2UkhT99QOO2rFyCnN1qwuY8utUmmKrJf2W7FCdBm17b8yG9jegKTpKLbobuKWwLcmkotRcguOOv8qq4nNaE4EMMtMPssm5YzHXflJB"); yield return (HashHigh: 0x8b65e1b9edc06346UL, HashLow: 0xcc172952208517efUL, Seed: 0x000000000000134bL, Ascii: "hrrLz2buLvxWkERcKPsq7YpYcyRzmV8GHdXV2ujmzVtrt4epM0wZclAhkSzP2yA2qokCFjp9FDJnwk3ev0K5qWwsMkulMNCs23x8KSChg73HeC9kjPDfvkFG98rF9lS9jPaTQp9t2ALqVV6AIFS4gHEroFKXVaHtgacNOpOYwaORIces1ENbq2AeYcIcmomXs3XyPGqaHmxizYRjchXEpHWvK5qv2l21"); yield return (HashHigh: 0x0cf53509250abd97UL, HashLow: 0xd70f8bd24a91d4fdUL, Seed: 0x00000000000012d6L, Ascii: "33wNhFAj3b00HKKB93gYphsoEczhprR73uEMR4fR8rdMe9t11pI4Xjm1XK8YHWJoPtIDhwWhJThCvahs2gYEyAg3w8hFAwD49Din0hcv7D59FzlvMhLzeGwaicTUYXitXx2R6T160RkmDrVeNEFa4mSiWU5kPbYUO07l7nJbaduDA9Dg7YDIUZUmOjY36v7dnO8LRuHWVMxdiILVGMH7TqN732NuGBQv"); yield return (HashHigh: 0x00a2ad522b46e891UL, HashLow: 0xc47c20017825d300UL, Seed: 0x0000000000000000L, Ascii: "HOQiALDlp6Q6srIQ8q02p9sZtYbDmMErff2Y7hw4gBBvWwcvEwkIY6UQeaGsRvG12x4S0PL6Q3xJmYiddO1SNcsDAhAz32wXQxBvisdQWkL8ifYJSL2gTqawFbWz5X8UqzSXb4zLEThzVT3iURoaebCdXC57jO2Vuy9FAZmc41I9l2YjMels27noGfwOsicYpKdkxR848Dys54b21T1evrtLHQF2pp5R"); yield return (HashHigh: 0xe2bcdb64a38b5e1fUL, HashLow: 0x162f9615f2970563UL, Seed: 0x68cad26577bb3e37L, Ascii: "qXz5F7z9e2ctXtxxVFhUkJ2mgXPcQ3NXnkRxatRX6THQZTE7sdORZDZF3MQYYKc5XlQTVi0BeEeopicACLB0KokWNEF6F5AFzpB0rLLaDrCo4f2zssslxq7rTvkvE8VWcD0uBLppope0HmdjgXQCorCpihOeZNgEiMtwtjRABeVq71d040ZRcnsmtxDCMeK8w3GiTInjF7AHXjb9oAxoymrbpPP89hGd"); yield return (HashHigh: 0xe19e0f2f0c74f86eUL, HashLow: 0x146140b7d4c68ac1UL, Seed: 0x0000000000000000L, Ascii: "wDoaPoLLrmMPQVHhPuKys5igkxzDoVPKfdC5jAbIN2lzEFDTLdmKdXcvFHi3xKWsG2VUbFDV8G8K3l6GDKNGTpaH3pXOaXVFUp0eMtunD152PWSI0lDCAbo8sg9CMDdkjVOd90krfDXuK0QsZTRp5q3viK2XIcOcQazhlvgPpzR7EkZZt8ANXkECIICpaXE8AnLD3Du9GBNSaQq5u1ZBBqisCNz36cswY"); yield return (HashHigh: 0x2192847c67d247d9UL, HashLow: 0xc7f8c15398a92f66UL, Seed: 0x0000000000001a6fL, Ascii: "0cowtHJveA5UlcfWWMaT0BlBwa6jb1zLYEtDo7tpwtuFQ0o5HHKepNwQbWKKnaf2Pm9tFUBXA5Z1JKDMew6IkLiESY1HFCbvnyeicMF5htD5azvoPZzM49yfn8gxtxdZ196R3z8Sf3fOi0o1OMWbxRSEzkfA7Co73Mh1YdbKW2LWzrligAGxhkKb4PlLi3NMWjZSKQShgLIf6EWd2usvqYAV9sy2tzSxU"); yield return (HashHigh: 0x5155d4c3e5f411f0UL, HashLow: 0x5ba86cc3283534d5UL, Seed: 0x0000000000000d2eL, Ascii: "gGr2S5o2nUvizSEiswmATeFJhu7Eq48wyK2H2fScS76BeL9Bxy803jsJaiLCoQn7WtZaURcgLRwh3lREBvFaqHkjG9xc70QDx5IJ4kgn9iKOwlEJzqAgke2Z4QHfwbG3i6058MjKDnVT7adVWRxapgq0HvgnxxvQC0IUW5QRa1jnF6NNfaaq5mXIwS4c6NPzy9ao3LVScS2nzXBknCwoyHRsUFTJFxRgA"); yield return (HashHigh: 0xb28ecaa618d95c62UL, HashLow: 0x0c62112c99980982UL, Seed: 0x0000000000000000L, Ascii: "Mg2Aa578qi3oKeFQ0XdDZV1Cyef1uIn25WwxmN0F9XaPms6fRuOZJ9YAitOMw0eBpbEBtNeYeCB98kWYHlvLVSJUc8vY6c1DxlEF5i4Os6GsXj1W6MBWP1W0zsxSewIWw4OhQEXOW6Yc1p0ox5euNviAtnhGeKSJRO5qBGDiBfYK0ZEQwu4tTFf6QRHEzz5UbzMjWTHTVjP5LrXGQ89WbquVcGv1akXFla"); yield return (HashHigh: 0x895e6f292e5b2e73UL, HashLow: 0xc2ab4e9915eae14fUL, Seed: 0x00000000000019e9L, Ascii: "90dXdie6aN17ABy652EGCdRAgJ3GyK87YkkL56gs8ts582dCH44SDG1zAQbL1B0Aygbg6PIehPzo7ftrIVaAyVPXqmy0FqzcGooZ4RcVgxgUApEzQbYwv6mfG0Z5DjX2uMalHMQAum3khSwxmxy5NrjnasUOaWp3Pgvtsdnk96za6ZhTiElU8ukznJRidGnLWQwuk0fFF3vr0JyVentetezX2kCTGgnkVK"); yield return (HashHigh: 0xe37d0c58641d7fa6UL, HashLow: 0xdc5182d362ea7f41UL, Seed: 0x000000000000103dL, Ascii: "KoLiG5gWNCyjrekQ5dPdUm66ofTKFKMh2hxGQf3Jb4OBHZ8Jqyz3IU7lBKrFpzokB5kkQb4tCs1NeLvJGZCgWXU0iPlRVv3NOlLLbyfcWyG4HBcMGyNaYZjoOfLUwjsF5gV6ltLrEEr9ZhDN7UQbvRKUCwL7MKgqSug1D4DetkXVfXsiYFoCXQoxCswyqns3pnIqSn4rrnHreSRF76fjikfA1uSIWN0bz2"); yield return (HashHigh: 0xa80fa19ae264686fUL, HashLow: 0x915d2bdb92285b39UL, Seed: 0x000000000000066fL, Ascii: "oysBKVVZRJbhE5n0hyTfIO1IN1ssqnLBrfWge4bT8JhW9oxpl63nCtzliNCPe4OWwFlBo8B3bjbgW1PrNprj2J4FvRCTTmsyIRNqReKJZNs4bbzIXLpgExQNmQfVk8ohGkuFxUpEuBw70M5faz7XWHPNo2xWg4GNWaVndgG0d4Z3sE4c9Mx3jdgXHR2MoL05GvFInzQkgXFHekvYc5Iletzi3VEYJHn3ZN"); yield return (HashHigh: 0x46411c593e71dec2UL, HashLow: 0xcead3a004eef09c0UL, Seed: 0x0000000000001b12L, Ascii: "iqArWz0yyJSkrpEuRw827vrJUn8bdV63OFFF08kPfy0L0BXNtXU0X5KMbLmQR4SLh5nBETIsk0KNdV6MJl4tL6CJJuSr0MayRY9Aoe7VO7Lp8Aj7SDemgZ6CmqS9aUWy1UlKWIt2nNFYp1Hec3QiMLu1aXsDJfLhrLUxZXUcmPy11RPAP9z3whKL0FtLXrA0QZ6GgdgfYPEv0uzbzzlpYqj4kmSSCz1SLa6"); yield return (HashHigh: 0xfbf24128ee1152feUL, HashLow: 0x69e6dc310be2267eUL, Seed: 0x0000000000000248L, Ascii: "bQG0CwxjjRELQAdre7vEAPYgs0ZvlU9fgqLDOArJB4A9HNYmSMY4bbH8EiguwX31seg7sRxBnfHHk1jrfuL4IAwlOKhYpWX2eMKmJDrAOPSLpT3oev2c7WYB1lrL1XH9o2D2yZPOnYWW0RzmCMMnB0yUUuNWEgPFENSwotfD90kZtC3sGPPHAKikVHiZO11W6J2z3W7P8YmdQp6MENhsVjXsdHrzlAoklM3"); yield return (HashHigh: 0x3f476109e8953cb3UL, HashLow: 0x059fe85a5d818609UL, Seed: 0x0000000000000000L, Ascii: "0nZfUPdj3ewov9qOUFEai4Rz8U8KL5MfpqnxHnBG7eKYVLpYuCqlFBQ51pZ60QSg6w5AQsLxqThQWq8yF7GjG4eoJfEf7cFycOx72vLSc8lOPcufrmbeHpE5Bl8tvGVxWIuCXhVVmkqUpKhTQu0roVylcMK4V1jUBmGjAdyRnSedPxAzwT6F5tk1U0OZGxmgvZVpH0vP8KcXWTCSHSaOTA2mZnvvFVeVYuL"); yield return (HashHigh: 0x99457054a98bc910UL, HashLow: 0x0b51939414aa0873UL, Seed: 0x0000000000000ad8L, Ascii: "ZVIRu9Rob0qOuJSdtT6diIt8vfTaV20KZTNxiLiYdKfnvEVsYS3f5hMqYpWxz13FsksZgvg2z1YM4GmjRkzRXrUZFKvCf0R5JFqBflGQ0K7oriGjCZYgoSxhJSld3ke8APgGVcBnPBGghYoKPBBoF7mp7Z8HCciEj9V4fYUPpgc9mjAaaXChW0QeZFbHdAMdAlhFdQjQGTWgoW0EFJ7w41aGD6QTyUvmjv1I"); yield return (HashHigh: 0xaf93eab63b55ec0eUL, HashLow: 0x2e4991729b41aa82UL, Seed: 0x000000000000107fL, Ascii: "geRSNrQuZqWr5zPtwTnv8aNuLuJnDufynqqQmFH67hy7hTn0zyeX0VZrisMHm9gMkW5smugA0hjHtaSbriDB4G20IKrYyezXVN7pL0Zd3VNAPrU7t7SNJ5Jg9jlDRS69F5WLEEanb1AMXQZyuUla81lFSm5Bgugudly9JbF82NwpbZW8ZsN611xGzBVfHUqCXBH6VQh5yCr6GrQ5kWUmGTVYn76veuMpR4OO"); yield return (HashHigh: 0x006751a9a91f4c9eUL, HashLow: 0xe901c20aa3fcc1f4UL, Seed: 0x000000000000075aL, Ascii: "QmY5yiBfM5iKcOcKBh1FhXXZcnHMXfHWWUQHJo97trTjWEqgHjr8Y1QYR3u6gaZKydIPUXXlGybBNnML7ia5FHB0E53K1VriIrGr0usuZyrP3d1zHkKKPCEdKxhWxs1bhzgwbUYdsKzUPiMVyVNlHKIYtQMF1ufn0EY9yt7crX70FRjafZ9xBI1PR0NEuHLv8khRtAMaimR5Sxb0xKZLASuc51jF31rmOYNW"); yield return (HashHigh: 0xcb1ce11ee014da02UL, HashLow: 0x210e30cf8d7402ffUL, Seed: 0x0000000000000120L, Ascii: "ENUbVCQu3gZc63rKyJ9rF5h0pmk0K5fzfNCobpUnZCrSRwBhAGFUCPAEepGxVILklkEjyxSmla89sveifPgoqaSGDn94g0L4qgGbKfSQhE7qKncbGgaM9m5cSdxumPRkDrcBA7wJ41CoynKaYDP2f9Qdfbc6rtzPG17vPtKWeyRl3lnnzlMKF7B2jU9cAzDMTeZrdLA38LZPqFHazN0xsAI6QU79ty1cAR4B"); yield return (HashHigh: 0x6682c9728a22f4feUL, HashLow: 0x8be14a7a1ae50211UL, Seed: 0x00000000000015b3L, Ascii: "32fNLnH4iMH1yWxQjJ2HPAn0rGSYzU4hZlKsCsVZKYyFbQd5uM4exCun2TW3IkNPUHyQP3msMXPFegpssk2tBFbitkOaTEX6jKiDfHCjJ1BCbJOR8eetVs3VpNnf2kFzTPdNvZRpIXD1BnCUqwgi2IMEYLoLUwKibUY11cL7fLEeKKFwrot9x3DnUOvL69Mr3Ubmb4EkKtRUB4J08Y9VynHCQ6F1tFxJqhQnb"); yield return (HashHigh: 0x9b6ea90e01908c00UL, HashLow: 0x708b4a3fd703a62bUL, Seed: 0x0000000000000496L, Ascii: "D3ItgWHDnRAYV18wCoBGjf3Ay7ensCZODX45bdKZ24lBI5F9JrEJoVTY8bk7J5izL4zrG1QjwJBnisdNVrAT5Q0SlHGROnGNMChG4lhbyCOwGDRKb4LarSDlRSI0vmTkGdCQ0oma6ijguL2g3QGGYPiMbom7Qb3MQbGo3u4GkTqnNWiPZKfxj7CV6BedzRA9WEfaTBkvSo3FNnc4Bo0ubeZabTfcesiO2zJ6G"); yield return (HashHigh: 0x9901fddc33003147UL, HashLow: 0xd19d88194457e39bUL, Seed: 0x0000000000000000L, Ascii: "fBecYKgD7Wzw6TVIsxoegWUON8UlPGtDbx8evocil8TUN8JenRPZK07JStDLbp2eAhJfds0knxc1JdEYlhNM696ol0mKyeAimErejkrrJehHzqANEIt5LIvHXw8oC68SGBEGLcaRhstoDmdh5D4ulam0rUc0Z9KiesBCu0neindQwOLRA0Ej0vfeYBdhyNEiki6FYzCRaLWsrpPEOZALpZZmz5Y2is4ChSBTr"); yield return (HashHigh: 0x52d17504be201e34UL, HashLow: 0x8d113c8011acfbd6UL, Seed: 0x0000000000000000L, Ascii: "6h5WS7LLG1EOdfPLy5v5cgJvKHlmi7yZqzTGZeDECOpm7X1Ofy96jzIGPBbQqzl5qFE8JO4tNKrv9OFoJGBN6xWvVyHvPKq8lHCFkAFTKWcNM0KaUTrDmGp3fHyR9moZ0Jj050nBMfGr82jIMNlT3RFHjbhQ4Rmf4HG2ZW7cPKJvNDfGeJSIooX82A6L3fEdm219N4KYzbIHC7nZRzJjPtx4DJeLwGvpipwOWm"); yield return (HashHigh: 0x5e59331857b62770UL, HashLow: 0xa46887d66d485fdeUL, Seed: 0x0000000000002702L, Ascii: "O21hsDzuNkt0terpCdAFFQJITRnVZInheD46IZZCMrsJrLnA9j9LWC0rBlWfApMWjHyFn3xlWLkUTQjaSAY1Fkk5Z3FXP6qJLNjR1IsPoZF5H67KK8w0Bp40rSkguilH3AYp9YpV3TI3GRlk0CaQAUc2dj8avN7a2bgB0OXh0T35oEnk2BO8ydKR5Qu9DJfPZsuF5lQUsdzyk8NTJECabDtb0ikuPhW1ZnzQmd"); yield return (HashHigh: 0x742f1d9f43d44f76UL, HashLow: 0x7e57a13b70f1f16eUL, Seed: 0x000000000000196fL, Ascii: "4NUz3yRrnE44DpvKA43wNKC00KkXFLxPwlhqz3Sn946nwjqKc3N1Z8Gl2qqV5EtBvZ6LCrty17v1Kn5aCI8j154J753wRiREtyGfAeYNHE2ulSBKKiLUpvtHJzQIhEjPwpz1rtP4rZi6H7yoz1mfG6dGqV6BhszaAYywJUwXrqhAoKWT5vOaxa9fvIeuKt3IGWdAd0b2XAEtljeVv1qXIPrYkRiFpWtstdCYU1"); yield return (HashHigh: 0x242f85f3945b55aaUL, HashLow: 0x4ec922557f772e1aUL, Seed: 0x0000000000000112L, Ascii: "7oZ5NgmZh9J557vhCTsDJtgce835yhalytjn3NPcWpfg9EEKrzhXQhU6A91m2D5pPlLL0hr60wORRLrjpsZTFIEReKrqJ3RTpk7jTB8M1nBZy0LvFF6j8pILYS6IvpgtxSMn6yzySWv7u3oYYNUiCiq29wKNYDR29R46AwkAg4fLBkuriCYhbBkDbwQ4r1Xtrcx5fseAM9GhO7HrUsBhsGj10JAlew9vRXpphP"); yield return (HashHigh: 0x1ec5875533a5935bUL, HashLow: 0xf1931a8854a28de1UL, Seed: 0x0000000000001fd9L, Ascii: "isND9RcrdR1ITMnEIUV5wTjQ4lbFdThVBcxEvC4zp78k5JHPjPFwIfyQeNYU0oF9lZ9lZyDGU59C19YUA8PAsfiTIivWB9qvyntquc3GoPiNQzAxNaqUw7gRIINzQK3YNXmwzoBVNZW562u7DQk6h0KjaRZIQyEdJPUgvCsGTSNFAPTdgc4ChuO4YJihrdY9qrQkIAcJiU4OnaFFSDIsQ34abJ0kYy5LrHqk5HZ"); yield return (HashHigh: 0x01edc0a0ef305c93UL, HashLow: 0x39d295c23bf2c7dfUL, Seed: 0x000000000000174eL, Ascii: "j5hGuIZzpHZXY8V2jANqt5KqQVe5fjiOI5GLkM5PNpxeUvYnZDUdf8OPaYKWxsrs8Z01Zham5ChDz8sCutlDqCU0Vru567AMpwbSbnbiNGS0UuZ4AWNrXtwp7bShtQEjMuJlxYv3gy6V5B09OAhx0eyNKgxdMMX4FMEvsCWVg7Q56XTHOVHsRlbptSakG243LwopneNyNd9QOcszLOzp9lxg1AFJOgPoozvNOYR"); yield return (HashHigh: 0xc267af4655bef716UL, HashLow: 0x04e847100d0bf256UL, Seed: 0x0000000000000000L, Ascii: "vyeHqoDe8ia5SXHl1CRqcr9cn52bCCM2jN0h0d8WXC62Y2hbhk25ig3UVynISL8H62zHnTtvl6MjhgIwBROKT1AUVlUq0UNLYHmgpgZ4AR2DnhWwscyJiUCJlG5gE8su4FsaFQteM5DW3qlyPQ9u7xvOaJk9YNaoR7IIvMbbGeqqvltPE408wCJQSZQ4ay5KQV0tOmylxj8jznPgSSy7xPf0M0wM9H91m8fUAnI"); yield return (HashHigh: 0x6900aeaa8d9204b9UL, HashLow: 0xebfb682540d182d5UL, Seed: 0x0000000000000390L, Ascii: "7AKcE2gF94Hq9ygXiit8Y2wwWDQsygmCh3nPWwTDlexJyM6geusUORNjCGoqagQsDI1kSrY0pV2ftX86dTdRHjTNOcqXcHq4yUwlLvVYfJcVG7J8WttHQe8igkwO497yiGSHKkrpqLR94iteEs7ANQMRfM9SxRB0vxlTEPEocnFh0YROxPPBZ0KdT6eXtdxnbUBt76wG7W8A4kiul6Nidx6hvoAfEs4ff8hrOUPB"); yield return (HashHigh: 0xf942630094b2c371UL, HashLow: 0x056f97be8930cddfUL, Seed: 0x000000000000072eL, Ascii: "myXEIWnV1uW5B2AyOD6E6hs9YJnfHkQIwBnNM26Jd7AQVqWu1QEzJbJ2x2ZiUjaPS74RFwBpi15wsl9I1MkGUJj1xJJjIpmsMIQOGb9diyvvTRo8RmhYn280Uhu2gEWVtb4ZbD1Fz7QkdeRptgBISxS1XrI60tuDWxvBLssPNxKcneLVWw2Oop6M9Lcb13XLw5g1tiLNQR8gmmesML3L9YXLrjRAyHA2JQ4QF84e"); yield return (HashHigh: 0x651078b8c0773341UL, HashLow: 0x02250ec6295a6512UL, Seed: 0x0000000000000000L, Ascii: "7AnVvxpxeUBaAeyTIk02DR7KLyfM03bxx1ENtgncWrLyLkiYbvOb9REGHXlc88iQ4v95JdLYVL6DLcnVqn6TsMM3HW4mmIfeDdHQNJTPXKiiRBt1hxx3N0T38sytGxwgjjNRHMeSt3sdEfkFm2ZGUg7UJCrsPtXC5zogxEH2M1NUeHNM3l2xFbEWG8Oy31f8FiMqKHHbnprqgk6B4ScNVu52D1A4ByWBJTnQOb4Z"); yield return (HashHigh: 0xae05052816226a7fUL, HashLow: 0x9a997c8bc8a7de6dUL, Seed: 0x00000000000019d9L, Ascii: "xlbYnRAxf1QoDVc3WawSh7UOF98XvXnMUpW2UBedxdXMoOxwyN8ya5zAPXEsRi3YXmu22XqCIgaUe2WfpDBwNJf9ZOLfp67GY5Y9SzwZowZTjeiHz3OSop2nDNZ2TVybzLA9A904j5FVF3rPXZMAqRkrrh648gB88y0NH19Unzze5ogiXOjvGHHW51UAiCzUvx3TqZer53wCbtjVdxikS71q1s4QrYR7anJhmoPu"); yield return (HashHigh: 0x24f3bc8f707d6ea3UL, HashLow: 0x6ec5a5c31c4b4ba7UL, Seed: 0x00000000000014deL, Ascii: "9ZZ0jTByvCFhgV4REwj0BX99tRoHRe4GwvI8qkZ6W9au2OPhP4anea7LuFOELlE01MC2ZALviOpZg27Y6jJnneLSVPGjgswjWkqxQZPIykGeuXZPYwetdEX4hqzVobvYw47NiGsqpCVaru552qOOQR2Uvs4Vls7DNyZVLo85bgmvjowJKRejb6Ju3IGl0kBAU2JRJ8ViVkuDxUpP5JIBrzSzmAUz5pqjSCD8dIUXo"); yield return (HashHigh: 0xe05f3cedcbf7d929UL, HashLow: 0x5269659736a7f64aUL, Seed: 0x00000000000008e3L, Ascii: "rUkprWbCHMids1dz2b17N3tHHvMd4B7QjuzzOnnuui52tXq8Zp2cWfRbuRp8eZexIDSIZOnpnJgvrt84ebnQKYbvG8omiLiGopIVnQDNRpd5Sa8vtqK9hlE4U31pEFrJOReK8qEY78XpDrbZMp2EvmKLqDtaTM3uJkULmPkYjXC2HgRfWtBrM5jbCpK8Cevt8rJKb3W4VcUxYpu5hhEGc4Zp5tr1vwm36axDHKefR"); yield return (HashHigh: 0x6c644bc692b7b7f0UL, HashLow: 0x3fe0fa26c17797d4UL, Seed: 0x0000000000000000L, Ascii: "vVshxkFpwcssocHgztFkbNSbxwCqBOKVuDQV2zmvnKHTCcgrwgiGcRqJu1F1RwVLcFzqSOs6RFsEeyPnMdxtOoexeu879rPBczE2sMbw7hSLj54YPsUUDRBbpkrEZ3CufODNiwMX5oxpqFDT959Nbb9odz3NrRkvEuiylVb4G6KkCH2Go4aPoPpgqd6cG9Waw89w7LtqcZf6kzIXn11WG4pBNAHWU1Oqrfex6kviZ"); yield return (HashHigh: 0x64ed6d63ec85f758UL, HashLow: 0x61862e3429844789UL, Seed: 0x00000000000011d3L, Ascii: "C4tWTBxJfptCCTMchfrhMAs9rjMpFuOZvkmIxHG23FLHrg1rkY8jwEnOqrK7EWxDUHWnjZcfr7tnNwUq9Jaf3A1qqYAihQYQGyZlLkzLaOuiU1j438TlTnLlp6t3vYPeHIcZwgRIc7eyIp73gQaoBgAeHbTEuONTKJ0iUTQQuiTvMN82T7SpIwjGMFKPcCKQqWtPilyM5N5VfreyLFW6DibHnx8snGKldAmVTDVzEp"); yield return (HashHigh: 0x8b1e3472e1ac9a66UL, HashLow: 0x8f628af6a1908b28UL, Seed: 0x0000000000002121L, Ascii: "88zsKqhN7uandbNaTDhAKTnA5SajgVnACX2p3Vu2IekQIA2miHwCfmmjCjyy8lDq4qIC80exb0q6zbLaOMTzYGNqo5AvtEafsPmS8Ge9YDIq6hHwUS11pwjdf147SBFbdLuzBEZ7HW1doMgFsSPn4v4dANqVRZOxxrSbUUkPVhJpBbiI4QQLw0CtjAQFJHKWMiRWKKpnnmHxtXc1cbLZgJfbexucbUHUmZ6IgPbsnL"); yield return (HashHigh: 0xb065e744cb607cbfUL, HashLow: 0xf7d4922ef773e054UL, Seed: 0x0000000000001a91L, Ascii: "46oflCJXgfz8y1xwJy564zxDu29wdODudwT4lHMUCPExhMtoyLIupLwpw7J8dxRwrzsf0dLG12D3Rh7J3kpenSXQLLsAC4UKvuC3P9NAoIjRNFlXOmjYblIzIviA03qpzmIWvl4qJkzJsVbjFUCEWVKOtL5SlMXNc40tw4M76LbCn4oV2qpbN68wBLX4JBoV86x2VQcuiP3kC55gTtRdU9ekfdbCpaaZtgspSegSSl"); yield return (HashHigh: 0x79e567a8ef8790b8UL, HashLow: 0x8ec56151d5475a2eUL, Seed: 0x0000000000000000L, Ascii: "8gvtplYsrLdFspMwUKfZeIJTtb5WXL4STd47kufbMfMWyb8B1PqhlWGnbhOYObNOhdpWaMggYiuBL6tjH2qabB52NbVwm0TJJ4zDUqVPVw1NFmsFftl1DJpnh9wFB1107wtPWdWSRlbf12eLabbGV8APtmRrVHT3DZADyW3h6z4S6YRoIeaU209Y9MA5YWpX5VpTyJ4BaEXPpATE4EX43gswKBUTfpMbis2tUQB2Gz"); yield return (HashHigh: 0xd43bfd3229218adeUL, HashLow: 0xfcb12b7a4140fa92UL, Seed: 0x0000000000000000L, Ascii: "cNYvYuZsq06i7H7WLyfFupM0LMSPAl0YG9GIQlb2j1MpUEOHTJMNhSixgozom286SIRoWESHtQpqmpxQqL3M5gnNpbLetqfKr5XTrS0kZ85t4dnxHzRhnQ227DuqoTUlwPbHlsC68fSOUgR72IUSPH4tVAza8LKjYXDR32AyU6xosyqJjUOiGWTfCZvBoOgOxQtLKWcu0zbiGo9wuB5fuKQQhm9mHPQ1qUPr97UTvGC"); yield return (HashHigh: 0x9b1a6cc32abe529aUL, HashLow: 0x4f0851b91a94b9b1UL, Seed: 0x39f52b1b0c535141L, Ascii: "Fg5rgyd7wAL8cmS5FUJ9DopvpyB0hbrMEq8KCrbVYWoZ5oGCc5zAZ01ICohJ7xxE39O9RIZU5IHns7A9WaoLatO1M8am7ymYr8yy6YslbcpdR1T7xMhN7uRHbF0TjTvtRGPzLv5vd4nRA6XrCXPAj4ctcXE7l7GpY3sfOK5m7ZpfYsL0NA917z1zR3Ljfx3qspHMnAP7LSCyw4Eb8EOBwdZ1fN9bRL8NOBkerIC7mha"); yield return (HashHigh: 0x0eafb11616ea0e8fUL, HashLow: 0xb9d805f92225fc11UL, Seed: 0x0000000000001163L, Ascii: "0gY41Jalya9vYJjOXT5D0Cv1RCFCUzdzKYlttwov2v4ZJ5Q0qfKAvuQNYeTtsOKqMpbgStqsEiCaSTyPZ5rveLC8vxnHiiALJEFKwEyatTXJPs0onHxUFWCGN8cKIEE180cHtTlBQjDPmNGhH41lfK9smaVf4AKYWMRpNpI5KF5GNlkHIqDvh15GUdcb7oSdRr8Y4uvyCYDIIlNjA2hLmPmL2WPyIiVxzZLS2hF2F5g"); yield return (HashHigh: 0xc63a05f2b32557d4UL, HashLow: 0xb1a867e5db639b70UL, Seed: 0x000000000000083cL, Ascii: "lcweVocSaVB1nJiuE6h4ebmEKbN5OqNy6krCy1t9u0sYEVoP4pWOQis7qUf0BZYispUnrt09uVOPDmGFTIBNmF3lwWFhro0nRfuuhenbwibHy0KNy5LFMksHnC6r6wCf5JjfILEsZA6kIAjqxpUcs2i7tQyQM9wLWbVDwVNjxy03NlRrSKmjObfuYlxGlaCWARB41OmDS5kMJG4oyNmqMbAT1usQN8g5cSxN06XuUAd0"); yield return (HashHigh: 0x8fe9cdbe949d8d77UL, HashLow: 0x5680f16726367131UL, Seed: 0x0000000000000c86L, Ascii: "Uhwt7Dz1vwYRowKUmx3n7eURaEJyDk9OFxdSp3NzqEG1g9BpBCwrEIVg8bXz9cZfPfkigdJN5W6i0F0vXclcpBxzcBdbj5hs5sEnOkLnYGsKQkKOXpD1ktgX5h2ByhukExqP0cXWyMpJYtOPJLOBkModEGOexc2gSlzDs13cEiG1jBD3069e2Y9dUxArwDjHQTTHadymOzp3TuynpFN9hcUT7IM2lYJor9SArYgvEJoZ"); yield return (HashHigh: 0x775baba3e7abaceaUL, HashLow: 0xc588b66b3247e72dUL, Seed: 0x0000000000001986L, Ascii: "T1CPelBwyTr1stvMqH5JLWhpnlnA8EZVoylEZ0IfCp2brdRRul0m5V79DjDVMO0iz33FHQ3zeIFf1GZzbSbW1W2dWgXgh6d9joqLWx0Al3DHhosynGNgzgvnOnIydpS3Jr6M3bmErEtKGCzldILfBwAmJEI3nBpFZGfYH8lWGq2uoBqJpNFqdY8EeC5YUI1CV9N2wQd9V8fo6FLUJ58jcUDTxFUly0TjoYoY9zjc5RrM"); yield return (HashHigh: 0xef146adbfa40e8e8UL, HashLow: 0xc3d0325bbe4f38bbUL, Seed: 0x0000000000001bc2L, Ascii: "lbA1aER8HIbsbNTyXgYw2QdKrLJMOWv3Ns0SBIpBMCvWfsUUrFTmz3pTKQmWWbnrx2sjo3aZXAYoctJcXc5AjudoORKZefO7rTlv4PSJEoLLEtPsKDi7I3AiNjmAx5YCLaS7TWqPonVMe6ht3s1cEq91i8hsUTtbBqvHfoC6O0aZXlUYxG8QQyMhCXqlX3W1iV3HpLa8AwGHB72eVw3LQB6YECAlRz91rgUTmRgLSVyq"); yield return (HashHigh: 0xa88c7bfa03243ca0UL, HashLow: 0x1e6049840ca9627eUL, Seed: 0x5ba05907e31eb021L, Ascii: "SuOT6LZK4c1gthmKUbRPawWdadQQ9GOR0vKQqlq6YYZTFIvdrZZyqEeeW7ZZ4WOL1sqydeehtV7AxM6uv90X0CnBwnasBFo7oYC9OT4ux9GSNmSbvhdvaBnEJQbhtsz9jfDYpKCFrnjMGTgHTRcIRf5KBEONkJCnBWFiOQOkfBh3MmNXPri6kmS1EmZRdMfPdiLXPN0fKSeEBrpLRTKfJOO1xd2I4PwJR10EeN7K3PxBs"); yield return (HashHigh: 0x720f95ac2546fe35UL, HashLow: 0x4a99be91113637c7UL, Seed: 0x00000000000008e9L, Ascii: "0YOh4gh7ncDM7FmOF0mK53DkVfcO6LlAjbbxOAQEHHXzbwbDcc5pFiws4g0S9G2a0Y80hFjfEtryoByiebv75jVjlGQPtwZx67pefBo0AyJCZUbQb7TmBKAcOKGhgaC7pmF2dZPGzBrAiJpfMGd48B2UDTKZMNLXZZRc4rmvHCC2z6P9IZoOWymNoB3e3TK70oFRgpHiqG45aKxHatoGRq6jxYwjYMwQg7nZFRHrNGT9y"); yield return (HashHigh: 0x28ea84a1bfd4bdadUL, HashLow: 0x11457b654bdee031UL, Seed: 0x000000000000065cL, Ascii: "wKalrN29JvUsm53gnqKjg8th3UVwiwrUNeSKwDuKpWJLUhJJi51Tm2vhU9fA5iKeyJIIGlvnPACouqplAyr91f7vD9wG8GCNtvveTkq75MfXgI68psQ8Cu8VNjsnNmctg81mrPnNUf2x9jsEWgAl7pnUMN0gEvhpSpkzHHAwLXuXKGAzFpTeiNkoToKJbXLesQq7vUieskQ9yB6uVq7nTzNyRjvwlzLkv7j8fPNQCBKEK"); yield return (HashHigh: 0x78fb51b420756317UL, HashLow: 0x5bfdf75995ecac84UL, Seed: 0x0000000000001245L, Ascii: "Rpp36ahhyCIgSWfeA7zHAAC1DzXYQZdSToI6F1WRlPDNotVy6AvrYYIu8Oki319xGhl3aSjQd5EmEUO2HgOh72Dv24wzulbiSo45qS73BxAYcZRZenk5oq0T1O4draIIGNChbyLpaVXk2oIEku7CixuAoKltwu14cfTikr3rWhNSGYgRLoS6OhRRsyqZyB8PQ6NqMc2yzidYXhlMoiyjwYY86oMSCJQPYYfJ7x2M3Tujow"); yield return (HashHigh: 0xd2470c9fc8d59d8aUL, HashLow: 0xbf740401007c3642UL, Seed: 0x0000000000001894L, Ascii: "BxapM6Bj9U8ybZ7qGTDaBrVajPOUhCkFCrPyo1SjkcIJu9Nf9EbdVnwxLxqMuzfLAFI5FCmr2M6kf2lLn1QxNFWuGWI5zjCXklSWj6xUhAMSmfk92AKpTnTVgaAGvzkSQlcT7vGSpyFny8AeiNncSoc3PjuDbdqsWjLD6Sob8WCGO4faIuwohfhTec0yUALddr8oVgf2yDtIOxtsP2JyFOLLCOngEZbZqy8SL81DsXVfWa"); yield return (HashHigh: 0x55636bfa715705cbUL, HashLow: 0x1a6773f4c2a08547UL, Seed: 0x0000000000000223L, Ascii: "ECtOyFI3zjPsJ3SjpmDSVV0oPkCmRB3CtYK1HIx7o6qDI5J7GXaZPr4YQ8UNILkLppiguZdiS0YmDTgDF8s2GUGLyYrpTfM2SOjCz4qBnnbnEbFuh7y6POH00gShC9p0FosAy7l3P8vYqCkeZQ1KjaRFGLnVw3Q0UkLeKWCbbI3fSSxU6apg2X4wSlTDPb6gzZrA5NGS3r3L68u8MhfgR1mnXVm1wOER3KOHf7iRYO0GQw"); yield return (HashHigh: 0x4de37425afac5f8dUL, HashLow: 0x8f8e10a543b493f6UL, Seed: 0x0000000000001a92L, Ascii: "mma8l32S3LRF6fm7dYd9bhZsh9bO2FtCmBs2a8wOaNDVitVEuTiR3WTcwYMb6IvVIyb4RTT9IbW8R7rLTveJa2ZJrQfk2V5TZlsU7gULcs50QIkZst7dncj70d5HbjvNQGsW6NzrdcYmHDh2UL2C3ntic1iMv6Rnm83CfiuRkQQgUcdlMHbrXLHzn9FwBsc5j7HcCRBFfEgVAvSaLzvpVwFOUUONYNXrxQpig1ZbPbFh5Q"); yield return (HashHigh: 0xb4261f0d1490b308UL, HashLow: 0x5c50073d0ffb7eb7UL, Seed: 0x0000000000000000L, Ascii: "1QzdPiIjLZsdR7JxhNnDCq79jAnpyHI4QtN03F6fMIfpkamA9dvnXsloBCAHt5SuhoLFYmEnpJa6rBA5PCemq6i4gpUdA5ROGVHlcoe7tSM94yrc4scqTZY8lXzSwF7FrfmfLVaW86qKCB82Ppj00TvStbgr3ZiWEUMdoJzNWfdUgAlUKWFwPV0g40G80aWDtbKNeB1dSO5tYOSVfNTFpIbWS44MOKKegPWQbXsqj2bqHJc"); yield return (HashHigh: 0xb5243d1271b67cc0UL, HashLow: 0x720501fb39b87169UL, Seed: 0x0000000000001215L, Ascii: "UEVrGej4bdByOasGirKZMXe5lnOb1AjCjIrsS2gAw8OFOszvMM9zgFNYeiEEY99AUe46oWIMf98bsXX9UMiCLNF886dPtvzwpkz6k6DdW8UBYHLQdjKETvNZUAjw7ArGlv1uHJcPA4xZPoSCXdmDvUDqf2mZ5CUJ7cmXySCafuzUFq0eK996DoNM5L5DaTBM95QHXYaR34vsDFLE7KhfmBgoD03S9U8oizxHJkylOZavxVA"); yield return (HashHigh: 0x0397d7ff16335f25UL, HashLow: 0x030577636cb6882aUL, Seed: 0x5612008dc6ed9806L, Ascii: "dsVmJjeoqmmID9IkVicCbJnEIZA1hxpj0wPlyCg7dCN4HFkeUmlF4n5GahSPdzKuC3VWvqUdYQcnymvqdHsvBvpgeAy6h4KUhlaQ3iM9EMKhWhH1DUzg4ZlDT9zYMBopdhgNjQsHxDbPDc5Bl3SD5wGeH3A38WyRU6x9QzeJc4fyjFD9uL8qJVbn3sSneFJQ6grobyzqLIZ4sLh6OjVcXbOWMWKzHGQ7K7HJarw787aB7hw"); yield return (HashHigh: 0xea1c00cb841d0f4fUL, HashLow: 0x879884a1e65a2459UL, Seed: 0x00000000000016bdL, Ascii: "FdKNc9fjo7dTluFwLxwuOTXSzmzMgj9ItywHo7T6HQ5Fg39kHSVqullshpruTdP0BrEEcx652xt5USD0wkSzC8FQFxX8OHJKgBle5w450uePgZOP4hfAvzh0sNXzMVyyW9wUL1JUsG59Y0KvahNyZxO2hXNRVslyhy1LP0BDgA7dd1KUqM4ACALQOLUHDiAHyKMfONwEgX1G0zlJU5D4vTzTvNyqYGbytrcO4znn4SntVStm"); yield return (HashHigh: 0xa282e3d70c5f254bUL, HashLow: 0x09de9f66182cdb3aUL, Seed: 0x0000000000001c75L, Ascii: "x3TbzUpexub17sbjFpLsvGvyMLRjSF1gN0tiPUfFwyfEH1MQCKARAA4RPvI3WvbzUkfu97LNuon6kMlgdJE89UesIF8IoiADhKhovTybJsDaTK88RsV4VjYvI1a9HDP0eNTfFzCJhZ2mEKArqgXyjLIOIkQRCPI1a95p1HQxdbFlmwgubyli3WJFzdls07676LeCLKod7ZmsxqJhuRJ7khw6eWJzIpT0fLl25g0kyku8NUlj"); yield return (HashHigh: 0xcaca634dc4a96947UL, HashLow: 0x7c75bc55a5d25519UL, Seed: 0x0000000000000e2cL, Ascii: "mvOuW5Er55j43BJSdhWYGEPxIBc8XLthVAFLhy60A4s3DZ98dlpnPWPA4JsDQCv7cgV8Z2Hyzaz1hErmHCWowCvxllLqdFSxQ2lQKMWaMTAAnUwcqxZdu5SzOzikRgf3X5zWUqvJPJXgsT8jsdJNJIYmaJqDVZCIpnBilqZiNoImlgM7LPMr9Wy5GLYrBdlNsHdHRbsk4k32UXUQUeiuxKlL2lZZhVZJnPA6O5xyV9iOpGfx"); yield return (HashHigh: 0x71a8f9355f01256aUL, HashLow: 0xc80dbc9e7ca8c151UL, Seed: 0x0000000000002521L, Ascii: "KQ0ok3bAflZ1shhiIlX98i3I44BKFr4kqZmNITmCKCWnDn6sa8SEStoPYmFhAuFJJjdcgIVKa1gfUTq8GArzFpA43NaCTcXYRvH5jO5PNPXCTwGfd2J2tmtWGC0vIMR4sfCAIXrUHtEsLVEu5w0CeHRfBJZpGjSMgAD3WmIJgeTGrmnrWIJpiAgG46vKVz2tRaEmUpzbBFPiGR6JNlfNOVOo2u32NWRpYrlpQP1acQVbOE1d"); yield return (HashHigh: 0x381ddc601f6ab794UL, HashLow: 0x2f37d7c5257055c5UL, Seed: 0x000000000000021fL, Ascii: "a2WBB5GKMkHnAySB7uXFtoT8z1GgX0MPgzX4Zu4QWjZ5sfUPXZq3UXFUbG74Fw8Jk55geWbT9PB35YSVEbtIizEgLcpOll09vmDXlLcR6MxmGl6apvXEAodsve1dgw4eq9Lsx8LLdd5kJY1HlJL7Sd4fckloMiVNR1n8UdOzUdyZa0T0iKRc9wYvpG6py0QWwevVqXlZjwEyYmSQsHoXEtwzjUaRL5Fx15E21ANuyugJVKk7Sgmi8CVrQYFQZbeF6e2POv5ZFzf1OgjLnYHp0xpfWDD8uOKH4zE882uBMshXjVSjFRY9Yv5rKdymxkR4VMTZTNPNgiuPJSKQlt0XU2NdzVdH7iTNZ3Hxt1vIyFEtqCqHjFGxXPNaPGJbioubL3hGCs5lqEOVPHHNQNxjhmzmyS3O2DsZrvXkFbD1HpLisgz6T4S3mEJ3tDhzWpAkC3UnitHpgaoJnyBa0EchtNbtekxnSBQ6yShQN3CktaPjfTfGWMmUzkYOZFoG2dYZ"); yield return (HashHigh: 0x6f5bbac339994527UL, HashLow: 0xda2ff091f3590e72UL, Seed: 0x0000000000001865L, Ascii: "USxLu2Huv2su0RCa7ZAFf0cMpMLk7oYmPAUhnDBXAQyRMWT8Eoryj3FWiuo6LaGF60OFmx5lUXL6jvD741QrSZ54Ik312oxZurB9bBdCwQVzfnM65KgPdW3Adl5EQCf2zY8v9KZmkSjp6hIBc0iBhJtB1Pj2keW35tvQQhTfMWhmIHM2ZpB4AwK8aPrax3EmoGvs2sjcaijbVZOBQu1SNff8QmAWK4k6FldD3a7oz0OYk1rxaTccT2qoouqwBbgNvYXcsRlkH8s0F9FLRTAXYmYKro224xjli6ZdsoegrhrJjoPsNERGh5xm9mBGdadQRo4ZHLPoEpGWRq2u8gX9bM9jcellAeT7jJDIjXfsc9CfdPzF454x7H8D2Duh6TdRVnE56strIx1urtfbfqK4uH23JUgzsD3S9zasTsyatKv2DdbNSBs1zqBTGIDxwRyOF6Y7Z1UIjP2U7oLLzI7IwdaOzZmdnTJWTGqGO1y6xjjv7o0dzjRCtkfN0HFWF6C4AWQkj15GfEopfbw3nohIo9d9LdAZ9beW3Wt0mMTkg3UqgtpcQad3uRQj3Qwo2hXfxSF4OI4o7CF353coopSScASXKxSgSOTKSp0txdPBHpEGjlBjfyaLWbb4KF3lfAyzcFOdHhIXw4X5OXKfP9CzvWsBX30dJYPUM0iqMo4LPKyK6SSVakfTnMhfnWCkyt0q9FI2yn0hVkTs9qQuqSkH9INxYNhnn1OTDScudPq1d01hYCry4RtaxAbGYfvyGCcaua6MyGo5NDkrr8o6mXROvpDtX5LSqRLE8ArgGDmYkWeQx6whRPK7l5JRhN9NLOpglAUmOF8mstzQEcVhV8hK9xfXs0AdQZMMUrEQXgk2Qg1x02FNqKYbScPr5HWxxUc40fUHPhdllmC0f0CnrRE0xM8x9D1bgoVLkNBYQ34hATXuRd1wwKMXoOZ5Uw6lWAnUtpVB6e8Ns9XPYrJblJ61UD5RwHGczt4uv4Gla4SQ8zLLLq5rhRB2toDA3MiZc6wK"); yield return (HashHigh: 0x42113bfd29cfadecUL, HashLow: 0x80eb9cc47d75ef79UL, Seed: 0x0000000000000000L, Ascii: "TI6XYevJji9MGqpXH8Wa3hChji5jt91W8MyhwuKrpPUEBwp9sqWdebdVvoOEfJ2vGg1lNZIvuLwmVDKd8Vou3qGCT5VcqI8goIxXDF0jZF0XDLAQXCFikOvcx0CvZZYJjBVqiY49rbSIAqw4CdR2ex3guwaubHERWWU1WL4AwBYvqM40BZVP52jArDymVhTEg7kjsEgOPQbYxHCOiE0OVgDxvOfvLfnOvbVHAbJtACeFR7EuTQhnYI7WrEPTjmbSLxdV62FAi1DYVdHLSmJm0gmyGTYI7oKrbv90hbIJgv4D5hUGi2S43rmLixssqtosdSUBhsH25qJvJx1FZ6rIhtYrajtDpaCNPS1pH5aAe4NtujDG9mqqmm9IFSqw19cAE6dGCTd8FgLlWCKt8Vdoqn5Wy39E15wkCzV4ZtpTd1tMfdiQtIf7LIZKOmPQUjkj62i1pLbam8EHradR8iF9ZskMU2u3W7e7e4IWdGFzubnoH266VZSTZPn9RcLhwN0yrE3AvNk9WjKW6vwRV6C0nl1n96ir7VKTD08l4Nh1RXopC2ASGF2P72byEwdue5n8KjCvkoYSJdbif9QNiLeZoGMUB64ufVknWPjMGqxBRzUXuhhoXlsh2clxhSVycHYFc2WvldpGt11R4wgobPmtcrgQG6zjvGNKzVDQDnHxGN68c7Ij7CrghizJu14vZwfElUxoaPsdU1u0Uz8Re8XSR6O4NE7Rd3uo3EOSr3CVTjXTlKYMyheNzTTA3UsywfQJhK6W6aB2QZLrpwb27FBciHiXGsTGzJya3YeG1mCTRpCTNK0RY1EqBzzU6HI2rvHQhR6GLaVMVb4GXKqfi4NaSaj7h4kuFNc2M2Mu2VrznLBmBZ53Le6YeKpET1U40DROIhFWetZjD7kswu5xduEB6CCQDhHz2ZQWzivVHu5970LFcMI5oxwdUuOoIpgBAit3QNlqaHcvRKK8dR2TNl84AkLlxFnGx6HQHA4hPsFvfPJbAoHycCL7YcJIQGgZlGKB" + "ByZdEP6ZSs0vp5MNmIjRxJU7fxuTfgGUj1uMX7AnHZOktctLuT0dqJZ4uLwX55RxnibG7N9KsBMW2ic4h9bCEUVh9NsWYK6SuWzm6q7xBL4tcLtTkdVotWlmEGfUHd5RBuUZW7HaizfB5obQMgkRt6M7U9zMhruYY1RYsQOCHpCrefvcYrMCu2oass3T3l08fMudGelG6E0wAnDhHlBzJ9ACn0zjS6bxxV8IGPW5DtUCxfq1sTMs9T05DLAWVIP2ldLoRSaShmjZ3WP0iA97qgBVcSReu53OLYmmcnCUz5WBvmUpbLdf5mcCoshyJUprc1NXMhVJtrrt7FUMrEsXjMyusQapvduAo1eIYF7YGHVgN63lnZ7xPNaDERPHaIgtF3inQSKDLg3SF1sBR5y7FcYUS5cq1HefxvgWyx55uNCyRHIq6a5QHLLZqnuMcM0BvRrrsQchEn6uTfBvsnhycJNhKAUNbanKOKF95gNUEFIro7PHKB1sehxxAoa64oF3OctnFnSn5LintZDACNenvgwq3x2bCyE32zA7QHESF5f2TOmMzT0xKJOXShS2PcOThuFnsX5YIeS6N8BxX2C3wmld5Ka17I89K5msFZZnmhdk5y1iOyoeY3hP8bQgo5fNSaRgp6FIGpiU3z5sKTvEBJ8c6VmaS79PyDHYMHtNqv8FWRWmrY2cHlA3AFu9kyLwZpqIAWmiseRwZFRzFqF5rUtzPfwu0rxrxyJCVIbno4mrgjD5WP5CFXgAMrb9IxvvAteyEGmgs8Lvf5rLAqvyxASEA6FboVWVTPbwSCCx4SaknSMQlpIueBfbQFPQAnvZWiqFTi5A8CER6hdngTvNDXs2HjlCpJYphlkT7DRwwA6LUP2BwtKHBVAo3gR7wwexkoy0oRbA5cHwZtt1peKLp7gj2L2R3lcgtecll4lpcDo1GvBrwJAgkhDXwNZCRbVaCypqszwzET6XMv9ehWsLM5XvIaRFG6Oxmx12YzsggT22tPZP3dz6hzflpGsS7GgD"); yield return (HashHigh: 0x586d70310b7b0495UL, HashLow: 0x58793064f61ffc57UL, Seed: 0x104dff97b01e2965L, Ascii: "OeWmLYqrzy5uyrJpXEdAKKylrcZqYQ3vcpqZ5qMNlhCR2cSVfKIImaObd0qLjRPXXtHA3Ql0vBXbWRKXcCTxLpVAiPRx39Rgc8F6tMTBhLKh3rIq3ZU8r21tsdsnsnmHfxFgdcRTjdacf3Ml8eQIH8eelifyq3po08CvFbR1WF4DCDuRNCBd8THV6eTVMumdzRG2L9Vr2qVDsRkSzaDKAghjfLrnhxbDxtcXJKA8Lw9aIFJSNozCtGDot21N92AXwf3kZvikQGhV5QZMDJ39WrI1SdjfCOlQZrPRjX85HM3tJIoaBwRw57w8nYCIxehAMCQ1fAWMgdb2AfLhE9soOJaiLpbf0XurnnQXqb3Uy5DVhBUFQ4MLxdwHEzhQRwcnjeOo5iDW81WPtqQCYp7OueHrRWifcINoafhfqS0A7QenNkMsKwCjsJmYRfcyqzu6P1FzBdr7QTIyINomxHE5uD6pgtGF0HoM3TnaVwsTOaEnniG7CiOsV1knedfzG65NDXYk4zauhOdr5kBORn1dkPwYXr1fZJ0FciuyauTpN7pSWmpvihiUaiuNZsprWmENYhri5NT7GlrIdlMLyM2jztAiZI0ZCGV4It1WSv691Nlfc9TPBWFxaPK9Qibx16VY7JDheIxrDxw31F3NetfAytzINetjw28OYm8iiulIAqTrhZOoebesbnT2c2BkkWgCVVJpxmtR9RGDaiMag9fzQ6QTZK3Rh8vuKdJc8Gi7Nh1sK3DAqTcTzkW5LNNrQXSyLEbkxxEEvl3lm4RSoZ3GMXfjbwkKI22PMce4YXeLP9KtKopHvbgQpJ5JLw5X5QKDyhB64f8tbbnNMDdTYPka7ywOoVEsNzYhnT9mYfwNR8sYrzqCFxWuwE8USYoXdzkvjzomC9lxLKO9N1s0cg2Dk0yUilnBHxmk49STdIaohJO3eA3Pja3Zrw0Ua2ZriE6rvIgBv2cZEb6JSalwDyYhCOSwYPN5SqQArXtG8MoQXfO0nhGzh3AMDuS4Go3BaEXH" + "I6fcziqxna6gz3TOFO4a8XOFokCrDcPBArj6zlfAqfuAwD4wbjnmTUlTA8boOHPyZ0LFaKek5DOftarl7HO7XIzVZ23X0KgKNhxOHh3S439t6HpkUqxWb8nAf6jLSVDHKbPXVGHorGnMbSyZb49BQKGidNnHZQoxT2DOmQuhOJHs31cbriBIrQKAQZaAvsVLa2vn8YbjguekDWBFqk3Q4V26Xmrm4McUUuIwHG6pCUXDyGeYANgcy6r2Ngw6DrueDQo3tTJn2xO1258T82KQbmK73LKo1ZDdCt7S6plQ1tEsJYL9bDcr0e0DhZH51NGnEZcLhnG0z83NQmfoaj7eeijY0MehsOCfWKIZu9lemMwmblrVZrTlsWA8kvHRFgLWrKGjzjVaN30dEZFpp3nN5B3WQ54oqjqCRLMDJUUBW6oTa15sBBq8zljziyJRFlNlQJyVKViGB2ZJEZC4l3Td0LLsimO2XyQKqq4rFZe7B6QVeG8xly84d3QfYatQqVqN1IkD9u2SUzfhs15Qmg9vGmtWLbbaTbjmYwTm58geEcBIQwTyUkl6HUdBGs1oaKL7kFevkXEGWjt1yOXLyUOwA0mi2XKOp3sXDZXZFeQYMC23UuA4RDvL4cyBNel9pTNOlw1UzR1kD5Mn36Mcmsm42i5lZrk1CoLpXanfS1aNuiK40ZcXyDvnszDQ3fOGCbRND8seacADmdpKFczhKe0f6dIJcMVNrWYUAuOjz29uyZfeALqc2OamzLV4LdpSbaebG4qDEcE5N4SQLRSvvdJvBkbmdllZ1IEWE64Ol8Ti22jlWTsrT6BWyXhm4D08K3v5UDVCwVbRwLLeGdBvoG31AU3KOfJWmDWthtlLdIigz1hatt0TWSB4vmfp7H6gVzFjK4e9HhofapuVpbE7duSsMcHVGZsQeS2DucQdjogVEHOFJ4XqTsIK8v4qvRyeGnQf5LHXlp49tKfffvGSRlmQaniYIjKXEVKYOs3QNwCDmRMOUb1kRngiKwnWkmz5EveB" + "idPy67bwr05B7MQxSVsh3eXfjIrWw2AiiYC33Lthhrs07S9ALFGlfDhv3L2tejbBQ7NjBe0AT8NV4U1Q80quhJwCbybUWcLbf7GklusePDCzLURqrbn253MXP9vfgAedNniqRj4hks9XFoTd5pijUw6H1sxtYQsFXe4DcJyvRiS0tWOGxVJQrnZq6TEZPHo0Wj8xjIKtauJQihtOlU8ZRTdOdqiIcJf7f5erUBc3TDkKixLoxhh1fFYnLp9fPrc7I1ylCthBI3e3WFJGRZurCNwzBzCrhPQ0wLl7Z3fVz3cCfST4oaVsro55KRZ2RHgBx8JXMmaqLTFFp40d4JlPAE88HCzjX5TViHO1RNIVE2ajcGCVYB81pc4fgb9Dw3i8vIUpMYG06P2UDegFKVmsOR8gcfPwQOObdHDPSjBGK8uPgUd1NhbsgSGSV9KWlXciINbE5lqY0tticBerp7oS5lSag2UrAXizgVu1GaKSm9h98k5GZubwDDQbmSQ9jNyqg9u7CF6dpUoiF5rGVqps25Tg7B6vYYkydoaynDtvFf27XGw8N9XQUr5L7jxmYi50xCdQZhjxPpE76Wm5haYbTmrcqw2rm1tSFBk8x87f3cRrFjngfTA2aMD7bOENJyfPmHeFG9CpweDZSbzCb6Xasr0sGUmtDcb2gPoOV38BBOGkudVaK0jDgUXSy9a8sLJUHSM3hRxlcAX8VKhcd827830yRK7uUj39Xwwhl7WwPcX9vyt1QH7IpcqqvSSsXuGQWheBmIRjjpViU7q5rGSJtn339cYmtwiHFOHN5m60Qx3rcu6nyAl8uTjBHcGxum4oNz7f168MPvtxvmY57WVzNkekJYMyDQIeZEvNJtyogE6V0Uq2wbJwjwwQ0lOveOj2Jm0qDltUU9yOsYzBT6Vl417IZ3ib9JfeaVep4A94PoiP5jhuKqTDSH7j87UcMBToMe3X1CB7u1XrSjdYe1YckTdVvWXAAr3JqzdxkCdLWaSTV2Dgzyna6BmPCnBvpYuW" + "eRdmqLDlMDY3CMnJzHxu7Dte0qm5K0o0gVEkfjcgQ2MUpf1KQQCpsR6vsbFezLcJcMOH0dmFmujKY1KLbkcCY7MofrD1jafg3Tdt9JiQCi7aiutMXBpAOow9WgUXqnPIm0mE4ypiyMLiMpzjPoM9KAQoOeEIfkRRuvberQhtmFPJXD0hvQ0amYuEICOJ7P7iAt7jW14yGO7zemL2MGJlgMf0Zxzj18d4mWgaBLGXyFIBbaCpItwvL9pNQmIJugOWYvqYZ7mTROxSAfKaFvWPLOiQrp5WqzJ8g7Qyv71aNpDhFNxUnwfBWXlVNHKPSfLbTvmPhUpOrypMjE8x4Sk9V9sJpJ08DEg3nC5bLvmG0yMeoIWXQTOcQRyfCehc36HHvdoE7QYYlJ0YQrq9aDLTweLvpIpPBUOaEpWcaDmZV9xnOr4H9x12L7qevGx9KswaxATacXKvkR77FbeapXpEvvNqWEtP4zGbJ9UjbkgqM9s01SUCiiocFOkrZrvWaZrUxnhW9yenrI5P4px77cWAkqtFG1EbkcTNewS49UFnBEW3BTbgO5n9uWdfVS4L7eo8yyzdOSjWxXqXaxjHwrNEKz8TMTiwSe9a8j3Qtea0DiiYkkmhem38E73c9pBqP1Yd95pRrHKQ4tILPgT1WdwAU2EmgdBNbqC8ypDWvvYB12CZwEuckDcx1D7uT3vCkNx2LBDKNFTe2TX0XmX2ei78dAlBmNbhPEHZD4TLkwg7OlzYHvd7RxcR9bMuz7kuonBLuvzR2UqxBWwXvtlX3t6XNFqAHRkvZLry7i6xFowXTEJzYnq97RaHvtc8Cs4qznIjONLsKMvtYDek3awCQoQVBeDdHUIxGtT7gmUXHKF3B87g3ZKHHhXTY4RGLwcGsIFEOUhSPCGhyiiN3SnBaeHCkcKSVs6RWh6zzC7pclGpGemjZ7mcYT4xZihIpdgpoGEBWcggLrWvVVm2HNszMSdxNIHremngBAl9JD7oV1d2BqZfw8sHUg2QHp3zLMdBQLtQ"); yield return (HashHigh: 0xfd77d5586ef464e7UL, HashLow: 0xc05b765025561928UL, Seed: 0x0000000000000000L, Ascii: "iyWHI6mdPnxxYq6y3OF9nYbygTqAT8PWWoFZtq7PntXBgqqwIhA6vYF4SLIQwN9to5YH2CYIXqJ6ZmTxbw1GJwnUfdOYDtUQgX3ZioRMKDlHdIwjlYPD4wEvPGu3aRl5R0sW9ppujWlpFO7I2CrNVXb4mBxCAgjbRCoONwDStGDirdQeU1Ug5KfwfWYDSUYr2rUfeBV3O4HcH36SgY7LlIqIvKBEBgBnUa9gUMeD5dAyNAlqvRXYrN4IYq0Bmi4X7F5KZIrEcA7lwnQJe1MkYMDWVbChE5XyKqgTdKZey5vURvlboJMpZ1510Ltctp83CiUezqTVwxcZpHtvA05qHaueeMCCvjOsu8qLpvN2WRG7MrRPCZ5v8JlMsqLZ8MYbQxriqUV2K8BSFpJlYZfd86wMDaxDxRzUgDTn1KeLZFbbJtcVDsr87pPxgwl92xAosI1hbfc7iaeVGSqCJjmxnAGeevjcB14u7pjNhLUTT20N973vVGxevjPY9Nr8hUrXhHNpHIavdgdtIQSbOqa9If5rRY1maIHkO7idmUO3fqiu6R5RxWTtTWs0pPwydmqEuqQzHcjvV7y8wrxjbgb5cHbqYTy549sT639zopUGjSMMwqjJzeVqME9n7XIrdQ23zlbq1LNCQ810XHJDx4FFuhpS70m1PclYztHdvOlkuHvI2JwUZgD4TnHwXj1IsGbFXW5ut4MujNZ1tha8nc5T6LmaYsu179wFCX5I1lqZqB4z2Y7nqFS0rkX4SJFBF5PQ0GLnmN3KJYztXC6KlhjFTkKW5HRJiyF9L7dbZQaSfxqVjAm6RzL142sSqlD1eKLfJcpfxTqxoLRnT2sp0adhLTO8jNHS0JPvlTxrWIG0sl7tSc5n0TfhLQJIK8NDZp7nklRVayNRvfSRc0DB0JBPrOMTxmVUkzbKgB9xIgudR17EkhJZlkEGCIxVTPs526N8ULNqv8bqm2MM7CH3eyXUujaxXBHKVbMaUDIkbNVLzDt0k3NixMuRGLDAKujqFzNy" + "re5IyNTbMqrG2PpuozrNAJUc2b6Qzvd3vqdNoG7vL89OjF6nRJY5E5kSGzNJbJOMzshVkT2KJYtRFe9kvLsLTlaTGb0sAYqeUMYpVF1cAS89xvBnO4bAMsiYXapLxOkw6EEyhd6nJWnnVX9bKzZYcHcbJwH4lPRzFWa7VMb24lOGws9GCse0IFJ2zU2SszGEFMSjriAfcpSncVrscM5WFedYRtZNXwfGSl6xjcnq3e09ukHC2gtJ5r6l5tqNVAiZE7aolL1DaeXUsxAar9DaRErJ3IttkB2qa4pWNEnA9TKn5xMkx0UUBu7InIedxRlS2t3H6dDUxcOcdIOQ8ocWCNA1LyD84rt3PefPYcVQQuCgMSWcCxdkDr0oEAzhHo930FdF9xwEG4wKHq3h6hnBGlALvCO3Uy70KtpisTRgioIx2emw7EopNbMHKxzgzkyNewh2w9Z30Vm06joWe1qvzCm66SFrmx6nPTHb2X3NU0M7ZW9wJ60agW3fj5NcuErPV8vtZzcPMWEtE8Kj0FX2OUq741UziApFgi8SIl3uw9NzvRxMNv8LZJjmqrWRcs2scrnnxqw9wohmPLYqOAbDRYr5Vqy7LynWwJR2usdgNOGvlc4rTXDYM4TggscpaBGGYgfnBC3JT5EcNa3M13JvQ8HVXt7CSbdZBdyQbrQwblsWEXan7JMNrkl0LZgE04ItpXtBP9Motv5ZpIpKdE0UbL3jQmhksPsARPQsqQ84F63dTc5x6pSnQDlDlWH6TSshc6N8Czc4i2QpPY8HkGt5Xq0kxN0mQBy26cSmKceIKKAKh2tXYWRQS9usNZHYYn2u8wojmvcPFjE58xE43Gz9NgxiDjW5XVVvWxCsdDoGcPFh2KZtbCyosRJ7aJJr5dD2XqmhbAX6UG8QEsgcZQyTsfbzBC3zDfl5blXbyx1hhvra7MvNuK4uy4cnrj9qdL9YgQTyYZkZxQtuf6qPtwQKMbXvyBKD88Fpbzb0vXNItW1O23Y38DsPgB1L7UoNAc80" + "EKuAJUaaj6tMVQeGgXQUQDYnTOkJXZPlrDtnrXLFUjYZdhw23ZFlTZNPkiCzQpg0ZarlBYrVELyoXsFLbBO3HV6MHAISFNDpTsjN0FrgaGabTZzRVSr4KRuvT8Q8lZ1j0xft4narUuu8i8SiJK0f9qVxcQZDuUQSB5tvZPj1J4F0L1bJ44S775tGpjx5mUgI3xKyfBBUipgwPSW3X2rcQ20uljePYE4XuzjNLRKmbA7RhD4E8v5wJqiqGDqtEXOEFJFLHD8JAbjAbysd2SSuO4aEufjfyZjLfJ47kL4XvhrCD39X8buY5poRKqWdbHP8OmPEGsjypBijSd1fhaPGegkUAt8friWlEfEHtATfIa8kkF33WrTRpcVH2P64uQtSItVxtL4m6mWeFQIhPe5h2sftSJPKRboiqOx2tkjmXFQxhccBHRkmt90Qpyj4vRR1Eh1UoMbyhhjwaC0j14307KTiz6us73rNotyDi6OjNhEPdID3ysSOJEIAAdrn8rBVGLBLKp16Cxqni49aHb9F5LlWfNjSggUt8RsqTPwSBM78xju6WVsQK8brbA1C7GtvnqYgt1zXRGAuYmHeEz6BhmYNNQVYql2vK4Z2LuYh66hjC4SWbOnk9LnohyyNyohvwF2Er61ZlqpGcsLuQGp5Xxf4JOJbQFnelM0Bk5iGeF4qbXpIN18yxWVoZXxtvehXmiQE4fgEK5L5cIjl5r5wLGc6QtI1oddpLx5Rkpm9pxYstzO50psCEEAUU7KUSKpoapi2KUXoENi1g6PvnDpv6ItiH2MlIVUm514bd6wGO9A5yXZNTjeiDzgbCRI1nuXGapZ9yekZpqONJkKJxfuun2IKPzzD850m7YI87M5PQtU8qQNxYapk5aFlfWh49vHiTQDbEjnn4HveprIfcCMainMT4T4znAtToODoH12Hmu5UydcsoKLNNJAUiUAOIUmlEjYmXEgGEMLEF6kxkoCpncxf5aYo22BImbjAy5TGIo9wEfMuDes8L5EB7GiwSjkl" + "eDErSdaakXXBOhCMT8Pb5EhQSlpSgERDUlCbV20E1GRa8xkGNWU3HiyMuXGrhBnlZGBd6t80DpOlptqhHnAYEsMPnDOSY0JrtsaS8SoaFDOjnFL3aLgKgvXnxDK7qALssTObpAz0LLrJ7UhSa7bqMJVFscMTWE5JpSUbQ343fhiKX6fAJWOBasJUOK2xKROH0MToYdYbY7W6NTeELi7S0d7tqPMAVCs4WJcKzUvK7PluHXifcxBsVLo46W0FIatYe5S1fQwUvi2Y4VwXfla84DxrwtFmknNLAq86Fxv5NqVsV1yCMduHbgtI6XoeQ8ioUIx5jLiworGEh9jlnUJgN8cBYZyVgKjBgbE72AJFgSxKlp6tgmSSTkXxjBuY2t3fFJ6Aa8DuUHMwg6ZXPcgnMSNpszvXQyfig06rbvNKm0PhwAIYRrQ9kbNVx201Z5U9jYIuI8dgAG2wOibcKTkPmcWnUB2ijcm0xE6gXHihNPHmJexO9UeTV4m3MgQsSlE54bSL4tDE06nQJ2GsZDJPFAOlHKz2NyrMLg04MNzUfj89Un09afgqOLXoAa49deoqXGgTTT6iM8Fn2TDVMCFMO1t0zhy3mMKyilDSzPdGkSfQ29JotOGboQ3UOUXlYpQTXyrZ36lvhSKqji3jE5TujbViQvOXsnARKvgxDLSXeSdapsx2DXm6KobxrpGKdbMzzIYtfFpxYFy6BUQrkCXDYnVp50WhVtIzJEuDiM0ZYEwRYFhPsormPVNEE90rw6nhL1cznDcKjxDdC3sxh6i4lhG7jdPMpG9RqLYdRsnseCCkJKHUdq55YMEneZpOYjfxdteK8ML8Z24RmMODn3H23ga7QtmboOPAJBG5ahMNQ6DWyGaHqMRz3IUvKfi5nU0Nfpm4j0TdZRh6a9Hu8BtySKHH5Y6NgFToSa6aeGulTIpcik0KixeJgzeVRGpQ0KLHKS5WPfbNTXIUG0iGurgWWo3OSBgPowY50M9yrndhRjjZLLVOTJRZTn8rgdKz4v4c" + "wpkOVXr35VWwsGmFKDqa4xv7d2eIHpGPz0d7Ix3NkDe4lVM3ye8qpvzTjdiFMNgDXrEDGYXf8pGigqSxfU0V5PV68gmTl3xyWE4ulMYgmrBPmTCbp7svSLOL9VFp60AAJFzLmrjfaYJikwhh6UkxDH91cLDs9VFFWBcxs9qQSKIoM5bn99HdG4sJovNAfJQIDxaG4DjSeC9RCrtvA7VYUdhiPV4E06sWCMe1hl0pasyhCtgxUqRNA482aq1E2O6GTKrSxSh59HLcOIkKhFvEWmji8YoAQjqMm5rojIjwD2pnLIuSbwc9nOMdIHgRDQlmQhSQykduChqALN5D7lanlUnsR06IRLZrI5IqZTxERYFsnognsBauwdYjraY32mAoBe4cVZn259BDBfcQgxqAH2xoq11rd2hkbNuGozNIAuXu3DfCCEBJrQ7vdYiKKtd9yzk3mx3l3C8yPLLidJksnACUiaFWVke2rVHwULIZ2gH9IsqJIEbrjadgeC4AzC3EmsIGEDB56FOQfwiYxiZl4V7COQ2mvA2s7BW4kXeOYz4N1Tk892b9WgKEZf4ZSUIrc1luqwiMkqjHW3KjvCyPSgsPyk2E8hivCNsX11x3Igu1xJsEBFMIqngYW9Hf44RVzZ9QC737yfKhZ8NIqFjdjXkdUC9nkORpsVGEwEtHDl4kex3mQfRU8XNQj7RpHfNLGuPKryQVX3RIob18ZBxIZzJc9myKAj5q7OMyNGNzwJI51E92weX72GKzfM3mqOe0Nzx6KznLuf4s2ltjSYEWNaezKQaggz7mxchYFXUHkJvoMB482oUTXfRuiIWfCYQw9D1FCQhwI3BHVvIi4y4R55jVThswFcY8JAJ98wRELFaqlICRC15pwfgdlDCdBDFSLpFLuNEXLIQPvncycPYzttF2wMks4YZU1oF5T210MmO7PiOarXeWoTpzFQWOfwEl390den99HoSrVy0egVTXP1jomOeBjpDeYqVyqp2LnXdc0TTvhkMJQmpTSzMSj6o1" + "hGWoQDi4BAU5vfstgQcdgt4JvWU9wu0XtHfOtOmXRLkGIOoaR6JteOJ9EnTBt8dF6iMXFDb8V9v1Dtej07gSZA35GMesSOX6X2acTiUeS2LhGeWTGByPJwJMqe7u43noxXLZ4RFCQxv3OcOjvBrTQrt3HUITud2RefPVVVHpdXF2DN3kwBjFnonceJP6pk6MbkVv42oV0tgI9JHGWDOF5CU4mBYYZbKNv4QFgmvZYif7fAiFpuPKa8hW6jsiqVcWGRoUnJXrMYZp9zykNHGS76BcIzCgfSlF1jnZqeZcL2unmjoeyonwyic24B9n7YkSiWSEUmIgLXrqzGp82VXrcq9SRX9BAcn53U9jDQD8L9rksklY158asKiVJwGhj3EQuWpNqTipySKrr8R3xWLebpNCAnAlXckYTJqLZcrl2evBj3YmpfJWgOWkKMfGsluotOAnyLhr6psIe1PVNcYGUrilH1M6H9mF8LcWEuXvigL90roK4Kki3IDarCDSnc1mRzPf0I3v1ROuNNlgqbZNoMbL0TyMZDUq3wFzOf83emI8EHwhXagAd6LsfizcrSnVRraaOEYACDzqFBOjgtz1as0FKlaBSA67teTCKuoAp9XN4WBI0OsVPuY8NaiEkdvq3oPGahfqEHT988koGBqKJiv6GUeoTCQ3FsxOEXkVBlo46fimCNxIoqHKQKXoOoxfkJThKhGDrEK3R8iD4AyP5i3Whjakt0pmiLNTOoIrV0r7aqbvK7KA8NIZl8dXVjGQOtu1VyoLFfZ0nnWKMthJrroPqm83XcmulLWYxcG8lVGOLoilby0sxemMRDWveRqmrWx305h4n9y7wU5fYClZNlcsAC3xPPgDj5Mvf8bDEG4EIpZkvWGyUStN9vdkshPmm4vVMS9Fj25BTvPEix6ZL7MlRXYnQCOB1knysMTJsNPp7GN1YysFIFWRNvE4csYrJGkoeBKwMZVXvhLKgl2hqPyUfRJGGxBdTyuHItBHnQ2eXUtWuCqOXNktMOPReClF" + "rP52DQlgQG3BDVHE0BZKc7qD7XTSAdpQmqkzWfT21xfHpwcWecFHDxacJPX97ULpeVAmiP0I3Z1dcI7KqjSbr1shDzyjPspnHgulEvDDzT1a81B3JHADw4jv6rlwn2lFfy3AN2T8nZu5R4hnJcd0PjxV8ylVYStP0aEqQmR5haflXffyH2DHc3w5BjFq59jdZ0aN8D4yapVuOJUPHJIJmFvIhXiZZmoWjGFnF3dKPgUz2AZlnbTINRNbSCSUq2J9q0ZKo3IwdtqyonEH02yrFTn2WGoL1nfepY3vxdXX6FMFKaeLiFs22rXfZ6RkIv5tEZCtJTisJNT055bKWdCcLLCn9jY0s2j3YJs8dHLepjhxe7uAFMytTVq8Y0SE65nhUV832leIZR9JrMmNsmdfI59ABGEh2f6CBJ3ZJFameh0co9BzYBtEtcsajgM6PCOElRJHO9d8xmBRIlmNhBhcGC4BH2oEtFo6tbRnC3FRPsTLsv2yiDNL9UJ3S6lBJfMhkbLdUXCgBjaEXz5TkbNQDaaujQWQkHAVMHIdQ0deOtlvMsYvBCszf9181qAoTDF2ahmDQAnTarUxEn9GN3MHumhjI8Eki3h0hLZzgtoo4ovZwCCZLBeeAX8ycud9oBnn2b6f17peUNURveHuFeAuFz7ZUtXez1BcoflaqyKoq6vh6MGVxnNthBArU4sBP352OLhXIFoEggIP2MGBGpj2LxsXSZhbHrHMRflHSAgrTDqkHKqfjRdSxdEHfXxMkdj4f0FVhZEgOf99IN00YXwXfet2gHQWHfRjsvjzkDTzLoZSy6HQPXYrKnIcgsoAtt4OGkO0LxKXoAZT8Lm9cF1eJHdsAWEMmssd73oV0WXA111iAhf2IOfQW65htyEvP2ljlN9BmA2PLXZGaq2EG0ozV6XqiZ1pgEyyQ2qxRdEoKv8VJQuoWSvK8j6at7V5RjChJVVwL96LdVgvxnSeinlRWWcf5jYljn7SvLPMV9F9fXGNhZGvvnQVfhU0cZtny8k7" + "a1MO3gpnke0l1w03ZPgXVOMQH7DcIIy6IJSUNN5FqcubUATqdGWneXEi3HLYlcyO4CflRtGXO4vRSiAJSBla186vSiiJTe6L5t36t0G28hIIMkURDrAFjeB2VhLqVdqsmbDBxq4xxxrAi9KatciNCExmDk9JeHSrFeyjVkbw1SSb96Z4fSxtTyhpI7IiSP5vw9xqGBLUbpfewUaIfmXrwsAoLjurbE5W159x2bkL0b6XF9K0BMLsh7FJpl8Uh84XlDxYVUGYxL1jw9Cc29WAuy5uiCF6ThNw4p0NDlMslMMI6XJN4yz2bd7BJs4wlYFUwKqmwTVJAXoJIghgAX44ix9UxBcMjNWUqkIZa8Xaweh9pOrd7dhdWO2RMS25LD8yKSfan32deCGzcafjv6ZSy7MkiwYuviXpjlK4IJYd6wyitXts86MaP3ATXw472SHnnjLYJP9yBKuwBjdG5HfCUHGQwq5W6UQyoI7U5eszG62rJdr0YGkMuYbs0ayjWDf4gJxDz2UDwdkPH1fDOBIuQSiPcX8PRIELHfgwYseBhppC0PBDU6QAXjjxqRXz6iGHkNOOif67LS3tYOGif4jBPHEQLtbphuCCl2rXnKiRkxQb2LwEeSZVbPnzqlh5cN28bSLiFYpae03M7Cl7zC7oDz3XvthwgqfdZX224veXJzaEjsVOdXZKtNWaI8pf1J55Mq6FH5VRsHgpry86wXMVRrkty9UepTvrvkkHHprBAWuGQAanubxH2TRQrO8FukHKH0XfxxySbvN124hMBBNHysfWUyOhSoHl52AzkoARYTOkMS22MIGpLhuc8i7C2UVUraAZ5C3AhQITe2iVK6tEPHEy7tLFqHxrKpuZGKrc60pdkScSbRXsyF1kIWbc2JNDk4qv2QySbWPIIIz5aL9Pp8kT97QUiLFtdK8O2ghcHTFB8PqMKsg59Ex0Zlh2epGNCXqaqjkXjeMZxgLbqyrmfDMpNzOcgj4d66jhS0JwrFdoPAQOp1ODzJcLLP9eMhDl"); } #endregion XxHash128TestData } } ================================================ FILE: test/BloomFilterTest/ImportExportTest.cs ================================================ using BloomFilter; using System; using System.Collections; using Xunit; using BloomFilter.Configurations; using System.Collections.Generic; using System.Security.Cryptography; namespace BloomFilterTest { public class ImportExportTest { [Fact] public void ExportToBytes_And_Import() { var bf = (FilterMemory)FilterBuilder.Build(10000, 0.01); bf.Add("ExportToBytes_And_Import"); var bucketBytes = bf.ExportToBytes(); var bf2 = (FilterMemory)FilterBuilder.Build(new FilterMemoryOptions { BucketBytes = bucketBytes, ExpectedElements = 10000, ErrorRate = 0.01 }); Assert.True(bf2.Contains("ExportToBytes_And_Import")); } [Fact] public void Export_BitArray_And_Import() { var bf = (FilterMemory)FilterBuilder.Build(10000, 0.01); bf.Add("Export_BitArray_And_Import"); var buckets = bf.Export(); var bf2 = (FilterMemory)FilterBuilder.Build(new FilterMemoryOptions { Buckets = buckets, ExpectedElements = 10000, ErrorRate = 0.01 }); Assert.True(bf2.Contains("Export_BitArray_And_Import")); } ////Make sure your local memory is large enough [Theory] [InlineData(4_000)] [InlineData(100_000_000)] //[InlineData(1024 * 1024 * 1024)] //[InlineData(2147483640)] //[InlineData(2147483641)] //[InlineData(2147483647)] //[InlineData(2147483649)] //[InlineData(2147483630)] public void Fill_Export_And_Import_Contains(long expectedElements) { double errorRate = 0.1; var hashMethod = HashMethod.XXHash128; var bf = (FilterMemory)FilterBuilder.Build(expectedElements, errorRate, hashMethod); var rng = RandomNumberGenerator.Create(); var len = 1000; var list = new List(len); for (int i = 0; i < len; i++) { var data = new byte[1024]; rng.GetBytes(data); list.Add(data); } //fill Assert.All(bf.Add(list), r => Assert.True(r)); var bytes = bf.ExportToBytes(); var bf2 = (FilterMemory)FilterBuilder.Build(new FilterMemoryOptions() { Method = hashMethod, ExpectedElements = expectedElements, ErrorRate = errorRate, BucketBytes = bytes }); //contains Assert.All(bf2.Contains(list), r => Assert.True(r)); Assert.True(bf2.All(list)); } } } ================================================ FILE: test/BloomFilterTest/IssuesTest.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using BloomFilter; using BloomFilter.Configurations; using Xunit; namespace BloomFilterTest { public class IssuesTest { //Make sure your local memory is large enough [Theory] [InlineData(100_000_000)] //[InlineData(1024 * 1024 * 1024)] //[InlineData(2147483640)] //[InlineData(2147483647)] //[InlineData(2147483641)] //[InlineData(2147483649)] //[InlineData(2147483630)] public void Issues_16(long expectedElements) { double errorRate = 0.0000001; var hashMethod = HashMethod.XXHash128; var bf = (FilterMemory)FilterBuilder.Build(expectedElements, errorRate, hashMethod); var bytes = bf.ExportToBytes(); var bf2 = (FilterMemory)FilterBuilder.Build(new FilterMemoryOptions() { Method = hashMethod, ExpectedElements = expectedElements, ErrorRate = errorRate, BucketBytes = bytes }); } } } ================================================ FILE: test/BloomFilterTest/SerializerTest.cs ================================================ using System; using System.IO; using System.Threading.Tasks; using BloomFilter; using BloomFilter.Configurations; using Xunit; namespace BloomFilterTest { public class SerializerTest { [Theory] [InlineData(10_000)] [InlineData(500_000)] public async Task Serialize(long expectedElements) { double errorRate = 0.0000001; var bf = (FilterMemory)FilterBuilder.Build(expectedElements, errorRate); bf.Add("ExportToBytes_And_Import"); using var ms = new MemoryStream(); await bf.SerializeAsync(ms); ms.Position = 0; var bf2 = (FilterMemory)FilterBuilder.Build(new FilterMemoryOptions { ExpectedElements = 10000, ErrorRate = 0.01 }); await bf2.DeserializeAsync(ms); Assert.True(bf2.Contains("ExportToBytes_And_Import")); Assert.False(bf2.Contains("ExportToBytes_And_Import2")); Assert.Equal(bf.ExpectedElements, bf2.ExpectedElements); Assert.Equal(bf.ErrorRate, bf2.ErrorRate); // Check if the length of the stream is equal to the expected length using var ms2 = new MemoryStream(); await bf2.SerializeAsync(ms2); Assert.Equal(ms.Length, ms2.Length); } //Make sure your local memory is large enough [Theory] [InlineData(100_000_000)] //[InlineData(1024 * 1024 * 1024)] //[InlineData(2147483640)] //[InlineData(2147483647)] //[InlineData(2147483641)] //[InlineData(2147483649)] //[InlineData(2147483630)] public async Task SerializeLarge(long expectedElements) { double errorRate = 0.0000001; var bf = (FilterMemory)FilterBuilder.Build(expectedElements, errorRate); bf.Add("ExportToBytes_And_Import"); using var ms = new MemoryStream(); await bf.SerializeAsync(ms); ms.Position = 0; var bf2 = (FilterMemory)FilterBuilder.Build(new FilterMemoryOptions { ExpectedElements = 10000, ErrorRate = 0.01 }); await bf2.DeserializeAsync(ms); Assert.True(bf2.Contains("ExportToBytes_And_Import")); Assert.False(bf2.Contains("ExportToBytes_And_Import2")); } } } ================================================ FILE: test/BloomFilterTest/Utilitiy.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; namespace BloomFilterTest { static class Utilitiy { private static readonly RandomNumberGenerator Rng = RandomNumberGenerator.Create(); private const string Base62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static string GenerateString(int length) { if (length < 0) throw new ArgumentOutOfRangeException($"{nameof(length)} is {length}."); var random = new Random(Guid.NewGuid().GetHashCode()); return new string( Enumerable.Repeat(Base62, length) .Select(s => s[random.Next(s.Length)]) .ToArray()); } public static byte[] GenerateBytes(int size = 4) { if (size < 0) throw new ArgumentOutOfRangeException($"{nameof(size)} is {size}."); var buff = new byte[size]; Rng.GetBytes(buff); return buff; } public static byte[] ToUtf8Bytes(this string s) { return Encoding.UTF8.GetBytes(s); } public static byte[] FromHex(this string s) { return Convert.FromHexString(s); } } } ================================================ FILE: test/BloomFilterTest/ValueTypeTest.cs ================================================ using BloomFilter; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Xunit; namespace BloomFilterTest { public class ValueTypeTest { [Theory] [InlineData(HashMethod.LCGWithFNV1)] [InlineData(HashMethod.LCGWithFNV1a)] [InlineData(HashMethod.LCGModifiedFNV1)] [InlineData(HashMethod.RNGWithFNV1)] [InlineData(HashMethod.RNGWithFNV1a)] [InlineData(HashMethod.RNGModifiedFNV1)] [InlineData(HashMethod.CRC32)] [InlineData(HashMethod.CRC64)] [InlineData(HashMethod.Adler32)] [InlineData(HashMethod.Murmur3)] [InlineData(HashMethod.Murmur128BitsX64)] [InlineData(HashMethod.Murmur128BitsX86)] [InlineData(HashMethod.SHA1)] [InlineData(HashMethod.SHA256)] [InlineData(HashMethod.SHA384)] [InlineData(HashMethod.SHA512)] [InlineData(HashMethod.XXHash32)] [InlineData(HashMethod.XXHash64)] [InlineData(HashMethod.XXHash3)] [InlineData(HashMethod.XXHash128)] public void Int32(HashMethod hashMethod) { var bf = FilterBuilder.Build(100000, 0.01, hashMethod); var len = 100; var list = new List(len); for (int i = 0; i < len; i++) { list.Add(i); } Assert.All(bf.Add(list), r => Assert.True(r)); Assert.All(bf.Contains(list), r => Assert.True(r)); Assert.True(bf.Contains(list[0])); Assert.True(bf.All(list)); bf.Clear(); Assert.All(bf.Contains(list), r => Assert.False(r)); Assert.False(bf.Contains(list[0])); Assert.False(bf.All(list)); } [Theory] [InlineData(HashMethod.LCGWithFNV1)] [InlineData(HashMethod.LCGWithFNV1a)] [InlineData(HashMethod.LCGModifiedFNV1)] [InlineData(HashMethod.RNGWithFNV1)] [InlineData(HashMethod.RNGWithFNV1a)] [InlineData(HashMethod.RNGModifiedFNV1)] [InlineData(HashMethod.CRC32)] [InlineData(HashMethod.CRC64)] [InlineData(HashMethod.Adler32)] [InlineData(HashMethod.Murmur3)] [InlineData(HashMethod.Murmur128BitsX64)] [InlineData(HashMethod.Murmur128BitsX86)] [InlineData(HashMethod.SHA1)] [InlineData(HashMethod.SHA256)] [InlineData(HashMethod.SHA384)] [InlineData(HashMethod.SHA512)] [InlineData(HashMethod.XXHash32)] [InlineData(HashMethod.XXHash64)] [InlineData(HashMethod.XXHash3)] [InlineData(HashMethod.XXHash128)] public void Int16(HashMethod hashMethod) { var bf = FilterBuilder.Build(100000, 0.01, hashMethod); var len = 100; var list = new List(len); for (short i = 0; i < len; i++) { list.Add(i); } Assert.All(bf.Add(list), r => Assert.True(r)); Assert.All(bf.Contains(list), r => Assert.True(r)); Assert.True(bf.Contains(list[0])); Assert.True(bf.All(list)); bf.Clear(); Assert.All(bf.Contains(list), r => Assert.False(r)); Assert.False(bf.Contains(list[0])); Assert.False(bf.All(list)); } [Theory] [InlineData(HashMethod.LCGWithFNV1)] [InlineData(HashMethod.LCGWithFNV1a)] [InlineData(HashMethod.LCGModifiedFNV1)] [InlineData(HashMethod.RNGWithFNV1)] [InlineData(HashMethod.RNGWithFNV1a)] [InlineData(HashMethod.RNGModifiedFNV1)] [InlineData(HashMethod.CRC32)] [InlineData(HashMethod.CRC64)] [InlineData(HashMethod.Adler32)] [InlineData(HashMethod.Murmur3)] [InlineData(HashMethod.Murmur128BitsX64)] [InlineData(HashMethod.Murmur128BitsX86)] [InlineData(HashMethod.SHA1)] [InlineData(HashMethod.SHA256)] [InlineData(HashMethod.SHA384)] [InlineData(HashMethod.SHA512)] [InlineData(HashMethod.XXHash32)] [InlineData(HashMethod.XXHash64)] [InlineData(HashMethod.XXHash3)] [InlineData(HashMethod.XXHash128)] public void Int64(HashMethod hashMethod) { var bf = FilterBuilder.Build(100000, 0.01, hashMethod); var len = 100; var list = new List(len); for (long i = 0; i < len; i++) { list.Add(i); } Assert.All(bf.Add(list), r => Assert.True(r)); Assert.All(bf.Contains(list), r => Assert.True(r)); Assert.True(bf.Contains(list[0])); Assert.True(bf.All(list)); bf.Clear(); Assert.All(bf.Contains(list), r => Assert.False(r)); Assert.False(bf.Contains(list[0])); Assert.False(bf.All(list)); } [Theory] [InlineData(HashMethod.LCGWithFNV1)] [InlineData(HashMethod.LCGWithFNV1a)] [InlineData(HashMethod.LCGModifiedFNV1)] [InlineData(HashMethod.RNGWithFNV1)] [InlineData(HashMethod.RNGWithFNV1a)] [InlineData(HashMethod.RNGModifiedFNV1)] [InlineData(HashMethod.CRC32)] [InlineData(HashMethod.CRC64)] [InlineData(HashMethod.Adler32)] [InlineData(HashMethod.Murmur3)] [InlineData(HashMethod.Murmur128BitsX64)] [InlineData(HashMethod.Murmur128BitsX86)] [InlineData(HashMethod.SHA1)] [InlineData(HashMethod.SHA256)] [InlineData(HashMethod.SHA384)] [InlineData(HashMethod.SHA512)] [InlineData(HashMethod.XXHash32)] [InlineData(HashMethod.XXHash64)] [InlineData(HashMethod.XXHash3)] [InlineData(HashMethod.XXHash128)] public void Double(HashMethod hashMethod) { var bf = FilterBuilder.Build(100000, 0.01, hashMethod); var len = 100; var list = new List(len); for (var i = 0; i < len; i++) { list.Add(i * 99.99D); } Assert.All(bf.Add(list), r => Assert.True(r)); Assert.All(bf.Contains(list), r => Assert.True(r)); Assert.True(bf.Contains(list[0])); Assert.True(bf.All(list)); bf.Clear(); Assert.All(bf.Contains(list), r => Assert.False(r)); Assert.False(bf.Contains(list[0])); Assert.False(bf.All(list)); } [Theory] [InlineData(HashMethod.LCGWithFNV1)] [InlineData(HashMethod.LCGWithFNV1a)] [InlineData(HashMethod.LCGModifiedFNV1)] [InlineData(HashMethod.RNGWithFNV1)] [InlineData(HashMethod.RNGWithFNV1a)] [InlineData(HashMethod.RNGModifiedFNV1)] [InlineData(HashMethod.CRC32)] [InlineData(HashMethod.CRC64)] [InlineData(HashMethod.Adler32)] [InlineData(HashMethod.Murmur3)] [InlineData(HashMethod.Murmur128BitsX64)] [InlineData(HashMethod.Murmur128BitsX86)] [InlineData(HashMethod.SHA1)] [InlineData(HashMethod.SHA256)] [InlineData(HashMethod.SHA384)] [InlineData(HashMethod.SHA512)] [InlineData(HashMethod.XXHash32)] [InlineData(HashMethod.XXHash64)] [InlineData(HashMethod.XXHash3)] [InlineData(HashMethod.XXHash128)] public void Float(HashMethod hashMethod) { var bf = FilterBuilder.Build(100000, 0.01, hashMethod); var len = 100; var list = new List(len); for (var i = 0; i < len; i++) { list.Add(i * 99.99F); } Assert.All(bf.Add(list), r => Assert.True(r)); Assert.All(bf.Contains(list), r => Assert.True(r)); Assert.True(bf.Contains(list[0])); Assert.True(bf.All(list)); bf.Clear(); Assert.All(bf.Contains(list), r => Assert.False(r)); Assert.False(bf.Contains(list[0])); Assert.False(bf.All(list)); } [Theory] [InlineData(HashMethod.LCGWithFNV1)] [InlineData(HashMethod.LCGWithFNV1a)] [InlineData(HashMethod.LCGModifiedFNV1)] [InlineData(HashMethod.RNGWithFNV1)] [InlineData(HashMethod.RNGWithFNV1a)] [InlineData(HashMethod.RNGModifiedFNV1)] [InlineData(HashMethod.CRC32)] [InlineData(HashMethod.CRC64)] [InlineData(HashMethod.Adler32)] [InlineData(HashMethod.Murmur3)] [InlineData(HashMethod.Murmur128BitsX64)] [InlineData(HashMethod.Murmur128BitsX86)] [InlineData(HashMethod.SHA1)] [InlineData(HashMethod.SHA256)] [InlineData(HashMethod.SHA384)] [InlineData(HashMethod.SHA512)] [InlineData(HashMethod.XXHash32)] [InlineData(HashMethod.XXHash64)] [InlineData(HashMethod.XXHash3)] [InlineData(HashMethod.XXHash128)] public void Date(HashMethod hashMethod) { var bf = FilterBuilder.Build(100000, 0.01, hashMethod); var len = 100; var list = new List(len); var now = DateTime.Now; for (var i = 0; i < len; i++) { list.Add(now.AddSeconds(i)); } Assert.All(bf.Add(list), r => Assert.True(r)); Assert.All(bf.Contains(list), r => Assert.True(r)); Assert.True(bf.Contains(list[0])); Assert.True(bf.All(list)); bf.Clear(); Assert.All(bf.Contains(list), r => Assert.False(r)); Assert.False(bf.Contains(list[0])); Assert.False(bf.All(list)); } } } ================================================ FILE: test/BloomFilterTest/xunit.runner.json ================================================ { "parallelAlgorithm": "aggressive", "parallelizeAssembly": true, "parallelizeTestCollections": true, "stopOnFail": true, "showLiveOutput": true, "maxParallelThreads": "0.5x" } ================================================ FILE: test/Demo/BloomFilterMemory.cs ================================================ using BloomFilter; using System; namespace Demo { public class BloomFilterMemory { [Test("Sample In Memory")] public void SampleInMem() { var names = Enum.GetNames(typeof(HashMethod)); foreach (var name in names) { if (Enum.TryParse(name, out var hm)) { var bf = FilterBuilder.Build(10000000, 0.01, hm); Sample(bf); } } } private void Sample(IBloomFilter bf) { bf.Add("CAR_CAR_LOG1ssd3"); Console.WriteLine(bf.Contains("CAR_CAR_LOG1ssd3")); bf.Clear(); Console.WriteLine(bf.Contains("CAR_CAR_LOG1ssd3")); bf.Add("CAR_CAR_LOG1ssd3"); Console.WriteLine(bf.Contains("CAR_CAR_LOG1ssd3")); } } } ================================================ FILE: test/Demo/BloomFilterRedis.cs ================================================ using BloomFilter.Redis; using BloomFilter; using System; namespace Demo { public class BloomFilterRedis { [Test("Sample In Redis")] public void SampleInRedis() { var names = Enum.GetNames(typeof(HashMethod)); foreach (var name in names) { if (Enum.TryParse(name, out var hm)) { var bf = FilterRedisBuilder.Build("localhost", "bftest", 5000000, 0.001, hm); Sample(bf); bf.Dispose(); } } } private void Sample(IBloomFilter bf) { bf.Add("CAR_CAR_LOG1ssd3"); Console.WriteLine(bf.Contains("CAR_CAR_LOG1ssd3")); bf.Clear(); Console.WriteLine(bf.Contains("CAR_CAR_LOG1ssd3")); bf.Add("CAR_CAR_LOG1ssd3"); Console.WriteLine(bf.Contains("CAR_CAR_LOG1ssd3")); } } } ================================================ FILE: test/Demo/Demo.csproj ================================================  Exe net10.0 ================================================ FILE: test/Demo/Program.cs ================================================ using System; using System.Text; namespace Demo { class Program { static void Main(string[] args) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); TestExcute.Excute(typeof(Program)); } } } ================================================ FILE: test/Demo/TestExcute.cs ================================================ // ==++== // // Copyright (c) . All rights reserved. // // ==--== /* --------------------------------------------------------------------------- * * Author : v.la * Email : v.la@live.cn * Created : 2015-08-27 * Class : TestExcute.cs * * --------------------------------------------------------------------------- * */ using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; /// /// Class TestAttribute. /// public class TestAttribute : Attribute { /// /// Description /// public string Description { get; set; } /// /// Code /// public string Code { get; set; } /// /// Initializes a new instance of the class. /// public TestAttribute() { } /// /// Initializes a new instance of the class. /// /// The description. public TestAttribute(string description, string code = "") { Description = description; Code = code; } } /// /// Class TestExcute. /// public static class TestExcute { /// /// Excutes the specified test assembly. /// /// The t. public static void Excute(Type t) { #if NETFULL var dataAccess = Assembly.GetAssembly(t); #else var dataAccess = t.GetTypeInfo().Assembly; #endif IList list = new List(); foreach (var type in dataAccess.GetTypes()) { var clazz = type.GetConstructor(Type.EmptyTypes); if (clazz == null) continue; foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.Instance)) { if (method.GetCustomAttributes(typeof(TestAttribute), false).FirstOrDefault() is TestAttribute attr) { object instance = Activator.CreateInstance(type); ExecuteFunc func = new ExecuteFunc(instance, method, attr.Description, attr.Code); list.Add(func); } } } if (list.Count > 0) { StringBuilder text = new StringBuilder(); LrTag("Select the use-case", "-", 20); for (int i = 0; i < list.Count; i++) { if (string.IsNullOrWhiteSpace(list[i]._code)) { text.AppendFormat("[number:{0}] {1}{2}", i + 1, list[i], Environment.NewLine); } else { text.AppendFormat("[serial:{0},number:{1}] {2}{3}", i + 1, list[i]._code, list[i], Environment.NewLine); } } text.AppendLine("\r\n[0] \texit. "); string _display = text.ToString(); Console.Out.WriteLine(ConsoleColor.Green, _display); Console.Out.Write("select>"); string input = Console.ReadLine(); while (input != "0" && input != "quit" && input != "q" && input != "exit") { if (input.Equals("cls", StringComparison.OrdinalIgnoreCase)) { Console.Clear(); } var findCode = list.FirstOrDefault(w => !string.IsNullOrWhiteSpace(w._code) && w._code == input); if (findCode != null) { Console.Clear(); Console.Out.WriteLine(ConsoleColor.DarkCyan, findCode + " Running..."); findCode.Execute(); Console.Out.WriteLine(ConsoleColor.DarkCyan, findCode + " Complete..."); } else { if (int.TryParse(input, out int idx)) { if (idx > 0 && idx <= list.Count) { Console.Clear(); Console.Out.WriteLine(ConsoleColor.DarkCyan, list[idx - 1] + " Running..."); list[idx - 1].Execute(); Console.Out.WriteLine(ConsoleColor.DarkCyan, list[idx - 1] + " Complete..."); } } } Console.Out.WriteLine(); LrTag("Select the use -case", " -", 20); Console.Out.WriteLine(ConsoleColor.Green, _display); Console.Out.Write("select>"); input = Console.ReadLine(); } } } /// /// The space /// private static readonly string SPACE = " "; /// /// Lrs the tag. /// /// The view. /// The tag. /// The size. private static void LrTag(string view, string tag, int size) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < size; i++) { sb.Append(tag); } Console.Out.WriteLine(ConsoleColor.Yellow, sb + SPACE + view + SPACE + sb); } /// /// Writes the line. /// /// The writer. /// The color. /// The format. /// The arguments. private static void WriteLine(this TextWriter writer, ConsoleColor color, string format, params object[] args) { Console.ForegroundColor = color; writer.WriteLine(format, args); Console.ResetColor(); } /// /// Class ExecuteFunc. /// private class ExecuteFunc { private object _instance; private MethodInfo _method; private string _description; public string _code; /// /// Initializes a new instance of the class. /// /// The instance. /// The method. /// The description. public ExecuteFunc(object instance, MethodInfo method, string description = "", string code = "") { _instance = instance; _method = method; _code = code; if (string.IsNullOrEmpty(description)) { _description = string.Concat("\t", instance.GetType().FullName, ".", method.Name); } else { _description = string.Concat("\t", instance.GetType().FullName, "." + method.Name, "\t", description); } } /// /// Executes this instance. /// public void Execute() { if (_method.Invoke(_instance, null) is Task task) { task.Wait(); } } /// /// Returns a that represents this instance. /// /// A that represents this instance. public override string ToString() { return _description; } } } ================================================ FILE: test/PerformanceTest/GeneralPerformance.cs ================================================ using BloomFilter; using BloomFilter.FreeRedis; using BloomFilter.Redis; using FreeRedis; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; namespace PerformanceTest { public class GeneralPerformance { [Test("RedisPerformance")] public void RedisPerformance() { uint n = 30000; var errRate = 0.01; var hashData = Helper.GenerateData(n); var redisClient = new RedisClient("localhost"); var warm_up = new FilterFreeRedis("RedisClient", redisClient, "RedisPerformance", n, errRate, HashFunction.Functions[HashMethod.Murmur3]); warm_up.Clear(); Console.WriteLine($"=================== warm_up Performance =================== "); Performance(hashData, warm_up); var names = Enum.GetNames(typeof(HashMethod)); foreach (var name in names) { if (Enum.TryParse(name, out var hm)) { redisClient = new RedisClient("localhost"); var bf = new FilterFreeRedis("RedisClient", redisClient, "RedisPerformance", n, errRate, HashFunction.Functions[hm]); bf.Clear(); Console.WriteLine($"=================== {name} Performance =================== "); Performance(hashData, bf); } } } [Test("RedisClusterPerformance")] public void RedisClusterPerformance() { uint n = 30000; var errRate = 0.01; var hashData = Helper.GenerateData(n); var configuration = "127.0.0.1:7000,127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003,127.0.0.1:7004,127.0.0.1:7005"; var conn = ConnectionMultiplexer.Connect(configuration); foreach (var entry in conn.GetEndPoints()) { var server = conn.GetServer(entry); Console.WriteLine(server.EndPoint + " " + server.ServerType); } conn.Dispose(); var names = Enum.GetNames(typeof(HashMethod)); foreach (var name in names) { if (Enum.TryParse(name, out var hm)) { var bf = FilterRedisBuilder.Build(configuration, "bftest", n, errRate, hm); bf.Clear(); Console.WriteLine($"=================== {name} Performance =================== "); Performance(hashData, bf); bf.Dispose(); } } } [Test("MemoryPerformance")] public void MemoryPerformance() { uint n = 300000; var errRate = 0.01; var hashData = Helper.GenerateData(n); var names = Enum.GetNames(typeof(HashMethod)); foreach (var name in names) { if (Enum.TryParse(name, out var hm)) { var bf = FilterBuilder.Build(n, errRate, hm); Console.WriteLine($"=================== {name} Performance =================== "); Performance(hashData, bf); } } } private void Performance(IList hashData, IBloomFilter bf) { Stopwatch sw = Stopwatch.StartNew(); int index = 0; int count = hashData.Count; Parallel.ForEach(hashData, (data) => { bf.Add(data); Interlocked.Increment(ref index); }); while (index < count) { } sw.Stop(); Console.WriteLine($"Added Speed {sw.ElapsedMilliseconds}ms"); sw.Restart(); bool hasErr = false; int index2 = 0; var ret = Parallel.ForEach(hashData, (data) => { var hasDta = bf.Contains(data); Interlocked.Increment(ref index2); if (!hasDta) { if (hasErr) return; hasErr = true; Console.WriteLine("Error Match!"); } }); while (index2 < count) { } sw.Stop(); Console.WriteLine($"Contains Speed {sw.ElapsedMilliseconds}ms"); bf.Dispose(); } } } ================================================ FILE: test/PerformanceTest/HashErrRate.cs ================================================ using BloomFilter; using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; namespace PerformanceTest { public class HashErrRate { [Test("Bloom Filter Hash ErrRate")] public void ErrRateTest() { long n = 100000; double errRate = 0.01; var hashData = Helper.GenerateData(n); var probeData = Helper.GenerateData(n * 3); Filter bf = FilterBuilder.Build(n, errRate) as Filter; Console.WriteLine($"Count:{n} Capacity:{bf.Capacity},Hashes:{bf.Hashes},ExpectedElements:{bf.ExpectedElements},ErrorRate:{bf.ErrorRate}"); Console.WriteLine("---"); var names = Enum.GetNames(typeof(HashMethod)); foreach (var name in names) { if (Enum.TryParse(name, out var hm)) { ErrRateTest(hm, hashData, probeData, n, errRate); } } } private void ErrRateTest(HashMethod hashMethod, IList hashData, IList probeData, long n, double p) { var bf = FilterBuilder.Build(n, p, hashMethod); int inserts = hashData.Count; int errRates = 0; var set = new HashSet(); Stopwatch sw = Stopwatch.StartNew(); foreach (var data in hashData) { if (bf.Contains(data) && !set.Contains(data)) { errRates++; } bf.Add(data); set.Add(data); } sw.Stop(); int totalErrRates = 0; int probed = 0; foreach (var data in probeData) { if (probed >= inserts) break; if (!set.Contains(data)) { probed++; if (bf.Contains(data)) { totalErrRates++; } } } double errorRate = 100.0 * errRates / inserts; double totalErrorRate = 100.0 * totalErrRates / inserts; Console.WriteLine($"{hashMethod}"); Console.WriteLine($" Speed:{sw.Elapsed.TotalMilliseconds}ms ErrRate:{errorRate:F3}% ErrTotal:{errRates} Final ErrRate:{totalErrorRate:F3}%"); } } } ================================================ FILE: test/PerformanceTest/HashSpeed.cs ================================================ using BloomFilter; using BloomFilter.HashAlgorithms; using System; using System.Collections.Generic; using System.Text; namespace PerformanceTest { public class HashSpeed { [Test("HashPerformance")] public void Performance() { HashPerformance(new Crc32()); HashPerformance(new Crc64()); HashPerformance(new Adler32()); HashPerformance(new HashCryptoSHA1()); HashPerformance(new HashCryptoSHA256()); HashPerformance(new HashCryptoSHA384()); HashPerformance(new HashCryptoSHA512()); HashPerformance(new LCGWithFNV()); HashPerformance(new LCGWithFNV1a()); HashPerformance(new LCGModifiedFNV1()); HashPerformance(new RNGWithFNV1()); HashPerformance(new RNGWithFNV1a()); HashPerformance(new RNGModifiedFNV1()); HashPerformance(new Murmur32BitsX86()); HashPerformance(new Murmur128BitsX64()); HashPerformance(new Murmur128BitsX86()); HashPerformance(new XXHash32()); HashPerformance(new XXHash64()); HashPerformance(new XXHash3()); HashPerformance(new XXHash128()); } private void HashPerformance(HashFunction hashFunction) { string name = hashFunction.GetType().Name; long m = 1000; int k = 10; int count = 100000; var bf = new FilterMemory(BloomFilterConstValue.DefaultInMemoryName, m, k, hashFunction, new DefaultFilterMemorySerializer()); var array = new List(); for (int i = 0; i < 1000; i++) { array.Add(Helper.GenerateBytes(16)); } bf.Add(Helper.GenerateString(20)); Console.WriteLine(name + ":" + bf); int arrayCount = array.Count; Helper.Time(name, (n) => { bf.ComputeHash(array[n % arrayCount]); }, count); Helper.TimeWithThread($"{name} {Environment.ProcessorCount} Thread", (t, n) => { bf.ComputeHash(array[n % arrayCount]); }, Environment.ProcessorCount, count); Helper.TimeWithParallel($"{name} Parallel", (n) => { bf.ComputeHash(array[n % arrayCount]); }, count); } } } ================================================ FILE: test/PerformanceTest/Helper.cs ================================================ using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Threading.Tasks; namespace PerformanceTest { internal class Helper { private static readonly RandomNumberGenerator Rng = RandomNumberGenerator.Create(); private const string Base62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static string GenerateString(int length) { if (length < 0) throw new ArgumentOutOfRangeException($"{nameof(length)} is {length}."); var random = new Random(Guid.NewGuid().GetHashCode()); return new string( Enumerable.Repeat(Base62, length) .Select(s => s[random.Next(s.Length)]) .ToArray()); } public static byte[] GenerateBytes(int size = 4) { if (size < 0) throw new ArgumentOutOfRangeException($"{nameof(size)} is {size}."); var buff = new byte[size]; Rng.GetBytes(buff); return buff; } public static IList GenerateData(long n) { return GenerateData((int)n); } public static IList GenerateData(int n) { var random = new Random(Guid.NewGuid().GetHashCode()); var set = new HashSet(n); var list = new List(n); for (int i = 0; i < n; i++) { var data = GenerateBytes(random.Next(32, 512)); if (!set.Contains(data)) { list.Add(data); } set.Add(data); } return list; } public static void Time(string name, Action action, int iteration = 1) { TimeExecute(name, () => { for (int i = 0; i < iteration; i++) { action(i); } }, iteration); } public static void TimeWithThread(string name, Action action, int task = 1, int iteration = 1) { TimeExecute(name, () => { var tasks = new Task[task]; var taskCount = iteration / tasks.Length; for (int i = 0; i < tasks.Length; i++) { int t = i; tasks[i] = Task.Run(() => { for (int x = 0; x < taskCount; x++) { action(t, x); } }); }; Task.WaitAll(tasks); }, iteration); } public static void TimeWithParallel(string name, Action action, int iteration = 1) { TimeExecute(name, () => { Parallel.For(0, iteration, l => { int num = l; action(num); }); }, iteration); } private static void TimeExecute(string name, Action action, int iteration = 1) { ConsoleColor currentForeColor = Console.ForegroundColor; Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(name); GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); int[] gcCounts = new int[GC.MaxGeneration + 1]; for (int i = 0; i <= GC.MaxGeneration; i++) { gcCounts[i] = GC.CollectionCount(i); } Stopwatch watch = new Stopwatch(); ulong cycleCount = GetCycleCount(); watch.Start(); action(); watch.Stop(); ulong cpuCycles = GetCycleCount() - cycleCount; Console.ForegroundColor = currentForeColor; Console.WriteLine("\tIterations:\t" + iteration); Console.WriteLine("\tTime Elapsed:\t" + watch.Elapsed.TotalMilliseconds + "ms"); Console.WriteLine("\tPer Second:\t" + (iteration / watch.Elapsed.TotalSeconds).ToString("N0")); Console.WriteLine("\tCPU Cycles:\t" + cpuCycles.ToString("N0")); Console.WriteLine("\tMemory:\t\t" + FormatBytesToString(Process.GetCurrentProcess().WorkingSet64)); for (int i = 0; i <= GC.MaxGeneration; i++) { int count = GC.CollectionCount(i) - gcCounts[i]; Console.WriteLine("\tGen " + i + ": \t\t" + count); } Console.WriteLine(); } private static ulong GetCycleCount() { ulong cycleCount = 0; QueryThreadCycleTime(GetCurrentThread(), ref cycleCount); return cycleCount; } [DllImport("kernel32.dll")] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool QueryThreadCycleTime(IntPtr threadHandle, ref ulong cycleTime); [DllImport("kernel32.dll")] internal static extern IntPtr GetCurrentThread(); public static void PrintMem() { Console.WriteLine("Memory:" + FormatBytesToString(Process.GetCurrentProcess().WorkingSet64)); } public static string FormatBytesToString(double bytes) { const ulong KB = 1UL << 10, MB = 1UL << 20, GB = 1UL << 30, TB = 1UL << 40, PB = 1UL << 50, EB = 1UL << 60; if (bytes > EB) return string.Format("{0}EB", (bytes / EB).ToString("F2")); if (bytes > PB) return string.Format("{0}PB", (bytes / PB).ToString("F2")); if (bytes > TB) return string.Format("{0}TB", (bytes / TB).ToString("F2")); if (bytes > GB) return string.Format("{0}GB", (bytes / GB).ToString("F2")); if (bytes > MB) return string.Format("{0}MB", (bytes / MB).ToString("F2")); if (bytes > KB) return string.Format("{0}KB", (bytes / KB).ToString("F2")); return bytes + "Byte"; } } } ================================================ FILE: test/PerformanceTest/Issues_2.cs ================================================ using BloomFilter; using BloomFilter.Redis; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PerformanceTest { public class Issues_2 { [Test("Redis Performance")] public async Task Performance() { var bf = FilterRedisBuilder.Build("localhost", "bftest", 100000, 0.01); var items = new List(); var count = 50; var rndNum = new Random(Guid.NewGuid().GetHashCode()); for (int i = 0; i < count; i++) { items.Add(Helper.GenerateString(rndNum.Next(5, 30))); } await bf.AddAsync(items); var sw = Stopwatch.StartNew(); await bf.ContainsAsync(items); Console.WriteLine(sw.Elapsed); } } } ================================================ FILE: test/PerformanceTest/PerformanceTest.csproj ================================================  Exe net10.0 ================================================ FILE: test/PerformanceTest/Program.cs ================================================ using System; using System.Text; namespace PerformanceTest { class Program { static void Main(string[] args) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); TestExcute.Excute(typeof(Program)); } } } ================================================ FILE: test/PerformanceTest/TestExcute.cs ================================================ // ==++== // // Copyright (c) . All rights reserved. // // ==--== /* --------------------------------------------------------------------------- * * Author : v.la * Email : v.la@live.cn * Created : 2015-08-27 * Class : TestExcute.cs * * --------------------------------------------------------------------------- * */ using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; /// /// Class TestAttribute. /// public class TestAttribute : Attribute { /// /// Description /// public string Description { get; set; } /// /// Code /// public string Code { get; set; } /// /// Initializes a new instance of the class. /// public TestAttribute() { } /// /// Initializes a new instance of the class. /// /// The description. public TestAttribute(string description, string code = "") { Description = description; Code = code; } } /// /// Class TestExcute. /// public static class TestExcute { /// /// Excutes the specified test assembly. /// /// The t. public static void Excute(Type t) { #if NETFULL var dataAccess = Assembly.GetAssembly(t); #else var dataAccess = t.GetTypeInfo().Assembly; #endif IList list = new List(); foreach (var type in dataAccess.GetTypes()) { var clazz = type.GetConstructor(Type.EmptyTypes); if (clazz == null) continue; foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.Instance)) { if (method.GetCustomAttributes(typeof(TestAttribute), false).FirstOrDefault() is TestAttribute attr) { object instance = Activator.CreateInstance(type); ExecuteFunc func = new ExecuteFunc(instance, method, attr.Description, attr.Code); list.Add(func); } } } if (list.Count > 0) { StringBuilder text = new StringBuilder(); LrTag("Select the use-case", "-", 20); for (int i = 0; i < list.Count; i++) { if (string.IsNullOrWhiteSpace(list[i]._code)) { text.AppendFormat("[number:{0}] {1}{2}", i + 1, list[i], Environment.NewLine); } else { text.AppendFormat("[serial:{0},number:{1}] {2}{3}", i + 1, list[i]._code, list[i], Environment.NewLine); } } text.AppendLine("\r\n[0] \texit. "); string _display = text.ToString(); Console.Out.WriteLine(ConsoleColor.Green, _display); Console.Out.Write("select>"); string input = Console.ReadLine(); while (input != "0" && input != "quit" && input != "q" && input != "exit") { if (input.Equals("cls", StringComparison.OrdinalIgnoreCase)) { Console.Clear(); } var findCode = list.FirstOrDefault(w => !string.IsNullOrWhiteSpace(w._code) && w._code == input); if (findCode != null) { Console.Clear(); Console.Out.WriteLine(ConsoleColor.DarkCyan, findCode + " Running..."); findCode.Execute(); Console.Out.WriteLine(ConsoleColor.DarkCyan, findCode + " Complete..."); } else { if (int.TryParse(input, out int idx)) { if (idx > 0 && idx <= list.Count) { Console.Clear(); Console.Out.WriteLine(ConsoleColor.DarkCyan, list[idx - 1] + " Running..."); list[idx - 1].Execute(); Console.Out.WriteLine(ConsoleColor.DarkCyan, list[idx - 1] + " Complete..."); } } } Console.Out.WriteLine(); LrTag("Select the use -case", " -", 20); Console.Out.WriteLine(ConsoleColor.Green, _display); Console.Out.Write("select>"); input = Console.ReadLine(); } } } /// /// The space /// private static readonly string SPACE = " "; /// /// Lrs the tag. /// /// The view. /// The tag. /// The size. private static void LrTag(string view, string tag, int size) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < size; i++) { sb.Append(tag); } Console.Out.WriteLine(ConsoleColor.Yellow, sb + SPACE + view + SPACE + sb); } /// /// Writes the line. /// /// The writer. /// The color. /// The format. /// The arguments. private static void WriteLine(this TextWriter writer, ConsoleColor color, string format, params object[] args) { Console.ForegroundColor = color; writer.WriteLine(format, args); Console.ResetColor(); } /// /// Class ExecuteFunc. /// private class ExecuteFunc { private object _instance; private MethodInfo _method; private string _description; public string _code; /// /// Initializes a new instance of the class. /// /// The instance. /// The method. /// The description. public ExecuteFunc(object instance, MethodInfo method, string description = "", string code = "") { _instance = instance; _method = method; _code = code; if (string.IsNullOrEmpty(description)) { _description = string.Concat("\t", instance.GetType().FullName, ".", method.Name); } else { _description = string.Concat("\t", instance.GetType().FullName, "." + method.Name, "\t", description); } } /// /// Executes this instance. /// public void Execute() { if (_method.Invoke(_instance, null) is Task task) { task.Wait(); } } /// /// Returns a that represents this instance. /// /// A that represents this instance. public override string ToString() { return _description; } } }