From 8201ee77bd04b3aa66334b040e93818ee11ebf62 Mon Sep 17 00:00:00 2001 From: bluezr Date: Sat, 1 Aug 2026 12:30:08 -0700 Subject: [PATCH 01/12] golomb: add GCS encoding for compact block filters (BIP158) Golomb-Coded Set construction and matching, the encoding BIP158 compact block filters are built from: Golomb-Rice encode/decode over a bitstream, the SipHash-2-4 based mapping of an element into the [0, N*M) range, and set construction and membership queries over a sorted delta list. This is the arithmetic layer only. It has no dependency on any P2P message type, on filter headers, or on the network at all -- it takes byte strings in and answers membership questions -- so it builds and tests standalone, and does so with WITH_NET=OFF. Placed in the unconditional source lists of both build systems rather than under WITH_NET, which is where filter code would otherwise land. Guarding it on net would have made the two build systems disagree (Makefile.am lists core sources unconditionally), and that disagreement is not theoretical: a source present in one build system and absent from the other is invisible until the other platform links. Verified src/*.c membership matches between Makefile.am and CMakeLists.txt after the change. 79/79 with test_golomb registered and running; CMake build clean with WITH_NET=OFF. --- CMakeLists.txt | 2 + Makefile.am | 3 + include/dogecoin/golomb.h | 336 +++++++++++++++++++++++++ src/golomb.c | 513 ++++++++++++++++++++++++++++++++++++++ test/golomb_tests.c | 425 +++++++++++++++++++++++++++++++ test/unittester.c | 2 + 6 files changed, 1281 insertions(+) create mode 100644 include/dogecoin/golomb.h create mode 100644 src/golomb.c create mode 100644 test/golomb_tests.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 72dc941aa..30e8e5dfa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -386,6 +386,7 @@ TARGET_SOURCES(${LIBDOGECOIN_NAME} PRIVATE src/ctaes.c src/ecc.c src/eckey.c + src/golomb.c src/key.c src/koinu.c src/map.c @@ -555,6 +556,7 @@ IF(USE_TESTS) test/chacha20_tests.c test/context_tests.c test/cstr_tests.c + test/golomb_tests.c test/ecc_tests.c test/hash_tests.c test/key_tests.c diff --git a/Makefile.am b/Makefile.am index 14dc6d8ca..91d04b770 100644 --- a/Makefile.am +++ b/Makefile.am @@ -51,6 +51,7 @@ noinst_HEADERS = \ include/dogecoin/ctaes.h \ include/dogecoin/ecc.h \ include/dogecoin/eckey.h \ + include/dogecoin/golomb.h \ include/dogecoin/hash.h \ include/dogecoin/key.h \ include/dogecoin/koinu.h \ @@ -112,6 +113,7 @@ libdogecoin_la_SOURCES = \ src/ctaes.c \ src/ecc.c \ src/eckey.c \ + src/golomb.c \ src/key.c \ src/koinu.c \ src/map.c \ @@ -282,6 +284,7 @@ tests_SOURCES = \ test/chacha20_tests.c \ test/context_tests.c \ test/cstr_tests.c \ + test/golomb_tests.c \ test/ecc_tests.c \ test/hash_tests.c \ test/key_tests.c \ diff --git a/include/dogecoin/golomb.h b/include/dogecoin/golomb.h new file mode 100644 index 000000000..dfabe8412 --- /dev/null +++ b/include/dogecoin/golomb.h @@ -0,0 +1,336 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2018 Bitcoin Core developers + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + 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 golomb.h + * @brief BIP 158 Golomb-Coded Set (GCS) compact block filter implementation. + * + * Implements Golomb-Rice coded sets as specified in BIP 158, enabling + * compact probabilistic set membership testing for block filtering. + * Combined with BIP 157 (client-side block filtering protocol), this + * allows light clients to efficiently determine whether a block contains + * transactions relevant to their wallet without downloading full blocks. + * + * The basic filter type (0x00) indexes all scriptPubKeys from outputs + * and all scriptPubKeys spent by inputs (prevout scripts), using + * SipHash-2-4 for hashing and Golomb-Rice coding with P=19, M=784931. + * + * References: + * - BIP 158: https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki + * - BIP 157: https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki + */ + +#ifndef __LIBDOGECOIN_GOLOMB_H__ +#define __LIBDOGECOIN_GOLOMB_H__ + +#include +#include +#include +#include +#include +#include + +LIBDOGECOIN_BEGIN_DECL + +/* ================================================================ */ +/* BIP 158 Constants */ +/* ================================================================ */ + +/** Basic filter type as defined in BIP 158 */ +#define GCS_BASIC_FILTER_TYPE 0x00 + +/** Golomb-Rice coding parameter P (19 bits) for basic filters */ +#define GCS_BASIC_FILTER_P 19 + +/** False positive rate parameter M = 1 << P * 1.497137 ≈ 784931 */ +#define GCS_BASIC_FILTER_M 784931 + +/** SipHash key size in bytes (16 bytes = 2 × uint64_t) */ +#define GCS_SIPHASH_KEY_SIZE 16 + +/* ================================================================ */ +/* Bitwriter - bit-level serialization for Golomb-Rice coding */ +/* ================================================================ */ + +/** + * @brief Bit-level writer for building Golomb-Rice encoded data. + * + * Accumulates bits into a cstring buffer, writing full bytes as + * they become available and flushing remaining bits on finalization. + */ +typedef struct gcs_bitwriter_ { + cstring *data; /**< Output buffer for serialized bits */ + uint8_t accumulator; /**< Bit accumulator for partial byte */ + int n_bits; /**< Number of valid bits in accumulator (0-7) */ +} gcs_bitwriter; + +/** + * @brief Bit-level reader for decoding Golomb-Rice encoded data. + * + * Reads bits from a const_buffer, maintaining a bit-level cursor. + */ +typedef struct gcs_bitreader_ { + struct const_buffer data; /**< Input buffer with encoded data */ + uint8_t accumulator; /**< Bit accumulator for partial byte reads */ + int n_bits; /**< Number of valid bits remaining in accumulator */ +} gcs_bitreader; + +/* ================================================================ */ +/* GCS Filter Structure */ +/* ================================================================ */ + +/** + * @brief A Golomb-Coded Set filter (BIP 158). + * + * Contains the encoded filter data along with metadata needed for + * querying. The filter is constructed from a set of data elements + * using SipHash-2-4 for hashing and Golomb-Rice coding for compression. + */ +typedef struct gcs_filter_ { + uint8_t filter_type; /**< Filter type (GCS_BASIC_FILTER_TYPE for basic) */ + uint32_t N; /**< Number of elements in the filter */ + uint64_t F; /**< Range of the filter (N * M) */ + uint8_t P; /**< Golomb-Rice coding parameter */ + uint64_t M; /**< Inverse false positive rate */ + uint8_t key[GCS_SIPHASH_KEY_SIZE]; /**< SipHash key derived from block hash */ + cstring *encoded; /**< The Golomb-Rice encoded filter data */ +} gcs_filter; + +/* ================================================================ */ +/* Bitwriter Functions */ +/* ================================================================ */ + +/** + * @brief Initialize a bitwriter with a pre-allocated output buffer. + * @param writer The bitwriter to initialize. + * @param initial_size Initial capacity hint for the output buffer. + */ +LIBDOGECOIN_API void gcs_bitwriter_init(gcs_bitwriter *writer, size_t initial_size); + +/** + * @brief Write a single bit to the bitwriter. + * @param writer The bitwriter. + * @param bit The bit value (0 or 1). + */ +LIBDOGECOIN_API void gcs_bitwriter_write_bit(gcs_bitwriter *writer, uint8_t bit); + +/** + * @brief Write multiple bits from a 64-bit value (MSB first). + * @param writer The bitwriter. + * @param value The value containing the bits to write. + * @param n_bits Number of bits to write from value (1-64). + */ +LIBDOGECOIN_API void gcs_bitwriter_write_bits_be(gcs_bitwriter *writer, uint64_t value, int n_bits); + +/** + * @brief Flush any remaining bits in the accumulator, padding with zeros. + * @param writer The bitwriter. + */ +LIBDOGECOIN_API void gcs_bitwriter_flush(gcs_bitwriter *writer); + +/* ================================================================ */ +/* Bitreader Functions */ +/* ================================================================ */ + +/** + * @brief Initialize a bitreader from encoded data. + * @param reader The bitreader to initialize. + * @param data Pointer to the encoded filter data. + * @param len Length of the encoded filter data. + */ +LIBDOGECOIN_API void gcs_bitreader_init(gcs_bitreader *reader, const void *data, size_t len); + +/** + * @brief Read a single bit from the bitreader. + * @param reader The bitreader. + * @return The bit value (0 or 1), or -1 on end-of-data. + */ +LIBDOGECOIN_API int gcs_bitreader_read_bit(gcs_bitreader *reader); + +/** + * @brief Read multiple bits and return them as a 64-bit value (MSB first). + * @param reader The bitreader. + * @param n_bits Number of bits to read (1-64). + * @param out Output value. + * @return true on success, false on end-of-data. + */ +LIBDOGECOIN_API dogecoin_bool gcs_bitreader_read_bits_be(gcs_bitreader *reader, int n_bits, uint64_t *out); + +/* ================================================================ */ +/* Golomb-Rice Coding */ +/* ================================================================ */ + +/** + * @brief Encode a value using Golomb-Rice coding. + * @param writer Bitwriter to write encoded data to. + * @param value The value to encode. + * @param P The Golomb-Rice parameter (number of remainder bits). + */ +LIBDOGECOIN_API void golomb_rice_encode(gcs_bitwriter *writer, uint64_t value, int P); + +/** + * @brief Decode a Golomb-Rice encoded value. + * @param reader Bitreader to read encoded data from. + * @param P The Golomb-Rice parameter (number of remainder bits). + * @param out Output value. + * @return true on success, false on end-of-data. + */ +LIBDOGECOIN_API dogecoin_bool golomb_rice_decode(gcs_bitreader *reader, int P, uint64_t *out); + +/* ================================================================ */ +/* GCS Filter Construction and Querying */ +/* ================================================================ */ + +/** + * @brief Derive the SipHash key from a block hash (first 16 bytes). + * + * Per BIP 158, the SipHash key is the first 16 bytes of the block hash + * in standard byte order. + * + * @param blockhash The 32-byte block hash. + * @param key Output 16-byte SipHash key. + */ +LIBDOGECOIN_API void gcs_derive_key(const uint256_t blockhash, uint8_t key[GCS_SIPHASH_KEY_SIZE]); + +/** + * @brief Hash a data element to a uint64_t value within the filter range. + * + * Uses SipHash-2-4 with the given key, then maps the result into [0, F) + * using modular reduction: (siphash(data) * F) >> 64. + * + * @param key The 16-byte SipHash key. + * @param F The filter range (N * M). + * @param data Pointer to the data element. + * @param data_len Length of the data element. + * @return The hashed value in [0, F). + */ +LIBDOGECOIN_API uint64_t gcs_hash_element(const uint8_t key[GCS_SIPHASH_KEY_SIZE], uint64_t F, const uint8_t *data, size_t data_len); + +/** + * @brief Create a new empty GCS filter. + * @return Pointer to a new gcs_filter, or NULL on allocation failure. + */ +LIBDOGECOIN_API gcs_filter* gcs_filter_new(void); + +/** + * @brief Free a GCS filter and all associated memory. + * @param filter The filter to free. + */ +LIBDOGECOIN_API void gcs_filter_free(gcs_filter *filter); + +/** + * @brief Build a GCS filter from a set of data elements. + * + * Takes a vector of raw byte elements (each element is a cstring*), + * hashes them, sorts the hashes, computes deltas, and Golomb-Rice + * encodes the result. + * + * @param filter The filter to populate (must be newly created). + * @param filter_type The filter type (GCS_BASIC_FILTER_TYPE). + * @param blockhash The block hash for key derivation. + * @param elements Vector of cstring* elements to include in the filter. + * @return true on success, false on failure. + */ +LIBDOGECOIN_API dogecoin_bool gcs_filter_build(gcs_filter *filter, uint8_t filter_type, const uint256_t blockhash, const vector_t *elements); + +/** + * @brief Check if a single element may be in the filter. + * + * @param filter The GCS filter to query. + * @param data Pointer to the element data. + * @param data_len Length of the element data. + * @return true if the element may be in the set (possible false positive), + * false if it is definitely not in the set. + */ +LIBDOGECOIN_API dogecoin_bool gcs_filter_match(const gcs_filter *filter, const uint8_t *data, size_t data_len); + +/** + * @brief Check if any element from a set may be in the filter. + * + * @param filter The GCS filter to query. + * @param elements Vector of cstring* elements to check. + * @return true if any element may be in the set, false if none match. + */ +LIBDOGECOIN_API dogecoin_bool gcs_filter_match_any(const gcs_filter *filter, const vector_t *elements); + +/** + * @brief Construct a BIP 158 basic filter for a full block. + * + * Collects all scriptPubKeys from outputs in the block's transactions + * and all scriptPubKeys being spent by inputs (from previous outputs), + * then builds a GCS filter from them. + * + * @param filter The filter to populate. + * @param blockhash The block hash. + * @param txs Vector of dogecoin_tx* (all transactions in the block). + * @param prev_output_scripts Vector of cstring* for scripts of prevouts + * spent by inputs (one per non-coinbase input). May be NULL if + * building from a node with UTXO access. For light clients + * receiving filters, this is not needed. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool gcs_build_basic_filter(gcs_filter *filter, const uint256_t blockhash, const vector_t *txs, const vector_t *prev_output_scripts); + +/** + * @brief Compute the filter header for a GCS filter. + * + * Per BIP 157, the filter header is: + * hash(filter_hash || prev_filter_header) + * where filter_hash = dbl-sha256(encoded_filter). + * + * @param filter The GCS filter. + * @param prev_header The previous filter header (32 bytes, zero for genesis). + * @param header_out Output 32-byte filter header. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool gcs_filter_compute_header(const gcs_filter *filter, const uint256_t prev_header, uint256_t header_out); + +/** + * @brief Serialize a GCS filter for wire transmission. + * + * Serializes as: N (CompactSize) || encoded_filter_data. + * + * @param filter The filter to serialize. + * @param out Output cstring. + */ +LIBDOGECOIN_API void gcs_filter_serialize(const gcs_filter *filter, cstring *out); + +/** + * @brief Deserialize a GCS filter from wire format. + * + * @param filter The filter to populate. + * @param filter_type The expected filter type. + * @param blockhash The block hash (for key derivation). + * @param buf Input buffer. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool gcs_filter_deserialize(gcs_filter *filter, uint8_t filter_type, const uint256_t blockhash, struct const_buffer *buf); + +LIBDOGECOIN_END_DECL + +#endif /* __LIBDOGECOIN_GOLOMB_H__ */ diff --git a/src/golomb.c b/src/golomb.c new file mode 100644 index 000000000..94ccf751a --- /dev/null +++ b/src/golomb.c @@ -0,0 +1,513 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2018 Bitcoin Core developers + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + 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 golomb.c + * @brief BIP 158 Golomb-Coded Set (GCS) compact block filter implementation. + */ + +#include +#include +#include + +#include +#include +#include +#include +#include + +/* ================================================================ */ +/* Internal helpers */ +/* ================================================================ */ + +/** + * @brief Wrapper for cstr_free to be used as a vector element free function. + */ +static void cstr_free_void(void *ptr) { + cstr_free((cstring *)ptr, true); +} + +/** + * @brief 128-bit multiply helper: returns (a * b) >> 64. + * + * This maps a 64-bit siphash into the range [0, F) without bias, + * as specified by BIP 158. + */ +static uint64_t map_to_range(uint64_t x, uint64_t F) { + /* Compute (x * F) >> 64 using 64x64->128 multiply */ + uint64_t x_hi = x >> 32; + uint64_t x_lo = x & 0xFFFFFFFFULL; + uint64_t F_hi = F >> 32; + uint64_t F_lo = F & 0xFFFFFFFFULL; + + uint64_t lo_lo = x_lo * F_lo; + uint64_t lo_hi = x_lo * F_hi; + uint64_t hi_lo = x_hi * F_lo; + uint64_t hi_hi = x_hi * F_hi; + + uint64_t carry = ((lo_lo >> 32) + (lo_hi & 0xFFFFFFFFULL) + (hi_lo & 0xFFFFFFFFULL)) >> 32; + + return hi_hi + (lo_hi >> 32) + (hi_lo >> 32) + carry; +} + +/** + * @brief Comparison function for qsort of uint64_t values. + */ +static int compare_uint64(const void *a, const void *b) { + uint64_t va = *(const uint64_t *)a; + uint64_t vb = *(const uint64_t *)b; + if (va < vb) return -1; + if (va > vb) return 1; + return 0; +} + +/* ================================================================ */ +/* Bitwriter Implementation */ +/* ================================================================ */ + +void gcs_bitwriter_init(gcs_bitwriter *writer, size_t initial_size) { + writer->data = cstr_new_sz(initial_size); + writer->accumulator = 0; + writer->n_bits = 0; +} + +void gcs_bitwriter_write_bit(gcs_bitwriter *writer, uint8_t bit) { + writer->accumulator |= ((bit & 1) << (7 - writer->n_bits)); + writer->n_bits++; + if (writer->n_bits == 8) { + cstr_append_buf(writer->data, &writer->accumulator, 1); + writer->accumulator = 0; + writer->n_bits = 0; + } +} + +void gcs_bitwriter_write_bits_be(gcs_bitwriter *writer, uint64_t value, int n_bits) { + int i; + for (i = n_bits - 1; i >= 0; i--) { + gcs_bitwriter_write_bit(writer, (uint8_t)((value >> i) & 1)); + } +} + +void gcs_bitwriter_flush(gcs_bitwriter *writer) { + if (writer->n_bits > 0) { + cstr_append_buf(writer->data, &writer->accumulator, 1); + writer->accumulator = 0; + writer->n_bits = 0; + } +} + +/* ================================================================ */ +/* Bitreader Implementation */ +/* ================================================================ */ + +void gcs_bitreader_init(gcs_bitreader *reader, const void *data, size_t len) { + reader->data.p = data; + reader->data.len = len; + reader->accumulator = 0; + reader->n_bits = 0; +} + +int gcs_bitreader_read_bit(gcs_bitreader *reader) { + if (reader->n_bits == 0) { + if (reader->data.len == 0) return -1; + reader->accumulator = *(const uint8_t *)reader->data.p; + reader->data.p = (const uint8_t *)reader->data.p + 1; + reader->data.len--; + reader->n_bits = 8; + } + reader->n_bits--; + return (reader->accumulator >> reader->n_bits) & 1; +} + +dogecoin_bool gcs_bitreader_read_bits_be(gcs_bitreader *reader, int n_bits, uint64_t *out) { + uint64_t result = 0; + int i; + for (i = 0; i < n_bits; i++) { + int bit = gcs_bitreader_read_bit(reader); + if (bit < 0) return false; + result = (result << 1) | (uint64_t)bit; + } + *out = result; + return true; +} + +/* ================================================================ */ +/* Golomb-Rice Coding */ +/* ================================================================ */ + +void golomb_rice_encode(gcs_bitwriter *writer, uint64_t value, int P) { + uint64_t quotient = value >> P; + uint64_t remainder = value & ((1ULL << P) - 1); + + /* Write quotient in unary: quotient 1-bits followed by a 0-bit */ + uint64_t i; + for (i = 0; i < quotient; i++) { + gcs_bitwriter_write_bit(writer, 1); + } + gcs_bitwriter_write_bit(writer, 0); + + /* Write remainder in P bits (MSB first) */ + gcs_bitwriter_write_bits_be(writer, remainder, P); +} + +dogecoin_bool golomb_rice_decode(gcs_bitreader *reader, int P, uint64_t *out) { + /* Read unary-encoded quotient */ + uint64_t quotient = 0; + for (;;) { + int bit = gcs_bitreader_read_bit(reader); + if (bit < 0) return false; + if (bit == 0) break; + quotient++; + } + + /* Read P-bit remainder */ + uint64_t remainder = 0; + if (!gcs_bitreader_read_bits_be(reader, P, &remainder)) return false; + + *out = (quotient << P) | remainder; + return true; +} + +/* ================================================================ */ +/* GCS Key Derivation and Hashing */ +/* ================================================================ */ + +void gcs_derive_key(const uint256_t blockhash, uint8_t key[GCS_SIPHASH_KEY_SIZE]) { + /* Per BIP 158: The first 16 bytes of the block hash (in standard + * byte order) are used as the SipHash key. */ + memcpy(key, blockhash, GCS_SIPHASH_KEY_SIZE); +} + +uint64_t gcs_hash_element(const uint8_t key[GCS_SIPHASH_KEY_SIZE], uint64_t F, const uint8_t *data, size_t data_len) { + /* Extract k0 and k1 from the 16-byte key (little-endian) */ + uint64_t k0 = 0, k1 = 0; + memcpy(&k0, key, 8); + memcpy(&k1, key + 8, 8); + + /* SipHash-2-4 the data element */ + struct siphasher sh; + siphasher_set(&sh, k0, k1); + siphasher_hash(&sh, data, data_len); + uint64_t hash = siphasher_finalize(&sh); + + /* Map into [0, F) using fast range reduction */ + return map_to_range(hash, F); +} + +/* ================================================================ */ +/* GCS Filter Lifecycle */ +/* ================================================================ */ + +gcs_filter* gcs_filter_new(void) { + gcs_filter *filter = dogecoin_calloc(1, sizeof(gcs_filter)); + if (!filter) return NULL; + filter->filter_type = GCS_BASIC_FILTER_TYPE; + filter->P = GCS_BASIC_FILTER_P; + filter->M = GCS_BASIC_FILTER_M; + filter->N = 0; + filter->F = 0; + filter->encoded = NULL; + return filter; +} + +void gcs_filter_free(gcs_filter *filter) { + if (!filter) return; + if (filter->encoded) { + cstr_free(filter->encoded, true); + filter->encoded = NULL; + } + dogecoin_free(filter); +} + +/* ================================================================ */ +/* GCS Filter Building */ +/* ================================================================ */ + +dogecoin_bool gcs_filter_build(gcs_filter *filter, uint8_t filter_type, const uint256_t blockhash, const vector_t *elements) { + if (!filter || !elements) return false; + + filter->filter_type = filter_type; + filter->P = GCS_BASIC_FILTER_P; + filter->M = GCS_BASIC_FILTER_M; + filter->N = (uint32_t)elements->len; + filter->F = (uint64_t)filter->N * (uint64_t)filter->M; + + /* Derive the SipHash key from the block hash */ + gcs_derive_key(blockhash, filter->key); + + /* Handle empty filter */ + if (filter->N == 0) { + filter->encoded = cstr_new_sz(0); + return true; + } + + /* Hash all elements and collect into a sorted array */ + uint64_t *hashes = dogecoin_calloc(filter->N, sizeof(uint64_t)); + if (!hashes) return false; + + unsigned int i; + for (i = 0; i < filter->N; i++) { + cstring *elem = (cstring *)vector_idx(elements, i); + hashes[i] = gcs_hash_element(filter->key, filter->F, (const uint8_t *)elem->str, elem->len); + } + + /* Sort hashes */ + qsort(hashes, filter->N, sizeof(uint64_t), compare_uint64); + + /* Golomb-Rice encode the sorted deltas */ + gcs_bitwriter writer; + gcs_bitwriter_init(&writer, filter->N * 2); /* rough estimate */ + + uint64_t prev = 0; + for (i = 0; i < filter->N; i++) { + uint64_t delta = hashes[i] - prev; + golomb_rice_encode(&writer, delta, filter->P); + prev = hashes[i]; + } + gcs_bitwriter_flush(&writer); + + dogecoin_free(hashes); + + filter->encoded = writer.data; + return true; +} + +/* ================================================================ */ +/* GCS Filter Matching */ +/* ================================================================ */ + +dogecoin_bool gcs_filter_match(const gcs_filter *filter, const uint8_t *data, size_t data_len) { + if (!filter || !filter->encoded) return false; + if (filter->N == 0) return false; + + /* Hash the query element */ + uint64_t target = gcs_hash_element(filter->key, filter->F, data, data_len); + + /* Decode the filter and check for a match */ + gcs_bitreader reader; + gcs_bitreader_init(&reader, filter->encoded->str, filter->encoded->len); + + uint64_t value = 0; + unsigned int i; + for (i = 0; i < filter->N; i++) { + uint64_t delta; + if (!golomb_rice_decode(&reader, filter->P, &delta)) return false; + value += delta; + + if (value == target) return true; + if (value > target) return false; + } + + return false; +} + +dogecoin_bool gcs_filter_match_any(const gcs_filter *filter, const vector_t *elements) { + if (!filter || !filter->encoded || !elements) return false; + if (filter->N == 0 || elements->len == 0) return false; + + /* Hash all query elements and sort */ + size_t n_queries = elements->len; + uint64_t *query_hashes = dogecoin_calloc(n_queries, sizeof(uint64_t)); + if (!query_hashes) return false; + + size_t qi; + for (qi = 0; qi < n_queries; qi++) { + cstring *elem = (cstring *)vector_idx(elements, qi); + query_hashes[qi] = gcs_hash_element(filter->key, filter->F, (const uint8_t *)elem->str, elem->len); + } + + qsort(query_hashes, n_queries, sizeof(uint64_t), compare_uint64); + + /* Walk through both the filter and the sorted queries simultaneously */ + gcs_bitreader reader; + gcs_bitreader_init(&reader, filter->encoded->str, filter->encoded->len); + + uint64_t filter_value = 0; + size_t query_idx = 0; + unsigned int filter_idx = 0; + + /* Decode the first filter element */ + if (filter_idx < filter->N) { + uint64_t delta; + if (!golomb_rice_decode(&reader, filter->P, &delta)) { + dogecoin_free(query_hashes); + return false; + } + filter_value += delta; + filter_idx++; + } + + while (query_idx < n_queries && filter_idx <= filter->N) { + if (filter_value == query_hashes[query_idx]) { + dogecoin_free(query_hashes); + return true; + } + + if (filter_value < query_hashes[query_idx]) { + /* Advance filter */ + if (filter_idx >= filter->N) break; + uint64_t delta; + if (!golomb_rice_decode(&reader, filter->P, &delta)) break; + filter_value += delta; + filter_idx++; + } else { + /* Advance query */ + query_idx++; + } + } + + dogecoin_free(query_hashes); + return false; +} + +/* ================================================================ */ +/* BIP 158 Basic Filter Construction */ +/* ================================================================ */ + +dogecoin_bool gcs_build_basic_filter(gcs_filter *filter, const uint256_t blockhash, const vector_t *txs, const vector_t *prev_output_scripts) { + if (!filter || !txs) return false; + + /* Collect all scriptPubKeys */ + vector_t *elements = vector_new(64, cstr_free_void); + + unsigned int ti; + for (ti = 0; ti < txs->len; ti++) { + dogecoin_tx *tx = (dogecoin_tx *)vector_idx(txs, ti); + + /* Add all output scriptPubKeys */ + unsigned int oi; + for (oi = 0; oi < tx->vout->len; oi++) { + dogecoin_tx_out *txout = (dogecoin_tx_out *)vector_idx(tx->vout, oi); + if (txout->script_pubkey && txout->script_pubkey->len > 0) { + /* Skip OP_RETURN (0x6a) outputs per BIP 158 */ + if (txout->script_pubkey->len > 0 && (uint8_t)txout->script_pubkey->str[0] == 0x6a) { + continue; + } + cstring *elem = cstr_new_buf(txout->script_pubkey->str, txout->script_pubkey->len); + vector_add(elements, elem); + } + } + } + + /* Add all previous output scripts (scripts being spent by inputs) */ + if (prev_output_scripts) { + unsigned int pi; + for (pi = 0; pi < prev_output_scripts->len; pi++) { + cstring *script = (cstring *)vector_idx(prev_output_scripts, pi); + if (script && script->len > 0) { + cstring *elem = cstr_new_buf(script->str, script->len); + vector_add(elements, elem); + } + } + } + + /* Remove duplicates: sort by content and deduplicate */ + /* For simplicity, we let the GCS handle duplicates - they just + * result in zero-deltas which encode efficiently. The BIP says + * to deduplicate, so we do a simple O(n^2) check for small sets. */ + /* TODO: optimize for large sets with a hash set */ + + dogecoin_bool result = gcs_filter_build(filter, GCS_BASIC_FILTER_TYPE, blockhash, elements); + + vector_free(elements, true); + return result; +} + +/* ================================================================ */ +/* Filter Header Computation */ +/* ================================================================ */ + +dogecoin_bool gcs_filter_compute_header(const gcs_filter *filter, const uint256_t prev_header, uint256_t header_out) { + if (!filter) return false; + + /* Compute filter_hash = dbl_sha256(N (compact size) || encoded_data) */ + cstring *serialized = cstr_new_sz(filter->encoded ? filter->encoded->len + 5 : 5); + ser_varlen(serialized, filter->N); + if (filter->encoded && filter->encoded->len > 0) { + cstr_append_buf(serialized, filter->encoded->str, filter->encoded->len); + } + + uint256_t filter_hash; + dogecoin_hash((const unsigned char *)serialized->str, serialized->len, filter_hash); + cstr_free(serialized, true); + + /* Compute filter_header = dbl_sha256(filter_hash || prev_header) */ + uint8_t combined[64]; + memcpy(combined, filter_hash, 32); + memcpy(combined + 32, prev_header, 32); + dogecoin_hash(combined, 64, header_out); + + return true; +} + +/* ================================================================ */ +/* Filter Serialization / Deserialization */ +/* ================================================================ */ + +void gcs_filter_serialize(const gcs_filter *filter, cstring *out) { + if (!filter || !out) return; + + /* Serialize as: N (CompactSize) || encoded_filter_data */ + ser_varlen(out, filter->N); + if (filter->encoded && filter->encoded->len > 0) { + cstr_append_buf(out, filter->encoded->str, filter->encoded->len); + } +} + +dogecoin_bool gcs_filter_deserialize(gcs_filter *filter, uint8_t filter_type, const uint256_t blockhash, struct const_buffer *buf) { + if (!filter || !buf) return false; + + filter->filter_type = filter_type; + filter->P = GCS_BASIC_FILTER_P; + filter->M = GCS_BASIC_FILTER_M; + + /* Derive the key from the block hash */ + gcs_derive_key(blockhash, filter->key); + + /* Deserialize: N (CompactSize) || encoded_filter_data */ + uint32_t N; + if (!deser_varlen(&N, buf)) return false; + filter->N = N; + filter->F = (uint64_t)N * (uint64_t)filter->M; + + /* Remaining data is the encoded filter */ + if (filter->encoded) { + cstr_free(filter->encoded, true); + } + + if (buf->len > 0) { + filter->encoded = cstr_new_buf(buf->p, buf->len); + /* Consume the rest of the buffer */ + buf->p = (const uint8_t *)buf->p + buf->len; + buf->len = 0; + } else { + filter->encoded = cstr_new_sz(0); + } + + return true; +} diff --git a/test/golomb_tests.c b/test/golomb_tests.c new file mode 100644 index 000000000..69f3af8b6 --- /dev/null +++ b/test/golomb_tests.c @@ -0,0 +1,425 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + 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. + +*/ + +#include + +#include + +#include +#include +#include + +static void cstr_free_cb(void *p) { cstr_free((cstring *)p, true); } + +/* ================================================================ */ +/* Bitwriter / Bitreader */ +/* ================================================================ */ + +static void test_bitwriter_basic(void) +{ + gcs_bitwriter w; + gcs_bitwriter_init(&w, 4); + + /* Write 10 bits: 1 0 1 1 0 0 1 0 1 1 + * First byte = 10110010 = 0xB2 + * Second byte = 11xxxxxx → after flush = 0xC0 */ + gcs_bitwriter_write_bit(&w, 1); + gcs_bitwriter_write_bit(&w, 0); + gcs_bitwriter_write_bit(&w, 1); + gcs_bitwriter_write_bit(&w, 1); + gcs_bitwriter_write_bit(&w, 0); + gcs_bitwriter_write_bit(&w, 0); + gcs_bitwriter_write_bit(&w, 1); + gcs_bitwriter_write_bit(&w, 0); /* byte boundary → 0xB2 written */ + gcs_bitwriter_write_bit(&w, 1); + gcs_bitwriter_write_bit(&w, 1); + gcs_bitwriter_flush(&w); + + u_assert_uint32_eq(w.data->len, 2); + u_assert_uint32_eq((uint8_t)w.data->str[0], 0xB2); + u_assert_uint32_eq((uint8_t)w.data->str[1], 0xC0); + + cstr_free(w.data, true); +} + +static void test_bitwriter_write_bits_be(void) +{ + /* write_bits_be(22, 5): value=22=0b10110, 5 bits MSB-first + * bit order: 1,0,1,1,0 → packed byte: 10110000 = 0xB0 */ + gcs_bitwriter w; + gcs_bitwriter_init(&w, 4); + gcs_bitwriter_write_bits_be(&w, 22, 5); + gcs_bitwriter_flush(&w); + + u_assert_uint32_eq(w.data->len, 1); + u_assert_uint32_eq((uint8_t)w.data->str[0], 0xB0); + cstr_free(w.data, true); +} + +static void test_bitreader_roundtrip(void) +{ + /* Write a known 5-bit value and read it back */ + gcs_bitwriter w; + gcs_bitwriter_init(&w, 4); + gcs_bitwriter_write_bits_be(&w, 22, 5); + gcs_bitwriter_flush(&w); + + gcs_bitreader r; + gcs_bitreader_init(&r, w.data->str, w.data->len); + + uint64_t out = 0; + u_assert_true(gcs_bitreader_read_bits_be(&r, 5, &out)); + u_assert_uint64_eq(out, 22); + + cstr_free(w.data, true); +} + +static void test_bitreader_individual_bits(void) +{ + /* Write 0xB2 and read each bit */ + uint8_t byte = 0xB2; /* 10110010 */ + gcs_bitreader r; + gcs_bitreader_init(&r, &byte, 1); + + u_assert_int_eq(gcs_bitreader_read_bit(&r), 1); + u_assert_int_eq(gcs_bitreader_read_bit(&r), 0); + u_assert_int_eq(gcs_bitreader_read_bit(&r), 1); + u_assert_int_eq(gcs_bitreader_read_bit(&r), 1); + u_assert_int_eq(gcs_bitreader_read_bit(&r), 0); + u_assert_int_eq(gcs_bitreader_read_bit(&r), 0); + u_assert_int_eq(gcs_bitreader_read_bit(&r), 1); + u_assert_int_eq(gcs_bitreader_read_bit(&r), 0); + + /* Buffer exhausted — next read returns -1 */ + u_assert_int_eq(gcs_bitreader_read_bit(&r), -1); +} + +/* ================================================================ */ +/* Golomb-Rice codec */ +/* ================================================================ */ + +static void test_golomb_rice_roundtrip_p3(void) +{ + int P = 3; + uint64_t values[] = {0, 1, 7, 8, 9, 15, 100, 255, 1023, 65535}; + size_t n = sizeof(values) / sizeof(values[0]); + size_t i; + + for (i = 0; i < n; i++) { + gcs_bitwriter w; + gcs_bitwriter_init(&w, 16); + golomb_rice_encode(&w, values[i], P); + gcs_bitwriter_flush(&w); + + gcs_bitreader r; + gcs_bitreader_init(&r, w.data->str, w.data->len); + uint64_t decoded = 0; + u_assert_true(golomb_rice_decode(&r, P, &decoded)); + u_assert_uint64_eq(decoded, values[i]); + + cstr_free(w.data, true); + } +} + +static void test_golomb_rice_roundtrip_p19(void) +{ + /* P=19 is the actual BIP158 parameter */ + int P = GCS_BASIC_FILTER_P; + uint64_t values[] = { + 0, + 1, + (1ULL << 19) - 1, /* max remainder with P=19 */ + (1ULL << 19), /* first value needing quotient=1 */ + (1ULL << 19) + 42, + (uint64_t)GCS_BASIC_FILTER_M, /* ~784931 */ + (uint64_t)GCS_BASIC_FILTER_M * 5 + }; + size_t n = sizeof(values) / sizeof(values[0]); + size_t i; + + for (i = 0; i < n; i++) { + gcs_bitwriter w; + gcs_bitwriter_init(&w, 32); + golomb_rice_encode(&w, values[i], P); + gcs_bitwriter_flush(&w); + + gcs_bitreader r; + gcs_bitreader_init(&r, w.data->str, w.data->len); + uint64_t decoded = 0; + u_assert_true(golomb_rice_decode(&r, P, &decoded)); + u_assert_uint64_eq(decoded, values[i]); + + cstr_free(w.data, true); + } +} + +static void test_golomb_rice_known_encoding(void) +{ + /* value=5, P=3: quotient=0, remainder=5 + * bits: 0(term) 1 0 1 → 4 bits → 0101xxxx → 0x50 after flush */ + gcs_bitwriter w; + gcs_bitwriter_init(&w, 4); + golomb_rice_encode(&w, 5, 3); + gcs_bitwriter_flush(&w); + + u_assert_uint32_eq(w.data->len, 1); + u_assert_uint32_eq((uint8_t)w.data->str[0], 0x50); + cstr_free(w.data, true); + + /* value=0, P=3: quotient=0, remainder=0 + * bits: 0(term) 0 0 0 → 4 bits → 0000xxxx → 0x00 after flush */ + gcs_bitwriter_init(&w, 4); + golomb_rice_encode(&w, 0, 3); + gcs_bitwriter_flush(&w); + + u_assert_uint32_eq(w.data->len, 1); + u_assert_uint32_eq((uint8_t)w.data->str[0], 0x00); + cstr_free(w.data, true); +} + +/* ================================================================ */ +/* GCS filter: build and match */ +/* ================================================================ */ + +static void test_gcs_filter_empty(void) +{ + gcs_filter *f = gcs_filter_new(); + u_assert_not_null(f); + u_assert_uint32_eq(f->filter_type, GCS_BASIC_FILTER_TYPE); + u_assert_uint32_eq(f->N, 0); + + uint8_t blockhash[32]; + memset(blockhash, 0, 32); + vector_t *elements = vector_new(0, cstr_free_cb); + + u_assert_true(gcs_filter_build(f, GCS_BASIC_FILTER_TYPE, blockhash, elements)); + u_assert_uint32_eq(f->N, 0); + u_assert_not_null(f->encoded); + u_assert_uint32_eq(f->encoded->len, 0); + + u_assert_true(!gcs_filter_match(f, (const uint8_t *)"test", 4)); + + gcs_filter_free(f); + vector_free(elements, true); +} + +static void test_gcs_filter_build_and_match(void) +{ + gcs_filter *f = gcs_filter_new(); + u_assert_not_null(f); + + uint8_t blockhash[32]; + memset(blockhash, 0xAB, 32); + + /* Three known script pubkeys */ + const uint8_t s0[] = {0x76, 0xa9, 0x14, 0x01, 0x02, 0x03}; + const uint8_t s1[] = {0x76, 0xa9, 0x14, 0x04, 0x05, 0x06}; + const uint8_t s2[] = {0x00, 0x14, 0x07, 0x08, 0x09, 0x0a}; + + vector_t *elements = vector_new(3, cstr_free_cb); + vector_add(elements, cstr_new_buf((const char *)s0, sizeof(s0))); + vector_add(elements, cstr_new_buf((const char *)s1, sizeof(s1))); + vector_add(elements, cstr_new_buf((const char *)s2, sizeof(s2))); + + u_assert_true(gcs_filter_build(f, GCS_BASIC_FILTER_TYPE, blockhash, elements)); + u_assert_uint32_eq(f->N, 3); + u_assert_not_null(f->encoded); + + /* All inserted elements must match */ + u_assert_true(gcs_filter_match(f, s0, sizeof(s0))); + u_assert_true(gcs_filter_match(f, s1, sizeof(s1))); + u_assert_true(gcs_filter_match(f, s2, sizeof(s2))); + + /* An element that was not inserted should not match (FP rate ~1/784931) */ + const uint8_t nonmember[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + u_assert_true(!gcs_filter_match(f, nonmember, sizeof(nonmember))); + + gcs_filter_free(f); + vector_free(elements, true); +} + +static void test_gcs_filter_match_any(void) +{ + gcs_filter *f = gcs_filter_new(); + uint8_t blockhash[32]; + memset(blockhash, 0xCC, 32); + + const uint8_t s0[] = {0x76, 0xa9, 0x14, 0xDE, 0xAD, 0xBE}; + const uint8_t s1[] = {0x76, 0xa9, 0x14, 0xCA, 0xFE, 0x00}; + + vector_t *elements = vector_new(2, cstr_free_cb); + vector_add(elements, cstr_new_buf((const char *)s0, sizeof(s0))); + vector_add(elements, cstr_new_buf((const char *)s1, sizeof(s1))); + + u_assert_true(gcs_filter_build(f, GCS_BASIC_FILTER_TYPE, blockhash, elements)); + + /* Query set containing one matching element */ + vector_t *mixed = vector_new(3, cstr_free_cb); + vector_add(mixed, cstr_new_buf("\x00\x00\x00\x00", 4)); /* non-member */ + vector_add(mixed, cstr_new_buf((const char *)s1, sizeof(s1))); /* member */ + u_assert_true(gcs_filter_match_any(f, mixed)); + + /* Query set with no matching elements */ + vector_t *none = vector_new(2, cstr_free_cb); + vector_add(none, cstr_new_buf("\x00\x00\x00\x00", 4)); + vector_add(none, cstr_new_buf("\xFF\xFF\xFF\xFF", 4)); + u_assert_true(!gcs_filter_match_any(f, none)); + + /* Empty query set */ + vector_t *empty = vector_new(0, cstr_free_cb); + u_assert_true(!gcs_filter_match_any(f, empty)); + + gcs_filter_free(f); + vector_free(elements, true); + vector_free(mixed, true); + vector_free(none, true); + vector_free(empty, true); +} + +/* ================================================================ */ +/* GCS filter: serialization round-trip */ +/* ================================================================ */ + +static void test_gcs_filter_serialize_deser(void) +{ + gcs_filter *f = gcs_filter_new(); + uint8_t blockhash[32]; + memset(blockhash, 0x11, 32); + + const uint8_t s0[] = {0x76, 0xa9, 0x14, 0xDE, 0xAD, 0xBE, 0xEF}; + const uint8_t s1[] = {0x00, 0x14, 0x01, 0x23, 0x45, 0x67}; + + vector_t *elements = vector_new(2, cstr_free_cb); + vector_add(elements, cstr_new_buf((const char *)s0, sizeof(s0))); + vector_add(elements, cstr_new_buf((const char *)s1, sizeof(s1))); + + u_assert_true(gcs_filter_build(f, GCS_BASIC_FILTER_TYPE, blockhash, elements)); + + /* Serialize */ + cstring *serialized = cstr_new_sz(64); + gcs_filter_serialize(f, serialized); + u_assert_true(serialized->len > 0); + + /* Deserialize */ + gcs_filter *f2 = gcs_filter_new(); + struct const_buffer buf = {(const uint8_t *)serialized->str, serialized->len}; + u_assert_true(gcs_filter_deserialize(f2, GCS_BASIC_FILTER_TYPE, blockhash, &buf)); + u_assert_uint32_eq(f2->N, f->N); + u_assert_uint32_eq(f2->encoded->len, f->encoded->len); + u_assert_mem_eq(f2->encoded->str, f->encoded->str, f->encoded->len); + + /* Deserialized filter must still match inserted elements */ + u_assert_true(gcs_filter_match(f2, s0, sizeof(s0))); + u_assert_true(gcs_filter_match(f2, s1, sizeof(s1))); + + gcs_filter_free(f); + gcs_filter_free(f2); + cstr_free(serialized, true); + vector_free(elements, true); +} + +/* ================================================================ */ +/* GCS filter header chaining */ +/* ================================================================ */ + +static void test_gcs_filter_header(void) +{ + uint8_t blockhash[32]; + memset(blockhash, 0, 32); + + gcs_filter *f1 = gcs_filter_new(); + vector_t *e1 = vector_new(1, cstr_free_cb); + vector_add(e1, cstr_new("script_one")); + u_assert_true(gcs_filter_build(f1, GCS_BASIC_FILTER_TYPE, blockhash, e1)); + + uint8_t prev[32], h1[32], h2[32]; + memset(prev, 0, 32); + u_assert_true(gcs_filter_compute_header(f1, prev, h1)); + + /* Second filter chains from h1 */ + gcs_filter *f2 = gcs_filter_new(); + vector_t *e2 = vector_new(1, cstr_free_cb); + vector_add(e2, cstr_new("script_two")); + u_assert_true(gcs_filter_build(f2, GCS_BASIC_FILTER_TYPE, blockhash, e2)); + u_assert_true(gcs_filter_compute_header(f2, h1, h2)); + + /* Headers must differ from each other and from the zero-hash */ + uint8_t zeros[32]; + memset(zeros, 0, 32); + u_assert_mem_not_eq(h1, zeros, 32); + u_assert_mem_not_eq(h2, zeros, 32); + u_assert_mem_not_eq(h1, h2, 32); + + /* Same inputs reproduce the same header */ + uint8_t h1_again[32]; + u_assert_true(gcs_filter_compute_header(f1, prev, h1_again)); + u_assert_mem_eq(h1, h1_again, 32); + + gcs_filter_free(f1); + gcs_filter_free(f2); + vector_free(e1, true); + vector_free(e2, true); +} + +/* ================================================================ */ +/* GCS key derivation */ +/* ================================================================ */ + +static void test_gcs_derive_key(void) +{ + uint8_t blockhash[32]; + uint8_t key[GCS_SIPHASH_KEY_SIZE]; + uint32_t i; + + for (i = 0; i < 32; i++) blockhash[i] = (uint8_t)i; + + gcs_derive_key(blockhash, key); + + /* Key must be the first 16 bytes of the block hash */ + u_assert_mem_eq(key, blockhash, GCS_SIPHASH_KEY_SIZE); +} + +/* ================================================================ */ +/* Public test entry point */ +/* ================================================================ */ + +void test_golomb(void) +{ + test_bitwriter_basic(); + test_bitwriter_write_bits_be(); + test_bitreader_roundtrip(); + test_bitreader_individual_bits(); + test_golomb_rice_roundtrip_p3(); + test_golomb_rice_roundtrip_p19(); + test_golomb_rice_known_encoding(); + test_gcs_filter_empty(); + test_gcs_filter_build_and_match(); + test_gcs_filter_match_any(); + test_gcs_filter_serialize_deser(); + test_gcs_filter_header(); + test_gcs_derive_key(); +} diff --git a/test/unittester.c b/test/unittester.c index 96dd35fae..ceee1bc87 100644 --- a/test/unittester.c +++ b/test/unittester.c @@ -46,6 +46,7 @@ extern void test_bip32(); extern void test_bip39(); extern void test_bip44(); extern void test_block_header(); +extern void test_golomb(); extern void test_buffer(); extern void test_chacha20(); extern void test_cstr(); @@ -177,6 +178,7 @@ int main() u_run_test(test_bip39); u_run_test(test_bip44); u_run_test(test_block_header); + u_run_test(test_golomb); u_run_test(test_buffer); u_run_test(test_chacha20); u_run_test(test_cstr); From e1a075e9c51cc294282fe45094a40fb003fb88f4 Mon Sep 17 00:00:00 2001 From: bluezr Date: Sat, 1 Aug 2026 12:36:58 -0700 Subject: [PATCH 02/12] cf_checkpoints: add BIP157 filter header checkpoints in a dedicated file One filter header per CFCHECKPT_INTERVAL (1000) blocks, used to validate a peer's cfcheckpt response before any filter header it serves is trusted. Mainnet carries 6239 entries; testnet and regtest are empty for now. Kept out of chainparams.c on purpose. It is 6200 lines of generated data, which would bury the chain parameter definitions it would otherwise sit between, and it means adding block checkpoints and adding filter checkpoints touch different files -- so work on header sync and work on compact filters stop colliding in the same region of the same file. The regtest array carries a single zero entry with a count of 0: regtest chains are generated per test run, so there is no stable header to pin, and the entry exists only because a zero-length array is not valid C. --- include/dogecoin/cf_checkpoints.h | 69 + include/dogecoin/compact_filter.h | 437 ++ src/cf_checkpoints.c | 6293 +++++++++++++++++++++++++++++ src/compact_filter.c | 568 +++ test/compact_filter_tests.c | 559 +++ 5 files changed, 7926 insertions(+) create mode 100644 include/dogecoin/cf_checkpoints.h create mode 100644 include/dogecoin/compact_filter.h create mode 100644 src/cf_checkpoints.c create mode 100644 src/compact_filter.c create mode 100644 test/compact_filter_tests.c diff --git a/include/dogecoin/cf_checkpoints.h b/include/dogecoin/cf_checkpoints.h new file mode 100644 index 000000000..476e7f46f --- /dev/null +++ b/include/dogecoin/cf_checkpoints.h @@ -0,0 +1,69 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2018 Bitcoin Core developers + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + 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 cf_checkpoints.h + * @brief BIP157 compact filter header checkpoints. + * + * Kept apart from chainparams so that several thousand lines of generated + * filter-header data do not sit in the middle of the chain parameter + * definitions, and so that adding block checkpoints and adding filter + * checkpoints touch different files. + */ + +#ifndef __LIBDOGECOIN_CF_CHECKPOINTS_H__ +#define __LIBDOGECOIN_CF_CHECKPOINTS_H__ + +#include +#include + +#include + +LIBDOGECOIN_BEGIN_DECL + +/** + * @brief BIP 157 compact filter header checkpoint. + * + * Filter header checkpoints at every CFCHECKPT_INTERVAL (1000) blocks. + */ +typedef struct dogecoin_cf_checkpoint_ { + uint32_t height; /**< Block height (multiple of CFCHECKPT_INTERVAL) */ + const char* filter_header; /**< Filter header hash as 64-char hex string */ +} dogecoin_cf_checkpoint; + +/* BIP157 compact filter header checkpoints per network. */ +extern const dogecoin_cf_checkpoint dogecoin_mainnet_cf_checkpoint_array[]; +extern const size_t dogecoin_mainnet_cf_checkpoint_count; +extern const dogecoin_cf_checkpoint dogecoin_testnet_cf_checkpoint_array[]; +extern const size_t dogecoin_testnet_cf_checkpoint_count; +extern const dogecoin_cf_checkpoint dogecoin_regtest_cf_checkpoint_array[]; +extern const size_t dogecoin_regtest_cf_checkpoint_count; + +LIBDOGECOIN_END_DECL + +#endif /* __LIBDOGECOIN_CF_CHECKPOINTS_H__ */ diff --git a/include/dogecoin/compact_filter.h b/include/dogecoin/compact_filter.h new file mode 100644 index 000000000..ac5bf758f --- /dev/null +++ b/include/dogecoin/compact_filter.h @@ -0,0 +1,437 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2018 Bitcoin Core developers + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + 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 compact_filter.h + * @brief BIP 157 Client Side Block Filtering protocol implementation. + * + * Implements the P2P protocol messages for fetching compact block filters + * (BIP 158) from full nodes, as specified in BIP 157. This enables light + * clients to download and query compact filters to efficiently determine + * which blocks contain transactions relevant to their wallet. + * + * Protocol message types: + * - getcfilters: Request a range of compact filters + * - cfilter: A single compact filter response + * - getcfheaders: Request filter headers for a range of blocks + * - cfheaders: Filter headers response + * - getcfcheckpt: Request evenly-spaced filter header checkpoints + * - cfcheckpt: Filter header checkpoints response + * + * References: + * - BIP 157: https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki + * - BIP 158: https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki + */ + +#ifndef __LIBDOGECOIN_COMPACT_FILTER_H__ +#define __LIBDOGECOIN_COMPACT_FILTER_H__ + +#include +#include +#include +#include +#include +#include +#include +#include + +LIBDOGECOIN_BEGIN_DECL + +/* ================================================================ */ +/* BIP 157 Constants */ +/* ================================================================ */ + +/** Maximum number of filters that can be requested at once */ +#define MAX_GETCFILTERS_SIZE 1000 + +/** Maximum number of filter headers that can be requested at once */ +#define MAX_GETCFHEADERS_SIZE 2000 + +/** Checkpoint interval for cfcheckpt messages (every 1000 blocks) */ +#define CFCHECKPT_INTERVAL 1000 + +/** Interval at which filter header checkpoints are exported during full sync. + * Matches CFCHECKPT_INTERVAL so every BIP 157 checkpoint boundary is logged. */ +#define CF_EXPORT_INTERVAL CFCHECKPT_INTERVAL + +/* ================================================================ */ +/* BIP 157 Message Structures */ +/* ================================================================ */ + +/** + * @brief getcfilters request message (BIP 157). + * + * Requests compact filters for blocks in the range + * [start_height, stop_hash]. + */ +typedef struct dogecoin_getcfilters_msg_ { + uint8_t filter_type; /**< Filter type (0x00 for basic) */ + uint32_t start_height; /**< Start block height */ + uint256_t stop_hash; /**< Block hash of the last desired filter */ +} dogecoin_getcfilters_msg; + +/** + * @brief cfilter response message (BIP 157). + * + * Contains a single compact filter for one block. + */ +typedef struct dogecoin_cfilter_msg_ { + uint8_t filter_type; /**< Filter type (0x00 for basic) */ + uint256_t block_hash; /**< Block hash this filter covers */ + cstring *filter_data; /**< Raw encoded filter bytes (N || filter) */ +} dogecoin_cfilter_msg; + +/** + * @brief getcfheaders request message (BIP 157). + * + * Requests compact filter headers for blocks in the range + * [start_height, stop_hash]. + */ +typedef struct dogecoin_getcfheaders_msg_ { + uint8_t filter_type; /**< Filter type (0x00 for basic) */ + uint32_t start_height; /**< Start block height */ + uint256_t stop_hash; /**< Block hash of the last desired header */ +} dogecoin_getcfheaders_msg; + +/** + * @brief cfheaders response message (BIP 157). + * + * Contains filter headers for a range of blocks. + */ +typedef struct dogecoin_cfheaders_msg_ { + uint8_t filter_type; /**< Filter type */ + uint256_t stop_hash; /**< Block hash of the last header in the range */ + uint256_t prev_filter_header; /**< The filter header preceding the first in the range */ + vector_t *filter_hashes; /**< Vector of uint256_t* filter hashes */ +} dogecoin_cfheaders_msg; + +/** + * @brief getcfcheckpt request message (BIP 157). + * + * Requests evenly-spaced filter header checkpoints. + */ +typedef struct dogecoin_getcfcheckpt_msg_ { + uint8_t filter_type; /**< Filter type */ + uint256_t stop_hash; /**< Block hash of the last desired checkpoint */ +} dogecoin_getcfcheckpt_msg; + +/** + * @brief cfcheckpt response message (BIP 157). + * + * Contains filter header checkpoints at every CFCHECKPT_INTERVAL blocks. + */ +typedef struct dogecoin_cfcheckpt_msg_ { + uint8_t filter_type; /**< Filter type */ + uint256_t stop_hash; /**< Block hash of the last checkpoint */ + vector_t *filter_headers; /**< Vector of uint256_t* checkpoint filter headers */ +} dogecoin_cfcheckpt_msg; + +/* ================================================================ */ +/* Parallel cfilter download support structures */ +/* ================================================================ */ + +/** One buffered cfilter record held before in-order disk flush. */ +typedef struct cf_par_record_ { + uint256_t block_hash; + cstring *filter_data; /**< NULL = slot not yet received */ +} cf_par_record; + +/** In-flight getcfilters batch for one parallel worker node. */ +typedef struct cf_par_buf_ { + int node_id; /**< dogecoin_node.nodeid owning this slot; -1 = free */ + uint32_t batch_start; + uint32_t batch_end; + cf_par_record *records; /**< array[batch_end - batch_start + 1] */ + uint32_t received; /**< number of records received so far */ + dogecoin_bool complete; /**< true when received == batch size */ + int64_t assign_time; /**< unix time when this slot was last assigned */ +} cf_par_buf; + +/* ================================================================ */ +/* BIP 157 Per-Peer Compact Filter State */ +/* ================================================================ */ + +/** + * @brief Compact filter sync state for an SPV client. + * + * Tracks the progress of fetching and validating compact filters + * from peers, including checkpoints and headers-first validation. + */ +typedef struct dogecoin_compact_filter_state_ { + dogecoin_bool enabled; /**< Whether compact filter sync is active */ + uint8_t filter_type; /**< Filter type being synced */ + uint32_t cfheaders_tip_height; /**< Height of last verified cfheader */ + uint256_t cfheaders_tip_hash; /**< Filter header at cfheaders_tip_height */ + vector_t *filter_headers; /**< Vector of verified filter headers (uint256_t*) */ + vector_t *checkpoints; /**< Vector of checkpoint filter headers (uint256_t*) */ + uint32_t cfheaders_base_height; /**< Block height of filter_headers[0]; usually 1 or chainbottom_height */ + uint32_t filters_tip_height; /**< Height of last received filter */ + uint32_t cfilter_batch_end; /**< Last height expected in current getcfilters batch (re-request when filters_tip_height reaches this) */ + uint32_t pending_start_height; /**< Start of current outstanding request */ + uint256_t pending_stop_hash; /**< Stop hash of current outstanding request */ + dogecoin_bool awaiting_response; /**< Whether a request is outstanding */ + uint64_t last_request_time; /**< Timestamp of last cfilter request (for timeout) */ + uint256_t genesis_filter_header; /**< Filter header for genesis block (height 0); set from cfheaders.prev_filter_header on first batch */ + vector_t *watched_scripts; /**< ScriptPubKeys to match against filters (cstring*) */ + vector_t *matched_block_hashes; /**< Block hashes where filter matched (uint256_t*) */ + vector_t *matched_block_heights; /**< Heights corresponding to matched_block_hashes (uint32_t*) */ + uint32_t matched_blocks_fetched; /**< Number of matched blocks already received */ + dogecoin_bool cf_block_fetch_active; /**< True while fetching full blocks for BIP157 matches */ + + /* Parallel cfilter download (par_num_workers > 1 activates parallel mode). */ + uint8_t par_num_workers; /**< 0/1 = sequential; >1 = parallel worker count */ + uint32_t par_next_height; /**< Next height not yet assigned to any worker */ + uint32_t par_flush_height; /**< Next height that must be flushed to disk next */ + cf_par_buf *par_bufs; /**< Worker buffer array [par_num_workers], NULL in sequential mode */ + + /* Parallel cfheaders download (cfh_par_n > 0 activates parallel mode). + * Each worker downloads a disjoint height range; validation uses cfcheckpt + * anchors so workers are independent. When all complete, filter_headers + * is populated from cfh_par_data and the normal cfilter scan begins. */ + uint8_t cfh_par_n; /**< Number of parallel cfheader workers (0 = sequential) */ + uint8_t cfh_par_done; /**< Count of completed workers */ + uint8_t *cfh_par_data; /**< Flat 32*N_total byte array of filter headers */ + uint32_t cfh_par_base; /**< Height of first entry in cfh_par_data */ + uint32_t cfh_par_total; /**< Total number of filter headers in cfh_par_data */ + struct cfh_par_chunk_ *cfh_par_chunks; /**< Per-worker state [cfh_par_n] */ + + /* Flat filter-header array owned after parallel cfheader download completes. + * When non-NULL, cfilter validation uses this instead of the filter_headers vector. */ + uint8_t *filter_headers_flat; /**< 32*N contiguous filter headers */ + uint32_t filter_headers_flat_base; /**< Height of index 0 in filter_headers_flat */ + uint32_t filter_headers_flat_len; /**< Number of entries in filter_headers_flat */ + dogecoin_bool rescan_done; /**< True after a full cached-filter rescan; suppresses duplicate rescan in cfh_par_finish */ + uint32_t cf_scan_start_height; /**< Actual height cfilter scan began (chainbottom or 1); used for accurate progress logging */ +} dogecoin_compact_filter_state; + +/** Per-worker state for parallel cfheaders download. */ +typedef struct cfh_par_chunk_ { + int node_id; /**< dogecoin_node.nodeid; -1 = unassigned; -2 = no work */ + uint32_t start; /**< first height this worker handles */ + uint32_t end; /**< last height this worker handles */ + uint32_t req_next; /**< next height to request in a GETCFHEADERS batch */ + uint8_t prev_fh[32];/**< filter header immediately before start (cfcheckpt anchor) */ + uint32_t n_received; /**< filter headers received so far for this chunk */ + dogecoin_bool complete; +} cfh_par_chunk; + +/* ================================================================ */ +/* Message Serialization */ +/* ================================================================ */ + +/** + * @brief Serialize a getcfilters message. + * @param msg The message to serialize. + * @param out Output cstring (payload only, no P2P header). + */ +LIBDOGECOIN_API void dogecoin_p2p_msg_getcfilters_ser(const dogecoin_getcfilters_msg *msg, cstring *out); + +/** + * @brief Serialize a getcfheaders message. + * @param msg The message to serialize. + * @param out Output cstring (payload only). + */ +LIBDOGECOIN_API void dogecoin_p2p_msg_getcfheaders_ser(const dogecoin_getcfheaders_msg *msg, cstring *out); + +/** + * @brief Serialize a getcfcheckpt message. + * @param msg The message to serialize. + * @param out Output cstring (payload only). + */ +LIBDOGECOIN_API void dogecoin_p2p_msg_getcfcheckpt_ser(const dogecoin_getcfcheckpt_msg *msg, cstring *out); + +/* ================================================================ */ +/* Message Deserialization */ +/* ================================================================ */ + +/** + * @brief Deserialize a cfilter response message. + * @param msg The message to populate (filter_data will be allocated). + * @param buf Input buffer. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_p2p_msg_cfilter_deser(dogecoin_cfilter_msg *msg, struct const_buffer *buf); + +/** + * @brief Deserialize a cfheaders response message. + * @param msg The message to populate (filter_hashes will be allocated). + * @param buf Input buffer. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_p2p_msg_cfheaders_deser(dogecoin_cfheaders_msg *msg, struct const_buffer *buf); + +/** + * @brief Deserialize a cfcheckpt response message. + * @param msg The message to populate (filter_headers will be allocated). + * @param buf Input buffer. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_p2p_msg_cfcheckpt_deser(dogecoin_cfcheckpt_msg *msg, struct const_buffer *buf); + +/* ================================================================ */ +/* Message Lifecycle */ +/* ================================================================ */ + +/** + * @brief Initialize a cfilter message. + * @param msg The message to initialize. + */ +LIBDOGECOIN_API void dogecoin_cfilter_msg_init(dogecoin_cfilter_msg *msg); + +/** + * @brief Free a cfilter message's internal allocations. + * @param msg The message to free. + */ +LIBDOGECOIN_API void dogecoin_cfilter_msg_free(dogecoin_cfilter_msg *msg); + +/** + * @brief Initialize a cfheaders message. + * @param msg The message to initialize. + */ +LIBDOGECOIN_API void dogecoin_cfheaders_msg_init(dogecoin_cfheaders_msg *msg); + +/** + * @brief Free a cfheaders message's internal allocations. + * @param msg The message to free. + */ +LIBDOGECOIN_API void dogecoin_cfheaders_msg_free(dogecoin_cfheaders_msg *msg); + +/** + * @brief Initialize a cfcheckpt message. + * @param msg The message to initialize. + */ +LIBDOGECOIN_API void dogecoin_cfcheckpt_msg_init(dogecoin_cfcheckpt_msg *msg); + +/** + * @brief Free a cfcheckpt message's internal allocations. + * @param msg The message to free. + */ +LIBDOGECOIN_API void dogecoin_cfcheckpt_msg_free(dogecoin_cfcheckpt_msg *msg); + +/* ================================================================ */ +/* Compact Filter State Management */ +/* ================================================================ */ + +/** + * @brief Create a new compact filter state. + * @return Pointer to a new state, or NULL on failure. + */ +LIBDOGECOIN_API dogecoin_compact_filter_state* dogecoin_compact_filter_state_new(void); + +/** + * @brief Free a compact filter state and all associated memory. + * @param state The state to free. + */ +LIBDOGECOIN_API void dogecoin_compact_filter_state_free(dogecoin_compact_filter_state *state); + +/** + * @brief Reset the compact filter state for a fresh sync. + * @param state The state to reset. + */ +LIBDOGECOIN_API void dogecoin_compact_filter_state_reset(dogecoin_compact_filter_state *state); + +/* ================================================================ */ +/* Compact Filter Sync Helpers */ +/* ================================================================ */ + +/** + * @brief Validate a cfilter against a previously verified filter header. + * + * Computes the filter hash from the received filter data, chains it + * with the previous filter header, and compares against the expected + * filter header. + * + * @param filter_data The raw encoded filter data. + * @param prev_filter_header The filter header of the previous block. + * @param expected_filter_header The expected filter header for this block. + * @return true if the filter is valid. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_compact_filter_validate(const cstring *filter_data, const uint256_t prev_filter_header, const uint256_t expected_filter_header); + +/** + * @brief Compute a filter header from filter data and previous header. + * + * filter_header = dbl_sha256(filter_hash || prev_filter_header) + * where filter_hash = dbl_sha256(filter_data) + * + * @param filter_data The raw encoded filter data. + * @param prev_filter_header The previous filter header. + * @param header_out Output 32-byte filter header. + */ +LIBDOGECOIN_API void dogecoin_compact_filter_compute_header(const cstring *filter_data, const uint256_t prev_filter_header, uint256_t header_out); + +/* ================================================================ */ +/* BIP 157 Hardcoded Checkpoint Helpers */ +/* ================================================================ */ + +/** + * @brief Look up hardcoded cf checkpoints for a given chain. + * + * Returns the per-network array of known-good BIP 158 filter header + * checkpoints, used to validate peer-provided data and to bootstrap + * BIP 157 sync without a getcfcheckpt peer exchange. + * + * @param chain The chain params to look up. + * @param count_out Output: number of checkpoints in the returned array. + * @return Pointer to the checkpoint array, or NULL if none available. + */ +LIBDOGECOIN_API const dogecoin_cf_checkpoint* dogecoin_cf_get_checkpoints( + const dogecoin_chainparams *chain, size_t *count_out); + +/** + * @brief Validate peer-provided cfcheckpt data against hardcoded checkpoints. + * + * Compares checkpoints from a peer's cfcheckpt response with the + * hardcoded checkpoint array for the given chain. Returns true if + * all overlapping checkpoints match, or if no hardcoded checkpoints + * are available (no validation possible). + * + * @param chain The chain params. + * @param peer_checkpoints Vector of uint256_t* filter headers from peer. + * @return true if valid (or if no hardcoded data to compare against). + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cf_validate_checkpoints( + const dogecoin_chainparams *chain, const vector_t *peer_checkpoints); + +/** + * @brief Load hardcoded cf checkpoints into a compact filter state. + * + * Copies hardcoded checkpoint filter headers into the state's + * checkpoints vector, enabling cfheaders validation without + * a peer cfcheckpt exchange. + * + * @param state The compact filter state to populate. + * @param chain The chain params. + * @return Number of checkpoints loaded, or 0 if none available. + */ +LIBDOGECOIN_API size_t dogecoin_cf_load_hardcoded_checkpoints( + dogecoin_compact_filter_state *state, const dogecoin_chainparams *chain); + +LIBDOGECOIN_END_DECL + +#endif /* __LIBDOGECOIN_COMPACT_FILTER_H__ */ diff --git a/src/cf_checkpoints.c b/src/cf_checkpoints.c new file mode 100644 index 000000000..638dd3e0e --- /dev/null +++ b/src/cf_checkpoints.c @@ -0,0 +1,6293 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2018 Bitcoin Core developers + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + 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 cf_checkpoints.c + * @brief BIP157 compact filter header checkpoint data. + * + * One filter header per CFCHECKPT_INTERVAL (1000) blocks, used to validate a + * peer's cfcheckpt response before any filter headers are trusted. + */ + +#include + +const dogecoin_cf_checkpoint dogecoin_mainnet_cf_checkpoint_array[] = { + { 1000, "03cba6fcccc24f375efc327558d84f79c4be0aad567a11f6e251f2d647ee76c7" }, + { 2000, "a9abdca4c6f4acc3715a8c36a0429fdbec8e338059c0588ebb5e3faabab95fc7" }, + { 3000, "a019c429c39dc45913e23bef748c0b833da4262de59ab2cc1efcdc6cec6a0d20" }, + { 4000, "acc366d51d9c422bc020d8f21e19d8c57cb207b5fc8af082ddfee5d6780603d2" }, + { 5000, "305c523f4287fff9cdb266171abfca9ae2e9f1311b417255d63464d5985482e7" }, + { 6000, "d686fb009c5df70ebd2c1d789e2243a1ef16fec6aa981d10f43c7aba84e639d9" }, + { 7000, "93586f1ec916329416c26abae5129087c7a310bce39e9b6984f21eb3bd584118" }, + { 8000, "1af0e9121ead9e34fc484014dca7fe2143b29482ebc1b28a043daa265990a9ba" }, + { 9000, "9a9b396b5b4a43354ccfa87ac188d16a26fdfc6690544ad1b9a6aecf077228e2" }, + { 10000, "888a34959356ba713a435b3c196a74ed057b2101d7ebf5093164375f5c377773" }, + { 11000, "d162935ec49dffb60733dd5bed3337c2b8ca94fdb13730a5056aa264e3855d1a" }, + { 12000, "0b76ceafab9b8df1f6756ae3118de7720b8fc5aa91c3cd7f6b06d0fa972b71d5" }, + { 13000, "c736c6ee7b16fd7b16f21898216ece99b6f0cd07452fba9a06169031feb8b84f" }, + { 14000, "34fbd49d219ca87aef0a6cd5de611b59661500c9b9b20ecb314b5e98da3888cf" }, + { 15000, "08cf19e74be510a4da996bc01cc3ff6846b7be7a125af73c15571757dedb5ceb" }, + { 16000, "ed1b029f13cd667ef1019cf92b99c1b55c2c19fb659e2dc4760b78a3098b832f" }, + { 17000, "d5449b02e52c2a9f701899d56ce3903d927b937dfb5c4a366d943bec325517f2" }, + { 18000, "130d09e9243fc3ca9e6b5a9520bd2853c3e17dc97a305f2700287b87d3cdbb1d" }, + { 19000, "8b16f9b4ad48078d059c9588160644f9afc724f10a67fd5969316ec8242e8107" }, + { 20000, "72c0ec389608f5f4b7a9089f28f0d94a782c7e2347785d2601bd6ccdc1ddb704" }, + { 21000, "fb1458cc611fa008a2ad08007cc9034a2e3f0e97c57e77c690440625450f1244" }, + { 22000, "2af00182c7b6c771b97784d7429f2839725eb68c67180c9b38ba7a1f62558cde" }, + { 23000, "ea15e2fdaa962d13467c6a1a0f15d8375881daccc908fd8edc0732d1395d1388" }, + { 24000, "8934e229a01cad3634de5a509bc72132dbf75d166583ff21c1a60e2589211cc7" }, + { 25000, "fa7b514aff644d18cc24b9502046ad48c75ad25a6bc757a761c9fe944636530b" }, + { 26000, "76e71b5a083f7e412ffb7394662e1ce6e79265de88f69873fe590017fde6065d" }, + { 27000, "063a8a7357dbbbfd2dc3aaea366be674d377e0082d5d0d2c92f691ecfbe99254" }, + { 28000, "e2df6a34cafa71a254273c0738b1fef3953a10ac2afb13fcb9773067c5f010c4" }, + { 29000, "4e3be4f4bb1f9fcb24b1f4244531825718499df833174417df54928d854bbc0f" }, + { 30000, "32247ee3ae6c8c06e16f81032daef3361b81aadcaad027dc7f5d5f389518abfa" }, + { 31000, "e4eaef8453c21465bbc96d68641b2881945feb2cdb2e6c4398d49d8a67553cb0" }, + { 32000, "312313f730d5ae288259deb8d77ddab5e2716c616645e406b88f1bf7dcfc4289" }, + { 33000, "ba0dd569c517ca823d2ed6e85e54b7a82abf4e9c25f5ef0aa940ad068802fcbd" }, + { 34000, "072438d36966ab508e43406b45dd04eb577ffedb20ad39094dbdf9b4f41c5bf7" }, + { 35000, "81016e4a8540a2551e38e72dea35eb33ab3ebfe5dbea97b1b07305c0e1bfbbd0" }, + { 36000, "3f8ef3a1d4eba6235f79e22ff35f81ec77c16e47b275dadb86c2fcfcf9cd6b16" }, + { 37000, "86c762ecc63e233aa239b8f70157ade17483179e0e1fbcefd93b24497af656f2" }, + { 38000, "51a78d5f18efc5330ec8548ec9087c96f93d0527348f1cc32696c62d7d16f0be" }, + { 39000, "a3f4a02391923c3cb36a9865b6939b9f73975a16ce83249c0da3a15aa09f9733" }, + { 40000, "4d2dcaffb4fb14769abb78be6e6cc277cbdb13e9bd76683421dc63bd764f8090" }, + { 41000, "1a6bb4d0daec7ccb7a8a21b311009c03f94bc87d17f8be28c798061be715f14c" }, + { 42000, "52feab3cd806011f6e432e480fe7b31c750ab80bdaa1707b1ad80abdb680b6ca" }, + { 43000, "ff2be3e4c52989b172a13bc9ed3e60a76dfe9918ab82e796332c7292538e1736" }, + { 44000, "78be26e8070d354e482ca95e4c7a69bce5ed9a243332d2525cbcd946fe1521ac" }, + { 45000, "b6a0515ace95dbd65c6b6a4372f4070593034cc992a0fe671c01208eb798aef4" }, + { 46000, "2c3cb4fff0b1d263a08a89c2a559ad3205a54572ed6030f0cc931d408d92ece5" }, + { 47000, "f85cee229a807ad2d9359fd2a9c4a24a1f7e936962fed5c8fb33c0612d21894f" }, + { 48000, "a27189f1be9a8d43f01079a5dec988b11cfd94efd6cbb05913c56e1507e245c7" }, + { 49000, "8c4f77afbc6b7aa35580f90e816b54be4402c8bbfc68f7ebd665780e9b5835d0" }, + { 50000, "c3641a217f872db8d468eca848583fca42a48ad9ac212e566b29e3d1af6bd8db" }, + { 51000, "a34bc5740731a29b8edb335fae08ff170f66935e16fa9ed208f0eabf99a7930b" }, + { 52000, "4eb2f95935631e64df2930be875f3c15a25575a3dc9b6c58d36319f9b5622cc0" }, + { 53000, "a61db1d5d11b7383113dcca3e521e1cbdd4eb6cf140b17de9ca1cfb74f825d0c" }, + { 54000, "bae28556f5d33275dd09ee921f946b47d5773bc090d5e0cd07ca3e66d0beb4e6" }, + { 55000, "3f673a3a07fa746ff925e7eda18a15e5c13b9452ab2e0bdada828997ce02f7aa" }, + { 56000, "2f03afff65dd1375635634a5cae26a108dd5de398cb2564f7280a9af1d9e9763" }, + { 57000, "2adf548c6c32aaf9c3fbc07ba53a9dbebc353800d8b9b0b0c61caccf589c8e84" }, + { 58000, "34696ce9da0f294a80c3c247fc78a8fa85c07470e81d66084fde2302a992061a" }, + { 59000, "cf2fc8a708161662cc77275716ea4c6effb578fbfb8cf2e484e885ef865ce553" }, + { 60000, "7bcca84d61226f5da8e7994d9f549e9c697e3ef47870e5655b969366417b5f81" }, + { 61000, "3746da0b2fc2731ad6b5b939f0eba75c9d7d4901c6da5fbdda279c4ba1ba6c64" }, + { 62000, "964c3975b738b1744dd779b0e02a9a43f2c84db893c8fe7baa850d557086dfba" }, + { 63000, "e7b59a28473bafb6c90150b13747960242530e5e8265e404ebb3efbbf1a0c349" }, + { 64000, "880585429b9fa8f44597a7413276b2b4dcbab1d1c6370ff5d7135c15727aebcf" }, + { 65000, "6ad31328c3cefaf953b7f2bd9cf11e22fae7d576acf25a1231bc2d13fa6e212a" }, + { 66000, "4bd129e544562da5edec8c356313fc5e71e59b322a1403d7b16989e69a560745" }, + { 67000, "b8e814802c8011f08b4c43cd54a8f47a09eaf860243e6ddda3e6f0adb230e229" }, + { 68000, "eb20347a822a5f864259634a0de7e412ff2ff03d3258b762c5b95e16c6a9a943" }, + { 69000, "f28938b3d8e9b1cef2f3d8f35b31e6ebac34d7480b414066ea1081a5819b06f7" }, + { 70000, "1f89c9d488ba97eed360f16d18afae8ed6434bcfd414fce1e8ab86872d76ce07" }, + { 71000, "299443e579187a0c0316d979060234ce3e2e95e51bd88d3742535513236a9400" }, + { 72000, "718d3dcf171c6ece78741b0b6a98ed3115acb9fcd3d2d0f729ade693eb16767a" }, + { 73000, "c1402662f853ebf588a2d2dbfd05b15aa224c3e7f35945e4185442e721ce1692" }, + { 74000, "ecdadf32ac0e54a66b8fbc6929b4a3ae5bad8ec8a59f86767e169d080606a9e9" }, + { 75000, "92a7df7d77402059b3c5e48250885d1ed8144e4e6040418c3d30d696c38e8b32" }, + { 76000, "0728d1f97e0c1e0d041ec3e2ec6bb3b9ab18fa8d0e886c090c1eddccbb072f27" }, + { 77000, "38dc1d4a9ca5f169ae409108b07710f9762fb16cca31c44faf07abf68c4d6703" }, + { 78000, "63aef4c34867128d303ae63cdf3c20c5b51d29867d1a48a38d50a870589b7e78" }, + { 79000, "1f779091df0cf3cb911b5a19f0587f87fb347104563c40ed2cb3b871a95c88f5" }, + { 80000, "0365afc55aac6e1a2dda2e382cd85eef200d9002af5618b8335470d8b137e898" }, + { 81000, "3d9a03d6599469d07c6d9accf7e22ca991443a64ffcf4dfb5f40d7d3aba8b972" }, + { 82000, "e2475a661f39dbb4f9f9d8f6ecf2a85620a54d87efdee4e86134e4d3a1de91d2" }, + { 83000, "1bea47c29311b8a0103bb785d7d63de4f1180d0b1fbc5828b7ae33123e55d34b" }, + { 84000, "4a680c58cd4bb1457191966923f2399f0bf3a654b6bfffd8dc23df569f5114fe" }, + { 85000, "d25c2b5b5cc70d8b1b7e08c8e67b221ed337d9ff977f25c6e3292dcba1dc0312" }, + { 86000, "304931cbfe5f0816dbd1af996c85a15768d021b2222c700f2a084e9a40d67e7f" }, + { 87000, "23455ecb3dd9453b69611391f80a2c6aef1046fde7026ef8d051a120771489ee" }, + { 88000, "560a90e1a2c597cf721f11245bac1700066bea0146682c956f36eb1bfaa84601" }, + { 89000, "e88a640a71932b67d8e9d5cd3ef685e440c6fd69762308944781bb9294acda39" }, + { 90000, "14f3831f186c1e100a35d8a205a0a637fedcfae805f63545ebf0886dca8a1893" }, + { 91000, "a20ec28849ea82182ec81104cc19e0bdf755fdd99bd139352b46e5b3deedc847" }, + { 92000, "abbb536704ac86c88365f58632d551ee5738bd831de45a6f916315ac9ff38bc8" }, + { 93000, "f5e792d5780c25cbfeaf20470db541c3395be0ebf713782f9174a259f4ad364f" }, + { 94000, "2a55b22f90170d9c5ce90fd19215b4a689330113db883d4440a5518f5512ec7f" }, + { 95000, "3be753aea124a3bd8b38a9678a6c355ab9434b655dcabe272f468b362734cb09" }, + { 96000, "f38c670deb573788f4829ecc163d6469067ce01ac622718d2fa0ab7973950459" }, + { 97000, "65600c036b4c06123427e63759105cc96393a0deedfc1fd67d6e49d2917e48d0" }, + { 98000, "7b34318ec4022ba0874c1f64d698bebd0e2a661a837ab322429a193fe34a9605" }, + { 99000, "97a1ce88a4d3cf6ac79089cdc9502d59467de2afd2d46e4ea21a7692afeb608d" }, + { 100000, "040a2689d9159fdd6343db90acc55206b051e51fcee10477729d22b42e2cdc8b" }, + { 101000, "bc47f3888982374d89f86e371bbf6d2f1385621972b311da94277eee6fee0c02" }, + { 102000, "e6a949e91ec73833388090350d062e61fca84cf48416c0e285e4dd3b486cda5a" }, + { 103000, "aff08adb6890c3ce35f6ab2a9c1d13e6a60ce422946996062cd9d2415874a30e" }, + { 104000, "b203ca08981a51ca03f834fd82de87b971a7ee6d57ddc8517b5713dfc01e392e" }, + { 105000, "a1c141a974f691dd6a11afd834a85554bc7b9d88257c2679c82018035b91af78" }, + { 106000, "c53a6a066362e3f2e32c33462bda9346862da6268459ec2237f0010eb8cf07e3" }, + { 107000, "6033fa0bff49d7b94ed76f7351dfe4eb6bfde0b5ee97e25504009e516f738a91" }, + { 108000, "f533adb4b4e1ae94df0be093f92055d6106cd4ab3e8f0ca076f66c8a3a661329" }, + { 109000, "e8db028d01fd0e190d269e530d4980b74696660409eee458684a6bde3ac7b0a5" }, + { 110000, "0da5e17b5d3233a7244a6be2b224e70c07dc66d2dae8756aeac8153fe88dcd4e" }, + { 111000, "5b5cc2c8ff0f9b7c135c3be32c14de86d62c9214c541a41be3a78b53dce008ce" }, + { 112000, "81e921abe70a2da4ed1362f480f961867669bafe252f6ecdc2dde68724814122" }, + { 113000, "a7aabf294fb83e07163f35ee2249f40f38e35d4213dea50c01f1e992233c8372" }, + { 114000, "3ba7e2261dd77ca8ad2e255aaa9c17b3e2b8fbc1ac757744f1ec838c51bb7b94" }, + { 115000, "1e959473c3c5de06a65f73d56f7e1b3bdf402552f35f034a5fbf7addddb5f3e9" }, + { 116000, "2a129efbde15b406e5bbe57105373b8e4116b856b14df400c707ab4bcc680f5d" }, + { 117000, "e2eb5d17e89329fb8db4f4d235b21630506555f0929bd428fa9d5baa183144f0" }, + { 118000, "f991fb1f2820e11f1f192f4720bf104d54f10a5e075d0ec493e254482f770d7f" }, + { 119000, "034fcde84822ebcf9ebb3e1e2753c9a480f93c55273d397af9c4ad7ec1c866d0" }, + { 120000, "6163f4ade939318dbdd623ee8c2e38263efea610a1e8960f4864b18bd1932e3e" }, + { 121000, "f078b6a589460c41369de58f9bc057194e3e51b24fd5b6b78be48a156088c7ed" }, + { 122000, "e924f948f84e6f8ed42c6dc55d41ea75b1265effaddf7a6d6962e3389fa365e9" }, + { 123000, "0f748c97cf042d1622b7776fcfc5c21ad0937a094c5741cdff6d3133af1062f2" }, + { 124000, "4d926a698f69f2b4d10a5100413f2b0d5f5ade678d7818aad77cdaaf54627393" }, + { 125000, "bcb29facf3a99ce36dcabd19e54a52b9ca5f538eccd726d400db3c3d28500001" }, + { 126000, "13050960c4c421ae65e7024a2f921af6cb2a6704ca1a9eb55a81ab8501dcf2b2" }, + { 127000, "91e994e787ca1235ad0209a1ac21b2b1f6cd36f978768acd4ef675ece72b1435" }, + { 128000, "3239ef551ea7258d9d5c0de5e49cd0dfb6c7a909c23216b2e3e7297534ffbea0" }, + { 129000, "925eb0ee6240bb3df585d46696f88604a4ee10c625271f78d4339fab7d14d131" }, + { 130000, "175f2e7e23215a600b429ed712445a4b4c90eba8e9da8dcfc19c6702af9bd451" }, + { 131000, "a7102065d9def3e7c906c84d1658125fafe8ae4bcdcb25199b23b2ccf6b54eea" }, + { 132000, "93ad76336720813772efb7247c91df59abe849cbe668b9cebd7fd2d3374b7467" }, + { 133000, "5cd540f335754b74a47a0625ff971b9509873b3f239bf787f7069ddae95939f6" }, + { 134000, "b19f78a30181ed6caf9dec9566753e82c0776c8aa968f03232408a4b4583519a" }, + { 135000, "694acdb929ac9e39e9b4f4ea35baf078c7b83aa9dad9e9364bd3ee455f70a605" }, + { 136000, "ed6ccde444b85684b056f31fcb8fd21fb273c63b542de8eb115583c708053041" }, + { 137000, "7940479e1592d6c3ce3d10e6fc66917601aa06d5c643cb67045ae7d74d4cebde" }, + { 138000, "25c90f26c62cdf4228a12b5204db33b1e63a0391159b8dab0a7b000abeaa57e2" }, + { 139000, "25b384538f29056a73eb03cd3deb3b8e6cd929412596456b5887a083bb1a0a20" }, + { 140000, "92d7dcd30e1cb3ddf97e912a08123af11a8a8cf1ccf6fe3ca46825d32624dc44" }, + { 141000, "1e27b711601d806181c7ce84e393f1e790fdf72d03e8936d1966308296d7da79" }, + { 142000, "b3f5bcdcdece5733a944c27907b28b8d02b99597f0bb9f0dae82307432a14524" }, + { 143000, "57f4592a94d648ffe6695146bc76223cedffe0eceb9f9a85a2aeccfe8384017c" }, + { 144000, "a304114397eded9c2c0d36e4e28f8c46b86a76b3b063e3c2f8727308fa608dee" }, + { 145000, "8173ef41a7993f7a808b05a5c5424458a6e842af9c0e188c78b12f09a01f87b1" }, + { 146000, "f702b604b7b0e6082afdfdd7f16439bc615f13e0c24d75e1a659d4127e2534c0" }, + { 147000, "8e7812ae464ffe87e8d67a2450f4c34335b04952851b28ab13cd63d958e76361" }, + { 148000, "c4f3343419025ea082685b99954161ad7b2ff9ae8e1dfa93ea823606d80d1414" }, + { 149000, "9d4c85870b387a5c335a562fbc95bef11a0ec5a937c6944f7536debff5445137" }, + { 150000, "5efae1425a2396d37da6864f0fcb5a0517e2be0e78a2d576f9340eaf55257d9f" }, + { 151000, "9b7805f62165b97007ae486ae7b974a07c8a41f64a49ecca085d0c659a85c9c6" }, + { 152000, "f71eeeb7618815a0063c1c3b6a87d6f0fd31bd1c3842398ab25317780a490aeb" }, + { 153000, "43db191345bc42c7bf5c3773f16335128d5dcd2bd0466e462bc397964b7ff9d2" }, + { 154000, "a26670166fb1d5eed39f59b6d3476a92c275ebd1e889f7f26c5a596f04d6a942" }, + { 155000, "06cab38f0ea41524d67eb30c9018e008656d01fd8ec61d8892efdfb88a096ed1" }, + { 156000, "d740fd16e32af478cf1017579768d759093999527397a98e8a75af4730985ab6" }, + { 157000, "f11907c39d8ed8eccb0cde3ee5a556b4e7f1d405ed8da919815f45e4d7af8cfd" }, + { 158000, "60ac3f54b57031bbe9bafd91e1aa3c82d5f4d0c26cc3bfef5bd0bd6cba1112c5" }, + { 159000, "6691c171bd2263fba50a069bf70fc4d45d852e925bfee0a6fc7f4cc8a1680e6a" }, + { 160000, "2c347da0cd83838761be9d37bf97440c6bbd046d0ee9282fcd1f7ce925f01167" }, + { 161000, "7d6d0ef905e5eef81248452aa23538377d922d0d6c92b3c9da343ab8446d4cf6" }, + { 162000, "8c79901144f6a6b6ad76dcb0a061c303365e43dcec2cfb193a95a27a31cceb41" }, + { 163000, "3d78dfcf4474ceb8a5f0555fb8848e9a4045071bbf8bd346832c8b3224dba16c" }, + { 164000, "bac97e45591d3ed93be4921335983b7d3ce4b3df5d348c7ddccff1471986964f" }, + { 165000, "b48c065c67de84eecb05d048cebe8747a997024ce66f0bf12ce41112d7813e2c" }, + { 166000, "4d56b4bf7a90e128d96f47f6fbaa7fa2e7e6c65925f2a00fffc1ee13af52489b" }, + { 167000, "ffba9038ab2d31aa463be124d804be4cb4bf8469e6b363814c3081ac3f7d45b2" }, + { 168000, "1855fdfd703d66d277b5040c1f997bb4be0943ccd2d2be9492c8b7dd270d920d" }, + { 169000, "4ed3bebfba3027d248b50b706437a903ddc5a0b8acba93d9f87293dd439e8ae3" }, + { 170000, "0077b8b86a22f41e46869edef3312d6a6dc0f6ceba0d7ddddb32880c2954d691" }, + { 171000, "1f191167fce71945939d0bbe57030e1a376403e0cacf8c284b59a9c10b721d8e" }, + { 172000, "c0dba8b11d5888dd5348ba529a6bce7cfc2608a7581f2df3d6e10583231dfe16" }, + { 173000, "42ea4ea255d96a08ce4de4b20b8c06c875d9281301c0f05e4a72e3fb21a223ce" }, + { 174000, "455024bb5bfaf149f557333749821bf9cec6652f5ad0899ceb86aad7a40b2bf8" }, + { 175000, "fecd7b386e5fa53b3f00145f9134adb5da1409c57a1987384226f1a9c4d0596b" }, + { 176000, "b27469228f4c618ed9b9810874741d66fe3a39902a9c1065b6288af3d3f16969" }, + { 177000, "18635232aa3174c4e1971b930e93ebac0493ac81e7dfe9325d728a2f21b59383" }, + { 178000, "e6db842b4273bf1ec100a3c45acbb3f4bc6406b09e2cfc93591f54a93d2d5b54" }, + { 179000, "4359b8a6d671822713bbc4d3a2361c19f6f8a842a5d4b91a36aef887dc6d490e" }, + { 180000, "919d26ee5b6cbb81a01b2f709aa2c8d7caca857533ba254cc303ec1f730435f3" }, + { 181000, "d38ed767d58461f9cbb4e676350a71265bd5d3020ee675014f42d16cfe066ac1" }, + { 182000, "9f262fc7ebd239881ac4a0ed54a465dbe700c5504fcc30444dd34fbfb2cbb2f0" }, + { 183000, "4002a379de7f81ad7a19671ecf0271991f4cee44a1e04c05aa6bcafd1f74ebe9" }, + { 184000, "3ccd7a773cf32721eca7f88a0a7d3251952b6892df328608aa59eded4d1a433f" }, + { 185000, "1e95d64180c5c0c5d73f890e5db41b7cfe1ae3d3d025a3a999cd7072674902de" }, + { 186000, "b9fcee023c29eb1c985d1786be0e83278d658f6376d8eab9a7a109a268278559" }, + { 187000, "2473ecc8f887a7ed3fceed2729833ebd922a60649cc65a03a2a441cc7790c953" }, + { 188000, "413a6e45818e05224ae38a5d5a0df1c849d7ea31b25e9e8b3f8109e8acc90715" }, + { 189000, "63a54c875243a1b3544400b66e5a1c46aba6242f3903f57162ef455d92688130" }, + { 190000, "d56ed3427b26f1a53808c74064e247bb2e05052d4ca60716a722daa89d45c8e8" }, + { 191000, "cb9c10e1fc3e1c54564f04ef3401da0409d67953be7edccc7b9cd5fc8f33d2b0" }, + { 192000, "4a8da605c098cfd8224f768ff629b4e2f943887366e97aba8cef65015bc2a465" }, + { 193000, "3d1c7cca4474e83cb375423482a36e6a70ccaf4025f41d87c5110ec28ba8b111" }, + { 194000, "e9e27e3a5a9078d769bbd282f3fb4dc9bb946d9e2c1666a0bb145dd8e3ffa412" }, + { 195000, "46e3b675f82bfc88475fd50985ef8993ee9c1ec4d0d75c133cc705038271a73a" }, + { 196000, "fa1ee6520b6236799f1e502d5612d6077389c171271db72d2afff2b44fd88a2a" }, + { 197000, "d72ae985317448c5cae476b3c94cc6aa49a894e3ee9392e26ed8471ad621411b" }, + { 198000, "c43e55096f0eebd5e2a2d6435f695f2c2d211669e12c7fc28e0bc7eb78daf813" }, + { 199000, "332469ec0c679185fd73240ea07036b8ad4591dca7066577885701197f4bfd13" }, + { 200000, "439c6d6791d5d2d681fcd94e44d3cc4bb53ebeaf12b42d3fdbe13ab9cc6c2b6c" }, + { 201000, "3a6263dc9d17b7d60f3f1688cb5ee25179c14fb7617c1060da8e20eeaf9d5b02" }, + { 202000, "c39b125ce9146b54e27766fb54f63933c2d832f6c0f8c4b319d28910d52e656c" }, + { 203000, "b841ce9abb04472783a11045f464245393cef21332214b0590fb4359665ffa77" }, + { 204000, "14aa374fc02446acea5cfebc9ab6e3f1bf2a1eba7bdaf6524b15bdccdbdcd40a" }, + { 205000, "3e0eccdb3c8e136f9202b7e1a562510149652e3dd0cd4265e8fe5a7fc6e6444f" }, + { 206000, "d2800e31dd1bbd09c61bf063534cf8f9b6286487d55b8aca04d9b385f78bb4c9" }, + { 207000, "fc63051be590e1a633dfc0eb9f1ef01b1d75e50c656a0d18a403026bf07c46f6" }, + { 208000, "8499934e0c38a15a0c2a2c232a5508e7bf0ba98dcec2d10530271b0449399e26" }, + { 209000, "fd1b59bd9b527343688ed186745c70c0ebfae0f91b3358f9eaf3e0025a667b17" }, + { 210000, "110f806f132984f11a1095bbfe81bc9359ca00b78676117957df266980ebe7c1" }, + { 211000, "375a086c58c91ccbd94ca76a18d7bbecf937b1b597e62c82a2343154a0d32e43" }, + { 212000, "2e023c2ae690c303abf804677a4478aa1f0cf801cd2936fa04de308b9671e22d" }, + { 213000, "8be2e7df973249f23f9cf79fd077af3a1aaad29dcfa315513e773e3e00cf8f72" }, + { 214000, "27ce1ad8fcb3962f27b7267b71a905987f3e8d15902a6263b1552c38acf190b4" }, + { 215000, "8e5e29635549f88286647b5e227250d0cb40208dd68162cd813f98a8bf0442a0" }, + { 216000, "712f5936713951b8b3ac5dca16b8e43c070437b0ead52dde577975ba9aae877e" }, + { 217000, "6aa515d361e4ec36ff2754f9543f96b99fe586e5060525fd35f0d47e2c748f1d" }, + { 218000, "5022cc4b8a13bc788ce103822e54140ce2a832fd699051bb6c5991a7c20206ef" }, + { 219000, "28ee253863d6ecd1794927cccaba53eb0d80c81f485255f545c23e60bcd2f7f5" }, + { 220000, "a0f5006183cd193e19fb0d71f4e6b82458094ffe65f87ba879b005f81ffdf857" }, + { 221000, "bafb93e0e21a9c91bcb8b285c30a20c7a78b0995192ce2202ccf3ee51b55fbfd" }, + { 222000, "a3b8705edf4089704391724a4a3fddfc12ba3d16da6b7491910721b26c8d3954" }, + { 223000, "a71e5125778f612472db50d9e38bd160071639cc27d9697de33ad098a92fbb2d" }, + { 224000, "5d95c7ff7bc2fc63bded0b14ca0d322f5db6f23121dc467b0ef1cbe1d9774078" }, + { 225000, "4f6a06694d8f3fafc044ebf9e7cbca35821916fcc8fbf9d74bf970423ed273db" }, + { 226000, "509aa9ad5d80ce5f0889cb83086c98fb1b899b7b97650850bfdb7a9062d9449f" }, + { 227000, "6cf1170aad8528de92d19a77afbdcfeb138148adee2acd1a9ad7cd81a8c8feb0" }, + { 228000, "edf3e6312ec81b79e3a8024d2dd41f260aa2d685fb17418c0c68dca332cc83d5" }, + { 229000, "22ccd17b4c8a8d2da72b7bd19627cdce4e5f4f7171da6d75691e81e57295bef7" }, + { 230000, "107c03dd2c6d2cfb6d2e31afb31a10792fae7f3ae2015e5ea5864bcec494a5f1" }, + { 231000, "5ca9b3dcd5a986dfaea043a3dcc7e2a01efaf2502a1df629d4762747e25c9ad0" }, + { 232000, "553dcfa0df8b55bc198e72eed7a80fa2d25f8585a026b40c4d204dedf44d73da" }, + { 233000, "5922a2df21fa41d097f0ae5a0bb5e3823b2825d915c977e98d216b301c94ae7c" }, + { 234000, "b9672be2479a8ae221984013c1d828a86fa1ae382d9ddd379cde698b311b3ef4" }, + { 235000, "affabbc6719937339bee9bf09110143a363b592f54efee46c6b764b12518510f" }, + { 236000, "53686f0d22c8cbccc3405ee2c4d413fa4a1f4323a33188b9f476c183d9fa1089" }, + { 237000, "6283e32c55e98dac176426c8bf9d5667ef903fcf7d7977906c272438dccb0232" }, + { 238000, "3620b1994fb465deea8497cd6fb5eb0dc7fc9b502c91b021b548c07c67d343ad" }, + { 239000, "19657a793ea4f4b0c344d51cae1ce5b548df311fdbe7b124368774f4e8e01320" }, + { 240000, "17fb199607abc47ca0f14de1f780d664969ba8beeab9d734a0b88a65c23ac5ca" }, + { 241000, "c06f0ca4c202703b64c54c1ab9e21eda80ae1c5e6c4d03c25a69a32a0160084c" }, + { 242000, "16ae535c22f100b580217cd64b2195b1c96a10afdc51f142b6f9fd018dd8c113" }, + { 243000, "30a9c71e3a70ff395d60cba66ce1a2d8008595dc1b2e33d6c7eb88764e7a4829" }, + { 244000, "96b2d4923a31ee5fc462f141ec0c0b81d66c97015d9664477fabfc811eea26aa" }, + { 245000, "aa29b88cedce798c9041f49b264e36b6ef671b1e527a12261708b222fd6286a8" }, + { 246000, "182cd533f5e965727f0b625c3343a3591fc2932123d69d611416052588f42784" }, + { 247000, "680cbdf62ffcc7f2b9f7acf21c2b5c6ccddaa3aeb3c84b56e0f515ee8a28dfc2" }, + { 248000, "150eea23a5d2639141b9d7f5b60d994a8418bc77fa1b3f01917f0f8845ccc402" }, + { 249000, "30e83dbf9efc03d25432b7a416d07218ea8766a079e50b6046074b165ce31a36" }, + { 250000, "fabcfad39bf49f1ead5edf583dc4f5e3dfa7fe067737a4e3e2f6e3e97eb3c4bc" }, + { 251000, "86e3c712e44fde046e00d6d74bd09d9c37a16dad9598d1e278c425d48c47e3ad" }, + { 252000, "790a4dfb595f3beab13d5fc782ad19315c4ffa31c5eaeef49f0023126996010b" }, + { 253000, "79ba158b37697263f3e0b1b8db5152ba39f175b80f542517def54279095404d6" }, + { 254000, "febb056b6a6342bd7d333d7571462076c00355be6640ff128eabe0b214863026" }, + { 255000, "c93099f5aaa306b24db3aae368556c9f12597e78d8980c75580e7318239975c1" }, + { 256000, "7565c664748f24c1eb36d9730b8aec063bb13e7b3e733e0e0e1120bf2b821ee5" }, + { 257000, "c43c60435626abb32bda40fa00a316990b532a82721fbbad0fd769d05236731e" }, + { 258000, "d5f551f8e68df012d98972fda66f784eedfc4be36fcb75441264ab5762386693" }, + { 259000, "a1d99b904e5848f09a1383d4aa96488b335fe41aa71c18bab97980578e135e8d" }, + { 260000, "a5189712b41cea11c2917a7ec0e0441808f80a2da222a3ac9165d8346656ae89" }, + { 261000, "e3817284e7c72aef89482acea9eb19b1746cb5210db1e85cbbddab3e8178c7fa" }, + { 262000, "9f3aa3fe23ffc9cfbe8d646d770ad5de95f08ab7837fff81a5d29573f27c4e84" }, + { 263000, "1b2d5a6b72c30a4ed31a0f6c0755950552bbe21b5fd7052a0b0baa5c3594fb12" }, + { 264000, "863199d29c0ec6716cd458e00c420262954b3bcfe8b2fc25c6591510d549e4e6" }, + { 265000, "9ed00b8409a2bf5acd13077b2e812d32c369777b4e2e6e53296ec8b1e685c793" }, + { 266000, "f58831ae1a8c307efae54d8d18feede73a92e534085f2b1ff245e880d75fca4e" }, + { 267000, "c61c590d21085cc782af3f8c84fe5bbed65e332195cb6a8f1ea4ff837d08ab99" }, + { 268000, "0e319986cd87633061aa026df3bcbf5ce1cdc5a234c1473bb72915c92705d834" }, + { 269000, "a46571b74c9e88260d7a9b0ac0811ea5e28c0fead64b3c19f392cfb6131c9bc8" }, + { 270000, "39233313ff22b8f700675f7ea303a1858e38822bc16b09963d11a622866c7b07" }, + { 271000, "4e0caf526cd52b162cb184060fb0ea7a0684bd849256ed6d94b9da8cfbe84209" }, + { 272000, "ce6bfd398b5e7309d01b8d6e0b9bef50f1b9c61bb85304cff00347cc055e0586" }, + { 273000, "1e02c609650b1587c18f6404e8b44914a538086272ac8ff7c048b29e2c86d35d" }, + { 274000, "41c14b048ebafb5716cd34b6efa5b864265c5b463c6c4a604bb6ca1e127109b0" }, + { 275000, "37eb0799597af3301a820d59e12674d19dbbd9007eb5dddbe0468efe7711934e" }, + { 276000, "beb4048a31c2296d4c4bb740c06c88c2de9d3b6c467528f94de9cead777f80cf" }, + { 277000, "a80833b47b22b62ac121d00aa98e5262c37e0be581f3d28f44886e270e38518f" }, + { 278000, "899ba8f31a4ee014b6648f7cbb667433e581c486479449b8ed387a57d4b4e009" }, + { 279000, "07246791218cd34c6563cd4c3d464711934b3de93601b77226131f7e2aec1f01" }, + { 280000, "daf36ca7ad52bbbe496ef9b27bd13f196002f8d4c3baaade129e459ea2a5b88e" }, + { 281000, "7d5dd13fc32406566f25393754a7ae0037d31bfebebe7e3a3176a1e4bc5e77c5" }, + { 282000, "fe60f0dd7e0ebdc6db0068fc8c7ced2a3bf10c42132e64bdd25ad95de432c9d0" }, + { 283000, "ca4faadab834c70fdb54bbd9615c2714748f7b09dc7c77c609c6633f74f2bddb" }, + { 284000, "f5bea44045fd156e1bc8429adba7cf483237465677c0ff2d94c0adadc0a1f10e" }, + { 285000, "0eec9e09b1bdf4457514b39a0952a0fb746b82f301d1f6e3868680e3398c725e" }, + { 286000, "4cf3fe9ed74eeba78e7c9e7ae38204deb68ba1dd2b3244956f9358bbc5d1eb14" }, + { 287000, "bb1ddd2d67fc261facf3b8762471990f2c0f31b07a3a892ea6085db84528f351" }, + { 288000, "cd1cc0101ecafd795e29cc4d9e13165f4f5bb1138b5ba7a89d260897847544d1" }, + { 289000, "0ec331bd532155b27ca250056246b13f6a22ce126d7462204ebadf3e846d6e36" }, + { 290000, "9ff767073288b4896f31a10a3d25bfd5d607fb3d9b4caf8aef4aee8998e4af2e" }, + { 291000, "55b1caa4d674073a20b56ab7a3a84e71da8a2021fdcc61ee412d8cb96bbdeacc" }, + { 292000, "c77ddc41e41e9dff906bb00e0516cbeff5e56abd9d4bc4d0e42fdbb8a164d058" }, + { 293000, "3c2a7d2f2d0c3946cf1583868d25383d5490181943b2e4ff987d6052f8ee894a" }, + { 294000, "7f18a11bf09e007478d990683490e1d02e130d6f158bf836e2d3c4aa13e9cd25" }, + { 295000, "506779563014ff2aeddef23e88d695c43e75b9c58c308a9b427eea2cee7955c7" }, + { 296000, "2c5e516b01c750ba14a56cb04012d80c606b8fdb237d4a0d81d1ef435f8d9143" }, + { 297000, "7f6e09d40fd60c09eab69d1019ee4d85bcb944caa8d432f0f4a4ac9a6668b463" }, + { 298000, "513870ceba567cebb4dea23c654c4775cb45427890edef5856cea099d2abad57" }, + { 299000, "58abf3ef8f94c31a6f49eefdf19f9314f81ef3552889964daa484bd006276dfc" }, + { 300000, "b40e0d8b0e250b94b7e6b78b4087ad8f968cb582e231fe6de932530692b1173c" }, + { 301000, "a23b0d3d3df979e498a98d6e3b7eb90d9d3a4e191ca4b68068064c865d4a9016" }, + { 302000, "fc484a92aebe3b9a91b387a77d37857917b1236bbee93521890253a9df9bc748" }, + { 303000, "2dc579c648b3e673f0e8e67de0bc29997b8fc068f6b54b5ed8959106507e2962" }, + { 304000, "f0870051c209725191001ad529a7d7a41bb01d43220d9e714f8674ec995aa2f9" }, + { 305000, "21d4a803223d8eb76583f8a218d605aa522eb7ba0d965b335000cb1b7e31f4ab" }, + { 306000, "7ff551f87ba33ea8e7b8006a1937cefc0d117fcfc2e932aaa5fe609aacd42b17" }, + { 307000, "f9ac2480aabf28658efee04c878d80c35ae39614270ddefd6d18a2698bc9c7b7" }, + { 308000, "54b02349fb21fa4409c5415badd7915b3c95337c7b31326f1dfbf8d989c51181" }, + { 309000, "5f8727b3ee9220fd5ea212c903de195b4be4e103fb52a32c5b6d762ceb2e8241" }, + { 310000, "8e08e60855278036df4dce259955d60660257591f49dfd93cfacfa9dcd712768" }, + { 311000, "ab8af33a433b9248c6b25ef86f9f684ac85066a53e6d38fc822710a163c192f4" }, + { 312000, "fe47285c724be468d2e5ea97d17614ab1130a218cbe2bea5d757143c56046afe" }, + { 313000, "25d1a243aa30cd8383516442984a0cb1b98677b2eeae630712c009e5baa4f709" }, + { 314000, "83abb633f86c7ddbabde3ecaa49a6ac4fbef9513d1ad4c18270c1125b2bae01c" }, + { 315000, "8bc37c103e7a73a08bff230c1ad664290d2421ddd008cdca24ec798bfc40219a" }, + { 316000, "7b2725bea2d623926d61f37231c5b8ee2e9c7cf82b99c5b9e57696e21a7010aa" }, + { 317000, "bef31692d637578efedca33ac2a6d0f11b4384e4752dfbd318666c15b868efb1" }, + { 318000, "431febbbb638bbeea51987ab7ec7a7827deb4145a6aaee76a2b3a9ba642be830" }, + { 319000, "8545e9ac6fca25bccc50848341d37eab0e53625b3de48ea85be468d0efe944c5" }, + { 320000, "3bc76dcbfd3c84e214086795185b1b7298328cf653be8d7c98169bdd8429f8c2" }, + { 321000, "b0bfd04d6c3f1192c61bdef693b1878a4d87ccfeaf07af57972dd59bfa62c208" }, + { 322000, "b3a0895a78af35f48456750837556093aae8c7480df0a42782fc14f129ae6b60" }, + { 323000, "47a5b6453b64bb947d6c4a2eae9528ca9c71f076f7c37028ac34366d47f6b4d4" }, + { 324000, "35a12cfc5776654726fd2a55dcd96e8fc613a6bde1bc73984e90e7f744dd7e3d" }, + { 325000, "e8bf0ffea3a93aaa2b3511f71ba880c555547b7f39776cb7938997acb97236a1" }, + { 326000, "04cb08e460c6c6b5c4afee18c3e801e845f286c564c8042433421aaf9173e5ae" }, + { 327000, "c40741b304c60d7c92d0fbfe9879a41630baf9f219927046bf8d496e14b90132" }, + { 328000, "a585275a9e4ececed09a515991decd5f1e37bc3f556671c4c672898163f89c96" }, + { 329000, "7259a371825378bb5e12e3752e1bf43ae5a5b9099e2a36152251525c5d3eeba0" }, + { 330000, "7a251c2c4b23191653ab6e416a1a37f2862850670315ddc016612261dbe95732" }, + { 331000, "489f825bcd73faf6f1ade6192fc109af620edb5f7eb8c0f3fad52af5a843e666" }, + { 332000, "02405c1b907b2087785eb2f618396b5d5ed45b252df788edbdace0836e359655" }, + { 333000, "6c20620dd3cd037bf1b9e8102410ffefefb8669399156b1c5e1311b80edd63ac" }, + { 334000, "32ec350c05f8c8bd04e1dc9be3a202449b3bb402f3f434e7bd9a750e21757e83" }, + { 335000, "0b60bce07671bc9f2cd8dd88c83d88bc5acdd238406a4937e3f3d328b9781e2d" }, + { 336000, "5b6346d4c387f1553a95c4b5d2886d231c5e7b3b10d9eec0d24e507dd7b91a47" }, + { 337000, "6f094b8dea2493594ea9de126a0ea0c12538ab8791c31e679d271f691e3e2aa7" }, + { 338000, "4657e559b7a2db58bd846c6a8029ab4d284aac988be30d148bee95a63e43380c" }, + { 339000, "45bae03d06315f45fca79c8543b261eb3779c1168e20c800ccb5ec9dd522d6dc" }, + { 340000, "10a0f83de25e3e6cb3130895af0e2a92a303f7d0bff82462359d0986e72656f5" }, + { 341000, "089bb78ea656a94ae72ffe5981efc45fca1b479ad630cdbd9192ea0b56da2b70" }, + { 342000, "4dd0b6a502ba12cff00eae0861751aa24b2f80de932ee96a7974dce68a7d16d6" }, + { 343000, "03065c26fa63d5be4c9f9a301c8434962a9fcd5a26effa72bd57e63aa6208c81" }, + { 344000, "9fafaf05e4dc0ad6f6256756b1166f31b80b8a7cba91f868b4de42ab7ac539b0" }, + { 345000, "bbad3c55d1983230c7de3f1c0aab2138b1b0071916ed451a2619df4a687daca5" }, + { 346000, "d1faabbb8bc5209d2feb601ba599d66d8fc76a308a9c0d4d61994a2e08e7f696" }, + { 347000, "0ef14b0b8c0a35b6df80afab7b6fe97e5231805b62d76987c13563ebb99de837" }, + { 348000, "506c3f8749bd935f19ae86c7463ce9d9e0aaaca0fb868527619725af5c69316a" }, + { 349000, "c3078d7e8521ae202fd0fc04bc3374dee584a9966c73756631ffec5e5ca5a8f6" }, + { 350000, "a059c5b25772c6027e69be07ecba3be5a7d31889ab458453e656287f9e8cf77d" }, + { 351000, "0b3448a4aa525a57995892488e8c6c6e675329e30aebfeab37559c13c0c72d54" }, + { 352000, "ac1442a9cf813b4356726b6c64b2a69d37ef9066b01677e46c95a344337f22c6" }, + { 353000, "ed91a4a8d6da2c15618244d084fd2c83b7ffc3ac67f91092b9e43fe16874e48c" }, + { 354000, "ce78fb169714fd9981561c61a1acb1300b7da76d50fc50fd7f522ccaf84a69be" }, + { 355000, "2e152dc3bcb3ce3bc73b8df8560b66cc651989e02bf0556df8337b670291e0ae" }, + { 356000, "4e2b650db223a7a3d4ac9c0ecd771cc610d373428bb0ab8e70df838d7187206f" }, + { 357000, "ed17e2e0db7f6e9ae66dd731c1aaf2a0a5b6336fe52a103847ea0ff7bfefefe8" }, + { 358000, "07be2034eb8094962da3f9895ba0422221cc370ddc25dbe0401669b04b6fa180" }, + { 359000, "b61c32c23e5eb102e30016c0f8f31e73693039d8fe4305b10a04838dfd167966" }, + { 360000, "b03a13b9907ba9de09485d3b91c0ad83dd8a4d4d7986e7d5344f14cbbecbe840" }, + { 361000, "75aff59e8be5654e6cb2ae202e3af4b9534c6f169cfee18612dc4aa02d42f9ab" }, + { 362000, "0f5aac2ce15ce5f347f9c967af92a993f6e69f3e4414b8fda0b83bb5cf9302a3" }, + { 363000, "85de0961ec21459327cc5729cec69540939b6b413182be88b20ec98e1eb281bb" }, + { 364000, "e13179b2b947bcff7763593a7d852d83f9f22013ea06585e0d68fe013e26c94d" }, + { 365000, "22032538bd1deac5b5d4403e897ce3bad2f303f99ab7cdd1c2978c3bbf5b2bfb" }, + { 366000, "cfde8b3f48a5ddf4caf52b42057cecb4017e1be7a38e23d9430e7fd60a6fd462" }, + { 367000, "99d37b426c0a6b4434b471e43e3f209711f77b4b71b61cc5efe6659c2c4600ab" }, + { 368000, "a8a1bd13178184e9f09e95d08efe547921821b61a6c702400cc49950819be021" }, + { 369000, "fa0ec419045f9ce0898a4b6ab569c97c1bcf7dd68cfefd2dc1ad9dc7a8dd8fdb" }, + { 370000, "26699463c6bc6108320f9b79d57d9cf332db8415df0e00d09371a6b8350fec00" }, + { 371000, "8a92df054b9dd9cdfa9bb7d8ad72d01ce0008ef747edd88474d607b35d80e9c5" }, + { 372000, "2410ad74e1e1f29487760c3a9798b112b8aebdfb2bfa4b7a6ac7f7386d5aaa93" }, + { 373000, "f29ea67e33890e75c0759e594841280c11cf5209f197349656621a18d0094fda" }, + { 374000, "97fdac1f949ff3c40bd25aff5034b8ae85caead0a9ef72ef2ac3cd5394b05177" }, + { 375000, "396396be61337c0175d5cb8b735afab9e1a48542e77434869a598f5804dc2913" }, + { 376000, "f5f63bd5a7e04fd0d14d8f75a0aa59721813a4de98ce723a2dcd3b78dfafe182" }, + { 377000, "ad58a2968b75b6a7f975098fcf9d44e8a9630c91fcb11caaea1c97a9ad7afa9b" }, + { 378000, "9d2ba756a80a3d08978f13314dcfffc57ad660745953606efecaa2cd0937f031" }, + { 379000, "49a4d31397bc78578eaeab4b97bc0ce5bbfd2283f5051e0b4da5673c800d932e" }, + { 380000, "0c2326891ccb944bb20cc4134d125f2c3d1fdf3b60a2dd6b8f5b553d625d92e5" }, + { 381000, "fc44846230235c1acd04184844e3e9f24a50f0fea025805aa4ecae6614737f11" }, + { 382000, "09bd10f7960bbb017663a9c98d625df00c50c0b007c37d15d34c2c54fd93f126" }, + { 383000, "c1c8e705e3fb703c62fbba134f057775a9e6336943f92101f5228820e2e30172" }, + { 384000, "95d1f807e1f03720aa99cbfbccd63a3933c5aa44304079a0c565e0252d5bc8d4" }, + { 385000, "06928a8bcc1cab38e1c98ec402ea371b6a6597a995510ca56473399bdd3ecb39" }, + { 386000, "62fc9a0d0f50c7842693bd4142ce5c2b734dbc5ca653be2a751efd4543eb3079" }, + { 387000, "7ef29ed2c7c5169ca08aa14073b298aeaeb44bec2f6c868221de392f8248337a" }, + { 388000, "2c955383ac1454d75558eeac2a684e97ad4406a6369a9917475709dc90399ca1" }, + { 389000, "a9cba5fa6105a7a4e3b6073bf93c1b1c1f0f83cd3d5efa9f58f0232b105cc02e" }, + { 390000, "7fcc255693bf730900165eb8621ac1f07e4580eabadd04994ea02d7aa05c0db5" }, + { 391000, "d2e898d6f11612f5e1099c753764f178cd02fc48a459d73dd0a7df88595a8be5" }, + { 392000, "350c8b02912e779146f122f7afb7ac5535ccba87967dda6b70c6c0f113b36ab3" }, + { 393000, "2bf3d90b9bda81a34059de2fda22dc414ea768555d5702495bb1353bbe153778" }, + { 394000, "fe4c1d4c485b598c086088b8adffa52f1f40140412c3c6f73eba2becccb695df" }, + { 395000, "ded7c427ef7cc3ef0fafc2aea70ddabd9df319b3e0c9402ad30369ccf475aa04" }, + { 396000, "ce62a45a49fe650d601ada6708c76dd4a02bf10b09d58d0b471496971e16b9c4" }, + { 397000, "57dd105bf8a9dc28b1d0509f2cd2b34c3b339cf9bef6f00de5afff5a5d67c401" }, + { 398000, "3eb0c8d5f5c89e3ed24dc382150498862313915e33f5d6ce2fbb177ef2d98a21" }, + { 399000, "411272a040ed8758ace1e702ce3e8e7199dc5433d29a2b9f433c62c5a94cac77" }, + { 400000, "b4ee8fd5e0167bc9e8be82fee53dcd1f4e38c1a99467f371836c9135aa11a099" }, + { 401000, "0e5096be7f4e89811ffb2d50313ffbe8b1eb6a9887d1335b232e153989de621e" }, + { 402000, "b9a2363a2ad48c59ba4cec2f7408ea6eec40c47529aa5b5982446a9d530aa0ea" }, + { 403000, "0579dba01aec4de48d7fd4200452a4f4ac61715984e2fadb921fed7ea259d20a" }, + { 404000, "d02e5010136b85933faff759f8074111ca8f7e1a88df1256044f9af376bdd99f" }, + { 405000, "5014e0c31314cfd3f5b7ed64e63d499fcad7ac30c07cd79729575e9bbbcf1727" }, + { 406000, "b01cf2e012521f492cfff34d6e191fdb17a468da73d522419205537815487417" }, + { 407000, "69ce00b4484034287e81d6dd6f43579ed29437938ecb514f6a7d51a103932831" }, + { 408000, "ac6f3fe1bb56768b7bce1bd3868d80167f89220acfe8dcfcd2f849a1d53352d2" }, + { 409000, "711031dcd323cf279ad99c5d028a596a5de08d0e16c0b1af8718441e4acf2424" }, + { 410000, "643359122ceb9a2036201c5f645db590e2f879bf025e6cde8f39902ddbf7d87f" }, + { 411000, "1bf17d9775f8b88c75c38c4cbbafa7aaf6bfeff438f1a83ab91c8cf3f2cf09e9" }, + { 412000, "69659cadc6362345788f5a3bb02912943cdc4e094d868d718e031911ac892b87" }, + { 413000, "e422c06c24491e078527356d621fe5384ac180bdb9c2a39db10b333af25fd4ff" }, + { 414000, "9a60d61529e217da620f13d8a1ac6a63854122d12a33a0b7e5e9e76d4fc537c5" }, + { 415000, "d295d31bcc4d15d636b316854e9378f1871121b18d9fd409e89109cd131a7f63" }, + { 416000, "56a08f0c22a2db7fefdf8c7d92decee132b804090c3351c6c52af0aa4f05cad3" }, + { 417000, "ec55c820b3f725e26816e346c480b3ee89d78d2bbea90efcb1f232c7c9ccae82" }, + { 418000, "d376e3869ab224a3475f80382567135a252097da6b0d9b91276060c05472a9b8" }, + { 419000, "ffd2015c538499da0a4dd1be146b62a61c4f51dd2562ca86620023271873e63e" }, + { 420000, "51238232a61317d27e925c79476f977e3988a3416b541621532b81265049f908" }, + { 421000, "0f1b0122bcd2c31b54ba752b07f19177e704885af3342cf187c22e00ec63a1ef" }, + { 422000, "02640e2d02177cfbd395cceaf0265e5837d4a310120aab2cbec5f11f0de48303" }, + { 423000, "30ce5736491bb2d47e539ced90c7fa5db324add1e065a85a22f703f7f370adfb" }, + { 424000, "2ee29d061c3ae77d00e1b3d2dd044607c8422c612d35fb82a51b2a5b8242ecfb" }, + { 425000, "d2b42b1786d2a392f5fa5fede95784cc5b12720582f77a29da2f90d612614e1b" }, + { 426000, "c8d37c2d2fe1f09521b4ff845ff6b8eb06f74deb5a8f893a11ad4f346206c11f" }, + { 427000, "d3dae621e193c03a917eb2ee27b12bdcadd047759bab9cfa666d5f5087f4d179" }, + { 428000, "7f202601baa8fbcde851d61c4f89bc287fbd9ba9f1d093d1dd79d63a2b2658c1" }, + { 429000, "184ee1a880b2d662c7922b701c303a5972ae6e1b67727813a827112bd04fcbb5" }, + { 430000, "49f26cceac17766005f2f1256c35b7794fc1ef3f40ce55dbddee9e20a250ba41" }, + { 431000, "807ee11927656424b0200e7a0e7df15d2ec6a56a3b193372df9e664ce1bb1da0" }, + { 432000, "6e977a4a438a173abaf870aa745842f313f97b7f0b5802f540a664eb8c49ab80" }, + { 433000, "c93908b4617d200ced870186fab9abb5ce5d28bc71aa71376c07ef23c031aef9" }, + { 434000, "dbf38f6dce3a42d31338be1e24823e36204db6c07ef5e9132d82da2251a9337e" }, + { 435000, "a6a7abf831ffcddc15f37c9a3a878b7c7058622548e8a36810d080f6c6cc75b1" }, + { 436000, "8aef3c12ef36c798e3fc018b238a988c30f55f7ce02b9cdcb00def894ab03ecb" }, + { 437000, "54437345d048e3b0ef50016da64b29f4881751ea98336a858596b1c043d5e2d1" }, + { 438000, "841b4a6f9117fca17adcfd2ae61fd78a333aefce92a5a02bd5ea7ee4ebba6540" }, + { 439000, "43a7b42fefa5fda2e310f279ac9b75a00248c23c8d54a6e2edc1c4a9bc0ae1f9" }, + { 440000, "0041aba5631752b487d51f49cd7e636a8652fb6af00a6b4d864d86a2cbfd9aa7" }, + { 441000, "05cc8e2be8ffafa235e7d724a6c8156f85c0b3c3055fcdb55ec310887e3056aa" }, + { 442000, "13b3bcf7635440c5d4ef79016940989fa0e60f60ac70ece215444a0d0c921a66" }, + { 443000, "87c9fd4ee71bbbbbf144ec98ff2b4cff9c45b32b959db9ca8cfaf2161d914d05" }, + { 444000, "b683b94b8d1e4c8827cdb0ba9877e85ea428d46226e7477311a1f2b97d2d4d48" }, + { 445000, "c14b1a959ea44b5b0c46ebeaca540516ce0245944c96a18fa96146f295ad0495" }, + { 446000, "af45360de7da17ac63a997b15f881d008037691d5137fd520e57390e9245c1eb" }, + { 447000, "05e665f09d49244db7fa0360643b7ed0a95f98f0e6db9bfa30a109eabdb9b22c" }, + { 448000, "018e88e1d328ac33453e9f5fe0684f7210839e9fbc97a836fa3d98eb6dbbb207" }, + { 449000, "a677095b82df566a4ccf6dc68ca128f2b34a1343151ad1b9cbdf916756cf6a8d" }, + { 450000, "f0e8bdaf3d1ca92fb29f8d74de49529958a8eb125aaa461147b71c492d436d4e" }, + { 451000, "3db931a9d17434af65469155e3f602d7c6383ad51b2dddb766a9cc7981fc28b3" }, + { 452000, "162f168b8a118daa81ff64c4f452089b3197a4526ff45eba1e2855924e1508d4" }, + { 453000, "cc8b9557b786fc906fca4c51cb6f132f22eacffd745065da460393b2bf5886f7" }, + { 454000, "65755915fdd2657428faa891af14f88443555c5c24ab455b2850f7a8bee81b78" }, + { 455000, "1b71d6fe18a23ee5399428b5ea3f9a79954944c1a07d9e32e876399c1120503e" }, + { 456000, "9dcf389db3dfd96e6db4ffff3c5ebf0422a745ec740a035c919a12a915bb030c" }, + { 457000, "8cdee5e7f140d0f345a75b91ef5bdc1ece194104481de96fa9e7b15c3b136579" }, + { 458000, "f27da5f3c9e6784e22844366a9f889463f56bb9dc4f4c7f6a3a393906c6c770f" }, + { 459000, "60aa5dd582d183a7a5a3f89cd94ac140de900c49c4b034a31a2758f8603a7553" }, + { 460000, "9c96567227707041bb0407b3b74a7e1eb77f8ccbd5be17d5bdacce517358120c" }, + { 461000, "68a88cb2bd38270e4d576aced6e82d226d155aa8b11af4a7450f2f61a7f3295e" }, + { 462000, "a67dd08a84f7a07ba02bd4fdfc44a19702b30bc85d3cb1421001ed52d07a24d9" }, + { 463000, "1864af8a7cf550d85fba6c4f7ade1c5e34ef79f156d7fa63562bc06c23cf90b9" }, + { 464000, "37f736552e20aa9750c3c5e4d3e2a596ccc75ea42cf80776d97c073b88d6ebe7" }, + { 465000, "5fa01fe035c6621691361a7551f8482cda1fb15c6731d8abfd10dc9f09dfd969" }, + { 466000, "00ab3987a1ee066965dc7e329f988653d71f3e4064408882186b95b47456c04f" }, + { 467000, "3d3a71c22fcc83754df5a593057a705ff3418baee2107cc66739154c68b6d1e4" }, + { 468000, "a5cd0be32e2f2706c2d7cd9d4fcabe3b4efdb64746e225e13891ffeb3051d23b" }, + { 469000, "9409185b9077cf7d46195bb8da8293ae116518a024a1120e24f730196de80ff0" }, + { 470000, "1dfa6d76af562923c108866f00caf21dbb22b1996d2efd0fc6a43a55870cffbd" }, + { 471000, "5e267dad87cf16d05964d6bfa2cfee010fbc059213a2ed7463de22222e90587c" }, + { 472000, "ec7eff27fe8899f0cd2072f6bee5ec567fcd12251cac318c82e04bed7b206d64" }, + { 473000, "94b7643e518b400def6c141a187b8eecc5a40a55648b6776dbdcc8f4a103e57b" }, + { 474000, "e23a8a2288c4a9890b077066351857c387b7957c095e534cdb73293c35aa62f6" }, + { 475000, "9891f1213d10175de20658bbf3f4372bca2f1c065a470a1cbc9f88cf6f008e8e" }, + { 476000, "8ea7ba95273f26e4ff1f39f42592570a53424c8e8453dd5374189dc6a26ff147" }, + { 477000, "e7653e43904d1054ef168ebfda8c5c9a55878b695c9dea2dcbb1ce3e4fc58c30" }, + { 478000, "fec956dde2064ccb169ec1e877e366d0e8745570e86f0ec3f9ae752e678c5cd2" }, + { 479000, "4b6d1589fc1b1caf3c755f9d621862bbd662bdd2c1c4c1cff23a99b39dc1e3fd" }, + { 480000, "e6e489c310f829615192dc67505ed224ead1a92db580b1b5dd1ee7f6dd5bffbe" }, + { 481000, "91834e52e7d83288539869bfc4dacd1e667211acac77df642569d951961dd2e3" }, + { 482000, "7701dd9e44be04bc33fba84c58efcf51cf08fbad74b9da8bc5b1b7fd1b366fcf" }, + { 483000, "73bcfc7b50e023b2bcfe5744623f3066659b634375376aee75fc915be5a05387" }, + { 484000, "9c1d093759b659a5d27e8f632b01b0ebc01ba88df356e5980e9cc7aa9758416c" }, + { 485000, "270738aa23e8009e03f99a0850430be322f4a01db220d20d8f7cc12198d55c39" }, + { 486000, "a076e3c9e81d6cc2f32410134c5a5fb2389a76fc037339def9af77e477b87f67" }, + { 487000, "4fd1846180cb4cb5c8b6b9d497de82407d249954a9880411e395e6f7e8b2a0d7" }, + { 488000, "a47e318769db079e6cc200c23cec8c05db4086087eae545672c8a64f12cc19ad" }, + { 489000, "eed8f4da84b5fc96a4b0dc0f901572746e72502acc5bb7f59a93a004811b6038" }, + { 490000, "2ddb63035fa5990d4cf4143864e70c1292b958db5c164e0dc29a00b44b6292af" }, + { 491000, "2e4090d62423017dd1be57df102f76143ad191042e960f1c9d5c991cafd41e10" }, + { 492000, "de1716704ed77befc0d297096c3aa011be5007ab1da2c60aa9514373930cb700" }, + { 493000, "89eb619c597e2d4ac82766c4399ca0616e36c77405be888c7a6ed4f4f3f3ed50" }, + { 494000, "24b699d804b62012eb4f31688af0c1dc8380e2d341ec4b754ab9002423f7e4a4" }, + { 495000, "ecbdb6177e8144522771dfd6c6008c9fa1810f030f2c6f732adb5f3f909c4374" }, + { 496000, "b3f2cfabc3b2a58cec2385e2138f66fdaaccff33005dcd62906a5435f0d082b8" }, + { 497000, "2a201aa5eed81d5bc47a43739bed0f5409ce4abef6d33bd45f31d999e2a810ab" }, + { 498000, "1b2e0d93860ea71599aca5f643302a6ccc8760bcc701dc0de17949bbcf14c463" }, + { 499000, "365345cf773d97e91934faf49532aa3c2893b44f25ccd58a22cbcb55fbbb9a77" }, + { 500000, "7233cd5a0e1e5b3baa21aeed1e7263a028e2ba8d59a45cda0c08fa5dab2dfe84" }, + { 501000, "98d8f27db64a6a8ab66bb4832911ae5c0135ea64ccd18f586c2b1ee00d867400" }, + { 502000, "6c9cee6e35a92041ed959814d10ad955bf7b3aabb020fb663adcba4b70bc9e98" }, + { 503000, "84e6d39af2477a5ec82caa87cdd5bfc03749265e46baf848e44468574e2455ab" }, + { 504000, "54e573157359f02853e1d7d8260d0a21ac76451271fcf6ff726b987314b21cb5" }, + { 505000, "8b5fa4740ca9bdeaa57bd613cbfbf39900179e0a83c44ca6f52b2e63c19b4e8c" }, + { 506000, "6352c31e43bec064d9e84414f22ded89a08d68f854abed0e8099c01958f52b4e" }, + { 507000, "be615ea7861d67703dd402cf18254f4348a23e5a243340745eacf5e1506d7438" }, + { 508000, "6d3d5af7628b36df037ec68493f712f7895b1e7975d41a676b097c2ff473a3b2" }, + { 509000, "cf7c2e6f22aa1ba1f2a4100960dfdf01588bdf2d0d96af2cb673a61f52365e2a" }, + { 510000, "bef3723234334b19e1d4ecd8852a281f2c640189465e109c08d49fe95f77c1a1" }, + { 511000, "1b1df5fd57c79e23854f3377d6d062d17d60a7c12e0db79cb7ed469c0c041437" }, + { 512000, "5cb31d76b2c200f05fa922c1a1c334f3f16a545b088741d4f274e88eb94166be" }, + { 513000, "41ee509ac69c2615f142f655a83da0993ce67166099eea00aa396ed1ba66b2f6" }, + { 514000, "a5cb29f0591c9bd163e02938162e4da2eb653fc6a1f64ab47f626b40b59ff670" }, + { 515000, "e07a34c451a9696f771016e0e80046752da29f06487d63febc334ce1b778b8e8" }, + { 516000, "44e8b49db08e8dbf90c1330e3a6dda5e103832d458bb812bcf5ed095af6acbd3" }, + { 517000, "d3cbe6e727f185a1220c430771e6b0b8ee8590800c09bdedd29eadb88ad0f257" }, + { 518000, "b924a9b6f68e00d588efe7766f27e24ccb1361ee24779fc58bf6caabbf020a39" }, + { 519000, "69e664971de9a29da0a542e7e73f2c5d3add3d741a7766f9d38c88e76550f1a5" }, + { 520000, "9717b8550db36136b4b7397c5c4e13c6b87809133dddb401a6d18c9dd3eb4c97" }, + { 521000, "8edb3cb88d4b7cc87eee95409fe1a72e90620cc3c95cfee9abad26f8f3c7ae24" }, + { 522000, "81ef5d3959d229adac9a38477cd28386f9f6d68e82e42ffae7c5a15dc531f3a2" }, + { 523000, "b0f16a357cfaad26dfd085c5b1cb3df952bd138eef98fb5df10ea0e3573c33f5" }, + { 524000, "dfb54d5b885b18d411df96bb996cadba84d8734ec6f2c57dda15717cc50e4292" }, + { 525000, "fa6ff319c5f23317a4496a3e666b178d99bd0a6ab3bece251e31938dba326b51" }, + { 526000, "09db398d3a4f3ab84c28f8e741e558ca0012cb7ba9d0d0c6c43a987f02abfc6d" }, + { 527000, "3cdfa9c8736f5c1614c048edc503da6ef6f50af869f1aa4ceab6724728e1b279" }, + { 528000, "1e27079363ee5f4be3e738b011b7012c6c317ed6ab71dd73776f967fc1d86c63" }, + { 529000, "5231d99c8c564bef13b3416f353f2293633cbd0dc4e5a124d219456738d7ef55" }, + { 530000, "09ad0b944015b91dbd9794aa23e021659d06826ddb49f4311f49364fdae43f59" }, + { 531000, "f93a81752b737dc5cf90df0eb341bbfac69834cdcde54c0184e3e4c7e5692704" }, + { 532000, "7b0c9f2b060198dc7b07faa812fa6cfb5c40a3ac41c3a164d1f21d2fff99d198" }, + { 533000, "65b37d0f81a67d67e036ece72082ce0629ce353de7223f791732cbdbe242b95e" }, + { 534000, "3443454bccbb3c8dc66c6d2f70879131a3b199cfa92736a0e0b6457951a99a0c" }, + { 535000, "d2e5af1b46b221f4ec6668c6c3b0139abb9a00698b3dbbe7f1b9f0f288a45990" }, + { 536000, "9a43c2dbcdec2eb4fa94513f5d18e428a55a33715f9df23320e8474e58bee4fd" }, + { 537000, "28c4fa71f4efa96bce2292a5e82b0ab949cbd21e5097d4b1eadd192d801db045" }, + { 538000, "d9553fa7960d98fbbc7dff0c287881703f6c2c288340f9792ff46cd344f6c8f4" }, + { 539000, "6fc14c6f6b39505bbab571253dc1ab8c0e3a486dc4d9f21b4e01d4b2420da921" }, + { 540000, "a9d67690861e93a64e013a174a453ad97cfed27a69c2e4540d47c3a327121bd3" }, + { 541000, "873d37569cbd1d0031add6f00980f8e645e240238cf51c38311745079fcff7d7" }, + { 542000, "3f53d99b40da109fe3c51e06b9211cf17ddb27a3773e29ebaec0ff54d71ad395" }, + { 543000, "e1bca110915b3267bf092bd5f68cac37af90154d57988105320cacf874fdf7e7" }, + { 544000, "e60a794e9f56ae6a1af383264eb38ed5b1c6d0020989a2b767bc5f09aa10935d" }, + { 545000, "51a3ed5f6cb6794a1a812056a30c04891f2a97695558a6edccbb5ad680a24877" }, + { 546000, "8c911273c0d3ff2e8f96f107a40c0300218e5ea1a11f5abdc18c828aa485cc87" }, + { 547000, "e1604844c831196639e462d3c6dae414149c1d7b84464a0e87cc571026110569" }, + { 548000, "020dbd5f3c489d3a46a0682d1c3229b9ad1f68080f0dba887be657bc54ebad54" }, + { 549000, "840972e7cded7df0c74f46adff5b5590a516d9199db3a396bf36f7f9b49d57e9" }, + { 550000, "c42277fbde4ec6c304588903dd21cac80f5ae35f8e692473d00c17a6cd7c2df0" }, + { 551000, "69aa1396e1862d0c7fffa71a616295d82a97b8b4349ea96d25c2759e4f5fcd89" }, + { 552000, "2c2c3fa08a0c9bffd7397b5097c879e7dc86e1c6ee32ce5721ebd679adf904a2" }, + { 553000, "78c13fde46f4cc799880acb1142682cac69f7424601d78767f4cff061f1443a0" }, + { 554000, "97ad2abf703fa349ff6b6e5219c82f46135544180fec8a8a29d09eb58ae0cf10" }, + { 555000, "5ad33aec630f76fa15eaa881bbf58d0ab2ccdb28b61b704232b1fa146a006454" }, + { 556000, "002c87ded85bd86b8970b0a993eb32bf523f0d34aa46971a44f13fd754cc0ca3" }, + { 557000, "048d04938fdada82a11cf4f918172e465c2f43ef38b90f9aa55b73b273c2abf2" }, + { 558000, "8151d967881653fd4ee2750f9d93adb744f44713a3f65dc4c0d8f7af3375b849" }, + { 559000, "1bf290285a9d4e3f83907bf63b0b7f5626568d1f4ce93e8f8983349039af57ff" }, + { 560000, "eb6b652c343620196139e905136024c9d43cb62ee1b68b551898383459657252" }, + { 561000, "55d312de0a404bcdcbc14939ea74e73c780cdd3c178ab575f97b5ebcefbf38c5" }, + { 562000, "0a46580eb10ea441828c1ab4a083d70b9c9594775c07475ffa3f519ac37bd881" }, + { 563000, "dbbfd06a70ebac6ee1b34ec37f9fe6fc3a1f954c568eee2ca2ffb080047481d1" }, + { 564000, "a01c92b71d039e04538f471c77763e749030c9719b323cc75bfd46d1907ba91e" }, + { 565000, "e5bacc2229d341f975da2db074e5930ae4622b9732928f562b08525af5acdb8b" }, + { 566000, "7e6337a6013267379938b5e1d722c07e209a754dbf8db2571f62d81cc117d299" }, + { 567000, "063f2be58da9934072150ba02ffbcc713d3da715377edffc20c8e786a1e65460" }, + { 568000, "8f61cd87e481ac1314bef78d85dbdf8fcfdea1f3f652b953c2b4060579ee71c7" }, + { 569000, "412249ab464ea69c5b2511220729ebd51008c6b733a74cc79ffeb608febef7fe" }, + { 570000, "7b7f85dc577895692edcb6c65e0f517ac0707dccf62804d44ea52eb2d84aa5da" }, + { 571000, "63ee89f69266a7ae712d3028e77ea733fd23e76cd789892109bfb581949aac75" }, + { 572000, "950c8cfc972ae6b11748f7981aa4b6721927593848d8b0165fab52e3f003d523" }, + { 573000, "6d21d51530a061f7b38c6682d1842e6eb23a4ca60cade39a272059febc8157be" }, + { 574000, "8f0b035ac51399172b98738f98804596702df2588d813998bdd602dba3557e61" }, + { 575000, "06838c8f088a48c5b4530bbe3bee7e5359715f1669a806106f227b92264a2e68" }, + { 576000, "ae24f5f220a68f961fc0e4892f48c3e7c2e530a9394874db5e50608801c31866" }, + { 577000, "2430fc850b1bf7ca3c0f61d555ebb615054ba74dda38fdd4b92c5a3013cc316e" }, + { 578000, "0cbbcc63538b0ae086219420e46afd4d633d2fb063e38297fddd2f0470464ced" }, + { 579000, "566c4e63a709d915b7bce86e5580f6f7b3bc22e3bfee50264ebec355cac854ae" }, + { 580000, "5425bf4636a65343860494fc17663b8518cf85565e2f369377da3ec220e71880" }, + { 581000, "3253ddd05178bd64f9f0600dd9af2e4557bd2c958c01663425d1c492b4ca29fb" }, + { 582000, "9bb61a0407782891821efc5d24290b3615991286767230186610a1a82b2ad51f" }, + { 583000, "09194d80facb822feca911ff69657e54c05a65e72998beefff4d7cfbf7587806" }, + { 584000, "16bc50b30bd8e76f30788dd9d1128c791c78a086ce24441121c99db9e2b9b6d3" }, + { 585000, "17722cff63c1215ce06aab129a52317ae818a44722b97cb7dd7b252276bbfad2" }, + { 586000, "b5c164cb4afd97c1c234c70fac4a59d1a5197cb66ba93fbcbe298ed76ee61c50" }, + { 587000, "0d14698d9f7817a0ba0ef6cfd3e60a093264a7610a8077ae327b8058d106324a" }, + { 588000, "afff217c9bda7c0c7758dc781cae2b9f0de5f09315f7a8dcff223f15dcec702d" }, + { 589000, "0ef8ab63aae149c1c3e4228d86d15bc90ea015a6250b8f77f1cd5ed077591e7d" }, + { 590000, "a3220bf9431270f7698b171a3d9df40fa926820fbb9c19947aab1edfab84a9e2" }, + { 591000, "8dc5d1fdbc467e31ad9e8b40d84f308f51854b77c460e0801771e34b0b3f48a7" }, + { 592000, "79356891e7a410334ca060ea61ea33fe92dcc247b4ff43cd6b87955fa2c98c63" }, + { 593000, "89a5ad8b09a09ba991d89b62ce255c9ebdf01c30e35e973bb4a58e05c731022c" }, + { 594000, "588a923273598cdcb9f6d03c143ed66ead7aa05b04ab903b5e8db190edddb775" }, + { 595000, "b0c600c726537f06e503154f17f600a5507002bf7229ce3b45164dcc10205a10" }, + { 596000, "6630ef79af8733d64ed480a17da07fb4142da8b942d3a7f20c9f1ff18183cb9b" }, + { 597000, "a47bfecb3bb1ee2218507b9b1561309a86522e668a55551dff36d8d5262a1fac" }, + { 598000, "1af111b3a88fda3070da610236af77c25ba57b32c6a4736bcb05ed4b75a3c674" }, + { 599000, "d41b7e9528ae09c15359023af0436824c7abe20974b1e3092102a0aef4b7ace8" }, + { 600000, "0a1642271fc8248131ab764adb984ccb550641552ab9673cfa79fda298ea4d6f" }, + { 601000, "eed5d265afb4a36f1ab08c326776c2ce0d5846a2573305a2789715aaa44a64ee" }, + { 602000, "5f90c1c7ccc89aaadecbfabb096195ac8b5e01ea595b7c62a0c2c5395f6098d7" }, + { 603000, "4bbd255485180b5889055740c8618ce682f086fc8deee842909a54bb6885e746" }, + { 604000, "329160c511a6e8df7e54f4ab6b67d9009b0d51acd1ba43093267993313d78d2e" }, + { 605000, "10b6efdfad6520afbd8c476fe6ba79aeb4ea1ee2e32bf94fe08c871401b53d28" }, + { 606000, "27b8d67aadd4833f5cece9312dc86707857ec669c763e3f8603ea45a98ef5bff" }, + { 607000, "5c731ba7dccea5029bec963a4d25c6a1ff7df75a86c986a45281685968bcb527" }, + { 608000, "fea3a71174aa3e99dd0fa54f80931be9a2dea8a615e33dac9fdb7966f94457cf" }, + { 609000, "da7bc32fc4602ad50e7e35eaa1648a178816c5698757455a5c536946ec008c26" }, + { 610000, "9cff177efb5e28e60bc979b8ce26d8271a5a5d2bab3851b8bdc1050a46bb5a6d" }, + { 611000, "df2bb554b9575d70d6a44f6be490f6f227f2d7b791da876f6e6bd6f10c3ffe36" }, + { 612000, "38ecc3a82087b3f36540441dd5acb65d9905b546e38d5c40c2189e2dcfc3d875" }, + { 613000, "96e15990b653731e9674da8651c947b265674e3a0d78dcc2cdaeeb96c0ceed4f" }, + { 614000, "3592b6402478e27ccd2802095b65cc11b80728d2fd7daf1a986470789a20451d" }, + { 615000, "b306cfe742aa544ed4a1db22d3d0a1b63bb19328c2e3a9b568d6cc2af2787e00" }, + { 616000, "c4218e8a07efc8e228e60869f31da01e705a1feab105df0ac49f13abede54a14" }, + { 617000, "380ef40535379e69135e5a69deea4bfc8fb46828d99ac446cc8f52eb61d623a0" }, + { 618000, "20dc8713100fad43ad6196fe7ba809af87dee2d55c4090330fce925497aa52b9" }, + { 619000, "14f4bee3886bf23cd03a90d44322c3ff2f8359cc5d849c1a1d8ee848f529b0e6" }, + { 620000, "a4f9dbe5d7a4f8e9ebd6be0b1183d7b59323351035307309cbc10406282ae793" }, + { 621000, "1ca650e6ed169fa16be333e8fa1a04151a9a41b7e51cd938db1a58890906f7f9" }, + { 622000, "b31b8a8e0280dc36dec9784bf3ad6023aa7d346d2f00272ee1b9aac9fd1f5841" }, + { 623000, "25d30fb1eb547163901ec97b82ec683729badeadd474360ed2388dc188e68cc2" }, + { 624000, "0906e6b84144068b69ec12bcf028afe576b930f6e4384260b9674c293a32f3e0" }, + { 625000, "80e98c011cb151de92ebbfacfdd929fa6b4588977c5af512bf2ca10039063f9e" }, + { 626000, "ab834d59946676276890fa6f74db56e586b991e012e87ff20477fe834627db1d" }, + { 627000, "199690d7d8a87d7ec473383b8480eefd973a28fcf4897e5954e398b2eec9019b" }, + { 628000, "3ab2c95cad967484fbb843f4b82d9148f6923bbcff41614ddf92d49dc09e27d9" }, + { 629000, "c5006702bb388a79ee8be86ab72b28ab6d14ed8697011ef82ab0530d71eaff32" }, + { 630000, "7944a1150b961e8b4aa5edb39572fff3cac583b89695d63943940bae1557c853" }, + { 631000, "83583195aacd2c5c84b70f26cf632985f55f6d011a7df45cacd15d7db3bed313" }, + { 632000, "c9c495d457e47bfcf5d0ba7b7401dbcc66f93866a8965129a21c8f08280a2107" }, + { 633000, "6f84bcc5b07c76c0c5486913a7bb7582bcb0dcc002ae94d8ae2f82870ef41ca9" }, + { 634000, "920391ac8741643951dbc84353755b9598904067f76c6f8ba408a5628091bebd" }, + { 635000, "92b79d544a2227310c274bbb63a1697858862bc33139531a89886b549ce3e4bc" }, + { 636000, "9cde13b3b0181ea71d9bd8209fdefe8afad083516a5b70555f15413f425dd080" }, + { 637000, "65a2c5467b7132c6ab3c84c36735f340ac51f8e0cc491abeb493fb3b4a1b6c8a" }, + { 638000, "349d666cfbcbe3844d6abb5a7e362d3c7fa2f2cb2ef9ff270dfcaacd9a6006ff" }, + { 639000, "3b304ac2ae4b186b6e295a63e11a1c402e8435f4f9308fa6a97bcc37173767df" }, + { 640000, "2f90bd91fdce02a0e4f6a5da3ec21c77692db83b53dd6e554b9c314a91afb639" }, + { 641000, "9e64181a447c8a877f93c742a072a9b69631bf8617eb21a7c87a0f5e5ab5fb4e" }, + { 642000, "7e8a43b816e6f5e95560ccceaa93a3e6b855949839616dc5da7a6a6768838a2d" }, + { 643000, "e2de505643c759775fb73d73e19d551bc765dd6009ce833863df95e3ad4b670a" }, + { 644000, "664c7ad59bb3e3ee8b809df70701b48f9477e891858df009dc3440762e5a14e6" }, + { 645000, "b47d648b256272af0058cc5f5e23403057205abeccbe5d5fae5931c2fce526ec" }, + { 646000, "fd2f0b154169b6c3677c452c1d2c99abeb1d5fd293fe990d8ba97dea6fa6229d" }, + { 647000, "05b7cf422e9037ce00b0f4f5783d55df3322b136d0ac650505b139977f1bd6ec" }, + { 648000, "529e7ccd2d4fab8e25c0f2a49a1bfc3452f8a6202db3be1ab60247c4fb5794f2" }, + { 649000, "40b8147b2416bcc81829fd6caa310d382c5b47bf9ef88d117eff06f0d3eac085" }, + { 650000, "4c03da728b673dd46303de4300d99506ca8a77957d2676634a24c24388a9feee" }, + { 651000, "f41e00ad734b1f02b6d3d3d1d338928ec5860aa326c7e4ad0ae6d251ac1e6859" }, + { 652000, "878b02324b277c3925ab961ceeb42062889bc44c70b65d1ef50e4c63a21ef41c" }, + { 653000, "8556ae4e2b0b87953603011f4677193306b8c4cfba448aa3ea7529a12bf9d026" }, + { 654000, "2979b89bfade316bd1ea1cb76840ec396ded0078a0d3cf9c8c7a1a6dd1c0b658" }, + { 655000, "d3becf2daf90383a9d91c2d7f2b4ae87139a6ce7a1adf5710e0651ebe0a5f5aa" }, + { 656000, "4ac612d1f14ea6867f9d3c3ade3bed68c10e4a1545b463eb87dc75fe016737a1" }, + { 657000, "3bc54a4c2e45ef248fb2e41590804ddab5e5be2cd6b20b312bc5bcabee0f89bf" }, + { 658000, "8b15516d1d1ceaad8c270851a03abff237b2dcc46f7582eb244ed3432dd9aa71" }, + { 659000, "7aa5ec87094aa6a272decbe179a2395af5eb73ebdf98602346ecafa5e2af408d" }, + { 660000, "b74f796cf02360c203732146d8310a54aeb2f474d0d101fb83d9e9c1499b4fab" }, + { 661000, "7ee6fc293e43fe25adf36ca570b360715207045771141c3a7c5c3fb347d1cdf7" }, + { 662000, "c8756ebdf5507d4eaa7a75b13e8be3f08e4dda3f332e6dfcbc8134c72b29304f" }, + { 663000, "b7716ce4051289d90749f4c1fdcbf9eec918d0ba2770a1f62818b25f85161b1b" }, + { 664000, "e1cba52ba22943244e9e88a65a7f6ec78660e0d435f7580ecb2aac0fc6ccec2a" }, + { 665000, "e2bf462700ab2e268a02b9546f33c59bda796c27fbfcbb22be0035bce92fdd4a" }, + { 666000, "6fc0416de1040108b8c93f97a194c92627f40acca208294ec7b8269bc76db0f7" }, + { 667000, "4828e206e6e670ca8fce12f6b11ed8580615959280b315652a2429e30ddc227e" }, + { 668000, "a957bb3e6d1dc132f08ef62e24df323c847b2e38b2581802eb7a9d8cc317c1f3" }, + { 669000, "18fb96011c45273814e920b6dea03a38a427915e28866cb02b6210fdc4417c51" }, + { 670000, "719b444c9a4e036682dec102b26cdd28dec2e9f059c9f9fabe69a4cebb23c950" }, + { 671000, "b82051b43bc9e0259a23308a06ebf7c8f27606b5bc21708cb366b7dbf82dd777" }, + { 672000, "b4838dc3a18df5cc8d8e6ef52fe9ac534d43976e1a8862e738ef73e91aaf8553" }, + { 673000, "f7d3e88e080437f00a85cac6e74975b67db127315b59bc84880830a978a13e62" }, + { 674000, "ef8305db77ec295476e94575b776a380257682e4d9f1c0082927ed8bfcdc7cf1" }, + { 675000, "e8950f230c28687b78db9275ad6eaa9fd4e641c030fa8407714b71d774fc5537" }, + { 676000, "862ae90979a84280862756acbc56b1c20e44abbd9e6135a6e1e83e83ad4bc3e7" }, + { 677000, "038e8cd8ac4a812cff16f7dcba23dd2290b79878a2a23f03eba4e58074ea3c7a" }, + { 678000, "ccbc71933f5590c5d6ea5210e8d6047eb65cffa25fd70541ae01e2729267a377" }, + { 679000, "f4ab95939abbba68e225b6ba34ea0a66f592d41d88904e9518ec9a1f61110642" }, + { 680000, "2ff9ddf5f6b673223a2a2075107cb17fd5a280c3c604919e3a53f632a9e34799" }, + { 681000, "4c7f297182b1c586c678ef5096d721b85dfb6a5c6bcdf56ad855b91f9c1cec62" }, + { 682000, "937e8933574c611f343b1cd83ca52e9df6c5e17d86198dc1dd0e07478892f1dd" }, + { 683000, "cd779ce179c3a51cf966390416feaa6559d869e3abde31aae2bb87065615080b" }, + { 684000, "3bf7bed9d003df2d6ffb67c15536bc20bee2929cc6bcdec8658718961d4842a0" }, + { 685000, "07d5a7a9713ae98621f79117d68d7692db2d9abcb58ce4b61b85f459a412eacb" }, + { 686000, "46aa553a1063f6bfc8932d68ace9ebe2a9f225f448d2d24b45f5e3544907c49e" }, + { 687000, "64b60e6064a4e37223243e4b4bc50c2e55ace7b2a09408d11e648bb7cb81e689" }, + { 688000, "5c17402b63f7b4dfa6bcec34cad7bb43c8bc6f2bfc3cae660ca6d585e05535a4" }, + { 689000, "bae085d9362996d88245f1962b20dfd94f39efafae913d42a423bd71826add2b" }, + { 690000, "222b9acbf2019361a636fc95ca35938cf24ade3a8f519406274ac10d172dad9f" }, + { 691000, "1438e77cc70f3bb45f2baa1d585f4880b9e30c9fe5521e3d1772e258a9547725" }, + { 692000, "0608382f81532a2658078d64d414e0a01a412df1f9d6778873457af90eff822a" }, + { 693000, "77a7a3cfa815841411fe925c04ca4a6e88491c21cf7349927fbe95be1b00a390" }, + { 694000, "b5de6f88f5e9961658b2cdbe849ee9e88912edab5370e151ca95edb773bc4585" }, + { 695000, "553ed1c0c56b6628727f6beb775a2e531aad602d25faa9bbe6a09f43bfa91e1a" }, + { 696000, "ff357317c7d71ba1c2f313f86eb651e6a79952fd35e046ac745e3c0f9430a2c6" }, + { 697000, "114c7551c09e58be219acc422ac821cc2cd4a19cf70db7ce3052b9e5d730b228" }, + { 698000, "d65b32ad396cab72e83ee2afbf5b6744873694746e8dc9b807a3f02ecc2b5f43" }, + { 699000, "cd577420f429ed9766460cdba4ed748ebe38349a9e682c04a254e36503968080" }, + { 700000, "6a12fd0de1431e281f98e93251904bbdb8b9a4782f297951458f61f5b22ad673" }, + { 701000, "ac47921782acfb58bb4c19b6c92bffca38831c9bb27e4da0ad316e14ca594e57" }, + { 702000, "f1e684dbb802fe75b7b150b6a5c23d3be54aed53f3c40952739f14b70d260099" }, + { 703000, "86ee933cba04614fde65f3567b6675882f4a1cee289bf000a1b343c60d3ee6de" }, + { 704000, "bbcd7059f0c9875f778837741155044f4c917ab899a5670b5484b3e62f6caf15" }, + { 705000, "fc8a57563258ca753974b0b0adff84b170f9ec3ef50e5554d2607ff4df34cf37" }, + { 706000, "abb17afeb885343a7e08c4dc0090608ca4465ff7eb93e3d1d07f0bbc175236fe" }, + { 707000, "46e8bfd1576df114cc577b297400dcf71456851a4e0140925e537ccc75650c6c" }, + { 708000, "5773b18143bb70975301c8cb5c15fa68d36d27243531fac32506a0b37f010bc7" }, + { 709000, "1c991b9e03ffa4f3aa475aa6bb00e93a65e9b67ac2a88c9601de6f95835efef3" }, + { 710000, "74ef9e5804b13b0834bb38243b9a21136af1e36190893ba8d552eeaf3eeff1e0" }, + { 711000, "65a817d63d42693d710b242af3a041376c2474acc1666259497b262b0bfa8af0" }, + { 712000, "abe2add1e41a8e277d164f42b7bf54e3d5d167d49b850b271ac94deed0bde7dc" }, + { 713000, "4589af6ccbcc3098bce53d4149c992cfa6b2dcb07c7bea0aaa2ff746bc0572b8" }, + { 714000, "9c5936200e132cf4ddbfb5cdb131eb2acda60afcbaa509e9d3dd28adc0cf1669" }, + { 715000, "d400bdd65b64898bafce555a549c2565841ee3d4e72e66a5ab803f134560d717" }, + { 716000, "deb209eb1f9d5c30d4c378fc6aa9d06de516a93d1d0704d4a95101239cb627c8" }, + { 717000, "80bf6874f5637409fc129258d25a3e6bec7e0e1217a7c2f0d242797db6021827" }, + { 718000, "99120502e67698cdee738f70c06b0c9c27788f5607ecebce007524d75ace28e1" }, + { 719000, "c2a7fa8f078aa5d62b1d9f46ef6dc444c46d6817b3222742d919ca440b2ffc15" }, + { 720000, "5815fe8ba956c742f4e761f8ac80b2c46c881eb2bfe5db723419287b52f5db40" }, + { 721000, "a754054ff0aebf068ed6d0411e83dc485f0d3d465f2d89f53a40ec2f6b4cf170" }, + { 722000, "0ca88090380f69ed0f57d5ed418141e95f252279cd788ba02fe4488d92bdaa14" }, + { 723000, "63e11bda79636caab82ef7f39bcdc035eb5e028782c9c77035f7d54d9e8f356d" }, + { 724000, "b96a85f8325119a5fe573e58c693728b0d97eb9b35b49713ac8fb5d68718218c" }, + { 725000, "220a034316f1fa46e7071f8ffcdcaa4916c62a3fd37a0401964f0a973260029b" }, + { 726000, "9685fdc2ec5854875e7bc4945e2f3b4e71f20c50a167cd6ea08416d0e90db99f" }, + { 727000, "705217da9816a0a4ecfc3e3018efc12e8da2b52d7a4b93f48934a7b98f43f438" }, + { 728000, "3164f9470be4b9b458e8ac925d9edc7299eb740fee0e9a1c59c4239a47ef47fd" }, + { 729000, "66b93f3650c4d1861e1c657e9ebb81a22bbae94b5419561d6ff801bb759aa73e" }, + { 730000, "c94440a912f6818073e0bd0931deddfe659f297ccbbb7b20552724ade03d07b6" }, + { 731000, "dc968045735e2085faceb2aa56a7422afb281bc8fc6514740db8a4503f0a4ff4" }, + { 732000, "3f06cb91998cbd1b2205f34bc63f7a34f05c21ed51d869f02e188faf62c15f68" }, + { 733000, "f561f0cfa26b7169ed7d03687a4079968ff402070173bf296541555194ad943d" }, + { 734000, "4c961cf6ab18c31955862586db06fc0acf3b56fb2d37c9cbedc6e79267658e2e" }, + { 735000, "11b2f45144d3bde7bafc4656a0b7c09a215cfee7fd7e1ecf718da9f76345fb7f" }, + { 736000, "553c5009079053dfcc1d7937d5c351c84948753a9dc9c84a2932925e52f765df" }, + { 737000, "07f595ce150c8c4910b81358b6d4c04927198aa579c7d20c84539e4a732bcb80" }, + { 738000, "c0615e976b46b97214755a78b834430258f25374862a81656865f944fece7be7" }, + { 739000, "32761946e1135916912d848fa6dc27df83625844fb996a0242b843f55359515b" }, + { 740000, "2e1428d45ad48f9f411a4afa15bc6b705b6231112a412a08b3c126e668af35f0" }, + { 741000, "4a43f0b79c6d3e3c3a7f468f7c5fa5fa449251d8cbd0cc362f4e543856ce605d" }, + { 742000, "aa3dc353a18ede46c51c75846d0ce9421f2e29e1d72d79f93de46d50a9a6c240" }, + { 743000, "a8f9cb33a3d03a74504d7c952ee13b1b6ef5a7c7c25a353b46112e17fa91a779" }, + { 744000, "c59e669042828fc33b9fe874ecf5bf67f3a25dfbc53b95bd195dd535c4b9f90d" }, + { 745000, "cabccad06f5bd84c504338202cc6a9f796f331ec83b58f48807ad50fca9c05f8" }, + { 746000, "9354f23faf3c6cfcedd8087f8d1bd13e41d50f37219072fbf9cb4a0df2e6c8f6" }, + { 747000, "d87d3b3fa146b0af6b4d2fc8bc54064cd46da82c19e7e6dbccefb7d94e72b866" }, + { 748000, "6144cf3d90ffa3fe062b8d86659bfdd9dbd79848e703a6713a7a43fef77eb6cb" }, + { 749000, "d4c5a5929b7c24b26e160a6341d0ba793504e096fa3e4e057ac201275578384d" }, + { 750000, "41b72a5ca49e0a653066d3f0d56e9aec630bc801871333369574074b2de32f42" }, + { 751000, "fa44f02f4d17138dfcab645ff8c4337ebcebc1251af1f652651b06a5b65a7ad1" }, + { 752000, "cc776bce263e9c6aa194f13c0052dd3c304eeda9b5248224dd76de5f47a167b5" }, + { 753000, "cca2bb5ac11d08182cfb9682f2cd961808b978d31e5b98a11394961e173e12c1" }, + { 754000, "6011055a37e00655cd79e3485fb781d2587c962d635af687d73a11528b1d55ed" }, + { 755000, "2d615550b6b47956c37b7a05a11a0e3427bee0c3e6efa90acc4739da65cca357" }, + { 756000, "94fc041f3f707611103c096142d04a33b773076a1d0436db6caf1c5cc0430bc1" }, + { 757000, "f6502dbb335f3cb0f0fe88014a78efad7d41917077b0270d98c05aecb45156fb" }, + { 758000, "6ce71d6d9bdba1ecd3e3644a3444bb312828c722cd5d7dfbd79a18117c7bcdfc" }, + { 759000, "58abba22f01a01e120a864de2462557350ac57f49bf3fd55c69a6034c5a25ebd" }, + { 760000, "6b5c2392e86b056b4bcb1b31fc09e298c406ec2dbe454fa0b89d9e821d2ee47c" }, + { 761000, "974d7d54e1ce0d5a965df79dd3c1f9ec82ee3e348276e42de0e16d2122b8c779" }, + { 762000, "cdb6d89c2773a73233ca01aab1c9da920ec3ff18d41c3a0d6d2a05e44e4bcd39" }, + { 763000, "e719feadb9ea0c63574e79f7e83ad06368df176bf0beb1efcace4287e93fd4e7" }, + { 764000, "f47dd75ecb008306d2f94370d2dd1de36e611c29c4340494e1607918c3162c73" }, + { 765000, "8345ff2e69437ea1ebc978f5396659913a662047509d74953b4aedccddf614fa" }, + { 766000, "efa556cb808979931d5686fc06655e2c493e3d42715a96e8a9575016acdb0b3c" }, + { 767000, "58554b84a5de871e8b1607cacd3d367fbe1584ea1c674b6e5cb48a013168a001" }, + { 768000, "f40480a0b2c28795f4e120c068a1c7b8438f4c11aa55a1c9dc3d3d01d7223329" }, + { 769000, "4cf65229fcf09be9f4c7fb6d676df86841e52cf333a0f5601949fcc8d8317e15" }, + { 770000, "dc6804375876e4d4f60578fb8bc26dbd83429f08b3b5be7ce656e0aed6a4a7b9" }, + { 771000, "867d0567993f12877cbb91be38301a474c66a34d43bc76ba1ff0295b31544a3d" }, + { 772000, "60e540abca59b63a6c539ddf265e60c42a28e8dc0cc06c97d66e246112870c3d" }, + { 773000, "3b82396fc3121fd9561184b818288acae393483bd80d2c76089d04bfbe8169c8" }, + { 774000, "74d28bd6ebe0ba17e23f5a6afb2100824f6321ff8df6ce9a6828b961584115af" }, + { 775000, "0f21ab4671ce97304c9f4070b4381ca4d8b8821af8b36dd3375c512aa89585a2" }, + { 776000, "46863619a4c45056902a67d4a85dcca18f3e2e465e113b94b42c6ee359ea6984" }, + { 777000, "805c7aaffe4ba04bf9649e6ca712e5c1a5e75a6c6ecb57e9858ce666d3058b75" }, + { 778000, "08ed7f2fc7e41320b54eeccfbe344ad3777ce001bce7b46ce33c7828df7e51a2" }, + { 779000, "f523b40c77e2333e96f52f94dd6570a88687359d1943df9e999209b4f1b9d46f" }, + { 780000, "0b1712d6795f4b98b222e0c11dab3908608d83a583c19828a4b1d04039f734b1" }, + { 781000, "8468e6648f3d41e5eafe6387915349a3529ca2e9b9d1a30fb0e8bc21eb27a837" }, + { 782000, "5697c9adbef0c167c13ea2ad3273452df786a93ac83e0d52a1aeecf026ac0402" }, + { 783000, "9fb9185109de408da7756572dfa94eb41c37bb10dce929a0ea323d99351ee3f3" }, + { 784000, "7d8d6ce84571bed5d83b4dad4d64706aa58f832988dec83305c3de58c915b66e" }, + { 785000, "9ce01b844487f9268d923c3ca50f41aba5c6dd0ab6994fbd00427a2a26b89b4a" }, + { 786000, "76eccc0632619c3b2b546e711970ce8d04f83398350653539e57c9e7fc5b20cd" }, + { 787000, "ab2bdebd33c7c4959bcb1c48eea9926a5390dfe91b8d09732122a0c1c5c4badb" }, + { 788000, "c71c03c0df53bd983c921a6aaeb1b1faaff5f02975939d5e47852da37485f36a" }, + { 789000, "a84a39910aef093e56eb820d29ad4aae49daa08a7413ab8839b88f4f932733ca" }, + { 790000, "82a334fae5535684aa9c2e94b2d61d57a7ebafe3ac8d4d52b97e4819914629c1" }, + { 791000, "446905dec258c9c5e016fa907eb2bf29ac114a55f0894f4edfdc75790f6e9e22" }, + { 792000, "99bf27dcd7674caee26889bd26a6aac7b00d6447f1b13c22f8607d64b4e720e5" }, + { 793000, "e171721e9fbc6f10dc4d11c34810701754cf2bf438ba54975af89a9402139400" }, + { 794000, "f401ce98ad5e420e9e4af9d906bd8cac6b80312c827903777b878ba9e24f6c96" }, + { 795000, "30c9af5713124e8d6c6db327c8f64526606a55ad8ccbea3d65ed89d4b6fdc849" }, + { 796000, "077f42e830acba2f40d1b2e6eac03682b3d2a144bfa616881eba2dba0b5f7a83" }, + { 797000, "43d6972cac1f7bf501e4dfc53b0bee44731689b18fbdea5b5bfe2da0494b514d" }, + { 798000, "3bf593cc377375e5283dc22e0a0a829cd9975e7195bc734cbea0ae5c0398482b" }, + { 799000, "0268d741c1e62b73740c95b3375c420985a395ee9f2942d9d6072691efbff6ee" }, + { 800000, "06d16a11ae045e434b2e7850bf2b1d061c91d741783984bdee921decfacf0f90" }, + { 801000, "cc7ad7e7942e5e6c8e069cfba0de9db010670a91663fdafdb6044f973f91066c" }, + { 802000, "63b7f5e902cd801a4495052c620a7cae8e34b2d69ad9e5e31fecb4be7099aa37" }, + { 803000, "b14b8256f83664b8268e6a98792187e9ac719a822972865d889967ee98aed0fc" }, + { 804000, "b48eb299b4d2ed305dd09adcf593b5885f499ca41b0f12d75110b07c290c6495" }, + { 805000, "960cf47dd44321b1b6725a187fcdf4514af09b6cd0b3180140dc15f657ea12d4" }, + { 806000, "2dc652232cd7fde75130655deaeab06deb77621374f4d0a282de21b2d49ef7d3" }, + { 807000, "4eabcb29d77e13fab6b9e7fab52d13a3966e8d1051666b2e80d07f6ee09570e6" }, + { 808000, "2b890b62513b3ff1becca0a4fa61d7d95e027034cc4160f44321df0005338e06" }, + { 809000, "a16cea1ca78a7edd23546904da6fbde0f937f03f36776b6d4e8951072ccae83d" }, + { 810000, "5f65db32f349669fa9c949f9bf118c9ea91ffb028e4c71e93fbbca2c11709f7b" }, + { 811000, "21528f55f977378541ea55fd21dc295bc6ecc190043c90e8bd1269a5c1f94a3e" }, + { 812000, "aef1a381baa344247ab25b9db4557213e9d823a53e0612ba7e79ab38ffcd4154" }, + { 813000, "4e33e9c8813f9baf6eaf3b8ef7d28d70f2d8eec15fa2e5fe5ec63413945b99df" }, + { 814000, "1a8036bace8eabb9c300c47f3e75f74b3fd67641b4386defe530d6c60225623a" }, + { 815000, "825eb16ff2085d0cf893846aae162cef8a60c0309df189d9117ca397b42c819d" }, + { 816000, "845980a8942362c6d296ea9e866d8ed4223906c7b46f9194b9d3b04c7de3eda3" }, + { 817000, "d4f06681826d1d3e93b995aa24ea87d1abe7dc52a6f77e3d95d39e8f5ca02409" }, + { 818000, "edfa0e5e012741439ff763eba7e2b223f4da342375ce3dd1d51fb1088779d463" }, + { 819000, "7357366792f8c7ee439d492e36769fddf0b92fe429c3aa51e88ef817c753183e" }, + { 820000, "9e9d1866e6f5e276b2e7c9b01a39cd515ae904d7577e715b62f834517afbc4c3" }, + { 821000, "0d20326d0a5c6c6de0565fc34ad85c0f53b4768aa1f482e987e3fe788326d31c" }, + { 822000, "1e5711dac6491341ba5464b9ae303ec857087178d78632e5e9ff74d10f7f57ae" }, + { 823000, "95ef36abbfc7d5d2c9afc0ca6fa67d11fb4db72b73b1d91bad8d19d1b86416fd" }, + { 824000, "0702c31d6e3416f38bb9dd3e0fc45e8fc9b6a529faea9c12e2533e44c8974775" }, + { 825000, "97a0330e9bc25d198c80d2b6f06acacd32634774096b457cf313489edcae837b" }, + { 826000, "5fe70b6b076d72334e3eba36f5ba7847418603cc7ba27d04e4b0cd2108975404" }, + { 827000, "e3222b2ef006bd600f547f41ac0796ee86d7027c954e5a0837ca61cf3a053a69" }, + { 828000, "35549ccd76df94733df96e6f29de7ebae951fd8646df57ca23ce01ae4b96413d" }, + { 829000, "e8c8a7648c3c0796e9d2466b512e581b6ac412f65deac72e00d3569ec6901d35" }, + { 830000, "824058b3310fa5ff3cfb72c2f533ea907e026b36289fad545abf1ca09cbd3551" }, + { 831000, "c440b4a198982c5f857a9eff673e7cffb7262ca8b9a28186d38099d744645126" }, + { 832000, "79f54a9b7455824de4d5a5747b10c1caba415aacd92cd5739d8c0c9d290e6e6e" }, + { 833000, "755020044019735c2ff4ea4c31bce2ea46373f10275a0c06e2122c702b6e8b88" }, + { 834000, "ac2dc947c9954c8b4cea55a6ead7e344d6d0f478814c530567533c66c8be581d" }, + { 835000, "75e879c6c10d198b70473d2b5ac95307fabc395c4a87b8a00b20627d77bba486" }, + { 836000, "3e744d549ea0b10b973bb5a352afa7bdfb236a8c3e734a25d33e866b130e3e06" }, + { 837000, "0fa9a2672edd3795bdf393f73261310f539a7eef97769ec55be2568e67881c29" }, + { 838000, "76d21ec0f3764fb0357a956ec8a53721d5e56447f874e3cfdf7549e8100c1c51" }, + { 839000, "b77c5cfd482b34c3e5a1cadb070eb312fee6fa7bd233180e6348fbc3d3cb3145" }, + { 840000, "ab89e030bcbabc24caeafd857de2e6e8feef129832ade049c0a5cf7722f6178c" }, + { 841000, "7c3b2fee14438efb207850c3493026653d46cb3f8bef9a27a686d4ae12027c76" }, + { 842000, "b54e11fb070f59067532e7eee0c3f34d83593262006f78848288c3b5169a0410" }, + { 843000, "d244c7109e3164a00493a469f22e39107aec950b012e1257fda209a44dc86353" }, + { 844000, "472b934286edf8a7b233c3de48660a5100fea6c6c16efa168021d67dbb7c01c6" }, + { 845000, "2c5cb2c048ec972c78b286f411afac8a9017b381cb36f9b19167ea37ede154e0" }, + { 846000, "15cc5f1adb5fed3a1326fa40bc5e8d7259b4ef97b95d9ffda0744a52c9c0baf3" }, + { 847000, "f56c815b68d271ca6896d3d86baed2763e497336856a90f262a3600318d5d9f4" }, + { 848000, "fa909aaea0da6d6e44811ee55e1873abb4d756c427afc7a6e0f05e96905d35e6" }, + { 849000, "62534444cd4d84f10238c72c2f0088b61c8e30c10b23c4308997f7534c4c2895" }, + { 850000, "d502abd527f2fbd1e8eb66f769c11da8e58de366130b228f6c9842465497fcb4" }, + { 851000, "8359a0901c975f86e3406227d0d9516903424dc4f0e5002aa83e0b0180b3821b" }, + { 852000, "707b9c6efb2826bccdefc1bbacf192be950dc8ee4674d4a036da2a63a4db12ca" }, + { 853000, "90df3d239b7302483a4a9c6862607ec64f5a3a08f7f3cd0dc0ffaa9d952ba3d3" }, + { 854000, "773c7b6177dd18e4bbab0d56b3a81ccac35c7d5a8cbca48a6ffd7d8c6a144517" }, + { 855000, "897723b0122b5cdb8856224f297d742338d657a47b1dfc1f372a7187fe7d3202" }, + { 856000, "0a525fe51ea196fbabd7bfc2e3042254ac6ecb90527078ea9bcf6a6c616d8bb4" }, + { 857000, "491da4dc8dba1d9431ba6b47e7ba4b0536124819799410679ee51f10462bf3a3" }, + { 858000, "a4fcef5cc6cf45f5c81831733be094dc7a836435e5d7ac87236d50fdaf3a22e2" }, + { 859000, "26779554c1e05f7388fa5b3119055c365b2198e22e53770b1c73a51cdc23945d" }, + { 860000, "19b2189ce285ee6cd5cb96412141e5f55355b616e37e55c0f30f0ea953878c37" }, + { 861000, "28d02d85ed33a0578add5843c723d97a420092b4ea6fb68a824b90a1473eb30d" }, + { 862000, "3641da94ed41ae3981035388e2096b9e8b8cab22c2cef807949c4eade0ce530f" }, + { 863000, "86b944f8899181e38690fa01bf9ed93d62a108ec999ac8f533040e7b64a7f25a" }, + { 864000, "957a83592c5278288cc185dc96aa36825f8c72d990cd0644fd756f9f8f4d6bea" }, + { 865000, "99bf6efdc6f0bf334eef4cffac07b8aced6e74b46d3bae3ebade4861ba137c34" }, + { 866000, "3c746c6f070a03438ee64eb77b308dae05d71cf6b67e571ae98f1c35b727a9f9" }, + { 867000, "a873dce39fb2f98bd07ffe3c59c4ead065a67c9011fe6d694023cb97fcae1fcd" }, + { 868000, "9598e4859543d94774c63cb5b63689e888bbdcf848ea2836b87a26cf9ea9799d" }, + { 869000, "690a3494f38409d19c8b2e90bdf5e6a2bf63dd322547d16fd5ad59a752324416" }, + { 870000, "cee5e1cadf2db8b05fb38a527d13de072c0bea89446949a9891983e6bf498ae2" }, + { 871000, "fd52d8c4e170d109d6a68655b6cfd4e4868ef3bdf9206e33c21518b6e9009e84" }, + { 872000, "157ddc4bf2b1801270b19d64c545f6ecb009c8ae71fc406e38f55064e85a1c63" }, + { 873000, "679feb939bcfcf4ee5d854b74a8659b8bdf57f347676700a7bdf99228d678371" }, + { 874000, "11d2cb9dc36e4685d27b9c135919760c612bcdf64a173829cdd01f6ed62a90e7" }, + { 875000, "1b15b46fbe39e32f0d4297bf52687e71dc3af5a6fa02e02d57ff957faee63aa9" }, + { 876000, "c60bfc79f20c4f9145a06584059d84b74873d5ffca23438258cee8431485a635" }, + { 877000, "82a898fda08b4dd641161030b94236f8655823409d3efe920e228ee54aff76eb" }, + { 878000, "62ca04200d7aa567a3b22d99bc780b9aa3dc445417e8c55850586b8da21b06fa" }, + { 879000, "27d484baef7e4a44d400e86469b928709d62b5c849fd1f86793bf0e421fa53d2" }, + { 880000, "3d78d6526e953377f8eefe45f51ac74932abf1f1ac5308e053ce699633ed4171" }, + { 881000, "d5be12ef1da11ada16ba1f3dde50985e809b4345a215fb178f9e5d526d561c68" }, + { 882000, "99bbba16761ca1a60d82ed971d755d2e22202cae502a5025d4d2d23b030c28ee" }, + { 883000, "c9088a08e2dcf2e7dfc41f3c873410bbe6c4a5d9910af6e3667997ab7d62203e" }, + { 884000, "d4773f4fbfe985d58be07e1d29d3a7e710e4ce7f1b575365f4bb6f7b82c98425" }, + { 885000, "0b4b862b392bb24a623568c471d18adb76e4b14911335ebbc3d94936ab9ff6cf" }, + { 886000, "0827e2447015aa7dda645aab4ffb7cfc930e110a718ac7140114e94e96da2de8" }, + { 887000, "6966fc68d04066d61b3bae3384fb1a765f0d2485d53b2cd3aea7bb9d0e12ff02" }, + { 888000, "62b71bd9125a3efc3dbfecd5dfde1482e12109456c32cb3df7ec8623a24aa984" }, + { 889000, "6aa8cc6db2496142c60c8bf71c54266b40d9c5002295cc2ac94209acc59c6295" }, + { 890000, "be1bee6699f377345ec5c42200f76943897440d9617c8ef22ac1d606d3721f76" }, + { 891000, "e0d52345381ec4d0fbbb4a81a4fda0f217d5b39b21adb599e6bb40d2f6e55f67" }, + { 892000, "874449c43e57b0bfd6cffe63ff9338b386b832fc1f6e7417491ab458a260147e" }, + { 893000, "a1a74d3d1014e2d2f2f02c240cd62acc0fbcf6cfc64e62255f6e40f28ff85e31" }, + { 894000, "6725b03c2887c60b0dc9b06e332c089f925419c8f712cb9ae4892f36e81f8b23" }, + { 895000, "9823d67fdf27834b59cd87f6040d26b435448f5f5ea1813aedefa9f40d84a4ee" }, + { 896000, "4c4e50cb12106d42a8729ca28da964e66ba392a8c53aabc3dc182e36aa9bbab0" }, + { 897000, "2610e0dc9d3cb1a96156866c946767d58b0513a32f39322792fe67585a0cc899" }, + { 898000, "e98994827c2125f847068c3b5c16665a33fd13815a8952b7140e94bf29c259b9" }, + { 899000, "28776cf3190a1491a6a76641235373fe94ce26b1ed735e6a04d5d72eeb4acb68" }, + { 900000, "58f8b3e1380ceaaeec03f23bcb3549fc385ab154b35c2015ebdf25435786dd33" }, + { 901000, "3cf14cf3efec669ac73312f308984469219b131af53743d190ac7c5b70cacc25" }, + { 902000, "51b410d195d96c8ffd62f696257629f6a03134bf29bb74e29f6b9fa5e2d0f05b" }, + { 903000, "291d8edd5a31909758307bef754d8471ff782b70d6578a16d2c9a1507f6fe8e3" }, + { 904000, "12eb81c75e44ac5b6f0389165adfe5c94c300b3f07f63bd033899d74801617b4" }, + { 905000, "7d7fb8e2baa04765e1b6421f2fb83e1df0afcdccc0f715698a6fb343758b6f06" }, + { 906000, "593154f6a5a63cbac28454c8172e510cd361404e55ef42c8e53bf2cf56c5e653" }, + { 907000, "f02371cafcd132e45bba713c08cd6f74a1e057d048723337fabe7f9232930189" }, + { 908000, "67ede623b3ea3ccf88918dad27deb9cab92f64202a0754a805c66c575bfb4c5c" }, + { 909000, "7b881937b6457f3a31ec445410ceb02f0fb26c30a6ad6432df4483bb5131fc89" }, + { 910000, "3bf72daac195ad0e197f691d959168602a1777a3e038fdabebc068507b540e7d" }, + { 911000, "2bf3d2903f6a3a2ea12e985c1a23b473604c9ea0f0bb387982c80a6b315c5f52" }, + { 912000, "9e10cce384bc33d2a4fdb7c20ce3b72798e12567b1616e71ff192740cc48503f" }, + { 913000, "e6bc78ec6d566782861dbdc0412da969dad82cb60082624cf6f9bc089d4bd825" }, + { 914000, "e4e5eab870e4af4597bed3989fe72adf43efd664037b35fc0816a0e58eb7dee7" }, + { 915000, "1e9871513ebcf71f6fb7ac155b3a1c7e26af38b6b06a40f2fd7c0b1c525ec1d0" }, + { 916000, "efeba5938ff11520108490b5df59fc6928e51be07a9ddde6600572d5d6a36fee" }, + { 917000, "579a635f0c94c9af81df9bebf7fc1e754c75e8aa06ed2bb0254d89a6a947dcee" }, + { 918000, "d3d5d2c7952e58e74d070693b927b4733375dff0a6f48edfc96a774ad17efd1f" }, + { 919000, "555800aea2614ef48758ad74dfe26583d2f5f02e4dfe8174f6a6c4ed5000dad0" }, + { 920000, "d604b16fb37f253f917acbb5222dc5e63d08ef2f6c39ecbb645a8f72234292ec" }, + { 921000, "460a9bab701ccb00de6925c95a276f5942bc4c005a5db57cf04d9f92d3e6963a" }, + { 922000, "745e6e698800b832500bfc536e2d2716bcb58ee652c81bccf84bdc928ca4b1eb" }, + { 923000, "9e2ac6096d8d5c5757d7230fbe2307bf680d62bdc9d780faf9f79b4bacc6706e" }, + { 924000, "8a6f041f191224cdc65153cbcc548d33c0276ad05c68d34804038f225cd2e029" }, + { 925000, "1912056d67e9eddedad4451dc719c4b6d96c5a8d1a1a9e45df712f4148bae47d" }, + { 926000, "660542d4cad2cc6370a091198f353a9da09cae5c4ccd7ab2cd47847c3062b0a5" }, + { 927000, "bad2168f6e819b99705ce1393d7e826da1a05e3cff8ee7ac079fc37eb50d4c96" }, + { 928000, "3de9c7b530ec8568eb6ce15fc1406f8e672b0e81759887754e6d0b6243ab11bf" }, + { 929000, "d82bd05495ef8910b349b09b10ac79edc22377ac5143daabdc681592892d898a" }, + { 930000, "604cb3c70ec02b59afdd177a8b47f23024c84cfc6c6d1e5680f4fdd682e2b299" }, + { 931000, "2f5311e454c527f721d9aa3ad52960163cc4b4dff7b855234f5cd0e61b12b7a0" }, + { 932000, "3eb2c7d788172f0c32731fc8b2a73d00421c4f333b94234d6a127cfcc4431366" }, + { 933000, "99fc18730095ebfdec14192e53d0aee550de29a9cfec0328144d3981903dde67" }, + { 934000, "9e4798425767efcf3e230363e68961da0eae251705a0b8937080b3ea4e0409c7" }, + { 935000, "a635df6c7d03fcb0d0b05e097648cf04e6b43f5166e81abd13e9b77e4b8cbd2d" }, + { 936000, "2a38d62dcc82ff2f2a4acb1065e4a5117e49c7591ee6ba88e5fd9547cbf503f2" }, + { 937000, "40d15515a2c272b717dae53517550a4506e1a21099ec56604c5a051abc418d8e" }, + { 938000, "1a0cdc37669aef276fd40411da69ef1ed6e483c165c72d0eadae4abdc16af9e6" }, + { 939000, "517fdc221bc994dc24f5052a269b0344f1dec771580887a4f4eea2b03d8fd35f" }, + { 940000, "0cc493e454a95f4a1de695c441084767279fbfec4be484242ba2e9e13f957b13" }, + { 941000, "bbbec9d77aa33c19baeabd8061693a2a2b4379cbc89bf939a8963f4fc08c8b1f" }, + { 942000, "80b4ce9bf828fcb3cc4e58bb8f2b8003c92ef58af543ded445ca680056848c3a" }, + { 943000, "8b552dd3e1f5d2a828bf61fd0cb9d4c5a415fba08773de6826010f0abe6afa0e" }, + { 944000, "3740e7a0c9883bd8385bab8c4539e3a3b771994b38a1c9d6b94aa3ab93849c59" }, + { 945000, "5f5f0f1251fdee7145790cfaf2ac723cf3c40e36f49928f0beba0f66563ef315" }, + { 946000, "39f66239f1cdb5caea4d36d1df7bea828a0c7dc8c46a71a55ed01b2f04e97c34" }, + { 947000, "84f1419a40a6f25f137b4d5c1f35a56aeedb3e6251b171facd2a0974906ef3c9" }, + { 948000, "9d7c02988908bb906942c7b56c018c0a6e1b06f972bf34fc2cda4b85c109735b" }, + { 949000, "17cb0f0b54be3859f1a04e36329d0d8203d55961424114127990d02ec86619de" }, + { 950000, "477234eda8abb563e050d4a9d6a08454dc486463cb7ff1f06b777bf0ca928573" }, + { 951000, "248e9d71ff64dd8bee7448fbad53aa30788627d95f9e23802d943b1696a8fe36" }, + { 952000, "07593c3c2c5348196d9cc704ea18e33f8e966ee05f9882b69cefaa04cb7566a4" }, + { 953000, "9d1b97ef02d4b5a5a94146b60267059b25d226a80ee7718678402fe888cf3f24" }, + { 954000, "a797bf0c6b1286df321c641bb1cc0f31c963d0502cd180b1a5e46e3c73ba3722" }, + { 955000, "4495a86f0a479e2be209a45217be590e2a4dd1e296de7144a03ea4e3e9c8fb8c" }, + { 956000, "5dd5317ba5c7b14d882df6e156e7fd9ba60ee1afc141cbdd4cca435265ff1691" }, + { 957000, "88baa81ea2e5705e9775e1acfcc98d2bcc9501d372b7813cb1c7160d41755778" }, + { 958000, "d5fdc276a66f04857013a1112491944327509b01cd3a425993f0878163cf4fc3" }, + { 959000, "42509479ade85010e24221fdf24c17b30aeaa75cf72135dde771b2a3a15243fd" }, + { 960000, "8e7c38a1957a1a644c260a411e2c6e081321bd36d3810ed78fd8f8c5192f953a" }, + { 961000, "918614104df543277d82d0f19a9e354a6c6df5cb45a90ef150ad87c9769b0b06" }, + { 962000, "8ed9f12c3d512b4e0ea1a468247779be13d087caca2f590f50ab614d8b37cfb6" }, + { 963000, "11a3f554274bc33a3a2bc162c62e11957d9daba97d95def41dd2c14e43d59984" }, + { 964000, "65f44675bd5801f41da787aa32256a0ec8bc7420c34992ff5d43bb464feccda0" }, + { 965000, "389a3dbfc1fcd60fa74e67a256df43305e128c50cd063abf5942b6a45d1f8e23" }, + { 966000, "cabd56e4b742c8fd9634f7e9fafae620fc68b662097487fe8867a20f9f84c161" }, + { 967000, "4b125731da659d92796242263e25decfba5688016c1b8398825c7c43dda5c08f" }, + { 968000, "f2185ec76ec83b30a8190d930f6ee2b58d2567dc253720e70b5a002baf118e99" }, + { 969000, "cd5093f0e7c96cd048ccc3064947d4a8c98e16eb9ea52c6b0011b2c9013260d2" }, + { 970000, "f6ea7b2214e2a6c77351841dee65bc2bcb593c3629ff10707821eaf24021ffdd" }, + { 971000, "aa0a56adcb410be39c68d5f92c805d09ab0eef2896d69c804a915cb17fc8ec32" }, + { 972000, "912a5f39cc3901ba97993eaab3784c3b5d32f757a0b8bf9c65076c7322094ab2" }, + { 973000, "650a4ea855db02041887becd650e380a821c1a13420be43b4598fdf27b692959" }, + { 974000, "1b65d6287b60da4066b7f8f662110f342380ae9a824c01ea1837382c6122d6e9" }, + { 975000, "ac807048f8012db0c3a8546a516e6bcf5071a598fd49e2737acbdf98543f9eda" }, + { 976000, "e5deca78768ae18a02ad614000a0f5fef65a13dc4ce41d977fed2d53c159cec0" }, + { 977000, "c6e8c3eab718ae02b77d95ea85523b55cb0fc70fdcf4f9523b600bcee8bd6251" }, + { 978000, "0e388ed09fbfe4e97096b39fdf663d1e30721d058f00d2640a31b418ac24f6f0" }, + { 979000, "e622296143e4f9cab81c47dd395bdc2768abae2262a4876d67cc7a2652eb3d3a" }, + { 980000, "e727b48c76f19f03fd06a90ec1851cab4c6eea85d66305c99608ae21979c2354" }, + { 981000, "128539656c292118e509a4cac0b241d9abe6404c53e629aa038b3d4cd0f3fa7b" }, + { 982000, "9b385af2f11ea40bc662f6e7cdfda8794ead4f6ac85bb35ec41174ec4e14bb8c" }, + { 983000, "299a5956578250362cd4a19777d2d740df89cfc6582ceb9b00300f01c30a7c32" }, + { 984000, "f3e49150a45c25614d4342d4800b3b7a625e5ca39cf09e1b5501eba63b1f76e7" }, + { 985000, "e6f58de182b0daccd2a3c1043bb31a07da6cfadcfb1041f86dbfc57b3d5698b1" }, + { 986000, "7c1c967b82d7fbc9f1856b9dbe6168e0d52e758837103cf23346f4d96390ea62" }, + { 987000, "a921cec755105497469f4cd4f269ffc45f0604d257fc463d6fbe07f7f7470e3e" }, + { 988000, "a283269ada4545687d17824f89bec75a02e9e8253e2827b041dae0bb48410fbe" }, + { 989000, "a9c708e9773e9e01eceda62d06460f37cfef5d21bfae9fbea16d2f7a793b8bd0" }, + { 990000, "8f8975991fbba371629facb060ba63f6628a71f162df3f7d6f21701fed0d5efd" }, + { 991000, "279f2bb6f8688e48dfccd459bc4d102cbb61878c95a5adc7b36b943c2359ba3d" }, + { 992000, "ec989d3bd3bc9362db0d4bca21b1e0da47c7d56c39d48aadefe825b0c35d6f4b" }, + { 993000, "d5b25b35a99e618b19c2b36ab86ca07a986c905ccdbbde402142720d4e306014" }, + { 994000, "992187fb61a6741779c1279cf1a071748cd48b2dee5d87300cd3561cf66d4744" }, + { 995000, "a43ff96cf72728c33247662f43e30fcf3af7396e1d8ecc5ef20b5e19287416cf" }, + { 996000, "a3f6f2958193a6ffe70faab0604fda60f1a910cae601b33aa0cb8e1412848ace" }, + { 997000, "7a06da51089f322b9250fcdf327f5f04e4177ea5b7942a79dde3b16b57bd3585" }, + { 998000, "8c651fdf1cc99198cb1f2897a12f7044ab0b39c247e634dcd42ea0a21fcf52ce" }, + { 999000, "c2d921ae5ecdc1cb4bb47bd984c78cb062b44752b7247e16e77e1533675b2ac1" }, + { 1000000, "4f099b5a86e0a5621e4904e74041c6259f7df346a5ff331234f92432e1debee8" }, + { 1001000, "d5fc33efb8a96714229f520a18b7e16276ee34efbdd841414dd4ef52256dc995" }, + { 1002000, "20a159ba648daf1318050197d5a9f2ac141e8da3c16bd3adc6a8891b141d0b1d" }, + { 1003000, "469540c686216108dba10801fd61a26b8f6ef1f54223939cd1ee32febd26cb79" }, + { 1004000, "d2d2b41c2411bf71e9ef9f99006706d471e03921179ecca5253caa8beb262d40" }, + { 1005000, "32078d5956301600dbde3991bf8fed68bedf22169c3e63861cf0f6a870141e8b" }, + { 1006000, "661297c2b97c6ed7b0e7d491ad80b213890c3fa8675c5b2c7049912216505ab3" }, + { 1007000, "b51c76c404b22d987d833a2938ae3fdf572e00c52bff17ba25056089da953a0a" }, + { 1008000, "f0b1a9d24669a19c0f7cdb30245ffd6e4d1f4cbc5da903799840d142935930c3" }, + { 1009000, "679d568acc88ffe3e6dbf49b8b4dc54dac16889e0592a394b7ced4b6c43837bf" }, + { 1010000, "5b49eddfcaadda9d0425272486dd0df64bb97be92d589f9ff7ebad940bcc313b" }, + { 1011000, "56fb66adc9d88ee630150b985d2cdeb5cdf5490e869078fdfdd6920f554cfa23" }, + { 1012000, "ed1fcee7cb2c2c1a9fdbd1824e30fe261707ed919e440bf31ee1a4623e23f0fe" }, + { 1013000, "d672f1b779f3caad8ae25bd71edeb577a35703b009646ef32d87785ad0d30fc2" }, + { 1014000, "ae01804a692097c944cf0be28b365ce1cf3caa94fb80dd3495067752fb10e2e5" }, + { 1015000, "791fd5a46bd13818e9e38b7cb5bca8c3446cac28327718675319c6ef8c3c40a5" }, + { 1016000, "8563a35a1fb36bd5540256ab4b1c22b9cafcd8c8d24881ed82970c60babad21e" }, + { 1017000, "0d79ae91dc8e4de796ed4c7c3efe383d82f2f30d4d935a4a8a373dbcd19921c9" }, + { 1018000, "2e495c883276f8ea451d8162568c981a9574a8d24771798086375bbcc18a627c" }, + { 1019000, "06f2e7fb06649f42b511a5c1e36681655f2557f3dc952780cf67c191fed323b4" }, + { 1020000, "7adc26d5e3baac1f257a28bfaec1217dc7986a319874476d3efa4a6bf7f31a36" }, + { 1021000, "b1b6782647c698a741e8611e7a739ae165d9dab56901856336f461857dd9aa7b" }, + { 1022000, "e9249a69c2a7d7d239e70f8a81028cef0f9eddd57bc3ebb12825493f698a11a4" }, + { 1023000, "0386e28bcf863f714f25240f7bb51f33354825ed39154142f1807d16e698d9b0" }, + { 1024000, "7b52b000ce74f57f40a8fbea6a73e554299cde29bb545b40c63cc47e792e8b95" }, + { 1025000, "8f71a7f2846d20779d1b84fa41da4835ec438abbe67ce9c1bab894a77ad12205" }, + { 1026000, "5e0a7af99591a7be36234d52b748f74506b599280d91a0ea13d153c2e7261706" }, + { 1027000, "1f25c959450da5c258b9494d76ea4baf798525ba207c9186221dfe2a33efb2b5" }, + { 1028000, "714cad9ebca5818f8c81fe1ac328bdc6a698a10b1eb7643cd85e2546ce1a635a" }, + { 1029000, "66a69df671a49187362c0be4a3fa3b45c15d5fcb4ce4b1176decd14bf458a731" }, + { 1030000, "1c57bb99d6d35a01a0fba24efaec2dc8e07a049cadf79137ad456d4523eb8dfa" }, + { 1031000, "4fc052d7b1783e6d918b94c907be1b12b2186ca1f0a3ab060f0b39ab8997e4b9" }, + { 1032000, "13316f770bc7c7c4438b4531185f28a8d1bbac919daba6e2964af054800fdddb" }, + { 1033000, "e93948b94e9e27ffbbdb367fe7fb6f0b82631a414d6f04681dc6445db855e067" }, + { 1034000, "a4e28d0e86698f4b4b55caf4f0af30a1aa27bea0431f3df14e91dc79274798aa" }, + { 1035000, "44ba594401be04a51c0ab20ab21fb07fac27f6eee83a330e80c5ac3a0b7cc45b" }, + { 1036000, "9764ad49d7f68e6b559d0901dafd2100a6209ca5635a18b1c60423a3ece2f9e2" }, + { 1037000, "232ca662cfe1a6d8d2d160e875be34bb0954100dd4c2753eabb1aede421ba074" }, + { 1038000, "9fc8e45f54711cd03ed2a0d9ca6a84fa2043ac7325890cbbd4f14403c397901f" }, + { 1039000, "eefa68017cd32a1e79ca4160e910f72e8995917ffa44e1fd43882768dffaf71f" }, + { 1040000, "f7af93d783243f12e251f5fed50f610202517841b0de87b9e261c0057fdb3268" }, + { 1041000, "a3576f7b5c468edf6ed036909f634ac6117f8ce5e54af48ba629d1db6f76fe9a" }, + { 1042000, "5ebf592d6f144c7f9abfec22809ae28fbed201eb2015ed7a9b2f1f496a25071a" }, + { 1043000, "952229bb2924f70d3ba31626121e959288cae35ae0e3b76586e4395e24c7d7f3" }, + { 1044000, "d0ad7c4f9c80753e128f04ad9c04c41f76b9321e07d062fd934f0870290fca55" }, + { 1045000, "77b7408ae359c35244f9368e744909a9210af730cb88d62e878ba3919c3759c0" }, + { 1046000, "82cd9c6440379b5e81b927fb2b25ec350c5a99d12a63ba88a27caa05ad200e5d" }, + { 1047000, "7bc40ffd09485de5cd1e604571df15e7a0aba7ffc7e85928d389377a0af4d06c" }, + { 1048000, "4271318836fe33288c1a15c1fe798e5b4a89841fc01abbd1df2547d4631caf7a" }, + { 1049000, "85828834e2dc951ebb48dee7d75814674a5e48c57cc98d6f986f94cfe6e22e6d" }, + { 1050000, "00503cad1a91958f222f278b56f600411045f06c336e48984b562d9fea07aa76" }, + { 1051000, "d2642c10b486717249c7a9ed8bef2500ee2412d0ba61cf9ab742abb865d7b336" }, + { 1052000, "3ffb4e4164a032d82d19ae8ec61986d06538aa01191907f4a1fa246e5ada6e4c" }, + { 1053000, "e4ed8ee7e44fda5aab91123934f3a802f789a06c078f11d2c613acf12d5dfe91" }, + { 1054000, "1b518bbe7f6b430aff4586fe8d682de24c54b43c90b28370eedfb6b8d524cc9b" }, + { 1055000, "7235d996401925aba3d9cecfe2b446a6ec6703dd6a4ecbad4ba42a4b49a3b8f1" }, + { 1056000, "66063667f073771d543fcae3273797e22e549b1215872e7dc971dcea11f45c32" }, + { 1057000, "547e961ac6f4389196ca5b1af4f49d6aaa0f32c1c07b1314d51bf1089a7346f9" }, + { 1058000, "ed06043ecdff6c0d9d88037bf92cfbcad5794b85de73321600cd84e4f287dbaf" }, + { 1059000, "2bf56e384de81d2a19a5950e425b1bc18572a14bff0ce191b06c4307257f1b07" }, + { 1060000, "03d5483cfe51be839fa7b1b132a49d9efb70e9dc97dccd7013883d6f681151bb" }, + { 1061000, "c267b0e07d9698b18f8248f03be745474752a691a1ac100724cea1ae48e303da" }, + { 1062000, "bf71d5ddab000042e17e85edbfea9b3b84a027a928093a9df73cc8787809cd5d" }, + { 1063000, "9dd896bab71970444cbb93daadf4bd0a31bc444106bcc4e56fcce5f4cb2e7846" }, + { 1064000, "32c022246463b6d9038b42550bfd34fad56850db0b3d0152ca4fb74274665108" }, + { 1065000, "3709946594144b17a26fb697c2b6de949fbef934352324238c58f9848e9a00ac" }, + { 1066000, "711759b853622a4433b5ce2bd04f25ee33bb57b884d9164fdd7ecfd0a74ac0fd" }, + { 1067000, "f878558fd4316462b6cc94794abeb292a65676f3892e7150490e9506096fd2ca" }, + { 1068000, "6d676432e0849e8eb0a6f5a26db7a96aa0969badaab0715a2cb82f0de7fcc934" }, + { 1069000, "ed63c9723398dac01372d67608ce091e0b9fc9add62d8e795bca7a6d05592a8d" }, + { 1070000, "d89062eb495f87fa276fce07e9cba469a8a23c86213c54217997a9279d749c66" }, + { 1071000, "1a0e256e0f6624fc31dbf5c48262fb7a161bbddc80efa492c794779e02a799d6" }, + { 1072000, "15d88eec528355d088a7119a0557a1445a4d9289e14fc5e53f95e7986c016a6c" }, + { 1073000, "6ebadf3a854801bab84efb43f2630db232be9b1ef20379df0fd0effc05bf5127" }, + { 1074000, "f69501bad5de736f42cf69a62ae6f9ad826852a5523da06c6b5738cf7983c035" }, + { 1075000, "a4d5ff592bb9ed2fad5df26daf81b10b1af3f609e3cf8ef22421996f42f9d445" }, + { 1076000, "1c6e045c5cb6d851c3258e5bcf19083fefc680c8cef48cd278af20b175674e4b" }, + { 1077000, "669a2c8c394960860c6389e7d49532b7ec7e683b06329793194462d0aa413abb" }, + { 1078000, "ed6b0711a10eb6838df407226453148a5c7e6ba4531b3da59adb1b8377be6a5c" }, + { 1079000, "deb48efae8671c48c46a07326ad85b75ab54bb49b6ed912a5e2c34320c4238b7" }, + { 1080000, "edb3bca271fad3c4a1ddb565284e0f422aa1e5b85966346e54bd5fba687edc1c" }, + { 1081000, "f3b3f3641a7ad11417d7e1f1891f95a3b0f0968c76c504ebc015179e6a53f343" }, + { 1082000, "6f601d63bfc74714a33a0f989923aa05f9c6d32284a4816088b1c423f3a72823" }, + { 1083000, "c71c32500d6b2d01682feab1368e671474d4078741db43dafa8b33534ce36989" }, + { 1084000, "b5888ebe08fa6f5949dc852336371bce5d031a957fe65bac267ad0ef9430dc5f" }, + { 1085000, "ad0ed802602bfa9af9ac8b078f2d8d04e014d0239a76f34f15825fabc4d7cbf1" }, + { 1086000, "edfb1329572fee9b090a59f6f2b1babef52a86b09de233d1b05dc2abbaf3ae99" }, + { 1087000, "c189119a7c38de1156c187194c7b053e1900b0839036ad64b58cd4ba1f9b7120" }, + { 1088000, "2925fd72851fd17160fb023a1167f6c3d8301c712acd6f4626dbf47a4748e8dd" }, + { 1089000, "eec5d98835b2c9b5f2de2e0d7a9f11d741af1493b95d11f4c5c447fba681e940" }, + { 1090000, "825f3eaca88356d6f4e0cb7b631216fa446a3cecb0b451939839f6ee1638f633" }, + { 1091000, "501427cf66d51cf5ff3e2b9fd03a78470a6ec971079941e4256cbd5ba5cd7eb4" }, + { 1092000, "5e85c1fcbd8eaa316870bb8f4b7faaae95654b20949b96eb1c62ede1444cbaab" }, + { 1093000, "cc5f3ea06a8382afa25dd06e77a3ed95beb041808d253facba5b08697ee0bc7d" }, + { 1094000, "4006fe030aad40a438ad8954e439941e2e5d473fe5bc2ff9bfb62edf369a83f1" }, + { 1095000, "948373c37e32b54f021bd7bde8f82c42ce12f0b3b61df8cf62451a4f0df3e493" }, + { 1096000, "e27e297f5837ecf7a93a62373dc6d3eeb2512df69412ef6f7e33abf097c0ab62" }, + { 1097000, "e440337fec18737d63fa4d91d1d4453701488b05b67876df95d8a67e03b6780e" }, + { 1098000, "3a1e2e66a24cebc02155aa8cb691283918a00b171e6c2dea0ab7f65d316d0600" }, + { 1099000, "4aae8dfdb0c1ac9f86b43b9337601cf8344e287cbd471af1097b45f4bc8473ea" }, + { 1100000, "fdd95f56fcb7f3686ef4c6b3f77f58b8710bef58de74c1b42ea9b7d5483a32e1" }, + { 1101000, "3f9bff2fd4e4edeadc653392463cead672694a72025f65604d18717fcd9d034e" }, + { 1102000, "2fb0b239343e3f089d0618986887bbd5feb599521288b14a52eff867f4493ea3" }, + { 1103000, "066a980cadb19024b3bad108e045d211b9a878f9ff4fd84c580b958480e534bf" }, + { 1104000, "8aedd5efc641e03be48c14afa73696b8027daafa349703d31cb21aad21cab199" }, + { 1105000, "ab793572d974e5940c0d1eee71a33b8d40e3855eaf86b8abbaeeeba50797e3de" }, + { 1106000, "893cd44d5566c8507132ea40cdc98c79ba41727b7feb343f5fd4e4b99bd2fdf2" }, + { 1107000, "73de9c6d0ef3f93ae8d56915f1de8c513ea1508acb2c88adbd42ee40f0049116" }, + { 1108000, "5b3d3d75fa490a9c927d644ebf1665ef4fb63376fe7adaf3f1420716ef443908" }, + { 1109000, "6a811537ab39b0a73acaf2a1ee34f41745c259284324ca54b16a417a5b98adc0" }, + { 1110000, "dd49bb37dff2aeea04fe672e020a61ccf2dd357bb50ca236e15c87f69abcaba9" }, + { 1111000, "1cb5731efaea9c1e9be8d07cee8ffa0b3cb4249da75df0721dfce08f8ceb0dc6" }, + { 1112000, "577100792ef97543108e77e40893131134e08c1ce914500238f36bcfe6c0644a" }, + { 1113000, "249ed1383d823dd671eb1ddd912de41d620e1cbf5770aedbdee7ebc6f7ea1d34" }, + { 1114000, "f94aa296bf166595e5e731df71d8e508bb3ec2796d45b576acc1aa93ed223c93" }, + { 1115000, "a8a00920a1e30ae8e359b0f933ddb19506fe76405016c609830fd0932c61fc3b" }, + { 1116000, "1d595a0c3b67ff996a6e1bf8444826af7b7796ef9a8fde1860929e98558d8e84" }, + { 1117000, "384201791ab8cf1858856153d71d0a5348b0b2cdfcb4506f747130709e476156" }, + { 1118000, "c48d237641c5d74620735ea715b75229f88d1c14b94cb7c226552c497dc49e59" }, + { 1119000, "43d2f819dbac7a4fb663800eb98c4a6a128048ce4ab9e87b8932662b74b6554f" }, + { 1120000, "9da1bef03f9acb2f9b4669267387711d1302ab2e709d1b1de71baea8e93c46cd" }, + { 1121000, "cae707f607283090c6649d74d6a43e52a1272ee3d71a274d330d08a53c0646e8" }, + { 1122000, "4d8dee90b862e78a95252c76245d6146505025429ee73e488f7e6bf7097e0160" }, + { 1123000, "e258edb03f064364c8cd5f6909aecc654a5b02596f0d1f0e9559939bd2f394c0" }, + { 1124000, "43d6ba6eea008cd4f0c316343dcbaf331bcfaac340bd790e2487ea416151d88c" }, + { 1125000, "8c32a6ac22b35466cc65827f86a8eb358940ea8b781e0c0f78ebde49faf86b33" }, + { 1126000, "2ebf2f53cc461811404ee4543f5062cf26a6a3eee5e42c3d5f337ab6e40a042c" }, + { 1127000, "856c16d56e5e3e08ba7ac2a5dd1430386bbdc6084b4023c61c5a15ec8b9c5c36" }, + { 1128000, "ed8ed9a31c5c0c2f92aaab1228f86ae18be374a1e47ba127241164da098a05fd" }, + { 1129000, "004875dd3104209f52000a7a61775c2c94ab7ba63f12367bc4fd9df3643da32c" }, + { 1130000, "bf5f6644df4c5ec98d6b8aac52aa0856fb2d6daab06da7b160723dbd8c55200d" }, + { 1131000, "1d09500b43d1a10934a3937602fe35319008bb9d5350cfe6e856aaf7dbd7afc0" }, + { 1132000, "928db4fa5f7f44d8bb2c991dd470e9ea9b694720ec0706911ea30ed8cbd17bb4" }, + { 1133000, "4dbe4821b38fe70cdd76aa406859696d1ea81369e3f3f9ad900bb3044af43468" }, + { 1134000, "80a8c66e121852b0452cb18b4a0a832b5eb951299b91df360e6f524e352a267e" }, + { 1135000, "cc042ca322db43449e7826d66e98b496c5ecfeac51fadbd02bc7bdd6b874d858" }, + { 1136000, "fa526e25239ee09c2f38c5eec6660f3d1f97ad270b16d2e6236b5e970df41d27" }, + { 1137000, "547c4691ee41ceb00e9418704bfa249bccd9356621b38ec3135fcfe604dc0d07" }, + { 1138000, "604e3928a56acfb7752f728422461dc03844ab557d0a85e93d2fae11dc874add" }, + { 1139000, "cc818ddff286387c0a4d911488b22cb4dea6c73a42839bd1e2db760816438da3" }, + { 1140000, "9e15884ba513530448253fa27c85304cfa97b61f0719ad821abad07bd4be6468" }, + { 1141000, "e3b2686343d1ff24f2c546161407547e20008cf087677db745c270811c4bf331" }, + { 1142000, "82eca719a4cefa853d24ffb33ac9222c9876e2bfeb501fd3e62e3d572676dc4c" }, + { 1143000, "b3ec53a89b5c97c57d6c9c06448ed62145bbdb329da3049bf714a0dd371068d9" }, + { 1144000, "5678fa841ef4fc0cafee9e5b63a610af7bdd5c6461fd5171c0b7a0ef76ed0cd4" }, + { 1145000, "501c4e96c71c5fbbbb51a3cb999e59a2d9997efb463d71061f18366e1c56fed7" }, + { 1146000, "ebfddf010e9f66e5fd17f21076cbee71b71a0d61285d9161a1bbd804c95f7d67" }, + { 1147000, "98b4be6fbd3f3b29db58b72dc3de6cfaf2959c3f9668ddb59201db0c20e5a545" }, + { 1148000, "93d192a33e438f66536b01e650ae76e7f4f4fbb47c28999f21cda32f7d909859" }, + { 1149000, "7d367c678e6189527441c41411044c587c9165e6f78c09303f0039daaf26ce63" }, + { 1150000, "3dfaf9c4a6c8c3095b8889c65062d35543d069471ab7e64a47ffa83fca26bf58" }, + { 1151000, "a7800a6e6557c0be07a24d927f80afb04b667dad4adce0e51de52cb119e9220d" }, + { 1152000, "8412eaa71b89e4af55e50df54ae08734ec98e1252be43636320ddbd23f532b5c" }, + { 1153000, "1a65a8efbf72f8838eaec8c733bff6b89dff7e5a4c5c93d6db8f1cd9309c529e" }, + { 1154000, "8995494bd104d9979ff22a2a1f91c871d6d686ef4cc5ffdb5367b0ad593ba481" }, + { 1155000, "ca61d77bd2d193bb695d9f261c697607ef4c4d3b7a97fe9423142ab484f48b29" }, + { 1156000, "ad3406a57107eb85d5f0df361ff793adda8e03845a1e8ccf429246f7e02b7686" }, + { 1157000, "c3c7c675dbe992c16b43c9366cd460521cada70041c455f9c192f8b5b1f273ac" }, + { 1158000, "3b935604b78b6c9b9c5d554f28e406752e950f0cbc3b066b0ef13bb002b8d084" }, + { 1159000, "55d4410800b7feb1e2414596839501e771c3b4e1b7a64a10388f8c836d989f15" }, + { 1160000, "882fe4bd4373bdb0cd7b43d49de52b5b8db937aba4b3e28928d4295047f1eed4" }, + { 1161000, "e0800c6f6a3bc19df5c9bd3c4413d13a7040b085c28f9347d4523f2b6370137d" }, + { 1162000, "286d27b74c8329149e722d1b58e443290afbf454cc73971a3b9bd63104a92076" }, + { 1163000, "b65e43ebed3499fdbc951ae6fc17abbf322bb7ff57cd3e3bbfc4eae3704e452f" }, + { 1164000, "183e82b6803ba35c7f4596dbc5844cb62f1b89d4a91c499396c1aeecb350c49c" }, + { 1165000, "0044b2bbda3f1c71b11739cbadbb2804e17559012545a842347062eefbc10e9d" }, + { 1166000, "ec40f2beb67060756422b440f6cfbeeab1f497d6e043841d6613cf14e4b4926c" }, + { 1167000, "dc45fd4d5b7196477d64436de26129eb65040ddf3c8a3f476dec0bd8f66a8baa" }, + { 1168000, "578794f9f8e9863a461e1a04f9dbdac13da8cdf9ff3e6538c139290a66b90312" }, + { 1169000, "ce8fd02c86a55044a14b5ea55d0f107f972c0373e630d039251f87a3a6e68dde" }, + { 1170000, "9893b8320a81522861ac4c7d800af4af915699a7618c1318e6b675fa46001040" }, + { 1171000, "b67254489bf4f1023a34b3bcd86284c78b04906d3a86552f1256ceac8429ebd7" }, + { 1172000, "1a48d677cb347718b3b0f5fce020ea7652572f1dc5bf0cec42a6805c248b58b0" }, + { 1173000, "e1428da3311f38e801986a39a9f32e5a3378f9736a5c213ee5cec5f9af77358c" }, + { 1174000, "45ba0c3676cbfd11d331e713c9fe4735fd01cd7f277cfacc40f496a319aa4a19" }, + { 1175000, "23ad3ead4ffc11613892a82193c94267a4411621da8088662be8e1e49e99ea95" }, + { 1176000, "26b133c2dabf4f829a393d88f860ea2a862ca274370dbf7fe2db5910a46392e6" }, + { 1177000, "302dde247f1e656bfb1c77fdb029567fdec7ad58fa646e59b92aa89db67c0f91" }, + { 1178000, "e191828859c030e1b07291bf74669361bb99a7d970ffe22b39346f42f7708e3f" }, + { 1179000, "f844c926d22e3a4aca3c595df092d7db8f5a030db32beee28e88195360611395" }, + { 1180000, "5d21d7ae3f446c4cc10b5b6fdd553178c1834cf12b9d5055245de65cc0eec3b6" }, + { 1181000, "bb7f349e3edb1b287d2f75b37c9f0d9bb44eb0379611683cd0465f8a7fca3bc9" }, + { 1182000, "fad6c4e61c8ed53966d265ca8df10bf4683907e5b4c23f456f868fd1ccfc83cd" }, + { 1183000, "67be0d8a814af615b53623fe506c4e6a1f7f67731087414d01385962bfb7556a" }, + { 1184000, "6499d31a6d8ffa972efb0d116af8ffa5b63314562e59cc24cd1a37151fb3a6c8" }, + { 1185000, "8a129ba3140c75cf6d057e0785327517efcd5a9cbdb16b6183c1cfb064a8aecc" }, + { 1186000, "8f09a4ccccebbc58a762785d2bf0ebb19f6bae879613b0fa4f375870ffb0f439" }, + { 1187000, "ab110ef36b36fa8fd8fbf200937446ca5f5f8d2cce8d6e28a8e23abafa45499a" }, + { 1188000, "d835e73fd89cb34be412b76663067df1c8274c6105ce7204149041f56fc155d0" }, + { 1189000, "2620c6014359323b1bdb419433702cc96ed5846de632cac3a665b4740e43c595" }, + { 1190000, "fb21810174d545dfb933d5be0d8dd74910642e38a31a096d0defa78b8205f899" }, + { 1191000, "4180a3d33eb5e288dcb8887885923c8f0ef2bdb89702e2168e8a93791da1dfeb" }, + { 1192000, "6cf5311c3994ee4cae34e03012359868b328c0d79d69bd846f925bdc354e5ba7" }, + { 1193000, "dd44cb5743c5789d6828bd7d298c68a0b5f4bd0c7514a9b2fecf518556d6d23d" }, + { 1194000, "f3143942fa81a2fc6bc60a3df671b480ca61f8b197a15c10da51f0b49214a31d" }, + { 1195000, "2ddd3bedc6eeec8af20c734e6c389949e7cbc2fa9c56b626f0fcffdec48900ed" }, + { 1196000, "c2118afecef2947216cd8de04e41fd413d5e78267126a30b22e1722503fb82e2" }, + { 1197000, "dc2abe3701d71c61ae53fee4293a384bd196d831a27288fa86f530da30b59a96" }, + { 1198000, "8372f309455b027f3231d48cfecc25066b1b930710be95a96129725267a28af7" }, + { 1199000, "419cf4f7b3d1dd17e9f277de9f257fe9f4a85c43055a63c07650c4d82c74976b" }, + { 1200000, "df186174b3ecb38a32a7eab321db821c3c09b9b95e299868b97379973632c1a9" }, + { 1201000, "2a145ad77fc8ddd2deb99b82e6e30cb99ea9ddc4171219b82443d0dccff27e19" }, + { 1202000, "dba1c08a042e026c22d45146428988cd68debb5af60d90c6b03ccd4929e8691c" }, + { 1203000, "be8781502272c5676a89456c90f89dca0c86b318fdbe07c0e6bf4a235651360c" }, + { 1204000, "fcb8ab6671a1604176e53cf90c3c01a4249cf4b7345b06a1eb050bd6d9d33e49" }, + { 1205000, "2105814d416391f2251f8958e75290b82f0dc16208904311d0bd0dcd702992ad" }, + { 1206000, "83e13fa7b125c2ba982ea351f4b8ac80088f14043322b02aa22de70582d59052" }, + { 1207000, "0765d476466c9cbeaccc828e9f94a17dbcea07e647b6fcbf929df23d9635edb6" }, + { 1208000, "e9c48fc390b2f437cfbe3b4f385a8c03006eeb73681269a0493e149e3c244064" }, + { 1209000, "57030e06de915b3327839d7d8cf7d8a2a40b92d8a20a76876d5c94b07ff208b0" }, + { 1210000, "821326ad5df39d0fc28f617bb7f6b9835cf496289879e117a5733cb5f7ca3248" }, + { 1211000, "f765fc24b827360fc35ec3ee3edc1691ffd752c19bbeeb66a18d6f04b90bbccd" }, + { 1212000, "9807eef59c5b38366e04a83a3b6f92eeabccc91e1421b9db87bc01eae197535b" }, + { 1213000, "9e031db9eb75a910dad2dde297005fd89e31326a737d49232aad03243253d28b" }, + { 1214000, "30b9ef8ad8be57266fd2d982a5f24a1c9d987550831e678044d168b8fbf8c6d7" }, + { 1215000, "6b8e616b74fdf5d3d5cc70c215206f35d73bc8987f03660a36db3be8c3cba461" }, + { 1216000, "026f2d5cca27e2eb5ef6e717e54b2f1468fde6648af3b910a54e4326d8f60f3d" }, + { 1217000, "fb004f7164a7d70751b35dbea2f546f097e7ae7c6bb8ec99506f2d3f3a4375e8" }, + { 1218000, "3f2eb8835b36538f5a5a4e782c6a0f661c0d63407bc949b02f85afbbf6545eee" }, + { 1219000, "9c25fa1706b3cf579ee2596491abcb358fe888123fcc8664a89d4ec1e57bc7fd" }, + { 1220000, "ca8952b36d09765ced6d6126e7baa42f6ffd7f4e0219de6ea8768b71392384c9" }, + { 1221000, "9d30ed1c78ad4846919f8004abf81017d9c74645d8af7f91822ac049e4dc274d" }, + { 1222000, "5f9570419cc57d6c5ce339b7b37c563f6d1ec7952e9b2a00b4a3f725eb749474" }, + { 1223000, "4aa16f6202964f9db025e003d54e15e7596656f71fd361e8e281359aacf4dece" }, + { 1224000, "216b810253c5e850292b16e25097f494b364cc3134a7bb12b70e7ebb08872bcc" }, + { 1225000, "fbf3d04584809878580120ffafd76637d148dae3c16e3f351f5270dedd4f7fe9" }, + { 1226000, "6812ea26946762d386a724cb3be0f9bb8bea59b212ba31b10640e9a23b71a096" }, + { 1227000, "adfaeb458fbdc6d01d36d455aa66c1c7cd0f23644dd9bcd1233b0058713dd489" }, + { 1228000, "d3738ed4aeb322f153c53926b86286079a2a7075672bcd0524d6292b0f7641c4" }, + { 1229000, "6269cf72ccb5dfe5a575c553bb050b05098259fef2556df976a4ed38263dd13d" }, + { 1230000, "c9bdce8d1ad69b04e9148c4d63a39b3ee5ff313c9a09bd039ae8df6e16548a99" }, + { 1231000, "5115c8a6622e8d672895a10c909a8d0f23e4f2478095c89038c2a8d5226c1eb1" }, + { 1232000, "17456a6ce73265c634ffb1a7944d23ca1e278e253be81cb1ad9febc6e71ac654" }, + { 1233000, "7b422634c424ed5ac449ba43d009cd8d9a7c6f652ebbe30beb139e4d04d3a3b0" }, + { 1234000, "05a28614d8f8c5016ce3a02221cf12f1170566b07a41323d5d23b066e1b840dc" }, + { 1235000, "3cfdc68a96525a0ca3ed6c1ba4bf1a708c598d9f596ca1f914f76857480339a7" }, + { 1236000, "4b7fcef514079816aae64ee6baf0bc9f6e0aa47779505ef763c161ea3849e2ed" }, + { 1237000, "80b7f844feee6379432c0e4835dc2dc0bf79f2946129178e3aa90e90a6f3ba0a" }, + { 1238000, "a8384a9daf85d380814be9f251bec362646b42a96eed42dc59eccc0e409999b7" }, + { 1239000, "5ae3f40b33b3b524b6a1bda8db518060d59766f8e58188e0377778d888e940f0" }, + { 1240000, "c17a198622a6959260661b8f05acea215d445f6195916b78fe36233fd5539c63" }, + { 1241000, "a9fb56b102047127c431a355ea24f4210c268ac758fff5a2a3e8bc566cb087a4" }, + { 1242000, "5231d8a470d9ac3410ce24656047606e65c996162c9365b5befe2003228c0ce0" }, + { 1243000, "0c0376f022b483a36e5391b3b5ad5003d9cb7f1845f33161ebc2615c5d7fe58f" }, + { 1244000, "b226f47e2a52f8a52d8f66c5dbbff54df34c2474fb653dae3742f35fbb0fbc95" }, + { 1245000, "623f965a667c8fb0b4095b1810ab7e153d8cad2b559f9b2e4830176158175305" }, + { 1246000, "d6f4e291648053f55be0e4648bb944864a4110047c71a0efa47af5c06b468e2a" }, + { 1247000, "9a5e9d3d6edd0316a11496a5d0f2921d39797c64fe815910037c3fa41c2f705a" }, + { 1248000, "8253c7b37de8e067481db34a1d1ea2e2214e55654de12175f3ac94812b0b3511" }, + { 1249000, "8105ddb9c66a777de9fea274b026cb50b1dd27023fc49f315495c685746a67f7" }, + { 1250000, "750b6a3ab3f7c839a84705bedebd208ebad3362a4882ba12e0a2e673d40303aa" }, + { 1251000, "7893c2a09dec0dd73f397a7fdf2875554bdae4c696e17fdeea23b0c9dc82677c" }, + { 1252000, "54b03487bcaf1156e3fb026b30bd792215372e0c00ad9aa6cbe42ba6928ec4b1" }, + { 1253000, "c0e63f21eda478bcd239ea6b20bbdcaa5527d775c675a465e31c739693a24b2c" }, + { 1254000, "d24a0b669cebc8d9e967c60a61e2af3796fd4deb99a89bf93d2fd28791fe0e04" }, + { 1255000, "ba8d02757953c0034a99f55dbc21e1b89c839f434894a802ae1bff573f7e8363" }, + { 1256000, "6d9e4559f3a6148bd398f70f244337b8ed1c5564a0295cecb239aa819fb9769f" }, + { 1257000, "65530bc83464635ea06424f3b9ea142a0cd40a7e4dd926d45f1347bb3579f45f" }, + { 1258000, "87c0f921e0c0a79f27da012d439b29c4db41baa65efdacb72eb94c63997e2c0a" }, + { 1259000, "a50b8de6b1aa5f383871cf00b749520534befec34ab2eadd0b2d7ec08d0eba6a" }, + { 1260000, "6740c0253b56ffc27509ba3925e88e1e248e53fc48ace3a692ae28b50a837f69" }, + { 1261000, "0043acb16b96a46021dd812c3f2b3d913873f41e18f76844eba6ce952ff927d8" }, + { 1262000, "6117ea981f8b15fe0f7e535dceb94200138cd5b4c287ba95b2296078dd9036f7" }, + { 1263000, "93214be5fd76a4dbcad950f3c2b30e65a80b11a43221879624d7f4c414db9883" }, + { 1264000, "d5bdd602b61bac26b6f6fe8b04c2ec1f5d7074d44f9ec218049c0f81bff52aa2" }, + { 1265000, "b5a4c0710cec4f0b3f6eec825aa341a4d5499c30627b7edae447bb7350f96b4b" }, + { 1266000, "d5cb9b3d1ca815175b2a3b64f4358e45fe6f1ce1a7f9714658ed24c08232348e" }, + { 1267000, "0c995c65eeeeec7f0f18d9ac20a14e84120a042f51a12edd5b1d4c9be8ca45b8" }, + { 1268000, "01ff6ab8351b0d392ce6173ab250e63170c962bb024c115a8e4259d55073f4ac" }, + { 1269000, "60e0d7c20a84956f4705a01ad49f152a72fcb883fadf0eaa1068a49a5fbdd098" }, + { 1270000, "affedc6c613c932bdc4629a3d1347b8419c8a14a0aa61964a15885cb366f464d" }, + { 1271000, "c02c3680c4bc9568715ba0766385c123136a8f5e8d3b8f2155c9a7041ba826cb" }, + { 1272000, "89557bf31e4c36aff118d6942c90c56b8d592b5526d5838e89417643c195bbff" }, + { 1273000, "273a510e88787c0aff0b1007c6a89330eda416e85f825b6a6c9c7fabd7aed15c" }, + { 1274000, "e162e0e097073f802f171ae6c0549e892eb6f8d9939981a1e8c9bebc2505d1ff" }, + { 1275000, "dcf2888ba663564f24c26c3c7173027dd17468c537b6580f9b4aff31b37bbd3a" }, + { 1276000, "5b3ff5b2991c8e32b8b1b799a96afdffe280f9f9d22fbcf6135f7e05802cb7c0" }, + { 1277000, "742958d80d9701e48d5afe2c9b7db9d076476c929238f3d71b84cb321327a535" }, + { 1278000, "e3c25b144d64e33c4a2f679a596b6af429eedbca98490f12abda5c3c11969521" }, + { 1279000, "c15e44791c5c121d7a6bc0f47f80c6bc1a3d433655553d23c4bd2acf53a4200e" }, + { 1280000, "16879a01476038bd69edc125dd8c9bdfc65d1f2e470e6163b511425b7ed753c1" }, + { 1281000, "16830774e4111703f40f2d3185f4c6fa1ca6dc5df63e30734934ec78c0ba2301" }, + { 1282000, "c52a8e974853b44565e49aec4d516989e3a12f44b588b2fec57fafa449d5c733" }, + { 1283000, "af263414d79e05d938bfccc3ae261ec7a4cd0a685c4c414d7809467e7c213b99" }, + { 1284000, "ee40e3c227a25a3ed7182c6920bc9ba101da3a67bdb5ac27a3d93453a0b45639" }, + { 1285000, "3255786d03a632dad1947318372ec8f18e08ec74015269cdc5b382f38395cfe5" }, + { 1286000, "f047b46dcd35118ef0aff662d22009f121a96840b9dd170f3932ec76c21f394f" }, + { 1287000, "117360deb3a139177022b43000544ddd0066047e04da9c0f3d18b3c2d646141b" }, + { 1288000, "ec6810098a2804f2775a25495866993acdc71aa8d59e4d07e6cc33a72ca543e1" }, + { 1289000, "65cdde847657a7f19f862fa8b3060002daaf297581f8a87c342d39e48c53fc68" }, + { 1290000, "ea621881acc6635210c225d60a4e6e00d88d1a9f37221d8a4c81abc26d056a59" }, + { 1291000, "ee4c1837a9ee3532b75178ce5e980483051da0599cc3de01f7fc6307eb431153" }, + { 1292000, "22e10bfcbc6cb5a54880b673a10c6ef23041093b2c19a0de17396eb610346cdd" }, + { 1293000, "48f1f82fbbdd840b8eab4bab54c0487fb385f531086c1c49873f0072801831ba" }, + { 1294000, "8e0897d5d7254ec11f7490bbfa8bb0ed02f539e1d9c5015bfbf593c291e773c3" }, + { 1295000, "b678a75d63b32c98a3007d992dd86526fa78e28e8dccdb3d277452c69b9b3d8d" }, + { 1296000, "4f59d132d7d49ec8b253d4be2ecd785a447a072602b23bb9c0418b2b61a20e3d" }, + { 1297000, "5523b14389127e76cdba21a82644b3d67dd8f4d31076584af3d2673c899e25bf" }, + { 1298000, "e44313424e89043e8d135f50b4837e8f45968dcd82cce692155dd30ef7b6038a" }, + { 1299000, "73169a049a14bcf7a52d7075eadfc2207bb2f427f7c838291ab5424205007578" }, + { 1300000, "4e4ee4581b585d488a77fddfa21c77b9f97779ee3eea2733516a8cbe8897220e" }, + { 1301000, "d4b2a872e053f19fcde2118b45799d3917250d3d8595875efa359f007b5fbd15" }, + { 1302000, "2a7c03757dbf12bd438413c76d127708436f925fc6d3331e07332b4fc990f806" }, + { 1303000, "d6e31e1f07e3d5ff9f24a0db9494c57cd50a7b6f7ed1d329566f0687cd1f54c8" }, + { 1304000, "7a6670d9481a07d8efc097fa08068d08b29ddbbcfff3c12f44caa718b0b40ad0" }, + { 1305000, "51c4a766548023875c4ccc5e16351a4af4ddab551f6ef67399dd1201f5c59a54" }, + { 1306000, "8ea61192714dbc5d2d63b85beb7ab8374ef72e2ceae6c527892bb54ad809640a" }, + { 1307000, "4a01b8557f957b36d1fd49bbe8ba4054d34dc9f226a056f6d277ec1b745756b7" }, + { 1308000, "01b0b9e8736ab6b83696a1c01189dd2f7b1cafd20eeafa5c8ff4e37073c6ece0" }, + { 1309000, "c1a02fe8e81e872da001a0e7e5700d2d739a89cd1597dcbd2a06081692b87d2a" }, + { 1310000, "00631aeb531a7a4f60ccc3805e140f2bb41d293deb97687d2c1d8795a95e2cda" }, + { 1311000, "c2b7b05a4b623979bdb8977e0f39603fe0446753746e9c7c34bdb3fc1678eaa8" }, + { 1312000, "bca46ec8c7e325a481a4fb055d6526ddb744ed122fbcacf8b614be2bc431233e" }, + { 1313000, "0467cc8f76a72b03e2bed858fb03b757ceed5eb0d6e6e7badd0c1a5cf5f262e6" }, + { 1314000, "7cec84f752a496abc1a31eed45f8f84715c3c492fa1060e3882bfe07d6d32437" }, + { 1315000, "6a2adaa84e47380f98fa16a6e5336068328a6d04d399d2f18d6752edbdc78420" }, + { 1316000, "6b9a28a8c61bb06ad6ce73d207b79f4abc425d9395f2529a4db45d713b13f38b" }, + { 1317000, "cf5f15927f0434c26ac7dddc89a2ff1be775f3cf1a02b35bb1532761094ec21d" }, + { 1318000, "37aac969ae1e296b3507b2756fae91a5a70b0ac7cac3e5ca0a2ef4be3b92fac6" }, + { 1319000, "79cd350927fc048909678b8d664735e4d44ae9aeba6e5f28cd0c32c73c64528e" }, + { 1320000, "5be4a99382478f3e19795d858668afef82bc1965540a2d40d82edd85ac0e4a6f" }, + { 1321000, "dd610413f42d9325e50e0a5293f1e02c15e5a78b0a1dba5c3db1a3608eccd7e6" }, + { 1322000, "33b3d71867dabab8730f344290ce595bc89cd21bab71cc1f7fac141f12d66668" }, + { 1323000, "d260cf4dd7235af17a6b23324f959d58969c23cfd746213471186d4ad25bab0c" }, + { 1324000, "0e791e29096e2ad9da9d07831d610f8d8cf9ada3cd624837eac711e1ac36bb6c" }, + { 1325000, "24b1d2f0d6c8d5f5ace2b42b37b16fcc4e33e8a18337329a9e54f9b6149dd389" }, + { 1326000, "e65f9d9a01b6c5ebd57e837975f89ccfa09b7b79f76919c0f8830f2cfb669e65" }, + { 1327000, "10ddbae17e8ec6cb718ed9a4da6746f46525976098a6b3de5ddcbd0e325ae165" }, + { 1328000, "5f07ba1570a84436694233492e8819da95bf52a60d9fb35ba0c6cae090605f40" }, + { 1329000, "6176abefae9651604d2fe5b86609a78c93801515572c1c8e6be2c64439688ce1" }, + { 1330000, "f57181c22fe65df41c9efbc65916eedce32e47c1de955d84f1abee22e5a885b2" }, + { 1331000, "be2cfd197078b7374e074a04d03cc37e359715ef26455186b0fde46ec95a42b8" }, + { 1332000, "8bcf55d7c57d3f34dc72aba7128404760b3a8a7a37a9cc43c0efd5549911e8e7" }, + { 1333000, "1a61b094bd1dab1dc0cdd06cc9a85484916a3ee48cac98c7f53814beed553d5f" }, + { 1334000, "064a586041fcd5426c4d770dbb92c6a1c12458c478fb72dd317e21b8542c0f07" }, + { 1335000, "177fa6473f4c86edf5d459d79ec8f9330deb9ff8650ceafeffc61a82fa8cbab1" }, + { 1336000, "8f5bc3bc699de8cd03e18e024bf69667333d666b9e4c8f4ee1d91a9bcc439d57" }, + { 1337000, "dd08fbed87a3599696555fc7a7054cee7aa0eea39d46a70bf1900371682ad35d" }, + { 1338000, "ebd21d00a648e97334e803322a7ffc2d0b4810085c0155a3c259121fc1f62fcd" }, + { 1339000, "568943a2b7a85d3ed75940993e1c839b07c20155f715fbc74e52fa3f9a132001" }, + { 1340000, "37ad07d883a45315c7f44f92fdb813b27d2efcde30d538543685a81c7f4aaca2" }, + { 1341000, "19b3e16a0afbe69cbc02c28e4c48eab1e9e9f05880cfefc1590cd63169061423" }, + { 1342000, "4070b83eece8b4e2be081d87f75021172eed71789fe8b452411e700d45b0de79" }, + { 1343000, "df89e0fd44b812d545093d8afed73fb0f6421d7275bea038d95db0482259ea7b" }, + { 1344000, "c89c2f80168074672a7de252fa6bb02c1a4d518b79dc53a4de0dede7cba7bf06" }, + { 1345000, "9dbdc97565efd315f51dc959821d869598f792758b083b2f77ab269f407a374c" }, + { 1346000, "9021ed7897247bafe90db2b56575e9e6b132d6f7035e9bcb387e2d29b76f6d90" }, + { 1347000, "62bef90f65a9cab8d0f29ca272535f3646deef1f56af2e18c9e45381afb223ee" }, + { 1348000, "c14353453744853fd1cebff63a12b52b4f145254d850a5adbd90c5a0fd7ef3f6" }, + { 1349000, "2550490e34d5bdf028151dd75c6be7fdff1198428ae153e37c93224be93ecb68" }, + { 1350000, "a75578ef2aeb22eea3c78427202dcc778661902453ee31693fa9bf47a1c4c419" }, + { 1351000, "1a90b56c1635ee219e215a9085e40e819ca4654d315cae7bb5e3fe1b64bd0aee" }, + { 1352000, "eba090e5ad2b6ce54818569be457ab70223b82cddcec926d55719fb1e251f44c" }, + { 1353000, "6d7194cf2d529ebd3297a3618e18d3968b21e54f8a27f42641f9d17f03dd6567" }, + { 1354000, "85c839894a02f9f37074c54d940a1a65600fba3c20b7ebeed35c4f40faeaf028" }, + { 1355000, "16bb6bfc57a6a75a45ffc2089af312280d9b6e5ab0a0fcc00c85fe636a965723" }, + { 1356000, "9377df26c865d0c3c1844af35c31c8d2e54792a4a4264aaea2778b854195278c" }, + { 1357000, "14a01a910b60ad873592bd4978f10443f8e9859dcb5f91fa96295e90d5afa35f" }, + { 1358000, "8c0648dcc5d091061e169607be0fbad0f4a8a21e9128fb8a5168d766a16fab43" }, + { 1359000, "be45fce0b9e26106c717fd4a9d71e2f6b0b9d45664b163cc997cfe6ce023e17e" }, + { 1360000, "7253c536df51181c225060d0296e954a3a5753fa0cc16ca67b80c4ff55f3b31c" }, + { 1361000, "1b0c05b3db34140b2e7eb068cb4e87d7fef2c665c196a3adafe60ade749c5333" }, + { 1362000, "c492ef836131196d3ea6f032bf3530628c8d36fe388bb1bda74f3b2aed753b6e" }, + { 1363000, "aaeb6e09b92c1f1d8990b72281b09dd5640a3478f5d03a80f0b42d15239e868e" }, + { 1364000, "ae9b0d35e87f788b9c6b150077c993538e58dcf9b336d16f107068a9f56c2dbe" }, + { 1365000, "811dd06b265fb9766288b73818fec30040c7a06cfdf06813561f06a7eb468ede" }, + { 1366000, "0586b5cad75219158e75c5bd8d4710387a59cd887fc43ee6f2c41d3c6edbbc4b" }, + { 1367000, "bece3881412281fbfe3b96816b1969fc9b226f2a4765f519231a5bb29d29f6d2" }, + { 1368000, "a6cac822367f9d9ade889e781e66540241b06f03229837dbdd3689046d935142" }, + { 1369000, "a8509b7e67bfd3034fa1937a7aaf3ff7f21c15460ad8de4ab8bd479d8d993543" }, + { 1370000, "cbc35ae2acde6c3159ee626b9808b925022776b6a3944791e09b5c9a3cbab010" }, + { 1371000, "e9668378bdadc336a637314b3492cbe82c68d0416bc1a74fd79132bc5b820e5d" }, + { 1372000, "1d9ddc3d60a845b108d607f274369dc1d91316189568ca95b0a36746dfebf448" }, + { 1373000, "2a8404a8ef1fdcc4b89485cdaf04f10457938c291df780133531b6470360d372" }, + { 1374000, "7bf211ea370484559fc11f5eced3193e465ac43b10e8a442a3385a344b824df9" }, + { 1375000, "650f112c2d8913373fd0e8337adb5418a662135d2cabbb197f567d3502d8d9a8" }, + { 1376000, "cf95535c166db3590db7cc6b27833c29a55a9579852f8c2eb4225b28876ae2bc" }, + { 1377000, "a5ec5d13522563a08c4a8e5ccdae14b2fda74910cd254f6f79045fce1313f77f" }, + { 1378000, "81b16e7832bc01bbd14c100c83579eb596ef52ebbc4dfadcddff6cdd7904bfe9" }, + { 1379000, "99839db729acdc96a4711df3900f9c2f09aaff3ec4382e585fa27df7a7095e77" }, + { 1380000, "f6b9ef1d000f0d71f40fe972418a7533f9a6ca14b1f8c9d0ee02dcd4f649f88e" }, + { 1381000, "fb72375f87a25a718a5fa98735df46889c2c5bfee08b5a3123ebca696cb1f524" }, + { 1382000, "e81372ec2a00e87ab7c6a18071e70e5c2541a3e5a982904ac2f4d82a9c10f7fd" }, + { 1383000, "a5dbec9a552eac70e331485a6299c70a60c19936442713c12b4e91fe3095cf3c" }, + { 1384000, "54c837cfa579eafa7944bb2dd08e6520dfa36c1d7b554edfc7450f5c6e4900c5" }, + { 1385000, "ee0120b70ca365c6b4267abd612ba0ab2f6a4d8564ed8a6c47445dec45d07527" }, + { 1386000, "7fa722f1e010ab731c99d4832cc0a96fe4f5fef35fa6e43af2f550dcb479fc5c" }, + { 1387000, "f9f62f8d5ddad69354debcd2465c351bd6be5174dc27efb3f17994fb609c87b2" }, + { 1388000, "2b19d9feebc06a9fac85fe9d4ccda3d1890544d92374ac016ea99fc73d3a0961" }, + { 1389000, "bbeaecba1b8db37f122738533c23983b7a7b12eba0f2145c2624482b279fd1c7" }, + { 1390000, "715867c229f598201296dbc2bf2506095342e6d711811c6f55cbb51b83e8f011" }, + { 1391000, "9e603e216166b74a1ebe769ebe668c33bd4638d3b8a8c1f22fc5a55cd6f73fe5" }, + { 1392000, "f8f04913bdd7ee8f8472977928de0af2a236cfba2921f4392bf712cc8454b10b" }, + { 1393000, "d60b87ede317d58995aacc77df329f009d3b84fbafe5fc6be4190d7e676fdc63" }, + { 1394000, "5eb1886e95549b6c8e325fdc4b6615c46ef2129fb6a88650433c36c309defe09" }, + { 1395000, "2d11fa6c9ca419fe124f649e820d2da9e1c53b2a96d9edc97fff14b0c0574b77" }, + { 1396000, "7f221e354d34ca1f8cbe3d6c690a79b5037588db55ac952990dc403a9f2d2128" }, + { 1397000, "d148e6731841bd5ad70aee244c99c39585c068e84da6b3fb1d2e06b824b3e2ac" }, + { 1398000, "d692325acc80ea8f92913fc43c233823c217457dadf8fcd93692dcde5fb73a14" }, + { 1399000, "15d960162c70569c11bd2414b20f2ca6335a57b5463faf2b14e7ca8f03cf7325" }, + { 1400000, "c5bbdefba706c0c34447d9c490565b40d2b1c675316ff0df339499369f7b900c" }, + { 1401000, "4d4471301789e7a87ff1c4c5a3c3a75e3bce883c5623c4d5eacbd3338e6ff418" }, + { 1402000, "55a29f4ecbe3a556ea580b1563bf3034e04eb4c5277e2a5fb95fabd73d671671" }, + { 1403000, "42d387ef2ab556f213d81fbe9e95a1e3e75f8adbe8fb0d2441a0e92a83681314" }, + { 1404000, "b448342579f5bb2f6133e2e2cb8d3a15d210e8374247219d542dca7734039951" }, + { 1405000, "aed0c622ef9e5ab6c4eea8e3dba818de3d69bafe2fa98fa4f572ebe6aba32514" }, + { 1406000, "cdee3ec89db30618cf51fa480d3212580a81d7f6ac33c66a276e55990da11dc1" }, + { 1407000, "cc453bf16a05645515f360a6879575e35907eaa0a3f04482bc065b4ec364bdbd" }, + { 1408000, "cfd2e7da8d12df882daf9012a47fd2aaa0d927bf4c033887432298176e89f261" }, + { 1409000, "41122160c7729308fa1dd09333d9aacee1d88769526d15227d8ba7176807e735" }, + { 1410000, "5c1ed6852cceb97aa478a022fb6d29b0dbdd05ec4c0b50eb0fd29ffd6d19b218" }, + { 1411000, "008e6c3881d2ffd14cadf931d246c08ee094e959c6d0a5d925e48a4b248a80fc" }, + { 1412000, "df55d308c6e05ead07ceaf96b285da50c8363dfe7c3eeff58e6fef9443ee1d96" }, + { 1413000, "fda81287705d3aa80db7e9a7240cd13e00d96263a90993f4ad9a82236d64591f" }, + { 1414000, "ef13b667b16507285d3e86cc119ce3c1edd8f1ae5e76772532f7f9036c899716" }, + { 1415000, "883365ac310df18b9337b4e57f59d4720a2310822e771aa67cec9ccabc46395d" }, + { 1416000, "8e4c4b0644d3542a9a18af4f4eb785d5d15d15a7ac15d9d369339f8b3d2c760c" }, + { 1417000, "9bf465a3942c7ea2ef6fed3f141df01af0efcb4743244e6bbaa7d821ca77a07c" }, + { 1418000, "fadf44ce0998bc4a2b0247ac0b225f0f8642739946d3292214fa2a14e4b2aff2" }, + { 1419000, "9bbecff2153ceeb0388fe1a903e9eca9efc0f32efaef922f27c0ca208a85f304" }, + { 1420000, "555a6b4f7dafbb6e2ad34011276fdb77238921b5a4eba7e2ce61b2064cae7eb8" }, + { 1421000, "eb762b389446bd4c838fb4513ac255ebe1e5ffec6a80b0eebb8549a896ec8900" }, + { 1422000, "231a9089b335967702880bc7daf0e4adf9346b5d8ee8ef552d5a51f466ab8bbc" }, + { 1423000, "6a2c3e8df9e00385f35b0e6a24b86d80b888573f1db64e005bcc28fa37d8f736" }, + { 1424000, "4a4236334c1861ee97d11a529d1529664c05c57e494dabba06305d9f88b7099f" }, + { 1425000, "2d11783b65337e249214aa806035dd1923bc3d3973b7c7cf88e5bd8d52b7ea1b" }, + { 1426000, "e51cfd7ebce3878a554f5427d2ea4f764e0b2477926ee5b35b471aa1c291e555" }, + { 1427000, "9561c7e7377065181fcca02f94b1e32a6524e39e77903bcf3431666975734e34" }, + { 1428000, "54f64ac78ae9d9421a5482a0b6ec591cf30206d32600eec005a01c19097cf646" }, + { 1429000, "eda7c77630ed2a5599c290df45b53f83059c0688d7456862b859be2fb336deb9" }, + { 1430000, "878328c9586d4bfcfea66372f7f80f711e39c069d5737b3d45bd9345d6d287a5" }, + { 1431000, "f1437f0613f5b796b696e061a8a4acf1f3166ae20adeff943d7c41c13652d58e" }, + { 1432000, "12e270e78c35ee46b8a47526c03d7cdf2c77e2956a1ec9b5447804902779da81" }, + { 1433000, "f786cf7a58118ee99102ebdc5990f0f20a8522cd2dfaeaa2f5d2c8883736102d" }, + { 1434000, "8d4520d87d76b3910698a4618886a2c5f6ba2db7ca56bcfb5870075b0c0c2ee5" }, + { 1435000, "ec120e9d45526f73bb8df2df52d3db771d17fe6d74c81f630fd19fde953c9ac6" }, + { 1436000, "00aa9a6c4a70d5ad334e7b9142afbeace8e4cf51b46a518be6d7ed2f9f6b36de" }, + { 1437000, "0d0bbe275980c44809fc95fc7a8a5a4d9774f66ef6cd11a014c0186e08000e7d" }, + { 1438000, "836f96f688b3fbdc3c85e30c2aa2f27e44c38ffa4402b8e6e3ea3b1f62c0cc28" }, + { 1439000, "821aa48b044a7fa32ca09bb9222db630d51cab4d59e61a393b9324720afc1632" }, + { 1440000, "2fe32c357bc938645a5fef5ce96762e31b07f863f5c263fde5ce14797c6b85f3" }, + { 1441000, "09b818bf0be1b474c8881cda27e0d79b497314ff8005f420cedea995f5f4a08e" }, + { 1442000, "1fbf610635be8ac92428548bcf3477121a4b831603e6c606d2dce76351852fdf" }, + { 1443000, "7d90ae6fa7da7e500b764401def5e5136b4931e067b2acd6df57ffc4c792a9a0" }, + { 1444000, "d574f07d5220196edfd28e988e92eb83e30598cd91b71138f5dd30ebf8c5b35c" }, + { 1445000, "7fffe9490f9a3918a4d83269f8010aed55ab648c96d5d83ab90ba759c1e4224e" }, + { 1446000, "60efe25d6c1d25975b2548a85de3e169c373977344054238be7fd6cdb1d69641" }, + { 1447000, "867cdfff28e2699a17563979bb5bcb521b36a4128283a9690a68f67a1d1e641b" }, + { 1448000, "62de815c57521e0c809f0b201a5150fba306ffef3d56eae9d00b28b6aa6807db" }, + { 1449000, "fc24c70ceb7421e42edfb680b1667cb3339b4b015df88284a0b04fd1352dc43c" }, + { 1450000, "a6c9ed7bdd85364fccb76b55b2d1d9267642d8978d910b1407896d9bada0f655" }, + { 1451000, "3f9e87843e86717b9f77aa76d0907708f9e4098811a355952b4f62e19f527f1f" }, + { 1452000, "11f4bb9fa9d639ccec7b30e275a880a9762927e4e91cbbac87a790d923045c9c" }, + { 1453000, "bfd0ebaa224c21fa479edee262c71cc228512d4daa2e191c99b293a67d8c7e5d" }, + { 1454000, "3501d441f85417f77843a64e1ebd2ea68efc0ba62eae12680b0732d5d1f62a05" }, + { 1455000, "796318ff21e08d53ff805c37803eabc949c1622714e7d49c91a9ae7bde78a63b" }, + { 1456000, "5854e4745051327e145f1e10663df3b57a04ed60105da7eff10931992f3b1011" }, + { 1457000, "087f2044d377ef436d8a1fbc2ecf3258b28beeb71a6589eda15bfc57dcc937ba" }, + { 1458000, "bad9d4425d4d016e3fd30ab0d83ff324959c406e27c47dc8dd6cf5b6cb220087" }, + { 1459000, "c25281694d83cf09bfcee2124d5dcfe39e2c7f9ad279d52532fce057609ce55e" }, + { 1460000, "7992932a5603e135464be42e2642adba52710f4f8c14737fde0afdfe5aa5b631" }, + { 1461000, "47cb919a45617de2adab7de8a4299c5387697ecc0f214c26002844af36462eb1" }, + { 1462000, "f200197bbfb5881964330c4caa833fa18142479e2f3023b11aed7ba6b6ba28ed" }, + { 1463000, "a4d125b24657cab7317405693b8258375ffe2d438647e1845691584566ae4474" }, + { 1464000, "2e1a8824f4e89f88c0cb2dc14a990bda283bd0d0e2d468f1a019eebcdb470d94" }, + { 1465000, "4243babd289b8e9ef2a549c37305d51da125ad2530912f83ff76dda50a2f89c6" }, + { 1466000, "607347af926f8ba25571079196728e56e89eba53357641331c42c8822c3a0b19" }, + { 1467000, "fd8937ae60b6e96589cb9284d82c255aff6579a7c5685019560e5104ba58954b" }, + { 1468000, "fd3ccbf4a0dbeb8f3f2e7e5023ac3ad48d46e3935d84865355615e2ea9b6acde" }, + { 1469000, "57c68017e207b3857d62cea8b2207037a42c958ce67ab0d00b02f32acb40ce4e" }, + { 1470000, "1a8a94876f8ab921602b846c051b121711c2d9d2e257e441b3a11551e5ab4f6b" }, + { 1471000, "237c90ef0484b27f19bdf8ee5e94f7040c0b3be72224ae32c48cd534d224e0b4" }, + { 1472000, "4dbb6b608a59e43b0df2a78ac85f0fe66f21aec87aa5c0ed041e8b6b338ccb77" }, + { 1473000, "77722a8dc6d31e802f52ccf2185efc85ac47ace518e98a7e6b0e917918b8dedd" }, + { 1474000, "c8e5f32d7415710364607d9165d63a252e8b4e5a51a3af72b3255592c3f63cd7" }, + { 1475000, "58d31532c5f5c8f97b6fddff488fbf7bae4f3fc57b6df7380125e888d39f74d9" }, + { 1476000, "4c70e6767a4704a22563996add44189edc14fa8a339bc6cd4007bd73ac74b952" }, + { 1477000, "e49dd987525b06376c8b5267492b381b4b3f7c64942935f81af5a69f9e6bf488" }, + { 1478000, "19cb361aea594472903a5ff39169e61f2afe0d61927864d485e37f32607f196e" }, + { 1479000, "1583f0a3cab694363fce33d673cf180128ca7cbc0b1b1fc82094e1631751b47a" }, + { 1480000, "ca672e9cd23d3023cac4d81d35e798b83c515a5527b375b03942179035c46c50" }, + { 1481000, "821db689d9b65a6c5c5a7f471f8994b63b93e4bcc0963a9ba84dfbcb6d5240af" }, + { 1482000, "441a78cdf7b011616a9baafcb344e2e2f189336b89b10576fe809a9545414cc0" }, + { 1483000, "5e21404592e17da944394001ca5243af2b6dff791377ab17ffc923e14c36b4e2" }, + { 1484000, "7ca5a20a754aa936c38b302976d87af7437f6c20aa391a703c56adefead49cc5" }, + { 1485000, "30a740fc6a78185dad033de75fa81b18f53b764f2fbdf575ad660ad2e8ffa4a7" }, + { 1486000, "388b7edc1e9e35ab3c63d1baa62a0075f0e3d72149dcf86cf8ad73b7d3841ceb" }, + { 1487000, "4e62850bc789348903535ee49039dc27a35efb33d61f2dc3c707653b99ed3d83" }, + { 1488000, "870c571723d9039c82901c2215c951e4181b25b12167f033ac363214caf5bb25" }, + { 1489000, "fc64d2c4d0a3f45e7c048b15ceaf1fb2ae71531feecc444f513781145fe2450b" }, + { 1490000, "a78038b44384bc5efbe2154a78e66b06e02abf49c5c0128f904c3aed6ebca6cc" }, + { 1491000, "3eefd3ebeb2701085bfa556dd0057294864819956448b50671812cee0b5af18e" }, + { 1492000, "fd79441c5d870897c387eb9f70619a054fa4a5e8df0c48936f94471980f28f24" }, + { 1493000, "7697a45b6cd471aa0d845654b06f153aa344cfaa5f3b2f2bdcd05474386f25f0" }, + { 1494000, "13fa0f129ae7d2d0e475a0fb3403db586f51e951f3a0f70b8722e9fa26e94cd7" }, + { 1495000, "f449d92a4c4d4e35a001997fc2768472bbb2612f031d9c81ff17fdf4e3a852da" }, + { 1496000, "16ad7aaf59f2418d8b21794749865d8a59e2a756ab18cafb30a6ccd48b305dc3" }, + { 1497000, "1f381f702baacea49a8c18fe836239800bbe8eca62636a6a002ef32c8476177c" }, + { 1498000, "a7d28112d56d8525f26fa6e919e4c419353551c62a5bf0bf7753941b2fe345fb" }, + { 1499000, "a1f63a9723b82cf9fde4fe8f43b6affe3d0371e2a576b4e42d44547b98d58adf" }, + { 1500000, "3b078229890780a2ae09633866921534c0effbac3a8e20cfc64a0de302b1056c" }, + { 1501000, "45a76e414634a4aa0dac124ce6c96e8b576af95a863de5347fe96e0880aa9921" }, + { 1502000, "c9506b7bd9ec9208f9026fa5d2e65d4b3c542adad4eba39e5059bde4d0216ec5" }, + { 1503000, "a5cbf2f23ae6e5b40ddede1683666569751ffcae69bfdcefd965c3a9613cbfc7" }, + { 1504000, "84fa6a0339110c26042411b3a1db8473225eb9db45994a8b50f1f5812921539d" }, + { 1505000, "567a7759910eeaa569382f040445fbfb2ca344e2121812807e0b639c25890dc0" }, + { 1506000, "8ce9c2438eec0f4dd77c06b6e618efa3056a665814caaea91830fa04a3d01745" }, + { 1507000, "b2a736fbd20020d84d135cee2409a5492acd342085c480cef30bede2a9e79628" }, + { 1508000, "e5f1df0c5d2ec750fc7de94c72b4049e41356aeb436f98565df5badc798c0896" }, + { 1509000, "1c526179b6519007255a565fc8dbf2219e064dae00672de9bb58386fa4ca3c28" }, + { 1510000, "74be9f5c1ad5cf89d992497991dd1ddea4a80ba8c389c9283e27fb22adb73b70" }, + { 1511000, "0984e7280927a7f27e4f208e6ed1d4e8aad9be0a8c12b4b070c8404f4676e375" }, + { 1512000, "f122f795ea8a493b71c1f4aea99a1512eace6e86a3c843c444581f94e9e5df82" }, + { 1513000, "a8b6270d0a1a4ee27a98b0c03fa3b7ee8b101bf3fe460d640ba40eab2a807573" }, + { 1514000, "975b5cd7d04c7cba1d066b6f486a5c6e3b7b2bf2ea8a588de34d8a01d7389857" }, + { 1515000, "eecc57ce9803ed52dcce0ddde40647a1102f17a1bac31d4988d74a2ca04fa43d" }, + { 1516000, "c83d3beff2fc2e302cadd1580cdf1d3fc684421dbd5f77c78e66ec8c6db3b858" }, + { 1517000, "d36bc94baab179f2b2bade02b5a1d57dc86e0c9f0122e0590745161a3a68d367" }, + { 1518000, "aa2c35ab54a29a19f71f59d5cda76eb3320a5e6b22a9b2786de6066570b13e2d" }, + { 1519000, "7501ed65af91690d071fe7cae2ae98153a9533fc4933c3f852fa34f405d09876" }, + { 1520000, "2d63037a4ba7449a5300dd7abfac425037ba6402e4492e0de2d2111ba7042da7" }, + { 1521000, "8fc0e1aafa2f28cb21735c615238b5342d1b117b11206cfb30fa3426a48b97b5" }, + { 1522000, "a8a7887fd5d4d9b40202873e11cf8c63644ab474855231f8fa9c5af05dac4975" }, + { 1523000, "e6e676fadc4450cdacd9b1657da19d3d50e2442ded2dea78e09e2db3feebb35a" }, + { 1524000, "4593144999e83ca2c23d19d7e0aaabd5b0dc2d6210e8302d2f445206dfb371ee" }, + { 1525000, "5614371ea6454554a5eb77c0aa81011195ff4915cf5cbedf746b06246ef53ee6" }, + { 1526000, "e2b7a06c91c096c8b40b5bc617d9c14578e3fe046b89d0e0f9cac04915cdb916" }, + { 1527000, "931a9e43227993cd6ab38ec1e1ce4d3f533242a51eeea1396693a9d10e144871" }, + { 1528000, "d7868fc56743ad872c8aa7e5fbd36dc0a2971439903c77e7d8f5a0503d74f514" }, + { 1529000, "e6994c12574e5c78c55bf55c8ab7836485635dba8b235775093cda1f8df62388" }, + { 1530000, "4c7d5725374a76ec0cd2e9ef1b5ddb68ee209404a968606f414caf49d287673e" }, + { 1531000, "e55795f9ed4c448836081e5b7a39b9169be4fe7a12a0d602a396dcaed5ceb854" }, + { 1532000, "b200fe4f95a3e1f57b1cfbc717cfdf8b83cba50721fe413baf52275aaa67f3f6" }, + { 1533000, "f947ca0613849a00af7d5f74e6830287fce2743f125e1e427509a8ad04dadf4c" }, + { 1534000, "ccf398df16f7bc8c053810843c5e0a50b2070f5f77da1de10a21a0db718377a4" }, + { 1535000, "b4c8a1779d42965fe338d8ecb7454c565e579c2aa580d190940209248bbc4650" }, + { 1536000, "997b7fab711ad4b2b69b68104dbdbdfc0ebdfcce98b71719d29099dea91fc3b2" }, + { 1537000, "e1607a76c3f7bf92c13b172235ea0d1cb57e602a483f4528888b3fe194b9f1c0" }, + { 1538000, "5d554b75b95a4d170f79e4fe5bb1edb6c3bb0d04897d948122628467c8400918" }, + { 1539000, "ed80e2be0ecb14bfaf1362bd80665ea017dfa4867dcc2d23c1892fe040400164" }, + { 1540000, "616a0661b13963fbb2589c70c4dbd8e3f27c8b0e7493425e48cdd9be7a8c2d93" }, + { 1541000, "6b60ee97af0dfd3effd902a7cafbd9e70b030a83e76e7d1b42f9d8facbf9e935" }, + { 1542000, "98e623e8783864cbe8b73016107d2ac7368e762c13c5fe400c5d055a63e76bc3" }, + { 1543000, "4840658cbd2f0afccea693d15f3132f7852b283d19add21d363cb50f7c3de990" }, + { 1544000, "121da7dd8a5252150510cfb5807bbda18ea5f1cc09295457b9cfe19258fd8b67" }, + { 1545000, "d041bd4302f2bd3c9c15a4756ef1bce57dd7d3708f1eeb693dd4a5568622e0ee" }, + { 1546000, "7e23f96a27cd12af1c9fd13331886fc92703662aa34a8619ca37f65d64685c1b" }, + { 1547000, "43802042b6e474b11731133ecebe17c2ede4087241b76c6d3bd6e6ce5089508d" }, + { 1548000, "405eb2cce8339882eea029e5c5b53760baf58747859f3f855d4b77bd2b79a9de" }, + { 1549000, "52d18348fe4aacf4273a1ae8bd2a8b41e94ae80f3c58c2f2dd7a3cb4bbf40649" }, + { 1550000, "651a254443cb26bfccc7ec4229fc32276960028c0cf89909f94f7c8e8004d70a" }, + { 1551000, "4e9b34936eea5e7ced6562a889ada43c14becac46cb6be82dc3969ca8e574557" }, + { 1552000, "321ab80ace7fcfa806e1a973eecefc1c5c654032e26fe00564b69c96c8966c6b" }, + { 1553000, "b46e1173d0278ddfcc8f89a5576d7ac245e7ffb59ea16b9adc6302eb63f33c07" }, + { 1554000, "c0da6c8c54ac5012f0613962ec493ae23a8c7f94578d08b0cc947c171f07f94a" }, + { 1555000, "aa6119dba813e8826da1ae7df2f52de5e06032b2c581bde2a91159213934aeaa" }, + { 1556000, "5fc8c077d61f99e98c46a3d9040f46e0ff9ea385e6daed318f36060d1d8dfdb5" }, + { 1557000, "9d67f4331b80fb04032793c3f0edfdff613e41b104c544a4e97b6ffbab07f6e7" }, + { 1558000, "fb3deffc3cf52a36395506fb069a1cf3bf5cd5970848d0e774296d42a358f55f" }, + { 1559000, "a407ce1732c2447fa534368f63edc06a7fa4b704f8b19051ff160b59a9bfdec2" }, + { 1560000, "02d2255cf679abaa124435fe4413c25a6f8f8967165cf9584527a5c2f0621daf" }, + { 1561000, "587a44e7478bb8d8a83e1c4a0debc146c3592201c7fbd7f52e5ebfe2e0d4303b" }, + { 1562000, "72f1d81cea5e6676079ccf2fa9bc75f59aafce7e9bbcf15662e75059eefe1da9" }, + { 1563000, "9939d6202c636e18889025e3be64b9b2f84980d8684dc08d584ee18d2728132f" }, + { 1564000, "3e5dfe946041d1705b245d848bc0ac6124708b46dcf3cf287fee85e64cfed12a" }, + { 1565000, "4262731b0418e78a533e54773b7520b62c137785bd223d127d841e44ef7c66bb" }, + { 1566000, "480e8f69b37e1ef81bc382594e54803fc343b215858d9c7c905bededeb53c29c" }, + { 1567000, "a84428fc72785e8044489386ba8128617febd7ec0c237f8ed49a6c915e281d1f" }, + { 1568000, "7d9b53dfcb250d7c795a022132fcbd5698202372e22c78385fc2984a32c8e018" }, + { 1569000, "567ff98c646f5f3532a26c3af70626b4c13f4de72bb4214becde5bf4cc9d2c30" }, + { 1570000, "37ecc8782e7b3fb21b883f8961a6c75c61db279be5475ac8e0540a335c75cd2b" }, + { 1571000, "dbe6f476b05ed4367f44ea8fdcfc36c5e4bf44183c026590f21cbb682f028ea6" }, + { 1572000, "64b7a0b28fc4073529439c58b5dc4f9827ac7a0f8766dfc152b54ca9addb04a8" }, + { 1573000, "6f5827f182d92040199db1706a9036caa2ac46cba76278222f52dc719f3051d3" }, + { 1574000, "579fbc209ae3ae711b9adbac028d569f33c8813e0a7293928cac7f30bd97a422" }, + { 1575000, "eb9c52988b766ea0fc8b1d1ebd6b2b35fcd75e83a53b4e66eb5b5ca85fe1b5b6" }, + { 1576000, "5640ea49d0be699410e8eb0cc6d50168439c9ccae5b4ec96446abafb3fab1633" }, + { 1577000, "4986f0433e6ccd1c453104fa3b621c8bf146a99d4100c61e0325ce6f6db0e1ed" }, + { 1578000, "0455821ffca0042c55b7da443ecd316847cf5cb6e5aa41f402a03758daf9df69" }, + { 1579000, "dcfbf728652116a4a0f92be21b2d832b6de63e9a1b9a2ca7a528770b8fa9c571" }, + { 1580000, "bf89ee8f8de38cebb9998cdabfc80c113e9cdaaf0e5163c63b2bff2877bdf5d2" }, + { 1581000, "469b4f41deb08ff1e9aaf67598ca4f0cd877d04969831427b20a9b93d269efc6" }, + { 1582000, "efd14758a90d155c2b24644bbbc6fd04eb800364d4873101289908b299b011b9" }, + { 1583000, "d9535cee77aa64539110e354374fb3587693da6efd19629e274dcd5afba462e1" }, + { 1584000, "e6f937199af56586f01782f0ac574311d656b433972c91dbfd3ea267201ffc76" }, + { 1585000, "3413c241d25b7ebf748e78c4dc5ac35225e30598365187ac0678319c5523a0df" }, + { 1586000, "00237315a9a0c0b764e7c2b5c95900aab04eda3f52a117e21dac2c1c123b1458" }, + { 1587000, "bfc573531e75f2f78ae2f74ff9c273fc6cc5297bceb3ad93034f6b48986af4e9" }, + { 1588000, "422b37a9ac0030b710be2f4bd0322d474a15414d9b3891b9afe30de875c0d57f" }, + { 1589000, "184441687bc69dbf7fd78460352a5ca7ce1d2d9af5499d71d38bc65ccf0267c8" }, + { 1590000, "35a6fd188e472c32090f505532cd7da0a0f3b3a784e3a99dba8bfda32a2866ad" }, + { 1591000, "09c01f6c42af638aa798f45434674f45aba8c76531025b6b4649e953a74b03ed" }, + { 1592000, "e057af872f30586df210d931619747bb0ac847948c875ad6f87497b2417fcf22" }, + { 1593000, "0ccd428d1bb874151de38dfe0201d2edd5a54279ab483b89277218aff071ef70" }, + { 1594000, "7d7fde4cf1bcc083efa9635f381a5cfa5e6dd9c959f9b77f635eee08be68f1cc" }, + { 1595000, "e1e3b888b1338f7b6e9d6b656445b427cf9912471e93b3eb4f59f817b8acd418" }, + { 1596000, "3a0579aca5bc2fc8c2813a74096c5aaf608503010b3dae03f2e0b4ba0f2ee354" }, + { 1597000, "84e16c8197b9cbaf267f30b64eee9af788c45e66cc49d5867296ae2103158482" }, + { 1598000, "aaaf752c3d70083c51e9d041dac6fb4bbfa6243fd3903ca83cc6d14338d5adf4" }, + { 1599000, "67c61fb96cf7f3845b9e6fccf33d913f3153f4e748a8b07558ef4e2659ff6231" }, + { 1600000, "9a45661e35b559aa2e0330e8154fb2ec463699e218092f1f58fa43e8d66f026e" }, + { 1601000, "3eb2dcbd316a326f1a14249df07785ddf248c3120e7f8a157e8fc857fc3b3c51" }, + { 1602000, "7e95953e680ecacf9c2d82f4d37a9a75378a5523ef62903f213da3a75050a786" }, + { 1603000, "e856fa12808267646c272c355afa40917fb22552701d26fced2e63b465d697e8" }, + { 1604000, "02c83acd3b42556433a5233d7c70b76a2c312c8cdfc89c3e8456b95be815271a" }, + { 1605000, "14710fe8566a084e0864a76e92fd42136e407f028e34fe142f8360e9bac42cfd" }, + { 1606000, "afbd681de1470f14178bdb060e557e1101699cea53d2a32d720352fa0415e7c3" }, + { 1607000, "1a0d122e28760b6d1b6948bd534038beb24c3070b942f44845272935a355fa81" }, + { 1608000, "89842368877f4bb0784dadc77cd0b8c8b33453b162fd5b4030d510952c6a7b42" }, + { 1609000, "905f9059be9b3271733426bb274b9bc2591f302a9eedf6127daecd287ae3722b" }, + { 1610000, "a5bb5a9ffe7b4e009c6a6e21731f4c85d54a4867d45711e11d774392c684760c" }, + { 1611000, "eca551ca8e47f7b8f55bc1338deef8b3db0e55dfc746bb8fda0fa524da818bb7" }, + { 1612000, "74163195187562462fe20405362bb19547d72a093fedc20240fdd458c6ec49fa" }, + { 1613000, "dd7af9515f49cdc659dc42c6b7a4ad5d15a7c731f9fcb745f4408cfad17d4787" }, + { 1614000, "45a1f617d5c79d5304400140874e5b3f8a8710e8da29c77a3fe9fc6b3229e96a" }, + { 1615000, "b3b0fe03e57af7ebcacc544f34b6b2ea56276832af7087a9a5fa8a1b7a3fee37" }, + { 1616000, "8e761b1cf3181d6f9a2216c54f06445e59dc12cec99ab7c84a7a38245d485407" }, + { 1617000, "96dd5f7e0b98fd48bb39ae31b1cd123325988dd10743268ee2d125ad705ac00e" }, + { 1618000, "346a87804588b244a452d489bafe2bf085dad5e9b42e243a9a25f0d09e41d3ab" }, + { 1619000, "42f978f44b43df7d693023d18c88f26a507c4b69fb35af25ce68a2278e408047" }, + { 1620000, "5148c07c509a14ca4e1c4510a8cbf48ddf9811a1361e65863eed46664c9b669d" }, + { 1621000, "2c79cccd0ca96f4b3003867ef8a5fe4501d812960d5cece309f990aa9386b655" }, + { 1622000, "95fb21c58bff5c088137da6aeb9a859a43a1a2ca5781d90e85bd5f2b156ad0ba" }, + { 1623000, "43bf893c1c2b4d9a20253ec73a7133cf289d8ef0904d88ca0bc54c7ba7986857" }, + { 1624000, "5ebe1b993eaf2322a068d0ba635db2ca3a5f3efec23bbfb9d0b06debb1bc693a" }, + { 1625000, "c296ea319dd0f81df9c35742ece9853595fbc2a33d16df8a3d756b8e85f3d409" }, + { 1626000, "1b6ec527dc5281fe68e0f4c4d6c3d6ffa08c71eab377b10371e70636d404f00f" }, + { 1627000, "298ce3175604d2753f5e44c9fa3053f0d19da1314081471a6cd2e89b1b4a0cae" }, + { 1628000, "3b3cb17f393f69952aa0a48dedb224b8eae838f7926bf55511c7e6d961fb68a7" }, + { 1629000, "4fec637f3297029e39b6396165aeb62e4dd948d0e66e5f64d88ae260f1fd5771" }, + { 1630000, "7b7447bc265f63449debba34fee237b16e2c8902370396f97dd3e1eb97e668a9" }, + { 1631000, "f2c1f8fda8e36d8ff992abc7341e5ebac47d815a632cef1f37fa412b7010a9bf" }, + { 1632000, "f50e066f2640ff1e7a1e967da5461a593c331dba24daedfc986bb987686060cc" }, + { 1633000, "c27fbfbf0669f198887c2c8b4ddd5acc0de4b225073374639373a3198a80ffd8" }, + { 1634000, "f5fe981a0beb65c133679fa6284e1d8c7af6c04cfcbf3d9c207bc612ef254feb" }, + { 1635000, "a74c536b8b8f1c14c5af10a1cb567259e4ce5233727d593338ebc48eaabf0993" }, + { 1636000, "980a8ecec085ff5aac2c07f21a450cc35d62782f37940e0e0856099a579817a9" }, + { 1637000, "e974ad3258a19a4c4615d4ec86f50dacade0d0d6f6c0427a9cf22de734fdaf66" }, + { 1638000, "13446b8d1f3472e8bc56ec77f6adb93d1dc8854d19ba6034409fbc2e5dee4904" }, + { 1639000, "838fdf3cf7ead2f25e9849aa76681ffc750209c8bc263eb4f8a56484e572024d" }, + { 1640000, "7bc6b0962bfb421423ef1fe0b1b12cfbd13ac42dc27fdaf9f042547b78150799" }, + { 1641000, "a64c97a53dc4465e6ceca562ced384e3773e2816b60973d28310b1af68cd65d7" }, + { 1642000, "90a7907d931a0a2102ad07a5492b9cc1ad9fa3df629636b9477ac00f3564e5ca" }, + { 1643000, "c1d3b87b8e83c42937f76731f98795b92ad4df6aa593182dffa1636826015c9f" }, + { 1644000, "26b0dfeb8382341ad1943d0984d2be5791eee959e7283730855b718c0c010cba" }, + { 1645000, "6e93d52aa9b3951bc7d8dbcc5a77b45cc03cab0839d1e950d255757e36093026" }, + { 1646000, "69e2c917788aa11480029a73a3ff5a24a5a6ff3fd8900784e5f76fc6fb9de9dd" }, + { 1647000, "a3f71994dff114d38b39c18eff366aca9cfb0acaabf5353aec13df6b35f2fcf1" }, + { 1648000, "4e84579002166fd8ef9b051c7804698a9070ff1fdcf5d0e0603a710689c0c7ad" }, + { 1649000, "7b30d6170c82bfe876d11aa65dc13bbb0129b3c82b7462e6d3312c14b889a1e9" }, + { 1650000, "3a79c8e7c0c7bd797cde27a61d093e43f697b2ed754d010f26dd8eb09dc72d2f" }, + { 1651000, "01c9958188b05b2b31751870a3a1caa7c4aeed538fd344bc4346e93736032e54" }, + { 1652000, "e3e9989df38fa2e41e0d88158d9e44076bc982e6c182fc8329636d5a81fca191" }, + { 1653000, "5bb0363db30fa4ae6676690ea9fc6d856654e5156c5a33cbb92e443544210c43" }, + { 1654000, "86ff3de6b7385f8c92ab980a92669fa9be08249c742d3d009c1e24f584113bf7" }, + { 1655000, "bb70e059f7db6f6abc914da96e6f786333f6667f736bd5c08c9e033727aa37c5" }, + { 1656000, "e67ffc581b8bd3b85aa6be02f98b8c313e26a1b9f4219d490d31db6e6ee442e9" }, + { 1657000, "67c26a89be72d5ca522d758e98fecaf9618f3a8f609eb903e1f530a2471d1da9" }, + { 1658000, "ec97b177e235c6b223c30938ba539528678b95bb07713aa5d1c714f3bb29139f" }, + { 1659000, "212d991576c14169eb8db2b39ea10d6b0e4f508fc896f12e7e3d9b81ad72a370" }, + { 1660000, "47e379a9ccb96c759d484d9acf04e6c6928109edecafacb06dc0e041ae5747e1" }, + { 1661000, "13c169665928dd42bafbe5d7522f2099bb780557c8a9bca2314bd631fe20be85" }, + { 1662000, "958633da99cf1339bddaa82283a9b9dfa1d788b6c72423c25785c1248305f5e5" }, + { 1663000, "cbab5ee090382f75ed6d1e5b2e28825cc73d64a455361e4d011c45f3ba0a61aa" }, + { 1664000, "0f7e168b057560dd02502e6bfeab3163fabd9b5a26f302a1946e54a82ec06030" }, + { 1665000, "b2d896c388c7b094b295237366de2d53dff32872febc333af554a509bcf7ba71" }, + { 1666000, "4eb1ba938c0afbef128fc1cdb3551765b245da6b05376e5a23cbe51e5afeeaf9" }, + { 1667000, "e731127e5fe00b4b08d78890cf1e50d88f04bd9061cda7dfe9e732e9c074f3a8" }, + { 1668000, "3e5f6ab3d1f806debdc350866531b016052ecfd2c46c3e8ca48bbcad4c6f3df3" }, + { 1669000, "44d98814c745ef2643e8f6582db7dc4991f2e61ca8148287c45d14b4ff6c3480" }, + { 1670000, "40af79432056385687b429d7d47f0ed9e42bc496698e64ba9408cdb97e2860cf" }, + { 1671000, "14a7e4884af4b0f9f2ff8e2f8e557ede1dcc7f2d93db364bf9eff30ea33d9f75" }, + { 1672000, "85a7fa1f23b95b03e44f22d92e63af5334559ddfdf2eb63310cca72e548456fb" }, + { 1673000, "a03ecd4501f3f5957df91c530b54444cb9ca47029c3e682317b11bda712b063e" }, + { 1674000, "64d1492d51dd7ea9345d8cea052e3dce7e1820d7a5a1ce77fdb7242085f58fd6" }, + { 1675000, "c0d76771c0092007ff90dae3c567799a661216a68adcf9955beb4f4404ec06b3" }, + { 1676000, "77361ce8ad04040387b3cd8e7a74b71fb13285a4f3da374de7cb4d6068372eeb" }, + { 1677000, "9b69591227df86e2b2571c0b5b9b652fab0327b83bbded311fe11dc59b40422f" }, + { 1678000, "b27116f4fd95b5479ff6a0f24b7826541af54c830ef7e1a0e799fd14bade19b4" }, + { 1679000, "24cbcd6870f2671faebf724f8764f318eb21750309184643cca9bac853be30cf" }, + { 1680000, "3aac58f6da568638264068f59dc9856b4bfd7b1219b5b9458cccd74e65199ef6" }, + { 1681000, "49a890170444eec299c9ad462208aacdc62237aacfa644e5bcae62de414f8a81" }, + { 1682000, "a4ee5e6c3f08723d2bd9bedfcb99a12bf0b3a82c68e5c744f762b4204a0c9ce5" }, + { 1683000, "60cd9fd2724eac3ddaa89e8cea6672b7d9a20ff2ab03add41ae6f40afdf1c54a" }, + { 1684000, "50af868fa42181d63400099bf6e1ca5a14debdfee8f6f3efb6f54ab94137fa28" }, + { 1685000, "5c57963127ff137412d8ba97e7ed5198dc08d50e6e19d3d22d0d5789dad1bcdb" }, + { 1686000, "a5533970ac0bcf1d547ac414876118330a155d909c090e788d187b0fb1e6af2f" }, + { 1687000, "9f8ead495f777f1dac5235ad9532271144f92def6937c73873a2c164d6be1a34" }, + { 1688000, "0bf385d62325a58296344ab889be9c15aaf4ae1a83f006fa6da3900a8245eb7a" }, + { 1689000, "826cc89ef9aeaece9ccb53dd44f92132e8501a9a67c98b16fcf02c68f9dae1ab" }, + { 1690000, "5674948567b07548016d3db3a6ddd4383f8d95985fc0c89443b3bbfe874fc959" }, + { 1691000, "7971ed907b97a9f49523a461554a2a739cf73b16e1b2c634216fe884f63f0d04" }, + { 1692000, "cf696b6f80de291d83c82f2e36d98016ae28c82f3ee97a7a265cad95ffb5208e" }, + { 1693000, "0411e0aed75774e8dea7c0d4248d7f5de0c053cdf2075e9b0e104996887148f3" }, + { 1694000, "f855f0f57d32bf2fbe0b56c825d333954cebb8becfbcf970648da742b47c5933" }, + { 1695000, "97ba4be0fa1608cd633486b873bfdac5b0fc72a3efb2fe6ca7e6e03164f1c349" }, + { 1696000, "3024bfae502cc6128783bf518595ff6f3b41f6e48cf935bb3896ce9af7c002c8" }, + { 1697000, "4c4822532c951de854a5ac0d762c4a3559e85f27271cc7ec1d763310edce9684" }, + { 1698000, "c26c6984dfe51f3f583b9255c23adb59e3417f20a2da1ed5b4e7030fabce2c9e" }, + { 1699000, "f627a1a54b68afa3d23cc466df4c114a6e7ea379b3929c1eab88889ac2e86994" }, + { 1700000, "df5af84682500c5fe8f44707cae0ed38daf8f67d8a239abe0157be4191eed4f9" }, + { 1701000, "508fee53808e2e73bb866a5c4ee14d502a4c6688f4d29e71331c19bad1483c03" }, + { 1702000, "bc5b5803f85bae244987ce65ab727d52ce1a4f95adaa0791bb4f5d17f715bf26" }, + { 1703000, "e5db768073cb78bb168fe6b513be0259069c2b02580387e020374e68db370eac" }, + { 1704000, "938caa321eeb2bba55f066e7273daf7af1ca02007cf55b99c5f00600b3985091" }, + { 1705000, "72fc44d72b470386264f6a5c9633e0c0a5d17df039368e98cdf0201e3b6fead7" }, + { 1706000, "7f697b46f9c6793f799aeb620e3e833653227b68876c3339e61a03a0c39c49ab" }, + { 1707000, "9f55fdbcca73236fe629c05a399effa86773bcbc9898521b25882ed7e53fe4ce" }, + { 1708000, "5430b7902c70e43a4bdee02f14a9a8ad1d183ecd7b4d584757e32fd2db8de4c5" }, + { 1709000, "01ab6a9bd77fd9174ba570aaacf609acd5d3d4df526f4074093fd09d34a1996e" }, + { 1710000, "eddf37b7c00ceae24e3740adb4e3199a32d44763a3fdeb10735439dccb59973d" }, + { 1711000, "124fbae062b83fe99dd1848ec9d2ddb2e3db69bb9652163fb9e9adb284dc781a" }, + { 1712000, "7f0980c7bee127907a235819563f0c5131b4e001c955d3a4bc8947de3abf13da" }, + { 1713000, "19302a1b696909c01c49cb92a57acabc8ffb7bbf9760f516b6e9abc58e9f3b63" }, + { 1714000, "e140368db4ea2c5fd4252d1c4430ffd09a919911685f68f46470697405534c1c" }, + { 1715000, "3ab50319cd2a917d2553f4329aba8a0b77829a521508fe70e47ea51a1c818eb2" }, + { 1716000, "e707b0cf97d779e2f331b233042495bd745b22a8b67e9b123c6d34fb37e7ffdc" }, + { 1717000, "9c7014cbfaaa75f4c1bf6c3ed85cb68106d52d89c31c1f3821d9591fbdb20092" }, + { 1718000, "a63ead6047017c3391048c6d6445e7727ba3cadcec6ecdace030bf4ded571073" }, + { 1719000, "7837f4f0fb4f5128990bcddda9f8fca4a32359d4f7f39b973eb177a92acfba0f" }, + { 1720000, "bd5b3cdd7cb1e4d03e62599eacac6d4e5745d21383ba7a98c49445db4e4569be" }, + { 1721000, "bed1f200d36919974320b068e9fec1129f758bec2b1068b7fa02fdbf61562e2b" }, + { 1722000, "2a298acfabb688004f3a23444f5626537dbb942d59be020f2b0257635278b4d1" }, + { 1723000, "056944c88bffbb77eb69bb8782914941f6d12fb6fea17cbb33bdede3428e67fa" }, + { 1724000, "78e9836539323cd1429ac588611aecc90bec1c1a8f63853532fe4659afd18a0e" }, + { 1725000, "fe17de40b424aca5864a471f390c52b6148580fcad1eab62cd79bbac84f2aa5d" }, + { 1726000, "f5d2733f4efb44c38888cec5f84e315c51b9de55c871b0538125b7c2e1464a9e" }, + { 1727000, "859bf3c63f4ed42b2098551ceadc9fe63fa4e0c6214b1fa0467b77cd58755320" }, + { 1728000, "933e3d0bd6537182f2d9474bd8efc86fdb22e711f72234255f5fd05cfd77e028" }, + { 1729000, "9dea971d400780e5471557275e26ba392486d5367573c1513354dfc60a67b57f" }, + { 1730000, "250af199172d41148f2320e42ab0a38833bbcf4919984a4c65ea9c615698ff82" }, + { 1731000, "85c9071b8eca0fb364bf50824d59b52a499741010f60e06beb34c4b1fa18533f" }, + { 1732000, "bf4a6bd4682775dd98c573ebe3c0b8edf9878de9ccda41c768ec9e85fffaeb24" }, + { 1733000, "469238ddffa27afcec00ca23b36085506f345257dd9be2d06cffcb6a007b6b74" }, + { 1734000, "c10ea13eb103a917dc17c84b66b1a10fc0327b2478183edfa3645c0aaf238c32" }, + { 1735000, "d34c0606f18644a8208e97341674ecfb0c5f3d5a242f6afdb0eccd2c8c098019" }, + { 1736000, "af77d597fec0b96a3ea2e616116f5ec7b0bc8b1a56e89668e994ad676192e527" }, + { 1737000, "c6a869ec9cb73ce96ee1620b1803516b466d47cde5ef78edac8b8ec595cc171f" }, + { 1738000, "3b69b8a388ad69c84f3e345199440024996bbfe00a59b933f81959b6724576f0" }, + { 1739000, "b64af79e91f8f6a5967f1bfc1ec567dad1e24d38b89ea20a9fbc1b3e8ee9c4b8" }, + { 1740000, "1e78856c1f5a775fdace5e6b331005011e309825a44043738512be9f39a45320" }, + { 1741000, "817d330a7bfd7dce9fe38f5d8806a8b5c5ad4bfc5c977722ea4653c13fb0d281" }, + { 1742000, "adf32030b702a9705e864471ad59983210df4288db92e5c24fc4885b4ba2284f" }, + { 1743000, "e1257e0ac3b2dd3cb93ab66a3ec0a9ce5e619454919c9f093ae968c95b7364cc" }, + { 1744000, "a58589d821afbd93699e80a38f2376116fe00eb85a8fd1ef80993192f34c1409" }, + { 1745000, "b9bacc5848228228aa741d96fbac4bec395d6e9857cfe75c0c9d6e18b2c02e66" }, + { 1746000, "2200e20d4ac99a9172622c9202d24446a95aa6fcbe35f2dd745cdb4ec1220cc4" }, + { 1747000, "d19975ef01e0e8c7b836202485f17314a559822bda7611b973f65ed300f4800c" }, + { 1748000, "f99d70c8702104a9a0380b517dd142604ae8d9f7cc479205a20b7f4b9a21c405" }, + { 1749000, "df986855bc9ffc4491429b6e57c693c3690dc1dc2dd6e2f0e2db2e253dcac955" }, + { 1750000, "be9a1079d72365e8830591897d8225e26d3310b581e25b5ea29fdfc0ded7c9ac" }, + { 1751000, "89f8490e4d61306c439c0df4d6cd0e63124f021a901ba5c84f5013ce2b576b0e" }, + { 1752000, "28960c73a947317b8e7a8dce75c24166f0870071d8b6222b43c3fb91d0dcad30" }, + { 1753000, "3fb1f97a5cd3d4180e309dcb64463613beb967123fafe01f4e9cf456a38e1fdc" }, + { 1754000, "c4d6878195f227aad71dc1d88995d570b61af4e66a3adc14dc5d584aab2cf393" }, + { 1755000, "a571474c5d3ba96fe8ba32ea6f3f8d7d24e6a1c5dc37bf831aceae5b9eb93dbd" }, + { 1756000, "c483179ce58677cc42734749c4de23aa0b6ec3f9a943283050cc8e8169a415eb" }, + { 1757000, "12aee1f833dd2531e5203c153fe8fc1550585831cb9546e4ab7fd2ba8d8448f8" }, + { 1758000, "328a6ab17fe0b580e489bab2926155986624f78a4034b50d0f77bfec9bd8f020" }, + { 1759000, "e5c949d3fc601e2109d550f0496be60c24e6fc117235daaaee520bb9cdc8f67e" }, + { 1760000, "4493cc9915b240c0f776a70c664bacf28cd0540c52b20c323b23524792f66dbe" }, + { 1761000, "cbe14802387a21a9baf30d04d92edca3449fab121db0f301c52067cd60665b19" }, + { 1762000, "9ac8d7f9f00d6a805a31e83928340f4b91631dda1d0990090634f9c8e391d4c7" }, + { 1763000, "9bed376e7736e79f23e0a01ed1989a697ab77f2f81586962e3e2851397a106ab" }, + { 1764000, "ddf8d658ecc74a4189fe591143a6821c6f601d26ec6081fce358b82acc2d805d" }, + { 1765000, "c87bc4fd3e2d5f028b934c4c2a464b9954e5cf6b5b4c4f96b235aa181575dba1" }, + { 1766000, "ecb3fdcafb7a4a1a0eb9a2074baad7bddf108beb7ae77c0f0f24f8614e55e2b6" }, + { 1767000, "811f5548a7b507fe14e5c006a5bcf12501eebfa421acdf94b4148831fd187427" }, + { 1768000, "97e7f70fb01d0a9386c40f3315e8d7d80c4e303745f01ef9295f8f6e49f525d0" }, + { 1769000, "f3d18b620c3a92272cec0ed2e308e77cc1f3d614a88498d0fa33fcfa0baf108b" }, + { 1770000, "c974599761f9bb57f37faba6630b625a721053a629d1161ed2a56c98d1e4c6c4" }, + { 1771000, "e2ee30991088a115f879f75fec89e96d325293788be7a0158dc86769a299dc78" }, + { 1772000, "b6fd7380be3063d793fb76c9bfae71e7169de2e2d21afc3a24f657eb041d7c01" }, + { 1773000, "da5136d96250c30f5b6e6c91fe3a7359f63f04004d1078bfa52b57a623c4e55a" }, + { 1774000, "f71e3cd4f1b9dd9053e6991290102e4ae5191c740454c7982490024aff43329c" }, + { 1775000, "52f1c5bfdbecdb7fb4cd00915891c2ec21dd1629e035485e96593d218c8fd0bb" }, + { 1776000, "b8e9d8b6d6a031fbac807116d7580c345b8148fda5a988c7151e734d490c25ad" }, + { 1777000, "4347cf0ce5547ffe0b883e888363ea0b535e6e1da33bf4d7a740f13590ef5d68" }, + { 1778000, "044ea4a4bf0b77ee4f415173af5048fd7658c03347d5571e70e2999fef64b094" }, + { 1779000, "d5fc5b65a30c637315a10e4c82a2026b91d897e20f63f898aa45fcb872c6fb5a" }, + { 1780000, "be7e3fb82d0398d85d151a105b407f6c8858a2335e1bd6ae3458107c4b198e8e" }, + { 1781000, "06fba26696dbca4b5241f7f950f39b59a07f48ea747816810b00a6897c242faf" }, + { 1782000, "229db79d538c7ed959bcdbcc0a8543c2b46ba97f1ab1bd2b60e47d92af651fa1" }, + { 1783000, "f34019cdd068190666aa2e485edd7819f280e8b7325e7c3e423c550b81bd0c04" }, + { 1784000, "1a57c43a0049f1b3d4e7d37ccdc8be605cba794f2fb56b9382f2318a672ca157" }, + { 1785000, "becd1a52adc255bf5128c9ba5a55257fd0418a6752c46c77615e830fe679e8f5" }, + { 1786000, "e05a06a428a5bbfcf7e2d42c2b5dd32364ec91f7692e92f4f3553ca28daf90e5" }, + { 1787000, "5f2c238540f2fdd45fd104d53f9e83a08f06fadf9b74cb937711012baa8ae83a" }, + { 1788000, "5dedd54f919fdb209c6babb1a96c149e111ec5b888561ec4bc2879881130a7d4" }, + { 1789000, "dfdab38c3bd5ccb81947d5829fe61e8f54f2f141172181473447d17450d858f6" }, + { 1790000, "8ecb5a666a6847d4eb3f02240a3116b24fdc0f17ba03d926af579ffc665c683a" }, + { 1791000, "b9bf2df98691f0ff35ae5b1f9e3fbff0bf09c2ce7225a4e7949ad44b1070c8b6" }, + { 1792000, "878cc61fffefb9906983c3ace2048d494a70a7ba8dc92e11973213b4e8f7160e" }, + { 1793000, "78eb9b979331d3dc8612634a117d5daf1fa0bcd06aacdf7e37813f170102ac55" }, + { 1794000, "e6bbb95909ecb68288fbec0b10494a916ac66cf6b170282e70f7d6d4939b007b" }, + { 1795000, "fa913dd8697e1a75f21a8106c03781faef46a57667d96601c27edaa4f768db36" }, + { 1796000, "053a4b331752a2ea3c4fe401bb587e2e094e4dbf678db7c58a6e8895d8271391" }, + { 1797000, "5fa8f171676fca5592feb950c6412945d3d359a78a118b2f8f7c9217c09b23bf" }, + { 1798000, "ccb1731c506366ac8994efdd689535e18139c5f809ea5d1c172251313c55dcd6" }, + { 1799000, "7f998c74eb334bc95ecff223d530fdeceaf9390bc4ebf9ccc10aefee3404a473" }, + { 1800000, "bab155179e9049f9d6fc2a001ffee601361ff3f9d6cb2baa8f796318526664fe" }, + { 1801000, "068ed5e812ce10a33957c2a9bd3d842d84e7210c8768adb0cff6222ac4132c89" }, + { 1802000, "0341bd17cb0031e1d43afa653f984fad3d5172a0bb7eb85d9533d7ce9aadc4c3" }, + { 1803000, "cba79b0cde23e90fab39bed5f5ac0a7a2c8e6e0a3663b1b596b6bfa8f6a5a4f5" }, + { 1804000, "7e7e8c67e8a4056276eeace82b0c32a9bf53054b6763bc1b35ef2053efc375f6" }, + { 1805000, "506348c62b04b94b7b1614ad195e070eab00009b71bdf105096047d7ead23b7e" }, + { 1806000, "b22832a4af387cd012135be0e25a5d32289f75d8f2fa7049ff2d22a0dc36a163" }, + { 1807000, "b42a5fb2ed8148d8b50f5ba96b5a163d2f6358cd2314765135ddbc915be3aad8" }, + { 1808000, "c658aa8123eb3c781446bcaa0f202268ee8066ac1ddba50d2f4d363b2e374b6a" }, + { 1809000, "1927d9fa9a7d2c0e7b72352a7c442b60acfa5d22ec8f3ff4495feea047df5927" }, + { 1810000, "45452f73a1c59c6d4b628c18beb9bfd407b2238dba27ecc22bb74cffae29d2dd" }, + { 1811000, "10db9105ee04d65340e4bb5bd9c519b526c68198cf1978666c150c5591fb5298" }, + { 1812000, "48004db1699897f2c1e15b3ba22f98833598d61c3e1cebffee1a2764f2f4ee4b" }, + { 1813000, "a05ab99d820324878be97775e7de4e95026062b61ce4eb4256f8929fad5cbfec" }, + { 1814000, "a1498c4a7630d236ca694e8534b188100154f9ccfefd2559d5bd60b1bb4d2411" }, + { 1815000, "00bb7004cfe768db90bb349c059b272b81c53bd196b8f4f7a687ef007d1500ef" }, + { 1816000, "d2d31d8bd9d8ed91700edae0cd3f88c5ab0ba255d0119527277824db02f9a764" }, + { 1817000, "6619a68e2e31a4ce4b5edcd57ac62d5562c539164dc985bf0fd38996842e5bde" }, + { 1818000, "1590c190a7ada5825e90f7becef0a80213f34b3b31f2a953e9b19fff2ff07183" }, + { 1819000, "e1c52bdeb5a8cab64395dcaa44d30d352c53f63ac25f9bb01731e9ccf7890a82" }, + { 1820000, "d242bbb73f784587fa4505f393d16eb8c0a8470dce321564a70bd79e39fb6bfa" }, + { 1821000, "c0530c1f9ddbf66f83d136472ca673dc482267d2916c921dad91ac2f28149edf" }, + { 1822000, "01711ec5784defaf8c7f09e4dd7f8cca4aec07aed1d15d61a5076e55464d4b8c" }, + { 1823000, "75a6bfcec2fd31e9557ce38745666745dea865504b0e41a90a82e299201ab42a" }, + { 1824000, "b971fad64eec2f04c1c060c34909644788c4281f058e9c191c303a1d8e1598d4" }, + { 1825000, "e0c88c25d1408de5ad91709ccaea42c7c7b61116c26e0474b44e71fb822be7ea" }, + { 1826000, "2b27f37780b4075806208b4265e6e378525e609db5c82c760cc3a8b6972c8a0d" }, + { 1827000, "cdf1031d412d5cf5ca40da2153d41273a050d2f6f613345c9a888419f025a367" }, + { 1828000, "67c8d608f59763b1f9a90c20bc4bd8c5105c820a2e445ecf0b4001141812a7d2" }, + { 1829000, "264ab8d66338b6c0f159f67c171466ed1dc5efe10bfe1999f0b70035c44badd9" }, + { 1830000, "8feb3d30971a59d53bbc7b18d8d2b035f62e9fb35a5aebb514f104e7d0487b81" }, + { 1831000, "a307218c72849762202e3c174fbad8e35a344bfc1f7317d975844ea0b2b3bd63" }, + { 1832000, "28022c322aa8a1809a53ccaf34cf80e71a92b4a6f4597236e2524da30f7cbadf" }, + { 1833000, "5c5c819a50f2c8a1d9278e44f82e4e52d3385e77619513543b1b07bf2f015627" }, + { 1834000, "3e470ccde982faf31035b4030e0b933f51b5408fd6784a4ee7131a74f9f5221c" }, + { 1835000, "7b11778228e3834a682647c87b69c24cc1218138ab98e0b2a28bcd7ab9811064" }, + { 1836000, "7452675a12c8cce4995520e5f3b5884ea001e97aa85652300c429a7d9efb3fa1" }, + { 1837000, "d11bc7eee8b5a0161e1e27646f7fa3e6269c1be6712a69e200db17ee4f1b289d" }, + { 1838000, "2d8c5772d758938aecf8da7d81cec33cacc386019e777c06323b7afd68b80e43" }, + { 1839000, "afc99834df7c814ecc320c750eaa656b1555010613a1dc0f8d36523da759f3df" }, + { 1840000, "acef6c2e281f2480b831aa3952448a3764601fc610a13c59892970fbf0c66ab3" }, + { 1841000, "6dbc6d956ca04b90331f0afa32872a08bc197b1980b1fd1cf4e2a1a106564ec3" }, + { 1842000, "35271660df6691cfd65b1ae2c4070cbe3affdcf4e7e596bcdb29d76885c6c11b" }, + { 1843000, "16684ff5df85a58b082e3db420039329c5c74433f8dba0b0a9e39f11ce07d5c3" }, + { 1844000, "594a4bf577e8c74e98994d7e165a09837b87c835fa36f8d6f63fb87af509b345" }, + { 1845000, "0bf13dbf5f8ae787530744e8cd4bdb97067fd7f0c578864585c206145ff5d81a" }, + { 1846000, "54a1f8b2dcba4b4c8205e84a6206aed90a93376fd86320542270f47c94688d0e" }, + { 1847000, "ffb9758accbcd403861774605073ab6d39474cf3c45855e14f16b8a28a8acdea" }, + { 1848000, "3e36ce5a16558ddfe74a55b155f753d4e23ab75c72b366380e4c4ec2aaaebb0c" }, + { 1849000, "ccb9b5e2be94a33bc9966f65023419bef7e7b2c0253ca4e6edac80075d841e27" }, + { 1850000, "a79217e362a3377c67a87c368d081b8e866c6178e67d13fe994f40b66f8e328b" }, + { 1851000, "572617c950459eb84d69d41bd8ef42f48d3e72d76dcc75a2faae7ae6dfa306b3" }, + { 1852000, "f446684923cb09e60824bd4c41fe46afb2b4036a0622787de3fdadcf51e00231" }, + { 1853000, "3dfcbab264976d79dc20800b066123155c98740783d1ace7ec58fb9d393ea4ee" }, + { 1854000, "9deea119677b0a8000584a98dd4ba9d6a5c406982cdcfd2200fecf3414833267" }, + { 1855000, "f89fdb0f802ac2a7133287295dc384615015afa908c21723915eef452c2456e4" }, + { 1856000, "252245d44fba6a3d60259a0d25919b85795995e5f67e6060d0127b5bc9828703" }, + { 1857000, "97d4c7362d5c1bdf09dc0556d215cc6d72982f1664fd3e4a5ee5c4237dffb028" }, + { 1858000, "d89e6f7dee558e07af9743858352a844a8c8b91901e914183acab7615e7c3811" }, + { 1859000, "ef6685475fe204feb592938b936a59b6dace9ee226d0ff1cac72b8a4d0e63a7b" }, + { 1860000, "d2f43d09f1f756b46fbbce2ba5679d4a180e68ee02c9b18e9d123eaa049442cd" }, + { 1861000, "112a63a1c64bee14cda7a3f5184639e2f063180f4eae5dc003b552c9bd150d8c" }, + { 1862000, "d4e03421ee7555ebec44b8fa54a389406efd615d9e9dea5ec0f00170baf4f154" }, + { 1863000, "a6c4836086e46597d507edc2cbef85fbbc3dff906bb7a778a720c384dbf678a0" }, + { 1864000, "bbf7d94e80a0223d7cb50745fd9d83fe3d29a15181151f8ae4d244e72d84de34" }, + { 1865000, "d695f4db220141608a0cc228d5c5a9fd98d0b5d2a278528e03c38bb1ae74b041" }, + { 1866000, "a49b063d680bd618d85aba3c3b04441a013133b41e6337ba4bd8c9ca40c8e9af" }, + { 1867000, "d173b5ad5b7c6bf470de78364841836f04e2f55e90e9a18ff2a909db059890f8" }, + { 1868000, "0f3f6b0ab16d27db3390f17ff40bc1631377f76c8ede69dab344bf4b7117502a" }, + { 1869000, "2ea160c71d008b80455040326ddc9b1fbc5a2737914188d2c196cfe2f1c45f5e" }, + { 1870000, "a551a5b81e161b82e5b682bf1bccebd964eb2deb5daae69fa84427512d10a875" }, + { 1871000, "ac7461a8b98f0c3925f4501cae0694860621e671fede37ff6bf6729b7f8f3e1d" }, + { 1872000, "16557e3a2353a592ef8f7a4d8b503348fb1b5789e0beba29f1f7005c29ef83b5" }, + { 1873000, "aaca37bdcebcd128c25a34e9a9bf2db007b3b40e719513f39c04a5c8ca2ded11" }, + { 1874000, "0f2f0c17cda1ea1f09ab9158b1b5779047b9e759c59394ba1df0c3b98b732372" }, + { 1875000, "e787b0315779945458bc9dd6bfa38b1f1313b1f00c0386cee91a007135c1cbc2" }, + { 1876000, "e6e3ea9563a57a82153e03e28476e93d01d9d154ecc19acd448af41141181b12" }, + { 1877000, "1ef67d234ffdd2b2f204aa5981219d1a86ae3af7392bbf3baa0d11c57a973498" }, + { 1878000, "1d826ede84b33859ff076cc8885e45778d15270b5922421792190450f27ac5b0" }, + { 1879000, "ffb0bcfdf1215f24c83df718f86e0ee6616b71c39a3494eb5e3b897f99bba20c" }, + { 1880000, "680f33655fa69ce7c2fe5d13678141e1acf2f3016dc4c96be2fd963fe70b51ed" }, + { 1881000, "c21ac4d7892e6e5a92d02ad252ce4b156309a04cda735d760456edb655380eb9" }, + { 1882000, "bb7f10d5c62faf8db1a9b17d815e332b24d9a02c453bf7761e22cc7cbf50fe82" }, + { 1883000, "72100d265e8d670d4c8ba26cfe604b4b4b3ad8e52a4aceb2eeaf8559f8dcb0fb" }, + { 1884000, "42987d18a1b20a7866b1406badc46525015ba3a4b311fbb24585181e88562777" }, + { 1885000, "1918afd5199ae1871d967df49847d68992bc2dace6b65dd11a84ab64614822ba" }, + { 1886000, "d2b9826f1f70e6bd7e79e8c627158d7bd40df79ed986f5285e4436465c81fd3d" }, + { 1887000, "5c8bf949e88bf21ee3174af2a039f094801ec48e6bbab1f49d6330da268f38c9" }, + { 1888000, "d43bcb7005fea71ef89ffcfe1072e96b7f03a54ee2c3fcfa07aa7194321380ff" }, + { 1889000, "95ddce43625771498ed56ec05b3e2a94e661c3b9493e372a54cc8a213aabd08f" }, + { 1890000, "eb283d6104bcc058fbcd64d5ae5c7712154877fec37c4fa34d9a2d50930728dd" }, + { 1891000, "10b74e3df4cbf368f49216af901f4e380af1505386d034a01edb15018b3dd19c" }, + { 1892000, "513c8dae893c17a4eca74713ea9f6658a3656233a66b140f850452a698897c99" }, + { 1893000, "7ddc0f7d2eb4d11bbbdbe82ec09f7c96b85883ee34b0d1f610688777d7ee68d7" }, + { 1894000, "47b114575c9ee9870344231a7c62983f526bc24b2e526098c32eb3859669dfc5" }, + { 1895000, "9251bddc9c6f9bbafe32f44aa9d72795f7d124e9ea5fcf06166e6222931cd133" }, + { 1896000, "79d7af703c0e825176219285240440a6457de75941bb73ac1d1b186002e0070c" }, + { 1897000, "00567e0e8449c29ed9c9cbe130ac4360d6e72fbecc3aebf29824b94921aa19b9" }, + { 1898000, "7aa40d404b7299d10fd58f69a5fba4c7a3a7f6885f604f586a06a8882366b8ad" }, + { 1899000, "671c56de195b253a1a8ea6977ab3762b1222ca2ca931213b2e0dc98dbab0e547" }, + { 1900000, "377d439a17bbf27b41e9c965e5586fc7321fa73a82a428052e749949566f73b2" }, + { 1901000, "7a5006833b16c01efa4bf2ecfc251286d610b7cc0308e415ea88ab25bce08b69" }, + { 1902000, "1650b54d4fb59bd5a9f4dd034d6594e391606bce69faa75f2d25e3a7fe2119e4" }, + { 1903000, "c0c6de991dc2235fc2bf2166094300ce62d7a2227e65b302ee04a7950202fff2" }, + { 1904000, "6123d44df9bcc9770fe50a2b041ca571341012a2ee9b3560895f1225abea5380" }, + { 1905000, "4f1f881a5c135d37130b839e56a65e90f1a991acc8562575f6b73af3651c7fc7" }, + { 1906000, "0ae084daadd67e8cf0a4a91701c43a16d91a29bb1b0cb9ace509ce846b6a8852" }, + { 1907000, "cf04613a6afd7315fdea3d75cef66f0d59646890fa1cd0f93dceb9c2bd0eb0ab" }, + { 1908000, "1f19c986ad10992affa2a9c06037bd28e26f22a7cc4f68dd5b6ef063f957ea48" }, + { 1909000, "4f50f4f42c7bf234c37bef15c90a6295873c2f003884b65d22ee08d38b0d6a10" }, + { 1910000, "1141fab871d851e38f668a938b1291231aae7c9f5ba93a900aa2a8e7b26c65df" }, + { 1911000, "156db2380b5dec8243e196f48f842dbe77acb8afd034cc2872bd27194d818588" }, + { 1912000, "ae8df7ad3dfccf265d9d5e82a30dd2971d8341c7be23e1e18dd25c52e2da1528" }, + { 1913000, "3bc078ce75e6a0b59e6d6c3d6567e255b436b242aaab97f93f1e651df5bd7e07" }, + { 1914000, "10c2dc159c1e74acb191d8affc9c420aae58b72d962553fcb345a1d8a8fd108b" }, + { 1915000, "0e9a6d5ce965f91946bb40e6823d21685f869ffdab01491419fb3feded835c01" }, + { 1916000, "60b41a8d449a39be6bb5078f27ae8b57ec5421e18a5e4a2a53319f5c801b4c67" }, + { 1917000, "10e2cedb84877d7b480bbed6f42f02f42a91ee1bb2aff1454ad53b6a95a4506b" }, + { 1918000, "a9a650fa216162eab7846ff3a9f048793f0965a9231e75d0b27ae1a239b6e9de" }, + { 1919000, "3b641d02f4f3feefd972f672f9414d0941d741f187a3303cb37edc911c920d4d" }, + { 1920000, "3b6d0b89aae6ab15a75c75f5e529a81d41120661d48ac0a9470c21ecfc85a5cd" }, + { 1921000, "43feb7f69f41e7f1d64edaae333e1f3d0f7caadfaa5c75244a463d66799db75b" }, + { 1922000, "fc77e1a9320e2a03f0dfa4f2cf8f444af95c7b7f9fbecbbae98defe16659cd8f" }, + { 1923000, "2cedce0c95a240ce8fbd985229759e9c329f0954243cacb9bc4e486dc60999db" }, + { 1924000, "099b95ddf6d32595076615ad508dceeff20f8673bacb68c5ceba7784d0655c40" }, + { 1925000, "019a1349c2db57aaf8c7c96d6a0fc9db5ff19cee3fbecde0314b1354e6ad0862" }, + { 1926000, "48d84e00025081f149cd6f4017e75267c34fd0469ad3e4daed52c3b1b3545127" }, + { 1927000, "505ec5d3d387d52ce10d9fe10fe5a26f7462b4c632004ef090414c3fe98b148d" }, + { 1928000, "3a62e55db0a02a6c90722ecbde3b35f024d920f48ebeba495cd0ed7854961d3e" }, + { 1929000, "690e70b0d7f2eef52582e90e31507292cb8753d9e825208b69aea300cf915cbd" }, + { 1930000, "c3065e12de2272b5fedd91ce624ce6ba115fc7e9051c7641ad36099d5885c322" }, + { 1931000, "7c61f2d6b5503b615cebf68933e8cb8d2fd8c1e75a4c7b01fda6461ea3ac9ee6" }, + { 1932000, "67f23b0acd3a427eb556a8c99a19cfa04e39c2655849acdb1bfdab27898ec4d3" }, + { 1933000, "b7522683f9b87d4f08de643564f01f99914e7608cb54cb4692893aa2136f0eb9" }, + { 1934000, "03c6eacbcbbc3b8c716a88b2197c490e9033b56878cedcfc87db3629b9cf2e0f" }, + { 1935000, "d4cf9ddcaabcf67c0c148b61a940b994959e7098701b0ab1af5f5d8c00a5ceee" }, + { 1936000, "17c9db2ff563251af6e1b041c420497ba7f4809b5d9dbdb3b332323b3c0a2595" }, + { 1937000, "e31bb3fc2a767bc6d8cd8f045f6234a4148b2631a35d3b7c13a0905cfc9e96fc" }, + { 1938000, "50400879b1859eda8d847efe576ddf23589f6e7edc21b864671d2bad4aac5fc8" }, + { 1939000, "9adc4a182011b7132689c070ccad2b3d95d876d2d0268f312b3c46953403b17c" }, + { 1940000, "bff23a3fb969755b558df592f7a6a0e920e7118ac2ad74ac2e0886ac206ab485" }, + { 1941000, "4814c3c6feb7d5d946e9ee48b970fb854f5f2328026e4075966955808c1ca83b" }, + { 1942000, "ca615ee1ffc543b5f8197fdea78bfe1bf06ed462e4549c62bc6ced22126d8a86" }, + { 1943000, "f2050d9dbd6a1476a4d7bfd8b7be75a6ddad465baa0ad70a841f87bd58c6fc39" }, + { 1944000, "57c204ccb1d7f7c44c396116e983257c80b8150f5b776f0d768c72744ae124bd" }, + { 1945000, "51afd148913136d9c746e79982144c4718fe5758e09fe62487bcfff03ed22ff4" }, + { 1946000, "58e845f4ec67c1658bf7556af7825010be69b9fa426a2a0317285a5a438f4455" }, + { 1947000, "896dd713df7633601c72e9f5bd59effbd2a69b89ab4a5ced2f5462a5cbcc3c6b" }, + { 1948000, "2108cc8419c5963a2e37f07a53cb793e7bafe2e324a6810c866b5a0a0c347f5d" }, + { 1949000, "cc0a3bc455022aa9af797d94a97d0b93033301c97e3992ac7be6055d3b1c926c" }, + { 1950000, "79cf71ed3634245ac407c4e10cb519cc748f6a786fa93061875ede7e0a2f08e8" }, + { 1951000, "444dd6b60b3006068cdd655ea040aaa986322650b7f69ec6ea545f006c7fc421" }, + { 1952000, "2017b61238d3ada51df5411ff8dd6f25528886791884a0426ac97313bd2f5d9e" }, + { 1953000, "a036a63374697b93ddb2ad2fd6171bbcd9b151bcff90dea72ea0e131072cb2d0" }, + { 1954000, "dc94e8f613394249daefa453e171275297226da9fa20905aa932796cabebb3ec" }, + { 1955000, "754e1b2f1b74c14f6ba858f74122eb4bf4495e1c64ab696c6e7dfaade148b681" }, + { 1956000, "c2baccc1ce3519b85fd495f4c67a1d55a37fb05be37d1db95d8d72eea386c77e" }, + { 1957000, "2fcc058700a2deda2d8bf23b1752b1709b49bc636ee7414fec5fc51c7a764b36" }, + { 1958000, "686971e94808702c0357bbbf5854cb6b234ee692ca34886542f5d5a454c5ac7f" }, + { 1959000, "03ee3218f445db7ce4dc8a4f6fde3b6dbb3dd8308596a5a95c2f7b91940197de" }, + { 1960000, "c0bcae2a889565bf9395d3baf734465766d664a51098c7d9d97899554a67870e" }, + { 1961000, "bb359b4aa1f496cc547bfaab6cac62a64cdfaffd65ed3fd46b5e27653f704724" }, + { 1962000, "9550c77ffd130bd997d024b85f6c5bbb86395d39cbd590635243a045bdeb81a8" }, + { 1963000, "4c80f0ce0260f9c6531cf96613e86ffce77e41dd1b89a35ce25cdb24b09ff37a" }, + { 1964000, "8fa4e717dbac56a13a7c34a981d77240fa603ac25dd60dbdd6ab9de1c5194455" }, + { 1965000, "7d76bc3ddd35be144291984859ab0fc3df19d6112c9279d902bd6969600832b9" }, + { 1966000, "a1fb10471be96dbf183d5ea61e70493f6d04b88c938772cb37c8bfcddf019bae" }, + { 1967000, "fe8399ca2014cc6a867cbe6e35d99ef55913ec64aa67a799dbb40c9f31c5be9f" }, + { 1968000, "09f1f4afb884c4aa4df8a7fef8c1c41d1d10f1e446c1f76c36658ad9a21579f2" }, + { 1969000, "2566de0a4efbd0dcec61c3672e33875c97ea5bb91a9b9c6dd666065f7aa80bf6" }, + { 1970000, "a915878874d13a1c7d3b140e663172a77bfc0717446250a20ec0f38165648217" }, + { 1971000, "edf1cc6cd9cc481ed4943764fa1fd2073c50a0a9d2cbeb9b885dbb377fd0079a" }, + { 1972000, "7f4a5da87495600fecf5173ff08a98cc2471af0ed6b6cb219651fb01f87c6863" }, + { 1973000, "6ea7b032515e16d20d47a421e29575c5f0919a5017b7bd7a12cb7220d3f617b3" }, + { 1974000, "ea1f5cb8095b243f7e4172bd5773c281ff2650cba6dc6704a3cbc6bd27084b36" }, + { 1975000, "690d298a08d834c6372bf774c820af4fcb997775fae0f920c487d49c136be572" }, + { 1976000, "2862779a7a2d2db78ef17920300cbeb78b1920bf40d8a331094aa7e5a580aa90" }, + { 1977000, "4454dfeaa0c339dfaa483998ef43200cff2b613bcc077d58c4bf31ae52f844ae" }, + { 1978000, "649d34f38dadcf4110857256ca193de3ab3a251ebf32cee5ffd0910f5b26654f" }, + { 1979000, "27d0d8da744d5a6ea02a9214fbb88b739b493739cade081ac6ac1d742f40bb1c" }, + { 1980000, "86da5931ee68bb9726b0eb0c909f51593d5b2a91556ca6307c5bb6d569588423" }, + { 1981000, "6b3c621ef1658fb842814ac6a15799ab966f677d7e865f04b32223af7363124f" }, + { 1982000, "75ece9ad8da8c07b82a4daa57600cdd32056535ba0af4a44205c9ac382fc4e06" }, + { 1983000, "b3319b75a7449238f51afff797e5d6ff3f55c994cbbdeb554d3142df2cd078c1" }, + { 1984000, "2c8de080cc5aff927a03c07875ff96c34f2e8dc13e93614a5d3c0507e4a01e13" }, + { 1985000, "46e751eeb7fe6ef8b455aec2bcea3bb9e7a1aedf6df6f68bc107fcc125d76e8f" }, + { 1986000, "6b2b163abf7e91756ea4e3a1b94e67502386a50383df3916f260def49552c7b1" }, + { 1987000, "5fad2562eb5111f6e15f535e01d304aa1c1f6e1f5b376a663d255c38d56b74e8" }, + { 1988000, "585206e35d341bbcfa5d002a228d3185bac3253377784b6a63980217195d3f5c" }, + { 1989000, "d5744d5f7056059ec7fb68e7156751ed6cf7184a11e44fba46bbdfbb67cdf3c1" }, + { 1990000, "2aa2fbe1e4d0632a1dbae90e6085c197afa9b5d3c09b09c2079460f2472c5ebd" }, + { 1991000, "6260a032124713e375ee18b0432a61065d68520705b040ff4491354bed1ca787" }, + { 1992000, "d9efee7d4a7b71188b74d7665969c8977f501c828b51968ec1257b9318447030" }, + { 1993000, "53a8918ea2aa73aea163e4c07f2e7a3b5b4efe425eda21621d64fe6e1659e64d" }, + { 1994000, "cedd12360deb216e7f7e98b9a875e7b10ae0ac8f1c8b1d27d3884145b8d9d9b5" }, + { 1995000, "8935cbb89d786887ce5332feb0ebf9887048d79a2de0c6e4e4d74ee967bafdab" }, + { 1996000, "5ea833c1fcdba69c1528f7fa7f9eaef17b785201328c3eaefd2d26099f68ce0e" }, + { 1997000, "a7103d078d8b69da49224c9b7548e8df57cf96deb092ef3cf1a15ce84df5d7f5" }, + { 1998000, "d6be50f46d3a98d829856f7d907ca8c03412cb7b2b13a55bd62f524a2460b91b" }, + { 1999000, "7b42f2c7924bf715b59b770e430f9496ddac6b55f569929f82009787d8659830" }, + { 2000000, "a90d79cbde562d72fd9510f1316c94f52752a33466b69bcb90426ee6edab9db5" }, + { 2001000, "fdb0dcc0f37556f345e3f2033dbe4b68d747bf16338dd1e5bd861937031f650c" }, + { 2002000, "8da0641930176362f85c86d4fb185f26fe118e8dc5f12eb97dcdef16799b3dc0" }, + { 2003000, "5e90ecc0be98381cab639f1a41e8c34c9fc688d6cf533498d3730f8e0589c65c" }, + { 2004000, "24d984f3ea91626faf12c21c0bb55678aa893f9e357c406d45c2e924559ad1f5" }, + { 2005000, "0a9ea722647cfd82de3e28bf35e8cb729bfbd5b87c3faeca5ca7b259d6a025d1" }, + { 2006000, "58f614dae3d63dc5ba302fb2ae15e5b5df14c618ee7ca8c164f855655a8f9476" }, + { 2007000, "10d4471e871d14312b7b9fe11a8674282623691c93734ebfd41339be927fe455" }, + { 2008000, "886dce7949d6189b0cf381332b39db84355498b6fa554e18b44080a5139ba847" }, + { 2009000, "3182f06bede9b65fb30addaaa907ad7773072dc166055a688021edf11e75a16f" }, + { 2010000, "17812eab013d0cb587f601fbe3fd1f3b6a6d87eab3a6b5f6abe187e2f21f25da" }, + { 2011000, "1039787d13f78ece126469b608db9cf1aa584b64c128d197f780142424d0662a" }, + { 2012000, "036d8b8d359b710cd22b2086e29d8072e52b7345c560c44bb3fb1339f9bf2bcc" }, + { 2013000, "b17400470a4b291715c49bd51cf6dfb7cf296b6fd429b900e1c015d79c575b74" }, + { 2014000, "220ce88d634fd5f948ad570ebb602e9c83b8cca19fcf84d7cf25bf919b18038a" }, + { 2015000, "365840d951e1a0eabab029710e0bf18eb5d6d102bcec736d801aeb1a16da2fee" }, + { 2016000, "bb2764f04e7f94f064f5f1bdf8e18aae824539e1983b1a9b5632ebb98c7a642e" }, + { 2017000, "1e067cf029d1b84828f248da7643ddfb9286d1614debd0423b12d4a87165192d" }, + { 2018000, "faac4cb9f5fe6ec14a74729a87b7515b100e5b3fab711c018104cb1981ec6d54" }, + { 2019000, "c279a0b8b6be1c85bcbf72606435cd981f561a69d3c8e56ddf6df6d0835f7149" }, + { 2020000, "8b1de891543c535d8ec084ba579e1077ee44f052af24866dc7979cda29658475" }, + { 2021000, "a16ba954ab2f4c77cac09fda31f960febc01a9dd2f9c5536ddd18019d246fa98" }, + { 2022000, "38789a4f136cb0dddb26440e90208a84c1f4e1bf3bc2b51b39209a21ede61a49" }, + { 2023000, "313d026df85cb50a92976429d0286d8362d59ef1b38935ce7b08c981a43754cb" }, + { 2024000, "b669dd5e1e24eeae8586b454083c7d2a690ad94ab82212f3eb8bea13f85480b8" }, + { 2025000, "ecb0134deefdba3026083926b6f2a4c0342336f09532b1f4ae0c30855f1ed3c2" }, + { 2026000, "6117484c2c3da568ee408309f9ae8b604a46b4af6fc3504fe7da8dd0329ff6a7" }, + { 2027000, "03614844c397fa77550c80d4ab7139c93dfffadee70b278c446a8bf8c8ab77a9" }, + { 2028000, "9e82014a80ada3d0e5486c0cca7f1182f6fa2049152812438652802df557c678" }, + { 2029000, "41c4344b2fb053a5f434c4277582f5870f7a62742dd0d876fabf28624f63e691" }, + { 2030000, "d351927bc2d4247ba150855aa20da55c880eefc904202dc9d39ce901eeeb6903" }, + { 2031000, "443d0be0f22451bffa7524f25c5179d11877963de86f1fc771b7f8df748aac5f" }, + { 2032000, "9c664540c41304571e8156bb179d5d9b2f157ae8b3bd4888603aecf04f4ad752" }, + { 2033000, "dbebf59be9f9d4c94e393ae4c466e86689b331ae5c55c2ea10332841be04874c" }, + { 2034000, "c8e786f1d28f9c412b51b1221d22285719e65674e4d1f63d3027b005c52bc801" }, + { 2035000, "70e5208175f41c2ac7554dd052cc7d85e27301a3da4fe5806f62c6a9507ce137" }, + { 2036000, "27715bff95e0b75e9efcdc6539e6b3766888396d717d4d2829fc515eefc9af26" }, + { 2037000, "95bcc7fb3624ed33970350892b423b765d1466efd425de8f29f0ba22149dd162" }, + { 2038000, "3ea715e1c3591e5fbfbb11ccf391fbee7b27947d8c97d5e7e4c25f685b66e4a3" }, + { 2039000, "e8466f885cfdcc50cf85dbd2bf4b78fe1522f40f0330f5ecd7f556be40ad3eee" }, + { 2040000, "248ee7acda6c0c58cafd2f3e53ce69515e19941082a1e9620fb273e935ec5048" }, + { 2041000, "6657a3f38e63fbfb0c128112c3ef7897b14c55f6a88aa12eeffdbc7bc3f72e9e" }, + { 2042000, "a799d464ff47ac37d0102d74f9665237c57240f09efde7448d214f06fb93c02f" }, + { 2043000, "00570dd2a1ae3221dc380e17983c02e2cc43396f4804e2888ce8ba0996928fab" }, + { 2044000, "db0db0686018cb23c0bffda0f8ad8c8603216fa55264dee18393a006b1a13741" }, + { 2045000, "001827dceb842fe62b8aaac484448cb5bc44a5844254120a9c86214e82cc12a5" }, + { 2046000, "e4aad908ab98e9d42c912772d66a9438828705034dfd8163a143cc4108fee5ac" }, + { 2047000, "ca4ba73c81421d3bc7c37e435db329b860a543e62907aec8451200634ca4f27b" }, + { 2048000, "a7880f2ea8437825855af2934689ccbaffce19c70e0a5b42de24e6f7a82c086c" }, + { 2049000, "596108316abeb8e9dfe294c0e9d09ccf6b62f18cc4f0754c393301d394693e6e" }, + { 2050000, "5780eb85ffdcd94cd2aa40296e997d856868a7745b6fea1d599d068f353c19c5" }, + { 2051000, "9a6e1d82933ef1c66d7b005c41fa31916cb3ed8ec060fe4031be87d116af520a" }, + { 2052000, "180c02f681fc3314f40f02c0fb349add492c791ad558f959c57a68e60882a29e" }, + { 2053000, "f2d3862a6b4cae8022a2886123bd7ffec964c8e421c13937d3b6c95c6c84b62e" }, + { 2054000, "3fe4a46d0eb5672dddf5c514fc1876e01a1d994da65a993a94844ea97969cbd2" }, + { 2055000, "3003a6c18362fe6ff76858e7cf61b511e16d99ae706a49eb1b71a0c03700956c" }, + { 2056000, "336aa0a97f3a10fc650ac9a7888720eea019335768466a3dc8512392e8c20282" }, + { 2057000, "5f4f1413dd0d4382f4a9e8728d18bf8e63f4c965a13658fe405ae49256f70680" }, + { 2058000, "1563939333dad2855068799fdc58150047e90899eab63d1cd24820a9a76335d9" }, + { 2059000, "ad27991697d5d837a397d7a39e707a2d52b48f4604c840642924f3a3a0b7fb86" }, + { 2060000, "c7117410e4b67af1cba39644290d6418f006b7649ba666653b4c03347dc8ff04" }, + { 2061000, "e10593df9c803b711ff7484b4da4ccd1d2a1abb8b039730ed39d8b73e9aac5cd" }, + { 2062000, "1c3a1e307fa6ec0129f6aa709e76314fb53e2cd4f2c3c78da2d1efb645c83455" }, + { 2063000, "f913c26cd72d6b19fbea2aff446ec3e16043537da91d43942d07e1ae1b27c6e5" }, + { 2064000, "839a7f92793e720567bfc37980afc32b01352d308ccdf6a2e9abe3797879da00" }, + { 2065000, "660144bf5c6ae8c65330cae4106a8272ca14adcf920a586e260f7346a9a4bc20" }, + { 2066000, "046a58af08d0a87ed7ecd27ee871fada186a4f1aa871ff7de4f11bc74d07bbbd" }, + { 2067000, "c0d6b277e69c8c828cff9d71563f8578eb9564d4f427071b929d691804a6fdbd" }, + { 2068000, "5afadd160d09ab4225c693f0bd4c23420db52ff0913a3c4d9cd008454d1af2b3" }, + { 2069000, "a851058317669522c733c8b2944890682a0029f1a7a7ecd77da5c8c166e9a20d" }, + { 2070000, "6d61abdb47faa8f8c1999f0d2aad4ad2c7d292757bfcdff19792a7a3ff8df760" }, + { 2071000, "94442fb86fd3886dc319463c78c4710da65043f5a95f047b30aa53d3a2bc4494" }, + { 2072000, "820e4be009831c631f38c2572e5f95a3be8360b914de1ce4187391d0e25971b5" }, + { 2073000, "f440ef07a3cbb6c0f3741fd2776e177a9047b82c579db7e4fe4ae4aeea988ca4" }, + { 2074000, "019e58920d364345dad6e43f4ebb28e869e02504eabac8211c428ee350b8e4ce" }, + { 2075000, "ff37df145ab6ebded1448d90e30039064ac6903712d376b2e39e30057078023f" }, + { 2076000, "b219112e3af6e40e0c954c4275fa47d92fbf8dbd429bbf07e8708c40c2d09daf" }, + { 2077000, "a68779dfbf649640006bec6a8f90f593f0e777421adc1147913b0cc3c552d1d3" }, + { 2078000, "7a962d04437e134be1297c2421842d6138e293541912bebdfbbd00ced93a03bf" }, + { 2079000, "650be9eabf0f472b4c3ababaec3ba6db3a4d31c072aa1f26e9ead52fa0802775" }, + { 2080000, "cc3e6a9ae141369db1e02012db3897855ed2f6a1ec2e5fe1aee00135b2d61717" }, + { 2081000, "184080d759094b3f75ad788245b0a4bfcfaeb014bc7b8415380a55ca48e74192" }, + { 2082000, "cf035e31215d380695bbbf0f16fc37bf73acd70089e44a76bad1efbef234474c" }, + { 2083000, "2adf0a993b5557c6733f32e00987f14d81e11d89cefdd99328c0f5f4eb3ac475" }, + { 2084000, "c4fc1ebe8704a6b63754bc61550e94e264d15b083abc39fb4a9683d1afcb947c" }, + { 2085000, "fa22c8182de4fef7318eaeadc27a6a95a96bfc6df3d5027643d6e7889f8f2452" }, + { 2086000, "62c9b1b33f653fd91c936ddf8d6b315e8b61793a52548364f951400d10a4670b" }, + { 2087000, "733239b5e5f16fd4935c9ab20256c9893ebec468f1291d45d1fda2730210f2f5" }, + { 2088000, "c64d73be9437d76a3426d82a861d9b7a5985487b53b276a5dfb022b9f57add95" }, + { 2089000, "2da2445636ef901b39b02a4a1cfe34f7a062b84528b88b94b1101cd269184508" }, + { 2090000, "24d3a03b86991aba123e5411cb7c1b61980534956bd17924818be115a93eb672" }, + { 2091000, "d81880ff30121189d64a8da4fbfd9c76b092d7b1011fd6ef8ee76dce2910b005" }, + { 2092000, "9aa0b3d813500842dbe35a8755fad66e5d526fac4258ee1e2049aba79426e20c" }, + { 2093000, "532d726b0f82cb92cda07df936cfb41f4321e5a55d18c30ad9e9abd89bc694cd" }, + { 2094000, "7d6b18f7b9ae1c54e4e335697e6f4811f51ea52cc67ed93a4f3e4abcc16f3fd2" }, + { 2095000, "2373d503d4abf9e4f46dd37b4d4db86f6e2146b032f65525a10d15ba41d4823d" }, + { 2096000, "d581c9789bf8fd99a2295818204100db70db60a31f26d0f7fbe1b5394a464cef" }, + { 2097000, "2b90c6ed224aa86ccc6cfd6d0de2e4d40009ee51b6aff043429d837e2d15de47" }, + { 2098000, "14988118799a8f7a3e9c8758a2e2533a51ddba18c12563e1673e3eb8f357c684" }, + { 2099000, "538fdf7a7bdd9045dfd5a36221bdda8f345100ae9ad465f419c983a26ba67ae6" }, + { 2100000, "affbe34e0e3a8eb133929aa70043243034e69e4cd29e572e37f4b3ae77a3ce3d" }, + { 2101000, "449c02fab4fb3a2072369a3ffa6d7c2d72011ab324d6bc9f8ae89663571026b7" }, + { 2102000, "86734a1e9e6aabfdde9e3e46b470a1e6cc2de4c135558639ad0fe0ddda4d142f" }, + { 2103000, "ce37575a3b442b389a11fcd6bb124e406016fb430ab185b91607080798b6b7f5" }, + { 2104000, "2af1ec17e7d7921a42d6befd4b7f05a0fe91fc49ce064b78beeffaa178c9b4b7" }, + { 2105000, "651f47e5816c013251fe173341be110c871ba54afbe8714cd8d2ef559a92a24b" }, + { 2106000, "d7772ff150f50e19161d7f3d6bb32626c168c04210457b6e52255fa069b84e6e" }, + { 2107000, "b33b5b7acd526a957a474fa8d2009bdd9f607bde7ae3ff1c1a2ab3c4d909be01" }, + { 2108000, "26fa3ea83837f275b11a8ab35262ce7dd827338b66711ce7eeb3b06fcef574c6" }, + { 2109000, "73a7890f913e2361215026f9e76ce52fdc34e5b321dabc70cb7deebe837c409b" }, + { 2110000, "2305398c068679d95ab41d80725611d5ef8d91b948c48df5fc7caf2171487d64" }, + { 2111000, "76fab55eb7ea7d94e6be4cd7d8b79732ffd3d4d313d2facb86b225d572237cbc" }, + { 2112000, "e1348710ce04ce2dc92e4765729d37745d29e815d7c1e0634de777fda255f601" }, + { 2113000, "c5bf0d1d55037bbb1a3f0321057b09b714c4a233b9c4bf3a797beb8abcddf4e7" }, + { 2114000, "b155483239c89982261f586d493afd9174d46ef418ca673777cb6e075025a161" }, + { 2115000, "9e0c350a10bdf25b73caf022be4bc731dfa95a2333233815e14e661c917c55a9" }, + { 2116000, "0eb7c421011d47fc2b01cea23c76ede950234cb463be94de9f56f693ec01229a" }, + { 2117000, "04c154fc0d7386b734d2740d725ee4755c01f00fd3c79fa23b5a937c51d2f935" }, + { 2118000, "7da7fc2d2562247befa055bac270a65b79b00c82c3e9ed02dd8b425e516632d3" }, + { 2119000, "9cdea9c7b2ffa063c9fb7ae63431ec6f5f314f682e2caee0e3f40acfc08ddd17" }, + { 2120000, "7d2540603d40fc92a56044060df4118ea4c8f191c5d52a077f33c60f37ddc4de" }, + { 2121000, "64bcaebd1d7b8915bea43ce2e332b124a73982c81928eb723e7bddb4b7c28e16" }, + { 2122000, "b51725acfb249cee76547174dca6c695f0504ac169664789fc249850a3ed6ea2" }, + { 2123000, "d63f032e504d010fe97eb746af331346d362b98b04a4a5d6e16aad0e999a5809" }, + { 2124000, "698cb32a3f1ed4a6b436b883482c91b5ba17cdae3968bcd0c23e24b6095f4fe1" }, + { 2125000, "436160f9f5991d027a270db5aeec584862dacdac984fdb0762237a272b8c2293" }, + { 2126000, "3b74f31837f6f24b1ee030caf1b2f2ad91fa8c105081adcff080dda60b36a864" }, + { 2127000, "9bc2c42678c1ae42fcc65fbbe038565014ceab527cdca4987a26d6b34481d874" }, + { 2128000, "a2ca3ba8f193e29f10d23c1d3cdda8cd949c27cbd41b5d1ee5dce8be5848eed3" }, + { 2129000, "01aa86894382d10d0319165915b8d2dba8ba64260a2704affd2d55ca6ac0b20f" }, + { 2130000, "24a0a11720366c8f85fbd5a63c9e2cb119c2e83a95bbcd1c87e94365a81902e6" }, + { 2131000, "4c13b463209792e378840ec332c5de23260a602bd232d15c1578c79906334455" }, + { 2132000, "4f687f0205035f09cddb889dbd1072d1ace4b7edcadfcb51c6bca44e7f5bc651" }, + { 2133000, "1b19db58c5d7852008695bab94f5de38bbae4c844d139eb4efcef3538d5f3729" }, + { 2134000, "8137131d94fcfa2e311cae34116dcf4e2698eea6f83d6abd98d6439cf860d722" }, + { 2135000, "e66ea675382adbba36fd92f5cf40d942b63063f6b5ac02387c33b3afc643d84d" }, + { 2136000, "8fdd76b214cc077b58bc823b8ce2ec119c7711cf08c1efb48a2ca3f4f779b18d" }, + { 2137000, "30ab7584f31200806e9382756e887da880db36427790cad841fc054274e200e4" }, + { 2138000, "1e27ad33bc6c0803b7ecfe271a498dcbc37fdaea3b0c39283267a43075cc415a" }, + { 2139000, "a25b5450cfac1b6ff9fcf346d88bb3b00628c0c08e9f7f50fc8a4c80b1fd1b17" }, + { 2140000, "4af501f18a7ced7fa8ed85e54772ee59b4823c2728124bfba159b85a3233440f" }, + { 2141000, "254d29fc59d4b1a29dd60e8e1c80ae9cf64fc31f59a718b0d1fdc590e65c395f" }, + { 2142000, "447144e764fe7e512b6db7a1e07f2a01da7eb7b5abd1a7eadc016f5a01cf0661" }, + { 2143000, "77394b6266b81b0603ef18ab2cb7a2d75ddea139905eed4c48e959cc083f9ab4" }, + { 2144000, "3b4255ba9efd556828f0cf204ca2caf792797a4d35fa2e05861a01525b2bc2b7" }, + { 2145000, "ca02a47fd10166d45678d9079930f0588f7250c7b712a368e3c0840a297030e8" }, + { 2146000, "fa719cd05919ebd2300bd22733ea4cb934178554882ceff44afb0cc006a20f09" }, + { 2147000, "758093d2ed99087a5712e76f81e224c7fa6da3a7af38bc66396d371d128d9ac3" }, + { 2148000, "baa77d343f47c59da6957f5441397c9be7a83c20cef837cf7c87ba649c617852" }, + { 2149000, "1d5d0dfc2eb00656c37714afc2428d81749e4b40100b674872f8d78f6b602a45" }, + { 2150000, "9ba1a3eeaec42ec5116a9e53cf3aeedde4dfe6c52848888470fb83c81e18553c" }, + { 2151000, "6524d3ab3f870fea241e4dd42091b65763dfeae1d69c2ea23b27971c90154e8c" }, + { 2152000, "f8530f17583e810964b14d58da62555bec2f42f230067c169069b6cd532827af" }, + { 2153000, "8e2099e43516a110ef42d62ceba058ca437dbc4455d1590e4490836be0abe778" }, + { 2154000, "87e6e76e10d285e135d2f8a63984be3a8883133000ede485ef91b3dd4b0393a0" }, + { 2155000, "3fd425fe78d301503fd3badc49088ca3f18fa95c96641ebf3aac847702b2a60d" }, + { 2156000, "590cd1cfeaa44445322bf80f46e4737276af34dc105856dbd773962af5547449" }, + { 2157000, "1819caf34517003528c28bded873b54767d9c0c49f41da17775650dbb4650667" }, + { 2158000, "d47798e294dd90b540fdebb9ae2c11cfffcd99e26edb989b9e46c6f501eed0af" }, + { 2159000, "6d7eb22a5d7c999ae3090d5159d6910a7ca9a9d64e76d8bc287e6a11893217ed" }, + { 2160000, "b7086e10bc39b5cec783e07adb9a0389d8e1a644230a4271cbca5a84306559a6" }, + { 2161000, "6784c440ba2ef830625fe20b615fb6167aca91265e8cd5e569df50f827601800" }, + { 2162000, "631706cdd92ef0cb64d7e573efca99e50e544a0ba3be02e4024f72baa06745ce" }, + { 2163000, "636cab9c29d6ceb713f51f454a7906f0e997389c5029057b535a4459ea449607" }, + { 2164000, "c22b0eadd83b956aff1adb64048fcafd642c765a4a47dd4b08ebda2eba233a48" }, + { 2165000, "2025ebaa5a5dfc2544e59e365fa43e675128eb4849527f601368d093f07007af" }, + { 2166000, "4ead2fb3bdf10d052e91b13dd35b7d2610406d4216be331ff21ff24b7a89caf7" }, + { 2167000, "a2c753f146afff71e6e07ab0327fe9376d6bc6956c3e9f46e27e40fd7dcd6276" }, + { 2168000, "a459996824d7636c953b217da724a42da4b105a79bb002749fdcc004583bdd52" }, + { 2169000, "eb1f314e34b1d55e52d0da81226824daa0c1e2f993efef7b68b93a7c000c8a8d" }, + { 2170000, "3205e12692d7f6c1902a4931307f2f37c3b98160065fc7a32e285bfec2e54ab9" }, + { 2171000, "d61f9acd8b100fee82a76e7a0c955bdede9cc5ee447c95c10b44d0de6c9f9112" }, + { 2172000, "da34f84dda951540df42bb4c375d8e6eb07b9e2298097367f2bc92a21ee4c610" }, + { 2173000, "1ada0ee6c2cf9113026c49926a194eab4f0ba25fc714e44b3863545817456041" }, + { 2174000, "e94871c2a2b5ae3e16f9d945491dae4d9f1eda14d83d3091ab60893561f19130" }, + { 2175000, "5873dd1597b6123aa01e7f6cd38b986b3432d845b27763399a670a4c49e5b068" }, + { 2176000, "47cf1fd022dd685f431aab3c39054a7c30eb57176ad0f9bc32db7b7c5aa8fcfa" }, + { 2177000, "c0514ce93525e3c735118434ffc7cd7294aeec6c827199fc4339cde0a9f5128c" }, + { 2178000, "c40562c6c9175961db908dfee44423f98ed48b479246385d8a634113ad7e5a92" }, + { 2179000, "4799eb15ecdbb726270dd3eff1c1348d4adb8b66d4d4727bb5bb7e7b5af31f4c" }, + { 2180000, "5beb3fae4856a4bfc0a7616ecacff0a2b80c92d93271c503d448e42f9b44b823" }, + { 2181000, "e13fb4cc17388703af41eaaadeb151d76ae547884617d6b42b644a8d3671c648" }, + { 2182000, "642aa060a213e6d953df08cbb0c19bcf4a920749918302b6945d3e6eb9de7bb1" }, + { 2183000, "fb97875d2b363c5d59114e3f4115c24c0a9de333aa013e8d2158aad18522caa0" }, + { 2184000, "50b9ca2d85ae3336300d3170b58d40aa3e963e0c7898798957341edb9dc1380e" }, + { 2185000, "0c3820112a3574d4b3ecdd236df17f182431c79b0270dff70126b4587fa6154c" }, + { 2186000, "52a55664d933e23b630363c264002e501f5a3f0f51dad0f3e6e5d6ef981e0248" }, + { 2187000, "4249009f9cebcd236c15fe743dd8fc44b31db5069f4e73e146cf49cf62219d74" }, + { 2188000, "1a3279322422ff8dd01cc65d50418e6901016a8755df51e1c6899a567ac78812" }, + { 2189000, "af510af2d906544485eb00d85269da5201e9ed61cc3943ecde9dc53f0096052a" }, + { 2190000, "d12e9936cd2e0b0e863498949ff2dd7c85ceb5427bd551cae36b2bb726dd0dcf" }, + { 2191000, "0867375fb3a5c7d5a3c30425b09608f2744589c3b0dc30dfcbb62798cece87a4" }, + { 2192000, "108453aa3e117b0322eb9e947f4f0732688b8664d9da1e04068512c8ca1cbdc7" }, + { 2193000, "e4fa198812790f8d5089ba17451c9b81fe2c3220591068ce602fee1c678cdc0d" }, + { 2194000, "a25bdaa6bd059c73eedad5f0771dd1fb29b58cbd6dd2a05f27df9abef9a3993d" }, + { 2195000, "13c5dc49fa185569341e98167feb323d8243d00d173f700d6398c5845c4d2533" }, + { 2196000, "bbb31288f9c5917b693e44679fe7d71329435b4df16a20ca660358fd31791047" }, + { 2197000, "47007f5503c011ff06c469d8935208a0676f00a36e1501ce475555a9c5387f21" }, + { 2198000, "5f2662e817a54f09c73bbd115299892839b961305773f03422a7274bbce8b579" }, + { 2199000, "8d86a796e1f7ba42b3953f3772b2b9b47bf144edc3c9ff8b53397ea347d195ad" }, + { 2200000, "7b75666b0c743d7c7bf9e6de9256e0e90dbe668f05c1736fbe90dea40e2ea2fe" }, + { 2201000, "c334ed5d0574943f25517ac154011a9eaac32d9e1528d1abcde88d0f14693e3c" }, + { 2202000, "8b69fd156b4f02e3aae17b409f34603a6c5506e2bb4b725770bc91c1913c95c9" }, + { 2203000, "c86aed5c54dc9dd23d547fe543aab8e691636b435136191b944b9b84d81aa1a6" }, + { 2204000, "4bdb78d2386d375e3956f042570587d109cd953afbc5212f91e88f49cada4787" }, + { 2205000, "3df20398d9a377ba6e88121900d1a3077157ad1dff81dd9ba62b260f08bd2a16" }, + { 2206000, "eec1915a092b38583c7495f8b6a1cd5f49ad57daefdc32757ca1444369650754" }, + { 2207000, "ac9339edd07edb0f049d49c62d4cf5ccb85e2ac86d9053f0270588fd7944fd91" }, + { 2208000, "a200047c346addb3560bfa31c8aa7e0d098e332a8bdf842f72ed2ab2dbb7a379" }, + { 2209000, "db70233321a72633f2d4d5a2b9e9277ab9d9ee530f9044e7ec3f06b18ee32b4b" }, + { 2210000, "9c38c3bff9ab0b9ef0f811b9043185266d1f35bbb958250476d0c3bd27000d9d" }, + { 2211000, "181d02d1e62a52e529fa01a0fd8ea2e905922e30f987b0ecf0596c93c7741603" }, + { 2212000, "d6bc1af53495bb9ee3dd0abe99a40aa1765ae62063515cf8a40415a75f1f45d3" }, + { 2213000, "32dfe1bb67bfa31d0446d35925f55fd53d0782fb81fcd4e1ad3195d29e505cb9" }, + { 2214000, "aca9fa8c195da5d56dbfa9c50b1a55a0d18d858553da29cca878c5c9dced6965" }, + { 2215000, "21dccc0b29993e7292cb3273484354e05c341e6808b02a2ea32a9c4aa527ea44" }, + { 2216000, "5a34923c885a6adeed00aa905cac95560b91ca7225dbc4b8ba535c7d1d7b7e7f" }, + { 2217000, "3a09f94b995439b5f27264f7868bcef30e991b214f15b697b3e43bda919cc555" }, + { 2218000, "8aefaf343689fcd9a862b23652fae22d482582bca3bff4f732db1df93d6b5217" }, + { 2219000, "ee2dbd935dab6a5b429494acb7f178e1c4477754a4dddf83f8dbeb6e28a27af1" }, + { 2220000, "70475415184d51f0386e4493c6255adfa89777677dc73daa45870cc395ad2dca" }, + { 2221000, "2ee1c6e10335893099a2ffdad1a1bf4e781b1bf888b1eb54e7146079fb084b27" }, + { 2222000, "d8ea4e0ca93e4c90d3a9ed53724856e0330142df5fa4db78db202396af4da050" }, + { 2223000, "d89ac0391552b66c81f416a272e21f3c854583567f94501617b24fdfd47383c0" }, + { 2224000, "9a30ef63b852a77f4a4c61bc119cae6807e2c6d1bd776f7ff16492a1085105a7" }, + { 2225000, "d9d7326f394f7ba41f8a089b95a69235960a2b0aae1293909a02238c4db34a52" }, + { 2226000, "963ba35e17303d4395120b48f0edd343f287e78e90a39c14d6373ceb1da8ab07" }, + { 2227000, "082270c5d088583511665670b9c21614a250387e8baf4d7a9de0b7f7456312d0" }, + { 2228000, "e8c4a0b28b2d696538b1648a06637b9a2a413f171708869e4d3986208eb7d193" }, + { 2229000, "94918ed945e05aa512aeeecddd29364d6f4a16f502196f4a4fe889e091b5e8e8" }, + { 2230000, "3733acb6ade0a07dd056afeb522ee6a37f276f68939dd9908d79c477bc6b53d6" }, + { 2231000, "e4cfa3baca1f00eeda3da57970a64c8811a59ed2d4dfe60ee4879499e1693383" }, + { 2232000, "2cafe814570a40fc82ba035c99e494a81c26e85ecf78bf47236737af844a44c8" }, + { 2233000, "0844b20c3a6070660096fb79eb675faad26b07c9c387fae58a6c231f9e707c64" }, + { 2234000, "7a0ef4c987021aec12dc0a4eb18608f0a195b0aea0371aeee356c8cf132fd113" }, + { 2235000, "43e251bfcccf23409ab212a5b18a2b0c49a2ca56eaa94436ea9e0256ac9b8dca" }, + { 2236000, "ea5fe254780228d19d8a27f6985407f88b549e9df1dc2f2280c50ea5f42e63b2" }, + { 2237000, "0dd0607f072062dd4184a34f3294e67f5a8ad14ce949af6e0c0a84cda650c6b6" }, + { 2238000, "ae7f1063082e3a1f71d817cd2f47e7de5b2707cabfe0e9efcf9c9def4e4d2dea" }, + { 2239000, "bf62b9020a182432b5aa44fd9ea00e2d60ee66f6f38f7754028e2c41a425457e" }, + { 2240000, "c1ae7585d61296b8b016b909c2e0273680bf700e30d172c8310f939924468371" }, + { 2241000, "a157b62256dde76ac2d5781096673df96f41e18e47b17d3982c483904b99a4be" }, + { 2242000, "755f582a80abc6561f97d8ffac21634252257f65c118a39e0a8c023d621c7775" }, + { 2243000, "8189de82f67b2886ddc55566abbf0daa7c1df1b36b73dd48a6e081486623e785" }, + { 2244000, "160473063ddd5e03ec5eee54137c48233787497da862970280bcee3ec20d171c" }, + { 2245000, "bd68e842759879aec30b198ef0df8e17958d40f374350b2d2221527448e58d75" }, + { 2246000, "7a4dcb47c71cf7118e11bdf5c1dd49e9f50908ce0044423a0e4ed782a4a50a26" }, + { 2247000, "53d761b43ccced5297f12b58f2af0a7979327c4570a19ab2a7657d9cc6132bde" }, + { 2248000, "0fed5484767e09df2cbc76e98ef1ca9865d9b5c9eb1b5f442a090f8d63d70c0d" }, + { 2249000, "ba483519ee63112d6f188027cf353bade93ae061fa049cf1e093cf4210bad628" }, + { 2250000, "daa4b44006bcee51edd9263ae4fe512c4b3ea1e8f46737b8acc6dbdb380a619f" }, + { 2251000, "baa7a96f0bbdf57d7313e5d4e9cfefa1ab784c5e5c038c84a43a51bcd736ad83" }, + { 2252000, "e354404ef9606863602a865eae21b99600607c21b818e4c6746db3455fc3f920" }, + { 2253000, "27068a24b5b60c5ec045a09ab781a884f66505f490fcc9be2d0d66344ca4f3a1" }, + { 2254000, "e034a2066a53a366ca41f17a7f5ffaf2b6fa31c7cd916d8108926d0c4eb7216a" }, + { 2255000, "2b5b1547c2dff5cb64b6ff7accee9f1bd4d4db319ce4463f8c3572d7663260c7" }, + { 2256000, "e21a19565a44ee5428376a1f6afad5c06971ea400f6cd7dadbf89b34ff68a072" }, + { 2257000, "de0c0aed5fdf3e36810c915373117d533dca74ab4094610abc0f08d795506cc7" }, + { 2258000, "5d474cd7103c8047b278b74219e41a395a8d979cc1d99f1052d5f9a7ae6c79fa" }, + { 2259000, "4a5573dbc5c8ebb01a8495096068ca6f31a23a58b4e67b1616ee52274240ba6e" }, + { 2260000, "ffb34fe002416c5bbd603b31fdd5738dba32037de3c66782decd10b73c9db828" }, + { 2261000, "79bc9f2e98103cce54dc3ba3c265a7c555ca456753e6a4fee7c5c4994719af96" }, + { 2262000, "977e594ec352bae9e19532cafc273b49e529bf939d4f9baa2da88daeb7e51e8e" }, + { 2263000, "e3bcbd1ff0892259d79944b7d4cee59c6b81c7f450d89b70087d47962a95c3ca" }, + { 2264000, "505323d6948934b33ea1c1094012cc85ea7544b3017549456bd14901205bc88d" }, + { 2265000, "7543e67f132377416de1a67fe5aa7a80576031de52cd7af110266fd5abfd875c" }, + { 2266000, "ec1fce7805db0d54618445612de62d1959849c26e92689eae1913923a2d0126c" }, + { 2267000, "427e6650c9371fbcda64cd902b42207a4c781d88bafd7f2a80e138a10cf6b802" }, + { 2268000, "fb396e0443159917ebad0a08a78a190dd1d90a97d440bba20d14165d88c3795e" }, + { 2269000, "e9770f3f5a3427cfef141982e79cd6ce2f4bfe8c2ff8861182cec97242c8bd3d" }, + { 2270000, "0b4317950eb50d049414e400a6f488c530d9f93875b62ec6e3f3896c96a88224" }, + { 2271000, "bbe32e8aa6e29cbd98647796acafdf02168d9d1ed943e04529d1fbfc0a7bb17c" }, + { 2272000, "947e9614d040eb97978fbd1482bafae47962e27ddead68150a1328563e15fb4e" }, + { 2273000, "a2611479ec9e2e623cc4dd59bc3161af44f12fd4fe01d897c1465accf9ce93b8" }, + { 2274000, "e76a6a528860db1ab29eaf73529277fad6af434df6247417366b72caa8bc89d0" }, + { 2275000, "b0e2a07494e186c5e4ba0e7d1fced62ed7fb352860e96cb3220c7991568179cf" }, + { 2276000, "c9a5852a070cded44bb25975962ab279916992cf8097810005713ad6f9425143" }, + { 2277000, "1d1ea83df25cb4046811ac55babb4318370696f26ee0b928afcaeccd1d8b91b5" }, + { 2278000, "3dc0d4924f06775dc17b09a4c053218a8785d05682395a00107106c40e9fb47d" }, + { 2279000, "7e5afd6d9fd5157dfa1e1eb2ed237811f34d24fdbdfd53af9e08a1972434fc6a" }, + { 2280000, "3c90e2c9bd14a35d3b47e36b609adca49d7c8d11e4ca244b3c590f925484670d" }, + { 2281000, "33725b02810c87b23a561671b8cc88266869617eff8722a61d294360c6800ac0" }, + { 2282000, "aeb73ba4e0224fbf5de9624db4423b8634d92993e6b08718be092960cae8dbf1" }, + { 2283000, "ed442690ab025dbeb768e72b39461d10e5b4d76c2b2cc111534b9b362b23e86b" }, + { 2284000, "7ed5a064954b24d5357ac66924d5ff786d6207655e9c494fa588c19af4e029eb" }, + { 2285000, "6b7ef1927f93040de5f5af4e54ceeec1741b36cab2c7bcfcd698966e9bebe10e" }, + { 2286000, "ea239c8c967ff7200dda0ace6a1a8f4343d5a3d782120fda9123c09e44496a94" }, + { 2287000, "b33785fe1656beca2a54a7b33d60908dc2f384332958a3fa25d59c0fcb1ac240" }, + { 2288000, "ca6e2c409864101b76db5c2af8dcc728172f97271b4c0cf92a3574e4a3ff194b" }, + { 2289000, "87ae1c42b2724fd037fab4ec9087619fb6efc546b84dff1db84f2fc308c8f28f" }, + { 2290000, "0c5a006caad2b37533f6d138e86aa88658495ea866398e719cac45188d7f128f" }, + { 2291000, "8f47a88442bd270af71687bc67c4d827c93345a313923d5ac2be0ca11f1c353a" }, + { 2292000, "350de82718fcb71c3e1ca07cd5fb697d4a30dfe5dc49ca144f0a39f484e71749" }, + { 2293000, "70081e64addcd8cf2f82a8cfd025a0e2617ee38bf131abfebdab76d75eba5b96" }, + { 2294000, "9b10b43d4f7fd56cdebf0bc4a4a972d5657e68b9d142fb203271c037fcbce4d0" }, + { 2295000, "5a21d694dba7aa81abb208d4dcf20e2551e7417cf73b0cad44d549f6e32e33a2" }, + { 2296000, "c6e64234bf4276308a29bff81e279889b44522055f3f25278e9dba81e76c5988" }, + { 2297000, "a15905eecd42a33b8d1f4cc320364c45cc5316ab917e01fe31543620d141393c" }, + { 2298000, "38c33c729b06d995f063d80698a14dabb72e294ec91da91f731096fd5c470231" }, + { 2299000, "a7828cfb15aeeba9884c4a0573b60795bd9ad9ba2b2e82833c7ef69194555097" }, + { 2300000, "fb81383ac4efe25ec29995f8e85e1d9a16140373b31ef3ffdb193d691315e0ca" }, + { 2301000, "65c98e237a6b3890318d62e7be2b4abc019d98b05fc6cfd593ca9128c2e11e86" }, + { 2302000, "7750f44d03ab314e1abaab04b82be84059d20c64177eb4b4a3746feb812550be" }, + { 2303000, "842ec42f1b93ce5c61c56fabc609e7d4225d402ea8efd38bc57561796a06fd4b" }, + { 2304000, "e4c7de93fd6596ff699b3a284974c55f389372f0d53dfee2e5d955fd958fc7c8" }, + { 2305000, "6a14a12bd8eac29df964ea8cdf559b3f686571088c26c9f1066bb7954479255b" }, + { 2306000, "38e6dd10f352425ac307d5702e1ef0ecef7ec5c2ecdbbe35750c5d31233786ee" }, + { 2307000, "86e0384f8fc9f3e93748c1524c3da8fa39821808f17a2a1ecc07aaabab31502b" }, + { 2308000, "f3dc242cd337acbd65def8eb7a203bde2ee9db0fe9cc6d3643c06751d573ce5d" }, + { 2309000, "80c25c6d72d10410118a170098cbb601e483a123666539915be02063a9a5759e" }, + { 2310000, "6158193921a37e325d232ab6b34eb58ef087e171025589b9ad69c8b1360d4e8e" }, + { 2311000, "900f162e676c4512c6c7937411bcabe04b49719eb036e864c263804469703a44" }, + { 2312000, "fa9aabfc9da426487346a13035b48407bb0deac06c46e24d53d8df9261123837" }, + { 2313000, "11750c5126c15857631ecf5c4c6fe7ceb7ac58c73ce25c2ba45488c0d64e1d72" }, + { 2314000, "4b19cf58bca9ed1ed254dd13187762716384f01c8b939a9b3c5185950062a089" }, + { 2315000, "1213ce12fd90e0727ac52d8458ed87ee6d8c63eab6c395bb1942ec8d8bdac575" }, + { 2316000, "d98f5606f9ffe1bfb3e172d7da017179cb9cca7f4ab6bc9f71c14161edff7fbe" }, + { 2317000, "7c3dc0e15446330d92656bc9b4babfa0a1e819a8a0d5acbfc17196adb8d6d2e2" }, + { 2318000, "3edbaaac7f8edd02477d4be0faff408935d804bcb8f360cbfe231f02e088cb27" }, + { 2319000, "91f5b6d26f0e08deb2d8f19310566324d0574e84cc8f27fd9106e3e3380c962c" }, + { 2320000, "51fab90ed2af5a6dc4eb18ae3d5b591529ab8cfd7d49da2b2b4408dada68745b" }, + { 2321000, "c855fce103663cad7bbce39c5df77ec6a474bf999a111d90b884987b5e26fc1b" }, + { 2322000, "42a602344b180e1c15f01f991b56320e7490187aabe49df8fb765058069cd304" }, + { 2323000, "ecaa36b93f25b51a1ad07ff959386ef255a3cbd8b4e3850efeb54a51c83edf62" }, + { 2324000, "b76e5c05e0f2445e4601f3c418d4a9ae4bc073795dd442d8040df8b0ba790220" }, + { 2325000, "0834f8a68a5ceb81387440eeaba75c67e6a811eb62c5079785b72921ef0e8897" }, + { 2326000, "6ce00af357920fc07c30e2f14bb0a89b4ab61068354b4e27ef335a41ca885b71" }, + { 2327000, "20f1e0b25e71b5c32b7bbbc294f4d30ffb416d6bc49ab7ec2c3a3af6797d009d" }, + { 2328000, "5734baa189f470c3229d31d764cda5abee0f1b93e2bfbbd09b244959287279ed" }, + { 2329000, "69640e868fb4b7fc6b4ea9e32c8994271816f161faeb88c62242803f1d4fcf8f" }, + { 2330000, "f5fd093b69a744f366b44eac37228e10040ed1993078f70344c9c52bb999fa77" }, + { 2331000, "955b0d1b0810e9c57b7709090edb865b66c2c4f384be28c0118edb863e3f76a9" }, + { 2332000, "6fa1fb264c37ff092bb6fe380d4cb3d3cba00772ccc78b2c30da5de235211979" }, + { 2333000, "8f85e52d863515c296622f7520237bf28c8402544b636f9fb24cb1be2eacb973" }, + { 2334000, "b043676fc6c0f9075965624f8678c9fbc84cd117c21dabfda15ab753ddc20c0c" }, + { 2335000, "2d628fb8d51b978f15706dc76e68ead7577714ba0554e752bb5da96644f3865f" }, + { 2336000, "eea1c0aec958031a7a767d02d394fd0e6dea5fa55306ff91d60d122f91039568" }, + { 2337000, "06b78c8c80942e27dac1f1bd275b72a0ed57e71295cb9c35a9ef0ab67638b2d8" }, + { 2338000, "477579230e2f2a243231c73b92f0df400bc2692b828d87e232b9b63d2126ae7f" }, + { 2339000, "5960c7aef04b9ba9c6ba88f5dbe8c45c328eecd19c6bb998c896a6fe2824e504" }, + { 2340000, "6c6fc49cd2c244d383c4ff959c1cc8e60dcab33e0b09bbfb13c63437aefb121e" }, + { 2341000, "24ce0eb54da3766177e426407797b75a3397afc6efa7ae30bb667bf86e5db509" }, + { 2342000, "db07bf1c73c1713efa74f0224a59c3ce3e7b437fab09c83507849640156b0ad1" }, + { 2343000, "039498f2516040eef8b4c26281009a9dd342535a4c6d4c243e0b2b251a816f51" }, + { 2344000, "f645ebf1873ffb5b463ad6b8012976b99baf32ec13e899effc4ba528d559b5af" }, + { 2345000, "4302c7a2f4c96e1e92c0a00451972b8d048cdc83538c1dae6718e01a8bf6c0cc" }, + { 2346000, "31d8bd979c51ca22a4908159c87a7e7a70e8083efdbfb574a59041cae57e6147" }, + { 2347000, "7e2337b84a39061c9258cac1c99a7af45771339d8021afb322a9e0569cffae1c" }, + { 2348000, "364c66eca080e3ce32ad7595d4337050289b7afa64a689f8579aa8b31a5f7af6" }, + { 2349000, "0318342c3f6fdf8f868a976575f8f588fcb4ebd981505f38ade43df181c24091" }, + { 2350000, "95c1d1b431674edcf3b15fc63ea14f5364011b17da6658b218e1a98a7e36322d" }, + { 2351000, "77312483f000f7b6b7d01d03aaf274b858d7e39542c6b06fbba828780ed2cf09" }, + { 2352000, "82891a17c0b41b2d8d083fe8ae66d533a59313e11c527f7a9c2a32794d1667de" }, + { 2353000, "3726fb793dbd4f231b7a78bef8e4dcf3e198704835a3e07b15f4f73fc809225e" }, + { 2354000, "5e859c973a0e4acc9e99ee5a2fcfd4d5d022d509ec5ce8c95e3ed21d89dea485" }, + { 2355000, "63e1ea81fcbd32ea0950b99fa0655c21544926fc607a445d726d8d855c3c407b" }, + { 2356000, "f456c49943ef738a4592c4a5b92ced08f74980d029e74d981b7051fbadf21b24" }, + { 2357000, "babe39e804074ff7cdd42dcafdadc640716ae6a1551fc2e3d3c71cca0a9610b2" }, + { 2358000, "69fd062b16d9423d339da5d7558317065fd679a4dfcedd4c7128ce4fffe40cc3" }, + { 2359000, "828f28a0f4e134a8d39bc75f992c7011682586c60c61cd2b8337a010e4ed15c4" }, + { 2360000, "70793daa730b7f4d43b3e76318f1f4fc91a161995cba16b004ffa0494703b53f" }, + { 2361000, "22f7c42b662da9444418b681c64eef9a992b3b0c09360bf62deee7728c71ec16" }, + { 2362000, "3dfcc653f09b192208af101e635aa8d3b66211ec5f8ab5acdc7712c7fbae2ab8" }, + { 2363000, "ecdfa7dd8d2cc37f201cbc5187824d1a242d2bfdf7c928c1721f8f32303f2711" }, + { 2364000, "237a5f1be0aa783b377ccac8dca08f5ec95e12318eba178572a0bc5a3c95fbd6" }, + { 2365000, "493d694bb0471b91383762e550cebd8e2f3bfbf81b1ef61b566af5d52615077a" }, + { 2366000, "5849b8ee1c13f85275e55523f0e2c49b6a559b5ea9c125b235707a36ec474c26" }, + { 2367000, "2c569ccda156046fda97a7e4466e48ce0da3c11a70ca48fa92e821040abfdd37" }, + { 2368000, "bdc61755bb8f83fa43f08c350a8b21dd299ca04918253bdb1496afb27d6c2693" }, + { 2369000, "11743bf15707a5663b7d570b88182fe13c4a7fbef4683846fe4c47ec979390c1" }, + { 2370000, "b881289834ea18b012d0790f9c9394cb76b6adde004d3aa01213a1e41a43d189" }, + { 2371000, "6f64441868c1a79b981f88509f508a2dcf8f538e59d8b7b2cc4becd523f0b24f" }, + { 2372000, "36bc1608c70389f4c365e482c0b7fe4884a11ce5c97897a97f9089296654a2f8" }, + { 2373000, "95873f87491b1bb65b0077a79b544b7f06aecae7c094c2f7fcaece9ad917fa1d" }, + { 2374000, "a5baa65d9ab17008e9d1afeca221fccf1fd3414b04a9ae72e95df43d3d7a34cf" }, + { 2375000, "35a4fe1b0c54af77436bb7d843a0818189f0aa006dbb254e894fb28b27e6ddf6" }, + { 2376000, "1456522b371113d86f4dc4792487de70e7de3706a2d8704a9c293f08433bf25d" }, + { 2377000, "ced96f60077c8a074b6d4e685d9bdbfc3127383fe574d7a9b8350fb8851798b6" }, + { 2378000, "245d03edfe82147f661c44b74543eaf229666689d6b04a6c475b4bc139df79d5" }, + { 2379000, "bb2a3b8ee3231ea68ee6d1e48468d365b12461f83952d2bd803ceed777920143" }, + { 2380000, "5750dec9daf6d568e166c57831d878c63f298cf1e45c612d9d7ff8a7969a00ca" }, + { 2381000, "5914a5808e7b55491ddce732018b6a8b77a5fbc46a5b0a27ffe293cb13a57001" }, + { 2382000, "a2f780ba07668c71c4ad2b1d48955f4135ea4ac4b2d099e61e8275662edcd915" }, + { 2383000, "513cbb9e445c393db56f8eaf6638d29a34da8ac22b3a721980495081995f1bc2" }, + { 2384000, "34d7f5759a30a4e97214bd8f82b303d77c22a281d5b5401faab8581f4f2c2370" }, + { 2385000, "259b0ea9a5e7ab8999ff1c51399ce3f511c2284440da9a92e558bd05eb062155" }, + { 2386000, "fff0148187a9b0c9391cc70d103f5f8089692119e4d9443e3d0df3d27ffc879d" }, + { 2387000, "c2cd40033acdf616c2cadbcc5494cfe954ef904ed6d566962a845ba4ed7ce28e" }, + { 2388000, "d2168519d4e163aa189f0d06845e3d832f46c3efd225a5a9a5c83edf042287c2" }, + { 2389000, "138e22dae92b39c151f125f181240f97e635657032ddde3a22ddd3d1f722cdf5" }, + { 2390000, "063dc484965a1cf0ba6fb3275b0ef6173e3d02791e88fd209e1d1219acbbb468" }, + { 2391000, "7f00f5a7188c38f3eb15a95b737a0b9835d49d3c2407a4176ce463a547cebc94" }, + { 2392000, "d3dba1f49b7b254e7f52170de135b9fbf315598e2a7c940ee3990a6cd0fa7838" }, + { 2393000, "eae39f2510aac595a4192f247d473ea030288bfe09ba1a5bf97b3a1487ba4697" }, + { 2394000, "b83ad56609b0ee1fa3a2bda28e6a83b7d95ba359b3fbdf6391ced48c327a4c44" }, + { 2395000, "c471716d7c3a04f6c9ccf578d28b4a4d4b6ba14d648c33f88de8978a0218668c" }, + { 2396000, "45dea3ee1ccb6c67b7856d8c4b8177576caccf18c4917891e5d0c934b04a7f3b" }, + { 2397000, "9e91abe80a9670f87ea8f519ec3e192815848ab3097863ae7281b11648928e65" }, + { 2398000, "81e8090c4e2aa560af428a75b9bb724cff3859b234db010914564c78d2047513" }, + { 2399000, "24f39f075ae8447a2a84e43fce45b02bf8910ddabf1cac0bae8c11fa942117f3" }, + { 2400000, "a7612655d0ef19c15687876d1b826bfa678e53c9c7956c586dcac8c438911d33" }, + { 2401000, "f58e1b07bf4f33b4cba183701a22b5d1004694ce8b0c22b68bb91ef50e17cb21" }, + { 2402000, "0546d3147e8863c96f92310d5bf9694630419823f278685180e8243c6a92a71b" }, + { 2403000, "ed2204750a97e9ffc3b45ea5b0d0fd94e2c61c581ce8d9e7ecefc5c66d07b580" }, + { 2404000, "16355ad1178350dd6fef4a0afbbeaf1cccaa3ba8a4ee9583bc2c2c5ae0f5a262" }, + { 2405000, "795c2165f1412e65875021681bbc453fd5d71f453bd6576d42e0e260db6f393d" }, + { 2406000, "2ba5cb57e81fe96b6337294246a186bc6c45b5034ee4ff4c7b4bda82defc67ca" }, + { 2407000, "7ba78fe69f7b2e259a0c7679f3276e04b4d0b39b287b88b1b91a67e22c1964e8" }, + { 2408000, "982e4b8ae903b992e6fb161ee8af8a71268b572acfda4efaa9f13897587e7dcd" }, + { 2409000, "7c5df636f8aa0a13e927c3d1d767daa7825ad18ab3e025765ed94c281d83fb23" }, + { 2410000, "d40f3d16b233354642f864f82dd1e661f5227b326a82e0361db666af31c2ac11" }, + { 2411000, "214461bb2d7ac22c38861c4a195345cdcddcccc743354bd54569384ce16aa3e7" }, + { 2412000, "bb2c80722973edfe1e043aee436de427c54abb31b053ba97d5ce8854f3711add" }, + { 2413000, "86b4fdc0e68ab24034652b0056b0f134e52dc9360762f95031cd80799f7d9521" }, + { 2414000, "d59afac1ee35f54daf208b7b06ef495f5a152bad535e8c09f88957cdbd28b192" }, + { 2415000, "d5a5b8ebb6f621a6f4bf0cfa8aa5cb07dce6eb5cfe52272944c21e86a4c15d80" }, + { 2416000, "9890d3d491bda6453dd0933caa971f6b6f17684337474e30ce87ed2a3bec47a7" }, + { 2417000, "c062d22f44d27f41544341dac2ef153ac8fba753cd76a7445e1a54c942281ad6" }, + { 2418000, "0f0781f011315b1636c152f88d364e60e9f533055ca8055cc0cdbdd83517001e" }, + { 2419000, "13b24eb6e85259434ddeb750828965b5a7aa02ebceef19848fc6e581ba6277d7" }, + { 2420000, "24635677a9cba39f794b9e1569b5fbf5a31661104c4d0ea68bba32784729e6f3" }, + { 2421000, "3456ed34613c048798fc0daedc44a8ab6fb5ff6f7b86a96f20477c14f4dfacea" }, + { 2422000, "1592ffc260faca97f91ea548a74f0eabf6220e3eb15118a97e3afb6604055e18" }, + { 2423000, "902cc66a97b285bbe01310d55f5a05886c07d4dbc35c0eddb2c5c821ab23a0af" }, + { 2424000, "ba2f5df32f95d4c2052ca3d54e2af7221a14cf75cc9a350ef7eaeb80d4193f2b" }, + { 2425000, "75d32cde27abe58e0ad3d2d26349cf378a94d454a24dfad215b52a336a8f2c83" }, + { 2426000, "baf5e136da80135ea6c70ee314f78b40b53ec21a010c5012983f0aa81f448cf6" }, + { 2427000, "7f685c054c12483562f8709a75a45d7164141a4bd89807e81457f8694b465243" }, + { 2428000, "0416ee23bd6d5d021a53cbb91c82e79c5e5c2063901d3e31a82d05ae34ad08b6" }, + { 2429000, "a2e14237320b9ff876ef2e2860b3fd2d5ef555558639d93695a2911125a2fbc9" }, + { 2430000, "c43f0b5bf14dbef830d0f2ad530e12948356a0f4ac07655b3b5fcebea997d6ba" }, + { 2431000, "d792e54f13e36c534f8ef5e00e96831b989769b0052afa05988036aa007769a4" }, + { 2432000, "e6714f851fe45eb0ec6b7fc5088572c2ffbb13e2f760ca1ec6d506604f850336" }, + { 2433000, "56375727c855874b63f7da265abb2ba4dabb21b9e5a4faa1d182069d6fe498a5" }, + { 2434000, "3a0ac14f168c18460b937aff4ec5ad75001925754e62a539c2ca7d35fe40f0cf" }, + { 2435000, "cf422d5e431376090e6d7f75638b283399c39ad3439c069f020f29b08f84de32" }, + { 2436000, "fe34c442ba06df667f07c2ddb2cb7c0dfc8f93e90275707df1cf9204ab56b190" }, + { 2437000, "6f7805b04731d0b2b2e902fd37c8ddd5210746ee5d99d1df4680e44ebfd327d1" }, + { 2438000, "180be0a9e6b5c1d6d96874661202dd5ce7a8cb9d0b4705ce434ea0e455dfc4e9" }, + { 2439000, "5e1b67c4fcc8db5ad3c84319316238eb54296a897740762f9f85df18b8afd2de" }, + { 2440000, "645d9c0d8ed5cfd2b8ee8534be67fa2fc0d95e7b38198a9c005cb16e0b6c0d3f" }, + { 2441000, "d1eb6a4afdeea9d45f7e33ec2ef8e11b42c99b52e80ba254054aad2f185f354e" }, + { 2442000, "31a2e87d1090afc45849cf7feb7e680c01318255a67bad40d0e07dbe60806524" }, + { 2443000, "65c53ef01de68934e77bf5d6fd4191fa622ce8dfec5aff77b0a8bf0937f3e733" }, + { 2444000, "4fa7b7d7909ec50e0bd6d412149850190e0a9ae45932f6d3a97a09adad07c245" }, + { 2445000, "56719482cb117fd613c310083d16c4a1d1420aed316f593d72480f3b8f6acbd8" }, + { 2446000, "844df7d3f37b3ae30cc08b91bb6db7fca47b836f438ab9a1ceb4c158220d75b3" }, + { 2447000, "8616d22aca850dc7ae4fdfb1b56bea94b16851434831916f54731a4d65ea6697" }, + { 2448000, "e68853d43870b6667d60fcdf06f5476eccedd7cfd43663df56eddcf0ee75fa53" }, + { 2449000, "56e483205ad54c420c66c611e5ac8bde866872f3734588a424709a52af595ab3" }, + { 2450000, "6eb296e948fe64caaef1f3f03e39fe59b888b80fbf3a2355dd27ce261f96768f" }, + { 2451000, "2eedf6926c6068bb9542163d08863112445c2f863109d7a49595fc8d111a973e" }, + { 2452000, "d9926779aac9f89e8f18301e8161aeac6ca3d8823e9d19809e919af9bb7a1630" }, + { 2453000, "41a9d0f45894c66e49c6a26555a953dc09fd1be8d029965e8d9403d65e794cdb" }, + { 2454000, "0b51fe2d0829f760dfa35f7ed43f6358ff82b34507317a0ba4652bac3a8ede32" }, + { 2455000, "e7b944f2aea293e84dd51c78c43711aa6c2538a62fe25796a4454be4df7667d8" }, + { 2456000, "a9de869f67f25828e87da9917d0ab9d8ea7c72a5a8a37a5de02919564f75012e" }, + { 2457000, "ac325ca6a6e873bfee16b1a1d79917a38b4a46ea0f5feaabc9adedac251000f5" }, + { 2458000, "a091a963c9793a41533bbe8f96d50c6aa1562c50ed2b086a369ee3832fc9afcb" }, + { 2459000, "7b25d7d3b1aec6e569a9775383a000368cc4819cc007ff1e36940f56a2692643" }, + { 2460000, "43674412db8a96e93d10c9b3585eba99dabf81a89db8bb0242e9237bb7d57508" }, + { 2461000, "9090cb815cdc4c608b7a466ff2ba801f550e48074963ff72d774f9af12e635f1" }, + { 2462000, "6ccbbd2d9fa00615932b52310d197ef3efd7a12c8c299b810561dfc95d44397a" }, + { 2463000, "04ca064ddfaa26aebaa8983844dbb4f861fa4295e8f7a56397353fb81b32874d" }, + { 2464000, "59db9fa192ce7b21146bd4621802a8d94426d6ba31a41913cd359b03683ba5b3" }, + { 2465000, "8c05079ddcd4abffdc285162cf8685bbfeaf46ec25ee55592c64546b94351abe" }, + { 2466000, "a88912d963d0b59f9aae476639f20e9830f8b8ebd51277f04558e61f76065af8" }, + { 2467000, "c33e45b7aa0ecb68a61a35701b9373897e7789fcde32251573cbbb1d504877d9" }, + { 2468000, "f5f5a699b88a7d26a936520329333f9b23653a4893e12e853f2a9458e7b0837b" }, + { 2469000, "ec49a37e8b557f252005ed28a191294efecdc2e354147c49b47d858547d388f8" }, + { 2470000, "ab4aadb9a628c0208a5296af3626cc71068fe06b6fc8f0d6944f3f4471a649ca" }, + { 2471000, "189da104aee7d93b7dbadc56d01e556659632cc79ddfee644a4da438bb763e9a" }, + { 2472000, "06c4174c43ea62f4e7d2a7b627c1e68f2d75b69b7705f4ec073ce32ce2913d31" }, + { 2473000, "7ed94dc9b77882da0766389eb207d46fae1bc84bd91d609c1d3a2cef0fb71b03" }, + { 2474000, "08319dba56921b8aaba22caac54238aaeb032df3bf9bc58e0f91b5824741101a" }, + { 2475000, "f4549a5638ee91ed111929da4b6dbe75201ddc6bf96d1d3ed16bed8c86efbc5b" }, + { 2476000, "82aff9fcbef0d7d7cb255c69f4433bf19aecde07300b3e8854f413eed8dd1419" }, + { 2477000, "2cacab8fb7ace412ce537e07ee3ac72bffb43f14a2c492de55782101dd370691" }, + { 2478000, "17f181cf7fb735d2c0703c0e6c21f22ee127f58ccf181a1b9d31a88349990701" }, + { 2479000, "df0f9d85bd92597f54d6fa387c8f65b0e886baad91f45d5f5f8e319530447f41" }, + { 2480000, "4224dff3aac240443c1a4f2eca7f88e33c6dc02168945007cc335cbaa4206d6e" }, + { 2481000, "c4d58e11553bbbd5b16b82d18a28e06b79498d2732b1e56490eb71f76d5d4213" }, + { 2482000, "c31d9e58a645f50f72e95babd7bce031c483ff69c53f68336b60a1810026e3f8" }, + { 2483000, "f67548f64bcbf5adf3994df4f629247f2d7fbe06ae69a61eb2921ad3445d3095" }, + { 2484000, "07aa458e3035d9e68e106084bce941aaf7503348ddb163e0e70b17e4573c9ef0" }, + { 2485000, "110cb5bb28c5e24b3898b70c231895d65d46b75da849e4c2104d9518a8ddcbe0" }, + { 2486000, "2842280334391742c410c9077085e275941bacd7db61c76ab3605c19f07b52f8" }, + { 2487000, "1632a1207f4ed3e580f9c9de91d18c4a953c6dc7de3aaec3b2caf9bd7c78a12b" }, + { 2488000, "b39a4eb4cdfd0f938134cc1a8aa5f239edcfa87adbc5440ad2e3c3d66adcb0e1" }, + { 2489000, "e381d072bd5b1cbdd1f979b33d9b8ad2f3e18c55be6eb1bb007fdcb59dd920a3" }, + { 2490000, "bea12b3d2bc2bf246b0d8acb06e096303064642edd3cbfb25aff46b28f7ffbcc" }, + { 2491000, "bf61ca3ec32256233817d08ead8c3946a185169d3445f26c9e33fa932284f7a4" }, + { 2492000, "f91e7ebf2997ae429418b6721f94ac01318fba4868cb9f623bfbb63b2fa143f4" }, + { 2493000, "c6c230f3e25ea33e5dc2fc1598774f06921df636e6955ea93a3e9e707e05fd4e" }, + { 2494000, "1cb1eb12fba06c401754c79f334db23b5b3ec0d9af570d430b9e9b9f1615a0aa" }, + { 2495000, "d74f1a10bfa6087a0718206fcd76811a329b3d02982d800682ad96ef9c98c1d4" }, + { 2496000, "ad9bd623e39abd8df57055ceaa9dab446a61343f6d1ca769623401a6c8daef75" }, + { 2497000, "0a24a07c5c6f2df0ddb73c82f0210828904399f4e8f25ba7f84b03ca8b4c2954" }, + { 2498000, "35b370e5c1a548209ea5ce9fe22b8d69331226ffdcf1e4749af48e44946da215" }, + { 2499000, "112356bd71a78bc130f72c1ad0afaedbe0b06698f41e02ec941db0ab0bcb4c7d" }, + { 2500000, "218a07b75622c0035acf653764bf66ef3e4f6a20d1a3e51f0997fcd697a9ffa5" }, + { 2501000, "1c9553e3873a251baa45e70f717f918d46f9e0b63a6ea8c3b1e54c8e5a717268" }, + { 2502000, "a0f30879976de53ab9a756396c70d1602ac2010083a956e648d9a7ad50d5a4d7" }, + { 2503000, "78b3ee8c1685a0abe575a0a57a8a730ceb12856d907ec52bfe5a3c87a9fd21ee" }, + { 2504000, "f57e367bcb136a9efe9113349ddf59b32d21756fd0ea7d44d9f93102d4e9fd05" }, + { 2505000, "6b098f0da6bf2bd5d37b31db9746bb4cc6bae05b1e85026971ba55f68eece0ea" }, + { 2506000, "9ee83d4e6b14046a1152df6045dc039adac9e61e15d377f240bc8b626204e4ba" }, + { 2507000, "ba710d30a04352962968c301643f0dafd390b7848610f7ccf186a90afc5d4893" }, + { 2508000, "a9819a251e67365a68a7810516b83fa5c3bc353cb73afa65f99d60d6ecd4aa49" }, + { 2509000, "8ebc86b6405c1f087cf33cd7b87f96ae999873af22c393b5cac48b518a9ab08f" }, + { 2510000, "bb934a66ec9e88395f597a79410a81f7379258e4e8ba71570a481b182784d0b8" }, + { 2511000, "7dbdc9a2871abd0c5c82d2c4c5187016cc41d056406d5a5e5bf7cb0e0a396def" }, + { 2512000, "1c45dcd5da0d5bd31695b9f9f120753020635a9271f3913ef425d519b3722e5b" }, + { 2513000, "714294c61262473b73db23175b022a8d478fd38530f77ccaef6b587e1d9773c5" }, + { 2514000, "cfab8d546bd8befb974a4596e1cf993df4f625b1485cdcc32213f9a6fd1999a2" }, + { 2515000, "d88d953e8f043c9d3ac8bc6cdbfa6d008e108fabf95c75c71c616fbaee865a09" }, + { 2516000, "edac1ced0a6082cedebb84d24d11f634c7353d1edb9315b63386ef3986438675" }, + { 2517000, "a658ebd912967172574507d4ffa71ad029808981a48038676c779a1815bd9df3" }, + { 2518000, "dea5e365685b4fe2d3c246881340aa88880f7360b77e7f34e239dd17f5bd3349" }, + { 2519000, "4a4c71fde2edea7c0793fbc2690125615469673abefbcbe4212ea79ad193e97f" }, + { 2520000, "dd014533429ee5621354ea753754fe9aec82978e5111f18b3581d41e6f885015" }, + { 2521000, "3ea4453e165b579e903e8c5d3c48f94dcd688237caf8bd9e33f998245ae36495" }, + { 2522000, "9e3af48faeb2a7369e22b48835cbae0b336e38ed437a41a73a425e6f60bb860e" }, + { 2523000, "4a9a8bfc69c927fbe9e222a736848a1674c27a9594d29f3722f2e2c312f16446" }, + { 2524000, "14e9953f0d4a7a2e97c848c2e229a7755da13fc28cf0fcbe6cd966f20ffd94ba" }, + { 2525000, "d0ab98eb5f85393cf274d4d841f3cdf5188f250f6e6049cccbb8207d4292bd78" }, + { 2526000, "fceebbc703ecf4deb998fcb55631b91d3ce7751cfa88bc5fbf36ea55f13a6ecb" }, + { 2527000, "8e95fc2d719aa891ef1e47e7e1a51729e812f504f1b72ec08fada962ccc81686" }, + { 2528000, "4cd72e62ec0b847964071ab57636c3eb987fe10ec9f59da978a272559c980234" }, + { 2529000, "d64b49c4671171cc6fa839c8562a4d8623dec171497251cd0500f2a1f29b95c8" }, + { 2530000, "0afc22056c896496b33d25117766d772002169584e2f8079f17338758395b8b8" }, + { 2531000, "883d8fbdde15b17155f638a975bc208963b803d153cdf72cc2b2dd547190e9d1" }, + { 2532000, "f2fbdb38a6275f07357fa79a4e5ec786293a536de7cfde395c70faf7afd46c59" }, + { 2533000, "5fa1721360552c53e5ab00fc619147cccf7a5f31b49a81760d80c309044c1616" }, + { 2534000, "6b076616b6067beda857477764ac8f6eb5028c585787a32b6ea6629aeebbf68a" }, + { 2535000, "27b1c0f7c912d9f919a4b637c17dcc3609e3739e7d856dc1bc1f9a30ff396088" }, + { 2536000, "9eb033ce23ce6250cd497a1d69a6da5ed3cc5112984c7486a4ac81a8e7010019" }, + { 2537000, "e08fd45bc041b2f7f0f48ea05517e1ecf0f2a14865f001a75830d010cd0a0f01" }, + { 2538000, "bcc4058a3873cc757d24c2abf3751b7d5851ca0b037d333b4cf71584ca6115af" }, + { 2539000, "3e6c84abcfe7b94ec705fd89ab22c3bd72fe2660071cb77fe3b265f9f9bdadb0" }, + { 2540000, "920f2163f0f7fef5d5337b9b1186f7baa58e34e121d9bd72f15d9596d8cddc74" }, + { 2541000, "bc9d93655e0e29737f318a1389f52c85cc318d9daeae98cb0de5bb494795392d" }, + { 2542000, "b2047b8905a93bee9e806ba981daa028427fd225127ec42e44aea9c30a03e519" }, + { 2543000, "53c3c0204921c196f191763188e24f82f7c9aef1e8f3deec6f41968f2cebabeb" }, + { 2544000, "0c6a4e045448a5cf992cd5b7062000a55c2eeb253cad6c5003af54f618f39d61" }, + { 2545000, "58b0d39fa9c88d6dab8f72d643f9f0378fdbe55a501ca28007d37cd0c595c175" }, + { 2546000, "04e963be21eb0b968d43d9be6d5c1bdd1937730abafca4372083dd52762eb744" }, + { 2547000, "11a78cb596058d8b9e40f860ebecf8216b71c9a4cca64412837d71c554cbe3ec" }, + { 2548000, "61681f2aadf77625d19f801f81771942c8b7ee3a8bd2e2fd634c6106edd4bf08" }, + { 2549000, "9706d7e53893471e9aa9f129308711c7681a4cf2983a83244de5b94f2632c531" }, + { 2550000, "6a3b73e40227fdd14526385691ba145a0b287fd3d11a5cb135b9fceb6183bcb5" }, + { 2551000, "707202fb7ef9eaece8a2b86f6a0913c77dd300ae26f38fd7dbe2c3ff11099961" }, + { 2552000, "f8213498d8fa8b6eccdd1ce0bc9770b5cf6209249f98d7375c9bd69df7657498" }, + { 2553000, "1377e6698c40df0958c6395adfc6f5454d679ba3d6c366dfe2230b40ba477726" }, + { 2554000, "1df29783ea0b392c5c80b56e9d7180bf77c4b5f8a9e40acca30d7d51e58ad29c" }, + { 2555000, "a00dbb2c3ad22b0be700648262f05758450e4eed71d99e17bd94b354eb460c5f" }, + { 2556000, "c692e27541b0de4b629bd68e1a0d8593d615536d53e6659436c04b124acbccc5" }, + { 2557000, "7e87316dcba5603d6f4ff70126590262b09a55515e7f51781af158202579bd20" }, + { 2558000, "178e2434f471c8b0226bbcbf6a75256f49344f74999a9fab91fbcc55c58e93a5" }, + { 2559000, "4f932f90ac93bb59c5dce4ec7f186b3d77bc19be9a1fc3d1769a0c9ceb1da047" }, + { 2560000, "5b3378fd0477b643913cbfaee927a5a446b4a1d3d1e2593f479ad66ad9d1fe3d" }, + { 2561000, "557991edf98e5ad215f216c86b16b1844cbb64cdb173bfd83f7bf2d8a5bd711b" }, + { 2562000, "2bd3aa98303f7ebc73e9c7eb21627c78ea33c09be27f7aa196763b9f52bd7bbd" }, + { 2563000, "5cff108741c473dce074476def0e86a22f941ada9547a03575b0025c24e7c167" }, + { 2564000, "498c3a9c7c67a6f5bc3c9dd0961801225c7d3b2dc8fc407aec89fb70ee2ca927" }, + { 2565000, "b84073a2f7f6145e0087f008a775a87a09b120270ac8de97ab696525b59d9ca7" }, + { 2566000, "bb0358e2625ee8d860baba534a3cc7238fd9d858826c003b368a7be87dc51472" }, + { 2567000, "3fa6487949ba2811f3df269343d63a60f0dd8d145c898cb51757a7ee97092119" }, + { 2568000, "38cd8f74b4f66540575b18b8b06f69d1e1123ab02895d0552a8defe94ec709c8" }, + { 2569000, "3b1e31fcd6d4cb3b3d051ee3b902a98d01eef2da5e9b7c34c88fa3d5ebdf1bc0" }, + { 2570000, "6bc47e4bfae9b88d73f06f5e94afa22bfd3c1cba9357850b0dd033ea17d59bfb" }, + { 2571000, "641277bec32bbf19a41888e670d70bf4b54b4e2368a77eb66b21169568330b28" }, + { 2572000, "b8ef73e007268f7b25a0a11b6e2598c679ef9c162fb6bbb5b72727cdbb698817" }, + { 2573000, "da8b8e60b8e26f28e920fe1155301538a8fbecee8e00efb511198b950f8ff8a5" }, + { 2574000, "2fb24ffa70232dbee36546f2476ee2f1ac3f8c1f2a81c872e212729f9d37a743" }, + { 2575000, "915d770df7c058f98edc56954a50d053380d7e83742b01745188abe0fd211ada" }, + { 2576000, "b5d656c47a021e22c4d44938fea36f36c736468f2a1be98abc050f6bab0578a8" }, + { 2577000, "aaf739e0cfaee9c1f9912d768fe5142bedce9e752cfd36263afc46312def7d85" }, + { 2578000, "0cdd24cfdab43b0a3b2315a1c2eba4c9602e82d66602c41f2258cfe707848245" }, + { 2579000, "715753f3bc17947a72dde9e3ec6d729fdf9480941e0a162f69298bd0fc91f79c" }, + { 2580000, "43b3f24df077a3bf63c8bcb4b3351048d753e86cdbde821ea71a32cfd08a390c" }, + { 2581000, "eefaad449c10bf9c29cccb27db5f555e4ad9b70454b934618b915ca2a7c22381" }, + { 2582000, "666356d5f8ed7a5439e49798b37ae6fe3c970256f14e9be7a349168b357304c6" }, + { 2583000, "b6b316a90d0346955a6b108b9b32319d365576f8500fb4f0f79a1618932b797a" }, + { 2584000, "c2b5c5918bb0189fe6037158f18a678d7bbaa5dc517b4896d984ee90fa69209d" }, + { 2585000, "c2605ce042429a9d6d3becb77acbcfa3410a4a868f09c03e4034d50b5f0939f9" }, + { 2586000, "444fe9ecc2c93fef576ef89af7d381eb99b15e28c6eee2fe696eadf57ef286fe" }, + { 2587000, "78ead7051fa31e0cd086b8ca0c5010bce433ee430b3c4f2391cb400388dc55bb" }, + { 2588000, "208dc2c70cdc7128b716231b4432f6c6d1fd7272831a04cf96daa216098d491d" }, + { 2589000, "6a98bd2742d965f4df165ba4c1fd4dddb06551353cdf52a427761188cae238a1" }, + { 2590000, "72e45b01727a72751cf6988e72dd0abfad11f8344a9ea068ad47d26e0ad20470" }, + { 2591000, "3ac55fb5911f731b067adf1392d4073f544d21186cb0404a676042e4a3327684" }, + { 2592000, "b104ceacba1a2ec3b4303b7c341ce77c8e32d0a5fa11ae802e41eedb7682fde3" }, + { 2593000, "d7b71782a5a976cd61ca7ffd12b88fbde51b04a822e7a7f16eb4dc51288daea1" }, + { 2594000, "4d78734cd3a297f639bb9cd008728e0562670134f88e6c283d3a680efc29b47f" }, + { 2595000, "5047bc8f1380c13da0bf37cc15832bf18fde6e756154ae259d595560cc5d1d41" }, + { 2596000, "1bbd24a837d0ae6da9b003d87ac87ca37835ed70301c85533bf74f770c6a42a7" }, + { 2597000, "6cf5a8de6da9196c2a7785f75704144ec4c093fd029d664f9bde980abd146521" }, + { 2598000, "1acd6c5ab75b3012eceb706f0a4edb11c4e4831c5785e430949672799ce21d27" }, + { 2599000, "cd2dcf74ae4fe6e4de64e8f84fc1cc2423dc3c0b700c0a26311f2c72e79bde1c" }, + { 2600000, "4395215c5cff2f3d451d715e71a50dc7ea9209f4237221e8cdd941181af6e672" }, + { 2601000, "7bff3ee737ab03d1a395711b87b898ac1412ccc77f21d9f66e8e73f5beb863f7" }, + { 2602000, "f1aa0f730644f2ed55f1825ccc98228d06a209adb90845aa4251895d5534ad1d" }, + { 2603000, "5e19fe595224e57e9f31cb2028b1e036a2759447d1621d603afa5cdf5f3dddc4" }, + { 2604000, "0dd383aeddccfe6c06576318625261c31551ba07fa26e4c31ac2821cebeba667" }, + { 2605000, "87da6cc075bb501097d0fbaa0bebaef49476e5f50ef077bd87040f8cb10aa6ed" }, + { 2606000, "cb61c4042418d5456bb1119a45833208c1dea6650440ce1d58f02026dd1b6793" }, + { 2607000, "9dd5b183590b418c4c63304417736ce28dda54670a081215cc7f487ecdd8e03f" }, + { 2608000, "4053f2fca8f9f9ef870dcae08c64c33ccab65793cdf65eb20e9ffda9d9301a58" }, + { 2609000, "71ff8a0a3eb0985f44dd8e5311c35bd8f2ba57e6163360e019a851b38b83b4b6" }, + { 2610000, "74e6e67e441d6514affc61cc838aae00da5063a4e03d57de759c843183e28faf" }, + { 2611000, "769b08dd1d8107fd0da62a0f36820cf2c52941bea09b0bc3e229b9134c68dbab" }, + { 2612000, "5745dd68a42cbad344203e54f3e4f508224000634891a3d393ab54462ae12a50" }, + { 2613000, "0ec263072ea5b053250b1774f5654fb5101a2e2acd483031c5ccacaaa6d5fc07" }, + { 2614000, "27d0d3f55929ab8b40b63adff9e8bda7707117d690e1b964920c98c59e4b2a11" }, + { 2615000, "d6a07c04b02e03bb6eab201eb30679bad2b1829ea96b37a4865f7d74dad0c00c" }, + { 2616000, "ff936675c71cd2801dcc40501f6ce051ba1ab5aaebcf9653aaff16f1cfecf651" }, + { 2617000, "5ccf82ce1e19e0380ac65cc2005b35aab7ff3cb13ab90f7f67b6b39161bb38e8" }, + { 2618000, "96f33ba6e8e167343a98be40894d3f2d36dc0c2eacced3bb068020f3e935c58c" }, + { 2619000, "3affa55e9ed14428ea4e16d74afea1be60992cc54eeecb0b16ab9d7a6f52071c" }, + { 2620000, "6529d2e9b34b5ff4800012deb23f6c4f8cd9356db91c10ff67afcef60823bae9" }, + { 2621000, "e9024ad4d9b0b98fa003b5b27a127323c0022bd525bc7e7e36161fa43fb3b200" }, + { 2622000, "b322d9fd19a372b454e37958f18d3c5f988a2905548817d4f4ad8d5aeec830e7" }, + { 2623000, "d2b0fc8379fcc7e8a172f691547ada4e8a06e4fbe81bf734b7b535dad774a64a" }, + { 2624000, "4310b727bc63687c4fce7ca86d15c888bfe61fd573d932889410be0c6628a49d" }, + { 2625000, "581bca659f183447e347ac02bfd14c1a8cfcb40afb1ca599db3555f8a997941e" }, + { 2626000, "427cfce7b6f9de9541ae5b47c8b2e5bb155eff96dc70088ddca1e9520892a5f1" }, + { 2627000, "db1d6b939dec79c4b4a49b98f661ae8bf4ba34a7f569bf4d478440fa15d654ae" }, + { 2628000, "2672c28bf7850a0c0cba645e871be230c54e959e8f675183e91a441df8487667" }, + { 2629000, "c0f9060bb20e58ddf2ac24561540fabf2ea43b2e203347a389e41ac79a079eb8" }, + { 2630000, "09a91d41ac61b924b883b439bfa7a716c16bbf239f8655e8aed1d1d852176cb4" }, + { 2631000, "8e0f6115c061a2c701014c92e1380a81868e381beee4052755056df2f33d9c8c" }, + { 2632000, "a2c4e76f1a34150c8ab8cb7992d2822edafb193b22358fbf86470e91f80093c8" }, + { 2633000, "a0c586ea5edc1f8e7b7dd565d64a05b4d379a08d9317c3dcb63d2c45af798590" }, + { 2634000, "ef907bfcea0f34910e3d76905f14358206f3753fccb5f2dd9ab518dd7eb6c54f" }, + { 2635000, "5463a54f839a0ef76ab69043efd3665046698ff70d9ccf47d02c53a77931e4c9" }, + { 2636000, "e8ad7d81c14aac2970839fb0317a354152e871efbe9d64d9285a16b6f5937b9e" }, + { 2637000, "5ce1913641e3dd2c902331e87297842e72683cbdcb3a12367d3dd8ad80573937" }, + { 2638000, "b7591c7857947285c765bcad140d9596c0b17bcc9049d9bb345f55ce99e845b9" }, + { 2639000, "617703eed11ebe008bc621d62237d7ec0c0bf6fbf1879bb464049b2b5ed8f920" }, + { 2640000, "561794742d1af48846dbf4d7adfecfd99541375955ec0721ec1f88729f89db68" }, + { 2641000, "83bc6c73e481ee79d07222ded32e8262dc5608a490b14b755d2735d31626df86" }, + { 2642000, "f43afa84c6326b5ea006f2e78281401a52273c4214b0168f434437e2524bce7a" }, + { 2643000, "4bf917f0088a1e92c4650f06f23687a4518cd11b653ff9672d0c4b5430d329ec" }, + { 2644000, "a4d104fe84f89fba231ca42a21c2983d52e48754b4a26767936da685d8c37db4" }, + { 2645000, "ad2170cac76ba7f09a989cbd818630a61ee2cbe80fa6057b32f309c2b244e463" }, + { 2646000, "bfeb953c7d5cca64892b7816e0f704e85a8e7aa31d8ec324c7951f83ee9349e6" }, + { 2647000, "db2793466bef7441cdd1f11dc68d6e8fd33c5d30f3a9bed6a338d4fc6a9f8416" }, + { 2648000, "85412b44aac985a80af6630fbd44ee6665356b43b4ae7c03c708c6fd919bdff7" }, + { 2649000, "474afc32865ba7df38b3e0902b64efab4ab2aa73b262f61109466defc812ea64" }, + { 2650000, "315d90d8ece68063872b9237745a4061e7dc8a490d867d12d879d9037446f13e" }, + { 2651000, "3a3ec3e077acf368b68475d66fd76af30ee0c4815567f1222ddb9cc696c5b17e" }, + { 2652000, "064acce76f6c4d8860443c295325078ac8b7681590d3ab8b6273baedfc7c5487" }, + { 2653000, "15db50281303ff1e60a46aec6dfe65fca79f71f91b042759abf2dd2130a880e4" }, + { 2654000, "dace8f3d47d1cff46a0913f95490912347f2df0bdfe4249350328562c3a6d590" }, + { 2655000, "c194be77a56b88220c0d1d6d493f6bad84ddb0cb3730c05f6e545c801ad98f95" }, + { 2656000, "798896cf66b603b12e396cc37ac8bdd6af2c6fb5eec1bfcf8aa530e620ae39d0" }, + { 2657000, "fb8b160bee5d782318bd1abe86c292d3a4bc8e7f3e73b75457d996e3dc6ada51" }, + { 2658000, "f9a97de26cd7d95f477cb0b5236d5aee837bc5dc24eb0e1dec3425d145d0ec25" }, + { 2659000, "3b906e7921bfd4390af995672be6d74187cad4dbe3313aa1d2b3236077da07a7" }, + { 2660000, "9613d1b1566674d9b6796c10fb115d808797066546559b7eea7451be978bb65b" }, + { 2661000, "720a2f467e511674ea83a94e9156d23ebdb54ce8fe8caa5fd2135ada9ca91643" }, + { 2662000, "ba57e6fb77063ff44321af53d2a550c1cfc4afbb7b936419e9dea26878078bd8" }, + { 2663000, "da01b0ed602da2b4943e1595619cbb906d3c2b43597fafa9dbddd6f2e7379dd4" }, + { 2664000, "dfda91de1801cbfda2aca54fd33422fbb37e9d3b07f9e8f4d2111dda70a8be7d" }, + { 2665000, "191fe44cc4d096be8c8cd78fb05b51ae55f00d192ce22bcfcf4d1f81faa3a347" }, + { 2666000, "b88a86d866c3b42dd59ffd599997911e4dda9c4f4d112f2438a139f9885f5070" }, + { 2667000, "fe0d19ac9e7b5ff2e69181535a68015f4175cabcef09488c35f67e6d00da9fc7" }, + { 2668000, "31c7e7a8a1de86959e3d9982fd9c597d1a7f567e1f9b7c13e46d8399406732fb" }, + { 2669000, "1046bd45fe309d594c08868ce34b5bda8b665ba7cc45d65b3955a9ace486dcdc" }, + { 2670000, "e58f08ce7e3628842bcd51390bab64655553fe69ab022ed85e53719cc064c135" }, + { 2671000, "1cc0f98b2ca289d7ff5e0e85d158eb218d4be87cb58299a112f0ddc87acba052" }, + { 2672000, "c64a3c0b63ba0a60429bdf0b67f8019be9386ba0c195a892a70d3ebf269b1a72" }, + { 2673000, "fb0566a59c9715b64eff662cc3659f0a0318956a28930165c83dc185780eb4f9" }, + { 2674000, "99c52380173643ac5253f34f784016758fe4c6c3078eb2f47ba90d3a7f6b2248" }, + { 2675000, "ac70b46a5e0a35c7e02b014310f40aa3c665a9453a85fbdd71c63bb614357456" }, + { 2676000, "072271d6fe1bf7c09b32b4acf88ae95fed7af5e49883b16bc3659b110a626217" }, + { 2677000, "9983f3f7bcca134c5494946ce75f26ca4c69ecc2fb0590ad0c7b7f60f5a573d1" }, + { 2678000, "09504c3d1b1716cdbc4c0e115e5907460dc10f29bceee493bfcac02de034fae0" }, + { 2679000, "699fd32b2267e4b2217316951c9df23b75928572f6462de61df2028238849a70" }, + { 2680000, "32370a4b966ca8adbdcf84e830ad17f5e1cdf1f5a1664d7ca9d472faedce407e" }, + { 2681000, "03fed835e7ac9f3c3f25491b45cf92340226157a61816a4712325287ae477234" }, + { 2682000, "e3bb18e92184189cd6e22dd8fbc5fa3b577b4bcf2cc874dcbe3c6340c277543e" }, + { 2683000, "103b00628a466bb1707275d860b30eded1323d6daa4bd4edd447507aecd6d82b" }, + { 2684000, "b352108114e66033b5d900d7da553b162fb8c643a1dabe2b4e56e19f13580720" }, + { 2685000, "6e835cccd3eb950bfc86e9bde6b045f8f1ae486c4f2085fcd3094b3e5dc68e40" }, + { 2686000, "b0e8ae4ce7e73aa071306fc66af8b3cce87fc753beafac66de5716b507aabead" }, + { 2687000, "9b968e8ecfe194f402f4854531221b30af986d758bdde9dc7ca76591d1c6ae26" }, + { 2688000, "4a11c953ae60d539b33bcbae551592dd3f7b36ee62056e3ed917a96ea6a2e212" }, + { 2689000, "dd7ee218beb42b80f0971bc7fad0b4ba3f8240470c81c5631410360565b60fb0" }, + { 2690000, "210f81a1442ae6d3fa768cc3c06c2e991f8e9ee0c76b3f24d2ae45929d211f8b" }, + { 2691000, "8218513fbb2a8357783b710844c0d82d63b0ef56db04cb03b099a309c0635a6f" }, + { 2692000, "bb2c54e454c76c2b23126cb54084d157f1b92944eb851a4daaffc149b4eaad79" }, + { 2693000, "02785ffd29b4b4625eae4852c62c15a7a2026070fed1437628413ea251a69718" }, + { 2694000, "2f6313d57210fff2d487a9fffb779424faa41fa7118d8c8ee9a2bf96edaa2065" }, + { 2695000, "c6bd26623c837d50c8175bc9b656f75aa22405119d2dc038dd1aed33e3716c63" }, + { 2696000, "700998a9b9ab739a763b62036aafb7cd71000cd336fac2ad4f3ad4c6ee95794a" }, + { 2697000, "9d267615012b2cb5d2483ddad6a23a66a87da379a9603d8f0b098cff517c601a" }, + { 2698000, "fc35032bcd0f1aa79a9392ab9e63469319fdc129cc2f704d60ecac70ae4ef226" }, + { 2699000, "bafbac2b50cc7911d6c7f819dbfc56a4f79d5ae817e71deae1d622dc9edb8821" }, + { 2700000, "6fd9c21dec58c8ea506b65ab7abde2e3848f126f2d1b16e1961fa671960b116d" }, + { 2701000, "69b87bfb1e4130e30ddded144c1d9f3d937075f0a09ed1a5d43492e2b7894528" }, + { 2702000, "ee6fa8fdd8806b2166bc22a8e7dfbc4e9ec397b23974c9918d4601169c39f8cc" }, + { 2703000, "11916585c27dd4a32f997f595fbe4d53628f29a63a90854c074ce14abf21b5c0" }, + { 2704000, "f26eb952d7fd8080e3e6e07f4a21564e3770320a7d6d37c8f12af9b327a2153f" }, + { 2705000, "508d62eb3a12727ee7dc1921037e8c593c366eda52095c0ba56b0bafaa1fe13e" }, + { 2706000, "879c03d4cbdc1cd22c2815b76279c6a35a8ef5db13dc021b86e2e015bb0d911f" }, + { 2707000, "72c05006b1d43e6002dc4011a72fb0669b73c78905595e9f457eb6856f41cc65" }, + { 2708000, "87a7f27fd7ad5feda56d6e9d70146a38d602c13da04128ed7012f2525d72cad7" }, + { 2709000, "17da8851fd157f1a2a0ab11e808a1653b586f54090d2940c6675a342bec42478" }, + { 2710000, "194d910d2630b9399dc195057398766007c9b0f9c2160da1dee0a68f3e2280ac" }, + { 2711000, "9671987cab9a5b088f7b589fcf8111bc586af9245632bbcaf14770698d1faa86" }, + { 2712000, "df4ab1638d4070cd500d229a2ccc63043c75584f86a930a26d49818b33055e26" }, + { 2713000, "cbd91b07cdd69967ff95e23d4c26a1b941230d06e7b178744889e557376945bb" }, + { 2714000, "11224f117e2403ba5417c9b6fe5da7ab4ed1c970e27b7295f1628c0124e36af1" }, + { 2715000, "4c9f480f28b931b5a7d4c925a5b9e73a5599e8cfd20b8d6452fbb5021f289858" }, + { 2716000, "60a14478d6c9171f0210812e2a93412c142109dc84afa8b1c11845297002ae60" }, + { 2717000, "913be98ae1b560c38c6ce70e3571928c81c86a22e4128f976783ef4a145af097" }, + { 2718000, "c2328c70c15693df18e6ea4a992874be15e6b6c94c01f91a566368d3366dad59" }, + { 2719000, "b2ef3fce80e6e445752e75907fd2478ddb0a2866fa82ae9472ada922b51bc29a" }, + { 2720000, "1a01291a2affdf903afe01fa36c9df48b432a5bc79473d7e63406e1401008e8b" }, + { 2721000, "cb77a27f4d516776600d9b3d82c34b80b56af3819685cff675a1867416ab6a64" }, + { 2722000, "3e566c7715d74b47fa99d7c872ea98338a014ed3d4c4b0a0a1731e7af51b2d49" }, + { 2723000, "267187f2402a62b1496e51ba54a5bdc7499f034975151d93ffb2ccb04d7b322d" }, + { 2724000, "4797a346a4870428f41645ac732f907af13c3ea1c2d68112c6259a7117f94add" }, + { 2725000, "54c373f4626cf3b1a47fcfb60dfe2a57d6fa692c5dcc3879029c2b17e80dfe70" }, + { 2726000, "b664c2cd50386c39005c70a5d8684feff664ebcde522bda360873d779fa308ad" }, + { 2727000, "acae34990e9e5ae74cf06fbedec3dabee5f4902b4cdface6ff738eb65cd730ed" }, + { 2728000, "83b90b4de8f97c96b9aa66e7b10e942153cb9e1b3840a0bb4f6140dbeca6baec" }, + { 2729000, "f31a4605317e4fe832b516e69cd8bd6f334d25aef52f281bb740d619891718f5" }, + { 2730000, "f09e36f674df80000b07642b2d695a81a42ab497443fdc05e9b71359b03cd0b1" }, + { 2731000, "57621acb52189c5f4e1bdaa6c8cbd5d84549c610f9584a67cee08612a46d05ce" }, + { 2732000, "4e6b6fca5dd64bf9aa4ec5efcfa29ca7a194106b585c205b8ab45cfd08c0b127" }, + { 2733000, "3d4b968742557cc2401cd093bf8810cb0286052336ffe7ad3b3f20b12776cec2" }, + { 2734000, "d16dd35a1576fe4f8ac97283f61750ecaa1632cb248f1f63ab2c62b5b2cdca73" }, + { 2735000, "a9ae20a808a922fcb0feaf13457f566fdeba807d1f1e3a62735eab64b8e79f4b" }, + { 2736000, "e5248c78ee3ea0f23a8cceb9efdc4b7189afec02258bb2fa9917982d7e1e3f2d" }, + { 2737000, "528a0e5db6b6dbc03c62719eae8bc7f8eace18af1e380a34e13c7e2d14c3c996" }, + { 2738000, "178c41abca94554ba53bdfabc9c75ea69df2901f0f39e3998962431f76b2ecf8" }, + { 2739000, "ca491a0946477c238506e171470eae73fbabf482c73c375c65a39fe6f2af4f00" }, + { 2740000, "68dc00f5faaa3f03881e108a0a0f343323bc554880af9d00a2e7a7bab5ce15c2" }, + { 2741000, "e407b8e3cc20d68df31c47ee3c4bd2a474ff793b767c15b79859d228a0ce3a1d" }, + { 2742000, "1456e9bc851c8ec5ecf3b04a30cc50932511846b27e433a13e54e9ef38c264a1" }, + { 2743000, "850cb4ce8d0cc636f90b490be46a23b8f161eb4afd5c8d1f8cd5cefca5d73686" }, + { 2744000, "767a9b2a2eb821c19230cc40f681bdb90341f224f6339ce684e7a73a556aec53" }, + { 2745000, "74645eb71793d87ec399a9194ce3658f5fce98e75de9e1ad3a9b812241a6704e" }, + { 2746000, "5f7b869ae12010c03e98db8672169147023b38e4d8eb3336490550b93e8cec3c" }, + { 2747000, "4051cecfbf5cbbd4c3992e167d901d9b66327c9382384925582b349199dc667b" }, + { 2748000, "1bdb9d1a6e3f5530f3adcf05e735ffc3df6a235ac847b9fcfff22bbcc95acde1" }, + { 2749000, "53b6f592ccde4a43efdc93a7aafb3e5277e1909ec2dc6a3f10c73740d151c3ef" }, + { 2750000, "4804581b02b8d6d5778e62c3dac2338f75a37a072c3c4e56de9589773af1bedd" }, + { 2751000, "1cb8c1dad4e1f6fee1c3c35683ae28e572fac050258bea0363b22838261fe6f3" }, + { 2752000, "c0d8ebd145a34f06607082fa5ce6ce291b67a898a50007e5b6b0d895a446a4d9" }, + { 2753000, "7fc357be2634e6b75b78415566ae0c5594d269a81bca84270898039a72754dce" }, + { 2754000, "aa73667427e7186c9d3ef00720fa536412779550b50d45b967613a65ff79cbed" }, + { 2755000, "1ca62900a6423878cf11ded9a8a228cfdc1c3473972a8ea493eab1128da2a53f" }, + { 2756000, "f822bb88030a980b7891ef6793914419df7150cc59ac8bdd70d3636b91f3c725" }, + { 2757000, "747d51d24a687a6b30c3650ce3fa278d937305eef8f2a669f90b2e3e907d55e1" }, + { 2758000, "532ed7546dae3937ad9a90ceb2a19b4b03baf639f859671e3fff04ab6f0e606d" }, + { 2759000, "b1d79b924fbff74c43b5c02b6b9cbec38fe9f66f29c5af0f200cbcaca4ee6784" }, + { 2760000, "1a8ec3d16bc96cc58b2090b1055ad69b61b114ba87da54d41167100ce1f007ee" }, + { 2761000, "4ea673eed96a165143f79b86eb743b1df9fb560acf29c6c07ac7b9e4406a7233" }, + { 2762000, "68dfe9bd86edeb80488fd6e96011f416afe5d6aaba25674e85b194bae4b8b041" }, + { 2763000, "b9cc18b3b7bb7e638bb9b548670b5fffd329ec80251294bbfbb84cc617f7b9ed" }, + { 2764000, "892c34773ef7294704282d4b81369b05b56039cf8e8c41840d5278ee0142314f" }, + { 2765000, "74d68dc1a82edd3d272919209ab23e1083ae887840e36b7d64f31b1860eba8f1" }, + { 2766000, "f1a3da4b8598428793a8d5edb246b09fe4988fe22060d786137c36136d29e96a" }, + { 2767000, "8305078fc0f45cc5290419d0aea0939cb6b7575070d11c7db07f8d3a64964a2d" }, + { 2768000, "48831c925b7c0387047902fe50e8048b86bccfc3c2fc0308c27ef763fbfc9a75" }, + { 2769000, "ed557ee29e17acca77687da20921e3fddc2d682d6de086fef40a0d7d463001d8" }, + { 2770000, "735de383a9f73180b0a5a4e1a9a60fe13329e4a62516759ee3890256f437d182" }, + { 2771000, "4d9c5601827f50414014c24efdaf218ae8a0238cb34ef9551d17ca155e77005b" }, + { 2772000, "30db97cd41b1fe3ad050558ad526205d9fdaedc602bb567cffcd8892cbe12c5a" }, + { 2773000, "9433d95cd570d65aacef12bdc960120fb7e9808f14c5016abe01f5ea00a93244" }, + { 2774000, "1058955e10cd0005ff90bc832553db2b6df20b016d412535912eff1acb551072" }, + { 2775000, "22db401cb0f9e578f5e4e8e816f9e745fa7e4263fd0d8b0cdd8c19cd4febe540" }, + { 2776000, "73c170919bbdf806e3793b749674e8fcd7ec5698b5b03bf23df4e8d5f1e69a21" }, + { 2777000, "21f7938acf8b2d2f5e37632fcc57c99b6d7c427dcc0dd7dfb8e6af86d36aacc0" }, + { 2778000, "2c5faa06b4de880294a5ff0c83202a0212abe724578e35cf77fbdff522c0f1c5" }, + { 2779000, "741909f7df0184e905c868c87acf3f5eb152e584342b29f7551a4810da65ec27" }, + { 2780000, "9250c863e9b5f68c1eb4005ee2b94c0986c8d7e440f9f9a41c1fc74098308882" }, + { 2781000, "3841918c1736de97432db870747910588414cbb6b5eae27f893dadf99705c3be" }, + { 2782000, "daefb11554880f792cb55ec2a7121f9e13ab98bc608d651a4ed1750aa24e6782" }, + { 2783000, "a66d7400c4357a88c2fb01dda47f8093152203c1b83e0aea3a5784e17c33f4e7" }, + { 2784000, "a60dc229d9039efa212185b4d29058c4cceebf385512071b17f57c207652f328" }, + { 2785000, "16509dbe22de5d9c098f729a771a3e0c8b6ccc56aa50241d12393065714f58ef" }, + { 2786000, "ed942bab3337a6aaa3bb491ba0dffd10c666efd1e7933585f6cc7aa33c336717" }, + { 2787000, "6307969099c497edbaa9cf7e2a1e37fb0db50ae598b4f4cd43a9cf4a9513377e" }, + { 2788000, "da86a16422eff6676a931e46df255e85398f96c6995320a1ea644ca3055733a8" }, + { 2789000, "cbbc0eed0c42af0613da0d2de99e80937f6a954baf6eb305da6bb57e9ed40105" }, + { 2790000, "873dc81a6ab28a6ca9ccabe8c8204d992962ef3c7e62c5a55669a33cc01ea2b4" }, + { 2791000, "09c13ebf50650e467ae85c48913246a7177994500073a4fec022923ee0103366" }, + { 2792000, "61c2fe58772faa28465a75ecc3fa0986856004a2fef54acede0719752b9ce69d" }, + { 2793000, "4a013b002e7cd503141c7d764d99f2262f247ae5d3f5a158e0fb9397b3bbd872" }, + { 2794000, "4485f7a325c9deb6b8d92fb26efb91a6d0b79be60abac15f64bd924d35aa38be" }, + { 2795000, "790a98670c4768c40a49dc9f264a5e39ee5ffdada13c4fef0aaaa3083c664a0c" }, + { 2796000, "1743f45a602029d3077ab46cd28d8364d99aa783df8b25874feb4216d7538236" }, + { 2797000, "b60a96289c1d4e8d7987707c92a4b89a74e13c467c695fc1a832cf6f07d6c3a6" }, + { 2798000, "f593e645840c1c7cc77cc06e52b5826c18d51541e4c762ebc61d981fba547c71" }, + { 2799000, "90e77036f764fbdc1722bc8098c549aaa074a5a0902eec674bf992b5b009aa79" }, + { 2800000, "11b5049e07539ae0f02c01cf60950017e1d2e1aa57dcc139764e07e1fa5661b0" }, + { 2801000, "7133eeec592c81017d6eafabae21f83013e327c66be4d4d04588d31c172945cf" }, + { 2802000, "537cf59bbb296bd99cefcbda79f0ff471b526e3423c099c73558a0507677f251" }, + { 2803000, "75ea06ae4f28877ab3089cb6d12ed499342bf7998a9f54b00b4a81fe081c6db0" }, + { 2804000, "b6e2151fedff44edfe6e82939ab9fccfd569b03f8520f663330aef6664a420ac" }, + { 2805000, "67cab4cf84ef48a0a6fad169eeea9cb9d003324d9739d25fc2a6dcefd972b3f6" }, + { 2806000, "97cfa8ef99db224452af5ab2aac4d95558ca8e0229733e85216828658aafe246" }, + { 2807000, "1ace244288483b197dd9e0afdc7e311782a698a9411445243e4f4afc0a947517" }, + { 2808000, "32afd6945d25c5eb332ace3ff67241fff35f8f8e04c3a5c5e54cdc9e83b6d064" }, + { 2809000, "965ba4dffc0b0660c85a318fd22b93f5a4ffd6c27eb52d1e2e8d212ab9435904" }, + { 2810000, "a1b7081fb212de3b3245d318190709771c50e7c720c797bf0166af179639e969" }, + { 2811000, "b9d0f29cf1ee1a08f512e6580b854fd059532b0429be069c77c21063c43a6bc4" }, + { 2812000, "4a0fdfd044233453d50dc347b1bca996a5db0f641cf757137cf091f0f131da14" }, + { 2813000, "f150dbde270fc74fdc31e33d222825760199533e032ceafeec49c88ce18f5fde" }, + { 2814000, "ce5bed86068e06b17a021ea76aa61e760dcd07d42c6277a97fad32391190a498" }, + { 2815000, "f15ac2e0623b134432d3b860bfbf0e0f4a2d68df33adc25b0937893a5f48c1d6" }, + { 2816000, "717d64696984d259171bfe4bfeb3972fe68cbb83f5b4ff051258763829eed045" }, + { 2817000, "2bb7130e1c082c5267fccbc0cf369510b42e8c7b3efe8f3961b38c464cf3e3d3" }, + { 2818000, "3ea34afa4617a82274be6d6823601fe6d0e3dc07cfd0311b1fb050549e705b5a" }, + { 2819000, "ca013e6c48766663982e91860dd17de87b1221e8fdefa11040da415760180730" }, + { 2820000, "b73a5177ee3198046db8a205d870d29c525a37f6c34bfdca8be901d64fa2bef3" }, + { 2821000, "4e3e774e314138191876906baaa133b4b8efc8606be2aa7d00e6b8092a1f42e1" }, + { 2822000, "c5d9c3a6ab4c67fa3ac0e7acd8ba71e91f6357f1dd44888127747c12014ab4b3" }, + { 2823000, "af4be96164acc52c87f4b23f5f6b8b920d6e519611293577026fc8748a803f04" }, + { 2824000, "4feeffdf718e5b7082e7784911bdaba6f2804d09d254b10c76108570e44caecc" }, + { 2825000, "db1ac27b102a33efc4f64680ea8d87d4eb620c34ead8a172b8e17f52368e560d" }, + { 2826000, "fabb5dc95b45fb7d6ff3083288db300fc5e719f7649f2900f1d21f3fde1e42a7" }, + { 2827000, "208798cbc11353294e883631fce54d92068b30f43ce680e7d76aa4e65e7db81b" }, + { 2828000, "586746adf799c9ef63685e9ad7f0bdffbc4701131cbcc4e7e0fe16c38255b005" }, + { 2829000, "9803ec8357563f0e4785e8cf23af6c235125be5eabaf0091a471e346b6b31600" }, + { 2830000, "6f4e293570121406feae06405a67a3cb39ce8847942d001e77ce61655685abb3" }, + { 2831000, "d970784b2ce88fc28603eb85f21dfb420ffa7104ee06473b335a1524d8c4096c" }, + { 2832000, "6634d04d710b42945d4affc72081cb9f3a0e7e8dcccf6f0930eaa587492c899b" }, + { 2833000, "33dbd53ea8925b7324526481c04b97f450ab3a52482b6dcdedbb28195f3f3abd" }, + { 2834000, "707dc95c04427a53d9e7c22c05d4e58c8ccc861acd13040810c7ed99bd4ffa23" }, + { 2835000, "23cc8ffe22c4722c9805e49d35fab1bda95139b3f8de511ccab2f9024c4a44e9" }, + { 2836000, "3305a6501d03d73aaa91516c6434fd7741b7cdbaf09c08243e50b4c47afb8364" }, + { 2837000, "7cbc1152945fdbb67f69b140c6210af135a30b493bae42ede124d730543e3652" }, + { 2838000, "841ec7982fa3400945f16b7e22964e3ff5eb46d659b308aa653d6cbe92a01d90" }, + { 2839000, "4aa2fff506f56b7672cf8c382fdc569c2d19d6c44fd85a287e6ff22685cc4724" }, + { 2840000, "7b9fa94ba279ab1c27e545df45aa4f9b6a03eb0bcfce7395a8ed20de7411249a" }, + { 2841000, "d5faa8156449d5c5cbf9e1c487b86572ccfa472a72d7dc3cee866e67154cd040" }, + { 2842000, "87b0c65e20cf0f3ec1785311d242a02e961c37b745df1002675a4fef74e5cdc2" }, + { 2843000, "9b1a4e071420d62aa7d28b002396be2aeaaf9aa6b532b672cc556ddc71cacc30" }, + { 2844000, "da12734d02a16b5b660fb4555e5d5ee15af2de17b2320da6fb082dca0a574f11" }, + { 2845000, "db537fa79ba3a5b1caa2ae9a6e48abbf879ae5becd016ccb98861c35ff3f48cc" }, + { 2846000, "091a4eaf47f6b330735251efb5be0e87a7bd518b4e00a48d24480f43f64278ca" }, + { 2847000, "b256a251add666ed4fc963fccbf408e746960a6a57b20f19f372ccb0b90af59b" }, + { 2848000, "eb89b2e3eceaa77b5d03acad126a729e6040f6017b50beaf674252975bd3c685" }, + { 2849000, "8277bcefb971329c094c64af6b6bca04fefd4fa784a4a8bc403f37d48220dfa1" }, + { 2850000, "88f38da9f867a894e7dec8dec52a0512317c243d60786a52ecbb3c8fc8d122d6" }, + { 2851000, "d1ad228af460f6578ac0b1cf0a8a5eb1badea5d57120b5ec46adbaf20759ded7" }, + { 2852000, "f65e20fd823b3ddd4592c186939477d1e1e7d03d3bb10a4c3d0fd247400cf823" }, + { 2853000, "025f97746fe14ff49d2399fc0953ae588c0f036469c75cbd9f1ee237a46c5db8" }, + { 2854000, "0538199c7d6f0f40761d68d37a903f26f5fb9cf431e59dffa127db16280375b8" }, + { 2855000, "b6140800b7f9084acc53afc73d77fbb9194fa399014c3112134d7aa3637d65a9" }, + { 2856000, "23fddc4eff6034b684fd3c6e8b2adbe8be2870a6ddddbd5eb4f62e98e90c5fdc" }, + { 2857000, "e3dc84910ec3558e38e2cc881d8d3afa3936f1cb5704e56609cd2d8fbb8e8a74" }, + { 2858000, "7d3b3a3871ee315bd04d5f4cd59bcb88a12df84189112d402319aed67c8e769f" }, + { 2859000, "7efbcadcb243e276bafd43708f07db057bce739b027e51a9e5fca7707d5c3725" }, + { 2860000, "bc154759dc5be03c722299a82fba8f46988846cd7daec7880fc120626403360d" }, + { 2861000, "dfe1367d23e46f0e7b29db3b8af192f18df45959a780c8c0ee15241c71f83c0a" }, + { 2862000, "2fe46603b3b30ea490079f08f8f736615c62c38c7c8762d7042f86dbadce61c3" }, + { 2863000, "691b824bab28f205f445df1d17672fb8cf25d769fc43b3e84978803d7e535d27" }, + { 2864000, "114926de58695f0de043a99fe3205b3cf37ca0fa96ab048fd7d2fe6c94387260" }, + { 2865000, "157e07ace38ba7d0bdfac7a3f96a129e237da9ffad0ca7bddaec49e3bb3f085e" }, + { 2866000, "e2a3272728ab02d13f751f9cac0d202026daa5c04f3e9a3ff6c757e3eeed7575" }, + { 2867000, "6e7242349d3348ae93741225029443cc4c311a855cc0c6df2cda842f3141ec66" }, + { 2868000, "11a69038e3ac0ff2cf5ec25c4a5fc76defa915018794c110e80fdbec4e6df6a6" }, + { 2869000, "69961b8e1bc0d6994c164e0570a7e50a782bd42fe5757f50dd844ab7f8e6a3b8" }, + { 2870000, "b76614d0d84b69f8337eeeac24295fd4953aecdb580ed92511385256a1d5dcf4" }, + { 2871000, "390c1e46d024d75da6816054258068f3ea2250af182587ea9f16797c0a1eb080" }, + { 2872000, "0d828294192c3ee4f4f512478a358841a73533789f090d5808ee735d9fad3d5e" }, + { 2873000, "6ac5393a5eea7e6dad804fc5db2190a83c26e0e231d7723e6a6813ca71841dbc" }, + { 2874000, "b526c4190ee2c4da10a0001d6f8491e2da85d51ff6119b95a2658517a4fb3dec" }, + { 2875000, "e08d100021392e983586af82d4082851e3f4045711a89a0ab0130073ddaa68de" }, + { 2876000, "98aadc2082dcb3cd813d5dd64c1abf99579efa0ca97d6151339dd883c1cac1f6" }, + { 2877000, "4d02196c9f0bd54a6aff28b5ae93b407427ff4da34be59949cf5f74d48915ba1" }, + { 2878000, "69ea8261713bd930d27a38bb6ee6b0f0677ef823d0a86ab613f53eb763c65393" }, + { 2879000, "5213b2384c1a3d9a176e2ffc535aad02b3edc668d058e9979701a769ebd343b2" }, + { 2880000, "9a5fc0c8df9ea23b2a6d6eada14a3ce340396761da7f5a41d214cf7835b20a9d" }, + { 2881000, "934689e474319241617f4336e50df8e0c2788292dfa2ac34fe616e47b6ac7874" }, + { 2882000, "b5bc34a0cba419e92701b6d968363ca3d1133c10989c040a4441eedf985260c5" }, + { 2883000, "1c97ceceed42296fdb1739e12a524940aeb62b24fb98ebbb4b87f6b16a3cde16" }, + { 2884000, "f8d883d2edd4dced40d6562f6116297520d69075ed78da56222a85bf3441a7fb" }, + { 2885000, "7869df5200f80932d0271004a49061eacdaa4b3fec519893b93f841f488d9939" }, + { 2886000, "e8ffe5b4bda00e53d297a206746f6d01e32c312b52024dc0e32c8d66dddafe2a" }, + { 2887000, "9f9231aea9e340bdc8f644c90b40e553a0d55f751dc932c1c63f0ead4ff7fba4" }, + { 2888000, "ceb237f868c61994247cedba59671b87d9869e592c4469ea9e17f04101aacb94" }, + { 2889000, "6b0ee86430e44b2d05290768ac049aa74d1121061121558521ea15259b8aa232" }, + { 2890000, "f87b24dd43d1dfb69cc56140cc7a0000bb7c0f757c33ef4a966c88d875c40e94" }, + { 2891000, "bdc06d125235206b4002077e5913233b90e327115229037031fa671011bae541" }, + { 2892000, "6003f24349f90dbe558166438f31065917c65d0906175702762b7eb498679bb4" }, + { 2893000, "d06cae0a8a9749634c9ec8e5c0fe3d7a7a6aef5b2edcab3f022d5e3ce7eb97ee" }, + { 2894000, "6e75d7215980c553ab1da19cb32c1286a3f9662c53155fbdae493d627fd42b97" }, + { 2895000, "3819b480a3b7ae6c5717918c522bbaa7be4399ecf7801411eae15d627a6b7f87" }, + { 2896000, "b3c482d62b1bb4a62cf6073b7e84955a4be716310094a2db078b96b4eb1abf47" }, + { 2897000, "7caed1d7bd4dc3d2bead3495ad6200cd3098c947f4bb0fffc31ddd51769daf17" }, + { 2898000, "4d868201f6c26b8f303f681386fea13c74f8fe945e0abb2abcbcfd5b47b24597" }, + { 2899000, "0b95e720d9bb7daccab156ce338f0fb5609a2033864ff6042abfb2cf30ba6d21" }, + { 2900000, "f00092f307be8376972d0efe41fc00f2087397fcf34917c7a0e8814ca3ef2ada" }, + { 2901000, "895695ab497d8d0e13f20e87ee3f2c17616bc619f8d67c3beded49c81e8aa575" }, + { 2902000, "fec558851d9b4916d3499d8ef72f39e986040950507b7c847593d864e274bb30" }, + { 2903000, "b2a94dfa26ca0f57e7a6eb121f0f6c2bf88c8feede9a5c4493575bd1a73c7aff" }, + { 2904000, "7dffcac745ff7ca6e9326d4fcaab048c066d3d9819a1bc06ff1eb4288f27b24b" }, + { 2905000, "65bf840e397b06cd81c437a6e2fbe1ef1180dc98d344f8f1b4a3d2371072fb7d" }, + { 2906000, "92f164e9ede5c2a5a742358893d8b901e21cc758eb47f07dbc56a7350b51a285" }, + { 2907000, "29a0c773cfb8e122cf5b01061526417d4d04d5b6b03f7e506c56ba35de927dab" }, + { 2908000, "51e07cb9c50a99a93d2ed5501745680efc165e2b423d8cca18230fde3f27badc" }, + { 2909000, "93fe30561cd0298d52493d3852fcae993b526bebba7510d8624e3da435434b01" }, + { 2910000, "ecc8cd48d4c95955623de692569ffbdeef1d22a00296d6814d4727b81a05838a" }, + { 2911000, "2f28225585ebd7847eeda97c1f499289b9d96ee46248a39ea4fc833ea0151914" }, + { 2912000, "faa72a36e9e5a1a5fb8af69f852d15c31e6020055fdf44f348653116a1bbe784" }, + { 2913000, "2fa66279a818fcb76bfc9b414031c2517e21463dd0f54c07dae3169c32ee3e2d" }, + { 2914000, "dd68619c37ffaa507b094f355b5b2e6865ec138876417296a9ec430b02486cee" }, + { 2915000, "8f9931f181e4af7d23f4726bbeafd2639fff31022ae909548c9c77956227ffdc" }, + { 2916000, "e4ecd174243b7bf6bebb78a6e37bffe4a0268dfc5d2dae905a3b79d0bba28c20" }, + { 2917000, "9a93529d2e20d015b4a4242fcb895d7d1175a55176bed0586143e44f9f648e62" }, + { 2918000, "3558eae3ac57999aa0b39478956a44e5bc98264300808edef4457be62d165bc7" }, + { 2919000, "1990ae70c239b74924ad782d81acda4ce920e7189081a14eae0ea3714ffdc406" }, + { 2920000, "37212a62163aa41d125d988c6688e7c4761e19225e635043b33dccc020b4533a" }, + { 2921000, "15c3938224c52ad3136aa22efd95c1f05dceac691972e6968e461d64322115b9" }, + { 2922000, "bff7da063775b960410a7273e37dafd6c14d036c230749bc7fe9472c4e2d5041" }, + { 2923000, "f519c69f821f21f69b46647f6c72f247a9e2705d24685c7a8609c2b62e15727c" }, + { 2924000, "705591938579cab1a3a3cd79eca7cc6fffcd7f419e952d17762d3e2bea59d088" }, + { 2925000, "4adb088eda5a1b90226e58aa79dd5482a6cb40804112fc99bc091e594ada9505" }, + { 2926000, "9dcc01073c58821ca2ebf82640739dae7f26745042f9cdec90b4739cf73d960e" }, + { 2927000, "b4655540362d3b5782900fa8e4e75c5fc3d7702a1bb91eb1e4ae7b68ff5ba0cb" }, + { 2928000, "aa20039830a70dacc36d7383a55b6c529a8273d2e05c90025f1b08d6841e6958" }, + { 2929000, "88a714ac70bfa2171306420978181110cbebc1558805e78c06847ae4d6290bd2" }, + { 2930000, "499b4d992f94330fa66a523ab30a3850b0b44755b205d326d1837bfc7a2833f8" }, + { 2931000, "0c20d9faa5feb3311e10fcfd84cf54687ac28383e5698dbd0cf95b77ff2f74a2" }, + { 2932000, "cf7777c550b2348f81722928050e8468ff621f3769a1cbe9c09765c678a7d022" }, + { 2933000, "f348adf2c68baedd795ebcdc49134d98efb74843819fcd5d4835df37ec9328d1" }, + { 2934000, "50edcdbcf1ccb2b51acf64e85513b5e85d5d630c81d6c468421a3eaca1e1c87c" }, + { 2935000, "9e9d6bc635f5560a1bdc8bd541b3ec3ed3378887cfd61c0b4832ffb88dfb10e5" }, + { 2936000, "7e63f0950e5eb1862971018defd74ab766077c36e4b0f3f3a2d28e15c43f7dd7" }, + { 2937000, "e534c62d4f0d84c28dd8208ad1b4c18dfc1eab32758196f82967a8560c50ec3d" }, + { 2938000, "74789409ae63d249e95083c854c6892180dcbc0349108304be55bfac4ddf38aa" }, + { 2939000, "3cfe6c8bd4dae4a1fd7965aaed0c0bac790b66443729e87333f23ba82c76744a" }, + { 2940000, "7d246e814c721dafa8b7a3cb24b42cf0644866225a56cce910bd4638a4383671" }, + { 2941000, "864b353b26a0c9ad5b1ed12659e0fa6441c720fcde96109cd54277e1d4bc205d" }, + { 2942000, "17ce53db974876e582ee327053ea194cf5d99937c08468b9cc24fccd32b56985" }, + { 2943000, "46b88b21090a22fd800b0cc271704513e17ca8e227f3bf1a9a71a18353658a3a" }, + { 2944000, "0bf946c0bb9847c860a6e35ceceb6a1e12eea96352402561f70d2626a4ea87d0" }, + { 2945000, "2787efd1654a3684da04af36c1e5894acbcd5779c829cc57297d5a84e4ab525d" }, + { 2946000, "951ef3b15956348de24d22b2c6911ab340b2db0db30c76400b8afabfe6e7df49" }, + { 2947000, "1898dbed3f9a7fbfbdf4b403bc4c30c727dcc90509a4172ef9797489b2c152ad" }, + { 2948000, "a41d0c69b9ff64d7cf55793ae7630a2bab794e68dbc4c39dcd17db657fafe543" }, + { 2949000, "410022f0c75d87d5d7207b4bbf649f8a46d467e92a5e9dde14703305116ff92e" }, + { 2950000, "ee74f785ecc67aa00f9de61ea82b0224c4d836cd6feddd4e811f5b1bf885eafb" }, + { 2951000, "c79f4e84cd02ca4d731e9fdff6389f637f6eab357bb1601fb9a79c82d5e770a1" }, + { 2952000, "25c755467457310a50e40c358a5225401748354bd3896a81279b75bdc67363bd" }, + { 2953000, "1f3010f134cd45135197e421ae9ada5778750d64c04043d957f8d035b104b99d" }, + { 2954000, "2c993f3b8f7d43dc3eb49ca76da951bd09891e0fa376e092fde5bfbc63342deb" }, + { 2955000, "4aa0286a4447fd3a2b4c56ca224008653aec7cf79046bb78f386250f19ceef60" }, + { 2956000, "8bee73a3698094387a7bae467e8976e7ddc8b54a40c2b5704fe48430b2c6ee76" }, + { 2957000, "1d18df661f7f9e8a0af00e2cd95d8c5338009386582b89844d0508163f9f0e57" }, + { 2958000, "512dd899101754a0f2b9d377d0535cd23034e0138a7008865058e32c82f2664c" }, + { 2959000, "90ab3e79952a2900355f43e97735ce6b1553cf9b09854fe3b3ec1c243b555409" }, + { 2960000, "d3177c665a0b946fd3e81091f6322ea02b88ca43bfd9729b035ba19ad81a58a4" }, + { 2961000, "db4ef73530a50ad6f704b0c6fb184c12475ec4f110c0ca0fa271c4186c99afa7" }, + { 2962000, "be4763f3c22e78789f2d4bf5ef8ab84d38dd541ad205f90651d74e015389813a" }, + { 2963000, "dbf23060fa5ffd66fbfbab4b61fe9d3ec02db66220f9c42632ce9236a6236eac" }, + { 2964000, "3a834275624d011e0a3e7610f4f8f15614c844598ee7cd73f5c5d40e51fa53e8" }, + { 2965000, "d765fee236bdc38cdcadb2c2964e11b65e929c2ab06dde474fe0e66e696a2915" }, + { 2966000, "94efe98bfa526fc872765bd366cbd0b5268b02976c632a5394b003b08f3b6cac" }, + { 2967000, "68e61ba7671454778a936a3dd65515fbed82f52c9aab4fa5362714f8732eea14" }, + { 2968000, "7f911b23e842f7ff59c4dc23668cf64d0961f2aafec99b6aa60a3d7ded44f33b" }, + { 2969000, "31abd6f5f42509baad5a1a77699dcc6e7e0287f490d7524f92e5c1dee7b09ae7" }, + { 2970000, "cb7cb4473c6ae5d77c40f9325745efe7b4a853357d95ee7cb5b6eaae5670560e" }, + { 2971000, "bc6d2053b6bcd002f9368a8e002876fadd92c10f45c1fb01265350552feb5aec" }, + { 2972000, "b25d4e264fd9cce33f94ab36a6a32852b5bc80461a47e1865b52c2f105ffdde0" }, + { 2973000, "9f9a812a93637291c0c147242d50de5e20fc26c64cdf1a0f2638469ca92ef7e0" }, + { 2974000, "42892c679fc411e3f44cd0fb6fc1dd929a94a832f4245e3ef931f70a3a3355f3" }, + { 2975000, "78d9a883fa59af52aafd3a483d0a04ef045b2262bc01757a4540dc580ef9294d" }, + { 2976000, "23bae00e966149ea6db780fa7981f4dce7014bc1f287ee4f1ca6a97b1ccc1181" }, + { 2977000, "4365cc4293d5f1d4d3962b91e21b883ffc53fc876a93ef35c53ab1ae6f1eef9b" }, + { 2978000, "756955fc283e43e9ff8a57a654a1ea9df16b7f6e99bc4039a93c238020fa79bf" }, + { 2979000, "0ee8a16dc05629f207b2d0df5071cd5a6b9e8a0f1f526e9766b711f5eb7dab76" }, + { 2980000, "ea1b4b87fa8be72ec9185bdea883d75457567de158c3802d702cb86a88951053" }, + { 2981000, "3f665e6b9491490224700ff8bba8e2ae74ee360db5accf5b9561fc0501f25333" }, + { 2982000, "37b855c2902072fe5bff47dfd155e2413e30235130abf7c9193ef191a31e696d" }, + { 2983000, "2cc6a3acc301cd7f128d7395b05aabc03d9d98aff567191828bd5707897f2ebb" }, + { 2984000, "17e96ebf299389febc9c76e81286da32124cb139ad41492cdcdfffea0da1b94f" }, + { 2985000, "9b5b059168eb994add6a0703e25d3b199012994d23c36dd27a0d7858abdcbb55" }, + { 2986000, "0a72bb9222b606d8e137fdb431e83b1cae54431fc9da5cb8455bb1a02074ad4c" }, + { 2987000, "d36213cdd2016e1825725cee69f7bd31b381f07615dd2034c0fef771c23dc159" }, + { 2988000, "0cf4610b17649b973976279ad61b0e788dd43a3d806f3fe643e0d096400df52b" }, + { 2989000, "12455f1fa73128bac129e2bd45324787c23ca527d6d21a5684254bde9f73f4d2" }, + { 2990000, "328c5f8c6fab55f73b20274ab61838b03c47f3c70cdbb416733f320c5daf9ab9" }, + { 2991000, "1b338a36300c77659a98bdc5cff8ec99324078023689b62b6296f9791da2cc16" }, + { 2992000, "abadd7811fb2534d5dc95eba6d3d5410b27a1fbc4fb89ae7674188c222534ee7" }, + { 2993000, "eb3a4b772f1095dbcad58e38f4f8251fd661fd35fc9d8b34b25b59df8826b891" }, + { 2994000, "2bca5ebf0c8290fd5527c371e3ea6459ddfae2197e87dcfe8066f0112a29fa4d" }, + { 2995000, "78c0f93f1e87233628ced9ada548cab24a727ed4a2dcec2b088fc2c493aac90a" }, + { 2996000, "acc30f8a06ee0a9c0c14e71f63e16aed225ae95df506796e358d491962432d22" }, + { 2997000, "d24a85b4aa547a62f68b9d3bf31abd71dcfdff28e203ba229e3db149d2ff712e" }, + { 2998000, "f3d96c2e1eb62bd35d4fb584417590b52488de4e65ca9071470239377a28343d" }, + { 2999000, "0e5138871d719127a87de490a3f50d718d7f3b7656207e8f6792dbc578e911ae" }, + { 3000000, "5c25f9157bd71e4ce367c6b2bc11fe6be51d53e8ce905973eb2ce18b235b34d4" }, + { 3001000, "0b3b9f62ba31e5d809535b5b7158ccb5ba93b600c55976e4924e6c5f2ab40f6c" }, + { 3002000, "4d9d906013b10af6a915275c2c403ed7c7ef5d2a2fd2ac1497e6316792300897" }, + { 3003000, "83ccac866d37231510e382588297bbc745c5041b6f6db2f3ae358033e6399b39" }, + { 3004000, "8956f2c94d5996a15f6f7feca01dcc94d33c0bf1e24fe7076f70fdc2a6012adb" }, + { 3005000, "9e0aa33baa221b4826dd7077d233e0955752f8a673aa60c0083a681cdae737d8" }, + { 3006000, "67a17d8f48ba828573f7e0402b5eedecf4924c047279ab4183944473fb08c42f" }, + { 3007000, "f2b7ba7d451262530a3e2988bd25abd25876be29092df436d22711bbec8217f6" }, + { 3008000, "33b54604e7c4ae6b8a14030634d82c0ed1febfc32e1ad76788fdfb46ee1b9231" }, + { 3009000, "d50973362cfe09bd8ae2d53737880b0cfbcd21728ee33fc9e0b53280019b962c" }, + { 3010000, "765898ce1d360ec484066886ee52764768a5397d9a79cb313c62c4ca53ffca36" }, + { 3011000, "94d95559586e7dbba1f359c3a259e2e46ab3a87cfb7ba1f4ba7cc73305065290" }, + { 3012000, "548e244cbf64edcf323d7cdf7bfbfd2c3dc3402f08bc8e2032199f73967423db" }, + { 3013000, "2386bb38ca46e47fbfd0a6e41c5cf3a6addc331a8966774a03eea688ef24001e" }, + { 3014000, "cf8f5924638d961ed8a66525d7a18ab81a275540068e8b64c2b622a872b3113d" }, + { 3015000, "c7dee77653f7e6db4dcda861d2b3f3b941a4e5ffaac09ae837ee940aee237504" }, + { 3016000, "8fcd10fce45776445e38c40c5a880e10306a17f0b1551568be0acf50d0ee6839" }, + { 3017000, "1be22280b41f98203b6fb96f04e693c218b71e7bcc9baa5fa3aa75594343cfd6" }, + { 3018000, "6ccec89f8d2b1ade9a9950b44abc50499040a792dde422eb6145b00088f2cdb7" }, + { 3019000, "87a4a7d662579a9531ba86a4dd7074a69bee751c6fd928bd034d98321f606482" }, + { 3020000, "7c5e474f2813a17fb2a55dffeb4d5f34a3a6ab627964fdedbfcb699b1336d2b2" }, + { 3021000, "a13dcfed00f1e9f2027c2030b36fc19ca47a5fec27c410ceb2a6fcb605aedfbe" }, + { 3022000, "01d282df5ea7d80bcf6466d41f8d2f059924251dd10729c5580b8041834d69d0" }, + { 3023000, "ce42c5011b5b6d971a5e79e45a908e44a543703be0a43687a164ab1baa0fc409" }, + { 3024000, "336953cc7d0d4bdf37b5db850f283a957b16fa05fff0073f0f8b7dbf2a22f42a" }, + { 3025000, "ba706928b265f22e7fd8de31df6a1fa487a9d27533c4fc5a0cf6484405d9451e" }, + { 3026000, "31381e843113a0f6ed45d177173785861abe15db6b4de45adedc9b0d7aae470d" }, + { 3027000, "7b55e96bcbfdca44cb5d070c0281d7d2f38de81d63649f0d52ab823c387a5054" }, + { 3028000, "9d6563e49af1bc6fdd574e58aeef8ffeea22d01fd9b793418523d59e94dfa176" }, + { 3029000, "22143c8eb06fdc6126807bc11508c97d8280dd2b1e26e5d2d22ae3316517c4fa" }, + { 3030000, "6d4a4541341110709159322e929bba110d45de7db30fa4306e972ff0bf61ffae" }, + { 3031000, "508d6fcc9b961aaf6d0f4fcb856e3379d4bcfce9fbfa06d1004287fde6a831f0" }, + { 3032000, "0ee0365efeebbb2953eaa212a78c3303f26c0a67919279b72a45e4256df32997" }, + { 3033000, "2b8e55482ff8fff760d9fae90f3cf2f3cc5bf03898c003677b2dbf71e27f781a" }, + { 3034000, "6a181a94d98199b26de91b7560436dac7207cd4dd45e7442a892ba394fd023a9" }, + { 3035000, "111c3e9b6dfd3dc30fbf6a0a4102c66e3ae70bef63d625e26f38a2dda692da51" }, + { 3036000, "9c9d760994801915f23e58c5fb234b46b4e97ac1c9c4b01d0d9a031c9487f760" }, + { 3037000, "8869a18cf754ab832ce28883ba849e2a93dc843bac3db001e6ef1144a1bf4bd7" }, + { 3038000, "a5f56a513915f3df6ad582e59b0a936ff1ac321f1f94d8c2ededa95f2a08d4e8" }, + { 3039000, "5e92b53395cf9c87e5bf94c422d06f8545a9c55f311b5b3c24dafb6fd5aeeaac" }, + { 3040000, "7444fc35c11a295a3f3cbdfb777bbe40580cc81c265ff4179389e8ec0954354e" }, + { 3041000, "d079b8f3f5c6f66ce3b47b49922dcad7d06f8d2304f43eb3ec3250bb3f9a8a20" }, + { 3042000, "1cae5393fd4d2bd9d7955086ecbcaef9411f1ab78f72598cb4c09e94ae330872" }, + { 3043000, "1fb214b7693c4c54a7425c61756dc00a990c9442cc2dc6f7c92b7af3e65654da" }, + { 3044000, "f9360298425bc01164162126f24fdc4ac26b984f5c8b8dc5651fff253cc2405b" }, + { 3045000, "eed57ab8b800021545496ffc531d92be84f433e944d9ae62b2b4dd8f8824479d" }, + { 3046000, "a1da3c2157f019c6e9dbf4e1d32c3270b7a9d1ad96182db533048f3ad8469d20" }, + { 3047000, "3e81e33c565258db7cc373729f1be67f8ea010a14f91701dab7b20ae181fb4e8" }, + { 3048000, "89c36cba2d2aaec2a51ac3e3c3d1e434ed984b9ee6d9a5260436082e4e3f0891" }, + { 3049000, "d2fea290b484b5827414d6d089f41419db48b959963936c11a0e98dc798ec7a2" }, + { 3050000, "4f9614382ca05d41179db2640d7694f8796fb26baaada3ef4775c7a9261881cd" }, + { 3051000, "99a7e3b51b791295bad8579ac4b6340853ff3b8263e9fdd1351a8078d1aac05b" }, + { 3052000, "c68ebb01a599834fa6dfd8414da3ceffe177c49bdae142ec38330353e47b6e37" }, + { 3053000, "39baad20e3f12decd65b29a17d654fc34dc8e9baf372836759313b686de23810" }, + { 3054000, "e1554b71a0ccfe2a1405817974b6a5cd8086303ae77a2243f7cb0250aa30f88e" }, + { 3055000, "6eb53c330bd60768f43991255a06fee700097492f25fb4a0d6a58c2d961e31ed" }, + { 3056000, "b089b47d34be46b4d621eb99f24d6edeb8f1c4a8db3e14677e8f56603b757de4" }, + { 3057000, "f450156ef0491fdfcdc4f981713d31ad27a36072b1ede04f06c36364f65c1698" }, + { 3058000, "ecaabc81ad09fd0fb21b2036305ab0293f58191f8c76b82c577bf3dad44d0b5e" }, + { 3059000, "422a39760fb255f2295a590c17b5d7212fc3ab214f6a16b458cb70f0d9af13bf" }, + { 3060000, "b71529a0c8eb46bd26c08100fd571ea69a8bf35e95ee89f6c5c1ba1389718033" }, + { 3061000, "95f254419da6301927524f08e841ee857a0cd1dd5b8a724ce5e0e216adbe5349" }, + { 3062000, "76d53794e08407294891036f891a51e47f2e98cdec6a5d9c505b0235b6f42505" }, + { 3063000, "bbb185be470393f0275127f3f7f45e05923d2ba9da0d6e6f036c2f7c72f7796c" }, + { 3064000, "97e50864324b9360d51c770c79769523269e2fb30d9b5677531c4ad10c0109b3" }, + { 3065000, "9eac5fe3a2858ebc4e57774cab8ba331d508be030ebca22fdd7cfd3c33e5e061" }, + { 3066000, "634ef14bc5e943a73dd73cb4111550d385d158243691edf53964554a08b80380" }, + { 3067000, "8fcb09ffff3728f61cafdd93a10d6f3d2fea108596b6efecefa0bc5f75d42457" }, + { 3068000, "8f0568fe525f328373a584c8ffced9ce3b06792f1d94e285321a75f98c2bd2fa" }, + { 3069000, "44b87c68520e6acbebea954826dd5e776105965c9d2a30582bf3ad19c7765e3d" }, + { 3070000, "b552f05e1fa92236443269d9ed1ea54e7d51e684613b7f2f2acbc00c7093f688" }, + { 3071000, "c3985aa1e09ebc50656ff7d4bb63e2c6615257bfb327a48091cac1ead1cfc7ff" }, + { 3072000, "3214e19393cd0cd8e1d6509bc1ed5342121352ea2bb093d1079c296b85b417fb" }, + { 3073000, "76d21b29041d218156ffe91afa4cf63932178a3d83e8c9c8e146bde62d49f28c" }, + { 3074000, "cc335a7ce6fdfeec607058a2f98697693d14bd2bdfde7935f59b23989e29e60e" }, + { 3075000, "fd37593851a62e3170e3d3ecb84715b005fe8fbffe61a4fc32d0cf16a1533cce" }, + { 3076000, "c27cf123745da7e3f5e7a4e4bed119bc10b8892de28d16c58586f0e901700bb9" }, + { 3077000, "67d44de0ffe2cb86e515766bf33e1412f42c03dae0620d07375a71e781d85ce4" }, + { 3078000, "89e5fc5892cacde126f187aec326be5d33adc04459c9bad3cef377218519efbe" }, + { 3079000, "99774b91ebeba3d1ab68cff8812f15998dcd8f82a221953b4eafe263581187a5" }, + { 3080000, "cf1315a2217955940201b37980a85f4211b8bcfe0ad543a5a77329418de2527c" }, + { 3081000, "f05faa1ed0a8ee19dbbd57f9a4c9eea2e82faf5a8ae1e3ff22a67bd4a14d07fb" }, + { 3082000, "c6ba0eb3e2ba95c5c7921f1c369208a3e539761c3b1260b657744f28d14b288f" }, + { 3083000, "b0c551e974bf388c51fcf48324437ac92b29281e49328406aa743adff063ed30" }, + { 3084000, "a976514b9d9731b4b2792612027121e6cf23450a81cf0925c672f7e7d4b2c838" }, + { 3085000, "cf8827788421c1aed64aa71c1c342da421c7c9d9f457eee8179861027a4daf12" }, + { 3086000, "314aa0f3033a8a51013ad23385ff1158a38a71be2d20044db5c9deb04fa63697" }, + { 3087000, "13db6c88a669bf223b35fa4ad1904fc7b439c859ef7a5be6a2ac5fcbb113937c" }, + { 3088000, "4921dac730d47885f7f9ebfcf5e92e616bf37de015854ef6994ce52dea69b4eb" }, + { 3089000, "8072f3964e4588ed2f0081cbd20dee18804ebc38de495681890b4c43bdc24a87" }, + { 3090000, "5218ce00524cbcdd6dad30d9bfbfa6bac41e7279bb55ae3f2e34e3de4805b547" }, + { 3091000, "119fc5d820584f5525027907030a1a63f2d801e3a91349a6f41360498a0ac7ad" }, + { 3092000, "68d9329f3c1c7ffb783f6b598869f7a6093f06786fc93dd6590b7be59d76c056" }, + { 3093000, "49358a12c380164ff8bf28d83c6cc4c79de41beb1e43a81124239421086c7c7a" }, + { 3094000, "ce7363f433b402a78ca9bf08da1978d506a0b511788ec21e218dd28f8136bebf" }, + { 3095000, "db51e079b6bba29c17911e93f156a781389f27e17b3c22a2bfc11aa47b550c43" }, + { 3096000, "be417367ce8362e226971e2a5d6c19510534fa7ab1836a5c443bf2d0791ba306" }, + { 3097000, "ab2320f67aa316ca87af5c3fa90f5970019e596e121363058e5942f0c3054950" }, + { 3098000, "0f880decf6fe3064c844b23346e5c54e5bc2953f86cd7bbd211ddf43c7c74768" }, + { 3099000, "27075dae4e3acaa74fdaaa224723837e800477b95acfaa9f78265b995eba80cf" }, + { 3100000, "8181379a740aa40fb3a8d1d5d5cdcef7ea62d49ba6f3c65d009cf02383e678db" }, + { 3101000, "389e462cf17fd7de3d9256c3ee8bb2c4e2204601f3175722de163588356fce3c" }, + { 3102000, "63a9c26e6e6343443f2bd5f10dbafaf622d9533489c632fc3122df556c530d7c" }, + { 3103000, "e89ab3745e56a84a8b3b174c34b1653313bc7af641de1c02af03c83e9cf5dce4" }, + { 3104000, "3f1796c4acb909f44a7b5439701d356ab7d0ada0eea5e8bd30c67f13644bf3bc" }, + { 3105000, "fb5787c1108d962cad027d2742c47695444ab125320601e34c6a7a28731f3bb2" }, + { 3106000, "bd8b5e3d80d9e809f8ce4503cc3a1722e7b1c269e93bb4b4244dd10fefce7d59" }, + { 3107000, "b78b8f72f62cb0e3a25c534bdccdae55ad90636cfa86ca157c3b4bc4a9c50b3c" }, + { 3108000, "5db4a3b969e0b06dd50bf18ef01db961dba97c1c9d6c6371e22413d69fc290eb" }, + { 3109000, "96290f9e9856e70081c6bcda011be2c48f9b7f79f1de53b38e17c4bc5fa93ce6" }, + { 3110000, "f3e89899f9cc0ef605ac6822198168b3b68cc317e6bdf5a4c438519f756f26c8" }, + { 3111000, "de5160d9ad80d4e98dbb1b4587d7c24a8a5530b8855320ad88c9e1522a8dbf94" }, + { 3112000, "41810592a7e1e32df10b711310bcaa695a47512be8d796d84e5afb000f8ac340" }, + { 3113000, "6963699724dec80377862ed98ff93cef034ead326adf313387a29505f7706790" }, + { 3114000, "ea1d5826d9d5c992d6af2c36020562dec27727220237b8b343ea5f628d75c90c" }, + { 3115000, "a65da760173c886100052c1f229eb390f4a622a2e799e44caff58e8dd3fc250e" }, + { 3116000, "1bf1357ca5eedaa9ed9ff57c1c844898bb7f0264839d6b64c2ca427a964e47d9" }, + { 3117000, "8b9ecad196459d881d6f771218ee0aa8a734358fdab2ca01dde69524682cd49d" }, + { 3118000, "dcf9ed93ebbcba66ab65bbe5c3b2b2270ab271b439aaff0af1eaa004612b5372" }, + { 3119000, "ec38e319c5a853504230db117522191a5527a9b3512c9ad4ab904f4193d2c43d" }, + { 3120000, "595e25a440340e1ad78e118c183ac02a1dbd6b053406d4664cf3a64b6df0a1d2" }, + { 3121000, "352d2cc9e3b27da26f0f5983fd1c914feacaae874c5b2dfe72770964ee8207a6" }, + { 3122000, "888c4cb97d45a9a6f726588bc3373e0c3997e3e9c967ed0322b985d9e83c0625" }, + { 3123000, "b48d193f7c1ad92ea9d40c76d9436f367e8473f030933bafc8cf0b3e0b014b5b" }, + { 3124000, "17d422fa98c670d0a1519640e5111353f05cba518e906e331c67490f76a80fe1" }, + { 3125000, "d56a0372ef438d5d7a3a984bd9eb05abec1aab9a3808b1b837a70d9e81320278" }, + { 3126000, "5ef58a6cee33923f03fff2f22d3076553d73dbde539d0442027531cca9e6f6b4" }, + { 3127000, "c02fb75c96b78bd700e447a013eaddf3889f22aa51ad5cd43c1371ecaab26b03" }, + { 3128000, "a0e2352bfd5e9c5d21192764ec8af742dcaf78f0f52d2452192565e3c983514e" }, + { 3129000, "7c0cb1ebd5b04860063ebb2637979acf29f3c925ac5309471fcdfda912797669" }, + { 3130000, "1a9ddcb0443be8ff19afd1e5f64bf1ac25541a180ea0b7b3c61b0c7a721bf7fb" }, + { 3131000, "34d774821111d6ca9cf54f42b99d004e4b857cedf5ba6d3f87a4388bdd8beebd" }, + { 3132000, "7142771c53f2b880bcee8ed8150d60566306bd8978116bd4448833c4e561d9d2" }, + { 3133000, "da64ee333b4273aae9589939338dc592d9094159a6a69b81e523e7f7331b9765" }, + { 3134000, "0341ebcd36b2b8d6f5f12fb140447093b940105d36e0bd027b7be910b3e3b24d" }, + { 3135000, "195580b3a710828166d7b3f0dd05f5ac502b319d0800d886873b57a6ea41399f" }, + { 3136000, "676e60463ad1781bec974443e6cdf0b66c82622e335aba2e1a660373255c2bbb" }, + { 3137000, "009a70ed78c772b8bdf16d13eca8db28cd0dcc55487c233a4d19996de4b86a4c" }, + { 3138000, "25c2522ee1e1d01d17c49c265cee20b7afb9fa935a2c1f4b92e8c9550841abf2" }, + { 3139000, "91c94a4781c93164d2fcd0a04667b17c57ad9d347fd3304a56e9d933719d2269" }, + { 3140000, "b618625fe7f15440dcb0c552b0b10746045fb9b26833dbf3d138abab3689d340" }, + { 3141000, "f912ab289e68f748204cfa4f4621c9609d4dee9ed7c45f6bf8c67bae5ce27469" }, + { 3142000, "3a5fa59917ec916806fe9d853f3153cfa5b4fb37867f58c98bcdc4ceb258d691" }, + { 3143000, "6d83be09d8e00d6a1883ec48324e3129986fc6e6178e39bbb32b780dad31c505" }, + { 3144000, "aea3888b87349076ca22f4be07718f07710bdbca55ddb9c657abf02e2e21322e" }, + { 3145000, "30e6eb105f262405190bff7c1602dbca75b744196dda3e7252e15dcfa74792ed" }, + { 3146000, "801320b0ec932141fb62b88be9dc38f6cd5a2399d81211f17431a55c5264ed26" }, + { 3147000, "09ef361292ab0fe69c1f254bd460ce69c65df70bdcd44acce79c0ed1c8037428" }, + { 3148000, "585077377ce46e8ad1871152e0a6bbcd209d86b70f0ae6af24c754fbf5face6e" }, + { 3149000, "eae94f19f9b4f7024a0e09d1923d93e9f2e3218f40b66db684365339b1f91cf4" }, + { 3150000, "410d589d09dfee9fbd536e24821f5a91dd00f773818287457c4e7869edff8667" }, + { 3151000, "54fb731905e864779609e719e062faca1ec84ac34cee9827db664756450a05ce" }, + { 3152000, "9accfeae5f07b2623e64b398caaf13f72b57bc4b5dc991b4388cd0ca5da2b263" }, + { 3153000, "5c8e875c77a41fd0eec67102df9dc0312853e06dd645767f31735b57f236bf06" }, + { 3154000, "5bc1a880f5962e0ae63fd65a7fde7cb784388070851135b4092ffae00168fde9" }, + { 3155000, "dd1d92ad266365bd031f21682d6717a6d5b6af8f3901f95cb2a75a56d1696035" }, + { 3156000, "bba5f48e3864fc0b96970460d087050002f76239b647f73aed5122175a59da64" }, + { 3157000, "9dc00a316fcb57ffc8b6a55f56b6450d24144a394dc2748bbcc4b8bb753d4b3f" }, + { 3158000, "79e2353c70d5fbda54ee4e8d7ef3e5194afd1d6c5c247360ccbe3249e287f746" }, + { 3159000, "c53cccad639305885e3d771dad76e609eebebd88e7abf5bf88a3d328baf5d1cb" }, + { 3160000, "9e1e2a71efe1d093018621d5c9738f408cfd2953df2daa0acf8690a82b549960" }, + { 3161000, "b3b7d4ac8cc37e1474e3d1f93b98f8356f35e83d57eef9bae26bf5e16a0738dc" }, + { 3162000, "abba3e5301f1fac4bcf1ef081130577fa409ad091da2470516489ce74265297e" }, + { 3163000, "aad231052ebd0cc5a1aec641557d6dd1e00f5e51a36f370e35f539dd3753837f" }, + { 3164000, "812bd0cd9758d6b3fe479b695e01481206092718363955923833b53138a7fa8d" }, + { 3165000, "dd27ce5354b3918fa8c2a4db59a6944442b4e49b624fd271750707339513a829" }, + { 3166000, "4e5a0ffe0f49fed0f83847b8c4973fa1f859b12cfa397df759bb2680fb7d73fa" }, + { 3167000, "eafab654002a8362ed9b7c53db6d707ca2f046e285f282b0182fea54e83d2ea3" }, + { 3168000, "b17b0168fd203b4663ecdcdfd45acdd248b07de1e9a2e975f79d8332fe2b95e5" }, + { 3169000, "43b6cb92be61ab46c34c9c45f6191d1e097fc99c46608d340efc06b7a49ba333" }, + { 3170000, "473d0594338fa27520ca6350ff87817d52df70b4804df54dd8a98a89db4de054" }, + { 3171000, "5c2e3f68a4a1008ed69571ade48182c39028937843ec959c98d33db37edf668b" }, + { 3172000, "742c8d15dea830c990f329fca9aa625e7142ce2e979be98ef04f46254912cd0c" }, + { 3173000, "624f9b0fa80a306c1586307d3f6200cd671d72239522a7ef71365a3c3c226203" }, + { 3174000, "9b0930e2b8f6fd879d4b5c234d15beb08dc9c31b587c45e0802ba69c1cd3c116" }, + { 3175000, "467ad2c6d2b6b8712fa041503d84f8e475e098ff122de62a062295ec2d6f4135" }, + { 3176000, "e07f13bb62cd8795f5106107a388a12d03d88529abd2d98df2ad549273f6f9d7" }, + { 3177000, "300770a79afa8784603445290c4d778b231f3563eb6b8fc375a08c45dc7d4a7e" }, + { 3178000, "7b266e8b1ece3e4965ce94c1c355c0268d788b160e8999dd960ada6dc90fe341" }, + { 3179000, "4506591e656a60a3519c8a48656525ffb88a7f66d303c795bed5bd9d6be0a39e" }, + { 3180000, "a03ff0343f63733f5ea1df43852579a09b75936b2fe5a551e22ac1113de63de4" }, + { 3181000, "40ca323ed35725ffcfdd552172ddd5f72978530ccb813b55b1d789ada71f0233" }, + { 3182000, "c248552fa425ac221ab5ad5980ac36ca504a4a8cf5e37f375dd34a9da287e07d" }, + { 3183000, "d929c6a8874b441010fb0784651a4306a9b3d1db2518c9eae0d01cf2f305968c" }, + { 3184000, "f4908dfd32a2ddcdcff3496cdce13bdc0d63f52b0ae5751e2f09f946e1d80470" }, + { 3185000, "9010fd0074dbe3ac9062c59d54a66e067caa5e5056b6e913613e72862596d18d" }, + { 3186000, "e230c7f329a97141ee4d99b6c9f33ca0e8770b0ccff9647e273737257a28fbb5" }, + { 3187000, "58f5f93115771bbda78c99e43493a5deead7383998e8a0eddd20273573e39f83" }, + { 3188000, "839716f42c1dfd7c3e25850c9df1a2ae2dd855ca2c92eb17cd06fa1eca596324" }, + { 3189000, "db063dbbf4521b55a93b3916f6506c728642d305606557e68ab62d778bc3eb33" }, + { 3190000, "9b2f6e26734bc6695be4823de4f8b2af8fceb2fa53c287d631583e64ae73b05a" }, + { 3191000, "03dee9e0155fea3632a2ad7aa8b630852d231826dee076fe7fb346be6d8a85bb" }, + { 3192000, "4c9fe2efbca509a3d974eb15cbbbebe0dd229cf43e5bb7fc9c98079b388cd7e5" }, + { 3193000, "61d7b9c6e6f1a43dbc3cb6d87240574ae297ee3f6c3183f0c6aadcd2643499ce" }, + { 3194000, "023f0f74557add3a03c790c5690c9da4c7a279a4769e21f097dfa122e66b5e43" }, + { 3195000, "7dddf7953f80b061a61ed0bb01b1793cab007b7f271ad4576834ad2803740e34" }, + { 3196000, "2a8c24bbe7070f9ec22db84f4322a5427d1c0b328f40fbc3403a2fae2ac97ec9" }, + { 3197000, "400bfc0f60238e00075c9f66165ee4e0ebd53c271eba76f02bedc762be6207ad" }, + { 3198000, "f68d9350b4b5831debabcf9b2f177f8fcab36ffab4b895dc31bd16f9cfd55797" }, + { 3199000, "df88991a3c3f1b4fd608551162389888cf07a5df9655cd1d92cc444308ba72ea" }, + { 3200000, "3b58260891025de2881e45989f6f93fbd2cb5067ef9a0e4a2207833ec9469675" }, + { 3201000, "be874f029c7f508771df6c783ec117fb70ac313a5ec80796ec35c2957b93fc39" }, + { 3202000, "bf498dbfe5d9a36e14635c8735067673cdc43ea9163cb17e4c6dee8cb0ff0f9d" }, + { 3203000, "4e410d8615e3035d61de643c286ffdc171668efa1deeb6a90a946c2d495c07c7" }, + { 3204000, "7fe14a9c7e3bbebd1b5df821c3017e0a4bedb0e9786679b9d31950ba4c804971" }, + { 3205000, "452bc44d692fcb0d208ec1f661b118678025a642222d8f8d18b6d8723435c33c" }, + { 3206000, "536c80d6c756c99bdee8a98ead62924a77c4cced9b02cf7593bda60345228dbb" }, + { 3207000, "159e568923bb809a02370fad123247df4af21fc2fc102a91930450d7a76bbd67" }, + { 3208000, "7d07877f6c8c1e25677428d2a31109bdc1e882f0f7a464c8fcd0cdb701a25e31" }, + { 3209000, "7be454a363dd21df880ff1d2f2a74dee2bf1f2427685e1ac39156412a13b5afe" }, + { 3210000, "d8bce02188c554e1a96a2afe0fb235be473778e1fea78a91a444a06c5edeebb9" }, + { 3211000, "fc3ed511ab90d66570fbfd361149fc8cd30ea3d2e5b2de9d5117974fa822a6a8" }, + { 3212000, "d19fe23597b11c6426be8ff2ffde10e6eb70a15f58263a8026e2d9b93f820093" }, + { 3213000, "5c2fb09397d01bbad12f6f8743888e6592868da3602de366de9163887409c80a" }, + { 3214000, "11af29a2afc910b18f2572dec0288f6d424aa4d30c783b3baa4311add4bb47f0" }, + { 3215000, "f52cb7786fe56b2ca7f4fbac5be5fd595f06dea3bdce92b10399875f059e655a" }, + { 3216000, "033f80cb5f066fe3181b6d46b0c3054c8bb78ba71ba08d3ffb0c7c81c01832f4" }, + { 3217000, "0c6a893f73c3780020d1a875437135cd2943729fdb3c0e204e8f375f288521bb" }, + { 3218000, "d6d52e70286675b77820555e8175afb7a80717ce725cf1d6cf9211a5ece76ed3" }, + { 3219000, "bd2c832fd8fd115b2516bc712e8921d24cc3a6738ef55a05d4485a37ecdf33e9" }, + { 3220000, "adf4dee3d7acff2239823dddba15499da7afd30618d5b998d14ef05d7d8e48d4" }, + { 3221000, "069385e589baeacf5375a1d25379871d0e85e4bd98aae74890ff6838249c9a0d" }, + { 3222000, "86f76c1016ebd072610c2b8f600c15980ab7245a443caf7a4df1e2f2d740545d" }, + { 3223000, "85429407f0a54c096998a83bcdd30f01810ffa8399a1b59d5e85bd6727d9bf19" }, + { 3224000, "81075554f9d4ee08d1e472d83e6f5f575bda9b5aaa57b860c177c09dcef109ea" }, + { 3225000, "8fa10381dadd3fc548b815487a15509b64c8df23a3829f7e87c626d7c8329c23" }, + { 3226000, "767084dbb9887ef0bf0f7243b50c4b74d2f28521fa1391f8a96ddad310362faf" }, + { 3227000, "bc0db67ad69fdb5a5dbba82d56adc07e97487369630e114e33427edd5917eb10" }, + { 3228000, "cf58b53164236996ca2e0cb81f844a18d7de63129a4a0a7bf0484ce3a47fded5" }, + { 3229000, "11b2ece5284c17b6e6759284b819d736c3ea720458ac72bf2281067eb311c12b" }, + { 3230000, "75fefaf4b995d2043ee20b47897d40c9f4f589496f732acef96668e76ddf27dd" }, + { 3231000, "c580685e5f9a8f006ea1cff7f6b7597474fb4de552afe53b723dbd55efa4e1bc" }, + { 3232000, "91fefc511d10d0191dd70793fd6445e60fc8b4cbc590971b063584a300240427" }, + { 3233000, "dcd8031a28a84aaee12a5a42b7664528952dc0deb2be42f7813b87415514b729" }, + { 3234000, "e876148ee58245466190db645d78b119798d1cdcfa9fc1660bef9be95b4d410e" }, + { 3235000, "a0a7953c43483493e2f9fbec69271bf05f148257d877efcdc0ca195534069662" }, + { 3236000, "fa1bbda352728ac9fff48d48fa44264d783953d3df43b3239ae5e3d41825767f" }, + { 3237000, "4f0920db52401aa3b6b00d1be0c165e05693b52f3a196956fb8a481cccceea3c" }, + { 3238000, "9d0590dcd78da30742cb160791a075ca4e6fa35d9f557ed9598d7e54dcd23d2e" }, + { 3239000, "cce792cbfd78645832e3565385ff04d9fb9bd3367bfbe8751306d846ab0bae1f" }, + { 3240000, "b42e157b38cd57ce7f312ef5fefe78590cec52bc123d20ee644ec5c2ffd5db54" }, + { 3241000, "c6a510952d6a3d2f5b9cd05323c531cfb5a3641e7420db4a30884a185dc616e5" }, + { 3242000, "877e651018bbbd5e2316b2695d3353f50741e4a751f871cbf0782651e793fdae" }, + { 3243000, "e7a18ea5cfa25a593b9152483b40ce224b94d036e23c1f4f99cd5898f3d32781" }, + { 3244000, "fa1c0abc88fd105bc546a6860fb518f594b7e793db8172f17758fc2ce209b533" }, + { 3245000, "785fa37d40f82669ee57ed6f9306b551b63d6bc5ec348d7f1ff81ab8b0fc19c9" }, + { 3246000, "6b6dbf19f5bfc8689eaf860f9b16f17a340a1fe599856d17d63e1de9798b1379" }, + { 3247000, "1f8826fbb6f5a0a9fba77a1a976262a03eba44738e9fcf24327b7395d5d42222" }, + { 3248000, "3d711f831979f0277b0830110c83a3ec9c6ca04668ecf4028b3c5cbc911e7067" }, + { 3249000, "a9cdc9ed5999c883fca35703838970c15fdeba47e42290021e09387eba9e4882" }, + { 3250000, "b82a77a6aaa5ac6c376f7e0e4968ef5bf7d56514bf992996057f9f0e1c8f9fce" }, + { 3251000, "5f4618d437a811b1dc424360a33193b2605ac660f385519cfa59e9b48e46180e" }, + { 3252000, "5a57c0932b8213660a65bd8f1b369792c6f51d775cbfe5e3ef92d5314d2561de" }, + { 3253000, "d5348b5d27d9cdeb1afb29c4364a0a8a99302e86c1c84b9764fff10206c10b24" }, + { 3254000, "f2d1c3526c27d87f57ec7af7529cfbd8a97369913fb53f2f0d91738841225d84" }, + { 3255000, "f99f075ee2372ce1341b04908d7e13a219eae5bee94b6dc65ea7ba29e80cf7d5" }, + { 3256000, "8dab22743e18d9dbab7298f6ada123cc0e74be0c426970d57ff2a6b8951a29e3" }, + { 3257000, "5b97a9c9f3e47ba13cac151dbc23f24cd2703dae72a5ba5bd9030a36bb05c71f" }, + { 3258000, "56ec37feff42ef99ac6cf7429ea581b1e44b6bcf22af0400f4f7e76bf4e029ac" }, + { 3259000, "bf6d469e8c482776ce1f812a783c2e798219d609d928711372b433b05c01da3b" }, + { 3260000, "354beab712e1b92c51effe5b84348fff6a3e441823104b8807c5120f827b085f" }, + { 3261000, "6080f26f11cab1b1319d9a216d42588e6869b1407b9c5685aad70decc8174ed8" }, + { 3262000, "58f8cf1109356644ca882e3da841d3b9ee97ece95a452ce836f8b08a39cec1e3" }, + { 3263000, "4814a51f7c6643b483cebabbf91ffa49bb91e0ee1f7f88ecb9b452cce1cf06c1" }, + { 3264000, "5d252694f360d8105ef13fed654b24b88b9ef5067e19b6a7c43979f20efc18b1" }, + { 3265000, "253c33631870fe96f86c91c1543d3ff54180ef3ae50185883e2b804e92852f72" }, + { 3266000, "ababa93f2da4e8fc35ea25451e74f92117569ae298669f3ed5bb79b9cc069969" }, + { 3267000, "84528f0cd3a596d0d8a7053484728c8f3cd3d5ee0aa5c02c22d947ddbff8718d" }, + { 3268000, "ff42f698f29577a7f9e282adeaa32a0f98d77aaa2a58e2ca6adce10284b94e7b" }, + { 3269000, "64475ebd9c7c1a31b67ad8b9dc0146168a4e6c0666c747c0cea09df8fed2812f" }, + { 3270000, "a78481ab822609c38e20335be4d9f220880e4de67ce25d204f874509b90fd750" }, + { 3271000, "6f679aaeddb5071095db48cfbba1a87e7d4e72074c74074bb7bf26ebc3415442" }, + { 3272000, "4e061e0e63433b92531a9e01e9fa029df4bc21f2c87487bb59c9b39721cba18c" }, + { 3273000, "763ef1c7d848133c3598dda907ea93f53f4e8febb5011e699f778b922011661c" }, + { 3274000, "87bfdb231ad4c613bd60e1ca79d128db89af7b181e098b6fbb535159f9f583cb" }, + { 3275000, "e491a0eb1b40289f2eefbabd2142d9b22f0bd9dfc1ae73adec6c10ce0d8aceb2" }, + { 3276000, "d00a32578818495e79d795e80d3439eed10e033f33d77aacae6dccd0c77b891c" }, + { 3277000, "9b312b8e630805745e490dc250521b318d535db08592d79ff59dbc0320f76283" }, + { 3278000, "2ed3ae326a1784b80543d523df7dcbd9401c005eef3299389b30e4e0ed41524a" }, + { 3279000, "810bb433d1adac26942785cfe1a49359040d231c9f348efd7a9e65bab28e6d0e" }, + { 3280000, "f9b3d574f51966e741befbd06f2df63e8113bafc2e023e155a2e069d45e7da04" }, + { 3281000, "ed72411cc2be933ec08ddd55c6caa74d0feb85b76117990436dea1b647ff263a" }, + { 3282000, "840a5b9f65007180745dd119f046d3bae3f06f980bc4d94b5c732c5bb80dc27d" }, + { 3283000, "473a7ba203dd428de49b4e67861beb12780f746cedae890a85183631a36e156b" }, + { 3284000, "9a00e093393ee0654fccf9324430fb176bbc4ecc57ee49cd56bc6b0e736889fa" }, + { 3285000, "69038a4844de38550f55f85ebfda6a206a579ce81457d2c92faf3a4c3b92f0de" }, + { 3286000, "fdba443d3149a86f4348c08522e7e3e175991fa2f608e305547eb11c199b3be0" }, + { 3287000, "2cf48af1f256ea5214dfa3a80a9e904a2bb2568f5b6b5646299bf95b61e30419" }, + { 3288000, "fd9ba9bd1855dcaffad2972be5ddda66b57e7cb94b63da650677341199924a89" }, + { 3289000, "aa59c40eafdef288b1f93598621c81c0cafe380d8f19a063bf000a09bf830492" }, + { 3290000, "c1af41c7ff4614de0181da4ce0de8fc01e4f525d0835e84a53098756679cdedd" }, + { 3291000, "fa25e0fdb9a5a4d3708d2a0df66570b0c20bd3ca8f283cbee9df61f92883b69c" }, + { 3292000, "c1b34a6ba3cad452556274610ba55563b8a9a2829534c9658be78c495bb893b0" }, + { 3293000, "50ecb783438d63e44c56a7004f3f61ebdb03bf8f97410716ea1a2158b4d652ae" }, + { 3294000, "77bc8e7c52dcc56e74b3ab5f0a7fe25f205fe08c51d113e84873f31baeecca62" }, + { 3295000, "4a956cd8696c45adf3d8aa8182da53e9bc553dfe2374f78a174be002578bdf68" }, + { 3296000, "005eece1745219e36824f8cd97b5371c6656947c95286e9d482ab2bfb34a6840" }, + { 3297000, "9d3681dde5b907422b5290a63d1d4949b19fcd92953898a243e94512bcb745db" }, + { 3298000, "b65b11feec87fa996120c5fbd6d171675ede723cc04a84ab6d0e8991acd419c7" }, + { 3299000, "5275c248e7be4f24aecddc9cc16e5e020030c2e32195a4d75fbfb4d1aff4c7e1" }, + { 3300000, "0ddc52d1a727e9a1df55a518ac17de9185b201af0a481a1cd6890a80ed3b6bd9" }, + { 3301000, "db68e4868b7eb225e3297d40537b56fdf77bcda15434da60d271ffb556c73130" }, + { 3302000, "6d0eb703644f61b3f072a95051f2364bd5b25759663dbfe7cf9d130346036e5e" }, + { 3303000, "a54d423e2e16baf116579a7250835157c4253a81a7fb3b2813df4b70da6394c9" }, + { 3304000, "7151f8f549e71897e7347d59f458d54c4486d41284d681ef3e6f281026ad3654" }, + { 3305000, "f3dd8ed8a19c6a4640e9412a58e5716c92331ac8e0e10c919fdb4a9f064eddd9" }, + { 3306000, "8339a07a1a26395cd7ec6fd081b4c3036c3d74353720ee12eea1a28abc9e4005" }, + { 3307000, "6ab15353cdbf60a9c7665a2578c7baf11e63883e014d326581aa926e9fb7ab14" }, + { 3308000, "46d85df6696e0e411dad4faa5d35bb7e1b3d8d22400c69a54371bda994ad0d3a" }, + { 3309000, "d5ea57a3c3abb152af6c0aab39640038861a74d72fd22ebd9e0a1d8f1b2606f4" }, + { 3310000, "08fa05c410be457df131475dfd0e60d76d5c30d44d489ed57d2eb8ef8d377417" }, + { 3311000, "9e284afd1ba5fc7aaf331f710cbc39c0cdf44e567d4cf26d4403357d621310f1" }, + { 3312000, "88c445b8d8e1711cfffe8e9b99c0b9f925b4d0c221dd1ca2b6c891ff3251f63f" }, + { 3313000, "62bf872b3f467afa5728b0a4f65459a51097b95af5a4a4d2e9962dd553fedadd" }, + { 3314000, "7b9cc9862e25f8eea5d04876a2b8ae2efcb679c0d5b40c21f7f76fc4253ed832" }, + { 3315000, "ee801c6bae9f0486d10a03e277bc6f3aa5c3e8877662bf2d33c9380a36a505e5" }, + { 3316000, "7317be9f8a11120ec212e250ea3ff167d8e8e63f2fadb8a6a58a1b2694312987" }, + { 3317000, "c3598b73ba406b14ff38f9e5f93faab80477c5b20a50df6082b4ee0113b2f7b3" }, + { 3318000, "bd9011c0828e5763fafa6e308cf8f722bec1908976beb3fdbea598ddfc7bdcf7" }, + { 3319000, "ad156c9e8b12f752a780c1ba3d5fbfab6ad2863ca12fa257de4167f1f646decd" }, + { 3320000, "9e3d1953541e9d5fad8587fa419d571c864686cb7af13a8060902f93989f3b02" }, + { 3321000, "f592842a77307c66b6052161a1b59f3e33d104df308557f9c2ac1a6db746df7c" }, + { 3322000, "2b95a6d82836826019bc12dfda009c437e02c67fd00bedb792b1d23e2eabddeb" }, + { 3323000, "1c1b8fe74fdb9045d6f5d5f00f8b6e2eb34dcd4f1ddcc5cc10f636c5b480cf7e" }, + { 3324000, "8e720bb76d84f406fac690e11d20fc5983e355b7c6689dcfeb867b8c56c18513" }, + { 3325000, "88f865e80cdba9188ea9469f01ec473979cc2685dc945f586c9c246d60bbf0ec" }, + { 3326000, "20758d50744581058ed1a07c3923b6213f571cb14b99976715d081344ebde65c" }, + { 3327000, "41ef9f39ed9ad604b79f755d10b149f5438fd4b97f7233401650b39c5b455375" }, + { 3328000, "e49b550814378903b3ed4ea201350dcde3cf4728401110ec6f842f0e61774003" }, + { 3329000, "56cbfd46e269fc2907585cad70a19bbf52a86766ca210c503ecc6b90f3c2604d" }, + { 3330000, "f598d12ae0e82a0be7e09378dec73bb7b18ab3ed28095b3e1c3bffde3c6c41db" }, + { 3331000, "23086d5b172d843c84ba93602602eeafb732327988bc780487ec9b49b8187ebc" }, + { 3332000, "1d008a88d325917a67b519e29afb2d14905e49828018ebd9e7bbe2272c2aa92b" }, + { 3333000, "9a6def07e0cb437ccc1a9229d05e1fe47764460171ae20d319e96e8503114cfc" }, + { 3334000, "1865f4845063d0385eb991b3b6429cd2fdeb79d02cc0a41256553662879436a5" }, + { 3335000, "0e33f65d7915417eea50fcab7b6712998136c970f138fa3ae12a121502ea0de3" }, + { 3336000, "abe35bab044ff8d4c026b1cf1fd9d58a7daf1038ba2f95c771520e64e13f2ac3" }, + { 3337000, "0aba9aeaaf2e79582af1b1678331e371cfb2900e35897c8451929d276a8b434a" }, + { 3338000, "77b80487f7794cae2151b1a6203623848cf19fac7da21fcee6a4e7ad5a17336c" }, + { 3339000, "c265267722dea27ad38f88d23b2d6d243da5b7b1376bfa72b4196179249375d2" }, + { 3340000, "221e5a51e159b16e98b6aae415bfd923074d32331eb4a2f9f92fc87f947d3863" }, + { 3341000, "a43f6579322d08788e2cb5844e6bdb1b941f35c6f409c0586d52eca077de5ded" }, + { 3342000, "65f4c2ee5249c92b72b8dd95afbb35ce29b4d0176f0439b3cca4d411d43d954e" }, + { 3343000, "9e8d637371c8a7608e8b4d12ba304ed666dd0ed8c0ebb2e0a240f13336eac93d" }, + { 3344000, "68d6741aaf6bfd8290bc2e36280af2ce3246498c4cd6ae07afead2d5e733dbcb" }, + { 3345000, "1b87e84bd32ef7f407f02b4206fd333859c4af5f684954a0db8f3dc2a718a812" }, + { 3346000, "fa9dbd6f4f643478bac7922bd414c44fc58f0c35b049dda0be1c590a0a2e5a35" }, + { 3347000, "fe3592ef6a1881fe030add93c8bdcbeee4054429acb912a25f30d2a9751871ff" }, + { 3348000, "5713327c78ee265039257dc2a3cab45a26aeb26f27089a6ccb552693c6e65690" }, + { 3349000, "d9f603369243adb87ada60317ed687c9a536cf9537405ef05d4cfa5f479f76a6" }, + { 3350000, "6d0c784c9ccdbf7fda41243a91498e136bbebc138c764d7e3413ae1e57f7a60c" }, + { 3351000, "41ba7e7c0aabb6940623b8f7db6f09c092439dc2f2dd113334e62cf100af7249" }, + { 3352000, "e32c166b81dcc0aee4c0e018008240c36a15d35c25d4bfb3f54c80f0a490af20" }, + { 3353000, "9de6a8aa59ba930b4aec45fb14167f1953153723ec6d6c88cc7590300e2a35ab" }, + { 3354000, "0c2a650620df29e52a5876302616c77cb76e5d5180a597ae4c5f32dee7afcc26" }, + { 3355000, "225357218d03c75cd479ad0a258ebf4f61ac9e2248accff2e7680f5bb16c4ad4" }, + { 3356000, "43061b0bbc07fb03258b5f95da3717817dd9cb3d9413547f048854eb2fd37b88" }, + { 3357000, "c2f86b47d3a957414a4a4d3728228d3e9af1b3ee34254208d8f78a916e807753" }, + { 3358000, "f23f4e998d8b8f50eb3cdaea18294062ce87087ca0903b319e6d454a35424c2a" }, + { 3359000, "d0913918f4d23f9b868d1725ca3929acdd77375022097cf437097cda2818a5bd" }, + { 3360000, "eb17c33de3835012bffac49303907da26b007985006d2251e854004bbdb6e78b" }, + { 3361000, "8a6d2bee3aa95f0da71f5a6174521ad3120c33e4854e3075ab7609a5cb6e3a90" }, + { 3362000, "63e39b9a53cb47273fa13b9a88891bbb519b3e84c9f16d0ea33b822c5676c7bf" }, + { 3363000, "8f08592128ae68bd604b63294e55e7ccc35efaf2fde79046dfc26590c1c9592b" }, + { 3364000, "ff5cdbcafbc58f48f5b7d21ec7033c986f0b8f403c089fde67a6bb155dc7a9ea" }, + { 3365000, "e9952084ee20b115942c74fc58272e72e35d3e46f15efc3d07b68eecb9070db1" }, + { 3366000, "4d901d096d97be65370cf7ddd0a3cfb2c58d542496d3d16dc7fe15b5d27da4b8" }, + { 3367000, "f4d522ed0796fb5b0e2a4fa4aaaa03b2918a0e81567b87ed4351f1e062c8b627" }, + { 3368000, "ac153bd0683e269a938aa199bb6f13fc9507d8e8adb08f136b30ea4e343f319d" }, + { 3369000, "a1598c6f969e75865d0b945bf6e9fb87ac4c7da70e16d6d9c0709d7f176ec0dc" }, + { 3370000, "55f634cea34467c5826eb11cbbc327723fa926a8d2f9446e548a227d53006883" }, + { 3371000, "934af6289199ecadb61557b501bf1dacf9aefc541b96b60736e24e3fbe9bee02" }, + { 3372000, "e667283adf0931c61a1fb2e97f10d9d276fc92e983d597748163977e9e5f3fe9" }, + { 3373000, "4f563d4c0f6d87a43a135ebf11441cdfab7857aaacf0d65be6860e20d886ae80" }, + { 3374000, "df27e02996458e2f8a5d037037711bde0f84fff336cf89f469265336bee47679" }, + { 3375000, "843b2d0c83a8baa2a39fe27c07b56f57b62a425cd5d0f1cc6c990e1aed6783fd" }, + { 3376000, "511c9ff88b8e45b298633800833b902371ff2f7485107b1b8167bd5aa8087d0a" }, + { 3377000, "70670ee6440c3287e25c1878cb1895454093708b9bcf9f933297e15e2f299933" }, + { 3378000, "fc349130b87ee6f5ecc3a1dfe333791baadb6d9f84a1fc0183551b49072dd921" }, + { 3379000, "560d6de1ef48dd1920f61d380f8709de460785d13365215a6eba388b22ede786" }, + { 3380000, "1bbdf4589afac6e47b84fefcbdeb3752390cb4a75ddd6af9ed5a8fd69422360c" }, + { 3381000, "1f46250e44290cdbc492f105c92a80861f64154bb9e9648912a643ed352e7517" }, + { 3382000, "b4715178891ec8419552d5b4e04399dda36d6ba212a8f74b93f17fa7b7c7ac09" }, + { 3383000, "b5e74af6e185f3b1a5f21f0c4b9dda7a29a79e242ccdd01fa95dfcb176b2a567" }, + { 3384000, "064a0ac1c568dc75b23a3ac952d2b1296de8c68d3d512cfb94273235dbc7fc2a" }, + { 3385000, "27cdd378700e3e4b838a6ce7a4a95e9cdc5e07ddea16c100070a176446f96c00" }, + { 3386000, "8e64efb70984904b0eb33de0188fe273c1c2eda2a88a6636cb7bc19a9792b405" }, + { 3387000, "683f26ce79fef62868dc7ff6766cfa8b37b1a42b0b35613f06f631fa0d7403d7" }, + { 3388000, "2f41ecdadca0d41688720969bc19bc034525370067cfee31371bdedb540b52c9" }, + { 3389000, "6a10fc0cddf5a00bd189ac585192e1a03da8db2cc8fb01d5b00735fd77b80e15" }, + { 3390000, "8944cadc5ea1165ad123cf5b2872d2055dee23da7d349dc8cfcbaea2339c1cfc" }, + { 3391000, "e634975906efafb46af35daa966c5f44818dd660757851faa67750fd1d8613e4" }, + { 3392000, "1d6a6a7ae535e57595384f0d52ba4677c58030535035040b87c5a6e4566a86d3" }, + { 3393000, "848adcef55755e0ff6fac1d39c07c34488e43e1b488733a1f36912dfc42f83b6" }, + { 3394000, "ae6dc1b18bdcdf384ce3820f257f1b7542ef3b6441724e5b53788e2d24ffbee4" }, + { 3395000, "92c26779776b5727d31fb93f98a5aa1c220d8bebfa693692718b23376108d6e5" }, + { 3396000, "c34119f06623b53a2fa21ec35cc80216f8344a4731abef3ead595cb7662c54aa" }, + { 3397000, "74b1de17fbfcb29957c37940d53e6e8dee8fe7c0d40b0945fcc8a07cb6eb9741" }, + { 3398000, "0a91212618e848a040c3512d6444194cbca721354d3109726f298c2904034ec6" }, + { 3399000, "5789f98891033338efa414f64e5607da9e24eca0c52318374da78c7f02f048da" }, + { 3400000, "f6b9450ccd29883f620c89fc94e8db30287dd2f08635e2e2de134c4a3f5ecd3b" }, + { 3401000, "40b6a8d67ca0f4973b541f5675518b80c721b7af9d8b020654937e859967d293" }, + { 3402000, "7b30f7bb48523eee5be5a6909b01deddae7e60d4b55830001f9b0b589b85f7a7" }, + { 3403000, "cffb94ce726daf4330a5dc52e374a106420d032c8e5df517925458d8b760e9e9" }, + { 3404000, "5a0f7b9c3aa2f304d97984eddeaf8d62772fc5ace7585c69a5a85fc33143eed9" }, + { 3405000, "e2900ebe0c59e995d4826a329b88eadbd4af8de3c795c222bf37ba27a5296f82" }, + { 3406000, "c001873f5d7d7deb7b51cec2782b4b43485418c7dbe6bc1d23c4c459e904f3f8" }, + { 3407000, "14d6263c602674d670b851d4e2a98ca0d1896385c32c64db417e3fcc8a0b7998" }, + { 3408000, "c7efdcb636757b6ea34378eb2dd05f18b88a122437653035710e9c5037c53249" }, + { 3409000, "4bb192aad79e3f4f8a6ed0ba8e01e385f149998dd7a1b872c72dd77a7016f812" }, + { 3410000, "c362aa842839b8809e1c5c9b3104d4fd4a0b0ed36910c2dace3f38eff3289699" }, + { 3411000, "f0c4305b6303e8fb011d554e7e125c67c33557e263892d20c6c4bbca3e15579b" }, + { 3412000, "05bf3206d2c6ede91fd87052a373093e1eae6859b4e43a88593202fbfe56e60b" }, + { 3413000, "f911b876f987a3235c534bbe4253a839bd2fba7633bad1b3e052acb55efb7ecc" }, + { 3414000, "ca5b13c552e3dac78187c1d5551726cea65f8a20fefb889e9786fb8bd47dc889" }, + { 3415000, "de0d382c98cbe4d43a16d8e63795d047fae71305b65865bf824cfbf90c9cd944" }, + { 3416000, "27a83ae4220d6cc9ca3a1e2c630f1bc5bbd44e93247022b2e991ea5e35575e10" }, + { 3417000, "43ad2060038b992d083de26451d6b6f88fe50298b6c227882681baa49eec6ed5" }, + { 3418000, "c29a16bfc1eca9dbdeeb18ed4b5ef5ef9504d65a7fd3fd72202f553f7b431215" }, + { 3419000, "8f358dd9f1ea6935501dbcb1110322990994bf12209650f223a55f21178adae2" }, + { 3420000, "f4cd2126061a3dc717bb568cfca6592aba45dad23b3228afaf500dc8adc4fda5" }, + { 3421000, "f842392764bedea119e4c18e1022d1bf813569d649266fe55ad8f1650e87c09f" }, + { 3422000, "1bb4a8799ae96b367a8ddd6f1541e8f8b43bc924dd5415b67f54d311837e85db" }, + { 3423000, "61a78f15c016f0eaa7ce116738bb4ce44c184fde499f3d488e7a3e5188899fa1" }, + { 3424000, "d0cc206cf6e828df9d24d4f945a97a640485235e6c85a25f4457f17bc3423599" }, + { 3425000, "a195125404045a9a4ec39f3cd2501278d76ed1b087c8d3789a931c6176808d62" }, + { 3426000, "fc2458d8e96c711529f2a3d3362e162d81ec14ffdf3a9ca6bf9cccf8fb503bb1" }, + { 3427000, "36a3ebff03e1e668612968124a2635ede82004da930a9de29949e25ee0672fe0" }, + { 3428000, "ef6fb0a52c40e630e6ff7c6ecd6872dfa85a5f4a47f7eaa633c4c07a0e0f0a28" }, + { 3429000, "e94cc4196f7123220eb5a6237113ea71eda099368e13acd3de352c04fe347ce3" }, + { 3430000, "31ead53834b4cd8d183ad9e603446ec96cfb7be58a38825ea7b5e657537687d9" }, + { 3431000, "081cecdb3b17a6f7e468c6f50828d10143950d2742ddac2b2e0de5fae8f48ed5" }, + { 3432000, "c7d21e51d7b5c28f9fc870b95aa0480ed1fd0a6242e23f68d11651f49a45758c" }, + { 3433000, "bbf6d479bf02e7d26898e5ac5d29f4d72bbb316eb386034ec8dc00f7c54375fc" }, + { 3434000, "a71371c33822eb0986706bffa17f2df59d8906ef38643e86eb01ce6c7290f1ad" }, + { 3435000, "fd26934ca2477e6168da39160dd66dfa53d17720e9842691a1ecce57c94c1226" }, + { 3436000, "3288dba8415f11659cd798edf79305e84d0e3fa4768147f015dd470b0419d52b" }, + { 3437000, "f35b8455afc7613a8c67c3d8e07a460c275428dda1f724068ae82b6f23f9cb6a" }, + { 3438000, "54b2ca658dab4fa92fdf8d1d1e45ac55f7a4386d422e3e73cf51fde670a6e285" }, + { 3439000, "b685fc5e9dfc21db08fa1d5813ab5e03991a4e6290a830f69687ed03c833e5ba" }, + { 3440000, "370dfb627719a30f89529ab81efde4e6f67959b51b2563d138e70dada43ffbce" }, + { 3441000, "beed32e8125df7315acd8ab5a0d10367bb759f8a61026b111d65e1e90f0559f1" }, + { 3442000, "405e2d40cc9f7517d015ae28adb386b5f2698b6de305db9bddca80d50567f8de" }, + { 3443000, "480d37b603923e70fe6169586a2582a6c002c1d14cf05a4363d540755a7fad23" }, + { 3444000, "080d4ccc7c9ee071a3eb0820bf3292a624484a083f24f1115f3dfda53ca61de6" }, + { 3445000, "bada5c4c0d9be8fc45dfe24bf0e49727660dafcbbab16e3dda0bdc831f784d8e" }, + { 3446000, "46088e6a64fd1bf4f8e23d0824c8a83ec0816fa0692633248784044dd9131bc6" }, + { 3447000, "d4acc97c2b8d5e86f859b4724026b8aa3bf3232d232246ef4aa629d5b6dfe94e" }, + { 3448000, "37edcfcac5c2ed8c381332e6aa8b2dd01223661675fa2e3d3164a6222cb8e8d0" }, + { 3449000, "5139788ef2b85de88b64faa9bf886e1d834e58f2b2d42e433c8416b04d989081" }, + { 3450000, "e24b789541a4c5cefb05d7f335fe0937cfc8c197fc432e86247baa209ff2411d" }, + { 3451000, "096fa973d7d89cbe8c652fe3586a1346a0b5d919e8f06cf83af4229f0d08c953" }, + { 3452000, "46a91ecb27820a81675670f227dd9cd5d7b0a8de5d226978758aca7cbfab4787" }, + { 3453000, "a010e6920d9f935daafcbd2932b4b5d52b1e343780e8dbb43a4fe607f54c6425" }, + { 3454000, "87dd588323c6858bc88b659ab404e48a4f64bf5c679413f06655ae104f326be5" }, + { 3455000, "55374deead1294bd4b46507b4b679dbfc5cab49b4fd048aca9deaeb70f57b6a2" }, + { 3456000, "30557fc008fbb528f66b8ffe83a2383b68dd91d75668b53a68a1a1c60d10cf97" }, + { 3457000, "73a42b3bc6ba5ddec4e05742fa9ff9422c53e9811a51c1ab88d5099ffd307380" }, + { 3458000, "68f832027a5989f60ec651437d030fff0dbe2669033dcb7fe30c659bd6400039" }, + { 3459000, "d55f1af24932e663838edcce6087ae6c48016cf3f06133eff0dc95ca441f9328" }, + { 3460000, "53a764fa463df0cca261e29e5448a5211ac211d5ef758484902bd51966aac594" }, + { 3461000, "42fd3e3eb01cd4c2cdaff473b615f0121c4a2bf960382bff1f0a356ecf784bf0" }, + { 3462000, "b9484bf74630f1c01db2ad39daeae32a0f34e8c5828446f0c9f9148b97cbab50" }, + { 3463000, "79235796a44cee2896127b46d4d7489354e493fa87a1f2d67700f09752865769" }, + { 3464000, "9147e8a21f6989dbd37212b595b55dd0c4ab7f19b6c14fecaa0e42637c41bb06" }, + { 3465000, "6f543509c549504b825cf7383009735adc4ae2037bef62fae22f3513e65afc9a" }, + { 3466000, "86ddf3ceb78d5e04584e6a1f3cbe01781855d56a163d590e0812db252fb4adca" }, + { 3467000, "7743ddff10c37cb8af842bd7692f1207aa1b9eab521b7e5ee75897036a266caa" }, + { 3468000, "bb907ed72662cee8addb91a85edb0193ca149f47838df902cda349e6b304a18d" }, + { 3469000, "d17c1ee9fd958a5a4215450369a0009d4873f34bf2bd8fe08bf204918e3d8669" }, + { 3470000, "f3fb0aa62391e2bef31fe81d970f9a698f71dfe81fd4ec5f7ef7685810df3864" }, + { 3471000, "cd45cc532e23a9d48af51b3e67253d488b416640c57b00dceea6542f4129624b" }, + { 3472000, "ed2b23784ed0443e9846eccf7699d8c58907dcbf2226cd614a354a8425f523f8" }, + { 3473000, "f44abf60fab852d84998ddbefb5310017fe82e39c2e4aadab9a2cc6d60ffc5bb" }, + { 3474000, "2845687ac600572ff9c2d3825d83c9cfd27385e91e36b05deec9ccb67a647a2e" }, + { 3475000, "c18c6f262f627924748470346ecbdf17d3746976f24aa16260aa51cc6642a0fc" }, + { 3476000, "f8c9a9e25b0682d723db0bb2a78df400e4a49e41fc62911ff7e2dcee87001dde" }, + { 3477000, "a934c00cf5ccfb524e74ce662825e8f060926c814f74687cc35c4fcdab785493" }, + { 3478000, "fd6fad2f251b75e7e2b2a39e7ccc58571f51a591deaa74c42b86151128436713" }, + { 3479000, "340d8a9e704c516ea68ead08a56a6a6952e838323477db5f53e7a7086e55bf4d" }, + { 3480000, "5e92cfaf15622b7271e0659a3996f9092b326a6b35fbc64becd99d6469b902f2" }, + { 3481000, "5d9ebbf16fb3114dca2b58833208b4dce64d480aff6e21678e21e3295280e899" }, + { 3482000, "6225495552f14b30d0c994fe26f0a9258d6d5a52b9d0464d886233a370f628f0" }, + { 3483000, "77cf7ec4b1cde3fd35255b79f055518b18c76b0c58e04f6d3279233cf8fc7b2b" }, + { 3484000, "3d296703231c27d4bf89d129433e397132286b39c450e8a63474c27a3cd53355" }, + { 3485000, "572c9ae0cba2b4bf5f271ffde4b5837e2d488f98ab94c001582b10c143c1e189" }, + { 3486000, "c1584b2d253e4e5e907a000156fd7f50bcdfccc2b3e54ff0b71b7b42841b1f9c" }, + { 3487000, "46cac4a94b94e5c0dfcc71486a227b1d8117f58dcd7da1b7e3c509f77a706d80" }, + { 3488000, "f3801d62002eca31432ceaf4402e8999868797f33287e4d5d9775f87ad55a211" }, + { 3489000, "c04083f770db58059df638813182731e3185f2afcc36561eca462d9ab3ebaba6" }, + { 3490000, "28911d688d33fb702ab11c8c8c236efdf8b96049ffec2703b29ad8807a8dcae5" }, + { 3491000, "71196cd6ece13b9c85d4f00944fd40c6fac7c97297fdcb3ef6ae9772b7a78d2d" }, + { 3492000, "57e7a4b477c506fdf00fab3be5193a615cb5a3667c1b1b0ca4399da652d25cb5" }, + { 3493000, "b44095804c15cde09e6f4cc80198028dbe1cf82b8b343fcc4cd9af4433d4a528" }, + { 3494000, "51be41cf515cd83bc16510a923d120cd7887501d388c030810ae1aab0b8f885f" }, + { 3495000, "49dbd46e58a92681f6cd99c06c7039acd8e5b068b5e77cb5ba54303c314f381f" }, + { 3496000, "21315b87612952dcb25ba2cd5154989396db50c92cc434bd181e7a8c46c6e74a" }, + { 3497000, "46e6e2637ba4b65cbb4aa8bfdac53a2fc54e95937e81b7974c46bf891d4f569e" }, + { 3498000, "fe0f7b8f4fab97027e5c3d65eba534b4c76af68f181de22d478571664d24ffcc" }, + { 3499000, "57518b62c30490041a1f498476eaebda9182b1c31b312f595f5b2167ada77894" }, + { 3500000, "01eb0a9113f0ba23492907ea6208b1de001ffcdeff90324da0f36ede5b8c62fc" }, + { 3501000, "298f1b1556f91c60d6262b2c8f7fac8655492607c47e616f4e067df18820af1c" }, + { 3502000, "2d5a0891ed817b3c0d8746e866c1fe8aca5fdd5ba667fb7a914160436223c32e" }, + { 3503000, "55fc90ebd864ae5635787c2277fbad9b1a317aec17c86b0c07ec936181705c38" }, + { 3504000, "47619dc8d32f6d93bb4dbd3127aa60e1a0d552dca4288be73f6d571f8559823c" }, + { 3505000, "64190ca344bcf0cd2dc60ccbd738b02d052091277bb88012e384619cf252b80e" }, + { 3506000, "a75d4b511fa5769ea609400182c86dd04bec61a9de11ccba741232ad23f11514" }, + { 3507000, "97cd579f18940d2c2f47f4f546680839ecdfc20e0c19d843d7c46c6b963588ce" }, + { 3508000, "61af1f665cf9f033a0436dd9130cc3f0c00e626d417f96f531ad0c2f490dcee0" }, + { 3509000, "007e1a30296489b336b2ed52471d662e39b013026dd22a1ccbce546194ce9fe4" }, + { 3510000, "107b7330db0ac510b75b943fb9b83f572792b58f6888d1702a98cb8a9fc86ece" }, + { 3511000, "091431e328b152232da2e3d35b0b90076849b3d985fc1c23665e90326e3f58d7" }, + { 3512000, "fc781a3c6a7b3059ec75c252c3b2f7a5b708262f38bc784c082ab0aefc2cf034" }, + { 3513000, "6baca750d51a3c68ac386ee48f4e09f01571631b646e5d9eadc8e8d6427ae660" }, + { 3514000, "a61423036f7026e739a5e56d613a4dcb593047d3a146e309cea0bff92cd90bf4" }, + { 3515000, "b1de3b3375f17cf6141b3c3d0c87338cd871c5005d28745944b46635b717371f" }, + { 3516000, "46c3f6dc527557987af85070525dc4030b2f8cfd7173063005655476c12ca1c1" }, + { 3517000, "0242bc50914648d4bb9322dd7a14e693ecc05d6750e87ae4dae6140d79b01d03" }, + { 3518000, "dfc8e7380435e90b25e2530e210e5d74299427adf75d9a2ae4f1b674f24f4c77" }, + { 3519000, "0060ac7214cf496a5e8328ac6ae88b27b4ef314a59d90cd5aebf5f94c51f0242" }, + { 3520000, "b7b6efa2164192f820096bab90591b5cd3ca4567f0f8e49f70b5a6b42dcd7003" }, + { 3521000, "461ca788ad451c45d46ac63a543a250295ababe541ce27733a71a6089176a51c" }, + { 3522000, "925b76dce16679b604b762b11a3cf5514a12f2624a7b0af15349e678a209becb" }, + { 3523000, "d6837fbfed7e00b9c44529aa0b6e76f6b4114a9a0262a437d91775ebe46e69d5" }, + { 3524000, "e5d8ec1da25dfd44cbd6ee0ca473e21b505b1fa15416a5cf3d090f8e1f2de606" }, + { 3525000, "9271e8ba70729fbebba161ee954caf5a37b41f696ee027dd37e51ee3bce711fd" }, + { 3526000, "79ebcf432b4c7a20944b01072225cab5267be3d702ccfa7a488f7f0f433fe388" }, + { 3527000, "da009ce7b6ae607cf6d28ac7275aeda134e14e628c63beb3f2f5b434b2ac67d4" }, + { 3528000, "df31a1fe181fe75a29bba88d5d35f8b6f1c1cd54b1492801f54a27a537fb4ae5" }, + { 3529000, "d725148e913fe99c86dbeb331088a7a17d130e264dd76ff9047fc9d115432be8" }, + { 3530000, "b16e9b802a73f1dee7f0c7f3d2fb44d3a81b9ce4dfbb5361191d528a271cac14" }, + { 3531000, "4f1a6e4bfdefc2d8d1127cbd5bf8586d866ce3d5c9b14f8fdee842977c7c68e8" }, + { 3532000, "c818afd795d9db600db36a1948dd49d282397fb0d0b89a1a27d78c211aed3e9b" }, + { 3533000, "e14d8c7629bdfbc0399da427b67f35ae22ae9bec44c0f5374432f5541633bcbe" }, + { 3534000, "866536c5c1cf9660431ce8e8c8992cdad7677b1bcdf86b52924d03e570791730" }, + { 3535000, "36e695571c15facc8a48b5d248ce291315803a56cea9f0903b6b015e7b95ffd5" }, + { 3536000, "88949e8807ab9c3f8ae400e08245fc2dd31ec19aeafd79d4dc2bd3ed3ce25b98" }, + { 3537000, "5bc630e0f5de97efa0d6a91182061ccd9a5e07f294eb6a9b73823273e452e96d" }, + { 3538000, "a0eba0058b34b564bd90c34fc97d86473d07f863b57dd208ab80e0d3215abe12" }, + { 3539000, "113f9cfd709eb1a106caba4e6a76001fae1aca73057df6bb18a76b60ee00ed94" }, + { 3540000, "66d6b7bf6a2ed9b6db1d50295027c61092463e608333ab093072d70f8ef82ed3" }, + { 3541000, "f3c16e27fba51f3c193cb88a0ce027a45ae0ef6ae86b89edcc3a7bd24d7b434c" }, + { 3542000, "35e5b9a7c5c833a7895f8ccdf022eaa7ac6811d765ec40c453feea6398298979" }, + { 3543000, "677c36798d8b5d268e3300f14563d7602cb6fb0c7b1401ab654e05495c760ebf" }, + { 3544000, "ad13ef5ec55528667364328dce7d4f1eab15bafd94a26dbcd5b5e836e44b5221" }, + { 3545000, "5b9debde5623b0796ea315009a27902995cccc3829e7c3ed2e9cd8b304453e99" }, + { 3546000, "37affac6d6261177c3527219b34ac78a4ae3ae60fa73a70d7cf89483791ffb50" }, + { 3547000, "110ac87253e5fcc6b3c995c62bb4cdc4f8d2f63a16ecf28893fcda8e31c00cbf" }, + { 3548000, "ff54a4d20537089c880ba60822d3b9c5249820fd9c64ca2f1cf8cbe03ab9b9b3" }, + { 3549000, "e84e8ab749cf3f2d7804bb923d571a2fa7aeaa7483ad82850a49b2100e3eb2db" }, + { 3550000, "ddb98a20273945d59f7f7733fb3ba13ed68895964c34f178e711c6661d679719" }, + { 3551000, "b0bbc4bd20868987b67bf08023e1d378bb1e5700c3d1796467efd8899c02240f" }, + { 3552000, "0af0323ccf5be88d971e4ac4938a7e800d62225d5c8d4cfaf6c6db36b556ad1a" }, + { 3553000, "cb4e6412e180b9559cbb5ba2a3712a6f16494ddc0ada05ca6cef3e76684df366" }, + { 3554000, "64d1b1b2038d21a6760196d3262e5e446b72f19bff8e4c0c2b19d36e5ce04d0e" }, + { 3555000, "1e9a1ab6f4d6e67d61bb8634507abf7eb71e94c148b0d715061600eed1f69647" }, + { 3556000, "d1fecc61d1295700e2025cf968fdc0a334373a66269539974c9cf7c9c2fd74c1" }, + { 3557000, "4dfca671a85f545f1bd7459632f9e9e70498be5822fcb0aaaeddd251fda51630" }, + { 3558000, "6afea559ecc35bcd35d9035d8c88a2536030c262a7c75806922eab351521d0f9" }, + { 3559000, "8408973c654ab13c542596699b95a19d8aed7142a386a5fff1f2831308b0ee1b" }, + { 3560000, "835c8cb790612958e182028ef6a316dec83b62c234a37012322645860c405a76" }, + { 3561000, "89420fc80e51b419da3ab4f884aa577a731ac64a1c6c6b85bdaa10d18a19284b" }, + { 3562000, "7b6652e85ee6a04d34617337c9c17efbb668f40ac4b1c1da8eba5c6f38702e8b" }, + { 3563000, "95402851c93faccbcb15559b7c0dec975ef2783276c373b40f339c141b454157" }, + { 3564000, "e5c683e65fdc49a2efab264969eb4f448d4ed587b865fba4b5b56ad49c42bc4a" }, + { 3565000, "b9bae250fdd1f5faf6e71171033188be3822a27613971eb13a7156e05fd4568b" }, + { 3566000, "4f68f9ade51dd351f974d820b32e4e363599a1753908359c60ff7fdf54022d55" }, + { 3567000, "d842f549ba1b667eb15dff95f812a3b00ca4ee8623ed0171e6f4cf6b8d1bc87b" }, + { 3568000, "59fd28240700e1c712c9dc96fdc7fc9991c1cb408dd5e6d09ecf164c086bde3e" }, + { 3569000, "416be3de65f52a739178ed6afaed8ea6e8c1789260954b1c42771bc9bdea5951" }, + { 3570000, "d66a1702f88920d0123741dbde8667b947491237dd5b042eae5d4c5c92cf1e5f" }, + { 3571000, "f21ddb26c27538e414e936894279f4b6efca4e0ca25a465652dab95775056516" }, + { 3572000, "bfabf834f64a37fb3d641599fd75bd696e4a896a17a9102988c9bc94e0529665" }, + { 3573000, "ca6d0ced9f8785bbdf51762fc53bc89197c8774905a3206f26bdc226e8446ba7" }, + { 3574000, "0f993ac436e59e5920924bb3436b8087a50f73e15d9e83382341900131c86c3d" }, + { 3575000, "d78f9d9ce52ac3483d861bd07caf2536120151d3eaffbf3ce93d3bf75d5bd521" }, + { 3576000, "b3921ed3ca9defb0690e9335e93bfea3f43e770dc411ee79e5caa1b7219f6272" }, + { 3577000, "152d6c998e272644813c55bd32c2901e006ac972fc06f7dac877db0a18262082" }, + { 3578000, "a918678fb9cf8a403ba97724dd7d206d478f3fe9510fedda004870b3c0697d95" }, + { 3579000, "37d006a737a96f7332b0c2ab4a2280a0093bb926894282b3f20e345e3e32afe5" }, + { 3580000, "151b6ea0ea71140ed37424d44da70874e13f73cfefee3d46b0702320cdc48f3f" }, + { 3581000, "e1f4c26e22188a5eabed3bab3e26fdda35b59f29403be41b8a87b70a8850a1e5" }, + { 3582000, "15603a12cc688ee494b3b7fb02459883abb9040b7a967a8688180bf17a836957" }, + { 3583000, "9e5d8d19e20bdef764fbe96b1695a8929eadd72248e566dfa29789bd33e9180b" }, + { 3584000, "7e72108b1c031cc6128afb55feb929e2752010ab45cdc7f6347eef0c6bed0884" }, + { 3585000, "71cfa48d5d45eb22359a8e5666dc4db3b5d401024af296724e9f8dfbff1ae7bf" }, + { 3586000, "26b2d349f9618b465c1c7e1d8e8f0671b730356935f07ff043a130affb0ba658" }, + { 3587000, "d233281b314ab21258d0ce799d698cdc6dade58a1e23a900e77b75976782a9e3" }, + { 3588000, "b4539bfb217c36a439742bcb198df82d15f552792f207dff12f7ee40ac180244" }, + { 3589000, "68b12ec7a98940e00c7d9e879cbd4af38e6dafc62e7067067be52473735d1cb3" }, + { 3590000, "f56b470354deb935ff1f77d7ae0e4fa9f6534a959ae59766fec40f0e278e9cde" }, + { 3591000, "a049c7322cc2d74c198651d5990e85bd7019cd0d0500d635caec785b1d608514" }, + { 3592000, "6518cf788145aea503f3e8897fe11f071faca43342097a41eef9640f98d36c0d" }, + { 3593000, "1a896da1bf0388c0c1db3b4090273eedba9d1f206f61480f8c4adc5ecee20ae8" }, + { 3594000, "447aa2e11e79f70b11c146879985e19c09c7f5a9ca0bc9292efcf247b7b56110" }, + { 3595000, "09a2f36324803e42226f3153439a3433834b31cea5f209daa2027c37f1541208" }, + { 3596000, "70dd1b846b2086bdc4b343cb78cc5be3f011484778c4186a27d550cff8778857" }, + { 3597000, "7ce86d935a4b8ab7736a628e2126a5587dbf65064d1da3d607cce30d1a240d7f" }, + { 3598000, "ca80ae5aef3ed429f65be82f38e1bfb1ac896aaf52b01d24bd23b9bdc3053b65" }, + { 3599000, "8d1bec09362066427a260052d39056582abb2f36f8aa6ae4a615283277815594" }, + { 3600000, "0ba9f2870be7afa53f9fbff27733c0aaf7c5e132f92cc562706c954c4f4878f8" }, + { 3601000, "1b1d2cd05a6936316f97c0aee781da0644057d7d61e963f1ac1f22377b2fd95f" }, + { 3602000, "3903914a8f3e6a66e4b746cb0a5866be5f83ba1071a709d59449fc94e1a1a69f" }, + { 3603000, "13250c1a4071102da18a419439b0315bb45d59a4c7b5842b1b339e65f46c8f19" }, + { 3604000, "b8015e9cbda8e50827c9f74f143eb7f149f3dc3cdbc5175fad63794b5ed63120" }, + { 3605000, "f451d451e122501da30eb96e8e7bb13e7aa10213f35d9b81d0b1295bf66fdb37" }, + { 3606000, "66099861fa5d21cf4448f504c4f086cda6e87d32048e226751f8d4dd85881cd8" }, + { 3607000, "3db0716743b87654f323213cb5cd9120ed5929fc4efc5bd4bfec75954c7a6ecb" }, + { 3608000, "05270a4f9320b9bbd74cf0c2843e7a16da595673b419c6c1ae18cfe061b16434" }, + { 3609000, "1ede8e43932d12198ac313029b0a669b04d6d2c85d6ff75e63f8f61573591b30" }, + { 3610000, "8704796a6f5864f3f4e28f9c7483cd044f0d3b885975f5617a539079bdc4f4c1" }, + { 3611000, "b33a9d7bb0ecb79b7446bcff8bc834f324711e1b59e249597b3dcc54b2a0b225" }, + { 3612000, "6d3b1681922e7a6f9def0dc586654c4a59ab9226a840285acfea20319562eb96" }, + { 3613000, "6dbcd0b4edbfd574df591d7c042cb7de3b8cf712297458dfd9c1b1723a53c92f" }, + { 3614000, "7906afef2dd4decf780c48fe59ee851d36986be7abb2bcdd933a7ef8582b09c3" }, + { 3615000, "17f97d88f19538a4df471aae81d7877a2a9e2fa1e0d7214354fa6b83022efda5" }, + { 3616000, "3af9d67738da9312153b1845da1e81502a6cd633331d0d14311d71442c3dea43" }, + { 3617000, "da2c313ee652b32a97374b93a1d7f75d99046eeb5d5569e789e4ee1e3c862464" }, + { 3618000, "613062f6ee85027febf7634fbf622ac2430e2694ca24319ddf62da04a9873eea" }, + { 3619000, "eb0106dfe9dff4adfc6e2328ee4c712733402d32c5a09d0531679567dd3e357a" }, + { 3620000, "c063f086f2236378d78486d2c59b82e35d33ab1c3113fdc45cf9a9fd8b5843db" }, + { 3621000, "4d273029bb9ab50c3102586df8dd8bc9dcd07e2c9ac258560cd2dd1aa41d0b28" }, + { 3622000, "11260ba86ada78f85492953d6938fe81b17490fafcfed3dee24f7ec405ee0490" }, + { 3623000, "9b07f25135371a693278ba98399e6864a05a35ead4124aca40e9182f74cc69b6" }, + { 3624000, "c9803116f1f559cf8bf0905f3643e648dd1eed4b9f7b663f4ed49429b87abab9" }, + { 3625000, "13c99efe599dc994380ebbec52238af9f488a1d3c47ce57041583fe4ab2e186b" }, + { 3626000, "e8ed76b7391763fd9b03591c90b4cf53561a201b8944750ae4ecedf886438a22" }, + { 3627000, "f9dfe4ae71bee9972c440fb8e0edea29c447fab7d705e878cac6b1d89d7576c6" }, + { 3628000, "3532813ccf51d989eb1ae1c59593ca3cd684ed40550cbba506e8f7f9f0012275" }, + { 3629000, "4cd03d3653e66c5ad75a6d21a3443a8b5d0f0a262131d309efd6bb5b05a90897" }, + { 3630000, "b00438373ad40b0d5c7400de9e48104f220e302a6266e55430f33d3d03b4758b" }, + { 3631000, "7f0422778e6f6e5b799860704c4283905f188bbb234fbd101345a51e636a0e45" }, + { 3632000, "637e1fbc840d18e9c732fbec72f0b5f2058b52263345b140dffed0fdd242958d" }, + { 3633000, "de98281240c9ab26edc0b5ccba4e5786bfcfed52d5cbc1253790d5169ee17513" }, + { 3634000, "3bca20cfe01e1a947477a058b72bd11c59ebca2ed61cf4b7ab854fc0b48eae9c" }, + { 3635000, "4e853b6fc32192e0ee8fc7c7d9bca909fed4055e7a6184e40eed88851140499b" }, + { 3636000, "d2ee5429bf8c69719f598ea7e54ed775900ecd8d4ba93d7e7ea21d16ca91c371" }, + { 3637000, "d415a41822678748616f6dbef592329b648f61ef38a085c86853213f1973f2eb" }, + { 3638000, "67d5c68f8acda0b80093ebfaae9fb69cd076a664583555cc03a2b9f9505d2c00" }, + { 3639000, "5d7a0f64b46ed48a42aecc04fa8f4ac38092ce214091e196237e6cf81a0e6f1d" }, + { 3640000, "19a1d6bd2c4162a1764a4f9e7030c917ba10371a35a81af50e1fceabdf690523" }, + { 3641000, "5c602244dbfbe7c3f696043e563e0a9af18ec8f38fac5fc0fa2a29f3bdff59b8" }, + { 3642000, "2a53d03b6b553c20159820e7361df960cb51263e6f57dffdd1ce13ad0e2fbfac" }, + { 3643000, "1e4761a99a7f75337ecc38a84a5cbeff0f217b52bff525670584ebb2710443c3" }, + { 3644000, "a50b240039327ecf302c81d052baa648f29a6939450fbbe514c58e8509d39644" }, + { 3645000, "5166921272e30bb86958d0b11f1b38f41893a47b62e453c87aca91c41b18db0d" }, + { 3646000, "144385f9926ab0c841ec7cd8e22f3d4178bae2207c8dd02b60f72c9451909ae8" }, + { 3647000, "850d2cae5c9f4006bc2b97f28aef6aec489a5b80955fc243139ca4b84e9e1258" }, + { 3648000, "fd0ba5ad845765412b7f9fa317dfc20ac8ca9dff368f05970bcf74b7e6aa1488" }, + { 3649000, "709d1909686b1c799828ceb501ed3c4cf266b56ab05ba31b574aaf6634f52457" }, + { 3650000, "1021d0daf243011210e068bd4276dbcaf7ba4b9f67ca5cb4587fea0573b6c0bd" }, + { 3651000, "2d87f27cecb51a40b3d90845ccc7715d623a3845181275c21615f0ae7a9b6daf" }, + { 3652000, "bc5b4dd0e9cc7d39123d0fae30b90e9389a150da49395fcaf253430ff3445f7e" }, + { 3653000, "1f1aa4275223fd58a227373226e7e6beda51f1f211b09d8586b7d837ee299651" }, + { 3654000, "5571669155dfd635857c8650e851a8f52ec92270f437427c24344ddf67ccd1ad" }, + { 3655000, "bd7e72fa5e0e99381cd7637972ff0196909dabc77565e4ded88e736ed37709c5" }, + { 3656000, "cd1adf83fd0f7737ab8df3773a35b13529d116861b2016b992350854f5a0b804" }, + { 3657000, "8c3bab448bddf83ff5dd85cb1037f7ab50e05491832cb906252f5653014ea23a" }, + { 3658000, "ab06481e6576cf380b06468768fd09131b86dc498b9a3dbcfa2d7c7c2ebfadf7" }, + { 3659000, "5f98e5fe511b2151df7f7019ff5d4f9f62587d403a35b2058e338df60d18d97e" }, + { 3660000, "b51d3ed93c76729ff959f98934e7a998ed213d90cb231b3d558d931b76a21202" }, + { 3661000, "599ae1bc192c73c893c30e10bc195ad4624d036b6c693170c0fa2aad6c9751d6" }, + { 3662000, "136c14f9674cefd71d001909c7c08341f75d75e9471eb559f69242f23433e514" }, + { 3663000, "3a0363dd46fa71621938f91b90bcc44982c0a294104c56bbb80ef186dce137ef" }, + { 3664000, "fdc974c25c028ee6e7ff287342cde4aa8ad46eb2f6b9a5d1d4ba2f993ac29b9f" }, + { 3665000, "93a681f06604d84288e96f7106288b57dce1d5a396af1008c7a67717de446d54" }, + { 3666000, "20f307a3897e2087160d75c6c698e14ae530528d7021342dda3c40340b3ba040" }, + { 3667000, "59d397fba8e21101d765ff4cb56e51ec89aa5bbdeb18fe287d472493a0912461" }, + { 3668000, "34f59b9b55895ec3317b2e514c61871b50e71265783c95582bc385d390d3d6bb" }, + { 3669000, "a3b12b906b02921ce35f52c6620a92d8f72517b4625004b595aebf3cd431134b" }, + { 3670000, "ede9fd24b20bcd8574f14a2dd6a95045fe469b94d5b7fe956212c5b89dc3685a" }, + { 3671000, "1173a13342395c9657ab883820c46ccddffa87ff4bf43c5a52cee1e5b00a4bd9" }, + { 3672000, "6aeadfaa053257da6491801c7321371313f18abb1e92a62610d9c25e359cfe3b" }, + { 3673000, "16384cd4b1b28de48cb222e2bed4e5802fb4f8052a69b4ec05b7b1076a123a8e" }, + { 3674000, "de15633d95e35e4b0b90c4f3701cc58bd9b5f41130b1f7aa5114ab87297477d1" }, + { 3675000, "3a68ff995d1a77dbddc473e12f47e5458490ae59d68c2effe49ea22f91fbc53f" }, + { 3676000, "f70622eb016d9969edca2b785186d994b350189a051808f82bc9b93446df0bbb" }, + { 3677000, "a9613d248d54e9c044df4bf594d7c66490c957409919f43e16841bb7135785d5" }, + { 3678000, "15c1cc9f019d0d58b170af3fce3447e22d6efb9ddc8d5cd5dbc09fcdf9746415" }, + { 3679000, "72b2223410d515dc7f5a8e3063dd2a318330de31302125c99aa31fc79240c25c" }, + { 3680000, "cc5bbac344aab6fcbea9b4e1a237c5d5e7c33ea15ff3916241fe240155e9e9fb" }, + { 3681000, "89bf989598eeb76fb2bf83d338378f3f3f70cf6a523379b4af42683155b8c760" }, + { 3682000, "a03950de8a1dbed9fde001abe4caa9a7ac1cbccab9a26dbf280529c6ef95096d" }, + { 3683000, "ec87069d40e39a8f646467c1a952c34f759fdd8c6ae8d53b4524165a68b25018" }, + { 3684000, "5b371d144f0f43bc4115ce2afbbaf0ffc6c77f3dc5569e16f72d78712c90bb83" }, + { 3685000, "6ba18aaa7f11a26a40bc73ed9b95e64f37ca5267f876a6f79fc33e48892c022f" }, + { 3686000, "9fee24ea0b0da80816f3d982a3a457610025cb8fab654e750f971da6f021ddf5" }, + { 3687000, "30d694cb67aa09b16eb374a9ccb95efc35aabfa0049d99e7d8e007acabd69b2c" }, + { 3688000, "b4887172ce797344261f1ae41332f0d8e21c798f4d7e3478baeafaa99bd8e1ea" }, + { 3689000, "ddcfa0e327eb45fe39108620665a5d96f5a108f8fdc93fd5492625d529108a00" }, + { 3690000, "0e1f74e93f5947a30dffb9a3e70cf947b5d2d71319380c6dd108e5e4f156806a" }, + { 3691000, "be06222d2286eff474af40dde6d77d80029726cfa5de11d0516281fb594ffaab" }, + { 3692000, "4a6b017693358f5dce514e2d755806c40716f200df97b33c726bfa990505263e" }, + { 3693000, "c1b3d110ba9d0a4b7ea8b1a14d2703755ebeb43dcca9ef0fa16fb0bfdcd50c0c" }, + { 3694000, "e8ba119a0a5b1eb82f047f051b2ecb81ae9a62dc20ae2dde0fb81fc5cad23102" }, + { 3695000, "005b60323b5367fd0a8678e82644f78cae525667ab6d7396c61ef5918907c993" }, + { 3696000, "d34e8911c95930f70251db72cedc015e2eb319f2809d0da168540ec8b49d7f75" }, + { 3697000, "0241e930968a98387c350d21307516305e1828d856ac2d04b146cc601c64e06e" }, + { 3698000, "71a998f919a9e7266dac66e56d256822e90d64683d44956237a412b844555565" }, + { 3699000, "dbfd45b4bcfe7fa63492db0928cd2195a64b0cb4ee56d1467d220c34d2e3c640" }, + { 3700000, "b5f4384d503774236352a7e1289cdfce15dc0fadd7f5d61b2408f4c886692700" }, + { 3701000, "a32abd429c1c3cd8a4e81cb40382e0e86e5f9547e716c98d169f9bfeddef716a" }, + { 3702000, "11b9ed36cac9fb6c0f66691e2becec3abf69b893ecf898a48143fcad4e8704d2" }, + { 3703000, "2205ce91fb60aae72cfea56b6936bdc520a8822faf7fd459c55fe7b51d360e7b" }, + { 3704000, "0620ff410099e44faed267459c371a0b757cbb5f8d80f59a382186a59036e2d9" }, + { 3705000, "0f1c83a67628cadcb056b6af1dac1e14adceccdd95034ac452e60f18623c8a4f" }, + { 3706000, "651c9d2c78e68d627685903af28894770d5da7252933bd3da8b9eb4e309305a6" }, + { 3707000, "a94bb1c55a4c93a1ec06da0c49fa180681ceab82e68fc573d868e27cf3bc9931" }, + { 3708000, "161c22238875817cd6fb5494652529399e18146f2b3133f65a2b4d8b6845f205" }, + { 3709000, "1b6f2a5f49f7d87e3af25ca33d148ffeec3a7aa39ee25fc1199ef0d1f7b92570" }, + { 3710000, "337eaf4763a9c4a4e400497ed1680815cb1d80ecaca84bf6cf38580a1cf16440" }, + { 3711000, "320c4f58e574c02397ca50c01850343b04bd4c47d017abf5ae0f0fd727426945" }, + { 3712000, "3905fca46a7e0daf69fb781af66ff85342c59d2e1eaa7d422bf08573ba2ab6b6" }, + { 3713000, "f9987df6cf1a2c6379b7b2d49dd517fc18565fe36aed79e7a043a2a8eee0339a" }, + { 3714000, "cdbf909bdbc46d3a2dbcc2ca277c0ea6dea8bdc28d4f1510528a15727013432e" }, + { 3715000, "0877d0a20f3eb94b9496b955a6a4d603ab91bf55f4ebdec89b9c944aa17ce293" }, + { 3716000, "8a7a39f9cc3fd5878eaccd3ddc5931a1b7fe61b6309f473c166674de40ce43f3" }, + { 3717000, "bc23c0ca1cacc53cb81af262979a6b00b44aaa96bd12899ade7757e70a051b2c" }, + { 3718000, "f88dd4b482af2e63b6ed2a2daad7f3f53e2afb36ebf362ab42096de3ffad68ce" }, + { 3719000, "fba6904976c360cf6bb468fa84f7cc469fe2c202fa0da13299b69b42f1523f05" }, + { 3720000, "285f2c436867ca48ec40c789b6dbb0697cfcd3e1a1bf85a6be83fbe39e25d926" }, + { 3721000, "c2ddd2b55116e5e49ffcab0c03b0fd4cfa851168a6c8a8c3b70149ae14b85d8d" }, + { 3722000, "3f8370e72100a5003f8a8b3291a0b6263e2fe35812fb6dbd7b21653e47606342" }, + { 3723000, "392d476594778a6f4d264c95f4992673bec99e8d5314deadc6d2bd76d3443c1f" }, + { 3724000, "0273a81fc8f61af36f50e298881e77d9f3db763ec01a8c0d40db7a45e2c61fa4" }, + { 3725000, "e7a0f0445a6abd9b0d89add2b3e064fde9373e7f048a682ed36f2baade8efe50" }, + { 3726000, "bce0419a31e86504dc81cd3c365fcf23ca11cfab9a7eab97d68285059604d500" }, + { 3727000, "70cd393bd58cecfa05612c59d2488901fe5c6f1bbc299f94fcdb3ba941ac9759" }, + { 3728000, "4b6ed158356e9b8d9afec4d45c0911d0b8663d6c8d7e52683b5a698ffb50f03f" }, + { 3729000, "c7cfaa51fcf6a3a1c3672cf5f14f52982a8bc7cc2d0b2be2711372667f4384aa" }, + { 3730000, "128b6a17e6e4acf7ca5de7d3b819329bf3f0b8baab1521acbc79a315f3e11c58" }, + { 3731000, "6a92b431878fcfd2d1124f7f5c2f78af46eabb79c7672c68ba407dd281e01306" }, + { 3732000, "f79783091cc02dfe6773ac09656c2b33875911683ab2393b6848509bf415d9da" }, + { 3733000, "934f9b8f6b1331712d4b1c5b82ba53a21f048c8437da53d37b8991f6bbae17bd" }, + { 3734000, "4f0ddce96d81cf6bedb7c4d3b68c5c5479ccec6d9c14ee4a9751342803764070" }, + { 3735000, "2aa69e273ee6ec925474936e3847f73df645500d8c0fa97a0371726062bce959" }, + { 3736000, "2af5ff1a1ca1353f827b439c15a67372c756097601d68e51183c77b8f1d4480b" }, + { 3737000, "cbc92d02ed11c3da3e1781402f5fab827232ae87452961f14fc671f6822123e6" }, + { 3738000, "b1ae1e05b6cb4aebf32e67b9bfabdaa928d68d8a3bc5aa5bc841623089e15459" }, + { 3739000, "c42af5efb98bfea4cd971cafcebf6695f4b9d23d1fdac2a8624d2191b3d32cf8" }, + { 3740000, "b7544a42ca66206c82dc2eefa469acd499c5f377bf0bfee90b25bec0be01372c" }, + { 3741000, "70499bc4bef5184c63b6de4ca80b4d64c72cdf553bb5bddc617a350ba1287201" }, + { 3742000, "d1480291bafc43cacf11648587450529cb88e34f3ea3c9efd1b7df45fcbe03b1" }, + { 3743000, "7d546529c47049f7900b4f191b6f4eba6d1b94a82a8f0003a4f001e2e5907291" }, + { 3744000, "c866f63596ebefad13748883e1113a3a8cda91b44e50ea0b6c861d33e45e50e5" }, + { 3745000, "d516cd1aba0a69f5d65c9d5bca78d55acaf4dbdc65be96b04ce602c186dc8a8a" }, + { 3746000, "e42922d47ddd451ea7b6f0311f118af31f1492b199e2a0bc4f6ca4ebb10c0153" }, + { 3747000, "2c8d69d455f0800dbdee80005049e3d7bd78b5dce5c897bfe8aab54c80a68e87" }, + { 3748000, "b7743d92c6b4c91a5fc97b8ca25fbed0aad99c0348af1d93e50ee768a2573ad8" }, + { 3749000, "38a30be3f78d755cdb9d010f0dc0e833f07c3e1edcc896a903dc42a28bef3c43" }, + { 3750000, "8272202236a188bca395dfbf32e1bd1cc0950b76c2e50aafad2ea6ac9a304fa3" }, + { 3751000, "8f02a71762d098ae43d335848688ecfa7b38d3011e86e1b635a4f44bf293013b" }, + { 3752000, "ccd819b23d295a64b1b474e99d280e9102f33b746d28cecef322a0b71549240d" }, + { 3753000, "bf62bcfa6576991f8412dd16cdb334a587bd3eb1e6da50213da996671b6ca533" }, + { 3754000, "3794393dfd137d15be79849577d9ae8dca6ec82668355af1f3a5e709fb20538d" }, + { 3755000, "d6c56ffeddc5644bc090d2ad1b572cdaa61e63c7d04c4c3b2bfb6d787176b49e" }, + { 3756000, "ff76d3cfaf9e98eb7f26a2656180bdee414a2cedbd9d114a54e62b417b1b14da" }, + { 3757000, "05296308522d3f17bc9d0cedb59ce21a2fd616e714322304449ef4b1792bf4d4" }, + { 3758000, "bbbbe2c37163162e3944c5712451d83b654ad0bb77dce55854881285ae6c6e8c" }, + { 3759000, "f4bc726288f39fd96567d30e53a1e34ef8b17e784ffe3f0a911a130f4c813ad0" }, + { 3760000, "9fb55aa12ccdfa8a5fc5d5140d489e5a4e42fd0a313dbc56c31725eb6c09ae6b" }, + { 3761000, "8d5bc39fafb6f4130ac1a7eb1877a355f48deacb073a602ae488cd9fd89e6e8b" }, + { 3762000, "301998a41b67500e456428bdbc03abc90c4b52b3b22c4bbd9e6750a59ce2f3fd" }, + { 3763000, "fffef5a5af641df8587aaae984ae014b7ff0f141eaa81f276a10830d18ed4f8c" }, + { 3764000, "5bb44562d35ab3d6e51edcd0775f3e32455b6b3693f7eab2ab09ff44e44007c2" }, + { 3765000, "d0592fba96309af51d8b41a08a4f5628bb555299134e4ce0c3f6806035afa57e" }, + { 3766000, "902c728ab7ba822744791b4ba772d38150ae1efdc5ed4265ba05cf333189ec60" }, + { 3767000, "ed46492ae519a4038066e2a888ad8b8adc48f3be6a580bde93ee6a4fac763cd5" }, + { 3768000, "d2d3c000ae5eefb2d035193a1f71d6a731b4d3dd748480ddc2683a4a297263be" }, + { 3769000, "14c1080d8519b3bf1feb896352bcedf810053e0c460b58f6a91f69fdb8e8ea8c" }, + { 3770000, "1d1dcc3f9d952b42da47735b5133ccbf37d5554dc82110af2ed5cf1c6a467b8f" }, + { 3771000, "bfeb0a5644ac5c465ec1fd07d57e3943462e92f45232e95ac4c4115df1ab3570" }, + { 3772000, "80bf574a815e835b70b9a1c41289472b7de0fa8a695791eb50ef20b8c8de2164" }, + { 3773000, "48d60856c22e6b88330e9718650303bf20754b945a4c9d808110df89aa3b2685" }, + { 3774000, "c00f6e3505c149faaebc45a1d7b2fcc4de24528d9b4013fafe781d1996bcce92" }, + { 3775000, "ea3581ec469d7962fec2362348f66a086530ec7d8076c22571fe0f6ae721ba78" }, + { 3776000, "7411ce21c9c2c8df0809c6695d847fb9913303cafc79c55cbcafb60b447d1410" }, + { 3777000, "def21292c2caa18cfb040187b324b1d8aff09140dcb76a80699f2fba024eda55" }, + { 3778000, "3a8eafff7cafc46a39b0498d5fe047436b7e70dc1d9c5a59f0610c98d1633858" }, + { 3779000, "72a8e0d4d423624f83d86fcb093b6ad1fd69240bbe1ee524bdad26b7509412c8" }, + { 3780000, "800c22bd7cc5fb96a574b081f1b4d25d43ca8f0f8935412559e1ae1d94a678ac" }, + { 3781000, "9973abb11a2a7b649c5f870ef5dffc3740b68fd40d2a79c6bb83cd4284ba609c" }, + { 3782000, "326909d355a7b78099e435bdc0e48ff3d339bea054040ce67b3e83adf723c100" }, + { 3783000, "99a82c472f997031be9eb486693a3640e34362c58a1154375e8cbec83b969ce4" }, + { 3784000, "94635eff4037bc3a53fbf8475d1444aab876d0f1be0d8818c9d51c6db437970f" }, + { 3785000, "70ed40c82294e6377655643aecbc5db2f7bcfc9a65677dc9ee31b71d49a08bb1" }, + { 3786000, "a7f12ff79678c23eaaff430f326146ffb1f9cdd9785cff47b0b12f9756c5f987" }, + { 3787000, "e6a1f9bf6af78ef63c6528d8aaa0958e015c0d8cf30f38f52f0ad4706573587f" }, + { 3788000, "3805232b73e27faf537ff46be8e275e03184ef8cfc15ad72a57a407e2b8d6cf5" }, + { 3789000, "e3773cced2107f6dcd660632e6f47d35d7b3f631035083601680f66377c1dc4f" }, + { 3790000, "c37159508ae7fa6dc8d1e455a8da72384119e5e53e434c6fb4e8ca84f3496d2f" }, + { 3791000, "5f35e9df9dbe2d4d9914816de21b665bed798a4ef20946114ede844045b01c9a" }, + { 3792000, "2307a0bfa1091f17126a5f75425f757185eabc940935687b0d85f6ad420dbd9d" }, + { 3793000, "13c8b094f901661283d88ce6e3bef89148b887688965dc638a59003c5bd37835" }, + { 3794000, "f18ec97bda8daba642f366efef8f9dec26d054ef7d683dab8933445c790a67af" }, + { 3795000, "71fa6eae68611686e60678c1d47efe96f22d6480d37a56254bf326baad2ba999" }, + { 3796000, "ea2eaec8db155f0019a7f77c3184097018d2a78b7fec4741860587bb7f4f6d82" }, + { 3797000, "20293a7773f4fb85417e9610a4d6f8549fd2477c49d8af45c8b8875be7e440d9" }, + { 3798000, "a30c3d125707a8afb0e4a96be3c76760dd2d3aea003027960984102dd90f79b1" }, + { 3799000, "a1c13a876f76cec25a983ea34edbf020ad430f41cb05a448fb7f14695161f8dd" }, + { 3800000, "51efcb866e2f9a1ee1a24589d5ab7f6ad806646b45cd091fbdf9c20b57155e5d" }, + { 3801000, "f36a9808956340d9fac34ee0a939181408b052dfa6e48b432bde277935a20f21" }, + { 3802000, "1c312d84308999e0495fc195aa58d6fed4b8e9f91dfe2b4f6fdb1e6af0edf133" }, + { 3803000, "1b004f8073f988f56d985ce092fdcd442fc985359f107f2d45014095a140eca4" }, + { 3804000, "bc18c5e5c85cd77b4a2e54e4088161975bc46f9f36f0b7e00fc6567b4d0cdddc" }, + { 3805000, "244a75127a0bfe9355155d31d19bc2e1961de3731362bc5763676136bb1ec0dc" }, + { 3806000, "216eacd483b1286e21038007d15529ef44b9ed3fbc9c900344344cbaf83002f8" }, + { 3807000, "9a79265fad844d352cdacdd896b4c9a73fc408fb6e230f0ce69414cc3119ee2c" }, + { 3808000, "c8eeefda65999b788de3a2f19573ae64a6eeb119f6d1b23b882a7a44a150584d" }, + { 3809000, "9226db4ea9603474ab4355b6dcd8ad8e53741eb270fb50dae95e51e115f290a3" }, + { 3810000, "6e85a7e015ee84fa86dc71ddb6f5b9ac4c16b236ce80edbe5bd23f407d916fe3" }, + { 3811000, "d764ea5f13a5a081b3e20fc98f6ba32e32ea4cde798e89a79cff10beb792da99" }, + { 3812000, "703f93f4a5703b8598be9a7332dd1660dbc702ed1efeaecaaaef35d44e062310" }, + { 3813000, "ed748feed926d4157ae612b02eb9ef6108a650c58ce0b72259152001a5cf2f6e" }, + { 3814000, "a34020b756874eefbb8bdb269b440fa8a908b6f005f3aca70b18c2cb827825a0" }, + { 3815000, "d0a8443a7b56b0cbefcdd9e95c7991d9e2bd634ebac49c003d1cc02e0f4f014b" }, + { 3816000, "0aef5437e96726157f6f75d2d2105f94bada0420ede30868d73ea1eaaf40224b" }, + { 3817000, "e63c833c24f67408f73c7638475e387b780e6f95a34b403124d28be9494aba67" }, + { 3818000, "d2aba6c7e9443df75d3490856588320c8f34398515528c8cfcfe67a6542b3ab2" }, + { 3819000, "5f071d35ff6237e695af857c0ad8f9b666ef6f9d0f1bab19ae89fcbf68e88472" }, + { 3820000, "855ea75c4b37747ee170a2326a99de5a3b7b2c349baeb013f31b13685d16f827" }, + { 3821000, "c51828aa7893cefa435c5a480fd01eff338cfe85e37e6345aed1b1d0e73b91bd" }, + { 3822000, "d56cdc45499930e52ad2458f661bfb1526d7e3648da0794559ef6be8e950ba6c" }, + { 3823000, "cd88966905a5b374e31cea01e0477c34fc08aac1b174ac604ff0b7249e39dd05" }, + { 3824000, "3a2bf5961ea839800e8cb683a76b0bf8e053189ba078983ae407e46395fe8b82" }, + { 3825000, "410c0b40ec35a64493f70c974aa0c21c8c31c91f44c3f70759061f8aa15ddf2a" }, + { 3826000, "dcfe17c34515a011d29d526d2d0d501a457aa9c3ea7dbda6c9f7c8232d1bec7e" }, + { 3827000, "10eefcdceb88f2967d6f785d4a26d88f190fa641632a49f2316112f8e5098090" }, + { 3828000, "ff783c45935b7fdebacc04588395a2b56f63015a58fc620e4066453bda6f6255" }, + { 3829000, "ba754f748d051dd698dc90c524e67a690d1c8634db92598eafb043d9b0f45c06" }, + { 3830000, "fbbf61411cbbbe226c5c94556d7724b7887deb07c6b5532dffe27f51e8636dcd" }, + { 3831000, "05363cfafc8bd3c0aaf281fea3a9f72afe2eb3ab6e200ba125ea4182b078981e" }, + { 3832000, "5fdcab28fe92db87975365396834e333df1e20a9df169ddbfd16093b26a5775f" }, + { 3833000, "b72d9c82393814a914b0b4852bfa84a373490442a82c806eb2669bfa29db0223" }, + { 3834000, "74debfebddcaae210385deee4d5cb0040d1212394641b9abbcc148df2d530cce" }, + { 3835000, "5909b63494694f9f0d799f2add97ab4c9eecb1838e113b762b58bb132023f838" }, + { 3836000, "f8f16388c358640fcca7696253cb996ab9acc27f1cf5f9846ad0069d85768942" }, + { 3837000, "9292209e82abcc717f70da35c25e5d0d1d25301288762fcde4d45b5d8ec7767d" }, + { 3838000, "0a4b93280d7b23195cd6bde12e4fd43db1720b376bc8ee2897abdae18a92b98a" }, + { 3839000, "39a0f5b23e959aadad45eb1198a09cb1ffdd50fe98cdbe0110fec450213a947b" }, + { 3840000, "681e6ec59a8524d6e3b5393569bd2fab2f22736c0491b9d1bf10d2ddabdad235" }, + { 3841000, "253fa28feeae9d8fc06dc8a21c07371bd3c7abb6fa5aff3e07c2b572613a3214" }, + { 3842000, "3f07f005b7278a8d58d9b5744b85166b9f2df164715ccd4724eee744c71db271" }, + { 3843000, "0d65c738b32c7fae6983781080f6867ace9ef29c91af616f2e6a4d9d818c0a55" }, + { 3844000, "705f8d95e4a0b84a4948bce5c9c8d93b40ce0a8f80d7ed78de180b61a8c5c47c" }, + { 3845000, "46da5feac6f1f6989ef98181002a9227a36b1471abb64c0122ebc4d8c0432344" }, + { 3846000, "967ca7727b00b910bc5175948536233c6d1a19fb828097c759b146bc83dd41eb" }, + { 3847000, "61c487dc4f5377a1c39508a8b857ff3b780cee17c80e5e3b47202180b776037f" }, + { 3848000, "334387a013445d3c34cb6281554c9f68bc3f775594de72fd9058a8e24dc89979" }, + { 3849000, "e658ef794cf89090ff4eb01647e4fbfe0b513cdf50a3ca4f1b59d067badf8eb4" }, + { 3850000, "50cca9da94e0d3b95c11e569b6dfd97f70ffe72aa545847489a98ea0cef028cb" }, + { 3851000, "2e2752d6bcb7466871b7b36a59c6fd8c59bb0aa5a8f1e52937bc2df03ca6a208" }, + { 3852000, "affe8673340a1b4005fc3dff93c4562549cbd22b6710e3c1bcadd65599be6d47" }, + { 3853000, "ed232662d91c6206cbdde14f3a9e4a5f8a02951a17743ccc1c656420cde4f8c8" }, + { 3854000, "0a048d6776cb79425f7d932b653fd4c3978c9d1f3d4277d2510027eaad3e7649" }, + { 3855000, "65b7352e0554c4aa7ef8b546e28aab01db9bd6bb05b233b8dbbc6d8ad89d9ecc" }, + { 3856000, "6175900593ad2550ea1c44c55dd28fdb762134a44f47b69a448bde6bc49e7c4d" }, + { 3857000, "0a5b71e52745aeb4a445a35c0626a0832c160dc8c7e45b77150acdc66e1f7acb" }, + { 3858000, "2661cfc5d66ab7f125654207c572821f5c02cbe370b5d741e8967464a45c764d" }, + { 3859000, "973b862633f5f5edc5114d3577d490275245320df518d4bc5a2875ec92ced94a" }, + { 3860000, "817865da1f3ff5404734691c43ba77652c6b0b08aee17e96c61598d96a417411" }, + { 3861000, "8386a62b41196839f7a84b053baec788d4751ec801143131e6cabc52b2c4c2df" }, + { 3862000, "5f2e50e0c1c8f5321278c2dcb9a010ca8399047fb506585b361a74f1a72af396" }, + { 3863000, "61b87672d8c81fc9abfb22a987de66a7737f6165a8fa6200c927a0a44a488b3b" }, + { 3864000, "82fd310e82c952d1e82adb1efdb93c6f8be3b22342dd73f875922a2ab4d645ad" }, + { 3865000, "2e0b6e80258e9c536e1232a5c49aec160a91ef3616fb4cb7e945b86f7dacc14e" }, + { 3866000, "f73af138eb51fa1345c8cc8d142b84bb79efae6d3900bc154c6586baf685f9b7" }, + { 3867000, "85cef5ee4184d960a499867146423bd5bc1e3e6a7adeb3eee6a1db2a87ccfeaf" }, + { 3868000, "9746af6005c1bceadd10f985bc192a9883b78f38d348848caf46aed7e19f33d2" }, + { 3869000, "368417637696fabf33e1e3b53fac0eb18bd8f58fa3c723928906bfceb9efe476" }, + { 3870000, "7df24e77484f7abd31cab22002e6e42af463a5b710582131a738056a9e7d4dfe" }, + { 3871000, "c49c0f8aac63eef5f972698053967d553279d523fe74717a2b5f153013674d42" }, + { 3872000, "a400ffc094fde39a3897849b071e1a58669be58331741dcb0a8fd8617cbfd976" }, + { 3873000, "c36413d1c4ddf209581e65e022a4720e9e1ea8c1e275f509cc33155407df2b0a" }, + { 3874000, "ef677b751e2ed5d474c33740c23e51a7f751730e7768dedb7e3a79cf8630b8fa" }, + { 3875000, "1a8118e0dcfcfe18078df755ffea4294ee8c389da8d5247e00490e14e40d8b47" }, + { 3876000, "0b60c72cde9dfa16dc82ff4dfb097d9eb7d304714c1aae5496f0438b08afd8e4" }, + { 3877000, "28816e944602a4801b78eee174519e41644e5d3061066362c51495a0373202ed" }, + { 3878000, "04f55e960b14c2a17bb10d4ff88b63335378471d0db135fef2724f48a8ec0877" }, + { 3879000, "21d5155c0cd574c0c1bb9453d0fdf3b727ccbde7bf0da8c72e36845bab1d553c" }, + { 3880000, "cdec7f057628e3bb6149d93111579e3fb86370f97a8c72fdf0a6564c7d72cc16" }, + { 3881000, "f9fb341bb333f9217441010cdbb7c2ad8dd852a2fe3621d53e50f9178216070c" }, + { 3882000, "5ba0b846dd6c8e805dd555e02361ab4904aab23dfff8fb3ba47ada9266b2b4ae" }, + { 3883000, "afd0f71ddf5467f77f6cf764a8b9b46209d733e16d0f8e938dcdcae65c3ca1f5" }, + { 3884000, "af003e687a902032f3a5be364bdb545585601b001053fa400fbcd3dc44bacf18" }, + { 3885000, "5b41b2bf58fa82a1581907fe6e0c4fda276376e051621615b12b74573f244345" }, + { 3886000, "a08757919c6eb05da3a14623c0c953b1b15e322c73d6835a25bc9272dc87ddf6" }, + { 3887000, "a3dae4774f95426880bdcf6425eea9f49579e602533a9c4e73edca7f6892cf8d" }, + { 3888000, "4b51c79cf380fd6db102077f6d8f0bafede612493718fcb952e42fb3b262563f" }, + { 3889000, "9414c2b81ec806e37e759b57143b37104739e4adeea9c41434c5f96ef1855db9" }, + { 3890000, "a14863781a6804a83ee6b0e41b0b29e5aad728984931bd153c92160c8a1299a2" }, + { 3891000, "b1fefc7e6c9b9aa4a289bce6af029a5f42a37800253cd5840e3653025da0a08d" }, + { 3892000, "8b706019979ab994f5b42c58dd411ecbf9e5ae01780656bb83fc99a72aad096a" }, + { 3893000, "8b7e48a62dd8982fe74efb9448d75dd976d69b7fb5e6557e7eb38ff08b6472d9" }, + { 3894000, "7880d4ed30d92cf08429296c240ad20861f3df2dd51843f41b8ebead41c75509" }, + { 3895000, "ccc0e7008b41ca147155df81703191a88da49f608186419602ec9123c50e174f" }, + { 3896000, "4d15926b7c50f7cdf0f871e2c067a0c590af9e49cfad6b4817b0ffc0ae8c26f1" }, + { 3897000, "98933bb76cdcea770e48cca008125e9551a2ccf5a86faaed30c6f2a7c6813eda" }, + { 3898000, "a207f42ce0111335949b236ee9e12c7980f0e5d7fe872f366395dfce1a680900" }, + { 3899000, "425bf228494c9ceb9b0e70d410500d03f9184c14aaf58955d2d0ed3c2618dfe0" }, + { 3900000, "c4210b54c185004b6b6c2814c071856236c6bdd8f367465c4a4830674b770318" }, + { 3901000, "d018e22d840f7027dedfc6288ccf6def3731b0bf4a2a06bdd33c870ff4c0c326" }, + { 3902000, "55869d78883ae2f2a5356c2aa37651ec98b933c15f0f4323fbe84e82535008e3" }, + { 3903000, "e5af50c239acf00e96e3a6bc217c6e3fb4f0fcc7e742944aac05e89ea453b37d" }, + { 3904000, "5fa448b00011285050a7f26803f855ab43c10c41c1393bde70e050b2248f0763" }, + { 3905000, "201e6ef54433dea9d9018d1ff82af9064ccc33d5f6b7c67ddd07f7fb5ef4b6c2" }, + { 3906000, "e9963d5fe6aa250598fc2e33eaf6119f151d12adb2cbd297e67fe4d12499fea3" }, + { 3907000, "ca7c099c35b8d06afac35785b90755b44e0d4c37469b8e8ed5f41a88ac2f1b07" }, + { 3908000, "b80703f98f79f38d4534a1e16814bebc787034ffba71a4b5446ecfe68e4cf2b4" }, + { 3909000, "f7db9f0cc9625ea897b6554a6f05616dd244614c022e147468ed9d70b6a2bd16" }, + { 3910000, "c216bc8f6fa21e0ad754f66c3e01684e106f45f6b35ac24e68204a08ca0fccc5" }, + { 3911000, "395669a2817a861a741202c7a12da07375d8187aa004cb7e47d5c69b5a6ec980" }, + { 3912000, "b7608239119c50c555f4890716a9b7b45a6999317d34e7eaeea7da180c2b33e6" }, + { 3913000, "dc5daa0ad66a1089cf84481d3be2ea6b622adadfc1b2fb8887ff7e7f2766075b" }, + { 3914000, "512cc6b1007bcba1d8d2bf4d77251f723b7446875d0a03ef8f58ba75fbd20ffa" }, + { 3915000, "7406beab6437cb6f4eb7f0d44164894460ed3587faaec47514f5cd732b2ba3f1" }, + { 3916000, "23c99a76897f5e4e2f980084669056163bfd3b08cb847ec021769970f1095a5a" }, + { 3917000, "7cfde92510336bb17e3a2adda0f3648ff07b6497d4892d9dea0ae40cf4a8b060" }, + { 3918000, "e8baabff64c47ceebfb0b7dafa5cad40b6ad5eadd8b73885cc041137df029bdb" }, + { 3919000, "93af9af88c6d17dfb616616e5b0bd511e689faf8759be7afde49877b4c4dc069" }, + { 3920000, "3c2a507f12f67c5196cf4907413afe90d6a4bda5c6006e744af80e80a685897d" }, + { 3921000, "0d56d7633446c737863790f24d39d7e9db1d8579ba0b9bc0b7adde399332fa19" }, + { 3922000, "dcdb543e50d245625897dd43a78fc73dc5138363ac4cad22b3b116f98e10b676" }, + { 3923000, "6f8aeebbd9f506f5dc82655c90b126dd341bec18299f4aec5adcf12212d0e62d" }, + { 3924000, "bcfef6c961cb9434d8b9df11d0987c793392a0cab6d82c976ffd00ddcc5b4a6b" }, + { 3925000, "17428f62dba08d67e3e0d7321e9a24785a93c8ad2c4644edf6cf1523f6c55861" }, + { 3926000, "f0a7ba86562282e7296062d827dd1a8a04bd7a29a437e027e34969f01a63a07d" }, + { 3927000, "cbfdb490a2629e29efb0371ecdb4417c9fc31546f050b4736aa7bdd4e6f6e577" }, + { 3928000, "94e9284df0dc3f8b1adb5211ecff3b8c4c12321a19e01a2721379b428d0b22e4" }, + { 3929000, "8aba541698f86cbc40fe00cb1a8c42dfbe25ae067b284aa3fc902db9e3830259" }, + { 3930000, "7a0d276cad228c17654527d59c5a62de61d505872d28e1d9a5dc926595259089" }, + { 3931000, "4593f728972201326a47ac0cfe79421baccac83fa4f9d8c6090bb49cee6304b2" }, + { 3932000, "57031b340bb86881e97eeede7fd7a101e78eb0bb42c3290b70045c95ef48659d" }, + { 3933000, "8104795b7391770fbd237200d71d429576d47bf7921e9f6501189dae26cd7475" }, + { 3934000, "a33b95baccbd751091e3f838a574bde1b0f7f61dbe231431a95c0bdcd7b8c0df" }, + { 3935000, "f4497ce50ff164fdf5b7620fec342140757abdfd6685f67ca9e7f8f617856154" }, + { 3936000, "18dd17a59cb7a5d0cedd1168adf7daabd4a39e9e96e8a571b77f04a7c0fd3dc5" }, + { 3937000, "4dc2d5f068a0100509c1c32a13862edfaeb4a7ad0a9deedd1ed6e0a6641de871" }, + { 3938000, "e681f851d01ca7cd1c38cca44949b145bcdab92648b3c3c04016fa04d801f2a9" }, + { 3939000, "a3b3c73072428fa675b318077946324287a29833e2475d961eb628aa25164a82" }, + { 3940000, "9549b88344a7ce7f445875676188e43ef85b57c3819f09dbcbd96c9d1bd6225d" }, + { 3941000, "6e6adfc00c5e52f946d58200ed08f394b0372e47eb82e41309da77453c692d38" }, + { 3942000, "cc88ce1d0db0c41239d80bd9bd19c7a46acea2fbac050e02cc837c89b70cf2bd" }, + { 3943000, "0fdae309f8bf07cf1a68c4b100680a4e5bc785d859cb588ee5be202ee84a74ed" }, + { 3944000, "263a4ec90e7a38dc03ba2e6e80daf5965666ea2d63ba03a6b8044bcf39b0cef5" }, + { 3945000, "2645339adf3f2d4052d22a6db2ca23f4676a968667f13e7401f1974f54c00332" }, + { 3946000, "f384d7bd884ef228bf8ac03caab12867216fcfe4463f4f6206a2ce12a49535e9" }, + { 3947000, "34824ed9735529149db1dcb64fcb54c1009095508f6c77c97f21d6ef1a5dd46f" }, + { 3948000, "656347ca9b9548591f4a81fc59b53b3a788623d5e8a9d8bb98e0c5607b78b73c" }, + { 3949000, "65b125eeecddbcdba8a8c2da5b52cfd46839de92b28260991a12d6eed8d774a1" }, + { 3950000, "2c37cabea76a35cd98e5d880ddf980b9cea7b27c1cb2443cfcc49a9c4fce16b6" }, + { 3951000, "72ffb2dc82712ba63e29773f3b15a5ff75afc11293b0352b5b97027032899305" }, + { 3952000, "40da58a6e97e32430a183e7cf334d3bea2e1a4f949c9633bed5b9df8adf764b5" }, + { 3953000, "ac9b93bc9cce9c73b57ea54e4de85384fb8ec2364d62c99d59c66756b3a7395a" }, + { 3954000, "1ec66936f7bb7d6596401696354bc0da1c1e932e070e2b5ad0cad2c6fa77f60e" }, + { 3955000, "4e9efa5bb6f7af814181cccbda80eca330c06a6ec2801cc5cf72c922628dc154" }, + { 3956000, "5426a948b29af3ab9aa602e926614533e4becd015fbec9cc025b20526af197d1" }, + { 3957000, "def7e3f3660c8edc04065f04f98f75f21021ccd628b11304440f29e9274257ab" }, + { 3958000, "6ce51d7ec0f463008860783d27a9e2da5e90a8dcc1de1d9bfe7bef90f17b0054" }, + { 3959000, "508fd8a474da5f99283fb25c616ea5707ffa7ef47e94da22bc9899b9da14774d" }, + { 3960000, "2f6a9b010cfd64fc743638ce360e7f58fe83cea939ff17983c6cdb106e5167ca" }, + { 3961000, "d1fd69ace6b07b5356821c44e4c514143f97d793cc99bc34e4a334f56a7d9a83" }, + { 3962000, "d9fbf23ed2a0f2bbd845a0193eacb9621a274fd31f33ebacad52c20827b9ce2c" }, + { 3963000, "49f0072ed49ffdccc96423de863a08b58a8214a5e98e0c127e64eaaa9c9dd20e" }, + { 3964000, "09fa7072cfe4cc510eb88034682edddd30bf4fbad37aa2dbfc7b631e7f013e3a" }, + { 3965000, "7052e8411a20ea8d8f4335cc20627c757f7039f34ecc317dac70fbf90a103b4a" }, + { 3966000, "00b7914b9c51968244d5eb2fc7d1d627596f4919d717329ae1460af54a4e54c1" }, + { 3967000, "cac32cd477adcaae46fb03dc2439fd08034e3c927d0c5e3fc6552e91220980fd" }, + { 3968000, "34006880ae4a0c939fcfb23139cf4dc3c9634a5a9b0614475ba62f4beb4bacf9" }, + { 3969000, "9108ce9a6e46aac7505c3d14a91eed3ff79a71c889d9e36de258c49fa52d6815" }, + { 3970000, "a66c2d4180cac27abc19fc6a09dd467fc910596f7ed0fd9a20a303e16e8d64c5" }, + { 3971000, "d8de4a9851c470b81cf4b7d17ad8d9cb7441ab1bd902ae177a8b62d5a84a2e39" }, + { 3972000, "843eb3bc074d3165b4d945aac13781655453d800f04bfe3862dd1ddbad8c9a8b" }, + { 3973000, "d8755838ca5ccb8f64438dab59056098c0fadba0919abf1f5ba9f99c6937ed1d" }, + { 3974000, "7c13a69cf4dd0e1671afeb2b42b1b16fe100d2a2ce2916e619e9c5f71c33d34a" }, + { 3975000, "fb62cab706ac81859648e849f8682d3aaeb494180627edab016e03b2754b2cb6" }, + { 3976000, "c14d792f0fab314a087dc2f79a35ee84163c34b9705fc3f988a95194bbe3edfb" }, + { 3977000, "c445fc94fe0feb154212b529bc81ad777b7345df2b018781f7a25ace3a5ac340" }, + { 3978000, "1d5f372e77fd351916f64c4617e5d89d23874f8910105650f1bad330fb9d685a" }, + { 3979000, "cd709b207da36412ca6f8abf295efc189709facf1e3389cdfbd1ef76026f4598" }, + { 3980000, "56f52dd3d69cf59595749870ebeb807d6c0f01d63f692de8754e72fa2f4c1de0" }, + { 3981000, "0f837f4b4569dbffa56cc408d25e4948529f7e52169ac2527f8d9309b35a7132" }, + { 3982000, "2b7760d703cc24dc3a18cbb09b185283eefa733c556ad9638ab22bb95692557a" }, + { 3983000, "00176ca798b5cb3fa77ddb0340e1789f35c9c04bd7929e708aae15cd1b4795fb" }, + { 3984000, "bf989cd6a6fdd4bb1a03a63e81a194cff4d024d58a84785571eb181f6c810b28" }, + { 3985000, "16db5b01b214a9e10140a1ae3176919792cb47ec3a13c07f24d52bd9a55ccfbd" }, + { 3986000, "969528ec3d655eb67890687c0b07ebd0bfa84641b34b77ff8e84894d5fe497de" }, + { 3987000, "32f617ec4be849625c3ae9831fda38a954667f09c3ab0491843cd45cad82167f" }, + { 3988000, "092c54e1cec6f7138c3ae3f9cd517b79575956e4b4d7436ef91d4c7130d31be6" }, + { 3989000, "e34e29cbe5826fe4a74744e88501d0b010495237b362a2324de7eda5893005c7" }, + { 3990000, "1c21d6b2099e34d561a4f462302e8c6e3a972cff7d0f1a838944ab125443b084" }, + { 3991000, "881bbb89df63d979c540bb91b96279432458b5ec8968efc13d0b7e22ae55eadb" }, + { 3992000, "e22a4ce94509780698da49b0703b4f3752862029ed9eeb8d210db47883615bee" }, + { 3993000, "44fd27eb044e1b89f0213e6f9c8f53bbc6b154632825a31d6f8ae28b03ab45a0" }, + { 3994000, "252109c12380f147db762cf4e877331941e449284bf5be23c9fa67550578076e" }, + { 3995000, "10abf06cbcd3932ba4b2e8a3b36adb32ab9bad91a5288f3df927b4082d58ebaf" }, + { 3996000, "15f635b3e25cac0f81ea0e9ab0e57fe088728bc45794aa8a11d05a01183a0d57" }, + { 3997000, "b735e0442d9843b75c7e39d2bf2e46049ddc23a09008460bd0b6c5cca66888d7" }, + { 3998000, "30cba25873220c140d186bb5056492b3982dbd5e381175a5eaf39ed85bd2bc9f" }, + { 3999000, "21138f071624fd6de50ac691b8c6a2864f9b0da0807f20fbf20bcde14a7dd227" }, + { 4000000, "15ff6dc247f0d8fe6ce02af33b21ca3c49f149945c2d5b61ce07c9b40f799d4c" }, + { 4001000, "48e5e54b2d6fe956582210e48a039a9ffa19603603740943aad5fae8d5f5cd5d" }, + { 4002000, "e8f9f2a953f48f6b97429a3ce17d5239f695e20177fa217f4a560fce3962c966" }, + { 4003000, "05eff6f43c0a8cabc790ed79b83576d7a1a19ba0c3b69b0dcbc2272a346677e3" }, + { 4004000, "b7084a6ff982600e758bd78ad3c0b6184df49ed80e8c7c57277e97dc54ba6e6d" }, + { 4005000, "e72a77660a614cdae070564c841fad90c97f09c91a2c3da1bfc2241b9b833d8a" }, + { 4006000, "4d57d9d1d4536ed64a91068e4e3e45da328c40581f579edb9ac8d19eb64699ab" }, + { 4007000, "c4e770ff936a1abbe30c1fc76aff546bb7798d42436e1772633b2b32955fb39b" }, + { 4008000, "a01e80d3b7704056058a917a8ca4ee7d98039f73946af3cfe8e8a3761f1bf393" }, + { 4009000, "d2921324ec2e58a4031f5c9e029e96cc8f117902558ad1755fa0576c02a0185a" }, + { 4010000, "193768384f8d661e99f3712f4e2ca40872994da34c9172648ad96745bf2029f5" }, + { 4011000, "9e1934e46001fe90ea3f64817b23bb41c787928e20791de8ebaebc2e55839c0e" }, + { 4012000, "476a3ea80d2c59a8ab44d6019e9b4eb4376bb98c3a352b8d089b8a6386df6bee" }, + { 4013000, "29c084d4d75b52a2e6697104f98f878aee17b346bb2a528be889f5268113a5d7" }, + { 4014000, "149e543708ab57404de970360d7e29706a988b9248d2be542c29629f7cb28abe" }, + { 4015000, "311b10c7404bd2cea546ec6c4a209a24c4c47be297c955f221b2a6161a6a8e8a" }, + { 4016000, "f8a27cc6fc136394ff212dc20e91efc7a8408d5f51d885ea382e873fce8096c0" }, + { 4017000, "514a419c422868e64983d643f9aad6f3d11007ba4a4916d279194c82dfcd4a68" }, + { 4018000, "8013d87aa56e38bf3d8a69482d814f698a077bf1d4f9f643884ad96270e207b9" }, + { 4019000, "7cac461f7f50e3359003925bc3b8d57e009bbc1a423d5caf185745e9d997a828" }, + { 4020000, "2b170a50da3076aca78447468a186a6170344d91db5516ba79a97a130b76f9ff" }, + { 4021000, "81c3f6e2c10772434e939519a4dbf02223c126149483b75f7555a7b6d0093afd" }, + { 4022000, "94df161b33b4f9f4b7910d99b87c75deea192eda86469f991bc01760c72cd2a9" }, + { 4023000, "c68f9c7041ce76c39a70538c21bb6be1f80fccd90e24944914538fce71a4227e" }, + { 4024000, "ce707932e092442438d253b550dfaa4098e0eb17f9994402423cd3ef6ea34a3b" }, + { 4025000, "cbea93d8bd1e15e9892025971cb864c84655fb76a0effc3e293fc7d4a0dc36ce" }, + { 4026000, "c8ec13c5f87d631e03909dd4ea5637689a2adcec1b9203f7e11d29a580139ce3" }, + { 4027000, "9a8d5cc73671a9902fa7fab9b8a104531cb7082bc1dcf25c2bda5e5fd1f772b5" }, + { 4028000, "a0bb04760fde959c5c7c4b3f5087196393bc39302837c605aa17b8748c49dcc8" }, + { 4029000, "57490f3c987f892f8a23fd4e433b58d0f7250a6e8b117dcb0c2ffda7a5613f51" }, + { 4030000, "c3a37ae555a693c0d7f1273a60db50a9cb5a4fdd1a19407f6091f0a0bd7422d4" }, + { 4031000, "8d2019dc21cd87fc4c05e77f7669695d19ec2329059fb368d6868e47a894100f" }, + { 4032000, "7cb64f297561ebcfcec86ab4e4eb77fbe39836b890466eb7cbd5fa2712128ca5" }, + { 4033000, "b17467f05a24af9ea60478672dd49e909bf2acef81b1bd6e367d234305840a7f" }, + { 4034000, "7528c21a091fca549466aa6796ddd5740f51555731dd774f82a804cb5f61f49c" }, + { 4035000, "75c6131484d8c56f2e73a14fddaf55be93431336042eca9295297ad6d19286de" }, + { 4036000, "65f1d24167c2f045057fa263ac58d8ab54abe7559f9f55603821709c95cc8aba" }, + { 4037000, "786cb53e6b15f76c194de19b8934220e644b9a20bab413d11a8af09d5c78597f" }, + { 4038000, "bba5805ab0b9777ec71e4c9eb983881070529ff8295b86ac69e54c8074413065" }, + { 4039000, "c33a8eeabf63837370555acd1a9652d590f5feb55588612776633e65fd0110fb" }, + { 4040000, "4a7dba530617cbebe8c1a028acfb25507c6b59a94d2dbc356f0bb5ff8c7db068" }, + { 4041000, "43d15b7fefd36a340cf1fb5de4c1e3e22b6f2be6d01cc8c87bab03e9818fd1d8" }, + { 4042000, "e9610823e1212ca4fea98e90357c1b4aacd0045becbb7c37563ae11e115d1c46" }, + { 4043000, "bb9815e803ebb9755e9f461b8200ac13869c88d877a75139f0196873b844abc5" }, + { 4044000, "26ea46b43ca55b9c8693285ec5701624f483083feb174f815d9cbcacce6836b6" }, + { 4045000, "1e2d531b70982e2404a2159963f81c1a80ab9fbc2adcea35a1b53d52fb73624a" }, + { 4046000, "14fe995b60fbe0e6ce7747f037fb211ad483adae9161ce6acb4d0af2bafb5e7e" }, + { 4047000, "080339b3e6f69af7ace0032eba741695837743b557794782389cac9b970e3173" }, + { 4048000, "56194bb572df22129bc8469c016b7a8d39b7a9c917673addf46423b24356d22e" }, + { 4049000, "02610de383818c70294ad31d7c57a3b04a0e3d785660ad4acb217a9363426b61" }, + { 4050000, "00ac004b4615724d2b74c67bbab3443082dfc01194470675e4271ff397be0152" }, + { 4051000, "c38d1e83e093c2c63174cff464751f1e3609fcf50b68cc63f02c3f05404b1265" }, + { 4052000, "9850d50535452503f864df1a6bab254a8ef6944600ec86363267b6cf929e809f" }, + { 4053000, "777cc78206e33f3365343de47df67c8774a4fc4254e3c1d68bd954263399bae7" }, + { 4054000, "db8830061ff6a2fac60f4058729657c10203465bf12cc00cf5d244fff9506a54" }, + { 4055000, "f3627eb9b9c3c104159fd19cc0be82c4ffb615e34e95d0b42f0f8d26385cb4f4" }, + { 4056000, "8b73b7814965cf0d8fd93ad97ac64b6f6cc0401f96f83d68733f7528d26bc94f" }, + { 4057000, "d51bae6ae630552ac6fe6fb54ea825b1724e8a5411b28b337fada8cbe8a2511e" }, + { 4058000, "46a447fda9f5fc48be90d9de83eb3dd3ddcc5f8f11a2a9d45e541e6621ef5dcb" }, + { 4059000, "e09c624eeac7a43087b32dc1b2821bf5b24a83e174a297d6d570280c78906baf" }, + { 4060000, "1a1dab26535a2d43281eab4e296542feaaa3ea336b1a4e1708ac9d02d34d603f" }, + { 4061000, "70d57ddc718060cb98a84a4ba278997104f2008493d7b4df6e4b92c5c55a039e" }, + { 4062000, "8e1cb15d9f3a2312cc8cc28c674dcad4fb5de1f2bc0c79f735fe53efecdb6949" }, + { 4063000, "d2552d12b5b6bf23c8a3f68f2a6e46cf60f43e8c7c8c5f3db57d5161bb820e4e" }, + { 4064000, "7b9bf377d904323736d8132719bac2b4c62918db4a087e5c3e80e08670e9beec" }, + { 4065000, "d09bf3d5dce4636e58315b954d5a6b079b5fe3180b57ab0947245ab45ba383e5" }, + { 4066000, "544416acd02536bb8b256e3a650964d45d050b91339aff3b38e1dd040336a7b2" }, + { 4067000, "b0e568c05f1341986091ff92a5db8ede33a202d87b3ed0d7fa1f36f8db96264f" }, + { 4068000, "09e0034c1636b3a108f042f369ac2e2b8e73637e8dfb0daa1e037a1a84d0c4ef" }, + { 4069000, "c24a2bfbec531721ad4bf575fbb4d61401f4f59464e4a6c047423e22a9f101db" }, + { 4070000, "e86e851ba5806453990e88b02ad12983a5592ba6e569b8f968f8ebdf483831b3" }, + { 4071000, "7a7b27ef9ba85191bc4153dc5bd93a5f5672d4fb390721e5abcf55370af05206" }, + { 4072000, "8d70dce280059eacb1e59a995608e940c8bf82e0195fb8ebbcf232b2cc9a7760" }, + { 4073000, "bd0932c36fd4b2ea803d4aa0fa8fe5d86ef3b4dc50788fc9ab206b3516aba3f5" }, + { 4074000, "ab3e20baedf26fcaef8d65150f3a65a11c51e1b1a7bd4696944ecc80213caa9e" }, + { 4075000, "deb86b13df77969b944c56f8f335685e0b72ca142cc4f0af1e1073458ef1a44e" }, + { 4076000, "093e9fd8bc33c4eb0d69fb091837f8290c2b18eb9706bd0916a0ab55b38ee0b3" }, + { 4077000, "01f73544c8167e5194ea9b57f9b7c5b7324821c4d9d1b7f624ee99c99b711728" }, + { 4078000, "fa45e4b1ef330f9505c3d7de21daec54570eae418cfbf99bb719f6800e3229ef" }, + { 4079000, "6a791ba56fff300de30f24912a3953855f6b56596f1188f8244b19c93b3834a8" }, + { 4080000, "500e3e973e91097d9cee055dab63d22b4f3b67ef8510d4b1d06859d22d6960f1" }, + { 4081000, "3cf9393116aceb785c5fbd27b69b710296d19676a3413d20b0d8c70476eb2e84" }, + { 4082000, "cc221276be669a11b3e28bbc40cbdf348ea0d84bb6c0ceec5f488253368b89e2" }, + { 4083000, "5c7a01986893e2b97c04d089203a92a87a18f475bac3eec453bd82e8f1864c8d" }, + { 4084000, "62b0eb127954e489412a02273f9537d4fc98344de5efc6bc764994b8aacb2f8b" }, + { 4085000, "6865ef2b47b7e6de011eeb9b2b9e4dbf556ec718423397f1afeb3bad7ae23f62" }, + { 4086000, "89e09603bab96188194ca4e3e31fe21fb93810da2cc3683fe1a2f218b809d1f2" }, + { 4087000, "a630d3104f08ceb5854133b78f93b183b373a10bf35c5e418e0b5b6ccc8ff67f" }, + { 4088000, "bdfbf7bc3fc83b15eb82ba9a6a00b7966b56d6b2689c87bf6b14509294247fc2" }, + { 4089000, "f2e41df4b1087e3411e7fe53034def7a36a02005e79faa7804795db3d3fb1b7c" }, + { 4090000, "9fd7651fbc809af21ae2a3a6b13d443a0b123061da1027fc4c0ca34d7230f877" }, + { 4091000, "9f6a1794fa9550b64b200fb2e7c76dc6facf1a8bf6b0516d38cec75821788806" }, + { 4092000, "f900d0b550cec83004838b16574eaffa78da7ed497d259c8bd2e0a50229c6ee7" }, + { 4093000, "c4fecf73babdcf97327a1443c64e74283e944ddbba3f07a0a02c73aa283fff69" }, + { 4094000, "478b70c50c40da7e369e5c58d0a282c45fa0af01e82e9e8f0ffdb2e492ab849e" }, + { 4095000, "8b5c31ae160cd2cff2c463304960d830a6e6b2cb88133235c9b2fd971ebba871" }, + { 4096000, "6e62c12ac738c65ad4cb3bc7c5ae279063712e62beed990e5bc78dee45c33d5a" }, + { 4097000, "ceb699673da28091d10a6c9823df6ef66e589186cf15ea694bd436b2e7879eb1" }, + { 4098000, "c0c1431ae359e0ebfb30fb9e59453bc4d4ca6bf48ff6abe0202b57e8c9961bf3" }, + { 4099000, "73aaa0f5bc3df62e0d6ac3565ae44d0f226325345bd5b30edaf1c207f71ff59e" }, + { 4100000, "969daa1a7c803d5a4e6fb7f6e7a5528ba7d338ba260bf31e4e92099828992c6e" }, + { 4101000, "0bffcd86dc90c06a099770db88a776939588ef4a1956c57a7adb3965c2a1aebc" }, + { 4102000, "cb65e72c352d2579d4d769b6d7fa7a4468bbf9030bbb402d1398d908a3a7d40b" }, + { 4103000, "10d14fca66825f27f5be6b50eb1876e1e710e4a2f4ed4bacad14b5273f93aefb" }, + { 4104000, "cbde25b3872b77662edc0a34fdda32b4c1539a6aa0b100805dcd8e6043abdf32" }, + { 4105000, "404ed0eb5b35e00c6adcf097fbc6893b0592e0f5e1cfb8993bfb11d2342dfe2b" }, + { 4106000, "2134057229d0fe0d126d36818767e665d87f53423dc6213d4e9acc0c5e5db5f7" }, + { 4107000, "16283f263ebc97d2e1311128f626d202446e63998253917942dffdf4b9b31415" }, + { 4108000, "1fc1d07a17bdf9c8b3362273bb54258645573e721f5903540cdce6c4a7f12570" }, + { 4109000, "199568ea3c769569a715e7efbbc881ce56bd35179f4adc2e71ef7c3e6450b921" }, + { 4110000, "9a8fbde047a0ab60ac46580c52b8cba03bb86316d85f5cebfe58d96d91f8023c" }, + { 4111000, "d1e3e03e97ea7f853dbb37c5c07b149bf49cc951287f2a797ad31ad707d2ac0f" }, + { 4112000, "71f9a683206a4e93771753e9f75004352114c8989841c2dcc61aa80f73563127" }, + { 4113000, "0f21edc74e41a3fe3bbaa51dc32e783ac34c70ce8a9b45b4aec7fff0c7df38bc" }, + { 4114000, "f8b193ccb1205a408e1c4472f95c9e32b7560a5cb24e10bf3b4ce75da1d899ab" }, + { 4115000, "8e90065ba7c1ef9d10fbae211455ef1ee8ff985c52bc13f2ded7f16f646f1658" }, + { 4116000, "b55436eed12fb54ab0d61e1581455821669204e65692ee5417b6c34ff53c7ada" }, + { 4117000, "007bc5fe7a654912bebf799113d5397fa4aeb299c306571c39d37fa134d0b1f4" }, + { 4118000, "55fcfe885017d833ae12456aa0e8a5ee5274c62f0799079b94fd9132382fad00" }, + { 4119000, "0c72115546186e7d878f0866df263a132788d914281df62edd48b42ed8f8fbd9" }, + { 4120000, "02a7aba3f642f2fbf38c8a83471e9522a62b8f70b0568cf9580a88787ee29137" }, + { 4121000, "c3218f0a524d3bc32a22a826d565b72560a913658edcbec04ed798239ed7dc01" }, + { 4122000, "20e997b88fdf311769f7afe5dab36ee3ad8bdd6ab0e901406352b276deb440e4" }, + { 4123000, "9da0e4a21e34fc785a659d24704e0f4511fc08c4703b68a6e1a13c6572cfac36" }, + { 4124000, "68f4255552d4601ad740e9200d12bcfd946ce4e3004dbce145ea2280773a8278" }, + { 4125000, "ad9922902c8b9d4ba73ac6523b41b226dd8789595d28dff69ad198d86a083835" }, + { 4126000, "1e0e1100aa58d6b56c193f36f755540be22d7328cb9b5d24176b432ef3c15199" }, + { 4127000, "8ad47aff1a169e9915876d461960bf6195ecdf1f393a9172ffcb5282a8020541" }, + { 4128000, "c8cffbf1a4c6083b341edbb8970cf7351849a8c29d2cf7b6c70129433a833cd3" }, + { 4129000, "f5fd40d7a9e37d94c908756d91145404f04fd68072a821495b329bc77e92ce19" }, + { 4130000, "ccd3a8b628356d86712324a2366e5ce7118d719963843b7e4796f44842c4322f" }, + { 4131000, "13ed8c34d670bf42b96c476d991642da356316621461da76b8b3830878aa6250" }, + { 4132000, "ac49fab6187f57bf6cba513d53ca89404fcaf6911ecf54136d04c01c96771e6b" }, + { 4133000, "0c4847f2db42ae3bda223063dc01aee125224cc50bfae47034f3f3997c3bdab5" }, + { 4134000, "fcf82ddeec6f4b21f5d167788839caab1ae487abd5cb96ad1d5bf6b27848f316" }, + { 4135000, "e71c587af20a0a2ce2efbaea906aae55e86d54b3afcf604dc81bcee19ef535ec" }, + { 4136000, "b58d0a12862cc76a24c2d834920a398efe1f6b9660760cc3f9cfca8df15c984c" }, + { 4137000, "3db95899c7b72abd9d11aee0461ccbc1d906e5c5aeed0509a92ee9a0f180dcf0" }, + { 4138000, "92f08040e7a1d9abff7dd889462ffd5d71f9ec3b6463173bcd42914d4634ece1" }, + { 4139000, "32629c0c35ef31bc3c07502799402ad455b6c3d885d2889dbcd2fd12e60313fb" }, + { 4140000, "9c7097c40b8e0c981ee4ae9e880af1c17b2ba51477186021040568a237936a6d" }, + { 4141000, "6d58b0d59aa1c8492cabcbd052946482c50a1cee0928d70c43ba0ae0e3c208a2" }, + { 4142000, "4e115449bd17e5c8a944bd038f6288d50568a54528c3cd7e11336b96cbbb11ca" }, + { 4143000, "307c481cf63ebe0f09d9f8be0928246dac793bae0f58fc4166b844aa0416bd6c" }, + { 4144000, "d03821d2103002b463b6da1aa8d238fe52def7cc20312978e19e50617286278c" }, + { 4145000, "f64c099212869bbde6ef3e03a190a25027d7c6c4c8431dd3aab00c5d757cf193" }, + { 4146000, "6431662f363c958ea943685ee0fc2b665a7d44d43afa83520fbfdd9d6422111e" }, + { 4147000, "0cf7862f163c8012a330efa54abea02d26687b3b1a08b057c770e3db7a72a072" }, + { 4148000, "38a1a86eaadc57ef729cd297db7a3f80ebd6da7bfb910f7ee33b76fb5378dd87" }, + { 4149000, "c99286ebe2e5cc69ddcb10a9b4e6d2923234b2efbce5fbc0f57deabafe9d0f2c" }, + { 4150000, "53af457b0092ad3c90f059684b3d1fe315aeacba019ac12d76119356560d0f84" }, + { 4151000, "0c0844d52e5007115bb85dd550553558818870c67edb5b6dc2389311d376e35e" }, + { 4152000, "ff1ead6057f8a12ecfbbbc2c16d54f69993b779e10fbd7dbf524a79d66540760" }, + { 4153000, "6bf4d0d110c5184c1d1d1baead79e754f438e7956d41fa3b416d5ef372048825" }, + { 4154000, "a5f4b7b73c62d17186d00a86c822c2679c4a4288af3c71fa03a5a5e702d8d90b" }, + { 4155000, "7de6fb0bff8f3783f52da47827c1f95d590e92d6bb74fc5a8591f1e41a01bda5" }, + { 4156000, "e134cc4179ee1cb7997afad3f63e5c3f1de9f3c0a817d56eb28f23c0b25b429e" }, + { 4157000, "ba582754677dfd8cb8aa63721708a816a06ac596ce5414d767edb4fda0c5c220" }, + { 4158000, "02a7baa2b99c571f3523754d7f6660b51f638c1383ab045395dd3090227e491e" }, + { 4159000, "d0a3f209ff6855820a7071dd5ece0ebf5494e2eafd2699ee0c0e7009111ea4da" }, + { 4160000, "77d205d9dea5bcc440756f220f3c01c0207c4755268d533214df8e407afa80b7" }, + { 4161000, "51296189e6b0423b907f1b09ee4900434eb9e6650f37d6408bbca615a0d6b512" }, + { 4162000, "55051be5b1ef58d9a4926160a7e92691f08c67f57cefd71c927f57a3888fbab5" }, + { 4163000, "f009d2a013cfcdc91221590291ed28fe3a3096539524b96c7db7f1d020ff6bd1" }, + { 4164000, "6969a02ab96cfefee445605e47f1eaa4300745dbb614cd5f9c7d7288d422b8a3" }, + { 4165000, "8448f2c5e05ce9bcd5afc7868400ecdbd41fbfc36063dfb061c28af114a0ff99" }, + { 4166000, "4fb090c0558ee1f6363200a9c9e63719a276ca3502ca62be4ae849581e3d6212" }, + { 4167000, "d95e6845b80772360a9498da9a3aef1e6aab72cca2272e5af473995aa180b2af" }, + { 4168000, "783e03e8fda117da09692fb73d3fba9d535cd40e7e847dbb631a542abcb30836" }, + { 4169000, "669d2603b32f0e9055d88e25147e1556e826c96f361150d92ce0950587768faf" }, + { 4170000, "c3f5b726e3f5e90f081d769fd8340e4a44304387e77e0cee4f75f5155050bbb8" }, + { 4171000, "ff1588a6925a58e1e37e020eb84c76fd55e5c1623717c166d4f0655cc52ed1a7" }, + { 4172000, "73b111ee36ec09171814a6da9f22e7356b60934522254a11d38286df030fb103" }, + { 4173000, "949d2afaab93766dfe842f13d3c64506665fbc3c228e33833c47525d56e99038" }, + { 4174000, "63b0a411680241a9922a4d41c8cac85f6611a0d112de82edcf012b57b57f762b" }, + { 4175000, "1d063e4960a8fdaa2394adf89881247208b76734f4b04eea5f636b902bc290e8" }, + { 4176000, "a29b5a21a19bcfe3fcc70a903a0da7310cb9509ffb19308d977ae6c38922cac4" }, + { 4177000, "bf0763dcac22764a4b9a4dba50d49fc5f2df2e607cd29c0c2b0ecca3ea18e345" }, + { 4178000, "5be756df1282b51404f8a96fde1803fec62e8ae3b53daaa63442b343fc27f17f" }, + { 4179000, "b1edd623238ed8da0d4adaae87066a1e92e9385cb14cc3b2208383a8a5b903a8" }, + { 4180000, "4d8fe628a9c7756752c8f32b729ed2c3183cbad0ebb2eda63216033681ce6ecc" }, + { 4181000, "424e487808c1e386cf4e2ec7a7a9aac3b95850d3f21d66c6cc68ccaacb566fd9" }, + { 4182000, "e31839bc21131f2d2dc2f659aa0acf1714eac0e6071ca2d1d55bad0b20b2e063" }, + { 4183000, "7ba9f9bde172a6f41a36ef68f9ac029217e6bdc3fe09cfa6122fba62900654b5" }, + { 4184000, "faaab752355ce5eba30140ff940159b41ab381c8cc5781bfc00cd4462aeedc93" }, + { 4185000, "36048d42d39b9f1654b2bc1dffa4bea40451c10779df51181c7eca58f5316a54" }, + { 4186000, "cde3c4cc945b4781cb4b6bead524a6ed03135ff6a67986cf8fcb568987915072" }, + { 4187000, "4c05c0b6d276d13fe04bc14d187551e93270c516377118b18434ac2b6015f5c3" }, + { 4188000, "6f9929d136c1f7f0e97f2f91d316894d746c41d6f6f595616cd40be19fa1113a" }, + { 4189000, "e58341b9564be10fc97e861c78770fc6b82a8016a547b9f93471a0890035949c" }, + { 4190000, "beed29aba3d8b5f9bad7524733dd1f971c170101698fa95c193ea697ca131478" }, + { 4191000, "72ec7961e695c3955df4e4876ee83c3aa389906c71ec9d366a268921ec8be51e" }, + { 4192000, "978edd2a5711bc4853b54ca39945c11a1baf935b9d68e35b89f0154eac314dbb" }, + { 4193000, "dfcd9caa4027b8c0142e9013abd8b32f098c0e7016d95c0e1a5df4dff8b99621" }, + { 4194000, "28d689f5b882fc575018b88a818739bcfb6d650289506a7a1b6f25f7c1ede16e" }, + { 4195000, "04b2342c9d563e58058e915f81edc529c4886740024cd5f08c3c1d313033542a" }, + { 4196000, "74284339e5a8f8099b8a2d622c69e7f719857fa740c572f218ea77202668312b" }, + { 4197000, "861c82a97579c7f6d09ccab62ff6a425619f91a281bbda209ba073dc80671b94" }, + { 4198000, "c68da9fb09a3beae3d38daa99ff5a398bd012bde2df40f535c6e32a85e80c0c7" }, + { 4199000, "c4c29f65274a87058b4fc30a9dfd6855335461e01d2dff54c8a5a239218ba35e" }, + { 4200000, "e2e109927c49b92a958a071df251f1a63c56200f44016e53baafdd7658db42fa" }, + { 4201000, "1654054a3de56e50756e6dd2e7836c6c22838488e5fb096708a8284997635b1b" }, + { 4202000, "6d907aa4a0fc9873897c895d7075e187745a00e817576f09a0f9e5ef1a789fc1" }, + { 4203000, "f20ca27219124b0db0d0444ca3ce4cc1e6652ba41c6a791297d9506599432024" }, + { 4204000, "e8bf129db694cb2bbe30e28b0c3cd1d463e7fc0a82b41684cf136be4dcfe3c46" }, + { 4205000, "425ccad96df650676a55fc263b6633e4dd2c740ce5609fffd03237269ba17b3f" }, + { 4206000, "bbc6508726d14fbe82848310c9a58f6d54720fc0aad78654166875144cf4acd4" }, + { 4207000, "491d984233272e5b4b4b185762ac061c3c416194268ddac712b557bdc65eb0ac" }, + { 4208000, "ee342f3e0f58f412d2ffa0971a2973be4d4e29b8c18f6f6ba6acaf9f8ea43d27" }, + { 4209000, "69a8b9d49aaa3ca230d6fc15655456a48e750b5c529dbf14b8b2b30cc5be3d0a" }, + { 4210000, "e8511e15d64689ceedd7dfb818b6cd30199fdc8d9130592d16082c87a3573cf6" }, + { 4211000, "1ef3b6ad7482df9250c8255cd2e177c7fbd4587db112f3e97ad0e820ff3c45f3" }, + { 4212000, "f89657a388da1997b51003da30d31fdf204a32681ae6c80a707dd416087f135d" }, + { 4213000, "75b4bcafe8402e9ad9de66a9a3840fb4115dce10b42df929dc027d410b704731" }, + { 4214000, "76e6cfb38cb876032d7cf72de1464bd49042164ffa199c2b32a44e9871dd9334" }, + { 4215000, "1fe0fb06053b8bf88c542660c62cf7c5e3d49944297574bc5e69ed62fbe34f79" }, + { 4216000, "a16647aa7bf02ba6b4f0229a134dc4881bdb94e5096d352bd36756ae5f9f01dc" }, + { 4217000, "f429d57a7faec9ab5e75bff634acfe5b49dd898abf18e1622fefc742f9864f80" }, + { 4218000, "dadeaa788fdb0d16306826c45b664806f6476f489cb3b62a541d62fb1f1bd859" }, + { 4219000, "3e2338aa821e6af08df8fe108d523044b87a275a504676bc16aaf055e97022ac" }, + { 4220000, "7e0aec3d01fa972db2d06caab699870373ea25e12f937011740f73dcfe0da52d" }, + { 4221000, "64b92478a549bcfafcd7df21ab9bfbefa7f30d5ab16957df1747f55cd1b0ffec" }, + { 4222000, "34e30326e30083c8039a37bb545b1b80921a6e608b1f98ae4f908dde32bf9988" }, + { 4223000, "2a1a709cd5eea4ebe3a926f43aafad225f27353529fde710bde2a809d34337b9" }, + { 4224000, "ec4588d2d1c06ced80dfafcfd6c909474da9f047c98d16c22c06c964a4cbc1d7" }, + { 4225000, "9bbde80cb310db5d35475bbbe249348d1e827edb97491253c580663e29ace542" }, + { 4226000, "810db93a09dc6a0b02dd4285e401fa2d0526af589d7ea1f3eac929eba838b5e7" }, + { 4227000, "c2cc6c22f7adceb20161f1dc006ec901d83ef07ea4cbc2d74aebe238bfa11eff" }, + { 4228000, "9cfd0aaa30a21391639036528527a7749f35c065c6eb9848c63b71723dfe04fd" }, + { 4229000, "415e34f0db5f9171d23c6dbded33aa8f81fd7658b5a503b4323389e0caab30a5" }, + { 4230000, "f92cef3d8e6b2baf67f0e7eab4e4e30ebea913e7af795af63bd7ac60537fdd4a" }, + { 4231000, "80378960d10bb641d68adf4cd007eaf264de8314143c4f1d31834531ad97aab3" }, + { 4232000, "4e8d636546f591b25ad571820632d3f5cedfff20e3e3053b478e76546815e529" }, + { 4233000, "689ca19947faa8850d42fceaf5e821419134501c4b971a740766cf365dfbc889" }, + { 4234000, "eb062255d03695bc2872b1c0d18193f03499caf923f70a6fe269160453576f66" }, + { 4235000, "dca4cd09772321e54a7f37ae933830447143811a4d8bb52d68e64df0c86ad033" }, + { 4236000, "c9007166d22b902d16c21400d14ae510a4cb78648d55aaae35b874055142f42a" }, + { 4237000, "eb408a8e745696511c3ee0c73fd5753afe5e45d621cf1ef2729178f3eea82137" }, + { 4238000, "e58b756112a5dcf79df95b7e14d2007c11d616d9b67f6a863617f7331933bb4d" }, + { 4239000, "da6a4976c9e12ebaae31eea6419d84de91b6e46b47650fef9fa26b4ed336232c" }, + { 4240000, "1b972f09afbd43b9ad9a263a27ffa31a79ccfb4d7deabfd33b1b94d7f7e88ff5" }, + { 4241000, "627ab54e3ca3e37f8577ab2fa0aa27c8294b9a7308dc5d4c07a31c2c8f1f4c0a" }, + { 4242000, "74e97d7e038ea9b19f9d783eefb94d16f8f48d74751c8d11db8a9bae4f61bd85" }, + { 4243000, "c2f2aaa70ae13ec13cfb83f5619cccf508fa37ef46e76e09e0ff7784b340170c" }, + { 4244000, "fda09364f417628ec6adb8598f928ec0a24bf2d2acf380864f4d429bb17ce4cb" }, + { 4245000, "14dc30532bf704d54c0e8db5a653ac78f5e8663b22ec27c8850376573a2d526a" }, + { 4246000, "579dfb2feda15bfb5cd9b532e9067e9948b24869f0e3be8546fce2b0a46d05b9" }, + { 4247000, "fe1bc6b274fceaff2b0b00cc75934721558dd25ed551ae433ae726b96984f7fd" }, + { 4248000, "f3b6f06ec4b9ff7de6406c973145756af33efd153ff1660dd3e4c545ddd08db8" }, + { 4249000, "f07419facf03df70ef20ed25b7cb11b1c4c4b2a51ed3be639db6a0f9013d34d4" }, + { 4250000, "bcfaad50664b7f21172171fc994f90736a1ae1b8f7d8e04fa977411d7872517f" }, + { 4251000, "9cabefa3dc7682d0f7729e5a38c2e92b3d5c78b4857bf650ca66ede3c7c458da" }, + { 4252000, "d6a48d51c66901c6b7a76c830ceb0c36ab53bf2a54a315f42f90b6baabda1c64" }, + { 4253000, "7c2963ecc4078050a18d3b4e9041724314ff6544cdf201eac00203dbad2f93d2" }, + { 4254000, "d6e40a29a109b2b26ab2aef0285fdcd4a58a330d745a46baf548a03b2d425149" }, + { 4255000, "c40ccbb542e3b39c08facf43020707409d568910771e924c69a4a78fc4258809" }, + { 4256000, "eb4a57c81361bf74e5a53830fdf645cd196a4cbac1a3932a82a5d44a7dd24ae0" }, + { 4257000, "7f3e696ef04b2771a6a8e122f567bd3677d8944ee5bf3101f61c3091ae2d43d9" }, + { 4258000, "1f0970c31b63eed229617041e18d0886957cbe08a3c46267c1210006a8172bac" }, + { 4259000, "761be8b94058e66cf02025e5c6dc769a8a0fcb78cbdfe46dec858f3385f835a8" }, + { 4260000, "353e02ea0171f18f95e3d199e4bb078065030953c7c88911af4def7204c180de" }, + { 4261000, "65c0fd1eb2bc39d7f98eeaecde5f5e23fba777070ce8ba7877e9e3013448a626" }, + { 4262000, "98776b5361743e98b8fb06e9ab5ecea498bc342c838760697bb419b256e54760" }, + { 4263000, "ee7fa58c349c031bfc42035ea79c79e4c23286dc535909a2f1778ffcb7230f6f" }, + { 4264000, "3c746fc24cd983c66c82258e4cb290de6e154b59a63ff520653206752069f117" }, + { 4265000, "660f43a535f7eea35fbc888dbde37497d6b05f943943e3105156de7c9ee0ae7c" }, + { 4266000, "fd8860b928835c0f7058d8c240d45643321ce931285c5bbb7b500e8586115135" }, + { 4267000, "5c74155fa482379b7b121e9f777fb4f55240e50f81e4accc6ae126609aa27662" }, + { 4268000, "924dd1ea38babe16638fb560a067f4564706429e89ad980193c1b3a2bece7d77" }, + { 4269000, "d6ade52d9a4b9e51a0e850f1fd6c46b8cc9428b0fa4ca5a5176e682520e6fb43" }, + { 4270000, "f1451e2a3ac312478a5b9259839bc5ef37c9130e06313a6631438d2c9b574f1b" }, + { 4271000, "e66e6b5329a2bb8e54096c04e37259ac790f9e5672ee0af95402fdae05582416" }, + { 4272000, "710e14a12ecb76dac72b2e39baeb5c1ff797d236e3b6a05ecaa4e2a5ca03b360" }, + { 4273000, "b11dceb3f453e190b9b68fe314a9322de4931e78b9fffef0fd22a0e9d02c2faa" }, + { 4274000, "b08d7dd04d5f9dbc6a0260757c8adec05bf8653d7d21d1d9cfb2d8ff2bf7c4e8" }, + { 4275000, "f24d70c7d8a3b64e928eb6e2902be13fc690aa9da54b4c0d2807e5d46d182528" }, + { 4276000, "fc84e0a076da98742bbb1dafe5e762f211f9454199afc9501482cf5e8f69f248" }, + { 4277000, "d0d2689ae2eb81f05c5df830f518c9dce01ac83973d47ad5cc4733e626198646" }, + { 4278000, "c7127c73b83f1b443b550e5ffd47e837c398c32358ab0806f33a0b99eef4839f" }, + { 4279000, "8a7fb56f47cbe8bdc086f27e4d58a4f495fca8f743d2fe918ad1f7e48f407764" }, + { 4280000, "201d163556999bbb85a7a22917f2e3da973ea2fa0585bb400d41cf994583cecf" }, + { 4281000, "417eae61ec6b67adc7656dc93cac38778011b482013c1ff13782fafa3dc26f76" }, + { 4282000, "e9d5f2d617ff234dd9a01ae739b39dadaf1511d5039b9c60ba74023edc344fe6" }, + { 4283000, "4339365a0964c4f71f1b8d1b8ea861bdde24f95bb4f4b1b52171f0e8d65edd0a" }, + { 4284000, "df97900b5fb8683d7b115174402782715bf10768d91cd359e500b340eaba2477" }, + { 4285000, "edd47c892c6c38b1c7d8c6beee368cf1b7662eaf0a2208e9644a79c4b2c760fc" }, + { 4286000, "3255e68b2b55311f526dcb8d867cef88563d29a61900e0c92b9ae3e2d83a5961" }, + { 4287000, "6d548c9a9bba4eb222602d726430e5dfcbf370c3edc727718c72c0ef62884e2c" }, + { 4288000, "d9200f5cbeefa6307be65fcc678dbd9884dec7673f6eca0097b7cdbdd1e734f7" }, + { 4289000, "7e5e1129ddc20c98709b035a1f66389015ae2a6b4e77adbbb50abf5a9f932d00" }, + { 4290000, "63a8654aec6f2f051a19afc0b2a895cea5e8c5489b8c7c32cb8a0e95fc3739a6" }, + { 4291000, "fc39f324e6fddd7837427186dec6c3e44c8f5fa62dfb8c83db92e11118bb2605" }, + { 4292000, "0d627fdaa0a858d6c2899615055a9da454aad5dd8d6c059377b071e25780d00f" }, + { 4293000, "0c7c11d06c9aa5b472673741b2638d2cec09a1f07c209301606cf600a659bd6a" }, + { 4294000, "488b6c92b9ee0084e9a71fa1d308abe47395159d0abff498f503b81237d4bade" }, + { 4295000, "b47ba56f1a8e890127db4bbb6ff8aa761eb94e64ed829b584aeb0e310c84c6d1" }, + { 4296000, "59b11927cccea9cf31a170208ba7d74eedd3640324f149dd51ac7bb0afcc2bda" }, + { 4297000, "4a5e5be9acfc0a5d419df5236593ccdb1deff2b73c91d32947b7cf9a25cf701b" }, + { 4298000, "387360ebbe2bb88951a7adb0bb4bff29315aee192c0bfc0c5e107f307bff1b22" }, + { 4299000, "25622d45366fbe7e6b3450d830683ae601b9afd8ceb61a3d0e75f939db884a75" }, + { 4300000, "47c6705dfa8e9c33fdda3f60a58f700d2f0c236e3c6efc782f13b8025898f3a1" }, + { 4301000, "19370da50008935109058d13f89d37dc352db5ae127b447cd820707e5c016b55" }, + { 4302000, "842a2fb3076d93d24b7b5f7e972a8c4c065a8ad3fe71a11f6c58587177c5e7f8" }, + { 4303000, "3054b180e56a7a6eccdefd2dafd4c5a52d5125ceed13a91227c75ffc113b4342" }, + { 4304000, "99318940471ecbea92ac5a480e5e8dbae9f83fbbd33a834aad8dfff6ef30fb9a" }, + { 4305000, "4d6c97df147fa99533cceb5bbaaec747da1c66f69d4f44cc65cc41e8d592b44f" }, + { 4306000, "02fa580ec46803d019149c81a7bebda77e0ad9c108c15e470a02ff824ef0584c" }, + { 4307000, "59b05bcd0ed9101d395bc7ae6f6c4e6976b79ecf24ca912fd6baf1bffdf6502f" }, + { 4308000, "d1045d0f1ef45cf585eb97bffe9e492dd6db159920b2b572822064b934779e87" }, + { 4309000, "54368dd18ecf63839a82815b66f83dd9ff23e6ad6e4a69f12e09a9d2f7126dcf" }, + { 4310000, "211bfce06ca5c28c67c7ba6c630c976cfaf7a16a0d8f804c92acb5035c44563e" }, + { 4311000, "e3c7e3e36252eb89679b4a1e2a181440f6206d8f7ec8363db48b28e99b984a8b" }, + { 4312000, "c5a298c24b4531f923d1e78973f23df1c216b7c53a1ee7799fcfa69fe035eb10" }, + { 4313000, "f448b0cde176c7be7f60500ef5f0265381c45e8101cff06807a53fe4adf81f62" }, + { 4314000, "b9e4fc5b885c1acf75422b9534839f096f5cd191bd0b62229dd4469e9104314d" }, + { 4315000, "5dd1d6f760582425ed444bf858536ad0bca5afa6b69639ead22c5b6a690bc8ef" }, + { 4316000, "3dcf08d64fb2cbe0c94cdbde0221f11923ca31beecd1c3277a6ad16c7bbf11e9" }, + { 4317000, "323953e53b457ffaaa0e05a044cde66cf653e52de6691ab9564c9d6836e450d9" }, + { 4318000, "c33c953ad44a3acc504a9295f216cbfab0d6af8d05e1974f3d082f90d004070f" }, + { 4319000, "0ba12387401132715cf7721da0e237cb9304d4126d486f0f1877ed908630e2c4" }, + { 4320000, "c95991fc6db7f0c08fa6dd8decfb59eeec25f5f3e9ded5adb76e4137855d3774" }, + { 4321000, "93c881a4441c786e489e68d7bb51902e37d7136f2377a0a1a8b737f35a16c4ff" }, + { 4322000, "4b23e0ebb3735ce28b75b4cc0875868d8c8fd71c038c13d1afa79fb22f43bf73" }, + { 4323000, "3357c6feaf1ad3a95dd38c145315bc436af1c19427036744989f542986f226ae" }, + { 4324000, "848e969a9dbaf26f629ecb08a518a994ddbabaeddb3dd5190e1d36889a45db9c" }, + { 4325000, "61dd9f61aff4009fd0048a6120296bdddd300fe24f7293b42fc7883bd24a4baf" }, + { 4326000, "ade971f5b1aea82faba624b6bf0c13396bb16c4a0062b709d8e761bbbe9f2700" }, + { 4327000, "c07b704735df0208b23ecc494de83a268ee30549aab6b52e973a753d1c7f39a6" }, + { 4328000, "ba5efb17f360943de6d57b9979d190ea79e46ce4c603fa2c019ca94e8295144b" }, + { 4329000, "e63c3ed1cfd2778a786b1e926da517ef0dc1a26c69a67a9752f104d576cfdf7c" }, + { 4330000, "63d0d9152dd7ef23a035a87817089ab59453d5ca9a69e9b1eb3f33db66bb92cb" }, + { 4331000, "a3b10dc32072f67fc6d70985e74fb5952024fd9edd864ace97d161e9409c9002" }, + { 4332000, "f045084fa4507d49ba06cc60e369f907acae067e60edc20d00d4df90f99d423e" }, + { 4333000, "bfa53a2e93a20c00edf4e001cab7476900dc9f7f6d42baae111e9125f334c1fd" }, + { 4334000, "306804d5bdcfc9fb91007bb726ec5ce281d2df050fe9e1c35f3f321649d416aa" }, + { 4335000, "5f3c499e02a7933ab69abde8cb6ec8b6d8a575c1143386992636377a4614e847" }, + { 4336000, "d16723213066b436e1e869a466a48155c3dadd133a8a3f043dfb92e9eda67b76" }, + { 4337000, "421da8252300e173aa4c0b32185b99b689b43b26785b324072093d0073251768" }, + { 4338000, "101967ab0fe3a3162371bc4ae64400662e4a061342290e0a0b7fa0a60626009e" }, + { 4339000, "3f1cb644cfac73a417be6eaee7e3ac588f4fa1f96720afba67899c10a37a7319" }, + { 4340000, "4161852ee63ee06dcdb4643d4cfe2ac8d0e8c326392c05c1bf2853bddea5aba0" }, + { 4341000, "66d34aa651b80e56a72fb1a3082f4cedab3a120dd453707a96d1ee7e807f76c8" }, + { 4342000, "002fbf79999bef8ac891e5fc2dc710864d0402fc1a5f9646e5c9d88963d86b06" }, + { 4343000, "550fb98086ae6b104277847719198681d5785f1212448602493cc9913584c043" }, + { 4344000, "252dc940dcabca708867e8eff7c2081bab851d3e4d5576cce51f6f2b6c975194" }, + { 4345000, "3ab1521c381da218e0c73d70b28439120ff80a5f7684678168debfa65fb20bc9" }, + { 4346000, "31401e4962db54b47a0c54888cbfd284353919c3c215e65ebc6abdbd388feae0" }, + { 4347000, "56904c84940f2ebcddb799726d8aa74b98b3bc5ea85889fe1f5c0dc9fd046715" }, + { 4348000, "0b75659bee407981a5b012d923a0cd0889d478e34cab2e90cf0e90938558c8ed" }, + { 4349000, "53284bce729412a7e72b392c3de47245e385dc9caf0b021d2d8ab7c7a8603108" }, + { 4350000, "129ab749090d01b65e29cb309ee97ae59e3495770e2428bb7e4ba42911a8ee90" }, + { 4351000, "92de42eeeee40d653985ff2f9d13616e8d2b75101b117f3eb20f7a1d3419f53d" }, + { 4352000, "f3f800a8b20f1c82b85c5c0b3be71021a46da34efdfbb0f829c098598a9e681b" }, + { 4353000, "961a80cce115fd42467a2a21a213fec1f4ee19589981043ef7d7c75202f0d10f" }, + { 4354000, "f9c67b4f6078a6594ab5090ee1f3b53e4e972d3949911d26eeec7db21d5ba1d8" }, + { 4355000, "2946391059526da8870d9f42b234dbb66fce213bf530a50724312d1893a5b951" }, + { 4356000, "21a8d6b7ada3fba2c22ca58ef8cf1590a5f4709144c33fa3c9a089f593a42ef1" }, + { 4357000, "9a3cb6281c282972d8d845ecceb6ca55a3a4a292d66e1b7adab283bb06f17227" }, + { 4358000, "39a4ef3ea935dd36c35625cece562dd79d74aced1e46748f1676afae95feb338" }, + { 4359000, "f003f8e2c74706feac35a14c8a67af2af941caea402fd4e7b0e8e83b41f68e67" }, + { 4360000, "ea02b02730b8a8c4cd13ca1d127ed70e38f2e5d3692d40e711a30fe76cf5699f" }, + { 4361000, "c86bf73360295e81a13346fce411ffba4dc323d3be426c87b501dd9f420f13e8" }, + { 4362000, "2eacbc20b28f1e8186aabc44134a39672478b71a53edd5c14ed46ec28affcdba" }, + { 4363000, "3c4ffc25a79f2672a8fe9545a7ace8cc37c3c379a68c08d1e1007983dc5ffb5d" }, + { 4364000, "5b26f472519688e5dab42e09ff4cd5471fd5ffc35c6aaee0fca64ca6f101a93c" }, + { 4365000, "f7a1bcc4befe45ccf209bc9c77592903800fd554f4b25798cb52664a4017f17a" }, + { 4366000, "a9543afc33ef0dbf16005716154e54f38242a88ba3e51e790248dd8d5faaa5eb" }, + { 4367000, "31e3ff777ec288866a91095014dd4e65cd9eeb75345ee04b35c5e5a6913f75b7" }, + { 4368000, "59958410a97cae54754d32361ea24b2c79bdda9408f01cdfa17d873daa8c015c" }, + { 4369000, "5fe1f68cae8b6614f4fd79a6ac98a142a8a8f66795886fd734350e6202fb5477" }, + { 4370000, "a64647ab32013ea7122c78c44c9bc83a931fc07db84fad9f2ffba978af1ec23e" }, + { 4371000, "c80070fecbc7b35237d412c6baa0a00d884a9cf7414c84d221f14c54be8dae12" }, + { 4372000, "7b95a1585d3a71325a0b937b9ad419d9c7a5cdcc4973d0254040a8f4903acf77" }, + { 4373000, "b8c91bd094bd294137c5f2e7017db212aee2c508236ccbc11e4c6c40415af3b4" }, + { 4374000, "7cef69c8ece32e9afbb68f15fb5d63f257e1e2da39ac19cda48dceb53d4256b4" }, + { 4375000, "1c102f6ced5576bdc5dd895b36cf82a18827d0f8613034250257fea3e3db3ef1" }, + { 4376000, "495d95ae5b36c0b1c8c0394ea4d1154e67d9dd9b2797a004cf54d96a772bcbad" }, + { 4377000, "23b70819e9d977b8fd44013c6f875c4e33c3abbe13fb6ec0cf1a10ea82590c5a" }, + { 4378000, "aef3b049b6910bca51d82c5934710082c1563d5f57c62d953c6c6debbcc7427d" }, + { 4379000, "d61204ba36133636c0716e1fc7ec2c66ed1c0859f3cae02701300fc47eb7142f" }, + { 4380000, "efcad025203d032aae22ce666755bf9c58afe49ea6b524aa1f5083bcaa09e8b9" }, + { 4381000, "9c9434dea093bfdf5d71ed7efebd1af35f313f94fe74069b19147aa2102bfca4" }, + { 4382000, "99d173e1b0df49abf8a45c342b1899b0ce25bca1a5ab067ecb74ef2c6c4b7ad9" }, + { 4383000, "1666fbebc5276a17bcf2dfd63799fe85e432b6b3ee6005dea39f21584784e967" }, + { 4384000, "773fa9f7ac0eb988b47cfc8db9d552cd1b7608c97dfb674143b9c1bfcbaf7f0c" }, + { 4385000, "6ce63bb58f6749712648a081d09f80c18ee3458963c3cc5c77806275f79e2af1" }, + { 4386000, "65b06c3162f2043ca3c2fe5861b958b124820d956478e75f3313d5768e76cce8" }, + { 4387000, "037e4d309ba1e3f3eb565ee73018b9b973c71b594f7a774913edf897d89dbe9d" }, + { 4388000, "65776041c392d1931b45f2a9527fbb4697440b59a5c06632b9b69fcf4aefba8b" }, + { 4389000, "319a76cd0888ae7aaa8dfb3e4852ff0fdd8d2282482b27d84cce9c9dc15f5bc5" }, + { 4390000, "2e691848272e63418bd54b20ea3a2c319e6cd7f9741129947378f1f6ac11e06f" }, + { 4391000, "b681b8ab393cb09d8ba3caf14d099c210c04d68bc6bf26f043dfeed32f8b871e" }, + { 4392000, "183f6990e3b2fa3df39296b12be93d5fad0d69cf2a39b80d9fd9ba0d38f2ceb5" }, + { 4393000, "ca32cda3d182db5015214af3de297f6bd2b4c329d84ea5cf42deb920b0c8d811" }, + { 4394000, "cc93370b9289e3090e08739b4e1926544bd7ae094ff654b653ba61a30b17d960" }, + { 4395000, "548794d8d53fcd0e7d2925af139a8767dce98ec7448e1105eed9100ee2782001" }, + { 4396000, "619346d3466f3728e38f94e339c511787c632f8a51e9d2da83fa0c5a80a04d7c" }, + { 4397000, "fdae13252bb5c94ec002b20b563d649ed13c05d0fc4f2b6bbe450120c5a2706a" }, + { 4398000, "52e87238d48e237a90b83dad561148bcfc1da0f42375bccc46777e8772558358" }, + { 4399000, "3cbc07a304c22d138315bbab51e3e9df8c62e59adde8a039d16b48e999d60924" }, + { 4400000, "c0ebbb2ad500cb8836738c95bf16f1cb33a4337d618af9f7c521b0a1fd26dd6d" }, + { 4401000, "7faaba03fa03addbd374a8320ed896c64bba3de87f96be23fbc5f78dc07122d5" }, + { 4402000, "5bd2f314e9d9ba78326f23c339fa0a8a5e915f0460c0189bc1bd5b87318fddb8" }, + { 4403000, "da4b042a58f316bc98323e15adb6e8a797b17205f3ecf74d024a3d04e800a3d0" }, + { 4404000, "03a274ee3244426918413912c514efba967241ed91f1c7b5857c0146f5874fcc" }, + { 4405000, "2404a4b810bfa58f7af1fa24f86839b550aa11d3c2bbc034692aff5e49783fd0" }, + { 4406000, "d87bb7adb05d16deeb05d544a4f68c645b7222b1d3f0ea88ead58cdfeef86e29" }, + { 4407000, "38c6f953157d17c50677bd80960ac9d8806603d5e3070729ae5bed043c2c4a20" }, + { 4408000, "5bafa175ffe57a08cefe93bfb33014b65ba96f76f9d7b523e2d3d00560117c69" }, + { 4409000, "e2da8d2d6f4987253ef5f84779e253a0bf9efed96af034932685cbc0f594efa8" }, + { 4410000, "89fab313d7bd856bc066d7bd4c05d94e2bb85ce25b96c6c0ab810abe64210dfa" }, + { 4411000, "e5c27c33090af953e40be9b0c19d61ac76c803b2e569f68fd3e673a917613d6d" }, + { 4412000, "c69834c6e460b93ef48db1f52314528b934fbcf01c79525263480302998e8d0d" }, + { 4413000, "5f4d71bcbaaef3b989d7128875fe6566e3a02c4a0e4b761a27e17c5b3e6138b0" }, + { 4414000, "2680421845547ed853521d8a9bb93fd02ff6558980c7d15d901cdf605f91e802" }, + { 4415000, "e82b92f07937c1139e97ee349096665e474093764e877c88b44f8c959f3628b6" }, + { 4416000, "c7ece07c8ecdf48bd790f4fe07d33b2899e7515aba4501e2772d0f82f136ae2a" }, + { 4417000, "10effd96d37c8e77e1c2b27276d72853a143bdb0fa263794a028c02915883f31" }, + { 4418000, "2f1cd618e4ffdb446288640523e02b0cdaa7644c317a8a9e7d5b5bbefe910b2a" }, + { 4419000, "1bc4049ef712e4c021c73765c64a0772efac5632f75323db0d153dc98e84f598" }, + { 4420000, "ff9870875a872d43bb99d3899fee32043ea4516ec4444bd4d74731402c72d1ec" }, + { 4421000, "ca5d17c25ca36b6cf5991cde201b2c4bd0c729b1d44f10a98676d7010f528e11" }, + { 4422000, "d9feab1e9dfd6f881e54771bade43a83414888b1221243936191a54277d1e600" }, + { 4423000, "c8a6aeac9637d9d239b42468491ca41742faef28f61156f33106baa14d73a029" }, + { 4424000, "1d53de21ed4d75037f61d40e3f5053c75a90701f277519247bf1842992d27882" }, + { 4425000, "20e86dc2ac9a4a83f3205baa365f5ce5a6a66e0e6edac15958c8208d4d7b20f1" }, + { 4426000, "4cd731136ab3d46bdba8d8c341dc422ef0164f7387ee4bf2b50440fad1ba4d8e" }, + { 4427000, "9e7fea95bc8ea16fea05913ef35cb8246d28830feecd559987334ea3632f762b" }, + { 4428000, "696a822801a215f3c27ecb33e381444d992b50ce1b9575ea80bf6dbd014f3e1c" }, + { 4429000, "d0d50bd8c9b756a0c3a3dfae5c41bf61a54c99d5e767c70e23bed0278cf54ff3" }, + { 4430000, "037db9a2ba112c15faef671568360be704d6ee625eef345490816eb7ad699681" }, + { 4431000, "dd4a70f167088a6717a384b0485e9a29e7ed4eab01c6140201cebb187e6dd941" }, + { 4432000, "11f6c2d1f3c1cb0f881d24c80e0ffa495ad52cb229d601d2016e91593ec31a5e" }, + { 4433000, "3fa4060edfe911e7db2676219ac475cf3ec958d2234ab5ebd88371694b90da92" }, + { 4434000, "9a25dc4a0d487fcf46c80d3553e89f3f94e2b098fbd3b3b87dbd779cc7b691e3" }, + { 4435000, "b92e68afd6e9069efd1949f89ac2375c1658501f8914d05b2035359dbb04f4a9" }, + { 4436000, "82e5f9efc9d5a9252a902e797271a81f1491c13d87e72a9844d48fc4b71a73b3" }, + { 4437000, "e08b33e84f7ece51aa3a402705bf2a6df30c4336c0860757cc81fba9b2affb6b" }, + { 4438000, "8108f8a0b545f35dd66b608f72c5aa52107ad9b66fded4f60d18b91fc9873542" }, + { 4439000, "f3ad12fb1e2a20d0a724648331a7fedd809fb0fa6fb63b8f7c088d8bbbee66df" }, + { 4440000, "290df1394ff337b48b73b4a1ce61a16451ecf1fa04209699cd29051c4a5937bf" }, + { 4441000, "275d936b9dfad07a5fd37ffa6fd96bf9c21a78bea3d2dba95ce41093243f3bcb" }, + { 4442000, "2ed5b5a127b48f1a7d190f7885e291c3f96ec9c9d1473913c243fbe909afa975" }, + { 4443000, "2c129c0de31108d58fd1999ea2f7ee2b47be0e174c94004ecee4da35e2b21d51" }, + { 4444000, "05c3ad8f68b1e6c6c9dd732d300265d29250b0d4722d140a3452cae53c26d0d9" }, + { 4445000, "20952d1a2f8728113f2846dd70a0562db8274cb945cc2107b8e247609712021e" }, + { 4446000, "97c8cb99aed41dde4f13eb3cb2a816524b7d8d32d4dee3cca13f211a2cb69b03" }, + { 4447000, "03c5999e603a7a4751719a45226313b2e2f8e705b1da29216873d71587e465e6" }, + { 4448000, "efaf5449d1307a18d700707df2693bd793ae8344582930c8a5aa34c12ed71bf7" }, + { 4449000, "7cd602c0294ce9b16b0a13a69c7567143fefbea0740c09e099b562c391d582f1" }, + { 4450000, "02e1df308d95fb26769bc35dc001789759db598de961b2aeb7598130f302fcbc" }, + { 4451000, "e30d57b0922c8dbf36152b46f3008235ade289973bd5dc73b151a2507deb555a" }, + { 4452000, "ae2f8a21930a7d039f90e92838616692e76be3966bd99049e68af165b3867026" }, + { 4453000, "e59b68e3d1ee22241190de532d2f94deeec9190522614b44358fe0dc4620a58d" }, + { 4454000, "79d5c45f954545b8038f8b7f66d37a7ff72194a6a0d066d8c2555a87b9ba54b4" }, + { 4455000, "dde1712fb15f1739712e0a7a914cfb7d4b6e9efd012e76bd0bda08c6c21b1721" }, + { 4456000, "b15d29b6f020c251254401d0ad87e5eb9befa4f7c0930d1aa38973086ad9024a" }, + { 4457000, "d36fec3530156471a87dda178926b46646e496db72b450f3d4b77d0900a30ed7" }, + { 4458000, "bf8811cf1fd10b82816c1de41fba2bea7fc628daa209daca24260613c89acca1" }, + { 4459000, "230e308bd66ff0952f6a19a70656ebf7203c6eb1a01826ff8dd86ad46877c380" }, + { 4460000, "555b46a6d6f0bdac5f7b82a99c0c239a3e89194ed17421aa28a571bf0f21f78e" }, + { 4461000, "f88decae743846c9f30fff047f674a2e54c0f90526215108657518f198748f0f" }, + { 4462000, "9b1d9c0ac3f0709e858e6ce034841a852fd9f1d02c4854309cf92b54795fcd92" }, + { 4463000, "7701931cf906a9bd4c26d857011117177c38530ef2d8366069b06c557583939a" }, + { 4464000, "b7b7221e838bbb1144fba71a761ff5d73d377bab63687605a7e7f481bbcc04e0" }, + { 4465000, "2d6a574e830898984bc4c8734e7cb5b83b75c222885c7e8176a6f9992e11e634" }, + { 4466000, "46196f16c655ec3e1c3a219f2f4e82ba31f200cb4aa775eb4f1dc27df5c8d4ca" }, + { 4467000, "2bd60d9fcf7676ac948df613b6ac53448dabac1c5a3e3fd54ae39612510b9778" }, + { 4468000, "1987298019a538b8e7abefa2b511c0b2c3891200d1bdef376e9020d91422254e" }, + { 4469000, "690669c008067d63fef666bd9da1823727feded06a17dec81e4b86968ff4c817" }, + { 4470000, "881a20bd4d246f6266871bf4ff765cc8d7b1ff70f0708e0c2b793b370d42fb56" }, + { 4471000, "be3e1437ac0e7298ed118925c7e9fcc735ed49b8675ecb7ebd27082b90e280ed" }, + { 4472000, "f0f1df0c3ee0f8f91d87d143c7b71934fb32c0372af0a8121d8acdf14f31425a" }, + { 4473000, "43b142649b311e559de1a515d2c9b6b594ffbbb37ca468f1f50d1dda1120476e" }, + { 4474000, "5d6e85ce4cf56e2a16d12e0c7f6453425a492658741c21ba6a99438ff84e29f5" }, + { 4475000, "0926a14c8e9cfb6f5f5cce664f9237f17899ea552ce88acefbe1359132d3cff9" }, + { 4476000, "dd99f5e8fe13d06c94af1150543d72333cd29773680fdc8e9a08705a3aaa19d0" }, + { 4477000, "6d21440c48f6a45bdb83d717835d0f32866f86954d8cd8db267418b5cf298319" }, + { 4478000, "950288d08ed534c3114d2b6f30f864ba18ae8395fa8ba17f9a7e6c72d63ec0e2" }, + { 4479000, "aee13617570fbd6fb75deef5192fa437059f553d98cdb69b7ec9fcd640bf40b7" }, + { 4480000, "3807dbda19b64a20c010b9309bcffc63809c4f23ba29ffe8582978943fea2d5d" }, + { 4481000, "eabda002034aa49864221ae3c023c51e0d7b19efd93ee69e467dacbb8e86d16f" }, + { 4482000, "faf8f1db8c5a41724e5bb470d7a20ce6bd0ed42de4097837701ada28a93cc36f" }, + { 4483000, "89c8cfdd64c05e8a91c5b3325bba548e860281041d400aadf41e17e46b9d3f76" }, + { 4484000, "b62fb62acf3fab1d576d8f45bdc8c490d8f26a8e115427d922f1acbf8ad11907" }, + { 4485000, "d4aa2e5d00271c0aeb02c2b52c0e379e21c2005823127e0f9ba1b1ec59115f7b" }, + { 4486000, "3b8108a904a52ae85739cbb653bcbb189622e935992ae0460a0d810ecb4efedf" }, + { 4487000, "0c5d011e4d77fa31d5d5c2f879fa08bf1e3c79aa51140e3550f70202f0fd1362" }, + { 4488000, "1a55136c2e4a070b20a922ec86c5350c52cda6c36f482ac38987e8c0084c921a" }, + { 4489000, "71608b77208cba5d19e2787984a2ad73f37b15cddb4647d26f73e1a398189dbc" }, + { 4490000, "b6f9a1ac0495195b4d98b7b9d8b8f3de8a5bef00e37db6b723ad9c19bd07ebc7" }, + { 4491000, "a980d97487dee899aea2ef084125e51af3d55b3e7a31cdc153ee15ee44e3a968" }, + { 4492000, "6ea15a599ad11e0e3eec4d2feb088a3de9a58ad98f483e123d409261f8e56881" }, + { 4493000, "66ed0a9b2ea31f76b39a4b473b7ada1a904c6ffc7498734a07c06da4a14bd818" }, + { 4494000, "4b9124d49edb0ce00cbf678c8157cc90dcd5dc5c03764b6bf8f6b17ec6dda3f1" }, + { 4495000, "03f04c787af7e1b7081b8d7e5bd2513ec3fe143cc3d5e34a211e22e04c50ea2f" }, + { 4496000, "db1020cb62da6b3f8a1ebd680653b286a957e1a4bc45108628fb321ad7a79eb5" }, + { 4497000, "17fa3a58862bd6100b2c2bf7928b37814504724d633962327e63573613b977fd" }, + { 4498000, "913783e7999ebe760ec7e77f45f5cad1370e389d5302161a3988a2efa9efcfc2" }, + { 4499000, "4324d7164c71eea278c2bc67faedf6f517446632955880d1d52241c4116e9695" }, + { 4500000, "2d4115e7d6dd542b986ba7ca91a3c2bb34fda1248e4a28a3dbc6676ce680c34f" }, + { 4501000, "bf26e5d94d61229dfc541c05a586ad0841eb8b232b777202fa8712e5936f4864" }, + { 4502000, "491627e5c2991417bbb078bc70da63666fb017a199ac26cd72c25e2c5f6439f8" }, + { 4503000, "b8a308e7cd75fb71182ed504f07ecfe37d649aaca09eef6f3add99e44e04089c" }, + { 4504000, "6a9e14d9dada402ea7b00f56dd2f22cbd95aacfde5283a2580a52cbe621be363" }, + { 4505000, "558266e45d2ca4c90002cf90188adeecfa390c64e03a3bb5de0fe49113286f54" }, + { 4506000, "09f7e6097b00b2925be201b39c972e3a6b56df227c109a6e59c7fd90421e2254" }, + { 4507000, "6a068f646446d31359282679636c6aa77c5eb9bc9ec2db3ddeabea960a61b442" }, + { 4508000, "795d04894152c2ed73480e7576369da83e2aecf3c19e5ef98d988def997d7f95" }, + { 4509000, "04ddd44135e6399ff55203e04f5c8011ebfe86d1ae9a7f160183eb757370858a" }, + { 4510000, "a62bbdda49766ac0c4c6611aad2dfadd8ea6b735f0bcc537562da44ca8f42c9d" }, + { 4511000, "f857050400297cb754288c16c4126d8337bd5bf35e15c06d2550773f8a04fcc2" }, + { 4512000, "643923996630963daad6af075aef7bb1c703bc6af78badf8fd2a69bcce5c2702" }, + { 4513000, "01210df1fa119130aef59de254ed51d3a9af1963b156931e6c515fe3aae56937" }, + { 4514000, "fa258ed1c3b984f025542f15c341ae8d649cfa9823721169c5a70a7cdcea0e5f" }, + { 4515000, "10b1181cc86dc7e226a7f913ef018c8b2ebe37899cec37dbe78bf9b02e2d833c" }, + { 4516000, "4e7615b5b8f03417d9e880a9dbbd547e8d0cce1e463fe9b05ed3a63de04107a1" }, + { 4517000, "088396833c4bde8729a6dbc8636652ec949a694f30ec88f55fba056a5395a32d" }, + { 4518000, "53633bd93e1a829b29ccd3155240173127d33f94b9660cf813f3b58c8e66ede6" }, + { 4519000, "fa94871d8ea09163ef0a32dce2e586fb19b6f18dbc71c6470643573d8eb170be" }, + { 4520000, "155e25d2674480674e983c9e46183928f1958a9b26ee1afb49fccbbabc55adbc" }, + { 4521000, "1985173a57b4627c57b7ffa8f2a89d7c060961765ddfc48ed2ff669b933ac9f5" }, + { 4522000, "b0ec6967fc8ec537e7034e52d4272187e964cb7416922c646f8c94ac5d3dc368" }, + { 4523000, "cf2dc108b1b1d5cda4a2056a27f36145ed493955f4e91cd7bed05658556768a6" }, + { 4524000, "d30c359094e13792c4db117f77d861f8afbc5cd348da68caa235d68c310dffcf" }, + { 4525000, "44884184156a85576289bc10c1de4dc8ee0d35e032f6b61c7e15593a88e5f28f" }, + { 4526000, "acaf58df03cd3b896a39ee873da7965787ae49166451f8c22b1f3500f6169423" }, + { 4527000, "a97dbf63288c2ae909e9f0daf702880c117ccc02eba248fed89598b4591de117" }, + { 4528000, "2e218fe99c57320574f8384aab69cc2f14c6afbf5a77e8e0af3703839b9bfd9e" }, + { 4529000, "b551415cbe4c4961ee0c172a11cb40004045787b64ddafd6effc085503062534" }, + { 4530000, "2cebef80fba24e00953bafbca8468ba62632df607c4610a3bca045b75cdd4839" }, + { 4531000, "643433bb116571bfb9ae1e9d6c39b72466379839fc9e588dbddad412e88219ba" }, + { 4532000, "124cc674777a2517aa6eff4e37ccb37c673ac8309ac472607d5d47d8c2f0672f" }, + { 4533000, "990ae92dffc1b9b5cc290dcb3cba4267485b28c8f437dc8e8b66f9bac71b50c1" }, + { 4534000, "f3699beb1cf4c583628cccb5fdeaf72fc3208ba0f970adf242af4afdae73eb0e" }, + { 4535000, "62df684214fc5461a631c2744eb5d43f81808719eb7c9c780f63480a8ea5cbc9" }, + { 4536000, "6d78fc1c8a13a9bc4a02cc62db1be5467f713e46a332014e556a419c4e46d8c0" }, + { 4537000, "144083e855f4e9b1acc433fa76e43578f826177ea68ec91cb9567c7bf034a7bd" }, + { 4538000, "ca98574197164a2e01b264c1f4649ca28303255d7aa31c67123d6cadc497e9d7" }, + { 4539000, "6bec417022853c4f57e40f44c7dfcf1e57b463765577953256664026ef917b0e" }, + { 4540000, "0189fee717502aa049348b4d79ca7128b1f1c4297870f8f8f5da11d45972d0ed" }, + { 4541000, "250f15ac209b094d2e0b6cc6004628eb7a2b25fba0807f367426409a5a826ca6" }, + { 4542000, "9d78e29990bab546867998bb3f9b27f794dae9cad7b2b1bc0f55479958bb9859" }, + { 4543000, "07a560757a37260ffdca277fe7140f000a1771b342e46b2f7f5a4685ee6fb03b" }, + { 4544000, "a1d51243562db785d43e5fe620bf6dc222f7389e3b1d3bc0296d66c62eea1123" }, + { 4545000, "efa0de866b8677f2c1e714e7c5bd23c929c396cb99b7373c3c98de3c9aee45b5" }, + { 4546000, "ee80c57076e5a647d02d91bd09ac4cfee1155261c177717613b301168b3273a6" }, + { 4547000, "657dad1b0ca2f9e709c0c1966518aa15c1fed0e088b7a195d2af9ea866e05384" }, + { 4548000, "3ba096cf7713e6863c295d41d5e4419400ebaff6bd9fc2519402aa31135707b4" }, + { 4549000, "224f509b791b728eb0cbc0b02055a8702eacb69e8ddd5358e18d8a7a87771553" }, + { 4550000, "a7e0648038fa299b413a3ff39511a947016ca647d764628c5f7946649b36f66b" }, + { 4551000, "040d0820a33431a86c9e87019b0bd5e45f64c0e9fe910fe587692bf8f4e7810e" }, + { 4552000, "18af95e1fc8dc69f0222b70517a06fc47c96ada51121be16b9e1925f66a07393" }, + { 4553000, "0fe44bbe6d9485a689bb748cd8c379be87d7423cfef264070aeb2daf12d466db" }, + { 4554000, "3a5dff91d6ce53608a1880fd55f066082d4eee8ce255475895dcd239ed1fc604" }, + { 4555000, "18ed7ee45b9b3fa01262fc3b8b4c31acb20ead813378fd024280c16e26f7e940" }, + { 4556000, "c1f682058ba625a7f5d81f12eb4925887e9774f74076698cae736c4f88d7229a" }, + { 4557000, "357b34747ac51c2bd05982b50d267c74d7d91f5c7d87ddcc9d61872cb81cf4f3" }, + { 4558000, "89ea7be1028ec5008f5de95b39648558e0c1d1fd94f352e5714e1ac86db06f21" }, + { 4559000, "c54483834a7a4da1433cf7c8eaa270298c404f7e4cb574ef40a169cbf549eb84" }, + { 4560000, "d5e6ab7f5697e869c91267f6ef98a1f1ec657236345866467c92e8ca671b9f05" }, + { 4561000, "6bb54f307271d978c421e7eaafbe058d13491f56c09b8a3f6dcf9080978c2ee2" }, + { 4562000, "24115c004b2c74b09a6173029c28328025b0842f0fbade238d7edeba098a06c9" }, + { 4563000, "149d3dcb5e04dda58eec73590c9fc9a6639fe3d578f47c7b14c74a92865db3f5" }, + { 4564000, "4101d46154e1f1f258ae263683588e89277171fa619a74a783b20fadd059cbb4" }, + { 4565000, "07599cc70aa9c71c62e07a3a2346498eaf267ca4ba8c9b0b3fdf8736e5d09220" }, + { 4566000, "eccbea64b705579a9c2e6c1092b81a6e9fce1a80931f1791ad872072d0ad126f" }, + { 4567000, "6dbc0e45b0bd572b15dec2ea757dcef5094cc6e297a6f1da390f95f913714b48" }, + { 4568000, "4f7f3c18155e042725501ca4df5e73aa07402e463d8b48888ec6e886bdefbeaf" }, + { 4569000, "1082aa44f4fce8c5b155b4950f445983d455c291ea05ace5b753d361411a11bb" }, + { 4570000, "46cfdf36586b7cd50b2dfb8dd69dc550bb6a9d53bf1d7dfd06d76504dddc81be" }, + { 4571000, "5276e14d62904678b4f3d34d3a868610f79a370a4b45680b9cacb2eef718964e" }, + { 4572000, "6ab6e20bdb1738b970d4b238c5cbffdf5603187c4d3feba325b116748da2607b" }, + { 4573000, "28ae605ad36745410769bef6b6ff4b9752854719160fcc9ccb50660a6708a9c5" }, + { 4574000, "a497e0afb2c6d29f603981f754be70dcd999b9c21d26a165e08fdd7cadd8aed4" }, + { 4575000, "42faf5d3de236d3ef3666fdc961c2b060b2c2a59e34fdb1c7434ee44eaa20279" }, + { 4576000, "bf94262c437d0d918b510555c3de31ed456fbc11254ee1abd436e0e81c8cfd80" }, + { 4577000, "c6b8fb2a74eb959dbdf42ee87ba5111eab67baa850855450f8abaa3994a6db11" }, + { 4578000, "2df42e59f31ee1dae9510cb0d4e00d3df48ee22faadeb83bca84854604c12362" }, + { 4579000, "6aab92d2beb6a15ebf72400e64631c811efffcdcb7d2a9d1fa8fdd03eb7140ef" }, + { 4580000, "9883964f86dc19b8b9f78d28b58e0d3438c7fc890ea501ff7aafcfaa978911d4" }, + { 4581000, "edeed95f80a6519a2db7e10b8ac94c8a8dde15f0f44ef2f8370cf82f5ba21dfb" }, + { 4582000, "d422e64a7ec7a748cac7f27f8511e28667ac818a3601d14f6cb9e3c96164f6eb" }, + { 4583000, "522817fa32cca3957fbaacff4377c869b47658a6d49e873987a1e30aeaa6d515" }, + { 4584000, "e6210941e451f8a5ec12ff91e5d23ce2a053e778e11af286849d456c5f0e442e" }, + { 4585000, "4de596157d92cf01e4ec8de7ecf31af9a6a41d82e3e7c7b299d7e453f3687b9f" }, + { 4586000, "3654705c0abe608e5172cc8987efe8ebb87783e7bdb90272f789a8af80366444" }, + { 4587000, "884b3d40e8a5f0919010c5970b8e8104f890068d1950f438138c2bf2b888f608" }, + { 4588000, "494aad51014e533f3ccc31cd0e7283a27fa0642260d3859db65044425a4af10e" }, + { 4589000, "84b6677aeb31d97a0cc8a0930a048e607a698ec6741ee45b5d11178f1d12ae91" }, + { 4590000, "a8ee17f655ce5cfd7e8b8e99be3bbf8957e62a5325922fc517e391882ce06152" }, + { 4591000, "c78f6d1f381105203bca79a65f176b6e42a897fabe8012b830b6327d6d1fbc24" }, + { 4592000, "b7a4c138c871525384371e37a4a3b0ba2864a6523d5c8412784a040107f799cc" }, + { 4593000, "477fe0ec04aee0e93934a2df3528d116f3f99f0b0521823ebdad2c22be9aecf2" }, + { 4594000, "325c1fb6eb32086402318c0a5e56246e28cca680ee862add64d74388daf12a3e" }, + { 4595000, "d97ea7c5055921347511a04895f26ebc4499c6b9e0ea61292291f5d0a5e1215b" }, + { 4596000, "ad73dcaa1e392f97ac75071dd0271563750fa6c5d263a7ee9a73947069e5d610" }, + { 4597000, "8ff8ad0397a994d1ba7da94e6d4ba5077410de104e115d2aa9cdc4b65286c24d" }, + { 4598000, "e9fd1ea844b98615d7818b65562a680ed4f8ac03d5517f756744c48024af8bf9" }, + { 4599000, "b63388bcce44d49b9a0a87cf1ad75ebdcf3da500bf5f3dcc9ee24ef013a313ed" }, + { 4600000, "a392ba71538958a3ba400596d5b0dc422bd5c9bdccd85c0d907983e6ae99ae7d" }, + { 4601000, "e44d75d371ffc98971cb9c8814f0c4d876e170db4987d1ef276fe07459e91f51" }, + { 4602000, "c693808d0f938159b10623c083aa18fc1c500cb7ca518f389cc83ba351800760" }, + { 4603000, "34d29e2754556150711028103f2ef13113e8397fc3354d53db68f7f7dea26930" }, + { 4604000, "fca7d86c007d676ec587128495c78369c8388142aba3f2abdd8a2dbb9184da92" }, + { 4605000, "5a7abde153f52bff9f727a4c4bbca117f1690eb86daf86f621d09b58d54ecfa0" }, + { 4606000, "ad493698b0852b200116a59fe38de5d5848dff5c2bf82ed45a6d352b71ef7f5b" }, + { 4607000, "45861bd1226235aac8626c25a540d6ab16a0e08c642b982e19bd641db00f4934" }, + { 4608000, "6d7cfb70494735094c80c7bf37b48f3080e41a6eb153fdb0bddd209c66edc7b1" }, + { 4609000, "38efc2919089c5ca16ab0dd6860dfc2a287e17af38215be7e70b7450b63b80fa" }, + { 4610000, "57dc2ad211a8ce6101a8fee8ed5d96a2ea00cca1afc5fc7047c7b006ed988e1f" }, + { 4611000, "1daae698126cc578edc28973b39b5c63e36ace7e62443473a550372dccccadbf" }, + { 4612000, "625c20442c941af851190170b2085fbf83db41227cad919490ce5886c80b0a86" }, + { 4613000, "d5014df020a5c34263bee430e6a9127d8db5cfb19432a6f29b90d5c47adcb84d" }, + { 4614000, "82bde0a225e523385b743c8c18aa412622622b615f05b8143f5e994263993ebd" }, + { 4615000, "dae723107d37340b8d3cdf627f078fbbf57d4ae73fa0a16dca72e27435b0b34a" }, + { 4616000, "75c8b9d0778dd8f543e1e1bf9ba8ec488e9a2572adf6d9ce409b3444ad527416" }, + { 4617000, "a89de0e22f25a1c7b5eca66c0c4f1fff9508a12d3e056e4b52de82fd7bba699f" }, + { 4618000, "ce1eed7f21976f2e525b2f8102eca77d807c5d3dff534dfa562baa45e0371590" }, + { 4619000, "6739c88b3bd5f6d853566407f2f4af07d59a8eefc05ceb23f80c726d568aeaa5" }, + { 4620000, "7e5157f42c260fbe9ec7c6088b76a92077cebc5341f557203274f2bc7f8644d8" }, + { 4621000, "901a98221a6c9a72f824ed784a4e0356231a221b2a2ea2deafaccecc849c7c4c" }, + { 4622000, "9be124cfad4aee9176d955ba09adb0afc3177657c6ab5144c194572ec7124a91" }, + { 4623000, "311199af4a18fc76abe469a72dafa4ef0dfb1a5b361c0c508fe5556c70394b97" }, + { 4624000, "e5ce76c2c56f45cbbf0a6eb15b5cbed3eeea7695509fcc7b42ae548f9195280f" }, + { 4625000, "e18875ee9cde685d2befab50103dc86ad9e55bf9928de9e2594fbb7e3c1dfdcc" }, + { 4626000, "f1c56c932092bf54db545954bd042b1c409da2e3ab9506e778cde47edc1363b8" }, + { 4627000, "93f715666ed9b40f9215aadaec3d05812a0aa53e3b4b6e7e0ee48776545e27b0" }, + { 4628000, "a3b49735f9d0f52effb5dfddc6469a637decca393eadd750d991fdc1386b6188" }, + { 4629000, "8486d0de1254752d74c3ae62a53273552bd65bf2e6ad025a76dec8e9cf5bdf4e" }, + { 4630000, "c2063b7d4ffe9f3e87b6dd69b82a23984805e6a3216428122bd09a23f0fb10b8" }, + { 4631000, "030475a0fbd81b32feee902650fa5e2ad9507826ef61314974a240f783bfb567" }, + { 4632000, "d7215096a190863b25e3e3315ad485a8fc150cb92e5731fb42e0e5744d44cdec" }, + { 4633000, "df4b2adf2bb39a27a4ac479c85d4e5e90e6e99ee9404e92bc524b33d892be1c4" }, + { 4634000, "e6084d9b60358dbd5b51381ce644400b75d344a897962c49e9f07e34e71a058c" }, + { 4635000, "e904cac1fdb2fc15cdbed585a84be7b1cc76ed0a47f9e75aadbc85e1e20e6c19" }, + { 4636000, "63f0b166fdb61c4c47d883fc1ea1cc153c50b0525e2ea4ebc40d366158698918" }, + { 4637000, "6d4081298c1df9e0439a45ea3b6c2b20c9ae2395d607534e051388fd3e677c3b" }, + { 4638000, "9707864fa555e33a6fae1e26619070b23de14a5c972e5a59453c44f584886f47" }, + { 4639000, "f098fff6a006340b755e32104566aa9efa2457fee0ff58fe724fcc79ff57db4f" }, + { 4640000, "09fb092882393590aa93f2c9a2327c9dae5e1d45b09a2edab18e5a5b750fd090" }, + { 4641000, "c07fc2367e2a6ef690312515f1fdd4214ee1813b722d0d3a4d95432f79dea25f" }, + { 4642000, "9e1d450b6cee1cd16ea872ada15e60b4abf1f1543fe6ada9b510ce0a3835d613" }, + { 4643000, "537da5a4ff7f5c3fb25772de37ef346709dc1c9ec5cbd5c09f5ce5274b59f7b4" }, + { 4644000, "63cd25352a4e91234f4c4d4b3060f2dc3e365be75f6deff64eb9961ca83ee5cf" }, + { 4645000, "387c820ee7812e15dbdae2be79050e448df7565b7edb1d25839e93e516088764" }, + { 4646000, "06f583e64e225d54ca6d09f9d83cdc1e4ef95fd7d394f5f4b55105ce6700f4f3" }, + { 4647000, "e417363a1be9fd2e8a9184ffa2e0cc7ec022a0c3bd5e528a1bd264f269afe88a" }, + { 4648000, "497031ea3158a97f0ae06a0107e3ae096660a5af4478d5e4130c01b1b725625a" }, + { 4649000, "65e55e00a101adba0337fd9f940740e56f168e31fe0951cb88a4618a1c253c92" }, + { 4650000, "543b2d16e5b275dc492756e4f548f7328a080f9bc41a3c2b4bd0601c3eb933ea" }, + { 4651000, "fb49753a3f6477a0583b9e3445bca1b47893bfd421f54356b643a385666118bc" }, + { 4652000, "294f44c46a178f4c369002be79b9e53fce492ac96f6689c1514b624729056988" }, + { 4653000, "817ceb90a849e4eac4606c898b6c007a2150b1f42a76c81f406b392325ec30da" }, + { 4654000, "7fd82b594ee3cf522e043b7a583c401e3f11da8e91c455053843e2dc522245c8" }, + { 4655000, "81dc5a0cf2524dbf96f489b36c1b639507fd0987fc4fbddfa7776307553ce49e" }, + { 4656000, "41eb85fda7a3ad386da86b351b576897daedaa4cb7d309dc51497ca1f89961f3" }, + { 4657000, "a9ee7d151eac3310ff0494c6e5dbd8d29bb7baf96144972f55917bd5cfa27eb0" }, + { 4658000, "38ddb1059fade70b20c1a1e2fae1e17497fb19512a2160dc494d7c95e9b0b7b5" }, + { 4659000, "ccc6daf8f4630e72b3793d824026e5472c455b4ba2f9ce76960cc5db9751d222" }, + { 4660000, "691ddf3ef1a16ef66f759f8760efc40d03e1e24fd6dfc5a596b8ac2926a2c76d" }, + { 4661000, "4e81695d80308997390b71cf8ae810cd6fbe654123dc31ea7735f04078deab6c" }, + { 4662000, "2ef721785ce1f0419ec00e00c3bd6687c87e2261157b6a91ef4a8c3beaa20bcb" }, + { 4663000, "665b96867036902239f005add9632b011984ec57aa71bdd56a90b6e2128f64e5" }, + { 4664000, "c7add414331fb06e50120f72ae60526f89d771107ae980978bd2cccd0d284dec" }, + { 4665000, "1b94e06e6430c1a7a0650c7666e585daaebfe42334af814ab4ba0fdba8849290" }, + { 4666000, "333f221e7b1d5a8d71f02d9a2c3a28ca141e6ec62124f89c72d2839f8ab0232b" }, + { 4667000, "f333553a21fe612fd1ee5e03a0b41362ed26261ba9284a8bf570abb6d324b16d" }, + { 4668000, "0e4307a64e1c48e708eb59a2b0187d2c3a1f96e8d9f04fe363fd3b2d4bfa4898" }, + { 4669000, "71954118a7e2b6310250b4c8d238b7ae8640fb2cbd02524315bafa664c0a876a" }, + { 4670000, "b497acf755089a9fc6ccc2b103d19ac132b1fad380947844d6cafcbc2e800e8c" }, + { 4671000, "1e847854af4c21f4561a3195a105d2c065af419bc3396da9dfc8566f5d2f450c" }, + { 4672000, "8a3e6dde21a18783266722f91bcb97eda316ec6f7974e9ec3c4a4e0acf0cc47f" }, + { 4673000, "fc447c1773b62ddd15697dba2cae5a0dfc8fb928b25d14c927f516dc7f78de9e" }, + { 4674000, "94e3145307e4677e83e58c651db2d7df316b689faf53cd6f1eab502e57b8127b" }, + { 4675000, "24b5dbb37287c4e946b0a8aba33e58be9381c9da40a81786810ca26deb60cffc" }, + { 4676000, "954f48ee11ff98fe0412f59d8b5a1951cb432b01fa714bdb735591153cde54c1" }, + { 4677000, "5bc3dd718fdc56154a411df74333720dc7b4cd7c5386d17f6605f232b7723a4f" }, + { 4678000, "cc7faa0812adb9ed2abb1cc4f187b3bffd8489b60e1cab1456e5dcd70688dc6e" }, + { 4679000, "7e13ce39cbff032b48a135a8e0035aa46037431cfe492aad464cd6f52e06f0ee" }, + { 4680000, "f0159156ff80b12483798d20893a6bdf4d5238ff73f4ef9a180a8b41e8c5d842" }, + { 4681000, "3b6a3f54fc592d165693dd6eeabe6eaca77756aca461dfeed2918c7ae9f37ca7" }, + { 4682000, "7610f0720e132019d02a84076c1ea8023076b5b16ca17b50642ef2ca763bff61" }, + { 4683000, "fa7367c5808437dfd38e7fe5f6e35dc8c6a9692f8a0b4adc626031d8839a40c5" }, + { 4684000, "75f4ddd51c17f5487bbae787c6d52b0680dfa74655c7b75425d7d92b27d88aea" }, + { 4685000, "437a3eb5dad593760a34eaceaf480e0baad6e11baaed5f55ffb9bf06a6cac414" }, + { 4686000, "f6432d479fa102e98afe5caccac6d2f757c9b8deef8aaf5a2e117437b6471403" }, + { 4687000, "117edeba95352ccd944c9445c38486ba753dac9185fbcb2c9a9a4eac29137bc9" }, + { 4688000, "76ba631dd5e5e550e453313bb91fde1ed34839f0b89af49986a06279b023d2a2" }, + { 4689000, "56c931b08535fbfbcab73d341b554f61e645fa9193627c440a9281e920c3596a" }, + { 4690000, "a977427960eb93711f87bc930fa2dd795990a0f64b434f100cab3b56a5a771ed" }, + { 4691000, "405f0c632c8c17d854bd888fd84a85aaa78126f383ad3200cb69bbba11e8b275" }, + { 4692000, "6b5ff6b8caabd0dc61549d6c940b866f29ac2d097fcef185b5173a65603b412e" }, + { 4693000, "ea9a1e8e1e46f5d6e2b28330d70cfb19bd32d222f9c78956572f1a9c2bcf1ff6" }, + { 4694000, "c2dcc1d94165b8d23bb5175eb4d68810ed74bc0b637d290ac30b0abc27e1c70e" }, + { 4695000, "1e808c2b53e39f4807ef747f648690fd05a448cd1e04a68a41ce11f884cc354f" }, + { 4696000, "b47a3c0f287e97975a5e253ce62ecd1eefabbd81c7438dc88ae04762e7b4c9a6" }, + { 4697000, "29543ad2fd5eca7921945b76b1957126305097d88bfa30f02a7010ea7e2bd99f" }, + { 4698000, "b514962bea7476bbf106398a535daeacf66f7658ecec42f05d5cca59b18c10e1" }, + { 4699000, "c11cb2dabf716a3f84049bd9abdbfc33d30c0f839a9b25f552505035f99c105a" }, + { 4700000, "a3e00b58554dd7bca88ae918bec6d0f7be902f404af84c9393bf758cd9773d9b" }, + { 4701000, "5438f1cb7d82d20fad35100a5d018482c06d1267c7b637baa3d8572b922db924" }, + { 4702000, "784c9452ff1b73af6ab79a7a4488a9315574b03e952f8abd8c8a3c6615aefad4" }, + { 4703000, "b6271f17dcb863530d50e47cc2db4fa40fe7a88276d03c04b89b1c77b38cb412" }, + { 4704000, "c759a689938ed605822a7b2d8985b572781d0533349e32b5f88dba1446a5f337" }, + { 4705000, "4e34d1c0f41d5b78531c08cb1915975ad52866c359c000d86694235a507548fe" }, + { 4706000, "f2d0ee4854652f434672549cc51d6d5e7dd5cbc473cc8ef94350eb208b2236a7" }, + { 4707000, "30b453365b3beb710fa553ab3ee7a155958a661928c2b630687c9c552e763816" }, + { 4708000, "44a34a1a38a48f0d0675e647e81968d464b9dc8707a0eadbef99e7bd11815238" }, + { 4709000, "f38cb29a747617bb58b21e911464eb9fdfc58e12ea3b3133b9239a627c5a5c06" }, + { 4710000, "ea613de93d1520321032ccc8e4574d10b14eaaebe0edd4604921285bff88b4dc" }, + { 4711000, "8e79710dfc6aab25fb0e5e287f828cd51845a5b7453ebfce7150363efbeac1bc" }, + { 4712000, "2dd71dcdeecf1db65d39243f40b675a9db9a4824d48732ab68df5974fb157cc7" }, + { 4713000, "4a6a774b7390cb5a2b3cc55af7a3b64c515b9a3a271fdcdeaf0759e4bbddd58f" }, + { 4714000, "bd94ad36097bb10242d2bb46e4a894056c08566e9d42ca51f42bab1a84fb0e75" }, + { 4715000, "b7187ecfd23d1d7c7b8d925566b54cb1d10557bdcbc1a603c8a8b0dcdb5ab441" }, + { 4716000, "d4a8e55a5f4d781387b9b36b87f09a91750b856b9498036cc4ccea62c56c2039" }, + { 4717000, "5bb92c73206c2b508d52d121a6c9de67571bbfd53992f0f29302777d880925c4" }, + { 4718000, "061ca389fd6bf8e210a42e3e4ce299cfdfece8025f8c99d82de766dcab00e469" }, + { 4719000, "6db0585be2f1ef83de5b89639768a216ed8278cad1a2829890096c44a97d28e6" }, + { 4720000, "ed4af16846753121aea1f975aec3013c5981cade57a159d4d38ad32f22d0ebe2" }, + { 4721000, "01ac93ca757454cab16d0440595e1fc4ed7d1b754574978b93db00c752ecceee" }, + { 4722000, "bfbbc4e8007098b8d5cb429a8abb75c55ae66c7d031621eadc7884eaeee65f4a" }, + { 4723000, "4e05aef16272fc57831f8261c7f725df26f67de0368443d82021b92ac1fd92b7" }, + { 4724000, "21685a86d062763db407b5d74dab8b13fdeeabcfb79b2c38693c206b3681083a" }, + { 4725000, "d5b9d5bc720a73279b7ebb1eb8213015d2cc3ca50c665abff2637b82d9de3a54" }, + { 4726000, "407a91a4a344175d9a273e39cc2d136c7c818365a6c5a09324e479f7e8cad280" }, + { 4727000, "6b04c93da4f47d949f3625cabe8229e8c00794023f3eb4c8391f36e063add82b" }, + { 4728000, "63dd4d5ad188909273f8f249e83be22bf5a8115bd1299916c6a1d50f786fd166" }, + { 4729000, "8b1cbc73fd5bb806a229f9a0696d6ef8e01a3dc423fd218baeb568ab56bdb98c" }, + { 4730000, "e70bbec7a4495754d94f20e498f9f348cd5dcb5382f15e93e37cdb600b2e247c" }, + { 4731000, "78e3f6a01d061eb34531e20928cef4ee590d3c6a429765a6fff2a46a20a70749" }, + { 4732000, "7016056c57d7579d6dd40e137bb9c993eecef42c19afba4ecc632ca9e2b76778" }, + { 4733000, "c714010b90c2a1f31d2d35126ec940fb4023863af5c01b2f72dea1407843819b" }, + { 4734000, "036baafa3d3ecb9802438d0b5bda5be09f7cf970e12acff82c310b1a633ade33" }, + { 4735000, "6098981a0159b43239cfc5c648d61e834f06b9f01fc7a8deb9cf7107e1422109" }, + { 4736000, "da69d6e87eff429cacd4c0b2599ab06bdbe54598e6a0a8c72889b8efde56a52d" }, + { 4737000, "f65589963b9553a9a23a10938f4179cab94cbb6082bff12976aa57f7372e0b03" }, + { 4738000, "ec8542b495cba8e18d0c550069d30c8c9779cd1b96514a6e34af97f622d29648" }, + { 4739000, "d9935e0719e5eb7a10f0588be2bc582eb855ba4d82eff018a87639ffbbe8b0b1" }, + { 4740000, "51d6cce6690d072f69afe75957d269f2f7d4de90a82689ff3faa828be3d8c2b5" }, + { 4741000, "1f3b3cbbf85993d0282c4a4341601e16acb84deb2013271ddc16fc34d16ef4c7" }, + { 4742000, "09f905cc15b692375237f7449ae9b5fd2d2bc22ceb64345b3b1d0458c077c48d" }, + { 4743000, "fc2770aa986b7efb991386f59b81289f0b250c8314df8ef26030d3a8464a0e69" }, + { 4744000, "31b33350b279b82873c5a1abc84f442ebf8ced3327169ce5ce0b82aeb027eb3b" }, + { 4745000, "74041c55613e4a7a3b93b0de02b591337f04d184895871f66930e268e8e225db" }, + { 4746000, "a671a0df445e53b08ec66a30961aac5227b8ab1df2186f53076b0a0a1eb50598" }, + { 4747000, "1fcb092d3399429be19efead2c5cfdcc5cd374a61d1c8f83c93667027ad21b3c" }, + { 4748000, "89a960f3f082b649752d5861c02718c5a0af9d5ec91930877c3cef1962087c63" }, + { 4749000, "71e77253dffdaaac32a519429671c000f7b4700abe1164017478b302fe31efe9" }, + { 4750000, "040f666510ac3ddf8a1cd73c55992416061349e576ad8784e7ed628d5e698e98" }, + { 4751000, "1a25ba117b0f2e8583d330bc072438ae36de280e5b31812bd0b23adee77ab2e1" }, + { 4752000, "d78b9b326a8f08257b2653c32dc7dca09861c6162093a13ddc25709b9a11bf89" }, + { 4753000, "06841cce98ac7e6b256d188182b8cf3df309e6d99e46aa02dd36fcc810df882e" }, + { 4754000, "29e63f3cb92b9689762b8e9610b05ccb386b56beb3e8c793255f741e793f0271" }, + { 4755000, "a1ce1717d5a9eedaa81c61577cce0f7099c929a836086e7e767b51bb90ae03d5" }, + { 4756000, "f8998433a6947b2aaa96e19e36acbffa614cf5c959126d8e3aec744ce5a84380" }, + { 4757000, "c466b4de1842e262402b5f5c2973cb2364fb21964159d7129b905778dbe53342" }, + { 4758000, "94f013cebf0f4b0b04b1b2756eaf2c400d22d014ea369899472a781d4ff7f1e3" }, + { 4759000, "9d4e07c62106870002124d116e91d465384642d0140a635f33913faf52102c30" }, + { 4760000, "0624fed6463eb3d51d174a89d59a6a6fb077eec757ea395d8ebe854482503bca" }, + { 4761000, "d8c705a26c77e3e2d27574f249b1dfa2112f9aae3617fc39c33334a7b7471526" }, + { 4762000, "77b1c9126a51e77c60983f0a57c38fba9eb2cba184aaec71b76e46ff94e8e1d5" }, + { 4763000, "afed409dcceea04ebfbdb5f030824ee01230065c35048014f2334d08a43ec5e5" }, + { 4764000, "02f4e7bfdddbc6069d5d4e06ff10d325d1b6f0ffdb77d99ea9cc938dfeb949e8" }, + { 4765000, "d9b37f523fb4890afe6c9dc7b2106b2e8da3ab2fc883fbc93e43d2b2be4b4706" }, + { 4766000, "a27731dd0edb55dfe3d6886ba6e7fc6b8f15c8bc5392e379ead119779d5cb441" }, + { 4767000, "b4ad187b7e45b52f8948c2f038444b580ae5947cd6e6278639c420e47a5f68a1" }, + { 4768000, "eb424cbbd556e3e1173092a5151893edbabdfa59f68ae9072f9c7240dac8c241" }, + { 4769000, "bab5dc28ca6630abe58025a468fb5989b86f5471e335acf677dff5fd244b8693" }, + { 4770000, "8443b7aae5475592536378095054f6d969cfe4b9992c1b6374089fe585abe4a1" }, + { 4771000, "be57f81054674c0b9a8de7e57f1959b06a68954b9424d892d7d55df704533638" }, + { 4772000, "ec05203488c9988e499ceedbc14c78a2b60937fcd6737fd53be1c8fa11192057" }, + { 4773000, "7244619f2b60fb948ca92703bf2f91ca91d08a61f7dd12d51c78f8b65a96547e" }, + { 4774000, "cd214542bdd501f76d84f06057b78615fb0bdb92b482d786a0bb52fe227b3465" }, + { 4775000, "e896755574ffa62507c44616e47ba62229b71cd10f891b2e74767483fa70ab6d" }, + { 4776000, "4d7a1d8fecfe10ce3015eb04c1a41aeb8011c6c77e2e5006a0bfb17d55f841ba" }, + { 4777000, "4fe98d756974c2f0b8b6860f20f61567b7b3cd71e6b5c93c8d7ea2626afef85c" }, + { 4778000, "b2ec95daccb2ec5bd92d27fefa4b44065cc5a68e6c54054f6d24ca0352552cc1" }, + { 4779000, "2724829359083e1b7eaa9e1c9f0f0f7aa27d2bb190bf6a28319b919aaa933183" }, + { 4780000, "2b1a778938e41a5fac2b5c0ecb1c11c450cb0b60d55bd059b7b0725afed7f360" }, + { 4781000, "fbbb83aa04c53818b8f66036edf3895b1fd7dd4b3a37af3041026f3142300671" }, + { 4782000, "42fc80205b793d17e9dd0304de0ca9f8f9137c2801ab1069bab7693ea983992b" }, + { 4783000, "d73e29b02777ee12ded66a8817d4ac77fcd579d716c00b9f75f5b999ac10663d" }, + { 4784000, "f9a791091d9936a0a6f3dcd7107cc40d69768202697f1bb585a2d1553e0e7dfe" }, + { 4785000, "1521054b22854679c52f11ddadfc0cab33385760589786bea9be831477833ccd" }, + { 4786000, "a5c76850c316f4177440f8be09018d102438b213b2c59abc5d04181dce96249e" }, + { 4787000, "801677e4e5ae5d7bcab60a11e5008921173364b2985e5cc85b98c5a4839687da" }, + { 4788000, "fd0e005579f184c3c3eb342673be6e5c74bcfcdfe21fc4d9b4bb7e02219dbda2" }, + { 4789000, "900f1d0271642f2c323e4609d0d3e6ff74385c85b2bc49d0dc4352dfbc4f9f96" }, + { 4790000, "bb2d70f4a75ec8247155b6734b717cbd0ab4375bca4756ea9b72b5039037d19d" }, + { 4791000, "d9809c45d64661785b6a79a877ed4b4fc54ef6861fb122d8fe740fe5406b3d27" }, + { 4792000, "274ce4133a842c9f7dbab0475c9ab593e38039b6289480f2675a28d4d7f203f1" }, + { 4793000, "d8d6141d324d50a597b105abffaf3be4794c976dceb2bb32fce65d1c5bc2c203" }, + { 4794000, "f4d4ff1f44725c66b316ea98632883895358ce315b6d43263033375b051c2f7b" }, + { 4795000, "29447d4684057cf7c314335a83a07a503c613a597d5f0f62b67081042feaf15c" }, + { 4796000, "7889133f412603f043b7b28613a68186c0acf72a499201ac2ca58cf33e15ebb2" }, + { 4797000, "78b0949a095f915831333bab616fffa0cd869d777f44d4929db685f7fd221f17" }, + { 4798000, "ea63d4c4315c30628e1f0f78c167b1ee896357cb4f26710959fc30eefe8ff94f" }, + { 4799000, "50a531d32a2d831919b7ae8ae72d6237f31058c0883f89f5fe9f305ef81f080c" }, + { 4800000, "f0590250dccecc04bf8a6148275451f5c7e14457a266a40975f434940abab6e1" }, + { 4801000, "eb90f1ff5f1fbff4c6b716229fee8bab435e3f468c61c1d28e3ad8a0e0db88e8" }, + { 4802000, "b14045b4f601b9036f1488fe3e646d806b2a0b6676fc63b0c4f0ffaf5a80cbbe" }, + { 4803000, "90cc0bd0329dc89f7a21b16205ab61f07c441d875fc89e722dfc54ae23e25303" }, + { 4804000, "49d672cf38bb00bd18e0d29bb57dd5f66643ad64c76e0e06a9cebfc505f33172" }, + { 4805000, "bd5aa9df6cdc6e9b22c9d7282d1c885d56abed5922b51617f691135c59bb81a8" }, + { 4806000, "e33403d2afa1a13c68a462e33d9ac39c26a5e2d0b64a5fe7f907adee18c3056d" }, + { 4807000, "31fd4b753bfb14bfe2cc02c06e8e1181bbd2b096c2d62ef6a8ee3f54cdd4d636" }, + { 4808000, "6587b26e561e2dcd5261a915602de2bbbc67db602c5b5509217246a8434b10ae" }, + { 4809000, "58603568524011afc0a2fda39bed927546e88f8df85868a193657cdb8af1e1f3" }, + { 4810000, "aa7267b9ddc9e1951c9bc8cbeae801cd701b89add502a5a88f79d8870008dbd4" }, + { 4811000, "698765668268f1c4b2b3af09dffa3b6b79506187b7a773ed5a9ebf8e5579e5f5" }, + { 4812000, "1ce29867e4a990d56967a1037bc1f92d7f4d6460fb34d848e39bb111e315a7c3" }, + { 4813000, "91341eaf795e497a44f119e13e72485145cf3571edc9339d7ffa8152e64ff399" }, + { 4814000, "27699c40354d743e7ae30205f4b22827d687c945bf41154e171c485c6efefbe4" }, + { 4815000, "3963bf20bf47f2b0672482cb753fa13316244ac90c6a49a482098d1f662e8a29" }, + { 4816000, "37abab67e381cfb1aa08d27febfc16ec089862adfb5c484cec71b1c502e95fca" }, + { 4817000, "a7b109ae28f0fc0b99712b6f1146e7e68758a95ee9ef19caee211a82cac2de70" }, + { 4818000, "aaabead18e1cb38d3c034d52417675be2d90cc7d3ca7e1861d94a31383ce520a" }, + { 4819000, "12ac9f17df8dfc80d6db50f85264727e7551f6b2404dd22d9894f63ca2283c4e" }, + { 4820000, "cf593cc69928853a007b992d149b49bbe8b9fd7306b7e71aa444285eb0f9060b" }, + { 4821000, "01845784c527f47f2fc490b113915056aa64b7c2bb18ebb16fc03ca9b214c2ed" }, + { 4822000, "ecff88d4131de598cc2705757b5bd2ddba5ca0d128b7d37f19fd26fcf6fb61c7" }, + { 4823000, "84e5ec81fa9b2c4773458aa397194144bf49c46b35ceab6912f9e93b805d0c4a" }, + { 4824000, "d66e125ef0352bb18c84d0121330510991d9a0a0e3b9038321299da0a08fd63e" }, + { 4825000, "e16118571ab0eecdb8f16edc8f50012a420145ab9846b67caa76cff6840af5d3" }, + { 4826000, "cafc5bbbceda9bca53efe4c7b23115c806ce87c5ddce1003553224800ce3c653" }, + { 4827000, "c3382014fd8638cd477526b89fc36d969022a047d974e8abd075acb7b91e46d4" }, + { 4828000, "9cd6a099f4cada28957868906f39f978c03856f960f1223733aa3593cff4695e" }, + { 4829000, "0b65c550e21fb83ed6f5be7ce37b3434e6eb22e2268afceae15b73914e2c74d5" }, + { 4830000, "b9b464ee2119557c72ad011e5eb72936ea6415cfa685fe53595b0e380556456f" }, + { 4831000, "6cfdb52d578bad7ac0ab9455440192518cccc170de22f250cf3fdcfc46ddec62" }, + { 4832000, "9e3b4536d8cfd8b45e83b9ba3ef87d35365bfd09cecd104a9ed039f2b30db006" }, + { 4833000, "828fab8e10e4aa69c5c7e4ebde6c602e596787988519ecb009b9d2d131470b5f" }, + { 4834000, "b499523b4d118028e40e602c593b33953313b030a01195a3b758a0ade4c00f12" }, + { 4835000, "f09ce6abd826a61007cf70b9588838f5186883fba6c798113fa269cded7dba07" }, + { 4836000, "0f6e5004314e2f86af5880624cac1aa085e9d2ef4ca6bcf9414434cc9c4127b2" }, + { 4837000, "73db3273a1ddfe2deb7903272c6ebb069ba5d6532a642a18ca0131e9fa1a710a" }, + { 4838000, "c83735284def92b227bd7b1322566d519a352360ede9eb42534fa3a80438046f" }, + { 4839000, "d9d0491add38df0fa3792016fa9b51448c6065f6639b655394a8b2d5443a303e" }, + { 4840000, "1aea12fba47dadb0d4d39d8a189d361eb13031d3eca3269153a51b4932d59a60" }, + { 4841000, "d8e7f589808abcfb943d8b6caf392a2030b96c1cf53e6c68f26023a3e7d51f54" }, + { 4842000, "df161b4a485777e7e7a7c9f0ae311a2ac87dcfc450d790f69eb869e5f4b0acc7" }, + { 4843000, "1672f328fd71d35186314daf1d9eb4c24c38415eb2ba9c7537c63cb8bad55e76" }, + { 4844000, "0d1650ecf85f4544da9a624041471f6d3ab2fd12c34c7323f975a1f0f5665828" }, + { 4845000, "318c0ae5add75b28c538af76ac456397d2b33456d446f3459079f7df9e15d8f9" }, + { 4846000, "3f63aba618c4666e7ad01f3c8469b7d6986da5e938dbd40d60c58617d4657961" }, + { 4847000, "8909c7a3981c046c53c4292c90be511f934329f1680fcd950d8b4ca5022cdc5c" }, + { 4848000, "fac36516e3db3665b29b0bb37226a727439f9a109e8725fe6c719934288af532" }, + { 4849000, "e13ed48934711f064404b8eb4ff6325877e7b3c49484b8b5436b5422d7447d42" }, + { 4850000, "c039930b7b3c8cc4578b7a4b89dd22bb0c6eb8294803c3e81e5255eb9ab1e032" }, + { 4851000, "0f456a9ce3b1c58d32f6b926a373b7bad30f710e79effd5ede8a4c1c5982b9d7" }, + { 4852000, "f6f724b0aa10259b229034b18dd87920bc0dedd1c7d37c42f3f14b78ab78d25b" }, + { 4853000, "657db0e82a87516613bf4d64524d361e4bb3a81eb571d36d3bcb1535cdb4e387" }, + { 4854000, "f359700f066ad7745811fbbf91d2af52fbdb2724f71af8760dff0c120ba77561" }, + { 4855000, "9705d1542d8f9882d09f200af8719319c91d84b2f8b120f9fc0a32ab8cc5d076" }, + { 4856000, "addadcc9c3ef3a2fd949d6f6a5eb6c51c1efec7a985e73d1c3428004b1ecc798" }, + { 4857000, "7c96420ff60ec903191efbe4edcdc329ca60aedcd44c9d5572f0c061d5d0ac81" }, + { 4858000, "e06ea82bda686cc9312267be11d1b90a53691a661a33fdeae72dabab2fb2456d" }, + { 4859000, "16331e5d50a7cb28315f3c57d467caff867d17a7942fb2d8b193f9c3450248b4" }, + { 4860000, "694c5c22e78ab81a68c49dfd79c4209ce5c1968de689f221b38aed19486148fe" }, + { 4861000, "a8ba66d88578b76a88358857f3e317de08454f588b0fc2cab59d2655fad0fcb0" }, + { 4862000, "32d8164ff7ff1dea8aa2c435d98fae64f32c88183c656ed46af7496e2b15d790" }, + { 4863000, "6c1212977dc28ff196edf9d6c8fa781f534454927c29765f3846bbd2ea528ded" }, + { 4864000, "4fa53c195dba92a1c131006fd54bae82c0eafdec9b626067fab210e190b7346f" }, + { 4865000, "ebb2039e29fc181f7f2abf6aec21fa3254138f26764579d084dd6493b0831d3e" }, + { 4866000, "163fb75c8473bc7f58763a160343f0524fc705c4b01cfe06869497ca6d0b3454" }, + { 4867000, "17ea6c544ad2321484478d5f405d7e4d5ae108a103f4df9c81b16e28c1aa6077" }, + { 4868000, "e99011dd2fb3d706e9fc1ddf959b0cdf914147ee35165a1c15b4f4551f033d8e" }, + { 4869000, "4e9a0b397b8e71e136981c793d1bb54b9b83c940375b98f3d758063de113eb98" }, + { 4870000, "2034c95e067d4075499f3460a9fd4970e9c686799721ad4b312e43e8541513b5" }, + { 4871000, "1efb715a04288762fd5505d3588a49f9d8d22aee76679ca77827715d841a65dc" }, + { 4872000, "2c172b4ff387ee236138c365394e94323e7494cf2a35539313323a47b1ec9a66" }, + { 4873000, "0f2f3eff1d25300c954b927aec79dcab039b1a5e87733a902640a1a3b96462b1" }, + { 4874000, "1611c09426b7e9c7e53ea335b0bbd2807a63c40898f9b24da88be325799d6411" }, + { 4875000, "83b4b93f7076d8705466f90c7110795a39dda17309c245c838edf7e6af6c0b8e" }, + { 4876000, "193b53428c2e9d7ca68efd46540aab4b54148cf0fbaacbc0ac164a0e45d535a6" }, + { 4877000, "1b9e18471795fb7ceee88461c5a091ba5e6d268cd1e0ee88fadc8f5a00a997f9" }, + { 4878000, "71f632c809441646514971f18819806609e341f11124ca60604e69e0f71ca820" }, + { 4879000, "a714bd47c16ed6d78fdb86c7cef8b27fafa47df54b0fd59dff25f8752b80d4f0" }, + { 4880000, "0c685f14e86b975bf5d565ab940f148a9841a0fe9eb8c8f11789f09fe2a0d1ca" }, + { 4881000, "8328f1bd21d62a350e9edb06bb4d3d9c523ba98157d01edd7f228ee9a766d2f4" }, + { 4882000, "76766156e9c522934a69224b0db1a8321048c1ebd63a5c18ca712cb38895b0aa" }, + { 4883000, "52771624bb0e0059b37be41d795d553a996b1901fe6c0a937486264ca049f2d1" }, + { 4884000, "2ab3d94c5eb7ef1440bd6f0ef584dac4db37f0284e7fed38c301dbc92820eed9" }, + { 4885000, "56623b6a04d6c77385a0907b24fac03ed360a4e05aa8215ac79f8bb1c67ef075" }, + { 4886000, "d2ab8792ed4710cf91876fe14312cef0c5dc38a3b7665ccee1e2d374d08e5258" }, + { 4887000, "e844bb5512153723997a476cf1021819884fb956544a2fc8e4bed98af8dd2f46" }, + { 4888000, "a4cf8e3412e3173bf19b74b5fed6ee848ac3ac37d308ba416de8b36896ceb252" }, + { 4889000, "e2440da2780f43e4cd3b03e9cc2388b650c3f2ea8f3943fd250f92d7debe3787" }, + { 4890000, "b3f0e6a07f6080893ac7e3005ba5a08d30a54c76022ad41e84212119ded27c48" }, + { 4891000, "d551144b89dfa031eb244e6562bc82fc15fcb1d86c02f78480d590ff49ebbb37" }, + { 4892000, "daf4d7feb018a62b65e3e97687de21e16e6b27cce6d06b7b88c3ce000bccb233" }, + { 4893000, "9ff8dd81035caeb144bfe56cef0089fa238d73ed459f7b30c4b4c3edfa65d357" }, + { 4894000, "f982e58027ab19ede45c8dcaf5e926a9ed6916ffddc5612538dbee09a5a5eb2b" }, + { 4895000, "3db1f7c416eda149528673d014f280683d22dfc3081b9576a6326f5f66765de1" }, + { 4896000, "f184fbadf5db96bfcb7c2c97afa76644a5cce26e60f3ef5d9d9cbafba1440e92" }, + { 4897000, "fefa24e0cc83830a0c1776472cd967a9b487c23fa9fc1bad88f89a529213890b" }, + { 4898000, "3c0f97f6e1087568a0dbc87c6926b56cdef1dbad1e7afb73e31b8c9bb3cdb873" }, + { 4899000, "a102f9f0399157ab01b4a7360c3276d0cd1b72500c3ea79f409a0c3dd9f370c9" }, + { 4900000, "df7fb7a7b3340798b50b8b5c8387cacea017c569072de577fe9099be8be51931" }, + { 4901000, "ea8a5841c61ff1faf999d252a320d567d778d2c383ce6aaf61e91e4873ef0233" }, + { 4902000, "144ed2bfe9d76aaa00b4ea16a81a8139f6bb0e75f5dcccc26776b6ec9024ad18" }, + { 4903000, "2311e869256d1083e882162835e1f451244177ef8457d42c749ffb4693731afa" }, + { 4904000, "f855cde11cdd972a23a3498b0e63b8f31684643c86f090c87d35ea03797aa1ba" }, + { 4905000, "b9c71fc1bbc51fd6a4d0a25565a02bb0b727631ba81f29629153ce0d071909b2" }, + { 4906000, "7cf965be9f69ed7d1d04fc44e6d05598c980f5a981622831ac3ef1b107b59643" }, + { 4907000, "d4ec7ce8cd44cd1a163cecd3af07e7847a5086576765ba6111d5e1ef569ad96d" }, + { 4908000, "de140981cd7ed08633d5b555e2bffc0ee30759a8ee50a73a315e111c6b211e90" }, + { 4909000, "6969f00d1560aead39756c9e6f6a701a9bf6e2fc02c87d8acebcf78fdeb9a898" }, + { 4910000, "027a2e1c15f1e6f0aa8d99b0d7de336cc3fa41bc8e679a66b1a47188c19f5457" }, + { 4911000, "dc3b0f3af8778270c291922f337717afc20cbb94cd6abd9801ecd5fff6d4832f" }, + { 4912000, "5966e6774d3d623e26513bf28c02a27119644b8f07345489e369a959fe18f453" }, + { 4913000, "483aa6b05705ae607ebdaf6056ff186314bc5fc97ff37dcb301fe5efa195512e" }, + { 4914000, "a8a611b7bbab5199ca1411f8ae128b385892ef1f93bc7028fdebb08600f6d573" }, + { 4915000, "027d760b08dd6dbc8d7a33162562dbda3453deb7c60d69720ef2c7764bb5f6eb" }, + { 4916000, "2721fc82191bfd78c1bea2f3d78081f8311fe7876562dd72991c15ae2cec3d3f" }, + { 4917000, "7bdf0e55289ea866a63cab6a747e3ae03458f7eb58b43fb5c179670b34704795" }, + { 4918000, "61ce68c441b7d49c3243663a2ebd9a140d95e1455cabaaef7f906d146e05a5d4" }, + { 4919000, "8bdb99a36f9e6d752f1ea59fd27c5e33a1364023324754e15663d1f0a38da9a8" }, + { 4920000, "53c3edfc02c8aad9fa98086736a45d22392bd86c626343fab5086da15efce7c6" }, + { 4921000, "6086557dfccc4a4e8fc76a9f5898bdbbbde076c7f5a429987aaffab54d0db0cd" }, + { 4922000, "59ccd26f9015a86f0b9b88d1e39b38ee2d8d26094cf6069fa570024f747f1fba" }, + { 4923000, "1bfbd71c7c1f2843fc72496aba611b215954cc56d4d27e40cc8c3adf682bad0a" }, + { 4924000, "8c311c248dd32dc1294486a5c6fc449607ea7a042072f26641d0b06c58c1f8ca" }, + { 4925000, "d93884f30eaa9eaaf4446c2caab477946a3954790fc9dd4754f1cf213e1c833e" }, + { 4926000, "eb1e4a9aba3ad38d4884e3ecfc784c483374fd400f86a9eb7ea9ce5dd3ee2fea" }, + { 4927000, "f6349965b9c35c2aa60ce418e873e8937dd862d0a4cdff0443723ac31d5db1cb" }, + { 4928000, "d9b34749bb61cecdd6e7723f2942285f2791e0b9c0a5462573cbb50691c21afd" }, + { 4929000, "f9ef3a7c7b1b693bd2a76374062ed94005a9bccc1fa2e83160beed2a9798b481" }, + { 4930000, "478d46a653f1cd14986d52191838978d85884586a50393e60fcc0f8d976239d5" }, + { 4931000, "8a8a20c23bb7d9ff4eebf5fc1dbced7c39dd59741049cc5863911627942ddbc3" }, + { 4932000, "5f52352944c195f044dfaeb72985c299bc7885fd8b6afee23dadd86476b5424b" }, + { 4933000, "47c60426333926ecc47429c91efa6be8afae7516a6cd9bd70ef0c49cc46994f5" }, + { 4934000, "4599556a374c12b15b421a35d903bf72f38717eec6438075f1576962611d77c9" }, + { 4935000, "b4865b9988165d0f19423bd623c344d569e6f394cec5fdcb95d6a0bfb04667a3" }, + { 4936000, "974142979acabd58e6a5387ed729afebb8920b87809cfd2b4db4213ec4799602" }, + { 4937000, "8df62e79fe18e39142c2fcd76a5a98f809f698a92048a42d67137793d270f206" }, + { 4938000, "c393ad119497a93e9b9e2994dc99c0b5388f80049efe64f868a22f6151a2a4d8" }, + { 4939000, "ffedce22ec5fabe795ec8f38632f8ad6581aca0e0a618c2455ae8795aa9633a5" }, + { 4940000, "0d824dc8d81f88a380b7611eea17ea91900e52271e6a94acf152fd782182b1e1" }, + { 4941000, "1cfd22a6e29e5834afabbf551c7dd1fc604adffc060d023b070d80110bdcc4d0" }, + { 4942000, "6effdbcb2e1cd2cd43346f9d02ba54f5fd63e416543a4ceba97946fb28f5edba" }, + { 4943000, "716de3901300b6b605f39e88c3226f19947dbe9687c66849fbaa75cbb672e2f3" }, + { 4944000, "da9e35d4e24d56cfcd792e375a70b8caafc04c96815e7481633bb26717ad8dca" }, + { 4945000, "92f5ebb92eed70319637e374a6504d5a3c2b9997ffb0732687c5528bc73bd8f3" }, + { 4946000, "9a86dfd9e17c4aa5172785dc7922a1705044b65b3778852914ef13c9643c2ee5" }, + { 4947000, "6e59b6a2772981cf8326944c61f8409b5b0ea8d10e2c9c7240cea63525c9c1e8" }, + { 4948000, "f6c98391a27386794b9048c9224fdb19e5aff44022f9265f04de94654c87fa37" }, + { 4949000, "e5dcbe5ec1ba65a4bed0f1a680d17632415b4880dcda9fa668dead3a32e6e9a7" }, + { 4950000, "4bf87b6887843c153f27febf9c62e0df71af579923d12b39c3277e8b0cea8325" }, + { 4951000, "453569587f322cdba15fdce695f5749e135eb8a5a48a3db01712fd57961b229e" }, + { 4952000, "af6c9e525c823eb488bb7363562b42b9c54c75cd054062266fc8ec5e46832d98" }, + { 4953000, "819e66fba371f6d1203c3610e18cce1b821b2c1981f095ce44ff00e8b8bb337d" }, + { 4954000, "1e4c062bf7a902921450038d7b031ea06c85f3ef30508098d100281009c055c4" }, + { 4955000, "b3d22f51a36ce18df844b40f24437b7180a672fb555ff386cafc2d03f44dfe89" }, + { 4956000, "54ba2892d2a17f63d76084a6277af9244ee3c7bcc54521e91ffa6f4994fb4ec9" }, + { 4957000, "475bcdc3cec655321095918be2bc87633023168297b02b6cf0e31b16ef4a91c9" }, + { 4958000, "766ede06e7d463633c521d020e6bc8042c9a56ce4a710f9a2cc066f12ff9a913" }, + { 4959000, "c02a120481d1960e8aede87bd802e229500757cdf7d4b8962cd6ec9cf7a9e03e" }, + { 4960000, "9914ec29d97189638ada539820d680d4c8ac5c289b1cc0aef1cc1fa6761613b0" }, + { 4961000, "755b375d6650c57ca5e11bb8a5ce41912fea61ee9be0384a26c9835304a1c90c" }, + { 4962000, "7efaef460513898d85150836ed618b3da86b3c28f0724b3212fe28b24b5a2bc5" }, + { 4963000, "37fe93de28aeb2c24d1ee71204110e156951c0914c2abd7515ce5e206824ac97" }, + { 4964000, "b4d7c5274dede2027171eee378d9b039ed00de3bc7bef11362fd4b7f637054f0" }, + { 4965000, "3c5fb396230c85ff2438ffe772b04746ca881f27ee1cf01ef0fc34efa14b487f" }, + { 4966000, "2bedb0aa9b914291b9a8f97c3af0b5b5fac4711c8a2d619078d61e2c3c6041c8" }, + { 4967000, "ce5ee78330a456a25b0d1c508a7836dc578235cbbce72c173708488daed5f016" }, + { 4968000, "46645b663c49360ae985c30bcd830e210bb0e6d0cc06c1657575c991d6096e0c" }, + { 4969000, "61eded53a527b33d1d9e2967bd1bf916750b30aa8dc9d1bd2cfe57ae06043d87" }, + { 4970000, "d4f492bfe32ced4fa412e1ee8f906c34850b5549c7afa3933f80d556fbfbf7fb" }, + { 4971000, "4cde82380efcd007741b45c00889d0f3fb6dd088133f16c1b99709f7092e469a" }, + { 4972000, "e213cd4fb9dbec8d01be92cd95f6b0c42d1e3847884058db4ae39cb6df815907" }, + { 4973000, "83a635486f6094f54a140db38e9661dedd819180ab0df5eebe56fa143dd8f1c9" }, + { 4974000, "35a1ef9643e94783ea879226387442beee868001aeed0c650685263d8fcf88fc" }, + { 4975000, "b8a3dc0652b5403eb23685c9bf5ff1c06f2c8b3e904191f19070726aad0f5b4a" }, + { 4976000, "2e579a94ba1a6f5bd5a3a0b51fcb3c8b6720ca04f726ade8596d9807a3259888" }, + { 4977000, "2b7e28ab5494249ef97d76e4887bc6ad35996fe9a46cd9db048d022a6b288587" }, + { 4978000, "3444c266ba7f7bf2afbd9e38ddba1f12777f5729fd4cbc931752fae6d9f1b050" }, + { 4979000, "8559740ce169fc669ba7e2c164a6164790767db0eb3c3ac6097ae2150a9cb999" }, + { 4980000, "f665c5a59d0ce46102ccfd478148c8152d832e71cd5785985e2b5e8995a02164" }, + { 4981000, "3591b40669e1caa6fb2f70247b468232bad1bd4dfb5d8697819a7cde70c97e50" }, + { 4982000, "015486e35e3349707a945cf8f5af54cca3d7cc249f6d871aa0f92e901346ca00" }, + { 4983000, "6dc291cac238ff0f5ba1c1526b29faa386bd09531188e991571de6915c8f3667" }, + { 4984000, "1c5dd496bda24e58fd813e0e303854d8cac7767b4bb9a2ff84c24e466d96edae" }, + { 4985000, "83069d46897347a53a8ed2e712c4f6056d14243057bf89101c252321d4a17920" }, + { 4986000, "642e34e940c7385553ed4d1d8cb9b4ff66b5429b2a32f1f99bdc0d5a4ef877cb" }, + { 4987000, "7efe221e61f7b03aed7e1fd69380731c13fb7a92e2e68413be50b2d6856f8a6b" }, + { 4988000, "b98ba2945234032207587ce6f2ca16fb28938b0d95e132c02df415a7457e969b" }, + { 4989000, "6e6c3221f1f11c0427abe23eeb714f21bcc4f9d1e656d480064cd25153d16a20" }, + { 4990000, "efd6c582e0a7c4c86a6e4174c87aec5361f88eca4ff9aab80eef8fe3699344fb" }, + { 4991000, "82fedc57b258dee4e02484e54c0bb27fb9b4b3ef99ecb275b241a22965f2fa76" }, + { 4992000, "c7e9ba4662b0e58b43824dcb58dad188c72a74d5d655b3cd0f303b9edc361cad" }, + { 4993000, "bd6b412b853f674077dd03ffcff40817f4b4b0ffaaeab9f11c6edea6b9c2e4a0" }, + { 4994000, "c05f757c1af75863da5c6f299b39c0adf120130c11cef511fed72737934fb13d" }, + { 4995000, "6f5faf36d014bc53771503b15c6b88fb7612e4266583b51dae507a4b7bc247c6" }, + { 4996000, "00f9195a3c50d30ab7fe8e0b0a33f23f37690b7cb82b2f384bb61ee22fab06e4" }, + { 4997000, "d9915e1b2f05c45baa9eacc64b01c042df1769a6c2122e22298d09dbd0fc3eb6" }, + { 4998000, "76a79591b81156901f12e19cb2b50a1bf500414f556daf968075b5ed18e497f2" }, + { 4999000, "eab0de98adb52be4588f61fc099fbd07e882b72ffda9dd9ebd042fe0b378b88d" }, + { 5000000, "71d52466bbc8b854f8b06cbf2d6327748d1617f9c03598b6f035762108983096" }, + { 5001000, "46df82550e6d78455fc875de264e8185a35b860a069e972ea53d14feb0aafcb8" }, + { 5002000, "1f7e1b920541a96f530673f3855752154e241f6b7b19c38bfaab41a50b219e5e" }, + { 5003000, "4d30bed4b5ba3a88ce0a1f856f59dc5f070bb7f43012db7ea8342c4fbc6d2f6e" }, + { 5004000, "0ba32bf28e48844a299a5c121f712918e995f12a3c43ea114e6489718780c838" }, + { 5005000, "fa8380be242b5d3bbdb2786609e22ad46c09c928f532ab010ac86afe7f36e4d7" }, + { 5006000, "9e59c6d0746c6b2e7389f7feac792151fb72129f35a88015fc00c335e3634437" }, + { 5007000, "6096c4eea68bf5ab1fa87ce41d1c3781d65d9ab5c36d653e53a5e8345368a848" }, + { 5008000, "965b6a174916b979175a8f0355d02368ad22aaea5c86e0d39aed95b33d4c3215" }, + { 5009000, "8a54e92f2098aab18c07c2fb988ad7854d7e80fff1de5908b7180a692ed99c2d" }, + { 5010000, "8dec22ae13180e59b27508a6c03329a636d8f6f5c7c9c8ef8fcfc103cc62ac03" }, + { 5011000, "8cf58202104aa66c5a93c79b93fb90f2c5b9f87dc6184b3a1b56ce145198e5a5" }, + { 5012000, "99cd885064e594ec71c57227122979643314af340e578bc36e348476ab587f2e" }, + { 5013000, "1b362b0e1baf317c3db6fa486a05495e489cc62ead67d4c0f5cf84011912a036" }, + { 5014000, "a8f750c56c73921f558ca1bd7b3714847b381479e28eaabd0a5a92e365f28543" }, + { 5015000, "ea3255ea321214d6e75194b8d18f80ca1fe469e0315b27c7846b92acfde1b0be" }, + { 5016000, "014877b46bde0d286360e9538a2a29b680edf62a2253d2e1de2b0bd7cd6a4279" }, + { 5017000, "78252023112205f09da8c3e3d929676b001fbaf7684e187a3ff4823e32c93d21" }, + { 5018000, "2d8388d1b429656aafb99ed8a9d60a274b42a8d5689eb79fe217610d87994585" }, + { 5019000, "c54359c80200b28efac4e1a921d1d3587d1fb3b699fed8683ffd0be66f997d21" }, + { 5020000, "fc955c7b2a0945a872905d78afcf081690a56a40a4968e8dafaf3b3de7324c6a" }, + { 5021000, "1df540ca3775dda8549510a954a7577c2884454549757f4425f535f1f0c014d9" }, + { 5022000, "01ea8a5aa6c54c8b479aebae6bd83b3133db2e146ea55a49bccf1ea6d922dcb4" }, + { 5023000, "b22293c3003b9640f9bed22387dd1a3b1ae008c96acf468b047543f964116b1b" }, + { 5024000, "83c349650a6ebe951aa0e5d95410f48564bbc6f193312465eb514d86f2289b35" }, + { 5025000, "df56717e93585df743076e8593821dc75f69b6c4049bd8bbd075a27edc07baa6" }, + { 5026000, "77a544b3145d14b268ce7f0125822989e7293d210e8cdf196fcc0d1e4850ed9f" }, + { 5027000, "0d5d77ebe2cff4f76ad1902c337d57e7b21fa6dfe7749d83b0f42623acb196d3" }, + { 5028000, "d7add9ec7daf9cabe2807dd0e5a9bde1743df443b49d2bdca3fc2882a31fd6ff" }, + { 5029000, "864c347965e89fad1cb5c696e77fed139a1042ca0e59152ee4ae69fe5d2335b1" }, + { 5030000, "03593ec1d20c8bc57ff2692c7c9c39427b3111709cedfd789c8f59bb777274a3" }, + { 5031000, "b46e0b678843067c79b53e6dfec58edc77b31057f3fb47714e3993b4a16430c7" }, + { 5032000, "24dac47ec629a063eb1bd94ebf54e783198e0599bc27cdc29a608b4f880446b5" }, + { 5033000, "a86712cf49d16caa46d99074913c90c3eee83afce427c019482f0d33e0cc0171" }, + { 5034000, "009bc40e99e723f71c5ac712c82975e3f83189c973649b7b534de22a2ca9cd4a" }, + { 5035000, "b6074805070f0742f3605f957125b48bcc5ec7b8573f8fc5839db115d560f53a" }, + { 5036000, "2d6c8279e971bc4d7289a7d79d2f9c4156b941fc4b35bb347956360bbbbd0814" }, + { 5037000, "1092012c1760849a71aadd330d709498bbe27f376e4e47f3f4af3aa356d4c1a3" }, + { 5038000, "ded5b36efeff4af671b8f2c888a23a38541705a71f3e4e718c6b361a14adda4b" }, + { 5039000, "48fa8210b4b6003cd1aa3b3828b84eb432bbb6ab17fd46ba846e99f923586c6c" }, + { 5040000, "2f1e6b6794136070cd735e3c234878077db887a7889879c1c390f82d9a2b1ace" }, + { 5041000, "211c26f4c772d08f794586f296618ac1fcadd4746311f83e32a6617782c70eff" }, + { 5042000, "d9de001a76536bf0b164c5e951b27a79b80982473f06cb40e8e89c6771d070b4" }, + { 5043000, "efca8255dc93a21d47584e4fa336c747eb3109c0654410a94fb051fb34de6abf" }, + { 5044000, "2e0dcd652b1b42a9c51b1dbae8cef2778a99e081f7643235cc0311b3b4ffa988" }, + { 5045000, "ff91f687ac80fdcbd61b4713a8481fca7d2db5e9c0ac21db1bdebfc802dd6419" }, + { 5046000, "f5d362d33525cb367ce1a9c1c6eb4d18159edfbd7886b832199e932a062fb191" }, + { 5047000, "b97e884047066133e29577646f51ba8d190213b3ce36c946b3363b5925bf571b" }, + { 5048000, "8659ad8fe3941254ad7501c2c2295bc2ec0892557f192530a826595720e112bb" }, + { 5049000, "0c3f80f413e223623465fe408648c84dabb993bd62497ecbb0bef1dcb8b0e92f" }, + { 5050000, "f59d046e63446c0bdd60635f054867f997aeb3a9db4e740d5ed288249601aa7b" }, + { 5051000, "c97f24608462365927623d84344342f6e2c1715b6541da18f1a584f21032c8ec" }, + { 5052000, "57662990169e5cc716793ee6553f36bd8261a47d0aa4e84445922e59b49e99ab" }, + { 5053000, "a65772ce06b5617d1394a6c862703fafd2e61fa62faadd421351fe77d9cd5d98" }, + { 5054000, "2dba8c41a9ac101cb7a82bdc424c576967dca34964010814afb35b2b241501f4" }, + { 5055000, "d7e43519a20b5a52e3cf0f56950b74a1dd9c8929811b73a4e37d959ff90847d9" }, + { 5056000, "3959a91ef4083251a1d4e20c86678254b3da5fba13539df0996cdbcf38e10635" }, + { 5057000, "9eeebac70748bc7311da418fbbcdcdc53b9ff1267abeb0c37d277ebb4f07e6e6" }, + { 5058000, "9b4eac71ca2626b4677eefbe9dd88424264f5a69b9f49b41724004203bba83f2" }, + { 5059000, "90c94e1971aa462d7e9e3b29eb7f964be4106dcb5de55c5641846394c384a3c7" }, + { 5060000, "8c8735efa8bab7e2a9d9f5cb76d9bebf7eeda797f693d3d49ca860c43121000e" }, + { 5061000, "31f226d75a2db51c0287f472f1c8043a25432530f0bc2fcb812683b5718dd2fe" }, + { 5062000, "55cd18ef057cd4f59028080113548e1f5af9f7926c88a188cab105719c80e2e2" }, + { 5063000, "3a7605f7417fa971fda00182b5883b61338985f99022f19fc5c7569595e38569" }, + { 5064000, "921f44e595480b6cd9e98a36ceeef21f0798f73e24d059ae493e441cc06cc587" }, + { 5065000, "733acad0c2bc01fef8c4f677893134490333f0fdc87f07d0872b8b001735975c" }, + { 5066000, "a0d97bd9196e4ced5f72da09dc0643fc8de9b6c493eef8bd7bc3e1fe7b5aa0ab" }, + { 5067000, "a144c834c32a5f0122cc010d455bfa56aaab7820057bea8be55a7d8cd39e0c86" }, + { 5068000, "4a7ad1d01d93aed634f7de6ca054d5a3f86d7790b30cc4d5d0319a9f484dee4f" }, + { 5069000, "934127ea9c5084636c15967877c4703e51081b55c4c9ad27b55aa56050c86b73" }, + { 5070000, "878c9e974747f4750a1dcf5eebfb34a6c3645c0859b28fa523de4a62f3e4b2ea" }, + { 5071000, "aa319a39054baff1119224df3240b2b75588c6926503092164fcb28db20f06a2" }, + { 5072000, "481d4382fdbbe14902945a0ffb0e7f423160eef96983c75a6d0c1e7a34a86fa1" }, + { 5073000, "e766a85f0b8aaf2b1ed1fb38287b166b28c30150c7f04bfaad0669529625e549" }, + { 5074000, "6d366e3e52cb513a8ba10bee719b103678ddd775136997fecb920711db29f59a" }, + { 5075000, "fc9f5bd58d4f0c591c7555dc438ccf837d018644397311fd08480132e691355e" }, + { 5076000, "b0799c950dfb428b55c99b0e24944c18b9df685a042ac8f1109d1c855533d825" }, + { 5077000, "6d079c5032eae72a7acc636534a7c5f5f32d1058e4b3b0165a88fe27fa63ce69" }, + { 5078000, "885b30e1b8208114ed2e14c9aba1550b47fc7760dea2691036cec9ba87a69d44" }, + { 5079000, "61c4cc21eb462f5aa70628f67c342bac2c7085436067554d461a31492dd8e6ca" }, + { 5080000, "43d722a7b1ac6bd432fb2cfc9c8945250fbf6da8184245c4b3e80f0fe3323db7" }, + { 5081000, "55de0571ba19dca2b3c8dcc3a7025bda7f7a317bc9a82843eac8e9e581169d89" }, + { 5082000, "292d6649020683615655e190c002a4f68d3aa28f862532090204dd8e5e3d3d7e" }, + { 5083000, "9ae1d3718facd4642f966356d08fae538198336bb1c288ece9aa49c9723dda70" }, + { 5084000, "4300385aff3df90832ecb2d5484a33eadba88e00de8505986a678800bf9cf724" }, + { 5085000, "3fe7ed0f5bfa041eb7f187b16c9a2c78b46e08e49c259c5b3ed74b6ad6eb94b8" }, + { 5086000, "30f28cbb37844141b1cf7dcdc10e6eed42f0b90c357fca8bfcc94bc3c743fe51" }, + { 5087000, "ec1bc7c60e28e599ac707f06773ee1090a827521bc37cba31ab7762f04910a83" }, + { 5088000, "d73808adbc728e06caeb0dbd89f022a51acd5427b4d8a1b8225bd6cbb46360cd" }, + { 5089000, "277e2f1ba75f09299692a21f8a91b708ac9159cfda8530ae86b3a8c6e1251186" }, + { 5090000, "a72f5f4c4a7aabd9eecf7486d8fc15c38573a82c75175d132864cd7ba30df6fa" }, + { 5091000, "b9a65c9f354fa2270c0898064f062f5eb606ee688446572aedf7e9ee3942aae7" }, + { 5092000, "83e7ac4329c73241b9f5a4935a6fee2dd6c59c3ce6ea8ae2a2972cb9ad3126a3" }, + { 5093000, "b26dad27767f882649f98e18813c482f8e80da7534acdb2a99432d1784eefea3" }, + { 5094000, "5d4058d5f29fa347331ae984cd605c71a5bea8682ef95d47663fcdbacf253646" }, + { 5095000, "d9cda7775a92a3be3b0be688128ddefcbe036ea2a7c645217313e945b72b8a40" }, + { 5096000, "f2a5305b029c2a996464f6a5e47e871d835cb3676653c1ded0f151e63e2eefdd" }, + { 5097000, "ac675688c77b203b62df8d65d4ad7bb0b634a3d3be8157356b3613d7883c870b" }, + { 5098000, "f3c45a65b9a87e553499abd1f9bd4e1a91df884eb6744ca6f01aaedda93d6aaa" }, + { 5099000, "412fbd4f3a22d8704f2ede1b6c858f91f6b2f5578752c35afe71ebe0a8704d57" }, + { 5100000, "d9a205a42d72c7d005ce93391a0e2c32d50aeeedfbdef51e30aec7dff18e2276" }, + { 5101000, "486065dab27289362518c0dff663ba098397995d57fe626053bc3667fe5db77d" }, + { 5102000, "12b4f9f0b908aeb3d2c812867f7bb7786f73e1639999545824a5faf8eb72dfb0" }, + { 5103000, "5d99939e6d001bdf41694770223a214a68fe7912e0bdd25c4eb9881c6da34be4" }, + { 5104000, "a91666269f445b63b2c823e6d3cec797543a612f2a18a2b0f6396c16c517fe56" }, + { 5105000, "13655c46ed04a8b0ece9f106e8d07167ae4f7763dedc5446a377c216973e6aed" }, + { 5106000, "c28939f319c50d337f1fd90ca00db871e76fcdfb2173d9b7dc07778bc1099755" }, + { 5107000, "76693e1687564061617e59a684b712a92e711566668cebe5965d7a3e07aedec7" }, + { 5108000, "06866e515939bfc0e9b4e35188a706826eaab6e871b672420e03dedc5809bceb" }, + { 5109000, "9d6a0eda103b70049a3a178fb6efa3585241e8d601927a9ea2252ad203ca9088" }, + { 5110000, "30de89459d226a62702ba7d2963b49ab83df628494800b7dcc4c139d15f2cf8a" }, + { 5111000, "49117da75ad88a743a97d70eea30bc80c4964f6ec97430aa8eb89aecf6487733" }, + { 5112000, "098a016ffb38d36c5530fde28930258d09016b081af8be9f581558737d469dad" }, + { 5113000, "a89d0808378fa05009ab580241afe3c33fb14f61f196c8e256beae134445a757" }, + { 5114000, "0321bdb45ac9e949d4c53972ed06eb12f55cb5d324ee0cd3bdf339452e45eed6" }, + { 5115000, "4c58136d43c8f100da6077fe51fc439821ddeb75d00a3d117dad074aafb29769" }, + { 5116000, "985de93c0cea79e45891391e28fbcd677cd47e19a0c9bb0ed5a12a57e04a06da" }, + { 5117000, "280a6d711943c0856c2123d4ea75a47baa88c9f01c3a9bec854d426d27679244" }, + { 5118000, "dc35eba31cfa9127f512a8ebcee58e898d513bd14f28ed2b3dd027bf02f7089f" }, + { 5119000, "b2499b1a480a83c85276f6d711d8616a78f79264e96e18bb0687319db00d5dbd" }, + { 5120000, "9f303e8d5b12f52e8cc74402a01a3cc3105a3037eb8ad99588432c644e83fbe9" }, + { 5121000, "ec9eb27f8733c42c6d30919e092e591643e7d5288bb58a121b276b7e4e3881d1" }, + { 5122000, "393d29b78cac21e29c92480ffdce8ee223388251cc34b26f5017003e84a9a4c9" }, + { 5123000, "9423704127f9c29eeea671ec85776d5d61be8c9c065731d32db068e94f5989b9" }, + { 5124000, "10967bcc622972b94a01e2a2606a2fcffbfd209f6a3ef7fee53da9b2023cb305" }, + { 5125000, "9385d3e58bdba12e56cdc173046082a44a928d2b211c33fc1263891e51f589d7" }, + { 5126000, "e79ba6afb5603e9807281fb13cb9f8fc5edce1ee86c68257398e3f66817ff7e2" }, + { 5127000, "7483e60db52f2dc9ab08335f625d687ba390b61858e258d6af724b8825459378" }, + { 5128000, "d02ffa320c5f5e5fc0e143f863a25241f565a603c4442f3f5d70ee364fa9d14d" }, + { 5129000, "3604604333d11dca5ab84c43bd30dcd5a151225fc1f499f1d2ddfa2886326e5d" }, + { 5130000, "b7305de7d8df94ca45381d0bf8e4dad33462c5d26cf7a0f839ba000c59e15ff6" }, + { 5131000, "0622a3aed15c15e9822cd3265a3d17f3f167a8c4e40d562e0f6daf014c1e9881" }, + { 5132000, "7f65dd68d062a5113ad527d4d358ac775493c31f504ff7244f4a9dc8bd230d89" }, + { 5133000, "ec5fcc48e4464605e92b5778f30f4426d341b92e275ac749d160d49d9524a8ff" }, + { 5134000, "cc6d6d4461a9b435d608a8e3fcf8c7c0bdd3183de3e2edff85079d2a8ac8988c" }, + { 5135000, "90360a57344a47047ca1c758bed95abefb0313e10cdc07c93a0dd4e0e750a8b0" }, + { 5136000, "01b89dcc538a6220989e2dd99c739985e58b96a7df9072610c0ac83bb713ec63" }, + { 5137000, "d160e11243fb2634657930efeaa72c7c1f1d05fe609e694d8cc833742fec58a1" }, + { 5138000, "b0e39d4510915cfdc9e67ad33de40d426cffa15aec5ac5bf72d36590cd6fd1a2" }, + { 5139000, "246050d05c63687f5743044063d8cb478fce538e23510e3e253ade455911590c" }, + { 5140000, "a286a51be9924530ee6a7630336bb95819611a6a807cd5d2162f0d065a694ea9" }, + { 5141000, "e66c593c17ed3fac60a501114cbaeaa8c1b6fd1c1da70cb411f9f6bcf77039ed" }, + { 5142000, "f392e9f8e9344147697d224c2bcd8f1ed4229273c0f557bdfb06806b4a7aa028" }, + { 5143000, "c7c1dd946265d5fb571887948088327b16d463b4b5c119846c5ffbd294aa285f" }, + { 5144000, "71fb349f16f518e9e907e6dc414770e1e8d3a5a327e1b78346cabe0e11752dc5" }, + { 5145000, "fe2891ce942c4f387f56a4e16000d3c6a18810b718694250187634a9fca23f23" }, + { 5146000, "e1c4b970067c1e9254344010b27e6ae15501cb73557afe143d9472f6e848daf0" }, + { 5147000, "682fb9a8febe99e0eb101ca1fa54aafc15dea1a64122c51d6d30a86cca426642" }, + { 5148000, "d02f55af8cc7c04ab7db1e72e90b41f65175ee88f926fc7a5db3f62092014f55" }, + { 5149000, "d0d70c79cb265f31a4747cc4819b1714baacffa4318cca446ff1647bd380d0a8" }, + { 5150000, "b8a469257e66e64005d384bea7625399d7c27284c74e70fe5032fecd2a794be9" }, + { 5151000, "3fcabf4f78aea749844a155925575609e654b01ed9cf78d7902c49e4522da325" }, + { 5152000, "de0f2f693b14c382ed275979fffadb1545b3a9bcb49ce8d59fd7c2805c1378ef" }, + { 5153000, "a785045ec8ec486bbc603c67c2f9e0fbd0e3218d411d86fbd2956e8c939878b1" }, + { 5154000, "798622e50cde6f7307c883766e16884a6f1b2256c150bf7eb7d7b8b7734bca1f" }, + { 5155000, "11b612fd740e9eeec9e12185d054dc9a4cf7d46f77e09a98b74b9e2b4ef8fe1e" }, + { 5156000, "d7b190d6e73e2299ca0e792fc1106d6a784c4f191f9509192df4d689fae50201" }, + { 5157000, "7cfcf3ed5ead9c8f7fa3ef8742e23dfa24dc86afb3a9acc8ae6b81d4c65f32e5" }, + { 5158000, "e07379821e9ad9cc14792f20c4153ab00d23d54d5f0608fff140c14bc86f2050" }, + { 5159000, "4eb855d847702aa2400203a9f5944d061b2d0af79326aa7a4a3780cb6983d198" }, + { 5160000, "2b95bdb29dfffe73d59058422f1e279c665b16dfcb5669d1a22f3ded3de2085a" }, + { 5161000, "9da960b07bec88cecb3c73caf86393c52371ef41653ec2479efcfb04ddac8ec8" }, + { 5162000, "1e5e80f5507cd9c2b76571a5215feaf4b411eb2360915f17f55483ce49d2a9f3" }, + { 5163000, "0706f7161895e58f30d48550f6e1fcb34144ada66989306c9cf1456687a1e5d8" }, + { 5164000, "3b71d24045946aac400dfe764fde78dca53f1ddc30a1fe02b627c5a26fa7bf89" }, + { 5165000, "d6e666cff139075f53b0630376f4b1b0c28769192f30074caeb21f7380e2da7f" }, + { 5166000, "c6a6ce3bbd3283287d4513db63f7788a16070384efc3c3f994d590f44b3bda8d" }, + { 5167000, "dcd6f602dd8aeaba60d5d11ac86e9989ed00547c0c4072a4bf1be1ecdf0af798" }, + { 5168000, "86806335945b8d2ac7a581bf555926c4c79546379e49b693f0fda9fd23326589" }, + { 5169000, "e7d65d1af52d5fe206b3781726ee695ff07d56514d0570dd9cfe445425d51e30" }, + { 5170000, "f9af314a616a2fdb05701ce27b80daa8f5a0b9dc90146d6b5247d1057410237f" }, + { 5171000, "b670c6b4f66e3afcb07f5ca72aabd6c7f3fca15a6fe8e19157ede7dba3bb0a0c" }, + { 5172000, "f1870392261afb669174ab8a80482de53ea385569082635e1984d892a51bbdf5" }, + { 5173000, "e5a95e270be8ea36c208002f69da3bbed12c65f4dadea523161b97ead0b6453d" }, + { 5174000, "4fe0e637bb4b3714ba80b31ad3d8b9f39546c028e38191cc05162bba26b99f15" }, + { 5175000, "9274b79620c26cb3f3209f0209c801749b4bdd7312616a77d610b239dcaa43cb" }, + { 5176000, "4422fc28c365ce7352c6b94026e0b1e5094797271167173d69ba540560b05891" }, + { 5177000, "cc6cafd2b236ee778f00dca8eb49fba575b029e022f0d1bc63e51347604c2c74" }, + { 5178000, "627d5a0c795104a9bee2a66bc6e81a5f436e4b3b9410e01a0c68f4587304e35d" }, + { 5179000, "e0da3fc8fa644750761ccd565523e2f66cc790a1956c8cfa7024ba7fab49957e" }, + { 5180000, "d86fc80271793a1824d79566443155ad31d010f5ea6577aa5fef8a5cc36d0e8c" }, + { 5181000, "acb7153788dcac468b240d56715d30ff7164d5131bf6c8dae5055e7375a36687" }, + { 5182000, "c2ac6068442f214e6f187be3fcb72d04d89f1a742e979b002279eca9585ff539" }, + { 5183000, "3395a50b8dce0f599496005456c89e51cfd46ea8bcb90298e50e117ac4d0a563" }, + { 5184000, "56aedaddfa37b4bae80b6648064d2b3f4ed5f1eebd2ef6df139c5d54c11864fc" }, + { 5185000, "07281711f34e034917bb48768bc131b5a0c9cbecf829ee680b1bfbc9b8f1f1af" }, + { 5186000, "814a507e9a1877cbf5dec2bf239fa804f3d7c32f25a3dc5fc8e01fc33588aa5d" }, + { 5187000, "2a2211af39dabe20ccea354d996a5bcfdf8472df5796aebacc3be00ee9a67d26" }, + { 5188000, "46a5c9f4c4211ea2857d6581c9d9dded7515911d8a74d20588b3406c27451e2d" }, + { 5189000, "847056bca80c986903fc60eec0b8f280f974197ef35364f5dfe03f9f02912805" }, + { 5190000, "65adae3958f4f99d19167659c2425e37ca2bd3866ff75e17f8bf3d3fd5f0a0d3" }, + { 5191000, "1e685d230984c0bbd668daf7cf0b7307764fcd73a3c925bd4e82dee99422dcaf" }, + { 5192000, "721100ed92746a717a1e06fb01d0bf671619a30e78de197e7d4d55cb90d96144" }, + { 5193000, "66bcf39c3664571f774ce8166c084b56b216f32d2a9b5026ffb412a9f5d716a2" }, + { 5194000, "fe78b43309f3eec134afc6b8c1ee6131433502bf2c4b7e46d36993e5e8267100" }, + { 5195000, "394ab415e7aa4e8711e21e37db64d7eb64a01a3a1da212b027bf38caa5aea34b" }, + { 5196000, "c792520d6fa59c705e5ee4ff7b03b57c377c25095667bb74bed00781f1348f0f" }, + { 5197000, "6f79644c284d67b89a2081c23c4080aa92c8cd099170d2879b2b9cdb0af3a3c2" }, + { 5198000, "e316edf26f97ccd6a87d7ff9f68c12c65077650ff33193fa488c7d2717a559a7" }, + { 5199000, "52010bc84d103db2842af00dfc8e91acf68dbf8ed75d7912de2038a9ce740357" }, + { 5200000, "3596668ba986f86e7ec94f1a2e33f36c744bdcc83dd372f7fff3910890adce65" }, + { 5201000, "5c68622ac6198b2ee7bb67e37fc4290897b81771e7d6c70a9eb05dc80b2af4dc" }, + { 5202000, "13bd95e31778c970d434d065d61036884d62a2576dc2cb41944120e96b03e77f" }, + { 5203000, "11a5a31aa4485b0104845fa5a7fcb247ca3e3973484b368b556813c42bdb4139" }, + { 5204000, "d3df36e2d3fd952d0c6f87bb8d1d921575b657b1cb651b430c379c1d8668af88" }, + { 5205000, "ff8dd98340cff7c8f09f5f82563f4167e17864568b79e8ee43886e5970d0f0df" }, + { 5206000, "6cb5ce7b6a50f09c9ba81ba9947e56b5df73ac23e78cb604a320a5df34ff1987" }, + { 5207000, "9faf52656bbefd426baacd389ddd98e5653777f4fda93d7a9dde0111b8c0da15" }, + { 5208000, "17a69484d2043cef4e9bd8faf53882f4fa7f959d240c1e1af05d218f58da1da9" }, + { 5209000, "cf48b95d8aa565dbc6ad862fad9d6274a5717a4d1fb786042cdd2db10d7ef394" }, + { 5210000, "24cafeee167c7487cdc5c7cc020c7d49830c4a191a6b73e6b96c89d105149b79" }, + { 5211000, "46d23543f94e773a1ed72300f1bf5297f90daeec7deeb0f7e0d09658177903c6" }, + { 5212000, "b58c4913cb18c67570b037a56d76b0b6f5f02c20f18696789f03bc61ece72644" }, + { 5213000, "a7952c656b87e3383797b502200b734b4dc370a66ec2bf4627696a49e7910847" }, + { 5214000, "4094e3cea6239cc664df2e25f9e272ea1b212977303f53103045457cfbdba10f" }, + { 5215000, "1c54408b34eea526ea2642a840f985261c0ecbcf1003efb26f4204301919704e" }, + { 5216000, "03430578dc5c424ef2372c8456bd1cb55d000592b9d715130a3406c07c88ccf7" }, + { 5217000, "2823facf5daccc2b69beeed1abbac2218b04d034c2ce8df94788f65b0054837a" }, + { 5218000, "831a320c51ae7a3eefe24e0e8b14d770a935ac085636df58983affb6ba56e283" }, + { 5219000, "814603a5fde1946af8817d5ab05b8e2ced09cd38b57992fff8761bb447aadec2" }, + { 5220000, "f1ce1684cf3ee96fcbe59fb55d0ebfed2dbb0c8225d2e87c0fd3df24ef13eace" }, + { 5221000, "01fd9d90eb94bcf27ce9ab0f825856397afa14952bfbdca3586009da4205c9fe" }, + { 5222000, "daa042c9a338f157a1243a6ac16e35fe8cc7efcd7fb540c11de98799372387b7" }, + { 5223000, "f69cfd177b2636726b46da7c0473cf4204f7c170b213f8976ad69286cc90b4dd" }, + { 5224000, "34568e3d95f51888e5c520c5b6421526f46ca2496d3a72b1847dd523d081dc72" }, + { 5225000, "0deb614b0c2e00d73b93fb30a2f7e0d47ef74b6d05884e1f4e9958f7a2f382ec" }, + { 5226000, "1a299c605ef118bb5a04a685173371ba19f656ac0981c5bf2138722b277d9a1d" }, + { 5227000, "c68062c2f514d95a50e92e4244685994193fc9c9db4eb235c5f617369681e561" }, + { 5228000, "5a1390157d86b2a3d10f68cfebdf67b6eb0ae53bd46e04eb94afcdbf3152a2e5" }, + { 5229000, "aa7a645ebdc4b299b3de81bd2028f358e665b75e4725a1f4ef9510a1e1ec9cf7" }, + { 5230000, "41eb4b268043313628cc4e7ca0ba298ceb997a18cc5314bcaed1b976139be9eb" }, + { 5231000, "a1a9cdcd9addcd7b36e52a7566ce289acb46727eef7d4fd760358ccef7eb7399" }, + { 5232000, "7ab0c1651efd375064cfd738cde77b1dc91d9edc5b2966233764dafd1062fca5" }, + { 5233000, "d69095f7cddd632549f4cc2d14093c7965c8285ed1f9e879a072531d93d23288" }, + { 5234000, "2d6742a400917d147fd2e7bb54cff66d520965bd96e7333d19fc52f35579c990" }, + { 5235000, "c9b7670b694246b599767d4229e62ea0e0593eecc6a8e0bd1bdc429890978fa6" }, + { 5236000, "e4421130f8d7123c17ac8995e54815d6ff17b0abc664836946e108926574aa8a" }, + { 5237000, "f440a5e49376e1ed79ed93675c8849929548955cca711f63facb0a5b9b874633" }, + { 5238000, "c002886dc9447059b21927650f0e78de4360580e99fae235c139cc9852eacff5" }, + { 5239000, "0d9af41651c7ed59fce5863bf45a7da0e83126d7c2a9eab8ece53064615e2203" }, + { 5240000, "9c2d6f92f7f32925824d27d8153cae3a0306fb09690a4106e46abbf0a16fba62" }, + { 5241000, "b308a903b6ec3fe3dd6e1a8ab8dc450a1e6a28b651412a01bc698b26f20ea2aa" }, + { 5242000, "5d091b962912ed67f0ceb4a4888de3b05780fb4fb9fa6b1f35b30a97cda706bc" }, + { 5243000, "90f9050bb9103967f5d14282c81250eb94f5235b54737a0fe5f7671f64ccef2f" }, + { 5244000, "cfd202bb99143fcf012f14d49c76ecfc18133010f50b69eb9bc2777d1e686b2e" }, + { 5245000, "0fe0887150d4e4379b213c24cb8fe470e7449d416b4e0a20070e3eda9384f2b2" }, + { 5246000, "b353cbee8e8e8779b62d5ff2d97a98c4af4070732ffd887ee73573e33daad0d6" }, + { 5247000, "28d35f969e6634417bcf09ae731197fd4e26458bc20221e94edf445527e0d194" }, + { 5248000, "8ad472a06b7424cce5bd871ae2484173894986a032522102c90d27d0c98773aa" }, + { 5249000, "030ee59bc440bd04477be29ccd9acab21e38c4b95dbfb975de5834af37d7bc5d" }, + { 5250000, "fc96e8394dd873ecc2fe4751825e52a01340d819b26dfad147f1add99622b7d3" }, + { 5251000, "08f7c7183cee9822869ab511efa691b9645c72210d51b4364728651966175f61" }, + { 5252000, "860dc75ae59206ce31719cdc942b2c18a58e382bf576225af481bfa9a6a22d06" }, + { 5253000, "dcc0c71e0fef788a05ba95813580f3e308f61088ab32ea63ac0a4f2660b0df0a" }, + { 5254000, "c3e182723f6565bcdd3f8e2a5a11c82c8510c28d919dfe9fb0e77c10faf98a12" }, + { 5255000, "a154f1919cb77bb8602b548466bf08573a3c6605b3c9f98beccdba8225762172" }, + { 5256000, "a5e0b9c8381b3b6c2214c01c4a9ccff30620026e508ea6891ce8552de59ad2ee" }, + { 5257000, "c6daac0a72c0fefeef742064c77e36083508e7aa58e721d6128dfd14880e623d" }, + { 5258000, "ad885257ce922bcc645796c24c1ba0cc11607687161b8c2de554667ba591e165" }, + { 5259000, "5c09d1ae40ed18cde36e97feeab753d15c6c7fc21f29e04c85f0556756b7c617" }, + { 5260000, "01b8f32ad9c498c780aba0855f4dc79fab2f785f9e157355ffdb5b8c44e123c0" }, + { 5261000, "a3644053750ac9fa7766ff76d0048d9cd779b541c594b67847e492f610c077cc" }, + { 5262000, "11af92bd791cc6e34a2e3d30f5fac353023dd0e12c1f515d1834a84713c242c0" }, + { 5263000, "04a16835ae4581b5a2a9218d195ba91c7c4f9572cd7f65eb771d4b8fa4fdf363" }, + { 5264000, "556933d0dc2a16118f867c7918fd5969498594d361209688f7839fa7d80d3f67" }, + { 5265000, "02ed73b0deb2f0049ae3eb0e7cb8ff82d4e1b7697fcf7f104e2cd5cd94823bd8" }, + { 5266000, "bc2ab84e9dcde1c5853a9c800102c0efac971a14559c3b3d010cd32be4067c26" }, + { 5267000, "21491fbaf7de0a5a609439bed891e3f209dc62595a2ef5af02a9a1f20690e9e5" }, + { 5268000, "fb1346f74d05b7128f55089df5339a449c15ced72803995c7d8e9b92c28482a6" }, + { 5269000, "b2b9c8dc96bebcc8ad93fac2f128edfa4754317bde943a2b0bfb76dabe24fada" }, + { 5270000, "526e82830ceb979146631f8961d2bf83459c7cf58eaf805304be665fdc6bfdc3" }, + { 5271000, "c250d2c83074707ac5cb2ce08b1943ceef4e2a182c5e33ab1eadf81f43b95efc" }, + { 5272000, "539d81b7917304014f31643064eb62ff2266aba24b55f22d894ccb5edaa196cc" }, + { 5273000, "c303b145421d65a6a1efb80fc318bc6ba6e09dee06c37f062487081db8ef0545" }, + { 5274000, "1c8fe68e45c96ebfb14f250c231a9f2920b120d609a9757fc37cc61e668c70cc" }, + { 5275000, "d5979fdd59aafdd50a40c50690e139289af123fbc86a420af9e72351e1bb2c8f" }, + { 5276000, "4d2c3980cba388e07409a46c91adb51e5c66a146beb0a957cf0742fc90a1aae5" }, + { 5277000, "c0bc19b7d2f41258dcb82d4486df984cfd46f77525e65a117fb93b0dbb13594e" }, + { 5278000, "7a039fdbf2343a63a4cbe029fa957da345cdad27751cfb41ffc814c0b5167578" }, + { 5279000, "4c718ec398f09b39dda69f617a32c9ecc0f3a2976a3b374ad9d7c7333c0e71ca" }, + { 5280000, "d963122fbe78a3c28101698cb7c05b34c4fb9406716aec94fd5add3e38117eab" }, + { 5281000, "85517272a30ece3c63ac3793d1a5299dec95b5d2245ad4f7055da3fd6699d19e" }, + { 5282000, "255820b1d986e15d1f44120fdbdd3c88faac17203b0524dca13ed8fc67bfb437" }, + { 5283000, "164e00f42f9f6608e262b6172ee99941f7289e7e036ef00c0bcbb6ea433fae99" }, + { 5284000, "f9cca9297f6c178fbddddcd54047ec42b21002898f2af850c4d5bed6dbeb212e" }, + { 5285000, "5eac694863b83b518174d79257bba5b4b27154a79ac0c77ce9fdb5f326e0388a" }, + { 5286000, "096faadecce9527b4b73b3cb7e5384e997ea5ec01a90045d23553787afbc3eaf" }, + { 5287000, "f91c79e47b3cf3ecd6eaec0b4e3417dea07856863038fb832cd2346b922d6f2b" }, + { 5288000, "775665db345cbceee9937ee99419c0ebe80d22079553d11e6b92a55abb7af595" }, + { 5289000, "19ebc47f2507d5984fdd70ded2978a2ad8e4e052b85620b8ebf9c1aef17618cf" }, + { 5290000, "a9228d1c491a126f2d166fc64cb4abaa591cd5ece2dc9bcd3c588516d8ff4003" }, + { 5291000, "0ebfa757ebb9ccb15e283b05600479f34382e0e444fe4c705330ae5edb101e15" }, + { 5292000, "e3cd39b22f39897e70646e5227cec355d415f5835caa86d1de24dd53085b0f78" }, + { 5293000, "92a207c3199ea7a7852468c6003e08266eaedd4b1f85988a1094c8d4210df249" }, + { 5294000, "461665b2d49c5221d51948f868876622e1ef9e4b445414573764255f8a84bb27" }, + { 5295000, "b9e555a30e85ad1e715371ff0bbf1c9a3cbfaf6e8a152dbf939c499e198f978e" }, + { 5296000, "c44ff989389a15cdba2907c058da3522d61768072cb1d9cd418edce7e8497e17" }, + { 5297000, "6cd72137e44bc18321b01ee97a7837eac0203b8dcab69a3dc89b103a4a3cc5c8" }, + { 5298000, "a1271b64bde6291202d17b702f88f198ee878167c3165284a62695e21a75eda0" }, + { 5299000, "64418bbcc99ae8effb6a80d1882177a49fdb49a8a0c7723dad58f19f09c7260b" }, + { 5300000, "1efa17e05359640ea5a1cec6b502627a7ffa090a9ddeeb2e326aae97f0ad295b" }, + { 5301000, "c7b413b5d23cebdfc4f0dc332946ab53401ee7631823284a28bd1be4b1ddce81" }, + { 5302000, "bc11251581d505666dd443a9254a02e607772a00ba4ec5a49cfc69a323e98a6a" }, + { 5303000, "fced1ed0576a66d1d2baf1154f4488b1535581d6adfd1b803a53e1db66cf5f88" }, + { 5304000, "3d738f5a3618f207ae41f2ab3b0d92114ce99480c5b2267c00847d435aac4210" }, + { 5305000, "e34b07467abc80adcd553f55a1a2855d23b048747c14d689c6f4bb8e2749aea2" }, + { 5306000, "554e06ae6af7c0f54272008776c4eaf2a7deb9879862279785d5565ca960efbb" }, + { 5307000, "e3550d05653d340353fedc39de68cea432cadf54913a29e34be5c54498f62196" }, + { 5308000, "fcb6b3781a5ca2044e2ec9dd713c54fc8cebed80c85ea5560330dc462dcbcd4d" }, + { 5309000, "273fc620688a617f79489f033f13e6f464148e9e6ca3377c84784ab88c77eabc" }, + { 5310000, "a40c17bc235ce8bd5d9b0ef77f6c86a4d09fddac428bc9bd1a658a48c3f020c3" }, + { 5311000, "3d05e74d5a6c423d0f8a7c3b50fad996096443c594290490e67d5055e8f3ba64" }, + { 5312000, "d699be834e91d34b336ae2c56cdc943d7a8e615ebaffb61793d941cfac34a1a9" }, + { 5313000, "befa26179b8b3354af634cac8d60a0d469a0fa7a3cd6c719e505caa190b62447" }, + { 5314000, "ca7291ef7c99e8afc6f58c1187fcadb65d367b2e053c747fcbadc7f2dc87ae72" }, + { 5315000, "881181355b7c74ef6fcadf080d963c55f7b2b23c442174869b1bb5f6766eb709" }, + { 5316000, "10ca9268c0b536e274c11f93fde934a27a337af632b6587c12a74c44f4b21537" }, + { 5317000, "787e7b229f8db1651ab741d7e4ff760e144f050e89ba8609cd7ffb34e5f5c98c" }, + { 5318000, "ac6a2a38371c1e517f8b777bdf2b5ccbe9341b8476a77a200fc68c47718e40c7" }, + { 5319000, "65f15e969b3373ab2956c90852595e0f325d3a8f78c5730a00fdd092a479e7b0" }, + { 5320000, "4685499fdc28dddd6db23c030375d22ceb1b5ec1b1eebece3029d5b1d674df27" }, + { 5321000, "117689ac787e7b8a0278f65d31f2161f8de556f13b67d82c3f035790b72ef335" }, + { 5322000, "9f213c0c1183cc849db9ca60b2738c266261ed8e06d887ecbfc4f3942aaba47c" }, + { 5323000, "9e59ef44764d4be1df53b81d7ef7375b180bf181c85d790ee6e8d092fa91978f" }, + { 5324000, "8daa3127a2ba51c3edac06dadaa55c2fed3d24b16eeeccb43983a6b7bafa31b0" }, + { 5325000, "6c5c84ebbd206dc4c491d36b74f44d8a97a2d98b98e93cda22b202feae900a70" }, + { 5326000, "8b06d09cc99590ca3b90de66091f0ea02c4bda5d344a2d34dacba4e9a74f40fe" }, + { 5327000, "063c363320539efa5b6b7da3e9df124beb075063aa5f94bc4a8670a62363efbb" }, + { 5328000, "44bd073f50b025400c503be08af7d1297ecf78ba3f4f6fb5db1b1a5a97de48cc" }, + { 5329000, "09cd30931b8828d8111f8974ae79aef05d65afd8ef60877c62ed771b04096264" }, + { 5330000, "921ce727684a6de46b40f703ceb78226a4e0113ab9566b127f55f6dfd37fbb0f" }, + { 5331000, "1df31dfde6a7fb5641073538f29e87b75cf566cbc29a7f18a7f22105c18051d4" }, + { 5332000, "a5c4c042466215d08c806be5c64382349509ddcbdb8b8c04983e4f1e91551812" }, + { 5333000, "ff99a0610da261849a943c94b819b7bd1f8bf7b9c638a8b1d0d60a037ea64969" }, + { 5334000, "5292c3fcf84792e87cd9fad40d101f8b707e61087bd4d9d911071a82668e90fa" }, + { 5335000, "0a7ec01d00e11efa16487447b83e77f4e8a094865cb378602d4726f5a3fc8c3e" }, + { 5336000, "dce4cc15c72e601566ef48f64a3b6fc82f57b74403fcb40373173eb99eca3a5e" }, + { 5337000, "2a8d45ca0e90b6f19156e4c14034470f01bac61849b2a49f39929e6e6f2ac530" }, + { 5338000, "0fab2e36a9fad9bd1c57717513edb50f82b29788ef429dbaeb6ea2e71059637c" }, + { 5339000, "191a45b2d5c1032ec6429c63819421ad47c0f48d5cad105b12110932b8a46d8a" }, + { 5340000, "797c38dd1dbaa596a33e264a64ec18b8fa37375ea1d6c7cf1b2bc10d2713a891" }, + { 5341000, "b790a3d3ea57755be631661e2884e9a8e7392f629a9e933810cbaf809e799664" }, + { 5342000, "925f0a1dc2095d32a07ebde2fd5817e0920cdbf7a124211694b956be0fa89628" }, + { 5343000, "2f48850c0afe381989b4909f46b0b88c049461705e93617db5a8611701aebc55" }, + { 5344000, "013e72bd588928e20cee2413fe1d5ebfdc468c2481c80e9fb31bf7ac386318fe" }, + { 5345000, "f7bb295dcbf931580dc82f07e5716a239ce47bca92eedb1752fe800fb975947b" }, + { 5346000, "2674fcff5775d7c020243d0fb86aa72fdabe42d3467c7aa210b226e387a15598" }, + { 5347000, "4ff64f84ea538ed5bb1f04a903eb66e4d3a5d54f23e66c1a96b7b495bff7df55" }, + { 5348000, "31e23d1c62e981392d65f2db532ab97e7806ab2d58141e257d5e01c9052f17ab" }, + { 5349000, "f0a9fbace1e5849f9c275cb414de69659a7d23ab34384e3d56b4d103a6746fff" }, + { 5350000, "f2c9da46735f7a934e0ddf55e71e454c22d0d0c3618e93ab04c229989b4f0b32" }, + { 5351000, "b131074ce0ea635c42b5967602f7d38e65aadf724bff2e3cfce7b2f1af3c8931" }, + { 5352000, "e61e4cface9e637262db0be334e40d81db88681bef38bc4e12a17c8527627bc6" }, + { 5353000, "0a6a98b4917c5cec314945ea4114cb436de0c3f529d4ce521c610ddd983fdcdc" }, + { 5354000, "81085432c5d6c9f73c85ebfd037ea991cbae70f85f607d098896e794dd91648a" }, + { 5355000, "5f7e09f17f3299ce79e306101146655e5a72abb62ae389df82cb8d1458abd699" }, + { 5356000, "a6ca8079646151d5435567ea2d21214bb5de669e6884a722c2de7e62311926b7" }, + { 5357000, "1d9d3fe0872cadfca1e15515b5b521e2449827a826113ce87cfe5e327ebfeacf" }, + { 5358000, "eab6d0b83b4833310e1cdfe9be85be1fbcd10def07446799f454efaefade761e" }, + { 5359000, "aae85baae3a476d04f0ffc5111b367b55e80c054efedb817da67a6b7b44b16c9" }, + { 5360000, "bf5849c53be86aaeca8b628a19bb625eef4fb49122c1da0b4494f96745043fca" }, + { 5361000, "a803451121a58b49dc187bb24382fd54db3bb2ada6e6f8b62faaee8bef318b2f" }, + { 5362000, "c28437e20b292b4d4c8eb9f8938f6432e411d8fe3c6df7d18a6ab28f9083c0df" }, + { 5363000, "38b805743ab61ece65ab57927eaaaef17ab39962fa17545a0de5cf24b4f7e5d9" }, + { 5364000, "82c5631388751afc169625ba51718a954c0ea68063c9b4e0dc247c96342816da" }, + { 5365000, "bb0fc197ef0fa35212638bc83eb25b64c86766c3b1b14a953e4e37304351a347" }, + { 5366000, "00ab6068d2a15a4d7156c90a55bb9e9fc3d52b7dc8d35e97749a8d4ec05216aa" }, + { 5367000, "b36860a8985783bd3b9713e5d18412b010e784509fa92d6ebf1e088033ddf97a" }, + { 5368000, "d8e410b62fecc1a5759997c9e7e44d1a6e686a7abbf258727646ba93432ff640" }, + { 5369000, "b74972943d1212fda32351c10a44cbadf90ee617de1fe483676d8cf76bf010c4" }, + { 5370000, "7ec833b3f1da886ba3172637af4f1062410c44bc46c30c5af7a46d30224327fa" }, + { 5371000, "85eaa8196940207cf6a75cace58259701e232905a749f3ad65341a22baa68487" }, + { 5372000, "9dcf8ada8d8ac951d93983c9674cb015ac9bc84af72b113f275dde758e09bcf4" }, + { 5373000, "20856e8148d67f88403a647b81644f5f8d47e6a2d4778f725b8c2ea12a27945d" }, + { 5374000, "4acff15b8812a75e4c9cfb5ed49888cda357a6e187cf0cf9cdb03cdf5d77785e" }, + { 5375000, "a808dd5c2a9ca2dee8a927b2261620f77e8f0e822a64e70d6c2852284f0ff6f5" }, + { 5376000, "18db1001b1aae721fc16d8d2ef91aa3db66b11c920f3d8dabbaae3434434b04a" }, + { 5377000, "21484984aa1b6101952fa317e1b3e763408e0a6d64053ae4a2d2be375a84bb80" }, + { 5378000, "7287cce08fd3ab5f1b65acb1c21db04eb9794c748c4ccfed31be698f2288d6ab" }, + { 5379000, "c67d4e940aa379b3e42f5297f5d8d3cf5615e3b2e42e77753396a9b86a0663c9" }, + { 5380000, "2a7b569cd3d67d54f39b8bc7eebd908521e0fcddad837ab7f117fbeee4e5ec1f" }, + { 5381000, "33ef549449ac08d94535c9dd77dc1807c1c2b183df169b5512c35ee4ee5ad12b" }, + { 5382000, "ef6511e6730a119887dd3a579bd381668e5e5cb570e9e2015bc039c2564b66f9" }, + { 5383000, "8941d01163b836289c33b314c3bf5336424e3a833f3c38ad0124dc94002a4eb1" }, + { 5384000, "320ec6cbe943485cc6cba06e7bffe472f544ea87c649cb3aa12958864534fb40" }, + { 5385000, "56836c6f3452d711aaabe73b858dee0069fbf695977518e2e5eb312964bddf01" }, + { 5386000, "65a0eb21684d8900f8ac941412a51ce6e69f1fa39fc622673fb81263a1c7c2f0" }, + { 5387000, "f83f1e2f0e94affa065e1578d678cf0b6d89b2e2f0f15a491e7dc4484afa329a" }, + { 5388000, "73d54e4ed3a0e58867daaef0b28f67a60554b503979e77c6ec3a8666221b8864" }, + { 5389000, "5a58eb74031b81f6b7802fead4084ad5051827f8a363d858f311ac04a763cb49" }, + { 5390000, "6f3f0de9094fb51a452fca0f4d08ebf4cf6993dc3b3a6f174026f2f0be8fa76a" }, + { 5391000, "9768879896f521cdf2364ddaa15cdd98bb97aa6d0b0834081633677bd40b8010" }, + { 5392000, "46eeadd657f7992d92226a69bbc1ddb96fc8d63e724399a7b2d87132fa504dc6" }, + { 5393000, "528eda726ee9cec11694af642884ad81e1698b1230be2807009dbe0786ab765d" }, + { 5394000, "e2f72f839f09e051ea15148e4700220de04ebb79ba4ee20048c948769bdca2fe" }, + { 5395000, "804e715ee148c10013a712b10805b540f36a66d4402e73f684893124ba37965f" }, + { 5396000, "d71cbb4987f368c8451aa090607b707f521f19a98c604c3be02da15a1f814c6c" }, + { 5397000, "c1c8cdf18299992ae157c1900da5a445aa6260dcb33bcf9f3ee5ef0a607e93ce" }, + { 5398000, "5c7e0ae76eff51139df195799bb41cbb2274c18e243f35f1c510139a0df129d7" }, + { 5399000, "1122d0244cd78058e5bd3ac714f873823b41c61c6ee4f6b90d52322129321461" }, + { 5400000, "21956279c52e7f3ecf2c72b8ccd8e514ae54459e03b8b4fdcbb02a81e5916fab" }, + { 5401000, "1f458454d94d99c7c73136035ea522ee1ce3aa47f049567ba9a2fc704aeaf583" }, + { 5402000, "1bdd20d07e15346dfa73a7123ea06bdcc13b854693ee5a17d3f2c9702e06aa08" }, + { 5403000, "9fa37047e61dfb9a5d62f9fadabab29f208dfd6e1778bba86304440b4b26f521" }, + { 5404000, "f17f571ca40e9f66b3f0cce1f6b4333c3e159ca43dcec7ef28bdb3b242ecb692" }, + { 5405000, "99a1656017d730816eaeb327ef0257ef85615dfdb7b7b86a873971f83a864d8d" }, + { 5406000, "fa0c6f5a8ca56b944810f75b78e04e606336e2a786ecc90b726507eb9645446d" }, + { 5407000, "e16e26e3f08d8a0df5b1f3afd1c5e838ec7273a8781a0948403142f16dcd27da" }, + { 5408000, "7fe6d9648d19b7229919fbc1660e4770f9477444ef1a47eac11e09888822fac7" }, + { 5409000, "08e2d5104901c64ea5f44a4dc9485116bd07a94084d9ce09c775089fb4f21f31" }, + { 5410000, "f6aaa5c16b5c4b38792a71d0e08d655ce5e526a1c909254016e9f979951c9ea9" }, + { 5411000, "46e06c001417897d79f8bb77d0c3cc430bbe8604212ede9dbd97e3dda6896355" }, + { 5412000, "1eb76aa5af93a2f5cc2593486fa38ea44cf1c457ba2b442ec4e6702da6783a7a" }, + { 5413000, "bf51f157c677c6d09dd6821f1f71e2dcfe087c0bf75c3a6c069499fdc070c181" }, + { 5414000, "4c83577136a0633db0613b31c91c534ec69fc71d38a39f753b678ddc461259ce" }, + { 5415000, "3df11da409088f4b44a333ac9f814eb3f2e9d05a152e65e64f605f7d8edc093c" }, + { 5416000, "26f14dfd2ef097b40423855037d0f98025c1773f65af6beb01ccde02d719f34b" }, + { 5417000, "61e2454a3394aa6905321001c034b70fdcd6394330d5e8177c11d2d6085ee58b" }, + { 5418000, "cdf8b6df7ee3625446721921415fa570d3213e7a325a09636c1a9b26fb77f165" }, + { 5419000, "3ba37d57bc7f242783a6064446e5cd7944429bfe037fe98e2d42d9bb50432b70" }, + { 5420000, "cdd13daeec0ec8faea285b89a5950e997ef138027bbfef6865d506ece535b1c4" }, + { 5421000, "e904655a9511ecf9b878275dab96ad82009340970cba94cac10faff73da10af1" }, + { 5422000, "fafbed998b0edef1df81c2190db1c62f4542d1a2399424cf4e0bd3a8689e7f5f" }, + { 5423000, "a89eccf384acc67f934dad7d7ccd1b4403ab0d224e8b002a48a8a71eb9946352" }, + { 5424000, "754c707377fcae1f4613bfe72eb081810e7e1029b6cbba99c3b0a72ed971e07a" }, + { 5425000, "a36578936cb6e9ace6d3aee31c35c18da2768eab53177ec0d1a8b57494691ec0" }, + { 5426000, "3b39e0b8e3c6c8462422aab028f4aaba8fc60b450d614c8654acfee7c7ec3447" }, + { 5427000, "fe5e4c6307880d7323da35cd5e40abd04dbcf4ae078b725b97e1a74ab44470ba" }, + { 5428000, "ca8bd3e8905874cec5a0767a8bb61c671da6f8ca8cd37f2b2459c9a77b912849" }, + { 5429000, "4e41949a5d0346cb0a9a3d7e1e95f9a7fc28fe1b06a92a674d7aca5771dd617b" }, + { 5430000, "b2ffeac1e566e6a8fe89b78bf3670bccbec865ece7f5f5a32ef1b7965fb2d382" }, + { 5431000, "b5295612d4723f3d6bf9b7e58cd429c89708e82b6ec6f6ca2d341aec74430598" }, + { 5432000, "d59e9f1542df71808ae6f3048080ec80f29f9ca41aa0105734988b50f30c3f32" }, + { 5433000, "0226b5d74c31214e7db6eaeefc63722d039808e568ec65c680fd036b0c6861b9" }, + { 5434000, "d8fdcb4c42a3515de0f89ea5257cb739f2426a420dace7c20ffefc369d5a5198" }, + { 5435000, "aaf94ff587e2750cc4881fd6337493067ca1279b50266cdc57721bc18aa855d5" }, + { 5436000, "feb745128b58238f86283447427def67223bd35361fac38bd748878e4b23a59c" }, + { 5437000, "472be3180b50b1db1ce9a4bee6ba3439040a11d6def89bf221b61c604ae441c0" }, + { 5438000, "a94cb9d3d096d7b010570d3fc768f77b71c8606b27238fd67c8e31d161d394c4" }, + { 5439000, "79efa36310514aaf064cdc724f05dd7339f657628d66930ac3335818adc55cd2" }, + { 5440000, "eb3ee5af1469b0c5b55cee42a8b68c9b708dcdd7bebec595c02246b455145645" }, + { 5441000, "c1abe92fa04b0f18c427794be29fd649d582f8a9bfebb50bf595f6194085fc3b" }, + { 5442000, "f982e88aa94d5a3a1b49a75a86c4c671c86a2920336bea54ce44f9a53ccba3d6" }, + { 5443000, "dc1a7090fd42ab99f838c9460c5dfc3216435b62403a6a752c86721101bd3fb5" }, + { 5444000, "d503228eba1a10d124105e2cb64e880c3e67d4149a93e4df1c569c890e7b003a" }, + { 5445000, "d181f385b140bcf6083d60bfa84faf09c532ea924ac101f389934a737fd67e86" }, + { 5446000, "d91aad2785710977ba938d2e51420e877cff3f231fb2b21e8443ccfc8d3a527f" }, + { 5447000, "6bf8d3fb879bd6ff07faaf8351665ba0f39a0983954bad7000ea75fd71451973" }, + { 5448000, "193693f24302e4aa05b0e830313eae7362c7ababecc52356a31a5e60d203f31e" }, + { 5449000, "ca9e79086e0bbace545e15a3b4a75d0f5f267957ccff98c383aedb51f8f73eb8" }, + { 5450000, "fc19a8338643cb33128d72ca4fe0ef7248abaf7844a588564a9161ce5490fb20" }, + { 5451000, "a376c948d7d09674adeaa826a5922d03ac25e8e2e863fd18d2a634a00e60b007" }, + { 5452000, "4e272c85ba5c2c8eec983e9fef25127f6d6b60133944dd2744917ec748092191" }, + { 5453000, "8f883ba06b7ab3c5cba4be4de616cbe8b339fe3c8a49e1c76f30a6650ccd145e" }, + { 5454000, "de6695ab222b1a3da8351665d8d23d521844627ee02b26ce5f0c5d4c64f10cd9" }, + { 5455000, "de2477078733787abf450dc6baa329e02cda54284ecdaeaf28439db0b5e50ce2" }, + { 5456000, "16610347c85a1999b5e3886e2ff349a1d6bc5778ff5d719cdc7814fab3dd0956" }, + { 5457000, "ce26d9683ad2a45054c616d13f35f0339a868e22632a433b8d0c6c1d56daa198" }, + { 5458000, "0995438a7bafdec81ec4f5e7c00a952e4c35fe8486ba71686cadae44bc97b162" }, + { 5459000, "829be983cceaf13c2db8fb6d392f7dc907089e738b1d16671a53213e6bd2d8a9" }, + { 5460000, "341d736c40e6ea651c877678f428598cdcde5496f1cb24e5866ed8be7d44c32c" }, + { 5461000, "10fb12dbd286d0eee2c8427d9ba00aba9cfb5be9bbf4b516b863d271bdbbac3d" }, + { 5462000, "a07af8c380a4c6d260a3db52405183607f8c816b579530518a71ef02750cba79" }, + { 5463000, "df49ff37ccdcb86f04a26d38e4f652f41d3419148fe5675a3b37990268f74e12" }, + { 5464000, "59d7300f564b8c4d15f77c39afe5e876373cbb1a8c66642bd156b92e8702c4b3" }, + { 5465000, "94c793a0a30349889f72ee9af3d22ee8b85d02bb63c6b2e4b3640cd0ef825eaf" }, + { 5466000, "33badf3682ab073853bceb5fa903c9afa55ece3bb052a6e38bf36b8338d4327d" }, + { 5467000, "fd459334799102ffa335f6cfad9e033fdd4fb47d57f3a064bbe39b0992077529" }, + { 5468000, "a3844e993078e14f6bc9da2bb4975ead9f7a4d76b91bb3ed9676000460460b74" }, + { 5469000, "6566ce076df8d37d4da0858aa42da30295d12add76374b120b15c920a8d5698d" }, + { 5470000, "202e189e776d8b0d7d9245af6629d8f18c10ef69ebc8d73183a1b7269c04fd38" }, + { 5471000, "71b1b6acf22e6418e8a72f9d235dfb6abe72218782e699e19a1326cfe52a1183" }, + { 5472000, "5c4f230e84c21c25b8ba6b6f45d9fb426291397181f99aa27432559d503937c1" }, + { 5473000, "9a537f877c5302410f3b9f4dcfb491f75b11496a57fc86140712d8ce34ab941e" }, + { 5474000, "fda70f14c11ddc0ba38e44fabf7b42728fb042a749ce63d5d3fc425952897a40" }, + { 5475000, "d01d9850b5e6d6bff76ae3a441e93c671ff20ba7b066e2ea9d734b5d20fc2549" }, + { 5476000, "49d7a2291f05c2dd4648b507db42c3036759a8ac4e0bed40c1ffe05988ebdd07" }, + { 5477000, "164d76bfdc2376483923e67211a0e00dc439a25a682a2304fcd89238982d3c67" }, + { 5478000, "7ee3e2ffe4dd7ec1e2d27c2156cb7786c7c7361af0103aae626d115d2a67c2a5" }, + { 5479000, "57589e7e8d84c7cb1ecbf7fb019fde32b52e578dc8d1ee8dd665359fb97bd513" }, + { 5480000, "df6188f3a45eaaff78884c893a44ce7a43e20f34884ea0294ed955c36334a898" }, + { 5481000, "ad2b81299a1b0c88f04a0b987f80baad3a84bc8825b71ce9f7e01270f5a34665" }, + { 5482000, "c2568020147aff7b4bb23959282af7b246f55beaee949f1f0314fe8bf8bdd309" }, + { 5483000, "7d935836405f2eb2396e0f610ddba98d725046728ab90a79240d6565e57a665e" }, + { 5484000, "4e4e7414a61d20e2c3fbfddaaa68bdcaab58f5e9a4be5f97e5c0d471e5b13603" }, + { 5485000, "5c27eab3cb12b032c6fe2feb2cd1bf21ccab03d176c548df2f3a2f1d96220882" }, + { 5486000, "66dedff26c1ee597911ad991dc91de7ce92124811487d71a13a2dd894806af3a" }, + { 5487000, "30c9a19f24d8b0aa3a7e77e110f121ed7b6c7fc698788406465356b1794b0a36" }, + { 5488000, "f114fe39a0be967ef73faf932ef27f34283be12473f7fc0471ff4b9c198118bf" }, + { 5489000, "b51721c58addbd161a2c9a71d6890ac8d3d5bdee5b125638e5664df1f026c1dd" }, + { 5490000, "cae5a20122b0eb4f794e4644db39bb8b28575b79655e44ce3462f6d1d2ad8047" }, + { 5491000, "4ba8f644adaa11f704ed88625a50927f0adf7b9d64bd63bd57bdb680dfd177c0" }, + { 5492000, "f2b5e0ac5153a6cdc4b0f60b6dd8f55bfca186eb1bb28f61626a97cc463ea5f7" }, + { 5493000, "66ab2b2f248151d0ec91b4da55cdb63b7fc90e1da19def0c2cc0b35afcaaf846" }, + { 5494000, "e8bf884f9068da594d970832af4b00a2836f362898562a4264968167669f7a70" }, + { 5495000, "3edaa78db8271a1063ab1912c8b287aa97dff39b7a002fde5d7022592050ef56" }, + { 5496000, "2c2be01569515b2fd8b1af99906546a89ad5c791fa99dbfbe586da42d87dbd28" }, + { 5497000, "2c30a527be54ff4f4b30feef62bf3e229a9c3ff50377a3d02058b5b9f7e2b493" }, + { 5498000, "b468ed77421e900d2f8d14f9c337f9890725f31960cd5ded15c02a20fda926e4" }, + { 5499000, "6faa10ef38a1dc41bafee4395f142dbbb6149151e96b338e31f9101d4cd76f7b" }, + { 5500000, "0b2fa39ff57c3941a778f3ff18f8492bf841ee538949265756f739b58a597e53" }, + { 5501000, "4b2a8cf411dabad6b2bac64d334d587e2ff8da5368954c2bebc162ab05943e68" }, + { 5502000, "4ed0f1f2dbbabaed0cc65e18f767818c7f6a73bedc61fe074f09d02e03f8de7d" }, + { 5503000, "6cee032af37482de3b7d98e2be950a250164c1936bc18209e953f2480febd215" }, + { 5504000, "a992a12a5cd909fa80727a12d83a4ec885f820d921063f592641635f1b65bc19" }, + { 5505000, "21b725888f6e025794283876b5287ace2c3715b14b059c31becfce12d99aa106" }, + { 5506000, "a87683e62af7813abf9075918ca00f8f42d9aa995bd55123a96c00bba80691ec" }, + { 5507000, "6696b4cc2cd72859095cfb3a1366e005c9bd18b480d75df6bede8585e92a9407" }, + { 5508000, "643f4ce670358ae4bee5497c068000408e41f8a745da231d9f2c6fa1b7fee5e0" }, + { 5509000, "1d216b43a2cfb36e28a8f302f8a04573bd60a4a5f7476175f494034b665a18bf" }, + { 5510000, "25de9ed78f055abe21480ac39e674241fa4eca1eab64732509c977808cdd47d9" }, + { 5511000, "cdb06c5dcda30c58da3f4b9f08100bef843f8b464a13d96e2b10af8f0725733d" }, + { 5512000, "04632b44160722895b5422f493a81fafff3f164ddcdb9bb5741807f80f45de22" }, + { 5513000, "276f61a3ef3f615498a05626e1c122db1253e36a23df21e1cfc3790b1fa01f15" }, + { 5514000, "b56b35df5d86462348ecfe50b3bab5dfd34449cf8cf34d1e8337dd38e18eb82f" }, + { 5515000, "0cf8be6971adb8cf829cf86708f5901cfb1f7da18e484fc5b36b65f30cd45a39" }, + { 5516000, "c2e21fc5e4d9d57a12414b676be3b3926ce09b50281ebf75dbe541907d8901c9" }, + { 5517000, "c89f538270c846abec2cbe311e8f93821754c415dc8a3cf20c4b5f547250ebb1" }, + { 5518000, "282744a10c3a6d9d219671ac17daff5ee65f8c7d6e2140c48c96f13dc9579c95" }, + { 5519000, "def3d12e1e4034bb884d0d38e3092a0889a4eaa6712edceefa40f91f8a0719e9" }, + { 5520000, "1ff24fa1d9dcd7c41776ff87fac6b832bee8981d1fe8b65cc338fb5efede10e8" }, + { 5521000, "43a0b556441b0247291a17dfc319600f7cd66645e840c6c2e17272e543aad895" }, + { 5522000, "4a6022185f154a8623059290d8e9c09ac2e8f1eee9414516d477d747ef0df586" }, + { 5523000, "6d02346a84a9dfc45d8cf4eef457bf41224bec4665bec5b7d711ba0f5d83d991" }, + { 5524000, "2f69dd48662dc854a3c3c0c519275b366b86bea8fe845820763722f9309af52e" }, + { 5525000, "088516428a6f21306bc0c37b0934de94ee10164036d9f1b8d5998a7415655cbc" }, + { 5526000, "038520b594654b6854e81f758f0ba8f684577bfe2854514f36b8aa97b0ff8470" }, + { 5527000, "b5a882d6586b643a7e65723c7692a24c9f6cc129c6e0d3cfadda2ffebe9b2591" }, + { 5528000, "540e559ad2652ffbaa3c8c1c6d48fd1fd1b89e27dcd2363280a9525327b4c3d2" }, + { 5529000, "a37a01e8f16d596217d4e79bc3b01958b99b711c2155afb50392fa4e20f0dd19" }, + { 5530000, "38455ca91de6cf306ee463ad6b2db25325961931778361270953a8edbc3e1a94" }, + { 5531000, "4a8e53254bd514480a3b6b1e5d14d2454242ea4b891aa103541f559b27542394" }, + { 5532000, "a2bf9dbd7d8198c35ac02f5922123dd3469fea5dcf093fa1e93564fe6c3689a3" }, + { 5533000, "303c2ad45b2a4184beaa5649b36d744afaaf7c2403595e038d3468df46ded188" }, + { 5534000, "edbbaaf6072f6acb5e63974a37d92e0675fcb316251abda5fba075b163fbf920" }, + { 5535000, "1b6287490b0252a03452da8b12903f0a3c1cf16206e8a91b22f84decc3107baf" }, + { 5536000, "4483635c88610d6c708247875c981db64c5d8052abf6c2da85b2e5fe630fb8c1" }, + { 5537000, "a5ce69556c1cf41d89cf0a932756955f0417af061f1add84f17f2041da20be40" }, + { 5538000, "104eb3f78ec9320f9a8c98428434e985195c27399a61fd307994787a6401cfb5" }, + { 5539000, "eae9de497525d94f4ce055e258d3be82bb3fb004cf515d3afd9ef232f2a35882" }, + { 5540000, "7d3986f17150f49e2a24bb814743be6788441fbe02377fcacf5c89d8368ac416" }, + { 5541000, "d1cde1db85d0bd78e788cc6a1bc06e9a4688fc4cda105d5c538f63dc98d541b8" }, + { 5542000, "b348663002beaae006edc7caef916d154ae6c1b496ee20d7c165cef9843f3b5f" }, + { 5543000, "5c0ffed08927470c3e5ed3cc7ed09c62d12dcb8455e8c7919ce6b16189f5aab2" }, + { 5544000, "f27e1bb26e00519b095bd64c56113be9ffb23a1ff5bf5fb8332ccfd373be7de0" }, + { 5545000, "fb788d23abccd3015d6e6c48dbc5064a3408338c0313e32684f6b0ce6dce1ba5" }, + { 5546000, "494e77ae90cd832b398a22dd31f96fa5969a6b4f787b15a74716953f7edf22c0" }, + { 5547000, "dda3221e911bb4492a390a24d477d8908cdcba8c067359b4a7f46d0e936720f9" }, + { 5548000, "076e8ed8354403a4a0356d827fa151a46955d10766049d10e94afb49aa502136" }, + { 5549000, "db04d526b5444b235f4b2adb15b18823252e337ced355447a07358aed979a3f0" }, + { 5550000, "bb9a1bf26441f230b04b3bbfe5fc32ee35b6443cacac3f9b9edf32f5ea928fa7" }, + { 5551000, "5b5a9ccf692555ba72ce959ae210435b8bb410ff4fc27ee3d73263432c1b53d0" }, + { 5552000, "5debfa070e0ff9fe5972f46ab6648cfca1f13bee65ee0d7181811210e593f94f" }, + { 5553000, "3a9c54217be24caab51d2275d8774f4c6da8a5623ed24d9d59e88c501950c4ff" }, + { 5554000, "df5d9cfa4ac71dcc4e0fdfe70f589f92a9398965744b45bdd51c7e8472c29481" }, + { 5555000, "92a78e3c4d28a7eb02560a5e72fae81eec9a449c0c1fc2b9ecee81e65ae29787" }, + { 5556000, "357278b459fb36f091790c2d52518bbfc70c21937c62b4dca52699724e6a590c" }, + { 5557000, "1a127d2f7acbcc927d07295fb089268c8259e1df399f5f9575ecb95f17d54b74" }, + { 5558000, "76d2842270994702301d93425f46090563a2081a7d4632a6618873e13aa15b45" }, + { 5559000, "91a294a2df15ff0923fd3c67295e4e6effb96cb136109b55bf6e614bd35edbe1" }, + { 5560000, "d4158d7d21fbd60055a0b5cb780bb6d7dd67d02075ecab029be7286a011c0670" }, + { 5561000, "78d2242948ad223aa01e5eea95a584aa0c2b41d24d2dc42fb204e31a4a1afc20" }, + { 5562000, "dacd9ed94c648d60347c48002274d34793513a3c7b4d9072ddb5c0e115c8100b" }, + { 5563000, "6927a7884bda558f9b5d27177f6bb19e0284d6f04d789b1ba030a918ccae8243" }, + { 5564000, "d28229def359eb0a80f08cd881cf656fc0c783212be7bc6fe0daa4b9e100000e" }, + { 5565000, "847438d24687f2d5906860834a5d350d7dbdbe0169696312e4f605333c0a8c57" }, + { 5566000, "fa724d1a31e1777a1cad514234ea668a3009a8c7c348a54e4228a714606ebc37" }, + { 5567000, "26f831403f59d08a137a54645ff2397801e68fe61d83f171b8ca038122adfe22" }, + { 5568000, "3545a0937b564a7650e21c873cf3e12d09f9ec74bd964a94f3c368c116c19209" }, + { 5569000, "c57fd624e648dccf0c40aff75cf12011b7501c8f8fbe998916127beb3c11c2a0" }, + { 5570000, "c2e249344020136fcb351f4ae0599d2e19245050b82acaabe641d21bc82322e1" }, + { 5571000, "efa1d76ac10c14c7e951a24cc6535a6632a5074ace8e984e206919574bb71582" }, + { 5572000, "b43fa369e96c5cc6333433e11a737fc40f33811083e54b5d9a83fdf50cca4748" }, + { 5573000, "44715d9c36550a9a595663bc8f7781afd99aa8796b516c31416828be736a46f8" }, + { 5574000, "8cad62b7e8dfc8c87aea5343648fc88027c7c05351ab9d902119fb4fd71c514e" }, + { 5575000, "44bf3e50dde2e9165434ee48172b6190ee1cc2fa3fcd75c123f48fb4bd1d333d" }, + { 5576000, "4df747800d05da06267010dbe5933ceceafad44f68d757ec44ecd2b0762c3d2d" }, + { 5577000, "6f03a10557d27abfaf5ea2ec99fc4ed18488ba7680aa3a8fd9b6592db8ef072e" }, + { 5578000, "45cad03443b320aa0e37988461436aee29a05e5b130bd1be3d18624e6ffd39cc" }, + { 5579000, "7e73ec6c975aeeb6b6852d514aeb3c6e338acf9bc7aa33b6a8759f5ba0922f96" }, + { 5580000, "189d051ca9fe119ade5eb7e906a4cfbbbe142e6de49b31c12d24e571360c981b" }, + { 5581000, "2db4bed46ee0cc226d5add6c95fa18f05318c6e49d46c8617472b0533f4fcd8d" }, + { 5582000, "cfb281d42a188f2c8533c8ac43c58e2975121ed086f0d8ff0e751464b5f24283" }, + { 5583000, "67ccd0bbeb6127a46a21e110d97a75fda7b5a0bd4ad274285562c927ec4d10dd" }, + { 5584000, "9e02a834a5a74430c2b94e72f059c0f7fea7af6b554b8a6377032424d46fdbc5" }, + { 5585000, "3765577f7c53d57db535799a31cee0db07d9507e5c12ad6bf869ebfc91d67e05" }, + { 5586000, "2bd65ce137baaf2b08aabf57f0110ccb95096a0325a16bca160e2137285b80cf" }, + { 5587000, "db99ad0648b41a0e883291811de970952497167006db3e9312ede9148e52a981" }, + { 5588000, "e5400c3f0a42131e33fa0e39976e53be86111dfaa682e98fe2e221b09bff9713" }, + { 5589000, "cfc765fd7ba542a3759275a4265a5bf2dfb65ef86406fb5ce3afa94446c99507" }, + { 5590000, "ca5aa6587266842101196c26d90a6ceafaf1ee6f3f7b3a52fe71dd98b50ac626" }, + { 5591000, "f8766199193768df556f6691eaafb650958e5fb9a39f244309f153433179081f" }, + { 5592000, "a55dfc97af32df02a34cc45be261be8f728d85f009f8ecf290732b5380b726bc" }, + { 5593000, "5d5eb6a437e33f074c6a684885fba440ebd2b7dcec4dc7b93da2ed9df33480df" }, + { 5594000, "4d7316c09a94a18f69e7a1498ab88f5f8500a378e9093df7f5d797cbaaa34754" }, + { 5595000, "7d18bcfdf175bb51ebe2b0c159c23a47af8cd5514c8e2123db83534d649ae6fa" }, + { 5596000, "14511ec594721f108d5df1bc764d75922239fe12cb74234b17c6498194d460b5" }, + { 5597000, "1c5ff9436853cffd739f53e31293a310fd702ee9e1059af57fd8c52a4e15adac" }, + { 5598000, "aa40fe93a8082e922e7e76fd5cb0c8573682297d15216f8fcafda9ca74669df3" }, + { 5599000, "c3857c80b8716222424eb1cb25de3280e8d79668312c699a13c27b9702aa8d74" }, + { 5600000, "7966d4855c4bbb9835e828a6a7b021039779b35fee5ae2af6d77508d4ff5b545" }, + { 5601000, "7d7d76f3486a5897b15d13f9b9dd1fc32af2739f863bdd0e801e74c68f39bab0" }, + { 5602000, "a240cafd8ee334acd47ffd3803da6ab77c810bd1679b1ddb68594d8320248c1d" }, + { 5603000, "fb892608f29ae22705ae964d648d8af95b05d7f43eb8df171ac8485679ec8448" }, + { 5604000, "621530da7fe307ec102b100e2e9d2b22d658882a63e145414f11ca0ea513dc6c" }, + { 5605000, "73341c675a782f3493e5497b978d1cfc897cc1d35f7569533e4dbb81ef737fbb" }, + { 5606000, "4c87c3ad00d372d6a1b04c7411f4c1ceac0ae3b88f18a5e8a23946fecc2299df" }, + { 5607000, "6c36fb62dba056b679cdd186d86af0e1f3fe5d11f84a46623e87131939486c72" }, + { 5608000, "1b6fad9dd61ab166462cb71d327f561c7d94f994c140ef31b5fb11bc23f1091c" }, + { 5609000, "55f15711bd80e4262df4730649ba7272839096148b17a9f35dc9b6b00cfe8896" }, + { 5610000, "fb550f35f71a66a40522fc56f7eb9a85ab8eaff664a520c885805a91fb1231ef" }, + { 5611000, "59cec427c19e7be89703661d6d16ec32d8ce189003b8f6d4c5b2640cc8ac5507" }, + { 5612000, "9bdd19b61bbc683f1932996c629d315ac5a44f77b396cd5e15bb9b95c50289d5" }, + { 5613000, "2694328b1090cb1a551d907636de47c1f544bd98b9daeb6c24ba855b18928e57" }, + { 5614000, "ba8d64671e062fa5dfb7c3bb2dd57dd9ffe226c5d12cf7f7b35da0a9437e9356" }, + { 5615000, "c854fbe4f1556751f0ad33f426ca78651227f59fd02662e0614eda8aadc6f1b6" }, + { 5616000, "44db5ef91094e3d76e8b4fee98e2d1c2a5cdd25320088f0f7195de9e8f08248d" }, + { 5617000, "fe794e193682667f234ef210c2e7ca19a9cc1a3256b6dc98bf8b265c5b0157bd" }, + { 5618000, "3213c9e7bb7a670ccd65d79120d3423f689780d5bee781f1d814be0ef416344c" }, + { 5619000, "e75c9276eaf1acc24521d1128401d52ca564cfbd19d0d1e4a0e8d38a3ae1648a" }, + { 5620000, "5c5858d554a4ee738f80bc7ebbf2c8ba5989f2afcc829eac07d731be89646c87" }, + { 5621000, "efd39521bc4735d708cd965500ae7ebe2fa132a154630f932fe6ef7cda34c8a9" }, + { 5622000, "6ada3bffc36c4d6102920aac0363d3aa444abe90190bb1bb02edfb4b85fa7a14" }, + { 5623000, "c04acef94e292ce69638c19ed35d6b3b456240620bb583e53b911f7107e10d18" }, + { 5624000, "312716db931fbcba06e3f279196884b1cd590701575bc54848434f6fc0c24144" }, + { 5625000, "ac5d5a5c98164d08a3a084939e18074a0163bdcb0c1dd28dd7c4c3ec06832622" }, + { 5626000, "6917bc5bd6093918cb0b3fc61281287f2e773dd354112b10f350d480b417f8c0" }, + { 5627000, "c194801ae279533a546a9ed9a6c098bd7909d3a93b9441530739f3dc71f382df" }, + { 5628000, "dc956f28ff8756c9b72a345c1f2b8277434fb317c291ec2e182dcf63022a115e" }, + { 5629000, "aaca9a965824c353ea2c03c2b06f9502c8c5d2c75da9d00b238af21b239e81b9" }, + { 5630000, "56f9bf5f33f3d817f315ff5212b0d6c3305ff58e0e0eb663f5adc0a5e33b34d4" }, + { 5631000, "c6a8f221f2b17c5964b044b350379babfa302735bdb1bfdebfe2d32df04e0de8" }, + { 5632000, "31d24ae96d6e2b0bf78a578bdd8b9a78c69a14f76adc48e0c46410abe6851806" }, + { 5633000, "16e2b0482c1c2b144439fa0f50e5d17582899438215f6fed1ac0d23883f6b01d" }, + { 5634000, "3ccd1ea63dc6d1fc853c4da3690a4e79d52ef672da0bce2ca35a142bb12d5e2d" }, + { 5635000, "046a271169b78e1dffb16d2f82c7c4ca27be987d809b50b69d80c01ef66369b6" }, + { 5636000, "1182001eabcf439ed62d6a5b905c42754748c68413926045b074f8aa2588bb23" }, + { 5637000, "eadeb7c4fea4f1b349d2961e80a00c20488f0f783d8167111f8ade47a9646528" }, + { 5638000, "9f3e64b2057161b7d5f1e4c67bb9f0d6d128b6b6109ade55f1149398570acd96" }, + { 5639000, "9a100245beb64d5e4934edaf888519416e69053ea2e3e186ba734851327ebb26" }, + { 5640000, "298f2f8bd4cc3ecb00a3b1ed7783868ee4f8dcd690592da003cc08f28164e87d" }, + { 5641000, "84e496e208f3279a5ef877fc772f1fb7d8a84e11e51c656e1d0b93b13c2746dd" }, + { 5642000, "4ad075303f144ca607dc6cb66da6388317353746a030312cb268ee32245de004" }, + { 5643000, "4e3723204e3ed76ae0c99ec9d2237044b66d1e19bd55c02f363c4e7b34c2a2bb" }, + { 5644000, "b53b3d48b9e92b25e7fc90851c73817bfebf4b6a4066b20785bed6e1c5c22e6d" }, + { 5645000, "defab34c439caba94fb94caa0aef2c6b60c044c0818554fda0af3490c0877b7d" }, + { 5646000, "a34669a6969f12d9f5daede49124f4a9e7f5b9a9ef1337c942349ed3776baba0" }, + { 5647000, "86f2614cf41533d4d65fafb3c8604a46d79613605882f36222430ec63975f935" }, + { 5648000, "56d79ef8bf1937c891ff00e7dafd029d8e094073edc17f59cb3cf481947afae6" }, + { 5649000, "ff005e36286d3ca8ba134b0b15ce9a8fa43907576876319e159e765c38f4f825" }, + { 5650000, "cf69d269f9145b5cd7fc33522b360b3c7589a31b44c7c57736f4e388b7fb167c" }, + { 5651000, "587f3c81ddcc90c2928c21457270b91ce25dba1fdac8f82aac4398fdb098867c" }, + { 5652000, "e46b3771a2980d4083e4dedc1abd8eaa3077a391a07307b8a065f4ba90cebe84" }, + { 5653000, "27b95f115ce239f0a3a8df1e658c361b5133aebdaf17d4f68caa4ab947023428" }, + { 5654000, "c528465c02fc90006b0b03c1a79f392e55493bd0720e1e6d4cee2667cc49f249" }, + { 5655000, "0335bb261045db7976d2a6c62ecfd45890ffb805a3067079642b8cf3899cfcf0" }, + { 5656000, "4b4fcdd345873f1d7dbcc1ea824cf610699931c07d59344353b4e10af4a802be" }, + { 5657000, "7a8aea71697d64bdf9d9fc29f16a54470905d4107c4bd6860a37ac2f7b03d51b" }, + { 5658000, "9f253de52cc682b178930274fe8797c257f5788dc5a30b27291e1d44c3156ce6" }, + { 5659000, "142231ea77ee3ede0d43a3b47e5c6f3858a59566fdc7bdd2025e04912703bf08" }, + { 5660000, "2d3785bae68f56f50a912568db92dad44f373cd205dbdfaa3efb3c8b0c9ca746" }, + { 5661000, "79e2c3d52b0655a830bfefc6de52cb9c3def6fd2041d18ce4312119c521eda7e" }, + { 5662000, "9fd013d1c3959a43c8f852f0ca96fc3797346c184a81a4d77d80269a17eaa22e" }, + { 5663000, "41e594fd48c2f34d268eadba2c8944e0af37df9105320929571058fce6e63426" }, + { 5664000, "c2d54815f9310af0429fdb607b78ccf96f207e21302aaff0088fe7ec27b5f038" }, + { 5665000, "745aebe277953e721222ec47a2c4a7d41091e9331a83fb8e7f30344476e0a2b7" }, + { 5666000, "5d669e47ee5f1e36c2c802489768b61a0766dacde0609529a1040a36fb41e839" }, + { 5667000, "6e2474a37c6adc1520567ebf1084e46a15e6066b00651c8e0bca06488b4d0216" }, + { 5668000, "c133fbfdba02446417ff18716f590fa14e0e500983c02be659b1eef35c108650" }, + { 5669000, "5ed2b24fbc85a6bee59d8629f0e3959812e112356640b88e040b7e7ef14ef059" }, + { 5670000, "0e2319eece4af1ddfc9e238fed813602c660b8d3ba4c062f3a6ebbdf594d4d32" }, + { 5671000, "f8befb010b210f29044645d87c4edd57f808eec9bd0337b5d573b241c3ec4408" }, + { 5672000, "0a99f39acd64985d933fc7646ff26713b9cc826fcb53082cfd5776e63e0bfbda" }, + { 5673000, "66d9abda7e3ccf394f067ca8be63ab1e58e6965fcc1a21598f61cac4184a35f3" }, + { 5674000, "a29819096103dde605eeb0665c3933902c0918c803302f84597aa744d49a8700" }, + { 5675000, "01cebb3b30e5897e25f18e5b07ab4338c34878145adf04dd321a1719a57f766d" }, + { 5676000, "b1150c1bce5e276f26f9633bc853ebb0d0a2197ad9242c9a8dcca67fef1a5511" }, + { 5677000, "f2aede0564e5158cb739762109dfe3ef2dda671119fd15c48a4b76af9a9f820a" }, + { 5678000, "653a034a0a62bd41727c10164912518beccacd343053992ce5ed80258b53fd64" }, + { 5679000, "3e2e8669eb50c0665089100ce199fb800bb4ff71dafe225f744a8f019fce4640" }, + { 5680000, "193697b8983fab6c47c996958f33685aadbaeec39261e5e67b0eb5ea019b41fc" }, + { 5681000, "d24dc9850b79f175bc62899bf2106c6b81c853f9e1edf65d42610fef0e965a80" }, + { 5682000, "46aadc8fdc7fa5b6f9fd4a95c1193af504fac198f21e4abc7cd9095c8fe001bf" }, + { 5683000, "8264a1856606905b557a5c5c2c30c5dcf2cec64b6fa204efa7c73899899a4548" }, + { 5684000, "de5173f8f216e1c98e579716669362dceece04c49381ac946d348bcc86fc7f01" }, + { 5685000, "9e1a6eef88f1295171c01572c2cde124d2bae27e7a418b10602ffbc177cc25c4" }, + { 5686000, "7a81d5d029688982718548e6ae585cd0d3a94d0104f283ea9baf524d4ecd4c62" }, + { 5687000, "c6cdff250cd97c59cba858379699f48cac859854c1bcbaedff00c9a171dc98b6" }, + { 5688000, "68977e3c08a262060954b31d4c15e064cab63546ebd03cb8b71cf3e879e8612b" }, + { 5689000, "be1952a6b162bbd7bd2f820f09a26cf6181a31f91c7c0df39536b1effafe56be" }, + { 5690000, "75aea3a293c125ea9bf69671bf9ac005fbff3bce5d0e4f700b29c2d525b61c77" }, + { 5691000, "7b6c820470bee36716966a3012c2b8c7bc29df5400e2b64bbb3831f407965260" }, + { 5692000, "ff2fc0ec8557c53598da7e444a40c74d15bc54c368f0fcb48c8eca039248af13" }, + { 5693000, "ba268fee5f46eb20a1dab7bcb85607174e46bf4b888744389d88834ac9d789a7" }, + { 5694000, "c766ca8531529f6b340678f330bc826053f383d70fa0bc002c6d80fe5464feb1" }, + { 5695000, "55ca20e2026a041153ab817bd254fb7c33edf1fe48b1995d887ce327aad2a73f" }, + { 5696000, "6aeee35b1d88dbe71b788557210ed803623ed90503665826341be40ecbaa0ae1" }, + { 5697000, "36394c2e43bdd5f14405a4d6f49f271774aa7fdafde59354b6f9d3934ecfd1e4" }, + { 5698000, "b9419896867a46686b431a878c467a8fa04140dcb9e90e0ccfb08f2b0e6a65cd" }, + { 5699000, "659d2def44271f84c4915ca5fbcfb1171d4a6b2682ba97637c422d869af2127c" }, + { 5700000, "8aa5036343f806cb08cd581caaa5aec716989d17de2c7cc0a75279fddaa5df7f" }, + { 5701000, "ad3602458df2215cfe93f4e39bea902d1532da60863c4904c9c5ba3ccb36caee" }, + { 5702000, "d04a4e6867b572ccae8b47aa1fae59f1f497a8678e476138fb1125ecf87a436f" }, + { 5703000, "d9b220dbfb040336eafc4539493508442e0ccb3d094a4170d9d02ef667f0dc55" }, + { 5704000, "9d1b2aec8e93b6d850a940b06521259053f6c100a0496471d2269572db713eca" }, + { 5705000, "da6c0e248a1cb4baedb340a5d48302ca955fdb23c41554e730b70f69f937af4e" }, + { 5706000, "c4d1e77e4bea8ddf965343399c8ad9054e43f8dc3534e363d47e348e2df9e00e" }, + { 5707000, "471c1412c225ae98a29d0d4f866d7bb7bfeb0e6631c8bc441d12778337c915ab" }, + { 5708000, "5cc2e05f5c1d13095b6afa16da19bb22a4bf1bef289089f5ea632b1e19649471" }, + { 5709000, "4d0cb9718528b82849546f40bf7710f0fe9332fa59ecf57c3837525c82573643" }, + { 5710000, "da0b73a36d141d86183e6119879fbae32d325c4084e1a6bdbb722feda1f07174" }, + { 5711000, "f7839e6fa6e4aa2ba15eb7cbb63d49ccf061d9081e9bfea9d31a7e1911c0c5e4" }, + { 5712000, "c33f7d48fb271f40add38e19335ca96525cb7d8181e46cc3ba61b663a961553f" }, + { 5713000, "690b353cd628ee2657c87e94855edcf5c95537412d9de5475c946b093df412a5" }, + { 5714000, "d31cdf9922219c34f0908db2e1cac113e276dc9b8ba0ef11917d331f760ce9f9" }, + { 5715000, "a614f0bdaf70d4b62d25b6e516c1968dcacd3528b127e0c931af07c704b5415d" }, + { 5716000, "b3204fa04723d804f1e9f3c996042a22dbc1ca6790b5d78fc7a318db4f3ced46" }, + { 5717000, "43ab09f54fa4ee121153d0118cc0c713abe5cf18f9ef50b7456dad9ac28b55a8" }, + { 5718000, "0403e78ba69decc75a7053ebf4d3e84243e732b378f6a61c8b74053b88760d08" }, + { 5719000, "16cf89e2865445996b270e4df7c02567739456bc337e3a11f6ae0ab0e259508d" }, + { 5720000, "d482408673824fc37233f3f4350bd833a2b6a30334a21ceb69b9ce041a5599c9" }, + { 5721000, "a677e6a03a13c3203c8c5a750ca84774e2d9d0a8f995bc427334c27055f60539" }, + { 5722000, "c9a74a06cea9008fc6cfddd914c879fcfd1e0bd604c240a6a7a2dc0d5befd0b3" }, + { 5723000, "1b01082a16e4fad95ca0a49aa914c0b362433086cc4b979430b846521d2e5302" }, + { 5724000, "bb5b5ba969b3142741fdfce938cb66e0e45fe602ed062fad3f11d5ce4f4a46db" }, + { 5725000, "da68878c126859da1e911c8473945d54dcc87ff991659f1db5df651a6b8a57ea" }, + { 5726000, "81ff65b5649d1f9c46d4b9c31ed709b261b055f0c0e2abb35fc9d4ab2f630716" }, + { 5727000, "a38033718b8ca61b2b17b6eb01e739deb4f1071b7f6acbc1432630201a6db1f2" }, + { 5728000, "ce87689fb03710c0f04d4ddf5cd277531717a8da9f01578e6dfb7f69a9b8cf97" }, + { 5729000, "b53c7f1cd9ba3ccfdeae9535b88c336c329b30415c8d06a3c976d1f38028fef9" }, + { 5730000, "ed048b6620e5ce1c5177357db998697b135e348d7f38fbaee52da6c44e37d7b4" }, + { 5731000, "cf01eff170311a0927d04c9d71edb7de79a5e1a1aa099954cda4c9bab36dd93e" }, + { 5732000, "11fe4e296251f32cae0a20ec0a3e72025bd95a94d5979b5ce2354139c5477db5" }, + { 5733000, "70a94d727eb3de14e0c70efde21f6e1a9effc4289cc5bdd1c295518908559871" }, + { 5734000, "7a40a4e02c2bf7a4ea1b0a250e04d58c97011751eb49edf5c1fc688e8a200c95" }, + { 5735000, "a8526caf7aff087803ac138e400f18acaa8c9490e556d881e774b365e7b7efd8" }, + { 5736000, "a40dfbb728c7fe92401c9385e0aa9f381078e97cd3641bf835cac4755e586861" }, + { 5737000, "30c59141fe1ad4a42fa97ac73a33f862c8cfc5c8c009dfc636034fca7bd40db3" }, + { 5738000, "27c3693e48343f5e63c4910d9a6204b0823e0ba40bfbee05a87e03ab22b13485" }, + { 5739000, "4c8b8db9cf66f88dbc459fbe8154889d428a62646a8ff324f62b145c61dfe823" }, + { 5740000, "7a5103f8d47639a6ed94a5a70c3dc0303d4386426d2e46031fb37bbe404109ca" }, + { 5741000, "afd16e3728989660119ca2847efa6649a3fbd491335e7006e16cad54842c5c8c" }, + { 5742000, "c208111b42a9141985ac5caa05d0552d2fe8a2e74e9fd6990e23fc88d433dff3" }, + { 5743000, "0df8d3b48249dc38ef9c5cde690402cf233c7fe4e3ff83693f958f2e7902b7fc" }, + { 5744000, "0cf0210e0727aef64b8bc15c97f31bea1d8926e6242939d57b637000aec09818" }, + { 5745000, "15f7b5cc4541d3c5debbcfcc57fd4854af4c68da74a8566babd64eec1d00cd1b" }, + { 5746000, "d4070c06907fbb6d3a2ae531319daa728ed093984d39ccbe3ecd25c88b37c3e9" }, + { 5747000, "3aeab126dd821a856c803e644f6d0d689b9d90a57d23b49d7428aa8693a42c9f" }, + { 5748000, "4f78f83abd5634f2c142fd108398fb6bf508e52c74a8839a1d04f7945d95f177" }, + { 5749000, "052a3f9df5d912aac4c3fe572d0d6b370c97d2418f109d187016b27e182ddb2d" }, + { 5750000, "2fb9a96155b607fd7ac38b7195988d77961456c905d3f5cb7b9ad0da1504adfa" }, + { 5751000, "11b52452f034b69adc97cd0d7888015aa77ed8578a9ab83ad967a2413e305866" }, + { 5752000, "bfa9c55a2b0d464f1fe02ddda40730074a49e4f0384f8501345fc7c90c6ea74d" }, + { 5753000, "e0be1ae26c4f31fa1f0b2f314c8abd14e4f02dde6067f301775b5de33a57017d" }, + { 5754000, "2d27472cd57fb8470ffc7d6353822be57090af61378ea30093cd4c90e8012694" }, + { 5755000, "a32d2da9d5cbcdbe3cdf5fbec2f5e7797fec473260c4848052c043b8bcc69709" }, + { 5756000, "52099f3b715772d2098c052d8058bc1e81399ab4b5ba5b5b8828cf275d572d1c" }, + { 5757000, "7c6b42f6c7614c78ca3bf193ad15ba8aa013e0d8367ca5cdb29fd56af71bd8af" }, + { 5758000, "7a74fa3517505565a2e765575a43436ca4486dc232933a2012ed14dbd13fcbc4" }, + { 5759000, "3a407b2b5a2b30f5cce4961ab891b9ef5e068ab6228b55add09ef196af650b6f" }, + { 5760000, "4a59ea0a138035857916a17a8e3b8d97226baffaffe2a22133356fa136ba5069" }, + { 5761000, "f4e0b209b2ba3f8bb3abec9a86dcfa0870bb4c2591995358f46de6f049db7c10" }, + { 5762000, "def06f162678dbf520e8408756c10694a02d9784f6d1563a8a5930d7dbf7b2b0" }, + { 5763000, "d8473fa9729db195433f5c4f6b3d9680da38e6d4f4eabcbb6d77ba31b5c70f8e" }, + { 5764000, "8d98510a77271014c7929284c92fad68508dfe28e90f90ac002d0b843ca00ff1" }, + { 5765000, "01424f5749aad879f3d5f5be65ec7044e984b3b5fd1f3afa754af2f83a7bfa14" }, + { 5766000, "f6ab720975970b7da797faedde3c459943675e0063968bb2c7f354c05676b4ad" }, + { 5767000, "5326acf624d042aa12bc3457e12aebdf1d46fa4513ea4a0e9a4c8b84caa2da0b" }, + { 5768000, "8727431c8c8b574aecd9022c4438b9c07b5283235c21acbb54c9da114bbb907b" }, + { 5769000, "83f8ff518582f050cd23defdf2b08a526e6b8d9ea4ed62166c4629812f10660b" }, + { 5770000, "49d0018ac6653b70e4c5f85437cbebec7f15feea8a481b289eaa1ef63e340f97" }, + { 5771000, "acaa32cbbdfc0e840ee9a375a54c58839a77579cadafe2dabc26777d61ea20f9" }, + { 5772000, "a4d3eacc3a69ead1e710d48943aa25ef1f62bcfdc268cd4bddc78cffb16fd591" }, + { 5773000, "f2b3c926dccb11ff3b35b6f12fbef26d5cf100d7dbdae7ca279ce153e0eb5a3a" }, + { 5774000, "00bcca1e18721e8997541f1eaab3600288a59c4e3ac88543c7fada6a0df86606" }, + { 5775000, "04c8030c8c87611a59e3fe0c8825a4fc719f9719fd8411bf8cc239d9dd64027d" }, + { 5776000, "65fe4a291883e47af80e224f4a850e8ab3aae560efaef9ba5f9b2ca3cac0694d" }, + { 5777000, "02fb0e446fd81242492b143c5bd96b214586996028a663a0ae89edf0a8021c22" }, + { 5778000, "45f8f6aefad9b5eaf7a3949384629a90e74866eb5cd48dc0504ca449759e171d" }, + { 5779000, "57ffdbe762fa0b5586bf58c6a6e500789889b3ed9c3460166f2636e76e440e9b" }, + { 5780000, "3bb3fe6a6a9927cc2fe7faeb39ca15312384bb034bfb216ea9198142350e191a" }, + { 5781000, "d8893224e6dca08435f60c356fcf69601e0dc56c8e7e7a399ecf32dc68b1f8b1" }, + { 5782000, "a43cbe0fd1200a5b2c860041f66970116b056db4d2d3be232273d65e2e80dcee" }, + { 5783000, "17ff07ad9f523f99d96a4681ffbb74b0e575c4f0d8203dccc5e395f08e71fb9b" }, + { 5784000, "ab59783a86b1ce5c384a95c147ba355185f1327f5c60f8207a0821bcbdb656a5" }, + { 5785000, "e1f2e130e4fa083a190539518e1881e97148f33f98c2aff1d47acf47e9d9f821" }, + { 5786000, "e856482aef8e77ddb266f2e9b464f73cf981126ba1afd2c0d897b051ef6db1f2" }, + { 5787000, "8c257b3510f28c3a486876015a49e6876ac223d27139607a6ee2ae7595a90440" }, + { 5788000, "69fd492b2c85ce55f307c0cd4813a286915b2228c4fdb30263f7de923523b37a" }, + { 5789000, "d95421ade8f1378a33eff724527efac43b73e33559d6903b201f1c4d0c7cf8d4" }, + { 5790000, "023527cefe66171b3015f43067802752982ddda999f9a00ba0861a5b5b753b8f" }, + { 5791000, "6c83e82060939f26a39de225a9da6afba4b83c5451080b1d794095ddd9c77ed1" }, + { 5792000, "56ea6e0f250bad29d218d11a7e70f6bf77a020b05aa1f381f24dbdf0f17b108d" }, + { 5793000, "54776e9e8a7cf2a343542b9691b3f164bb3ad26e6f3385ebeb243761e2086385" }, + { 5794000, "c0e05f2cc5e2f5ac969cc9fcfd9ded2befa00183a519ea240507ce834d201ee8" }, + { 5795000, "329d66af280863332af71fd108a4e0315915865b0fd7df02cb0c7f7c0ba3cde2" }, + { 5796000, "0c90c933a9d6ea72bbbc0a64e4115b4b3157bf4a6944af4d7a3d44dd1a93faf0" }, + { 5797000, "e06c4df0bd5ee93fce976b950f54f513b6f6a472a0c9aefa12b68be56e240c74" }, + { 5798000, "8805378b3e2d4f92a711508ca9d2b44f7e5b666540c824f63e994733eee32b01" }, + { 5799000, "9b4f33bbd26f18d9fe5ea170d603a720f76e718886b75b4fdbcbce5376081183" }, + { 5800000, "98ba02d82a69f91ec1b4d84d8ba0aa315a6eb25a4eed9f083d71f933d29d3ff8" }, + { 5801000, "0c25841beaef17c5e74f9748c9084b238ceee8c9a470b6fbff13c597421e4f2f" }, + { 5802000, "02df05ad844feff05c934abcc559a385c94fa24e9d541767963031752ddd32d4" }, + { 5803000, "ed5ddcfda23b7da898690778b9ba3a8444a52ebb7bdfd8851bb024f0fe993d5a" }, + { 5804000, "b20dff67543be3a142cee27f7195d6acf12a9c77eefc804d104afc73c711ac39" }, + { 5805000, "64c64c68eb16af832241b7ddd2c624f920ce8059e7acac0d5b997f8f59d144a2" }, + { 5806000, "a28c810e1efaa18196071cb29a520e538b8aafd4755b64f3d4f1edbe7fbf0871" }, + { 5807000, "738ab121b14ecc285f0d08b5633e9c4c5e8516995986846134ad64a344dcd9b7" }, + { 5808000, "d26ad1b607393a55428d96ad694743fbc2b813da72319a2884049766090f078b" }, + { 5809000, "528152cb4d6ef861e1628a225d8e2cedee569e946fb4d7dfe8a03738cba8517a" }, + { 5810000, "b7ffc28bd16f463c9687cdf74890f74339968525bed721c40fa845d6df35f5e4" }, + { 5811000, "5e1191694d41a7df9e6dc229223f3edbd35d21596c15190280c9b8aa8ffd67e7" }, + { 5812000, "f415ee6bc7db90bc8f492f353f95b67964b59326c624bf9f989a9dc1a0b0447a" }, + { 5813000, "eed9341867559bae9453955c42c568a2b5a01f8aa6cf654b94fb0d7acc19a1d9" }, + { 5814000, "56596e31549b89aa6e47e2391b80b750f0df3369c7b5cf07e81ffe0ba6122824" }, + { 5815000, "3c52ddaf7efacee073af3ba12edb5b778cf79b73282f90968458a5ee8781a0d3" }, + { 5816000, "861e5c76fc6e54b82606d1d67bf48fa5bb581cbaff1a01d224804293156d1c0a" }, + { 5817000, "5e03ae411a1155996b7685414941dfa36335cf2fe4e9f02be5f0110850cbf2b3" }, + { 5818000, "40e482aafea013a396734f39bd8c958b7d7d1b46e5650b9da2ccbd3bf9f778f1" }, + { 5819000, "01244257d3aaadcc13e9b1a3c3612ff7ea110bff9fa1fabc43a87c9da7d710ed" }, + { 5820000, "b08d5f50fb98a787a24cd9bd6ec7411a8dcba24dc764f87a9ebb03e032bf449b" }, + { 5821000, "298877f7b2146d6404de1189ec55fb625d71668d21dd73752dabd25ab349b11e" }, + { 5822000, "4bba1e9040ed450f975e32577f7c0e9c55a82dbb9e88953de4d1230714933dbe" }, + { 5823000, "b69320ab914fb91884235ea316c00bd2dabc04a85406b0696a8bf63a4e7ca47b" }, + { 5824000, "4eff278df8f86cfad3832db15d1e7feaaf0ab3db5b66d4ce0df397625d8e42f0" }, + { 5825000, "748c76effe40af6f9da2ccaf8a48dc65416220abc32a65980c27fba396a50457" }, + { 5826000, "7544b39e42abb8e8039edaa18ede885d4c9b5d05bd8e3b9880582ce2211aedeb" }, + { 5827000, "ca0290cd84896f9c2fdb9bed17389c8760192bd221f5bf4a8bb735bb8842d9ae" }, + { 5828000, "206e83e87b733bbf83fd8dc67ee0adb70f0791a0c1bd4435530307b83137e7ee" }, + { 5829000, "8e9f1eba228d2da5de3ec509b2c8a9399125e318da3f6b9c41a3a9070e9219fc" }, + { 5830000, "4ab3d825407f335218f2306b38764748ae17985ee27af396c981de0723ea83dc" }, + { 5831000, "ec4f5712b242e746b08a1e4c2b5969239ee4c47abd0c904d8e81db979aed2d13" }, + { 5832000, "19a41d9855f7b53884697a81f35ae68cfd6bd8c9bf12165047ebf9153d3bc6ab" }, + { 5833000, "5821ab14c83b26859c0c3536709823c1353b20dde1b484a8d44f5742f0781210" }, + { 5834000, "ff732a6f2ddd8baf4325c2ebffff8cb88f3d743ac77ceca2aa5db55a31369456" }, + { 5835000, "604a984d84182ad4d74fc277430033ba11cc1a808a414902be4443a42b8d63d2" }, + { 5836000, "a3704ad919c8d14a080918b8e2c39a4ac6d2ae7e9c575c8967c8442538332851" }, + { 5837000, "13bff322bdc4fbf3d11be9e1e913bf6cdc6a41ff6e7366884997032b7764620b" }, + { 5838000, "6c30bc473a85a0e021f54873d07097965fa8b4b11f022314d72d8445a4c7c17f" }, + { 5839000, "e84c5d7da9bf7d5aaff80cd4ed11b557329d8de1516a2b3bae6c0edc3957a9f9" }, + { 5840000, "d71611d25dd8073f722eb39dfd19deb5bb76bfb95ce70f41876c5098599aece6" }, + { 5841000, "4bb9f2fcebcb15b3f7883262e33c75a06e10e1d698910d903d8b4ec79db7f38d" }, + { 5842000, "2dc9f962e287262f26f7bd01959cc1249955fad5b3ea0333ed609b1f437f66dd" }, + { 5843000, "906909deb805d55acfb6592b3a6f3a87601b1fbd5bbfb4fc8b7421d7faeeb140" }, + { 5844000, "8d4a2746553d518961d270730822de3a75360afcdbd39c719e649937c341a07e" }, + { 5845000, "e1a9d9b598cbeed3ffe00cb8ac19dc01b7fec29aea462d9dadd90b923c58618b" }, + { 5846000, "139e1e086246d97e300ce01d521856a48f2170ad267a77ba2f06773befd33960" }, + { 5847000, "b63fffe2448baafecd2dc88a9f5355e2fd6760314a2f3058819ed014afc1bd27" }, + { 5848000, "72f7acf34d72490b41d1959f12afacf6741ab7290bbf326d6ca16a2942b26cd5" }, + { 5849000, "abc3a17f74bac5a387b13d77ffe35e31306cbab2dfce985edb5e7e3a046d2e9d" }, + { 5850000, "04d8a4cfbef73dd264ff538308c12e9e5fac9f729941653abff030a33d7b4c0d" }, + { 5851000, "c550eea3e7438519496bdef1d215d94c3b90843d5d927d10dd6c32837a6e461b" }, + { 5852000, "b5db42e7a9fa3bf698896caeb260b96e25048cc87f931065ae4cef6d2ce37f1d" }, + { 5853000, "9e0268833b975e8e2a94b905f7cc9077f2696e616836981c0dba425526ac7479" }, + { 5854000, "5a10d1ab4eb8b76b47194d3db1e4f7c33de48bbf928a3c33ccd24c7ef8c0635d" }, + { 5855000, "3885da95209cd3c19b9e73539afdd49ef231bc16f8218073f7ff60bb35379347" }, + { 5856000, "d6c6f432ee1f6e21b90727765751f6682276b8abfb6ff205c7a165e85cc639b4" }, + { 5857000, "228f8c8a97cda77488ecc57ba1a7e92b8bdd2c1ba06b0ad6e7a17b82eb013e08" }, + { 5858000, "b820dfcb2d57be0d07bb8bd2cacc97495d7976edd15391a153b8284539d996ed" }, + { 5859000, "1ec533fe7576d3d63d5ba5c6ab66d5b0d8e0517c499576d18fb9cb6bc6676043" }, + { 5860000, "9f050fd9d6df3e6b04ce677582a29f705a9b13aabe8c428ae21216b3a1bd7613" }, + { 5861000, "e6db3d11441a7e5f951ec3e553864b4b778e9dd27a98ccc5efea4f3c96d7990a" }, + { 5862000, "16bb4defe978820c47c603c9a7428f0a1606ac9ac5875ddbe27951533fa43266" }, + { 5863000, "be9d41796954ad2d0fe245a87e5d4a59dec9affb331a44e31ab88aa28ecc6474" }, + { 5864000, "33af334a2146cea4970f8ace7d01afc8a6a1d63e20d821042a95450300147e8e" }, + { 5865000, "5d73dbe5903e4876c5de2ab0425018fb712a26aad65587238ca7eafe50f66ff7" }, + { 5866000, "a5f862fe3292126f90fecc899b59217b55bc86dc69058d3146c5a3e8cb8f3c37" }, + { 5867000, "7658bdcf17355808e0c4de794641406c82429825a0a1940587383100391379fb" }, + { 5868000, "52045d24451dcb494b1a4e1b4ee2d5587491e0e2fc14d8565a2e6b64166d7307" }, + { 5869000, "bff7eca93985178b90988dd8dc9c4f67d3476c502f0583898f00714bc8290e72" }, + { 5870000, "1f5b7061de297e7e65e65d42c3437b95f26ffc50d2a0c0434b70816ae4be4047" }, + { 5871000, "0388cd49ced9c0e1448a3af5d18e647eb1e345588e695f446f2ba7151610e31c" }, + { 5872000, "86cfb3a98f24c7dd2b216194e1b6205811584407b24aa12a8e438059f56d33bc" }, + { 5873000, "96bee7d2274162d7f13043895de0224e4332359def9b2d74e455503193f27f1e" }, + { 5874000, "42aeca005fe94092428d00b76c0f81cbd938607c5c8b2bf001633048b6429f27" }, + { 5875000, "ae938108d34763435a01ddad9aec82725a191d65dc5d251cca6165eb82867b1b" }, + { 5876000, "c427609c3868c3b7727a27e3891116c48b7609977954719f03034eff3a11e517" }, + { 5877000, "ec03de913c89bbca61ba64d8d870447525f05bac7e1e9c33ccc26f762d204a38" }, + { 5878000, "4963926e68494a5aaf4588496a537733041a29f53ab5b22f0f3f8ad79849baef" }, + { 5879000, "e8a9a21e54545a05418130e2c923e17c95b6ec11fec5af03dfb4958e6bd244d4" }, + { 5880000, "4f895f5e50d307de77d32a2c0b2cf30c288f0fce1dedcb8a3811a69405762601" }, + { 5881000, "0182d485e4a428fc6c6372db8ae9f0f375ccc5a68060770d3dc32194c819a4d3" }, + { 5882000, "817dfc3e435a903d9ed44e1df8347c3f3b766887f4acbb21ccac34210db2d242" }, + { 5883000, "cb3d19b474faed23b3699a5e03d73cee5a6449f606319df9a20621fe1fbfbfbf" }, + { 5884000, "1481d909c02702d07494fa89e0a2f1946972dcb56b65acc683420057a3cd8716" }, + { 5885000, "93fca484bf7a9e5e13d0a930775621e07829a2828c1bfa04c10a072f84a678a8" }, + { 5886000, "365b178994d94cfe81909a1614030f566ae3da03e6399f2d367b4f9bf4b60b00" }, + { 5887000, "49b6e1806a73101386d06fa4cd2a28dcb57cbeb25c3db2ad9295a61fcd9bb29c" }, + { 5888000, "4099d0fe4b7b1b5fb01b4eedcc9434295996fede0da74ab3549c64057763561a" }, + { 5889000, "185ef8b20cfee160bede76fa851c9815e373916e27184833d86b6887e02afcbb" }, + { 5890000, "eeb3953b79f097f0ead2743101d6451d75aca3ae865b2ccedd8b643d6865f58c" }, + { 5891000, "93f418574f3b61eeef188486e6b336c0e93b56998de6bc1dbc59a30be710ada8" }, + { 5892000, "0bf6e371a9658d3c1aec3b2ce858d58c09c5eac894282b82d6b53c5e2cb644a1" }, + { 5893000, "1e6b3ba9c2f1d13f941e47a5e8561dede561819af71986183517cec03a23f480" }, + { 5894000, "dd4c76ff80b0df8535c2d451889246db2f4e865723392ef0b5d7e6a698e7c1fd" }, + { 5895000, "79d3e1ae25bcc9ac554bc3b90d8945b28835176e0b27cb7163b0f328df7d46bf" }, + { 5896000, "e14a9b33e31be7922a30bab27fa5826184bb6a854adeee6db427e9fd8a86f0e7" }, + { 5897000, "104c3665626206d40f18bdc585892b5890fd1f9428cdbfeea05f4498ab9877f2" }, + { 5898000, "63bc0da45477f0d4df994ff84c5ccef3c1d1bf60955bdc7db95972af3e82c00f" }, + { 5899000, "56dc11972eaf0f8863374f8918f2b13f7aacd660acd989818c3525d5cb17f505" }, + { 5900000, "c57e3cd34d9e47f902185c3d185ec3035f7662b573696e27a9da29f62ad952dd" }, + { 5901000, "4605690d24d014f0d6a0584a864f815b22bbc5b40d5d41ad99cc901d5bc576b6" }, + { 5902000, "f1277515ec5b02f2ec088e97729dde504cc11fcec46cac5232bb9c00f70d6d18" }, + { 5903000, "6ade96ca0dd1f1d796c2b11ede8861b5b6c9007e6777a656f131e3f7e2d2ef49" }, + { 5904000, "08a85ccbe19837a03286082ecff00b354bb1a641bce0f94a0255b9c966ef0334" }, + { 5905000, "69d9cd83db0bea668eb54e4ea21077650fd3e814b1aa8c474540591dafd14fce" }, + { 5906000, "9cdf2321a91d52bb548ed71de546fbd92a307d0300b73a177d92db51ff9472e8" }, + { 5907000, "a120a9c4906535cc005bf356051162b672c44d2a902e78892f561f17d1fafbe7" }, + { 5908000, "7300bc4dfe25ce39cd449b58c8bb7d73d4798bfb54e9a44170a52f2b5e048ab5" }, + { 5909000, "6bcff782b2557a6a658cf468a34ab8ec2881ed9d527afe6d1a71ca6073636be3" }, + { 5910000, "c48248c006bb27b3379c7d5cf913a44b800fc47f9f4fe8b1b6a9c5593c804791" }, + { 5911000, "0d686fc7ac363402da0317e5693c888b9dc9ae88c2e42790669770d292dd19f4" }, + { 5912000, "820db9fd0c361ed2188ed15e0abd4b96c56e74a4974c01748e62bb0fe9799324" }, + { 5913000, "4e825e1a2988ba8ed79cc1dbb1565d9a8156b2cca237e2716d33f0d069c2eacf" }, + { 5914000, "28328cf4f99431cd6690ec297a86e817baace9c9aabb26fc1920410157beb7c5" }, + { 5915000, "4e8362010fe929bb2049e99d0da714b13ee28298f0c96471c408825fd192143f" }, + { 5916000, "78b372b9acc6f580e0d286e297eb9006f98b3863b8e438a882d22cc623458c5e" }, + { 5917000, "cce5e1285fdd421f62cee640d6b4bc0a7ca83aaf47f7272724bbfe07cce51403" }, + { 5918000, "19f58f3163fbf79784be66d53aa4638c38617e04cecc7a00072c2c45fea904ff" }, + { 5919000, "94a2ea73980dd0c935b0a13ae8461d34e3cf4ee7cd4706e7c693cc7569ad39dc" }, + { 5920000, "ecee04f5e29219106aed847bbd7359b1af1028df3ec2d88f935a4da4aa23b587" }, + { 5921000, "da1bdd8654488513fc77117f61d4746482a40dfd8db3dd13d23bae44312f59ad" }, + { 5922000, "1390328fcf44195376bcbbb583f65813a1beacdac08fa2d91e65c8428a75d84f" }, + { 5923000, "3453ef9316c5843535d8b7e4b5288e75809c294724a75cda30a04d5c8e279c0a" }, + { 5924000, "f1ff4e27203a4be952a4308d93add9f617a0d98ccccac5bfe750ac106c3aeee8" }, + { 5925000, "a59423d403aaab16174dd1c4e0ffb701cf28581147650f142de71bec81cfe252" }, + { 5926000, "83982817ed5f8346251e06149401c7bf2de254a3fe509ba2b6fbc842aa018d3d" }, + { 5927000, "65dab6f7de1cce3f1bafcb3816110da66c6e3ec2fc073229d1a0dadb8ce4ac43" }, + { 5928000, "1deba7ff15abda2df93bd5ee28821858ed3f8ffdaf248791d2feb3b31f0666fd" }, + { 5929000, "cbfc8b9666ca1bd2c5c757fdcec215feda040be1f904d5c109423d0ebdf618dd" }, + { 5930000, "3fccf9c0643b4f9f1c5c6363700ba9b2437cb5ccb435a82b2bfc93171b604e28" }, + { 5931000, "3761f12c3f6117dc9d3fdb7dc40095f76cd224bc57bbffb0ca52371c2d128a31" }, + { 5932000, "7ae9e162664c21b00e03058df9feaaa7a286938262df4e05751a30864e041513" }, + { 5933000, "1a1f6f8b9d293ef23633ebc608bc163e7fc69af8862d1810c37b20d627e89572" }, + { 5934000, "00b7d03273351b5f8f0f10ab7844d684bfadd2a55988f402d538f7849d78bafa" }, + { 5935000, "2ac144ee803d029cc417f4dc6a21d8ff92c072b271e9aecb07441c0759a78733" }, + { 5936000, "a1bdbcffbf0c8eb2e57df67557e0aa50be913683e86b3cb4a4582139f9d9885c" }, + { 5937000, "06bf7cb9b39d64c2d6035119d4634c9d974ccae5b09bc49ddd9cb09708f7a03c" }, + { 5938000, "ebbc8a43a1a6ce6f3169e3aa0fc5d365d5cd040c1564b3ce23d806ed3356db45" }, + { 5939000, "0c7f3eaf4217a82dac6497165508fc5f8bc8fda653419f29749759e6888149c0" }, + { 5940000, "27e437424f5d7b01b58f029548749a57564459ecd964036e28f814bc4d588658" }, + { 5941000, "697b787ba7ed53fcd78d487fe7e4d165eda87e77574ce678175841c74eddcef8" }, + { 5942000, "36812f1997b415b408f6a09bdbc5720537db38eef98f0100f64b9213fb578ac5" }, + { 5943000, "d193b2ee07d6bf212a2bbc657f68f3c15ed437e31f43a03bb92f92dbf6603f47" }, + { 5944000, "d444d76c5de4bfec6bf7bf98613c00e3afd589603155ab53fedb53e3e00e4896" }, + { 5945000, "13d1ea92d9cf06e9e1932ac8d7f524944b6b27571c7c92babc66c9767b7a32b5" }, + { 5946000, "2cff5d6d681b1f03e2e4fb1ab63ac250226232e1f2f0c9297e20d61b29f5c3c3" }, + { 5947000, "3f64a5f5e61126e72141a9bc2b422e7fa7f193f6e06abb8cd189d3062474146f" }, + { 5948000, "120642462f7b8e4b0e71007fd9c48c8f00aaeb506580722079eb1fb63d1e9dd9" }, + { 5949000, "591fca24c0bf087c33b1926baa930e777a9fe07b6369ba7ccfcd6cdbbe9de5d2" }, + { 5950000, "65f048ebe22c2287dec0039477edb86d4f2135bc5cd690ba8346f849b6ff8640" }, + { 5951000, "3aaa93eff5d2b11d6548c9c84dce76346a6ad569e268e457e20bedaf16a08eaa" }, + { 5952000, "7d4e05aa10548d804910bc147dd8364df20236378f9f18cb741e319ae980fa42" }, + { 5953000, "be99edf2def23c0be840d5e3ea03de17bb401c34a95624d857ecc5c7f7800bd1" }, + { 5954000, "c081123fd35bb56bd982f653ecf6e440843c473e44d0ae1bb4d7d6653936292e" }, + { 5955000, "c3c1dede07ef3af343516a9665a0d80ba1b7ba69f68a0dfe374bb58fbebaa210" }, + { 5956000, "56bf7ab61b0caed0596ad9ea613ac9267cb953d1bc86bc287a07051942c20729" }, + { 5957000, "a30816d6a58a6fe5d64a38c712356c5f9e55959b65785070290cb91f3541346c" }, + { 5958000, "d6f092a18c08fbc5ef123a8b9999d5736e726dcacc15b0858e4135c6b695b570" }, + { 5959000, "133144775f22d454ec39ff59a1cc98bc8e38d401171a8ff98773889da2c72f06" }, + { 5960000, "7a49fe4e8f9298a5081c277308be7dfe91dbf40874e55eab28248347bf12defc" }, + { 5961000, "642313b5d91746dfa80a8c1b3d42207ba89b97b04b9997a4efb68992d81d2f7f" }, + { 5962000, "bb17b93903f727906efec1cfe51ba30ba13a2dcd885cddf24034055220fb6aa6" }, + { 5963000, "d7653894475c1739f96204ad9afa3bd543276a319541ebc377e7a7244b908e90" }, + { 5964000, "24871f39bd15373dc2982b7d302de445325685c74bf04cb319ab556f41ed57d5" }, + { 5965000, "dd6151c223bba5524d23022beff39d8a69f935efed056ac359e0daa2d7bbb22b" }, + { 5966000, "0030f9ed51ece1d3e70c1563aa1ea44ea84dfbae1587bae4bbe1dd4f3610b1b9" }, + { 5967000, "4788b814395c8a6a93903e0c9843b061fb39894ff6baddea6c979f1f80c9977f" }, + { 5968000, "5f6007bca3871071e4a2354c19542ebd7c125da323a1a087f258e2c8d7dca355" }, + { 5969000, "09b01cfb6f4a2079f3cba6d4628bcaab3db25764c5603e3f5479ec0e0a638b38" }, + { 5970000, "7f2c7e4a336fe815f4b4e035e3ae40ac70904ec3a59ac9beeb39220d1aa31ded" }, + { 5971000, "ddd638ea77a2518fa337e9c4c2ff28988abc49dba418e4311f4846a018f704c4" }, + { 5972000, "b2da35755848786f65e25f6254d59835673890a4217de06fc755c6bf7283976f" }, + { 5973000, "8766fa1ec329a407129fa4edffb6fbca2cd5f909cda58b8e38ee19c5015cd664" }, + { 5974000, "de8e94a4d0a81c12f4071f33f4b0b1c5aa2f4ca3a7ee742d88cbadb732ca72ee" }, + { 5975000, "419f77006d55c896a266c2ba56a97d473a41bd33c7720c5c9fec00b3a02e4277" }, + { 5976000, "d2d35cd6176687704dfabefbe618005d436f345f5ce407492bbc65d08ba878d7" }, + { 5977000, "a4971e91617f28953ddaea2334ff9003a3975dba75d060ae2d04ebf1b60c4fd9" }, + { 5978000, "1139213ffb1bf80baa026abf1fc58576da9d54ed41d4f200b3885ccb0e60b5bf" }, + { 5979000, "a6c0a2b610b6fa2cab075d57870ce78efbe1ca0c56a8b8306aad354ed7f01ff9" }, + { 5980000, "220c3f079490b0bb26a266a75320453473dbe5a3e9f919a1dd06f94a5efd5a5d" }, + { 5981000, "8c5eff84a877869f0d5913aee53ae3da6fa0168ee9c0b1c374991b429a41ab97" }, + { 5982000, "f74937cd6ea4eaccdbc498e7ee38eb4898d8b6b6a77ce7d9e276f7f50146c444" }, + { 5983000, "6984b3ec7e70e68a1f41734b58627105bf07c1d7afcb70ac3912cfc84efa5466" }, + { 5984000, "5a5ce31b4e1fa99d7a9a83bcdfe79395d84b52ad61afee0e55fd7556441e4191" }, + { 5985000, "993ded01bbdeb3a989d2fe9615685ce539b576311359684a2a7f837e990088d6" }, + { 5986000, "a560d16d87ea3952c0fb47fd43c1f7dbff6cdec853b85abc7312fa94fd55df83" }, + { 5987000, "11560d429e911ca3765927a88476aab5dbf63cb2753cd2e539d861ef2162e7bc" }, + { 5988000, "05f855b93b1df74da931822394576347c8b2cd6ed2d744d3344bab4e717fd532" }, + { 5989000, "5be19f5cec976e115c94baee973ae5e13b95ddccc249683be2312ea66d83554c" }, + { 5990000, "7a8e6c4ff9fffb423e95654b987a3f8a0173c9121546f89adaf660dd57ad8328" }, + { 5991000, "898f01998430340a16f74b3b9d7093bb807f2e160b45b9b0eb8f63d69e9712b9" }, + { 5992000, "74fedf3d3b96c58684e729d263ce30051714ac4cd227c0749841b8cb3a9c6724" }, + { 5993000, "21a4d65a46bcdb7be95925d28544a5edd64882ac48fcb4a50574ce3a0c53c996" }, + { 5994000, "ed65dbc1e4603c2a7dee5051bf2bbc195983c805f4dba15eab2e7550b2261a8d" }, + { 5995000, "5389974a8ab1c20f6f1cac92cdc2a8ce30ad3eff7edaa6d56ec79524be10cfb6" }, + { 5996000, "a2eff3ec6b29033205213b0440af61b69729f285dbc21aa49d317fa4446b9d55" }, + { 5997000, "34f2b0ad06d407fa9fb011345664ac51a01e1adb839b9aed89d1adf9736c6cba" }, + { 5998000, "2b3ec17f1bb835b633fb589fa43faa970d759e1cd7d7b80fd8aff9b3a6ca2566" }, + { 5999000, "e1c0e1014d41920d7cd8dd833cc477934272556f678b3c8e2882623c0a2b443f" }, + { 6000000, "6b0f77218c7a95404a148cc34fd7b011b0fcd15ce3b70ef2b220145a3f207c44" }, + { 6001000, "157f2f0a9793e74c1a614053bdf5c979654a55b2ffd1147b66fa89da5cc7b7c6" }, + { 6002000, "de980f74a4a5bfb3ac0d807e4713650333a09c0bd34176a3db0c1e902493bba4" }, + { 6003000, "797d448d0270878f94b05abd46f7e8dc949bd6c7b2df9ad7600c012c0753d845" }, + { 6004000, "69bcf74869de0e349c27c3ec2df1a208e3a7cfb74876208d94b044032af5201e" }, + { 6005000, "1e4b68735e755adb4076da9fa8dfb8e69df7d1367cb7fa16cdd7ca113419d478" }, + { 6006000, "c1432d69073669f5dedf10c01141a2e09cc8ff134f159978bd83326c3d704226" }, + { 6007000, "8a3fa06ebca75ba7fb6b3750e8847c7887f4ae3c2838ef4aa472230ab06b031e" }, + { 6008000, "707dec1df100a4590b543ff6558321850974a4e0d3584f6105845299f33aef54" }, + { 6009000, "e054c29ae0333131fb009fd64021f449e8f0ca029c9a4f4fc5b2d06429f988f0" }, + { 6010000, "e70571bc80965b2828c4b1f97bfea74c878e3e4b5a6285b5d1313aeb5bf1157f" }, + { 6011000, "31a36bcfe9eeedfa254d5b3f058e16bee8a34853e92d23a4512b87186be0e9fe" }, + { 6012000, "df258cb18d983626f182a7f867128a98097549289b8294d1f3d8b7dedb0650d9" }, + { 6013000, "1a740bed0241ae0a080b9bf3ef8c26d05060c01e904852b65b53140f1659c2fa" }, + { 6014000, "dd00b72f990083a8bb470c3d779a02ee4597c787e6818c427785ca04db88b205" }, + { 6015000, "e44d2ff57b74ab6e1203d8b6d3e9da18ad8f5e85d032088ff8ea6b606ba8e34d" }, + { 6016000, "271acc98b653600248a0621ac2d351eaccaa8a2caee3d86b4cae7a4c71749871" }, + { 6017000, "b929b8b48a22f29e640ebad9c1010f9ba9d7af8824585965ebd068734c6be747" }, + { 6018000, "9d0945957e41adf68a9c6f669180a61de8f2a685dd1ca125b78fb30773fdb87f" }, + { 6019000, "f8cd5c24db48801d5f3f1ccfb9adf66b4b13999336361f09e9441b6860e45952" }, + { 6020000, "ffe9c4ddb502c4e614ce32866dd110a0acd7d7ee6585e5018cba6100a6a17937" }, + { 6021000, "b528b402608e3c8de5d4a9087b8c66188794e50b3807a861e15fffcd99374abc" }, + { 6022000, "f3ae14c61318ec12664cc93b645b241d9db49172c6d70043bcbd2491b469b347" }, + { 6023000, "6a8852ce0f3c9aa5075cd303546e8c955543270c9eb4225f3ec2f741ad7f1111" }, + { 6024000, "7a4934d72bb4dc2c453bee61f008e39176d0caabd7b12ffe2de780ae93c449b0" }, + { 6025000, "a28232e418371a3336905de18de3f750fb8d4d4290b817bb07dcbd77f67e6654" }, + { 6026000, "053ba52ce8520319dd4f4f4d2981a5e6ead622ad0a67bd5cc64a0807efb58d18" }, + { 6027000, "6cf819cfd32627dab97201efa914f9bcf8cb4080a8f0bc8134e8aa47ccbf21f9" }, + { 6028000, "c2f0e90629a160e7570807775d09002d779e024bf04aa047fced5e57814f8310" }, + { 6029000, "1f737823080e17a95ee58b000c26cd43f4bb6dfe6d0530f74fb8042b8fb9d355" }, + { 6030000, "8088a4cc4b5a486250130812fcf3d0c2d22440a4dab20fb91886ce49732ca0e3" }, + { 6031000, "bea9c675af188a400d20cb69e00b1b3fb42187fd05c129de3e7d8efd4c288c6f" }, + { 6032000, "063827f656ac84d9cabddd0e12cbce64d86f5b313f78231572314381ac2d64af" }, + { 6033000, "d5c51e3def062c6760ff27b12e4b84e38f72a7959857de73c1a5ec5afd2d8243" }, + { 6034000, "9e433b83092f92f5665dff618d871c26ccd1d072cdb71c0f0950ad7f61c2dd32" }, + { 6035000, "7362fac1351d7097c59f84046d5b18f60196d1732ac229d44af529e9a8bddb9f" }, + { 6036000, "fc8830f11b635d74dfdf172f4d7e16afcddb0675266bb34732c02819d33fbfe5" }, + { 6037000, "264c6a82f4e015e2fa3317620d8cde786e2d30f47729745e439c6f2b2708dcb9" }, + { 6038000, "492728950e10faebb847f622191a8b65c9973e7a36dc7651b100a89fc06eed8f" }, + { 6039000, "770865269664a76da46726def82bf2903746dab74348ba6fab3d9a4ef7be76b4" }, + { 6040000, "5e25799c6bf07a9781e7acf6a38c2b16cfcc807414fa0e9c7ae08700e4b9f047" }, + { 6041000, "e1007f8aa3861e127d1ace4ca90a6bdb8a565c6d8ca00bc6b550070e7a543e27" }, + { 6042000, "0851f0fbbcb199896cd60950d6de2a158db6ce329da26b80c0898e5a1fd984f6" }, + { 6043000, "92afb3c2c912b937a15f4c1e3f99e5c3c1e49114b9fe013c80ab00013141d60a" }, + { 6044000, "a4109a7f1ae542d4490e5bfb6385fa52180c1c28767c5e6e95f93ebc0ed267e1" }, + { 6045000, "8b75e3337e0ed12b09ea6a12080d0a6bd77bd018e9f9093f72d25c1e883f92e0" }, + { 6046000, "543a5ce6f2dd46eeefb537bf6ceb91686fb6471486e7b4b9332fafa73c5e690a" }, + { 6047000, "9bd9c989f811bce3d4c5c3ad0ac6ea990943c934418927fd5d1ccc7a9e6ed6be" }, + { 6048000, "e49fcbb9125562e2a07b496093a2c517404b36f57fca4a58b513ebf544033377" }, + { 6049000, "f18e7ab2db4e14699967a18c621f2c08ae6517157323f53905ba2b4920a995d1" }, + { 6050000, "f0ae2583f14b5f021d1070e0202c578710950edfbd0ac1de5249c1d8f35e7863" }, + { 6051000, "2bae8fd53792f9feb0333512debe11c8c942351b83cf4c97d9d558095ab51b52" }, + { 6052000, "0ceca076c85bb7faf0ec97100e9b01314c8bcce6df37d9259b94cb8a0315f87c" }, + { 6053000, "16ac82e5cb38c0e5d0d65556d2a22996f80153a0374c232d0cfdfab0c0cecb5b" }, + { 6054000, "39a597867f56831e8068468ac9229b6d18dce72a67727d691b4f0aeeec97996d" }, + { 6055000, "69f7be279d8d0a2a63111f577ce4067dc1cb38727b69d449c999a06dbfa58792" }, + { 6056000, "ae3f87c5be0b992f3dc49eac5038c58110b7ee2e5d86d977acd7e79310b6c232" }, + { 6057000, "edbf56a266c1faa8cb2718a1f064750080cdcce63b25a26c6657302e5c6cd84e" }, + { 6058000, "70cdae575ecdfbf7be1905d48b28a0e4812d556dc9f8d0d8c57c519ef462353f" }, + { 6059000, "78c2e344355f6f72f78ccf271ea7e53e54bc771e9181c471f57a0373f21e1177" }, + { 6060000, "63e896283d61641e9cb3764d86ae69cd96a06dd0d99af32cc104f3aa8da76a6e" }, + { 6061000, "bdde3c0102795dbc3f48afb86c4704a3b69516a35e152e2031c4e6fc016d798b" }, + { 6062000, "58e111116b87604f9fa344b481e396e1fdbd71d2c5de6cc8bfff7d2028b970d8" }, + { 6063000, "951f3412916e7a1c937127340d8c3b0b492a0d6018787e181c307bddd7e902fb" }, + { 6064000, "81094ac4c544f52f0c826aca0436b7487e3f4c574c9d0365914c2935b9aca2b0" }, + { 6065000, "5a68d0badaabda45e31d049c6cf44a44fba4c76ce9eecc7ed78d9717cc2c79e6" }, + { 6066000, "199e747e25bc86a588bb5aaf2b0297f2afbb7f6e3ce231b0ba43e581c3cdfdca" }, + { 6067000, "355b72ffd1e2bf3815e893570dc9c75cc4183dec8626b1add0ee27ac2dcca523" }, + { 6068000, "d56454cd6d29abcc9fb571e4d89add0dd8e9fd76a2a91096cb07a2776bba30d2" }, + { 6069000, "2597ff0b5155679371159f31fde737f4fdcd8e19c17cfbdedb8708a0dc16625e" }, + { 6070000, "6965271053ab06ac86fc4f6eb7bf5a58c39bfc3318db5ec9c481ddcf490d69df" }, + { 6071000, "15d803c78b9e54119f1716f0bafa1949ffbfbc598d7bc4fa3ff2fa0e8e00204e" }, + { 6072000, "c5c99bb876287f4eeacdcb28a17d096851158dd9b4d40d0231118d296ce16ea2" }, + { 6073000, "8e4d6fbffdecbe44b2777f766b53d8f1c1a845470ffa7521a1a0b969f0edf780" }, + { 6074000, "188cfe17f41a2c891f852c1fe16a52e30d1f18d9279b4ed110685d5948f9fb26" }, + { 6075000, "0749967a6bf828f1ba7e55092370cac05844345127d392696753a18e915e11d0" }, + { 6076000, "2e37b3ba03143a45258c9d674cd7c0efbcac7d1675f2a8b7ca6c9d54c29d99ae" }, + { 6077000, "9208290f7e1bfce0a89d647b35da151250b6262c4aea36e88c54cac3276a1ad2" }, + { 6078000, "8e61e8bb69eed6897d14f0427870b6764aababa491e69a3c8bec7aa886181769" }, + { 6079000, "0f5379510fe04bd3bf6ddd685050954d9a78de0b387a02b875130a60927cf75d" }, + { 6080000, "e0504af3d4de3c5b875f69e153978cbf858a138fb5db95a515cf0e9b183506e5" }, + { 6081000, "d23cd33b2a3b15726ee636cbb61a390520978501e089948649cbdd9a2632d457" }, + { 6082000, "747488c94419940a0459c12add0591c66914dc5370af9e563e6549203f72928a" }, + { 6083000, "f05793b73f30339b1858eac2b6364193b6c73a3fa3d97d7520847fb701f28e04" }, + { 6084000, "bebc70390044071a66f8a59f757e4f224339d2400c977d02cb20bad598ed1221" }, + { 6085000, "f34edf864db017f522652039febe978ac9da88fe7164d34dbdcf2178a1082b02" }, + { 6086000, "f89248c63f50df3c9141137ff4478490fbc4eead3f9c6501043c8dba98891121" }, + { 6087000, "9c3d2a5989af9f4d2a9955b94bd74a057ada11475f6a5a87b2c5ea3d212d8639" }, + { 6088000, "8bbb69b2dbf8fbf8726aa2c51459d4efc5ac25f74f46c4f1b254fa7486aa7456" }, + { 6089000, "779424bcab8d845cd892ecfc1c2b8f603ad05ffa40e3c04d640aa785c1773910" }, + { 6090000, "e917943b5de0e7b843b6dbec5b16dee16935df379f1d65d05f2cadb8c5936d2a" }, + { 6091000, "1b17e8e64764ace50dacb8da6d23ba5002864db4c5b1f79211d09bb63eb27e15" }, + { 6092000, "76e904e7e82bddc31e274161483589ab177e47e80d383324d355a2b323cf7201" }, + { 6093000, "e4060c35a002f58d93f0bc63646a646178ca4f5bd8fa92c77cd95f666e601460" }, + { 6094000, "a2d4662b44f133436141bd9f41628550d292a86fd219f709399a06fa8ae64098" }, + { 6095000, "b3b6939a098bc6f7af226488eeaf5d784e52951811e1e1324360bd91e82c81c4" }, + { 6096000, "002f50e5b6b938b916de56832435bb6e8b7ec0bec43f5ddcc73a7aed1eaf03f7" }, + { 6097000, "ec0d6c072901071b1f910561620fc996ade07ef99ff64abfcbece3ad7d68a349" }, + { 6098000, "6247c5d9fac39b95812a864cc05a1a5f76150c89ce94e4fcdec16c85184d8266" }, + { 6099000, "a7dd032a8dc083d78474bedc627ba20013cdc9e51fb9c248157c79f3241b2f05" }, + { 6100000, "0d4b5fc268c0affc29549b8e2e7f8143d6fabb7f0dbd71c8fce7dd7751c281f6" }, + { 6101000, "c16d3346b3915d7013d3d5c6a03058b59a53c659543d326752b2a75078625313" }, + { 6102000, "166f2cbdbae26f9aa30e90a6fd113f91695068d1b4b5e674383500542ef2e761" }, + { 6103000, "5e40c83857c5647cc1d8c50f267fafe5f2c2c0029b6844ca9744508250c80dcb" }, + { 6104000, "14689d81fa096ea20adee5b27ce757d9ab8cf05463a7220113f35420aba551cf" }, + { 6105000, "74961aea606758bb29c011b4a00240c48dbccb3092ae4adeefe0cd3523f335f2" }, + { 6106000, "08b20413d75ae428e13971bd281244d0f50721d524e292a7dffb1c6b067731b6" }, + { 6107000, "d4eb70cffaf92a666fd6b1c3ade48e6e5fd38e323adde9353e7b9aa1dccbe7ac" }, + { 6108000, "a91a7033f30e42f9d774e272b125747e04855dc21edb2ca0945a6d2a33e2d8e3" }, + { 6109000, "56caeb8598c1e9460798f0a7e79e1c35144a687a469c3d22cf2bd774e3f98055" }, + { 6110000, "4bbecf66923bc5a8b70069d9b90a55b6a89f889912f12f92a4a20a97d56cb2c7" }, + { 6111000, "a9c553fa6d477992e51429cf163fd2c51a5631643bf3c8e978a52dffc053274e" }, + { 6112000, "64fedf56b392feeb77c8d1fee219d77dc375f2ec0e1487cafb5dad3b944d49d9" }, + { 6113000, "6c3ef7ccda041cb97e3f9117e3651ee34332f0ce2ba70330c1c444988569b90d" }, + { 6114000, "a6b922b85c4978d922d53d9a7bdaa21265e7e2f05907c7b14e46260d3dc02ac6" }, + { 6115000, "2c1c86bae363ecd77f6ed7e551fa85a8129ced5adb11a7ddb21e4f132cf82c41" }, + { 6116000, "05d0f9d8790f9049c0281c3e7d20493c0261bd8354a82ae1bbad089e8fc1b933" }, + { 6117000, "718577590e50c8063a7f23026c3c7c621b3888c17aa459e5da57950b0e6a4b70" }, + { 6118000, "d2f49f9bfb3e61205266ca1013a08a6f58e7581a72745dfed12f27cfb0ea73ab" }, + { 6119000, "b6868f2145f5db6aaafd9cdafaf60f91bb0161c9645de83982f14088951b8b8b" }, + { 6120000, "496a7ef08b2055cce5a7f9d1f89a197354ce113ac680d866e4ec86a70fb4fc8e" }, + { 6121000, "500c672b20102ba50bf28ff428dd15725a269e442fecff85e38144fa20b716b4" }, + { 6122000, "543c69ea9f1bb74c9a4737b0bf4b4359bf67c3ce8d7a1906d1236aafbd60d6d8" }, + { 6123000, "ced9f0cd3cc5d442217e5e8cb016f4cd24ee2d3c0a2db334e9e72ee1be34523a" }, + { 6124000, "77dc8ddf5e18b2fcb3b535d8cdfc1c5b456adfd76333a5c0f2ddb21d187bcb18" }, + { 6125000, "193acb5d929c2568f81d8c91543776f6ccd6095a120c5c0cfb959a774a600955" }, + { 6126000, "3f9dade0bdf8dc01ba46b2dcc0965c8e9794fc48c7951c5ed34fe9047915eb1a" }, + { 6127000, "2311a64499b16450c0180f87c34b9e2647727a5a730a74fb2c5637da5aea4a77" }, + { 6128000, "02fb586bae5cd598844539105f051a1592cb4ac203d574f2bffd012f85c130fe" }, + { 6129000, "9178c4729d0703f5a625314d769ca0b2c93a5f40cb95b8788d1bfea15ff5cc5a" }, + { 6130000, "ddf30491eb7640531d66d6565a5bd62a9aee73e28b94a24d086fc45daa528388" }, + { 6131000, "4a3c69ca506bca2446982ce0a2f45659402b8bbea689bede002cb8d883f1bae0" }, + { 6132000, "0c1e1e5f02148eb2b768bd9f3b86960ad1d79824c908f8526e01c5534c71c092" }, + { 6133000, "5b27978a5eb02a8432d693aa7d3b9ac2b16e695e80697a8b92c611b1d3c87c4a" }, + { 6134000, "b74fac142d12014b285ab76a6caf8146ae6f610463048629ec5960ffe5dde4eb" }, + { 6135000, "90c925de21ffd81965012a93629535a473b60e0e994f8909320f209298c9bb0e" }, + { 6136000, "609044ef959746cc97518919af182e2bd284d7188b5baa36d5e0905a40e5e12a" }, + { 6137000, "339b45b45a4e412463bf94c2932b52982bfbeef126a37f7cdbda0d9cf934f043" }, + { 6138000, "17a6d621143d654b36a46142919440386ce8f7b3c6a083ddd4c3758fe15c4be8" }, + { 6139000, "8977e17bf8d63dc368bd0459b961be2890ae74cc5923e92766bff38210a4df95" }, + { 6140000, "c1816015de883c8f2d179151caa7f5998117b4e268c08438801a8bddf746e73d" }, + { 6141000, "16da29a2090ec3d2b6bc3074afbf62a4ea462411a8ef9a328a379b7c26cd3dd3" }, + { 6142000, "f712aa643ca2488695ed67358b22a708351af2523f48cc9c00db8c0172c5eb6b" }, + { 6143000, "3677b79ae4c31064fc7e286299e66a40f132f980be709a09068a168e2eab38f3" }, + { 6144000, "c3ebb5369c360a812a58dcaadb59a62097bc598afdee865bd70588120d38f839" }, + { 6145000, "5997f2393b9c54fdaf69305b79ad74ad65757fab02489bc9a992fd135cead619" }, + { 6146000, "75f27a324d4b867a57d22ecf0b8ff6cb3903c43f1729eb85271ee6637c80bd34" }, + { 6147000, "cdfaab7163181a7acbbe5e50c34c8d90387faefa81bbe695e05521e5978e8f5b" }, + { 6148000, "c141842ce8204f4a60ffaacde0442d1d56e9987c89b92431c510edf7793e9f12" }, + { 6149000, "8c0e7dcddfc126b140cbad767c2b4449e1e1b7268a52f9c3eda85ad83f6de5d2" }, + { 6150000, "dac0ee180ffebf1cf295ae35cb61d07c660004dced7f155a73bbe80b977371ac" }, + { 6151000, "48e14b58d1c021c1169b665f0fef1c3a79fdb4bb98f0ddd51a227d91371d5076" }, + { 6152000, "ce3f9a5fa6f1f8e446a1624e176d55657d1da03707476de47b85e148879ac9c5" }, + { 6153000, "5b66e7f118ceffabe4042a553168528f9b6fe1b051d5db69ce460a3835c1a540" }, + { 6154000, "b5d2131bca10a6a78b72b719263a1812af33e6721285ff9a7911d917363f439f" }, + { 6155000, "ead38411226afde560705995a3c4d003fcb1d37afd7f71c0e14925ce2545d725" }, + { 6156000, "b0d9f210372c72af23b6b7b80e398e6116a633427385555c1784c6da475becf0" }, + { 6157000, "ec8543155239455e66384092400cedcf21c81c5f4adcf7a8d7488a6754b19bca" }, + { 6158000, "ba251a521e7eec45b7a5f21ce5d9b8fe99309ccf1a721c96ccddb38d5e0fc656" }, + { 6159000, "1572fb130a3a463cc14e03f48ed9fd46dd23e25cfa935926ff69c526c0da470a" }, + { 6160000, "972d32261388d8fe8196cc015937635720d7da2ff3ed5646375655cd8503a4aa" }, + { 6161000, "cad1474628c8c671c9d792c7d65286653dda9799a22d5ce9b9cb22437971df9e" }, + { 6162000, "255effd5487fb9425247713c4f343bf26c5811c4acc77f27505b306d713034cc" }, + { 6163000, "be950bdc2a4bd2eb3aa300685ef90df2b4743591a08cc6b0a31bbf5909ab59fc" }, + { 6164000, "dc99e8122bbb244026f361a1d4c2fa7397e13f17fab0fd3ba887e7d8eb5ef257" }, + { 6165000, "c73a75e8e042f28cfbc8abcb5ea9bc40e6f7723f73b20b47672287ee9781046d" }, + { 6166000, "6065d6f4554a97eda9a9dca4b60156e11d6856a6ddffe64197b5bb5941f44840" }, + { 6167000, "cd749602cb3b1b43bff05723c81215213bc68c71fa33439db697111b7b376969" }, + { 6168000, "81d1840ea4f861f11e8a8ae80ae6c1307463a92efa55d1b054c984efbf6bbd2d" }, + { 6169000, "dd30a97b6069a6b6e92c8605d7ce5622a19315e113ba550a391d53e36e22beb3" }, + { 6170000, "81c472f7073f05ead36c5e4aa9dc162ea26107d74180f00387ac90fc6540f717" }, + { 6171000, "cb2f969e3370af289dabea55b4d22f1bec4b942fb85ff04d9ae5d6c8ac445d0a" }, + { 6172000, "c1a8d500b6e389370771b940cdca54118593b3031e38c7206a32d5d6d852b365" }, + { 6173000, "5a94106b8dd5e5d82f607d566ae2bcabe2f47f0f5bb7c25e9f4f229615eb9962" }, + { 6174000, "4b564bbf1dc09b631b53cdb3a4d854906f2f76181c04f772dc552a9ce301f5b3" }, + { 6175000, "1986e9bd55b66c19094be103ced76706ff5e0c4800f87014139feced5c50b2d7" }, + { 6176000, "f1801743205864729f9eadae01e395bd66e09d73dbddc7b84aada1b817c332dd" }, + { 6177000, "dd8a6d00a6287ee9bf32c0fac0a58e7aab69fec08b67f8ccd5ec8a94f52587c6" }, + { 6178000, "f69052e08781bd70c1c546ef01cd0dde79e9bf6299e80cab3b4cc4d4d37c251f" }, + { 6179000, "dd911dc465954d5d79ef27b757b991fe15ea7739ee74c166bc87fe9cacda0a76" }, + { 6180000, "d85058ec5d35f66afeb70722410975dd25436669c31280b37f32f2e235670536" }, + { 6181000, "eee037023b3522b3e5153a20da84c2876e7873df2e66e0b2e320cde62aa3c1ec" }, + { 6182000, "ee94215286236538ed54d5a29d99f60ab4f603f81b71948301c20b85eaf9d93c" }, + { 6183000, "3c3d20fd4af204a2484734f88c5c577b9bd3d86bf2e98bde8118d5efa2734b47" }, + { 6184000, "a3b6266d7f5788984142618039929fe2ed4f4e03f70d7428ffe08826c075b2f3" }, + { 6185000, "3a81a787c64f0c01a7deb1c61c7cd2059e7d62807d344a30070743c45ac6ebc5" }, + { 6186000, "1252f3de7a55064440f51cb351f3aed2588b39626af40940aae6f22703c99aca" }, + { 6187000, "8fea78a7898eb13477fb8a04756a2e827112d178220d156854aa4455c281e8eb" }, + { 6188000, "98c6bce09be42aae16ae233a8f34ca2b565c8ad3ca24c87f33146b638b94bfed" }, + { 6189000, "55c7859b03df4169b4a91a05250f510bcca4cbff7c295df7c8e5dc63cac2703f" }, + { 6190000, "86e175f896589a062942583868dbe1c418ab8922c5fe6096804ba165eee32e50" }, + { 6191000, "eea5b490931af375e4c6e03a3f3ab8a80496103a5ae5ab15ba3a48867cffb33e" }, + { 6192000, "8eea132dd647b047eed8c4e6a443aca3d413b5ddd6d64942111c27047ad62d31" }, + { 6193000, "b8542097e842af5dc97395d9204d1298ce73bcc8e60934f6d65901665054c332" }, + { 6194000, "89d5d402b9113fe3bbd18c48796787b94923a1c3bc34054b11f1d084444ec349" }, + { 6195000, "3ba0c573594f7eab06b207ce7e770381f71e0bf0360c870aeefe13c584c9bb19" }, + { 6196000, "9590dcd792b6e9924aef33037ff7f5cdd3df0aa87656553fb64e10023a6c94be" }, + { 6197000, "34264ae7688274325652ae8c20c529677a5ba9144a40c076b96f060d8b08bd40" }, + { 6198000, "f29c48bb8c295594c959d8d09aa72e064d2b355603a3ee9b8159f7ba42cffb4c" }, + { 6199000, "129ff29abf77495f1248a0400c02d229480b67fa04247ee812d2ed66e933bac1" }, + { 6200000, "b56a4e462182208430d89736df4cd4f42fa3ba9f47bc43ff8c373ab0623c74ba" }, + { 6201000, "99edc4b98f74e0395f5781f536b953abe71cf36a841cbd32fc3f8e10b87f4c5e" }, + { 6202000, "0944ae37fce54d015bc7e940b42d62343feb376202bd30f925080549f5c51f9e" }, + { 6203000, "3637acc5aa37c26fa661cd63674676bf596708821ef31f792f07d2629bc2a0c5" }, + { 6204000, "7c7934438db8b6411e7b8c39acfe9e9292b602b21037d29d9b82da8e55e3c835" }, + { 6205000, "12ffe18a2b1671df3995391e4bc0831221cd8dc4bfbf1f698ad02ace34c27e87" }, + { 6206000, "9a7953ecbc3e3c40379f0913f37df2247ccff1209c3838dc6ffcb9c98b7dd949" }, + { 6207000, "e14d854533d8277eedebadc550b124f84f2bcfbde690a2d2a9fcac0f20d09260" }, + { 6208000, "a1e5dc58d6b2c4e2b21f3515a94a4fa8a12964bcf75c216959e440b7f355bac9" }, + { 6209000, "47d0dd8e7e6ff0d953f0bf8dded4535147f036f1f83b949f678a6a8a275b9d88" }, + { 6210000, "8e967a41c0c4dd69680bc9ce2aa0b2821965ed2d19264b35685063f0cd4d823a" }, + { 6211000, "affa94997895f9ec28c70dc2779ffb1df3985e62758a504e3a6cfd28d5a00957" }, + { 6212000, "642a96b0da3eb121ec58a1c680c1fd0dd82b4ab174496bf57afca3e5bcb082be" }, + { 6213000, "eced61c107924caa682d8b9b55438f611bef183a101668fefa793a3d8b4330ad" }, + { 6214000, "e6353d81d503787459055dc21f1dd763a3678d33b5a931a92507617ba61f04a4" }, + { 6215000, "0b95893d179b9f634b5def14654489f0de006907c9fd55b72981113326375435" }, + { 6216000, "053ece771ca6c4af1937519638a2fcc3b7df89d9c8592aba073029905947debe" }, + { 6217000, "406e92d47dd01351fe14bf9160e297224e9e29f50230c2b4fe7fc0d63b869d99" }, + { 6218000, "78748128bdd51981faef28a0fe15eeb3a3d32ba34850b26c2609375cbc2e9212" }, + { 6219000, "41b0c86440ca203511c9aa2f62fe2f61e913e0b8fbd07ad0ef5753f8b89df311" }, + { 6220000, "fae33d2ca3bb83b57e91ec87b603d8ceb11858c1ca015b1472bd9b3c5acd2400" }, + { 6221000, "d655372c0e5125180c3a35d46a25aeeba4927ac2f6b12b9dbf2709d44d7c2af4" }, + { 6222000, "117eb9e784072bf039bfffe2c2e1477b993659f715a9e128262ef2cef6bffe7b" }, + { 6223000, "e181576b467b6ee047b86182411321d6b7173a8a4b129db4d7fb719c0b5a7009" }, + { 6224000, "bcf8f07b004739b8329c29e7d9a644ab469af3a34e56cbe421280d45317fee55" }, + { 6225000, "972ea0220361e5bf65d5e5d1ef7fa2f6dcb819e6c767453ce0303e6fd9668198" }, + { 6226000, "8c5389665db6b36e6bede3a39aa34ffb3e4838ae49170c6d1e6aba26e2db82d5" }, + { 6227000, "1041d8c510124ee3ef984878d27fa8d62c9e540e0eaf6f19668946a419c4b2a6" }, + { 6228000, "7c116477b6ae592f721842a13bf7b40d084479f15b9ee1ad8259806ede5431a2" }, + { 6229000, "5a91311a04b843734ed3d6202bb7b81e3bc07aedefee80d546fc677db675debc" }, + { 6230000, "a10e16fb4567c1710e49191efc28b57cd1dd4507d99dd0b7b4669c2bc4afaba0" }, + { 6231000, "b7e61ad7adf6b30101fe2bc09a2bee799da9e6a810a2ea151cc0100a58ff9f6a" }, + { 6232000, "440fd9566e663df265635368a4d7b98edde6e1a51eb8bef5fbd22bd6fd68fdc5" }, + { 6233000, "33f94bc6a7a78a65d5a0070d9eb92f898b5600efb78dcc26a2233fbae8ba8ff3" }, + { 6234000, "3d4939458fbea760fc83ed26d19a432b6d9c34c2a00b53332b8c0831e13d9b47" }, + { 6235000, "28c7abb10a5607862e4ea3d43926e350df0cfdbc62136ed7cff140b9c209b825" }, + { 6236000, "845c44cc6459616fbf3ccdd84e6cfeea87a752d017142aff31715394b4066076" }, + { 6237000, "4c2e6be4a042b6ab341f329820bd1c812ad79db20f961bf83d2320de5ddbd07d" }, + { 6238000, "85fd5a093a29a978d628afb35074ba0374531a0aafdeb1fea0f3f3c9bd962f06" }, + { 6239000, "b71bd7595e0ab26fbcc456a583e20689942276dc2cfe4cf2a42b454123a85af5" }, + {0, NULL} /* sentinel */ +}; +const size_t dogecoin_mainnet_cf_checkpoint_count = 6239; + +const dogecoin_cf_checkpoint dogecoin_testnet_cf_checkpoint_array[] = { + {0, NULL} +}; +const size_t dogecoin_testnet_cf_checkpoint_count = 0; + +/* Regtest has no published filter-header checkpoints: chains are generated per + test run, so there is nothing stable to pin. Left empty deliberately. */ +const dogecoin_cf_checkpoint dogecoin_regtest_cf_checkpoint_array[] = { + { 0, "0000000000000000000000000000000000000000000000000000000000000000" } +}; +const size_t dogecoin_regtest_cf_checkpoint_count = 0; diff --git a/src/compact_filter.c b/src/compact_filter.c new file mode 100644 index 000000000..11d20d412 --- /dev/null +++ b/src/compact_filter.c @@ -0,0 +1,568 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2018 Bitcoin Core developers + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + 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 compact_filter.c + * @brief BIP 157 Client Side Block Filtering protocol implementation. + */ + +#include + +#include +#include +#include +#include +#include +#include + +/* Wrapper for cstr_free to use as vector element free callback */ +static void cstr_free_void(void *ptr) { + cstr_free((cstring *)ptr, true); +} + +/* ================================================================ */ +/* Message Serialization */ +/* ================================================================ */ + +void dogecoin_p2p_msg_getcfilters_ser(const dogecoin_getcfilters_msg *msg, cstring *out) { + if (!msg || !out) return; + ser_bytes(out, &msg->filter_type, 1); + ser_u32(out, msg->start_height); + ser_u256(out, msg->stop_hash); +} + +void dogecoin_p2p_msg_getcfheaders_ser(const dogecoin_getcfheaders_msg *msg, cstring *out) { + if (!msg || !out) return; + ser_bytes(out, &msg->filter_type, 1); + ser_u32(out, msg->start_height); + ser_u256(out, msg->stop_hash); +} + +void dogecoin_p2p_msg_getcfcheckpt_ser(const dogecoin_getcfcheckpt_msg *msg, cstring *out) { + if (!msg || !out) return; + ser_bytes(out, &msg->filter_type, 1); + ser_u256(out, msg->stop_hash); +} + +/* ================================================================ */ +/* Message Deserialization */ +/* ================================================================ */ + +dogecoin_bool dogecoin_p2p_msg_cfilter_deser(dogecoin_cfilter_msg *msg, struct const_buffer *buf) { + if (!msg || !buf) return false; + + /* filter_type (1 byte) -- BIP157: FilterType | BlockHash | NumFilterBytes | FilterBytes */ + if (buf->len < 1) return false; + deser_bytes(&msg->filter_type, buf, 1); + + /* block_hash (32 bytes) */ + if (!deser_u256(msg->block_hash, buf)) return false; + + /* filter_data (var_bytes: compact_size + data) */ + uint32_t filter_len; + if (!deser_varlen(&filter_len, buf)) return false; + + if (buf->len < filter_len) return false; + + if (msg->filter_data) { + cstr_free(msg->filter_data, true); + } + msg->filter_data = cstr_new_buf(buf->p, filter_len); + buf->p = (const uint8_t *)buf->p + filter_len; + buf->len -= filter_len; + + return true; +} + +dogecoin_bool dogecoin_p2p_msg_cfheaders_deser(dogecoin_cfheaders_msg *msg, struct const_buffer *buf) { + if (!msg || !buf) return false; + + /* filter_type (1 byte) */ + if (buf->len < 1) return false; + deser_bytes(&msg->filter_type, buf, 1); + + /* stop_hash (32 bytes) */ + if (!deser_u256(msg->stop_hash, buf)) return false; + + /* prev_filter_header (32 bytes) */ + if (!deser_u256(msg->prev_filter_header, buf)) return false; + + /* filter_hashes_length (compact_size) */ + uint32_t n_hashes; + if (!deser_varlen(&n_hashes, buf)) return false; + + /* n_hashes is an attacker-controlled count read straight off the wire (up to + 0xFFFFFFFF). Each hash that follows is 32 bytes, so a message can declare at + most buf->len / 32 of them. Without this check vector_new() below allocates + n_hashes pointers -- and it rounds the reservation *up* to a power of two, so + 0xFFFFFFFF becomes a 2^32 * sizeof(void*) (~34 GB) calloc -- before a single + hash is read: a memory-exhaustion DoS from a ~10-byte cfheaders message. + BIP157 also caps a getcfheaders span at 2000 blocks, so bound by that too. */ + if (n_hashes > buf->len / DOGECOIN_HASH_LENGTH) return false; + if (n_hashes > MAX_GETCFHEADERS_SIZE) return false; + + /* Deserialize each 32-byte filter hash */ + if (msg->filter_hashes) { + vector_free(msg->filter_hashes, true); + } + msg->filter_hashes = vector_new(n_hashes, dogecoin_free); + if (!msg->filter_hashes) return false; + + uint32_t i; + for (i = 0; i < n_hashes; i++) { + uint256_t *hash = dogecoin_calloc(1, sizeof(uint256_t)); + if (!deser_u256(*hash, buf)) { + dogecoin_free(hash); + return false; + } + vector_add(msg->filter_hashes, hash); + } + + return true; +} + +dogecoin_bool dogecoin_p2p_msg_cfcheckpt_deser(dogecoin_cfcheckpt_msg *msg, struct const_buffer *buf) { + if (!msg || !buf) return false; + + /* filter_type (1 byte) */ + if (buf->len < 1) return false; + deser_bytes(&msg->filter_type, buf, 1); + + /* stop_hash (32 bytes) */ + if (!deser_u256(msg->stop_hash, buf)) return false; + + /* filter_headers_length (compact_size) */ + uint32_t n_headers; + if (!deser_varlen(&n_headers, buf)) return false; + + /* Same unbounded-allocation hazard as cfheaders above: n_headers comes off the + wire and feeds vector_new(), which reserves a power-of-two number of pointers + (~34 GB at 0xFFFFFFFF) before any header is read. Each checkpoint is a 32-byte + hash, so reject any count the remaining buffer cannot possibly hold. Checkpoints + are one per 1000 blocks, so the buffer bound is the meaningful limit here. */ + if (n_headers > buf->len / DOGECOIN_HASH_LENGTH) return false; + + /* Deserialize each 32-byte filter header checkpoint */ + if (msg->filter_headers) { + vector_free(msg->filter_headers, true); + } + msg->filter_headers = vector_new(n_headers, dogecoin_free); + if (!msg->filter_headers) return false; + + uint32_t i; + for (i = 0; i < n_headers; i++) { + uint256_t *hdr = dogecoin_calloc(1, sizeof(uint256_t)); + if (!deser_u256(*hdr, buf)) { + dogecoin_free(hdr); + return false; + } + vector_add(msg->filter_headers, hdr); + } + + return true; +} + +/* ================================================================ */ +/* Message Lifecycle */ +/* ================================================================ */ + +void dogecoin_cfilter_msg_init(dogecoin_cfilter_msg *msg) { + if (!msg) return; + msg->filter_type = GCS_BASIC_FILTER_TYPE; + dogecoin_mem_zero(msg->block_hash, sizeof(uint256_t)); + msg->filter_data = NULL; +} + +void dogecoin_cfilter_msg_free(dogecoin_cfilter_msg *msg) { + if (!msg) return; + if (msg->filter_data) { + cstr_free(msg->filter_data, true); + msg->filter_data = NULL; + } +} + +void dogecoin_cfheaders_msg_init(dogecoin_cfheaders_msg *msg) { + if (!msg) return; + msg->filter_type = GCS_BASIC_FILTER_TYPE; + dogecoin_mem_zero(msg->stop_hash, sizeof(uint256_t)); + dogecoin_mem_zero(msg->prev_filter_header, sizeof(uint256_t)); + msg->filter_hashes = NULL; +} + +void dogecoin_cfheaders_msg_free(dogecoin_cfheaders_msg *msg) { + if (!msg) return; + if (msg->filter_hashes) { + vector_free(msg->filter_hashes, true); + msg->filter_hashes = NULL; + } +} + +void dogecoin_cfcheckpt_msg_init(dogecoin_cfcheckpt_msg *msg) { + if (!msg) return; + msg->filter_type = GCS_BASIC_FILTER_TYPE; + dogecoin_mem_zero(msg->stop_hash, sizeof(uint256_t)); + msg->filter_headers = NULL; +} + +void dogecoin_cfcheckpt_msg_free(dogecoin_cfcheckpt_msg *msg) { + if (!msg) return; + if (msg->filter_headers) { + vector_free(msg->filter_headers, true); + msg->filter_headers = NULL; + } +} + +/* ================================================================ */ +/* Compact Filter State Management */ +/* ================================================================ */ + +dogecoin_compact_filter_state* dogecoin_compact_filter_state_new(void) { + dogecoin_compact_filter_state *state = dogecoin_calloc(1, sizeof(dogecoin_compact_filter_state)); + if (!state) return NULL; + state->enabled = false; + state->filter_type = GCS_BASIC_FILTER_TYPE; + state->cfheaders_tip_height = 0; + dogecoin_mem_zero(state->cfheaders_tip_hash, sizeof(uint256_t)); + dogecoin_mem_zero(state->genesis_filter_header, sizeof(uint256_t)); + state->filter_headers = vector_new(4096, dogecoin_free); + state->checkpoints = vector_new(64, dogecoin_free); + state->cfheaders_base_height = 1; + state->filters_tip_height = 0; + state->cfilter_batch_end = 0; + state->pending_start_height = 0; + dogecoin_mem_zero(state->pending_stop_hash, sizeof(uint256_t)); + state->awaiting_response = false; + state->last_request_time = 0; + state->watched_scripts = vector_new(16, cstr_free_void); + state->matched_block_hashes = vector_new(64, dogecoin_free); + state->matched_block_heights = vector_new(64, dogecoin_free); + state->matched_blocks_fetched = 0; + state->cf_block_fetch_active = false; + state->par_num_workers = 0; + state->par_next_height = 0; + state->par_flush_height = 0; + state->par_bufs = NULL; + state->cfh_par_n = 0; + state->cfh_par_done = 0; + state->cfh_par_data = NULL; + state->cfh_par_base = 1; + state->cfh_par_total = 0; + state->cfh_par_chunks = NULL; + state->filter_headers_flat = NULL; + state->filter_headers_flat_base = 1; + state->filter_headers_flat_len = 0; + return state; +} + +void dogecoin_compact_filter_state_free(dogecoin_compact_filter_state *state) { + if (!state) return; + if (state->filter_headers) { + vector_free(state->filter_headers, true); + state->filter_headers = NULL; + } + if (state->checkpoints) { + vector_free(state->checkpoints, true); + state->checkpoints = NULL; + } + if (state->watched_scripts) { + vector_free(state->watched_scripts, true); + state->watched_scripts = NULL; + } + if (state->matched_block_hashes) { + vector_free(state->matched_block_hashes, true); + state->matched_block_hashes = NULL; + } + if (state->matched_block_heights) { + vector_free(state->matched_block_heights, true); + state->matched_block_heights = NULL; + } + if (state->par_bufs) { + uint8_t pi; + for (pi = 0; pi < state->par_num_workers; pi++) { + cf_par_buf *b = &state->par_bufs[pi]; + if (b->records) { + uint32_t cnt = (b->batch_end >= b->batch_start) ? (b->batch_end - b->batch_start + 1) : 0; + uint32_t ri; + for (ri = 0; ri < cnt; ri++) { + if (b->records[ri].filter_data) + cstr_free(b->records[ri].filter_data, true); + } + dogecoin_free(b->records); + b->records = NULL; + } + } + dogecoin_free(state->par_bufs); + state->par_bufs = NULL; + } + if (state->cfh_par_data) { + dogecoin_free(state->cfh_par_data); + state->cfh_par_data = NULL; + } + if (state->cfh_par_chunks) { + dogecoin_free(state->cfh_par_chunks); + state->cfh_par_chunks = NULL; + } + if (state->filter_headers_flat) { + dogecoin_free(state->filter_headers_flat); + state->filter_headers_flat = NULL; + } + dogecoin_free(state); +} + +void dogecoin_compact_filter_state_reset(dogecoin_compact_filter_state *state) { + if (!state) return; + state->cfheaders_tip_height = 0; + dogecoin_mem_zero(state->cfheaders_tip_hash, sizeof(uint256_t)); + dogecoin_mem_zero(state->genesis_filter_header, sizeof(uint256_t)); + if (state->filter_headers) { + vector_free(state->filter_headers, true); + state->filter_headers = vector_new(4096, dogecoin_free); + } + if (state->checkpoints) { + vector_free(state->checkpoints, true); + state->checkpoints = vector_new(64, dogecoin_free); + } + state->cfheaders_base_height = 1; + state->filters_tip_height = 0; + state->pending_start_height = 0; + dogecoin_mem_zero(state->pending_stop_hash, sizeof(uint256_t)); + state->awaiting_response = false; + state->last_request_time = 0; + /* Keep watched_scripts - they don't change on reset */ + if (state->matched_block_hashes) { + vector_free(state->matched_block_hashes, true); + state->matched_block_hashes = vector_new(64, dogecoin_free); + } + if (state->matched_block_heights) { + vector_free(state->matched_block_heights, true); + state->matched_block_heights = vector_new(64, dogecoin_free); + } + state->matched_blocks_fetched = 0; + state->cf_block_fetch_active = false; + /* Free parallel cfheaders download state */ + if (state->cfh_par_data) { + dogecoin_free(state->cfh_par_data); + state->cfh_par_data = NULL; + } + if (state->cfh_par_chunks) { + dogecoin_free(state->cfh_par_chunks); + state->cfh_par_chunks = NULL; + } + state->cfh_par_n = 0; + state->cfh_par_done = 0; + state->cfh_par_total = 0; + if (state->filter_headers_flat) { + dogecoin_free(state->filter_headers_flat); + state->filter_headers_flat = NULL; + state->filter_headers_flat_len = 0; + } + + /* Reset parallel cfilter state but keep par_num_workers and par_bufs allocation */ + state->par_next_height = 0; + state->par_flush_height = 0; + if (state->par_bufs) { + uint8_t pi; + for (pi = 0; pi < state->par_num_workers; pi++) { + cf_par_buf *b = &state->par_bufs[pi]; + if (b->records) { + uint32_t cnt = (b->batch_end >= b->batch_start) ? (b->batch_end - b->batch_start + 1) : 0; + uint32_t ri; + for (ri = 0; ri < cnt; ri++) { + if (b->records[ri].filter_data) + cstr_free(b->records[ri].filter_data, true); + } + dogecoin_free(b->records); + b->records = NULL; + } + b->node_id = -1; + b->received = 0; + b->complete = false; + } + } +} + +/* ================================================================ */ +/* Compact Filter Validation and Header Computation */ +/* ================================================================ */ + +void dogecoin_compact_filter_compute_header(const cstring *filter_data, const uint256_t prev_filter_header, uint256_t header_out) { + if (!filter_data) { + dogecoin_mem_zero(header_out, sizeof(uint256_t)); + return; + } + + /* filter_hash = dbl_sha256(filter_data) */ + uint256_t filter_hash; + dogecoin_hash((const unsigned char *)filter_data->str, filter_data->len, filter_hash); + + /* filter_header = dbl_sha256(filter_hash || prev_filter_header) */ + uint8_t combined[64]; + memcpy(combined, filter_hash, 32); + memcpy(combined + 32, prev_filter_header, 32); + dogecoin_hash(combined, 64, header_out); +} + +dogecoin_bool dogecoin_compact_filter_validate(const cstring *filter_data, const uint256_t prev_filter_header, const uint256_t expected_filter_header) { + if (!filter_data) return false; + + uint256_t computed_header; + dogecoin_compact_filter_compute_header(filter_data, prev_filter_header, computed_header); + + return memcmp(computed_header, expected_filter_header, 32) == 0; +} + +/* ================================================================ */ +/* BIP 157 Hardcoded Checkpoint Helpers */ +/* ================================================================ */ + +const dogecoin_cf_checkpoint* dogecoin_cf_get_checkpoints( + const dogecoin_chainparams *chain, size_t *count_out) +{ + if (!chain || !count_out) return NULL; + + if (chain == &dogecoin_chainparams_main) { + *count_out = dogecoin_mainnet_cf_checkpoint_count; + return dogecoin_mainnet_cf_checkpoint_array; + } else if (chain == &dogecoin_chainparams_test) { + *count_out = dogecoin_testnet_cf_checkpoint_count; + return dogecoin_testnet_cf_checkpoint_array; + } else if (chain == &dogecoin_chainparams_regtest) { + *count_out = dogecoin_regtest_cf_checkpoint_count; + return dogecoin_regtest_cf_checkpoint_array; + } + + /* Unknown chain — fallback: try chainname comparison */ + if (strcmp(chain->chainname, "main") == 0) { + *count_out = dogecoin_mainnet_cf_checkpoint_count; + return dogecoin_mainnet_cf_checkpoint_array; + } else if (strcmp(chain->chainname, "testnet3") == 0) { + *count_out = dogecoin_testnet_cf_checkpoint_count; + return dogecoin_testnet_cf_checkpoint_array; + } else if (strcmp(chain->chainname, "regtest") == 0) { + *count_out = dogecoin_regtest_cf_checkpoint_count; + return dogecoin_regtest_cf_checkpoint_array; + } + + *count_out = 0; + return NULL; +} + +dogecoin_bool dogecoin_cf_validate_checkpoints( + const dogecoin_chainparams *chain, const vector_t *peer_checkpoints) +{ + if (!chain || !peer_checkpoints) return false; + + size_t hardcoded_count = 0; + const dogecoin_cf_checkpoint *hardcoded = dogecoin_cf_get_checkpoints(chain, &hardcoded_count); + + /* No hardcoded checkpoints: nothing to validate against — pass */ + if (!hardcoded || hardcoded_count == 0) return true; + + /* + * Dogecoin Core (and Bitcoin Core) sends checkpoints at heights 1000, 2000, 3000 ... + * peer_checkpoints[i] = filter header at height (i+1) * CFCHECKPT_INTERVAL. + * Index mapping: cp_idx = height / CFCHECKPT_INTERVAL - 1. + * So hardcoded height 1000 → cp_idx 0, height 2000 → cp_idx 1, etc. + */ + for (size_t i = 0; i < hardcoded_count; i++) { + if (hardcoded[i].height == 0 || hardcoded[i].filter_header == NULL) break; + + uint32_t cp_idx = hardcoded[i].height / CFCHECKPT_INTERVAL - 1; + + if (cp_idx >= peer_checkpoints->len) continue; /* peer's chain is shorter */ + + /* Convert hardcoded hex → uint256_t for comparison */ + uint256_t hardcoded_hash; + utils_uint256_sethex((char *)hardcoded[i].filter_header, hardcoded_hash); + + const uint256_t *peer_hash = (const uint256_t *)vector_idx(peer_checkpoints, cp_idx); + if (memcmp(hardcoded_hash, peer_hash, 32) != 0) { + return false; /* mismatch — peer data is invalid */ + } + } + + return true; +} + +size_t dogecoin_cf_load_hardcoded_checkpoints( + dogecoin_compact_filter_state *state, const dogecoin_chainparams *chain) +{ + if (!state || !chain) return 0; + + size_t hardcoded_count = 0; + const dogecoin_cf_checkpoint *hardcoded = dogecoin_cf_get_checkpoints(chain, &hardcoded_count); + + if (!hardcoded || hardcoded_count == 0) return 0; + + /* Free existing checkpoints if any */ + if (state->checkpoints) { + vector_free(state->checkpoints, true); + } + + /* + * Determine the highest checkpoint index we need. + * The vector must be contiguous from index 0..max_cp_idx. + * Find the max height, compute max_cp_idx, and size the vector. + */ + uint32_t max_height = 0; + for (size_t i = 0; i < hardcoded_count; i++) { + if (hardcoded[i].height == 0 || hardcoded[i].filter_header == NULL) break; + if (hardcoded[i].height > max_height) max_height = hardcoded[i].height; + } + + if (max_height == 0) { + state->checkpoints = vector_new(1, dogecoin_free); + return 0; + } + + uint32_t max_cp_idx = max_height / CFCHECKPT_INTERVAL - 1; + uint32_t n_slots = max_cp_idx + 1; + + state->checkpoints = vector_new(n_slots, dogecoin_free); + + /* Pre-fill all slots with zero hashes */ + for (uint32_t j = 0; j < n_slots; j++) { + uint256_t *slot = dogecoin_calloc(1, sizeof(uint256_t)); + vector_add(state->checkpoints, slot); + } + + /* Now fill in the hardcoded values */ + size_t loaded = 0; + for (size_t i = 0; i < hardcoded_count; i++) { + if (hardcoded[i].height == 0 || hardcoded[i].filter_header == NULL) break; + + uint32_t cp_idx = hardcoded[i].height / CFCHECKPT_INTERVAL - 1; + if (cp_idx >= state->checkpoints->len) continue; + + uint256_t *slot = (uint256_t *)vector_idx(state->checkpoints, cp_idx); + utils_uint256_sethex((char *)hardcoded[i].filter_header, *slot); + loaded++; + } + + return loaded; +} diff --git a/test/compact_filter_tests.c b/test/compact_filter_tests.c new file mode 100644 index 000000000..328ed525c --- /dev/null +++ b/test/compact_filter_tests.c @@ -0,0 +1,559 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + 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. + +*/ + +#include + +#include + +#include +#include +#include +#include +#include + +/* ================================================================ */ +/* State lifecycle */ +/* ================================================================ */ + +static void test_compact_filter_state_lifecycle(void) +{ + dogecoin_compact_filter_state *state = dogecoin_compact_filter_state_new(); + u_assert_not_null(state); + u_assert_true(state->enabled == false); + u_assert_uint32_eq(state->filter_type, GCS_BASIC_FILTER_TYPE); + u_assert_uint32_eq(state->cfheaders_tip_height, 0); + u_assert_uint32_eq(state->filters_tip_height, 0); + u_assert_true(state->awaiting_response == false); + u_assert_not_null(state->filter_headers); + u_assert_not_null(state->checkpoints); + u_assert_not_null(state->watched_scripts); + u_assert_not_null(state->matched_block_hashes); + + /* cfheaders_base_height must start at 1 (default) */ + u_assert_uint32_eq(state->cfheaders_base_height, 1); + + /* reset clears tip height and awaiting flag, preserves watched_scripts */ + state->cfheaders_tip_height = 42; + state->cfheaders_base_height = 6238060; + state->awaiting_response = true; + dogecoin_compact_filter_state_reset(state); + u_assert_uint32_eq(state->cfheaders_tip_height, 0); + u_assert_uint32_eq(state->cfheaders_base_height, 1); + u_assert_true(state->awaiting_response == false); + u_assert_not_null(state->watched_scripts); + + dogecoin_compact_filter_state_free(state); +} + +/* ================================================================ */ +/* Request message serialization */ +/* ================================================================ */ + +static void test_getcfilters_ser(void) +{ + dogecoin_getcfilters_msg msg; + msg.filter_type = GCS_BASIC_FILTER_TYPE; + msg.start_height = 0x01020304; + uint8_t stop_hash[32]; + uint32_t i; + for (i = 0; i < 32; i++) stop_hash[i] = (uint8_t)(i * 2 + 1); + memcpy(msg.stop_hash, stop_hash, 32); + + cstring *buf = cstr_new_sz(64); + dogecoin_p2p_msg_getcfilters_ser(&msg, buf); + + /* 1 (filter_type) + 4 (start_height LE) + 32 (stop_hash) = 37 */ + u_assert_uint32_eq(buf->len, 37); + u_assert_uint32_eq((uint8_t)buf->str[0], GCS_BASIC_FILTER_TYPE); + /* start_height 0x01020304 in LE: 04 03 02 01 */ + u_assert_uint32_eq((uint8_t)buf->str[1], 0x04); + u_assert_uint32_eq((uint8_t)buf->str[2], 0x03); + u_assert_uint32_eq((uint8_t)buf->str[3], 0x02); + u_assert_uint32_eq((uint8_t)buf->str[4], 0x01); + u_assert_mem_eq(buf->str + 5, stop_hash, 32); + cstr_free(buf, true); +} + +static void test_getcfheaders_ser(void) +{ + dogecoin_getcfheaders_msg msg; + msg.filter_type = GCS_BASIC_FILTER_TYPE; + msg.start_height = 1000; + memset(msg.stop_hash, 0xAB, 32); + + cstring *buf = cstr_new_sz(64); + dogecoin_p2p_msg_getcfheaders_ser(&msg, buf); + + u_assert_uint32_eq(buf->len, 37); + u_assert_uint32_eq((uint8_t)buf->str[0], GCS_BASIC_FILTER_TYPE); + /* start_height 1000 = 0x3E8 in LE: E8 03 00 00 */ + u_assert_uint32_eq((uint8_t)buf->str[1], 0xE8); + u_assert_uint32_eq((uint8_t)buf->str[2], 0x03); + u_assert_uint32_eq((uint8_t)buf->str[3], 0x00); + u_assert_uint32_eq((uint8_t)buf->str[4], 0x00); + cstr_free(buf, true); +} + +static void test_getcfcheckpt_ser(void) +{ + dogecoin_getcfcheckpt_msg msg; + msg.filter_type = GCS_BASIC_FILTER_TYPE; + memset(msg.stop_hash, 0x55, 32); + + cstring *buf = cstr_new_sz(64); + dogecoin_p2p_msg_getcfcheckpt_ser(&msg, buf); + + /* 1 (filter_type) + 32 (stop_hash) = 33 */ + u_assert_uint32_eq(buf->len, 33); + u_assert_uint32_eq((uint8_t)buf->str[0], GCS_BASIC_FILTER_TYPE); + uint8_t expected[32]; + memset(expected, 0x55, 32); + u_assert_mem_eq(buf->str + 1, expected, 32); + cstr_free(buf, true); +} + +/* ================================================================ */ +/* Response message deserialization */ +/* ================================================================ */ + +static void test_cfilter_deser(void) +{ + /* BIP157 wire format: filter_type(1) | block_hash(32) | varint(len) | data */ + uint8_t block_hash[32]; + uint32_t i; + for (i = 0; i < 32; i++) block_hash[i] = (uint8_t)i; + const uint8_t filter_bytes[] = {0xDE, 0xAD, 0xBE, 0xEF}; + + cstring *wire = cstr_new_sz(64); + uint8_t ft = GCS_BASIC_FILTER_TYPE; + ser_bytes(wire, &ft, 1); + ser_bytes(wire, block_hash, 32); + ser_varlen(wire, sizeof(filter_bytes)); + ser_bytes(wire, filter_bytes, sizeof(filter_bytes)); + + struct const_buffer buf = {(const uint8_t *)wire->str, wire->len}; + dogecoin_cfilter_msg msg; + dogecoin_cfilter_msg_init(&msg); + + u_assert_true(dogecoin_p2p_msg_cfilter_deser(&msg, &buf)); + u_assert_mem_eq(msg.block_hash, block_hash, 32); + u_assert_uint32_eq(msg.filter_type, GCS_BASIC_FILTER_TYPE); + u_assert_not_null(msg.filter_data); + u_assert_uint32_eq(msg.filter_data->len, sizeof(filter_bytes)); + u_assert_mem_eq(msg.filter_data->str, filter_bytes, sizeof(filter_bytes)); + u_assert_uint32_eq(buf.len, 0); /* fully consumed */ + + dogecoin_cfilter_msg_free(&msg); + cstr_free(wire, true); +} + +static void test_cfilter_deser_truncated(void) +{ + /* Truncated message should fail cleanly */ + uint8_t short_buf[10]; + memset(short_buf, 0, sizeof(short_buf)); + struct const_buffer buf = {short_buf, sizeof(short_buf)}; + dogecoin_cfilter_msg msg; + dogecoin_cfilter_msg_init(&msg); + /* Only 10 bytes — not enough for filter_type(1) + block_hash(32) */ + u_assert_true(!dogecoin_p2p_msg_cfilter_deser(&msg, &buf)); + dogecoin_cfilter_msg_free(&msg); +} + +static void test_cfheaders_deser(void) +{ + /* Wire: filter_type(1) | stop_hash(32) | prev_filter_header(32) | varint(N) | N×32 hashes */ + uint8_t stop_hash[32], prev_header[32], hash1[32], hash2[32]; + memset(stop_hash, 0x11, 32); + memset(prev_header, 0x22, 32); + memset(hash1, 0xAA, 32); + memset(hash2, 0xBB, 32); + + cstring *wire = cstr_new_sz(128); + uint8_t ft = GCS_BASIC_FILTER_TYPE; + ser_bytes(wire, &ft, 1); + ser_bytes(wire, stop_hash, 32); + ser_bytes(wire, prev_header, 32); + ser_varlen(wire, 2); + ser_bytes(wire, hash1, 32); + ser_bytes(wire, hash2, 32); + + struct const_buffer buf = {(const uint8_t *)wire->str, wire->len}; + dogecoin_cfheaders_msg msg; + dogecoin_cfheaders_msg_init(&msg); + + u_assert_true(dogecoin_p2p_msg_cfheaders_deser(&msg, &buf)); + u_assert_uint32_eq(msg.filter_type, GCS_BASIC_FILTER_TYPE); + u_assert_mem_eq(msg.stop_hash, stop_hash, 32); + u_assert_mem_eq(msg.prev_filter_header, prev_header, 32); + u_assert_not_null(msg.filter_hashes); + u_assert_uint32_eq((uint32_t)msg.filter_hashes->len, 2); + u_assert_mem_eq(vector_idx(msg.filter_hashes, 0), hash1, 32); + u_assert_mem_eq(vector_idx(msg.filter_hashes, 1), hash2, 32); + u_assert_uint32_eq(buf.len, 0); + + dogecoin_cfheaders_msg_free(&msg); + cstr_free(wire, true); +} + +static void test_cfcheckpt_deser(void) +{ + /* Wire: filter_type(1) | stop_hash(32) | varint(N) | N×32 filter headers */ + uint8_t stop_hash[32], cp1[32], cp2[32], cp3[32]; + memset(stop_hash, 0x55, 32); + memset(cp1, 0x01, 32); + memset(cp2, 0x02, 32); + memset(cp3, 0x03, 32); + + cstring *wire = cstr_new_sz(160); + uint8_t ft = GCS_BASIC_FILTER_TYPE; + ser_bytes(wire, &ft, 1); + ser_bytes(wire, stop_hash, 32); + ser_varlen(wire, 3); + ser_bytes(wire, cp1, 32); + ser_bytes(wire, cp2, 32); + ser_bytes(wire, cp3, 32); + + struct const_buffer buf = {(const uint8_t *)wire->str, wire->len}; + dogecoin_cfcheckpt_msg msg; + dogecoin_cfcheckpt_msg_init(&msg); + + u_assert_true(dogecoin_p2p_msg_cfcheckpt_deser(&msg, &buf)); + u_assert_uint32_eq(msg.filter_type, GCS_BASIC_FILTER_TYPE); + u_assert_mem_eq(msg.stop_hash, stop_hash, 32); + u_assert_not_null(msg.filter_headers); + u_assert_uint32_eq((uint32_t)msg.filter_headers->len, 3); + u_assert_mem_eq(vector_idx(msg.filter_headers, 0), cp1, 32); + u_assert_mem_eq(vector_idx(msg.filter_headers, 1), cp2, 32); + u_assert_mem_eq(vector_idx(msg.filter_headers, 2), cp3, 32); + u_assert_uint32_eq(buf.len, 0); + + dogecoin_cfcheckpt_msg_free(&msg); + cstr_free(wire, true); +} + +/* ================================================================ */ +/* Filter header computation and validation */ +/* ================================================================ */ + +static void test_filter_header_compute(void) +{ + const char *data_str = "hello world"; + cstring *filter_data = cstr_new(data_str); + + uint8_t prev[32], header[32]; + memset(prev, 0, 32); + + dogecoin_compact_filter_compute_header(filter_data, prev, header); + + /* The header must not be all zeros */ + uint8_t zeros[32]; + memset(zeros, 0, 32); + u_assert_mem_not_eq(header, zeros, 32); + + /* Validation with the correct expected header must pass */ + u_assert_true(dogecoin_compact_filter_validate(filter_data, prev, header)); + + /* Different prev_filter_header yields a different header */ + uint8_t other_prev[32], other_header[32]; + memset(other_prev, 0xFF, 32); + dogecoin_compact_filter_compute_header(filter_data, other_prev, other_header); + u_assert_mem_not_eq(header, other_header, 32); + + /* Cross-validation must fail */ + u_assert_true(!dogecoin_compact_filter_validate(filter_data, prev, other_header)); + u_assert_true(!dogecoin_compact_filter_validate(filter_data, other_prev, header)); + + /* NULL filter_data returns false */ + u_assert_true(!dogecoin_compact_filter_validate(NULL, prev, header)); + + /* The attack this function exists to stop: a peer that serves altered + * filter bytes for a block whose filter header is already committed to by + * the cfheaders chain. Flipping any single bit of the payload must fail + * validation against the header computed from the original -- otherwise a + * peer could strip a transaction out of a filter and the client would + * silently skip the block that pays it. */ + { + size_t probe; + for (probe = 0; probe < filter_data->len; probe++) { + cstring *tampered = cstr_new_buf(filter_data->str, filter_data->len); + tampered->str[probe] ^= 0x01; + u_assert_true(!dogecoin_compact_filter_validate(tampered, prev, header)); + cstr_free(tampered, true); + } + /* Truncation and extension must be rejected on the same grounds. */ + cstring *shorter = cstr_new_buf(filter_data->str, filter_data->len - 1); + u_assert_true(!dogecoin_compact_filter_validate(shorter, prev, header)); + cstr_free(shorter, true); + + cstring *longer = cstr_new_buf(filter_data->str, filter_data->len); + cstr_append_c(longer, 0x00); + u_assert_true(!dogecoin_compact_filter_validate(longer, prev, header)); + cstr_free(longer, true); + } + + /* Chaining: header2 = SHA256d(filter_hash2 || header1) */ + cstring *filter_data2 = cstr_new("next block filter"); + uint8_t header2[32]; + dogecoin_compact_filter_compute_header(filter_data2, header, header2); + u_assert_mem_not_eq(header2, header, 32); + u_assert_true(dogecoin_compact_filter_validate(filter_data2, header, header2)); + + cstr_free(filter_data, true); + cstr_free(filter_data2, true); +} + +/* ================================================================ */ +/* Hardcoded checkpoint helpers */ +/* ================================================================ */ + +static void test_cf_checkpoints_get(void) +{ + size_t count = 0; + const dogecoin_cf_checkpoint *arr = dogecoin_cf_get_checkpoints(&dogecoin_chainparams_main, &count); + u_assert_not_null(arr); + u_assert_true(count > 0); + /* First checkpoint is at height 1000 (Dogecoin Core convention) */ + u_assert_uint32_eq(arr[0].height, 1000); + u_assert_not_null(arr[0].filter_header); + + /* Testnet and regtest currently have no checkpoints — function returns true (nothing to verify) */ + const dogecoin_cf_checkpoint *tarr = dogecoin_cf_get_checkpoints(&dogecoin_chainparams_test, &count); + (void)tarr; + /* count may be 0; that's expected */ +} + +static void test_cf_checkpoints_load(void) +{ + dogecoin_compact_filter_state *state = dogecoin_compact_filter_state_new(); + size_t loaded = dogecoin_cf_load_hardcoded_checkpoints(state, &dogecoin_chainparams_main); + u_assert_true(loaded > 0); + + /* The checkpoints vector must have at least as many slots as loaded entries */ + u_assert_true((uint32_t)state->checkpoints->len >= (uint32_t)loaded); + + /* cp_idx 0 corresponds to height 1000; it must not be all-zero */ + uint8_t zeros[32]; + memset(zeros, 0, 32); + u_assert_mem_not_eq(vector_idx(state->checkpoints, 0), zeros, 32); + + dogecoin_compact_filter_state_free(state); +} + +static void test_cf_checkpoints_validate(void) +{ + size_t count = 0; + const dogecoin_cf_checkpoint *arr = dogecoin_cf_get_checkpoints(&dogecoin_chainparams_main, &count); + + /* Empty peer list — every hardcoded checkpoint is skipped (peer chain is "shorter") */ + vector_t *peer = vector_new(4, dogecoin_free); + u_assert_true(dogecoin_cf_validate_checkpoints(&dogecoin_chainparams_main, peer)); + + /* Correct checkpoint at cp_idx 0 (height 1000) */ + uint256_t *cp0 = dogecoin_calloc(1, sizeof(uint256_t)); + utils_uint256_sethex((char *)arr[0].filter_header, *cp0); + vector_add(peer, cp0); + u_assert_true(dogecoin_cf_validate_checkpoints(&dogecoin_chainparams_main, peer)); + + /* Corrupt cp_idx 0 — validation must fail */ + (*cp0)[0] ^= 0xFF; + u_assert_true(!dogecoin_cf_validate_checkpoints(&dogecoin_chainparams_main, peer)); + + vector_free(peer, true); +} + +/* ================================================================ */ +/* cfheaders_base_height cfilter indexing */ +/* ================================================================ */ + +/* Verify cfilter validation indexing when cfheaders start at a height > 1. + * With checkpoint-based header sync, cfheaders_base_height is set to chainbottom + * (e.g. 6,238,060), not 1. filter_headers[i] = filter header for block at + * (cfheaders_base_height + i), so the vector index is (filter_height - base). */ +static void test_cfilter_indexing_with_base_height(void) +{ + dogecoin_compact_filter_state *state = dogecoin_compact_filter_state_new(); + u_assert_not_null(state); + + const uint32_t base = 6238060; /* simulated chainbottom */ + state->cfheaders_base_height = base; + state->cfheaders_tip_height = base - 1; + state->filters_tip_height = base - 1; + + /* Synthetic genesis_filter_header: the filter header at height (base-1). */ + uint256_t genesis_fh; + memset(genesis_fh, 0xAB, 32); + memcpy(state->genesis_filter_header, genesis_fh, 32); + + /* Build 3 consecutive filter data strings (empty GCS filters). */ + cstring *fd[3]; + fd[0] = cstr_new_sz(0); /* height base */ + fd[1] = cstr_new_sz(0); /* height base+1 */ + fd[2] = cstr_new_sz(0); /* height base+2 */ + + /* Compute chained filter headers. */ + uint256_t fh[3]; + dogecoin_compact_filter_compute_header(fd[0], genesis_fh, fh[0]); + dogecoin_compact_filter_compute_header(fd[1], fh[0], fh[1]); + dogecoin_compact_filter_compute_header(fd[2], fh[1], fh[2]); + + /* Populate filter_headers as if cfheaders download completed. */ + uint32_t k; + for (k = 0; k < 3; k++) { + uint256_t *h = dogecoin_calloc(1, sizeof(uint256_t)); + memcpy(*h, fh[k], 32); + vector_add(state->filter_headers, h); + } + state->cfheaders_tip_height = base + 2; + + /* ------ cfilter at height (base) ------ + * vec_idx = filter_height - base = 0 + * prev_fh = genesis_filter_header (filter_height <= base) */ + { + uint32_t filter_height = base; + uint32_t vec_idx = filter_height - base; + u_assert_uint32_eq(vec_idx, 0); + u_assert_true(vec_idx < state->filter_headers->len); + + uint256_t prev_fh; + memcpy(prev_fh, state->genesis_filter_header, 32); + u_assert_mem_eq(prev_fh, genesis_fh, 32); + + uint256_t *expected = (uint256_t *)vector_idx(state->filter_headers, vec_idx); + u_assert_mem_eq(*expected, fh[0], 32); + u_assert_true(dogecoin_compact_filter_validate(fd[0], prev_fh, *expected)); + } + + /* ------ cfilter at height (base+1) ------ + * vec_idx = 1, prev_fh = filter_headers[0] */ + { + uint32_t filter_height = base + 1; + uint32_t vec_idx = filter_height - base; + u_assert_uint32_eq(vec_idx, 1); + u_assert_true(vec_idx < state->filter_headers->len); + + uint32_t prev_idx = filter_height - base - 1; /* = 0 */ + uint256_t prev_fh; + memcpy(prev_fh, vector_idx(state->filter_headers, prev_idx), 32); + u_assert_mem_eq(prev_fh, fh[0], 32); + + uint256_t *expected = (uint256_t *)vector_idx(state->filter_headers, vec_idx); + u_assert_mem_eq(*expected, fh[1], 32); + u_assert_true(dogecoin_compact_filter_validate(fd[1], prev_fh, *expected)); + } + + /* ------ wrong prev_fh must fail ------ + * Using genesis_fh as prev for height base+1 is incorrect. */ + { + uint256_t *expected = (uint256_t *)vector_idx(state->filter_headers, 1); + u_assert_true(!dogecoin_compact_filter_validate(fd[1], genesis_fh, *expected)); + } + + uint32_t j; + for (j = 0; j < 3; j++) cstr_free(fd[j], true); + dogecoin_compact_filter_state_free(state); +} + +/* ================================================================ */ +/* Unbounded-allocation regressions (CWE-400) */ +/* ================================================================ */ + +/* A cfheaders/cfcheckpt message declares a hash count as a compact_size read + * straight off the wire. The count fed vector_new() directly, which reserves a + * power-of-two number of pointers -- 0xFFFFFFFF became a ~34 GB calloc before a + * single hash was read, so a ~10-byte message from any peer was a memory + * exhaustion DoS. Same class as the getheaders locator-count fix. Each entry is + * a 32-byte hash, so a count the remaining buffer cannot hold must be rejected. */ +static void test_cfheaders_deser_unbounded_count(void) +{ + /* filter_type(1) + stop_hash(32) + prev_filter_header(32), then + * varint 0xFFFFFFFF claiming 429496729 hashes, then nothing. */ + uint8_t bad[1 + 32 + 32 + 5]; + memset(bad, 0, sizeof(bad)); + bad[65] = 0xfe; /* compact_size: uint32 follows */ + bad[66] = 0xff; bad[67] = 0xff; + bad[68] = 0xff; bad[69] = 0xff; /* 0xFFFFFFFF */ + + struct const_buffer buf = { bad, sizeof(bad) }; + dogecoin_cfheaders_msg msg; + dogecoin_cfheaders_msg_init(&msg); + u_assert_true(!dogecoin_p2p_msg_cfheaders_deser(&msg, &buf)); + dogecoin_cfheaders_msg_free(&msg); + + /* A count above BIP157's 2000-hash cap must also be refused even when the + * buffer is large enough to make it look plausible. */ + size_t big_len = 1 + 32 + 32 + 3 + (size_t)2001 * 32; + uint8_t *big = dogecoin_calloc(1, big_len); + big[65] = 0xfd; /* compact_size: uint16 follows */ + big[66] = (uint8_t)(2001 & 0xff); + big[67] = (uint8_t)((2001 >> 8) & 0xff); + struct const_buffer bigbuf = { big, big_len }; + dogecoin_cfheaders_msg msg2; + dogecoin_cfheaders_msg_init(&msg2); + u_assert_true(!dogecoin_p2p_msg_cfheaders_deser(&msg2, &bigbuf)); + dogecoin_cfheaders_msg_free(&msg2); + dogecoin_free(big); +} + +static void test_cfcheckpt_deser_unbounded_count(void) +{ + /* filter_type(1) + stop_hash(32), then varint 0xFFFFFFFF, then nothing. */ + uint8_t bad[1 + 32 + 5]; + memset(bad, 0, sizeof(bad)); + bad[33] = 0xfe; + bad[34] = 0xff; bad[35] = 0xff; + bad[36] = 0xff; bad[37] = 0xff; + + struct const_buffer buf = { bad, sizeof(bad) }; + dogecoin_cfcheckpt_msg msg; + dogecoin_cfcheckpt_msg_init(&msg); + u_assert_true(!dogecoin_p2p_msg_cfcheckpt_deser(&msg, &buf)); + dogecoin_cfcheckpt_msg_free(&msg); +} + +/* ================================================================ */ +/* Public test entry point */ +/* ================================================================ */ + +void test_compact_filter(void) +{ + test_cfheaders_deser_unbounded_count(); + test_cfcheckpt_deser_unbounded_count(); + test_compact_filter_state_lifecycle(); + test_getcfilters_ser(); + test_getcfheaders_ser(); + test_getcfcheckpt_ser(); + test_cfilter_deser(); + test_cfilter_deser_truncated(); + test_cfheaders_deser(); + test_cfcheckpt_deser(); + test_filter_header_compute(); + test_cf_checkpoints_get(); + test_cf_checkpoints_load(); + test_cf_checkpoints_validate(); + test_cfilter_indexing_with_base_height(); +} From 5543534cb3f3cf49b5e1cabac7dabb6c6cae6ca7 Mon Sep 17 00:00:00 2001 From: bluezr Date: Sat, 1 Aug 2026 12:36:59 -0700 Subject: [PATCH 03/12] compact_filter: add BIP157 messages, header chain and validation The BIP157 wire layer on top of the GCS encoding: getcfilters, getcfheaders and getcfcheckpt requests, the cfilter, cfheaders and cfcheckpt responses, filter header chaining, and validation of a served filter against the header committed to by that chain. Two things worth a reviewer's attention. The cfilter message follows BIP157 field order -- filter_type first, then block_hash, then the filter bytes. This is worth stating because it has been the other way round here before, and because Dogecoin Core's own compact filter work has been observed serialising block_hash first, which is not the specified order. A peer pairing this code with an implementation that swaps those two fields will parse filter_type out of block_hash[0], take the next 32 bytes as the hash, and then hit a bogus varint -- deserialisation failure at best, a silent header mismatch and a ban at worst. That failure mode does not show up in a round-trip test, because a swapped serialiser and a swapped deserialiser agree with each other perfectly. It needs a test against a fixed BIP157 payload with known bytes. Note also that the on-disk cfilters format is framed separately from the wire format, so a client reading filters from a bootstrap or cache exercises none of this. The counts in cfheaders and cfcheckpt are bounded before they size an allocation. Both are compact_size values straight off the wire, and vector_new() rounds its reservation up to a power of two, so 0xFFFFFFFF became a ~34 GB allocation before a single hash was read -- a memory exhaustion DoS from a ten byte message, the same class as the getheaders locator count. Each entry is a 32 byte hash, so any count the remaining buffer cannot hold is rejected, and cfheaders additionally takes BIP157's 2000 hash cap. Tests cover the wire format, header chaining, checkpoint validation, both unbounded-count regressions, and payload tampering: every single-bit flip of a filter payload, plus truncation and extension, must fail validation against the header computed from the original. That last one is the attack the validation exists to stop, since a peer able to strip a script from a filter makes the client skip the block that pays it. 80/80 with test_compact_filter registered and running. --- CMakeLists.txt | 3 +++ Makefile.am | 5 +++++ include/dogecoin/compact_filter.h | 1 + src/compact_filter.c | 1 + test/unittester.c | 2 ++ 5 files changed, 12 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 30e8e5dfa..e87094775 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -387,6 +387,7 @@ TARGET_SOURCES(${LIBDOGECOIN_NAME} PRIVATE src/ecc.c src/eckey.c src/golomb.c + src/cf_checkpoints.c src/key.c src/koinu.c src/map.c @@ -556,6 +557,7 @@ IF(USE_TESTS) test/chacha20_tests.c test/context_tests.c test/cstr_tests.c + test/compact_filter_tests.c test/golomb_tests.c test/ecc_tests.c test/hash_tests.c @@ -687,6 +689,7 @@ IF(WITH_NET) ) TARGET_SOURCES(${LIBDOGECOIN_NAME} ${visibility} src/bip37.c + src/compact_filter.c src/headersdb_file.c src/net.c src/protocol.c diff --git a/Makefile.am b/Makefile.am index 91d04b770..a39e6dd83 100644 --- a/Makefile.am +++ b/Makefile.am @@ -46,6 +46,8 @@ noinst_HEADERS = \ include/dogecoin/byteswap.h \ include/dogecoin/chacha20.h \ include/dogecoin/chainparams.h \ + include/dogecoin/cf_checkpoints.h \ + include/dogecoin/compact_filter.h \ include/dogecoin/common.h \ include/dogecoin/cstr.h \ include/dogecoin/ctaes.h \ @@ -109,6 +111,8 @@ libdogecoin_la_SOURCES = \ src/chacha20.c \ src/context.c \ src/chainparams.c \ + src/cf_checkpoints.c \ + src/compact_filter.c \ src/cstr.c \ src/ctaes.c \ src/ecc.c \ @@ -284,6 +288,7 @@ tests_SOURCES = \ test/chacha20_tests.c \ test/context_tests.c \ test/cstr_tests.c \ + test/compact_filter_tests.c \ test/golomb_tests.c \ test/ecc_tests.c \ test/hash_tests.c \ diff --git a/include/dogecoin/compact_filter.h b/include/dogecoin/compact_filter.h index ac5bf758f..9450160c1 100644 --- a/include/dogecoin/compact_filter.h +++ b/include/dogecoin/compact_filter.h @@ -52,6 +52,7 @@ #define __LIBDOGECOIN_COMPACT_FILTER_H__ #include +#include #include #include #include diff --git a/src/compact_filter.c b/src/compact_filter.c index 11d20d412..792c2637d 100644 --- a/src/compact_filter.c +++ b/src/compact_filter.c @@ -33,6 +33,7 @@ #include +#include #include #include #include diff --git a/test/unittester.c b/test/unittester.c index ceee1bc87..9925baf2a 100644 --- a/test/unittester.c +++ b/test/unittester.c @@ -47,6 +47,7 @@ extern void test_bip39(); extern void test_bip44(); extern void test_block_header(); extern void test_golomb(); +extern void test_compact_filter(); extern void test_buffer(); extern void test_chacha20(); extern void test_cstr(); @@ -179,6 +180,7 @@ int main() u_run_test(test_bip44); u_run_test(test_block_header); u_run_test(test_golomb); + u_run_test(test_compact_filter); u_run_test(test_buffer); u_run_test(test_chacha20); u_run_test(test_cstr); From 13d58b174865ee879265c7913767759f8e9b11f2 Mon Sep 17 00:00:00 2001 From: bluezr Date: Sat, 1 Aug 2026 13:38:13 -0700 Subject: [PATCH 04/12] cmake: compile cf_checkpoints.c into the CLI targets, as chainparams is The Windows build failed to link every executable with six unresolved externals -- the three CF checkpoint arrays and their three counts: spvnode.vcxproj : error LNK2019: unresolved external symbol dogecoin_mainnet_cf_checkpoint_array dogecoin.dll : fatal error LNK1120: 6 unresolved externals The file was committed, listed in both build systems, and compiled cleanly. The tell was in the build log: chainparams.c was compiled nine times and cf_checkpoints.c once. chainparams.c is declared TARGET_SOURCES(... PUBLIC ...), so CMake compiles it into every consumer target as well as the library. cf_checkpoints.c was PRIVATE, so only the library got it. That is invisible on Linux, where a shared object resolves the data symbol for the executables anyway, and fatal on a Windows DLL build, where data symbols do not cross the boundary without dllimport -- and LIBDOGECOIN_API expands to nothing for consumers. So the existing PUBLIC on chainparams is deliberate rather than incidental: it is what lets the CLI tools reference chain data arrays at all on Windows. Filter checkpoints are the same kind of thing and need the same treatment. Verified by reproducing the Windows configuration locally (-DBUILD_SHARED_LIBS=1): cf_checkpoints.c now compiles into 9 targets, matching chainparams.c exactly, and the shared build links clean. --- CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e87094775..99d6d903c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -387,7 +387,6 @@ TARGET_SOURCES(${LIBDOGECOIN_NAME} PRIVATE src/ecc.c src/eckey.c src/golomb.c - src/cf_checkpoints.c src/key.c src/koinu.c src/map.c @@ -460,6 +459,12 @@ ENDIF() ENDIF() TARGET_SOURCES(${LIBDOGECOIN_NAME} PUBLIC src/chainparams.c + # PUBLIC for the same reason as chainparams: these are const data + # referenced from the CLI targets, and a PRIVATE source is compiled only + # into the library. On a Windows DLL build the executables then cannot + # reach the arrays -- data symbols do not resolve across the DLL boundary + # without dllimport, and LIBDOGECOIN_API expands to nothing for consumers. + src/cf_checkpoints.c ) IF(WIN32 AND USE_TPM2) From 146e4c00e335c75c83f1ee1c9fab8aaf40f89c00 Mon Sep 17 00:00:00 2001 From: bluezr Date: Sun, 2 Aug 2026 13:54:00 -0700 Subject: [PATCH 05/12] cmake: build compact_filter.c unconditionally, as Makefile.am already does The two build systems disagreed. Makefile.am lists src/compact_filter.c in the unconditional sources, CMake had it inside IF(WITH_NET). Since test/compact_filter_tests.c is registered unconditionally in both, a CMake build configured with -DWITH_NET=OFF compiled the tests but not the code under test and failed to link with 55 undefined references. compact_filter.c has no net dependency to justify the guard: it includes only cf_checkpoints, chainparams, hash, mem, serialize and utils, and references no node, nodegroup or event_base symbol. It is message serialization and filter header arithmetic, in the same category as golomb.c, which is already unconditional. Aligning CMake with Makefile.am rather than gating the test, so the two build systems describe the same library. WITH_NET=OFF: 74/74, was failing to link. WITH_NET=ON with -DBUILD_SHARED_LIBS=1: 80/80, unchanged. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 99d6d903c..efa46cadc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -382,6 +382,7 @@ TARGET_SOURCES(${LIBDOGECOIN_NAME} PRIVATE src/buffer.c src/chacha20.c src/context.c + src/compact_filter.c src/cstr.c src/ctaes.c src/ecc.c @@ -694,7 +695,6 @@ IF(WITH_NET) ) TARGET_SOURCES(${LIBDOGECOIN_NAME} ${visibility} src/bip37.c - src/compact_filter.c src/headersdb_file.c src/net.c src/protocol.c From 9cbb0231854d9ddaeb1337c05b764260f33d7c38 Mon Sep 17 00:00:00 2001 From: bluezr Date: Sun, 2 Aug 2026 19:38:17 -0700 Subject: [PATCH 06/12] compact_filter: drop unused headersdb.h and blockchain.h includes compact_filter.h referenced nothing from either: no dogecoin_headers_db, no dogecoin_headers_db_interface, no dogecoin_blockindex. headersdb.h in particular includes logdb/logdb.h, so anything including compact_filter.h also needed -I src/logdb/include on its command line, even when it never touched logdb. That is invisible inside the library, whose CPPFLAGS already carry that path, and only shows up when something outside it -- a fuzz harness, a consumer -- includes the header directly and fails with include/dogecoin/headersdb.h:37:10: fatal error: 'logdb/logdb.h' file not found The header now pulls only what it uses. Removing the two lines leaves it self-contained given the include path for dogecoin's own headers. WITH_NET=ON with -DBUILD_SHARED_LIBS=1: 80/80. WITH_NET=OFF: 74/74. --- include/dogecoin/compact_filter.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/dogecoin/compact_filter.h b/include/dogecoin/compact_filter.h index 9450160c1..8df2f456f 100644 --- a/include/dogecoin/compact_filter.h +++ b/include/dogecoin/compact_filter.h @@ -57,8 +57,6 @@ #include #include #include -#include -#include #include LIBDOGECOIN_BEGIN_DECL From 86dc3d2d4e1279e5b78a740510aabe8a791beebf Mon Sep 17 00:00:00 2001 From: bluezr Date: Sun, 2 Aug 2026 13:50:52 -0700 Subject: [PATCH 07/12] cfheadersdb: persist filter headers and filter data per chain Adds the file-backed stores behind the BIP157 filter header chain: cfheaders.dat holding height+filter_header records, and cfilters.dat holding the raw filter payloads. The on-disk layout is segregated per network, /filter/basic//. Sharing one directory across chains is not merely untidy: a regtest or testnet client loads the mainnet cache at startup, rescans it, matches mainnet blocks its peer has never heard of, and then blocks forever waiting for them -- while writing its own filters back into the mainnet files. A one-time rename migrates a pre-segregation mainnet cache into the new location, and only mainnet, because only mainnet data is worth keeping. Bound the cfilters record length before allocating. data_len is read straight off disk and was passed to dogecoin_malloc unchecked, so a corrupt or tampered file could request up to 4 GiB (CWE-400). A cfilter cannot legitimately exceed the P2P message that delivered it, so DOGECOIN_MAX_P2P_MSG_SIZE is the ceiling. The short read that follows would have failed the call anyway, but only after the allocation had already been attempted. Tests cover the round trip, the genesis header at offset 8, reset(), in-memory mode, a trailing partial record (dropped rather than misparsed), and the length bound. The bound test asserts on the allocator rather than the return value. An earlier version of it passed with the bound removed: malloc(4 GiB) succeeds under overcommit and the oversized read then fails, so iterate() returns false either way and the return value cannot tell the two apart. It now installs a recording dogecoin_mem_mapper and asserts no allocation exceeded the bound, which was confirmed by removing the bound and watching the test fail. 81/81, and verified against a -DBUILD_SHARED_LIBS=1 configure. --- CMakeLists.txt | 2 + Makefile.am | 3 + include/dogecoin/cfheadersdb_file.h | 265 +++++++++++++ src/cfheadersdb_file.c | 561 ++++++++++++++++++++++++++++ test/cfheadersdb_tests.c | 295 +++++++++++++++ test/unittester.c | 2 + 6 files changed, 1128 insertions(+) create mode 100644 include/dogecoin/cfheadersdb_file.h create mode 100644 src/cfheadersdb_file.c create mode 100644 test/cfheadersdb_tests.c diff --git a/CMakeLists.txt b/CMakeLists.txt index efa46cadc..0ede4c42c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -695,6 +695,7 @@ IF(WITH_NET) ) TARGET_SOURCES(${LIBDOGECOIN_NAME} ${visibility} src/bip37.c + src/cfheadersdb_file.c src/headersdb_file.c src/net.c src/protocol.c @@ -711,6 +712,7 @@ IF(WITH_NET) ENDIF() IF(USE_TESTS) TARGET_SOURCES(tests ${visibility} + test/cfheadersdb_tests.c test/net_tests.c test/protocol_tests.c test/spv_tests.c diff --git a/Makefile.am b/Makefile.am index a39e6dd83..73457fdee 100644 --- a/Makefile.am +++ b/Makefile.am @@ -418,6 +418,7 @@ endif if WITH_NET noinst_HEADERS += \ + include/dogecoin/cfheadersdb_file.h \ include/dogecoin/headersdb.h \ include/dogecoin/headersdb_file.h \ include/dogecoin/protocol.h \ @@ -426,6 +427,7 @@ noinst_HEADERS += \ include/dogecoin/spv.h libdogecoin_la_SOURCES += \ + src/cfheadersdb_file.c \ src/headersdb_file.c \ src/bip37.c \ src/net.c \ @@ -438,6 +440,7 @@ libdogecoin_la_CFLAGS += $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS) if USE_TESTS tests_SOURCES += \ + test/cfheadersdb_tests.c \ test/net_tests.c \ test/protocol_tests.c \ test/spv_tests.c diff --git a/include/dogecoin/cfheadersdb_file.h b/include/dogecoin/cfheadersdb_file.h new file mode 100644 index 000000000..6c914c134 --- /dev/null +++ b/include/dogecoin/cfheadersdb_file.h @@ -0,0 +1,265 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + 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 cfheadersdb_file.h + * @brief File-backed storage for BIP157 compact filter headers. + * + * Stores compact filter headers (cfheaders) and compact filter data + * (cfilters) to disk, mirroring Dogecoin Core's filter/basic/ directory + * layout. On startup the database is loaded back into the SPV client's + * compact_filter_state, eliminating the need to re-download hundreds of + * megabytes of filter headers from peers after each restart. + * + * File layout within the data directory: + * filter/basic/cfheaders.dat — filter header chain (fixed 36-byte records) + * filter/basic/cfilters.dat — raw filter data (variable-length records) + */ + +#ifndef __LIBDOGECOIN_CFHEADERSDB_FILE_H__ +#define __LIBDOGECOIN_CFHEADERSDB_FILE_H__ + +#include + +#include +#include +#include + +LIBDOGECOIN_BEGIN_DECL + +/* ================================================================ */ +/* File format constants */ +/* ================================================================ */ + +/** + * v2 file header: 4-byte magic + 4-byte version + 32-byte genesis_filter_header = 40 bytes. + * v1 files (8-byte header, no genesis) are automatically deleted and rebuilt. + */ +#define CF_HEADERS_FILE_HDR_LEN 40 + +/** + * Fixed-size cfheaders record: height (4 LE) + filter_header (32) = 36 bytes. + * Records are appended in ascending height order. + */ +#define CF_HEADERS_FILE_REC_LEN 36 + +/** + * Variable-length cfilters record header: height (4 LE) + block_hash (32) + * + data_len (4 LE) = 40 bytes, followed by data_len bytes of filter data. + */ +#define CF_FILTERS_FILE_REC_HDR_LEN 40 + +/* ================================================================ */ +/* Compact filter headers database */ +/* ================================================================ */ + +/** + * @brief File-backed database for compact filter headers. + * + * Mirrors dogecoin_headers_db for the BIP157 filter header chain. + * When read_write is false (inmem_only mode), no file I/O is performed. + */ +typedef struct dogecoin_cfheaders_db_ { + FILE *file; /**< Open file handle (NULL when inmem_only) */ + dogecoin_bool read_write; /**< Whether file I/O is enabled */ + uint32_t tip_height; /**< Height of the last written filter header */ + uint256_t tip_header; /**< Filter header hash at tip_height */ + const dogecoin_chainparams *params; /**< Chain, selects the on-disk directory */ +} dogecoin_cfheaders_db; + +/** + * @brief File-backed database for compact filter data. + * + * Stores raw cfilter payloads keyed by block height and hash. + * SPV clients typically process and discard filter data; set + * read_write=false to skip disk I/O. + */ +typedef struct dogecoin_cfilters_db_ { + FILE *file; /**< Open file handle (NULL when inmem_only) */ + dogecoin_bool read_write; /**< Whether file I/O is enabled */ + uint32_t tip_height; /**< Height of the last written cfilter */ + const dogecoin_chainparams *params; /**< Chain, selects the on-disk directory */ +} dogecoin_cfilters_db; + +/* ================================================================ */ +/* Compact filter headers DB API */ +/* ================================================================ */ + +/** + * @brief Allocate a new compact filter headers database. + * @param inmem_only If true, no file I/O is performed (RAM-only mode). + * @return New database object, or NULL on allocation failure. + */ +LIBDOGECOIN_API dogecoin_cfheaders_db* dogecoin_cfheaders_db_new(const dogecoin_chainparams *params, dogecoin_bool inmem_only); + +/** + * @brief Free a compact filter headers database and close its file. + * @param db The database to free. + */ +LIBDOGECOIN_API void dogecoin_cfheaders_db_free(dogecoin_cfheaders_db *db); + +/** + * @brief Open (or create) the cfheaders file and load all stored headers. + * + * On success, every filter header read from disk is appended to + * @p state->filter_headers and @p state->cfheaders_tip_height is updated. + * + * @param db The database object. + * @param file_path Path to cfheaders.dat, or NULL for the default location + * (/filter/basic/cfheaders.dat). + * @param state Compact filter state to populate on load. + * @return true on success (file opened and records loaded). + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfheaders_db_load( + dogecoin_cfheaders_db *db, + const char *file_path, + dogecoin_compact_filter_state *state); + +/** + * @brief Append one filter header record to the cfheaders file. + * + * Writes height (4 LE) + filter_header (32) and flushes to disk. + * + * @param db The database object. + * @param height Block height of the filter header. + * @param filter_header 32-byte filter header hash. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfheaders_db_write( + dogecoin_cfheaders_db *db, + uint32_t height, + const uint256_t filter_header); + +/** + * @brief Persist genesis_filter_header at file offset 8 (v2 format). + * + * Called once, right after the first cfheaders batch is received, to store + * the filter header that precedes the cfheaders download start height. + * Without this, cfilter validation cannot validate the first filter block. + * + * @param db The database object. + * @param genesis_filter_header 32-byte filter header for height (cfh_start - 1). + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfheaders_db_write_genesis( + dogecoin_cfheaders_db *db, + const uint256_t genesis_filter_header); + +/** + * @brief Flush and fdatasync the cfheaders file. + * + * Call once after a bulk write loop instead of relying on per-record commits. + * + * @param db The database object. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfheaders_db_flush(dogecoin_cfheaders_db *db); + +/** + * @brief Truncate cfheaders.dat to the v2 header only (clears all records). + * + * Used by the cfcheckpt handler when a fresh cfheaders download is needed + * (e.g. invalid or incompatible previously-stored data). + * + * @param db The database object. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfheaders_db_reset(dogecoin_cfheaders_db *db); + +/* ================================================================ */ +/* Compact filters DB API */ +/* ================================================================ */ + +/** + * @brief Allocate a new compact filter data database. + * @param inmem_only If true, no file I/O is performed. + * @return New database object, or NULL on allocation failure. + */ +LIBDOGECOIN_API dogecoin_cfilters_db* dogecoin_cfilters_db_new(const dogecoin_chainparams *params, dogecoin_bool inmem_only); + +/** + * @brief Free a compact filter data database and close its file. + * @param db The database to free. + */ +LIBDOGECOIN_API void dogecoin_cfilters_db_free(dogecoin_cfilters_db *db); + +/** + * @brief Open (or create) the cfilters data file. + * + * Unlike cfheaders, filter data is not loaded back into RAM on startup; + * only the file handle is prepared for subsequent writes. + * + * @param db The database object. + * @param file_path Path to cfilters.dat, or NULL for the default location + * (/filter/basic/cfilters.dat). + * @return true on success (file opened). + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfilters_db_load( + dogecoin_cfilters_db *db, + const char *file_path); + +/** + * @brief Append one cfilter record to the cfilters file. + * + * Writes height (4 LE) + block_hash (32) + data_len (4 LE) + data bytes, + * then flushes. + * + * @param db The database object. + * @param height Block height of this cfilter. + * @param block_hash 32-byte block hash. + * @param filter_data Raw encoded filter data. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfilters_db_write( + dogecoin_cfilters_db *db, + uint32_t height, + const uint256_t block_hash, + const cstring *filter_data); + +/** + * @brief Iterate over all records in the cfilters file. + * + * Rewinds the file to the first record and calls @p cb for each one. + * Iteration stops early if @p cb returns false. + * + * @param db The database object (must be loaded). + * @param cb Callback: (height, block_hash, filter_data, data_len, ctx). + * Return false to stop iteration. + * @param ctx Caller context passed through to @p cb. + * @return true if the full file was iterated (or cb stopped it early), + * false on I/O error. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfilters_db_iterate( + dogecoin_cfilters_db *db, + dogecoin_bool (*cb)(uint32_t height, const uint256_t block_hash, + const uint8_t *filter_data, uint32_t data_len, + void *ctx), + void *ctx); + +LIBDOGECOIN_END_DECL + +#endif /* __LIBDOGECOIN_CFHEADERSDB_FILE_H__ */ diff --git a/src/cfheadersdb_file.c b/src/cfheadersdb_file.c new file mode 100644 index 000000000..b25127572 --- /dev/null +++ b/src/cfheadersdb_file.c @@ -0,0 +1,561 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + 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. + +*/ + +#include +#ifdef _WIN32 +#include +#include +#define MKDIR_ONE(p) _mkdir(p) +#define CF_FTRUNCATE(fd, sz) _chsize((fd), (long)(sz)) +#define CF_FILENO(f) _fileno(f) +#else +#include +#define MKDIR_ONE(p) mkdir(p, 0755) +#define CF_FTRUNCATE(fd, sz) ftruncate((fd), (off_t)(sz)) +#define CF_FILENO(f) fileno(f) +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include + +/* Magic bytes and current file format version. + * v2 format: magic(4) + version(4) + genesis_filter_header(32) + records(N*36) + * v1 format: magic(4) + version(4) + records(N*36) [obsolete, triggers rebuild] */ +static const uint8_t cfhdr_magic[4] = {0xCF, 0x68, 0x44, 0x52}; /* "CfhDR" */ +static const uint8_t cfdata_magic[4] = {0xCF, 0xDA, 0x54, 0x41}; /* "CfDATA" */ +static const uint32_t cf_file_version = 2; + +/* ================================================================ */ +/* Internal helpers */ +/* ================================================================ */ + +/** + * Create a single directory, ignoring EEXIST. + * Returns true on success (directory exists or was created). + */ +static dogecoin_bool mkdir_one(const char *path) +{ + if (MKDIR_ONE(path) == 0) + return true; +#ifdef _WIN32 + return (errno == EEXIST); +#else + return (errno == EEXIST); +#endif +} + +/** + * Ensure /filter/basic/ exists, creating subdirectories as needed. + * @p base must be a NUL-terminated path with no trailing slash. + */ +/* Build /filter/basic/, creating each level. + * + * The chain component is not cosmetic. Without it every network shares one + * cache: a regtest or testnet client loads the *mainnet* cfheaders/cfilters at + * startup, rescans them, and matches mainnet blocks its peer has never heard of + * -- then blocks forever waiting for them. It also writes its own filters back + * into the mainnet files, corrupting them for the next mainnet run. */ +static dogecoin_bool ensure_filter_dir(const char *base, const dogecoin_chainparams *params) +{ + const char *chain = (params && params->chainname[0]) ? params->chainname : "main"; + size_t blen = strlen(base); + char *dir = dogecoin_calloc(blen + 32 + strlen(chain), 1); + if (!dir) return false; + memcpy(dir, base, blen); + + strcpy(dir + blen, "/filter"); + if (!mkdir_one(dir)) { dogecoin_free(dir); return false; } + + strcpy(dir + blen, "/filter/basic"); + if (!mkdir_one(dir)) { dogecoin_free(dir); return false; } + + sprintf(dir + blen, "/filter/basic/%s", chain); + dogecoin_bool ok = mkdir_one(dir); + dogecoin_free(dir); + return ok; +} + +/** + * Build the default path for a filter file and store it in @p path_out. + * Caller must call cstr_free(path_out, true) when done. + */ +/* /filter/basic// -- see ensure_filter_dir() for + * why the chain component matters. */ +static void default_filter_path(cstring **path_out, + const dogecoin_chainparams *params, + const char *filename) +{ + const char *chain = (params && params->chainname[0]) ? params->chainname : "main"; + *path_out = cstr_new_sz(512); + dogecoin_get_default_datadir(*path_out); + /* Strip trailing NUL that dogecoin_get_default_datadir may append */ + while ((*path_out)->len > 0 && + (*path_out)->str[(*path_out)->len - 1] == '\0') + (*path_out)->len--; + cstr_append_buf(*path_out, "/filter/basic/", 14); + cstr_append_buf(*path_out, chain, strlen(chain)); + cstr_append_c(*path_out, '/'); + cstr_append_buf(*path_out, filename, strlen(filename)); + cstr_append_c(*path_out, '\0'); +} + +/* Legacy chain-agnostic location, /filter/basic/, used + * before the layout was segregated per network. Any such file was written by + * whichever network happened to run last; only mainnet is migrated (below), + * because only mainnet data is meaningful to keep. */ +static void legacy_filter_path(cstring **path_out, const char *filename) +{ + *path_out = cstr_new_sz(512); + dogecoin_get_default_datadir(*path_out); + while ((*path_out)->len > 0 && + (*path_out)->str[(*path_out)->len - 1] == '\0') + (*path_out)->len--; + cstr_append_buf(*path_out, "/filter/basic/", 14); + cstr_append_buf(*path_out, filename, strlen(filename)); + cstr_append_c(*path_out, '\0'); +} + +/* One-time migration of the pre-segregation cache into the mainnet directory. + * Only runs for mainnet, only when the new path is absent and the legacy file + * exists, and only via rename() -- so it is a no-op on a fresh install and + * never silently discards data. */ +static void migrate_legacy_filter_file(const dogecoin_chainparams *params, + const char *filename, + const char *new_path) +{ + struct stat sb; + if (!params || strcmp(params->chainname, "main") != 0) return; + if (stat(new_path, &sb) == 0) return; /* already migrated */ + + cstring *old_obj = NULL; + legacy_filter_path(&old_obj, filename); + if (stat(old_obj->str, &sb) == 0 && sb.st_size > 0) { + if (rename(old_obj->str, new_path) == 0) { + printf("cfdb: migrated %s to per-chain location %s\n", + old_obj->str, new_path); + } else { + fprintf(stderr, "cfdb: could not migrate %s to %s: %s\n", + old_obj->str, new_path, strerror(errno)); + } + } + cstr_free(old_obj, true); +} + +/** + * Write the v2 file header: magic(4) + version(4) + genesis_filter_header(32). + * genesis bytes are initialised to zero; call dogecoin_cfheaders_db_write_genesis + * to fill them in once the first cfheaders batch arrives. + */ +static dogecoin_bool write_file_header(FILE *f, const uint8_t *magic) +{ + if (fwrite(magic, 4, 1, f) != 1) return false; + uint32_t v = htole32(cf_file_version); + if (fwrite(&v, 4, 1, f) != 1) return false; + uint8_t zeros[32]; + memset(zeros, 0, 32); + return (fwrite(zeros, 32, 1, f) == 1); +} + +/** + * Read the file header and return the version number. + * Returns 0 on bad magic or read error; callers treat anything < 2 as stale. + */ +static uint32_t read_file_version(FILE *f, const uint8_t *expected_magic) +{ + uint8_t buf[8]; + rewind(f); + if (fread(buf, 8, 1, f) != 1) return 0; + if (memcmp(buf, expected_magic, 4) != 0) return 0; + return le32toh(*(uint32_t *)(buf + 4)); +} + +/* ================================================================ */ +/* cfheaders DB */ +/* ================================================================ */ + +dogecoin_cfheaders_db* dogecoin_cfheaders_db_new(const dogecoin_chainparams *params, dogecoin_bool inmem_only) +{ + dogecoin_cfheaders_db *db = dogecoin_calloc(1, sizeof(*db)); + db->params = params; + db->read_write = !inmem_only; + db->tip_height = 0; + memset(db->tip_header, 0, 32); + return db; +} + +void dogecoin_cfheaders_db_free(dogecoin_cfheaders_db *db) +{ + if (!db) return; + if (db->file) { + dogecoin_file_commit(db->file); + fclose(db->file); + db->file = NULL; + } + dogecoin_free(db); +} + +dogecoin_bool dogecoin_cfheaders_db_load( + dogecoin_cfheaders_db *db, + const char *file_path, + dogecoin_compact_filter_state *state) +{ + if (!db || !state) return false; + if (!db->read_write) return true; /* inmem_only: nothing to do */ + + /* Resolve file path */ + cstring *path_obj = NULL; + const char *path = file_path; + if (!path) { + cstring *datadir = cstr_new_sz(512); + dogecoin_get_default_datadir(datadir); + while (datadir->len > 0 && datadir->str[datadir->len - 1] == '\0') + datadir->len--; + cstr_append_c(datadir, '\0'); + ensure_filter_dir(datadir->str, db->params); + cstr_free(datadir, true); + + default_filter_path(&path_obj, db->params, "cfheaders.dat"); + path = path_obj->str; + migrate_legacy_filter_file(db->params, "cfheaders.dat", path); + } + + struct stat sb; + dogecoin_bool create = (stat(path, &sb) != 0) || (sb.st_size < (long)CF_HEADERS_FILE_HDR_LEN); + + if (!create) { + db->file = fopen(path, "r+b"); + if (db->file) { + uint32_t ver = read_file_version(db->file, cfhdr_magic); + if (ver >= 2) { + /* v2 file: read genesis_filter_header then records */ + if (fread(state->genesis_filter_header, 32, 1, db->file) == 1) { + size_t loaded = 0; + uint32_t first_height = 0; + uint8_t rec[CF_HEADERS_FILE_REC_LEN]; + printf("Loading compact filter headers from disk...\n"); + while (fread(rec, CF_HEADERS_FILE_REC_LEN, 1, db->file) == 1) { + uint32_t height; + memcpy(&height, rec, 4); + height = le32toh(height); + if (loaded == 0) first_height = height; + uint256_t *fh = dogecoin_calloc(1, 32); + memcpy(fh, rec + 4, 32); + vector_add(state->filter_headers, fh); + db->tip_height = height; + memcpy(db->tip_header, fh, 32); + loaded++; + if (loaded % 100000 == 0) { + printf("\r %zu filter headers loaded (height %u)", loaded, height); + fflush(stdout); + } + } + if (loaded > 0) { + printf("\r %zu filter headers loaded, heights %u..%u\n", + loaded, first_height, db->tip_height); + state->cfheaders_tip_height = db->tip_height; + state->cfheaders_base_height = first_height; + memcpy(state->cfheaders_tip_hash, db->tip_header, 32); + } + fseek(db->file, 0, SEEK_END); + if (path_obj) cstr_free(path_obj, true); + return true; + } + } + /* v1 or unreadable: close and delete, will recreate below */ + if (ver < 2) + fprintf(stderr, "cfheadersdb: v%u file detected; rebuilding as v2 " + "(cfheaders will re-download)\n", ver); + fclose(db->file); + db->file = NULL; + } + remove(path); + } + + /* Create fresh v2 file */ + db->file = fopen(path, "w+b"); + if (!db->file) { + /* `path` aliases path_obj->str, so it must outlive this message -- + * freeing path_obj before the fprintf was a heap-use-after-free. */ + fprintf(stderr, "cfheadersdb: cannot open %s: %s\n", path, strerror(errno)); + if (path_obj) cstr_free(path_obj, true); + return false; + } + if (path_obj) cstr_free(path_obj, true); + if (!write_file_header(db->file, cfhdr_magic)) { + fprintf(stderr, "cfheadersdb: failed to write file header\n"); + fclose(db->file); + db->file = NULL; + return false; + } + return true; +} + +dogecoin_bool dogecoin_cfheaders_db_write( + dogecoin_cfheaders_db *db, + uint32_t height, + const uint256_t filter_header) +{ + if (!db || !db->read_write || !db->file) return true; /* no-op when inmem */ + + uint8_t rec[CF_HEADERS_FILE_REC_LEN]; + uint32_t h_le = htole32(height); + memcpy(rec, &h_le, 4); + memcpy(rec + 4, filter_header, 32); + + if (fwrite(rec, CF_HEADERS_FILE_REC_LEN, 1, db->file) != 1) { + fprintf(stderr, "cfheadersdb: write failed at height %u\n", height); + return false; + } + + db->tip_height = height; + memcpy(db->tip_header, filter_header, 32); + return true; +} + +dogecoin_bool dogecoin_cfheaders_db_flush(dogecoin_cfheaders_db *db) +{ + if (!db || !db->read_write || !db->file) return true; + dogecoin_file_commit(db->file); + return true; +} + +dogecoin_bool dogecoin_cfheaders_db_write_genesis( + dogecoin_cfheaders_db *db, + const uint256_t genesis_filter_header) +{ + if (!db || !db->read_write || !db->file) return true; + + long saved = ftell(db->file); + if (fseek(db->file, 8, SEEK_SET) != 0) return false; + dogecoin_bool ok = (fwrite(genesis_filter_header, 32, 1, db->file) == 1); + dogecoin_file_commit(db->file); + fseek(db->file, saved, SEEK_SET); + return ok; +} + +dogecoin_bool dogecoin_cfheaders_db_reset(dogecoin_cfheaders_db *db) +{ + if (!db || !db->read_write || !db->file) return true; + + fflush(db->file); + if (CF_FTRUNCATE(CF_FILENO(db->file), (long)CF_HEADERS_FILE_HDR_LEN) != 0) { + fprintf(stderr, "cfheadersdb: truncate failed: %s\n", strerror(errno)); + return false; + } + fseek(db->file, 0, SEEK_END); + db->tip_height = 0; + memset(db->tip_header, 0, 32); + return true; +} + +/* ================================================================ */ +/* cfilters DB */ +/* ================================================================ */ + +dogecoin_cfilters_db* dogecoin_cfilters_db_new(const dogecoin_chainparams *params, dogecoin_bool inmem_only) +{ + dogecoin_cfilters_db *db = dogecoin_calloc(1, sizeof(*db)); + db->params = params; + db->read_write = !inmem_only; + db->tip_height = 0; + return db; +} + +void dogecoin_cfilters_db_free(dogecoin_cfilters_db *db) +{ + if (!db) return; + if (db->file) { + dogecoin_file_commit(db->file); + fclose(db->file); + db->file = NULL; + } + dogecoin_free(db); +} + +dogecoin_bool dogecoin_cfilters_db_load( + dogecoin_cfilters_db *db, + const char *file_path) +{ + if (!db) return false; + if (!db->read_write) return true; + + cstring *path_obj = NULL; + const char *path = file_path; + if (!path) { + cstring *datadir = cstr_new_sz(512); + dogecoin_get_default_datadir(datadir); + while (datadir->len > 0 && datadir->str[datadir->len - 1] == '\0') + datadir->len--; + cstr_append_c(datadir, '\0'); + ensure_filter_dir(datadir->str, db->params); + cstr_free(datadir, true); + + default_filter_path(&path_obj, db->params, "cfilters.dat"); + path = path_obj->str; + migrate_legacy_filter_file(db->params, "cfilters.dat", path); + } + + struct stat sb; + dogecoin_bool create = (stat(path, &sb) != 0) || (sb.st_size < 8); + + db->file = fopen(path, create ? "w+b" : "r+b"); + + if (!db->file) { + /* Same aliasing rule as the cfheaders path above: `path` points into + * path_obj, so it cannot be freed before this message is formatted. */ + fprintf(stderr, "cfiltersdb: cannot open %s: %s\n", path, strerror(errno)); + if (path_obj) cstr_free(path_obj, true); + return false; + } + if (path_obj) cstr_free(path_obj, true); + + if (create) { + if (!write_file_header(db->file, cfdata_magic)) { + fprintf(stderr, "cfiltersdb: failed to write file header\n"); + fclose(db->file); + db->file = NULL; + return false; + } + return true; + } + + /* Existing file — verify header and seek to end for appends */ + if (read_file_version(db->file, cfdata_magic) == 0) { + fprintf(stderr, "cfiltersdb: bad magic or unsupported version\n"); + fclose(db->file); + db->file = NULL; + return false; + } + + /* Skip the remaining 32 bytes of the file header (magic+version already + * consumed by read_file_version; seek to the first record). */ + if (fseek(db->file, CF_HEADERS_FILE_HDR_LEN, SEEK_SET) != 0) { + fclose(db->file); + db->file = NULL; + return false; + } + + /* Scan records to find the tip height (variable-length; must iterate) */ + while (true) { + uint8_t hdr[CF_FILTERS_FILE_REC_HDR_LEN]; + if (fread(hdr, CF_FILTERS_FILE_REC_HDR_LEN, 1, db->file) != 1) break; + uint32_t height, data_len; + memcpy(&height, hdr, 4); height = le32toh(height); + memcpy(&data_len, hdr + 36, 4); data_len = le32toh(data_len); + db->tip_height = height; + if (fseek(db->file, (long)data_len, SEEK_CUR) != 0) break; + } + + fseek(db->file, 0, SEEK_END); + return true; +} + +dogecoin_bool dogecoin_cfilters_db_write( + dogecoin_cfilters_db *db, + uint32_t height, + const uint256_t block_hash, + const cstring *filter_data) +{ + if (!db || !db->read_write || !db->file) return true; + if (!filter_data) return false; + + uint8_t hdr[CF_FILTERS_FILE_REC_HDR_LEN]; + uint32_t h_le = htole32(height); + uint32_t dl_le = htole32((uint32_t)filter_data->len); + + memcpy(hdr, &h_le, 4); + memcpy(hdr + 4, block_hash, 32); + memcpy(hdr + 36, &dl_le, 4); + + if (fwrite(hdr, CF_FILTERS_FILE_REC_HDR_LEN, 1, db->file) != 1) + return false; + if (filter_data->len > 0 && + fwrite(filter_data->str, filter_data->len, 1, db->file) != 1) + return false; + + dogecoin_file_commit(db->file); + db->tip_height = height; + return true; +} + +dogecoin_bool dogecoin_cfilters_db_iterate( + dogecoin_cfilters_db *db, + dogecoin_bool (*cb)(uint32_t height, const uint256_t block_hash, + const uint8_t *filter_data, uint32_t data_len, + void *ctx), + void *ctx) +{ + if (!db || !db->file || !cb) return false; + + /* Rewind past the file header to the first record. */ + if (fseek(db->file, CF_HEADERS_FILE_HDR_LEN, SEEK_SET) != 0) + return false; + + uint8_t hdr[CF_FILTERS_FILE_REC_HDR_LEN]; + while (fread(hdr, CF_FILTERS_FILE_REC_HDR_LEN, 1, db->file) == 1) { + uint32_t height, data_len; + uint256_t block_hash; + memcpy(&height, hdr, 4); height = le32toh(height); + memcpy(block_hash, hdr + 4, 32); + memcpy(&data_len, hdr + 36, 4); data_len = le32toh(data_len); + + if (data_len == 0) { + if (!cb(height, block_hash, NULL, 0, ctx)) break; + continue; + } + + /* data_len comes straight off disk, so it is only as trustworthy as the + file. A cfilter record cannot legitimately be larger than the P2P + message that delivered it, so reject anything beyond that rather than + asking the allocator for up to 4 GiB on a corrupt or tampered file + (CWE-400). The subsequent short fread would fail, but only after the + allocation has already been attempted. */ + if (data_len > DOGECOIN_MAX_P2P_MSG_SIZE) + return false; + + uint8_t *buf = dogecoin_malloc(data_len); + if (!buf) return false; + if (fread(buf, data_len, 1, db->file) != 1) { + dogecoin_free(buf); + return false; + } + dogecoin_bool cont = cb(height, block_hash, buf, data_len, ctx); + dogecoin_free(buf); + if (!cont) break; + } + + /* Restore write position at end of file. */ + fseek(db->file, 0, SEEK_END); + return true; +} diff --git a/test/cfheadersdb_tests.c b/test/cfheadersdb_tests.c new file mode 100644 index 000000000..ac9cf80af --- /dev/null +++ b/test/cfheadersdb_tests.c @@ -0,0 +1,295 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2024 bluezr + Copyright (c) 2024 The Dogecoin Foundation + + 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. + + */ + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#define CFDB_TEST_HEADERS "/tmp/libdogecoin_cfheaders_test.dat" +#define CFDB_TEST_FILTERS "/tmp/libdogecoin_cfilters_test.dat" + +/* Fill a uint256_t with a deterministic, height-dependent pattern so that a + record read back at the wrong offset is detectable rather than plausible. */ +static void fill_header(uint256_t out, uint32_t height) +{ + unsigned int i; + for (i = 0; i < 32; i++) + out[i] = (uint8_t)((height * 7u + i * 13u) & 0xff); +} + +struct iter_ctx { + unsigned int count; + uint32_t last_height; + uint32_t last_len; + dogecoin_bool payload_ok; +}; + +/* Largest single allocation seen while a recording mapper is installed. + iterate() sizes one allocation directly from a length field read off disk, so + watching the allocator is the only way to tell "rejected the length" apart + from "asked for 4 GiB and then failed the read" -- both return false. */ +static size_t cfdb_max_alloc = 0; + +static void *rec_malloc(size_t size) +{ + if (size > cfdb_max_alloc) cfdb_max_alloc = size; + return malloc(size); +} +static void *rec_calloc(size_t count, size_t size) +{ + if (count * size > cfdb_max_alloc) cfdb_max_alloc = count * size; + return calloc(count, size); +} +static void *rec_realloc(void *ptr, size_t size) +{ + if (size > cfdb_max_alloc) cfdb_max_alloc = size; + return realloc(ptr, size); +} +static void rec_free(void *ptr) { free(ptr); } + +static dogecoin_bool count_cb(uint32_t height, const uint256_t block_hash, + const uint8_t *filter_data, uint32_t data_len, + void *ctx) +{ + struct iter_ctx *c = (struct iter_ctx *)ctx; + uint256_t expect; + (void)block_hash; + c->count++; + c->last_height = height; + c->last_len = data_len; + fill_header(expect, height); + if (filter_data && data_len >= 4 && memcmp(filter_data, expect, 4) != 0) + c->payload_ok = false; + return true; +} + +void test_cfheadersdb() +{ + unsigned int i; + + /* ---------------------------------------------------------------- */ + /* cfheaders: write, flush, reopen, and read the records back */ + /* ---------------------------------------------------------------- */ + remove(CFDB_TEST_HEADERS); + + dogecoin_cfheaders_db *db = dogecoin_cfheaders_db_new(&dogecoin_chainparams_main, false); + u_assert_int_eq(db != NULL, 1); + + dogecoin_compact_filter_state *state = dogecoin_compact_filter_state_new(); + u_assert_int_eq(state != NULL, 1); + u_assert_int_eq(dogecoin_cfheaders_db_load(db, CFDB_TEST_HEADERS, state), true); + + uint256_t genesis_fh; + fill_header(genesis_fh, 0); + u_assert_int_eq(dogecoin_cfheaders_db_write_genesis(db, genesis_fh), true); + + for (i = 1; i <= 16; i++) { + uint256_t fh; + fill_header(fh, i); + u_assert_int_eq(dogecoin_cfheaders_db_write(db, i, fh), true); + } + u_assert_int_eq(dogecoin_cfheaders_db_flush(db), true); + u_assert_uint32_eq(db->tip_height, 16); + dogecoin_cfheaders_db_free(db); + dogecoin_compact_filter_state_free(state); + + /* Reopen: the records must come back, in order, with the genesis header. */ + db = dogecoin_cfheaders_db_new(&dogecoin_chainparams_main, false); + state = dogecoin_compact_filter_state_new(); + u_assert_int_eq(dogecoin_cfheaders_db_load(db, CFDB_TEST_HEADERS, state), true); + u_assert_uint32_eq(db->tip_height, 16); + u_assert_int_eq(memcmp(state->genesis_filter_header, genesis_fh, 32), 0); + u_assert_int_eq(state->filter_headers != NULL, 1); + u_assert_uint32_eq((uint32_t)state->filter_headers->len, 16); + for (i = 0; i < 16; i++) { + uint256_t expect; + uint256_t *got = (uint256_t *)vector_idx(state->filter_headers, i); + fill_header(expect, i + 1); + u_assert_int_eq(memcmp(*got, expect, 32), 0); + } + + /* reset() truncates back to the file header, leaving no records. */ + u_assert_int_eq(dogecoin_cfheaders_db_reset(db), true); + dogecoin_cfheaders_db_free(db); + dogecoin_compact_filter_state_free(state); + + db = dogecoin_cfheaders_db_new(&dogecoin_chainparams_main, false); + state = dogecoin_compact_filter_state_new(); + u_assert_int_eq(dogecoin_cfheaders_db_load(db, CFDB_TEST_HEADERS, state), true); + u_assert_uint32_eq((uint32_t)state->filter_headers->len, 0); + dogecoin_cfheaders_db_free(db); + dogecoin_compact_filter_state_free(state); + + /* ---------------------------------------------------------------- */ + /* A trailing partial record must be ignored, not misparsed */ + /* ---------------------------------------------------------------- */ + remove(CFDB_TEST_HEADERS); + db = dogecoin_cfheaders_db_new(&dogecoin_chainparams_main, false); + state = dogecoin_compact_filter_state_new(); + u_assert_int_eq(dogecoin_cfheaders_db_load(db, CFDB_TEST_HEADERS, state), true); + for (i = 1; i <= 4; i++) { + uint256_t fh; + fill_header(fh, i); + u_assert_int_eq(dogecoin_cfheaders_db_write(db, i, fh), true); + } + u_assert_int_eq(dogecoin_cfheaders_db_flush(db), true); + dogecoin_cfheaders_db_free(db); + dogecoin_compact_filter_state_free(state); + + /* Lop 10 bytes off the last record, as an interrupted write would. Done by + rewriting a shortened copy rather than truncate()/_chsize(), so the test + stays portable across the platforms this file already builds on. */ + { + FILE *f = fopen(CFDB_TEST_HEADERS, "rb"); + uint8_t *buf; + long size; + size_t got; + u_assert_int_eq(f != NULL, 1); + fseek(f, 0, SEEK_END); + size = ftell(f); + u_assert_int_eq(size > 10, 1); + rewind(f); + buf = dogecoin_malloc((size_t)size); + u_assert_int_eq(buf != NULL, 1); + got = fread(buf, 1, (size_t)size, f); + fclose(f); + u_assert_int_eq(got == (size_t)size, 1); + + f = fopen(CFDB_TEST_HEADERS, "wb"); + u_assert_int_eq(f != NULL, 1); + u_assert_int_eq(fwrite(buf, 1, (size_t)size - 10, f) == (size_t)size - 10, 1); + fclose(f); + dogecoin_free(buf); + } + + db = dogecoin_cfheaders_db_new(&dogecoin_chainparams_main, false); + state = dogecoin_compact_filter_state_new(); + u_assert_int_eq(dogecoin_cfheaders_db_load(db, CFDB_TEST_HEADERS, state), true); + /* Three whole records survive; the truncated fourth is dropped. */ + u_assert_uint32_eq((uint32_t)state->filter_headers->len, 3); + u_assert_uint32_eq(db->tip_height, 3); + dogecoin_cfheaders_db_free(db); + dogecoin_compact_filter_state_free(state); + + /* ---------------------------------------------------------------- */ + /* cfilters: write, iterate, and reject an oversized length field */ + /* ---------------------------------------------------------------- */ + remove(CFDB_TEST_FILTERS); + dogecoin_cfilters_db *fdb = dogecoin_cfilters_db_new(&dogecoin_chainparams_main, false); + u_assert_int_eq(fdb != NULL, 1); + u_assert_int_eq(dogecoin_cfilters_db_load(fdb, CFDB_TEST_FILTERS), true); + + for (i = 1; i <= 5; i++) { + uint256_t bh, payload; + cstring *data; + fill_header(bh, i + 100); + fill_header(payload, i); + data = cstr_new_buf(payload, 32); + u_assert_int_eq(dogecoin_cfilters_db_write(fdb, i, bh, data), true); + cstr_free(data, true); + } + dogecoin_cfilters_db_free(fdb); + + fdb = dogecoin_cfilters_db_new(&dogecoin_chainparams_main, false); + u_assert_int_eq(dogecoin_cfilters_db_load(fdb, CFDB_TEST_FILTERS), true); + { + struct iter_ctx c; + c.count = 0; c.last_height = 0; c.last_len = 0; c.payload_ok = true; + u_assert_int_eq(dogecoin_cfilters_db_iterate(fdb, count_cb, &c), true); + u_assert_uint32_eq(c.count, 5); + u_assert_uint32_eq(c.last_height, 5); + u_assert_uint32_eq(c.last_len, 32); + u_assert_int_eq(c.payload_ok, true); + } + dogecoin_cfilters_db_free(fdb); + + /* Corrupt the first record's data_len to 0xFFFFFFFF. Without a bound this + asks the allocator for 4 GiB before the short read is ever attempted, so + iterate() must reject the record on the length alone. The file header is + CF_HEADERS_FILE_HDR_LEN bytes and data_len sits at offset 36 of the + record header. */ + { + FILE *f = fopen(CFDB_TEST_FILTERS, "r+b"); + uint32_t bogus = 0xFFFFFFFFu; + u_assert_int_eq(f != NULL, 1); + u_assert_int_eq(fseek(f, CF_HEADERS_FILE_HDR_LEN + 36, SEEK_SET) == 0, 1); + u_assert_int_eq(fwrite(&bogus, 4, 1, f) == 1, 1); + fclose(f); + } + + fdb = dogecoin_cfilters_db_new(&dogecoin_chainparams_main, false); + u_assert_int_eq(dogecoin_cfilters_db_load(fdb, CFDB_TEST_FILTERS), true); + { + struct iter_ctx c; + dogecoin_mem_mapper rec = {rec_malloc, rec_calloc, rec_realloc, rec_free}; + c.count = 0; c.last_height = 0; c.last_len = 0; c.payload_ok = true; + + cfdb_max_alloc = 0; + dogecoin_mem_set_mapper(rec); + u_assert_int_eq(dogecoin_cfilters_db_iterate(fdb, count_cb, &c), false); + dogecoin_mem_set_mapper_default(); + + /* The record is rejected and no callback fires. */ + u_assert_uint32_eq(c.count, 0); + /* And, the point of the bound: the 0xFFFFFFFF length was never handed + to the allocator. Asserting only on the false return would pass with + the bound removed, because the oversized read fails immediately + after the oversized allocation succeeds under memory overcommit. */ + u_assert_int_eq(cfdb_max_alloc <= (size_t)DOGECOIN_MAX_P2P_MSG_SIZE, 1); + } + dogecoin_cfilters_db_free(fdb); + + /* ---------------------------------------------------------------- */ + /* inmem_only performs no file I/O */ + /* ---------------------------------------------------------------- */ + { + dogecoin_cfheaders_db *mem = dogecoin_cfheaders_db_new(&dogecoin_chainparams_main, true); + uint256_t fh; + u_assert_int_eq(mem != NULL, 1); + u_assert_int_eq(mem->read_write, false); + u_assert_int_eq(mem->file == NULL, 1); + fill_header(fh, 1); + /* Writes are accepted and tracked in RAM without touching the disk. */ + u_assert_int_eq(dogecoin_cfheaders_db_write(mem, 1, fh), true); + u_assert_int_eq(mem->file == NULL, 1); + dogecoin_cfheaders_db_free(mem); + } + + remove(CFDB_TEST_HEADERS); + remove(CFDB_TEST_FILTERS); +} diff --git a/test/unittester.c b/test/unittester.c index 9925baf2a..2fa72499b 100644 --- a/test/unittester.c +++ b/test/unittester.c @@ -155,6 +155,7 @@ extern void test_reorg(); extern void test_spv(); extern void test_bip37_filter_state(); extern void test_bip37_merkleblock_vector(); +extern void test_cfheadersdb(); #else extern void test_net_flag_not_defined(); #endif @@ -294,6 +295,7 @@ int main() u_run_test(test_spv); u_run_test(test_bip37_filter_state); u_run_test(test_bip37_merkleblock_vector); + u_run_test(test_cfheadersdb); #else u_run_test(test_net_flag_not_defined); #endif From 9bafc79e4a35622301d5d8ea35ef18957645d1d5 Mon Sep 17 00:00:00 2001 From: bluezr Date: Sun, 2 Aug 2026 14:56:15 -0700 Subject: [PATCH 08/12] test: use relative paths in the cfheadersdb tests The test hardcoded /tmp/libdogecoin_cfheaders_test.dat. Neither Windows nor Android has /tmp, so x86_64-win-native and aarch64-android failed: cfheadersdb: cannot open /tmp/libdogecoin_cfheaders_test.dat: No such file or directory Use plain relative filenames in the working directory, as the wallet and spv tests already do. Both files are removed at the end of the test. Same portability class as the truncate()/_chsize() call this test already avoids -- caught there, missed here. --- test/cfheadersdb_tests.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/cfheadersdb_tests.c b/test/cfheadersdb_tests.c index ac9cf80af..34b502066 100644 --- a/test/cfheadersdb_tests.c +++ b/test/cfheadersdb_tests.c @@ -40,8 +40,9 @@ #include #include -#define CFDB_TEST_HEADERS "/tmp/libdogecoin_cfheaders_test.dat" -#define CFDB_TEST_FILTERS "/tmp/libdogecoin_cfilters_test.dat" +/* Relative to the working directory: Windows and Android have no /tmp. */ +#define CFDB_TEST_HEADERS "test_cfheaders.dat" +#define CFDB_TEST_FILTERS "test_cfilters.dat" /* Fill a uint256_t with a deterministic, height-dependent pattern so that a record read back at the wrong offset is detectable rather than plausible. */ From f61f6d14565306d1aa580a8489389e45882a8fe6 Mon Sep 17 00:00:00 2001 From: bluezr Date: Sun, 2 Aug 2026 15:30:16 -0700 Subject: [PATCH 09/12] spv: sync compact filters and match watched scripts (BIP157) Wires the BIP157 message flow into the SPV client: getcfcheckpt to pin the peer's checkpoints, getcfheaders to build and validate the filter header chain, getcfilters to fetch filters, GCS matching against watched scripts, and a getdata for the blocks that matched. Filter headers are persisted through the cfheaders/cfilters DBs added in the previous layer, so a restart resumes from the stored tip rather than re-downloading. Cached filters are rescanned at startup, which covers scripts registered after the filters were stored. BIP37 and BIP157 are mutually exclusive here, by design and for privacy: a bloom filter tells the peer which scripts are being watched, which is the disclosure compact filters exist to avoid. Compact filters are on by default and dogecoin_spv_client_filterload fails closed while they are, so a BIP37 consumer opts out explicitly via dogecoin_spv_enable_compact_filters(client, false). The test asserts both halves of that. headersdb gains a block-hash-by-height lookup with a resume cursor. cfheaders batches request ascending heights, and rescanning the whole file per lookup is O(N^2) over a 6.2M-record file; resuming from the last match keeps it linear. Deliberately not included, to keep this reviewable and because each belongs elsewhere: - parallel cfilter/cfheaders download. The state fields live in the compact_filter layer; the logic lands in its own PR. Every path here takes the sequential branch. - the par_hdr parallel genesis header download, which is #378. - skip_pow and the stored-hash-on-load shortcut. Both were in the prototype branch, both weaken what header loading verifies, and neither is needed by filter sync. They belong with the bulk-load work where their trust assumptions can be reviewed as a unit. Header loading here is unchanged from 0.1.5-dev. Report the height range actually covered on completion. cf_scan_start_height was only set on one of the two scan-start paths, and the log falls back to 1 when it is unset, so a run that covered the checkpoint tail reported "scanned heights 1..tip" -- overstating coverage in exactly the way that hides a gap. Verified against a local 1.14.99 node serving BIP157 with the corrected cfilter wire order, run with an isolated HOME so the real filter cache was untouched: 1442 cfilters parsed off the wire, full getcfcheckpt/getcfheaders/getcfilters round trip, zero validation errors or misbehaviour, and the completion line now reports 6314395..6315836 rather than 1..6315836. That run does not exercise GCS matching: -a is not wired to the filter state until the CLI layer, so no scripts were watched. The matching block is byte-identical to the prototype's sequential arm, which was separately confirmed to match at a predicted height over the wire, and the unit tests cover GCS matching directly -- but this layer's own end-to-end run proves the wire path, not the match path. WITH_NET=ON with -DBUILD_SHARED_LIBS=1: 81/81. WITH_NET=OFF: 74/74. --- include/dogecoin/headersdb_file.h | 21 + include/dogecoin/protocol.h | 7 + include/dogecoin/spv.h | 45 + src/headersdb_file.c | 149 ++- src/spv.c | 1397 ++++++++++++++++++++++++++++- test/spv_tests.c | 8 + 6 files changed, 1611 insertions(+), 16 deletions(-) diff --git a/include/dogecoin/headersdb_file.h b/include/dogecoin/headersdb_file.h index cc38e8d7b..06291f7b5 100644 --- a/include/dogecoin/headersdb_file.h +++ b/include/dogecoin/headersdb_file.h @@ -55,6 +55,11 @@ typedef struct dogecoin_headers_db_ dogecoin_blockindex genesis; dogecoin_blockindex *chaintip; dogecoin_blockindex *chainbottom; + /* Sequential scan state for dogecoin_headers_db_get_block_hash_at_height. + * cfheaders batches request increasing heights; resuming from the last + * found record avoids O(N²) re-reads over a 6.2M-block file. */ + long scan_resume_pos; /**< File offset after last successful scan record */ + uint32_t scan_resume_height; /**< Block height at scan_resume_pos */ } dogecoin_headers_db; dogecoin_headers_db *dogecoin_headers_db_new(const dogecoin_chainparams* chainparams, dogecoin_bool inmem_only); @@ -68,6 +73,22 @@ dogecoin_bool dogecoin_headersdb_disconnect_tip(dogecoin_headers_db* db); dogecoin_bool dogecoin_headersdb_has_checkpoint_start(dogecoin_headers_db* db); void dogecoin_headersdb_set_checkpoint_start(dogecoin_headers_db* db, uint256_t hash, uint32_t height, arith_uint256 chainwork); +/** + * @brief Find the block hash stored at a specific height in the on-disk header file. + * + * Scans the headers.db file from its beginning, reading fixed-size records until + * the one with @p target_height is found. Falls back to walking the in-memory + * prev-chain first for blocks near the chain tip (no file I/O needed there). + * + * @param db The headers database (file handle must be open). + * @param target_height Block height to look up. + * @param hash_out Receives the 32-byte block hash on success. + * @return true if found and @p hash_out is populated. + */ +dogecoin_bool dogecoin_headers_db_open_for_scan(dogecoin_headers_db *db, const char *filename); +dogecoin_bool dogecoin_headers_db_get_block_hash_at_height(dogecoin_headers_db *db, uint32_t target_height, uint256_t hash_out); +dogecoin_bool dogecoin_headers_db_get_block_hash_at_height_seq(dogecoin_headers_db *db, uint32_t target_height, uint256_t hash_out); + /* Defined in headersdb_file.c using typed trampolines (avoids the * function-pointer-cast UB that -fsanitize=function flags). */ extern const dogecoin_headers_db_interface dogecoin_headers_db_interface_file; diff --git a/include/dogecoin/protocol.h b/include/dogecoin/protocol.h index 8fd9a33c1..3e6f6e05c 100644 --- a/include/dogecoin/protocol.h +++ b/include/dogecoin/protocol.h @@ -106,6 +106,13 @@ static const char* DOGECOIN_MSG_SENDCMPCT = "sendcmpct"; static const char* DOGECOIN_MSG_CMPCTBLOCK = "cmpctblock"; static const char* DOGECOIN_MSG_GETBLOCKTXN = "getblocktxn"; static const char* DOGECOIN_MSG_BLOCKTXN = "blocktxn"; +/* BIP 157: Compact block filter protocol messages */ +static const char* DOGECOIN_MSG_GETCFILTERS = "getcfilters"; +static const char* DOGECOIN_MSG_CFILTER = "cfilter"; +static const char* DOGECOIN_MSG_GETCFHEADERS = "getcfheaders"; +static const char* DOGECOIN_MSG_CFHEADERS = "cfheaders"; +static const char* DOGECOIN_MSG_GETCFCHECKPT = "getcfcheckpt"; +static const char* DOGECOIN_MSG_CFCHECKPT = "cfcheckpt"; DISABLE_WARNING_POP enum DOGECOIN_INV_TYPE { diff --git a/include/dogecoin/spv.h b/include/dogecoin/spv.h index ba2bbdf49..f4ee4b2f2 100644 --- a/include/dogecoin/spv.h +++ b/include/dogecoin/spv.h @@ -31,6 +31,7 @@ #include #include +#include #include #include #include @@ -42,6 +43,7 @@ LIBDOGECOIN_BEGIN_DECL enum SPV_CLIENT_STATE { SPV_HEADER_SYNC_FLAG = (1 << 0), SPV_FULLBLOCK_SYNC_FLAG = (1 << 1), + SPV_CFILTER_SYNC_FLAG = (1 << 2), }; typedef struct spv_block_sample_ @@ -107,6 +109,35 @@ typedef struct dogecoin_spv_client_ uint256_t filtered_history_last_rerequest_txid; /* dedupe repeated tail re-requests for the same matched tx */ int32_t filtered_history_last_rerequest_height; + /* Comma-separated "host:port" strings supplied by the caller via + * dogecoin_spv_client_discover_peers(). When non-NULL, the reconnect + * callback reuses these peers instead of querying DNS seeds, so the + * client stays connected to the explicitly-named hosts only. */ + char *peer_ips; + + /* BIP157 genesis-filter support: optional read-only secondary headers DB + * used only for block-hash lookup at early heights when the primary DB is + * checkpoint-based. Populated via --filter-hash-db CLI option. */ + void *aux_hash_db_ctx; /**< Context for aux block-hash lookup DB */ + const dogecoin_headers_db_interface *aux_hash_db; /**< Interface for aux block-hash lookup DB */ + + /* When non-zero, overrides the cfheaders start height (auto default: + * chainbottom for checkpoint-based sync, 1 for genesis sync). */ + uint32_t cf_start_height; + + /* BIP157: compact filter sync state */ + dogecoin_bool compact_filters_enabled; /**< Whether compact filter sync is active */ + dogecoin_compact_filter_state *cfilter_state; /**< BIP157 per-client compact filter state */ + struct dogecoin_cfheaders_db_ *cfheaders_db; /**< Persistent storage for BIP157 filter headers */ + struct dogecoin_cfilters_db_ *cfilters_db; /**< Persistent storage for BIP157 filter data */ + char *cfheaders_path; /**< Override path for cfheaders.dat (NULL = default datadir) */ + char *cfilters_path; /**< Override path for cfilters.dat (NULL = default datadir) */ + + /* BIP158 filter header computation during full block sync */ + uint256_t cf_prev_filter_header; /**< Running filter header chain for BIP158 */ + uint32_t cf_computed_height; /**< Last height for which a filter header was computed */ + dogecoin_bool cf_export_enabled; /**< Log filter header checkpoints during sync */ + /* callbacks */ /* ========= */ void (*header_connected)(struct dogecoin_spv_client_ *client); @@ -162,6 +193,20 @@ LIBDOGECOIN_API dogecoin_bool dogecoin_spv_client_filteradd( LIBDOGECOIN_API dogecoin_bool dogecoin_spv_client_filterclear(dogecoin_spv_client* client); +/* BIP157: enable or disable compact filter sync for this client */ +LIBDOGECOIN_API void dogecoin_spv_enable_compact_filters(dogecoin_spv_client *client, dogecoin_bool enable); + +/* BIP157: rescan all cached cfilters in cfilters.dat against watched scripts. + * Call after dogecoin_spv_client_filteradd and before dogecoin_spv_client_runloop + * to check locally-stored filters immediately without waiting for cfheaders sync. */ +LIBDOGECOIN_API void dogecoin_spv_client_rescan_cached_filters(dogecoin_spv_client *client); + + +/* BIP157: send getcfcheckpt, getcfheaders, getcfilters to a peer */ +LIBDOGECOIN_API dogecoin_bool dogecoin_spv_request_cfcheckpt(dogecoin_spv_client *client, dogecoin_node *node); +LIBDOGECOIN_API dogecoin_bool dogecoin_spv_request_cfheaders(dogecoin_spv_client *client, dogecoin_node *node, uint32_t start_height, const uint256_t stop_hash); +LIBDOGECOIN_API dogecoin_bool dogecoin_spv_request_cfilters(dogecoin_spv_client *client, dogecoin_node *node, uint32_t start_height, const uint256_t stop_hash); + LIBDOGECOIN_END_DECL #endif // __LIBDOGECOIN_SPV_H__ diff --git a/src/headersdb_file.c b/src/headersdb_file.c index a851c413c..33b473690 100644 --- a/src/headersdb_file.c +++ b/src/headersdb_file.c @@ -211,13 +211,12 @@ dogecoin_bool dogecoin_headers_db_load(dogecoin_headers_db* db, const char *file size_t connected_headers_count = 0; if (db->headers_tree_file && !create) { - printf("Loading headers from disk, this may take several minutes...\n"); + printf("Loading headers from disk...\n"); while (!feof(db->headers_tree_file)) { - // print progress - if (connected_headers_count % 1000 == 0) + if (connected_headers_count % 100000 == 0 && connected_headers_count > 0) { - printf("\r%ld headers loaded", connected_headers_count); + printf("\r%zu headers loaded", connected_headers_count); fflush(stdout); } @@ -225,8 +224,6 @@ dogecoin_bool dogecoin_headers_db_load(dogecoin_headers_db* db, const char *file if (fread(buf_all, sizeof(buf_all), 1, db->headers_tree_file) == 1) { struct const_buffer cbuf_all = {buf_all, sizeof(buf_all)}; - //load all - uint256_t hash; uint32_t height; arith_uint256 chainwork = {0}; @@ -266,10 +263,46 @@ dogecoin_bool dogecoin_headers_db_load(dogecoin_headers_db* db, const char *file } } } - printf("\nConnected %ld headers, now at height: %d\n", connected_headers_count, db->chaintip->height); + printf("\nConnected %zu headers, now at height: %d\n", connected_headers_count, db->chaintip->height); return (db->headers_tree_file != NULL); } +/** + * Open an existing headers DB file for sequential hash lookup only. + * + * Unlike dogecoin_headers_db_load(), this function does NOT read any block + * records or build the in-memory tree. It simply opens the file, verifies + * the 8-byte magic+version header, and leaves the file handle ready for + * dogecoin_headers_db_get_block_hash_at_height(). Use this for the aux + * hash-lookup DB in BIP157 genesis filter IBD — no tree needed. + */ +dogecoin_bool dogecoin_headers_db_open_for_scan(dogecoin_headers_db *db, const char *filename) +{ + if (!db || !filename) return false; + + db->headers_tree_file = fopen(filename, "rb"); + if (!db->headers_tree_file) { + fprintf(stderr, "headers_db: cannot open '%s' for scan: %s\n", filename, strerror(errno)); + return false; + } + + uint8_t buf[sizeof(file_hdr_magic) + sizeof(current_version)]; + if (fread(buf, sizeof(buf), 1, db->headers_tree_file) != 1 || + memcmp(buf, file_hdr_magic, sizeof(file_hdr_magic)) != 0) { + fprintf(stderr, "headers_db: bad magic in '%s'\n", filename); + fclose(db->headers_tree_file); + db->headers_tree_file = NULL; + return false; + } + if (le32toh(*(uint32_t *)(buf + sizeof(file_hdr_magic))) > current_version) { + fprintf(stderr, "headers_db: unsupported version in '%s'\n", filename); + fclose(db->headers_tree_file); + db->headers_tree_file = NULL; + return false; + } + return true; +} + /** * The function takes a block index and writes it to the headers database * @@ -558,6 +591,108 @@ dogecoin_bool dogecoin_headersdb_has_checkpoint_start(dogecoin_headers_db* db) { return (db->chainbottom->height != 0); } +/** + * Find a block hash by height, first in the in-memory prev chain and then by + * scanning the on-disk header file. Used by the BIP157 cfheaders batcher to + * compute a valid stop_hash without needing a height-indexed block index. + */ +dogecoin_bool dogecoin_headers_db_get_block_hash_at_height(dogecoin_headers_db *db, uint32_t target_height, uint256_t hash_out) +{ + if (!db) return false; + + /* Fast path: walk the in-memory prev chain (works for the last max_hdr_in_mem entries) */ + dogecoin_blockindex *bi = db->chaintip; + while (bi && (uint32_t)bi->height > target_height) + bi = bi->prev; + if (bi && (uint32_t)bi->height == target_height) { + memcpy_safe(hash_out, bi->hash, sizeof(uint256_t)); + return true; + } + + /* Slow path: scan the on-disk file. + * Records are written in ascending height order (one getheaders batch at a time). + * Record layout: hash(32) + height(4 LE) + chainwork(32) + header(80) = 148 bytes. + * + * cfheaders batches request heights in ascending order (2000, 4000, ...). + * Scanning from offset 0 each time would be O(N²) over a 6M-block file. + * Instead, resume from the last scan position when target_height is beyond + * what was found before; reset to the beginning only when scanning backwards. */ + if (!db->headers_tree_file) return false; + + long saved_pos = ftell(db->headers_tree_file); + + long start_pos = SPV_HEADERS_FILE_HDR_LEN; + if (db->scan_resume_height > 0 && target_height >= db->scan_resume_height) + start_pos = db->scan_resume_pos; /* continue forward from last find */ + + fseek(db->headers_tree_file, start_pos, SEEK_SET); + + uint8_t rec[SPV_HEADERS_FILE_REC_LEN]; + dogecoin_bool found = false; + while (fread(rec, SPV_HEADERS_FILE_REC_LEN, 1, db->headers_tree_file) == 1) { + uint32_t h; + memcpy(&h, rec + 32, 4); /* height field is at offset 32 (after the hash) */ + h = le32toh(h); + if (h == target_height) { + memcpy_safe(hash_out, rec, sizeof(uint256_t)); + /* Remember this position so the next forward lookup can skip ahead. */ + db->scan_resume_pos = ftell(db->headers_tree_file); + db->scan_resume_height = h; + found = true; + break; + } + } + + fseek(db->headers_tree_file, saved_pos, SEEK_SET); + return found; +} + +/* Sequential variant used during the cfilter rescan: like + * dogecoin_headers_db_get_block_hash_at_height but never restores the file + * position. The caller (spv_rescan_cb) visits heights in strictly ascending + * order so the file pointer advances forward only, keeping I/O O(N) instead + * of O(N²) that the save/restore pattern would produce. */ +dogecoin_bool dogecoin_headers_db_get_block_hash_at_height_seq(dogecoin_headers_db *db, uint32_t target_height, uint256_t hash_out) +{ + if (!db) return false; + + /* Fast path: in-memory prev chain — only useful for heights near the tip. + * Skip if target is more than max_hdr_in_mem below the tip to avoid + * walking the full 1440-entry chain 6M+ times during a bulk rescan. */ + if (db->chaintip && + (uint32_t)db->chaintip->height <= target_height + db->max_hdr_in_mem) { + dogecoin_blockindex *bi = db->chaintip; + while (bi && (uint32_t)bi->height > target_height) + bi = bi->prev; + if (bi && (uint32_t)bi->height == target_height) { + memcpy_safe(hash_out, bi->hash, sizeof(uint256_t)); + return true; + } + } + + if (!db->headers_tree_file) return false; + + long start_pos = SPV_HEADERS_FILE_HDR_LEN; + if (db->scan_resume_height > 0 && target_height >= db->scan_resume_height) + start_pos = db->scan_resume_pos; + + fseek(db->headers_tree_file, start_pos, SEEK_SET); + + uint8_t rec[SPV_HEADERS_FILE_REC_LEN]; + while (fread(rec, SPV_HEADERS_FILE_REC_LEN, 1, db->headers_tree_file) == 1) { + uint32_t h; + memcpy(&h, rec + 32, 4); + h = le32toh(h); + if (h == target_height) { + memcpy_safe(hash_out, rec, sizeof(uint256_t)); + db->scan_resume_pos = ftell(db->headers_tree_file); + db->scan_resume_height = h; + return true; + } + } + return false; +} + /** * Set the checkpoint block to the given hash and height * diff --git a/src/spv.c b/src/spv.c index ffab9d4a9..82543c07e 100644 --- a/src/spv.c +++ b/src/spv.c @@ -39,6 +39,7 @@ #endif #include +#include #include #include #include @@ -48,8 +49,12 @@ #include #include +#include #include +#include +#include #include +#include #include #include #include @@ -121,6 +126,260 @@ static dogecoin_bool spv_send_filterload_to_node(dogecoin_node* node, return true; } +static uint32_t spv_elapsed(const dogecoin_spv_client *client) { + return (uint32_t)((uint64_t)time(NULL) - client->start_ts); +} + +/* ================================================================ */ +/* Parallel cfheaders download helpers */ +/* ================================================================ */ + +static uint32_t cf_find_checkpoint_stop(const dogecoin_chainparams *params, uint32_t target_height, uint256_t hash_out); + +/* Callback context for spv_rescan_cached_cfilters. */ +typedef struct { + dogecoin_spv_client *client; + uint32_t up_to_height; /* only rescan heights < this */ + uint32_t scanned; + uint32_t matched; +} rescan_ctx; + +/* Iterator callback: match one cached cfilter against watched_scripts. */ +static dogecoin_bool spv_rescan_cb(uint32_t height, const uint256_t block_hash, + const uint8_t *filter_data, uint32_t data_len, + void *ctx_) +{ + rescan_ctx *ctx = (rescan_ctx *)ctx_; + if (height >= ctx->up_to_height) return false; /* stop; network takes over here */ + + dogecoin_compact_filter_state *cfstate = ctx->client->cfilter_state; + if (!cfstate->watched_scripts || cfstate->watched_scripts->len == 0) return true; + + ctx->scanned++; + + /* The block_hash stored in cfilters.dat may be corrupted by an old deser bug + * (filter_type byte prepended, last hash byte zeroed). The GCS SipHash key is + * derived directly from the block hash, so a wrong hash produces wrong match + * results. Look up the authoritative hash from the headers DB BEFORE + * deserializing the filter so that the correct key is used for matching. + * Use the _seq variant which never restores the file pointer, keeping sequential + * ascending-order lookups O(N) rather than O(N²). */ + uint256_t correct_hash; + dogecoin_bool hash_ok = false; + if (ctx->client->headers_db && ctx->client->headers_db_ctx) { + dogecoin_headers_db *hdb = (dogecoin_headers_db *)ctx->client->headers_db_ctx; + hash_ok = dogecoin_headers_db_get_block_hash_at_height_seq(hdb, height, correct_hash); + } + if (!hash_ok && ctx->client->aux_hash_db && ctx->client->aux_hash_db_ctx) { + dogecoin_headers_db *aux = (dogecoin_headers_db *)ctx->client->aux_hash_db_ctx; + hash_ok = dogecoin_headers_db_get_block_hash_at_height_seq(aux, height, correct_hash); + } + const uint8_t *hash_for_gcs = hash_ok ? (const uint8_t *)correct_hash + : (const uint8_t *)block_hash; + + gcs_filter *gcs = gcs_filter_new(); + struct const_buffer fbuf = { filter_data, data_len }; + if (gcs_filter_deserialize(gcs, GCS_BASIC_FILTER_TYPE, hash_for_gcs, &fbuf)) { + if (gcs_filter_match_any(gcs, cfstate->watched_scripts)) { + if (ctx->client->nodegroup && ctx->client->nodegroup->log_write_cb) + ctx->client->nodegroup->log_write_cb( + "[bip157] MATCH (rescan) at height %u\n", height); + uint256_t *matched_hash = dogecoin_calloc(1, sizeof(uint256_t)); + memcpy(matched_hash, hash_for_gcs, sizeof(uint256_t)); + vector_add(cfstate->matched_block_hashes, matched_hash); + uint32_t *matched_height = dogecoin_calloc(1, sizeof(uint32_t)); + *matched_height = height; + vector_add(cfstate->matched_block_heights, matched_height); + ctx->matched++; + } + } + gcs_filter_free(gcs); + return true; +} + +/* Rescan cached cfilters (heights 1..cf_scan_start-1) against watched_scripts. + * Called before starting the network download so that already-stored filters + * are not skipped when scripts were registered after the previous sync. */ +static void spv_rescan_cached_cfilters(dogecoin_spv_client *client, uint32_t cf_scan_start) +{ + if (!client->cfilters_db) return; + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + if (!cfstate || !cfstate->watched_scripts || cfstate->watched_scripts->len == 0) return; + + /* Skip partial rescan if a full startup rescan already covered everything. */ + if (cfstate->rescan_done) return; + + if (cf_scan_start <= 1) return; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] rescanning cached filters heights 1..%u against %u watched scripts\n", + cf_scan_start - 1, (unsigned int)cfstate->watched_scripts->len); + + rescan_ctx ctx = { client, cf_scan_start, 0, 0 }; + dogecoin_cfilters_db_iterate(client->cfilters_db, spv_rescan_cb, &ctx); + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] rescan complete: %u filters checked, %u matched\n", + ctx.scanned, ctx.matched); +} + +/* Repair cfilters.dat records whose block_hash was written with an off-by-one + * deserialization bug (old code read the 32-byte hash before the 1-byte + * filter_type, so stored hashes contain the filter_type byte prepended and the + * last hash byte replaced with 0x00). The symptom: stored_hash[31] == 0x00. + * We correct each such record in-place using the authoritative hash from the + * headers DB. Only records opened read-write are touched. */ +static void spv_repair_cfilters_hashes(dogecoin_spv_client *client) +{ + dogecoin_cfilters_db *db = client->cfilters_db; + if (!db || !db->file || !db->read_write) return; + + dogecoin_headers_db *hdb = client->headers_db ? (dogecoin_headers_db *)client->headers_db_ctx : NULL; + dogecoin_headers_db *aux = client->aux_hash_db ? (dogecoin_headers_db *)client->aux_hash_db_ctx : NULL; + if (!hdb && !aux) return; + + if (fseek(db->file, CF_HEADERS_FILE_HDR_LEN, SEEK_SET) != 0) return; + + uint32_t repaired = 0; + uint8_t hdr[CF_FILTERS_FILE_REC_HDR_LEN]; + while (fread(hdr, CF_FILTERS_FILE_REC_HDR_LEN, 1, db->file) == 1) { + uint32_t height, data_len; + memcpy(&height, hdr, 4); height = le32toh(height); + memcpy(&data_len, hdr + 36, 4); data_len = le32toh(data_len); + + /* Quick corruption check: the old bug always left byte 31 of the hash + * as 0x00 (zero-initialised, never written). Real hashes end in 0x00 + * ~1/256 of the time so we'll do a few unnecessary lookups, but those + * will match and no write will be issued. */ + if (hdr[35] == 0x00) { + uint256_t correct; + dogecoin_bool ok = hdb && dogecoin_headers_db_get_block_hash_at_height(hdb, height, correct); + if (!ok && aux) ok = dogecoin_headers_db_get_block_hash_at_height(aux, height, correct); + if (ok && memcmp(hdr + 4, correct, 32) != 0) { + long rec_start = ftell(db->file) - (long)CF_FILTERS_FILE_REC_HDR_LEN; + if (fseek(db->file, rec_start + 4, SEEK_SET) == 0) { + fwrite(correct, 32, 1, db->file); + fseek(db->file, rec_start + (long)CF_FILTERS_FILE_REC_HDR_LEN, SEEK_SET); + repaired++; + } + } + } + + if (data_len > 0 && fseek(db->file, (long)data_len, SEEK_CUR) != 0) break; + } + + fseek(db->file, 0, SEEK_END); + + if (repaired > 0 && client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] repaired %u cfilter block hashes (old deserialization bug)\n", repaired); +} + +void dogecoin_spv_client_rescan_cached_filters(dogecoin_spv_client *client) +{ + if (!client || !client->cfilters_db) return; + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + if (!cfstate || !cfstate->watched_scripts || cfstate->watched_scripts->len == 0) return; + + uint32_t tip = client->cfilters_db->tip_height; + if (tip == 0) return; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] startup rescan: checking all %u cached filters against %u watched scripts\n", + tip, (unsigned int)cfstate->watched_scripts->len); + + rescan_ctx ctx = { client, UINT32_MAX, 0, 0 }; + dogecoin_cfilters_db_iterate(client->cfilters_db, spv_rescan_cb, &ctx); + + cfstate->rescan_done = true; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] startup rescan complete: %u filters checked, %u matched\n", + ctx.scanned, ctx.matched); +} + +/* Called when all cfheaders chunks are complete: populate filter_headers + * from the flat array and transition to cfilter download. */ +static void spv_cf_request_matched_blocks(dogecoin_spv_client *client) +{ + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + if (!cfstate || !cfstate->matched_block_hashes || cfstate->matched_block_hashes->len == 0) + return; + + /* Collect all connected peers (prefer CF-capable, then any) */ + /* enum, not `const unsigned int`: in C a const object is not a constant + * expression, so `peers[MAX_PEERS]` was a variable-length array. MSVC does + * not implement VLAs and rejected it outright (C2057 / C2133 / C2466). */ + enum { MAX_PEERS = 8 }; + dogecoin_node *peers[MAX_PEERS]; + unsigned int num_peers = 0; + unsigned int ni; + for (ni = 0; ni < client->nodegroup->nodes->len && num_peers < MAX_PEERS; ni++) { + dogecoin_node *n = (dogecoin_node *)vector_idx(client->nodegroup->nodes, ni); + if (!n || !(n->state & NODE_CONNECTED) || !n->version_handshake) continue; + if (n->services & DOGECOIN_NODE_COMPACT_FILTERS) { + /* insert CF peers at the front */ + if (num_peers < MAX_PEERS) { peers[num_peers++] = n; } + } else { + if (num_peers < MAX_PEERS) { peers[num_peers++] = n; } + } + } + if (num_peers == 0) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] no peer available for matched block fetch\n"); + return; + } + + uint32_t total = (uint32_t)cfstate->matched_block_hashes->len; + cfstate->cf_block_fetch_active = true; + cfstate->matched_blocks_fetched = 0; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] requesting %u matched full blocks across %u peers [%us elapsed]\n", + total, num_peers, spv_elapsed(client)); + + /* Distribute blocks round-robin across peers in batches of 8 */ + const uint32_t batch_max = 8; + uint32_t peer_idx = 0; + uint32_t sent = 0; + while (sent < total) { + dogecoin_node *peer = peers[peer_idx % num_peers]; + peer_idx++; + + uint32_t batch = total - sent; + if (batch > batch_max) batch = batch_max; + + cstring *payload = cstr_new_sz(9 + (size_t)batch * 36); + if (!payload) break; + + ser_varlen(payload, batch); + uint32_t bi; + for (bi = 0; bi < batch; bi++) { + uint32_t type = DOGECOIN_INV_TYPE_BLOCK; + ser_u32(payload, type); + ser_bytes(payload, + (const uint8_t *)vector_idx(cfstate->matched_block_hashes, sent + bi), 32); + } + + cstring *p2p_msg = dogecoin_p2p_message_new( + peer->nodegroup->chainparams->netmagic, + DOGECOIN_MSG_GETDATA, + (const uint8_t *)payload->str, payload->len); + dogecoin_node_send(peer, p2p_msg); + cstr_free(p2p_msg, true); + cstr_free(payload, true); + sent += batch; + } +} + +/* ------------------------------------------------------------------ */ +/* Flush contiguous complete batches to disk in height order. */ +/* ------------------------------------------------------------------ */ static dogecoin_bool spv_lookup_headersdb_height_by_hash(dogecoin_spv_client* client, const uint8_t hash[32], uint32_t* out_height) @@ -188,6 +447,7 @@ static dogecoin_bool spv_log_merkle_match(const uint8_t txid[32], uint32_t pos, static const unsigned int HEADERS_MAX_RESPONSE_TIME = 120; static const unsigned int MIN_TIME_DELTA_FOR_STATE_CHECK = 5; +static const unsigned int CF_RESPONSE_TIMEOUT = 30; static const unsigned int BLOCK_GAP_TO_DEDUCT_TO_START_SCAN_FROM = 5; static const unsigned int BLOCKS_DELTA_IN_S = 60; static const unsigned int COMPLETED_WHEN_NUM_NODES_AT_SAME_HEIGHT = 2; @@ -430,7 +690,9 @@ void dogecoin_net_spv_node_handshake_done(dogecoin_node *node); void dogecoin_node_connection_state_changed_cb(dogecoin_node *node) { if (node->nodegroup->should_connect_to_more_nodes_cb) { if (node->nodegroup->should_connect_to_more_nodes_cb(node)) { - dogecoin_spv_client_discover_peers((dogecoin_spv_client*)node->nodegroup->ctx, NULL); + dogecoin_spv_client *client = (dogecoin_spv_client*)node->nodegroup->ctx; + /* Use explicit peer IPs when provided; fall back to DNS seeds otherwise. */ + dogecoin_spv_client_discover_peers(client, client->peer_ips); dogecoin_node_group_connect_next_nodes(node->nodegroup); } } @@ -587,6 +849,28 @@ dogecoin_spv_client* dogecoin_spv_client_new(const dogecoin_chainparams *params, client->smpv_ctx = NULL; client->smpv_enabled = false; + // BIP157 compact filter sync (on by default; disable with --no_cfilters) + client->compact_filters_enabled = true; + client->cfilter_state = dogecoin_compact_filter_state_new(); + if (client->cfilter_state) { + client->cfilter_state->enabled = true; + } + dogecoin_mem_zero(client->cf_prev_filter_header, sizeof(uint256_t)); + client->cf_computed_height = 0; + client->cf_export_enabled = false; + + /* BIP157 persistent filter storage (opened in dogecoin_spv_client_load) */ + client->cfheaders_db = NULL; + client->cfilters_db = NULL; + client->cfheaders_path = NULL; + client->cfilters_path = NULL; + + client->peer_ips = NULL; + + client->aux_hash_db_ctx = NULL; + client->aux_hash_db = NULL; + client->cf_start_height = 0; + return client; } @@ -598,6 +882,19 @@ dogecoin_spv_client* dogecoin_spv_client_new(const dogecoin_chainparams *params, */ void dogecoin_spv_client_discover_peers(dogecoin_spv_client* client, const char *ips) { +#ifndef _WIN32 + // set stdin to non-blocking for quit command + int stdin_flags = fcntl(STDIN_FILENO, F_GETFL); + fcntl(STDIN_FILENO, F_SETFL, stdin_flags | O_NONBLOCK); +#endif + + /* Remember explicit peer IPs so reconnects reuse them instead of DNS seeds. */ + if (ips) { + if (client->peer_ips) dogecoin_free(client->peer_ips); + client->peer_ips = strdup(ips); + } + + dogecoin_node_group_add_peers_by_ip_or_seed(client->nodegroup, ips); } @@ -653,6 +950,40 @@ void dogecoin_spv_client_free(dogecoin_spv_client *client) client->merkle_match_active = false; client->merkle_match_blockindex = NULL; + if (client->cfilter_state) { + dogecoin_compact_filter_state_free(client->cfilter_state); + client->cfilter_state = NULL; + } + client->compact_filters_enabled = false; + + if (client->cfheaders_db) { + dogecoin_cfheaders_db_free(client->cfheaders_db); + client->cfheaders_db = NULL; + } + if (client->cfilters_db) { + dogecoin_cfilters_db_free(client->cfilters_db); + client->cfilters_db = NULL; + } + if (client->cfheaders_path) { + dogecoin_free(client->cfheaders_path); + client->cfheaders_path = NULL; + } + if (client->cfilters_path) { + dogecoin_free(client->cfilters_path); + client->cfilters_path = NULL; + } + + if (client->peer_ips) { + dogecoin_free(client->peer_ips); + client->peer_ips = NULL; + } + + if (client->aux_hash_db && client->aux_hash_db_ctx) { + client->aux_hash_db->free(client->aux_hash_db_ctx); + client->aux_hash_db_ctx = NULL; + client->aux_hash_db = NULL; + } + if (client->headers_db) { if (client->headers_db_ctx) @@ -722,8 +1053,29 @@ dogecoin_bool dogecoin_spv_client_load(dogecoin_spv_client *client, const char * if (!client->headers_db) return false; - return client->headers_db->load(client->headers_db_ctx, file_path, prompt); + if (!client->headers_db->load(client->headers_db_ctx, file_path, prompt)) + return false; + + /* Open BIP157 persistent filter databases when compact filter sync is enabled */ + if (client->compact_filters_enabled && client->cfilter_state) { + dogecoin_bool inmem = (file_path && strcmp(file_path, ":memory:") == 0); + + client->cfheaders_db = dogecoin_cfheaders_db_new(client->chainparams, inmem); + if (!dogecoin_cfheaders_db_load(client->cfheaders_db, client->cfheaders_path, client->cfilter_state)) { + fprintf(stderr, "spv: failed to open cfheaders.dat; continuing without persistence\n"); + dogecoin_cfheaders_db_free(client->cfheaders_db); + client->cfheaders_db = NULL; + } + + client->cfilters_db = dogecoin_cfilters_db_new(client->chainparams, inmem); + if (!dogecoin_cfilters_db_load(client->cfilters_db, client->cfilters_path)) { + fprintf(stderr, "spv: failed to open cfilters.dat; continuing without persistence\n"); + dogecoin_cfilters_db_free(client->cfilters_db); + client->cfilters_db = NULL; + } + } + return true; } /** @@ -778,6 +1130,89 @@ void dogecoin_net_spv_periodic_statecheck(dogecoin_node *node, uint64_t *now) if ((client->stateflags & SPV_FULLBLOCK_SYNC_FLAG) == SPV_FULLBLOCK_SYNC_FLAG) { dogecoin_net_spv_request_headers(client); + + /* Recovery: if our chaintip is far below the global-best peer and no + * BLOCKSYNC node has a block request in-flight, we're deadlocked — + * the inv handler won't request blocks because we're too far behind, + * and dogecoin_net_spv_request_headers early-returns because BLOCKSYNC + * nodes exist. Force all nodes back to header sync. */ + dogecoin_blockindex *sc_tip = client->headers_db->getchaintip(client->headers_db_ctx); + uint32_t sc_best = 0; + size_t sc_i; + for (sc_i = 0; sc_i < client->nodegroup->nodes->len; sc_i++) { + dogecoin_node *sc_n = vector_idx(client->nodegroup->nodes, sc_i); + if ((sc_n->state & NODE_CONNECTED) && sc_n->bestknownheight > sc_best) + sc_best = sc_n->bestknownheight; + } + if (sc_tip && sc_best > (uint32_t)sc_tip->height + 1440) { + dogecoin_bool any_pending = false; + for (sc_i = 0; sc_i < client->nodegroup->nodes->len; sc_i++) { + dogecoin_node *sc_n = vector_idx(client->nodegroup->nodes, sc_i); + if ((sc_n->state & NODE_BLOCKSYNC) && (sc_n->state & NODE_CONNECTED) && sc_n->time_last_request > 0) + any_pending = true; + } + if (!any_pending) { + for (sc_i = 0; sc_i < client->nodegroup->nodes->len; sc_i++) { + dogecoin_node *sc_n = vector_idx(client->nodegroup->nodes, sc_i); + if (sc_n->state & NODE_BLOCKSYNC) sc_n->state &= ~NODE_BLOCKSYNC; + } + client->stateflags &= ~SPV_FULLBLOCK_SYNC_FLAG; + client->stateflags |= SPV_HEADER_SYNC_FLAG; + client->nodegroup->log_write_cb( + "[spv] stale BLOCKSYNC (height=%d global_best=%d) — forcing header sync\n", + sc_tip->height, sc_best); + dogecoin_net_spv_request_headers(client); + } + } + } + + /* BIP157: recover from stalled awaiting_response when a peer disconnected + * mid-download without clearing the flag. */ + if (client->compact_filters_enabled && client->cfilter_state) { + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + dogecoin_bool cf_incomplete = + ((uint32_t)pindex->height > 0) && + (cfstate->cfheaders_tip_height < (uint32_t)pindex->height || + cfstate->filters_tip_height < cfstate->cfheaders_tip_height); + + if (cf_incomplete && cfstate->awaiting_response) { + /* Fast-path: if no CF-capable peer is connected right now, the peer + * we sent the request to has disconnected. Clear awaiting_response + * immediately so the postcmd trigger can fire as soon as any CF peer + * reconnects — no need to wait the full CF_RESPONSE_TIMEOUT. */ + dogecoin_bool any_cf_connected = false; + for (unsigned int ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *n = (dogecoin_node *)vector_idx(client->nodegroup->nodes, ni); + if ((n->state & NODE_CONNECTED) && + (n->services & DOGECOIN_NODE_COMPACT_FILTERS)) { + any_cf_connected = true; + break; + } + } + if (!any_cf_connected) { + client->nodegroup->log_write_cb( + "[bip157] CF peer gone — clearing awaiting_response to retry on reconnect\n"); + cfstate->awaiting_response = false; + } else if (cfstate->last_request_time > 0 && + *now > cfstate->last_request_time + CF_RESPONSE_TIMEOUT) { + /* Full timeout: CF peer is connected but not responding. */ + client->nodegroup->log_write_cb( + "[bip157] CF response timeout after %us — retrying\n", + (unsigned int)(*now - cfstate->last_request_time)); + cfstate->awaiting_response = false; + dogecoin_node *cf_node = NULL; + for (unsigned int ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *n = (dogecoin_node *)vector_idx(client->nodegroup->nodes, ni); + if ((n->state & NODE_CONNECTED) && + (n->services & DOGECOIN_NODE_COMPACT_FILTERS)) { + cf_node = n; + break; + } + } + if (cf_node) + dogecoin_spv_request_cfcheckpt(client, cf_node); + } + } } client->last_statecheck_time = *now; @@ -891,6 +1326,27 @@ void dogecoin_net_spv_node_request_headers_or_blocks(dogecoin_node *node, dogeco * * @return dogecoin_bool */ +/* True while compact-filter sync can still make progress: a peer advertising + * NODE_COMPACT_FILTERS is connected, or matched blocks from a rescan are still + * being fetched. Sync completion is deferred to the filter path only in that + * case. When filters are enabled (the default) but no peer serves them, nothing + * would ever advance the CF state machine, and gating completion purely on + * compact_filters_enabled left the client waiting forever -- `spvnode scan` + * never printed "Sync completed" and never exited. */ +static dogecoin_bool spv_cf_sync_pending(dogecoin_spv_client *client) +{ + if (!client->compact_filters_enabled || !client->cfilter_state) return false; + if (client->cfilter_state->cf_block_fetch_active) return true; + if (!client->nodegroup || !client->nodegroup->nodes) return false; + unsigned int i; + for (i = 0; i < client->nodegroup->nodes->len; i++) { + dogecoin_node *n = (dogecoin_node *)vector_idx(client->nodegroup->nodes, i); + if (n && (n->state & NODE_CONNECTED) && (n->services & DOGECOIN_NODE_COMPACT_FILTERS)) + return true; + } + return false; +} + dogecoin_bool dogecoin_net_spv_request_headers(dogecoin_spv_client *client) { size_t i; @@ -961,7 +1417,8 @@ dogecoin_bool dogecoin_net_spv_request_headers(dogecoin_spv_client *client) } } - if (nodes_at_same_height >= COMPLETED_WHEN_NUM_NODES_AT_SAME_HEIGHT && !client->called_sync_completed && client->sync_completed) + if (nodes_at_same_height >= COMPLETED_WHEN_NUM_NODES_AT_SAME_HEIGHT && !client->called_sync_completed && client->sync_completed + && !spv_cf_sync_pending(client)) { client->sync_completed(client); client->called_sync_completed = true; @@ -992,7 +1449,9 @@ void dogecoin_net_spv_node_handshake_done(dogecoin_node *node) } } - dogecoin_net_spv_request_headers((dogecoin_spv_client*)node->nodegroup->ctx); + dogecoin_spv_client *hsclient = (dogecoin_spv_client*)node->nodegroup->ctx; + dogecoin_net_spv_request_headers(hsclient); + } /** @@ -1662,6 +2121,87 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s } else { + /* BIP157 matched-block path: block already in headers DB; process its txns */ + dogecoin_compact_filter_state *cfstate_mb = + (client->compact_filters_enabled && client->cfilter_state) + ? client->cfilter_state : NULL; + dogecoin_bool is_cf_match = false; + unsigned int cf_match_idx = 0; + if (cfstate_mb && cfstate_mb->cf_block_fetch_active && pindex) { + unsigned int mbi; + for (mbi = 0; mbi < cfstate_mb->matched_block_hashes->len; mbi++) { + if (memcmp(vector_idx(cfstate_mb->matched_block_hashes, mbi), + pindex->hash, 32) == 0) { + is_cf_match = true; + cf_match_idx = mbi; + break; + } + } + } + + if (is_cf_match) { + /* Get real in-memory pindex with correct height from B-tree. + * For historical blocks pruned from the tree, recover the height + * from the stored matched_block_heights vector instead. */ + dogecoin_headers_db *db_mb = (dogecoin_headers_db *)client->headers_db_ctx; + dogecoin_blockindex *real_pindex = dogecoin_headersdb_find(db_mb, pindex->hash); + dogecoin_bool pindex_is_heap = false; /* track if we need to free pindex */ + if (real_pindex) { + dogecoin_free(pindex); /* dummy from connect_hdr; tree owns real_pindex */ + pindex = real_pindex; + } else { + /* Block pruned from in-memory tree — recover height from stored value */ + if (cfstate_mb->matched_block_heights && + cf_match_idx < cfstate_mb->matched_block_heights->len) { + uint32_t *h = (uint32_t *)vector_idx(cfstate_mb->matched_block_heights, cf_match_idx); + if (h) pindex->height = *h; + } + pindex_is_heap = true; /* we own this allocation */ + } + + uint32_t amount_of_txs_cf = 0; + if (!pindex || !deser_varlen(&amount_of_txs_cf, buf)) { + if (pindex_is_heap) dogecoin_free(pindex); + return; + } + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] processing %u txs from matched block height=%u [%us elapsed]\n", + amount_of_txs_cf, (unsigned)pindex->height, spv_elapsed(client)); + + size_t cf_consumed = 0; + unsigned int cfi; + for (cfi = 0; cfi < amount_of_txs_cf; cfi++) { + dogecoin_tx *tx = dogecoin_tx_new(); + if (!dogecoin_tx_deserialize(buf->p, buf->len, tx, &cf_consumed)) { + dogecoin_tx_free(tx); + break; + } + deser_skip(buf, cf_consumed); + if (client->sync_transaction) + client->sync_transaction(client->sync_transaction_ctx, tx, cfi, pindex); + dogecoin_tx_free(tx); + } + + cfstate_mb->matched_blocks_fetched++; + if (cfstate_mb->matched_blocks_fetched >= + (uint32_t)cfstate_mb->matched_block_hashes->len) { + cfstate_mb->cf_block_fetch_active = false; + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] all %u matched blocks processed [%us elapsed]\n", + cfstate_mb->matched_blocks_fetched, spv_elapsed(client)); + if (!client->called_sync_completed && client->sync_completed) { + if (client->smpv_enabled) dogecoin_net_spv_request_mempool(client); + client->sync_completed(client); + client->called_sync_completed = true; + } + } + if (pindex_is_heap) dogecoin_free(pindex); + return; + } + client->nodegroup->log_write_cb("Got invalid block (not in sequence) from node %d\n", node->nodeid); node->state &= ~NODE_BLOCKSYNC; node->nodegroup->node_connection_state_changed_cb(node); @@ -1674,7 +2214,8 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s // we check if the height is greater than or equal to the node's bestknown height minus 5 minutes if (client->headers_db->getchaintip(client->headers_db_ctx)->height >= node->bestknownheight - 5) { // last requested block reached, consider stop syncing - if (!client->called_sync_completed && client->sync_completed) { + if (!client->called_sync_completed && client->sync_completed + && !spv_cf_sync_pending(client)) { /* BIP157: defer only while filter sync can progress */ // enable mempool requests if smpv is enabled if (client->smpv_enabled) dogecoin_net_spv_request_mempool(client); client->sync_completed(client); @@ -1692,11 +2233,23 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s uint32_t amount_of_headers; if (!deser_varlen(&amount_of_headers, buf)) return; uint64_t now = time(NULL); - client->nodegroup->log_write_cb("Got %d headers (took %d s) from node %d\n", amount_of_headers, now - client->last_headersrequest_time, node->nodeid); + client->nodegroup->log_write_cb("Got %d headers (took %d s) from node %d [%us elapsed]\n", amount_of_headers, now - client->last_headersrequest_time, node->nodeid, spv_elapsed(client)); // flag off the request stall check client->last_headersrequest_time = 0; + /* Use global-best height so we don't switch to BLOCKSYNC prematurely when + * the peer we're syncing from has a low tip but other peers are further ahead. */ + uint32_t global_best_height = node->bestknownheight; + { + unsigned int gni; + for (gni = 0; gni < (unsigned int)client->nodegroup->nodes->len; gni++) { + dogecoin_node *gn = (dogecoin_node*)vector_idx(client->nodegroup->nodes, gni); + if ((gn->state & NODE_CONNECTED) && gn->bestknownheight > global_best_height) + global_best_height = gn->bestknownheight; + } + } + unsigned int connected_headers = 0; unsigned int i; for (i = 0; i < amount_of_headers; i++) @@ -1721,7 +2274,7 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s } else { if (client->header_connected) { client->header_connected(client); } connected_headers++; - if (pindex->height >= node->bestknownheight - 5) { + if (pindex->height >= global_best_height - 5) { client->stateflags &= ~SPV_HEADER_SYNC_FLAG; client->stateflags |= SPV_FULLBLOCK_SYNC_FLAG; node->state &= ~NODE_HEADERSYNC; @@ -1735,7 +2288,7 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s dogecoin_blockindex *chaintip = client->headers_db->getchaintip(client->headers_db_ctx); client->nodegroup->log_write_cb("Connected %d headers\n", connected_headers); - client->nodegroup->log_write_cb("Chaintip at height %d\n", chaintip->height); + client->nodegroup->log_write_cb("Chaintip at height %d [%us elapsed]\n", chaintip->height, spv_elapsed(client)); if (client->header_message_processed && client->header_message_processed(client, node, chaintip) == false) return; @@ -1746,6 +2299,54 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s client->nodegroup->log_write_cb("chain size: %d, last time %s", chaintip->height, ctime(&lasttime)); dogecoin_net_spv_node_request_headers_or_blocks(node, false); } + else if (client->compact_filters_enabled && client->cfilter_state && + !client->cfilter_state->awaiting_response && + /* CF sync not yet complete: cfheaders or cfilters behind chain tip */ + (client->cfilter_state->cfheaders_tip_height < (uint32_t)chaintip->height || + client->cfilter_state->filters_tip_height < client->cfilter_state->cfheaders_tip_height) && + chaintip->height > 0 && + chaintip->height >= node->bestknownheight - 5) { + /* Headers are at tip — find a BIP157-capable peer (NODE_COMPACT_FILTERS) */ + dogecoin_node *cf_node = NULL; + for (unsigned int ni = 0; ni < (unsigned int)client->nodegroup->nodes->len; ni++) { + dogecoin_node *n = (dogecoin_node *)vector_idx(client->nodegroup->nodes, ni); + if ((n->state & NODE_CONNECTED) && (n->services & DOGECOIN_NODE_COMPACT_FILTERS)) { + cf_node = n; + break; + } + } + if (cf_node) { + client->nodegroup->log_write_cb("[bip157] headers synced to tip (height=%d), sending getcfcheckpt to node %d (compact-filters peer)\n", + chaintip->height, cf_node->nodeid); + dogecoin_spv_request_cfcheckpt(client, cf_node); + } else { + client->nodegroup->log_write_cb("[bip157] headers at tip (height=%d) but no NODE_COMPACT_FILTERS peer connected\n", + chaintip->height); + /* Completion is not handled here on purpose. Headers reaching the tip + * is not the end of the sync -- the last few blocks still arrive over + * BLOCKSYNC afterwards -- so finishing at this point reports a height + * short of the real tip. spv_cf_sync_pending() lets the normal + * headers/blocks completion run instead, at the right moment. */ + } + } + + /* Blocks matched by the startup rescan of already-cached cfilters have to be + * requested independently of the cfheaders/cfilters network sync above. That + * sync only covers heights not already on disk, so when the cache already spans + * the chain the cfilter download never runs, its completion hook never + * fires, and the matched blocks would never be fetched -- the scan reported + * matches but the wallet stayed empty. Trigger here once headers are at + * tip, whichever CF + * branch above was taken; cf_block_fetch_active keeps it to one dispatch. */ + if (client->compact_filters_enabled && client->cfilter_state && + client->cfilter_state->rescan_done && + client->cfilter_state->matched_block_hashes && + client->cfilter_state->matched_block_hashes->len > 0 && + !client->cfilter_state->cf_block_fetch_active && + chaintip->height > 0 && + chaintip->height >= node->bestknownheight - 5) { + spv_cf_request_matched_blocks(client); + } } if (strcmp(hdr->command, DOGECOIN_MSG_MERKLEBLOCK) == 0) { @@ -1998,7 +2599,8 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s if (dogecoin_hash_equal((uint8_t *)node->last_requested_inv, (uint8_t *)pindex->hash)) { if (client->headers_db->getchaintip(client->headers_db_ctx)->height >= node->bestknownheight - 5) { - if (!client->called_sync_completed && client->sync_completed) { + if (!client->called_sync_completed && client->sync_completed + && !spv_cf_sync_pending(client)) { /* BIP157: defer only while filter sync can progress */ if (client->smpv_enabled) dogecoin_net_spv_request_mempool(client); client->sync_completed(client); client->called_sync_completed = true; @@ -2131,6 +2733,511 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s } } + /* ================================================================ */ + /* BIP157: cfilter response handler */ + /* ================================================================ */ + if (strcmp(hdr->command, DOGECOIN_MSG_CFILTER) == 0) + { + if (!client->compact_filters_enabled || !client->cfilter_state) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] compact filters not enabled, ignoring cfilter\n"); + } else { + dogecoin_cfilter_msg cfilter_msg; + dogecoin_cfilter_msg_init(&cfilter_msg); + + struct const_buffer deser_buf = { buf->p, buf->len }; + if (dogecoin_p2p_msg_cfilter_deser(&cfilter_msg, &deser_buf)) { + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + + if (cfilter_msg.filter_data) { + /* Determine the height this cfilter corresponds to. */ + uint32_t filter_height; + + if (cfstate->filters_tip_height >= cfstate->cfheaders_tip_height) + goto cfilter_handler_done; + filter_height = cfstate->filters_tip_height + 1; + + /* + * filter_headers[i] = filter header for block at height (cfheaders_base_height + i). + * For block at height h: + * vec_idx = h - cfheaders_base_height + * expected_fh = filter_headers[vec_idx] + * prev_fh = filter_headers[vec_idx - 1] (or genesis_filter_header when vec_idx == 0) + */ + uint256_t prev_fh; + uint32_t base = cfstate->cfheaders_base_height; + dogecoin_bool have_fh = cfstate->filter_headers_flat + ? (cfstate->filter_headers_flat_len > 0) + : (cfstate->filter_headers->len > 0); + if (filter_height <= base || !have_fh) { + memcpy(prev_fh, cfstate->genesis_filter_header, 32); + } else { + uint32_t prev_idx = filter_height - base - 1; + if (cfstate->filter_headers_flat) { + if (prev_idx < cfstate->filter_headers_flat_len) + memcpy(prev_fh, cfstate->filter_headers_flat + prev_idx * 32, 32); + else + memcpy(prev_fh, cfstate->cfheaders_tip_hash, 32); + } else { + if (prev_idx < cfstate->filter_headers->len) + memcpy(prev_fh, vector_idx(cfstate->filter_headers, prev_idx), 32); + else + memcpy(prev_fh, cfstate->cfheaders_tip_hash, 32); + } + } + + uint32_t vec_idx = (filter_height >= base) ? filter_height - base : UINT32_MAX; + uint256_t flat_fh; + uint256_t *expected_fh_ptr = NULL; + if (cfstate->filter_headers_flat) { + if (vec_idx < cfstate->filter_headers_flat_len) { + memcpy(flat_fh, cfstate->filter_headers_flat + vec_idx * 32, 32); + expected_fh_ptr = &flat_fh; + } + } else if (vec_idx < cfstate->filter_headers->len) { + expected_fh_ptr = (uint256_t *)vector_idx(cfstate->filter_headers, vec_idx); + } + if (expected_fh_ptr) { + uint256_t *expected_fh = expected_fh_ptr; + + if (dogecoin_compact_filter_validate(cfilter_msg.filter_data, prev_fh, *expected_fh)) { + { + /* Sequential mode: write immediately */ + cfstate->filters_tip_height = filter_height; + + if (client->cfilters_db) + dogecoin_cfilters_db_write(client->cfilters_db, + filter_height, + cfilter_msg.block_hash, + cfilter_msg.filter_data); + + /* Match watched scripts */ + if (cfstate->watched_scripts && cfstate->watched_scripts->len > 0) { + gcs_filter *gcs = gcs_filter_new(); + struct const_buffer fbuf = { cfilter_msg.filter_data->str, + cfilter_msg.filter_data->len }; + if (gcs_filter_deserialize(gcs, cfilter_msg.filter_type, + cfilter_msg.block_hash, &fbuf)) { + if (gcs_filter_match_any(gcs, cfstate->watched_scripts)) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] MATCH at height %u\n", filter_height); + uint256_t *matched_hash = dogecoin_calloc(1, sizeof(uint256_t)); + memcpy(matched_hash, cfilter_msg.block_hash, sizeof(uint256_t)); + vector_add(cfstate->matched_block_hashes, matched_hash); + uint32_t *matched_height = dogecoin_calloc(1, sizeof(uint32_t)); + *matched_height = filter_height; + vector_add(cfstate->matched_block_heights, matched_height); + } + } + gcs_filter_free(gcs); + } + + /* Request next batch when current is consumed */ + dogecoin_blockindex *cf_tip = + client->headers_db->getchaintip(client->headers_db_ctx); + if (cfstate->filters_tip_height >= cfstate->cfheaders_tip_height) { + if (client->nodegroup && client->nodegroup->log_write_cb) { + uint32_t scan_start = cfstate->cf_scan_start_height > 0 ? cfstate->cf_scan_start_height : 1; + client->nodegroup->log_write_cb( + "[bip157] all filters processed: scanned heights %u..%u, %u matched blocks [%us elapsed]\n", + scan_start, cfstate->filters_tip_height, + (unsigned int)cfstate->matched_block_hashes->len, + spv_elapsed(client)); + if (scan_start > 1) + client->nodegroup->log_write_cb( + "[bip157] WARNING: scan started at height %u (checkpoint), not genesis — " + "transactions before height %u are not covered; use --filter_hash_db for full history\n", + scan_start, scan_start); + } + cfstate->awaiting_response = false; + client->stateflags &= ~SPV_CFILTER_SYNC_FLAG; + if (cfstate->matched_block_hashes->len > 0) { + spv_cf_request_matched_blocks(client); + } else if (!client->called_sync_completed && client->sync_completed) { + if (client->smpv_enabled) dogecoin_net_spv_request_mempool(client); + client->sync_completed(client); + client->called_sync_completed = true; + } + } else if (cfstate->filters_tip_height >= cfstate->cfilter_batch_end) { + cfstate->awaiting_response = false; + dogecoin_spv_request_cfilters(client, node, + cfstate->filters_tip_height + 1, cf_tip->hash); + } + } + } else { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] filter at height %u FAILED validation\n", filter_height); + dogecoin_node_misbehave(node); + } + } + } + cfilter_handler_done:; + } else { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] failed to deserialize cfilter from node %d\n", node->nodeid); + } + dogecoin_cfilter_msg_free(&cfilter_msg); + } + } + + /* ================================================================ */ + /* BIP157: cfheaders response handler */ + /* ================================================================ */ + if (strcmp(hdr->command, DOGECOIN_MSG_CFHEADERS) == 0) + { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] received cfheaders from node %d\n", node->nodeid); + + if (!client->compact_filters_enabled || !client->cfilter_state) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] compact filters not enabled, ignoring cfheaders\n"); + } else { + dogecoin_cfheaders_msg cfh_msg; + dogecoin_cfheaders_msg_init(&cfh_msg); + + struct const_buffer deser_buf = { buf->p, buf->len }; + if (dogecoin_p2p_msg_cfheaders_deser(&cfh_msg, &deser_buf)) { + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] cfheaders: type=%u n_hashes=%u\n", + cfh_msg.filter_type, (unsigned int)cfh_msg.filter_hashes->len); + + uint256_t prev_header; + memcpy(prev_header, cfh_msg.prev_filter_header, 32); + uint32_t height = cfstate->cfheaders_tip_height; + + /* On the first cfheaders batch, prev_filter_header is the filter header + * immediately before our starting height — store it for cfilter validation + * and persist it so restarts don't need to re-download cfheaders. */ + if (cfstate->filter_headers->len == 0) { + memcpy(cfstate->genesis_filter_header, cfh_msg.prev_filter_header, 32); + if (client->cfheaders_db) + dogecoin_cfheaders_db_write_genesis(client->cfheaders_db, + cfh_msg.prev_filter_header); + } + + unsigned int i; + dogecoin_bool valid = true; + + for (i = 0; i < cfh_msg.filter_hashes->len; i++) { + uint256_t *filter_hash = (uint256_t *)vector_idx(cfh_msg.filter_hashes, i); + height++; + + /* filter_header = dbl_sha256(filter_hash || prev_header) */ + uint8_t combined[64]; + memcpy(combined, filter_hash, 32); + memcpy(combined + 32, prev_header, 32); + + uint256_t *new_header = dogecoin_calloc(1, sizeof(uint256_t)); + dogecoin_hash(combined, 64, *new_header); + + /* Validate against checkpoint if at a boundary. + * Dogecoin Core checkpoints are at heights 1000, 2000, ... + * cp_idx = height / CFCHECKPT_INTERVAL - 1: 1000→0, 2000→1, etc. */ + if (cfstate->checkpoints && cfstate->checkpoints->len > 0 && + height > 0 && (height % CFCHECKPT_INTERVAL) == 0) { + uint32_t cp_idx = (height / CFCHECKPT_INTERVAL) - 1; + if (cp_idx < cfstate->checkpoints->len) { + uint256_t *checkpoint = (uint256_t *)vector_idx(cfstate->checkpoints, cp_idx); + if (memcmp(*new_header, checkpoint, 32) != 0) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] cfheader at height %u does NOT match checkpoint!\n", height); + valid = false; + dogecoin_free(new_header); + break; + } + } + } + + vector_add(cfstate->filter_headers, new_header); + memcpy(prev_header, *new_header, 32); + + if (client->cf_export_enabled && + height > 0 && (height % CF_EXPORT_INTERVAL) == 0) { + char *hex = utils_uint8_to_hex(*new_header, 32); + printf("[cfcheckpt-export] { %u, \"%s\" },\n", height, hex); + fflush(stdout); + } + } + + if (valid) { + cfstate->cfheaders_tip_height = height; + memcpy(cfstate->cfheaders_tip_hash, prev_header, 32); + + if (client->cfheaders_db) + dogecoin_cfheaders_db_flush(client->cfheaders_db); + + dogecoin_blockindex *tip = client->headers_db->getchaintip(client->headers_db_ctx); + cfstate->awaiting_response = false; + if (height < (uint32_t)tip->height) { + dogecoin_spv_request_cfheaders(client, node, height + 1, tip->hash); + } else { + dogecoin_headers_db *hdb_cf = (dogecoin_headers_db *)client->headers_db_ctx; + uint32_t cf_scan_start = 1; + if (client->cf_start_height > 0) { + cf_scan_start = client->cf_start_height; + } else if (hdb_cf && hdb_cf->chainbottom && hdb_cf->chainbottom->height > 0) { + cf_scan_start = hdb_cf->chainbottom->height; + } + + /* Clamp to cfheaders_base_height: filters below that were scanned at startup. */ + if (cfstate->cfheaders_base_height > 0 && + cf_scan_start < cfstate->cfheaders_base_height) + cf_scan_start = cfstate->cfheaders_base_height; + + /* If startup rescan already covered the cached cfilter range, + * only download filters beyond that tip — avoids re-scanning + * heights that are already in matched_block_hashes. */ + if (cfstate->rescan_done && client->cfilters_db && + client->cfilters_db->tip_height > 0 && + cf_scan_start <= client->cfilters_db->tip_height) + cf_scan_start = client->cfilters_db->tip_height + 1; + + /* Rescan any cached filters stored before these scripts were registered. */ + spv_rescan_cached_cfilters(client, cf_scan_start); + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] all cfheaders received (tip=%u), starting cfilter scan from %u [%us elapsed]\n", + cfstate->cfheaders_tip_height, cf_scan_start, + spv_elapsed(client)); + + /* Record where the scan actually began. The completion log + * falls back to 1 when this is unset, which reported + * "scanned heights 1..tip" for a run that only covered the + * checkpoint tail -- overstating coverage in exactly the way + * that hides a gap. */ + cfstate->cf_scan_start_height = cf_scan_start; + cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; + dogecoin_spv_request_cfilters(client, node, cf_scan_start, tip->hash); + } + } else { + dogecoin_node_misbehave(node); + cfstate->awaiting_response = false; + } + } else { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] failed to deserialize cfheaders\n"); + } + dogecoin_cfheaders_msg_free(&cfh_msg); + } + } + + /* ================================================================ */ + /* BIP157: cfcheckpt response handler */ + /* ================================================================ */ + if (strcmp(hdr->command, DOGECOIN_MSG_CFCHECKPT) == 0) + { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] received cfcheckpt from node %d\n", node->nodeid); + + if (!client->compact_filters_enabled || !client->cfilter_state) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] compact filters not enabled, ignoring cfcheckpt\n"); + } else { + dogecoin_cfcheckpt_msg cfcp_msg; + dogecoin_cfcheckpt_msg_init(&cfcp_msg); + + struct const_buffer deser_buf = { buf->p, buf->len }; + if (dogecoin_p2p_msg_cfcheckpt_deser(&cfcp_msg, &deser_buf)) { + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] cfcheckpt: type=%u n_checkpoints=%u\n", + cfcp_msg.filter_type, (unsigned int)cfcp_msg.filter_headers->len); + + if (cfstate->checkpoints) { + vector_free(cfstate->checkpoints, true); + } + cfstate->checkpoints = vector_new(cfcp_msg.filter_headers->len, dogecoin_free); + + unsigned int i; + for (i = 0; i < cfcp_msg.filter_headers->len; i++) { + uint256_t *cp = dogecoin_calloc(1, sizeof(uint256_t)); + memcpy(cp, vector_idx(cfcp_msg.filter_headers, i), 32); + vector_add(cfstate->checkpoints, cp); + } + + if (!dogecoin_cf_validate_checkpoints(client->chainparams, cfstate->checkpoints)) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] cfcheckpt FAILED hardcoded validation — misbehaving node %d\n", node->nodeid); + dogecoin_node_misbehave(node); + dogecoin_cfcheckpt_msg_free(&cfcp_msg); + return; + } + + /* Export checkpoint filter headers directly from cfcheckpt response. + * Checkpoints are at heights 999, 1999, 2999 ... (cp_idx * 1000 + 999). */ + /* Export filter headers directly from cfcheckpt response. + * Dogecoin Core checkpoints are at heights 1000, 2000, ... + * peer_checkpoints[i] = filter header at height (i+1)*CFCHECKPT_INTERVAL. */ + if (client->cf_export_enabled) { + printf("[cfcheckpt-export] /* Dogecoin Core cfcheckpt: %u entries */\n", + (unsigned int)cfcp_msg.filter_headers->len); + for (unsigned int ci = 0; ci < (unsigned int)cfcp_msg.filter_headers->len; ci++) { + uint32_t cp_height = (ci + 1) * CFCHECKPT_INTERVAL; + uint256_t *fh = (uint256_t *)vector_idx(cfcp_msg.filter_headers, ci); + /* P2P bytes are LE; chainparams.c uses big-endian display (same as RPC). + * Reverse the 32 bytes before hex-encoding. */ + uint8_t reversed[32]; + for (int ri = 0; ri < 32; ri++) reversed[ri] = (*fh)[31 - ri]; + char *hex = utils_uint8_to_hex(reversed, 32); + printf("[cfcheckpt-export] { %u, \"%s\" },\n", cp_height, hex); + fflush(stdout); + } + printf("[cfcheckpt-export] /* end */\n"); + fflush(stdout); + } + + dogecoin_blockindex *tip = client->headers_db->getchaintip(client->headers_db_ctx); + + /* Determine where cfheaders download starts. + * cf_start_height overrides everything (set via --cf-from-genesis or API). + * Otherwise: start at chainbottom (checkpoint-based sync) unless an aux + * hash-lookup DB is available, in which case we can go back to genesis. */ + uint32_t cfh_start; + if (client->cf_start_height > 0) { + cfh_start = client->cf_start_height; + } else if (client->aux_hash_db && client->aux_hash_db_ctx) { + /* aux DB covers early heights — download filters from genesis. */ + cfh_start = 1; + } else { + dogecoin_headers_db *hdb = (dogecoin_headers_db *)client->headers_db_ctx; + cfh_start = (hdb && hdb->chainbottom && hdb->chainbottom->height > 0) + ? hdb->chainbottom->height : 1; + } + + /* Use cfheaders already loaded from disk if they are valid and cover + * the needed range. The v2 DB stores genesis_filter_header so we can + * validate cfilters without re-downloading all cfheaders. */ + uint8_t gfh_zeros[32]; + memset(gfh_zeros, 0, 32); + dogecoin_bool genesis_valid = + (memcmp(cfstate->genesis_filter_header, gfh_zeros, 32) != 0); + /* base_height <= cfh_start matters: the loaded range has to start at or + * below where we want filters from, because the resume path can only + * append forward and cannot fill a gap *below* the loaded base. + * + * A gap *above* the loaded tip is not a reason to discard anything -- + * that is precisely what resuming is for. Requiring + * cfheaders_tip_height >= cfh_start - 1 here meant that whenever the + * on-disk cfheaders stopped short of cfh_start, the whole cache was + * declared unusable and the fresh-start branch below wiped it, along + * with genesis_filter_header -- after which every subsequent cfilter + * failed validation. That is the normal case with -p/--checkpoint, + * where cfh_start comes from chainbottom near the chain tip while the + * cfheaders file legitimately ends wherever the last sync stopped: + * headers 1..6269574 on disk against a cfh_start of 6311582 threw away + * 6.27M valid headers to re-download a 42k-block gap. */ + dogecoin_bool have_loaded = + (cfstate->filter_headers->len > 0 && + cfstate->cfheaders_base_height > 0 && + cfstate->cfheaders_base_height <= cfh_start); + + if (have_loaded && genesis_valid) { + uint32_t cfh_resume = cfstate->cfheaders_tip_height + 1; + if (cfh_resume > (uint32_t)tip->height) { + /* cfheaders already at chain tip: skip directly to cfilters */ + dogecoin_headers_db *hdb_cf = (dogecoin_headers_db *)client->headers_db_ctx; + uint32_t cf_scan_start = 1; + if (client->cf_start_height > 0) { + cf_scan_start = client->cf_start_height; + } else if (hdb_cf && hdb_cf->chainbottom && hdb_cf->chainbottom->height > 0) { + cf_scan_start = hdb_cf->chainbottom->height; + } + /* Clamp to cfheaders_base_height: filters below that were scanned at startup. */ + if (cfstate->cfheaders_base_height > 0 && + cf_scan_start < cfstate->cfheaders_base_height) + cf_scan_start = cfstate->cfheaders_base_height; + /* If startup rescan already covered the cached cfilter range, + * only download filters beyond that tip. */ + if (cfstate->rescan_done && client->cfilters_db && + client->cfilters_db->tip_height > 0 && + cf_scan_start <= client->cfilters_db->tip_height) + cf_scan_start = client->cfilters_db->tip_height + 1; + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] cfheaders at tip (base=%u tip=%u), starting cfilter scan from %u [%us elapsed]\n", + cfstate->cfheaders_base_height, cfstate->cfheaders_tip_height, + cf_scan_start, + spv_elapsed(client)); + cfstate->cf_scan_start_height = cf_scan_start; + cfstate->awaiting_response = false; + cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; + dogecoin_spv_request_cfilters(client, node, cf_scan_start, tip->hash); + } else { + /* Resume cfheaders download from where the DB left off */ + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] resuming cfheaders from %u (base=%u disk_tip=%u) [%us elapsed]\n", + cfh_resume, cfstate->cfheaders_base_height, + cfstate->cfheaders_tip_height, spv_elapsed(client)); + cfstate->awaiting_response = false; + dogecoin_spv_request_cfheaders(client, node, cfh_resume, tip->hash); + } + } else { + /* Fresh start: clear any stale loaded data and re-download */ + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] cfheaders fresh start at height %u [%us elapsed]\n", + cfh_start, spv_elapsed(client)); + if (cfstate->filter_headers->len > 0) { + vector_free(cfstate->filter_headers, true); + cfstate->filter_headers = vector_new(4096, dogecoin_free); + } + if (cfstate->filter_headers_flat) { + dogecoin_free(cfstate->filter_headers_flat); + cfstate->filter_headers_flat = NULL; + cfstate->filter_headers_flat_len = 0; + } + dogecoin_mem_zero(cfstate->cfheaders_tip_hash, sizeof(uint256_t)); + dogecoin_mem_zero(cfstate->genesis_filter_header, sizeof(uint256_t)); + cfstate->cfheaders_tip_height = (cfh_start > 1) ? cfh_start - 1 : 0; + cfstate->cfheaders_base_height = cfh_start; + if (client->cfheaders_db) + dogecoin_cfheaders_db_reset(client->cfheaders_db); + cfstate->awaiting_response = false; + dogecoin_spv_request_cfheaders(client, node, cfh_start, tip->hash); + } + } else { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] failed to deserialize cfcheckpt\n"); + } + dogecoin_cfcheckpt_msg_free(&cfcp_msg); + } + } + + // Check for a 'Q' or 'q' on stdin, to quit. +#ifdef _WIN32 + if (_kbhit()) { + char c = fgetc(stdin); + if (c == 'Q' || c == 'q') { + printf("Disconnecting...\n"); + dogecoin_node_group_shutdown(client->nodegroup); + + // exit the event loop immediately + if (client->nodegroup && client->nodegroup->event_base) + event_base_loopbreak(client->nodegroup->event_base); + } + } +#else + char c = fgetc(stdin); + if (c == 'Q' || c == 'q') { + // Reset standard input back to blocking mode + int stdin_flags = fcntl(STDIN_FILENO, F_GETFL); + fcntl(STDIN_FILENO, F_SETFL, stdin_flags & ~O_NONBLOCK); + + printf("Disconnecting...\n"); + dogecoin_node_group_shutdown(client->nodegroup); + + // exit the event loop immediately + if (client->nodegroup && client->nodegroup->event_base) + event_base_loopbreak(client->nodegroup->event_base); + } +#endif } static void smpv_tx_cb(const dogecoin_smpv_tx* tx, const char* addr, void* user) @@ -2450,6 +3557,25 @@ LIBDOGECOIN_API dogecoin_bool dogecoin_spv_client_filterload( { if (!client || !filter || filter_len == 0) return false; + /* BIP37 and BIP157 are mutually exclusive, and this is a privacy control, + * not an optimisation: a FILTERLOAD hands the peer a bloom filter of the + * exact scripts being watched, which is the fingerprint compact filters + * exist to avoid. Compact filters are enabled by default, so silently + * honouring a filterload here would leak the wallet to every connected + * peer of a client that chose BIP157 precisely to prevent that. Fail + * closed and send nothing; callers wanting BIP37 must first disable + * compact filters via dogecoin_spv_enable_compact_filters(client, false). + * dogecoin_spv_client_filteradd() applies the same rule. */ + if (client->compact_filters_enabled) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[spv] refusing filterload: compact filters (BIP157) are enabled; " + "a BIP37 bloom filter would leak the watched scripts to peers. " + "To use BIP37 anyway, call dogecoin_spv_enable_compact_filters(client, false) " + "first (spvnode: -e/--no_cfilters).\n"); + return false; + } + if (client->bloom_filter) { dogecoin_free(client->bloom_filter); client->bloom_filter = NULL; @@ -2485,6 +3611,16 @@ LIBDOGECOIN_API dogecoin_bool dogecoin_spv_client_filteradd( uint32_t data_len) { if (!client || !data || data_len == 0) return false; + + /* BIP157: populate watched_scripts for compact filter matching */ + if (client->compact_filters_enabled && client->cfilter_state && + client->cfilter_state->watched_scripts) { + cstring *script = cstr_new_buf(data, data_len); + if (script) + vector_add(client->cfilter_state->watched_scripts, script); + return true; /* skip BIP37 bloom filter and P2P FILTERADD when using compact filters */ + } + if (client->bloom_filter && client->bloom_filter_len > 0) { dogecoin_bip37_filter local_filter; memset(&local_filter, 0, sizeof(local_filter)); @@ -2563,3 +3699,246 @@ LIBDOGECOIN_API dogecoin_bool dogecoin_spv_client_filterclear(dogecoin_spv_clien return true; } + +/* ================================================================ */ +/* BIP157: enable/disable compact filter sync */ +/* ================================================================ */ +LIBDOGECOIN_API void dogecoin_spv_enable_compact_filters(dogecoin_spv_client *client, dogecoin_bool enable) +{ + if (!client) return; + + if (enable && !client->compact_filters_enabled) { + client->cfilter_state = dogecoin_compact_filter_state_new(); + if (client->cfilter_state) { + client->cfilter_state->enabled = true; + client->compact_filters_enabled = true; + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] compact filter sync enabled\n"); + } + return; + } + + if (!enable && client->compact_filters_enabled) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] compact filter sync disabled\n"); + if (client->cfilter_state) { + dogecoin_compact_filter_state_free(client->cfilter_state); + client->cfilter_state = NULL; + } + client->compact_filters_enabled = false; + } +} + +/* ================================================================ */ +/* BIP157: request helper functions */ +/* ================================================================ */ + +/* Find the first block-header checkpoint at height >= target_height and write + * its hash in P2P (internal LE) byte order to hash_out. + * Returns the checkpoint height, or 0 if no suitable checkpoint exists. */ +static uint32_t cf_find_checkpoint_stop(const dogecoin_chainparams *params, + uint32_t target_height, uint256_t hash_out) +{ + const dogecoin_checkpoint *arr = NULL; + size_t cnt = 0; + if (!params) return 0; + if (strcmp(params->chainname, "main") == 0) { + arr = dogecoin_mainnet_checkpoint_array; + cnt = sizeof(dogecoin_mainnet_checkpoint_array) / sizeof(dogecoin_mainnet_checkpoint_array[0]); + } else if (strcmp(params->chainname, "test") == 0) { + arr = dogecoin_testnet_checkpoint_array; + cnt = sizeof(dogecoin_testnet_checkpoint_array) / sizeof(dogecoin_testnet_checkpoint_array[0]); + } + for (size_t i = 0; i < cnt; i++) { + if (arr[i].height >= target_height) { + /* chainparams hashes are display-order hex; utils_uint256_sethex reverses to LE */ + utils_uint256_sethex((char *)arr[i].hash, hash_out); + return arr[i].height; + } + } + return 0; +} + +LIBDOGECOIN_API dogecoin_bool dogecoin_spv_request_cfcheckpt(dogecoin_spv_client *client, dogecoin_node *node) +{ + if (!client || !node || !client->cfilter_state) return false; + + dogecoin_blockindex *tip = client->headers_db->getchaintip(client->headers_db_ctx); + if (!tip) return false; + + dogecoin_getcfcheckpt_msg msg; + msg.filter_type = GCS_BASIC_FILTER_TYPE; + memcpy(msg.stop_hash, tip->hash, sizeof(uint256_t)); + + cstring *payload = cstr_new_sz(64); + dogecoin_p2p_msg_getcfcheckpt_ser(&msg, payload); + + cstring *p2p_msg = dogecoin_p2p_message_new( + node->nodegroup->chainparams->netmagic, + DOGECOIN_MSG_GETCFCHECKPT, + payload->str, payload->len); + cstr_free(payload, true); + dogecoin_node_send(node, p2p_msg); + cstr_free(p2p_msg, true); + + client->cfilter_state->awaiting_response = true; + client->cfilter_state->last_request_time = (uint64_t)time(NULL); + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] sent getcfcheckpt to node %d\n", node->nodeid); + return true; +} + +LIBDOGECOIN_API dogecoin_bool dogecoin_spv_request_cfheaders(dogecoin_spv_client *client, dogecoin_node *node, uint32_t start_height, const uint256_t stop_hash) +{ + if (!client || !node || !client->cfilter_state) return false; + + dogecoin_blockindex *tip = client->headers_db->getchaintip(client->headers_db_ctx); + if (!tip) return false; + + uint32_t tip_height = (uint32_t)tip->height; + + /* BIP157: servers reject requests with stop_height - start_height >= MAX_GETCFHEADERS_SIZE. + * Clamp the stop to one batch of MAX_GETCFHEADERS_SIZE filter headers. */ + uint32_t batch_stop_height = start_height + MAX_GETCFHEADERS_SIZE - 1; + if (batch_stop_height >= tip_height) + batch_stop_height = tip_height; + + uint256_t batch_stop_hash; + if (batch_stop_height == tip_height) { + /* Last (or only) batch ends exactly at the tip. */ + memcpy(batch_stop_hash, tip->hash, sizeof(uint256_t)); + } else { + /* Find the block hash at batch_stop_height. + * Try the in-memory prev chain first; fall back to a file scan. */ + dogecoin_headers_db *hdb = (dogecoin_headers_db *)client->headers_db_ctx; + if (!dogecoin_headers_db_get_block_hash_at_height(hdb, batch_stop_height, batch_stop_hash)) { + /* Primary DB miss — try aux hash-lookup DB (genesis headers for filter IBD). */ + dogecoin_bool aux_found = false; + if (client->aux_hash_db && client->aux_hash_db_ctx) { + dogecoin_headers_db *aux = (dogecoin_headers_db *)client->aux_hash_db_ctx; + aux_found = dogecoin_headers_db_get_block_hash_at_height(aux, batch_stop_height, batch_stop_hash); + } + if (!aux_found) { + uint32_t cp_h = cf_find_checkpoint_stop(client->chainparams, + batch_stop_height, batch_stop_hash); + if (cp_h > 0) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] getcfheaders: no hash at %u, using checkpoint %u\n", + batch_stop_height, cp_h); + batch_stop_height = cp_h; + } else { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] getcfheaders: cannot find hash at height %u, using tip\n", + batch_stop_height); + memcpy(batch_stop_hash, tip->hash, sizeof(uint256_t)); + batch_stop_height = tip_height; + } + } + } + } + + dogecoin_getcfheaders_msg msg; + msg.filter_type = GCS_BASIC_FILTER_TYPE; + msg.start_height = start_height; + memcpy(msg.stop_hash, batch_stop_hash, sizeof(uint256_t)); + + cstring *payload = cstr_new_sz(64); + dogecoin_p2p_msg_getcfheaders_ser(&msg, payload); + + cstring *p2p_msg = dogecoin_p2p_message_new( + node->nodegroup->chainparams->netmagic, + DOGECOIN_MSG_GETCFHEADERS, + payload->str, payload->len); + cstr_free(payload, true); + dogecoin_node_send(node, p2p_msg); + cstr_free(p2p_msg, true); + + client->cfilter_state->awaiting_response = true; + client->cfilter_state->last_request_time = (uint64_t)time(NULL); + client->cfilter_state->pending_start_height = start_height; + memcpy(client->cfilter_state->pending_stop_hash, batch_stop_hash, sizeof(uint256_t)); + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] sent getcfheaders (start=%u stop_height=%u) to node %d [%us elapsed]\n", + start_height, batch_stop_height, node->nodeid, spv_elapsed(client)); + return true; +} + +LIBDOGECOIN_API dogecoin_bool dogecoin_spv_request_cfilters(dogecoin_spv_client *client, dogecoin_node *node, uint32_t start_height, const uint256_t stop_hash) +{ + if (!client || !node || !client->cfilter_state) return false; + + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + uint32_t cfheaders_tip = cfstate->cfheaders_tip_height; + + /* BIP157: servers reject requests with stop_height - start_height >= MAX_GETCFILTERS_SIZE. + * Clamp the batch to at most MAX_GETCFILTERS_SIZE cfilters. */ + uint32_t batch_end = start_height + MAX_GETCFILTERS_SIZE - 1; + if (cfheaders_tip > 0 && batch_end > cfheaders_tip) + batch_end = cfheaders_tip; + + /* Find the block hash at batch_end. */ + uint256_t batch_stop_hash; + dogecoin_blockindex *tip = client->headers_db->getchaintip(client->headers_db_ctx); + if (tip && batch_end == (uint32_t)tip->height) { + memcpy(batch_stop_hash, tip->hash, sizeof(uint256_t)); + } else { + dogecoin_headers_db *hdb = (dogecoin_headers_db *)client->headers_db_ctx; + if (!dogecoin_headers_db_get_block_hash_at_height(hdb, batch_end, batch_stop_hash)) { + /* Primary DB miss — try aux hash-lookup DB (genesis headers for filter IBD). */ + dogecoin_bool aux_found = false; + if (client->aux_hash_db && client->aux_hash_db_ctx) { + dogecoin_headers_db *aux = (dogecoin_headers_db *)client->aux_hash_db_ctx; + aux_found = dogecoin_headers_db_get_block_hash_at_height(aux, batch_end, batch_stop_hash); + } + if (!aux_found) { + uint32_t cp_h = cf_find_checkpoint_stop(client->chainparams, + batch_end, batch_stop_hash); + if (cp_h > 0) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] getcfilters: no hash at %u, using checkpoint %u\n", + batch_end, cp_h); + batch_end = cp_h; + } else { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] getcfilters: cannot find hash at height %u, using tip\n", + batch_end); + memcpy(batch_stop_hash, stop_hash, sizeof(uint256_t)); + if (tip) batch_end = (uint32_t)tip->height; + } + } + } + } + + dogecoin_getcfilters_msg msg; + msg.filter_type = GCS_BASIC_FILTER_TYPE; + msg.start_height = start_height; + memcpy(msg.stop_hash, batch_stop_hash, sizeof(uint256_t)); + + cstring *payload = cstr_new_sz(64); + dogecoin_p2p_msg_getcfilters_ser(&msg, payload); + + cstring *p2p_msg = dogecoin_p2p_message_new( + node->nodegroup->chainparams->netmagic, + DOGECOIN_MSG_GETCFILTERS, + payload->str, payload->len); + cstr_free(payload, true); + dogecoin_node_send(node, p2p_msg); + cstr_free(p2p_msg, true); + + cfstate->cfilter_batch_end = batch_end; + cfstate->awaiting_response = true; + cfstate->last_request_time = (uint64_t)time(NULL); + cfstate->pending_start_height = start_height; + memcpy(cfstate->pending_stop_hash, batch_stop_hash, sizeof(uint256_t)); + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] sent getcfilters (start=%u..%u) to node %d [%us elapsed]\n", + start_height, batch_end, node->nodeid, spv_elapsed(client)); + return true; +} diff --git a/test/spv_tests.c b/test/spv_tests.c index 797e27af2..a5eed15da 100644 --- a/test/spv_tests.c +++ b/test/spv_tests.c @@ -598,6 +598,14 @@ void test_bip37_filter_state() dogecoin_spv_client* client = dogecoin_spv_client_new(&dogecoin_chainparams_main, false, true, false, false, 1, NULL); u_assert_true(client != NULL); + /* BIP37 and BIP157 are mutually exclusive for privacy reasons: a bloom + * filter leaks the watched scripts to peers, which is what compact filters + * avoid. Compact filters are on by default, and filterload fails closed + * while they are, so a BIP37 consumer must opt out explicitly first. */ + u_assert_true(!dogecoin_spv_client_filterload(client, (const uint8_t[]){0xaa}, 1, 1, 0, 0)); + dogecoin_spv_enable_compact_filters(client, false); + u_assert_true(!client->compact_filters_enabled); + uint8_t filter[3] = {0xaa, 0xbb, 0xcc}; u_assert_true(dogecoin_spv_client_filterload(client, filter, sizeof(filter), 2, 123, 1)); u_assert_true(client->bloom_filter != NULL); From 1783b46d592b567504ef3eb2bc1eb54bb67df7cc Mon Sep 17 00:00:00 2001 From: bluezr Date: Sun, 2 Aug 2026 15:51:10 -0700 Subject: [PATCH 10/12] cli: wire compact filters into spvnode Connects the BIP157 client to the command line, which is what makes the feature reachable by a user rather than only by the library API. -a/--address registers the address as a watched script with the filter state, so cfilters are matched against it -e/--no_cfilters disables compact filters, the documented opt-out for a consumer that wants BIP37 instead -o logs filter header checkpoints during sync --cfheaders_path override cfheaders.dat location --cfilters_path override cfilters.dat location wallet gains dogecoin_wallet_add_watchonly_addr so a watched address is persisted without a private key. It follows the existing add-address path exactly, including that dogecoin_address_to_pubkey_hash returns a pointer into a static buffer and is not freed by its existing caller either. Deliberately excluded, because each is the seam with another feature and not the CLI's to own: --cf_from_genesis, --genesis_headers, --filter_hash_db, --cf_workers --genesis_headers is the clearest case. It calls dogecoin_spv_client_enable_genesis_headers, which initialises par_hdr *and* resets cf_start_height and clears the CF databases -- one function spanning parallel header download and compact filters. Exposing it here would pull #378 into this PR. The peer-list replication that gave each parallel worker its own TCP connection goes with them. End to end against a local 1.14.99 node serving BIP157, run with an isolated HOME so the real filter cache was untouched: [bip157] watching address: DJoQKLWJtM251NhzsR7DmbgT88TwqBbPX7 [bip157] MATCH at height 6315000 [bip157] all filters processed: scanned heights 6314418..6315859, 1 matched blocks [bip157] requesting 1 matched full blocks across 1 peers [bip157] processing 2 txs from matched block height=6315000 1442 cfilters parsed off the wire, zero validation errors. The address was taken from block 6315000 via getrawtransaction before the run, so the matched height was predicted rather than read back afterwards. This closes the gap left open in the spv layer, where -a was not yet wired to the filter state and so GCS matching was never exercised end to end. WITH_NET=ON with -DBUILD_SHARED_LIBS=1: 81/81. WITH_NET=OFF: 74/74. --- include/dogecoin/wallet.h | 1 + src/cli/spvnode.c | 186 +++++++++++++++++++++++++++++++++++++- src/wallet.c | 36 ++++++++ 3 files changed, 219 insertions(+), 4 deletions(-) diff --git a/include/dogecoin/wallet.h b/include/dogecoin/wallet.h index 22f028dac..1abc0ca52 100644 --- a/include/dogecoin/wallet.h +++ b/include/dogecoin/wallet.h @@ -202,6 +202,7 @@ LIBDOGECOIN_API int dogecoin_wallet_add_hd_account_ts(dogecoin_wallet* wallet, u LIBDOGECOIN_API int dogecoin_wallet_get_address_ts(dogecoin_wallet* wallet, char* address, size_t len, uint32_t account, uint32_t index, dogecoin_bool change); LIBDOGECOIN_API dogecoin_bool dogecoin_p2pkh_address_to_wallet_pubkeyhash(const char* address_in, dogecoin_wallet_addr* addr, dogecoin_wallet* wallet); LIBDOGECOIN_API dogecoin_wallet_addr* dogecoin_p2pkh_address_to_wallet(const char* address_in, dogecoin_wallet* wallet); +LIBDOGECOIN_API dogecoin_bool dogecoin_wallet_add_watchonly_addr(dogecoin_wallet* wallet, const char* address_in); /** writes all available addresses (P2PKH) to the addr_out vector_t */ LIBDOGECOIN_API void dogecoin_wallet_get_addresses(dogecoin_wallet* wallet, vector_t* addr_out); diff --git a/src/cli/spvnode.c b/src/cli/spvnode.c index 1d17a1659..b50dae9db 100644 --- a/src/cli/spvnode.c +++ b/src/cli/spvnode.c @@ -179,7 +179,8 @@ become_daemon(int flags) static struct option long_options[] = { {"testnet", no_argument, NULL, 't'}, {"regtest", no_argument, NULL, 'r'}, - {"ips", no_argument, NULL, 'i'}, + {"ips", required_argument, NULL, 'i'}, + {"host", required_argument, NULL, 'i'}, {"debug", no_argument, NULL, 'd'}, {"maxnodes", no_argument, NULL, 'm'}, {"mnemonic", no_argument, NULL, 'n'}, @@ -200,6 +201,11 @@ static struct option long_options[] = { {"filtered_blocks", no_argument, NULL, 'g'}, {"select_checkpoint", no_argument, NULL, 'q'}, {"daemon", no_argument, NULL, 'z'}, + {"no_cfilters", no_argument, NULL, 'e'}, + {"export_cfcheckpts", no_argument, NULL, 'o'}, + {"logfile", required_argument, NULL, 'L'}, + {"cfheaders_path", required_argument, NULL, 257}, + {"cfilters_path", required_argument, NULL, 258}, {NULL, 0, NULL, 0} }; /** @@ -214,7 +220,7 @@ static void print_version() { */ static void print_usage() { print_version(); - printf("Usage: spvnode (-c|continuous) (-i|--ips ) (-m[--maxpeers] ) (-f ) \ + printf("Usage: spvnode (-c|continuous) (-i|--ips|-H|--host ) (-m[--maxpeers] ) (-f ) \ (-a|--address
) (-n|--mnemonic ) (-s|[--pass_phrase]) (-y|--encrypted_file ) \ (-w|--wallet_file ) (-h|--headers_file ) (-l|[--no_prompt]) (-b[--full_sync]) (-p[--checkpoint]) (-k[--master_key]) (-j[--use_tpm]) \ (-u|--http_server ) (-x|--smpv) (-g|--filtered_blocks) (-q|--select_checkpoint) (-t|--testnet) (-r|--regtest) (-d|--debug) \n"); @@ -281,6 +287,34 @@ dogecoin_bool spv_header_message_processed(struct dogecoin_spv_client_* client, } static dogecoin_bool quit_when_synced = true; +static FILE *g_logfile = NULL; + +static int spvnode_log_file(const char* format, ...) { + if (!g_logfile) return 0; + va_list args; + va_start(args, format); + fprintf(g_logfile, "DEBUG: "); + vfprintf(g_logfile, format, args); + va_end(args); + fflush(g_logfile); + return 1; +} + +static int spvnode_log_both(const char* format, ...) { + va_list args, args2; + va_start(args, format); + va_copy(args2, args); + printf("DEBUG: "); + vprintf(format, args); + va_end(args); + if (g_logfile) { + fprintf(g_logfile, "DEBUG: "); + vfprintf(g_logfile, format, args2); + fflush(g_logfile); + } + va_end(args2); + return 1; +} static dogecoin_bool spv_enable_filtered_blocks = false; static dogecoin_bool spv_select_checkpoint = false; static int spv_filter_oldest_utxo_height = 0; @@ -478,7 +512,12 @@ int main(int argc, char* argv[]) { char* http_server = NULL; int file_num = NO_FILE; dogecoin_bool smpv_cli_enable = false; + dogecoin_bool no_cfilters = false; + dogecoin_bool export_cfcheckpts = false; int selected_checkpoint_index = -1; + char* logfile = NULL; + char* cfheaders_path = NULL; + char* cfilters_path = NULL; if (argc <= 1 || strlen(argv[argc - 1]) == 0 || argv[argc - 1][0] == '-') { /* exit if no command was provided */ print_usage(); @@ -487,7 +526,7 @@ int main(int argc, char* argv[]) { data = argv[argc - 1]; /* get arguments */ - while ((opt = getopt_long_only(argc, argv, "i:ctrdsm:n:f:y:u:w:h:a:lbpzkj:xgq", long_options, &long_index)) != -1) { + while ((opt = getopt_long_only(argc, argv, "i:ctrdsm:n:f:y:u:w:h:a:lbpzkj:xgqeoL:", long_options, &long_index)) != -1) { switch (opt) { case 'c': quit_when_synced = false; @@ -568,6 +607,21 @@ int main(int argc, char* argv[]) { spv_select_checkpoint = true; use_checkpoint = true; break; + case 'e': + no_cfilters = true; + break; + case 'o': + export_cfcheckpts = true; + break; + case 'L': + logfile = optarg; + break; + case 257: + cfheaders_path = optarg; + break; + case 258: + cfilters_path = optarg; + break; default: print_usage(); exit(EXIT_FAILURE); @@ -580,6 +634,15 @@ int main(int argc, char* argv[]) { in_memory_headers = (dbfile && ((strcmp(dbfile, "0") == 0) || (strcmp(dbfile, "no") == 0))); dogecoin_spv_client* client = dogecoin_spv_client_new(chain, debug, in_memory_headers, use_checkpoint, full_sync, maxnodes, http_server); + if (logfile) { + g_logfile = fopen(logfile, "a"); + if (!g_logfile) { + fprintf(stderr, "Cannot open logfile '%s': %s\n", logfile, strerror(errno)); + } else { + client->nodegroup->log_write_cb = debug ? spvnode_log_both : spvnode_log_file; + } + } + if (http_server) { evhttp_set_gencb(client->nodegroup->http_server, dogecoin_http_request_cb, client); } @@ -587,6 +650,30 @@ int main(int argc, char* argv[]) { dogecoin_spv_enable_smpv(client, true); printf("[smpv] enabled via CLI flag\n"); } + if (cfheaders_path) + client->cfheaders_path = strdup(cfheaders_path); + if (cfilters_path) + client->cfilters_path = strdup(cfilters_path); + + if (no_cfilters || full_sync) { + /* Disable BIP157 compact filter sync when: + * - user explicitly passed --no_cfilters (-e) + * - full_sync (-b) is requested: we need full blocks anyway, + * and Dogecoin peers don't advertise NODE_COMPACT_FILTERS yet, + * so BIP157 sync would stall indefinitely. */ + dogecoin_spv_enable_compact_filters(client, false); + if (no_cfilters) { + printf("[bip157] compact filters disabled via CLI flag (--no_cfilters)\n"); + } else { + printf("[bip157] compact filters disabled (full_sync mode uses direct block download)\n"); + } + } else { + printf("[bip157] compact block filters enabled (default)\n"); + } + if (export_cfcheckpts) { + client->cf_export_enabled = true; + printf("[bip157] filter header checkpoint export enabled; lines prefixed '[cfcheckpt-export]' will appear as headers sync\n"); + } client->header_message_processed = spv_header_message_processed; client->sync_completed = spv_sync_completed; #if WITH_WALLET @@ -657,7 +744,20 @@ int main(int argc, char* argv[]) { } /* Optional BIP37 filter setup using filterload with fixed-size bloom. */ - if (spv_enable_filtered_blocks && (wallet->waddr_vector->len > 0 || HASH_COUNT(wallet->utxos) > 0)) { + if (spv_enable_filtered_blocks && client->compact_filters_enabled) { + /* BIP37 and BIP157 are mutually exclusive here, for privacy: a bloom + * filter hands the watched scripts to every peer, which is exactly what + * compact filters avoid. Compact filters are on by default, so -g on + * its own is a contradiction; dogecoin_spv_client_filterload() fails + * closed in that state. Say why here -- its explanation goes through + * the nodegroup logger, which is not printing this early, so the user + * would otherwise see only an unexplained "Failed to send filterload". */ + printf("-g/--filtered_blocks (BIP37) needs -e/--no_cfilters.\n" + "A BIP37 bloom filter would leak the watched addresses to peers, which is\n" + "what compact filters (BIP157, enabled by default) exist to prevent, so the\n" + "two are mutually exclusive. Re-run with -e to use BIP37, or drop -g to use\n" + "compact filters.\n"); + } else if (spv_enable_filtered_blocks && (wallet->waddr_vector->len > 0 || HASH_COUNT(wallet->utxos) > 0)) { dogecoin_bip37_filter* filter = dogecoin_bip37_filter_new(0, 1); /* random tweak, UPDATE_ALL */ if (!filter) { printf("Failed to initialize BIP37 bloom filter\n"); @@ -715,6 +815,71 @@ int main(int argc, char* argv[]) { printf("Filtered block mode disabled (use -g/--filtered_blocks to enable)\n"); } + /* BIP157 compact-filter address watching: add each wallet address's + * P2PKH scriptPubKey via filteradd so cfilters are matched against + * real wallet outputs. Two sources: + * 1. waddr_vector — HD-derived keys controlled by this wallet. + * 2. wallet->utxos — previously discovered UTXOs whose script_pubkey + * may cover watch-only or externally-derived addresses not present + * in waddr_vector. */ + if (client->compact_filters_enabled) { + unsigned int wi; + for (wi = 0; wi < wallet->waddr_vector->len; wi++) { + dogecoin_wallet_addr* waddr = vector_idx(wallet->waddr_vector, wi); + if (!waddr || waddr->ignore) continue; + /* P2PKH scriptPubKey: OP_DUP OP_HASH160 <20-byte hash> OP_EQUALVERIFY OP_CHECKSIG */ + uint8_t spk[25]; + spk[0] = 0x76; /* OP_DUP */ + spk[1] = 0xa9; /* OP_HASH160 */ + spk[2] = 0x14; /* push 20 bytes */ + memcpy(spk + 3, waddr->pubkeyhash, sizeof(uint160_t)); + spk[23] = 0x88; /* OP_EQUALVERIFY */ + spk[24] = 0xac; /* OP_CHECKSIG */ + dogecoin_spv_client_filteradd(client, spk, sizeof(spk)); + char addr_str[P2PKHLEN]; + if (dogecoin_p2pkh_addr_from_hash160(waddr->pubkeyhash, chain, addr_str, sizeof(addr_str))) { + printf("[bip157] watching address: %s\n", addr_str); + } + } + /* Also watch addresses supplied via -a/--address on the CLI. */ + if (address && address[0] != '\0') { + char* addr_copy = strdup(address); + char* saveptr = NULL; + char* tok = strtok_r(addr_copy, " ", &saveptr); + while (tok) { + uint8_t dec[64]; + size_t dec_len = dogecoin_base58_decode_check(tok, dec, sizeof(dec)); + if (dec_len == 21) { /* 1-byte version + 20-byte hash160 */ + uint8_t spk[25]; + spk[0] = 0x76; /* OP_DUP */ + spk[1] = 0xa9; /* OP_HASH160 */ + spk[2] = 0x14; /* push 20 bytes */ + memcpy(spk + 3, dec + 1, 20); + spk[23] = 0x88; /* OP_EQUALVERIFY */ + spk[24] = 0xac; /* OP_CHECKSIG */ + dogecoin_spv_client_filteradd(client, spk, sizeof(spk)); + dogecoin_wallet_add_watchonly_addr(wallet, tok); + printf("[bip157] watching address (cli): %s\n", tok); + } + tok = strtok_r(NULL, " ", &saveptr); + } + dogecoin_free(addr_copy); + } + /* Also watch script_pubkeys from previously-tracked UTXOs (hex → raw). */ + dogecoin_utxo* utxo; + dogecoin_utxo* tmp_utxo; + HASH_ITER(hh, wallet->utxos, utxo, tmp_utxo) { + if (!utxo->script_pubkey[0]) continue; + size_t spk_hex_len = strlen(utxo->script_pubkey); + size_t spk_raw_len = spk_hex_len / 2; + const uint8_t *spk_raw = utils_hex_to_uint8(utxo->script_pubkey); + if (!spk_raw) continue; + dogecoin_spv_client_filteradd(client, spk_raw, spk_raw_len); + printf("[bip157] watching utxo script (%s): %s\n", + utxo->address, utxo->script_pubkey); + } + } + client->sync_transaction = dogecoin_wallet_check_transaction; client->sync_transaction_ctx = wallet; #endif @@ -746,6 +911,11 @@ int main(int argc, char* argv[]) { } dogecoin_free(headersfile); + + /* Load auxiliary hash-lookup DB for filter IBD from genesis. + * Use open_for_scan instead of load() to avoid reading 1M+ records + * into the in-memory tree — only the file handle is needed for the + * sequential block-hash scan done by get_block_hash_at_height(). */ if (!response) { printf("Could not load or create headers database...aborting\n"); #if WITH_WALLET @@ -818,7 +988,15 @@ int main(int argc, char* argv[]) { #endif } printf("done\n"); + + /* Rescan any cfilters cached from a prior run before entering the + * network runloop — finds matches immediately without waiting for + * the cfheaders sync to complete. */ + if (client->compact_filters_enabled) + dogecoin_spv_client_rescan_cached_filters(client); + printf("Discover peers...\n"); + dogecoin_spv_client_discover_peers(client, ips); printf("Connecting to the p2p network...\n"); diff --git a/src/wallet.c b/src/wallet.c index 6c567d3f2..72560c6a8 100644 --- a/src/wallet.c +++ b/src/wallet.c @@ -1503,6 +1503,41 @@ dogecoin_wallet_addr* dogecoin_p2pkh_address_to_wallet(const char* address_in, d return NULL; } +dogecoin_bool dogecoin_wallet_add_watchonly_addr(dogecoin_wallet* wallet, const char* address_in) { + if (!wallet || !address_in) return false; + + /* skip if already present */ + vector_t* addrs = vector_new(1, free); + dogecoin_wallet_get_addresses(wallet, addrs); + dogecoin_bool match = false; + unsigned int i; + for (i = 0; i < addrs->len; i++) { + if (strncmp((char*)vector_idx(addrs, i), address_in, P2PKHLEN - 1) == 0) { + match = true; + break; + } + } + vector_free(addrs, true); + if (match) return true; + + char* pubkey_hash = dogecoin_address_to_pubkey_hash((char*)address_in); + if (!pubkey_hash) return false; + + dogecoin_wallet_addr* addr = dogecoin_wallet_addr_new(); + memcpy_safe(addr->pubkeyhash, utils_hex_to_uint8(pubkey_hash), 20); + addr->childindex = wallet->next_childindex; + dogecoin_btree_tsearch(addr, &wallet->waddr_rbtree, dogecoin_wallet_addr_compare); + vector_add(wallet->waddr_vector, addr); + cstring* record = cstr_new_sz(256); + dogecoin_wallet_addr_serialize(record, wallet->chain, addr); + if (!wallet_write_record(wallet, record, WALLET_DB_REC_TYPE_ADDR)) + fprintf(stderr, "wallet: failed to write watch-only address %s\n", address_in); + cstr_free(record, true); + dogecoin_file_commit(wallet->dbfile); + wallet->next_childindex++; + return true; +} + void dogecoin_wallet_get_addresses(dogecoin_wallet* wallet, vector_t* addr_out) { unsigned int i; @@ -1863,6 +1898,7 @@ void dogecoin_wallet_check_transaction(void *ctx, dogecoin_tx *tx, unsigned int uint256_t blockhash; dogecoin_block_header_hash(&pindex->header, blockhash); printf("Found new relevant transaction: %s (height: %u)\n", txid_hex, pindex->height); + fflush(stdout); dogecoin_hash_set(wtx->blockhash, blockhash); wtx->height = pindex->height; dogecoin_tx_copy(wtx->tx, tx); From fd7f055989ea68342d60828df97426fa83ad4732 Mon Sep 17 00:00:00 2001 From: bluezr Date: Sun, 2 Aug 2026 19:09:57 -0700 Subject: [PATCH 11/12] spv: parallel cfheaders and cfilter download (--cf_workers) Actuates the parallel-download members that compact_filter.h already declares. Until now nothing set par_num_workers > 1, so every path took the sequential branch and those fields were inert. Splits the cfheaders and cfilter ranges across N connections to the peer, each worker owning a disjoint height range. cfilter results are buffered per worker and flushed to disk in height order, so the on-disk file stays sequential regardless of completion order. A worker that goes quiet past CF_RESPONSE_TIMEOUT has its slot reclaimed and the range reassigned, preferring a peer other than the one that stalled. --cf_workers N enables it, capped at 8: each worker is a separate TCP connection to the same peer, and past a handful the peer is the bottleneck. The peer list is repeated N times so the nodegroup opens one connection per worker. Fixes a chunk-anchoring bug found by running it rather than by reading it. Every chunk after the first anchors on the cfcheckpt filter header at (start - 1), which requires start - 1 to land exactly on a CFCHECKPT_INTERVAL boundary -- a precondition the code documented but did not enforce. Chunk size is already a multiple of the interval, so the condition holds for every chunk iff it holds for the first, and cfh_start is now snapped down to the nearest k*CFCHECKPT_INTERVAL + 1. Without that, a resume from height 6314590 gave chunk 1 a start of 6315590, and (6315590 - 1) / 1000 = 6315 selected the checkpoint for height 6315000: an anchor 589 blocks off. Every header the chunk derived was wrong, surfacing as [bip157-cfh-par] cfheader at height 6316000 FAILED checkpoint at the next boundary rather than at the point the bad anchor was chosen. A genesis sync starts at height 1 and satisfies the precondition by accident, so this only appears when resuming from a checkpoint -- which is the normal case. Verified against a local 1.14.99 node serving BIP157, isolated HOME: --cf_workers 4, chunks 6314001..6315000, 6315001..6316000, 6316001..6316047 -- every start now 1 mod 1000 all 3 cfheader chunks complete, no checkpoint failures 1437 cfilters off the wire, flushed in height order MATCH at height 6315000, 1 matched block, 2 txs processed zero validation errors, misbehaviour or stalls Sequential mode re-checked on this branch and unchanged: no par activity, same match at 6315000, zero errors. WITH_NET=ON with -DBUILD_SHARED_LIBS=1: 81/81. WITH_NET=OFF: 74/74. --- include/dogecoin/net.h | 6 + include/dogecoin/spv.h | 4 + src/cli/spvnode.c | 36 +- src/spv.c | 782 +++++++++++++++++++++++++++++++++++++++-- 4 files changed, 801 insertions(+), 27 deletions(-) diff --git a/include/dogecoin/net.h b/include/dogecoin/net.h index 7592500ef..7ee38a50f 100644 --- a/include/dogecoin/net.h +++ b/include/dogecoin/net.h @@ -102,6 +102,12 @@ typedef struct dogecoin_node_ { unsigned int bestknownheight; uint32_t hints; /* can be use for user defined state */ + + /* BIP157 parallel cfilter worker state. + * cf_batch_end == 0 means no batch is assigned yet. */ + uint32_t cf_batch_start; /* first height in current getcfilters batch */ + uint32_t cf_batch_end; /* last height in current getcfilters batch */ + uint32_t cf_cur_height; /* next expected cfilter height from this node */ } dogecoin_node; /* =================================== */ diff --git a/include/dogecoin/spv.h b/include/dogecoin/spv.h index f4ee4b2f2..e8a030425 100644 --- a/include/dogecoin/spv.h +++ b/include/dogecoin/spv.h @@ -125,6 +125,10 @@ typedef struct dogecoin_spv_client_ * chainbottom for checkpoint-based sync, 1 for genesis sync). */ uint32_t cf_start_height; + /* Number of parallel getcfilters workers (independent TCP connections). + * 0 or 1 means sequential (default); >1 activates parallel mode. */ + uint8_t cf_num_workers; + /* BIP157: compact filter sync state */ dogecoin_bool compact_filters_enabled; /**< Whether compact filter sync is active */ dogecoin_compact_filter_state *cfilter_state; /**< BIP157 per-client compact filter state */ diff --git a/src/cli/spvnode.c b/src/cli/spvnode.c index b50dae9db..042b5bce6 100644 --- a/src/cli/spvnode.c +++ b/src/cli/spvnode.c @@ -204,6 +204,7 @@ static struct option long_options[] = { {"no_cfilters", no_argument, NULL, 'e'}, {"export_cfcheckpts", no_argument, NULL, 'o'}, {"logfile", required_argument, NULL, 'L'}, + {"cf_workers", required_argument, NULL, 'W'}, {"cfheaders_path", required_argument, NULL, 257}, {"cfilters_path", required_argument, NULL, 258}, {NULL, 0, NULL, 0} }; @@ -516,6 +517,7 @@ int main(int argc, char* argv[]) { dogecoin_bool export_cfcheckpts = false; int selected_checkpoint_index = -1; char* logfile = NULL; + int cf_workers = 0; char* cfheaders_path = NULL; char* cfilters_path = NULL; if (argc <= 1 || strlen(argv[argc - 1]) == 0 || argv[argc - 1][0] == '-') { @@ -526,7 +528,7 @@ int main(int argc, char* argv[]) { data = argv[argc - 1]; /* get arguments */ - while ((opt = getopt_long_only(argc, argv, "i:ctrdsm:n:f:y:u:w:h:a:lbpzkj:xgqeoL:", long_options, &long_index)) != -1) { + while ((opt = getopt_long_only(argc, argv, "i:ctrdsm:n:f:y:u:w:h:a:lbpzkj:xgqeoW:L:", long_options, &long_index)) != -1) { switch (opt) { case 'c': quit_when_synced = false; @@ -613,6 +615,9 @@ int main(int argc, char* argv[]) { case 'o': export_cfcheckpts = true; break; + case 'W': + cf_workers = atoi(optarg); + break; case 'L': logfile = optarg; break; @@ -655,6 +660,14 @@ int main(int argc, char* argv[]) { if (cfilters_path) client->cfilters_path = strdup(cfilters_path); + if (cf_workers > 1) { + /* Cap at 8: each worker is a separate TCP connection to the same + peer, and past a handful the bottleneck is the peer, not us. */ + client->cf_num_workers = (uint8_t)(cf_workers > 8 ? 8 : cf_workers); + printf("[bip157-par] parallel cfilter workers: %u\n", + (unsigned int)client->cf_num_workers); + } + if (no_cfilters || full_sync) { /* Disable BIP157 compact filter sync when: * - user explicitly passed --no_cfilters (-e) @@ -997,7 +1010,26 @@ int main(int argc, char* argv[]) { printf("Discover peers...\n"); - dogecoin_spv_client_discover_peers(client, ips); + /* Each parallel worker is one TCP connection, so the peer list is + repeated N times: the nodegroup opens one connection per entry. */ + char *par_ips = NULL; + if (client->cf_num_workers > 1 && ips) { + size_t par_n = client->cf_num_workers; + size_t host_len = strlen(ips); + par_ips = (char *)dogecoin_calloc(par_n * (host_len + 1) + 1, 1); + if (par_ips) { + size_t wi; + for (wi = 0; wi < par_n; wi++) { + if (wi > 0) strcat(par_ips, ","); + strcat(par_ips, ips); + } + client->nodegroup->desired_amount_connected_nodes = (int)par_n; + printf("[bip157-par] connecting %u workers to %s\n", + (unsigned int)par_n, ips); + } + } + dogecoin_spv_client_discover_peers(client, par_ips ? par_ips : ips); + dogecoin_free(par_ips); printf("Connecting to the p2p network...\n"); printf("Press CTRL+C or send SIGINT/SIGTERM to disconnect.\n"); diff --git a/src/spv.c b/src/spv.c index 82543c07e..00aa4148e 100644 --- a/src/spv.c +++ b/src/spv.c @@ -134,8 +134,182 @@ static uint32_t spv_elapsed(const dogecoin_spv_client *client) { /* Parallel cfheaders download helpers */ /* ================================================================ */ +static dogecoin_bool spv_cf_par_assign(dogecoin_spv_client *client, dogecoin_node *node); static uint32_t cf_find_checkpoint_stop(const dogecoin_chainparams *params, uint32_t target_height, uint256_t hash_out); +/* Send one GETCFHEADERS batch for a chunk, clamped to batch_max. + * Fills stop_hash from headers DB / cfcheckpt fallback. */ +static void cfh_par_send_batch(dogecoin_spv_client *client, dogecoin_node *node, + cfh_par_chunk *ch, dogecoin_blockindex *tip_bi) +{ + uint32_t start = ch->req_next; + uint32_t end = start + MAX_GETCFHEADERS_SIZE - 1; + if (end > ch->end) end = ch->end; + + uint256_t stop_hash; + if (tip_bi && end == (uint32_t)tip_bi->height) { + memcpy(stop_hash, tip_bi->hash, 32); + } else { + dogecoin_headers_db *hdb = (dogecoin_headers_db *)client->headers_db_ctx; + if (!dogecoin_headers_db_get_block_hash_at_height(hdb, end, stop_hash)) { + dogecoin_bool aux_found = false; + if (client->aux_hash_db && client->aux_hash_db_ctx) { + dogecoin_headers_db *aux = (dogecoin_headers_db *)client->aux_hash_db_ctx; + aux_found = dogecoin_headers_db_get_block_hash_at_height(aux, end, stop_hash); + } + if (!aux_found && tip_bi) + memcpy(stop_hash, tip_bi->hash, 32); + } + } + + dogecoin_getcfheaders_msg msg; + msg.filter_type = GCS_BASIC_FILTER_TYPE; + msg.start_height = start; + memcpy(msg.stop_hash, stop_hash, 32); + + cstring *payload = cstr_new_sz(64); + dogecoin_p2p_msg_getcfheaders_ser(&msg, payload); + cstring *p2pmsg = dogecoin_p2p_message_new( + node->nodegroup->chainparams->netmagic, + DOGECOIN_MSG_GETCFHEADERS, payload->str, payload->len); + cstr_free(payload, true); + dogecoin_node_send(node, p2pmsg); + cstr_free(p2pmsg, true); + + ch->req_next = end + 1; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-cfh-par] node %d: getcfheaders [%u..%u] [%us elapsed]\n", + node->nodeid, start, end, spv_elapsed(client)); +} + +/* Assign the next unassigned cfheaders chunk to @node. */ +static dogecoin_bool cfh_par_assign(dogecoin_spv_client *client, dogecoin_node *node) +{ + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + if (!cfstate || cfstate->cfh_par_n == 0) return false; + + dogecoin_blockindex *tip_bi = + client->headers_db->getchaintip(client->headers_db_ctx); + + uint8_t wi; + for (wi = 0; wi < cfstate->cfh_par_n; wi++) { + cfh_par_chunk *ch = &cfstate->cfh_par_chunks[wi]; + if (ch->node_id != -1) continue; /* already assigned or no-work */ + ch->node_id = node->nodeid; + cfh_par_send_batch(client, node, ch, tip_bi); + return true; + } + return false; +} + +/* Initialise parallel cfheaders download and assign to available CF nodes. */ +static void cfh_par_init(dogecoin_spv_client *client, + dogecoin_blockindex *tip_bi, + uint32_t cfh_start) +{ + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + uint8_t n_workers = client->cf_num_workers; + uint32_t tip = (uint32_t)tip_bi->height; + + /* Every chunk after the first anchors on the cfcheckpt filter header at + * (start - 1), so start - 1 has to land exactly on a CFCHECKPT_INTERVAL + * boundary. Chunk size is already a multiple of the interval, so that holds + * for every chunk iff it holds for the first: snap cfh_start down to the + * nearest k*CFCHECKPT_INTERVAL + 1. + * + * Without this, a resume start such as 6314590 gives chunk 1 a start of + * 6315590, and (6315590 - 1) / 1000 = 6315 selects the checkpoint for + * height 6315000 -- an anchor 589 blocks off. Every header the chunk + * derives is then wrong, surfacing as a checkpoint failure at the next + * boundary rather than at the point the anchor was chosen. A genesis sync + * starts at 1 and satisfies the precondition by accident, which is why this + * only appears when resuming. */ + if (cfh_start > 1) { + uint32_t aligned = ((cfh_start - 1) / CFCHECKPT_INTERVAL) * CFCHECKPT_INTERVAL + 1; + if (aligned < 1) aligned = 1; + cfh_start = aligned; + } + + /* Chunk size rounded up to CFCHECKPT_INTERVAL so boundaries align with + * cfcheckpt anchors, enabling independent per-chunk validation. */ + uint32_t total = tip - cfh_start + 1; + uint32_t raw_chunk = (total + n_workers - 1) / n_workers; + uint32_t chunk_sz = ((raw_chunk + CFCHECKPT_INTERVAL - 1) / CFCHECKPT_INTERVAL) + * CFCHECKPT_INTERVAL; + if (chunk_sz < CFCHECKPT_INTERVAL) chunk_sz = CFCHECKPT_INTERVAL; + + cfstate->cfh_par_n = n_workers; + cfstate->cfh_par_done = 0; + cfstate->cfh_par_base = cfh_start; + cfstate->cfh_par_total = total; + cfstate->cfh_par_data = (uint8_t *)dogecoin_calloc(total, 32); + cfstate->cfh_par_chunks = (cfh_par_chunk *)dogecoin_calloc(n_workers, sizeof(cfh_par_chunk)); + if (!cfstate->cfh_par_data || !cfstate->cfh_par_chunks) { + /* OOM — fall back to sequential */ + dogecoin_free(cfstate->cfh_par_data); cfstate->cfh_par_data = NULL; + dogecoin_free(cfstate->cfh_par_chunks); cfstate->cfh_par_chunks = NULL; + cfstate->cfh_par_n = 0; + return; + } + + uint8_t wi; + uint8_t effective_n = 0; + for (wi = 0; wi < n_workers; wi++) { + cfh_par_chunk *ch = &cfstate->cfh_par_chunks[wi]; + uint32_t start = cfh_start + (uint32_t)wi * chunk_sz; + if (start > tip) { + ch->node_id = -2; /* no work for this slot */ + cfstate->cfh_par_done++; + continue; + } + ch->start = start; + ch->end = start + chunk_sz - 1; + if (ch->end > tip) ch->end = tip; + ch->req_next = ch->start; + ch->node_id = -1; /* unassigned */ + ch->n_received = 0; + ch->complete = false; + effective_n++; + + if (wi == 0) { + /* Genesis anchor comes from the first CFHEADERS response's + * prev_filter_header field; initialise to zero for now. */ + memset(ch->prev_fh, 0, 32); + } else { + /* Anchor = cfcheckpt filter header immediately before start. + * start - 1 must be a multiple of CFCHECKPT_INTERVAL. */ + uint32_t prev_h = ch->start - 1; + uint32_t cp_idx = prev_h / CFCHECKPT_INTERVAL; + if (cp_idx > 0 && (cp_idx - 1) < cfstate->checkpoints->len) { + memcpy(ch->prev_fh, + vector_idx(cfstate->checkpoints, cp_idx - 1), 32); + } else { + memset(ch->prev_fh, 0, 32); + } + } + } + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-cfh-par] starting parallel cfheaders: %u workers, " + "chunk_sz=%u, heights %u..%u [%us elapsed]\n", + (unsigned int)effective_n, chunk_sz, cfh_start, tip, + spv_elapsed(client)); + + /* Assign one chunk to each connected CF node */ + unsigned int ni; + for (ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *wn = (dogecoin_node *)vector_idx(client->nodegroup->nodes, ni); + if (!wn || !(wn->state & NODE_CONNECTED) || !wn->version_handshake) continue; + if (!(wn->services & DOGECOIN_NODE_COMPACT_FILTERS)) continue; + cfh_par_assign(client, wn); + } + + cfstate->awaiting_response = false; +} + /* Callback context for spv_rescan_cached_cfilters. */ typedef struct { dogecoin_spv_client *client; @@ -304,6 +478,297 @@ void dogecoin_spv_client_rescan_cached_filters(dogecoin_spv_client *client) /* Called when all cfheaders chunks are complete: populate filter_headers * from the flat array and transition to cfilter download. */ +static void cfh_par_finish(dogecoin_spv_client *client, dogecoin_node *node) +{ + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + dogecoin_blockindex *tip_bi = + client->headers_db->getchaintip(client->headers_db_ctx); + + cfstate->cfheaders_tip_height = cfstate->cfh_par_base + cfstate->cfh_par_total - 1; + cfstate->cfheaders_base_height = cfstate->cfh_par_base; + memcpy(cfstate->cfheaders_tip_hash, + cfstate->cfh_par_data + (cfstate->cfh_par_total - 1) * 32, 32); + + /* Persist filter headers to disk — single flush after the batch */ + if (client->cfheaders_db) { + uint32_t h; + for (h = 0; h < cfstate->cfh_par_total; h++) { + dogecoin_cfheaders_db_write(client->cfheaders_db, + cfstate->cfh_par_base + h, + cfstate->cfh_par_data + h * 32); + } + dogecoin_cfheaders_db_flush(client->cfheaders_db); + } + + /* Transfer cfh_par_data ownership to filter_headers_flat for O(1) cfilter lookups. + * This avoids 6M+ individual calloc calls that would otherwise stall here. */ + if (cfstate->filter_headers_flat) + dogecoin_free(cfstate->filter_headers_flat); + cfstate->filter_headers_flat = cfstate->cfh_par_data; + cfstate->filter_headers_flat_base = cfstate->cfh_par_base; + cfstate->filter_headers_flat_len = cfstate->cfh_par_total; + + /* Free parallel cfheaders state (data pointer now owned by filter_headers_flat) */ + cfstate->cfh_par_data = NULL; + dogecoin_free(cfstate->cfh_par_chunks); cfstate->cfh_par_chunks = NULL; + cfstate->cfh_par_n = 0; + cfstate->cfh_par_done = 0; + cfstate->cfh_par_total = 0; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-cfh-par] all cfheaders complete (tip=%u), starting cfilter scan [%us elapsed]\n", + cfstate->cfheaders_tip_height, spv_elapsed(client)); + + /* Start cfilter download */ + dogecoin_headers_db *hdb_cf = (dogecoin_headers_db *)client->headers_db_ctx; + uint32_t cf_scan_start = 1; + if (client->cf_start_height > 0) { + /* --cf_from_genesis or API override: honour the requested start height */ + cf_scan_start = client->cf_start_height; + } else if (hdb_cf && hdb_cf->chainbottom && hdb_cf->chainbottom->height > 0) { + cf_scan_start = hdb_cf->chainbottom->height; + } + + /* Clamp cf_scan_start so we only download cfilters we can validate. + * filter_headers_flat covers cfheaders_base_height..cfheaders_tip_height; + * heights below that were already scanned by the startup rescan. */ + if (cfstate->cfheaders_base_height > 0 && + cf_scan_start < cfstate->cfheaders_base_height) + cf_scan_start = cfstate->cfheaders_base_height; + + /* If startup rescan already covered the cached cfilter range, + * only download filters beyond that tip. */ + if (cfstate->rescan_done && client->cfilters_db && + client->cfilters_db->tip_height > 0 && + cf_scan_start <= client->cfilters_db->tip_height) + cf_scan_start = client->cfilters_db->tip_height + 1; + + /* Rescan any cached filters (heights 1..cf_scan_start-1) that were stored + * in a prior run before these watched scripts were registered. */ + spv_rescan_cached_cfilters(client, cf_scan_start); + + cfstate->cf_scan_start_height = cf_scan_start; + if (client->cf_num_workers > 1) { + cfstate->par_num_workers = client->cf_num_workers; + cfstate->par_next_height = cf_scan_start; + cfstate->par_flush_height = cf_scan_start; + cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; + if (!cfstate->par_bufs) { + cfstate->par_bufs = (cf_par_buf *)dogecoin_calloc( + cfstate->par_num_workers, sizeof(cf_par_buf)); + uint8_t pi; + for (pi = 0; pi < cfstate->par_num_workers; pi++) + cfstate->par_bufs[pi].node_id = -1; + } + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-par] assigning %u parallel cfilter workers from height %u\n", + (unsigned int)cfstate->par_num_workers, cf_scan_start); + unsigned int ni; + for (ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *wn = (dogecoin_node *)vector_idx( + client->nodegroup->nodes, ni); + if (!wn || !(wn->state & NODE_CONNECTED) || !wn->version_handshake) + continue; + spv_cf_par_assign(client, wn); + } + } else { + cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; + dogecoin_spv_request_cfilters(client, node, cf_scan_start, tip_bi->hash); + } +} + +/* Handle a CFHEADERS message in parallel cfheaders download mode. */ +static void cfh_par_handle_response(dogecoin_spv_client *client, + dogecoin_node *node, + dogecoin_cfheaders_msg *cfh_msg) +{ + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + + /* Find the chunk assigned to this node */ + cfh_par_chunk *ch = NULL; + uint8_t wi; + for (wi = 0; wi < cfstate->cfh_par_n; wi++) { + if (cfstate->cfh_par_chunks[wi].node_id == node->nodeid) { + ch = &cfstate->cfh_par_chunks[wi]; + break; + } + } + if (!ch) return; + + /* For chunk 0 (genesis anchor), capture genesis_filter_header from first batch */ + if (ch->n_received == 0 && ch->start == cfstate->cfh_par_base) { + memcpy(cfstate->genesis_filter_header, cfh_msg->prev_filter_header, 32); + memcpy(ch->prev_fh, cfh_msg->prev_filter_header, 32); + if (client->cfheaders_db) + dogecoin_cfheaders_db_write_genesis(client->cfheaders_db, + cfh_msg->prev_filter_header); + } + + uint8_t prev_fh[32]; + memcpy(prev_fh, ch->prev_fh, 32); + + dogecoin_bool valid = true; + unsigned int i; + for (i = 0; i < cfh_msg->filter_hashes->len; i++) { + uint32_t height = ch->start + ch->n_received; + if (height > ch->end) { valid = false; break; } + + uint256_t *filter_hash = (uint256_t *)vector_idx(cfh_msg->filter_hashes, i); + + uint8_t combined[64]; + memcpy(combined, filter_hash, 32); + memcpy(combined + 32, prev_fh, 32); + uint256_t new_header; + dogecoin_hash(combined, 64, new_header); + + /* Validate against cfcheckpt at checkpoint boundaries */ + if (cfstate->checkpoints && cfstate->checkpoints->len > 0 && + height > 0 && (height % CFCHECKPT_INTERVAL) == 0) { + uint32_t cp_idx = height / CFCHECKPT_INTERVAL - 1; + if (cp_idx < cfstate->checkpoints->len) { + uint256_t *checkpoint = (uint256_t *)vector_idx(cfstate->checkpoints, cp_idx); + if (memcmp(new_header, checkpoint, 32) != 0) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-cfh-par] cfheader at height %u FAILED checkpoint\n", height); + valid = false; + break; + } + } + } + + /* Store in flat array */ + uint32_t idx = height - cfstate->cfh_par_base; + memcpy(cfstate->cfh_par_data + idx * 32, new_header, 32); + memcpy(prev_fh, new_header, 32); + ch->n_received++; + } + + if (!valid) { + dogecoin_node_misbehave(node); + ch->node_id = -1; /* free slot for reassignment */ + return; + } + + /* Update anchor for next batch */ + memcpy(ch->prev_fh, prev_fh, 32); + + dogecoin_blockindex *tip_bi = client->headers_db->getchaintip(client->headers_db_ctx); + + if (ch->req_next <= ch->end) { + /* More batches needed for this chunk */ + cfh_par_send_batch(client, node, ch, tip_bi); + } else { + /* Chunk complete */ + ch->complete = true; + cfstate->cfh_par_done++; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-cfh-par] node %d chunk %u..%u done (%u/%u workers) [%us elapsed]\n", + node->nodeid, ch->start, ch->end, + (unsigned int)cfstate->cfh_par_done, + (unsigned int)cfstate->cfh_par_n, + spv_elapsed(client)); + + if (cfstate->cfh_par_done >= cfstate->cfh_par_n) + cfh_par_finish(client, node); + else + cfh_par_assign(client, node); /* reuse this node for the next unassigned chunk */ + } +} + +/* ------------------------------------------------------------------ */ +/* Assign the next getcfilters batch to a parallel worker node. */ +/* Returns true if a batch was assigned and getcfilters was sent. */ +/* ------------------------------------------------------------------ */ +static dogecoin_bool spv_cf_par_assign(dogecoin_spv_client *client, dogecoin_node *node) +{ + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + uint32_t start = cfstate->par_next_height; + uint32_t tip = cfstate->cfheaders_tip_height; + + if (start > tip) return false; + + /* Find a free slot */ + int slot = -1; + uint8_t pi; + for (pi = 0; pi < cfstate->par_num_workers; pi++) { + if (cfstate->par_bufs[pi].node_id == -1) { slot = (int)pi; break; } + } + if (slot < 0) return false; + + uint32_t end = start + MAX_GETCFILTERS_SIZE - 1; + if (end > tip) end = tip; + + /* Resolve stop hash BEFORE allocating records so end can be adjusted. */ + uint256_t stop_hash; + dogecoin_blockindex *tip_bi = client->headers_db->getchaintip(client->headers_db_ctx); + if (tip_bi && end == (uint32_t)tip_bi->height) { + memcpy(stop_hash, tip_bi->hash, 32); + } else { + dogecoin_headers_db *hdb = (dogecoin_headers_db *)client->headers_db_ctx; + if (!dogecoin_headers_db_get_block_hash_at_height(hdb, end, stop_hash)) { + dogecoin_bool resolved = false; + if (client->aux_hash_db && client->aux_hash_db_ctx) { + dogecoin_headers_db *aux = (dogecoin_headers_db *)client->aux_hash_db_ctx; + resolved = dogecoin_headers_db_get_block_hash_at_height(aux, end, stop_hash); + } + if (!resolved) { + uint32_t cp_h = cf_find_checkpoint_stop(client->chainparams, end, stop_hash); + if (cp_h > 0 && cp_h <= tip) { + end = cp_h; + } else if (tip_bi) { + /* checkpoint beyond tip or not found — use tip */ + memcpy(stop_hash, tip_bi->hash, 32); + end = (uint32_t)tip_bi->height; + } + } + } + } + + uint32_t count = end - start + 1; + cf_par_buf *buf = &cfstate->par_bufs[slot]; + buf->node_id = node->nodeid; + buf->batch_start = start; + buf->batch_end = end; + buf->received = 0; + buf->complete = false; + buf->assign_time = time(NULL); + buf->records = (cf_par_record *)dogecoin_calloc(count, sizeof(cf_par_record)); + if (!buf->records) { buf->node_id = -1; return false; } + + node->cf_batch_start = start; + node->cf_batch_end = end; + node->cf_cur_height = start; + cfstate->par_next_height = end + 1; + + dogecoin_getcfilters_msg gcf_msg; + gcf_msg.filter_type = GCS_BASIC_FILTER_TYPE; + gcf_msg.start_height = start; + memcpy(gcf_msg.stop_hash, stop_hash, 32); + + cstring *payload = cstr_new_sz(64); + dogecoin_p2p_msg_getcfilters_ser(&gcf_msg, payload); + cstring *p2pmsg = dogecoin_p2p_message_new( + node->nodegroup->chainparams->netmagic, DOGECOIN_MSG_GETCFILTERS, + payload->str, payload->len); + cstr_free(payload, true); + dogecoin_node_send(node, p2pmsg); + cstr_free(p2pmsg, true); + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-par] node %d: getcfilters [%u..%u] [%us elapsed]\n", + node->nodeid, start, end, spv_elapsed(client)); + return true; +} + +/* ------------------------------------------------------------------ */ +/* Request full blocks for all BIP157 matched block hashes via P2P. */ +/* ------------------------------------------------------------------ */ static void spv_cf_request_matched_blocks(dogecoin_spv_client *client) { dogecoin_compact_filter_state *cfstate = client->cfilter_state; @@ -380,6 +845,79 @@ static void spv_cf_request_matched_blocks(dogecoin_spv_client *client) /* ------------------------------------------------------------------ */ /* Flush contiguous complete batches to disk in height order. */ /* ------------------------------------------------------------------ */ +static void spv_cf_par_try_flush(dogecoin_spv_client *client) +{ + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + uint8_t n = cfstate->par_num_workers; + dogecoin_bool flushed; + + do { + flushed = false; + uint8_t pi; + for (pi = 0; pi < n; pi++) { + cf_par_buf *buf = &cfstate->par_bufs[pi]; + if (buf->node_id == -1 || !buf->complete) continue; + if (buf->batch_start != cfstate->par_flush_height) continue; + + /* Flush this batch sequentially */ + uint32_t count = buf->batch_end - buf->batch_start + 1; + uint32_t ri; + for (ri = 0; ri < count; ri++) { + uint32_t h = buf->batch_start + ri; + cf_par_record *rec = &buf->records[ri]; + if (rec->filter_data) { + if (client->cfilters_db) + dogecoin_cfilters_db_write(client->cfilters_db, h, + rec->block_hash, rec->filter_data); + cstr_free(rec->filter_data, true); + rec->filter_data = NULL; + } + } + + cfstate->filters_tip_height = buf->batch_end; + cfstate->par_flush_height = buf->batch_end + 1; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-par] flushed [%u..%u], progress %u/%u [%us elapsed]\n", + buf->batch_start, buf->batch_end, + buf->batch_end, cfstate->cfheaders_tip_height, + spv_elapsed(client)); + + dogecoin_free(buf->records); + buf->records = NULL; + buf->node_id = -1; + buf->complete = false; + flushed = true; + break; + } + } while (flushed); + + if (cfstate->filters_tip_height >= cfstate->cfheaders_tip_height) { + if (client->nodegroup && client->nodegroup->log_write_cb) { + uint32_t scan_start = cfstate->cf_scan_start_height > 0 ? cfstate->cf_scan_start_height : 1; + client->nodegroup->log_write_cb( + "[bip157] all filters processed: scanned heights %u..%u (of %u), %u matched blocks [%us elapsed]\n", + scan_start, cfstate->filters_tip_height, cfstate->cfheaders_tip_height, + (unsigned int)cfstate->matched_block_hashes->len, spv_elapsed(client)); + if (scan_start > 1) + client->nodegroup->log_write_cb( + "[bip157] WARNING: scan started at height %u (checkpoint), not genesis — " + "transactions before height %u are not covered; use --filter_hash_db for full history\n", + scan_start, scan_start); + } + cfstate->awaiting_response = false; + client->stateflags &= ~SPV_CFILTER_SYNC_FLAG; + if (cfstate->matched_block_hashes->len > 0 && !cfstate->cf_block_fetch_active) { + spv_cf_request_matched_blocks(client); + } else if (!client->called_sync_completed && client->sync_completed) { + if (client->smpv_enabled) dogecoin_net_spv_request_mempool(client); + client->sync_completed(client); + client->called_sync_completed = true; + } + } +} + static dogecoin_bool spv_lookup_headersdb_height_by_hash(dogecoin_spv_client* client, const uint8_t hash[32], uint32_t* out_height) @@ -870,6 +1408,7 @@ dogecoin_spv_client* dogecoin_spv_client_new(const dogecoin_chainparams *params, client->aux_hash_db_ctx = NULL; client->aux_hash_db = NULL; client->cf_start_height = 0; + client->cf_num_workers = 0; return client; } @@ -1174,8 +1713,61 @@ void dogecoin_net_spv_periodic_statecheck(dogecoin_node *node, uint64_t *now) ((uint32_t)pindex->height > 0) && (cfstate->cfheaders_tip_height < (uint32_t)pindex->height || cfstate->filters_tip_height < cfstate->cfheaders_tip_height); + /* Only retry here when not already in a live parallel cfilter download. */ + dogecoin_bool par_active = (cfstate->cfh_par_n > 0) || + (cfstate->par_num_workers > 0 && + cfstate->filters_tip_height < cfstate->cfheaders_tip_height); + /* Par cfilter stall recovery: if a worker has been assigned longer than + * CF_RESPONSE_TIMEOUT and has received nothing, free the slot and + * re-assign from the next available node. */ + if (cfstate->par_num_workers > 0 && cfstate->par_bufs) { + int64_t stall_deadline = *now - CF_RESPONSE_TIMEOUT; + uint8_t pi; + for (pi = 0; pi < cfstate->par_num_workers; pi++) { + cf_par_buf *buf = &cfstate->par_bufs[pi]; + if (buf->node_id == -1 || buf->complete) continue; + if (buf->received > 0) continue; /* making progress */ + if (buf->assign_time == 0 || buf->assign_time > stall_deadline) continue; - if (cf_incomplete && cfstate->awaiting_response) { + client->nodegroup->log_write_cb( + "[bip157-par] worker slot %u (node %d, [%u..%u]) stalled — reassigning\n", + (unsigned int)pi, buf->node_id, buf->batch_start, buf->batch_end); + + /* Reset slot and re-issue from the stalled start height */ + int stalled_node_id = buf->node_id; + uint32_t retry_start = buf->batch_start; + dogecoin_free(buf->records); + buf->records = NULL; + buf->node_id = -1; + buf->complete = false; + buf->received = 0; + cfstate->par_next_height = retry_start; /* back up */ + + /* Find any connected peer OTHER than the stalled one to take over */ + unsigned int ni; + dogecoin_bool reassigned = false; + for (ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *rn = (dogecoin_node *)vector_idx( + client->nodegroup->nodes, ni); + if (!rn || !(rn->state & NODE_CONNECTED) || !rn->version_handshake) + continue; + if (rn->nodeid == stalled_node_id) continue; /* skip stalled peer */ + if (spv_cf_par_assign(client, rn)) { reassigned = true; break; } + } + /* No alternative peer available — fall back to the stalled node */ + if (!reassigned) { + for (ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *rn = (dogecoin_node *)vector_idx( + client->nodegroup->nodes, ni); + if (!rn || !(rn->state & NODE_CONNECTED) || !rn->version_handshake) + continue; + if (spv_cf_par_assign(client, rn)) break; + } + } + } + } + + if (cf_incomplete && !par_active && cfstate->awaiting_response) { /* Fast-path: if no CF-capable peer is connected right now, the peer * we sent the request to has disconnected. Clear awaiting_response * immediately so the postcmd trigger can fire as soon as any CF peer @@ -1452,6 +2044,10 @@ void dogecoin_net_spv_node_handshake_done(dogecoin_node *node) dogecoin_spv_client *hsclient = (dogecoin_spv_client*)node->nodegroup->ctx; dogecoin_net_spv_request_headers(hsclient); + if (hsclient->compact_filters_enabled && hsclient->cfilter_state && + hsclient->cfilter_state->cfh_par_n > 0 && + (node->services & DOGECOIN_NODE_COMPACT_FILTERS)) + cfh_par_assign(hsclient, node); } /** @@ -2304,6 +2900,9 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s /* CF sync not yet complete: cfheaders or cfilters behind chain tip */ (client->cfilter_state->cfheaders_tip_height < (uint32_t)chaintip->height || client->cfilter_state->filters_tip_height < client->cfilter_state->cfheaders_tip_height) && + /* Not already in a live parallel cfilter download */ + !(client->cfilter_state->par_num_workers > 0 && + client->cfilter_state->filters_tip_height < client->cfilter_state->cfheaders_tip_height) && chaintip->height > 0 && chaintip->height >= node->bestknownheight - 5) { /* Headers are at tip — find a BIP157-capable peer (NODE_COMPACT_FILTERS) */ @@ -2333,10 +2932,9 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s /* Blocks matched by the startup rescan of already-cached cfilters have to be * requested independently of the cfheaders/cfilters network sync above. That * sync only covers heights not already on disk, so when the cache already spans - * the chain the cfilter download never runs, its completion hook never - * fires, and the matched blocks would never be fetched -- the scan reported - * matches but the wallet stayed empty. Trigger here once headers are at - * tip, whichever CF + * the chain its completion hook (spv_cf_par_try_flush) never fires and the + * matched blocks would never be fetched -- the scan reported matches but the + * wallet stayed empty. Trigger here once headers are at tip, whichever CF * branch above was taken; cf_block_fetch_active keeps it to one dispatch. */ if (client->compact_filters_enabled && client->cfilter_state && client->cfilter_state->rescan_done && @@ -2750,12 +3348,40 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s dogecoin_compact_filter_state *cfstate = client->cfilter_state; if (cfilter_msg.filter_data) { + dogecoin_bool parallel = (cfstate->par_num_workers > 1); + /* Determine the height this cfilter corresponds to. */ uint32_t filter_height; - - if (cfstate->filters_tip_height >= cfstate->cfheaders_tip_height) - goto cfilter_handler_done; - filter_height = cfstate->filters_tip_height + 1; + cf_par_buf *par_buf = NULL; + + if (parallel) { + /* Per-node height tracking: validate node has an active batch */ + if (node->cf_batch_end == 0 || + node->cf_cur_height > node->cf_batch_end) { + /* Stale or unassigned — drop */ + goto cfilter_handler_done; + } + filter_height = node->cf_cur_height; + node->cf_cur_height++; + + /* Find the buffer for this node whose range covers filter_height. + * A node can have two slots temporarily: one complete-but-pending-flush + * and one newly-assigned. Match by height range to avoid OOB write. */ + uint8_t pi; + for (pi = 0; pi < cfstate->par_num_workers; pi++) { + if (cfstate->par_bufs[pi].node_id == node->nodeid && + filter_height >= cfstate->par_bufs[pi].batch_start && + filter_height <= cfstate->par_bufs[pi].batch_end) { + par_buf = &cfstate->par_bufs[pi]; + break; + } + } + if (!par_buf) goto cfilter_handler_done; + } else { + if (cfstate->filters_tip_height >= cfstate->cfheaders_tip_height) + goto cfilter_handler_done; + filter_height = cfstate->filters_tip_height + 1; + } /* * filter_headers[i] = filter header for block at height (cfheaders_base_height + i). @@ -2801,7 +3427,44 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s uint256_t *expected_fh = expected_fh_ptr; if (dogecoin_compact_filter_validate(cfilter_msg.filter_data, prev_fh, *expected_fh)) { - { + if (parallel) { + /* Buffer the validated record; disk flush happens in-order via spv_cf_par_try_flush */ + uint32_t offset = filter_height - par_buf->batch_start; + cf_par_record *rec = &par_buf->records[offset]; + rec->filter_data = cstr_new_buf(cfilter_msg.filter_data->str, + cfilter_msg.filter_data->len); + memcpy(rec->block_hash, cfilter_msg.block_hash, 32); + + /* Match watched scripts now (before buffering loses the data reference) */ + if (cfstate->watched_scripts && cfstate->watched_scripts->len > 0) { + gcs_filter *gcs = gcs_filter_new(); + struct const_buffer fbuf = { cfilter_msg.filter_data->str, + cfilter_msg.filter_data->len }; + if (gcs_filter_deserialize(gcs, cfilter_msg.filter_type, + cfilter_msg.block_hash, &fbuf)) { + if (gcs_filter_match_any(gcs, cfstate->watched_scripts)) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] MATCH at height %u\n", filter_height); + uint256_t *matched_hash = dogecoin_calloc(1, sizeof(uint256_t)); + memcpy(matched_hash, cfilter_msg.block_hash, sizeof(uint256_t)); + vector_add(cfstate->matched_block_hashes, matched_hash); + uint32_t *matched_height = dogecoin_calloc(1, sizeof(uint32_t)); + *matched_height = filter_height; + vector_add(cfstate->matched_block_heights, matched_height); + } + } + gcs_filter_free(gcs); + } + + par_buf->received++; + if (par_buf->received == par_buf->batch_end - par_buf->batch_start + 1) { + par_buf->complete = true; + spv_cf_par_try_flush(client); + /* Get next batch for this worker (no-op if all work assigned) */ + spv_cf_par_assign(client, node); + } + } else { /* Sequential mode: write immediately */ cfstate->filters_tip_height = filter_height; @@ -2905,6 +3568,12 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s client->nodegroup->log_write_cb("[bip157] cfheaders: type=%u n_hashes=%u\n", cfh_msg.filter_type, (unsigned int)cfh_msg.filter_hashes->len); + if (cfstate->cfh_par_n > 0) { + cfh_par_handle_response(client, node, &cfh_msg); + dogecoin_cfheaders_msg_free(&cfh_msg); + return; + } + uint256_t prev_header; memcpy(prev_header, cfh_msg.prev_filter_header, 32); uint32_t height = cfstate->cfheaders_tip_height; @@ -3001,18 +3670,50 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s if (client->nodegroup && client->nodegroup->log_write_cb) client->nodegroup->log_write_cb( - "[bip157] all cfheaders received (tip=%u), starting cfilter scan from %u [%us elapsed]\n", + "[bip157] all cfheaders received (tip=%u), starting cfilter scan from %u with %u workers [%us elapsed]\n", cfstate->cfheaders_tip_height, cf_scan_start, + (unsigned int)(client->cf_num_workers > 1 ? client->cf_num_workers : 1), spv_elapsed(client)); /* Record where the scan actually began. The completion log * falls back to 1 when this is unset, which reported * "scanned heights 1..tip" for a run that only covered the * checkpoint tail -- overstating coverage in exactly the way - * that hides a gap. */ + * that hides a gap. Both arms below need it. */ cfstate->cf_scan_start_height = cf_scan_start; - cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; - dogecoin_spv_request_cfilters(client, node, cf_scan_start, tip->hash); + + if (client->cf_num_workers > 1) { + /* Parallel mode: assign batches to all connected nodes */ + cfstate->par_num_workers = client->cf_num_workers; + cfstate->par_next_height = cf_scan_start; + cfstate->par_flush_height = cf_scan_start; + cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; + + if (!cfstate->par_bufs) { + cfstate->par_bufs = (cf_par_buf *)dogecoin_calloc( + cfstate->par_num_workers, sizeof(cf_par_buf)); + uint8_t pi; + for (pi = 0; pi < cfstate->par_num_workers; pi++) + cfstate->par_bufs[pi].node_id = -1; + } + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-par] assigning %u parallel workers from height %u\n", + (unsigned int)cfstate->par_num_workers, cf_scan_start); + + unsigned int ni; + for (ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *wn = (dogecoin_node *)vector_idx(client->nodegroup->nodes, ni); + if (!wn || !(wn->state & NODE_CONNECTED) || !wn->version_handshake) + continue; + spv_cf_par_assign(client, wn); + } + } else { + /* Sequential mode: single node, existing path */ + cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; + dogecoin_spv_request_cfilters(client, node, cf_scan_start, tip->hash); + } } } else { dogecoin_node_misbehave(node); @@ -3158,16 +3859,44 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s client->cfilters_db->tip_height > 0 && cf_scan_start <= client->cfilters_db->tip_height) cf_scan_start = client->cfilters_db->tip_height + 1; - if (client->nodegroup && client->nodegroup->log_write_cb) - client->nodegroup->log_write_cb( - "[bip157] cfheaders at tip (base=%u tip=%u), starting cfilter scan from %u [%us elapsed]\n", - cfstate->cfheaders_base_height, cfstate->cfheaders_tip_height, - cf_scan_start, - spv_elapsed(client)); - cfstate->cf_scan_start_height = cf_scan_start; - cfstate->awaiting_response = false; - cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; - dogecoin_spv_request_cfilters(client, node, cf_scan_start, tip->hash); + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] cfheaders at tip (base=%u tip=%u), starting cfilter scan from %u with %u workers [%us elapsed]\n", + cfstate->cfheaders_base_height, cfstate->cfheaders_tip_height, + cf_scan_start, + (unsigned int)(client->cf_num_workers > 1 ? client->cf_num_workers : 1), + spv_elapsed(client)); + cfstate->cf_scan_start_height = cf_scan_start; + cfstate->awaiting_response = false; + if (client->cf_num_workers > 1) { + cfstate->par_num_workers = client->cf_num_workers; + cfstate->par_next_height = cf_scan_start; + cfstate->par_flush_height = cf_scan_start; + cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; + if (!cfstate->par_bufs) { + cfstate->par_bufs = (cf_par_buf *)dogecoin_calloc( + cfstate->par_num_workers, sizeof(cf_par_buf)); + uint8_t pi; + for (pi = 0; pi < cfstate->par_num_workers; pi++) + cfstate->par_bufs[pi].node_id = -1; + } + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-par] assigning %u parallel workers from height %u\n", + (unsigned int)cfstate->par_num_workers, cf_scan_start); + unsigned int ni; + for (ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *wn = (dogecoin_node *)vector_idx( + client->nodegroup->nodes, ni); + if (!wn || !(wn->state & NODE_CONNECTED) || + !wn->version_handshake) + continue; + spv_cf_par_assign(client, wn); + } + } else { + cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; + dogecoin_spv_request_cfilters(client, node, cf_scan_start, tip->hash); + } } else { /* Resume cfheaders download from where the DB left off */ if (client->nodegroup && client->nodegroup->log_write_cb) @@ -3200,7 +3929,10 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s if (client->cfheaders_db) dogecoin_cfheaders_db_reset(client->cfheaders_db); cfstate->awaiting_response = false; - dogecoin_spv_request_cfheaders(client, node, cfh_start, tip->hash); + if (client->cf_num_workers > 1) + cfh_par_init(client, tip, cfh_start); + else + dogecoin_spv_request_cfheaders(client, node, cfh_start, tip->hash); } } else { if (client->nodegroup && client->nodegroup->log_write_cb) From 67de84c05ca9b59af9d3adc81258b17934434834 Mon Sep 17 00:00:00 2001 From: bluezr Date: Wed, 5 Aug 2026 15:57:39 -0700 Subject: [PATCH 12/12] test: create cfheaders scratch files 0600 CodeQL cpp/world-writable-file-creation on test/cfheadersdb_tests.c. fopen(path, "wb") leaves the mode to the process umask, so the file can land world-writable and another local user could rewrite it between creation and read. Creates it 0600 via open()+fdopen() on POSIX; Windows keeps fopen, which does not have the same exposure. --- test/cfheadersdb_tests.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/test/cfheadersdb_tests.c b/test/cfheadersdb_tests.c index 34b502066..fc2ee554f 100644 --- a/test/cfheadersdb_tests.c +++ b/test/cfheadersdb_tests.c @@ -25,12 +25,36 @@ */ +#ifndef _WIN32 +#include +#include +#include +#endif #include #include #include #include +/* + * Create scratch files private to this user. plain cfdb_tmp_open(path, "wb") leaves + * the mode to the process umask, which can yield a world-writable file another + * local user could rewrite between creation and read. + */ +static FILE* cfdb_tmp_open(const char* path, const char* mode) +{ +#ifdef _WIN32 + return fopen(path, mode); +#else + int fd = open(path, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR); + if (fd < 0) { + return NULL; + } + return fdopen(fd, mode); +#endif +} + + #include #include #include @@ -191,7 +215,7 @@ void test_cfheadersdb() fclose(f); u_assert_int_eq(got == (size_t)size, 1); - f = fopen(CFDB_TEST_HEADERS, "wb"); + f = cfdb_tmp_open(CFDB_TEST_HEADERS, "wb"); u_assert_int_eq(f != NULL, 1); u_assert_int_eq(fwrite(buf, 1, (size_t)size - 10, f) == (size_t)size - 10, 1); fclose(f);